GSoC 2017: Foreign Key Arrays

Started by Mark Rofailover 8 years ago202 messages
#1Mark Rofail
markm.rofail@gmail.com
1 attachment(s)

Dear PostgreSQL hacker community,

I am working on Foreign Key Arrays as part of the Google Summer of Code
2017.

I will be logging my progress on this thread as I progress, twice a week
(Mondays and Fridays), so anyone who is willing to comment, please do.

*The Problem*
Foreign Key Arrays were introduced by Marco Nenciarini[1]/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan, however, the
proposed patch had some performance issues. Let's assume we have two
tables, table B has a foreign key array that references table A, any change
in table A (INSERT, UPDATE, DELETE) would trigger a referential
integrity check on table B. The current implementation uses sequential
scans to accomplish this. This limits the size of tables using Foreign Key
Arrays to ~100 records which is not practical in real life applications.

*The Proposed Solution*
Ultimately, as proposed by Tom Lane[2]/messages/by-id/28389.1351094795@sss.pgh.pa.us, we would like to replace the
sequential scan with a GIN-indexed scan which would greatly enhance the
performance.

To achieve this, introducing a number of new operators is required.
However, for the scope of the project, we will focus on the most basic case
where the Primary Keys are of pseudo-type anyelement and the Foreign Keys
are of pseudo-type anyarray, thus the main operator of concern will be
@>(anyarray,anyelement).

*Progress So Far*
The actual coding begins on 30th of May, till then I will use my time to
research, to settle the technical details of my plan.

- Collected resources about GIN indexing
- http://www.sigaev.ru/gin/README.txt
- https://wiki.postgresql.org/wiki/GIN_generalization
- src\backend\access\gin\README in the repo

- Cloned the git repo found @ https://github.com/postgres/postgres and
identified the main two files I will be concerned with. (I know I may need
to edit other files but these seem to where I will spend most of my summer)
- src/backend/commands/tablecmds.c
- src/backend/utils/ri_triggers.c

*I am yet to identify the files concerned with the GIN opclass. <-- if
anyone can help with this*

- read a little about op classes
- https://www.postgresql.org/docs/9.5/static/indexes-opclass.html
- explored the existing op classes in Postgres

*Next Step*
I still don't have a solid grasp of how I am going to approach creating an
operator, so I would like to experiment till the next report on creating a
very simple operator.

*I have attached the original proposal here.*

[1]: /messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan
/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan
[2]: /messages/by-id/28389.1351094795@sss.pgh.pa.us

Best Regards,
Mark Rofail

Attachments:

GSoCproposal2017.pdfapplication/pdf; name=GSoCproposal2017.pdfDownload
#2Robert Haas
robertmhaas@gmail.com
In reply to: Mark Rofail (#1)
Re: GSoC 2017: Foreign Key Arrays

On Mon, May 22, 2017 at 7:51 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

Cloned the git repo found @ https://github.com/postgres/postgres and
identified the main two files I will be concerned with. (I know I may need
to edit other files but these seem to where I will spend most of my summer)

src/backend/commands/tablecmds.c
src/backend/utils/ri_triggers.c

I am yet to identify the files concerned with the GIN opclass. <-- if anyone
can help with this

There's not only one GIN opclass. You can get a list like this:

select oid, * from pg_opclass where opcmethod = 2742;

Actually, you probably want to look for GIN opfamilies:

rhaas=# select oid, * from pg_opfamily where opfmethod = 2742;
oid | opfmethod | opfname | opfnamespace | opfowner
------+-----------+----------------+--------------+----------
2745 | 2742 | array_ops | 11 | 10
3659 | 2742 | tsvector_ops | 11 | 10
4036 | 2742 | jsonb_ops | 11 | 10
4037 | 2742 | jsonb_path_ops | 11 | 10
(4 rows)

To see which SQL functions are used to implement a particular
opfamily, use the OID from the previous step in a query like this:

rhaas=# select prosrc from pg_amop, pg_operator, pg_proc where
amopfamily = 2745 and amopopr = pg_operator.oid and oprcode =
pg_proc.oid;
prosrc
----------------
array_eq
arrayoverlap
arraycontains
arraycontained
(4 rows)

Then, you can look for those in the source tree. You can also search
for the associated support functions, e.g.:

rhaas=# select distinct amprocnum, prosrc from pg_amproc, pg_proc
where amprocfamily = 2745 and amproc = pg_proc.oid order by 1, 2;
amprocnum | prosrc
-----------+-----------------------
1 | bitcmp
1 | bpcharcmp
1 | btabstimecmp
1 | btboolcmp
1 | btcharcmp
1 | btfloat4cmp
1 | btfloat8cmp
1 | btint2cmp
1 | btint4cmp
1 | btint8cmp
1 | btnamecmp
1 | btoidcmp
1 | btoidvectorcmp
1 | btreltimecmp
1 | bttextcmp
1 | bttintervalcmp
1 | byteacmp
1 | cash_cmp
1 | date_cmp
1 | interval_cmp
1 | macaddr_cmp
1 | network_cmp
1 | numeric_cmp
1 | time_cmp
1 | timestamp_cmp
1 | timetz_cmp
2 | ginarrayextract
3 | ginqueryarrayextract
4 | ginarrayconsistent
6 | ginarraytriconsistent
(30 rows)

You might want to read https://www.postgresql.org/docs/devel/static/xindex.html

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Mark Rofail
markm.rofail@gmail.com
In reply to: Robert Haas (#2)
Re: GSoC 2017: Foreign Key Arrays

rhaas=# select oid, * from pg_opfamily where opfmethod = 2742;
oid | opfmethod | opfname | opfnamespace | opfowner
------+-----------+----------------+--------------+----------
2745 | 2742 | array_ops | 11 | 10
3659 | 2742 | tsvector_ops | 11 | 10
4036 | 2742 | jsonb_ops | 11 | 10
4037 | 2742 | jsonb_path_ops | 11 | 10
(4 rows)

I am particulary intrested in array_ops but I have failed in locating the
code behind it. Where is it reflected in the source code

Best Regards,
Mark Rofail

#4Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#3)
Re: GSoC 2017: Foreign Key Arrays

Hi, Mark!

On Tue, May 30, 2017 at 2:18 AM, Mark Rofail <markm.rofail@gmail.com> wrote:

rhaas=# select oid, * from pg_opfamily where opfmethod = 2742;

oid | opfmethod | opfname | opfnamespace | opfowner
------+-----------+----------------+--------------+----------
2745 | 2742 | array_ops | 11 | 10
3659 | 2742 | tsvector_ops | 11 | 10
4036 | 2742 | jsonb_ops | 11 | 10
4037 | 2742 | jsonb_path_ops | 11 | 10
(4 rows)

I am particulary intrested in array_ops but I have failed in locating the
code behind it. Where is it reflected in the source code

Let's look what particular opclass is consisting of. Besides records in
pg_opfamily, it also contains records in pg_opclass, pg_amproc and pg_amop.

=# select * from pg_opclass where opcfamily = 2745;
opcmethod | opcname | opcnamespace | opcowner | opcfamily | opcintype |
opcdefault | opckeytype
-----------+-----------+--------------+----------+-----------+-----------+------------+------------
2742 | array_ops | 11 | 10 | 2745 | 2277 |
t | 2283
(1 row)

=# select * from pg_amproc where amprocfamily = 2745;
amprocfamily | amproclefttype | amprocrighttype | amprocnum |
amproc
--------------+----------------+-----------------+-----------+----------------------------
2745 | 2277 | 2277 | 2 |
pg_catalog.ginarrayextract
2745 | 2277 | 2277 | 3 |
ginqueryarrayextract
2745 | 2277 | 2277 | 4 |
ginarrayconsistent
2745 | 2277 | 2277 | 6 |
ginarraytriconsistent
(4 rows)

=# select * from pg_amop where amopfamily = 2745;
amopfamily | amoplefttype | amoprighttype | amopstrategy | amoppurpose |
amopopr | amopmethod | amopsortfamily
------------+--------------+---------------+--------------+-------------+---------+------------+----------------
2745 | 2277 | 2277 | 1 | s |
2750 | 2742 | 0
2745 | 2277 | 2277 | 2 | s |
2751 | 2742 | 0
2745 | 2277 | 2277 | 3 | s |
2752 | 2742 | 0
2745 | 2277 | 2277 | 4 | s |
1070 | 2742 | 0
(4 rows)

These records of system catalog are defined in special headers the source
code:
src/include/catalog/pg_amop.h
src/include/catalog/pg_amproc.h
src/include/catalog/pg_opclass.h
src/include/catalog/pg_opfamily.h
These records are written to system catalog during bootstrap process (see
src/backend/catalog/README).

As you can see pg_amproc records refer some procedures. Those procedures
are actually the majority of source code behind of opclass. Those
procedures are defined in src/backend/access/gin/ginarrayproc.c.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#5Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#4)
Re: GSoC 2017: Foreign Key Arrays

src/include/catalog/pg_amop.h
src/include/catalog/pg_amproc.h
src/include/catalog/pg_opclass.h
src/include/catalog/pg_opfamily.h

Thanks to Alexander's reply I have been able to jump from catalog table to
table till I found the function I was looking for.

My goal is to add a new operator (@>(anyarray,anyelement)) to the (array_ops)
op class.
I am going to post the steps I took to locate the procedure, the following
is the trail of tables I followed.

pg_opfamily

pg_opfamily defines operator families.

Link to docs
<https://www.postgresql.org/docs/devel/static/catalog-pg-opfamily.html&gt;

{

opfmethod; /* index access method opfamily is for */

opfname; /* name of this opfamily */

opfnamespace; /* namespace of this opfamily */

opfowner; /* opfamily owner */

}

gin=# select oid, * from pg_opfamily where opfmethod = 2742;

oid | opfmethod | opfname | opfnamespace | opfowner

------+-----------+----------------+--------------+----------

2745 | 2742 | array_ops | 11 | 10

3659 | 2742 | tsvector_ops | 11 | 10

4036 | 2742 | jsonb_ops | 11 | 10

4037 | 2742 | jsonb_path_ops | 11 | 10

(4 rows)

as this table defines operator families I won't need to modify them.

pg_opclass

pg_opclass defines index access method operator classes.

Link to docs
<https://www.postgresql.org/docs/current/static/catalog-pg-opclass.html&gt;

{
opcmethod; /* index access method opclass is for */
opcname; /* name of this opclass */
opcnamespace; /* namespace of this opclass */
opcowner; /* opclass owner */
opcfamily; /* containing operator family */
opcintype; /* type of data indexed by opclass */
opcdefault; /* T if opclass is default for opcintype
opckeytype; /* type of data in index, or InvalidOid */
}

gin=# select * from pg_opclass where opcfamily = 2745;

opcmethod | opcname | opcnamespace | opcowner | opcfamily | opcintype |
opcdefault | opckeytype

-----------+-----------+--------------+----------+----------
-+-----------+------------+------------

2742 | array_ops | 11 | 10 | 2745 | 2277 | t
| 2283

(1 row)

as this table defines operator classes I won't need to modify them.
this led me to pg_amproc

pg_amproc

pg_amproc stores information about support procedures associated with
access method operator families.

Link to docs
<https://www.postgresql.org/docs/devel/static/catalog-pg-amproc.html&gt;

{

amprocfamily; /* the index opfamily this entry is for */

amproclefttype; /* procedure's left input data type */

amprocrighttype; /* procedure's right input data type */

amprocnum[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* support procedure index */

amproc; /* OID of the proc */

}

gin=# select * from pg_amproc where amprocfamily = 2745;

amprocfamily | amproclefttype | amprocrighttype | amprocnum |
amproc

------------------+--------------------+--------------------
-+---------------+----------------------------

2745 | 2277 | 2277
| 2 | pg_catalog.ginarrayextract

2745 | 2277 | 2277
| 3 | ginqueryarrayextract

2745 | 2277 | 2277
| 4 | ginarrayconsistent

2745 | 2277 | 2277
| 6 | ginarraytriconsistent

(4 rows)

[1]: amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;
<https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;

as this table defines support procedures I won't need to modify them.
this led me to pg_amop

pg_amop

pg_amop stores information about operators associated with access method
operator families.

Link to docs
<https://www.postgresql.org/docs/devel/static/catalog-pg-amop.html&gt;

{

amopfamily; /* the index opfamily this entry is for */

amoplefttype; /* operator's left input data type */

amoprighttype; /* operator's right input data type */

amopstrategy; /* operator strategy number */

amoppurpose; /* is operator for 's'earch or 'o'rdering? */

amopopr; /* the operator's pg_operator OID */

amopmethod; /* the index access method this entry is for

amopsortfamily; /* ordering opfamily OID, or 0 if search op

}

=# select * from pg_amop where amopfamily = 2745;

amopfamily | amoplefttype | amoprighttype | amopstrategy | amoppurpose |
amopopr | amopmethod | amopsortfamily

------------+--------------+---------------+--------------+-
------------+---------+------------+----------------

2745 | 2277 | 2277 | 1 | s |
2750 | 2742 | 0

2745 | 2277 | 2277 | 2 | s |
2751 | 2742 | 0

2745 | 2277 | 2277 | 3 | s |
2752 | 2742 | 0

2745 | 2277 | 2277 | 4 | s |
1070 | 2742 | 0

(4 rows)

I will need to add a record of my new operator to this table by appending
this line to src/include/catalog/pg_amop.h

DATA(insert (2745 2277 2277 1 s 2750 2742 0 ));

This will result in the following entry

=# select * from pg_amop where amopfamily = 2745;

amopfamily | amoplefttype | amoprighttype | amopstrategy | amoppurpose |
amopopr | amopmethod | amopsortfamily

------------+--------------+---------------+--------------+-
------------+---------+------------+----------------

2745 | 2277 | 2283 | 1 | s |
2750 | 2742 | 0

this led me to pg_operator

pg_operator

pg_operator stores information about operators.

Link to docs
<https://www.postgresql.org/docs/devel/static/catalog-pg-operator.html&gt;

{
oprname; /* name of operator */
oprnamespace; /* OID of namespace containing this oper */
oprowner; /* operator owner */
oprkind; /* 'l', 'r', or 'b' */
oprcanmerge; /* can be used in merge join? */
oprcanhash; /* can be used in hash join? */
oprleft; /* left arg type, or 0 if 'l' oprkind */
oprright; /* right arg type, or 0 if 'r' oprkind */
oprresult; /* result datatype */
oprcom; /* OID of commutator oper, or 0 if none */
oprnegate; /* OID of negator oper, or 0 if none */
oprcode; /* OID of underlying function */
oprrest; /* OID of restriction estimator, or 0 */
oprjoin; /* OID of join estimator, or 0 */
}

postgres=# select * from pg_operator where oid = 2751;

oprname | oprnamespace | oprowner | oprkind | oprcanmerge | oprcanhash |
oprleft | oprright | oprresult | oprcom | oprnegate | oprcode |
oprrest | oprjoin

---------+--------------+----------+---------+-------------+
------------+---------+----------+-----------+--------+-----
------+---------------+--------------+------------------

@> | 11 | 10 | b | f | f |
2277 | 2277 | 16 | 2752 | 0 | arraycontains |
arraycontsel | arraycontjoinsel

(1 row)

I will need to add a record of my new operator to this table by appending
this line to src/include/catalog/pg_operator.h

However, as this is dependent on the procedure I have yet to create there
are still uknown values

DATA(insert OID = <uniqueProcId> ( "@>" PGNSP PGUID b f f 2277 2283 16
2752 0 arraycontainselem ???? ???? ));

DESCR("contains");

#define OID_ARRAY_CONTAINS_OP <uniqueProcId>

This will lead to this entry

oprname | oprnamespace | oprowner | oprkind | oprcanmerge | oprcanhash |
oprleft | oprright | oprresult | oprcom | oprnegate | oprcode |
oprrest | oprjoin

---------+--------------+----------+---------+-------------+
------------+---------+----------+-----------+--------+-----
------+---------------+--------------+------------------

@> | 11 | 10 | b | f | f |
2277 | 2283 | 16 | 2752 | 0 | arraycontainselem |
???? | ????

(1 row)

this led me to pg_proc

pg_proc

pg_proc stores information about functions (or procedures)

Link to docs
<https://www.postgresql.org/docs/devel/static/catalog-pg-proc.html&gt;

{

proname; /* procedure name */

pronamespace; /* OID of namespace containing this proc */

proowner; /* procedure owner */

prolang; /* OID of pg_language entry */

procost; /* estimated execution cost */

prorows; /* estimated # of rows out (if proretset) */

provariadic; /* element type of variadic array, or 0 */

protransform; /* transforms calls to it during planning */

proisagg; /* is it an aggregate? */

proiswindow; /* is it a window function? */

prosecdef; /* security definer */

proleakproof; /* is it a leak-proof function? */

proisstrict; /* strict with respect to NULLs? */

proretset; /* returns a set? */

provolatile; /* see PROVOLATILE_ categories below */

proparallel; /* see PROPARALLEL_ categories below */

pronargs; /* number of arguments */

pronargdefaults; /* number of arguments with defaults */

prorettype; /* OID of result type */

proargtypes; /* parameter types (excludes OUT params) */

proallargtypes[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* all param types (NULL if IN only) */

proargmodes[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* parameter modes (NULL if IN only) */

proargnames[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* parameter names (NULL if no names) */

proargdefaults; /* list of expression trees for argument

protrftypes[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* types for which to apply transforms */

prosrc; /* procedure source text */

probin; /* secondary procedure info (can be NULL) */

proconfig[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* procedure-local GUC settings */

proacl[1]amprocnum refers to this table <https://www.postgresql.org/docs/10/static/xindex.html#xindex-gin-support-table&gt;; /* access permissions */

}

postgres=# select * from pg_proc where oid = 2748;

proname | pronamespace | proowner | prolang | procost | prorows |
provariadic | protransform | proisagg | proiswindow | prosecdef |
proleakproof | proisstrict | proretset | provolatile | proparallel | pron

args | pronargdefaults | prorettype | proargtypes | proallargtypes |
proargmodes | proargnames | proargdefaults | protrftypes | prosrc |
probin | proconfig | proacl

---------------+--------------+----------+---------+--------
-+---------+-------------+--------------+----------+--------
-----+-----------+--------------+-------------+-----------+-
------------+-------------+-----

-----+-----------------+------------+-------------+---------
-------+-------------+-------------+----------------+-------
------+---------------+--------+-----------+--------

arraycontains | 11 | 10 | 12 | 1 | 0 |
0 | - | f | f | f | f
| t | f | i | s |

2 | 0 | 16 | 2277 2277 | |
| | | | arraycontains |
| |

(1 row)
I have yet to study this table thoroughly.
This finally led me to the arraycontains procedure in src/backend/utils/adt/
arrayfuncs.c

Datum
arraycontains(PG_FUNCTION_ARGS)
{
AnyArrayType *array1 = PG_GETARG_ANY_ARRAY(0);
AnyArrayType *array2 = PG_GETARG_ANY_ARRAY(1);
Oid collation = PG_GET_COLLATION();
bool result;

result = array_contain_compare(array2, array1, collation, true,
&fcinfo->flinfo->fn_extra);

/* Avoid leaking memory when handed toasted input. */
AARR_FREE_IF_COPY(array1, 0);
AARR_FREE_IF_COPY(array2, 1);

PG_RETURN_BOOL(result);
}

This corrosponds to the operator @<(anyarray, anyarray) which is the
generalised form of my proposed operator @<(anyarray, anyelement).
Studying the syntax will help me produce a function that follows the
postgres style rules.

#6Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#5)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

• After finding the arraycontains function, I implemented
arraycontainselem that corresponds to the operator @<(anyarray,
anyelem)
◦ Please read the attached patch file to view my progress.

• In addition to src/backend/utils/adt/arrayfuncs.c where I
implemented arraycontainselem.

◦ I also edited pg_amop (src/include/catalog/pg_amop.h) since
it stores information about operators associated with access method
operator families.

+DATA(insert ( 2745 2277 2283 2 s 2753 2742 0 ));
{
2745: Oid amopfamily; (denotes gin array_ops)
277: Oid amoplefttype; (denotes anyaray)
2283: Oid amoprighttype; (denotes anyelem)
5: int16 amopstrategy; /* operator strategy number */ (denotes the new
startegy that is yet to be created)
's': char amoppurpose; (denotes 's' for search)
2753: Oid amopopr; (denotes the new operator Oid)
2742: Oid amopmethod;(denotes gin)
0: Oid amopsortfamily; (0 since search operator)
}

◦ And pg_operator (src/include/catalog/pg_operator.h) since it
stores information about operators.
+DATA(insert OID = 2753 ( "@>" PGNSP PGUID b f f 2277 2283 16 0 0
arraycontainselem 0 0 ));
{
"@>": NameData oprname; /* name of operator */
Oid oprnamespace; /* OID of namespace containing this oper */
Oid oprowner; /* operator owner */
'b': char oprkind; /* 'l', 'r', or 'b' */ (denotes infix)
'f': bool oprcanmerge; /* can be used in merge join? */
'f': bool oprcanhash; /* can be used in hash join? */
277: Oid oprleft; (denotes anyaray)
2283: Oid oprright; (denotes anyelem)
16: Oid oprresult; (denotes boolean)
0: Oid oprcom; /* OID of commutator oper, or 0 if none */ (needs to be
revisited)
0: Oid oprnegate; /* OID of negator oper, or 0 if none */ (needs to be
revisited)
arraycontainselem: regproc oprcode; /* OID of underlying function */
0: regproc oprrest; /* OID of restriction estimator, or 0 */
0: regproc oprjoin; /* OID of join estimator, or 0 */
}

Attachments:

elemOperatorV2.patchtext/x-patch; charset=US-ASCII; name=elemOperatorV2.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index cc7435e030..14fedc8066 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy		5
 
 
 /*
@@ -110,7 +111,8 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			if (nelems > 0)
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			else	/* everything contains the empty set */
@@ -171,6 +173,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +261,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index d9c8aa569c..e1ff6d33b5 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4215,6 +4215,40 @@ arraycontains(PG_FUNCTION_ARGS)
 }
 
 Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+		Datum *elem = PG_GETARG_DATUM(0);
+		AnyArrayType *array1;
+		AnyArrayType *array2 = PG_GETARG_ANY_ARRAY(1);
+		Oid collation = PG_GET_COLLATION();
+		bool result;
+
+		int16 typlen;
+		bool typbyval;
+		char typalign;
+		int nelems;
+
+		/* we have one element */
+		nelems= 1;
+
+		/* get required info about the element type */
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &typlen, &typbyval, &typalign);
+
+		/* now build the array */
+		array1 =  construct_array(&elem, nelems,collation, &typlen, &typbyval, &typalign);
+
+		result = array_contain_compare(array2, array1, collation, true,
+			&fcinfo->flinfo->fn_extra);
+
+		/* Avoid leaking memory when handed toasted input. */
+		PG_FREE_IF_COPY(elem,0);
+		AARR_FREE_IF_COPY(array, 1);
+
+		PG_RETURN_BOOL(result);
+}
+
+Datum
 arraycontained(PG_FUNCTION_ARGS)
 {
 	AnyArrayType *array1 = PG_GETARG_ANY_ARRAY(0);
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index da0228de6b..2da9002577 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -687,6 +687,8 @@ DATA(insert (	2595   718 600 15 o 3291 783 1970 ));
  */
 DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
+//TODO link the operator's pg_operator OID
+DATA(insert ( 2745   2277 2283 5 s 2753 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
 
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ccbb17efec..626a0b1c49 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1567,6 +1567,9 @@ DESCR("overlaps");
 DATA(insert OID = 2751 (  "@>"	   PGNSP PGUID b f f 2277 2277	16 2752  0 arraycontains arraycontsel arraycontjoinsel ));
 DESCR("contains");
 #define OID_ARRAY_CONTAINS_OP	2751
+DATA(insert OID = 2753 (  "@>"	   PGNSP PGUID b f f 2277 2283	16 2753  0 arraycontainselem 0 0 ));
+DESCR("containselem");
+#define OID_ARRAY_CONTAINS_ELEM_OP	2753
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
#7Chapman Flack
chap@anastigmatix.net
In reply to: Alexander Korotkov (#4)
regproc and when to schema-qualify

I was idly following along in GSoC 2017: Foreign Key Arrays
when I noticed this:

=# select * from pg_amproc where amprocfamily = 2745;
amprocfamily | amproclefttype | amprocrighttype | amprocnum |
amproc
--------------+----------------+-----------------+-----------+
2745 | 2277 | 2277 | 2 |
pg_catalog.ginarrayextract
2745 | 2277 | 2277 | 3 |
ginqueryarrayextract
...

where only ginarrayextract is schema-qualified. It seems to be
regproc's output procedure doing it:

=# select 2743::regproc, 2774::regproc;
regproc | regproc
----------------------------+----------------------
pg_catalog.ginarrayextract | ginqueryarrayextract

The manual says regproc "will display schema-qualified names on output
if the object would not be found in the current search path without
being qualified."

Is regproc displaying the schema in this case because there are two
overloaded flavors of ginarrayextract, though both are in pg_catalog?
Could it be searching for the object by name, ignoring the argument
signature, and just detecting that it hit one with a different OID first?

-Chap

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Tom Lane
tgl@sss.pgh.pa.us
In reply to: Chapman Flack (#7)
Re: regproc and when to schema-qualify

Chapman Flack <chap@anastigmatix.net> writes:

The manual says regproc "will display schema-qualified names on output
if the object would not be found in the current search path without
being qualified."

That's less than the full truth :-(

Is regproc displaying the schema in this case because there are two
overloaded flavors of ginarrayextract, though both are in pg_catalog?

Yes, see the test in regprocout:

* Would this proc be found (uniquely!) by regprocin? If not,
* qualify it.

Of course, in a situation like this, schema-qualification is not enough to
save the day; regprocin will still fail because the name is ambiguous.
You really need to use regprocedure not regproc if you want any guarantees
about the results.

(The fact that we have regproc at all is a bit of a historical accident,
caused by some limitations of the bootstrap mode.)

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#6)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

*Updates till now:*

- added a record to pg_proc (src/include/catalog/pg_proc.h)
- modified opr_sanity regression check expected results
- implemented a low-level function called `array_contains_elem` as an
equivalent to `array_contain_compare` but accepts anyelement instead of
anyarray as the right operand. This is more efficient than constructing an
array and then immediately deconstructing it.

*Questions:*

- I'd like to check that anyelem and anyarray have the same element
type. but anyelem is obtained from PG_FUNCTION_ARGS as a Datum. How can
I make such a check?

Best Regards,
Mark Rofail

Attachments:

elemOperatorV3.patchtext/x-patch; charset=US-ASCII; name=elemOperatorV3.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index cc7435e030..214aac8fba 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy		5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -110,7 +111,8 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			if (nelems > 0)
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			else	/* everything contains the empty set */
@@ -171,6 +173,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +261,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index d9c8aa569c..8009ab5acb 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,107 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid collation,
+					void **fn_extra)
+{
+	Oid 		element_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != element_type)
+	{
+		typentry = lookup_type_cache(element_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(element_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+	PG_FREE_IF_COPY( &elem, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index da0228de6b..4967a388e8 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,6 +689,7 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 ));
 
 /*
  * btree enum_ops
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ccbb17efec..cc56d61bfb 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 6c44def6e6..66ba68e9ef 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 1d7629f84e..dc98a8c8f9 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1801,6 +1801,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1868,7 +1869,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
#10Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#9)
Re: GSoC 2017: Foreign Key Arrays

On Sun, Jun 18, 2017 at 12:41 AM, Mark Rofail <markm.rofail@gmail.com>
wrote:

*Questions:*

- I'd like to check that anyelem and anyarray have the same element
type. but anyelem is obtained from PG_FUNCTION_ARGS as a Datum. How
can I make such a check?

As I know, it's implicitly checked during query analyze stage. You don't
have to implement your own check inside function implementation.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#11Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#10)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

Okay, so major breakthrough.

*Updates:*

- The operator @>(anyarray, anyelement) is now functional
- The segmentation fault was due to applying PG_FREE_IF_COPY on a
datum when it should only be applied on TOASTed inputs
- The only problem now is if for example you apply the operator as
follows '{AAAAAAAAAA646'}' @> 'AAAAAAAAAA646' it maps to @>(anyarray,
anyarray) since 'AAAAAAAAAA646' is interpreted as char[] instead of Text
- Added some regression tests (src/test/regress/sql/arrays.sql) and
their results(src/test/regress/expected/arrays.out)
- wokred on the new GIN strategy, I don't think it would vary much from
GinContainsStrategy.

*What I plan to do:*

- I need to start working on the Referential Integrity code but I don't
where to start

Best Regards,
Mark Rofail

Attachments:

elemOperatorV3_1.patchtext/x-patch; charset=US-ASCII; name=elemOperatorV3_1.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index cc7435e030..a1b3f53ed9 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -110,6 +111,11 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
+		case GinContainsElemStrategy:
+			/* only items that match the queried element 
+				are considered candidate  */
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		case GinContainsStrategy:
 			if (nelems > 0)
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
@@ -171,6 +177,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +265,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index d9c8aa569c..c563aa564e 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index da0228de6b..4967a388e8 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,6 +689,7 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 ));
 
 /*
  * btree enum_ops
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ccbb17efec..cc56d61bfb 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 6c44def6e6..66ba68e9ef 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..f9932a5335 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -962,6 +991,15 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -979,6 +1017,14 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 1d7629f84e..dc98a8c8f9 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1801,6 +1801,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1868,7 +1869,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..39189ce6e3 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,12 +327,15 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
#12Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#11)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

Okay, so major breakthrough.

*Updates:*

- The operator @>(anyarray, anyelement) is now functional
- The segmentation fault was due to applying PG_FREE_IF_COPY on a
datum when it should only be applied on TOASTed inputs
- The only problem now is if for example you apply the operator as
follows '{AAAAAAAAAA646'}' @> 'AAAAAAAAAA646' it maps to @>(anyarray,
anyarray) since 'AAAAAAAAAA646' is interpreted as char[] instead of Text
- Added some regression tests (src/test/regress/sql/arrays.sql) and
their results(src/test/regress/expected/arrays.out)
- wokred on the new GIN strategy, I don't think it would vary much from
GinContainsStrategy.

OK, that's great.

*What I plan to do:*

- I need to start working on the Referential Integrity code but I don't
where to start

You need to study the old patch posted by Marco Nenciarini.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#12)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

*What I did:*

- read into the old patch but couldn't apply it since it's quite old. It
needs to be rebased and that's what I am working on. It's a lot of work.
- incomplete patch can be found attached here

*Bugs*

- problem with the @>(anyarray, anyelement) opertator: if for example,
you apply the operator as follows '{AAAAAAAAAA646'}' @> 'AAAAAAAAAA646' it
maps to @>(anyarray, anyarray) since 'AAAAAAAAAA646' is interpreted as
char[] instead of Text

*Suggestion:*

- since I needed to check if the Datum was null and its type, I had to
do it in the arraycontainselem and pass it as a parameter to the underlying
function array_contains_elem. I'm proposing to introduce a new struct like
ArrayType, but ElementType along all with brand new MACROs to make dealing
with anyelement easier in any polymorphic context.

Best Regards,
Mark Rofail

On Tue, Jun 20, 2017 at 12:19 AM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

Show quoted text

Mark Rofail wrote:

Okay, so major breakthrough.

*Updates:*

- The operator @>(anyarray, anyelement) is now functional
- The segmentation fault was due to applying PG_FREE_IF_COPY on a
datum when it should only be applied on TOASTed inputs
- The only problem now is if for example you apply the operator as
follows '{AAAAAAAAAA646'}' @> 'AAAAAAAAAA646' it maps to

@>(anyarray,

anyarray) since 'AAAAAAAAAA646' is interpreted as char[] instead

of Text

- Added some regression tests (src/test/regress/sql/arrays.sql) and
their results(src/test/regress/expected/arrays.out)
- wokred on the new GIN strategy, I don't think it would vary much

from

GinContainsStrategy.

OK, that's great.

*What I plan to do:*

- I need to start working on the Referential Integrity code but I

don't

where to start

You need to study the old patch posted by Marco Nenciarini.

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

incomplete-Array-ELEMENT-foreign-key-v2-REBASED-ddb5fdc.patchtext/x-patch; charset=US-ASCII; name=incomplete-Array-ELEMENT-foreign-key-v2-REBASED-ddb5fdc.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..712f631e88 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2288,6 +2288,14 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
+      <entry><structfield>confiselement</structfield></entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, is it an array <literal>ELEMENT</literal>
+      foreign key?</entry>
+     </row>
+
+     <row>
       <entry><structfield>coninhcount</structfield></entry>
       <entry><type>int4</type></entry>
       <entry></entry>
@@ -2324,6 +2332,18 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
+      <entry><structfield>confelement</structfield></entry>
+      <entry><type>bool[]</type></entry>
+      <entry></entry>
+      <entry>
+ 	    If a foreign key, list of booleans expressing which columns
+ 	    are array <literal>ELEMENT</literal> columns; see
+ 	    <xref linkend="sql-createtable-element-foreign-key-constraints">
+ 	    for details
+      </entry>
+     </row>
+
+     <row>
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..c1c847bc7e 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -881,7 +881,112 @@ CREATE TABLE order_items (
     <xref linkend="sql-createtable">.
    </para>
   </sect2>
-
+  
+   <sect2 id="ddl-constraints-element-fk">
+    <title>Array ELEMENT Foreign Keys</title>
+ 
+    <indexterm>
+     <primary>ELEMENT foreign key</primary>
+    </indexterm>
+ 
+    <indexterm>
+     <primary>constraint</primary>
+     <secondary>Array ELEMENT foreign key</secondary>
+    </indexterm>
+ 
+    <indexterm>
+     <primary>constraint</primary>
+     <secondary>ELEMENT foreign key</secondary>
+    </indexterm>
+ 
+    <indexterm>
+     <primary>referential integrity</primary>
+    </indexterm>
+ 
+    <para>
+     Another option you have with foreign keys is to use a
+     referencing column which is an array of elements with
+     the same type (or a compatible one) as the referenced
+     column in the related table. This feature is called
+     <firstterm>array element foreign key</firstterm> and is implemented
+     in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+     as described in the following example:
+ 
+    <programlisting>
+    CREATE TABLE drivers (
+        driver_id integer PRIMARY KEY,
+        first_name text,
+        last_name text,
+        ...
+    );
+
+    CREATE TABLE races (
+        race_id integer PRIMARY KEY,
+        title text,
+        race_day DATE,
+        ...
+        final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+    );
+    </programlisting>
+ 
+     The above example uses an array (<literal>final_positions</literal>)
+     to store the results of a race: for each of its elements
+     a referential integrity check is enforced on the
+     <literal>drivers</literal> table.
+     Note that <literal>ELEMENT REFERENCES</literal> is an extension
+     of PostgreSQL and it is not included in the SQL standard.
+    </para>
+ 
+    <para>
+     Even though the most common use case for array <literal>ELEMENT</literal>
+     foreign keys is on a single column key, you can define an <quote>array
+     <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+     of columns. As the following example shows, it must be written in table
+     constraint form:
+ 
+    <programlisting>
+    CREATE TABLE available_moves (
+        kind text,
+        move text,
+        description text,
+        PRIMARY KEY (kind, move)
+    );
+
+    CREATE TABLE paths (
+        description text,
+        kind text,
+        moves text[],
+        <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+    );
+
+    INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+    INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+    INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+    INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+    INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+    INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+    INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+    INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+    INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+    INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+ 
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+ 
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+ 
+  </sect2>
+ 
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index b15c19d3d0..1d7749ce38 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -779,10 +779,11 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term>
+   <literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -806,6 +807,19 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+      In case the column name <replaceable class="parameter">column</replaceable>
+      is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+      class="parameter">column</replaceable> is an array of elements compatible
+      with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+      in <replaceable class="parameter">reftable</replaceable>, an
+      array <literal>ELEMENT</literal> foreign key constraint is put in place
+      (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+      for more information).
+      Multi-column keys with more than one <literal>ELEMENT</literal> column
+      are currently not allowed.
+     </para>
+
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -868,7 +882,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -877,7 +892,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -889,7 +905,9 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
-         </para>
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
+        </para>
         </listitem>
        </varlistentry>
       </variablelist>
@@ -904,6 +922,60 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+ 
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1843,6 +1915,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..a25ccd084c 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2099,7 +2099,9 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  0,
-							  ' ',
+ 							  false,
+	 						  NULL,
+ 							  ' ',
 							  ' ',
 							  ' ',
 							  NULL, /* not an exclusion constraint */
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 027abd56b0..a2e8baba55 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1212,6 +1212,8 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   0,
+ 								   false,
+  								   NULL,
 								   ' ',
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql
index 98bcfa08c6..0c731b1085 100644
--- a/src/backend/catalog/information_schema.sql
+++ b/src/backend/catalog/information_schema.sql
@@ -1226,7 +1226,9 @@ CREATE VIEW referential_constraints AS
                                   WHEN 'd' THEN 'SET DEFAULT'
                                   WHEN 'r' THEN 'RESTRICT'
                                   WHEN 'a' THEN 'NO ACTION' END
-             AS character_data) AS delete_rule
+             AS character_data) AS delete_rule,
+
+            con.confiselement AS is_element            
 
     FROM (pg_namespace ncon
           INNER JOIN pg_constraint con ON ncon.oid = con.connamespace
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c99b7c6cad 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -63,6 +63,8 @@ CreateConstraintEntry(const char *constraintName,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
 					  int foreignNKeys,
+ 					  bool confisElement,
+ 					  const bool *foreignElement,
 					  char foreignUpdateType,
 					  char foreignDeleteType,
 					  char foreignMatchType,
@@ -82,6 +84,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confelementArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -177,6 +180,7 @@ CreateConstraintEntry(const char *constraintName,
 	values[Anum_pg_constraint_conislocal - 1] = BoolGetDatum(conIsLocal);
 	values[Anum_pg_constraint_coninhcount - 1] = Int32GetDatum(conInhCount);
 	values[Anum_pg_constraint_connoinherit - 1] = BoolGetDatum(conNoInherit);
+  	values[Anum_pg_constraint_coniselement - 1] = BoolGetDatum(confisElement);
 
 	if (conkeyArray)
 		values[Anum_pg_constraint_conkey - 1] = PointerGetDatum(conkeyArray);
@@ -188,6 +192,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confelementArray)
+ 		values[Anum_pg_constraint_confelement - 1] = PointerGetDatum(confelementArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confelement - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 7d9c769b06..03dfa2ea5e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -41,6 +41,7 @@
 #include "catalog/pg_inherits_fn.h"
 #include "catalog/pg_namespace.h"
 #include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
 #include "catalog/pg_tablespace.h"
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_type.h"
@@ -6995,6 +6996,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	bool		fkattelement[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7082,6 +7084,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkattelement, 0, sizeof(fkattelement));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7097,39 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+ 	 * If an array ELEMENT FK, decode the content of
+ 	 * the fk_element_attrs array.
+ 	 */
+ 	if (fkconstraint->fk_is_element)
+ 	{
+ 		ListCell   *l;
+ 		int			attnum;
+ 		bool		element_found = false;
+ 
+ 		attnum = 0;
+ 		foreach(l, fkconstraint->fk_element_attrs)
+ 		{
+ 			if (lfirst_int(l)) {
+ 
+ 				/*
+ 				 * Currently, the ELEMENT flag cannot be set on more than
+ 				 * one column.
+ 				 */
+ 				if (element_found) {
+ 					ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 						errmsg("array ELEMENT foreign keys support only one ELEMENT column")));
+ 				}
+ 
+ 				fkattelement[attnum] = true;
+ 				element_found = true;
+ 			}
+ 			attnum++;
+ 		}
+ 
+ 	}
+ 
+ 	/*	
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7141,6 +7177,22 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	old_check_ok = (fkconstraint->old_conpfeqop != NIL);
 	Assert(!old_check_ok || numfks == list_length(fkconstraint->old_conpfeqop));
 
+ 	/* Enforce array ELEMENT foreign key restrictions */
+ 	if (fkconstraint->fk_is_element)
+ 	{
+ 		/*
+ 		 * Array ELEMENT foreign keys support only NO ACTION and
+ 		 * RESTRICT actions
+ 		 */
+ 		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION
+ 				&& fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT)
+ 			|| (fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION
+ 				&& fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+ 			ereport(ERROR,
+ 				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("array ELEMENT foreign keys only support NO ACTION and RESTRICT actions")));
+ 	}
+ 
 	for (i = 0; i < numpks; i++)
 	{
 		Oid			pktype = pktypoid[i];
@@ -7156,6 +7208,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		Oid			ffeqop;
 		int16		eqstrategy;
 		Oid			pfeqop_right;
+ 		Oid			fk_element_type = InvalidOid;
 
 		/* We need several fields out of the pg_opclass entry */
 		cla_ht = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclasses[i]));
@@ -7189,6 +7242,31 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "missing operator %d(%u,%u) in opfamily %u",
 				 eqstrategy, opcintype, opcintype, opfamily);
 
+ 		if (fkattelement[i])
+ 		{
+ 			/*
+ 			 * For every array ELEMENT FK, look if an equality operator that
+ 			 * takes exactly the FK element type exists.  Assume we should
+ 			 * look through any domain here.
+ 			 */
+ 			fk_element_type = get_base_element_type(fktype);
+ 			if (!OidIsValid(fk_element_type))
+ 				ereport(ERROR,
+ 					(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 					 errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 							fkconstraint->conname),
+ 					 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 							   format_type_be(fktype))));
+ 
+ 			pfeqop = get_opfamily_member(opfamily, opcintype, fk_element_type,
+  										 eqstrategy);
+ 			pfeqop_right = fk_element_type;
+ 			ffeqop = ARRAY_EQ_OP;
+  		}
+  		else
+  		{
+
 		/*
 		 * Are there equality operators that take exactly the FK type? Assume
 		 * we should look through any domain here.
@@ -7208,6 +7286,26 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			/* keep compiler quiet */
 			pfeqop_right = InvalidOid;
 			ffeqop = InvalidOid;
+ 			/*
+ 			 * Are there equality operators that take exactly the FK type?
+ 			 * Assume we should look through any domain here.
+ 			 */
+ 			fktyped = getBaseType(fktype);
+ 
+ 			pfeqop = get_opfamily_member(opfamily, opcintype, fktyped,
+ 										 eqstrategy);
+ 			if (OidIsValid(pfeqop))
+ 			{
+ 				pfeqop_right = fktyped;
+ 				ffeqop = get_opfamily_member(opfamily, fktyped, fktyped,
+ 											 eqstrategy);
+ 			}
+ 			else
+ 			{
+ 				/* keep compiler quiet */
+ 				pfeqop_right = InvalidOid;
+ 				ffeqop = InvalidOid;
+ 			}
 		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
@@ -7225,25 +7323,46 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			Oid			target_typeids[2];
 
 			input_typeids[0] = pktype;
-			input_typeids[1] = fktype;
+ 			if (fkattelement[i])
+ 				input_typeids[1] = fk_element_type;
+ 			else
+ 				input_typeids[1] = fktype;
 			target_typeids[0] = opcintype;
 			target_typeids[1] = opcintype;
 			if (can_coerce_type(2, input_typeids, target_typeids,
 								COERCION_IMPLICIT))
 			{
-				pfeqop = ffeqop = ppeqop;
+				pfeqop = ppeqop;
 				pfeqop_right = opcintype;
++ 				/*
++ 				 * In case of an array ELEMENT FK, the ffeqop must be left
++ 				 * untouched; otherwise we use the primary equality operator.
++ 				 */
++ 				if (!fkattelement[i])
++ 					ffeqop = ppeqop;
 			}
 		}
 
+ 		/*
+ 		 * In case of an array ELEMENT FK, make sure TYPECACHE_EQ_OPR exists
+ 		 * for the FK element_type and it is compatible with pfeqop
+ 		 */
+ 		if (fkattelement[i] && OidIsValid(pfeqop))
+ 		{
+ 			TypeCacheEntry *typentry = lookup_type_cache(fk_element_type,
+ 										 TYPECACHE_EQ_OPR);
+ 			if (!OidIsValid(typentry->eq_opr)
+ 				|| !equality_ops_are_compatible(typentry->eq_opr, pfeqop))
+ 				/* Error: incompatible operators */
+ 				pfeqop = InvalidOid;
+ 		}
+ 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
 							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
 							   format_type_be(fktype),
@@ -7274,8 +7393,16 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * column types to the right (foreign) operand type of the pfeqop.
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
-			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
-			new_fktype = fktype;
+ 			if (fkattelement[i])
+ 			{
+ 				old_fktype = get_base_element_type(tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid);
+ 				new_fktype = fk_element_type;
+ 			}
+ 			else
+ 			{
+ 				old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 				new_fktype = fktype;
+ 			}
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
 			new_pathtype = findFkeyCast(pfeqop_right, new_fktype,
@@ -7345,6 +7472,8 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  ppeqoperators,
 									  ffeqoperators,
 									  numpks,
+ 									  fkconstraint->fk_is_element,
+ 									  fkattelement,
 									  fkconstraint->fk_upd_action,
 									  fkconstraint->fk_del_action,
 									  fkconstraint->fk_matchtype,
#14Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#13)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Jun 26, 2017 at 2:26 AM, Mark Rofail <markm.rofail@gmail.com> wrote:

*What I did:*

- read into the old patch but couldn't apply it since it's quite old.
It needs to be rebased and that's what I am working on. It's a lot of
work.
- incomplete patch can be found attached here

Have you met any particular problem here? Or is it just a lot of

mechanical work?

*Bugs*

- problem with the @>(anyarray, anyelement) opertator: if for example,
you apply the operator as follows '{AAAAAAAAAA646'}' @> 'AAAAAAAAAA646' it
maps to @>(anyarray, anyarray) since 'AAAAAAAAAA646' is interpreted as
char[] instead of Text

I don't think it is bug. When types are not specified explicitly, then

optimizer do its best on guessing them. Sometimes results are
counterintuitive to user. But that is not bug, it's probably a room for
improvement. And I don't think this improvement should be subject of this
GSoC. Anyway, array FK code should use explicit type cast, and then you
wouldn't meet this problem.

On the other hand, you could just choose another operator name for
arraycontainselem.
Then such problem probably wouldn't occur.

*Suggestion:*

- since I needed to check if the Datum was null and its type, I had to
do it in the arraycontainselem and pass it as a parameter to the underlying
function array_contains_elem. I'm proposing to introduce a new struct like
ArrayType, but ElementType along all with brand new MACROs to make dealing
with anyelement easier in any polymorphic context.

You don't need to do explicit check for nulls, because arraycontainselem

is marked as strict function. Executor never pass null inputs to your
function if its declared as strict. See evaluate_function().
Also, during query planning it's checked that all polymorphic are
consistent between each other. See
https://www.postgresql.org/docs/devel/static/extend-type-system.html#extend-types-polymorphic
and check_generic_type_consistency() for details.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#15Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#14)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Jun 26, 2017 at 6:44 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Have you met any particular problem here? Or is it just a lot of
mechanical work?

Just A LOT of mechanictal work, thankfully. The patch is now rebased and
all regress tests have passed (even the element_foreign_key). Please find
the patch below !

I don't think it is bug.

That's good news !

*What I plan to do next *

- study ri_triggers.c (src/backend/utils/adt/ri_triggers.c) since this
is where the new RI code will reside

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v2-REBASED-f0256c7.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v2-REBASED-f0256c7.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..5c32a4f20a 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2299,6 +2299,14 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
+      <entry><structfield>confiselement</structfield></entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, is it an array <literal>ELEMENT</literal>
+      foreign key?</entry>
+     </row>
+
+     <row>
       <entry><structfield>connoinherit</structfield></entry>
       <entry><type>bool</type></entry>
       <entry></entry>
@@ -2324,6 +2332,18 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
+      <entry><structfield>confelement</structfield></entry>
+      <entry><type>bool[]</type></entry>
+      <entry></entry>
+      <entry>
+        If a foreign key, list of booleans expressing which columns
+        are array <literal>ELEMENT</literal> columns; see
+        <xref linkend="sql-createtable-element-foreign-key-constraints">
+        for details
+      </entry>
+     </row>
+
+     <row>
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..c1c847bc7e 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -881,7 +881,112 @@ CREATE TABLE order_items (
     <xref linkend="sql-createtable">.
    </para>
   </sect2>
-
+  
+   <sect2 id="ddl-constraints-element-fk">
+    <title>Array ELEMENT Foreign Keys</title>
+ 
+    <indexterm>
+     <primary>ELEMENT foreign key</primary>
+    </indexterm>
+ 
+    <indexterm>
+     <primary>constraint</primary>
+     <secondary>Array ELEMENT foreign key</secondary>
+    </indexterm>
+ 
+    <indexterm>
+     <primary>constraint</primary>
+     <secondary>ELEMENT foreign key</secondary>
+    </indexterm>
+ 
+    <indexterm>
+     <primary>referential integrity</primary>
+    </indexterm>
+ 
+    <para>
+     Another option you have with foreign keys is to use a
+     referencing column which is an array of elements with
+     the same type (or a compatible one) as the referenced
+     column in the related table. This feature is called
+     <firstterm>array element foreign key</firstterm> and is implemented
+     in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+     as described in the following example:
+ 
+    <programlisting>
+    CREATE TABLE drivers (
+        driver_id integer PRIMARY KEY,
+        first_name text,
+        last_name text,
+        ...
+    );
+
+    CREATE TABLE races (
+        race_id integer PRIMARY KEY,
+        title text,
+        race_day DATE,
+        ...
+        final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+    );
+    </programlisting>
+ 
+     The above example uses an array (<literal>final_positions</literal>)
+     to store the results of a race: for each of its elements
+     a referential integrity check is enforced on the
+     <literal>drivers</literal> table.
+     Note that <literal>ELEMENT REFERENCES</literal> is an extension
+     of PostgreSQL and it is not included in the SQL standard.
+    </para>
+ 
+    <para>
+     Even though the most common use case for array <literal>ELEMENT</literal>
+     foreign keys is on a single column key, you can define an <quote>array
+     <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+     of columns. As the following example shows, it must be written in table
+     constraint form:
+ 
+    <programlisting>
+    CREATE TABLE available_moves (
+        kind text,
+        move text,
+        description text,
+        PRIMARY KEY (kind, move)
+    );
+
+    CREATE TABLE paths (
+        description text,
+        kind text,
+        moves text[],
+        <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+    );
+
+    INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+    INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+    INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+    INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+    INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+    INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+    INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+    INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+    INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+    INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+ 
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+ 
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+ 
+  </sect2>
+ 
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index b15c19d3d0..229876d735 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -779,10 +779,11 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+    <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term>
+   <literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -806,6 +807,19 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+      </para>
+ 
+      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -868,7 +882,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -877,7 +892,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+           Set the referencing column(s) to null. Currently not supported
+           with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -889,6 +905,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -904,6 +922,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+ 
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+ 
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+     currently allowed:
+ 
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+ 
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+ 
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1859,7 +1932,16 @@ CREATE TABLE cities_ab_10000_to_100000
     <productname>PostgreSQL</productname> extension.
    </para>
   </refsect2>
-
+ 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+ 
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
  </refsect1>
 
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..a25ccd084c 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2099,7 +2099,9 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  0,
-							  ' ',
+ 							  false,
+	 						  NULL,
+ 							  ' ',
 							  ' ',
 							  ' ',
 							  NULL, /* not an exclusion constraint */
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 027abd56b0..a2e8baba55 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1212,6 +1212,8 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   0,
+ 								   false,
+  								   NULL,
 								   ' ',
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql
index 98bcfa08c6..0c731b1085 100644
--- a/src/backend/catalog/information_schema.sql
+++ b/src/backend/catalog/information_schema.sql
@@ -1226,7 +1226,9 @@ CREATE VIEW referential_constraints AS
                                   WHEN 'd' THEN 'SET DEFAULT'
                                   WHEN 'r' THEN 'RESTRICT'
                                   WHEN 'a' THEN 'NO ACTION' END
-             AS character_data) AS delete_rule
+             AS character_data) AS delete_rule,
+
+            con.confiselement AS is_element            
 
     FROM (pg_namespace ncon
           INNER JOIN pg_constraint con ON ncon.oid = con.connamespace
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..b96294f6a6 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -63,6 +63,8 @@ CreateConstraintEntry(const char *constraintName,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
 					  int foreignNKeys,
+ 					  bool confisElement,
+ 					  const bool *foreignElement,
 					  char foreignUpdateType,
 					  char foreignDeleteType,
 					  char foreignMatchType,
@@ -82,6 +84,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confelementArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -132,10 +135,15 @@ CreateConstraintEntry(const char *constraintName,
 			fkdatums[i] = ObjectIdGetDatum(ffEqOp[i]);
 		conffeqopArray = construct_array(fkdatums, foreignNKeys,
 										 OIDOID, sizeof(Oid), true, 'i');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = BoolGetDatum(foreignElement[i]);
+ 		confelementArray = construct_array(fkdatums, foreignNKeys,
+ 										   BOOLOID, 1, true, 'c');
 	}
 	else
 	{
 		confkeyArray = NULL;
+ 		confelementArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -177,6 +185,7 @@ CreateConstraintEntry(const char *constraintName,
 	values[Anum_pg_constraint_conislocal - 1] = BoolGetDatum(conIsLocal);
 	values[Anum_pg_constraint_coninhcount - 1] = Int32GetDatum(conInhCount);
 	values[Anum_pg_constraint_connoinherit - 1] = BoolGetDatum(conNoInherit);
+  	values[Anum_pg_constraint_coniselement - 1] = BoolGetDatum(confisElement);
 
 	if (conkeyArray)
 		values[Anum_pg_constraint_conkey - 1] = PointerGetDatum(conkeyArray);
@@ -188,6 +197,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confelementArray)
+ 		values[Anum_pg_constraint_confelement - 1] = PointerGetDatum(confelementArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confelement - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 7d9c769b06..25951c89c7 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -41,6 +41,7 @@
 #include "catalog/pg_inherits_fn.h"
 #include "catalog/pg_namespace.h"
 #include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
 #include "catalog/pg_tablespace.h"
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_type.h"
@@ -6995,6 +6996,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	bool		fkattelement[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7082,6 +7084,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkattelement, 0, sizeof(fkattelement));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7097,39 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+ 	 * If an array ELEMENT FK, decode the content of
+ 	 * the fk_element_attrs array.
+ 	 */
+ 	if (fkconstraint->fk_is_element)
+ 	{
+ 		ListCell   *l;
+ 		int			attnum;
+ 		bool		element_found = false;
+ 
+ 		attnum = 0;
+ 		foreach(l, fkconstraint->fk_element_attrs)
+ 		{
+ 			if (lfirst_int(l)) {
+ 
+ 				/*
+ 				 * Currently, the ELEMENT flag cannot be set on more than
+ 				 * one column.
+ 				 */
+ 				if (element_found) {
+ 					ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 						errmsg("array ELEMENT foreign keys support only one ELEMENT column")));
+ 				}
+ 
+ 				fkattelement[attnum] = true;
+ 				element_found = true;
+ 			}
+ 			attnum++;
+ 		}
+ 
+ 	}
+ 
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7140,6 +7176,22 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	old_check_ok = (fkconstraint->old_conpfeqop != NIL);
 	Assert(!old_check_ok || numfks == list_length(fkconstraint->old_conpfeqop));
+ 
+ 	/* Enforce array ELEMENT foreign key restrictions */
+ 	if (fkconstraint->fk_is_element)
+ 	{
+ 		/*
+ 		 * Array ELEMENT foreign keys support only NO ACTION and
+ 		 * RESTRICT actions
+ 		 */
+ 		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION
+ 				&& fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT)
+ 			|| (fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION
+ 				&& fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+ 			ereport(ERROR,
+ 				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("array ELEMENT foreign keys only support NO ACTION and RESTRICT actions")));
+ 	}
 
 	for (i = 0; i < numpks; i++)
 	{
@@ -7156,6 +7208,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		Oid			ffeqop;
 		int16		eqstrategy;
 		Oid			pfeqop_right;
+ 		Oid			fk_element_type = InvalidOid;
 
 		/* We need several fields out of the pg_opclass entry */
 		cla_ht = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclasses[i]));
@@ -7189,26 +7242,51 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "missing operator %d(%u,%u) in opfamily %u",
 				 eqstrategy, opcintype, opcintype, opfamily);
 
-		/*
-		 * Are there equality operators that take exactly the FK type? Assume
-		 * we should look through any domain here.
-		 */
-		fktyped = getBaseType(fktype);
-
-		pfeqop = get_opfamily_member(opfamily, opcintype, fktyped,
-									 eqstrategy);
-		if (OidIsValid(pfeqop))
-		{
-			pfeqop_right = fktyped;
-			ffeqop = get_opfamily_member(opfamily, fktyped, fktyped,
-										 eqstrategy);
-		}
-		else
-		{
-			/* keep compiler quiet */
-			pfeqop_right = InvalidOid;
-			ffeqop = InvalidOid;
-		}
+ 		if (fkattelement[i])
+  		{
+ 			/*
+ 			 * For every array ELEMENT FK, look if an equality operator that
+ 			 * takes exactly the FK element type exists.  Assume we should
+ 			 * look through any domain here.
+ 			 */
+ 			fk_element_type = get_base_element_type(fktype);
+ 			if (!OidIsValid(fk_element_type))
+ 				ereport(ERROR,
+ 					(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 					 errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 							fkconstraint->conname),
+ 					 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 							   format_type_be(fktype))));
+ 
+ 			pfeqop = get_opfamily_member(opfamily, opcintype, fk_element_type,
+  										 eqstrategy);
+ 			pfeqop_right = fk_element_type;
+ 			ffeqop = ARRAY_EQ_OP;
+  		}
+  		else
+  		{
+ 			/*
+ 			 * Are there equality operators that take exactly the FK type?
+ 			 * Assume we should look through any domain here.
+ 			 */
+ 			fktyped = getBaseType(fktype);
+ 
+ 			pfeqop = get_opfamily_member(opfamily, opcintype, fktyped,
+ 										 eqstrategy);
+ 			if (OidIsValid(pfeqop))
+ 			{
+ 				pfeqop_right = fktyped;
+ 				ffeqop = get_opfamily_member(opfamily, fktyped, fktyped,
+ 											 eqstrategy);
+ 			}
+ 			else
+ 			{
+ 				/* keep compiler quiet */
+ 				pfeqop_right = InvalidOid;
+ 				ffeqop = InvalidOid;
+ 			}
+  		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 		{
@@ -7225,25 +7303,46 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			Oid			target_typeids[2];
 
 			input_typeids[0] = pktype;
-			input_typeids[1] = fktype;
+ 			if (fkattelement[i])
+ 				input_typeids[1] = fk_element_type;
+ 			else
+ 				input_typeids[1] = fktype;
 			target_typeids[0] = opcintype;
 			target_typeids[1] = opcintype;
 			if (can_coerce_type(2, input_typeids, target_typeids,
 								COERCION_IMPLICIT))
 			{
-				pfeqop = ffeqop = ppeqop;
+ 				pfeqop = ppeqop;
 				pfeqop_right = opcintype;
+ 				/*
+ 				 * In case of an array ELEMENT FK, the ffeqop must be left
+ 				 * untouched; otherwise we use the primary equality operator.
+ 				 */
+ 				if (!fkattelement[i])
+ 					ffeqop = ppeqop;
 			}
 		}
 
+ 		/*
+ 		 * In case of an array ELEMENT FK, make sure TYPECACHE_EQ_OPR exists
+ 		 * for the FK element_type and it is compatible with pfeqop
+ 		 */
+ 		if (fkattelement[i] && OidIsValid(pfeqop))
+ 		{
+ 			TypeCacheEntry *typentry = lookup_type_cache(fk_element_type,
+ 										 TYPECACHE_EQ_OPR);
+ 			if (!OidIsValid(typentry->eq_opr)
+ 				|| !equality_ops_are_compatible(typentry->eq_opr, pfeqop))
+ 				/* Error: incompatible operators */
+ 				pfeqop = InvalidOid;
+ 		}
+ 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
+ 					 errmsg("foreign key constraint \"%s\" cannot be implemented",
 							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
 							   format_type_be(fktype),
@@ -7274,8 +7373,16 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * column types to the right (foreign) operand type of the pfeqop.
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
-			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
-			new_fktype = fktype;
+ 			if (fkattelement[i])
+ 			{
+ 				old_fktype = get_base_element_type(tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid);
+ 				new_fktype = fk_element_type;
+ 			}
+ 			else
+ 			{
+ 				old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 				new_fktype = fktype;
+ 			}
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
 			new_pathtype = findFkeyCast(pfeqop_right, new_fktype,
@@ -7345,6 +7452,8 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  ppeqoperators,
 									  ffeqoperators,
 									  numpks,
+ 									  fkconstraint->fk_is_element,
+ 									  fkattelement,
 									  fkconstraint->fk_upd_action,
 									  fkconstraint->fk_del_action,
 									  fkconstraint->fk_matchtype,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 45d1f515eb..c6ba754c87 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -603,6 +603,8 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  0,
+ 											  false,
+ 											  NULL,
 											  ' ',
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..16479fa83b 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3076,6 +3076,8 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  0,
+	 						  false,
+ 							  NULL,
 							  ' ',
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 67ac8145a0..0e4361230c 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2847,6 +2847,8 @@ _copyConstraint(const Constraint *from)
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
 	COPY_NODE_FIELD(old_conpfeqop);
+ 	COPY_SCALAR_FIELD(fk_is_element);
+ 	COPY_NODE_FIELD(fk_element_attrs);
 	COPY_SCALAR_FIELD(old_pktable_oid);
 	COPY_SCALAR_FIELD(skip_validation);
 	COPY_SCALAR_FIELD(initially_valid);
@@ -2868,6 +2870,17 @@ _copyDefElem(const DefElem *from)
 	return newnode;
 }
 
+static ForeignKeyColumnElem *
+_copyForeignKeyColumnElem(const ForeignKeyColumnElem *from)
+{
+	ForeignKeyColumnElem *newnode = makeNode(ForeignKeyColumnElem);
+
+	COPY_NODE_FIELD(name);
+	COPY_SCALAR_FIELD(element);
+
+	return newnode;
+}
+
 static LockingClause *
 _copyLockingClause(const LockingClause *from)
 {
@@ -5456,6 +5469,9 @@ copyObjectImpl(const void *from)
 		case T_DefElem:
 			retval = _copyDefElem(from);
 			break;
+ 		case T_ForeignKeyColumnElem:
+ 			retval = _copyForeignKeyColumnElem(from);
+ 			break;
 		case T_LockingClause:
 			retval = _copyLockingClause(from);
 			break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 91d64b7331..c121a0a5cb 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2579,6 +2579,8 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
 	COMPARE_NODE_FIELD(old_conpfeqop);
+ 	COMPARE_SCALAR_FIELD(fk_is_element);
+ 	COMPARE_NODE_FIELD(fk_element_attrs);
 	COMPARE_SCALAR_FIELD(old_pktable_oid);
 	COMPARE_SCALAR_FIELD(skip_validation);
 	COMPARE_SCALAR_FIELD(initially_valid);
@@ -2599,6 +2601,16 @@ _equalDefElem(const DefElem *a, const DefElem *b)
 }
 
 static bool
+_equalForeignKeyColumnElem(const ForeignKeyColumnElem *a,
+ 		const ForeignKeyColumnElem *b)
+ {
+ 	COMPARE_NODE_FIELD(name);
+ 	COMPARE_SCALAR_FIELD(element);
+ 
+ 	return true;
+}
+
+static bool
 _equalLockingClause(const LockingClause *a, const LockingClause *b)
 {
 	COMPARE_NODE_FIELD(lockedRels);
@@ -3606,6 +3618,9 @@ equal(const void *a, const void *b)
 		case T_DefElem:
 			retval = _equalDefElem(a, b);
 			break;
+ 		case T_ForeignKeyColumnElem:
+ 			retval = _equalForeignKeyColumnElem(a, b);
+ 			break;
 		case T_LockingClause:
 			retval = _equalLockingClause(a, b);
 			break;
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 3a23f0bb16..3fa2b399b3 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -2726,6 +2726,15 @@ _outTableLikeClause(StringInfo str, const TableLikeClause *node)
 }
 
 static void
+_outForeignKeyColumnElem(StringInfo str, const ForeignKeyColumnElem *node)
+{
+ 	WRITE_NODE_TYPE("FOREIGNKEYCOLUMNELEM");
+ 
+ 	WRITE_NODE_FIELD(name);
+ 	WRITE_BOOL_FIELD(element);
+}
+ 
+static void
 _outLockingClause(StringInfo str, const LockingClause *node)
 {
 	WRITE_NODE_TYPE("LOCKINGCLAUSE");
@@ -3467,6 +3476,8 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
 			WRITE_NODE_FIELD(old_conpfeqop);
+ 			WRITE_BOOL_FIELD(fk_is_element);
+ 			WRITE_NODE_FIELD(fk_element_attrs);
 			WRITE_OID_FIELD(old_pktable_oid);
 			WRITE_BOOL_FIELD(skip_validation);
 			WRITE_BOOL_FIELD(initially_valid);
@@ -4175,6 +4186,9 @@ outNode(StringInfo str, const void *obj)
 			case T_TableLikeClause:
 				_outTableLikeClause(str, obj);
 				break;
+ 			case T_ForeignKeyColumnElem:
+ 				_outForeignKeyColumnElem(str, obj);
+ 				break;
 			case T_LockingClause:
 				_outLockingClause(str, obj);
 				break;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 0f3998ff89..16c71ad07d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -392,7 +392,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreignKeyColumnList
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -466,7 +466,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <node>	def_arg columnElem where_clause where_or_current_clause
 				a_expr b_expr c_expr AexprConst indirection_el opt_slice_bound
 				columnref in_expr having_clause func_table xmltable array_expr
-				ExclusionWhereClause operator_def_arg
+				ExclusionWhereClause foreignKeyColumnElem operator_def_arg
 %type <list>	rowsfrom_item rowsfrom_list opt_col_def_list
 %type <boolean> opt_ordinality
 %type <list>	ExclusionConstraintList ExclusionConstraintElem
@@ -622,7 +622,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
@@ -766,6 +766,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %left		JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
 /* kluge to keep xml_whitespace_option from causing shift/reduce conflicts */
 %right		PRESERVE STRIP_P
+%nonassoc	ELEMENT
 
 %%
 
@@ -3435,6 +3436,24 @@ ColConstraintElem:
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
+ 					n->fk_is_element		= false;
+ 					n->skip_validation  = false;
+ 					n->initially_valid  = true;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ELEMENT REFERENCES qualified_name opt_column_list
+ 				key_match key_actions
+ 				{
+ 					Constraint *n = makeNode(Constraint);
+ 					n->contype = CONSTR_FOREIGN;
+ 					n->location = @1;
+ 					n->pktable			= $3;
+ 					n->fk_attrs			= NIL;
+ 					n->pk_attrs			= $4;
+ 					n->fk_matchtype		= $5;
+ 					n->fk_upd_action	= (char) ($6 >> 8);
+ 					n->fk_del_action	= (char) ($6 & 0xFF);
+ 					n->fk_is_element		= true;
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3625,8 +3644,9 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreignKeyColumnList ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
@@ -3649,7 +3669,31 @@ ConstraintElem:
 opt_no_inherit:	NO INHERIT							{  $$ = TRUE; }
 			| /* EMPTY */							{  $$ = FALSE; }
 		;
-
+ 
+foreignKeyColumnList:
+ 			foreignKeyColumnElem
+ 				{ $$ = list_make1($1); }
+ 			| foreignKeyColumnList ',' foreignKeyColumnElem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+foreignKeyColumnElem:
+ 			ELEMENT ColId
+ 				{
+ 					ForeignKeyColumnElem *n = makeNode(ForeignKeyColumnElem);
+ 					n->name = (Node *) makeString($2);
+ 					n->element = true;
+ 					$$ = (Node *) n;
+ 				}
+ 			| ColId
+ 				{
+ 					ForeignKeyColumnElem *n = makeNode(ForeignKeyColumnElem);
+ 					n->name = (Node *) makeString($1);
+ 					n->element = false;
+ 					$$ = (Node *) n;
+ 				}
+ 		;
+ 
 opt_column_list:
 			'(' columnList ')'						{ $$ = $2; }
 			| /*EMPTY*/								{ $$ = NIL; }
@@ -14676,6 +14720,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index ee5f3a3a52..128ed3b92a 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -743,6 +743,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				constraint->fk_element_attrs =
+ 						list_make1_int(constraint->fk_is_element);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
@@ -856,6 +858,33 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint *constraint)
 			break;
 
 		case CONSTR_FOREIGN:
+ 			/*
+ 			 * Split the content of foreignKeyColumnList
+ 			 * in two separate list. One list of fields
+ 			 * and one list of boolean values.
+ 			 */
+ 			{
+ 				ListCell *i;
+ 				List *old_fk_attrs = constraint->fk_attrs;
+ 
+ 				constraint->fk_attrs = NIL;
+ 				constraint->fk_is_element = false;
+ 				constraint->fk_element_attrs = NIL;
+ 				foreach (i, old_fk_attrs)
+ 				{
+ 					ForeignKeyColumnElem *elem =
+ 						(ForeignKeyColumnElem *)lfirst(i);
+ 
+ 					Assert(IsA(elem, ForeignKeyColumnElem));
+ 					constraint->fk_attrs =
+ 						lappend(constraint->fk_attrs, elem->name);
+ 					constraint->fk_is_element |= elem->element;
+ 					constraint->fk_element_attrs =
+ 						lappend_int(constraint->fk_element_attrs,
+ 									elem->element);
+ 				}
+ 			}
+ 
 			if (cxt->isforeign)
 				ereport(ERROR,
 						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..c09277ef3a 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,12 +115,15 @@ typedef struct RI_ConstraintInfo
 	NameData	conname;		/* name of the FK constraint */
 	Oid			pk_relid;		/* referenced relation */
 	Oid			fk_relid;		/* referencing relation */
+ 	bool		confiselement;		/* is an array ELEMENT FK */
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	bool		fk_element_atts[RI_MAX_NUMKEYS];	/* referencing cols is
+ 												 * an array ELEMENT FK */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +207,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				bool is_array);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +399,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +412,24 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *  SELECT 1 WHERE  1 *
+ 		 *    (SELECT count(DISTINCT y) FROM UNNEST($1) y WHERE y IS NOT NULL)
+ 		 *    [ * ...] = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		if (riinfo->confiselement) {
+ 			initStringInfo(&countbuf);
+ 			appendStringInfo(&countbuf, "SELECT 1 WHERE 1");
+ 		}
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +438,40 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that every
+ 			 * DISTINCT NOT NULL value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_element_atts[i])
+ 			{
+ 				appendStringInfo(&countbuf,
+ 					" * (SELECT count(DISTINCT y) FROM UNNEST(%s) y WHERE y IS NOT NULL)",
+ 					paramname);
+ 			}
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_element_atts[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->confiselement) {
+ 			appendStringInfo(&countbuf,
+ 							 " = (SELECT count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +598,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							false);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +791,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1015,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1172,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1352,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									false);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1519,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1696,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1863,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2055,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_element_atts[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2375,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *   SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *   FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2394,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->confiselement)
+ 			if (riinfo->fk_element_atts[i])
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->confiselement)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 				 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_element_atts[i])
+ 				appendStringInfo(&querybuf, "%sunnest(%s) k%d, %s ak%d",
+ 						sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 				 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 				 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2447,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
+ 		if (riinfo->confiselement)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						false);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2472,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->confiselement)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2570,7 +2664,8 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				bool is_array)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2591,9 +2686,23 @@ ri_GenerateQual(StringInfo buf,
 		ri_add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
 	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 	/*
+ 	 * If rightoptype is an array of leftoptype check equality using ANY().
+ 	 * Needed for array support in foreign keys.
+ 	 */
+ 	if (is_array)
+ 	{
+ 		appendStringInfo(buf, ") ANY (%s", rightop);
+ 		if (rightoptype != get_array_type (operform->oprright))
+ 			ri_add_cast_to(buf, get_array_type (operform->oprright));
+ 		appendStringInfo(buf, ")");
+ 	}
+ 	else
+ 	{
+ 		appendStringInfo(buf, ") %s", rightop);
+ 		if (rightoptype != operform->oprright)
+ 			ri_add_cast_to(buf, operform->oprright);
+ 	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2841,6 +2950,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	riinfo->confupdtype = conForm->confupdtype;
 	riinfo->confdeltype = conForm->confdeltype;
 	riinfo->confmatchtype = conForm->confmatchtype;
+ 	riinfo->confiselement = conForm->confiselement;
 
 	/*
 	 * We expect the arrays to be 1-D arrays of the right types; verify that.
@@ -2878,6 +2988,23 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confelement, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confelement for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	numkeys = ARR_DIMS(arr)[0];
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		numkeys != riinfo->nkeys ||
+ 		numkeys > RI_MAX_NUMKEYS ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != BOOLOID)
+ 		elog(ERROR, "confelement is not a 1-D boolean array");
+ 	memcpy(riinfo->fk_element_atts, ARR_DATA_PTR(arr),
+ 		   numkeys * sizeof(int16));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 18d9e27d1e..6f0368a523 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum element_array,
+ 								Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1876,6 +1879,7 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 		case CONSTRAINT_FOREIGN:
 			{
 				Datum		val;
+ 				Datum		element;
 				bool		isnull;
 				const char *string;
 
@@ -1888,11 +1892,20 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
-
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				element = SysCacheGetAttr(CONSTROID, tup,
+ 										  Anum_pg_constraint_confelement,
+ 										  &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confelement for constraint %u",
+ 						 constraintId);
+
+ 				decompile_fk_column_index_array(val, element,
+ 												conForm->conrelid, &buf);
+ 
+ 				appendStringInfo(&buf, ") REFERENCES ");
 
 				/* add foreign relation name */
-				appendStringInfo(&buf, ") REFERENCES %s(",
+				appendStringInfo(&buf, "%s(",
 								 generate_relation_name(conForm->confrelid,
 														NIL));
 
@@ -2179,6 +2192,54 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 }
 
 
+/*
+ * Convert an int16[] Datum and an bool[] Datum into a comma-separated
+ * list of column names for the indicated relation prefixed by
+ * an optional ELEMENT keyword; append the list to buf.
+ *
+ * The two arrays must have the same cardinality.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum element_array,
+ 								Oid relId, StringInfo buf)
+{
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *bools;
+ 	int			nBools;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, 2, true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of bool */
+ 	deconstruct_array(DatumGetArrayTypeP(element_array),
+ 					  BOOLOID, 1, true, 'c',
+ 					  &bools, NULL, &nBools);
+ 
+ 	if (nKeys != nBools)
+ 		elog(ERROR, "wrong confelement cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		char	   *element;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 		element = DatumGetBool(bools[j])?"ELEMENT ":"";
+ 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", element,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", element,
+ 							 quote_identifier(colName));
+ 	}
+}
+
 /* ----------
  * get_expr			- Decompile an expression tree
  *
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..177254c217 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -90,6 +90,9 @@ CATALOG(pg_constraint,2606)
 	/* Has a local definition and cannot be inherited */
 	bool		connoinherit;
 
+ 	/* true if an array ELEMENT foreign key */
+ 	bool		confiselement;
+ 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
 
 	/*
@@ -104,6 +107,12 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, true if array ELEMENT foreign key for each column of
+ 	 * the constraint
+ 	 */
+ 	bool		confelement[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
 	 */
@@ -150,7 +159,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					26
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -167,14 +176,16 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_conislocal		14
 #define Anum_pg_constraint_coninhcount		15
 #define Anum_pg_constraint_connoinherit		16
-#define Anum_pg_constraint_conkey			17
-#define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_coniselement		17
+#define Anum_pg_constraint_conkey			18
+#define Anum_pg_constraint_confkey			19
+#define Anum_pg_constraint_confelement		20
+#define Anum_pg_constraint_conpfeqop		21
+#define Anum_pg_constraint_conppeqop		22
+#define Anum_pg_constraint_conffeqop		23
+#define Anum_pg_constraint_conexclop		24
+#define Anum_pg_constraint_conbin			25
+#define Anum_pg_constraint_consrc			26
 
 /* ----------------
  *		initial contents of pg_constraint
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..4aa074f9c3 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -44,6 +44,8 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
 					  int foreignNKeys,
+ 					  bool confisElement,
+ 					  const bool *foreignElement,
 					  char foreignUpdateType,
 					  char foreignDeleteType,
 					  char foreignMatchType,
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 01527399b8..6cff3ba4b3 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -461,6 +461,7 @@ typedef enum NodeTag
 	T_InferClause,
 	T_OnConflictClause,
 	T_CommonTableExpr,
+ 	T_ForeignKeyColumnElem,
 	T_RoleSpec,
 	T_TriggerTransition,
 	T_PartitionElem,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 1d96169d34..62843df063 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -723,6 +723,21 @@ typedef struct DefElem
 } DefElem;
 
 /*
+  * ForeignKeyColumnElem - foreign key column (used in foreign key
+  * constraint)
+  *
+  * For a foreign key attribute, 'name' is the name of the table column to
+  * index, and element is true if it is an array ELEMENT fk.
+*/
+typedef struct ForeignKeyColumnElem
+{
+ 	NodeTag		type;
+ 	Node	   *name;			/* name of the column, or NULL */
+ 	bool		element;		/* true if an array ELEMENT foreign key */
+ 
+} ForeignKeyColumnElem;
+ 
+ /*
  * LockingClause - raw representation of FOR [NO KEY] UPDATE/[KEY] SHARE
  *		options
  *
@@ -2098,6 +2113,8 @@ typedef struct Constraint
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
 	List	   *old_conpfeqop;	/* pg_constraint.conpfeqop of my former self */
+ 	bool		fk_is_element;		/* is array ELEMENT foreign key? */
+ 	List	   *fk_element_attrs;	/* array ELEMENT FK attrs */
 	Oid			old_pktable_oid;	/* pg_constraint.confrelid of my former
 									 * self */
 
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..bfe9ebe20f
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,591 @@
+-- ELEMENT FK CONSTRAINTS
+--
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (ELEMENT ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (ELEMENT ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (ELEMENT ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array ELEMENT foreign keys only support NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[] ELEMENT REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float PRIMARY KEY, ptest2 text );
+-- FAILS because equality operator are incompatible
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key columns "ftest1" and "ptest1" are of incompatible types: integer[] and double precision.
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, ELEMENT fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check FK with cast
+CREATE TABLE PKTABLEFORARRAY (c smallint PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (c int[] ELEMENT REFERENCES PKTABLEFORARRAY);
+INSERT INTO PKTABLEFORARRAY VALUES (1), (2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,2}');
+UPDATE PKTABLEFORARRAY SET c = 3 WHERE c = 2;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_c_fkey" on table "fktableforarray"
+DETAIL:  Key (c)=(2) is still referenced from table "fktableforarray".
+DELETE FROM PKTABLEFORARRAY WHERE c = 1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_c_fkey" on table "fktableforarray"
+DETAIL:  Key (c)=(1) is still referenced from table "fktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, ELEMENT y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, ELEMENT y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (ELEMENT x, ELEMENT y) REFERENCES DIM1(x, y)
+);
+ERROR:  array ELEMENT foreign keys support only one ELEMENT column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (ELEMENT x, ELEMENT y) REFERENCES DIM1(x, y);
+ERROR:  array ELEMENT foreign keys support only one ELEMENT column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(ELEMENT x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(ELEMENT x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3] ELEMENT REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (ELEMENT SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (ELEMENT SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 23692615f9..72674fc3f2 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass element_foreign_key
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 5e8b7e94c4..e56038579a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -141,6 +141,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..103a25b197
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,452 @@
+-- ELEMENT FK CONSTRAINTS
+--
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (ELEMENT ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (ELEMENT ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (ELEMENT ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[] ELEMENT REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float PRIMARY KEY, ptest2 text );
+-- FAILS because equality operator are incompatible
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, ELEMENT fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[] ELEMENT REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check FK with cast
+CREATE TABLE PKTABLEFORARRAY (c smallint PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (c int[] ELEMENT REFERENCES PKTABLEFORARRAY);
+INSERT INTO PKTABLEFORARRAY VALUES (1), (2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,2}');
+UPDATE PKTABLEFORARRAY SET c = 3 WHERE c = 2;
+DELETE FROM PKTABLEFORARRAY WHERE c = 1;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, ELEMENT y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, ELEMENT y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (ELEMENT x, ELEMENT y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (ELEMENT x, ELEMENT y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(ELEMENT x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(ELEMENT x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3] ELEMENT REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (ELEMENT SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (ELEMENT SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[] ELEMENT REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
\ No newline at end of file
#16Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#15)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

On Mon, Jun 26, 2017 at 6:44 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Have you met any particular problem here? Or is it just a lot of
mechanical work?

Just A LOT of mechanictal work, thankfully. The patch is now rebased and
all regress tests have passed (even the element_foreign_key). Please find
the patch below !

Great!

*What I plan to do next *

- study ri_triggers.c (src/backend/utils/adt/ri_triggers.c) since this
is where the new RI code will reside

Any news?

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#16)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

I was unaware that there was a ver3 patch:
/messages/by-id/28617.1351095467@sss.pgh.pa.us

I rebased this also (rebased version attached here).

There were considerable changes in syntax between v2 and v3, and different
approaches in the implementations, so I have to restudy ri_triggers.c but
at least the old patch gave me a good idea of what's going on.

As for the *limitations *of the patch:

1. Only one "ELEMENT" column allowed in a multi-column key
- - e.g. FOREIGN KEY (c1, ELEMENT c2, ELEMENT c3) REFERENCES t1 (u1,
u2, u3) will throw an error
2. Supported actions:
- - NO ACTION
- - RESTRICT
3. The use of count(distinct y) in the SQL statements if the referencing
column is an array. Since its equality operator is different from the PK
unique index equality operator this leads to a broken statement
- regression=# create table ff (f1 float8 primary key);
CREATE TABLE
regression=# create table cc (f1 numeric references ff);
CREATE TABLE
regression=# create table cc2 (f1 numeric[], foreign key(each element
of f1) references ff);
ERROR: foreign key constraint "cc2_f1_fkey" cannot be implemented
DETAIL: Key column "f1" has element type numeric which does not have
a default btree operator class that's compatible with class "float8_ops".
4. undesirable dependency on default opclass semantics in the patch,
which is that it supposes it can use array_eq() to detect whether or not
the referencing column has changed. But I think that can be fixed without
undue pain by providing a refactored version of array_eq() that can be told
which element-comparison function to use
5. fatal performance issues. If you issue any UPDATE or DELETE against
the PK table, you get a query like this for checking to see if the RI
constraint would be violated:
SELECT 1 FROM ONLY fktable x WHERE $1 = ANY (fkcol) FOR SHARE OF x;
6. cross-type FKs are unsupported

These are the limitations I gathered from the previous mailing list:
/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan

I am pretty sure other limitations will arise.

I am confident that between the time the patch was implemented(2012) and
now postgres has grown considerably, the array functions are now more
robust and will help in resolving many issues.

I would like to point out that Limitation #5 is the first limitation we
should eliminate as it deems the feature unbeneficial.

I would like to thank Marco Nenciarini, Gabriele, Gianni and Tom Lane, for
their hard work in the previous patches and anyone else I forgot.

As for limitations for the anyarray @> anyelem operator's *limitations*:

1. since anyarray @< anyarray and anyarray @> anyelem have the same
symbol when a statemnt like this is executed '{AAAAAAAAAA646'}' @>
'AAAAAAAAAA646' it's mapped to anyarray @< anyarray instead of anyarray @>
anyelem
- but as Alexander pointed out

On Mon, Jun 26, 2017 at 6:44 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

When types are not specified explicitly, then optimizer do its best on
guessing them. Sometimes results are counterintuitive to user. But that
is not bug, it's probably a room for improvement. And I don't think this
improvement should be subject of this GSoC. Anyway, array FK code should
use explicit type cast, and then you wouldn't meet this problem.

*What I plan to do next: *

- located the SQL statements triggered at any insert or update and will
now "convert" them to use GIN. However, NO ACTION and RESTRICT are the
only actions supported right now

so that's how I will spend the next week.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v3-REBASED-42794d6.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v3-REBASED-42794d6.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..b4aefd7aa3 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2324,7 +2324,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2369,6 +2379,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index b15c19d3d0..c3fe34888e 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -779,10 +779,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -806,6 +806,19 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -868,7 +881,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -877,7 +891,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -889,6 +904,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -905,6 +922,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
    </varlistentry>
 
    <varlistentry>
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
     <listitem>
@@ -1843,6 +1915,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 027abd56b0..d95ac7d594 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1211,6 +1211,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index bb00858ad1..dc18fd1eae 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6995,6 +6995,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7002,10 +7003,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7082,6 +7085,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7098,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7179,6 +7227,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7239,14 +7346,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7275,6 +7380,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7317,7 +7429,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7341,6 +7452,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index b502941b08..cb017cbe14 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..4f089d53a9 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3075,6 +3075,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 67ac8145a0..e84c226f95 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2843,6 +2843,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 91d64b7331..f11017a711 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 3a23f0bb16..070e50994c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3463,6 +3463,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 0f3998ff89..6a302b243c 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3427,14 +3437,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3625,14 +3637,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3665,7 +3678,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14676,6 +14712,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15793,6 +15830,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index ee5f3a3a52..1542cb0fa4 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -743,6 +743,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..3a25ba52f3 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&countbuf,
+ 								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+ 								 paramname);
+ 
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,25 +2649,29 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+ 	Oid			oprright;
 
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
@@ -2586,14 +2682,32 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 	{
+ 		oprright = get_array_type(operform->oprright);
+ 		if (!OidIsValid(oprright))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(operform->oprright))));
+ 	}
+ 	else
+ 		oprright = operform->oprright;
+ 
 	appendStringInfo(buf, " %s %s", sep, leftop);
 	if (leftoptype != operform->oprleft)
 		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 
+ 	appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+ 
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 		appendStringInfoString(buf, "ANY (");
+ 	appendStringInfoString(buf, rightop);
+ 	if (rightoptype != oprright)
+ 		ri_add_cast_to(buf, oprright);
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 		appendStringInfoChar(buf, ')');
 
 	ReleaseSysCache(opertup);
 }
@@ -2801,6 +2915,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +2994,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3050,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 18d9e27d1e..ab433bb8d6 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1875,7 +1878,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1883,13 +1887,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1897,13 +1909,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2178,6 +2192,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 1d96169d34..28323fc99c 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2059,6 +2059,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2094,6 +2098,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..b62f53e729
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,590 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check FK with cast
+CREATE TABLE PKTABLEFORARRAY (c smallint PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (c int[], FOREIGN KEY (EACH ELEMENT OF c) REFERENCES PKTABLEFORARRAY);
+INSERT INTO PKTABLEFORARRAY VALUES (1), (2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,2}');
+UPDATE PKTABLEFORARRAY SET c = 3 WHERE c = 2;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_c_fkey" on table "fktableforarray"
+DETAIL:  Key (c)=(2) is still referenced from table "fktableforarray".
+DELETE FROM PKTABLEFORARRAY WHERE c = 1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_c_fkey" on table "fktableforarray"
+DETAIL:  Key (c)=(1) is still referenced from table "fktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 23692615f9..3ecd258f28 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 5e8b7e94c4..e56038579a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -141,6 +141,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..8c1e4d9601
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,452 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check FK with cast
+CREATE TABLE PKTABLEFORARRAY (c smallint PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (c int[], FOREIGN KEY (EACH ELEMENT OF c) REFERENCES PKTABLEFORARRAY);
+INSERT INTO PKTABLEFORARRAY VALUES (1), (2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,2}');
+UPDATE PKTABLEFORARRAY SET c = 3 WHERE c = 2;
+DELETE FROM PKTABLEFORARRAY WHERE c = 1;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#18Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#17)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

To make the queries fired by the RI triggers GIN indexed. We need to ‒ as
Tom Lane has previously suggested[1]/messages/by-id/28389.1351094795@sss.pgh.pa.us ‒ to replace the query

SELECT 1 FROM ONLY fktable x WHERE $1 = ANY (fkcol) FOR SHARE OF x;

with

SELECT 1 FROM ONLY fktable x WHERE ARRAY[$1] <@ fkcol FOR SHARE OF x;

but since we have @<(anyarray, anyelement) it can be improved to

SELECT 1 FROM ONLY fktable x WHERE $1 @> fkcol FOR SHARE OF x;

and the piece of code responsible for all of this is ri_GenerateQual in
ri_triggers.c.

How to accomplish that is the next step. I don't know if we should hardcode
the "@>" symbol or if we just index the fk table then ri_GenerateQual would
be able to find the operator on it's own.

*What I plan to do:*

- study how to index the fk table upon its creation. I suspect this can
be done in tablecmds.c

*Questions:*

- how can you programmatically in C index a table?

[1]: /messages/by-id/28389.1351094795@sss.pgh.pa.us

Best Regards,
Mark Rofail

Attachments:

GIN-fk-RI-code-v1.patchtext/x-patch; charset=US-ASCII; name=GIN-fk-RI-code-v1.patchDownload
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3a25ba52f3..0045f64c9e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2650,7 +2650,7 @@ quoteRelationName(char *buffer, Relation rel)
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
  * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
- * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf.
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop <@ rightop" to buf.
  *
  * The complexity comes from needing to be sure that the parser will select
  * the desired operator.  We always name the operator using
@@ -2697,17 +2697,10 @@ ri_GenerateQual(StringInfo buf,
 	appendStringInfo(buf, " %s %s", sep, leftop);
 	if (leftoptype != operform->oprleft)
 		ri_add_cast_to(buf, operform->oprleft);
- 
- 	appendStringInfo(buf, " OPERATOR(%s.%s) ",
- 					 quote_identifier(nspname), oprname);
- 
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoString(buf, "ANY (");
+ 	appendStringInfo(buf, " @> "); 
  	appendStringInfoString(buf, rightop);
  	if (rightoptype != oprright)
  		ri_add_cast_to(buf, oprright);
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoChar(buf, ')');
 
 	ReleaseSysCache(opertup);
 }
#19Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#18)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

* What I am working on*

- since we want to create an index on the referencing column, I am
working on firing a 'CREATE INDEX' query programatically right after the
'CREATE TABLE' query
- The problem I ran into is how to specify my Strategy (
GinContainsElemStrategy) within the CREATE INDEX query. For
example: CREATE
INDEX ON fktable USING gin (fkcolumn array_ops)
Where does the strategy number fit?
- The patch is attached here, is the approach I took to creating an
index programmatically, correct?

Best Regard,
Mark Rofail

Attachments:

GIN-fk-RI-code-v1.1.patchtext/x-patch; charset=US-ASCII; name=GIN-fk-RI-code-v1.1.patchDownload
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index dc18fd1eae..085b63aa98 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7139,6 +7139,31 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
 					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+
+		IndexStmt *stmt = makeNode(IndexStmt);
+		stmt->unique = false; /* is index unique? Nope, should allow duplicates*/
+		stmt->concurrent = false; /* should this be a concurrent index build? we want 
+									to lock out writes on the table until it's done. */
+		stmt->idxname = NULL; 		/* let the idxname be generated */ 
+		stmt->relation = /* relation name */;
+		stmt->accessMethod = "gin";	/* name of access method: GIN */
+		stmt->indexParams = /* column name + */"array_ops";
+		stmt->options = NULL;
+		stmt->tableSpace = NULL; 	/* NULL for default */
+		stmt->whereClause = NULL;
+		stmt->excludeOpNames = NIL;
+		stmt->idxcomment = NULL;
+		stmt->indexOid = InvalidOid;
+		stmt->oldNode = InvalidOid; /* relfilenode of existing storage, if any: None*/
+		stmt->primary = false; 		/* is index a primary key? Nope */
+		stmt->isconstraint = false; /* is it for a pkey/unique constraint? Nope */
+		stmt->deferrable = false;
+		stmt->initdeferred = false;
+		stmt->transformed = false;
+		stmt->if_not_exists = false; /* just do nothing if index already exists? Nope 
+									(this shouldn't happen)*/
+
+		ATExecAddIndex(tab, rel, stmt, true, lockmode);
 	}
 
  	/*
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3a25ba52f3..0045f64c9e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2650,7 +2650,7 @@ quoteRelationName(char *buffer, Relation rel)
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
  * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
- * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf.
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop <@ rightop" to buf.
  *
  * The complexity comes from needing to be sure that the parser will select
  * the desired operator.  We always name the operator using
@@ -2697,17 +2697,10 @@ ri_GenerateQual(StringInfo buf,
 	appendStringInfo(buf, " %s %s", sep, leftop);
 	if (leftoptype != operform->oprleft)
 		ri_add_cast_to(buf, operform->oprleft);
- 
- 	appendStringInfo(buf, " OPERATOR(%s.%s) ",
- 					 quote_identifier(nspname), oprname);
- 
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoString(buf, "ANY (");
+ 	appendStringInfo(buf, " @> "); 
  	appendStringInfoString(buf, rightop);
  	if (rightoptype != oprright)
  		ri_add_cast_to(buf, oprright);
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoChar(buf, ')');
 
 	ReleaseSysCache(opertup);
 }
#20Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#19)
Re: GSoC 2017: Foreign Key Arrays

On Sun, Jul 9, 2017 at 2:35 AM, Mark Rofail <markm.rofail@gmail.com> wrote:

* What I am working on*

- since we want to create an index on the referencing column, I am
working on firing a 'CREATE INDEX' query programatically right after
the 'CREATE TABLE' query
- The problem I ran into is how to specify my Strategy (
GinContainsElemStrategy) within the CREATE INDEX query. For
example: CREATE INDEX ON fktable USING gin (fkcolumn array_ops)
Where does the strategy number fit?
- The patch is attached here, is the approach I took to creating an
index programmatically, correct?

Could you, please, specify idea of what you're implementing in more
detail? AFACS, you're going to automatically create GIN indexes on FK
array columns. However, if we don't do this for regular columns, why
should we do for array columns? For me that sounds like a separate feature
which should be implemented for both regular and array FK columns.

Regarding your questions. If you need to create index supporting given
operator, you shouldn't take care about strategy number. Strategy number
makes sense only in opclass internals. You just need to specify opclass
which support your operator. In principle, you can find all of them in
pg_amop table. Alternatively you can just stick to GIN array_ops.

In general the approach you create index looks OK. It's OK to manually
create DDL node and execute it. As you can see, this is done in many other
places of backend code.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#21Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#20)
Re: GSoC 2017: Foreign Key Arrays

On Sun, Jul 9, 2017 at 2:38 AM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Could you, please, specify idea of what you're implementing in more
detail?

Ultimatley we would like an indexed scan instead of a sequential scan, so I
thought we needed to index the FK array columns first.

#22Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#21)
Re: GSoC 2017: Foreign Key Arrays

On Sun, Jul 9, 2017 at 1:11 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Sun, Jul 9, 2017 at 2:38 AM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Could you, please, specify idea of what you're implementing in more
detail?

Ultimatley we would like an indexed scan instead of a sequential scan, so
I thought we needed to index the FK array columns first.

Indeed, this is right.
But look how that works for regular FK. When you declare a FK, you
necessary need unique index on referenced column(s). However, index on
referencing columns(s) is not required. Without index on referencing
column(s), row delete in referenced table and update of referenced column
are expensive because requires sequential scan of referencing table. Users
are encouraged to index referencing column(s) to accelerate queries
produced by RI triggers. [1]
According to this, it's unclear why array FKs should behave differently.
We may document that GIN index is required to accelerate RI queries for
array FKs. And users are encouraged to manually define them.
It's also possible to define new option when index on referencing column(s)
would be created automatically. But I think this option should work the
same way for regular FKs and array FKs.

1.
https://www.postgresql.org/docs/current/static/ddl-constraints.html#DDL-CONSTRAINTS-FK

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#23Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#22)
Re: GSoC 2017: Foreign Key Arrays

On Sun, Jul 9, 2017 at 7:42 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

We may document that GIN index is required to accelerate RI queries for
array FKs. And users are encouraged to manually define them.
It's also possible to define new option when index on referencing
column(s) would be created automatically. But I think this option should
work the same way for regular FKs and array FKs.

I just thought because GIN index is suited for composite elements, it would
be appropriate for array FKs.

So we should leave it to the user ? I think tht would be fine too.

*What I did *

- now the RI checks utilise the @>(anyarray, anyelement)
- however there's a small problem:
operator does not exist: integer[] @> smallint
I assume that external casting would be required here. But how can I
downcast smallint to integer or interger to numeric automatically ?

*What I plan to do*

- work on the above mentioned buy/limitation
- otherwise, I think this concludes limitation #5

fatal performance issues. If you issue any UPDATE or DELETE against the PK

table, you get a query like this for checking to see if the RI constraint
would be violated:

SELECT 1 FROM ONLY fktable x WHERE $1 = ANY (fkcol) FOR SHARE OF x;.

or is there anything remaining ?

Best Regards,
Mark Rofail

#24Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#23)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

here are the modifications to ri_triggers.c

On Wed, Jul 12, 2017 at 12:26 AM, Mark Rofail <markm.rofail@gmail.com>
wrote:

Show quoted text

*What I did *

- now the RI checks utilise the @>(anyarray, anyelement)

Best Regards,
Mark Rofail

Attachments:

GIN-fk-RI-code-v1.3.patchtext/x-patch; charset=US-ASCII; name=GIN-fk-RI-code-v1.3.patchDownload
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3a25ba52f3..2d2b8e6a4f 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2650,7 +2650,7 @@ quoteRelationName(char *buffer, Relation rel)
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
  * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
- * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf.
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop <@ rightop" to buf.
  *
  * The complexity comes from needing to be sure that the parser will select
  * the desired operator.  We always name the operator using
@@ -2694,21 +2694,34 @@ ri_GenerateQual(StringInfo buf,
  	else
  		oprright = operform->oprright;
  
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
- 
- 	appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+
+		appendStringInfo(buf, " @> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
  					 quote_identifier(nspname), oprname);
- 
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoString(buf, "ANY (");
- 	appendStringInfoString(buf, rightop);
- 	if (rightoptype != oprright)
- 		ri_add_cast_to(buf, oprright);
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoChar(buf, ')');
 
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
#25Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#23)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

- now the RI checks utilise the @>(anyarray, anyelement)
- however there's a small problem:
operator does not exist: integer[] @> smallint
I assume that external casting would be required here. But how can I
downcast smallint to integer or interger to numeric automatically ?

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

BTW now that we've gone through this a little further, it's starting to
look like a mistake to me to use the same @> operator for (anyarray,
anyelement) than we use for (anyarray, anyarray). I have the feeling
we'd do better by having some other operator for this purpose -- dunno,
maybe @>> or @>. ... whatever you think is reasonable and not already
in use. Unless there is some other reason to pick @> for this purpose.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#26Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#25)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

Can you clarify this solution ? I think another solution would be external
casting

BTW now that we've gone through this a little further, it's starting to

look like a mistake to me to use the same @> operator for (anyarray,
anyelement) than we use for (anyarray, anyarray).

I agree. Changed to @>>

Best Regards,
Mark Rofail

#27Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#26)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 12, 2017 at 2:30 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <alvherre@2ndquadrant.com

wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

Can you clarify this solution ? I think another solution would be external
casting

If external casting is to be used. If for example the two types in

question are smallint and integer. Would a function get_common_type(Oid
leftopr, Oid rightopr) be useful ?, that given the two types return the
"common" type between the two in this case integer.

Best Regards,
Mark Rofail

#28Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#27)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

On Wed, Jul 12, 2017 at 2:30 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <alvherre@2ndquadrant.com

wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

Can you clarify this solution ? I think another solution would be external
casting

If external casting is to be used. If for example the two types in
question are smallint and integer. Would a function get_common_type(Oid
leftopr, Oid rightopr) be useful ?, that given the two types return the
"common" type between the two in this case integer.

Do you mean adding cast decorators to the query constructed by
ri_triggers.c? That looks like an inferior solution. What problem do
you see with adding more rows to the opclass?

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#29Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#28)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

I tried this approach by manually declaring the operator multiple of times
in pg_amop.h (src/include/catalog/pg_amop.h)

so instead of the polymorphic declaration
DATA(insert ( 2745 2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem
*/

multiple declarations were used, for example for int4[] :
DATA(insert ( 2745 1007 20 5 s 6108 2742 0 )); /* int4[] @>> int8 */
DATA(insert ( 2745 1007 23 5 s 6108 2742 0 )); /* int4[] @>> int4 */
DATA(insert ( 2745 1007 21 5 s 6108 2742 0 )); /* int4[] @>> int2 */
DATA(insert ( 2745 1007 1700 5 s 6108 2742 0 ));/* int4[] @>> numeric */

However, make check produced:
could not create unique index "pg_amop_opr_fam_index"
Key (amopopr, amoppurpose, amopfamily)=(6108, s, 2745) is duplicated.

Am I implementing this the wrong way or do we need to look for another
approach?

Attachments:

elemOperatorV3.4.2.patchtext/x-patch; charset=US-ASCII; name=elemOperatorV3.4.2.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..9d6447923d 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -110,6 +111,11 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
+		case GinContainsElemStrategy:
+			/* only items that match the queried element 
+				are considered candidate  */
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		case GinContainsStrategy:
 			if (nelems > 0)
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
@@ -171,6 +177,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +265,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..8c9eb0c676 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3a25ba52f3..9e7d66df7e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2650,7 +2650,7 @@ quoteRelationName(char *buffer, Relation rel)
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
  * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
- * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf.
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop @>> rightop" to buf.
  *
  * The complexity comes from needing to be sure that the parser will select
  * the desired operator.  We always name the operator using
@@ -2694,21 +2694,34 @@ ri_GenerateQual(StringInfo buf,
  	else
  		oprright = operform->oprright;
  
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
- 
- 	appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+
+		appendStringInfo(buf, " @>> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
  					 quote_identifier(nspname), oprname);
- 
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoString(buf, "ANY (");
- 	appendStringInfoString(buf, rightop);
- 	if (rightoptype != oprright)
- 		ri_add_cast_to(buf, oprright);
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoChar(buf, ')');
 
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..5649ecd22d 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,31 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+// DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+DATA(insert (	2745   1000 16 5 s 6108 2742 0 ));	/* bool[] @>> bool */
+DATA(insert (	2745   1001 17 5 s 6108 2742 0 ));	/* char[] @>> char */
+DATA(insert (	2745   1003 18 5 s 6108 2742 0 ));	/* name[] @>> name */
+DATA(insert (	2745   1231 20 5 s 6108 2742 0 ));	/* numeric[] @>> int8 */
+DATA(insert (	2745   1231 23 5 s 6108 2742 0 ));	/* numeric[] @>> int4 */
+DATA(insert (	2745   1231 21 5 s 6108 2742 0 ));	/* numeric[] @>> int2 */
+DATA(insert (	2745   1231 1700 5 s 6108 2742 0 ));/* numeric[] @>> numeric */
+DATA(insert (	2745   1016 20 5 s 6108 2742 0 ));	/* int8[] @>> int8 */
+DATA(insert (	2745   1016 23 5 s 6108 2742 0 ));	/* int8[] @>> int4 */
+DATA(insert (	2745   1016 21 5 s 6108 2742 0 ));	/* int8[] @>> int2 */
+DATA(insert (	2745   1016 1700 5 s 6108 2742 0 ));/* int8[] @>> numeric */
+DATA(insert (	2745   1007 20 5 s 6108 2742 0 ));	/* int4[] @>> int8 */
+DATA(insert (	2745   1007 23 5 s 6108 2742 0 ));	/* int4[] @>> int4 */
+DATA(insert (	2745   1007 21 5 s 6108 2742 0 ));	/* int4[] @>> int2 */
+DATA(insert (	2745   1007 1700 5 s 6108 2742 0 ));/* int4[] @>> numeric */
+DATA(insert (	2745   1005 20 5 s 6108 2742 0 ));	/* int2[] @>> int8 */
+DATA(insert (	2745   1005 23 5 s 6108 2742 0 ));	/* int2[] @>> int4 */
+DATA(insert (	2745   1005 21 5 s 6108 2742 0 ));	/* int2[] @>> int2 */
+DATA(insert (	2745   1005 1700 5 s 6108 2742 0 ));/* int2[] @>> numeric */
+DATA(insert (	2745   1021 700 5 s 6108 2742 0 ));	/* float4[] @>> float4 */
+DATA(insert (	2745   1021 701 5 s 6108 2742 0 )); /* float4[] @>> float8 */
+DATA(insert (	2745   1022 700 5 s 6108 2742 0 )); /* float8[] @>> float4 */
+DATA(insert (	2745   1022 701 5 s 6108 2742 0 )); /* float8[] @>> float8 */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
#30Enrique Meneses
emmeneses@gmail.com
In reply to: Mark Rofail (#29)
Re: GSoC 2017: Foreign Key Arrays

There is a generic definition for any array added as part of
https://commitfest.postgresql.org/10/708/ (it may be the reason for the
duplicate error). I am not sure what your change is but I would review the
above just in case. There is also a defect with a misleading error that is
still being triggered for UUID arrays.

Enrique

On Mon, Jul 17, 2017 at 4:25 PM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <alvherre@2ndquadrant.com

wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

I tried this approach by manually declaring the operator multiple of
times in pg_amop.h (src/include/catalog/pg_amop.h)

so instead of the polymorphic declaration
DATA(insert ( 2745 2277 2283 5 s 6108 2742 0 )); /* anyarray @>>
anyelem */

multiple declarations were used, for example for int4[] :
DATA(insert ( 2745 1007 20 5 s 6108 2742 0 )); /* int4[] @>> int8 */
DATA(insert ( 2745 1007 23 5 s 6108 2742 0 )); /* int4[] @>> int4 */
DATA(insert ( 2745 1007 21 5 s 6108 2742 0 )); /* int4[] @>> int2 */
DATA(insert ( 2745 1007 1700 5 s 6108 2742 0 ));/* int4[] @>> numeric */

However, make check produced:
could not create unique index "pg_amop_opr_fam_index"
Key (amopopr, amoppurpose, amopfamily)=(6108, s, 2745) is duplicated.

Am I implementing this the wrong way or do we need to look for another
approach?

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#31Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#29)
Re: GSoC 2017: Foreign Key Arrays

On Tue, Jul 18, 2017 at 2:24 AM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <alvherre@2ndquadrant.com

wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

I tried this approach by manually declaring the operator multiple of
times in pg_amop.h (src/include/catalog/pg_amop.h)

so instead of the polymorphic declaration
DATA(insert ( 2745 2277 2283 5 s 6108 2742 0 )); /* anyarray @>>
anyelem */

multiple declarations were used, for example for int4[] :
DATA(insert ( 2745 1007 20 5 s 6108 2742 0 )); /* int4[] @>> int8 */
DATA(insert ( 2745 1007 23 5 s 6108 2742 0 )); /* int4[] @>> int4 */
DATA(insert ( 2745 1007 21 5 s 6108 2742 0 )); /* int4[] @>> int2 */
DATA(insert ( 2745 1007 1700 5 s 6108 2742 0 ));/* int4[] @>> numeric */

However, make check produced:
could not create unique index "pg_amop_opr_fam_index"
Key (amopopr, amoppurpose, amopfamily)=(6108, s, 2745) is duplicated.

Am I implementing this the wrong way or do we need to look for another
approach?

The problem is that you need to have not only opclass entries for the
operators, but also operators themselves. I.e. separate operators for
int4[] @>> int8, int4[] @>> int4, int4[] @>> int2, int4[] @>> numeric. You
tried to add multiple pg_amop rows for single operator and consequently get
unique index violation.

Alvaro, do you think we need to define all these operators? I'm not sure.
If even we need it, I think we shouldn't do this during this GSoC. What
particular shortcomings do you see in explicit cast in RI triggers queries?

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#32Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#31)
Re: GSoC 2017: Foreign Key Arrays

On Tue, 18 Jul 2017 at 7:43 pm, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Show quoted text

On T upue, Jul 18, 2017 at 2:24 AM, Mark Rofail <markm.rofail@gmail.com>
wrote:

On Wed, Jul 12, 2017 at 12:53 AM, Alvaro Herrera <
alvherre@2ndquadrant.com> wrote:

We have one opclass for each type combination -- int4 to int2, int4 to
int4, int4 to int8, etc. You just need to add the new strategy to all
the opclasses.

I tried this approach by manually declaring the operator multiple of
times in pg_amop.h (src/include/catalog/pg_amop.h)

so instead of the polymorphic declaration
DATA(insert ( 2745 2277 2283 5 s 6108 2742 0 )); /* anyarray @>>
anyelem */

multiple declarations were used, for example for int4[] :
DATA(insert ( 2745 1007 20 5 s 6108 2742 0 )); /* int4[] @>> int8 */
DATA(insert ( 2745 1007 23 5 s 6108 2742 0 )); /* int4[] @>> int4 */
DATA(insert ( 2745 1007 21 5 s 6108 2742 0 )); /* int4[] @>> int2 */
DATA(insert ( 2745 1007 1700 5 s 6108 2742 0 ));/* int4[] @>> numeric
*/

However, make check produced:
could not create unique index "pg_amop_opr_fam_index"
Key (amopopr, amoppurpose, amopfamily)=(6108, s, 2745) is duplicated.

Am I implementing this the wrong way or do we need to look for another
approach?

The problem is that you need to have not only opclass entries for the
operators, but also operators themselves. I.e. separate operators for
int4[] @>> int8, int4[] @>> int4, int4[] @>> int2, int4[] @>> numeric. You
tried to add multiple pg_amop rows for single operator and consequently get
unique index violation.

Alvaro, do you think we need to define all these operators? I'm not
sure. If even we need it, I think
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#33Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#32)
Re: GSoC 2017: Foreign Key Arrays

On Tue, 18 Jul 2017 at 7:43 pm, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

separate operators for int4[] @>> int8, int4[] @>> int4, int4[] @>> int2,
int4[] @>> numeric.

My only comment on the separate operators is its high maintenance. Any new
datatype introduced a corresponding operator should be created.

#34Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#33)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

On Tue, 18 Jul 2017 at 7:43 pm, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

separate operators for int4[] @>> int8, int4[] @>> int4, int4[] @>> int2,
int4[] @>> numeric.

My only comment on the separate operators is its high maintenance. Any new
datatype introduced a corresponding operator should be created.

Yes.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#35Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alexander Korotkov (#31)
Re: GSoC 2017: Foreign Key Arrays

Alexander Korotkov wrote:

The problem is that you need to have not only opclass entries for the
operators, but also operators themselves. I.e. separate operators for
int4[] @>> int8, int4[] @>> int4, int4[] @>> int2, int4[] @>> numeric. You
tried to add multiple pg_amop rows for single operator and consequently get
unique index violation.

Alvaro, do you think we need to define all these operators? I'm not sure.
If even we need it, I think we shouldn't do this during this GSoC. What
particular shortcomings do you see in explicit cast in RI triggers queries?

I'm probably confused. Why did we add an operator and not a support
procedure? I think we should have added rows in pg_amproc, not
pg_amproc. I'm very tired right now so I may be speaking nonsense.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#36Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#35)
Re: GSoC 2017: Foreign Key Arrays

On Tue, Jul 18, 2017 at 11:14 PM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

Why did we add an operator and not a support
procedure?

I thought the support procedures were constant within an opclass. They
implement the mandotary function required of an opclass. I don't see why we
would need to implement new ones since they already deal with the lefthand
operand which is the refrencing coloumn and is always an array so anyarray
would suffice.

Also the support procedure don't interact with the left and right operands
simultanously. And we want to target the combinations of int4[] @>> int8,
int4[] @>> int4, int4[] @>> int2, int4[] @>> numeric.

So I think implementing operators is the way to go.

Best Regards,
Mark Rofail.

#37Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#36)
Re: GSoC 2017: Foreign Key Arrays

*To summarise,* the options we have to solve the limitation of the
@>(anyarray , anyelement) where it produces the following error: operator
does not exist: integer[] @> smallint

*Option 1: *Multiple Operators
Have separate operators for every combination of datatypes instead of a
single polymorphic definition (i.e int4[] @>> int8, int4[] @>> int4, int4[]
@>> int2, int4[] @>> numeric.)

Drawback: High maintenance.

*Option 2: *Explicit casting
Where we compare the datatype of the 2 operands and cast with the
appropriate datatype

Drawback: figuring out the appropriate cast may require considerable
computation

*Option 3:* Unsafe Polymorphic datatypes
This a little out there. But since @>(anyarray, anyelement) have to resolve
to the same datatype. How about defining new datatypes without this
constraint? Where we handle the datatypes ourselves? It would ve something
like @>(unsafeAnyarray, unsafeAnyelement).

Drawback: a lot of defensive programming has to be implemented to guard
against any exception.

*Another thing*
Until this is settled, another thing I have to go through is performance
testing. To provide evidence that all we did actually enhances the
performance of the RI checks. How can I go about this?

Best Regards,
Mark Rofail

#38Robert Haas
robertmhaas@gmail.com
In reply to: Mark Rofail (#37)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 19, 2017 at 8:08 AM, Mark Rofail <markm.rofail@gmail.com> wrote:

To summarise, the options we have to solve the limitation of the @>(anyarray
, anyelement) where it produces the following error: operator does not
exist: integer[] @> smallint

Why do we have to solve that limitation?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#39Mark Rofail
markm.rofail@gmail.com
In reply to: Robert Haas (#38)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 19, 2017 at 7:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:

Why do we have to solve that limitation?

Since the regress test labled element_foreing_key fails now that I made the
RI queries utilise @(anyarray, anyelement), that means it's not functioning
as it is meant to be.

#40Robert Haas
robertmhaas@gmail.com
In reply to: Mark Rofail (#39)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 19, 2017 at 2:29 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Wed, Jul 19, 2017 at 7:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:

Why do we have to solve that limitation?

Since the regress test labled element_foreing_key fails now that I made the
RI queries utilise @(anyarray, anyelement), that means it's not functioning
as it is meant to be.

Well, if this is a new test introduced by the patch, you could also
just change the test. Off-hand, I'm not sure that it's very important
to make the case work where the types don't match between the
referenced table and the referencing table, which is what you seem to
be talking about here. But maybe I'm misunderstanding the situation.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#41Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#36)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

On Tue, Jul 18, 2017 at 11:14 PM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

Why did we add an operator and not a support
procedure?

I thought the support procedures were constant within an opclass.

Uhh ... I apologize but I think I was barking at the wrong tree. I was
thinking that it mattered that the opclass mechanism was able to
determine whether some array @>> some element, but that's not true: it's
the queries in ri_triggers.c, which have no idea about opclasses.

(I tihnk we would have wanted to use to opclasses in order to find out
what operator to use in the first place, if ri_triggers.c was already
using that general idea; but in reality it's already using hardcoded
operator names, so it doesn't matter.)

I'm not entirely sure what's the best way to deal with the polymorphic
problem, but on the other hand as Robert says downthread maybe we
shouldn't be solving it at this stage anyway. So let's step back a bit,
get a patch that works for the case where the types match on both sides
of the FK, then we review that patch; if all is well, we can discuss the
other problem as a stretch goal.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#42Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#41)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 19, 2017 at 10:08 PM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

So let's step back a bit,
get a patch that works for the case where the types match on both sides
of the FK, then we review that patch; if all is well, we can discuss the
other problem as a stretch goal.

Agreed. This should be a future improvment.

I think the next step should be testing the performnce before/after the
modifiactions.

#43Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alvaro Herrera (#41)
Re: GSoC 2017: Foreign Key Arrays

On Wed, Jul 19, 2017 at 11:08 PM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

I'm not entirely sure what's the best way to deal with the polymorphic
problem, but on the other hand as Robert says downthread maybe we
shouldn't be solving it at this stage anyway. So let's step back a bit,
get a patch that works for the case where the types match on both sides
of the FK, then we review that patch; if all is well, we can discuss the
other problem as a stretch goal.

+1
Regular FK functionality have type restrictions based on btree opfamilies
and implicit casts. Array FK should not necessary have the same type
restrictions. Also, we don't necessary need to make those restrictions as
soft as possible during this GSoC project.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#44Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#43)
3 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

Okay, so I'm trying to test the performance of Foreign Key Array for 3
scenarios: Original Patch, After My Modifications and After My
Modifications with GIN index on the referencing column.

I have attached the sql test file here. It contains about 10k row
insertions.

However, there is a bug that prevented me from testing the third scenario,
I assume there's an issue of incompatible types problem since the right
operand type is anyelement and the supporting procedures expect anyarray.
I am working on debugging it right now.

But if it comes to it, should I introduce a new opclass specifically for
anyelement or add new supporting procedures to the old opclass ? .

I have also attached the results for the first 2 scenarios, however, the
third scenario is the most important one since it's what the project is all
about.

Also, this is kind of interesting. Upon reviewing the results

SELECT 1 FROM ONLY fktable x WHERE $1 @> fkcol FOR SHARE OF x;

produces worse results than the original

SELECT 1 FROM ONLY fktable x WHERE $1 = ANY (fkcol) FOR SHARE OF x;

so personally I don't think we should leave creating a GIN index up to the
user, it should be automatically generated instead.

Attachments:

element_foreign_key_performance.sqlapplication/sql; name=element_foreign_key_performance.sqlDownload
original_patch_results.outapplication/octet-stream; name=original_patch_results.outDownload
modified_results.outapplication/octet-stream; name=modified_results.outDownload
#45Robert Haas
robertmhaas@gmail.com
In reply to: Mark Rofail (#44)
Re: GSoC 2017: Foreign Key Arrays

On Sat, Jul 22, 2017 at 5:50 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

so personally I don't think we should leave creating a GIN index up to the
user, it should be automatically generated instead.

I can certainly understand why you feel that way, but trying to do
that in your patch is just going to get your patch rejected. We don't
want array foreign keys to have different behavior than regular
foreign keys, and regular foreign keys don't do this automatically.
We could change that, but I suspect it would cause us some pretty
serious problems with upgrades from older versions with the existing
behavior to newer versions with the revised behavior.

There are other problems, too. Suppose the user creates the foreign
key and then drops the associated index; then, they run pg_dump. Will
restoring the dump recreate the index? If so, then you've broken
dump/restore, because now it doesn't actually recreate the original
state of the database. You might think of fixing this by not letting
the index be dropped, but that's problematic too, because a
fairly-standard way of removing index bloat is to create a new index
with the "concurrently" flag and then drop the old one. Another
problem entirely is that the auto-generated index will need to have an
auto-generated name, and that name might happen to conflict with the
name of some other object that already exists in the database, which
doesn't initially seem like a problem because you can just generate a
different name instead; indeed, we already do such things. But the
thorny point is that you have to preserve whatever name you choose --
and the linkage to the array foreign key that caused it to be created
-- across a dump/restore cycle; otherwise you'll have cases where
conflicting names cause failures. I doubt this is a comprehensive
list of things that might go wrong; it's intended as an illustrative
list, not an exhaustive one.

This is a jumbo king-sized can of worms, and even a very experienced
contributor would likely find it extremely difficult to sort all of
the problems that would result from a change in this area.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#46Mark Rofail
markm.rofail@gmail.com
In reply to: Robert Haas (#45)
Re: GSoC 2017: Foreign Key Arrays

It certainly is, thank you for the heads up. I included a note to encourage
the user to index the referencing column instead.

On Sun, Jul 23, 2017 at 4:41 AM, Robert Haas <robertmhaas@gmail.com> wrote:

This is a jumbo king-sized can of worms, and even a very experienced
contributor would likely find it extremely difficult to sort all of
the problems that would result from a change in this area.

Best Regards,
Mark Rofail

#47Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#46)
Re: GSoC 2017: Foreign Key Arrays

However, there is a bug that prevented me from testing the third scenario,
I assume there's an issue of incompatible types problem since the right
operand type is anyelement and the supporting procedures expect anyarray.
I am working on debugging it right now.

I have also solved the bug that prevented me from performance testing the
New Patch with the Index in place.

Here is a summary of the results:

A- Original Patch
DELETE Average Execution time = 3.508 ms
UPDATE Average Execution time = 3.239 ms

B- New Patch
DELETE Average Execution time = 4.970 ms
UPDATE Average Execution time = 4.170 ms

C- With Index
DELETE Average Execution time = 0.169 ms
UPDATE Average Execution time = 0.147 ms

#48Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#47)
2 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

Here is the new Patch with the bug fixes and the New Patch with the Index
in place performance results.

I just want to point this out because I still can't believe the numbers. In
reference to the old patch:
The new patch without the index suffers a 41.68% slow down, while the new
patch with the index has a 95.18% speed up!

Best Regards,
Mark Rofail

Attachments:

elemOperatorV4.patchtext/x-patch; charset=US-ASCII; name=elemOperatorV4.patchDownload
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index c3fe34888e..828e5a6c07 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -816,6 +816,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
        for more information).
        Multi-column keys with more than one <literal>ELEMENT</literal> column
        are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
       </para>
  
      <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..416ed60b0c 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,64 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* only items that match the queried element 
+			are considered candidate  */
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +192,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +280,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..8c9eb0c676 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3a25ba52f3..9e7d66df7e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2650,7 +2650,7 @@ quoteRelationName(char *buffer, Relation rel)
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
  * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
- * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf.
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop @>> rightop" to buf.
  *
  * The complexity comes from needing to be sure that the parser will select
  * the desired operator.  We always name the operator using
@@ -2694,21 +2694,34 @@ ri_GenerateQual(StringInfo buf,
  	else
  		oprright = operform->oprright;
  
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
- 
- 	appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+
+		appendStringInfo(buf, " @>> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
  					 quote_identifier(nspname), oprname);
- 
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoString(buf, "ANY (");
- 	appendStringInfoString(buf, rightop);
- 	if (rightoptype != oprright)
- 		ri_add_cast_to(buf, oprright);
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoChar(buf, ')');
 
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
modified_with_index_results.outapplication/octet-stream; name=modified_with_index_results.outDownload
#49Erik Rijkers
er@xs4all.nl
In reply to: Mark Rofail (#48)
Re: GSoC 2017: Foreign Key Arrays

On 2017-07-24 23:08, Mark Rofail wrote:

Here is the new Patch with the bug fixes and the New Patch with the
Index
in place performance results.

I just want to point this out because I still can't believe the
numbers. In
reference to the old patch:
The new patch without the index suffers a 41.68% slow down, while the
new
patch with the index has a 95.18% speed up!

[elemOperatorV4.patch]

This patch doesn't apply to HEAD at the moment ( e2c8100e6072936 ).

Can you have a look?

thanks,

Erik Rijkers

patching file doc/src/sgml/ref/create_table.sgml
Hunk #1 succeeded at 816 with fuzz 3.
patching file src/backend/access/gin/ginarrayproc.c
patching file src/backend/utils/adt/arrayfuncs.c
patching file src/backend/utils/adt/ri_triggers.c
Hunk #1 FAILED at 2650.
Hunk #2 FAILED at 2694.
2 out of 2 hunks FAILED -- saving rejects to file
src/backend/utils/adt/ri_triggers.c.rej
patching file src/include/catalog/pg_amop.h
patching file src/include/catalog/pg_operator.h
patching file src/include/catalog/pg_proc.h
patching file src/test/regress/expected/arrays.out
patching file src/test/regress/expected/opr_sanity.out
patching file src/test/regress/sql/arrays.sql

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#50Mark Rofail
markm.rofail@gmail.com
In reply to: Erik Rijkers (#49)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Jul 24, 2017 at 11:25 PM, Erik Rijkers <er@xs4all.nl> wrote:

This patch doesn't apply to HEAD at the moment ( e2c8100e6072936 ).

My bad, I should have mentioned that the patch is dependant on the original
patch.
Here is a *unified* patch that I just tested.

I would appreciate it if you could review it.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v4.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v4.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..0d3a4c31d2 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2324,7 +2324,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2369,6 +2378,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..0228fbe941 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -938,6 +957,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
    </varlistentry>
 
    <varlistentry>
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
     <listitem>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..416ed60b0c 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,64 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* only items that match the queried element 
+			are considered candidate  */
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +192,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +280,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index d25b39bb54..4e0d0bdda0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1211,6 +1211,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index bb00858ad1..634a8cd97a 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6995,6 +6995,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7002,10 +7003,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7082,6 +7085,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7098,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7179,6 +7227,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7239,14 +7346,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7275,6 +7380,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7341,6 +7453,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index b502941b08..cb017cbe14 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..4f089d53a9 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3075,6 +3075,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 45a04b0b27..01238bfd71 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2843,6 +2843,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 379d92a2b0..119d100b37 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 9f37f1b920..163719c7a8 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -743,6 +743,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..8c9eb0c676 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..9e7d66df7e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&countbuf,
+ 								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+ 								 paramname);
+ 
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,25 +2649,29 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop @>> rightop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+ 	Oid			oprright;
 
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
@@ -2586,15 +2682,46 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 	{
+ 		oprright = get_array_type(operform->oprright);
+ 		if (!OidIsValid(oprright))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(operform->oprright))));
+ 	}
+ 	else
+ 		oprright = operform->oprright;
+ 
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
 
+		appendStringInfo(buf, " @>> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2928,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3007,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3063,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index d83377d1d8..680623534c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..b62f53e729
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,590 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check FK with cast
+CREATE TABLE PKTABLEFORARRAY (c smallint PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (c int[], FOREIGN KEY (EACH ELEMENT OF c) REFERENCES PKTABLEFORARRAY);
+INSERT INTO PKTABLEFORARRAY VALUES (1), (2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,2}');
+UPDATE PKTABLEFORARRAY SET c = 3 WHERE c = 2;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_c_fkey" on table "fktableforarray"
+DETAIL:  Key (c)=(2) is still referenced from table "fktableforarray".
+DELETE FROM PKTABLEFORARRAY WHERE c = 1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_c_fkey" on table "fktableforarray"
+DETAIL:  Key (c)=(1) is still referenced from table "fktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..8c1e4d9601
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,452 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check FK with cast
+CREATE TABLE PKTABLEFORARRAY (c smallint PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (c int[], FOREIGN KEY (EACH ELEMENT OF c) REFERENCES PKTABLEFORARRAY);
+INSERT INTO PKTABLEFORARRAY VALUES (1), (2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,2}');
+UPDATE PKTABLEFORARRAY SET c = 3 WHERE c = 2;
+DELETE FROM PKTABLEFORARRAY WHERE c = 1;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#51Erik Rijkers
er@xs4all.nl
In reply to: Mark Rofail (#50)
Re: GSoC 2017: Foreign Key Arrays

On 2017-07-24 23:31, Mark Rofail wrote:

On Mon, Jul 24, 2017 at 11:25 PM, Erik Rijkers <er@xs4all.nl> wrote:

This patch doesn't apply to HEAD at the moment ( e2c8100e6072936 ).

My bad, I should have mentioned that the patch is dependant on the
original
patch.
Here is a *unified* patch that I just tested.

Thanks. Apply is now good, but I get this error when compiling:

ELEMENT' not present in UNRESERVED_KEYWORD section of gram.y
make[4]: *** [gram.c] Error 1
make[3]: *** [parser/gram.h] Error 2
make[2]: *** [../../src/include/parser/gram.h] Error 2
make[1]: *** [all-common-recurse] Error 2
make: *** [all-src-recurse] Error 2

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#52Mark Rofail
markm.rofail@gmail.com
In reply to: Erik Rijkers (#51)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Jul 24, 2017 at 11:44 PM, Erik Rijkers <er@xs4all.nl> wrote:

Thanks. Apply is now good, but I get this error when compiling:

Well, this is embarrassing, okay, I cloned the repo and tested the fixed
patch and here it is.
Thanks for your patience.

Attachments:

Array-ELEMENT-foreign-key-v4 (fixed).patchtext/x-patch; charset=US-ASCII; name="Array-ELEMENT-foreign-key-v4 (fixed).patch"Download
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..b4aefd7aa3 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2324,7 +2324,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2369,6 +2379,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..0228fbe941 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -938,6 +957,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
    </varlistentry>
 
    <varlistentry>
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
     <listitem>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..416ed60b0c 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,64 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* only items that match the queried element 
+			are considered candidate  */
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +192,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +280,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index d25b39bb54..4e0d0bdda0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1211,6 +1211,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index bb00858ad1..dc18fd1eae 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6995,6 +6995,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7002,10 +7003,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7082,6 +7085,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7098,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7179,6 +7227,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7239,14 +7346,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7275,6 +7380,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7317,7 +7429,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7341,6 +7452,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index b502941b08..cb017cbe14 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..4f089d53a9 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3075,6 +3075,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 45a04b0b27..01238bfd71 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2843,6 +2843,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 379d92a2b0..119d100b37 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 4b1ce09c44..d1df75dd6e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3437,14 +3447,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3635,14 +3647,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3675,7 +3688,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14686,6 +14722,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15803,6 +15840,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 9f37f1b920..163719c7a8 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -743,6 +743,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..8c9eb0c676 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..9e7d66df7e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&countbuf,
+ 								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+ 								 paramname);
+ 
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,25 +2649,29 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop @>> rightop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+ 	Oid			oprright;
 
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
@@ -2586,15 +2682,46 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 	{
+ 		oprright = get_array_type(operform->oprright);
+ 		if (!OidIsValid(oprright))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(operform->oprright))));
+ 	}
+ 	else
+ 		oprright = operform->oprright;
+ 
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
 
+		appendStringInfo(buf, " @>> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2928,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3007,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3063,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index d83377d1d8..680623534c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..586eccab6e
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,553 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..8d5363efbf
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,415 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#53Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#52)
2 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

I have written some benchmark test.

With two tables a PK table with 5 rows and an FK table with growing row
count.

Once triggering an RI check
at 10 rows,
100 rows,
1,000 rows,
10,000 rows,
100,000 rows and
1,000,000 rows

Please find the graph with the findings attached below

Attachments:

FK Benchmark.jpgimage/jpeg; name="FK Benchmark.jpg"Download
����0ExifMM*#���(1�2��i� 
��'
��'Adobe Photoshop CS6 (Windows)2017:07:27 02:24:47�0221��	^�nv(~�HH����Adobe_CM��Adobed����			



��W�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE��t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw�������?�T�I%)$�IJQ{���Hh&:'$I0%C��c�d�XwIM!�j�(��k���Kw���G��o��w�::�=�gc,�>[�����^������^L� �O�JhU�q������X
{-62����=���i�Z���a����L�xn��o�6�W�������"cP�%9�u��U�e���������������b_�)�i���kv� ���s��n���������:Jh7����o�pu��X5��I����1Y��nV5y
k�,�����/c��FP}�V@{��d���<��i(���;�I%)$�IJI$�S���Uc����N����7��T�X�c���������lzE���n ����������?��Kq���zh>����qIJ>�Z���>�!��#��������?�����J_q���z[������A�?�����J_q���zg��apc�D{���Nk�&���*Ye����=�����������N��IIC�`��������?�37ll��������%+q���z���lz����pi�����#��jP���%0����J�\��
������?�(�����?�}��IJ�t����f_S�N��1i��X�����C�G���^�zr.��������\t��n�
������m�=����mlk�S�Y��R�x@=?��Td�>��{�:���/u52�Y��]n���S�����������
������n���03��T�$��:���4����?��H:������o�h�Y ���8���rJI
��}���P��g����#����IH��}���JT7�Y���)Cu��b���g���%#����I)P��g����
��}���R?y�w�d���g���$�9N-�ea�����Gbus��X}��S,��a[���mh!��?H6!VE�/����j�M����*����m��7����<���)L����`~w�S������L��o��������%-�?����/����#���$�	n�I�R�����G�����?��w�O������%1&�	.�5'q��	.}��%�x�������e<l->���KG�o?�?����T�����wi?�����P���H������s�C�����
����k���F���:��@�7:�d������
���@�	 	<���O�`��n�O�v�z2�y��X��
��������)R|O�������?����1k��}���M��:���	t4I���}���i������O�(��K�E�
���g�v�n����=�{�}�O��4�r�M�2���i]G���e�Og��!30}�_s�	<��M�W��V8el�n&� Ecpo�����(�D��)����;F��R9���=��C�L�����?o�e���2�C�C��f7�����������Ck�5�|6mw�%6�c`���?��}��-�������� �l��CT����C'�kD��~���d��)j����}�{�G��q�yu�����r�0�h[k����{���j���G����m�c���K��Av���mkA�����<%���7�sX7~��������P��s�i��eN���7�?��z�c��M��G���$4��6��}4z�������N�6�����b��
��{E�������M��C�������u��n]��,;����m���B�o����� @
$�#�7�����T�I%4��l�v�VD��c5���k��c�5���U[Z������bv����o����n������>��n��m��T2�i����yX�n�������f9��v������}:�}�.h,�X�0�������j���u�����k�
������Sxf���I��O��+�?�K/!�0Yml}CW�\���z���c������i����
�_��!Z���-���I%6*�Y�2���z�Y[�[��^��s�������n������R��<���������n�ip���\����i���������������iq���k����k����F�s7���v���O��T.�S[�wN ����y�rJt�����e�w��1��4��p�rfe9�x.����n���~��X�M~������p��?��,&:���K�������rJv��}o,s���9�O�.�����}�VlcH��=��$y?��.v[�]�7d�X��[Qj��'�I�$��v��Jm�H������:��c���������P�l�:�zO<�!�i���f!u��8���������N�@�����;w��������I$�����T���$�����[�{���Be�ii�6��P���~���.�}@�Xs�����-|��J~����v����;�������� 4i0�����_5�����O�# ��PF���GH1�n�[����#�N�ZG�y��%�RI)�B���<:�l��\����;b�8��VI%?PgU�c2KA��qf��������e��m�R���8���};W�)$���zJf ����5�����l�������&����\��9�?�?�/�IO��t�����t6$����7j�8])�5��l���������mI%?H?���V��Q�cw�z������V-mx�, �v���/��IO�I/�RIO�����Photoshop 3.08BIMvZ%G=(bFBMD01000a820d0000663f0000e6840000968700001f8a0000f4e20000bc2f0100204901009450010006580100edbe01008BIM%b���:�RNv������8BIM:�printOutputPstSboolInteenumInteClrmprintSixteenBitboolprinterNameTEXTprintProofSetupObjcProof Setup
proofSetupBltnenumbuiltinProof	proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd  doub@o�Grn doub@o�Bl  doub@o�BrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R
vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlongcropRectLeftlong
cropRectRightlongcropRectToplong8BIM�HH8BIM&?�8BIM
8BIM8BIM�	8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM8BIM8BIM0
8BIM-8BIM@@8BIM8BIM�	^'20427083_10157093190012228_2139797675_o	^nullboundsObjcRct1Top longLeftlongBtomlongRghtlong	^slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenumESliceOrigin
autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong	^urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT	horzAlignenumESliceHorzAligndefault	vertAlignenumESliceVertAligndefaultbgColorTypeenumESliceBGColorTypeNone	topOutsetlong
leftOutsetlongbottomOutsetlongrightOutsetlong8BIM(?�8BIM8BIM��W�� �����Adobe_CM��Adobed����			



��W�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE��t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw�������?�T�I%)$�IJQ{���Hh&:'$I0%C��c�d�XwIM!�j�(��k���Kw���G��o��w�::�=�gc,�>[�����^������^L� �O�JhU�q������X
{-62����=���i�Z���a����L�xn��o�6�W�������"cP�%9�u��U�e���������������b_�)�i���kv� ���s��n���������:Jh7����o�pu��X5��I����1Y��nV5y
k�,�����/c��FP}�V@{��d���<��i(���;�I%)$�IJI$�S���Uc����N����7��T�X�c���������lzE���n ����������?��Kq���zh>����qIJ>�Z���>�!��#��������?�����J_q���z[������A�?�����J_q���zg��apc�D{���Nk�&���*Ye����=�����������N��IIC�`��������?�37ll��������%+q���z���lz����pi�����#��jP���%0����J�\��
������?�(�����?�}��IJ�t����f_S�N��1i��X�����C�G���^�zr.��������\t��n�
������m�=����mlk�S�Y��R�x@=?��Td�>��{�:���/u52�Y��]n���S�����������
������n���03��T�$��:���4����?��H:������o�h�Y ���8���rJI
��}���P��g����#����IH��}���JT7�Y���)Cu��b���g���%#����I)P��g����
��}���R?y�w�d���g���$�9N-�ea�����Gbus��X}��S,��a[���mh!��?H6!VE�/����j�M����*����m��7����<���)L����`~w�S������L��o��������%-�?����/����#���$�	n�I�R�����G�����?��w�O������%1&�	.�5'q��	.}��%�x�������e<l->���KG�o?�?����T�����wi?�����P���H������s�C�����
����k���F���:��@�7:�d������
���@�	 	<���O�`��n�O�v�z2�y��X��
��������)R|O�������?����1k��}���M��:���	t4I���}���i������O�(��K�E�
���g�v�n����=�{�}�O��4�r�M�2���i]G���e�Og��!30}�_s�	<��M�W��V8el�n&� Ecpo�����(�D��)����;F��R9���=��C�L�����?o�e���2�C�C��f7�����������Ck�5�|6mw�%6�c`���?��}��-�������� �l��CT����C'�kD��~���d��)j����}�{�G��q�yu�����r�0�h[k����{���j���G����m�c���K��Av���mkA�����<%���7�sX7~��������P��s�i��eN���7�?��z�c��M��G���$4��6��}4z�������N�6�����b��
��{E�������M��C�������u��n]��,;����m���B�o����� @
$�#�7�����T�I%4��l�v�VD��c5���k��c�5���U[Z������bv����o����n������>��n��m��T2�i����yX�n�������f9��v������}:�}�.h,�X�0�������j���u�����k�
������Sxf���I��O��+�?�K/!�0Yml}CW�\���z���c������i����
�_��!Z���-���I%6*�Y�2���z�Y[�[��^��s�������n������R��<���������n�ip���\����i���������������iq���k����k����F�s7���v���O��T.�S[�wN ����y�rJt�����e�w��1��4��p�rfe9�x.����n���~��X�M~������p��?��,&:���K�������rJv��}o,s���9�O�.�����}�VlcH��=��$y?��.v[�]�7d�X��[Qj��'�I�$��v��Jm�H������:��c���������P�l�:�zO<�!�i���f!u��8���������N�@�����;w��������I$�����T���$�����[�{���Be�ii�6��P���~���.�}@�Xs�����-|��J~����v����;�������� 4i0�����_5�����O�# ��PF���GH1�n�[����#�N�ZG�y��%�RI)�B���<:�l��\����;b�8��VI%?PgU�c2KA��qf��������e��m�R���8���};W�)$���zJf ����5�����l�������&����\��9�?�?�/�IO��t�����t6$����7j�8])�5��l���������mI%?H?���V��Q�cw�z������V-mx�, �v���/��IO�I/�RIO��8BIM!UAdobe PhotoshopAdobe Photoshop CS68BIM�maniIRFR8BIMAnDs�nullAFStlongFrInVlLsObjcnullFrIDlong&K�sFrGAdoub@>FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong&K�sLCntlong8BIMRoll8BIM�mfri8BIM��mhttp://ns.adobe.com/xap/1.0/<?xpacket begin="���" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" photoshop:LegacyIPTCDigest="DDDBF0810BDBE8CDD612F0EF2AF344C1" photoshop:Instructions="FBMD01000a820d0000663f0000e6840000968700001f8a0000f4e20000bc2f0100204901009450010006580100edbe0100" photoshop:ColorMode="3" photoshop:ICCProfile="sRGB IEC61966-2-1 black scaled" xmpMM:DocumentID="CE65CD01C083411533DF6131F0CC82EE" xmpMM:InstanceID="xmp.iid:62AEED856072E711AE6FEA541452C699" xmpMM:OriginalDocumentID="CE65CD01C083411533DF6131F0CC82EE" dc:format="image/jpeg" xmp:CreateDate="2017-07-26T23:45:03+02:00" xmp:ModifyDate="2017-07-27T02:24:47+02:00" xmp:MetadataDate="2017-07-27T02:24:47+02:00"> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:61AEED856072E711AE6FEA541452C699" stEvt:when="2017-07-27T02:24:47+02:00" stEvt:softwareAgent="Adobe Photoshop CS6 (Windows)" stEvt:changed="/"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:62AEED856072E711AE6FEA541452C699" stEvt:when="2017-07-27T02:24:47+02:00" stEvt:softwareAgent="Adobe Photoshop CS6 (Windows)" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> </rdf:Description> </rdf:RDF> </x:xmpmeta>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 <?xpacket end="w"?>���ICC_PROFILE�mntrRGB XYZ �$acsp���-)�=���U�xB����9
descDybXYZ�bTRC�dmdd	��gXYZ
hgTRC�lumi
|meas
�$bkpt
�rXYZ
�rTRC�tech
�vued
��wtptpcprt�7chad�,descsRGB IEC61966-2-1 black scaledXYZ $����curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#���G���
�k���0�����W��������G����r���;����i���3�����d���0�����c���1�����f���6����n���?����z���M��� �����_���4���
�u���L���$�����h���B��������d���@��������i���G���&����v���V���8��������n���R���7�������u���\���D���-�������u���`���K���8���%�������y���h���Y���J���;���.���!������
�����z���p���g���_���X���Q���K���F���A���=���:���8���6���5���5���6���7���9���<���?���D���I���N���U���\���d���l���v��������������)���6���D���S���c���s�����
������2���F���[���p��������(���@���X���r��������4���P���m��������8���W���w����)���K���m��desc.IEC 61966-2-1 Default RGB Colour Space - sRGBXYZ b����XYZ PmeasXYZ 3�XYZ o�8��sig CRT desc-Reference Viewing Condition in IEC 61966-2-1XYZ ���-textCopyright International Color Consortium, 2009sf32D����&�������������u��!Adobed@�����	^��g	
		`
0@ Pp!1789"2#:�A3$46��%5&���B'(		!1���7	A"2���6Q��45�8�0@aq�B#3�� `�r���vx9P��R�$�Fw��p�b��C%�
�Ss&y�c�T�u'(�����DtEe���:���d���VGHh!1AQaq��"2@`��B3����# Pp�Rb$450�rC���S�%�cs����DT6������d�t�EU�����8�����4J�:�Hv�8���:��9�P����@{�Q��	��y`e^�[T�%Y�y���0^?K�QL-��������q���`K`�4~�� D�2,`�fj@�������O����������?C�
s$���3"��+���6�;�&�?*��80Y?H���0�=���p�S4�����?0b��21�1�2$"m�&��������Yp��G��g�z0bJ�%3# ����T�S?�rA��2�/�`TQ�����)|2����Y��!A�0z������mr+��!L+K�0�&���H�,`z^Xy��0|?+3�L?(#�z!I�������
2�192�.�~O��X~UG��a�N�"P�|���������f�����[O�8�J����7N`Z����<��O�t���f]�
������-�Z(�T�G�L~}�����)qR�G�<[t���X�L�����,�f�h�g��Z���W�����:�$y�$��v?OS��?Rb��01�/�K�S>�"�{`�&e��G��e�\�������������������Y�fc���h�Y��h�9L@��dX�M�������{?-�-3����Q�1^Dg<���4���O�d��������K��Y����f�~h%������FJd0�2 1�2P�O�x���a�fb~��:*����)�4J2{�����~���~�'�6ghX|��0 ��=��Z��,Z��H����P��Q���)��9�Qbc?��,��_1�?Y��?NS"h�~U���S���?I�������X�����~�d�+?3#�!�n���L�������{�(�� ��h0?`P@�'Z,�e._������
�������L5�d�����u��L�������%=����?I��?R���2�,(Js%��jF D�#�A�����j��e���b$�:b�$�+A@
�D�?7��#'J>weE���!:r�<���J:~y��*��pW��U��*QCJ�z���)��Yx������`�=�<1o2�eB#i!���D�<�n��G�#'J>wg�}�#�$��JR��y�lxr�|���DR]���2�.�P��4Bp�Z����0��GlFB�����"�(� �GeT�y}�J�L���-VCc�2�1�!a��dD31�*���0�2�0�.�P2�����P2���c���d1�%���}���QI`[���C^����1>�@�����@����������L����b�p�U�:������%��vQbQ�>,8I#" `�K�!���i�hB�������a.
^4��:+�h/.��N�\�Ee@jhjhj��y���l7[��h|�[x����t������9��}��CM��$�;5��G�m��t��3�b�|���9[������n�up�Ky�������k2�������g������`�r����a�_&�?�r��������q7I����s=�E��[���7���LF��e�4`dN;�z?=�8n�V��p��u�\��W��|:�!�����<Y%�����G6V�n�y=���a��M*
iX3��<uS����\d�n��>��w�����NG��T����Beq|\��u�y��W����z>v���.]�<`<�O
�y�m�[0�w���y�������}0r���K��a�)�U���>s�]W�����_`h��x(���>�J:���[��������~�m����O�P�����;�Y�b���l��@����1g��zP�y��Y������@�q�������qR�/W���;5�>{x��-�=G��l,=|�:;|�O&8��s����������X+&�����(a�`
]wy�����������]�����uo���W��7�G�T��/�����_=�1�}�{�9�\g_Pc=r����S���
I��P���g�g����������i!������F���/O4�<�Kk��}8$*%�`�X+&��h�{=%2TkmS��99)4v�1���c����2[����,��U�'�W�����j�
\��S'���^�X+&�����j��V�^�u��#�?�x~����9�f�hc����hk���V~bf���K�nJ�������b��=l7�����q�Z'�D]:_
�|�,��<WiD��f�3�r��w����l,�������`�lNn����"�+�}	��8!Y5-��14��������&�d���Xj��]%q���k_'�����_u���p'�����~qC�z��v|']�t;,���S��?��S6o����(�,��}"�^Y����VzIO�s�3���?_�M_��������>�u*S~vg.����3xH�����r��6�������B�jF}~l[5��M���4���n������c�����Yw��u���V+���o�����sb�1���|7SuZ������o�>�N���N�v����JVX+&�
n����$o�>��G�*����!Y5D������ym��o�L���@�E�e����VM@�����B�"}�����<�O��)&��;������o�@Z���������_z�=-C`'���S@�65������~6�?yX�@�8�RM`�NZ:uC�?H,�no7P��;���2&R]�-)�'�R����o��^���-�����i����f:s��X7����!}�r����&� +&�c?���y/|Y���Tx�������#��2s��:?��L�_":
��31p#����|��S�W�|a�B�j#�c�����&�?.}Pl���C�kX��O��-��&S{��p
�������o�����*XB�k��kY;�����W�����|Q�@
��_�8�c|g�O�i<yN
�?'�%�x�!I5�g�o�~��~����Uq���@�d�����>�:B�>;��b�z���I
I�|��a�<C��E������S�[@�d����.��_��)p�1�2k&8�����[��'����=��]��`VM@H:r��I|���>�S��������>L�"�u|v�����S�JH�C��_�?P��������!Y5����.��:}Y�����WK���:��zd0�m�ZS3?e�j�-�"�m�D�C����B�>\��>��P��q��/����2�HZt������*����,#�o�t���_��>G�9t�-��}3����m\:~9��M }���S�k�xG���*Tp,�F�o�t�X(��E��/���S�����8S���<������l���^J3���4������}��Yxr����"�?���
I�3������W��~h��P�i���!Y5�eblG�/��|���
W��{m���&���vW�i��RM`������y�������}#���P7����x���.3�
||��+�zO���MPCi�b }��}!I5�t�&�?7��z����
��m�1��?����/�\�9�i�q�\�����.�><��`�������.%�O�0�/��_Dx��?���_�9�
��C?G�X}��sx��>��������zw�Z���8+��h����7�������g��3X�%t��:�^U�e���z�/�1/���d�1��#�<��A����2�Q\#��i%)������^lRM`,
�w��~�d+��B�j��zx�}u�F�}��R~�</����_��1y21=�@�$����l�����N�tt>H
���G|�3���f/�z@X����g�|����S���	E����XXO����~�d5�?�P�P4�i�M����lo�@����?�]����cFB����$������u��N��p�gW��P#wg�[O�<Z��2}<����y���
�o�|��


�bN_x�Y�p���+��������z�?Ml
-��o}c���c.anI�������T���E��-M�}!$���=�` S���4��+���X����4��g�'�M]=9������No�����i��5=��ieq������l��&������%	�jh��,5�O������0E�~��{����#��)0��@*���H�bw�+=Tn���MOINbD�Jm-1�^I~[���a�O5���I�q`�n]����4v���\M��� V���U�~z|yG��,_��\������n���l��/�5�	*��x����}�����K�>��y���P�G�?d�������{��-��{��;��@�EM<A��G��+��K�:���9��'�����=o�-)�r��������d������>����(�h�=^c��@>���k~�������[/�P�0|���?>��(.�[��1��!a"����B������$����7�_(�����?��DVM@,���w����Z�>�9m���z�aRH����1��l��{�+sS��/vO�#�2l1�=q�	�_
�e�<�NJ�:DF%I�����!G{�c��}O�/�T]�@�d�5�cu�_��'|c��]�����y
zg���bNb���*�yS�!��fu��P��60��`R�G�.�X�s�


�Xt�1g��`�7X>Dx�����U�}�p��������wsN�^��Y{�����G�H�N �;P�>��4;�;0%e�e�>��3�{���t�_v��&YEO����*G�2T��v�Hr`o+��B�jo~���#o�~��1��O������=�P$S�� ���;�y�����"��V�l���,������J���?����o!Y5)��%����s!����5�2����/��n�� ���������Y������a�������$��8�������}�d����k�@VM@�M���|'�dO��m��+���e�����!5�:zBm�6���L�`��a������;��/Z(�&P����L���$�Y��|�|��9�?i�!Y5�������2M���A�K����r!����kh����������.TXh����(b0^L�����X���e�����������A�T�L�8���u�q��{y|��3����8pd���za���.jB��o3B����S@C�L����7l���QlN7���-�K��3��,�L��)A$V�����	.u+1g��G	l��G!����v��RM`-}��gh/��+����(�������������"�4��4jh|�����������yvr����{�m�@!_NP��ra����a���d�kLL}�2��4}r���@!Y51������$dW�����^y������*v������E��R[l�0����V��#����-�g�I/=�_���z�/�r���?���$��B�j\�K����~�,�@��]��9�j��w��hQ#V���@[K����R@+��foo)�4e$>�t����C�y[�|�����_�@
ONjB�j����/�2V���}���>���~6�n���#,c��/?��Z��XO�.�0��<�@��g�'���������_�l��<;��XB�j�=�o?^���|�����or�k��G��W�n8?��u#�������������L)&�9����/����o�����1�����~L������?�}��o�|_��k����/�|��.|�G{�z�!I5��7�����\�x�(���@�d��>�:_a�q���g�[����}W�HiN()�;���.7�GX/w��M<��T<yNJ�)&�,w�^sN�`�� ��� +&�ZW��~���Y%|���
�}+}C� �~*���D�;���~�u�����5�����f�*�e���e�����	S6�@����/��d��o���������o�}.]
�u%��Hj�m,z�>�;\��!����Fz&����3���8^���n�;��&���N���^A]W������B�j(gQ��W�����T.;��c��e�����-o3�GF���O��#��H\�{�}��<�%v8q]n�����������l�0���+�1���|x�ib��-�n�Q�S�j"-���@>�[��{o������}����|U�[@G=�������^|�H�0�8�'�W�M'~I���@���X�y+y7�\�|��w~#�my�w���r1�����
MW[a��>+������^o��������/���G2Q�#���[�<�}���p�����.���As����RM`�w=�DW%*���Sz������Yu���M@-��>)�5eb��������c����'�qb�d�w�`Z[��]|�+c�����c��T@�%u�X#�M���^�.���ci�o������B�]���'j���"��sbq�������)%���7���/��_S4=�H�����g�]��;���x�
��)L�6�A����%�#��s�,��cK����G�������mc�9�M���_z���>���	�x>-\�"G_��w�����Rq����Y���5P�d�"���8��w��M�?��u��6��<m�u��>������Q���F?�]�p�����\N��5'?��<��J�5
�����c��iy�>�����h>�j�y?�\[��P�&����u��My6J_��?z�������r���.U����>��i����#�c�G�hSNk����.��:�=�s'�c��Y|������]�z�Kh����ay�b�+����S�^1�<�}��������uY� M���*�g�o�p/~���w�A�]M���~�����O_�x��U�!I5�-������]�-���M���M��^������zo
�S+&����0����z'���������/���Wu8���o���u�G�yH�x�~d�?.*o��o�['�;x>C�;�!I5�
#�{^^�;��K���?��V�v~mp�<�����C��Co����VM@�����!O}�@���W��Pmn���<��;��������KI�5���avc������5��������.=jB\���k�6@�X�.*
��@ym����;��57����-~rv�KY�9_��`�����*����`��kpt�75{m�[���O�����#��W�j��ma���s�JzF����	o�[�K��~���:+����4S���CI���������w+D�����3�I e���� =J�������]���*]�J�R��������hl\5���<����C����O-\�%�5&����{]�8���ps��8��2���%_���I+�������5��i[x���Z������l��-]V\=&l^c&O5L�7:l{}f
���IfO<���������������Wg����Qx'���JI�8�/���r�~��C.�:�&��nR��V�*�m��8�^
d�U�����7,���2���t��tVou8�z|{]F-������Qn��}>K������o�s����%�nG��W������}�z�
2��h�_���6�����w��7����a���������~�y���7�8y=^o�b�P�P�F�Z���.)�4���P���v������4�E�+���/*hp��[m[h�~]�i��
�[�(4��%u�wR���j�)M��)Mk]�+�����4��n-���u���d��lt���������m�knq�oq`�������~��]�1��}�pvw�������������?w~��T�jhJ��hm��Z
��t_�f{�-���>�!)�~�k�P
*U@.�t�
iZj��(
T��m@R��[i�B��+���
=Z�ZS��)�}G~(x����`��pWpe��>��r�'��4f�8r=�=7����|��%�O+9����o����S70F�d}Q�����}��>\�
���>��y�7���?3$�����0�.`Y[�f��V
��mG�-y)�:9`����u����djY�&�T�;��BCZ��e��[�����u.w��l��k2������-1��	����N��Z��R@�ss� ��������,���������Y.��<<�������Q�L����o��DH����S��2�������:�m1	��=M��,�������:��T�f�7k���1���r��r=M�}+�g6�����QNrz�=�!��z��0@y]
�f�����J���b2�P�<���pd���~��������Z&��nO��DCI�j�ZY�|��D���;����4F��"���1 �F�5uOa���3s
3��V1f��p�\��
	��u�8��L�!��Y�_?���J�s����� �BK���$����w������P<kl�Y�w5h������q��x�����Hm�49��%���ro�HG�cC��������t��,Z�m���k~�����H@��w���@���@����X���X�����>�|�����#C����!������X>C�6��|��j|�����
���y�|g�����X�hs!��)�SO{`���@[���T�@G��+���%G�#�)�W���p?V��$�!AJy��� e���K���;/F��e)2� ��[����HV����2*�j�j�+Yw�~|D%��^
�dL#�������&K����i�@�u�Y^���RF8De9L�Ly��]p������Iu�z��-�A2�'�.�a�e�bd�Z�����L�B��1W.�F���^�������0/:ft����,�gjcy2e��<��bO��d�%��T�Lf�b���,�������P�f# ������s�j� ���)�9����LU���Y�80�3+��
Ld Xh���O��8�������T2�:��unu��}@�>��C�;�:�����7'���O���
��+��	(Y�P
S@
��J�j��J���gnn6�����SCy�o�~�������5��'�=��o4(��`�Nr��IP�
�WB��H�jl9
@�9M� ;���a��F�G�M���or�F��CSh9M@�)����7���L>�(�POPjo#�]��I�q���1a-�]���#)�K��4�#�\�a�s#�:�E����
�H�����@K���Q���K���.pxR�l�?�a$�m��/R^D���o����-�S�'y
�^��E
->d�[���#�K��720�.<}��0_��T���"�rb,�X�<�<���-lx�!R�&����H�0�e~!I;�� T����|Z�E���������p�S�D*&������(!v����H�Ocpn�����A��Ay���<����������>$@)�6K{��/�`�\\�_#��1��M�L��P_��d�D�>#��4���[�����`R�4�� -&K������d\r���".�Vr:���$�8�rP���F
�S���-�V�_��h|&?��dQR���.*}����j}�O#���3"�&�xp3~t�)�v��
�3��8�c��p��1�hm9
����hjo9�a�`����6&Ao���&��>z�X������%�`K�>"-2�?=���U:bX����S��8�51�jq���>�i����
��#�����q����1�m6���Cq��7��Y���J�D��=iFK��L�ykC�L���&����$��!r����y�����"���P��ld�n@
Sq��q��y�}G447��D
�uE���d��=��hB���47��P�������T�Q����E#.�X���=��������J�J2�G�d.Z�M8(Js�.�rQ2��)I4	�B�h�������ng*YP�Xd��1+��@�%.^}�nMLa�����AP���,�>t������XN����/�{���0+�/KW��j�yC�����>��G p,�Lb�h��3&9��	u���>�p i��S�"	�r�[������	zr�&C� 0h�=��m7�F�����CCq���
����n7��1a%ih����������u�����E|2�9h����2C0�%�X��c
�[����#�{B��00q��u�~
N3��5�Phs� jhm�i���o8�cq��D�<�E��6�N]T�e��������9�j#�m�-�|��.�[�V[������K��Lx�����H����u�d=�ts�m8�cP8MM��d�"L�uB�e:"	�Q(�qN�"I`���a"q|"���4S�J��9�h
��Y����m6��
MM��i��7�M��f�Pq�������j3y��P��q���i��m9�����9@��	MMA��m7��
�7f�PSC@h


���S@�7�5���q��S`5���y,�@�q�y(1	���+]t<���g����[Z��.bw���
��bF�����L]%������Fh�y��^���|�������Y��M6@7D����OR���*�z������MP��>"����u"S���a�@[)�nb��E5�s�������h(���x���n};*����1
�y���gM��sc
�y���-A��>�;��=� a��4c�:�\�2V�n�_]y��f��e�5R�����5��:6�
���O������[An_��F{^~j��a��z�v�]e��`�
V����Qo���S�Vu�~������>+j����t�}���
��ZOvO����?e�eMmI5#O����/�	��\ ��D�7j�-�2X��e���n
s��}�fc��������SQY�+m�y���R�Y�k
��������C�C�"�����3��}�M]fB�����j�r�������l��X�K��e�T�-����f�m.�HcP-�C�@��uE��������r;���6Z����q�o���=|�����d\,�`e-���Lku=<D���#�~����qMZ�f}@i�X���&����������[�����T�����"�d�7�jr.�U()������v��46y�"�x���g'����M��/�p(��2��64��T��$�f.lq�35d��Yk����K��zV�m�
rn������tXr�Xj�+�)����!�����!M@���5���r�1������[����KOv;�i��G�����F@���n������o6�t�_�M���s������~������[��������
ny�3a��p�Y�&����<Z2Zb���w��_.��Ogz��Zm������_�%�8�����_6�9��5�����n:Us����Sk[u����V����S��9��0��D�#B��5k�N��?N�8���1J9����0�g[W(�v~���Y�K ����v63m��h?3�dd�6z|vXrV�;oZ�|�+��
��
��63��CW%*]�f`>C�O���f[D�5
�������iT�,w(���=)ln������d_����irS(�[X#bi��7c1��}BOu�eV����!�q�M�	�V����b��oG�6&j����VR��/��<���������� q�1wCPzcu��f�	�7%k^c���;�{����FW�l������3X.	�`�n�L�r�9Eg��e@:�Z��k������#�.���`d��7��o�d�+��!��%O8[��0�@6Y^+��\_niUM�]���[��w04"o(�d�m����iV�0�}��otu�����#��m��u��t>_��c�}�q�s����OBB�sP4���o#��u��'2x���m���@�S��8��G!��k�q�f�~\�6�W��o��k����x�9k�u���[�{L���w��2��bo�@>|�������iux�Y�u�����;�Uc������������9��' 

�������������Sf��VC�i�{y~�Ywg����1<f�.��_LF��kz�;z���&�6L����6�O�g=r����f��.���b�l�Q����@}�d����=�D
�xS�+���RMM��J?���E�'2����2�U�������n�]b�i��?3��\} ��Q2J>XYtT��L���
�������hR� ��J:#����=����
��K'���bf�C�1���l�c�6�?.j���Z2^�6;����+�\��)5�V�RB�n����[ ���]Z�e��w$Y��!��Jc�d,b�A��m.�],����Ag��������'b{�Im1�5��&�|zob�|D���g��p!%�����p�=��~���e�v��G~_���m�M�(_S���gV�vW@������j�/�b�xbR�����HZGs_�F�7\r�b���4e����.v����cc3!vT��s��v;n��>��.O(^X1��B��j&�������m�=[�I{{u����]����[8�F�9�Ar���+i��|�&�m�{n<�S>�����9�>�c[��\���6��_n��M��,o��������y)]�W~����{�����ZO���>PR�h����� ������j����-�W�����<� �iKm����/c�wS�����]��BR������j�:
Gj��9n���u6�>miS���ss�����Rz���n�hFI}����"
/��vk�f������-�iw2C�
�m�=!����o��v+8�Hr�Al����U���n�l����x�M�5����kgv���owl��d>�5�]`�_n���6M�q�P�;��������o�l&�[
�BB��������9N0n�v����zx�61����t��#Xs��e!��p�\Z�g���%������;]g6��qP���cC?�nYX�-���u]�6NMlZ_p��eY76���J�Y�����'OG��ef7������<w�dg������#��+���5n��pi���f����w��<t�����fju	�q������q�[�Wo��iLH���K�SV���=]���9o�jhj�jj�%�i#!3�h	L��r����OC���s���[ ���72]'7��nx����V��co5�u�����}���,��+��<MN������x��-�23Sr+H���*f�mF����]w5�����K9��x���)����5-A��R����m���|_I3g! ���B�Y~��;�h�u#�?�����w�zw�]]��c��qKqs]���:�<'Q�����A���}|�%��&l����i�W�y
m�������d��'�2�1,!p���_��qkS���E9���v:��3���������)-L���ku
�]H52����G������"���D�
8y^����#]a��W&=6�w��W���b|Z����k7���9��?N���j�)��BPR`�|����j[�O7�������������q��k�b�r_v���~���[�����GM�/����Hn�}MBK-
�kK��N�y[�����lV(lh��jz��.��u�:�����od��#�Z��N�� ����
���x���[m�6{m�_�W5
���Q��c��<����
JZ����M�_=�CWk�����Y�E\u?_ ��[nWw�WO��i�=���+c�c
X���v��5���$~hjp�&�)���>�q�,�-�����n��w�j�����O�����k���
�a�W�})���HFk��i�������wZ�qWWdf��M�SY=u�8�����}�����q���4P��n6�NCCy��s0d�[��kk����sc�����-�����dip��7=u�,����q�����WCn��=��T����Pf����-�w$������rV���-��?J�j��tm�,�{b�������
�G����5��C����g�����q�����s�����FL��z"�1�l������=�,�k��TrFy��������w7��.�)����%�������S�/��~}O������T���L�@2�d�7j�.�����LQ�������K/�Wp75)�;?h~����e�;�>��Qk��7��	7S�^r���z�����7%&��Js�R��q�i]��m����kF^�z�#d���ef����� |����t��S���Z�8���g���Y�TzC"��".�E��E�
@�%���d�w��:�p����v���9�|2w�2���"�z���B����I���p�bv"�C����}����_F����b�u��4�[B�d��h��yH]~���������B���5��6R%9�U�h������	�_��H���#9��5@52�YlH������y�9Js��;���� �w+�Ev�}�l������������9�����������^�����F��[���
��O���n�k��G�q����b�E{X�m��K���g���Br�����=�\x�R�
O��

���)��:��^0�*����j�SmV�Sn|>
*V�MBU9���n_5\T�%k���M�K(�F]pz���	,;c��/���Q��P<�f����]H�&�-RE�PC�����=IY����8�@sq�,G|��H��i3�2����7T���p�
�DE+.<�D���?�#J�+P������z�n�6��������|����������u��K���X|������Nsy�������'�7��)�l�in�lU65���
�I�l�z�����6j=1��y�nk��b��.��a��\|����g���[�m��+�����zlb��6
����[��u
O��
@��|��}�PrI������g~o������U�y��KgZ�[u��=����^�����#��w�����������H��MM�����Z4t�z���o��=B����69��u(U�M��}r�������I��,E�n����m���>��X4���1>�R3;�<$!��qxP�m��6,�`��vI+I���i_�57�����D�E�d���������)��'=���[�S4��:g�r]���|���s����5�@��ay\3g���wGd�n�I��:��a��So����ap�b�*Q�����B1"��8��zO�m���g���y����'W��:>z�pOFf�o5 ���D=
��E��>���������Q�&1�����r^~SJ��m�r*j��7'8Y�l���:m�|w#�������f�����-���bO3/�i[r"A�)uB�E�JnF3$�3�%���������uP�Q����v����n���n�]6�&���\f�F��^|�]fL^x�S�\�����?^^kND���[P�(�{3������\����NL=���urY7��O5{���>,�,��ql�!A�Q1K\��gXdcfI���3)&
��9��9C����q�7c-�`�gC����zX]k�n_�2���>[�-,��4$f]Y)c]�d��b��v�{��;����������u��������:c�h��|��w����d�v�-r����&��������9MNCp����Ev��fv�����v����Le;��;�^q�����������KW�H��������/�v>ksk}
)^���>��6��a��a��u�z}��p$)Q�P-�P@���6Wa�hPb����o���L�v���mM�vy26c�%��o�^\��Y@�q�i���V�$�f�f}~Kw9)���[�.��4�������Y���7��iq���K�jhj�����m�ir�b�6Uk�v=����� ����>6;5�{6-,�\ymV�����K�����e�U�`j���.]n���mZ^Q�.]]m�Zl���������]~���r��4��i��+��re�����Thjo5?������I<��`��:f���`�T���-+b�V�l����,�����f��4UD���)�����TU���u�������jo��t���EZ��V���Z�w�Q�Y��RJ��]]�Z��-�2�IMT��.rL��&F�������C���>��C���$���>Z�f��6�^�Q�v����Vbi�b����f'��i��i�0�/<_�S�Yv��"[6�J[i���%>j=1�D�Dw��(�����.U�-#�&�+cW�uU���2�|���uG��R�����R��L���L��$�;�x
��#r�NRMV��9��g�b8�q���"?���/UWP������j�9�l��/:�UGm\�����QP��*���`��_��d��*���t�Bdu�R����'2��-�Uj�����U�Vk��1�~�pS�U��%N�_��s:���3or����wwN��^�dh����Er%�^��o���1�!$"ie��B0��1�"cK�2�d����`?�/�Y?G\�-I!*�OM��=�E�[yLc�����X[���RS�&�TP��G��cK�=rG\��$u�rE��bm�}T�����b��L��VVj��������U���3\��7l�Aa������X��iiD����\����t�)�����^��U�,���=1pL\���p�R+�Y5jr�cCja�7��M*����M1�1v���#[EIS^�\5Zc{T��6��d�y���|��ow	D�My�HIl
��D�?��NJ�K<��t9��LF�mn>��V�����Q}P�����h�&N�*R*�T����������ZS�B��`���4��.�Q��r	f�����N�-5j�c0��i1�id��$�D��H��rC����ju	���)Z�T�R8�	c��#,�-]f��R���hc��1�Z�5
���Yi1UY���I-�nP*��$��m�~���i��l�^����Z���f���V~�UF���)�JC@?����SY����v�J�&�����$����4��l��;�j�Ay��4���L�]eP�I}���e�b(�R��f�r�2�A�mk~��X�����uZQt��Als\1RA�T~�v��vV{t�]�W@�U�'bn���Y�+J��Q����R�5���Z����YUn)7d�3�ui6M�G�Y{����0*D����Zs����<�e�tT�5vD���M�`E�wU��W�1imk��M�~��$��^������4
��rT(P��E/K�yg�*�k Z+��MV�]6��oV���+�+�l���{�j�(48���Zi����/��J���V�nR"P��M4'��HL��4�K;��a������������9����$�BY��Ic%0�����2i�4�eQ4�K�	��C���<�9��x��$�ED�if�o7��Yb!4a,�����yI��v�����:��rf�&�|���{*K��XL�%O�X��-�eT���T?e���>ic�?��Q�Qj�iV�
���>�"�m�r'HMK���c������7���M�����no��
&MJ� 26�UT��)�*�\���S��6Z\N�wO{����0�(��u"��Yv�g�L�9�x��(�����P>T�9���||�c��u��
�H��TW$��zaw�5�E-�����pV���$,��7�����Qw�9=u'Uq���d�NI?���*i4C�r�0�f�
M'�8�HM@�W*�����jG�V�����_���8C�	�1I����l�����eI���\���F�I��>Y��\'�����~�K.sL����mV�5�vB�<r�K�i�<�������u���jUK*�::_�m:
������T~��ES�IS�e9�hv�bM��j}C���	[���<�
�$��'�q��L�e�p)�n_�*G�N���-4��T�V���oU��J����6������k�<��s$�=�d�s�.�J��noG\�J���
�������*�IY�U����>,d����D���N7�����p�_��-:6J3U�j�P�e1JU�TS�
�$�����9T�c6�V��4�;�Z� &��8��W
]R�%�\!�_�B����JR��_$��[����zZjrN,��d���*
Y�k�$U���mbV]�u�x�j����EHA_�VZ�G��U�Y��.���0�f�Rjq��]5�R)��4�w�k�Tb4���G��V�ct��9���\��|�)�l��&�\>:i�#/K�%�������yK��$�M���H�D!Oo���
��Ur��j4J���j>-g����K�{pV�T��4�0(������,���P�e�S
���d�O���s\�W���������67�^��zKQ�E��f�����2J��]J��KI���,�����w{_��Tev��1I������Y�2�������J�c�c��.��je�H1"O�5�C:��d����]�J�6�����>���v�)}��#K	����!~��d$�4���{�XBX|Y���I5P�taV�!��[<��?�1�����V��k��xU�D����F�~�R-q��TX�$��Q-����TEuG�T�'T���"["����$�|c$�����R��&��ZDJd���������<��Qm�M�Rb-���?�WM��I�D��l�CO]lKT���j>*ehdJ����p�$���2�%T��4���M��KF��R\�MIg��������W�����.���U���NG�&(��1����65:ix��*V���i����T��S��i�C�N��e�����P��"r|uf[�.��'��T%L������(��4!����������-
5:{�����?����}�E�M;�N��3�7fH�^���%-_\���FV���L�R���=�p~���������fr[v��,��_�l=��' �9o���GM
=0�J��(K�"*��
��;���m6���5���Cn+�)n�L]K@]1���%ms����I����RW��u
��$�����6��Y�xOE-Z�V*�;X�5�mR���.����z����d�Y-���*
�+	�����=.�}V��	6��o�%���w������E�w~
\�=6���������J��d����!�p�
f;��%������!�'$���en;V�
E��Hq��5R��Kz�]
M&e�-��TU?������wiw��^Ui����Q����j�&�s_�)�����fU"Kn��{6�����%+2�^�R�x��B��m�)5j��Ai��6�X�x��"!��MF1�j��c��O�)>;� >�P�z�{>��.��T�!FJ���LZ����n,}�US�KmO-�cWR����F�����^��K�,��_�5�Uj�s��/[�V�eRi�u0�+���Z7:��O����=�d�OKF�&�AJ�U��"z�-C5eS�!���'�Q�����O5�q�$����m���nI�*{!���E�t�n�_��J�}�_������,�J/�m��u�zd��UR�]f4�}�F�M;�W-KMG{�J�+����4�c����ol;D�U<y���-;Z�QQV�d�IJ*k���l���D������i��tzw�:�O>�Q�����LD�H��T��R��%�k��S6qG��I����r#��j���K�b��O�?a�Jt�4�*�z��1���3�����\��i��'/S����������3^�D��,��(<���A�(t�f�S�3�]QF�	�����z�@��(�yk�V���i��N2���Ai���=����3wz�������-�k�4��$�sgl,�,�_����V�\k�e��M�F�\r�-{�-E%!�r�������U�u�ud��Dk�-bZ52���
?��^�X���k�\��y�.WJ����?���k����A4y�A�Q�6�M�I-��y��oB�.�Rk�����S~`��e�=+��k�>�2������9E%������E�\SpW��n8B��so2��\�4������>����_����T���V����J��u���%�������,��������O.�����xzR�:wL�[J����%�I.�L��M���{~%k��V�"�S.��m�_�1����buX�����E��?3q	�QO�i)2��Dc������ ��n{��Jmr��E�}��c�k��?�A^�c��Sz\��&@��g���.��-��x��"F����*kU$)	@��2&��-_���}6��������UQY�2�G�m�����[�����&���^����r������:�l����F�
��[�c(U���������'������NZ�5=))�=&C+�����V*�]X�����0[���82�e��Id���/��O�K���g�N��j�@�*��cB���/j���E�K"�H�*�k�z�)���?��U
�,�B�jJo�%�3L��b��U�D��L�<��y[�����_���<�@V.�n�
�A��k!����x�7Cd}��B�	�i
Q94�9�Pi�IJ�/2��_z�B�����[�Ya,�:)*��Hj�J��n9����E���u�Q���N������(���Nu�^M4�~-��=�t\�����.���!#'_��i��E/�)C�vL9��;�������f�P��Y|l��PY=!�s+PK�w1dF��+vI��L�������Q���ez������S�Q|�v�]n�q&';���-E�.���!�����5�r�hX��T8��n����s��W"����L"����$��<i,�Mt�@�l������U"U7&2[������*e�T�<��:��/0�&��'��R�I$�2�Q~��~jm�Y6��_�AE�qDn��z>;(���>���q6�"�"�����3�m��-P��;�����(IH���Ye�3��Mh�*��Q�A:��qI�r�"���2
���Z�-z�avU%���	K�_��*/��+6���5�E��
+>�QA	��+�?�N\|M��$���yKs���N��j����lZdZ�I%�4�����?�q���s�:���C�P��:��C�P�:���#�H��:���#�H��:���#�H��:��0@�0@�	��S��jHAu$^Z;����S~��m�V2[:�0OB����I/����������[P(�M�J�=&�W�t9�q���K7�\" Y��D��6�`��@@��%J|�Zr���V��B1����	����#:iDT���*�*�p�N��6�h$o�F����U�u)�S�:kb��2Yp�F������OU��y�/}T�����Ec���}��+�V;��w�X����E��KG|���-�Z;��w�h�������Dw��;�Q|j"/mf"M�w���N������1�y/���+�1������.��"���u����W�D]".c�%��`����wP��X�;��"������"1���%�i868�}+������mh���p�#J;����m,Gp��z���f�\zg��f���_�����M~X<f�l���Ib���	-;������/������w�A�����w�A�����w�A�����w�A�����w�A��";� �������;� �������;� �������;� �������;� �������;� )����'�J�S�T���2������3 "9����_���_���_���_���_���_���_���_��������#��D@��r���������W�r��1��3�9��	��G�����<��"s���Y�W�0���!�����y��B��T_�����)�����
22�����%�*�B"*2:"h�L�brq59��3P�I�m��1��z�%��0�=Dy�}���	�Bw�(N��
��0�;��P�rD�������?������>����?������>����?������>����?������>����?������>������/����>����������>���}A�P�����}A�P�����}A�P�j/��_��W�}U�U��_�MU����lH��t%S�T�U���C�@�:��@�:��@�:�#�H��:$��#�H��:$��#�H��%,�GD��(t�,���c�X�:E�c�P�:E�C�P�:E�C�X�:��#�H���$���@����N<�q��,�yd��&Y0����L<�a���,�yd��'Y8����N<�q���HO,b�4c��,�yd��&Y0����L<�a��,�yd��&Y0����L<�a��,�yd��&Y0����)��>Y8����L<�a��,�yd��&Y0����L<�a��,�yd��&Y0����L<�a��	S��?�Wj*��\�4���������^��E@� "��*���Y����]'YLj���s7%D�r�s���<(D�Wi���~Ejs%�����IKc\���e���%�*TkR��	t���e�r�*�Xtd	�UYSm��u�=&{��\/�b�j�o�k���v������(S9Rz�������"mVer����1��[��H(�jz[���,"�l��Xd���#�O���)2Z����|�����(��5��B��$����EIh�1���a4 ��'�]�=��(�_T�����m9a�_�+��SO�|.�&���o[�t������o��9�[A��(��E�����Hzh�Tm�==�{���rLK!.-N���Uv���Q���o�Wm]�����e�a��T���k+te���W����O[���'S�i���!wS)
n��x��iu�u
��M<�"��t)*t[�'VV���U&�SV�����%z���P�	��l�ZDT�v�w����a��2���rFs)T� �_�����}���B�'�����,��H�}���m+�&�LL�)�-�J[\�����bi���s�,2��_V�r�#:z��kk�,7��KjT��:�X�S�cL��I]=}S���(�9t�E$��]R��1�RgZ��-�I��]��b����S�J�d�uq�]�P�V�jV�3�����T��Q_���V���Q���R���N��eJ�cA<�N��U���V�Z��j����i�(Fi�S���-��K*�$��4(U��}��u
�TRYO���#�����eiu��&�]*y�����Z�����������-Bi�T�?"����r���^�B���P@(D!\��Q]G�W����N�����I���0���|�-<�j��i��5t5������z��kuEN��!<�? �bS�r�>�P�M>�R�R����v��\m���Vj�si�����*�#4e��B�]VR��e�Y��w�@���s�.�[r&��2�\�FX�������h�*HKf��T��2����yi���Mv���,O�o�aF��xN�K
�,����UT��{t'�S�GTr��\*�K~���`�I�[|����>'�'�T���0�����vU�#P������%0�a��&��a�R"K�R���|$���0�5�e��@���kF����
�f�|��X�d��3�%�P$��=��d��-L�����+�gV�����ls�H��\��O���m�N�b�Yo��ul�)��UJNtT��yc,&��2d�KH8��(��@�����uw����h�l��'���x�*�	%~�RY5Z����Y�J:Z�muI������fi��FM	��'�$)HS�&FRju,��6c����L�.��Y��Q�,2CT��/Vx���(��\��f*��L�G2���M���L��<�1s�)e�����UV�IXTz��/=a��NHI��P��g��\6�4�UP�&C�f�3&�SHA4�������j��K*J)k���a�����K���<��c��������lK��!�0��_��Fsx\9����-)�>y��l�X��L�Q������1�8����
��2�0�Y�����sO��D��sD����YG<&��W�><'��
�����$!2T���d����1,BI����	�Oi�����1��2��������kUUF�G��f����S��������L����B����6Ya,>F�Lj�e�4�'z��.��UUr����H��M1��5jH"��Z��yQ�3.��P��)�6�<�4��FI
$LR����Y����5144�.�m�
�v�5
X�m�u;��n�"{^�Z�u{"^0��#,$��*nc+�3��8�g��r4:�^�:
]RC �&Rqi�Zu}=<������_�$�Fz	��V��T�J��cH��
�/@��Z	.�A�/�������jT���j��)�N�[�e������m�"N�De�X���$�y��HJ�.�,�I�I���<���H�@��#rU�4��#�
���Y���ZD|���(��8�x
��������&�U]N�p�Thnb�@��B�`���Sr����iHa�S�:*|z��U�\&�^t��og�.[����E��9.�"����2�j��E\�_�><��#hI[����)7"����������	����k�r��e<#,�2�2�$DQp]?,�9Bd��0����UM!}BS&��a����K)������A%�s���de�!�#)�K-(�Q����D�e�)�D)�d��V�E�i�p���,y��9ER���b��EI��TA2�ii��NV�/�L�H#L�<�I��SH�"���4��&XU$�X�'�����I��)9By��!X|ya	��$���9^�%buS9J"U���9����<|fa�����e�3�������U��S��T"�8�yL�S�5<�X/!�	&ne�J��N��I<�(��"L�8�y��uN�I�	E7Q��D�B���Z%I���#9GTyS��'�@��*kv�O���\M�<�X/!�1�p��h�(����	*���&�������9)�Nd���4$�T�WZ\Dn2�����������(1F��OP�.UU��VN�-C���G������
��hi�r&4��%��2���j����$����N��
RO�\g��&:ZmYI�/��G�m��$����|s�I����a��W!�����)�	�U�BD�Mr<j�"��8��"J��Y�V'������J����
Ft)��N�Zc"TM���?��(JgIF�e�VGa�)��y�:B��r|�4�&�jOk\sA\����&4�H��%�-R#�.j��O��d0���	�u^8��L�Hb���W���e5d�nJTb��d E�U�*+��-q&+.�\��T�r�B&~����><�����8�E���4���?�&S
��**c5�\�
���������=���U!7:J��	(m���&�u��'���R<��e���'�]	J���b�������7��O�"S d�@�L���R2Fz)�����8�r�K-u"�(+���SO$���t%�F<f��EA'����H��/��9���/�0���I���$� ��L���J3��'������L��H��E-ta>:Xa�O�J�DB�$��|�,��n�c�H�4�i��T�q�"�i�f���y�Nd���:e��LS9�!A����r!f�t�3�/�e�Q�t�O�2��K�V��Vl�Sf4���<������3&T���n%�b��r��Q2E]"Jz��H������z��������$'�+-&9�����uU�"��,��'��S�8��,��+��,���Q2�y��Z�H%��������d� ������Q)�-���/�y[z�M>�S��<AR�i*J������gEf��x�1J|��	&��)4���4���mb��e�������AT#O�#��N2sf������Lb��%'Rn[�)�G\�i����m�yOKOD�%N�M�S]-t��B3C�~9�N�-B`�e(����2�,���l�J�.�RZ=�jR�$'��x�8l��IS�����E����p�kMo����Fh�RA�3�c,��_�)p�����z.��U�T==�Y� ����[=R��=2�%��������V>D��9U������X�rj�J���e$���7�"(��D�t�
T��i�e1j�}(���T�->�Q��Q���������7������v&Q)�n�]K>�]���i	�"5���J�K��d��>r�=:��jWB	J��.J�Q���������
�OC?��0��
M�(�L��X�	�I�����IP!\��2I�-!���<��J�iu�2i����Lz��N�� 0��Q���T�*(Jq4X���Ju��UJ��	J�S�"��
>�*SN�B�2��n�7Z�bH-	N�&�I��J��9*�#Q�%�)Q/H����|~_�	���JQ���IM@�(AR�����g��S�U��%2�O,�H|r��YY�z�!!��UR�����)i�dOQ��P\�s��'N�)��>B��R-�i��yQ�U)JNZ�R�(���l
"if�2�	e��f���������2-�UF�B�����d!�d#$8I,f��!�u��^ME)5)�f���:�D���*BE2�����<��o�iP)d��-8B��z�'l�h!L�!������g��UY�*�<�0�NO�I?U���i}���ZrB���6�$*��q�_F�\o�\.{d��P�M�����)i�M�QO���u�����$�i+�`��>�i�X�V��U�xCI�+$�ql�*N����,�UU�`a���i�1zc:u�����0��$��H:'��3�j���Aa�8�d�1|�%�����z��%'����E9+�����uo�X45>e}@��x����c�1��M4$��!"�*Xv���z�h��I=^�zK���}-A�*��3�Z�K�=;�
l��C^$�Z]������s���FAT�t���Y��6�oI
u)p(��P.C�(��J�%*J�iL�U��R��Z�+K����Bi�m9<���&����)�*��4	����P�'^y��^Z�	L���2��0��\�@��<�M !d*��'L�<�,�)h�c�$�u_��$y�)U:�	*RK�d�$=R���mI�k�h���P��+���Q&�!Fx��g@��x�I��=EBH��W��*��&��gLO7<�4��Zi��g6c��/���&'(��I���U�����A?��<��rS�0�Fx��a�BU&F�YO�"U2����|��'�4��u��>p�	�U�J�T�NJK����s����"�������
�2	���c<U*��O�?������T��=:D��L����%����7�U�VEH�g�]<����'.�0�<y��g��X���ij�@�cR��W��r�?�6Z���(��2)c:�9\�'�|��M	*�r����_�0�������+���y�2��UE������T,�O/�V�!$�Q0�V���/�T�	'�l�����j:�y%:eSH�Q�i���9��9�J	�iR��Q\�M_,�y���3��L>hHb�0�$�����6%F%�<����Y!��r��1Js��yM�D����	uJ%Q��hBx�YeSXQ��y��5"`[M_����a%�����U�RR�je�T�� ��u�zU7�O���2���)�)�G�]�n��h�\����r��-�@��4d��d8O��W�E�4�e�����$���e,�}���<�TS�%.���O'No��U��bd����2�U��a��)��������c,��5)������a��^����Y��Re�(��Z�Z��4`�(D|f�F�]�J&Yj����7�"��Va�B$��d�M���S�-�lO���K^���v�`��.IFL���SxP�J���hM7�kH�WN�*���(�#SyU���Sz���YQ��EO�I�*&���0�t��DW��T�����,[	��U����3���9<��R
���,���SQiSA
�z$�S�2ca��O$��#��,�'*���a�&�����	�.�����zI�!�:�Pd�
A�P���"KCI5�������Y���J���n����6�"[uGN|x�,���\��OMdb�,�B�D���-��NGO/�����R�e�Pr�Y���4�K,c?UF�
O55���,���6����e9J�y�:b�[�.R���NYeNL�:u�%�Q��6e3�l�K)e@%��m�
T
+�_����e$��)j'5d�����yS%�r"d��I����(0��	><����L��4�y�!)��T��g@��1�Q��4c4|11�if���u&����08���.N������#<���������2�0�	����TE����:�����	D��!��_4:Bb
�p>3C�	$��W1���3sG�<����?�.O�,���yD������sf�M4f��������s��1r�WVq<bd T��MA����D�������1��c	y|��sD
63�1������7��8�G��C�C�B�Q��!F<D�����$,���0�L*_��Qp(�a	G<D�Bq,��_�	�s�u"%��i������p��0_�������$��X��:���c�XB������E��7��Z��	�4�+��^��>�}yr+:�����&KAs���c2��k���W���p���o\r���G����@J�E"�$�+���[�����F�Odh��F�Odh��EF8���z�z����j2�����8��>�;��.��\T��\�EQRh�6�%��U�WKmI�1d�H�*�2�J�S<��Qj(���]�5d��t��a����h
��O�$�a��M����<�%�y&�"�yg��������4-���9
52�'�g 8@p�����UN������@��t���v����g����*�b���t�	H9h�*��H �Jb�U!R:jb�yU]p��C���t�R�S�����4��3��B����V-������^��������DF�L��s8�z�zu
��n��������o����1��!	K�pa�����4a$GJ��j�!r���������Ya$�<�F75�a^-Y�.��LB2<XJ%�%�]D}.�>�QK�����Lq�W�W��X���Sb�)����(UN2��
��{z�gI~�������s2K�u ��������^4e
ny*��s���*������C�m�[D;��	��;]�u\q�����P�]�Z%G���I.��FNC��X[u;�������w2LOk�-�!�����Ah��[����/;�)-o��h�1���U����6���4�!I�S8���@�z��H.D��Vz��LE=EN1������i�����<���X�5Vyh��2B�0�S!R�-^��!F�4��y'�O*C����js��2XF@�M>i,��	�2D��!��\�$|�#�<�#�<�"�<�+w����\H�=Y%*�]L����u�m�bVN*��2�t�Z�o��#oe%UW����+��o#�(�W*���MC=��uN�qW�IJo����,��!J���������{sq�P��4�L_fR����9J�~�����u�����|i)
���Wk	�&�1�>b�&kj5���X�%:�"U,M�lZ�s��I��'��>�p�(�T��TeT�C��Se��g���x��Q�����=���g����:�-.��S$�����{��@����-�h�Em���u���0��EJ�U[�I���MmB�T�m�7Kww+�%�V�pe���T��1H��A-!Ec�����B��Q���R���,U�J�v�,y��{|�q������r�V�b`��1��P�L��nF,JA����F'��R�.*id�A�<!J'0�!$����
:1S�,��12O9q.&2I!r�<�	�.y��Ic?�$�JO9�����d��Q��O/��1��!����4S�t�#�
�+��2��;L�-��.�n��ze,�*i�:����+��OOJ�~���z8��!�W/R���]��q7�H4����):i|`�IhQ0T����]yW���-�ze���5}J��u������HA:�0�;��}�h-	,v��k�1��+g�O:���qi��/�.�&�o<ym��:���Y���'�����%��������J�H�6���PM�|��
���3�U	�R��9�S�fH������r�h���j���^?���4�����J�k,gm�W�������|s���5�����F���TR��%q\�2�<c�����;F\�k��.t��H��W�l�������=�I�a������[<��%�,���l�+:��<�O��n�?�	%�������75�W+9%{q^~9�����oh��$~�DJ���1H��1B[��N��Z��K�R�c<cz��jb�fuA��?�9Ap�T���R�v��� �U���]V�jb����*6Z=#��zKz���m�P���9���<��bK;��~���'��v���o*+�U�����2����R�_/L_
�O>W��Sy�����u�-�UJ��X.�u�2R�������I:��\�����"Di}=w���?�^u3�OE���k����W�z}�m\u��-s�M�!���x��WMA�c],������V�xU*R���W,&����To������l�e
�j+a����l���E��; ��Z����J��
�<G����K��Wy]>9�a,)q��D�f9�2����K���L�����%Z����_�-C����]^������,�*���TC`�x������,c���X��
R}���5��c������U\V���F���-��Z�S���Z��g���`��L����w���b���@��z/���B8�������Q���{D�q���Ai4���E�}�[^�_uW����n���z�����mD+5���2��<u�7��!��
�l/���P��5f���T��]�w�Q,�Kc�>:��k"��%��h�.���
Z�s�M_�D���^���2�����t�]Y�f0Z���?$�Nd��S�O<�O�&r�[�Y�b���'8��F1�M
P_R�yf&FQ��_�2N����P�)�T��M�k��x%.-���)�H��I�����-�����E�X�x�j��#�6�{�������x|hF0������
J��RSRqm�b��9����U�C��)T�����SH�7�S$BeB���]��k����F�]�Sd��|T��
�L-+�)<�j�1FLI��&�
����Vr�bdS�x�"�����#f�d���������W]�����*Fj�V�<�9u��������7�Ye�_���W�w^E��H3�N�WL����g#h:�EMZ�����"��1v�8�?�!��L��i+=r��4cB���x������x�'+�j��I��{�b��_�s��F��?d��z[~��K	=�g�u��%s�F)E�0��}�OZ��PC��1�[����w����[���7�'�������=YsY�����Z�p�E�����51F�m:��J�����|���D����X�%��
������O����r��J���V��]����Ag���S�GP[�����KQ-eY���!(x���m�r9��g�B���:�Kr����u���GJD�7�����S�N�a4�X:�Iz�.�����<w��A�P[�\�6��6�[�x�+����e�EJ�*���9x�i�,-��["?	$���XVny�2�9�HIx�a�q�|o������p6�M>�M[?�$�d���a���7����o���:�o?v�S�w��)qo/�C�\6�@�m�q�#�?&D
���Z�u��f��1GL_FBrB|F����b4��D(��u���TD����	e��~'�a0�$_|��k�[����R���N�zr����[z�e��E�Q�+���<�Oz������U8�"���z��Z�/����������3�i�������YMu�]�c��]��{S��X������#,'��"��j����ZVj�R&)_YZ����K�b�����gg"���#�$�3�T��G���t	�x�SJ�Q����:�T*6'[��c+=r���YVe������40��/���p�~^+4��*��Rw�HM����E�s�J�@��duH����SS��i(\��XC"�F1�~V���?�L��$��?a���P���]�e�*�kUO�TJ$��#�Lc���,+�u�v|���NQ��l��-/D��}���x�_���"���H���M�/g�e7���Q�������������y��I�I��\���T��������0�!8�+���\��w5������
,��+GOH�6�:���C�t�MQ2�*�>X���B�P��b?I�c(�H�w���64hH����W=������v����w�/���N���d�h��|k�y��U�r|z����syN���.S�O�)Iz���$�.z���X.J�������$�I���%��o7F��^�w�C���������X�t��r��I<?�U�Ue��
T��l���d�j�&"1�b�����UU�+�,��0�e ��}�RR��q����8&��93Ih(��:�~[����zsJO#VA����-�z�q���������9��u�~)Rt�
�)	ye��c����|{�K�|����W�2�4��,��/����6�q�-��]��V�66/�U��U�Q��#�����*y��,��_�}�U��M�A�������=��L�mK��_t�~B�W1�$�EAR�S4�O7�LK�'� ����/[�}�~_�<�����w����|dM��B��T_Y?�I�(�F�MW\������qEy�K����-
w��������Y�v8�1�|y�7��ZE,c������V_IO�������H�	����JH��!�����V�6j�&u
d�H���}d���{t_^<�hK.%7d�\>N9���u��N������$�e]4������O;��%���BEG�R�1K�V$������(H�����q���+l�i�g��V�<+�oA����z�MmY(q?>R�W:_�
�J,�����SEQ��!���$*7}�J����R�L����a+�]�ce�z���)��"�so�)��QIW|��,���
j���V�
�m�i(X��m�v���M\���U��/�6H\aG� M����MJ��UW����N��6&d��T�z�� ����*d]�l�V�V�*�m�\:i��>3�id����O-C�d�
��������w�.8fL�p��6�m`��42I=%=O$U��~^5���A�3P/���HY�D�R�Tb�
F��y�U�FI
T�}�=#�B�b"z`N�a��jg����W��%p�_���9��l|fa���D���Q�+�Jk�\r��BYe�|z��5�����r�m�P�=Lk.-�_���������	c4K�+4ES�!K�0�&�"�����RX���qB����lV��C��Y������kn��qT(?�����a4?I��I�:F�A9�J�#�-����\<��� �}=x�z������������M����G�j#������6�����UL}.�>�RK��i5I�Ino������Pz�qUB1[e���c_�jBT�G��_��B�U����U�>?�/"e	��U)!bB�.��$���Y��_��4�B�<�aF"�""�L��(�:1�E�	����Z��K^�0d]��[���+X��	Y���J���FV5��H���#��A��+^y/�s�cS�k��kO;�_��V*��1�E�������ie��(��b�@y�1� <����b�<�c�<�c�<�c� ���S�:�y��S@B�H�}n��0�l�a%���n���C ��f�8��)�d%�GI��2;,4�G���2=,�����c#��r�d>��[# ��P\!����R[RB`�H��Ip�dW��s.��32\�6c��l�uf�'�1�3��X�H�1�.mc��X���;��9��~��2k3"��������J%�W��3Y���5��3M��&j�|u��M-S%]���w:��Let��
�!�@}b�X���� >����@}b�X���� >����@}b�X���� >����@}b�X���� >����@}b�X���� >����@B��1���:^iH��e��-�u���u�*�c���X��qV8�U�*�c���X��qV8�U�*�UP��Q�2��X�)���U"'*�:�G]h�����\<����6�AZ��V	V+�yP����%������B��J>��F��0���-qT�[�Ib���Z�(����WD���_ ���I	{��#�w�k���AQ�T:��r����'���,�DM�o,Dr=�dk�>D��d+�6Ad�w��0�=
�WU���	���a�V�a*���9����9����9����9����9����9����9���UJ��U�R�:�a��z���z���z���z���z���z���z���z����z�����\s�� eZ��r�$� .����sL9��i�4��a�0��sL9��1��b8�q���#�INA�(t�"�H��(t�"�H��,t�2�L��,t�2�L��,t�,��c�X��r�9e��YG,��Q�(��r�9e 8@p���� 8@p�r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YD!G�k}"K�{B�u
�� 2��>R���\TE�Z�t�I�������P�|�-D�j&�+�OB}u%���j�8�rR.G�%��R&V�J�k��"�����W(��4�%4��5�!�{"=U����"Q�k���}J��fJ
���W�J}�w|���n�!��z'�'%W����;uM�����!���U`z:���L}�C�Oi���[5?�r!4����W�J�b���E��+d�$�!QN�O��=B�/�-�H\��By~E��24K�P�e��B�\���z�4d��F�����-%G�B�p����RP���BJ�[D�E^��D�z��}b����;<i�}bz��(w\`��^T�����i"�%a]Fj���R�k(�+-�T���T���������P�K1j5���y)�'O�$�W��)S���:������Q�$�Y|�]>��������-�J�N��%OFE12���7���MT��J4���&h�T�
<���$<�*j�!x���b�X��	�S$����NL��Z�\�(���V�O�l�R��YS�[�:�W�/	RW�s��!B4���I$�����JP��H�E7J5u4�y&���	�aB#sJ�����IG$CN:�|=Hq�|��S���B�29-2e��'�����[�����S-��R���3R����|z�i��!�HRD�*%�Va&�\Zd�[J�uD��B�"z_���TII��=�$�J��M�Q�%���*�b�&J��O���HYY�@��(�-QmM"e�V������n��E:tf�r�.�(M!R,�����y��B!Fd�+1A��x�2��3K�He�i3\E�J����,�	�*\�Z��NMj����tzjO.����JN�(Lj�|p��E4�j��B��]2�I���u��3�a���\�JTj���������y�B�M��[����S�Y��#�@]����w:��i��U�,��������I�-�R��G|�k��8���0�P��"6D�%��A��{�t�I"�K9?"O�e���BJ�u���)UD�e%,�����g�4��������|lV]S�%��ifAR�h��R�*���bI:w*��r��G�XiPFd��I����IL�Of�8�J��bE�H��ST�o�T�YTT"A���}Hd�kO%�M��58�eJ����KK%�*SH����';�}B�&x�M\�������K���)tT��QJ��P\�� �H+	*g�^�X��=4�����Z��P�V:5z��&VRr%LO��I�S9����*FTs�$���P�s��yp6�Tc<�
�$�T�T&����a4��N�����RCmy
�f����M,
5D����y2�9*��4�9R�$��U�UU���C�G�FI*�#$$����4U/�5J#�]TO�E3��<�'(�E<���Y�O1����`��Q��t�0T��a��?��(ICg�	��0�r�Ly��>��%����H�8G�3����8�7BH�i1����a��B��4��Y���'�c7���9A��8�Ht���dL�V�n�d��+�c,��@y�$.&@�"Y�G��C��?��\���*����Us�J|VQ)���v���B��d"�&�����5����R&�)��!W1�R(�BJ:�'��c���Qqu)V��$KB�eB�U<�kSL��N2&T6	fO�'�1����4���T�	�����.G"�H[^�D����Cl�SF�n@�9�2cK��I,��B�Q��p��*����IEP����=�0����Zj� ��O48	c�s#$���Q*D>��U&#�t�J�j�::����17���+Dy��T�T��|��)i��A9��]��]kfi�2�M��C�|�����Y�����S��c=�a��������!4��?�m�|�����:	V�d-!Bi�^5"��^db��Xxo��k�O8��L��z�+�����V*
X����-I�����Y��!,xd�,.&�B��-������d�j�C9���J������Na�N$�/�3��w�,�UQ�S�(	�L�a�m�FJe�n��nTe����������F���i��$��G�$�����\/�|���T�L�|��a��T&4�u���|���a��*����T��%V�<��[�z��N�&,���)c���R�0���OI2���i����,�/@Z��J�J��3G������t����!iQK7 �Jr�(����\�M�x�C�><e�1P\�p��i���b:y?O>��5a54�)'*H�e��_�O1G��M�X����Q�<�tf�5�������(��"���y���Y	�(�:`����<��(�:`�����M0���3�OP"~�#�d�J������7�xs�M ��B��p����y����O�u��R����VH�����N�Y�!�����1�|����<�Q@���	�cM���-US�4e��YM�S�&QnR�����hS\�c]	o�m���4��(�!4�C�s~�P�!L�5FS�&�,����[JW�Mi|	�I�U����i�.�3G�V�4���O
��'��G�g����Rs)���%���r��y��%�K��������]���%��ER@�&�3��
��X��\*�m\�+U'R��HH���e������?���LO	��M@�<� �%�/����X�e��M�P#��<�#�iS����WL��}J����L|��t�6����r_����TQ0������RK��U%�V�N-L#%51=ZB<�%�����?�,�
�I�Z�����!T�*������ �~X�_�T���6r�G1r+���P���)������h�q�I$����������5!r�b@���@��&%��'^���!�AD�#��#������"|����$����x�)j��L��i�4��,�@�1P�,�ug2	��p��>ur$�hg,��*YL��~<g��Yc0�O"�H�2$$�#�J�
X��RK&��x���Bha�FZR�)k�������T�O6
0�c�)R��zNZ*#c:ix��r�v\�g�]���Y|"L������!��B��X���i�D����De(��N����
_�����q<�#)2����2��0��R�
�e���X�KVT����$	���S��?�&�X�SLJ�#�����!�H���	e�����Fb������'*%�]]
q��aknj�
��f�x�\d�
�H����j��*�����ND�D�:`������"����R�24��)	_[�b��S�Y��RX�o�|~���s�QVR�}6�|����ju���T�X���T��ZU�MGR�
��R���|r��&�&��D��	$��"����1I�C����P�-4�0���
���U���"��7(�.K�E�T�N��Y��2��x���h�H�r���*&�L�U��]���5M/��UUQW�����/���VQ�
�U:��J�^�f��74�.�4�&Tjue*��NL�M�9L����)hW-A}IW�8�z3�&*�^HG���7�	4��O,��(O��KnO#�J.�9Ry	^y�~�KY~<#f2X�AeH��r�,�T~����M"�Qj��D�J���&),�[���'���&��I),��������]XFT��S���y�<�[�I����_H��,�z�M,K'�EJ�!k��'�b��c&���$�����������b���4J:Y�i�Q�&	��~�	NgVs$���x��=���i�� j�%2�iDgEM*	\x!��(8�O,e���<����������.���`�L�"�!)�J�K<�K�bO/F3�K����HS�ND�������U�&U,�����D��D!4M�i"ij
�I)�O��Y�Lyq� !�><SB'sM�E��'��iQ$��A�s�)���H�Y�L�I-���)��]���-B���s�+XO@����T���9��AT�)a)�3��O���2�Z�*y.���H����5$�"k�D[��IqE_[/"��Ip5R���+%8�m%D���T���M5H�1��7��B������f��S� ���%T��S[������)���=��N)\g:0��D�����E&Ut���o
K�YQ3�\�D�Q�;����7�q�r�*I6[���WY�*�X%KO��By�0T����Sc,���+���%���S�*Z����"�N���j�M���=
Y|�&����s����.g��	���i�R��C�]�I6�T�=Mr
���t�ZrP���]]<gU���D��N��x��
" T��mJ�<(��$%k�~j��a�5G�e22���j�KY!aB(���N�d$HU19|�c'Vbu��M-E���K��U��P��$��y+-����e4"B���TO=\��N�2i�i�g��4<�����#��G�AH�R���<mS����~y�"�I�2Y�<����Zh������K��#:2�'��RO���Vys�\'6�9=R��/]��U��>Fi?�-ON
)1'�Jzl��ro�)������NC�;�!3���.�e�����g�:��+���UD
�TI9s�H$/�����9��Z9��u=%KLa�	�I*x�^Y�fO�4��1DI*i���eJ����\	�2i�eVa�����Y��\���s���H�|�9�Zq�5H������0$�e6*
2�y
+�K4�H�x�	xF��9���d�Pz8QsC�9'M$���2y�*XaIa!p���8�,��s&F�����_POP>iIVA�K!��/���L���)����2�|J$�������b*��LI��5)��hR�:�	>-62�la�?�&�j�� $�������g:��u
�(����y�Ii�������P.���T$���� ���H��0��7V���T�UM���s8M"��&����7uy�Ge\rZ�f�g�3��u/���(���������_1Ka\�
CDU9h�\p�+�RK,�"S<kuNb�K?<���L������*�*z=Do����Oo�!�SI1+�o�J���$9"[vr�(hr�%/���"R�(��L�XK�C\>dUO���������.S��.�\lU�(�NR>��]��4�'�7�3�jwq��7��'�/U-6�q�QLy)��2�4�KB�4��D�t�cG<�u��!s�&���iS'�����R��t�,��)��jK����U*���$)	�r���)�>���������e�rS)�S�<��t�5B
]k�<��D�����4������"j���������J������������3E7�e&I�_$gLqe�KM��Kv&�����4�g&����zYR�
N\��	���*RJ��2i`��(G�M-5*zm]Q\�U!1z��Vt��j��TQ�L��2������'�x��������In}T��IpS�j�����\�&��RNU$%��<�I�`l��<��w�����I���4�@���2@�5����C`|�3�@�3Ai5�N�9&LY��B�8I?P�I�M4a�~#�ly�M7����"��:�q<�x�,�t����	���RdM	&��q�a/r����Ybj����*
��7�B��I4��,�_�<��Yy%����������BN1Dg6T���<��Yy%��&�O�'L���d�Bs#$#	&�rs�qJ��,i0(�I/��\&�J�ig�Cc,#	K�����I0�HI,f�D!�#a�\����G����/��h����x������9�#1���0��4�����#3s��#?!8��$!$L�&K!p.I�&������?����nW�R�w����p,1K�Q�d�M��h���C��9"�|Ewe���T���!�**�>"�I�'��V�eG����"~�Xa=�e+Q�������_��������=����g�>��=����e�o]��C+��}�?�o��[J�6|���v��U�0a�K�o����F�;����������i�A�����Z[�{���8��f ��l=����h�K���������[�a��c��ZG}n��w�����<@�����>G���������������/������g6���)��������_����oo7�����V����V���u>�q����
��jf�>�[��c����d���.�r�������L6�q��m��wn6��<U3�w��c'�_���7��L��"�{\���qO}����]��	�t��1��C4�O��������o��Xc�`fY{��q�o,V������m;��P�/����M�}�;L�;o�C���������o�iv���g=����x0�l�md�m��p����'�'���{o�lnvO�;YtG?���#O�~�y��~�|�G	�rfNWa�;|f����7�b~~��"{���W�k-��|���jk����M��'�wqk+t�'�Y_����������[d
�7C�
�����i�_��[�Y{K�����d�4{!�����v~��R)�]���u��7���L��{l����sP{�w	��-��G$7��F���m��y�d��_��G�#:2�8*[{�P�����0-���E6����Y�~�M��9"�{�=�o��5��X���'�v����7~�7��j�q���+���Wg��=�o�����u�Y�=�^�wm��O����3�g�)��~��o2����\��s-�0�{}�]��v&��z�G�_z������d�7��v�g��x����b�������e�p����+����?������T�B�|�_Gj�"������r�n���P�c�����R�,��'|�g�����x������C�e��dg�%�^�������pl���}���t�{3��#��eZ�M���4V:{���ZY'����E<��}�j�(�����������f7��E�����f�+��������������G�#e�i�at��t�.}�o��y:����} ��=�)��H����9���m�ev*�����.C�>��~���{�����<r��m����s�������7���]��
=��Y���'yOq������MI�`�nb��������w�7����|���M�����>�o�e�v����'����z�t��rvH�)��v��������2{O3[l�a���{���o��q��{+��w����������7w�S�{T{U(�������~���Fv��_��[m���J/�*��?v����)�m��ST�F���/����e-f�j��R��r�_�������O�}��7q+h�u���=�-�R�o��&�~{M�~�^������+njH��k,�U��?�s�������O������f������,��K -�j������>�U��u�L�6��U����6��0��u�jkF���m���n�#���Fa8m�������g�DXC��������i��]�*���
����[�Y{S����
�t��J�R	�o��3���^l���7�n1�y��[��X����_��)� �}���!��P��`�v����GI��{/��u5��}���^�����n������>7y�#:vy�����G;�����=���X{���=�� �$����f������'[��v������ID#�����^oK������i�o��3kO���������Xn������^��%��S�u��d�lF�jnY�����?�M�cv;4���{���'�!����7����,����'���������4�u�Y��[k���V��^������������$=����o��������=���gg*��XaF������+{�?��K�!�o�e�g����n�3�+���uK4���>�Gb�d��C������peM�+�3P2��;��p�{o6����������T��+4���3���Ky����sO���3$�r�x�<v��
������l��q��60�.�i1����Q�fvA2���k���V��^������E��P������e&?f'��s���q�d�3l�znw��4{�-�fr��G�sj�{h�oC�n�"����a1`N'��5����������k�w-��
�ph�����]��S�=�_���_������s���BrF;�[x�Q`{�v����1r�7�����om�[j6���j�3��������S�������,�K�������^��c�'���a%�'�c���Z>�}����1� �%��wq��m��_w�������7y�op�Z�T���?���Hn���������I���/5��������y�\mdr��	����$�����[�Y{S���<{K�������FX#=��2���l������@��`�n	�~{_���{��p��b�ID#������������y���V7��Cc�>t�v���l�Lg��L���N�{o�F�M�Ye�XM��d���.r����]����TYq��h����������������1�m�7��C�����&'`�/��������a6"y���LJZ�K>�0�?�z`�����c����x��h�B`�����i-����Ye�Q��W����M-��V�����7N�����.�	�a�<�8�d-����e�q�&��5�c��q�6����2m;l\4�u>����m��$�S��&��F�{�5����x���z`�R��N�d>��Y	�l��_��6
��h��^��T��dm�a� d�a4�7e�j�������*�d��-��T�C���h7��M��d��^=0Y)j�,�H����d-����e/@�����L@�j�����oz�/$l��h������&�v����q�&��w,�G1��a���%-V��i{[�~�e��~�r{���a������A�t��&��v����d~G'������g���%�F���o�m,c�=�Z-��leg��;��NP�M������^���mm����������|)���[]n
mn{�_�p}���O��������O�����U_�-n��B6�MY�|Z�k�1�������~c��W0c��/���?�����Y{K���]��Sv7�����[�o.Y��
�Z��+{{c.���'��2���@h���m����{�?��q[w�����H��^%b;��N�hL��Cl���e�����3q`��.�1�m���{��4<.�����h-��=�0�k_�5�'�^@cC���_���mv��r��������6�+qJ�X��W��)Z}�w5��� ?c���B��vE���������m�i�j��]�vN���D+��5�������e�_�?���[���w���M�>���8x������g{](u+gs/qw���~�]�m3�Nn��mr���VK��2�Nn������PA���-����p���l}����O]�J3[Z���v��#�?ug���f��n�����/��H���������d��U�N����-���6����x�����{���p6����7l�8<O���)����vm5�j��2mm���**������{XI�"Xo�}��q�f|��r
�����������U�wi����j+�6�����m��7�lf���s,���c��x�����qd����f�Y�vab��1�!��]��r�W�,���{���;n�,A���{On|�n���5h��-7��p����n���K��7��X��������K��������:i~�J�������4}�k��F0��a���~h��k���l���k?��)���F<�1�Q�:�y�P
�
m6��|��"������p�V��xN����W~�d]7k�k����x���q�����mm�1*��wM�wY������Ugl���������j��.�X����7vV�$��61���<��N,b�����XI��?�YOCP��V���sa�p����Lv�y1����j7�
������L����.���dv�nu���9����_9��D���0��]xw�	�4��N5
������Xg��d_�*�o��\�5Sc�NNpS��slm��9u����
�,i�=-�!�r��s�E���nK�3����+={+�
N���Me���������U�����|�$4�\���6��fwb�OC�������*�M��|Ye���rH9$�I!��{2����yc�(��1=�����F-~\6�j��}�,�����I^z�	��u�_�/�iw���3oH���Km��6���2O�����V�e
������g�&v������0��5��"3�#Sl���N�����l������o*M>�i9vukm�m"
�l��cw&*L�\m7�"���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE��6C�!���\�-��f�����M�Wo5�YE�~/��XV�W^�p��a����/����;�������/����;�������/����;�������/����;�������/����;�������/����"����~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����[5
�Z��1�!��*�S�)���#	�49��!,*5Jm!=*��k�D�K,$2C %���U�=f�N�),�b3y7�G�mk�x�,_��G�=<���&U�30wMy�L-�7����i�j{�d�����TY������1�;Lz����(j���)�{�a��q�ro�u������+���G�w����ed[}�����o���;�l�������m����fM�Y�-��_��,�{��P���~pT��r�;���1��+%?�_�����^|�.O=���9���:��:��:��3���4����]���$�^����N�i9�>}��������U��x���y��+����+��bd;�b��
t�w�__��m�r��0*0�����-+�w|+�R���|��]�b-��>W%?�_��������l��4����v.0��%��&!�]a�;0��,jd-�)�k,&��p���S)�=.��o�������[
�����pC��}1�m��M��-������u~����Qx�y��[s"Y{��X�7t���9.���[�ic;�\�a*V���2��?�%tl5�o�z_��{HI{��hw#�aZ2CK�����2�����]u�fU$�Y�����u~�����u{�����}�;�a���c����a@B���(�+M�c�z��g[u��������Ky�m@9[�[6Y����������������{�������j-��5��F�Yk�K��a>����;����#�uw&o|��s�r�zo
lZ���-c^U��2a���79�_ +VtwfW�4���`�w�I[a�[�>�l<��2����I��S��W��n��:���9�h�>�d��/_�x[.�=��|�ws�����c��w2�NN�u����D5�S���T~+�]�]��B.����4"���`�t�-�gn6����"��dN�9Ckn��c�W�p�Eg�<Bo��y0cK.���;�7�k��8����`X������>����^5�=��b>�Co[��Ah�n������v
��{����i��wKn���t�-���pPm���k������z�3,P�b�Oc8R���w��E>�k�c�����6~�-{'L��������Oi����"��hO/�����4������~4�s��;h��6��hRg+:y�Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y� Vt��u��u��u��g'�I�|��{�?���i���)(������V��N���i��4����Si��S)�2�$��/�����u�H!-�h!U+{a���E(��id�=:uEoPHE%
�Z4jJ�(l�6��iK99

��F-�zI��Q�*�!���b���c����m*l���u���V�	=EA�9�$���Q��K���$��_������cB�_Y���aB�\���x$�[Y��)����=���3���cF.���U<Y�c%?�^5���U�McS^�n�������7|��9�]�I��/�n���e��k��)����cB�,����e�I���Ho�,����T�d������_���������r29�B:�f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y��fb5�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,����)G���v���bj%��+6i�Y�|��|>�O�l��ux�7�7c������*�N�;������a�_��������fQ����E�g�~GGY��O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����07��5�6(����/�����F�Yd���_t&�������'A��J�a��U
����3�+�#8�1������5����/o�G���1���d�R��
��W�{��|����B��g��Y`��j;�^��m��e_*L��\�~�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�fN2-f��;�_�q��y��7�J|����Q��-��><c��lE^������t�jBE�Q�
d����{�_�w���]�C��{��7��Ld�Oo�G���\��z5��
�n�Z�O�W��k��aZ;j��|�}($(�7r�$��>��Q���SIE����Vl�;�%���P��y��5�� ,��C?w'�l���tK�*�;������[����m�F�V���zmu�j��~��Q��w����k<o�5b�x��4���3�Z����n7���b{�~.J:�b�bzr<ZFvi��(?>72NA)H�oo�G���6l��l�� ����S	�O�i�����p�1On�s������;���Y�g��F�wm����kS������X�:�FM�����]t��oFK�cS�l�p�}��u?�~�cm��w�����\m6�������pd3��9�������������c	`��v�9��~og�.���M��o�G������r������2��nu�sk�F��{�X��F��������Ti�E���vW.o��22���<�����t���n���iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�Fh[��{�F%N)���]v�M��.��&�[�:��L�/�{�?�RB4��������j�b�F'��W����v���k7���3�X��)����_�f^y�+WS��i�4�2��9�}��e����L�d6����h��e�m^�&�(�W��FK�8���:������b�����������9�'����l{���/��O�W����������h1�h����V>
x��4Gb��u��}�s$��j���a�Gz78d��n��,����{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{oY.Pg�rx)���=��`��;��=�;���)F��W=��Z��Y����O~N��=�n,&�?��������}y���r*�������������"�������{�?9���o�\�j�#���'��al�Z���v������C�������O�W�����YX4������]����o�G���Z���bL�r���%�LVj�����o�mJ��Yf2�/�y�J�9��5��f�m�����s��rS�����]��l��4�S1������{�?�<�Ic������!���X%�&'l�VS��W�����U�'��U
Zu6��L��<�k�7.�������WRv.������4�y���&i0�IG�L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0_W��P�2��K�%H_�����4�y���&i0�I���Q��?r	&4b���������R���S��B����Ye�_�/��FA������T�Q\|1��}�<O����a�a�M����2�����m�CDm��t4F�
�cDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
��K3���dh������h���#n�����6�h��#n�|)o(H�D�~��Q��v����Yql[��N����de������m��F�{����5����n��p/t'���������������(�}��E����Qv\t�B��B��d�Q~W���Y6�m���gW��M�v���-�K -�����|\��ux�=26����[	6����.3����Q��z��X���c�<f�O���%��9#`X��ke��x�.��/H=��t}������e}�K�l��7:����������Z�Nh�	E�&���$�Y%�����E�!���arHT��9�r�����~-U�����s�sw�8Wm}���S6��g0]�������y�RX�q����&me��XLk�'����>]��s���������B�R'��s,�N���~���O�jf1�N��]�6����!��.����������cwU�%��-t��4��$���!
^Uc}n��A2�����5��!Q/o�G�}��������%�o�&��CVi��zV(���^j�`����XK���"�������c�!�����
��C��y����^fdK���9����+��t\�r��c���w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����^�cf�lK�F������i�c����������k|;���������k|%r����yL��MF]�-����I�?	�:�z���n�X$��w]I��(/�f�
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
��T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�!^V]��6�\�!���F�o���j��>c���so�)2�T7��
�5C|�P�!>N���Jt�~���w��������������n�y=��Up������b�y�Mne�I�8[���?��-V|Je��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
$2�H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H����o�zK��6c���1�D�H���;,4��
#��H���;,4��
#���Lf99�#�L�I��Sv��^����29�����n=��.P��xL��������\f�/����u=�S��lKY�-f��[�wE�����>�&>3{��0��c����#i�[q���������5�:J������3V���o�G�l�Xnt��I%�'��'����Si�����m�����Y�m�����e�+[u�g(����|Z��S�:����(��{b��g[p��pw-����b��[~����rS�������K���^j�,�V�cZ(��T~%�7v��1[3�z����0�	T��/��*-6��|=�\�l�����'*���t����V���'�%��Sdsq���9���a��{l4��n��������E8����l|��w�S�����b�`r��q,=��m���#h��0���>oM)�c���r��7'��a�����o)��N�d�6[#g������}��fN|7�j���E���G��v��~:cv�[��\��ux�y�.G��d~q�2�V�[��^������9���#"��Yf����+��f3mlS����� d[l��7c����)=���7z|�AD� :�X�Cq�.��)��?o���-�T�]s�g�JVh����$�o���_������l�Q�=�����
�-��t_pt�vJmE��^�]�����}���rsg�����pi���}��u�P��v}
����/�-������;�_r�?+!u���i=���������n��������������M������+%L:����3���i��!���w$�9e�I~'���Y{���r29���>$d�OoX�d�'�Kp����[c���e����G&��g;�[qLN���[���{>�n�������c��������p{t��r�n������+v�q��s�[���������������/v����F����f����a��Q��
��;�_��w���JSO&y�8�L�O�W�3F�A����-�R����g����&���=�7g�lC�wZ�;�Z|V��kY?�"�CMQ�5
m:���INJ
M.�)�zJ��J-����2�����
W�[l:����bnM��7 ������D�&�����}�VK��SI��p��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc�z3m������������~=3����p����p����p����p����p��VTc��y*I�/o�G�L�R~j�YOB����z��Y�k��h�w���&�]x!E�'��e�b�s6����a;��bq���������v������rX�mqV�\w;j����d]�l~���e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq��1�����Y[W(r�,/���e�`Yq�\v��e�`Yq�\v��e�`Yp[��aEI����F��4���U�����������QaY4�����������r����U����������}��kTu�?��'&X������R,IPLV)%���~_' Sk�Z��fD�o��W��Z��n����-�rS���g����-����s
1�������o�G�=����&��N:����ID�j�_�4�o��#��r�g��q�1���=c^��yCI���[z_�����V��k`������`���&���.7�#��e���d��_�k��Bm#����N�{k4U��=�>������;C�����g{@kW��M�����z|��qp!�o7���n��7d#�;�wc%�_��nNKl{�"�������h�C.s�p������n��.Yn`�KO����������HQl��g~���!�A	�����r	JG��m�5�lQn�������jnf7����#rGz_������;MY�Xmk���v��V�/��n�������'���1^?��V����o[��nlOh#�������/��=���{{q�������{���b��t�Sl���=�1{��T{�������dn1�W�g!l5U��w�3;~.J:�KV�!�R�w����{tc�x���&���(/���g%^Y�ItW�!���u�e���8<n=��$��6�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����E�l ;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;������=3
�b�[f{F�cq��x��^7E��E��az������w}��k�w�����w}��k�w�����w}������<���
��
M�;?�U��o�;����o'��a��/2��������~n��T����c�tn�������X4v����6EgFUc������8���2T��a������~��C7�������d������Ua��v�������vK��X_����Mj���g�oM�.�����7=2����p��������������
��k����,�����H��`�&Y���`M+���]d����RY|xw������B1��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����{d=��I��*�H��/�G�;7o�v�f�>-�&O��<ia�Xc�����<ia�Xc�����<ia���&A�Zb~~i��b�3�������:���>L��[K;;]e/���'4����Bl��ux�y�.L���������18��/o�G����X�����W"������2	�f��Q�m?L���-��O����i��)d�e���f�
�����Lhr�"+����)K�b3C9��^���~�e.�q�Wy�Osf9,��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lf>�M������>i2��B�XL��65���a3cXL��65���a3cXL��65���a3cXL��6	��yA���?�{�?�o�K�lf��3���<��1����nc�X��y�m�\��p���������f&/��_If����c!����6�r�s��aw���6���z"���=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C��t����ri,\Ib�>��G����{4z���G����{4z���G����{4z���G����{4Kd���,��/�{�?F0�)g���e��i��W���q���Ri�*g�������Js����R�v(�)q]v����M���l���=����Q�l�}���x���#������w��O�W��i���,�?�.V��
�N�(�4��T~ �'�6�N��5B����~W����8����k��]�F|]j���~w�*������R�h|�J:�G��BZ�v]������������]�g����
M�fWk��j���:���,��/����D�@�V�����u��^J:�D�^�v��D���\����K{f|���Q�~�YCn�v��/�����
�[��[���|�����F���+7���`����o��({�?�d����[��AV�u�F<�-��������L��m��cF!�����5�]3�C�~��y�>���Odgz�"���?HR��i�������X�s�NS�t��4�.�IM,�G�j�T4*VB]�Vl�+6��������������n���Rr����f�\Y����~3��Q�����~\�{
d��M4�A��^eIdZ��L,�K��m{-m�#}@d�j5�T��N��ZV����I���k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B7��O�����.��5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��kO�OP��4�������]���l6���NV�>��*c������i~>}>>�����>��~CM(����5�t�c�k{|��}�B/�d�)NZ����XX�=������������<�I<�$���@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:$JT�������kd�'� t@�� t@�� t@�� t@�� t?4c�
������������6����7�����ol#�/ob��M�o��E���s�� �S��u�!�kT(=Z������3���-��Y��n��Z�����_�d������2Ls�]���{��|������u�7�Ld���c����?�+!�?69U�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AOO�C�����{��mE���Z�c{C�������������������������������������#v����`�8���v�4k&�v����~{��M�������o�������c^<|���L�������,�],��+��Q�wv\��0�n����X���pf6I|���_�^��nK������K��~3IRz��="�@����oVn=��>[%?�^�����1;Q2u|����{�?��P����q�*��:�_l�
��n1e�e��6��=6����2��n�S���1��l�P�O�W�����5������1����������Cf���fGjln���O�{�����yvb_����>o>=�r4c������S��������R)��|b��t�����������:�%�o�z�����r�,�����Q�s|'r������2���S�Q��%��_o����������1��S�U����d��1���2A��7�-���U�o����|��ECrZN��vm�J��m��6b�j���fF��Q��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ���4�EmV����������j9��x���!���j9��x���!���j9��x���!���j9��x���!���j9��x���!���&��|�)�B_���T~4�	++rIC��;v��X��|���_�?�c����o�;���]f�����1���q7z�/7��p�0��]��Ev�N����������m������#<��~�a\�Sf#q�5����y����Dn&���#H�O�����5
��+��X������c�-N����saB'�V_��_�$$��g�F���L�~/�a��?�����s��9	H�K���m��k>[%?�^T�)<����>���f������u��Fb8��5�3�Ynvu����/c��E���lN-$�����'�Z���I�=�p������+Z�9{�d����7q
���\�%��w#om��/���wa,�lj�R���^�R�ji�>�Nd�������*�%�zf��l��uxFi��#�c��=����F�M�"/�����Hi{��I��Y��'�6#�Va�-��iVS�7hINBi?D{�?ieKs�
�����S�	�Op+	BQxo��7B�y9��F��m����T�=�n��������'j0�J�q��o�KH�!������������U��o��,��lJp�1��o&�7%?�^
YQ���p����������M�V5NYn���P6��e�X�l:�}�0������1�!*H��%�����z��0���7o��)%���l|�wR�q�����O��]�2����;2��bm�i6/0M�i(��?�M������j5ev^�-�,��e������������o��l!�����)���DcB�}Y��ws5m!�����������1n��X[�����Qab66A
&�L�����j���M����"3���Ej9Djt�D��<�7
Xz�����m��[pz���������`z����n�b����}�=_i�W�c�����iB����,��;@z�������T��qb�h����,�W��W}����M��'���}��n�X����lil�I���4:o��T��&n��r��/XT[vu�g$�N���Uo^��=�Fh@L�<�j�6A5r�(��n�#u[�������@=�l���2�UyW��b�6qY Q�%���a9��0X�v��"Ln�����xL�?�)eY��&�[}�\D�������jo]���[0�S�Tm�-��EE�����B�oP(�~��7�|�i��.l#�L������x�q������>����<c�x�����>����<c�x�����>�����s��}�^!�=x����s��I���}��q�?u����n��	�>y���?"m�� Gs\���a��}�r�x�`��
���Q�Y�l�3�8�������v[g���9�|��N�����p��k��I�w;T@��3���l��r]DL�_�����&X�^])��
"f��'`���f!#q�'c�FNFm4d��>O
3���>O�6N�
*����H�+d���I�S"�1A��B���'�Nb%S��F&����41)�&Kp����5��U%�F�r�;D�q�(���G�~�>��Q�����}����?Eq�(���G�~�>��Q�����}����?Eq�(���A��[���r������~�>��Q�����}����?Eq�(���G�~�>��Q�����}����?Eq�(���G�~�>��Q������%���U6��T_��7"{-F(d3s��C9�Bid��Xr�|9�?���m��6���s�������sn~9�?���m��6���s�������sn~#6��
��$�a���{�K��,���r��:{��<����� �s����|<���d��K�}/t�������b>���t)���@��F���Mnn0�������Mi��,&�7D2���cU����nL�Ux�����sY\m��
��l������E'���0M��8�i��q�^H�m,�	6�semJ��6���	���H��q�	���P+ke�J�L�aE�@����BYF�gE��gqi��M�Gq7��TwqQ�M�Gq7��TwqQ�M�Gq7��TwqQ�M�Gq7��TwqQ�M�Gq7��XwqQ�=�Gp���TwqQ�M�Gq7��TwqH��n*;����&�������n*;����&�������n*;����.����Lw'q1�}�xwqX�F��8����L���~|��V�|�F�����f�^N��(#������z~�=?A���O�G��#������z~�=?A���O�G��#������z~�=?A3#�P�
#�������41��
}�>�BA�����hc�41��
}�>�CA���������Q�J({�9���
9I��FE���Q��������z@�=$}�>�IG����G������j@�5 }�>�HF��R������4Pt,�u�LIO�=$}�>�IG����G��#����zH�=$}�>�IG����G��#����zH�=$}�>�IG����C��J�������m}�>�IG����G��#����zH�=$}�>�IG����G��#����zH�=$}�>�IG����G��!��]�SOf�o[�����gA��_��kn�m�o.G��tM���:�W�L����#�<���wo*E=�kp��>H0�t#�$�[5+��c2#!���A������H�46����E��D�|�M!�����c+����4��'�'�������B�9�\�X�\��!1����b�;��U'��G!�A����'s���?��h�������t6�}\'����F����;��N�5���}si�`�O'w��������%rr����/�:58�t>X��?�2[�����s&r2��8M{;-nS|�L$|Zm�^S'�����9��m��_9�%��=��2��O�[e����=XT�\y=��e`4.�K���������7��������������k\�Md�c��f�D\X��w���d��:��R�n�,��f��i����vNe<������'Q���d�+�$��7��cS��A�>���Y�9'�2���2['^7�����^\���)t-G����	�r�U�t?R���"������L���.^�7�2���,�G�d)�v�����w�,�L�|��-�=�������&���R6��K��Cn���(�	/�Wy�$��~y,�VSo\�E~��odmN�[�"�2��G��ws*f20�#v������m|������Kwj�����&tp)�o������a0+����3;ww�����*jC�����~[�dd&3F����ec��cd����o�����B��O�����t3-^�Y�v-a�,��C���������L�m������'��pp���'���.UM�fv���������z�������[)�([���[�c.v������p��tp)�oEl7����d]�qc
1a�o�o����������J���x<�W�*����3o�&G'����2Qu�r�����[
����W���3s$�u��3L��
������m��v��zV����6@d����m��l�L��E�k��P�n��s�	$F�E��
��!"X�C���B|"�Hb����5�-'��S"4��K�*�H��*��[��,�d>	�J��������l���S,�U�b����XYj�$P��hI*5R-O�V+������-d���1�#W"��
��NQ�4���l�'�PY$V|$�$W��6R	N|�H�*�H�_�?������y�nn�������oVM�+���,K_���o9/����Xc��Yi���cY�|,g�s���������Il��u�����.����i�>{��-2��a��.�u���n[4�OF�
3�N�����77a��:.��
�j����)�6_{�aKj����,bpr���)�SI>)�3'�����n�����_sV+[��u	��{}���e���(����v|��h���899��<~�LZ��L��s���6frF/oomv[27n1���u���b~����y}������u�r�>�U���&��rU��lo�}���03�q��������S��f{��9&������r�q�eVGX���7W�'�o�����)�
�v����7z���b���Y����t�N�y���df��;�������]��89�n�
3'��{\N�'����������C����A��K���x��y�����e�=���U��|��s����{G�&�$�M��r��������_�k}��������Yg]���x�kk�����7��k���T�gM����^{���A��u���b��������{ogVa����g�C�+mv�Y�����y����������l��_��d���!���9����o��1��l�F]��TEe��tFZ��M����.���eQ����(4�6���S#�~�p���B]��s�,O��n*��=�C|o�	��g���f��5���6�{�=f7v�7�da���v8b#/��Tn������}�?���� �;���\����F�CgC���)(P������fm��j��69��������l�[��b`^����n�s�Y�p�T�k/p&���[���&�������|H��s~�r��O����6��s_�g�Z��?g��xe�F���q����F���`��m�v��St��d&3w���������_���L~��v.���W�k�������{�?��?�{���6mk�f��w���WbV��3q������w�%��i���=���O?r�t���_m�;*���^8{k�]�����o���=������x������?��G���k�}sv7c}����msH�=/l� �� m����������qwv��7��������ae���>Gd��(�w�����V��]����1��	��]���������IPM.�E��������U(�z�(������J-�JDi)��,��<��n����P�v�1g�Sh�z4�J
�)e�Qh����V�%A5:�L�&�*�Z=l�HQSR��=����
��^��;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on"��s���Zn��y��\��w"��s8;�s�{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gp�����w{Q��pw����w{���Gpw����w{���Gpw����w{���Gpw����w{a��pw����E���cj�}]��<a�X�\g�R�@��-KC�9��aP�
5�B�i���f��N[0��}�1��<%���3��,8�'�&bk�Y�Iy����0��x������G� ���rA�9 ���rA�9 ���rA�9 ���rA�9 ���rA�9 ���rA�9 ���rA�))�[����-gB��k��HF3D������7R5��B����Z���'�s	w]��mZ�N�{[hBh��n1�7~X����KTI:��,X�Q��X�/ ���K�,���Y��<�K	$����I.�U��l�}M%R���@���FZ�m#���GZb�)�F=N"ca,z��.���L����ucS�c<��'D@�L!?�V*��
5�|��c����igsK�Fh��ni^\��|xP�<�k�C��b���`o4���F-5U�n���M����'�2���d�UM*����ar��nyD�Bh@�a,!��E7V���S_;����~x���h�{��t���������]����y-����gq��%��o>���.��2�$^����U6����������q�7	[[����������5�s�s�6a��9�u�m�����n����H2�����m�O�s-�����x2���d�f��w�y�c��WZ�����+fa���|��h��q��;�m��e����Y��c�^�j�=E��5�1no�:r�x<l�o���G�[>e&�9��veZ�����v����F�z�u�;7�k�J)�����6P�����nA�������t}��I�e���������x�k���u���p�gS��fSg���y�sG�wv|��.]�7j��t,�p\L�����v��i^����hrO}�:��|���e��r����wp��`�
�*��j��{�e-���,����
&���o_���^����7Q��{��*����/3,�����2��ld����}�
56l�r�v���32���qZm�3s)mf�O]3r<����
���{_,8��������]Kk�m�3�;w�����f�����9����s�$N��m�77�&�L��H��_���#S�&H�{.\yu���������&8�[Y�����N��$c|�~ dF[O�1�!32;��nr�q��7sK�x}���$\���n��b�qv��F��L/�S��]�I�X�����/����1��[�`�EdE�kc>zn����dE�����3��`[W����l~���������r�{m��G�i���������/���0�lG�?�i�#����!��,����i*����a&b-����O	p�4e�����`�y��nX������A�Cw�S6�h�oz<3�g�uJ���b�{F��_���zA��v������$��_������%��g�;�Xul]	��vUP�N���Q����Y��5�c���$Z�<L�rm�������s���=�:���hO/�xh�K������#b�������V$m���r���Y��\[������V���4m6��w�V��g�t�����BL��0Oovg���;����p����)��ne�����JX���j��w�)��r����-�9�sw�]���b��8g�������dV2�B0���H�G�#r���Nd���6!gu9���3�Z���
��T3x��m��6��q��]���0�w���=��s3�r�d*0�`�Q^�@���qgv�X'�Y��7��e��'�E��;8�����[�m��_���;;g�]����a���K���	�a?��POMMy{��n�]�����g���6E���\�/�:�P�r"�E�����I
)Y����J�4X
�T\��M�76�=��K����,�f�����46���>�L~���Gr����I�R��[�������+q�%T��[��
�7:��4�4�r�����:K�dH�y��rI�u�	�8?q[T���>i��1�?>gX7[��vv����n����v��c�N��yo���rdR�g��W_9hP���������;�c�h]ke��[���m��f����[�fsW������������g�X}"y+3vw�xIv����W�#�%k}�u�����z��p�#�\�����A`f�%�2�����h����H<�I�Q*Be!p�!s���MOM4�&���/$� ��*r����e�X�,e������$sBT���.0(�_�������}���aj����w��mL���n��L�C�~*����.[���������5�>�n�O�l��;��{d
.}������`���e��[�nn���������K��w6v��c����6����fa���'6�z1'���`Y��W<��c
��t��/�"�
��<�����M��@��vs�1��/k��~�x��mg�N�,��0��
����K������@�{�����so��������)��eL\�A)2���&O$�KK	��s:p��T���	�\�&X�	
��HI/NN��`�HK��t����d��_�����������#a)s%.a2@�S	dNT��1P���If"I�-)E	�\�)a��"	��t$��K����M$����u�}7{El�������,T.6���=��/�$����M��`Z�������<��l����X��n��c-1��*�����������+�����q���;�>�����"�s�c�%��{��n��>98y�u�w8�an��������o2Gv1�����wO�Iy�b[����yg��_�[h�r�����/������Z~���aov���m����w����rm��������:��/�#b�w!Re\�����$��<����.x&*�1q��!Bi!4bL�DO���LTad��FT�Xr��``���$B3ybx��f"X�B�vE���6����|����9��k�[tf�79Myn;��W��Y�����.Q<�z���;��DL�c��Q{����E��nt�F!�?�eK�Y�su��I�4���m���+b}�q�l����&3l��m����`���n�x������Mn�wSl�d����h�����u�_��tq�$6�����x���U������c�t���*X����F��0;��������Vv��5eYh��8|���������Z;��3gj[���0���f�l&�}>'n/�f��
��c&2M�v��m�\�sm��c���F]]����Tm���������6���&:��U`�D.1��!r
�������[�������3����sp-2�;[�W�f:xG�q�|\�T�<�QMynT����S���fYe��#c	��-��=�b{���o3�R���=���PM�f�-.��?r�����z*�7N�"�Ww��C���k���`���U���y��mK2e�@uM��hO/�v��m��n^�Q1?k&_	��o�
��^���a}���Xg���-����.�_n���*��8��X=��zbf���9Q���
��F�[\��#�a'�����U��*�)"��b�l���&�f�������(�����@����9_��_#s�vM��}�237v�r���K,��?nm�)�6�����_j��r��h���d4[����p�M���$�{�Z;G�S-�����W��l��p�72���+8���G�O���^�a[#K���T��vK�����������`��NLw,1$���E:��4
6i�}�j7&����e��1I�M$c4������;|����i����rv�����N�{q|��0^�������y���\.��x{��~r0���5=wi���-���k�5|�V�[�e]e��G`{�2��D���.X�1p�JL��$�M@��P�k>��)J�zC�(��L�'��� \�&.2�r���Q�$J D��p����L�N^n�|��H."�t�"\�C�\����e�� �HMe��^I~��j���u����
�_qC�Z�]��?���������;�__�N���#)[n��?9����&){��]K8�^��n�{~v#�Wsu�*1��o�x����9���%E��[���p�gI��Oo���������]/o�f���E�1�c����A����P���_V	4xGx���l�~�L���#)j�K�~��&i��e<9I�.M��Y#/JP���q[B��	.�P�`T��S��$�&�*X�,c*i%N\��<�.	��%��bd����e.�%I0�<�BI,�*X��!2I,!�FN���L���K,$�����%V��G�{����{��5�E/(p���}�qS=����P&HC�����FYXY�m=�M�����B�O����&o���r���T��6z�
�/����D�sK0��N�%��y��l���V�M�-W�p�����ck��,��X������?j3j�?(�4�BU6��n��\����M�������1F��E��L�59��	��K�+�06P�$�{+�i���2���:7-��{5�Y��h����nA�[�on�P�c;K�E��������i�����w6T�1Y��l����%v����a��d�{��O�Fn���c�+#��i��0�0�0�0�S�g'��PY�Bk�n;.����o�x��6�����������#�d�v����4���v�v��K�]I���_������_l��[[��h7�����K�*qm�pX��������������������������������������������������������������������������������������������������������������������������������4�����"���_�}��;F6������n���n�K���X�o�w�,m�
�,��c>6���"���4�x����Zp�_!��C�G�{gZ����D�K�a�a�a�a�0��%�C���6N=��I���%���4���<?#O�����\s}e����I41����W�X���i����0�w�Xi�������	f�G�i'�g��v~#:>�����O
<?CO����&������O����4���<?#O����4���<?#O����&���X��/�����4��Fy����:{~�4���c���O����4���<?#O����4���<?#O����4���<?#O����4���<?#O����&����_��8��q�<?cO����,�y}�4���<?#O����4���<?#O����4���<?#O����4���<?#O��<?1�G��1�����X�_�����6;�fF8���i���2c��4t��B&���yr���,4������4���<?#O���8i��~=�$+�wh��� 4��4��
:>CN�����4�������q{�r|!q���C�3���d!�O�
9����G�K������	�s|'�8��D�����r|%���H�c���lv|%�1���4��
:>CN�����4��
:>CN�����4��c��q}!c��4���������c��C_^�G���!�G�i��t|��!�G�i��t|��!�G�i��t|��!�G�i��t|��!t}8��1t}`4���i������4��Di���G���!�G�i��t|��!�G�i��t|��!�G�i��t|��!�G�K����K�o��No|!�'��N����(
:=���G�i#���#w|9��o�D1���Hc��,#���c�G�i��t|�� f8����V�~��HC���k�7���nh�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h���T������fs3���C|S����������������G<��@���c��9[��)�O.,n[ee~K��}Y`�fuN�2L�����,'�^1���������������c��U���jw7�$mh��]z����i��F�/�*~*`�d$�[y��|��3����51�<y�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�2O)��7?e��Q�w�J�m`�9�~'������v�n7L�n�F��-�F����DsDsDsDsDsDsDF<F"%e�+��y�,8r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�e�L*�;r�����P��*.v��t������9`9`9`9`9`9`9`9`��^,���o�*e]/'���k��Qq�2����r�������d�V3	2�����^1������������������������������������;a�������7�bB��<������.e��Y���M��NOf�[k����'��0�f����������������������������������dZ��8��s�W�����m���}�^�K����0�0����J6u�T���sKXXXXXXXK'Y�;f������)zDl�J�����f�ll���&�H�"�%���v��V�6�����9+\�cc���&�O�Dc���Sq���L-�^�as�H	c�;�B�n��Q�o*r`{���������l;�v�U7r7�*�V���N�Ls�c4~Bh�|G{�cg���.����-w���wVxn��;o����YSyd�����Q�??���+/��\��sC�|���������8���B��f����m�������Y�����x���Y]y��^�\��,om��2��%�H�se��;�<'��wp��6�Y�=
}�����s����%��G9����mUL�xw\�U�J%��Y����<��a��{C(��q|�q�lR�-v�[���I��uaY�5��zI�S#�D���b��:����=4d���b�1C���P�(s9��b�1C���P�(s9��b�1C������fKk�C�& ;��X6�:����h2�e����P�(s9��b�1B1*0~1,��h�����g#������52�3��b������w��������P�(s9��b�1C���P�(s9��b�1C���P�(v��A�m�r$l.���=C��-M���L�4b�?����6��kC&[jC�mYp0��1C���P�(s9��b�1C���P�(s9��b�zQ)�H�[����-��E�7����</�o����S��N������O��
�)�/1C���P�(s9��	��c$����'�����$���iG4��Q�(��sJ9���iG4��Q�(��sJ9���iG4��Q�(�5bsb�����
��e����Ii��p����iG4��Q�(��sJ9��pVng������/r���=�����1�pp��{Hr��.�d�.<�oE���9���iG4��Q�(��sJ9���iG4��Q�(��sJ9��c;Vm��E��������2��oWq&�#
�F��a�*."��f�c,4��Q�(��sJ9���iG4��Q�(��sJ9���iG4�xHd���t��w�iG^$,[w�����Q�WsA�m�3#�l���l���%��sJ9���iG4��Q1��b����x�k,+�t1���i��re��A�&Pi��re��A�&Pi��re��A�&Pi��re��A�&Pi��req���M��cwdJ�����iq��0�q���re��A�&Pi��re��A�&Pi��re��@f>3V9�K~f&:l{e�4����.��y�~f�1x���,1�����(4��
92�NL���(4��
92�NL���(4��
92�NL���(4��
92�NL��92���yfbd���)x��'��c�Lye������c�&#�L�F��A�&Pi��re��A�&Pi��re��A�&Pi��re��A�&Pi��re��@n>3D���n�Yh�>=1��>=�S�lxe����1('YHI�&Pi��re��A�&Pi��re��N��nYt�C��\�syU���p��*4���:��N����*4���:��N����*4���:��N����*4���:��N����*4�������G�yc>=�"��K	1���i1���4���:��N����*4���:��N����*4���:��lf$6;f��c��
�!D�����X&�y"��LN<��.;2���YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ve��`����#!&92�L��R��f��\f�`�T����O�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��zf%8�}d�,�~f�l�������r/YnI1���]:��N����*4���:��N����*#���an[TKN���'��j��t�g����MU��8�7���-���8��_^Y��D��>f�d�J�����2��1�r�a-��m1����}���}��
�?N��Or�T
�Q��M��;��;��4���C�:�����d�d�s�W�B��w��DdS�iH��!��x��7��8��������k2��
]�[uo����f�ULZj�=�7:���1+�3g2d����E�>��O������+�>�K���V�]�~G���e�c/��&�d�����,�k�	�f��)�B��Z��b���-
�\c��+��V�
kX	����YF1/��d��r���a�����b~���9��}�y�����1X����Q.���0W�'n[�$�\ ��a,x��������s���CR��r��b���kqv��w��9�y��E�n������Jo���R��9��W}��p�����r1��J9�jw��_s���gm��1���m�e�!�~�R���K|�q�,�kr��p����Vf�d���,�Sq�T�[%o,�M��#���,���>G}k>�L�g�����;�L��/<���&%������qNHL�<f�?"o=�uzn&�!c]��d�1�5J��x�p���
�6��Q6�������M_�Uv��1����C�gn]��3}��[�3Pwx�i��w6!����1�o/���2^"��Y{{�)�n���$��xf?�wiJ�4����Cl���c�)��l`67f����(����#w�&�����+>Z��%��fa��3��
����t���e�;u�����
����7���Fh�'�><����������Y�������{=�`�d��������*���o�����W,1�����a~��TZB�_�La��(z����������(z����������(z����������(z����������(z��^�D���X�[ZY��TH�J�IZ����_��c�	o�&I}we]�C�vP���=we]�C�vP���=se�vv�EG�E@�/@�Um�b��X��+����U��R�hQ�K4���$���������(z����������(z����������(z����������(z����������o���f����������C��4��V����������=we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�vP���&��y�������Hg-Z]��[�
V��W�Y��Z�W�hn��{-��/�*���=we]�C�vP���=we]�C�6_
uY\�#��Z��@�����=we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�W2�_��vi]�n)h,�j�;��&���+�vP���=we]�C�vP���=we]�C�6P���f4������9��9����,�r�*I,�pA_�)���
B���@M�b�	o�*Y}we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�vP���'
nKP����J��R�B�R�6��'��'��t���UR����h����B��a_6T!��(z����������(z����������(z����������(z�����o�.1�	g�$��J5
�Ld*�[r���	����>����P-�+-J�W��Y~��������(z����������(}��������������(��� �yc�#A���F<�1�� �yc�#A���F<�1������;����aO���r3����q7�����l��$1���
KMPW���yc�#A���F<�1�� �y�^����R��o����f<�,|��W*��3�����~���v�)1���A
)��� �yc�#A���F<�1�� �yc�#A���F<�1��i�'4���T�����:���o��3%5��Y��A�\,����I%j?�$����F<�1�� �yc�#A���F<�1�� �yc�#A���F$�%0U3�	h����tskYK�����i@�yc�#A���F<�1�� �EN�Ye�����D��y��$����F<�1�� �yc�#A���F<�1�� �yc�#A.������;s��NC���kl;����V��l]�1�Eq��)Z���r�p���F<�1�� �yc�#A�������E5ncL�������Egr����g�P���#>-.Ec{�Z���yc�#A���F<�1�� �yc�#A���F<�1�� �ybzzYdp2?�w�	JOc=�T��ZV����g��w�m��U~���� �yc�#A���F<�1�� �yc�#A���F<�1�� �EHE�z��y�����KQd)�{6��J�w�&���f	�l�,�������! �yc�#A���F<�1����L�����������!r�#s[x��mF)ohr�RSm��2�y�v�v?����
��S��������2_�M�����Y�<?�}�P1�����F�yb"q'3�y�t��_����S]�#	Z����y4#��v����	�2�:=�pB���|��y��ofr8��s���dUGp���f�c��0��|-�1�>K//j�q�-s"�O�����}����Y\u�����	�����?����Y�������;�`m���x����t����2�C 6T��Z�T-q��0�y�p�I��m;���v�����$�c����q	1V�����	��K3���!���a��O��t7���+lcfmp������1�mo+���������W5����=r5�>����ldk0Kg���tm���0�c&�()�����X[�;�c[���Tj�saD���(Y$�����^�l���X�i?<?��?���������!p*��������+����n9i�V�8In9�J��n#3���9K��1�i����=3q^1�f��$�xY7����e���	����b��x�S�\W����_c0m3���&��B?y�I�����SfqO�Q��f���u����Kx���n�����E��������N6r��U�y�P��tlJ{����n}Y�sf�O:�m�_�9������lq�h|��'�V_�����������xPlv���J��d�;��[��^6c������X�N"��Df��{�2�����'X/���at�����1�4����N>��Y�����x���u��+l&#y�{z��|�.i�+�?x}�$Z����[���������y��k�m����m-�}2k.���.�[s�_�~1x��%�3���
�q���B,}l�S"��^���X2���g��{*�����L�����<g���6,�#��<��E��]0��Rhh��7t���!�wHh��7t���!�wHh��7t���!�wHh��7t���!�wHO�����:�\����0���Xa��8u!.�H�4t��n�
�CF�����4n�
�CF�����4n���������7txC��8j�M)xv�p���#�N�g��CF�����4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
�CF���:|!�n�F��N�V\@uS�<uL�L6s�as�9p�WJ0����wHh��7t���!�wHh��7t���!�wHh��7t���!�wHh��7t���!�wHh����F��P��r�<�n��b����2���,���J0���4n�
�CF�����4n�
�B8l�qa���h�I2��������
]Ia�wHh��7t���!�wHh��7t���!�wHh��7t���!�wHh��7t���!7t���nqR�p���h��a�� �
])�5ta&��!�wHh��7t���!�wHh��7t���!�wHh�����$�=sf�GB"L/s�/G���#��:<#�.���������4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
�CG����#������:u&�|6t'��]K&�%�6���7t�4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
��'�7@��r��h����a��$��RC�G<�c������4n�
�CF�����4n�
�B\3t�;.�������^� 8@p���� 8@p����
�wV���,�g2['[��rK.���"j(����[�y���V�	��x�+'2M����-��/�s���q��� 8@p����_n������L_6�W�{q�m���U�n���3�"�G������������*J�c$�� 8@p���� 8@p����x�L6��~����hL^��P��e)���_�P�n2�T�����E:&e�}���'��� 8@p���� 8@p����Y��f�����]o��9b�C�������r���x[��a�8J��*���G�� 8@p����?����D�F0�� 8@p���� 8@p���rm��gl�Vf[j�i�lk�i�z28������e.�8�����[�7j�^�����kd���{�� 8@p����ge}��.���S�?3'2��)j����+������7���^���x��U��d���0��8@p���� 8@p����@d#�+��~s�;�V\��{uL�r.#xVU%�[�=������x���,�Z�K�� 8@p���� 8@p���if��-�+������p�K���J��+=�^�u��lkr���7]�}2��d��q�>������x@p������x_xkj��n7l��>���I$�i�%J��A�_�V�W�n���f���B3���B���t���9��_#��m���E2zT��L4��l\��4�y��|���oi/��3�74
���0�S�%������f��G.�r���p�:���g|�d�-��N�X��q��C��&����c���E�7	#����<��[/����d}��#1�m=1fn,���������l��^�3w��|���*��7��J����������c��e&?������9�U|�qN���gf�������c�t�0�����=���_���Gb��wA���&������o�f���[;������9p�|x�������&@6����1�\_\�}��>��)6���'���l�{w�����{�Z8c���9�:�:%{�-���TL��vM0������#[��<��M��>K�p��Q�1M��hq���8�q����0`8�q����0�m�}�:^��>&�����G�+d2}��q��� �������4�M�S�FH9^�J=V�cYf��9ye��0`8�q����Fb�N8��9��j��iH�������|p����������L�	�������]�C�����0`8�q����0`8�q�����e=*��kov�1-wo��%2#����z��!���p�/z�?j�9�����+b������0`8�q����0`8�M4�\���Q^�����7�9���1�X���GcC�8s���t`]���~��Z��O,'�0`8�q���?19f������sa�9�0���sa�9���F^[�\8���1���C��J�����U��
���Z��em�eC�{J�������<�,�l�y?�/0���sa�8���Bi��-�V?���c!��nQ_|_b���Z�&��[�~b{�o����v�6\%r�'0���sa�9�0���sa�9�0z�U.�c\���~+�\g��o[�F��+.����t�m�wQ9�l�����Z�����a�9�0���sa�9�0���s'�1�M��������Lg(��-?��%a��������Ky#�}�l7���2���H���a�9�0���s~����|5�<s��:�v�����'lk	��v�����'lk	��v�����'lk	��v�����l�w
*l�w���rIJ�wX��x���Z����wd�X���/���0]�a�'lk	��v�����'lk	��v�����'lG1��Ln]����v��,r��6R2��*i���.e��	��x�����f��XN���5���a;cXN���5���a;cXN���5���a;cXN���5�����6`���r�����������wr2����ir��2Hf���G~2C0��CXN���5���a;cXN���5���a;cXN���5���a;cXN���5�������xe��2����,O�.��I������?/�R%�^;RL^`����'lk	��v�����'lk	��v�s��`�*����<a���7�j��/]��W�����5z��^��W�����5z��^��W�����5z��^��W�����!��f�.�>yr���5v�#���f�/F9~��M]�2
]�f��w������|j���w��]���|j���w����w����wa)yn��	2���%�'��l�wI2\�x!1Y��e���w�����w��]���|j���w��]���|j���w��]���|j���w��]�6^�P���iL��^s'��w��wg�t�JQ9p�B%���Zy�����_;���]���|j���w��]���|j���w��]���|j���w��]���|j���w�r���ur�O4r��������+,�)d+.�$�_�q��j��6���|j���w��]���|j���w�2���c�:���C�������?���QJ��y}���yW�97y��%�s����3Ct���V������{��b������
�����y�z6c�I�
f��\��h~�~�w[M���YY����YB���
�������Z�k����&o�6�i2&���������p���Wa�f&�&������Xl����Z��Y�61�}	�i���%�
��������F��X=��;�������d���mn�d#���Ye���1�r��vn��a�'������t�+5m������,���s2)�<`����&���O�K�$!V_�������x��������������ej�C�q.�y��1���|s�����mq�����q�����ZE2w8��ss�5v�&�����c�ql���bV2=�����L�2��s�s�s�s�s�s�s��N�d���2/2�<����.Yv�q+��.��U�|]x��YKh�U��==�;NK�����?M4�e������������������������������%Ae����T��5���~�E
�|�8�1��Y���{�����NS���hm��V��l8��a�����������������21~�����|\s^k,e��kk�W \�o+�l��Z��=jn
0���l]���������x��?���������J���7>c�!�����E����������Y��[���ad��S LY�kE��q�k�����0 �\t��f���k�������F��K�aZnS�V��(�4�+#r�}so�����R�k�.�97=��Y��l��v���
|���y�:����5������
~����}S�X|w�Z��:>�k!n1�iQp�t���M�h���\���6��"HM	�B0��lw���G+y��Zc���V���G�j���j�����T���\�9����<D�J��>W0�����V��iMNdb��5w�y�[��m���x��6B2y9������K�
2Y�`�C�l*�&�����y,i�=�����c���p�>�u���{�����W1�5}�lR�IVa��/u�����Tv��!��f�m{^�d[=���i���&���.�&���90�c�mZ�{n��
n��%�;�����\�1�s����R\cPr)���s��M��dA�.~CS��5��7����kr�7�E��eB�5��eX��7�F����3,��3@�C����������.mL\�,�9���r�9c���X�,s�9���r�9c��PIO� 7l���9���s~lf��j�.���-m��u[9��$�W���������g�\a�8=�N���O���X�,s�9���r�9c����Y[�W*��l��w%�g�:;��X������F���v�%c������
����Bs�9���r�9c���X�,s�9���r�9c�����Is��sb���� !vnf����1O"ng1�e�{	��|p��W0�[��h�W��mp;	�����X�,s�9���r�9c���X�,s�9���r�9c����m#�g�l{$�Y*q�4�f���]�F#b�F�o���t��o�kn���y����r�9c���X�,Ld!B�3�%���+�\�<�����������������~�I������*clg��Cd7��gc�x[��������`]X9�����5
S�e2����o���u�0�D9�8�8�8�8�8�8�8�?�!�Om�E��o���X�;��Mki|]�#\���7e�G�q�#���c5v������������������!�V`��z<c#�6�>��8�l��L���Z�����Xu�9p�3����+�69,�4!�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q<�N�Q���g������Xg,
�V���������-K��f1k��1����������ca�P������h������G�m���pzf����m���pzf����m���pzf�[��'B���z���q��Ke��&Ci�J\���)h��Y%�KU5"�,�a6=d���i�������6����=3nL���6����=3nL���~�!�Qh��P�m�D�*	h����K��o�hp���XK=�,d�-����nL���6����=3nL���6����=3nL���6����=3nL���6�����<�
	s�
���������v����K�t���F�BR�	�-�np���=3nL���6����=3nL���6����=3nL���6����=3nL���V��4	M����-���oF2�-�
�����ht�6��1~���m���pzf����m���pzf������T!	a����������M[��V����=5oM[��V����=5oM[��V������e6����K�)i���R���J��k�ON2�����nr+=����-Di)�X���'n�T�-�����=5oM[��V����=5oM[��V��fPQ�2k�������4��eT5+���\�D��������x�W�6����ts&#,p����l;����xzj���������xzj���������xzj���������xzj�������GM�v%��Ltmn��a��%�����]��D,�n&�e�~���QO�jM��C]u4tk��u���UE�E�N*��FIm�zhzj���������xzj���������xzj���������xzj�[����.������#T�[��P�v���S�������S���Um��mP:^��������xzj���������xMl[��$'�y`�8��A����6�������X���h���w-Cu}����v���r�
�|8�E������+��#v�^���Cfv��5Vf���f.�{�m��E9�9�48�����Q�>G�5��!�M�T_8~�����fr���������������)���n�>���tl?�\<���[�pJ�>:�`Tw�v]���)_{of��g%�W!�������u��7e�&���|�o|�U+C$_��$���LYs���>2����������m{�n��#�x3[R�$�7*{�����yG��/o�q�xt��a�fn>��2��di'[�V�y@��������.�iV�-�����f���f�7�c`��|h4X���N��9�2e��R����j
�YlU�r�a�����"�������:����.��?����l�o���+p9CH�������S�HlDn0u��R�T��F`�����|or�b[+�����8���2,\\���GW�/^�����5�;k�z�{q0LS�;���������Rm�|����s�z\r,�)�i,�������|/�n/oLk��aq����W���[�,��W(V�)�[��,�h=�m������b�B���/,v������l���O�����6)��8��E�������+n��q�N�9���\������;��Ms57����
��d����)�r���<$����<��n������V#�+�5����f;d�<X���>n!�8����7�:�Me���v�I��a��=��`��mm��WF?��o\M�co���Q�����2���I���m��7��+(��7��������I������5�N��5^}���������w9}��d6�>�Wl'����:i'?7������z�����������9m1�X�f����6L�����o�a6���#��g�U]�x�l������o��nMw375�����mM�-���T����_���\�����A��s�v�~�����,llb
��=ngF+m��x������d�q��N|97>����L��uV�n�Sq[�2���49uF�k�\��U���W5�|�;�{d�f&����G+��I/"���5R��v	�=��U����m.���T������qb��9�_v��s�.���;���m9��~f�&v�5wuy]�}��g��u��d�!�U<�S��������Iv������=K
��z���6R�#�lN���x����$�G��1�/��[�Ej�`������������������������������������i�n%�'��O����j}�v��#����q-������	���iF�����4����,�q=��CqM��4����\�q�q�q�q�q�q�q�q��O&1F�w��W6v��H�����������3g�����������_<��������
)9��re��1��������������������������������6�������%���&��=�-bj9��UruY��B����B�2���u��*�n������K.�8}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��V3�nk�7=v��S����
��^'>���g\J�g��K)V�q��h�&�$�q�q�q�q�q�q�q�q�
���<��u��\���q5���`������������������������������������������������8+������-���j�_k���	M��
��
	���)�]�>����6��-0�{��}�pB3��0V��pP����.>��.>��.>��.>��.>��.>��.>��.���7��(FM��FA���(�&�8!$�o��K.�x% ������������-��_������������������������������`���{��#��
�	w��YG��y���d���!,�����C{<�{\�������������������������������������������������������������������������{��x�s�1�;������"�w��h	7��ia.��+(�|,.O�.��.��.��.��.��.��.�����X������|
}1���R��>Xi��@i��@i��@i��@i��@i��@i��@i��@i��>#Hx��<PC��<PC��<PC��<PC��<PC��<PC��<PB�:C��,PC�B�
!b��!b���@G�B3G�B"�����@i��@i��@i��@i��@i��@i��@i��@i��@i��@i��@iq"!�x��<PC��<PC��<PC��<PC��<PC��<PC��<PC��<PC��<PC��<PC�B�� ��
!b�b(@i��@i��@i��@i��@i��@Y�����!X|�I.i�p9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�)GNQ��t�9GJQ����:R����(��:r����(��:r����(��:r����(��:r����(��&"I�BAe����K��t�)GJQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GJQ��t%�%� L��J�0�R�9GNQ��t�9GNQ��t�9DI�h@�@B���?��?����h'����m�=F���m�=F���m6�V�����Y�yz��(���oL-Y��b�j�lt���m�U;M� �������y��� ���(���m��*�@M�y-�G]�
�����'x����Z�'�$Oe7���G�������]���
�H���:��f��s?l��d�;&�>D��_�*�*j*�s�p�����������	Xv916��5x��/#�[L�t��������,�7f��8����6����^��	�v��f��'+�":)9��7�a7��61�$�@*[���-�c��1�{�����G�-UM�|�3Fnh�/�mF����OQ<D�����<s+zu.�<n���m�x����j�D��K��:�\�������Ks)��o;�I,�����)�H��m���>���0O���m�Z�cx�Q�h������[SW$t��9�-�j��CIdg��
�8�WIL����F����[2`8����U�
F\rH��Y�/(��_t�����<�J����w��k��9�����KF%��M���Z�����p�mU��mc��U�$��������[��f����A�;vZit�a$������)��J�\�O?�'�V�Ga\��|��j-nX��L�;���G!�
�;W��73�!
T�ZP�]����G�i"qi��Hb�����c�q���m$ZI���'���W����ZW����/.'�	yh(\$�~�B���@��q@����}�[>����0����#|�C}���s���0����k[4��2�s����v���;1f�U��xR��j*�d)�-EM���(�k�����~U��U��Y���xu��Z���f���Qs�0;K�S���kP2C#N���Q�jJx����}��ag��/���,/�A��Dz��*W:m[R�]��Z?t��\l<IBL5�e����������� ��B�����Oq{%^��Mj���j��s�\�R2v��_j
bf4O����"]�w�+J�����X��O�)������]p����j�����(�geLj�"��ad����FK��[U
��a���`N�bC��)�S����h<6�Ru��/���|����}�����v/������>�x��\���(����4�������vCt�O!~g����(����6�w�^{%��#�D-�)��e�0b���Sn���������s�A�H�L��)��o�?�������3���jle������b��@b��?�C}����u��5�����i b@��_k���H�M�x?�EZ��H��R8�8�K��r�;C$h���\��o"��F�LP<ep��\��\Z�������I\\\/G��T0����*N'��6��7�qs�^�@�
��C����KJ��8���?is�K��9J��/����TI�3�
��vR��yl�����\��'|�G8�m�v��w�]������j��whD�#a"�a�����X����[yK��M&��>�uw��������'
h���G��jS<M5{K�-*�������������)���8���,����[I�jesi���j��UCQ�`b+����B���?��t���m��/eUDy^����(v��P�H%;]�u���;�i6�'G/G/d�iC�������T�9�tP��;�O�X�d�TJ�y�0&��������{��m�OY��=f�	OY������S��G�t�j6���4^m���a����R0q�.���-�L�^'%�>����o�jas�1F�yYA���Y����������p���x�4�������i�4��^�pM�ms��@ku6gkT+A:m�d�j���4��F������b��xO�{Mb�s~�x#��<M/Ol&�������.��mo��&�������e�����_���xwx����Y����%%�;/��a�A;s1�8f����`A�5��4c��������;�����dx��f���<�Z�`��Q��}�(�x�.y��+�2���3X�jc����H���2�e�W����*���6�Sw&7+Zpp�I��� B�NKp��cj��E���9!�9�`�8���h{,��a�M)���$�����f�������E����VBQ���;����i�N�v�ag����/rb:,�����(}����x]��������$�s��q?���}����<�v�#R�������]�TB���m#e�]qY����
j�'f���o�.�����\"�N#���:����P���u���o�Y�-�K:���gX�t�2		�ZpP����p�����q]x��18[��T��s�
�)�6��\ ���&�J���
iq"��:C�2�����4��<�M���c�N����Tq�(�S�!���M�t�
P���VF�HpQ}�.����D9}�Nv��=8�)�	�|N�f���M>��O_WN��W������2?7G�Zr���ZU,<jHj���\mO��*~(���������N>3���m�@�������y��2E��mXsrIW1�	?T�"��-c~/$]�o)�L-���-�z��{L�7��mQ��E[E#�Dy����H-��z-��R�$�Q�&��C��q�	j�l$��������	2���m�����QP8��,�3�p���|O�����{Mq���g�&�m6� �z�p|�\�j5�&��R��
��{v8o\n��S�
Y�tl�X�u������5��-%n�#i�B��=�����9�f
���Q�P
>��2�i{�YV�����i�>7��
�ku

�0-�k������}c�������o�]�����������Q����J��Q��i��|�^�3�������������~k�+����l��]T��G1{�����Px�I�L�Z���'`���Q����Ux�/���b����.�i���K&y{n��m*9^i�c�.�m�VxZ&�^��6TW8�8�j]^"����x�z+�[���-|�x�I�o�B�������>�'��N�a���P�u�	�c����!h�-�&���EE�8�g��Z�	�G���Z��T&J��Dr�������:'���o���so�q��2`�����J7	i�,�YE���8�vI�������so���|oT�
T��)'���C�
�%��Pf�"S`����4�KL���xb��m2����0����m�����T�Rjp�#o-q	��K;�N	��dw�/6��+gM@�����joE��=$6s)�ee�
��i�����p�]w(E�Qb���*�����
%�p'(aq�mgN{�E��c�+��M�s�����
�-��P��M"H���	N`[���z-�oi�,��V�;�)K$t���n	��50c�P�������#��c{�4��r�:l!0n���������q�@y��/^6T�^:��`����~^e���+���I��%hG��lK����f��`��1/!*=6u<]���E�<�\m���?f�y�caF�0<�m�2��al��8r�~{0����s_�?Up���S�����9��[4�9��}���F��b�5��q8���l��}�l�v���7��N��s8m7��0L���X����o$'����!�H$7��s����n.�Lz|���!���
��X�]�������v7���]����7�
; ���O�b�IZ^v4�r� K
Nw��Lm��������^�j���c�#��
���OKD���yk\q ��[�����$�E��$ai���;���.+��t��]����.#�,������7��S���lQ�u�����U^'�!���
���4��x^
H��S6j�/~)����	���v��'�����:��n�j���f����-����
�C[4m��H3�/�0���=�h�P[D���vIxM��mB��_�}6��c�'#���e�Oh�4����� � JZr�r\������(t�SOlg,e���<���m7Q�~Z�t8�cXY�������HM�w��Y3h��5�c.����K�q������g
�(��sZ9��,��Z
.��TJ���A�������9���J4���m�
No����l�/�����5�x����E��������Y14��;��8�^���|6��3N����*���	��f��ZG((|����P
��:s�=x���9j�^�����%^�O/�U�����Kb>��#~
zl��ZvhLT�5�����D;�����M�Z:m�8���US�P��J��vZ	w%�<m��F��X�d���2B��1J�D��|@LUZ�{��m6Y]&`\��j������;��zq���H��y�w�����y�M���������j������>�<?L�+A�*�@�7�t�G�F�����'��R��w5�Q�[�\:�L}��R������������{N!r�����.��y��G�-����y7���������\�\vLF!z�u��f��GH������]0�$�
h�%-A�}���0I:bE�=62����av�d|�� ����r���O��)
��j�1!�sw������J]5����+m[�L��������>{4�>�n���|��}SC�(~�bp
e��-YY�S�x0��Pu�k���6���G-]xL�XoC�_fQ��)/v�}kd>�OLU������7]�6.u����eEM��`��{���<�����&8[�%��|]@�j�����}Rht������&�E���m!�R�P�3F�B(��#(^#����{A�y��=4FZ�
&������3"tNE����IAj�E�5�J�I���#�3���;���D[x��*p~���8�#��q)c��%���i�\T��x[�H��s���������htH�1Bs����cn ���R������L.1���"�E�5������=&���fI�!����fR
y�P�h�0�Hbs{�M#�K��p1�M��|E].C]�I�����]6/����]o
x'�m�~.c��VDda`�����H�@�6����Obk����m+i�
.��#a '�i5����$����}��������J�l�jF
#2��?5��2�jkA���:����vl��LzV�6��G�U�4���Q�MR*�|r>�������mEI�7�&�c�j��'��s���s&S��;Y�a�G��B���]U�1�-5���u���!�2��u�c�!v�i��5<.�v5��OH����M��M`C1='�]M��
���w5o=��j��������H;������������eQ��>'��l3�ey�?��ZhH�5<n?f����M)��
nV�}�o	3M�����3b��A�-��H��k��JHh ".�?���251�MR��B�j���=�	h��^5���VS1����m
��U<��~��U[]>k�4�����n��8��9�$�K��k�����9���E��
�����W!{��*��,�X�5���m�m���m��o_���E#K����cyBz��~�t��i��IP��������d`�f�V�(<��ht�a��<4RmG�ZG�vqj7���y�Q�J��9c��x����Z�J]'K��L��/��f�>W��"~;4x���4�`N����0�h@9������J]5��];)�g����^��@��� ����} ��C��e�]�����t�=?�xw�/e��I������<�o�:?*H�'��#��
;��n��%D&v���VVF~�N���D����2)��E��O�^'�m��Se�K�l�TF8�T�@�_�����y�����0�K�s�������xN!w������lQ�s�o&�jO1��5��LG�"��Tk��3����G�t(����1�I<�Y�E��J`�h���)?��
y���I}51���#o_�Y%���(�����]�)����EQL��6�d�
�9��Ue]�P���^$g��:��CH��d�6��/��+A
K���<#���z?������c���'�7��Zj���@�6��w6��%=2���o��qNo��(�0iB����������z���{{m��@�I��)K�-uC��+���.+����'��1
�h���y�������Wk�n"".#���r�
)��[�p���3��*��/��8������f$`���n����r�`'�-'�k�i����7�O�<$,L9������giZc�*v�x@������o{�g����}�=���,uC�vIh(7r�P�	&7H���NP%����r��YH��l�hB5������mHJ���
�n��6}L��R\����d��J�vk�B�a��g��A��q���}I��e`�\pKJ���;D�@8�=>�'������h|)���1d��L�1"�|��f���'>���=��(��U�� KC�8�&�a�;�@�}��\pi)
��v� ���}���8�6|����#� �W)��`����I
5��N���Nf�%���v�[I&��������R��)�m����$��6��
9lc��\A���N�����������!��Au�uz�IQ#��h��������+@���`���y���bH����#��
*������I}n�@��U���n����-s���WV����l�h9%����]�5V� ��|e��	�<RK��v]Eqc	#�s*�MBJ��@;�����t�`�L���RmI�m=��t��"���X�T����v.��9���A��/{��OC�2�oeS�m���{���}�<=c�����8����(��V������^���E���T0T4���)G��{9
�6[�'nI��7��2�������<-��^�4
�(-������cf�K�}�?7���c���i|EV
2[?�g�C������^Q��I�'�������0MR��mK�V�����ZRR�-����B&��$��G�����kXI��/6����N�������:�,��Q���i��8�$
�n<���������.�k��9E�nb�q���ll�49����y =�����06ki���]_+D�z�y�ld�q|�H��)�>J{"s���J�~��#e�?�fiQ+c=�"�\����������;����z��K��Q2����W�q���7�����]�����ot����u�GF�'?/���F� 6����;�jjY����������H�J��7w7����fH�u���w����6�&��*IS�J�Ot]�vI�W���cv~j]Z?v�W��Am�����q1	���r6�5�����L�2��
�������\.�C�0��C����c+OLU��#��� h@9�4�-5C����I;�d\���x�����r�j�����j��I��7��:Z�]�vi*es��&��������r������^���7��j)�HX�x�.y6��:K�v��6���z.�)b�=>}�&^\@�����hQ������h����(�;T�~�LR1���_���[0��6y��x���=cLp�sB p�6��=wi�8��.<�~Q�������>��_�6��gSQ)�V]���T�PQ��n�2�/d^w�����2��l�	iG"�q���KT������SE+�$W�Syb��\"/&��i��������K��:�s���i38�	DKx;�-D� s��'m�H���
�F[TR�s��n�:<���!�G�����=V����2S���p(��h��	������X���:��`�'4���������I'y7�����5��K�Z�|���������}��Y[�J�)
@�B��V��^�LI��9H�9�|D���#���Q�x���R������l$5�+0,kZ]��u��T�u��?N��6�9_��8��U�U�8������F����#xQ���r�g�����d%TsYO�t�-sKQ#X9�?�f�@�N�����`~����g��sJF�����#X��Q�L�=�%-�����	^���?X�M����������g��Q��H��8qQGP�w�j1���
�Tt~�Ol�`����}]��v�N ����x�SSi�����a;E��STK���F���No?[y6��������+UB��D����_IJzG�����D� ����^�vZ�LH��wx��v�38�$��>:wd{�C]��q������������\���������(�B�Kx~���|d>$��%�S:`�OZ9���9�������v��F���Y��*���H��y&�P�"'�f�G��>B��������I���iT��Jci�Cwg����:�����@���)�����{�?���U�)he{����M��YNjJ0��P&���e}C�
v@���; ��Qy-W��}��f}dc3��#��\�1T����m����7�T���(�B�D��idw���+���Y�w���ZP��
���<L����n@@@�����i��"i���#G@��[���nZ��`�&����]��l�������=��Iq_���J5���i<EX�$D�[/�e��s ��gS��o
���
��o�n�������:���L���b�)m��K(�x�4�b^Gu�$����
�e#cw�e$����rH�P���x�G���E�GOJ�t���#��&(S-�mDg�WR������)b��������o����j����o�6|�:<�i�eBZ���^Pn�:0���
>�#����V������P�n�21��s�]�[py���)t���w;Gd��mC_vY\71�%��$��.��i5�����.!�<�]7J�i���fGv] i#<Kt�(�����j�Js"vGQ��v�����>��u*���c�eCAnv�/asS6��d"J��cH��J�kY��M�)u���3��:��p�9J{�	$f������qq�%|��<gS�����np[���,�R����N%o^�?Y�8d�����a`e�)�
�"������.�l��M����Y�0!�8p�M��xl7^�8e����4�(A�����(k���"��`�A0�C�����Kge����'c�Q�<� ��B�H���G������U����!��,`<��^�/���0���A��enr�`*I����_O)M�F��^R�O����vX6�������<���M.�Z�01�{�
kA.=Z�\�P���0��T1��;NK�������Z�Z�
8�^��w�G
���r��������^�:*S�R�mU��N��BGHW`%n���[����f�'E7fq������]$�s�N*���,d��Z�?W�-=9�8<��	����,�D�Q����q�4��gv��#����������ht�=�!�cX��kB�N$�I$�1����_3���Qz1���1������4�\��n�,�x�5����t�|�
h�qAm������'�-�A�����#�(/����cv�:(��y�v�&���ol
��P�Cs9\��
�p6�V��j���<�*�l���>"�bU������r�;{x`�i��W����[����$�
4r��<s�)��W�f���Ps
�~�]R����jd$vNLvr��V�������vPr(6}d��O���$��I������q���.�����`��"��& ��5
Z:T���-�<����^�� 0�K�*�����m��$-�@\Y�����(	B�������m�����v�r�j] ������������j�
�y��xB��4
����G������6j�;�%^N{GIF��=~~�x��%n�xp�5��P��{��T�Sh�?J~�2)�lksoS�����a *���7��!�r��OQ��=L52��C�bnks�6
�`���YP�S���v�M�7��6F����I$�&�I�����#�9�RI�$������%�?��1V&��s8w����9�p<��{)����h���FFNW���ii!�&�T>
���+����&�����V�q3q�]��kY���L���'Y8��{����B�s��k��qO�MT-�����Z:�����L���s 'dM(��<��������E@�OP6���r�����`��Q	�E������
�65�Aj*;N'� o�h��YH7>��Q%��t��-W�<�k!h�$P�����){�
hRM��'`����X�����"o����r4��S^���p�������A;�c���A'u���\ymS��4��/2��n�W�����9�����{Otj��k/&}^��os���#qL@������%I�N'��y6��.�r�z����2#�]��T1h^}���]".PJJl����������J��9ddr�=��%wZp�K5c$���v]Um.2D���T���������}�>��/���B�]:�$�8������>pj�z:�
.��a!8r�:mW�W8��=����:�����������0��_7�S�������W�������,�.s�$���T�M��y6��g��f����������<3@���s����;��V1��L
~4}9���xc�;N��+�v4p�6�@;5��o{�+�K��~d������v�����-_��?��q����FvZ��0��������8��Zm$t�8���dk�v�z���!��^�i��d�x^n�<v@��u�����\�SL�{"�@"�.�1���v�m���G���H�T=�hr�S��a�+�CG9)m+����Wj-T'��_��Vn�G��������)E�7��q�
�*�c�O.�&C��r�P�����?��������x����x�~�mA� �c������1. ��u���;�-U`���hv�q�������0#�$�r���7�~!��"���:�����m�`E�6���
�������h������	���_�\��N%��;I���d���s��H�,����34:���D��H�C�m_������Qn����(��#��r���<�jl��X�vq#�'����w���$*�9��n�v��!�K���:{�1�������#����1�Z
>�
���3��H��ss�;�
�����8�kX���� ��>��Y9�;oq=�Z{�� o���s��H�j�>�FVj`�J����T���9�3�J��J���) ���k,
�)����2���b?�i�(��_l���a�F=��I�*5��/`���9C����1�;--}k��L�=�8��$��r��X���l�Q{"E�=����q����?25�$Wj�KH=��vdp�"����<�I7�����F3IS+9��m;��Lpi��������6~�]|������j8�4�?�3���k
�4�G"
����I�!�f��k� �!A��I�z�i��j��	d�@#��xF��?��5��EC�YT\�/�E�������.��[X�Q�s�a��K�5�=���a��oK;W��e��1p��f-7���y���L��`M��h<9���n������;�>W��j��F��vR��Z�R���l�s�!�9��X1�<�R��2��9����c{GG����O��Dn�b�8?f��+c-8����?����/�W5�h��� 5�m$����c���{s8��k@o��I�E6-��(C���+��Y{��������Y���)lQ����Cx�-cAq0��/#�L�mK�l�u�#����@�����]����eLJ��G3#,�*0�����z%�����X*D)��_��
7������5�\������@�5���\�\��o�������q�GIq[���
n&�Q�6�����;�'{[�,��>������Z�aW	����v'��F��C�C	%�Tp\PlT����Z�*RYN�����F�����1�u��i��_#C�3;�lY�G5s���Fy�"<tDlY��
N������V?�k����s���6�c���;�5�J���"�S���f <��c#�%�5����H��/�-6�
��H+�0k��o"��F��/nG^�sP���-�y�"��I\v5������8:^����ok4��8�{\��+j/x>�����2�%��������� ���I�����"�V��2��h|M��
�Dx��^��-
;JZ����t�8�=g��3�a�_Z����9yr8��9��8��v~(�p����P�c��h>�������|�2��/-g
��q.r���O%�k�)Z��DD,M�D��7-��T��8����P~����m=��i�@.p��6(�kZ�`��X�\y�>�Y����ljuZ�z8�{��F�������,��*$��hV���+����o����MA�#X3��l����C�������MZ����C�qoQ6st��3bv�=�t�I!8������M*`����9Ir[�5�J�O�w��70������4x�
v��
�t�%f���^��F	�����t���x��b�������f;���(�����<C=K_�hs��7.6e0���w�%�����C$D����y�*7g��2��-p8���t��kB���p��+*�Z��8��\�4��������,"���8�
&���S���po�l�/�5?�������d0��$`Xa��c�<+l8:f���x��j,�cv,��\v���D�%Hp�l,\Wi��d�����.���XEGM#����h�R��!����7�m��o��(Sg0l���n���4����-���	}\����~cgS�:
�
�����F64�����]�F2����V���q�]��m�h������a[�-p��uZ��T3�L3�9����~�K-K�E�G>PS���}\Q����@\�����y���Mv�Z�f&�sx�#�k5�^�dj#����>R�4���?2����	��>���r4�����T��h�;��������������8�m����-�:�_�}�Z[`���6����Q�O1����m��j��x���������,�	�����7�e4w��!���[�}Y?^G�:���������J�\z��]J���{5O*l��(��./�%m��Ym-9�(�h�9�kz�T���\��-���s�B\}6
��� �/�|C����$C�e��"
X�,���is�0�`�P�����"�c���3a'�u.vS���O��`��P���2������XAL������5�����b��6:��l���SD�i�6��I�z�j:�����K����*������y�[�it�J������[��Z��������}�Z��W������csE� o���#�@�^�7���&clG]���[�:����[�:����[�:����[�:�������[���n�z�������[���n�z�������[���n�z�������[���n�z�����c�c4����,f�|�sZM��������=!l�a��������c%=S(�8�6��k`�[R�D�Wd�����<�l��p��-=;F��v@�g�������$4gk�=����'m���tT��X����K�m��{�E%s���9W���G#��m��ib�f��l`��y���%����H�Z@�3�RO|��V��F#w�K�z������z������z���\�H���>�G�l�����]��),�����3���n������nh�ox�>���o���oI�kY�v��S����O;�
�X�MKW<���@��-���X)����s���CU��h7�le������[�-�
V�/6F47?)E��NLz����I07>y���r���J_o�kN�c&s@�H��56!���L���0��m����S���:��}V��S�O����~��[�O�>�C����o�u?T������U����S���:��}V��S�O����~���:��m����C������~���:��m����]���So�uT��G�6��Q�M���>��cB���4����F���Q��#t):�o�/��
�����G�e:4���k��~����L�_����o��,��g���]���E�P�}_�n�J��[�CU�E�J
���,s�W}S��2P��S��n�P���n���>�v��S�U���^�������@>�v��g��[�A�}_�n���E���>��[�s��U���W�?���k�W�[�
{����}_�o���Q�[�~��O�������o���W��gO�����gO�����gN�>��[��kI����?Y�>�vt�c������n�}V��;T)�;����x^y��3����:�6�����l�����a0�����U����S���Z��}V��W�O���j���[�-_�>�E����o��T������U����S���Z��}V�E����o��T������U����S���Z��}V��W�O���j���[�-_�>�E����o��P�����U����S���Z��}V��W�O���j���[�-_�>�E����o��T������U����S���Z��}V��W�O���j���[�-_�>�E����o��T������U����S���Z��}V��W�O���j���Y���gpj�������HL��
��jx+��"&+��t����4�������:^E\�-T���s)UDOi?�[{�����]b��.�n�^�wb�[���������v/E��z-���n�^�wb�[���������v/E��z-���n�^�a��p�U�1�-�~����z-�^�����^����e��[�����^G���.�osX����YxQ�{���(�Ag�[�x������-�<g�-�,]b�������z,v�u[�F:E���u[����-���Y8�������|��k�:���!�W��M�M�_��K	��>�{�������a���f���o�[���}>���1���~��J��p�(�i������V�t��d���@�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X��$]b��G�-�}b��G�-�}b��G�,�-y	x�m�g��7:_�����>��mS(�RT���P���)Z]F�3������6Y�m�oP�q�B���w�-�oP�q�B���w�-�oP�q�B���w�-�B���-�B���-�B���-�B���w�-�oP�q������-�B���-{GP�tuwGP�tuwGP�tuwGP�tuwGP�tuwGP�tuwGP�tuwGP�q�B���w�-�oP��i�h6\���7�[���=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���e�0�����o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q�����������G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz��6�Q���<]���fl�f��2��9ZW!�Ou-�xoO{�i�=*-U���,���D�����Z�_��P�>���\���C���|��W���:�7�pyh5��qQ�o�R��Z�D�cR�{�Jh�#��[�@f�Ea�c�i�����U��Y*�Vg]�-����~�h�l��N�W:?z%�C�)w��S:l��vA)~���w�8�%g������������7^v��~1�Z�G9P�"k�O�l.�3]�h���uW��L�d^,uuLd�B.����=��C�����4BC;��ur1�7)p�In,��-$u�'��!��&v����]�������i���b����0�V����~����lT����M�1�H��.��Sm����>v�Z��d�s=�F�DtjUI^KxkW�d5��$�Z�?#��G`!&F�������\���C��H��t�+�(���4��H����L1�U���i�C�����B�0�$�F=�����|75E4�{��8faD�]o��5��#���b����T�>&�E����l~�*��.��������jYr=�K��m�n[A������{�m�c��'�;"!��:�w[�z��+����4�RBod��7��
\v-��|�;���OJ�J/�z�ci��r*!����M>!��qX0��r��M��u�	���`�IS^�I��h���4��/��>�u|T^ ���4�\�S�7��_��5���,�U����T����)YP�K�]��c-��������zd����:�_)ni^�j�m�Z]1���n��`���h������q�����|�
�uf�L������Zd���a��U����K
���;e��� ��<'4a�D�������1�K��5����iftn�k�
n.k�f���2����(�Z���(�cUPH���%�E]���9\�
�����sy.��MX|dD��c��E4E[�D��B����v����_��T�?�L)�`K��xq%p��<]E)o�9Q5-3��f��&yp9�n��������I��\��9#���gB�f:Q��,i!�}���vz
�]'�(���h{�u;�%�U�@���m��GE~�]OM�Q���V���
A��v}������.��N�X�j���Q;�s������r(��u{�cb��MT��������"��*��O"��Z���]GO��"O��\��h��b�Z��_�:��o��,L������!�������OM����rYi!7�sX�q��������|�)���Q|3����t����ym��"��������jX�������\�����b���_��$n�!������/��~f"�A)z�N6����U^+����x�8�r�Q���n��)��d�����I���������K���
�(��]++&c^���&�"����!�"���3*��X"l�(���
�e�o��T�k5��:����b�W���BU������5��"�{����){�����8�����jX{�r�q�oj���
A�?|���X�b���9��z�o������N���YH��0������9��K���J���ZN��b�,�������c���5�w|�9B�&�51����`o������Jbt�k|x�_�- s��U���j/�����8�����8#t�iG��8��-]Q6=B�Q��J��j^#k���%w/%�/�
��>zZ�]7 �q��p�?)��5���>C��ok���/��7��DS��
���x����s�h=�������Z��A|�����\.K6�J��T�����1�	o-�/�o�
c�����%�{K$$��M�v�G��E��W3Rt�'jx�$�$}�^�v)mK���s�:�l��PC[�1U}�������(��uD790��t*B�xV���Rt���6Q�PIDKk�Sv��75���2����������%\4M����bo5�N��F��[��������>�GFi!lWCpk;�f2p�������y%OO�?�S����//%�o������jq��� �
#���t���Z�&�]G�if�_+]��������.���,�����9�rAR������~�D~1"jo9��8�qcW��N&7<�T*�R��\�4}N�j_8��|a�'
�.j"�n63Q����k"g����8�!9qK����+�+$^)�8���c��W�����Z�A�4���s$��,�I�O6��.��z��Ee{����%��,Oq��M�!K�'���j���dc���|q����;0��S�e���q�*��$M��L�7�Vx����j��CY����F�	�=��"���G�i��h�dM=�8��K�<�|���z�EUA6�����es�u>�^k��x?Uq~��U>z&���G�u�#���������:_�����-�E,J���7#�
�u�Oh���?��(�2h�\����s\��m��!�P.H��G7+���\J�jj�^�i����{�<S=�.��fF��<"��A�uk%��5K�I������"amJ��s�bf�;�D�y� �.������i4�kP$&�W���g���h-�>��d����P_�-
6.�%���Y����g�g�w#����KY��m$���m9��� ���>�����-T���K��c�,r?�b�&�8����[�LOi~%�����E$c+D�
�q�wZ*}..
-4l�&m���y\o>G.�BZ�N\�C��u�%[��<��t��,2�8����NKV��g5��\u���k�p�(X�M���o b���$�([�(�xe�{�Zi]�_��|g�q��ki�2�! �F�w�I�:jYd��
�QER\I�`
�r�xW�����u|!�|C�,�Ib������B�-�TiY`��$q�T�d�@~��M����}�|?�o��}Z�+�����	��(s�R��F�������-l��HfnY��O�q�,�Ls��Z��^��{��������C�/�O-<�� �n�������m���QH����8��Q����)��;P����.�6� �]y[���MC��I�6�RB!�����2r���B��l��g��Se��dW@�h��Tf�dj]u�����t�I�N���fL�H�NJ�9��i�/��~��T�5q\���9��bqknDT���dq)�l� �<mTZ�t�����Oc~c������7���k��>$N�8�������
�m�k^k ���A;����7E�H���#����wb�P�m{��YIp�4��;A���Q���Fg�L���@��{$Z����kP��3�����,}8kS����Um>�I��U�6�Y�B	#!�D��k���x��McP���A	�2H�{3�U;w]�� C�����< �3�w�����\�Wb�MN��5!h�n-`����
����C��ZZx��fT$��U.����Q ��:�B�_���8��c1��W2��8h�����v�\�����]��}�<@��U������!$��4\J��c���m#����Nob�l�	�F�VL���(P�J���@��\�#������T��z����Mw�#;34!F��\8�kzDe�Z��`Qd�0>n @]��
����6�� �& �89r��ZH(p��r����s�,2��8���*P138�� ��b�L�H��B.m���B;3�7t�i�/�O��tDG#�.k�:bb 8�7�pkl��@��s�����EW-[�YJ#�Ah����^BNE�lU�
4>.@F^0q�s*f�vl��*�U��%�T�+Z@a�I��iW�����
�{��|\��\�2�z�^D��u9��"�-&Pq.����v_h%������kQ�����73k���2(�zf����_�k�k�y]>p�$pld�p���m]C�t�aI�W��p"����[I���|���u�WgF�)=v����A#�u�����JA����];����������%�4�;3�K��233SS��v	j�a����=��@��bn7#����z�q^������ro)j���B^%��0���S1DM���P��/��A!6`�������|����{Rf�.�H08�mOID�*�.��p�Z6���:��.bS0�B`KM���S ��������ZU���qa F>�� $8vP��"����gv�����0�����"lU��
ht��s���F]{�,=����^V���A����:5�M�#U�^o��s	"<��{Lk�@���"���nQ��������[kV�t�����v�����U2��r�U��CO�p��L��<��B�j���
x�f*Yu����}*����2��K�k����@U��(�������g��B�Ci�E���yG��[�w�	IZ&�����r�3#a2$3Oe����8���(h
M���l��������o�@�-�7��dv>y7��������%D�Q�\���-[��.Pp��5e`�.M)����F��C3!��\�(T$�V��w���h\
��/�Rs������i���=Q�	���	��"5vg������'��VF�*��k�^������AK������T�����V��Q8��T��Z���vkj������N
*���>TSzr���J��!m?�U���/��3�}�����,��j6Q.�^9-�W�������lv�xj���ua�
S���{�A��@p_x�{����r���L� �g*�0��;���o����.D���)����G�_�������pQym���T���"a�B�sd_�M�*��xi�q�r���yp8��m8r�I���=�vY��"�Z)%E<ns��y+_�L��������|CH�|Y���g��.\m����04�����������sneKPh�����V��4�'I�pu��F�\Z���q�_����A�3tX�����������~�z-���s'�v�P��.�V���A���2
����������Z�M��@���|��������������QIp�����I���M�j����qEC�8�����^�������j*I�k^���~(fe,E�8��2�w�C���	 !3:6�s���R���i����;�"�� 4b\ph�|�U?�M��o�L�H�*dzby�����/�PgZ��.���dk�.y�2�PJt�&���&!{�����r�0��|-RV:��RI�.t�f$��5���q�H6f�X@��S+�@�Zd���#���9M�
���vZ�Bn��
,\��)hL��bZ��ul��a���DY�r;���������9wy���������dLN^��(�()���L%��Ip��+�}�DvRQ�.n��I1�����[��������sNf.�������K�l�y#-�-���5�3���A�#+�3	}��KWM���5������2������;@5���)cs��������z�K]l���1fK������EV��AV������j/���j}~�����0�}�3���"(�6���
���?�U�g�Ks�f/�0�o����H$�C]�xx�5��/������2Td�qA���/iE��7����i����:U|������F^�\�jJ.���?��B�)/��]�m��"eo$�`�y����`���T���j���s�dL��9�S2�)ETSj�*���q�2����I9�]�cjW���B������U$]r�fkJc��KZ�5?Yhf��^+-��F8mQ"8��1U�F��;N��7��ifHh��D�������'���<�W4\Qt��:,�AK�A��s���R�������TR�����/��
�T3J
6^
v�v{���w-��U�h����C�S�UQnB9m>�Fs�����.���V��6���c���0u�8�*�E�����2f���2&\��P*��M�i� "��m$���8��K ����&��J���-
]I-tJ�

��q���C�L@d��I=DY���=
���\�������d���R�/������;7r�i�������@I!r���%��� 0A��j2��K�����p��
B];�Iyf]p�_��[9hj�h@9��TP�b�&c�p�f��T�KW^���D$W��87"������h"G�(3v���$����r#����E��j���V���]Ns�b%���(T#�i
-��5�jF<�GA�>��$U��^q(CO$IU�d'�#$�Nn\��C�9���J�l��Y��-���*A7�TS��6l��d*x7�3��q��p������,��>W[�W�������z^9�b;?E��f�����|��b����r��������cL0	w8���e.�#K���Q��Y]l�����,E�q�Xe�;1y����-�`�����o������\=(=>�����&]r]�e��E�i�������m����e�=	wG�l%8�����t�.?.���������]�%������^W�����n����l�>�����������;����uRY%�Y@# �Z��:�<9�k`���	9��[U�Tc#��e�`�62�C�..��Odv� �H�nw��������?Jui�\���=����8��Z���\�s� O�
28��>{dpr��=CT�2�����*\E-`����S0�&����	����Y�I��i<�(����`���gQ�����"��/Pr�j��26�X�jn$\"U��R���z�CP�m/�r�)�k��#&��2��\��-IR��Zo�� ��@�~��@��)�7j?�L[��{��������ze�-(�A)�p�F1e=��sZ�^	����'=�XV�r�)�|<H\���z�L�����@Q���"�� ��d9�T7��NU����%�Fo��(_�a�n*���4p�yNl��%@ka���%�����������"���YD���\���8^r��d�P�7mgN���f�)�D��������!�Cb��;Q��k�������wm�cWHs)���eE�P�.K9�!2��#r�o�@�	��[���z�N�Y�V���i2�%�^��v����fr���\��C�B���������m��T�t�x|${C���0%��v�(+O�"m)��"05�f.������$������OQ����6V���l�7s�E��}�����4�p��^C'J	yhk=�Bv��[��u@������26���������,�qB)����S�#T&�qU�V�<��}�j'H�#`
"w<;0%K0B��We��������ts�b6UkZX��q�=������\T��M-|��[�^����#�aH�.(�)���sLA��sJ���KXAvPI]��u�<Z:�\er$��D�F��� �848�������M�T�����_x���G*1����B�a}$|MQ���5�soV��I�1��J�`�Bf�Ly|-���J������P��/�`�S�azm�j�����8�w?������`��-��[\����]E�p>FU�gJ$*C�d
��05����rL\��v����S�5���0�;��{��x�Hd9\[�@�@�u��]?#�����9��
�i8��
�|9��u�s��[x�*�v�p���K(�Wei�kW��ST>&�W5Z��=�%��B)����2Lr���s�\$����A%�+��������5���>�4HT�"�X�pV�����%�����fB�*����i=����2s�sq4���qf.P��a�y`q7*i�{	��N5�h^�)��14������K�Z8������si��q@g�@�H�B��x��w%���r���#���Q�m��<�������p�����h����1���{���L������w��q9��n�����([�sk���.)�<T!n\���oi���NmK]��-c�W �Z���Bsq)����*��]&O�p��������6/����ho> x����h*��9��U�> ��E���K���A|Mle�-pP@�/�HKx����F~(UF��EP��v`v�p�B�� '���R��'0��E$�Hi��7�����o&�q��������x�M�.{WR9������l���Weqi!�������Aj��bK�l�c	b��b�\�6��G�At�/�����{$\A$�
V��/��G�-��(39�2�����S�h��.�p�%����&�e
����������@���������+��K���J�x���.�h���b5�q@�� �U�K�������H�_f�oU�9wy�"�2��&�������=���;�H������k$����e�L�r=�%��9]�[�����
!kHvg|S
����x�X������$�����`ol�����79ah5
W8��g(�|��0�3{�s[]t���{i�m��n��=W3��-����Rx�M��}�Ue1�L���I��X��h�1������P�/C�\�F� '}�b_��M-���X����r[_�
���O���V��ko'�0������� �(7B�������	�����yt�0sIF��\M�+t���N�Ns&�UZ�
Z.a8W�����D���tl�h*�@@��S��������s���U�����_����i��x���U��7�T�%�mKC�.Ui
��T����s8��E$��A�pm�%`SRX\�2*"&��y��uK� @��+r�� �����<��A��}�A$��o�����o@�����9�&�#x$�")�F]�\�}��vqj���i�����[�Z��9I���Oz_��t���A������������`+����a�M�y�����E�m�){X�����y�_a-��`o���J�vs��KN�w�N^ R�Im������4����2o]�m��i	"w=�y����r�b~�]��$��mA.j&f��^�g�/�M�ub������T�����DK|]o�Hv��O9r��S��S�v�R��Hl�!.4����'��Bl;���U�G+������fk2fA��v�
U����xs&bq��@i�aK�y�����������;�� u�����q�A��Y�d����Z��r���if��0���[�P;X�%���$:�D%j���PQI���	jFg{������A9�^���*m[���W;�
�r��O�E8
j�=W����/���D��gf @okIgPl�UP������<��V69+�|P�$n����Hvk���IA!FI�P���&��A��SKR�-!%�E���(qA�"��������!2�[)-;nPP���QH���.gb����8A�KT|C�5s���ZB*��*����)��Z����N���
�m����b�������^Q��qq��kE������7�v�d8X����/�,��[���Q�r]�l�����m��?.kE\B���=���l��-�a�\3l�O��*��y�r}���g�YO7/F��a��\��,��;����������w�%��n;{���u�O�]����\����w�F���?._�����f��b���<������5��9���i��kx��%��9���N���kx�V�!�h���JPH*�	���vU<3`	�����cqK�
���N'2.����c���1���I�O�	$J��G�j
�%��DY��k���*��6��[! ���wi6��P��%���2�O�s��	(�%����L'�NN^.\����NU�:e�XT��N.+xn��q!���Zj\�� o��F�!���IDn^(6�
�1���Zhx(���I-�E��H(��D��\Au��h�.c�G�ih���d���	���(i[���u�zo}���#?l�����\<�K��(j ��VjZg���L����8�����E�a��!��4'�l������KTk�������E�����h�G������B��8�OKJ�c8h]y��'����?�w��������s�����#�h��0*.m��F�c[��Kg`���71E�6�{8��Y:}���,�� ��O=���W���O��}�T��<��8-inR��K�J����a`	H#���)�����������nC#�q�[�[#�amsO�))>��P��%���'(s�=�|N!��%��G���Dr
��	*��bZf�����2�q��w%��*������[s�%k��)v`�pF�PT�>�R{�(�������m*�S7;�x@��U(N�y���G�'bH��}�@����S��kQ	 ��&�����������y7�������ma�)1��
���������M7 w�J��~���K%�����}6eF���7�(�a��Z������97��Q��������W��/���������3lZ�o��d��T�@�4�ga�8G�=� .G50+���������b+�o��o|v
����K��9�� �/kV�v+�����x(����;��V����pyW�?o��%�������Z�]�����u�[��0��9-��M�*vQO�y>k@��w���4����c-��Z�}���UH�B)�^Qn�\���T)>0�:p%��bl��i�1�p�w�c�yl	�`,~[<�����������
A��n-�HU)TkL���O>�EE���/'��`����o�
k������4�w��������
�*���������������J:����NW��n~���dj8�\.�������Z�t<k�������~�����o_�Y�������l��7u���LU��p8]�p;V�i5J���������9 ���P���THL�F;�'f�>��� �����P������17�\�}�P�  ���E���Ke������������ ������FR�/���f� 
�{w���%;�r�mF�A���~��3��a�f�����w!��O���39���.[i�u�<
����{m���wg����:�D6�Q�e�yvv���9�@T��	��-MwGr�Pd�C�c����>�P@1��.fM���p����<���yA��Dm���6�'a�9,��CW���\z���
C���*l�\v�E�S9�����.#����Z�����`����K\��n5!������W����tL$��{��8bW�|������Y0��6�%7�M��������=���6�(o����Znsc��A��8%��I-��y;���bG�� s'$�cA��������Z�'�C�����3r;=�Pwr���p�UA��&u�dP2���^D�\	��������813��o��K��iJ�$.e�"��B"�\��af�N�8lR!J�*KSAcUV���	'6��R�@<\������o������&U�uQ.����cG.R\;��8bu���h���!C��Ne���~+i��.�������6x���!pRn�P�6vk�L9��t*O(��I8����S���l"2��9@�m���i����;6���ED�j8���3a�>m��5�H$n�+/hr-<�2���AB	T 
=|��x��W�;���L��=��Q�O��l���>?��}����<��d1^+��T��J p�)\z,k&�+u���Qw��UW�������Pq�!QM�����������w�p�7���S�_�#���Z�r���P��J�K�s&1���?[pE��Q��bo�����f�Bl��1��taq��z>����jm~2���-��yjdC�7������:/��j�xRF(@yaLB+N�U���W��U��lK��v�Fv}7�>bpM����,
���1�!�b�m���,^TW���k��Q-QN�����0Q��g���m������N�l�@��O���>k#�uX�S��������btb1z9dc^���[���-�i$���C�pF�y'�P^��mV`n��*��F�p-
�n$���7�\
��!h�B/);	Ait�����S-\. ����/��E�����������xsk�V
���	�/����u������fv#�%|mD&��{����m�;�\�,n�w'�����$�l6N�H#�FP*=�GE��F�)s����\���$�so�[��c�/�L�n9��v���8��
WRelz���g5��5����	8�):w�����3�|��(�L�]�nF���`������Q�����Ps��*��b���4�yZ��veU�p\T����k��v�pM�xPvs�@����J��8�reR��n@/�����F���FW���+j�N������F��X ����dis�fs�K���O��k��4�'l�"�fo�*����7��T��3YlY����n$����^Gh�P�%���3Y��=�s�
�t�g�Dr�{9o$N�FQQza��T!�T^o(A� $\<��w���b"m����Z4�G��S?�3gP���@f@�����&��N������?�I�sw�@�d- ��R����9����������*�
���H�Z�%Y9G�6U..7����E�������vd$U9�����)�8�s�K�]P��@@�9�PM�,����[�%B_pyT�n� ��\1��a�@6�u��P����I�??�
����*T�%0O+Q�7���22(�c�7B�	K�W�-D52<�(�>]#Z�8��k�$"[W�k[�����q���8R\��e-C����)s���+�W��{M�������}��^Q����o#r����.���R���#B9/�q��m�y��9������5�����bw�.a�!,E�4���k��2��2�k����F�0���va�Q���o$�fi��=������4������F�0v)�G�C������"]�"x�<�I�_h�sr�s4)��N�����3��( t���Z�!.���hP3�T��"qr�#���C���
 `A���uYC�"�Z��	��h�QI$��O�
�&R19�%w�DD��L������3� �b�"q���%��2ZQ� 6FTq8�l�\XX���+Fdp$�����h�?.B3�.8��R�KxKU�cY[�0�487�[#ok�q�h!M�v`��������Nu^_�G;��2?�c1���8�C[�+q!NM5�Aq��@QW&PoSp �
����l�#y�
�a'-�`�� \H�0��Pi�A���W���h���i)v+.����o�+������n�j	�M1���L����#(�0KR��q������#8W;6 �5;��7���xM`�pq��K��+���m�^!�����������M/k��RH'���nSj�-��pr��gc�f�6�}�mKo`
��������V�
�������k�%�0s���"Y�������%-x������d��E\�/+sN[��1���Q��g�����=c[s��v������s'%�8g/�s��0��DP�N�8�-GZX2���ns@
�U��h6�r�$������� zld��5�{��^����i'�xp���U���[<�O�V��H`p�@S5�����h���X4�@�G?�p\�{7��_�0�@����o���{�����~��.P��n�m��	���p�j��$������c���"r�_���[/�6V�B���d���
T8Jf(:���08V�|����(m��dI;�mcI�NQ����)p�
�;l�m�&�n��-$�>�vA#.*��R���xm�.��u���`dhp�G%��<�t��5�0|����q���GU�[��8\�`-�v�6����VZ_�i����BHW��$M�5J�< xm���h.,h�7���Y����Q�P2�eq��E������w�����p��������N��s.:�	��
}?��=�M��yvE���i������=�R��	kr��(7����:t�����Q���	*�[�h���5��,�(P��;Jsa�����\����<0�����^o����G9��x ��UE��l������oT�K���x�!���`0����Y?E��>@�����7s/-�O����8cu�kd�q)x�v��A��n����NkOR��|���*����[R����>C����CxL]�y(�f@)DA���nu �B����n���o-�������
^\m����0k
4����}�����[��y�%KI'��\����zrq�tE�
;��l��3fe��E�\����d��(5�L�C�P���r��m��>�L��N�|��P�Cq8�����&��������0��M}z>5Ioh���.�O{K����'�pqw�&ss]��7"'���B����v�Ar�F���}1%�dE+p�xUB�{d��<�V��l�'�����(����>e��
e�.^U�z�=�$$��\������K�&�IQ�f�����u�S�2�[�Fl�@Z'�9�a.B�	��b�5.'2arz�6\	\9���m�y��������x����G=��V9U
���m�3	%\�T�(	r&&�S)���Do�Fp����~<�[���A@"��;!��0�{W��K<�������k$�\m}�yp�������;�����[F���������V�LN�h�����(.��
��$��8�.TQ-=l	,���H3����S�'�p�\�#��$�I,`,-�J�8l��l`H^���E�)n+z��Kd��r~��m������0rOI'���Z�[�o�������8�=���T�q!K�~�j]H^es�)IB!
w^o���Q� e��1��7��W�aT0<�
�97�1��vo�����&�a���wy�7�&�s�����zmO�x�5q7L�c�S��6%��G���v5�t���]����sP�q�����b^��ZMs|xr�����/r��.�����q�VDWvg8r����S��o{���������Z�JO|�J���rn6��D`���u��'����_x_i0��v����;S�m��y7�6���?"rq��/3W��QZ�kW��a#|�%�J)��^o9�s~���������j�ZI^������ZJe�x��-��M�Pl��
������o�.
+�9T�������pW @�-�Kpr�
o;�����.��<?���H��6%;M�o��;V��g�,M�e�a�� ;?[�u��2����������k9E��lh��C����l�~WY|����z�[�������{l��^0�����Y���zZ
�]����~W[:%�����S��N��u�O:*~�����0(�f=��wn6����0�J�c���)z�^�Ar�n	��bm-���e�i�w[>�_��S��e6C=�aS����K��	*
������0|���!�spBW-��7�����9^��F[���1
(����Fa�W��j:���4�@�A@��!���&�K��V��d��� 4"��f��gVIs��*\��6�`���pn|��<\�����Pv5����nn����&
��ri6��\�����w	��(��]�&�G��6���{?���@]�R����P5�j="����������9�vr2���1P +��"��E��6��^�q2K�l�r�D���49�����@@����89���qj��o&���kx��F��nC�f�HB8_����A�D<�_�d�N2 vR�� b{Y���7�9�	(\Hl��2���*�r�Z�i��t�7��Q}������\��d$(��`h@��7�m�F�9�����\�}��B�\�i.qq*��M��Qs!���� J�4�Gq�k��nV0������@�3SD*X��-"Irv�l��4`Z��.��L�����*B�������f�\C2 �66e;	!�{�7����y�H?$�\y���9a�q�������jz������������y--S�.�p��v;��o�s�o9J��M��C���%/�}���!��UZV�hq�V4����\U��$\�9o��*{3K�[sC� *����q���n,X���l+Ip*��}6�h�y!
te�"�}��������G=n
�������d��9��i(r���e��~��,kOy����%�����r'���I~8��j4�*�G�����w��f^�l��-�����H� �foi��CKN���P����q�%��U��?[�E����]�x�i5���=���x�m�a��.�7�b�)7���0�� �����w;��xy�e��vb0��W�x6�`NS�~������"r��fil��I�����4����W�c�e�|���m�A_N��������������-�������_]�[�%��}����{
9���/�s]����:}V�����s��������[�v6����l����i����/��o��������x����!$��3��9�����������|����%��EK����={��gxt�
��?��Q���q.�6������� b��Ja�t���'��gz��U������u��u�����?=�>�2���6��'.�g��� ����E�[���o�%�|�{6��7�z�o�l�b7�&�:v`S���Il�������
/��f�`1�+���s����}��qc�3q�J��X�������-��!�E�2��q����R�8{�a����2�]�m���Bf���(P����g��`1T
6����-M�����\�^.{r���xkU����&Q}���h��F=�h������
��KF�Z����1���UU���a���S-�)�v����^/"�T&{�*�%1���9H,\6����0�#��Q�(�S��/��@n@ILo�_��n�x�� �
�n���lge���.�K�6���/'x����
���'g��z����:��#(p�n%RRA|Sqsc�5Z�R������
�����l�sbS���02����/��N���Le_�S�r|e?o2U�	����yGr`�����oy���.��vmS����������0����64U &g�RRF$r)E��Ve@V�Ve���|}�RU�y��2p�
$������-�F����5\����ss�2�/�U2��[�-�����%��"�v��"��y���6��"����r���
yr�p����t�s����PdF(,��W�n�Sh�L�.q�9Z���T�Z:=P6'�E@*���1&d�'8�wUl�i��=��{K\����9?�������������(D$���������<����$��7�[IZ�1x��4�L����1��>��w`^bA�����w�j�b�-���o{E��	����O���~���>��KP���j��
��sv�+�}��Js����P�A�7�g�X��J�w-��c������{N?/��<%��b���q�3(x$	F����U1h�yp�&��T!��v����gx`��~��6�=P���+���d�r����<�����R1� �Z�>�������o�%�q�5jV���[r�� ��J����_��0������$�r��/��nk��Lm�Z:��������X�CE3��:��KAF�����o�����v�oV�����q-R�Q���t�]\�H�c���=�.�0f�\@������8$�N�TV�'1��BU��oL�\@*���/��A��UjUn�<\���23��6��}�#t
J��#k��X���H�	c���/��$��WP���Tf�0�����������dP[���R���r���������r5U�����c����^�5� 5B4�v�	��
B|��Vx���0>6�%	5
���	�����Qj���M#�,TfED�b�`�cm+�l$|c*��9� b(����s�r���1��.6 ���E�cj��M�N�~O����3����P����w��[H�����uC��TrH���!P��+o6�P"��!����qb<����8?��WM�]��
16�5l������{V�s�����2���5�7�mr�X��P.)�����J�^2��.#���e��{������P�����p!J���@�rsX��j
��g��n[n�R���>"f^��.D�����#%H�$h���
��f��5�j��jv�o�[ �K�'e���qoq��Sx��!��l�8�$�D����#�&��V���E���&�R��fv����iG%�����T�-����! =0\�i���xa
���i��tu�(�bT���bP��l�:"��$���U��4fp��Tm�����&���/��l-X������F� 45->�J�v�Z.�����?����f����S��P0�;��8��-E�qi<��W� Z�����e2���=��fV<��]TC`!�hDR�"�J'+������!n
7���������4�4,�R�������M�*f���j"�?���[x�Hs_@9U��6����"��i�D����4�F��b1i���S6�#���O�q �$�.��/Y(�.{XUq����]��"*����U�#pYv~l��/�Y�����<�M�b�/K�F9���+�o�.�L�=yP�9��EV��T�� ���g�r0�Q�%�����?��	W:&��Q�T�mJeX;�	�~���	C�E[�q��M��������L��V
���UOkq�S��K+J�<�(������$9���!����I�����8�t�0��nXZ'��H2�G����B���S���RB��[�~h���29��Z������q�����iM����	c�=�"����O����@_y&�71$��-�U��\I������:'���0�:C$����ysr�BUl�NjhY3A��1T!-$����e!T���MER�I�����89�|.�F�����PKqX����<��>'J��O2�������������!����3�P�@����������u�!���}��,��g��@���	[-�,1�����1B4?�GF����S�F�v�-; ks����>P3��-G�����8��r�p��u�x����`H-:����x���CZ��K{,=��!I(�������O���M���rI�1P�-�
o$A�tG]���D'32�o������8���WN�y��\�<��K@z�iv�	q�y#>9�1��9m�u��w�UT5��U��xA���\����� }0�������t�[�~��e e�z��S������xK��e��9����)jYYN���K{A=�7b>�iZ).KTVD.�J�_z]����QO���	*�B�[�!��R�V2g���\s�����Cg�/jyx8FlS�j�~Cw�N�{AaAx����
]v�Q�fq4BL��Z�+H<A�e�e-B7�^��&�����A��16A�g�������1deAm��V��U�F\X���$i|�RC���\H(��������.Ui������RI6�\�H�/�	��-5$��� 5�9M��f�X��X�#c��m��qq��;]�O%�E3��jy3�r��!{���o?2?6b�n\�-�Ih�s�����\�x-�7�%"Q�.!���m�SyS��L?��lX����3Y��71*���M)�D������F������r^mM
C��^%K�{�\�-��	h4�S�:V���\�#��T����h����,��������{o���-�6��?����Gd�������N`��(-�=��������������#�~���R	#M��I�*�4��_���0M�������P�C-�T*)��+`�.#`��T�"�n�����lc`w������)Q����yc����&P���~`��v���q�H��#��L,��"#]�3���>����:�0���-9�[�P�v}�������s�s�5O���77+Yr.c}��H���Zs'�xrf�)n�n��B�6���)q$����m����>������T�e��@�����@��7�I m7���<���/��M�Gw7��U$���3)�2�q�X�]f�8����~����v�.����,� �z�����D�����v����)��)�-(�&^E�������vmn�J�o���_+��=���.Aa*�9J��(��,���W[�]!��m�h�6���	L��IT�����w�zY������y����b�����v�1���,���Lv��1�Y/M���f���G�v9���7[���B�y�����0�*�J���l���O�Y��-���X���K'�`���d�����[]y[��&�p$��/����Z6l$��|��XJ}���o�����d�]�e6�v��m����y���������6�.��r�>��?B~�yfSd�	�p��� JZ����Q�?W��n�S�~4`�yS�����l�p�^V��bmu�v�*�'�-��]��b��m�. ���������/�K]e�����\7\9,#m�o�����s[�0������y[]o���l����o���8��J���	�����?����q����-�b���-�b���-%/i�84}���'M�����w~����xt��h��B��=���=]C�����j*Z���([ZIKGO^��_�jz8�M����u��P�^��o�}���\�w=�u�n'`���	Q#C\?T�j_���.n�}������r�Yw���8��!p�1C��A�T����zmW�����=����2�;�i8��-�<���gdn!mM�x��t���l�k��c�a1'�_#i�n�H����M�����o�}V��}c�����U��M�j8��jj����j����P�=C	��t/@���.��k������ph=����JQ���[��F6���$dB'8��^�����~.-d�lB[���,^�KQGFV> Nu��C�ZP��}��mD�ONA����f�y��W�G�2�������73�}��c��u*_V���1
�H�����B�Ex��(�u����x!��\�y<L�����t��/%�tm0�3K=�~Qu�cmkP�Z� �����U}4����9��^T��-%,�@��&�����N�L�9f�AZ/W�r�fi���J�o�P�B�H�fj��E#C�7�I@���`�(;���:�S��"��Q����][�[(a���	Lv���KK`~l��`�� b@R���p|o
�6����f�X+#�sy�����=�wZOe��o,��}Kh;agk,9g��w1zl�V���dwp{%�=����ac�6�P��<���n�%��L�����r�~�x0I�p���S
s*|����h�:����'x��z�%�yR��r�LHm9cE�h(5��������)�z��� �y
�?�j�X\K+H	^�|>�r��q��~.*!E4
��88
�^�_fx��F��9^��*������ �HqM�}�W���rT1�6oz'5*3v��{6�1�J
,���e�\����'Gf��jo����q�������V]�<���3z����.�P&���{OC���������IS��Z��������N����(�A�+��.�h���i_�)���6f��{+�s�Lm�������N��re���f�<�X2n�v����������� ���Jn��4��������p�UL��0�N��u���ny!�Oe��A�qK�Y���8�F���wh  .M�Y�~�x�������CIHa&���nO?YO�3X�R2����I�Qj���CA������)*��ES����+p��#�!�K2�����kF������I�}S������U���T���$���oq'�>�D�����-�����3�H�$���.&����SNnG��=��9mUT��D�h�����+�� � ��z�F�P���{�c`���gR2k��k\1hu������X��������d�����f�p8�:zl�U�$�V���r��)j�H��}+_����p�n��\�2�1o���qq�,��|Cs5�������N�M �	#
���o-���a����������<GH��&�
�����O���O���O����>4��<��C!@	��N�[���`k����vZ�G��jJ����n�F������G��8w�������RG��1pxe��Z_
�?
4���&0�1�58Ti���8��:-_6��$a����S��eA���zKz����e��4�~5;=���/+mj�|�pk����	o�~%!���r��;�^��Z��5�A�E@��}��wd�m�10p������U�cD�@��y��<�E�l��F�h*u��}8H��-�n�+���c�i��9f6��N<)jW���^�����3���m'i�����F�`�P�f�Ns8]��cUF��	R��6�W�9�  ���qu/�%=Z)��F�F�f���X���a���m
.�x/��vnk6z������e�Bi�]�K7����]���m��lr�L)�W�����������;��)�X���kg9by@��;��06��Qn������'�uc�D�]�s�IV����)n����[�n��-+��o������(���8ih��FV1��Z�r{A��L�J����Z���|9� S�1�J��@��u'4
Q�hqELmI������|�� �����i���mGP�+��"{�%�U�h�}KAh5P�Z�K�w�����w�j���oG��&<6T�%�#���bkTs����j���>02
�x���88t���v?u�|_Lx��������.�x����i�y����m�m+����"��B�����%�����m>���)+^����"��jJ�:>���>o�8[����y,6��{�6�}_�������2B��}�gx��R�%0	�'���N���Q�<���U���I~"��df����G�T�r��^x�6�f�����)4cw�6'-�7)�Xs�_��m�+��.�qA���J�R�I�{����Y\����CD>6��!4����Zv9}�/#u�W	VH?����z��w���Z.!�8|����S���[��^M��@����j#�9o�oa���yG��������m�6���i��z;�r����uMp�����u�q`)��M���]R�9{����P'"WO�H��v���qk).ici@��c�R1�h�F�H����j��K�c����mk�����k��8\/
2`I��4][�dd�Ko�G\z-�TD�B#�i�����N�c��1o=��k�
�-.!�-�m]=7Fc�J�w\cP2�u���-�����^�Xv�(-&��3�u�\	)jO��TG82&V���f%���&��D����n���G<I�����V��#.d�mV����t$CQGR�
����wE���W5�<��

(9�?�*��$a�������/S�5USx1���/6;q��Xq.���s�l�v�(����*pIs�Gd4�����iU�`�R�_�0F{c�V�C�w`	���ZN���:'0v���[1��_r��x��j�W��N�.���`C���jj*��hs�&w��
~|����wtO0%OE����m�j;e�f�9�pK�O�R�X[������,]d�.'�1�`��[.�dhKe{�����x�����{;�u�sx��v��_��#Nm�N�\�����y
Y�.�v)r��6-`@���Y�w�l�h$�!M�d�wl��b�k�.<��H�<�|�&X����d{A�l#���n��X2F�T�X1���7��A6�}�����6�>�UDO��"�{���P�����+�5���DYT&I;����
A��Z��gh�������������H��4�]���Um�#���O�z/�V�����g���s�������i���5��^��j�L
v���yV�0���(^e�1iD�9%������)9��Q�m���@�Z_�M��e��#��8���A����t�
MU2T7����������*d�N����8������x�]1F@�H�n��M���}F2c�b����"s��|���B�r��o��TV����.������H[�U�x�2��$�3���q.�j�������!���*2&V��&������C��G_�`XI�nC�g|C�����g�nYg�����"����^ `iGeQ�6�@����R�$��<)'�?+�-���Nacy�]�]�S���K���)��G����+�����>1+k)�OO~&�����{Dn�*�*� ���>z�x^��>q�x=��|N��F�	/'��7��j���1���i�����}�s��Ig��I$mS�cd��6�8�9��Z����i> �X*je�${�}�M<���&�����������Fv�<�������CnUU����T�(�H$
gm�&B�����5���9�vgqzt*ty�>�>0��R�i�GR�5����h���!���mU��p[� ���_��S���/pF����^8�E^�#�����
���������N�{��0&�,��������7���B=�6B-O-P���	�$v	�(i��BmY�1E4N1@����9	����U��2W��&�����F_�Z�F�b����s�IS�����r�����U���/����[��(cW��#M�dDv\6���������3dm.'�6�~����I@LT��*�
 as/^_�|>�?�W84��}������	�	d���);�ZqB�hh����e��<�����U�a[����m��*Z[SP�4����@A��/y@�aj��3SQ�����=�|ER2jZ���F4���������q$���O�Zo��.}�D��a{�;��?�������N~����=�����.�8�Z���tXxKp4;<Y{��.Ar�E����]�vVS��/*\:J[T����:�T����.b[��;G���s����T�t.A5S!��$�xq<2w �a~6�N�	����gl�.cd
���m��/����z<`��/c�
�9�m����1a �X��&��I�Q�z�M�/����W�M0Q��j�M����S9��\����=g��7��Hy:�����x`�������FR��s�/=�YK�Q�����oM��C�oGJ�q����cq9��F�h�?I�.��WN���DT> ow>��}���u��`��NY�qS�r��ht��	?�q.w����5���?�:�j ���9D�������&6����m�������
�]r������h$��cmG��8��F�8.�4��r��w�����R���a�������42F��z�H�@��i��I3��V�q�T�C���%ET4����}���;�Zo����F�F��=���2�d2�����4s�F�U�����N����P4o6��x%�0��(�V�������$�����;%9�I�=EZ��@�D��=������)��4��R��m�]S�����{�^������K���\m3�`gK��'�([^K`/o�CfNT[k�!���G_��8`C���y��,K�\����x�Q���G+�������hqj��Uv�i_x�o�����{d�!����RSV��i`�j��k
������61��F����i����
�BNm��_��0�t�45���`�	����]?l��H�Z
����~�5V����!j7���u���Q#�I��p�f�����p�����b����F��p��GY���������WG
��9�.�
_�n���L�����N�K�V�$����;.#�M%mAFD��y���De�VJ ��J:-����n���V��)��!q_>���8�bF����lqF�-�<=M(�����2T}�j�W��c����22bU����/�W9�IR4�xj���\�����=�<w�07O�`.�"�B����Vx�������/��4u'�E��-6���Ph��0�M�����5c&�D�T�pe��^F��=0��t�����C./���]0��B�q#h^[Q
5���N�i/|��#�u�c	RR��������L�������K�G	6&��o�OQ��k�{�d��qKZ.A���1a ��M9\:��G�
y����i�8�!����@[��W�m���4OT[s���?n;�u��`�xe��Q^���f�U��Uq���74��J�J�3)�is�!�I@:�O��7d����*HL����8��*2:���%�\�zm�"�W)
�N(�X�\�I7�sB.�O�_�����I��sb����/P��<m���5��-D���^	�1�7-���M��_�8�;�b|�u%7��<6����o����G�Dj&���L�����K�H������jnP����Op,/l�nr�@����m
3Cc��c@�����~��L�4��F�w_+B���'-��EZ�D�"6�s#������F������"��M��FDz�����H\�hL<��P�!���{�(����������>WE���p@���@�X_5K���M��_j?��
����V9��!
Z�P4�U�=�#?���U�����u��y�oi�$��^�Jh\b���X���BB��4

V��B�
%\zS/9Ki�#Z �>T�#�D�S��>�<F��20�@�b\��F�����O�j/2OP�=�;K��0���xj��">]�;���F�#�|D-�����8YO�qQ�}�3>�����K�C�6
m�~-6����"J��dM*I�D�~��cK�	�ou�hG8r����J}�I�K�]����Y,��R�p��6B�(ZJj~��7��n����}� �"vA�������Z���iW�Jd.%]�������Dl
��N�� 3_�r���"/b�����\�I'N'�OI��2���1n���u-m�(B#�b x�q=6t�s�$���O��,?��{��w������4�=���i�e��P *�74��&�6h\�^;G�:7�N������
���r_r&���6�F����k�����Ok�
/Hi�R���4+X������4_gN����6��~X���.�p7/-��0��������5�V?�����RC��<�(��H���|K����S�'�O��:4i4��2Y�8�h���6�����@W��9\:�r��Q�4��Aa����M5�`�aW�=6g��g�����,���(7n��S���t���Bb�X���.�����u�b�8�MGO�:[�O4���2w��xoT�����#����Cgqe%N�m��G�55mLT�a��F!��y�%L�
dLs�N��6�>���~�����a56\�?�~,N��j���h����j/�

���������T$`w��0�Rye9x�9�Hb��o"��fW�N�q��si����>g���p�l�O���J���Wv���vH��v(��|o��������c�'
��o��:k0�;��\��O�p�f���k���v��j�W4GW[��c��'z�ZZ��i&{��v��O�������q[?��D%x{�D�
l��d��fS������D�����q�Zd��{Y#{2�����T7��������������==6cS���7�������N��*%gm���)��A���|�)hl�,���R.sW�Z����J��sn�~i��(��'p���$
�����i���&6������cvC�|�7m�?����}�C�C�3���`� ��JOP4�3�s���I���mG�[����;C^��N���C��������
�j�����Q�,�s�zG��[���un.�w��&��W���u��AAM�?���9U-���j�q��f%�v<!��Q�?���k@�5�������v ��i+*\_$�.q%I$�$�i�����`��	Z�E��Q��Lm����$2�M������d�������g��Y�dk1�������j=
�ee4MgJ+�K�?���.�B8�7��*�)��>�v���m����t�Jc����{o�3��[S���3x"q�6���B���\�qt�29�J�	(:>�+�5����j>9�3�t���{���'B�yG�GIL��$pk@��PC�z�k-U8w�a�rYN'��!��:��i@��������Qm'�kB!�&6Z��Z����|������5#�
9��	�_j�T�����W`9����*���P4�!���`��P�>�Ux�������P����r�q�Mhq��
	��h��k��N����6&�(e���1p���`$^���>�+���N��cb�0�O�1����w���������ak |}������p��n�b���`�psO)c������)Jp�Qv�.v���<W��m|����KKI�R��"�yy������(��S��#����u%	�������xj��a�#X�����[��{Z�	��aj��<���U����E�rb���.�WU�8���@�
�<�o%��m4�:��k�#3YM�Fq�qM���h��K+f����6U84�����D����!ECo2 ��.GvI�-8FFI�&��F��y��$�27������
��T��j\��c��w��uZ�s�EM�O0��W�����6�3�`��W��.�?��s����:;�7�o��W�_5C��y%�}~j%���"iq�����N?��Vi��-R�~�V��b�{�cJ59�_?(�����^P���&<:��6���?�<M;K�W����H`"�2$�~�D��'�����r�z@�����x��o	i`��P����$A��_��G��,l���xn
���e�~:�-W�q(4!�3����y�\I<����\�M�[#�����=��p��)m��*\I'y8��C���Z	'�Zo��]/CW�8v�{���z�g�xO
�d5�vF�Q|��P�(��E��t�|	eU41��+�!$���(���r�Qxl)<>��|gS7�P�&f����	@8�T��}F(g������p��Un�QC<����"vR��q���X/��1�����r�I�5j�~'Uy���)�GU���,�^��4�wq�`V��-S�=�������Q������;�+"`�����i���F�HO|� U\n�o'���k�b1
[��KSWhW�i.c��\r�L/������������&3M�����.�T��eb��6�����ZJf�>���o�����0��i�5r�Q9e9����<�������&��
�8`�UWE������pF��h�
/������)����t>xl�k������qUE�F�0��6������g�)=���Z�������Z
7�x0he�N�����[�c��{���[Z���Q�i=��	 ���s��k���P����e��"��qCpKT������yy]�n���3�o[@��c�t�5C[���M�]�l�;�������%?��9���_����:-><������\1.>��=t����\�,_��z|���~�A��c��9�W�mU�k�'P��������gM)%�$�q$�W����kNp��]���
��h�y����8�� "���������	�K���;�Z�����7N�k����G�',�����Q�~J�@7��h��]��i��7�a$8��T������c
+e�6������������?q���CQP��(f ��������=}8�9t���6�RP8OT}���sN�M���:�tH�O+@��<�S`����{u��e�����of�,����������+H�22/$b��UP���K�M��T�7
����6��~�(�I�m��z�z��'(��q���R���i��\���mk��_fMW�/tt��*��~WrZJ��f�W8���I���^{�|Q80��h�6��:��W���K�@���Wt�S���v�8����~E�N�=�NM>�p)�0���&
|��������
�g��5.�I�:�2?�F��<���fAq�j�i�u>#�4��|��)�E�~��uj8���'������Z�K�hlt���h�����i|��5��Jjo��5�j��D�n���q��|�S0�{����~������F��?1��NQ�4��N�x���o���-Q|:ip�"��;-Q�V���{��W�����5�4���hSmo�J������oE<�w�o�_z�)hn����<���vPB��j����9�����'�]��vy%���@���W�CL�����S�On�{���+���6���<>Ca�����������������}!��OT(��F�6�������,�1|����KR�{Ka|�/
	�{���P��xY�j�OzR/c������='�a��@=��}]?2�J�+�PSc��������B@h$�q8��~�x3<�k]�q
�(6�e~�80�35���QnR����sJ���N�R�`$��6���c�J���do����!��n�.KU���.��G>��n��~
Ph��B�K����1h����p�����m[]]�P���m6�^�$���{�����������>�������x�=}S�X4����wG��[����;B����<H�cr����9-����_��������7�e�z�� �B��KC����;D-�������'����]]���r����*O	h���ffSD���z��A�����ad��c�p�w�����aM�/Er#GY�������y���U�0w�s�d�c����-C�D���f�gD!�^�815��9���|����1�?��[:#�H��*���so��<w�Y�)��~Kn ���z��x���<\Z��CZ�5@Q����C;�pxN�s� qh���l�;S9�cv\X
����.�������8j_|>$fm��?�����'y�r��j��8��H���$1�
O)KiUl�d<A,}�g�31�c���#����5�9���p�Q4�t�����6�s��
]�����b�s�E��7���]���9�d
(�RO"���j?��F�#kF� ����4n��5^}�bp�)��b��$�'N'�r��7�e6d�������^i����_��R���I�2�No������>C��e���GBSQ�X*��.��x|o����W�}Y�F8t�S�5W,O��s��E�o����lU:������)����*w%����&��>�';�Jr+H�KZSy�����s]YQQ��V]���o�y��������>�kX~Ns��[�p��:	q��8�G��������h%�;��N�"����O���P�����.������M��qq��#�-�+����MK�77�i����G����B��f�w8�fbl(PWx�w+����r��P��� ;]����Y���A�_�\bao����W)��q)����y�Y,�����7����a�=���k�76G�\])V����
����<��{%t������|�>���.�~D}��?��)�p��@�z��a��~[����~d%��f��#h��:��������Mw�'�j^.x�N���{*����x�3���%�Br�3�l����mW���F�Ken���9��i���:�����^��wp�ye���?�?C��:q�?��r��-�/qRo?�;����lO�F�G��������\��mw:m�Ud�Zra����G�V�r/����YH��{�@�����]Sd�*�9{���v��
������
�tv�;/vI�������
s�=?��d�e���Yw9�~��g�/<���g���W8��p�4���i#kq%�����uC����Y*��8&���Jo;�&� ��3ve=��ww��e>~��w�Yy��&cKX��e�9�sZ
��jP68Z}�y��]����>�s��8���$�=~F�������ZZ{de�q=^��C[y6������^���������v��>���LsD��c�mK�_f��g��.��3'y��Y��V�
[^���`��2��A��k3_�"a���fn�V��@��7��B	��F�V?�lp��p�_���i�7J`�������e�����`/�g�5`��k��/|�A.�c�I*zF6�jb�4��N���(��8ry#e�N������p�����~�p7�cd�z��E�0�>���G��wV����~�����%�t�+�TP�*��]$22�^}��vm�e��j��,n�:&b����<��U���6��X�*��<{1v�P���f�UY.d�|�������Zo��'������
,���t���8�I��y>}�D��~��~r,c�u�h��[�1�h6���v��S�k�w��0�������m?��L k� h��fo}�A�q��<��k?A���"�`h/��������.��0�E��wM�~`���R�]Y����f��u5���Dq8�y�K7����������������K�7� �%�����Tj5�@LgxM��-���f�C�O(u��t*
>!�p��A��h��EQ���
��b��s%]Dq4b\���"���W��7����N���
����1��:w��p���+��v@�����A 1$�	�}{N�#x���F���J��E�#���6s:}���=��e��u��4���^�_�q�������RO
��#X�������#���W(��lkw����@��!����:�������6/���{��Zb��Ls�a`�xR��;���M��%��(<>�Kf{C��y��o�����������`�6�;;����6��������4���K�6!C}��Z�G��`M�3���L�����Kfy$����^@�2�UF�?h�
���e��rP2(��N�-������$1����K�A�xz7�U���(�-������m�s�y����>$�v���2�2I���,��#�z�j��i���	[|�</��D��~3 �o�b�J����40sX�OQ�U�^B�%��G;�����^6������6�s���S��,����������������<4r�,��?�y�T|���/v�9��a��
6�����[��������6���`��MG��R�����-���_v~��h�|C"�V�irG����`b
���W�&��U���4�.<����@$pj��,�K�����?��R����*�9�e����
m�D���x
Ic�<]�PE����zM��O}�j:��~���6XO�x:J���JQ�yi?E���'�R���������6����``��,N��O.lU���o����q??��a��>���
ms2�[��,�?����s3[�G������6q�4��4�=AM�����
dO�BXp���vU�5�o�.�_����
9��)^��U&�a&���x��;� -K�y��cs;��	�	[���i��
4Ma����V�l������3��rO��7���������4�?���\��ms�}V�7}S�����;�os'�w���O��U���Q��{�>��V�}Gz��$���[�I������;�oq'�w���O��U���Q��'�w���������}Gz��<�Q��'�w��)����[�y���o�����U�����V�_�o�[�y���l�����7�� �4��p�2�,!��m '�kS�XI�_����	
~wC~=eN�������GN����h3j��],�-�� �����v��X��sf[����i�lds,F���K���	bf��]�'�?�Ll����[,�
�������)�Y#hh�	�Q���8QH��M��P8����=�C�x7�S��w�X�#��Z�k�z����T���7�G���S����l�	�����f��Z���'����u�_��f����V�i��)��v4�����U��H�r���4
�/���/���z����i��U�^�o9m�ShRB�vw�����Y��'�4�8�D���p��M����T�{�
w�XI�/	q*�l�P�6������@����6���hx�<�-������!��76X��W�M����Y��C�iV�i_O)��U�\/%��/��j�)�b������E����\��������k���oq'���OE����{�=�z-�$�[�I�����oq'���OE����{�=�2z-�d�[�������n�z-�$�[�I�����n��E��������:�Yd����U�{+9{#�o�mwCG���j���k���?���u��~�$�ui<���t��s����-Q�6_�~���������Y�iOC��R�����^\���c���`���p<'M�6&
Sw��b�� M��C����E���zpL/�n��4��_�����%6,v�?h�������������;'�9���������O
�I��o���������vQ������Nh?��E������_��xw���������n��|>���3�;��$V�x{C��=V�x{D_�!��?��'DC�o������C�a���BrD=V-����r� ��]������_f�� -��U�U8�#����-�����%�:�.���U�������ot��{��[�?����V�O���U�������ot��{��[�?����V�O���U������ot�{��[�?����V�O���U�������ot��{��[�?����V�O���U�������ot��{��[�?����V�O���U�DN
l���\~�v��
��[�o�H1����F��rp�\�O��mN�@8@�2�9��K^!��m�>�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�va��������a��A��zl���w �����	�����ow���M���{�=6�P�0�{�=6�zl��M����e�h=6��o����p[�8:���4�NSd�WL��ev�J�rl	������n������������B���tU�����D�G���D?�o���B?����Q�P������J1�=V)
+WtL�Y@����k�y�o��T0��U�5�����no0V�27����������j5���b�j�����^���2�wE����n��p[�-��w����n��p[�-��w����n��t[�-���wE����n��p[�-��w����n��p[�-���wE����n��V�_��B!�����,�P�
'hn-�l�X�r^���os�v�������clm���6����������n�����n�����n�����n�����n�����n�����n�����n�����n�����n�����n���u[l-�����[al-�����[al-�����[al-�����[al-�����[al-����[al-�����[al-�����[al,�?+��~#�TS�O+�s������FmC��l��Z��lO~1���d)�#r��;�]H��K�ck�����G��RVB���x��v���0����x��:���T}-�gs�(�\z����r:j]J����{�}.�{[�,�aoM����&�T2)i��1�?#nf\l��qO$M��pV;��J~X��M�����-A�?cSfr��m�����T�Yi�q�f�X��A��mOR�����LDl�K�r���d�OM�/h��\�$�;�C�Ok��q9�dw6V5������!hvR�p)��[H���a����[%?���fvM��=6��MK�gq�J�iU9�6����O��4���������.����t-1����,\Fw���${�c����"�U���*|�@�7`��g�g-�VHf�J�}3�>�P]�S��o������N�%E,�7��b,�T�N7������F7%�WR'��l���{L�O%UN����p���GU����c��@�j����`Dn�QH�i�etB��S���3�F�����B���5����UK�����@�^�����mL��4����;KK�����y��i�����AH��'�P	.����g�e ����.�gy�K	�+vV�����m���>�����c)\�\�^��-O�=�-UL�n�>�S��b.6�������P�M���g#,���j
^��`��EL�?�G����R�z�{�YH�,����2������m����uY�J�q�c�o77og�w�5=
d-�:�p�w������x��Z���=T�����L�FJc��m�Y������3�R��\[�/%�u�3�Z��jz7�a<S/}v�����u��G6�N����<�:`��2�0�9m�x~���<w�?���?���gl�������D�\��C�������GL��[<r=�s�<���
��;�������yb���dyr+Z���m^�R�}`N� �X�h�R���9�,��[V}�R~��d�JV�&����=��A���n�i!�{$u3;��W��J������/_�M���������3c��9�/J&�C�UE<�	
C�Y�/�nh�8$i}��.�!QS��TR�c�ch�=���Z���������QT?�
?{�6f�� ~��0v�%3!n�h���[J�I�,:�{Q"����]�'7��<�6f�c�p%=r��2�MV�����d86H�15=��o@����)�b�RIN;�t�;��(o���-'�^�I�ovX)�k�k�7����Go��i�l��_
�r�IE^[M�c���%,0~�������9n� jrZ����|F�$�uK;��F�Jdr�.D.�GV{��7r�78���O�k�� �z�+���vw�$����n�B"r�C���0��R�*�*G}���1�;.�-�`���Sv�&����]�0��%_���&�Jg�X��&$������@�B
*H+ad�a
c
b#%m��w���DR�#���yF���B��mZ�R�]b9��81��2����:m'��1�X)gfzfw]����E�����c�+c{b�s=���x�����L���������s�qz�ZZKS�����c�lm��4{�v^yK�>K�^�=�8<5�	sJ��q��A��^�Q%\�m�d���ZpF9���jY�2��P��x�.v��s��sF����dn��g�����f������#uvnp.�s�n����?q�"e-TK��v�cF�3���
��+K-^�)�6�L���62��e�.�j��
�>�)}H��K���O�qv8-�|3���4�A����{�d��6r9�6�5�4
�����\�1M��m/�^�1����2E%���=�6X�_��e�OP��l��Z�glm"���O�|x�sY�t��J#|��t`�Z����Y�E���^�,�&��z�����R4�3��0F�����8b��5���Rp}ed��w�H�S��x~�����������{;�^�
�������i��m�/��fd��i�3\��,���X����t���f��%w��@>��b	��R��M2WP���^��e��8p�+��V��/�]R��Q�;�e:���A�U��[-}eQkIb�a���>CO�j��*�V��7q"1����l�ih�v��r����$n�lE��i[i����Q�K�/�-���+^1�Hz-�<J8� ��Y#n���18c�	}�
5Em@���jXV3~�_�$N���0��+���8��o%����P[J�B�h��Z�A���bc�����E��]�-J��{a9�Q^;����[�u������+$cn��.�����V��e�f�\������9�Oz�lW ��i|1@��GZ�x2��`���w�4��T�����s��r4b������$�a~���p]�9���k�7�������6J���=�K�#[w��Y�:8��(IiV���-���K��x�GIU���cc�p����v�����:v���Y���r9�t$�������F������W��.�p��l<����P�%��s2%2�o��<�@���!�It�6�n'�h<[���������S��f�r��
i�Z�	�Q�s�_8v��)��n����h������N��p���mZ/�(����S"�`�����V,0��p��{C����N��9|�'��Z�]�� ��k^!�������/k�pSq+�[L������f�����vX��;-�1�E��P�=H����VX�E�9N6��
�
6�F�a%�����.B�7��-��������s��4m��������=b�2*d�������^��pB��Z:(��I#k�K�z\I�
S�Mj�6=��X����F��z�[N�j���q|4.���s��['kv�,i|N�V����+.�����XKzm��5Z���p�l1�V=q�1Kj�����D�|�\Y!`v���7�^(�]
,q��~ ^��pPR�j�t�.7���&a�g8���Qv�h���d�K�sZ�����~����6bC�/�������*zfM�h����a�
�s�b�>e.F�)�vPFd���0G�2��� @o�}�;�@	f�+L��K~&��"*����*cj�-]�F�(��I�A.@1p\���}I
���l�P��F�K�$��{y����= M�EC���L���!hQ�y����0#5��y �y,�e��P=+m'Y{[��5@��6�
HV��9�pAu��]��L�B��fT]~*
��V��������V��\�j�%�
���T���������yo����`��
����<�!�f��NKh�2���_qo��Y�_k0r��mE����<��>e��������������+��R��9�j�=�S�W{`�R{7���"�Pk5	�3|So�K������]�q�H�qK!�<c�m��r[JlS\�D���!`nD�B�\�0��"�������3b���j���}7(� ��n!6��|uB�{�#�Sp���������BY����
���ri�A-��L��eU�7ZZ)
a@B�J�=��b������;��-�2�"�OH_M�+��"��H9�TA��Uz	H#����\�����?
�#�x�b�Je(�AqSi�;��@9sc�;9-����W�:f���d��C��ZM�*T-6�)-���%���M�. ����q�s��j�9$s)%U��a�TtmgS��P���0�p
qPn�-�����.b;<"��<PNea�����G8�1(H���� �����z�����t�xi�/&�r8_��pR0:]D�A����:#�`9���Iri�Bx�
4�{�X_0~P�8�^nC�l��/t��s��2f%9r��2X�,W�P@�.�� ~!e�l�5@;x(��O��v)���M�#��n��?em�fQ�����"�4M0���C8�V��fIt�"oe���.@n�!4�@w.R������Fm=�[��h���q�P*��jZ��[$fWs��Spi�5�n���#�����wy��Q���)�V������&�o�nj�>(��P�no�3mD����j��������g�,�3�s�]_8��x���E�_����~-��u�x?��Dw��cz]��mi���������.D��Qn�����*��}����K�v�.2X��]�y�>[l>[m��B���|6������-�W3���6�d�&��\G�z�]/+=�T.N��o��<��f�>k�������1�N��96����"�����S�������Z�������G�a����5�#�oW���S0�������K��r�(a��$�ng�m&���9�s�#���7�n7 )fi�lK��%��������������-������j-��Z�R��L[R����F��2�{�i���$!��1�=�E�g
,��:RMU�C3�4����r���s(�P��E������CU3�Z�V������r�
�����Q3e&���{��an= M�zS�J��>L.�{X�j"�[I��8�<�\������.��y&����z��q>�iZ�Ge�@����|K$��� h���
�l,uHC\�w��Lo��f���79%�<#M$���������Fc�H2��8�z���H�V��hT�[)�~%�^Z�s�NeU��NU���K� �����8r��$��-E���1��Ln$g<W���i�wQ�@6�mxL���6v����0B/�i��>L��!$"&��z-.�P��i�f
�����"�����
K�%��XI
[���O&�"�1�W���������$^���D����sZ����2g]�2����y����v�W1����/��:`�*�������p��!&*1i����N�nb5�[q\l�,�-�����Z��2e�s���UT�2�����Q�1CS.\	qT��m= *�����d%�
��oPy����$��FC����bH���L!h-�*�$��!i������2�
&�������K���0�v�;�O�yk�&�
���_��������4;x��eD�3J�-�A�1W^Q1;��F���&f��23(�������
a|���r�/��������8�y��N\��"��8�f��`T1�
��*���1�d.M��<������	)��@#)��B.�"�V�"r���#�L��)��R@K�r���
y`���;C]�M�G*�}${�������2�E�
�������N��'*?)��;&�j}�i>~���L����2�#���2����=�\��U8����p Z	��=�gR�8A��_���2�������_z{v�[��w5�7����g������l�s]����?=��x%���7m�M����@��}6��}����p�9�����n�� q������}�cgS�OHb�����=Vo�����r/�����!��E������}Z��25.x$��F��)gr�3�P���o
�����53S�������2��N ~b�2��6�h�����w)���n�q���m3D�s�
_�q\o#2�B�!����!����jHm^���&4��4�9K���vV�e
{�Nau�U
����]��������j���|8�7�X�OP��xi!�/ 4���@A��F�L�a���{/3���vV��#��R���2�Rr��& �g*��oS�����o�hd�����

*35�2��7�8���Y�`L��9�q��t���&���G����l���@vR�r�������<;%���!B}*����C����z6ij"�<PQ����t���#T����t�#h?9r�vPZx�����l��'cB"b��L�&�%k�d�o����+�����J��p���f, \6��w]�%{RF{-9M�����
�7����/�tn��y,�;��	l�������W�F�����KC��.�f(��1�iAv�Q{���������0�#�]��4�������@P��$�/��$T�k���5�"e !��%�h�������
��]�����*�����
>s fW!j+A 
�P�Kh�� Z�H�6v�&1�7+�\s��Ff�T[!6=�����/�ZzYG[�/h�1��Z-^��#^���nW���=���)O���Uq3���dyh�	'e�J�-M�W=��P��ihx7��.h�QU�E������U����F���=Lq9��B�<������sL�j[ ������r�1������*-4�
��s45��d�k�%�gj*:�6d5�z�"8�P����7�y�_ ���
<m�o�2��KK\�"9����J��J��������]���iv|��P�(	i~�y�'x**b�t"l���w"�� P\���KSh����8������-
@U����V�&uS��4 $���m��u�����n��#���GnV�*o����4+�Ex���7�;V���m./�[Q���D�Qn�'�W[�	CxRB�V��y�H�����.��K7Q�
e#����Lo*.Lm�QL�_'2�HqyA�����7��M����o���~�#�t7_��b������n�m]M�P�~���S���q�b����$hn$d3�Q���k.T(�|R��q~�o���d��C��P4�Cr'��,-���x��fL�C]��U��+o�!��9����}����k�G��p��&P�������O�Q'���"��qC�b�w	�w^KE�P��-���KMs�. 9�43r��
�;5jH�0��m��N'x�oB�}��[�%�����n�����Z6�CM�����]���9H)�j��1�/��L.���Q��
����2NA�0��l��B��qPj[!�-19��Q@7��������6�yp,��9�!�qk�9X�%��j�#���;Gf��E�r��`2��F�^[WJ
��!.
J�0R��^��T.V����'m��9n�e�
%��q�h7�\A!	T���,�u\����;j-�7�����V��i���88phSu��DP<�"�@����A "^�E�@e5P�!�U.E=��~�W����E�]��-���$�>��T17{W]�4zN�J�N�LJbH�Q��J��"�8Nr�������a�1�
!���d���3�	�:n"�#�o����PPe*U�����o2'#���Cn���H����@.�����#�]�����j�D��� �I[��.#���yQ[bI�_pzmU�=�t�}�"@����r��Z��������s($r�J������ �H)�y��6�O���w��lT����8t��q;����*})��sD�K8w�}�������iIx�S�2��D`��Y��CZ�����	��
��\|�B/�"��-0��Q�V:%%�[z���K��*��������-����J�xM����+j�q���p{���n`r�C}���-7��=�qLF�i���|�8�Ip����Om�645��r��&>E�s&��!_������\�3��2����y6�Uq<Jq `S����
�2�Ai��z���pB�x��8S�)?��9�"+������������Rn	�/R�\���U\��BnQ���w�a��>a��XK�4�I�B����"�������%u�E����p�.���%�\� ��Cr�%q���Oy�3fC�&��w���F�s4�{+�M�z�~	z�-A�UPk�lo��
���s���[xC����d`E��=C��DM�n}��_���6����-$:���D
�APlii��J�[������jj���c!b�+#�9npCnKN����r�;<����D�F�0����m;0���i*�0�M�-�'���F�6���'�vZ�Pz���xh�x�qr�nm�)n%Um�D��]�B)J����e������L�w-����v`n�f�1�F�ar�.	�^��2��,��2�qnS�M��'-���K#TT[�%P�����)����R�p�����@��;
��������E��*�t��n��=�Tm��-���)�wX����$�`�~]6~�
���k]�o�l����������O��������`�>�����e�y�z�
���}�9�o(��������k�
�����,��Y��?�m���Z}Z�����Qx%��0�����'H������W7[���^c�6��pr�fu<N �7����k�Z�
�+y���o��9q�'�jj�{�8�A��+r�0��=�!+j�1NJ�c����)��*0Lldv'wW�
���)��EE	�}6��\��&BQw^�����r-_�g��.]��UWbZJ����&^�l]�T��.�[�UC��A"��A����nsf
\���]���2�@vl.8������wV&:f�����������L�wp���\� XEk���QN��o���&f���*(H��kA%���H��Rvr�3�V�����l��9����<fUs�/�
��O���.�I��4�5�k�(��aj�JbD�w@������U`o��
����\�m�8�����������9n\�do���l��"����>�=�q����J�R�8���t��5���2WU��i�!2!=��i*BID[����%�� q\���������~�=+c@ T>�+����kp��M�G=������x��� 3"!j��b����US#����;E�a=�*��t1|6R��jh�T���E�]�f��������o����f�����O
LB�^9�vw�p��4�q�R*���A;�P~�����~W��;y�>]s����G.��K����4���zA?+��8�g��p��}���N
�)���.�K/���O��Y�����q;���I��������[����og�x�n�����������,.����o�o��uY�~7���@~X�~J9m�V������������&�Q��z�����]�;�U�sw'�,>[E�y�ak����B���=3t��x�hn8�8��ik������}������sz\�+��f�}��9l�����>�,	��-�P��
�F�n;��jn7��?Fg���y-Y����+��!c1�kX�af�Ln�7��0A�|�,�������2Qp����6�^j'��243�1
�yS�2x�9�f[��"zM�R����=���1�o8�a=P
�����Nq�3��E���������H���H#��Q��� ��	hu��d����p��������d�x�]���2���K�
�9�'��if�N\��n���U�;@2�Z�.7]���������w����E�~?��$e��6�D����x�6.�4��0����LZ?UM�2\�q��>�9���E�����Fp�	�5=�b�^�s^���.u��\}�bqP�<6��H�c��h�9���]j��)�I#.����n�����
��qv(���[�(Gb�����`[�����Y����;��B�����@����H��]��hp]��M���(�1�,
L���so��NU�t�?o���mA-2%���U��XQD��B���~�|5!.��w��� ���[e���.<�wB�-��'O��S�(er�^p9q�e���s'i���-
�P�%�4h�Nl��K�)��y6eMi,�.p��/F��
�l�d��o��co�FU��q!7#����C����s�)�d�� n�r�����%5��:��B��"L���6�T�j���p�e��9
� ��
��XM�},�A�	k�[~k2|3������@�e������z	�cl��cY�:f�	V4��\�a�ZoTvrH/��h(
��`H(A�U_����
�w��O��[6]����m������F�����Q�[�A!�m[2���*r���6�I��tYW�`x��g�E�LyyQ,q>b;P8G���o��-��OLE�Y?����������rr��l�u&���������aQ���)���d�l�����G5��W��U���^b�f`v�]�������m!
�����q�!b����Z�Lc�hnR/����0���
D�g�k��18�'���l�}M�8=G��r�������?	���A�-��m������fuh��_Q�\�\�@��� ��{�-�Ky��	.k3E���w�\,c��s�y����Ce1fK��Q�;v����i)K�8.BH$���:����wV�J��)�p�'ly��}��#q����w�J�� n�99nv��DqR���q��q%.������9�[u�n�S\m0ab�������@,��n��q�[r�w.;��(�OM��!iq���. �(�kQ�4I!l�2���q(��R�v��L��%f��\� vGq���s����`���,�_Y2;^�����/�V���K[8=���NuDnP�������8�9^ ���7��J�; t�V�m�nP���SS�J�s�xF>��
��<�b���z�q
�y	�l��P^OL�
�$-%.p��V������! ��[r��S���U�7,�;�������O���c}�XN�	��e�]��9	G��^��Z���F�w���N\�.+���.o:��K�<�����b�2���;Od�m�����������xe��#qsT��\Kr��o*.����O���K��h�+LoZ�r4�c�
� .v�0
�LCA
��BIM��K#��r��+{�\q����[5��{ |�.$?j"]�!#b�`��#u���[��]����_-�����m>:�kt�J������t���2���k���ZexL�i,4� :�����oX4����<��g���\Q���`���������ia�7T�]�>4��"��/k>u�����ht��?�s=�9�BqP�^6��AOF����z�^G
�#�# �P�p
�Q�+���Se(���
�F68�A�L����+��M�MH�����1(	��`����t�������;���7p��(�(�H%
��v�=2��{��������f�G"�������~9��?8 �I=��v�
����]�\9l�c9+�=>��A�)k�_L��F�*��NU1��h�d��u�q��7%���N�H�^T�H�'�p7Zb�y���}��oQ�26��<W9{@<��E
�w�-���E.����0��t��wl]���SquC�;�q%kor�����K'�l��N!c@�������G�a�������Wu�-����4f�m���[+	��Y�`�UE�<���V��r�Fv/�����9O����{9�S�U/!-.�@.�6����_�2��\wl������o�+^����a�]�)k�H4�DBB�(!0�F#��m�>[���G�9��Dp�����K�~�������vU���,M���0��j�G���E�o
p��jY
�N�''�QH��@������,K�vk�w%���%�$B��)�r5�
J��/���ul�o���
���>�
�U�]��>�����J�[��?��G.R��{���t�G�oU��6���Y(7�7�C���C�-�vH���#����%��2��"���Aq���	�z�6Cu��_�<������Z/���n����	�m����W0�	������ �o\��a��2����yu���4\�}��V�5��V��g	�'76.�\����l�mnz����N�#��f]�2�)k�W���[�Tl%f�v�f[�/p�1��������I��.��.7�����
��=b�U�gt�A%P���i�oRy�TS+���@Bp���Wb%��oD=�������;�������P���������v�q����M�����S6l��Sj�=�wa�8���0�=�2��8�Z�M��z����Bb��0�a�Ow�H�������E�P��������w&����7.{E�+H\H+��q���-q>C�o�6��������������{
���6���m���Yv�%��`jL����������Iy<6A�5��������.�>�]k����J\
�t.��E���^���c��-EUvl�@D��J�(r\�@�x������� .9�����`8rY��&��n����&��9�_�=�
��<��n��d���9m�����#r��w��~�E����MaM�v~ah�����8`r�Z��qM��rX���gfM���8������4hS��N9�e�x��E�����7�A�]���U����{����o������[�Y@�Qpn� ���1�������.��`~"���-��\>)�5�i������?���1�D;ak�!7��Pm]��|& ��~\W�x��`?���@8���*�������0��kf����u��c���Y"I�jp+����p���������T��I���t�m^�{B���'�c�����av��B�}����p{���&6�v����/��Ve������?����-4C`j�Qf���Y��>b�+���}��8V/?/���v?��?�/�E���6��n2=�y�s1U�������>`wYG�m���%����?����*���>���J��r|�Df
��7XG T�m�F�e�;��F�`�����
��AfTo_C���d�v�<����$s[I����)5"�y�{\�*����&\�V�x�0�P��V��88]yW�.�tz�W+��<�vr�����
�M�j�^k�o[I�dC�*���cu�rs���h��^3���������iv?��<%��[���3����{������n�0[��E��q!�.+����u�[9�mJ��/��r�R���SS�I�BVj�c$��. ���X�7������S�am;W����GF�\�q��hL�jU��3�����k�A����F�u��oy�_������I���� ,"A���^�
�����j;'Z�^8m�����*�s�&r�+�-���>a�f����r�9.>��zJD�������
wd �3�<�����M�)bh�����g*��P�+f�i����
p�1�%�r��L�[�wL
�UV��i^�B �[�me���U�K:B�S0�,�:���kR���I�,,(O�s��eB��P*��ck^����#��7I��E���%�Hb���l��B����I<i;�� ��6J���u��@@��7�2��ej��{��zz-�q<�z���	�vl�[�'�[jZ@u��^���8p�F�K�*�(DM��
B�I��� NK�2�� ����vPc}��;��o6�'��-E,��Ne-���������gj�8�@G�����U�����B{��\T�17]l��O/������Mh���6qK�^�U��	i���C8]�-�S�n�q��j��������g�d��j�-a�����`!`A���ov+��xIs[�$x\@��N�����#�y����c��S����,�`���M��.� ���t�rq2�a�=6��$������c�����h��WR�����|�,��^^������'��6�w�l�{���������|��/����
�z������o����`;9l�i�����d�����aVo9�c��7��]��Ke��w�m�[e<�-��A�Xs�|��~��I�j�43�{q����}�|���������}��w-����X\
��n�����<o��M��&w����c�}r���H��2�M����N�4�����.�l�!C"�/����b��Tm��\�hu�I��e�����5�[���I��:����`�o�i�Z/�"�E/��������E��6��7Ym�z�]��^\��qK�n_��m�b6��r.�1����A�*�B������q�ZJ7~;����m	q#��w�Uz&&������K�M��7]��SU$��"&������n�����9*�@���dq_OE��nD����Tr�;�.��P}�f��������������
��Lw,){v����l��o�aEO�.l�I�����PZ���6�vg����E�!	�]b]��)����0�~����
�����,�?wN������Y�l���IkQ{-.�^p
����jkb
m?������\N�����9t�����3���E�y���M�!��f���tCa$EZp*�v?��v�:
e����t�c4���D`��(��9��-hq' Y3����B��W���`S1i([�6h����I�91�fH@�*��a�7��H���R\_q<���7W������?g)~$�����^������c�$��~LV�����Bl(��\F�z���4���ZJ9n,������[$w���Y?�c���`a���E�����i!y���P*���6�ee�ozM��6����g��fh@G�{AB�n[2���.N����Rj�	��Y�r����_�rUp���d���!$?�!9�u2�r.6�DU�E���G�T�_S�Ik B������V�������_��;Yy�����m�&����LHq{Z[�`�
���%����RnZ9#�B�8��0Z���s���P�B��s�����wY��S����PC
l�%�*��n���s���� ��2��_��s�����-�2�PB�~�����o��9��i��9��Rz�Z�C��N4�l�TT� W0�s$.k��:���-���&�lX�PG�:p������-U�U^U[e6�1�sx��RX��9������;Z�z�w�5�/8��jZ���:���Y�����RQ�t�b��6k���|������SA���
�3�yX��[�	LN�SFq{��r�6^��[U�@2��S<����5�pL17��/	w���F��R��������u��}�������"g���@/������R�r���=�R�:��I~�=�V��@74�D�qI*� �I^�a�;���[T�r`Akc�8�h���F9I���������a�)�������E.��(�Ic,c��AD048���w9TC����@JJ�D+w&�g�Yp���S���2oK�i.���]�"�]qqm!7
���6N�������[��������AGVF��e
kr��"���"���(Q��Tx��`t���(�K�i�����E�����K��,)�"�D������T���.kT���P��h��L1"��,����S����R4'gV���x��N�%i�����7�����1)#Y�T���(	��1[�������s��b7�l#:1�m8 �vZ�X���b�D��q�k������/��o�Z�����^�E��x!�.A��l�|6���
�q�����QO�"����=����"����~�����,@��F-����;(].+u�����v\2�:/�1KQ2c�IV������1���w�p��F���a�����@|�&G1��X�#2v� ���esHp����
>gA�px���a�J����35�\A���s��r7,���S�7�J ��*PMz�pq��W�����l�F��7��Z2���K�zm#}����������
G1��o���IK!ql�sa�������j8�8��*@g4]��u���-;Mk^����F��
b"9�hS������R�K	.k	 ���������5�g�����T�_��G��ox&|���i���Q)u<�w��27���P��E�Q�:�H�����UqX��\����]�4eq���Q����~.r���\�������q��{��^=M��$=�� R�T*p��,u�Vg=�C.*�`@]�-[��H���dp@��%��H-
����(P2��d�g���C��Ne��!�FI
����M�A��������v7���H��GF�^��q����A���J�+hd�%��r��W)�9W�6�M�����jV�n�8CP�3#A��T  i�Z"$�	V��R:H;��U���1��^Z�ba7��������'0��M�/���.������� �p���}��Q�� ���D��p�vs"=s+I\�~�1-��M��������1 �
� �?��5�yZ���������i�Y�S\��5G��!W^������h�v��_�P��f��4����\����_i!�s�%���'�I��� ����m>ds�vr	�T��r�Um,�d��]�d��R�\����lL��>_O��,ir5�$3BN���Iyhp\�\x��|�9�2���^�s{��q���mo���@�eh�4�������]�p�3�.w�n��4���&d-pU!�k�����9m��{�$T����hk���(���=����s=�����.�-�3)h���z
C�I
oe�5�����6�����Lis�b��g���*�-�p�G*��#��A���qN|9m��y,��AXI�O�(�Oe9��!���EAs��_*'��e�(9��<�<��{h�����|�q>7/���d
<�<���i4��X�P0�p�����^�7.��i��@Q����OM-��(KB�K�T�.�*�U��s����
����:x������8����m�u�|��,���m�;�[{�9�pAu�����y���-��������X9��Hm�J�����q����p��|��"��W�\-���X���@O�}�]ii;�����
�,�0q8I��n}�}��w��	�(CS,�@�u�Q3!���a��P��A�����F��r^T�8���������C��)���l#m�|�~�{�ce?/��<�%�4���?S����iA�[�
N��J���;9lk
��N$�r�o[��!S���M���_� R�gJ�l�.�_���O`��t��t����p�}�7������-�����2��������5H3;m���vo�V��a���6��wy��l�lei*z�$8���%��1��-L$�M�6��@���I��#��"����M������@�m��^I%�r.)�v�����kn�q�� �r]eS�d��l��'�-���NQ������&�=ke��0��f�~*%���v_"27}������%�~��
���(���)�u�0��f����?��7*��|�9�����Qf�U@E.U����9�B�;D@h�=v�9!��=v�9!��=v�9!��q-.�Jr*����R[t�(�C��6��������~�h?���������������Uw���e�'�o�~L�_�y��K���w���&|�]��o���[�A�&����w
�B���R��z�"@�]���Y3��S�Gt���-�KO��)�L���c��*�U�f�(
�S��
�������j���]d�d���`�eQ�r���B��
��$�1�9+��9E�E�%y'
�bt�1
���?UY��4h�3�����n��)���YeD
B�6�� �iQ���������|� �N���C�t�l�������e#���[��M�f
���2�@�:1
'�������=v�9!��j�����r�M�6oPD�����	������9�
R�DD?�U��a_W'�b7&j��G�lj�����^fI�L����Z6Ur��
��*n�j���)uV\�{K%M��l�z�v���c��N"���f02J��	��)w�(
!��8N�T���}T�S�3���'$��S;�'Ah)��r�&����*&�(���#����f�|;}��x�uQ	`��WE��Z����2�j����!0��J���!�

d�����AH�&~^c��)�����]K5|�/��"����T�v���F%�$%�
�.�&L��hqq� �� ��
��}R��
U��g���w�1pj����7�O��N��p��r�����/��ns.P���j�=���j��-�%&�i�}'HD�	�������n�d2��8���L"?U���]��b�~���x�'Q�
�9�#dbd[��n�b��O��w����12��76�&I�F)JU�������w�.z���ak%�v���pd�l��UO��<"��H�:v3m�'L��Wq:�BA�%lm�%O�V�����Z2��b�����9
��b������ �	�!_�9���U�����2�:��������M��lmT*�*T%Lt�R�U#r@�y'F"��
g�����,�M~l����ko���[N��A�'^Ssm\&�9��k���	�t���F�
f+9(�M�G�5n�����v��D5t�t�Jt�!�r�   !��;�?�g���\Q:���e?fY�UE}L����rU�����B���
Q6����99` 2.����o
����^?)K�����~5���0,��h���1+s� ���*R���,�V���5���S����Y���(z�����v�WA�fN�t�����)���t�X�f�P��C�.�'n)��5��b����C�YHi�2Qj*\��n&�.{��i��u��L��V����u������Q��S��������cW���;�Q����j��,�jB���J2���RW����C��%4����I>U4����j�,����u�[�%�+�M ����<�*�������`������
��yRO)����dE[r;�8i���,�������|�3�RF���F����1)��h�q{�{I���c&�E�j���tUP���rF�t���af�j�*):-�S5��GD�q(��9�w2���M��A�����1W��������;�!v5�P�X���W�z��%�������h�HN"�U6d�hQ0�m)L��lC^���[wp�9�l��m�:�NLbh	�V�=o����h��
�����{�Wj��*����fWce>���e_�f�o43
Y\Z�����_KY���70��q&n���O&��%E��U�b�9n}w�QQ��I������������T����YF����X�
�H6N�7)J��{d	P_[/$x�\V�
���2��xH����]������G�YG�S|����c�|U57[Q�Q�%%X�C�4�E��"����99hI��ifU[�l�K��G#�0lvz�v��U��s?��������������W���~S�~��~
�HS��hN�\��^���J�B���	�"�j��j*�������]�����3�U�jL�q�M���N���U2�LR(���$�W��k"��#������)
U��X5���-+U�B���u������r�G[�:�Y*�J5��BH�����o%[�����A^��O{;i�����2u�Uqn5����n��\�B�2N��V5s(F*3������&�>Y5R����}���'q�%~R��D�D�*.^�R�����L�:�9Wq�d��QP�!M5�������u�_B6R�jiZ�������\���J���h�~��'r�@�z4�1rD�x-&�$)
�P���!�/��^3
������WJ�W�����^�N�ejX��|g�zS���������",������g�_q�<����WV�j'N�9�,�DjN2��	jv\<n��b�����
6|���d,�(X�0����T�~�����S/�Y�g�W�Y�	e��u���s�����]��b�bZ�_�oN����[Gi�6J���
Ati�q���o������P0�uTn��Oh^��MR:7���oOF���"��Di���8�V�������SP�yETM%FM��XRV���T�o(*~.��(�V-�-9L���J�.-�H� �
B��#����Oj6�C�[U���P6V�1zH�����8���{&b��,��]���$��l���K�Y�u�oe�Y]�O��H���R��t�k�1�
;nZZf�j����*����`i
���AV�M�G�[M�p5Wlm�D������N�<��b�#����,��;�{��_8�U���,�h���J���d������{siJp���k�JH���Pl�����z$�a�\X��o�'�jY
"���i�'H[��h�;k0�5I/S[���R�*���(�B���m��RW)-�S$Q
O�gW����w��,��u}:�N����y
�R��"���H��#���ie��A q�[+�{�TY��zk����j���qv��D:�'~������ht����,c�o�`SM�N��������4�/eq7t�-R���`��h5Ib10'�n���LH��b�0~����(�FV�Z���M��k����Z{,����z�[�)6^E����")���L����EM�:�DU;(������W=�
:�f�&r1����QDNV�
�@2I�a5�����u����f�*<]w��hxf�-�L����+�t�����9�*�h�Dv~���o{d�d>��4J}��<$��I�Q��R
����"�@��,�*xI�4/�M���k��S���j�TIT��kK}h��Z����|����S�f�D�_�p�����kEvb-������~�6�?�#�&���n�iM���J��4��"zW���;d�@�8�(E���5s�4�]r��3V�n��!S��KC���8�p�\�H���)���lT��^�{2�J��F�h�L5&��kpV������YH��F"��	r2M�D�L��)��������Cg�7"�v�]���y�5#WV�]W1z��,�,�������������	N0��!"�*��rc��S�~��k=T�j����Z������)T�B��5<kU��t��(x�.�nU(��b�u��W���
�N�����X[����Z�J���!�S��-���|m>�5�V.���������;US6)�Sk^oT�n��>w-=]�
F[H�$�b)��I��iLS)M����S�D\���Ol�]W��E�����n���E9a�.��U�'�VnY��R���=�C.�KD�f����H�[+o.������J�T�3qS/�y,�����MK
'n:�,���o�����=K{m��le��y �BbJ���I�T��Qo���	�4�����HT	�/g7g^��������s�glV](�;�p�QW���U�mO��f�MQ�h�[�
�B(��jYi���jj���V��+'QT
CF%�����'p���+�\�&QS��"#������u�����WP_�Q��iKI���I[���s|�iH�-�MQ��>�����GyF$�(A�MQ(�+
�* `���������T�y�zZ5�<�4���2�N
���~R8l��d�$_�pB(��U3��]�}+(��tdc722VM�6,"g.�;p��I$�c�sJ"9��bTT���O;-	s`� �����@�j;�X�u�K������:$o"%dU�=zX���q]��������<���jh������\'��Gn��$��9�I��uQ'D����7;mX�p���E�%����bn
���U�)9�����X����3��I��Q���t��!1��wJ����.��4�55U��5K��y������)g1���PPQ:���P�L��I %sOvU\�cF�V��F�������Y���fV�:��UE1)Q.=��oZw�PSMG�Dp��F9�T?i}������%s5Cj*�V(���R:��Y��U����v�f�po��$���"fp��ix#ac5c+`���8��T
d.�S��n<T

)�xJ3:���.�>������c��8_��F=�j�*����
���`%.�����%t����DR&����	���k'��#u7v��Hwj����N�.bz��loh����)M�������x�
���c�"&3(Gvav��\.�n��R7v�����ey=<#��guX��o(�e�����I"..he�|���!�����(x�qd�O.
L�d$��3nS��@��K;�x��NbGn!�B�NV����Y�y�j��UgN�e�����kI<[�������M�_��
��Nj���Q�"�l�Q��������P6���z��{[�{���9�$���'h���(LSR�n�.����&�g���J����d�&�����m��w���G��Z��~��I,�&M����L�0��o���qe�ln��,+Z���u1�<�ivr�.T@wl�7D�.C�|��L��v��\#]�UX�pu����+x�<[�[�T���9���#�E1�GQ(w���Ad�����u��#{Uo������wY��-G��t�S���T_�������0L���W"�!�1�5*���*[f��{\�.}+a��L�A�yW�O�F^��Q��J|���j�h���V5��N�;�7���e�v���l�	���j��c,�<=?�����?��g-��i&y�R� vS������������SE��kS]�7|-�|��*6���YW�����w��\���F�=
gR�B��T�z��h!�+k�Q�3�X�
:u��z?�j��"���7�5x���Ef����E�<�ao���R�&��+(X��[g9���W�!(�7F~�Y�XS��!��V���TM�tLC�=Oj}^���t�����_}�5z�%�O=o[������g�0*n�M�Pn��v����j��zZT%��bkX��%--N>q������:��,�b_�
0p�P!�\�u�v��UZ��o��MMF��T���Z~Z:��Pa �JE��� ���(�F�q��Z��usuC�g��f\�.�V������i����,�a6�B�"p�i��������f`�Q��U[�t�U��#��Wzl�w������u_ro�X��'s���
e�W��t�K:��Rl�ND����*nrR��O�Y���WY�Wj7���l/k�[�Z�\Wr���l��Y��KC�%#��W"<�������������/Z��:���D�{w�/Ju�R�&>6��K6�J����eN��&AS��Qj����t�t#���\������o�v��.��/�7V����T�}��VV��:X!��iNM��3�q]1����7�������<V�#�����W�����yYU��5W8�[G'B�k�)�
��tQ� �,$�"r{���-��.�X8L��EP^��U41
�g���Z�p��%H
�y�����T�
E�tLR�D�
�O�E���]��Sc	wf%_:LDT��nS��� ��@��j��6F����/��&�&�T��gM�����*�����W�D�(��(�@UQ0���U{VR4]w�,���<��l'�JI��mM<d��D��EF�`~PP����ND�!I24�L�D�L��B�� ������
�;Q�K�X�]��Z�����]:I����NL�N�SQ1��(����G�n�����gl��{d���'�eR�U�����J1��zR$��n����'�$��7.J?�e<�o�Q�Qi{S�����_3"�5<��J�5��4l�z�&.�#L��3L8QW!w
��;�SKf���+3i�\�&g[�+'o������Qe�-�`)$��h�;.��������i��X�c����|)S2.o��������J��(��9�h���e�D} ��.Dv}R��Kx�j�5[��,�VJ��q%���D�]y�	L����&��0L�u�����z&��gh����nGqS��M�4�4�UJ����*�C!)�1g�������Uj��"�L�I�V���
%7rl�)��:��$.���
1RY���/����Ui��%�t2�!�����$�9"�Q��"=��QX�Q���:�(�3J�����d�C��G����<�lA��U#��e2�I�.������{Vd9��l������@|��*��}��<#���x��+P7��kC�1x9i�hM6[*�X�dMb�g%j(�c"p �xHl�F�����K6�Mv��F�[����mKY5�i)k@<G�e��	<����3>7(��]�&����Mh�9��.�V��qq��5r�m:�Qq�R��Q�����$�K��(<PH��DO�4���<(P�[M1����aT���2�U/�o�9F*���C�Kx�U��6�&������m���l���m�{BWj��):}��]����TH�]:XEU�QE�1�9�+�u�����Un�������7X���.���S��)�`��j���4�t��K+B���*f��
����`��6X��������
A0������95)M9T�]��h�������^�����cH��c�(���7b��fg
�U�G �������Rp��uH�w
� (��,��NC�@�1D@@@@r�{#�'���qb�tFnfK����p=YW)�P���RGF<Cp�J21RX��Y�PE�V����f����@ME0��(JR�e����T|�W������_Isy�Bg��w,[	�2�uV�r��V
8��h�u��'�#�/1,��\�f�F����#�=
�(�vjz1'�od�Y&���V ][sb������U����Py�;Y�/)����"K�F�@�*R(A)�Q���|-{�:�L�"����Z�y	�\�GN}m��q�D���49�S�&?�����-��� b�Z�Rw�������!$Z�1oD�4�������X�,�@��R���e�����v��,n4�x�,�/�UI�Z�a�s&*	��P�^�^D�L��U�4�
 ]S�h^������1�
��QO`�����?�����i'-T���h�H����KLSUC3Cf,�\�YMG��x�V&"����ZR��01H2������|���M�$�J��]"�	�NQj�L6��W�����u:��������=eLW���'e"�S6V?�
��DI�m��Jm]32��j���P�k���)9T���E 0�@��cP�S�
��7��T�Br.Ip�j7m=2��&�k�!fQa,����Vl��M�X��fm�Uj]�����gKJJ&(����\��M4��&d�&B9�;]7�
�-��R�f�n�J������U!R�]:��i��F�LD�]���E1�P�(���L�Q��������t����|��59-!5UMA������7EU%
����E9b��*~��������n�(�����66wK�5m�eJ��o����.�]�b�)��O��9�*������|J\���$�h���E��9JW��3.�` � �v
���8�	������C��{h{)�~�&gn`8���[���J�gRB
n"*(8�������GI'������L�%f�EJ������O�qT*�9d��4MOIT�bR�Q��>���|�1:b�1�t����,�dVSY���5yOQVM��z`
�����u�"v'L�X���t��*�T�1�@EMQ�Uj2�YmB]��F�1�B�q<����k9�Q��b���M���qMB������b�l!�`vS�V���%����������nU��_��O��oL�J�U����#��d^B�Kx�o�*&R��1�=^j�H�mi�kP�_.S	�+W���S5T���*��'*�P�Ub��h��5��A�4�b(���mt�k���&�64����i*��x�b&OJ��]����2���C�lv���l����KV���fR�@X����!�)m�X����&dU�+G��.� ��J���rp	�*�����kb��.gX��/����x�(�:����{��h%P�JL�T9Hr�9D�2���HD3yS��Ue��7,��Q�;+�S��X����r[Rb�'���ENU0�YW��N�����9u3t�U�MY�l��
N}v�N0�H �&H�����M�*D�Kg�r��j���,J�6t��������LI�xEQ�����\���D�0cN��6L�����b<�*�z�$��UH��7�L��zK���1����a1[7>�*��E���� |c�c�JX��R�{u#Qj���{�SUJ�I#
�-�5O$�i����#>H�Cg�L�������	QY;�0�\�7�r�+���e�uD�9.��������63L�)��	�qV�Z��V��|����3`*{�M�����*���L8^G��ZI����Y
�-�ss�8H�)�._�"�(�����5�i��M�1������=;G���r�����4]��E�f�����X�+pMB&21Hj�r�s�fN�l%���Y�gGh����m�GiH'#������U)�qc4�\V5���/���t�%�����,!�f���E���d�����y@S0(��1l2K*ugs���9�
wd�$��QUU��a�;@���_��#����j����=Q���di*z������1�)e��THD��yc."Po��?�g���\ivmcFVz��������TN�)	�Z��8��-UIV��B�"g"
���rf��qYv�{m�M�"��Au���
��3�"juU],1�w
&3y��Ta�m-K2�������I�$M�����f�|;}�\>��J6�z�TQ���)xI�M��4��z2%T�O|�>�D1�1u7j�G���<u7j�G���<"���)������S�L!���qYr��M4���7�����q��_7jS�iMFQ��#c�I��zBi6n^�Y�tRP��L����	�oLD,�v��S��MS�p�,�j�(Y�L��(���	��_�9L�f��B�JH��}����M�p+�SJ0��:;Vf;����<�P�U���1#�:n�����N��V�d�Jq��������j�H��������PQe����I�c��B�6�(�h[)K�5li�TZ��w&������I�Q7eS�����*�)���9����������H�C����f��F��6�����
��T�Vh��UmUZ�N����]��d���*��1��HL�p���?���������c���Q�����a�p�yP�����)$��a����nJ8���h{L���������sa�%�.�Yc
R���0���La����������������^5\����� nUI����J�j7r��r�F
���?���������������������xz����1S�ETt�G�^�*����g/;/c-L|�4�L�n����(����d�L�!�b�@S����F�C%���%�_B$Rq�("V�D@	��7wvb�v�vu�^���nc:�)
M�������<�%j"�h���:e��F�M��*�$v`�������/��k�0G���|�@m?��g���:u�L~��3\����K��z��`��!Z���gf�q�@W�m;/��b���2�� :dp���U:��k����-_NA���~��"�ubR��@��Ibny���W}#u���P�[O=/u�R���*W��T-�j�7�;Z��t��@`��9=��_�iu�IEz�J��(���r�&sen��x���I��1I"Sl2d"r�Nc@����*�������AS��L��G�u3��Z��I����G�KR�)��\(c���ljc�b�3]�Ux�5�E���)���i�*��S�,��8U9�����9�Sxu�������f}�U�P{G�=m]��&��uP�
�$�-��l����#)�Y�;��P�����KP=�0���A?-C����)�)S|!.�h�Yt���Ee�O%O��c���\���oU��q��V��F��u]���������j��n��$eEE%U���*���[ b��AN5t�"D)���:,PN:�[���x�7u�7[�1���I*�S���L�9������	��)c��Kb���]A�G������v��,n;:�����"�)�Z>�{MZ�uv,n���$���T�Gz/�`K/t+(V�L�9j��F���2����9!�)��0SZ���%�Z��_�U��K*�)�l�a����L��I��NT����g6�n�
�M-������ikkZ��B���"�j���R�
@MG�I�
�����TV�X��BQ������Tp������ �x���9H���7t�>=�������~�]�h(T��E���*e�+ �$)�
��u[g���%�:������8R�1wrZ]��"����N<��p"��x��E@�v�S���]�:���;F�dK^]�-��B�}��0�I�@�c(n���� �����������J���Z��S\�e�ok|}-���VNM6g%,����������U$^B�d�M��L���������g�F�Z[��z��+Y���4�/28��~�*��u�d�TJ�>GT �<�R���=i$��5^��>��E�=2H�Qh��x�`)��)(������W����W��]KI�-$�����Sal��u53J�V���js|*5
��DL�����H�
_��]���?�l|�j��n��Sb����@:��-��=9CS�g&jGQP��^S�V���r����Q��>B��4_������o�[�������Y��Q����#����y��
f���t�}���d�G���(�!��3H@����Ls�!� Cv�����LT���*���J���T�
,�M7�B�P2LB�(a*>��6���W�%J�-RV��D�:��"��JM�NL��RU�]\��C&�(�T�EP�Q5058o�9s�8q#�:n�����K�?�g���\ig�]������1�%,�)lX����/�����\?������t���i��/������v���%Qp�h�D�Q:�[�.�C��+`K7+p�:v�ejZ�z*���YU���f��UV����"�GlnC��jw���,�����6��{X.�TQ�k��A���/=c4��Kyn&���IU���4}X�K:jv���5����f#��L������-��J���Z��������������Tp��`�����w[���\���1J�������T��,�iz���d�������y|��,��S�B�����vAX��s�(;AHR6n��������]S�
�����<��$)�u�W1��z%+r$�	�+t
"��1L)�S@Jb�f(�p��\������o����U���YUY�!x����-/=�{(��G�W��C��t,��*�mQF={U�8����<X�#\�Q�k���[�LP�����R2�T�t.E���f���ij����=I8'rn]���b�E�
�
� �"���0�w�Q�i�c��(9�����b�@�s\��z��
��fU8��J�Q�$"*_�[t��=�_V_N���u������
+jf"P�r�+N&�g�n�\jlT]�g����7_�T����D�6�r����0v�Vj�����7(�0:j�c��@D�+-n�\���|4p�5]���aW�r�U���qSD�e"�w�c��"����<�jj�OP����n*+8���E�P0z+	���:��1�U�%1�m��BX�.�.P��l)*�*�+�a.er�F+R��/���p4����/��>|�eL��G*��"[5Aj�/}��1@S��^��J��+0Z��cO�`�&dps�c�*E��4��N���~���m��x�����v�V1��PJ����Ee���zY�H2����r-�0	c�z�Ddc��Jg/#�5��	��xZ+�'CZ�����5���}kQ��\������+���"]w�SQ����N�?��2(�$�<�,
�����0�=o�+����l=�����kp�� ����Y�b���v���ki�bUm~��'���|�����}H��-T,mEp�6��7�J�M�\(�;������?���������������������xz���������LZo������b+�as)�Z>���2�s���aj���L�P��w�Y�T�)UH�P�0Rw�����t�X��V�Tu�R��Vu�����/�i6��("UE�x���'n��
>�zm1V5u-+ �=J���L���Gn��1��V�q�T� 8AD�c�p���������K��Y�&�]��qum�P�W��1��"���p�6RW�b
��bC"2&X����N�]���������J~�*�MFS�*�"�^�Y.h�VjS�$�*9�j����A��j��RJ�R�����X.�l����h�!)�Aj����IQH�)��QR���q��h�n��(���+���Y;��is+��P~Q��a\�u1AS�]�aR�|����Yr��:!�y��r�]{��gljr��2�����bb3�AX���Et�L�!�b���v9(2�)=�Z)�Gn#WwZ�������4�$�N�71u
�,����\�a��$�J���I�rL�6��
z���`���:�TFf��+6hR��u%,��	�����1�L?�u/���$%������5���x�i�:i�1n�mQc����E2��(	�5��/�f��5[W��,���ipej��V�����R$;��lPM�<)�	S~���,<SwN���~,y
���0�6����p�k?��:��j`�r���H��1>z����&�;�e��H���]�������/5��E&���A�jQ�����u&?�����-���u�������]�������������_���I��M����Wb��6��.�.zA����`�T6���j��M���S�H�U������rt��z�����`���F�~U�%4�7li��1�p(���:{"��H�j��!��cn�{;��g����
�z����dj��x��Q������(��Fms6h�����/^7S�+X�����5�-v-�}O�ue~�J]:pi*�������v����1�s�nt���e�����	��Q�I�P���l��\�'Lv�D������32�cLJSv�6����z���t���#����,�\[3*j��d��MD�5��z�9�,~��/�&�_��L��i��������8�Pf\JE����c*�/�S\��(R����)J)@2��������������E�����uuY\���QA=��S�������
��d��MpM]�����$���p(��v��1��@�	���G/`q/�=����ik�F���5%7yo����I��C�51���U��Fl�W$Q��7�l������D�~������(Y��mCQ�;-��hI c6]�'����t��Gp�6�Q�Q�9V����F)/noM��m�h��h�Z~��ZAX����7t���H�t�) ���7|-L����N:���i����������������^���J��I����;'��`����9T��W����<JR
Z��s�+t^�B�H#I6�=4.H"%2��=wGuq��t�e0�=�{\�N�I0�F�����&�*[��EPIz]��7�n�?O*��9Vo����Pi�Y���c51WJ�����e#��i!Q�G����*C�YM�@�8��L
P��k�����Y��Uo?��<v�@
d��G�����?�5�% ��7����{-�0U��l�c3~��F�d�H�L�!��q@IW�M����V���x4=��5���V��LGf���I��G:��GQm��1���O����]
���Y���+��DA3�xUC� l�y_H��C?�����
�<��5��r�]��}��O����+Q:j�O��z�����A��H��4hb����)J)@2������7_�T����������n�4����o��������?���,�U����������y�hF�S�h4�J�iof��;[��u[Q[Ij����K��+B��&�X��I������=�I^6���t+�'�"�v�j�U�,5);[��I�l�{>������p���$eS�J	*"�M�(���\jW���Z:��X=3R���
��wJfN�HW���
�Y�MI"Z}�! �-Qt���h�5�"�����P��5{]j6B���DU�|
�J����M �j�j���OH�`�$E�l
��	�"=��Q/���_�J���G������u������Q��Sa]Z���l��t�L?y!��7��C7^VZ�(�����L*HS9�C������x�F������]�jR���\Y��w�>�6b�)H��E��GI�2h��E�����yu����>�����[��l���?)m���i��BT_L7����j�����$�F���Cs�NIbn����,���7P��v~��6���0s��fH�L�D��7r����d��&B�{t���Q���m��-�
b�+u��#[H����1�%�Z,���P7����1�=���������!�O!��:NV�`E�+���L�r�%�	��l��D"i&B��i��i�7HB�d�mG3�>��j��������!y�S?hv�#]�Bp_���"��}��3�8����4�W
S���z,�C�jQ���1rDU��)M��f�,�
J;���.UPU2QVB���
���p��[�!s0��@�-��t�c�-��N�.�9i-�)oa���1���U�R.��s���P�1�c�����i}4��Q��
�E>�n�]����oC���������?���zw�r|��7�w��i��Rt�B�����!EQ�1t�%J���J�&�� �A�MQ!l��$I2B������k�v�Z�&�����3�g�^���.��F
\�&�������2�U�%:Z������g��*zp���vrb�Q�4��b�
���6��l��Z
��b���$��tQ��h��iJ���	j��^��(�Koi�8TW�����[2j�wp�EC��0��Pw���X������7XU�b�L#��C���� ��9��x��b�b�eO����L�0mG3�>��j��������!y�S?hv�#]�Bp_���"��}��3�8����Qv>���&&�kVE����QwR�����;�cR����'��E���Rz� �p�E8e
h�ec�m��V�	i'���������LH�/.�U'H5f���;]gNL�r��(u&9�a�U/�����k����7:���4�h�������m!2����^\]�7`��k�y�6M�D�*)�Q���#ho��a�D������T�*��U�4�iO��4M�H�p�n��(R*�
`)�?��:X�=��n�=�X�Eo�;*��rGB=��Z
=�*�P����1
cD��I�_JZ~�sQ�*�eGs-EU�1�� F����e�E�G"H��E�JnI!I1,}mm4
�
^��p�jd,�!9����J]��Y,jd���od#�JR�JP����J�������UL��_j�YZ���|r!�V�F
�b���G6d�<�]s��`'85��s������S��1�����J�L����m��U%�����:���D�D4US���T�Z��]���6��h�
�����mET�Rt���T�J��/*�$�Sr��!�P��V�l�Q���^������'U)U�
�HJ:<�:r
E�R���yC�����1�])�+��%�J��
<Z*�&��'o<D�*R����P����0)� '�w��Z��o��c4�
x-�%s(�&"��
�=3Z4z�\���7��6��1����6���[u�A�mihZ^�QQ�������4����t����@��'8��G� a�%���H�U��:b*�ZZ�GS�2��5�{����D"k*��1�P)�@1N[�kF��������RT=
ODRT�-���(jr��E�&-/z�v�2���&����(��@T�aQQ
�����+�dVi/NTH9f�3�)��&�n�P���Co4��H2Y������zE��.Z�J4Y�fI@#��rb���g��ddsdYG�G�E�,�&	7h��b�4�L�"d(�������}X�iy���jm9�i����1�']�D�/]��at�TD
"|�Q��I4A2"���"�)�I&@��(�l]��Y�%�w���-��A#G�2u�Y�b�j�.&�e8�c��U@����@�9L����������T�[�82�����"��3���4��U������1a"�B2r�
j���d}��g��P5�"���m(��J��Lc����c�������"����=MX��]"���7�i��o�_����=}
���s�uB[�]��=H��|^�����v�xG9������w-�
t�9�m7D�jJ��f.��o+M���3pC�����"`������si�W�-��I�@�|V��wf�r;�� "#��}fm�i(8r8�*����I���� +z�n��]�J^���~�-E�
)��PU7�-;9{�e�����������o�j����R	�N%���21�H�����G��n�6,�D�f��p*i$�e)L���(*Z�������)��N����h����)Z�9Hz���i���h�=�E�j���N����*C�(�����-=i��d�[z���������������T�P1��|Fft��J�N	
��`QP��V��4�1]R���n��`b�zna��6��si.��c�"���c���w&��7�}/��ch��_�'}��K�y�^O�N"(�
����B�f�|
+H��St�#C$��A�$�V���RE"�;����s=#����O:��=�ma-R��3��`��5�J$'��(�*����1�c�L 8��uc����bj�d]z��u)X���s�v5,}=]2~�Z?|�'���S�P���V:���5m���q	omML���������Rt�Vl����t���(���P�c�����g�m���I��R������r�{����=d.[��r���p�������Qml���w �6���-/n(������U�V�j��J�\�Y���QA�D�#���l�H���p�B=�t^1~��"��7��U%S1��g(��)�@D15Qi�Jzm��ARF%QNYl-D��:��3Rt[�6"�*�As��p�w�?�CP�F�t�R_��57Z6�s�}����cF�(�b6F!I�I�z/�_��.����NI=�8�Z�����Pn�I��}����������v�����9E5�P�Q%�!T!�S�b��eunt	�*j��p��:�+/EH���@DP��u0���� ��8m��wU���.�t�v�"���l�b���@�$2f �LA�6e�w~��f����>�W\�������*��K&����mS��M�
�7��*��
�c
Am��	F��yV�����T�%iE����}AKT�9b�U4����r���2���1�et�M�2��������mL���<�34#
�����8Y3(	����(b>��]���������tu���]��cj�1�������t��Ddh��T���,D\.�NYB�*�X�[nl���ZI�%��4E3n�xw*���I�
Y�nwN�Y��"����C��cp��R�$�-1y�T�kF�r��m����k'
�������J�M��,����9�9�q1�#�
7+Mz����v���������iJC�C�#���� �F1�"
6t�+& b%ndWh<t
;,�
�*���l��^)�����>.f���6��)$�4�A*�G�7%m���)n?�;l�E��W5>�&�Q�i!����b~A��]���o��:.�0�y[sh��.m�^&V��J��5]���n�QQ���
��@������Mu�]ep�����u
H���cD_�����r���n��6��3��e��$���E��Y;UPb�HT����rf�).��{�7����+��}r���6�1�P�OS�^���!�&
�����JrF1�H�F�OqoKNS�u3UV3��z���R���+���4�MGND���)�5j�
P)QD���NvX��r��&�SYST����Y��%KQR�]��O u��{�Q�@$j����IX���=�X��KF��Vn��������3�\(������2��:nLT��m�3X�v�-ohv"����~&��ihiG����F����@� ���d����������J��Poh�ri�?1&j������NM%� 7VD��S���(�4���Jm��v��IG��������B�i�E�Ie��r�����1�D��5
�)��TF��m����c�#�j8�O@�W��c��)�Aw�03t�P�)p1�@1H���������k�e�RO0��������<u#�tr]TN�d!t���1�vZ���RV�j��v��an��kYH���XI����[�H)����7j
�%��Q�@WOt���Rs:���V�l���GQ+U������O5r���Ed�rM�X����k)W���k���PsJSsUE������=D�%����)����+g-����PIT���0k��c�{A��G*�K{�w�4��b�R:��RU�4��8"�Q1�.eD������������:R��%���lE���d].�'
�MF��.B.�b�MR�������%h������:j�T��
d���:�K
g��S2�����_����>���{�6F��Y���8��5bQ���Jr��&�z��
���p��'�JA�a}/�P�y��5M�������8�����v�V1��,����wZ�?�*��j?�h�e���-&������n��������.�r�]Y���8����U��--*�A��=IW�M�u�jo]�oh��C�j&���5ek}2[x�z��mO���������RM�hv�L���W/,�[����5�����yM8���oS�#m���.{�O��L�����t���8@@+mm����c�/I���WJ����Z_����g����hiI��F�Z1��%��<��p���G�b�p�v%��\AD�w���w24��m�:�@�2�\����J�h5��i����Yx��!���*�����������l��k�K�L�6B�Y����d��U�L�����d�GF"u�^�`�r#���Yd�)��s;c�4�v�]3_!�X]
Y�����O�,�=��j��dd�:�EDZ�$�.Ed*����&++�M(�2�GY�7�������d�us�N��(��8����&�Z��R�&�"�B��-�Vn�d�0:�D����M3#��m+o��*�;�l�����d)�e��v�ij�9M������Rz{_�����cian]��z�5���<!-�:������h�N)�P�5��@U*B�����n���H�T�q���h�<�C����]��,)�_I�5�����"
�)��X�V��,�#%��7�4�����z���l���#�meS������+���h�����)��$q!!�R+�ZJ=R�rU ��e���;����Uv��Q�������3XQulK9�r���jfRQR�O�t�IT�b��/w0�@�=�4�������#��'18���	'Q�[���E�;�N�d�I��L���huHuYRiW������+��-kI��s�����R�#"�S��V��T���aVJ���RB"Q��;;t�8��V��R��=���V/t�^h���6��+��r�,MN�3����:1�I�P�AM?IbS
��5G����13no-��H��.�$�g�q�Ns�,^�y3G�oP*�����@[�t�4�����H���h���z9��X��{)l��Z)���`[*W�g0�%TEV�!(�T��l�K�+m�)C���P����b�4Eghur��li9Z&��\�TtR�$�(N�����)�B@jV�n��]aVZ��M�;z�����bFv,�xe�}?�����\��:��T�jk
GX��I��\M`Hi"�����0V�����i�X��t�eVZ
s=�L��h��>��n�z�S�%�:�C�J[kyK���,���U;���LJ
���$�	DY�����L�L��5�����C���\�r*������-��U���bYX
N��j���&�������9s7X�!�n��Du[���@D��E�������h�Q�������q�����i�A:v
��nt%X��Z+�7'�k
j-���}�����H�9B����3#P�I�����Ux��	���wH8����e�MG��m�����r��[�U,�UD,�"`*�d��d�!��H�0�!����M�Lc��N�l����������S�b���ZM�4J��T�(	�t���{����e��b��4U���H�y�R	��F2�i�M��������f!��w��ju�[E<�d���,�9j)��$o��Vs���D7��1��J��^�R��Er��9{�N�R)"����4�����_�����77�����%�������Q�9iem���$��x�BJ��b���
q����p��(���I��$]#Q#�����(�I�&���z�����u� ��o��2�h�9J�jZ���H��Jf��I>|R�8u6�Q?z'E���> .%��X�}B_�
c���t��]O7�y�S1����n�5��w��)������R���b��U#V�%��Zk�L���{ �����r�l���ld�,�d�L�����i���+w���G0���3��7��Q7��0}q&�������L�n�"7*�!S�����4����v�GS��s(}�G ��Q�������M���d���m�fy�M�J]��v��yzc��?��[Wt�m��_���D��sQ:M������
��#��L�L�:T�z�����;-&��V�[�7�6��	&/�����~>*��'8n2d�f���WL�M%y0�����h����+�$6b��e�>|�t��f��B��N��%"i�B��9�)@DD1���OkNZo��8�F���p�=\�m�(�SO���MvO;���e��X��X.)&H$�]#`5}#�����F�j!�sY�i��.�z��J.�2L�\�� 5�$
���)��8O����
����n�"������������6
��*����F�JVU�
�bE���M���J�q�����?��\h����>�����P#g����������e�D��S�&�.V����f��p_������'��d������PZ�{y�k��y�KhkU�B�cN���L%+*�S�"����e&�ED�H��n������4�2�*��:��m6�DT��������%]	
%.eA�c�6�t3a��o�!�^�I3m ��}Y�d��j�
�#D�S�������U]��Z��5����5aZi���O0Y8V�����JeX��9�#V�!��E
DD�~��������]gn�U'?C����&��j��a�a��9����&a(��<� `
���~������V�2uL.���R=Z��L���R��)�#9.UN��+���Q�Gn�G'�)��]r�:7I���5E%����-���f]F�j�����;EER2k;Zi$J�m1toK-
i��3F[�kI�P�='�6��)Z^1(x(v�b	�l�i�L"a�3�DG�>����KO�����{�gk��!�ah��	*R��vJ�����y*n�n���x�B?�y��#��:KQ�o������V��au#�G{�n-�
^G��b���#�
!��j���j��[;Z9���G��:��md��S[$��$�����T�hF�Rl��A�"
V �l��w�:��j�Cw�F��k?^[�[Z�/}ii��f��G���	7��&Gr��b��J��J�r���)�:�����[+�#^k����I�Q���J���#[x�6�����4.T�\�v��W:�"L��9pZZ[�m.4��I���H��=�+�z���+��H�|�#;hUh�����n�
����;=�������)[�Yj���K�c8��J�I�=$��
���MZ
�!It�f�U�4-�gZ"�[=B����4o��Z�(rQ
�m#R���Naf�����o�	6)������.U���M���{�obo0��mj��USu����0�p���jZ=t�!E��IeS1Q6���MU��&*�>���.,���Q�1�P.[\T|��S	��&���I����}�:��e�����&k�M2����Uk/*�����������ur��p��#���Gn�����\]����@���T
l���H���l�g�
�,�f�T5'�IL$e�3t�K�~��6h
;*��_��ag4�����v����72�iV��5����T�},���3�TIi���{�0�&:�����V����*p��h��>I���8�3;X�4��1�!���N����S(�qQt�����:):F��N������!V�Uc��Nf��*"g��{�$U1
�I&�f� �N�^+3z�����%��V:r�$3������$��
�
����{��7]���f�����j��GCgj��3f#����*=F��}AL�n�;G�%5S1R�!H�-8f C������i������R�E�������yy����1"�9����E T�k���l�"N��Ue;H;@�j��JY�`�t-��ii�����uO�T�����6L���|�����\��b/��r�[�����+9j���b����R��g�TL�=�����l�3EAP�\5v�����
�����L]���md>��o�i�����������a��3!�Llp�n4���\K�)I"��Qtnl����USJ���q�Y�����*i5��n���n�
'Uc*���7����!YmL��cv�����db��gJ���
*9���R���M�_�p��8o��������h�F�PTy+���f�I�Jm�(\p��I(T�N�g
[�@�r�N��B��$1g�7��Tv��������f'P�7����!���0��+G%��|�`��Gj�T(jR�������i�)H�
���������l;6��������Lr���SK��ah��r7H
����Rm
S���MP9��E��P���+��2��u�Q�����+����	K�M���)�n"���Rq��"������*����*��P�T��)��P��� �;�7(�@e�M"��*>3����o����T,���J�!.�Jp���s~�>"_�d���H�1�#�3���6��Sh�}��m�9}l���D��UP"�E��'�lC����hs	_1������oaEHA��!�}���q��m��\x��o.�=�������������Y���
�e��T��*h�Nl�Q��1^�
0V'�4M�x�
�J"Y#�a)�!��hw1K��S����v�u��%M��p"d2��s�h�Z&v�1gS-�>���Q�t�Kx0�
������c�ck�K*��G3"�	��J�(d���^�n%i	���xUN��S�&m��������������dd�X�7��!2�z2a���pd���}x��~�gks������k��mj�Ii\� B�n�E�1�
����[y_�J���0A��A���r{���������%`��a���db/����n�-RI+����Y�;X>���r�?���R�� P�5�|�H(��W�D����)�.�����3+B�TO�	0n���r��g����]6z���v��WV�~)�e0������sJ5�i��Lb�������	M�[0�����;|Re*�J��E 6a�������K$��F &h*">�x�4�Ss�����`��N������$\�PDs7t�B�����*@J�jx�(�p@~�	?f��e�#�SX�>�@|I�x��q�4�+2��+S��Yb%�e�x	�q��G��c���������q��j?.�
��&��"������u ����V1�x�^�Td�'����j���M�J�*�������&��1E'�{�9gl���9�r��IM����A��U%��{c�����iVLST;��3�H�n�-���@C����Ul�R�g�'�&)�A�b��AZa��r�@����O����!�B�2�������1x��Q�H�(�US��PA ��,���k^�Bm�h�fJ��%�PQ!�D.�+��0DaDIQ��yG��rC��v_�������q|hKwn�����3��@�gx�����{8��M8�WO���8z���.�����;qE�{�g��{���k"���#Q�u�����L����'l.R9�P0�8����]����d��7�lW���d��0MN��>\8��E��*>�&}D�I�$�9LG�v�Q������������Vz�o�A)B��m�dm�����i�O��me�ID�����@�j(�������T�E2��t-/�z ���)��
�d8����iH�J��)�X2k���]uJe�g$��Dv-��+�����Qs���0�/~ag��^I�m#���|�Q�6���.���!D����!h���]��h�fq�iGo���%�$�"� ������e�{-B]�~v�B��w0������c�!�b' �����!�#�U[w����"�&���.F�Y�H&AAL"S����r���*��A�8o�0l�g��t��b7%����AG�$T��0�n_3L���a����`t�����t��Z}~@����y�7}`�)����o�����j��P�u�������DHB��0�du���30�[�E��E��*���p@Q�T���`���(�x�!���1���<����_r�=�����c�����I�E�b$|.H30��:��c$�g��d�PT�K)*��\��?�8�n�c�������QR��&�fy����T*�yq
��P��"�|*o,�d&A�a��!o��xY�ul��JID�QaG.U�%F��!.c�����������98&h��tH�L`�q~$"�R��D�1|
�"d�L�������0yJ�r4�n�D��n�\�����;��*~I�j��B@$Q�Z\��M`S�)J��[�=��C�������;E)���R���~$La�/��4��H������a��h�\�H#��WU��b����y��/*�����)@�!���p�2��:QH���(�J��e b
k,�1L��UT���!O;&Wh��"�������N�����t�|�#�C-�4 [C**���=C�i�3K���� /.�3pm�p{D���z�PS����v&L@JnT�>�(�7Q�8qE��hx&dT�Q36������DSQ	�(�V(G�L�����7(�����>����Q@!�D�r��C�6��g��V����������rVqsPR�2�r&V��Y����w��S��;=�R6�L����){���Q����L�Wo��C<���!d��<I$�3#��cf�v�;-Zs���T/C��N
6AZ&�y���hPw���r��a/��{1�B�v4�/����	DY��`&�zSp�������wO0��d*����i��1{�MR9B7
����f
��{=����Tr����~�:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[�����Y$UX�U_M��a������K�]D:���$��:y���������,<����3�`/�����x����V��(��'")�gR�d����$��uf
�HnQ��\��D�N���s:��%��E�]&u����[�x>��|�'�s0�i�_��Q��X��
�(��;���;�He
c����

27)��;B�?q!'0��F��U$���o��0����1IKXi��
c�?�����=rp&0A���������c�w?k7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������=���'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qbR^4���P����T6�����"����EC1��!��G
�i-����z�W)��0�?l0VG~��%jg)��8D������f��8��B��|��sG3��w�Q&�g< �����q�I�8z�&������}�8z�M�b���'+e��iDk�30�@8DD���4�C��C����"�hg��Z��������}��D��r���f����9�W
&).��!)�x�!�D�H\[f��+4���u�����JD��H�'�9" �b��]�!�9bj�P�����������$�rk�6�����.�V�8�1�"AF�J���S7>-d��R.y�gH�
.�"��F�U �	T]���KDG�EN��!
�x!b)HP.Y�����ja��n�9"TBy2$2i~.MXT����l&�8@)f��]aT�
R��rfx@�����\6d��o��S�����}[L��r��'��A���.�$QM�N_��QQL����6E�-*-�5@��( �2�����S�
&�����Cg�����b��2���C�� 8���[x����[x����[x����[x��RB���k�a���
^�W�+E�\�Lv�&#������������j���
U�n�D����>zR��=��(��!��S�3 �S�������RUu��[���YQ,K*�\�3�]��������t����������(T�Y�G����s���w��W���u��(���@:���*�N��E"���\r`,�0.�x�C���X�Q.�
��z��������L���%�}�iB���@�,�d�*�WS�(-$K �N"C����@���	Q���,����d�b`N�QUp������w���yb����]�3Jq��G6RN1�"&�]$�����h*���U���������#��D`�#�xGf��
+m.[��_=�N�
��YM�L#��xQ�R���iYxg�7�`Y���V�$0� �F�����4[�~���~����Q�@r������w�q)�IS�t�����~�#jKOZ�AS�7�����L�0e��,u�7��x��:o�����t�?q�c���~�����s����A����b���u��E�82K:YE�&#�	�{�����b�W�����J���T��)�"7X�����+�Yf���eCM����T� s�T���2���%t+��|\��%�JQ;U�."�s8��5	m��-���)�4����8�V�Fi�vx9dP����	Tn]�rv*������p@�!�!�bcV�����F�u���7��)M�{���h��/j&�E�@�9�89�T�����,�}������(
>����T:��bW�P]!��qvhLS���E<����d���HPG��(�@��X��4���j5{6�2<IC���5S1j�����fb���,bnu3T�=Q��#$��.�V.I�C ����������'��"�	t�J�UE��"n����:��F��V9g��v)�51�t�P�cT����	�[��[�x�=�E(3�_Z$Z%XT_��+k��.��)�?���h����~K�m.�.%?�*��uR�����P�b�Sx��uE-JE���F1�d D�~c�B���g]��oN���7�z��$S�XN9�T\������2�*���dP.�o\"@q��)���V��(����'o%��F��P��MBd  "��p�����j���
�+�\DU2��d"9��0�%n���Z�@�Q(����q1�������aQG��WE����dT��NP8��8X����`�6MZ�E�$��D���
a�O7m �L���~���!�	��U�6��q#K�|U;-�|$��r&��T�Er�
��������P��	�<��5H�����T�P�G<����LjS8��On�0/���R�8%kJ�5�@[a4&����!
���!���5d�D��(�R�xQ�T�o�������%O��0{&�s��#��Jc�f#�;oO�vJ��8�!N7�ny&��Jv�0�g��j�S�^�#,�	G)���r���k��UW����[�J���M���N��}�!NQ7^���t3fm�	��K#��}�� !�ht�b ���UCHB����K�z��m�',�B���p�x��g�`�+Z�5z�2�B��3=!��D=�k�������E�`!��9H�La�D�����e�4�i�����"��a�?���K�mB%��	�w�S-����0��L@�P�9@�8oC���L<E�kN����IS.��9��Q��g��S#���t9R�17�"������$l<����K7�Ig���@��#���)� b�J!��C��.�.%?�*��uR���`5��b���0I��!�>�=f��$����|��x��/����E��q�mOm�|x�q����p:�����T������&��J�7�*�
���3DL$��b�\�f]�����t����An��$�E����%,��m�]���R�*%q�Z�A��(���8kQQH��b$�F�-��c��Q���8��"0���XR~�I�m�)�-(��nLV���X�lT=.bAQ��*���E�`�N���*vi���%*v-��E����QR�����C��E�3M�\�ei";R
]W�'�d�UJI%9o��0w1NH1�����QN�e��t��� ��H'
�f#�.�Z��8��)�m���Nh�2 c(@�{6m�qY_�n��5M��:}`T��P��p9�nc�b-���#g�����D\��!s�#�[�x0w�n������#����\*�S,�AB�"�@%�v����][~{eu(�9�)��BHA�D
����,�2g��@����|`*�&9�r�����z���I���[W`czGx�T�`����������hJ-V��&NP�Hf b��r��h�t�F�Fm�;���yP2(`10��>��h���m��z�Ax5���	��M1L��A
���qE�-JY%�Z�t\y�Y%��D�LR*dP�������Ec�UhY���G
v��.�U��vO*� �)E��YeVUu9A�&��M������4�����$�v#Q7�p�"ED�6Ym�EsF�~[V�%)�U��E�Q�e:e9�M�4��R�B�CG�4�h��T��e������0�q"��Zx�����"U%H���h�?�W)�6qF]*j�<����W
Y�(����+�P��=���N�����
��D�Q�c�e��
w@H9��`��
�fg-��I�*�b�Q5AAwr���f�1��w���gQ��:��j
���sU�O]Fz)�8�����52�����L�P�;�#�wMU�n�{6��3T��
����U�D��g(�C�2r�
���������6��kD�k�
x����t�+7�+�u@�9@�LK��\��e��R,�s"���uK�C���uR���cY�
�x��Jt\���6C�:�'�����������r~<z����� V��G�})N<MDOJ+.�vn93�C*l�1��"8��r(��)���`��59v�p�AF�(��f*{Wsm�B�������j��9�98����n�p.�us�W�+s;V*F���T]Gp�Cg��@��w��\�VfT<�NI���g��!W�se�����}����!N1p�r�H#�H�}�����k�w)w������{��h��9��~T�w�e#%(�^�j�Eb�T�$��C8Khn���isk����-?C��S��H�w�a�����rc�C�b�R����J��}G��;A�
ML�dQ��WS�������&��Na��M l��r����w2���v�����MI �yx�	5�I��S�(��1Ci�����?Y@ ^��k�U<�.w���J�^�|�?'OI
�f�J*�0�>XC �;��u+�JA�>����O���h�7�-�r�G��]#D��)XC�RF�����$�)����"r����������3\��F��B�	yAYa����Tn�L��I�+�����LNt�]����2T��|���9i�m�U|�h��*�"&�cG�MR"��
^��B-V�I%p96n��=��$%���1	6��t���A9VP����G!�c��-od�A�%1�Yq��"��DDvb��dhYRT*��N�:�U}-T�q��@C1�X����)���7�|�8�C�Z$I��(���A�9cLZ�-#%P�Q��M7K��E��+tI����9e�cN���Z
����d�7��,a� *&e� (��m�b�����l[�
�0~��n����)l���?L���B��w-7*�uU�ZK�;�(�DJ9�16a��b���Vw
�KC�,�(��r���@Q�D�����`�>��$-�7�v���5)
�B�l�L��A�!�3�1gT�:�pR�-3W���%���EO�����]'��M��@�{@r�3���)W��gGSM!!ga(�P�����L"��&q�C�w8q����3��{/�KZhV�o�0��_L �
�9T�)�����m�cE4�(�:wv1���R!�SeI�ox@���C�ug7��<�����{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs������s������Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"�]����{��yX����.���9�]a�������O�y4�����9?���o&.��$R�P���'�s<����uR����H�)��/�J����[�z9�%l�c��;�,��k�\k�l�VXG������8�X�q���9�_�&����
58d���,d@��gD0�i
N�E5X�6��d�J!����B�@~�af
�b�b�DWf�{T��#�*�BM��X���DJ��dZ�<"	 /��#$����w�7��r��X��DPI4QL�D�H�"d(p�.@�y%I����s3�p��0�&UT���c������l�{���l���H��,��/O�z�D\:m���!Yd�?�82Q��$D����1�x'���-���x�F�I�K�W)�@����K����
?F5�O��k�� GJ~�r�xlpd ��N%�"���C����aH�abR�XDVb�{B4TG�TnR��H��F��
��Y�� ���7;��s����n�=��=B�2�`�R��L���$4{}��|NI0�~�a.�X�p����VG.IE
"_�����.��U2(��!����>��
�LiDL�����xD[�w3��=X��-�Gf��K��sp=�|�2=�~[���6���
�Pnr�2�`���:m���4����n�c��T��=2n��e���L�$k�����o���L@22����0@R0p!M0������v����9d�g
����(���8�8?Z
=v��b9�,DJ#�� ��3������D�8�����0��.c��aE������|�� �E3�|�v�8I����|�d��"w)���
���������?�L������DD3�"#��b2BD��Hl>
|���E��� �Xj�\�!��0�����	�Q��5L��[<���;1��h�[iw�q)�IS�t�����~�n���9Eh:RE�K~P��iDF=�0�S|=�+u��R�����{"�2G��\�� �U;���}����w�q)�IS�mQ���gkz��aM���P]��`IE��$&��Ra�EI3�FV9
�I��H��H�m��l�i��U/� ����ATS�T^����Z��U�/����d����&sM��8���6�����c���7([�lV�)
<�~��`�<����&C7f����������S��<���]�\J�T���;6����B��]�]*�y�	7?��h�6�Tva�	��
�i��B�E!]���A���!�AI@L}�����x�.f��-SS�����m��T�l��}�'�N<�b��RMs���{AI�0�q��t����?�g�i%S6�L}=�vf�NSw��1�J�����zU�q����h�	5cTU�����TC�l�����;
a�mM��n�nb������7�"�W����64�6���s�Dg��[y��rd�� f 8�g��#�����~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_�����"��p��e��c��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X�����3kW��m�U�J�#(
�!3
�6Y{8���n�B�.�7���JYl��f�Qn������d����~\�XE��C���E"a:��
�tva5�0%HU8p�
��>�m��n��K8
�dP���x�����[iw�q)�IS�k]��t�y�#W���8���E"�"���=��w,85[U����Y�T�����f�P�������_�\��T��3)&ctr�*S~����}~��=+C�q���87��U�iF�LP����$�����bw^.���!��[y��$eZ�s�>���L��,�tjm2�j.���G��w���!^�<i����$���w�:U9���������jv����FQ�o)(F�K�r�*1i��
�l��@��H	Pr	�}>X���G0��0"6������6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57��t�F�����<��Qk��)�j����0�-��c�b�����-1-X�r�����It�U<1K���W��57���N�S�U�G+c��f�!�@� ;p�)�D*i��!t����)7�TiY���(Y���I,�Rt����|x7��Q!��G��(�z��}���~�}K��0����]��D�����NL����l�b�����acm-\�����5�4��&�t��SG(����6x�T�R�u/T9�`��J�7�Fr�R���kk��OW��r���
�;s(�������sOwps�qj���r-�������(���&#7L�#��2������N�-?j��	�H���\D���?g�Ze��K�?fm�j
J�=)�IZ����=H�Qt��r����R����S!@�!JB��JR��J�`�qL9��M��l�&�L���2��c��n�c��z����f�N��
N0��]�(��2'.��J c�Dr�1F[y����^[���������'��QF2�e�*r�~���9���-D�qWoO7I���g'JMD�P1L�r��M*'����S�)��eL#�����
[H���z�����RsR��T~P���"f�n�'�)�X�].���]�qd����z��)��&�Jbl�������
��'����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�+��Q��0��}<�T�O�#�U$Dj��T0�x�0�W�����Axdde�#S�9s%�<��T������"P��6��������@��mJV��~�u��.�qMd��Ga�Dw��8@�NE����JC�P�(��b�-2�������w&�R�����Q9���3X�'�w�9D2�������V������]�G�\��:2�`'?|!�c�r��QL��@�	
'(�
q�=�/ �.=��@������,����	I������Y�Q�%�rr���C�.�.%?�*~�,��(gJ���M/^=�9��Tc5�R6|T�Q=��6�B��l�i�5�\e��#�C�|�����i�	dl�q�D��%�V��`�QZ����Nza?KUGG�1�S�v�s���uR���~�t@�������k�H�U����S �'�����e����OF�G7&[�E�pL�|}�~��oK���O�J��:���&���}1"�Q�"M� *�1d@>�������r�15!M[�K3CS��0#.�T�]�����La;��e��#��-T7_q�%��E@���`��R��)HB
R7JR�p�����U/� ��IL?P���b�A��(&��p��Gf��q��:�����sEY�K	��wT��*F6�� 	�{?�T�EHEG�UVU��DR����=h�: �_�����������ij;�WC���U���d�&
z^�����p�L��4u;��jc��]�D���U�&�,�tt��We���:h�����5k��
����iB=(������V[a��]�_O��]���'��@HK3���~�'E���4��N�c�������������n����m�].�.%?�*~���1[����������Ds:���d��M�c��p�iU�J����D���eR7\;I��T�(�}�S�R�"w���^�
yI�-�}�� ������4�����~���������G%���D����+nm�Ce�������3
��h�iY$r���i�8��������z����i�ap5�C���iZv��c	s(�oi�R�?I���4L�I%n�`�E�!� ��h&�C�R����2G@���r�6M�d�E�:pb��
Lc�;���y��/q-.�;1"t�z��!$�N�y{��z�.���i�)���1�f�xwi��t���WK���O�J��'o��D�n��(`"i��b��9��h���VQ��vU���
��8���`>�gL=���Q>e�x�-DJ��-4(��R�be��d��S,�n
��(��
[�T[�E4H��Ei&@)@��e��K�?e�;L��Vj�i��Z\�(�mD�OK(9)vo�����D�D�L�&B�H�e�!@�c!)mU���%�Uyw�	��.��	������Pt��Q8���Sl�
�"�fe
�.�uG�	jy'$UHF�n*E�r*S�Ug%W(oC��;s.����K�����ZMY����HT�qR��"�I[��.�E��H�r-��h�v�"E�������?fS4��5qu���)�m?	�s�go��N��y�o�8Za���.�O�#�@�w7]�-����a�eJ
{@�V��LVJ�_iW�Ly	��,��Y�YN�8w����e��K�?e�
�TSaHS2��r��HE�loE�T�_]h\&����5��#��w�S-]�f���w���s��%&fa�%@^�Z�a�9�Sf�����y��kC��.�4���f�6���
sU�}\^�!*���`i�E�d��,����X\.�����o����\UwW���]V�j���0����O��v��� �cn22N�b�f�#d�
�6(���~P�S�E�Qk$�IFnH������"%l��
�R�!0b�W��jQ*���2[{Z���hX�'2��ULjf2�C�E6���6��V2���t�EV��[J�����L����b�j����GP������e�^�c�}4�������t���MA�L�NE�&QI�T�;1�J�9#��O63h"=��B�B��{�����0�@P�12GuI1�T��/ZB�M]���
�?-�@`��G���{k������h�}���WH&*'���S����|Dr%m��{&�"��n�"�w
B�}WL�����������Q�]�H��4;1:=�����!v���#������$F.������ TU��8	�|�Dv�cj��C����v�u3l��=�M�t��iyF6��q#d�\M�������-�6EX���h�0NA��1x-�tAS��L�	J*��F�
q��P��D��J���l�E����#�����J�_HIX�Jm�%eI��]�,qE�&���E���1~�*�";�yF��a��# �$���������<�������t�X[��F���b5�|����e�V�K��	��C�����m���.&��i����u!Z<��SD����
&b�bD�3&��T�W<����e���-����%r���<��m�������?�\,��]�{���aP�B�UBT1g��h�EU�8x<��v{�	o����J 9�wr6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6++���\C�p��Y�'�G��@(3GpDD���9{8�u;\�Z����HGU��[���y�1��*ex���1)�
��������u&��5���PJ80U���c�����c�����a��\�H��i+�m������s*u��)$+(9�QL�Q9����i��U/� ��.���E�dTp����(�TQC�#����ARB���R6��

���"������D��-��r���g���U^8M�o`��=i��&�7��E/���kgm����]/;���g��j:�UV��V��
�UoW��$&�!�8������6��Tr��'���_����a�;k�m��58���A�7&��fC�t��c)��WM�k�n��1�:��L9@~�������%O������y@�e�V�U�(��$�9LrfP2b\�n4���n9�X�z���#�$�-���R(@�3�
)�&�4�S�(��  ��[���{���6]��Y#1�f+j��������v���(�2{5�Q��?x}�:z6�>�Z���|��,�oDR�r�8��'N�9Ql+�Br��m�_o����p���aZ_:�2u�K:�z�;MP\��
�L�c�(��G.g�o�~(�R�~�*T�/p��#4� ���	f#�,��|{�!W�E+IQMD�U��M�y��&�q��b�w0�d+;��{�V���]$�xEdZ�sw� ��?�r5�"Y�7L��E�\�e?����0�8�]p�M��Wp*K�t$�,&�/
J������-�?��0��j�'�#�D
���3��=G�_������i6������-������.�k[1^���!�)ETnVA5L�5B�!AB�� ���������?f���U%K��Z"����D�4O>�d���k�"i��5
_�K��iO7�i��������@6.��nRJ=��$���C�d09mE����[�m�)C��J]X4s2�k��7X�D��+s4�0��M�Z��Z#��kj��U�
^(z�>`��r��Q
��2�3&��rM���,������j����D)YU�D���SYw5��SF9L����	�1��oX���SR��6���/H�U*J��A������IB2*J)�G)w@v��[J�e)����	 ��
M�~P����e�b��=�r��|�%�@�Z3�UAH;���`D/���j��������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[�����D.�����k[V���(���hAq� ���{����;1}$G��i��vGM[�DL�!r���[���������x��[���������x��[�����)~��I(��"�P�L��Hv��l�tUS�U$SMEG`�r
u?���6�5M�J>�h���2�U��{�J!U�E�}X2���W�W-�n�r�X��0�\��6�iO�����O��b��*���[}OU���yG?	�4�����|�l c�������<U5��;O��Z�����R����=��������n�1�'W�cX�Gz(�������}[K���O�J��!�ju���������4[7�d�����G=�q�>��:���yO�q�b ���~�>
n
2���m�!n���2�� �E �ri�F�\,.[N}����	�Q�(���8��Ck������%�;����oe�3�J9f���yA%N���L�����/��_�A�+�.@�14�?'4���RCjeRL�?��
@�x���+�5�����YI���9��^�:�	N@)3/c��w�T���%��U��Ne�(	��(�8�9�m�5WN<$�A�R)�` GL��Eb������NBa9UPH��w��������}�{�������o�?��VK�hQ_X�w�q)�IS�_S��4����L?\�)f���c��x��i
�0��nI�S�A��h����|����(�tC�^�
��,���F�rr�M6XJ��@SaLR^��a�_�T����WIi��S���F�1�z�O"��p���|D���D���\8��4
?�t�ci@)������p���0��#�g��D@DDG 
�"#�cKt[����&M
���2�g���>:��UL�^L
"?w�4c���6��d���-�5LI2� �|o�?�����K��������W��6���+J=�l��A������E,�`1��#�v�C�@�&CX����_�;��{�+�C��b������[�W�e�����w�������VP�����PH��D�$h��l�.�f��w�q)�IS�_o��o\�k��
��IZ�6��8���D�HM�
�Y�v����\��,4�f"��B��#�#��]CtM��-LT�4���rD��IRA]�5D�~��/��_�A�*:��M2��9��!x�0�m�EZu���j�0�@��<��()��2@X�#����`���t���&��\"�H��4�}��iRz/.	�(@����
�k����e,��d��AiA��!�pn��K{<�}�c���u���}�CA����E#
��sU�sQ�THj-��$������ ~t�P7��t@~���	��U����U1U&�����&�!�0�0�,G�+QVoT02�jB��������[�-��\���x���i�1�J"cg�cOW���tt���eu%HS��"�V6~��Me�6NJ�;�
�D�NPn�_����Kg;F���M�)�)l�i��T�8�Sf�y�DW+]�S2�-��\8��f�u4��"����d)�s��C��O��q��!�l������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�H�|��F-�v�u\$D�A�UP�9�/v��P-����)�P�������}�V����A6�������Z���I�kf���;Q]���8�A�P0�h��yT����<�|x��U><{�*�=���O��C����=2�������sN�$�gM����(�W�h�F�6.y������[�R77����yr$\�L~M���Q�G
��b;�?g���d�&�>5���],`"M��HV]em�)DGM��lg�{������E�N�EC4�q 9M�^U5�	�=����)@
R�dP�?�)�LSAR�2�U��� ��2j����C?c��k��YJ<��,��f.W��:�nW�HL�C86�r����3�U=K��SG��K����=5[G��E��Z�d}9.��i���eRr `��g�6Xk�m�)5���V��kT��^���V����HUYq_�C�������Ps�Rw=�l��qS�b��A��O�+M(AU�� C���4�g��K3���N���}Sz*�����w7��c�va���f0���~�����W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����&����������zj
�`��NE����L��)�B�wGo,���**����S�f/`c����9a)��YK�<�(���D<Qt��%���f/���c��Re�r�����s	3=z�����z�w�>�8���~|/�q�����_����������	\��H�H�n��8�m�*�v��n��P�l�h��}S"�xDr�?R�/��_�A�*���)�Bh��u}^��AQ4��q���S�
^D�l��A�0�Qe�)�V��E�&�A2�B��s�u)�K>�gR��m&�a��jY�����E!�/tLx8�mU<����A�@�4��J�.�*�o�1��f>��&�����2��:�:�:�[�F^����+=���������pTZ��tT�3d���������E�������R�n�L'_[��!����a(����w��mAC�
�
��
����]�\J�T��:�|�?��G`����1JU,�N���������1]�����i��R������z���Jj�a.���e�_�T����SPU2���:����v��$��{S90����dq�m}����uk�� ���F��[�U�`��"�fM�����W=E�#
�Q���t�*�B-[�*)�P�x�{@�K%���%�����$9���EAI'����!���vg�����x�u=l����Z�\=����uY�Y�V�J
�U���DW��LED��p�"��yT�I�����_��G���h*��]��/!M��Po�b���U���IC$eH�LM�&!L!�@C��]�\J�T�����:�y�6J������vU!j�d�G�9�a��*�T�v���("q�B�8�g��/�3Iw�oU&����f�OYJ�2u!/*����C12e>�����-2������Z�]c�\�i���#E�m&�Aw����0	��wqh�q[�I����E(B��H<t��h�#�������U�z��Q�Mg�l���d�`U����
`owDqMPt��i�V!�4[4J"M��	���f0�#��M*J�kO�)�Tp������J���Y����������<��V^����		k��M���������D�ETm�=(�FU�
�SH���*C�	�H���)
RO@���@��u�}�DG�G<U�Z]�U>�ml�����-L�-9����k(	�����9i�F������&~a@~�������%O�m��2�����J���r�r"S���P��9T�����q��f�ti�.F�F8���@���s9wC>�`�!@�!@�)@�)C"������uR���Lm4��U��}���������H*�.��$�M2�!C"��
����l������z��E�(h��u��M � ���&&�����tHw����z�i����0��T]��\T�����9b������kI��Km�j�U�����M�k�������J���j��j�\�(�oI03l��]:"�M/�Yi'����L�+=����E�W����$��R��&��.��&�Lw����=��������}%s�9����c%�	O7���(��jS��vv�"���d3(�m��K��]�\J�T��Ww:Yv�5��zN+�@@�������� ���������y�YRI��$pQ��������'&C���gR�Cb9wa����HC��^Jf�NTGh��w�=2�������w��PN��%�DT(�I���(g�M�vb��%j��������1�r��.����N�tL;������9P��l�����
D�D�����"8k���L�a|G��S�5MP��w*��*�F/}�"��DA�d�AS(4�H��i�����M����x��������:��Iem�iE�k��[�SG�oj�+b-����)J���1n! �1]b�D�!v���hE�U�=�zJ�|2d��GUA�R���%��$�qE8j[����ES�S�����KiKT�M��g�N����T��%3s���R��JY"�����q ��,�Jn4AP@Z�f�o��w�q)�IS�Yft-C.��*:�2~����""[.Q]������;1k4�I����#�3|�����I4�G��*�t>�1f�h��-["�H�&	$�8
�a�DD{�Dpk_{-���G�G�oSG�|��{O����B���g�����9n`|hq�F�=��}���Y��BSW��T]AR*D`���1���m�����1�fr�T�n�eU�9TIT��Q3�0��2������8h�]P����UEV�uLd�N4r��K��9�
��>���c
H���l[ P*DM�b�q(����[e-�������t�6�<�������gs
 �f�0�<�c�
0RMZ�d��+�A��?����T{�)a�*L��b�J���S�X�a��Kh����u�O���pZ�Z����H���[:���&��l��Z��`�i3��(t�6"A��Q�
�$��n�d��pX���D_4�L�S�:��'������y�8��Zx��M������
DP0L� �:�\]IH��B��;t����82��q�����R�@9E������`�
_�����R6��0�xr�E�������o#J��%+EE��%�#G2p����S��M���8���Q}��u��*�6�J��q�Ad���(�)j���;����
������5%��4���GvzJ�b�z����&2E�� ���*��0p4op�8F&&��	�(�@"M>�} PQA�����8��
�&�g���T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I���GV��FaM�>�vT��C��S�L�l����5]�Er&X
wS/7G���
���l�N�,�@��n�A��Z��J���^W5Zo_���v��h��������T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I���Z��1�`!
M�Lc@���r�r��LSe0w?Z l�D
�Bs�%ZA�Z�[�l�����5eB5��F�t������+�H�^���l�0��##j
���&�r�R8���[8����u8����20���o�4�{o,<c�5:�����������(g�&h��)�7�0� �n,�S8��G4�����,'<��-���CL�c�@
��<����;�,���\���_2��x #���U��_�?���k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$�����Y��?�)�_{��k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$���)I'W3a�Q���RI&�P�1�r��\��~���^;�-�F���)��C�NTW�#����&��Jx��&��Jx��&��Jx��&��Jx�����?S�@�1]��'�(6@�LPQC� ��1Uk����%OF�����p) ��b3
|�|�	T���:�����.:�����.:�����.:�����.�5��R+�(�e���DJ��L������t�#��J�#xIB�3}��!��X�~������U/k�����=O7�h��7����r��C���E|�28�qsu)��%����r?#?��+��5l)?��}A��&����_�ov���.��c���U?N���Sz��Z�����S�����u����������������[�	�H/����'��J�wIG����H�OF�X[�{2F����
�L����;���^�M�z��j���E�����%%F�1����"�o����@Q����U������Zt������^5MAY�R3"J���H u2jM���ft�����z��H�GgP[��d|�:t������C���?�2�3�8�t���g#O�<��x7���_g0���DG'k���+�)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_����s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s���l��h��J�^��>1��8Q�2���&�!��JrD{���R��S�n
z��Ic����GDMR�R(S�B^�|a��:m�Y7b���|��t�2w~��z��;_��)������s�������~<z��;_��)������s�������~<"�:}@U�f������b�Y��"����DE"���(�����j�LY%0��ST(��S��`��P�Wj�v��=\����EOP�����D%)"�F`�|�y,�����i�*R�Rq*��*iR[1��8(���@)���)LUA�C��mf�]Q6quh��b���!���&�c�I�7
�I�L\�e�ZN��mO���b�#Z&	6d��@�$B�i��0�D�6`��l?d�t|+��WWutm���r2Sf*K�B�| 	�tr����|�6ud�2]lr�%TS�k���	��";[nte�,����ZI]��
���d�q"�Y�F�>F�1GZ�U���"�)�B���� .��G9�10������8��6�x�QL���n�=r���~���Zn�����8��-=`!.D-���I�mc*m+i��F���W2\��P�yGHE
!�Cq��#5�ujk��Lp�z0ou/��9V���S�Jq��a"��)jF�����t���+I&b�7�����[���g�>�h��h/M0z*.�cmu���������U�uG[�R��t
�~G�� E�H6dg
*q(�WK���O�J��������{U��p��� ��B�����
#�R��W����5J�&�}�s���J6�ZU��D��Wz��m�V��"�����(��N.�U��&�QP�S�Y�]2�����{=���Rb�����4n|�y&[��t�Y�x3L���H"B��	��(dR&�@�!C��emu�gI��S��h*�$�LSb��F����%�+�g���8���M��E$J'^6�2�v'A5��L�r(�w3���V��[+��	)8���)Z�Hd�ER��T���"�Em��L����,U��phz���$�������b��3�,KV�D�Yx�"�'�����X����	jv����`j7���sW����B�E�;8�h��I���e�:+��
t�S����ub���Yz,-3w(	�g9�T�����Uc��!{��p�}F�B���9Rzr���5�m�q����������9j�)9�:/�E�a��1��+i��R���I�\�7��S�q�u?��q~�Pe������a���kMG<{
Q���Kh+z���F����]7egN?b1��nI��'z;����J��(����������t�!p�iZH�dc�����nF�\e��K�I��scn�&�\�CxC��]�\J�T��;���[�x���i��L`~�IU���
^�x�>@%�8�gf%�:�J���P*50��o�I0<���nOi��������"�����A"2�{b� �`	�w����k�_�T����Mt.�����H�J��b�'%l)�1�����.��ne\�����{4��.��+2�9��w������1�
R���"��� t�O�]{
`d�����L�Nq��t�u�;��L��o"�!�"�.�h�
�T�n��@�I��6�-�l��B�����U����@m��:A���������xh�J�*UnWJ��$��l��!>�M);�AT�e]S��u!TB�+�����������tM� �������0l��'����W�_]Y��V��RY�;O�I������w�2���*��Mg�.�2�u�$�&��*�rR�T��E��x����EjJ�id���6����$_�M�zf��SM�h�c(�e�r�57k�Oz���W)w��v��$���L�����3���y�W��K��$��T�������T1)MXX�����\�cL���14�%y3D�S�Mg�))i���nI7�y	5��.����'H����D��'������T���K��=�����-���������7�O�9n�^�/�U}P[�R~��ON���rn�����i����l�z��*��\��;��X��$z�#P���tm1Y%KU�D�USIU�M�S!�A�$����?r�,C�.OuCc�$f��������v�?��97v�~O��5;t�����~��$��Cu���,�	����*�������\�������d@�i"����#�IA)������\���k�B��3W��vnj!;=
tj�$&'m���KG��;��r���1�����\����v��E�7hX�/^��r����z}��Z�"�\B��zz�+�m�EWD36���5Ie�E#��8��ua�
{�6�=F6�������K]! ���g������!Eb����3&��E��lB����sQw����*B�%
c������2j������h�����A�px�U���u/q4��Uv�A�+N�%���M�}t 4_NSsu��_�����6�-��h�1��x���\����94y^��F�.,=���D\OT��x�U]<XE�ACE���)'���2�b�U�8�D�!a^��7�)��`�|��6���.���,�� *��X��tx�#��f��v�UD�T9�N���j������@3�����x�*G�<���dS�1N��*B*��:+���/l�yz�Vs��i�[H��Aii��^:�9j�I�3lm�Q��A�
�g�:��l���8K}=�'H����C���=���z���m|]}9>�c��y�����h�M�X�~��\6��;�RD�S��M�����7b�����V�\�O?�;O4� ��ru}5�6H�x)"�aC���xi����CP��eL�&c9O���U=�[8L��0cP=����P���h�W{�GSk_�����i;����xR1�*H ������dL��v�A��`Vj��t�����$��)2�0�)�sJP�����-R��,���9�����1���n��:���k^)��.�C&��,���Q�p%#$�����)2����f��K�?d�D����VW���V��jn����$�J]��1�=�-�����5LE�5n@(N���w��*'7����j]B���%CQ�jy(�$��}8����{ 6\#��_����������R��~�������[��������&��u�Wln��/}	Z��'������3pv�2A�b�f�����Md�B�_�m]��J�Z3�g@2q���wNU��G���&_H`�\�������q�7�o�������U����=>_]Ym"i��E��O�����*�W��$�]�H�Q���)���2�M2A����5si.blegn�E+7E�����H��S�y�%c��w,t�UP������qz,e������Q��Y;�l�_U��ih��F�`���F�6iw�(��L��:H���!I�Y��6����RRv��"�l�����A��EJ>���[��#�2}�o��!o�[�jv�X��|?�H
W�����=���bAT��`�\EA�V���U�GJj/Tkjf�0��2J�Yt]H��&�1�%)O������ ;\� Q�R��R��)@�(@R�pw�;|�����K^O�-p]��>:���c[6�z����Zi��|�t��T�����G��P�w������HO�������XQT)��������+ 8�}-A6�@���O]D^K���j�R7:J��J�E��5�9V���+N��7j��6gn��x�%\�z�`IN�)�K������{_�������Zo����sG[y�	����*�m
J8�eD�b#�,F��t�21r���]w��'�Kvi�%SE���K7%k��jq�L���Yf�e�p�6	"SI�H6;9�f��I��n�}*A��9x��Z�������'P��(	�"ce��DDq����h�_�����oC����X;��Ik�th�8�s�w	ZZ�����b����g��&1����di�5��������\J.���u) ����zF��Vb�:&EV�-�&%��e��+6����**�!�sU9���H�N�#:D%��������UVTJ��}EJ�2��4���[OGL?b���2����UMZ�M�T��c��� �|��
�9�M�C�=�[n%�HASuy%��<4�f��[G� �����(��QQ�F�`����:���"�@�;��<d����GW\��#��]uh���sI�C�4��e�R7�)n!��>M��3��Li���6'��Q��`o���t������pe����$
�aO=��3��7�7����?P]���������&P�5����To�$v���1��b����M�N];|�c��].�-�?�*l���zk:�i����h�'��(�l�D
�	��G/d1b�S���:��c���,�/��]8+��<1{�IT�}��qG[�m�v�4�tBDl�$��5lT����Ts�~��/��_�A�%t������]���
�t�U
��^MR��Y;_��+H��*(���j�ERO=���PD=��IN�:I�\K'��r�$�HUUC��T:��,��l���e��,'e����7xc@w��HB�JB�JR�E)J��������O��mV(=i�G���{=�F�����IS�U�'M�%G\[��A��WU6����Q#�����1A7=���N�^�s�+��k�5K-,��T�Su*k�\��1��5f+0BQ��G
���5J���N��Y����?puNX�=�������w#[?�����iYBRq�W^E cTJ&��b�>��"��n��H���w�V1Th�0R���������-h��N����?]����dT��vr�%-��������~+V�%�,�9!.�ix#��S����Qg�/�/�/�����&���%5�Z�V4T,��I�/����U�SB9fB����N���S�38YH�.�}5��[�$0�'���l�j���B�� �k�oB�$�b�9@V��1Xs�C{�J����=�aisB��G4�u
5r��.������
�M�P��Hw�,�.q�/)����?��M��w�u��}y[��7M�����-��,R��2��t���-�uET�K�����:��&�=C
�u?m�4���t�@Q-/5���oh��b��I����U`��N��YY��H��~rL��&
���Y�����������7cF�s����M��� T��Wt��3N�S���b���51*�!_;�L���:����6S^_�
�V���j�v���Y���^��!K<�Z�h�H�y�k�&Ar�����UdULI�v�h�������F�!v�-
2����*�+R�VS
�"c��u$�=�6��F�L�-�HA�&�sM7��'�{����i����[�y�33$��c��Q,3��Jj��:M��WTJ�������N���hy����>��$(jjY���jKwYV�M��H���*�1�
��m���Z���U8����+o?����� ��x�K�C��g�WDZew��BL)o��J��I�z/N>������DH������2h���D�c��|����KZ�f5�����wO�	B2v�eO�sICH���( �@��[7���5���|t���<��.����F�YWO�S��&M�7&��&u�_������o�"Oc�BI�/P>�"#���g*.X������%�w�A�d��FT�o�Uc�>
�����eR*�&e

h�H#���cK���O�J���F����i�������D��&/`���r���P(������)�!]9�l�*v��LN-��lE6��R��[���U/� ���)��cZVm����AUy���r{�{��n^�)��Q�or�5�hU��KL���aM�?���af�U��������a��jAu�7nd��q.f�r�Ce��K~1��$J�SZ^qd����|#��c�g���y���M����s(�s4�\A9W|�S��K���A����U�)6J��9�<j��8(����LA��
��n�$�A��"B��(�P"i$�
R��R�d�0�b�c�J�s�tV��+�J��
�]�
�fsf#���������)��]�e_�L���j�B����0!�6��?���q1���Lq,F
I&�%!*K?)9S
�
1�2)C����jk~����h������-���G[)$���^��h������dTV;���E�`U�
<h��*�.�='O<<�Q���Uc��qTO0�������A�~]�B��9T���s���t��^����t!�	;��J���V���Q5��;���M�W;�rMP\�W�?�e`�p��2�\�������Rt�����.��Gt��;p�]��[U��;U���gY�su�K��X��8?QDZ���T��!vcD��������/t$b/,\�O%-ITPOUr�L`i�
�H!SH���
t9�
�X���=�����XQT�0�Q��S)�92�1��T�;C,h��W��i�R.Z���H��l��2T��v��/c<u�@t�a����(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m�����tT��=;$�C)t����S� M�)����X�kf�J�T\G���4������E��=�b������mY��L�:�������T�q�|��,���:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�n���TYu
�)u��E;�!�"8I�u��EQT��EP��98@@s�i��U/� ����G�+n�;�k���P1���l�<H]�l���#p��sD��V-�h�"���`�d)C�?V��5���A�P���QSr����3d�<&9�����1q�@/;%T��e���Q�����PSFN7���%�Cw-������c��
�*���`��i���f?c_R�����\6�V�B���wdc�U�����d��R5��W���b
��QD��C��� 
�$OY�:�a�e�X�T�	Fq���k$Zr�NE��(���m��XK;��WC��_N��x�"�S�)��$��90!ygN�0����u�8�(so��(X)�)��hi���Q��z�����E���
x@1W�VZ����5������UIB�F�����Y�X+P��Q4����@�[�U����v6�T�j�g�� ��d��UQ1��"�w�G�8&S�2�)�@O��v��z�����m��SO"�7Jz���EC�Q:e&C�'��aX�R�*U���D��|�lER6�	J@���Y�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LZM&�t�3��+��=���-��d��s8�����*>;Oj��k��G&hj�h��
���3�� ������Dm������lxGh��:���
�������c�c�:;��������6>&:���
�������c�c�:;��������6>&:���
�������c�c�:;����MT��ER9TMB�1���&�&�D*i$B��d)HB�JP�R�/��_�A�$�.ML���i
~Fe���H
D�s�L�f��
������%.�p0�JU��7-�~��
M�!��/B������	F���q�����ES���#'�|!�5B���������4@��i�h�&/t������Z9�e�������\�����-�dzTMd�Z�ip����c��T�Q���
�M�������3
����V�cii9���U�L��Zb���B�����&�Z�p:�$��m1jU�6��P�z���� �P���Wj����ShM�������]�"��nl����m��,���-��ii*��YT���|Jh^��h)g�ED(�.�*x��	�E7�w����2��$#�%~����10��l����n�r�����}�wRS��T��c1wa_�0����x���j����LR�;J��c	�Qg�/�d��e�=p�V���8\JB��@L!�@0���=f���wmI�e���+�&)��J"���t�s�Qkz<�fO�:q�Nt���c�&�wT�`�2�]�,oe��������KG�vwJ��W������B����]�&8�A�I�L�\���y��oD9Su�l�G�����M������d�G!�>���g|��n��;>{=�+&��SvfA�5s�{��Z-�e
�Y��N�)��fJ3x�!be
�U_v��ZN�kUNm�����=,���i=V;Nr�M����%�5d��*�E���h�e(��JPj������Pv�i�~�9�]����b���*Q�"���	7nF/f\���,���0d��5AGND�U����S�������'�+x�R
Fi��1I�L[nL�o�0����.��(*��j��qm��s�����e(�~��D�����Q1��o#P*�K�
�I&�
����C�H�<\i��U/� ��[�,�+��z���f�&vzD\�����L"�1km1@��k5��N��*�TC��q������SZ��j�
��1/S?' �H^�D�m��8@1'{.rJ9�����}B��2q�2j�c(u�S��@@D��}X���#�����z�����8f��?
��Q� �qJ�B���`1} s�LN��n�	G��M�z
^�M���&�����Zbn��B���L�)\�m����KMWb��K���3O��1+EB%q��RL�HR���h��N]�Q3��b��oG���e)n{2��P���f�!$f�:�|C�H(S��f��m��aP�����(�������������{WR�do��[�J�U�T�4�����
r��2��q�����2����Dr2"���MZ����R��:��n����Q���z��]SN����I�8���1�<������&R�	�A2&R������������3GI�r�Z��u�-�;H>�P����Z��x��Iv��pX�O��vU���I;2�����BXK�n�����u�f�%s40J���7��+�I��g(Q�z��=b�,AN�����h����}^�h�7l����T.�M��R��|�p��v .w�:����V��
�]N�i��pmu5j����t�F\����Kwm�����U��_5{;XUo�;�ZI��E�r�X�j�������>�\9�_m1���E���GU;
�,b���Y���Wq�y^�!w��$=-�T�������k�SZ+��E~[���Qj�%SR��WOQ��EhG
_�����$%Vl����M�\��/�Z�E������
<��V7��wS?� ���w2�ILJ@��l�U,HV��3:��7�b��T7^�;t���5ri���U��y���3}!��-dTr�E���)@9U<1��&�P�N��������V������PU�G�-�����T����v�R!����,s��KV���n�i3X�h���r���uS�e�L����;sRBT�n������v�I�����Z:le[)njMMQQs�Z��Ue��&��������W����i@AW�:�qe����\�1�Z�"��K�n�����:WH�M]�
��s=�V��=G��[�ag�b�=*3d���%H��R�v�k��^7Q��d�]'Z�W�d����WM��(Jq��H	:��"��7EC�:�D�Zy�>��n�j{M�T}������uB��!���z�zz���`��
fn�b���H�UK*��&�bv��w����k3�����i�+)G������5����(����j��lA���1��w(c���D��c~�i�]a��+P��{����]ni&5��a
�.�}[B��l�?H~���Ql��H�;v��E��U����S������iZ��;:��TM	(����&�b�(��e&�$�w�D�03�cH6OH���h�	�7�'R��z ��c����2�����3���D�!�P��B7�cp6�+����V��2;�J6H�����W��l9�A?+�cwvg��
�����r�n�\.����(�TUC�v�"#�]Y��t�%���	TTe� �+r�>��n�Qn�$�A"DIH	���(}^���6d����zjz=A��v=H�Fg1v�*��D;�������tf;rX�\& ��
;�����-�1�q�T�h�<�����L��d?a���&/���)�#h~�oe�����
"5���G����I.�����P�&��l7j,���-OkFr�Y�&b�^���3��2��"g	�c!��|���7$D�|�����p�d.5M�������8��2g"�
��11Q-<��*A�J`�;��1�����?��\_�������Q��v/�W���a�������)�n������B���y|Z���R?�:�����[&����9nn
^��q9���IU&gfV*�L�D���M#���qnJ*�*'T\������
.����z�Q�
���xH���M�~sren�d���{!(l�0�k��b�2:��*:�0�|T��=�r��N��� ��R#���S���GY�n�'�J������u��L��^��m���)*i����FH��x����#RA��7�C���_�X�����JF�Z�kO��+j���������`M�1�]u�0������+4���3[z_A+2
&���V�]�aT�q2l����&��U��/�j��]Re��/��Ow��t�PQ����6�����g��Y3q��_UD��$���p��G,l���R�ff/�Ap�U4\B\x��{��.�����N=:vF�����S�jf����(���u�"B�m^�QC�Z��Jje�U(��{�����Q��[�g������=���|u=����r�U��<����-�=�������I�	��l������u���p��Q�����!�������2�>`��6���e	���=�W����%��6��V�v�U�_�JZ�%J*��-��zz�59))�:��w)E��������M�E�~�������%O�4�������3p���LM��UP�jS"E�|��F��j|(�����6]���y����b��&U*���*��IT���� ;)_*=���O���E���U�%���0������Y/%?_\��m����?="��/�DK�t��q21�3r�o��WI�Y���[L���nf���&[�+P�T�����+	�/F��������x���JV�:����i�]����$����$@�9D����{�ey�So���#���n�a (��o�)�G<i�Q�a�CR�����!�M��U����2�����hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x�]S]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x���?Z@���&�ERLPx����'��$���)Nc�!����� �W��vF�U��<E9�dA���~�a6���8����48���5�hq�+Oij�RWJ��B��4+�U�D������>��y�RV��iJ�t���o*I9iZ�Mr�u�l�"m������5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k����i������$�Y$D�P��P���L�t�)NC�h��``C��v�C{��J3aS��TPAa���g
e�:�,z`�������S�&P\H(	���������STT5X�_i' i��K�6��kWBJR�u4\�&��V��s���:�B��E���G�kU�����x���+9\Tu�X�����%��E�Y����Rz4z	��RH����4s�+�V��[��)���SEOQ��@�nE����\������D�0��` Q0	�"GK����m-��B��j�X�$��oP����h���B.M�9&����b�b��n�Y���NI��(V���CU����m&	6!mhh(h��N�Y2���&t��s0�����n����<-��j��5���kOyY)B�D�1�l��
C�	��;�n���v��m��.U'n�����$��,�/Z�������c#X�O1*J.�H��F��LDd����Z�u���~�P���if�&���-���2�����bs��"�a"d(�CR�����yt};m)�Zz�el��! W�WP���\�_����>i��{�6F��`�R�\}-����e�g��|tF�Z=uN?�c&�d(�����L�H��{JV�f��-����IR�7
BV���4��q^�����X��*�B�6�@��P���Ov�8�n�5MYu�[=�4�qZIv���E�>xM�D
�a�P��O�|��i�9���B��O���"ODTT�SES���������&�]t��!����u��u�H��u���hV�,�#O�Q�]�>��=�v��HN�D�m�!�I���21��)���ES0&]T��*��s
����_[�q&��Xz^��} ��v��+�H�FEd�o ���B&ra���(9g5=�t�������sC]�l�@��K����N��'&��j���Il+"�������;�[uJ�����Z������z��.d������$�@�j��3�S��8�f�)���i���V���NCMKP�=[I[4%����US��l��&xuE�W*�ET+E[-��K[�]?�>����b���+�����9<�E[V��
�y3,�U��8A�	
� �
��)����������\j

�[Z���[���?DFj�Q����U%
d#���&�����k?���JjoX��.�.E�%='F�������f�M@I�y���
���Q5�r������\,����������K�pj{`�������5��`)i$�ER�E�t�4�j�e$A""�.z��I&�TN�h::�T���N�d4�:��������YT]0:���R�'c�����`I�-����w�q)�IS�LK{G8 �+�"����Z1���+7�A3d�in����;�(�T�k��q=�rPr�6PGb����og���)B�HB��)C"��
��G'hB*��*f��m�(�&"�`�6@#����&�X��5P��m�����Z��gY�g���2*Cf��s����:R"�!����c{S��2�W� �u��Qi�Ow�R�nW��b�����
�����c�:��l�������-�G�4��:F9�#	{��=��,K�8���X���M�c*��_8��(a��i���h��~Q�b.���H��[�#���w0#��o��|���S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7���m��%�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�^���9[B��m�^=e�7S�#g��
d����X��oE�+h����VX�)�D�J �Y�A�S����RW�51�
��y3"���RD��HT�6A�l�dqqukpie�q�!-%,���:$AQ)$1�2{�(�tG9���cL?����9m������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_�8J�nU[�����UH��7pp�t�u$"I��u4�!s���b�3�3f=���O�������u�wj}@���{�]�#*����a��C�T����4����~X����(E����k)m=]�E@W�Bj
�6����q����G$T�Z�� B���4z��%Z�;c�r�pal^�k������R�����4����<��������qf���
T���������E)gf,�?R���l�����Q17��r���D��(���������?d�P�!
c���
R�f���7�VF�XF�A�-Q0��{��}���/�^Ps0�b2���M[�wU������RT=&=5�7R0��?]i��U/� ��T����Y��P�/��pM$�`������1(}�����\�e��|�C$�1:H��t"��dR�dfQ���[i��f�)��q,�N�K�TN�U4�`2��K�{��coe�r�b��[�@�P�"�2�s����0	������� �cSa4/y��Ofq0{'D@GoTp||�<���{�r� �-V��Z�b#�
�����u�/3Kz}i"�/�m"�/N�Y��r��pS��.�5!N��T��t�|�t;4��!��-E���#!e�b%\��.��.tL�Ae�5�����(���Pj���.���G��D�k�c������eN"&p@�������J3�������]�8���5�}naU����>��ZE!H�������F��d��"������$?$�b��]�9�!��n�]T�5���w-5����'�D�S��ww�7��U�@�d����m�����T�0V����Fb���j'���aS@9T��C�(v���u�/q�h��aoY`�2q�+�4�)N�K"���i�����M�*=���J��H��3��2		�����
��"���M����2������!��1���E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,Vo)R.�	��4�6��n�7�iR�H
�y-�����Go���V����wJ}�
.�U0�N$\�e2c��}�n����"�f�%�E��M2l)J�>0���X��W��qc�	^�q���%z-�>0���X��W��qc�	^�q���%z-�>0���X��W��qc�	^�q���%z-�>0���X��W��qa���T�1���t��XA�B"���Y1�D�\���������~����EOH��	<���`�A�E8y��������3ZKJ�3�:]���EL���A����c��tD}���n�����dz�S�gP
����
lX5'	�&���o*k������!�@�������+�3���9e����" ����KST�Z�i���)�LK'��4�,;�[(dc�22�&a���?��VK�hQX�,����wZ����Q_��/�f������������[��QH���~ES�J����;���<8��&��+y�7��t� �����m���Z6Y"o��p�7����w�9�Z�P�-l������T�%5K��	R���L���3���;�WQ��VM���b�����j6�������.�s��� �%�����
*�q�9�$]�1�3v��%3�)Ch�3ZG��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�L5��[DE���ZQ��s6��b�tA�h'��da�@.$.���Xy{����4~�'��1�#f
"D� ��K�pc�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�`Z^�(��`�dQ`�!@�(JR�JP��Ze��K�?d"a�DDp��F#�U����e����Pt��C(�f{C,JR��(@�`�9��)D�1� )J��G��kOt��\��N��nL�Uw���[�
&�g�b�0 ���C�5E�tkT3j�
�H�n�&�Bd����`�r5��E�cc"����l
	NJ�N��T����w�u;��r�e[�n�A�
�Y#�US1LQ���0��"���S"I���k8�Cf��.%ND��tb,"9�����H�u�A?Ln��8�����Z�U��`���oL\�?Z�A$�ce	�U�@�8��Y����(n/�������v~�i
��������b��T�IFHP��jj��Qv���jN��I�[�
P0,S<\K;s{T4QU[k�B����R���oRP���Z��]�E�n�<`��s,��K&MB
`�,5��>�-im�8�P�s7s���"���*��<|�r��}�.�7}��@����R�m�eIs4�1�RN�Y������r����<�>��QP��5������3�T���L��}WK���O�J��J���:I����#���4�N-�����1J[y�,�������Wfx4]���q����s�TCr4���i��a�h�A������uR���
���@���VK�V��T��a�qn��p7�q1�
�1/}*���m���F�]���-a��:�Y*�����w�?QX�I~^�������*�2a����b�nL�l��6/Q��]������[%����1���n'����Y�m+PM�J>=�����A&�X�g.W>[Gt��DxGs!����������Y��G��@��*�%�e�����Yk�2G7Q'���}D�zp$���(�(�Ph�y�|1o�J��{)�;�M�d\���JU�@������m������%O�%%�x��)M3��1Q^M7( _H�c��%�{���Q�C��������#��:M��j����W��`�}y�_�T����C��n���tm]Z:h��Vl]w�$����2`c�n��������&����d��4���@LR���~��N��x��vN$$.r��v�RUP�6A�1Vj��h��.���KZ��Ei'2�aMU�@���sW|~���)JR� )@2�}l��S�2p��'+�?|���@(%��R�\���
���?V������.�E�&*'
�����H���	�8b����-?�*5�2M�4A�C��Ce�����1���iw�q)�IS�GT�s��Z���� ���R Q7�(`=�������%z2�g7(���1�%L(��h�4H�U1��B�&M��(%(�	�~���e��K�?d��k��:9����9RM6��3�Lc�`l(�T����j^�uom�W�H�x�9;�1�y"	�K���Q�'��{toc��j2�0�����^�uQ��9�"��
��({MN ���g�Bi)���<r�@���=���G^M�N�����(	�+,�y��h�.��A0�yA
�'*������2N�d\`S8t��)�A�I0�4�
�!JP�������*���AveY=����0/�7�2���z�C���b��>�bw�T�hf�������=��������K�����]�\J�T����"���WK�V�Q��WQ��^J8)G0"���xr�_������X���r�pE��I��.A�M������e��K�?d-3
���/C����E��H$���E� Bw�
&g��v�jgP
�*��Y���=5E��p�r�������_"���y"qP�)�8I!��)��:����,�r5�y(�Cs%���M_�'+
]%��e��b��<��9��>�N��<�)k|�bI�3BR�
�l�#<�fi������Q�V�[J2��'�D����%�� ����/&b��J��9�I"4�!SM4�"d n��!vl�J���T[�EG�l�RE
�(l��Dr�ae�#p�hK���`�;t����.�I�(�w	�0�8��t-��jk�N�BK���W3��D���5VH�,b��N!��U���-t���Q�s��EeU��*�D����E� ���-��)�y3�1F!A����f��#h��Nd�P@�E�DEu�0��R�%���+���	N/c,�
B9�&��D�;���`�b���-[�������+d��p��J���@32�oD}��t�����~�-��k�����b��q�7/�@��E�3&�8G���D�I")&@����@����Pz�o��@��,�k��8�("v��������n��%�@Q����T�[8��MS*H��� �@�.��L?dG��y>p���#`9SZE��F�6g�G+�4J9d]��w�	���;�a�j��G�c4�T1�D�"%A/IY�b���
��H�1p�+
�����(����G��E1�4�""�bQ(�(�m�aE�QE�YC�����*��}EP���a�v��"��*�p�T�n�)�U�YS�i"�D1�c��DrE�;E �&�9���wNa�t�qeT����[�#	D������Q�T�Q%b(C��!�t�1G`����hR�"�����OA�x�>:@����d������7�C<��_VZ�p�����z���7$Z��pe^�c��LT���d^v�V��Xw�'Q	��@Q�
X�M��Zi���L2L����sC�}E5Q��$R���QOVZ�"`b$q��cg�pb��1DJ`��&��f:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�'h�v������7<KuDa74 ����P�0�������j�a\U`���h'��`��!�0�Y��Q(r���:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��a����O�Y4�E)�4����q�8���A5$�$�n��*@>���g��KL�����~���q/���|��3,�6��4�0��T1G ��qq�a]"/k�FVr�	�}��R�ve[��?}�'��w��+L���g��6���I�41HD&�`��w~�����|\��d��'��e&��m)��0��e����)NPn����>h�VFLQYe���H�n,u�@wJ8�����mXS)�� �b����Q$�Q����g0�q0����]uES:�,���I$�D�(����""9mIJ�]CR�+G "b�x����
c�J?Tq(��6|�~��N}�)MP.�$!&h��FLlr��K������`�5�!��PRL9Q�O�%2`#��c�
�]����j���PT
a)�5�)�
`���B�j:�H2���_�����/K&2e1 ���%8����e�;�C[6�����/Sr����P�Tr����8��d������
d.w�I8rG���H� d_�A�`n�b���(�a�,�M��5��I"($�iC����� �`DRHDv��d�~��~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,U@��C(��BHB��a�G��C����mmiFI}$��!/#�6n�/
��b��)�6i�$�����*���9m+�g�c�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2q~�G��U�b�]����|�*�����uX�<�u�@�*@*��9���hQ��G�r��%�^����VZ�G@���N��|��`L�p��4�7.���a���Jn�A/3k��
�Bj�v�LT�0D�1L��|�r��[�rA!#���P2��1�m��T����?at+o.Z��V�/g�C~�f�u�'dOn��0����2��6oA�Q��D��E�1�pa�i�C��y�%Y����'�����<UYR�_%H���pX�?k�n�A�I��)��I$P"i�����yY��%�U1�F�>��y�h�FD��=��'������R$"�awn�U��K*����2����YeN"c�1�#���8�5i�����������0��G�4p��;?Z���y��7���:*n�F���6[Ji��0�R+�G�`h�q������F0Ghp|����qHUe2"e1�`)��,�X�
`��r*��'*�?�8\�TC1����?��]�\J�T���uA(T3q��T�r*	�3�T��� P�<�M�9{!��Qu�*����da��G�Jf��PWZI#�d��3�������TAnj;~	�H���96�����>L9�{{,?�I�d�S��������%������MeF�+�&���raS{��5�o/��j��ecc-K�1�
��uvS�"C�"�*bA���1f�	@Z����q��g�^����v��nHK��J�3}P;-A�\��4��L�a:yw����>�+��s�������?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�����?f{}6���\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u�������96l8z��bP("�!]M�d�G1�����"+
d����}N�Q$&Y(-98�Ln�Se�x�lL%�-Us����������xw�����M�������Z2��qP�d@��A���U����G]cf1D�Q�s�\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\K���{:��!O2*
��������BR(U�:`��[�����Qqr�J��FMsx�L�b&�a�E�p��Vr��]�-=�RE��&�'�� �o����I����(m�I^N�s6��h����@9����7P@� �7������#��omB�'�)����]<�� �
33���r�E��"�fE��]�\J�T���Zx��jm�8v�39���O(r����O��D�x2�m��$������`(�y�$
�@�8b0�C���*���Z���}����)��0��]| dE^Ph{<f4u25p%��L0��<�n�A+����l��u=MT21
�O��#���*Q�*��;L�H�;s �
B
B��(JR�d�2�������&���j����4P
T?��Q .���9���
����0��utn\��2��3�
�6�9�2`����Z��lf>e�
���!���6�
)MGr�91On�����Wt�l��wHihp�pf �Cp�������e���h���
H&��EP�VE2{������t����FVB�y�X�4���@��� 8��PK��x�G0�$`�X
%�,�z��#R��\�
�����w�  
V���!YD�v�F���F>&�H��-���F,P+f��/��!JP�����M�������3�7\��C�c�:��c<_�������$�� ��d�����(�� �����zA��}����P�?�`�W��7���Q���Qqx���}����@f_�
2������>�&����$�*���!���*���P���'&M�������NU L?�^�H��J�fR��\��T��r���B��QaIB��j�%��E ��C�D~�s�j�A-�4UNV�T�&�@�8�?�������-<�����rVcn���i~=c����"L�E\�D?R��d9%��G����M���F��$S0�xe��J�j3����O����w)&�qU����������s���I6���n
M%�J�{�b����(��x��8�r\�AE3��%�������?d�(�*�|����Dccf/\��1�JO��C��N:A0�j6(U3�Ht/%��f���E��x2��i��U/� ���;�Q��X�.���t�`���(�tN%���No
�����1v�����z��!�3����q�^�,U��(����wn�ZH�:Y���X���J=���C�+�G.]��/$X��w��d��Pc����(f��6��Y7��)��h� �+���:j>�UH����wmU"��"����;�������Cw@�c���r�e�Y�[S"��yj�L	NK�wND�@h��Ct�P�����IL�����f��Ro6��	��
�``]T���RP�����tp�-�#�eH�D}�1��x���������G��p���Gu&�$+�]A��(�~�az:�]�z�m���BG��+,��d��dWH��$%0@�X��T��*�uS}O�Yb�u8�t��T�I��  b�se�.�.%?�*~����qt�����%�T*@��72�7!���0J�TW��A��
DN8�^*�1�G	� ��C���a@
8)JP)JR��R� )@8;����/��_�A��ZE�^�����9������P���%�����#��p1b�Yn
������y���	b�
�����P��r��D{�c�6�#Z7b��E&�V�($B� ��;�KA�:�����2*p�yND&^��[9H��t�~��2Gv��P���^������0����&%l�G�>]�&�"#�����G��F5Y���������Tp������T
�:�1HP����L��4�>�� ��|�E��O�I��P�4�)�7�l�TLa�6���%Iri��#�
FE;5C*E`$�l\���v*B�tDn m�����Rq�54�@��=� �f�A���Q���*>[� c?�aP�;��(
�29r�@�g��������y_=��KOI�Q��R��]��L5�dvK�'S"��N#��/gM����"��W��kF
!�?C�Z[��-�������P+�M-�N�A��1����6���\e�#��������x#"�&�Y���>T��6cM��0.�yvU��J	����2�f"���������d%Ev�"^�y>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8�bV���	��v�e��\��Y�
f���$P��xd�t�UK�U���R���t�!�[��P��l�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�xn��v��MU�ME������op0�u3uE5@�'9�L�d���Ze��K�?c�,��SE3��� �2��"#�b���ug�m�Mj��~�
���	G���y�|L&G��	�sn����F.��M�f�D9Cf`��LL�g��] ��z��^��]�����eL;g��($9p����T��*L���F[!T�&#�D���
�|���T,��)u����\����Dw_���b1D��f�@VSx�@P��+�b�P��rR���T�g�/S�vm�4�8Y
Q�O]�&�$�F!��fG{7��������5P���z���'��,�9�?�r`Ff�������T+:���n���=����Gh�p�6���D?Q{�>���k��N	5��h�4��*\���J�G�7?�2p2����vN#��:B�WI�KL@���;@sI\[qliXI�������"��~q;�0NeU��)���2������qP�eE�VO�^�i����W��r���:�"&2	�G<it�0������G!�bT�3����f";8DG
���:j	�?�VFa�\�D'��.�K���x�
�����T�/
bm��{��o������r���
a�1�9�����C�:������=n���X����P5�0��K��o1h��f���L�T�A�$�!C�
P�����U/� ����11� ��,�����������v����p���3�`81���	U@M� ���F��5]_^���0���L+�A1~�l��/����l�����_��j������)��r�z��U���n�T��3�,��l�Z<�AQ�?P��.j�{�I"��v��}���~����T��B�)3��B�	�?d8q	@��o	M����F1��9��s�w2�1�H����:��(�ECv���S��5
,��)� N��2F��U�[����N#��:���(��uP�s���s��DDv���"��"���.��d���(C�X7#�r�W���&C�R���$8E�TRn��I�n���( �4�E"�)@
R�d�������e$�Q+��M�q�����G���K���O�J��~Q���#��t�.A�;�������A���K�\�c���l&����9WW.���
#%�"
�,`(��80�u��)VO��o)RI�gh&o��M����c�uj����%�{����;+��k�7l.�g"b�������S6���������j�
�G<�^C"�i)M���A�8Fz������'�2�X�����M�����A7� 5����������r�����?�Ze��K�?b��u5Q���nC(���5)
P��"�����j��H���O�k'����'�R$o�9��8;F��U���Sj1Q���C����,`(�tF��*f=��6�5|���%8�U�1�"�ux��NM��E
������#����r' ���uq<�@!M#���b�r��=��tj�� j��p���(����
OW7n���_n�51	�<E��o�M���[7�qMZz$=>�w��B��v~�w�_���������n�z����9��#&�F��`����D6��m;�z���b�vn�>���������S@~����d2�(b��!D�9�;�!
]�";I6*U�S�O��	C�n�T��!7��7&b��r�X��[O�6x�Gx�r�k
��T��O0k��m������%O����(m0����-U�QW�MQ�h��6s^�E�I6	�`�W��P�D��G�0�;km'd�lc�G��%N���}���� #��T��O�����q�3�����]z�g�(����%�hs����Uj��
!2�8=@�i)#fl�A3	�����j]��RJ����.OAls;��s����Xn26�*��m�NB�r�����0�vg��GQ����j�
V����2/�U!����n�H&	�� }��?��e��K�?a�uT"d(b�����ZF����V��&UW�����b�|���:k'|)��m@����]����(&9g�G�������V�i��
��u�3�~���{_a��X��r���o�R��$l9�LkF
������C��p��*���B�B����/�*��V8��g��:j�(�[�c�
�+k�I��H��lE��C=�X�`��g����&���B8�3`"D� ?����h�\�(���p��K�	�@3�9� ��m(�GN�� dr��1���|Ed��_k�(}spY��$�vE:�<@��Q*��z)��
G�t�l�6~��i^������B���p
�����&>@�G,$��d�L�*���(�RN2*S�_�dC�	/^W5
L�wNv0MSQ�o�EUW�'sy50��n�/n)����!-"����A����3��6{r�w ��iw�q)�IS��?|��|;��"���D0����HB� "�(�����7m�T!���g(�S4t��6����s������d��*'*dQz��!�	 S�e��o������r���q�w�
**R��pik�<�����f��T�m�0�!��c������Je�F��PCh��s����7M��=R��)�]����Ds����6���"E&(D�9�P��B���f��Bpn6A$K���`��2������U������9]$	��N���2���q0��
�<�&1��(���U����b��;�&1C�(\�ve��e�����I�������~�]��xsh�����d�M8����!�a����(�z���~"d��p�V(&���,v�_F����G��RQ������L�@��]��.��|Q!�N4#u�T;��&��z�Z�@/<~S3��2l��$�ki(�DE6T���%J;q�#�����G/���>����.��(��Y��
�&&0) ;���?Q&L��\wPe�w��7��6lS���IThG4�wsY9F�*@n)�7�m�����$���">/E�~��)����}����oA3��%�o������1������24/����,���.��6E�T��-���(}���7q���N��b�'����9�N�:�����[iw�q)�IS�""�Dv�,�~���A�u��U�q!J��8�v����}$����W��bp��/z�G��uW��h������;%L)��7��l9��v:J�ES�&N�a���a�3�Y�~��W^��������0E$�y8�HJ!��{�p>@�)��
����r�I�?g�
��J��A!�mP�����bGt~�*�Q���!DB4�����S1�#����,�[����2�2D���b�v���{&�#�RU����')�9�
�1DQ� !�2�������(}�3�{c���b�����M ��".��_o3c���/������r���� �||	��|�>?��V>s���9���zQ������(��c/�8,����y�z���<�=b��fs�A��9�X��Y���cQ���9�Y������������9�Y������������9�Y�������j�x���9�Z������������9�Z������������9�Z�������i��&4�h}��p�
���q.Q*��H�� 'o���ZSr��<��gE2��9��L�okg`��^��R������r��`���9e�+Rv��5�`f�q+�&2*`������!��Z�e������n���~$������n���3rj��"%�����T���K�:+u��L�B	�8���a��H�JB(�#��
!�9:���
�F-���prE���t�<��;yi�q�7h��X�*.Jg.�D���gd��C�
K���?M�l�v4�7u��uWr,�L���e�g�	-+5\>Ot��Q.�4C�FB4LO`��]�"#��IS�<��!�RG��J�2o�tLl�Gh��H�V����(�M�P��E����2i[�T� E�(��������k&�fK�)�4:�)�%�0��=���1�.�t��c��A�t�����LE�/������z>�������8�s���1������F��]��j��Kw����(��W��==����1[���wsh�JP�Dg���}�(8uw���J&�[@��G���A6g����2^�P��#���q�����9�z���Lw���@}�KXv�GP�����7�N3����*�;;�r����My�N��n3J�Y��e��	������:�|�[���}��QH�R��r �6
:��.�P(�vc��=i�jH�D��V���I@lL�Q0*b`�8vcy(�[AN�w�U1j�AIO���(��M_�J����8k%0+���5U9!���r|�Wp��av������N�N�G����72v�3�]C�?��cG�'	#	�%)M�sF�L��_��h}kw]LHM�����l���Zv�J.5I�&���C�e	�!�%�f,����RN�o#�H�!EW��f�s���{�T
�w*�����)8SN�m*69'���3���a���c\�G����+Z�.�q3����=��XtL�:�a�3����D�c��=��XtL�:�a�3����D�c��=��XtD�:�a�3����D�c��=���tL�:�a�3����D�c�������������Z�D�:�k��X���DO�`[o���t�i]N�h��	��$�q�Z������>�P�����D�w,w������]C��m]*9���g���9;QG�������d8N��I�p��F���K@����D��6b=��0%-9N "" bS��%�K��Y�"]�(S�|>�fLn��{=���,��=����jB!�rN����<�t��g�Ja������Kt�P�	L<�,��`/eD�C�d��f;8�X8�P�r}�	��pr���A������yJ�(����5p�*x{���f�����}#P�,�x XY�?�L���~P{���2���.�o}�>@9	c�����sy.�����ZL~�B��7n�@���Fl�?k���@U��M�QA� 	�3�`�����#P�w��
W.���y�z� ������w����F���p�}J�����!r+q�=��*N���&�Z	��G��P��~2�Z�<�U7���+>uR�����U/���+>uR�������J�������g�*�V|������e�j�9�_+.{Ty�~��w{��j�����n�=�&�������������9����_H����}�$���/����z��ne�V���G����������ro�,�~�	�q���Q;�m���;���4�s�����H����I-�}�L�����JT����D!����x��r9�$���v�y���_C�����
N�����C��LQ�1��Lt�S4I�4H�$�@�	��/&�e�����(K�61����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]����wjk�m��r�9�v����
��bZ;��b(�S����b	���1����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]���T������tC�P\.�w�`si�����=!����F�	�:���n j�q9�*��l����������W����Dq���~Dy/��c���X�c��mE"d���e.
�_��4��
f�R��-���x�����ws(�0$A����"-O&��(D��	�v�����v^�[��?���U����;���kw�������x�����q�>>,�=�w���+�w�������x�����q�>>,�=�w���+�w�������x�����q�>>,�=�w���+�w�������x�����q�>>,�=�w���+�w�����>��v�����y��||dX�������?��tc����
����C>��������x�����w��yW~�;�������w~;g��~"��q�>?^{���WA�������]yH�
u�#�lWE������e{��<|~2��Q�>?^���������|{���Q�>2���>����>=�_���W��o���k��c��,|k^��#�{�dG����|Fb��Dvd1���3M�0���M�Ip����o�3����\"�?��K�qK�f����}���7\�p�iE��� �3yX\�Go�����2s9r�
�7��]��=��H}r�����%1�v-���G<���p�����+{�l����m��;�"<#�Z��`w�n9������^�p���smlw��p�z�S�*���j��,�T�}���o�	����IB�o3�K,���uW����~Oh8�������`�}.�9��Wo�{��oi�W!�w�o���z5�����z#���`��!�}��(��1�s����~C�������)��hpQ���S�0`;��8A�?��*!�b�P+X����d(P��g����*���EuY������;�7���dw�o�c���,���U��Y����#��VGyf�6:�����luY������;�7���dw�o�c���,���U��Y����#��VGyf�6:�����luY������;�7���dw�o�c���,���Uq�Y�������VGyf�6:�����luY������;�7���dw�o�`C�������~��uY������;�7���dw�o�c���,���U��Y����#��VGyf�6:�����luY������;�7����W9m��o��v:�c�����v>Y�3�i����o���g������ll��6����f�pO	��Asv��DN����=I$������E�Std�W!r���L��q-��Kjv�S�3�[D�*y�y�]B��r:y�sh�D8��������VP0�
%E�A�odD1Z��%�I@�?�v���H�$��e��s��|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L['q	�E'D��ji-���4�2 �N��{#l����=��5����":5������1����������=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����}����}����}����}���t9!"U��#��Yh�VE��T��)���2�va�&I�,{P.d wCs�f�|S�����3�5�1�To1k�c���b����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����Q�������y�_F��.>*��-|\|U�Z����7���q�To1k�����b����Q�����S���,�4��U�[��s�Ud��.y�6oZ�e4n��#�S�3�%����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��M�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��-�\|W�[x��-�(D�IT�G`�If)n4P���]�� �+�1�\D���Y��,�F�D��\�������d����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��-�\T���,��E9`��� $AE��
��s���)
-���:�!��Y�"��1�N�Gh��e�T�NC�T�<�!�wwy������'�����egl������e�����u��X�'�5tS��U!0e���
~�T4UY�F%��0�h�\�<S�:��H(�����$�1��<�j�J�Ki���G��
l���)��r����1pSl)@2����4e��l�F�>��m��E������gE3_J)� m���qk)�]i�����K,�m6�����%�|A2�?L"G'���s��ue�����<��Z����Ujq�j0��Q�O��Y@:}�y<iB�_:���:���e�*^��3F����==�4G��+`1��UD��>�g��[KDU�T���s�S	x.�'����H{���5��M{*��^���h�q\�i��Q��wB��! �16p�b��W.��w���z}��rA[%Q��6 �8�s�HL�	��>b8���e���8��s�)*����0������YD-DH����f9�A�����j��A_4�:��I�!�)�*ew!� .W(�o����wp��@�PEr���UL>��O���v
�h�d��
�B�\ &�7�#�\���yRu��k��N[�=�qF!^�)M?pS.�-��L��A.��4����~*����������tc7L��nB�L�7(sg��j^��������^��l[A-S�q� ��*T�A\��*��$P�e����^��u]/A��J��LA�[��NH��	�,A\������T��xqp��k|�KDY
?���=7uev��R.��>�~`)�	����[�[�1��gnQ*.$������������~��D!�>�+9�F�;�ik�yQ������ME*���"���*��
�k����U��H��d��!m�n�(!7����z'��r��1�
�������zN����I����k���7��kR�!�f��L�LJ9.��i{�V�F:a���$UF2BW��kUL�W�s4XQ�S�[ ����u�[��ZW7�V�Z%Q�}� ;h���*��:�L�{�"�B�^���J����_^j,�[U�(�����r��t@�I3��=�&��_t����m-��m���B��j8�Y�2��������y]�������{Rw�����z��V&�l�
�]6O��@M���Y:����an�� ��Q�����+�m�L������T����^L����[��Wi��e�Dn�U9A�2NKW�I��1�B���|3��x��	���9���^j�������QL.f��������g%L����ib�G����wjB�\[��6���~v���d���(��C>�%�0��k���j:�i���n)-���>\��I���S�J��;��]����.]��U�7B�[�T�������(y�[�
�yc	
"�4�qoma}��e��u�G��j���q
,H��0&S��c���=C]������8�����F�r-X���� ��&���7{�3I��S��v���-��U6�Q1��6h���T�0�.Y�1}4grn�Mz��*^�����Z�S����R6MFD"bD�?�x;������RW���Kz��F&�[6h�����'������X�����]o 4�Y�A��SJV��7���jW$2��% &b�8��~��z���L����U��Y�n^�;2�F(�|C���P
�s�qP\��{[SS��t��e�0z}���&�g(�H>[3��#K\*������W��!��<���7�A�NM���s(�Tm^]���w��f)��U$���c^H"����@�O�L�2y�-�^�#^]����Gi����������������9�2zU�0.Y�,&�+;�U]���J�B��)Y�+AIC������!U*dX�@P��<h��V����Pz��x���5151o��N�(�9[��.�O�����8C��?���u�]H\~��+8�6��
���<�]����������1��j�������T��i���"��}����fG��oZ��g9��SS�F���&X�:�Tv.����V����:�j��q��>!��(Q2���bCK^���JZ���_^J3���j��d����D��t@���t�DG���F�syf5)%���a�h�.�2x�*�@K��"�E�9ow1tmr�eEy��|]!R����SU�������	���"t�	dP�?X�4�-Y/B��@��aW��_S��Dy)8�\NQ1��!�V���-�����[��]$��T�xf���D"d@��>��4���}��.��������CRR��X4Af$L8�6�JpCh��v�V7���"�e�sGU�.D�@�����5�wK�pr�@�8���2�:��Uee�+��YY9@c�	J���)�{�]4H��I���u1��5oI_j���4�\5aAZb�%#]S��AIP�����TLp'&r�����F�U��*�
���p�e�V6YaQ#U����,�$%8d����
��WIA��nL�4]��M��'����9}��4�{�������N����
H��>/��)�&e7����L���_z��Q�n��n,qh�bWU�p����������
C��B9cD�R��Y�����=��t`6-B�:m��D��������EA����f��uYK���J���m@Czn����TTX�n�n�Sx��QJ������������h���M��l�S���H���ow1P�����n������
�� �J��}WM�aR���!��IU�A.x�e����S~�SV�����x
����������DP@S�����E����u����8N���_Az�>p�0��+T��SLNT�
���#���m���m�-WV�Z&NF��~�-�)��f��9
���"9cN�&+�:��4�8�{y),��� \�;cF�L��.l���L��1t���?Q���Z���ni�mK�HFJ2�A��R� m9�s�����N)F�f!�d��N��� ��Pfb������N��;�h.(����Y�����h��N�D$�R$�C	�(b�����H\-]T�l����N��+h��:J���k���E�$u��P�QS	��,Yz�S5�=CiZR���hv2
%��6E���|s�GKw.@
�y}iQ���O���������2BV�$�S� l���!�T[
M�6U��Njxy+q.������TJ�Q��!�(�P2�.A\�`����]i����������wL?m�F��D�����<����!��p(9��j�f�R����%s��H>]�(Y��[�s. ]��r�1m,�q(zH�7Yk�@6���J�I�"�-P�T�������d���M�M"4�!�P������N�u������c�r�\�w{-�����^���?������g��XY�*����dc�1v�C'��}��"����Pi�JR��-Jr=��L��b�d��.�dT"D� pb��*R���i�] ��	��#\�s�d�yOR��86+e�"����@83��8�{�@�h��W��oQ4�c �����a��plTW3B�M��s�,��+H5e�����H��\�;��E�f��-��J���4��� "S)�D�!�-����V\��O �Yp�I'+��B�`({}c����mTi�,�(��Y�gP���\�r$����W���H��l�s�a�������K��}@.�%�(�L����+�e��e�����
kn��q��J*��0��|��J~-��'C��B9]>|�3������+�
.�^�yo/3z��������-�j1X�&�.C��)�hY�cM�����.2�X:
kp�w)����]��6t�Q(�&���D�H�`�g��&�����\j��u���s]1�qo�Un��R� �����ju�V���
\����&��+����nw0�3$�Z��td����f+T����8~��WR��V
�������U�4���Y%��
"��eA08'����z�;U_�h��	zn�2���V��dY4��p��I4�1D�)���su�_VP0Um5gd*X�����)h"I~P&H���0 ���1�b��J�(��
j���j��2����V��%5�y��ns[�����x��6n��m�K
^)s�������UG ��e"�n ���JB����KS�k�-r=���RR
�?V���+)pbs�fb���>�5.[�Y���R���t����zV����M8F��wbeA�
D@��z���Yo���{m���x�l�A�H�d2e���C��L7�1�#�~���l;�=����Z2!�t���y;LQp���0�G��p������������Y����h�)�����uZ.�1�j��%K!����j_Su7|.�d8�>��x�������d����r��f���~���Z��v�������U�4���P��
$��eA=���@2���G���m��f����������V��e�d��t	&����a���h���`��^��ejx�����)hn
B�@��L��0
���tG�6b���L
A8GR�<���7��.���v�EP�	����:�:��M�p���eM�W"�z}'��yIZ����]����gT^b�B�[��C��y]�~�o,T0��D�p&F�<]��������U��=����l����)T��N�r�QO�l�1���<�b��-OW�$������B��H0~���Vz5x�O+w/dT;R-�NH����
k�1d���E��oH��mW�Gv&M���/dO�&`)y���A�YY��O5M��hKSQ�U�B���=%&�B�U��!R��8�S�r����������EF����V��1+m����T�P	�;���`��}��������ym�N�2x���a$��o��2j��|�3�|��]�+����|��s]��qo�g��K&����J��������tuMFB]�������^�}"iW��6(��Cn3��]�F�V���o��J���g@�v�����U�z1(?1�(
��s�jT����Z�����,�!eN��cI&�JqH{�(��Sv�S���uJ�	��zv^�DK���+6��a�w��n��w��'t��T����hdlU�����V�~����K$u�& ���
��4�z+�sHr�}]P-���F�MH����FU/8�;d}��`a����w:��������������d���&ru���N�8�3T@��	�!�#�b�������b�]S�����k�u6�I7��C��#�K��Hn\
>������e�V��qZTl��pm����
M�c�=([��r��9b��"7�6����fe2�B1�U2��n���-�&�j�/L�4mOX�Z��LHJ���tUA�&b�H�J_��<��B�Y���CW���0���*���Z�l� f��*&�����nO�yfcK�:a�i�W�L���B�h��/Zu����>�Q&���L�<A�B�������������
[	u�y4�,�8:+TK����2����q�u���}�k���MDW��$�1��T#���b	��{��o^������IA�������M8���JR1����u����R��0B \�|n����"b��kVK3���z����f(�Le�FD�S��;�9���<�	MDW��v�ihY6�s�MD+#��\���9�P���J\���o�BJL�T�����
��LP��������s�}fc��B��(���)�G����'(�L�M�e��.��{��
S��fC�B�D]�R����4]���;� �b���
�#�6B�F(�a�B��}I�c"��t'(�G7Kp3r�2������S]�"��nR�(��m0����|0�����B9�@��� �,D]�PP��<h�5� �&�\���6Ys�J�:n*E�m����;�7n9��0EP9J`*�:J3���b���I���E������$Hr�}��)�2�>A�~�v ��P������+!(�wp�D�����
�[r���D]���t�8h'18N�8)w�=��0��IU�ET*D2�DQu���"�	�a��"=�$�H�ET�pM�*7\�?z�������9�x�*�f��������L% }���t~�F"��P��`X��JQ������	��}T�(����� +6�(��:m�a��C ����f(�1�!�U�f�F�p�gd(�C������ T]�f�)u�8AD��j���_dH"���� a�L B��9y��D}��i:D��M�U��
����
S���6��H�I��(�96m\<\D��n���8�����!�#�C0�!��>����vs:1�Eh�t��E��H�}��C=�p}Mv�����s*�G	�P�;9A5;�C�w�B;v{1��`UM'H�(�[�8f��f�NJS	G�L����������H��M�u�88g�I7@s��(����(
�gIB��<���(� !�}I���E����7���3�pt
`L��� g�gc���.+G����#�/$'�H����5�v� ��7�4p�|���zAK�A���{��%1U9R �H�J.����I��	�>�G	.B,�U �[�@7����)��0�I#k��F���Pr�V�0����6@������j.���������������NDU,y�IM�r-�qA`DV���������QH���S�t;��V��=UAMT4���QZ�����=C�%HR;I1!�2�_��z9�wS��Q�k����v����~E�����uA�G�����L�����w�UmZ�0��G�KT�]UQ������r	���s���M��6IE��YB�4�c��P�K��)jn�^
J������+{w�����&X@MM�W�M<���E7RlS'����b��"
$EO�����������u`�������X~V\��?�)��B���_!���v���\����j-Li����95y��\�,�[������}$����]3���L�1P0c�]������4�������6G
ACT��l H4)���@.�Y P��\��@��1UR�U������|�]oNR�}?POQ�i<Z9X��"%��#�+��2.�L��JCx�1�`)Jc�R�11�x;��r���n.Q���Nx�qL�&�Q����
u��F2����-�'�������l�I6���i���w���>������v�QU94�9�L�6Y�"�o��nW��i\T���5g�uB��T�$Q�\��i0�yt�,�#�~��r���5Mp���;M����U���s[z�U*�$_��u/(�.�R%����(b�I�������qMAU����>a��;R��5	#�� �]��+��E5I���
p��9Z��[^�[Wi�#T���{C-�wh�Au3N���r c��)Z�!���s,Z4+�i8�HQ�6������4�%gD���d�jzV��N^z�$Y�����G(�)�����5��+����g�mI]�K��y��iSR�4k�e��	=N����c*�C|�$��@w��1s6�KWI��x�V���$`DU|�8�$���'
$��2i)�!D��P�A��,
/t�~������%%X�� -�I���������S�sdm���g��	Y@��E�����b�m�5`��\+��G���}1EMH�T3.���U�����M%��� �����u��p�&��������d��z���|�m?N����_7q*�T���U��*�A�����j����e�1��8��)h��XSMf}�.)�G+�^�VR��d3Y��|"&E�����u�a�����XZ��]8�2������|�������MD����t�WL^�P3Md�&.����������B>��z^��)������F�m�l�����13(X��E$HTQMv�teB�[�Yi�@�7^E�*�kOH��f���$��.��fF*���I&��j����E�N�Pt�t\�r�N9n�n���]�)�r��(�X�t��]=kS�R���������/53meY�vk�NT@��\�]V1M
�;�����Y���b���Ut<j�u�5am������*��!bE���PI5Yd��H��������e}���V[�B����([KK������i��X�V30,L�k�S�2�D1SCdQ�4Ah��������N�_�R�G�����g���onE�,��h���z�f�"G���5�T�_�_i�K�n��h���r*C��:�N�%o&SQV�KT|�\,+6x�,���yF�S"�' M����������Oe$t��kd����Qq��r�
��<h�H�J���(�J�yqk������X�S�2���54{;�hm�U5��m#���r)�����BI�A���pAP�.`:]����T�j����MO�J�L4��K�0I�JU��k��U���S��
&���K��E��r%(�M��M-uj������m��_H�|\V9�+X�U�Bz<Ry~v^���x�����a���'�J0n&����Mbt�^T��QUM=ok����rg	��`�.V�Ky�SUZ;�/ZUWF��=�����T���K��������TJ��A�N_�n��UM�GQcx��W��5����$�BB�=R�Ff����|PU���^<U Q`;6.7HC�T�N[,j��fm��kw���%+T��V��m�~RQ�2�O[�����H�jC�#(}��f5Gi��mn��	p)V5Sh�UDS	�D�B����H�FE��U��Z�p�L�"����Uy��=;�u��5�]JR1V������}��16�����>]��*����Mf�*�5�$*�
������������V���PMG]�WL,��j�c_�4��0+%U	*5)P2fUTY��S�2T�4���GSp��w�VZ��t�LF�'.J���������=���+K������{# ����u���U�����MK4�X���1
��+�
cH��8�����!�%����Z�������g!���M�YRT� �����DVL���h�����������[Y���D6���5��w?�����^F?�OC���^Y�_�H��S�**���l]����lE�"J�������i���,���#����J�6���6L���sw�]y��-.�����VV��qkLRno��IW0�o��@�!���HH�p(E�s��L�k	�+:�iZ�N:���[����BA(�U$lS�	8l�w,��H�&�����5�U_���	�;#����z������M��_���MN��2�����;�I$c�|e�>K4��u�1��)�a����6I�������Y��O�����**����nT������_���7B�9��L��57����T�����������V'�g]�h�sG[ZU��G���kTG��d$��7����R(�b��.Q`�����5���J���������n��������9_W��&��J�2e��*H�T��I� �x����[
N8���KSt>�m56�Aa�KV4t������-�S3+2�v�,VLVQ���Dk�+�bm�Aau�CWvCIck\_}P���6�QU2���??_����nQ�\���KL����*�����
�)i�2������eT�g3�-&[���e�����O1;�-[F���mr��"$p
=��[�2jSM:������A�H��,G�5JW�NU#F���k�9U��9Y�TUx�&�Yt%Ud�k������y�Cm$���C�+�z/������J��]���:�����a�n� e�8�n���8t�g�6���$���m���y������f�-�KSXW,XG�,�I$d�����������Y�d�EJ��]>��F���k���/������jv�]P��U�CB����m��5��x����+���K�*�"��UA�GtU�:X�4�L_=3����Zn����-����|��U��,H�z��	&�k,��IU�S�u�a/:���7wYw���`\��`�3Z�.N�s����p���n�4�LJ�e���Z����V�^v��w]J�a���X������H���T��6�lU��j��G5���k!�W�q�e�������^O�Up����C�IK��J'��"�`i*�����B8�������zV�A����Q�y��(������d�9b�����Y�_�Vh4�����
$�j��K�)�	�s�d����L��D�!�1V���V"���������#@�B-I��Y�37+D���$)�`�vb�E����Q����YESd��#��BDLWYe��:�>[�0�kU��������������zJn����:�����rC(��Q���)�A�r>X�
�<{�-dMw�Y���=���6��G�_!n���2��.������������e�I�X,����Nw�:���E����e��z��7�#�\�.�J��8�ilin�����T������]�������m���9*~�?[�e�<�DP�7x��%���Z�����O7OMz�����}yt�;LC��F���Z>���������U
]�SI&���*�1s���J�}�Z�1��sE3A6������A�-��[�^�-+;�p*5y9���d�8YE:����?��u���k��TN�/<�<���J��wQ2�����M��NQ2��������������Ayn}���^6Aj�y�;@��-)&8�����Y���Y���T�������J]�Z��s���X�7U��Vt��xU�����A����r����r��S����D���F;:�����"�;;�V�R���]��>���9���q3DHG#5�GL�p����T(��(�
�[
f&��v������V	�h��r��$dTs&mD�T�L�;�
����Dq�����o�=-���p�+D���|�:�������f�D�j�����)���
*%��L5�j+��O�*3�Gm{�L`�zv�}Q��[���K��h�E�����D^PvN�9{X�R�:���3��86�Z���mM�����Fq2���)��DhQ/��K��ez�
������ ���������o7`��8D��u�X��E<�2%0*��O�
�i-e,�j}N���Q:��d����E�(Uwv�������m
�&]��J~.���Q�����i�1o4Ilkmy��(h��"v��#�W������#ycgUd����=P�7��vv^��=]8��!5��5M-Y��	*�U�WT�t^3#����~V8����WO��z3���g�=-#JV����S�5����bX
�	&mYTo�@�~I379NqL�)1m#�Ml�4�/����Y���m����
�/���G(��8p��@} �
�
�������R����)�n�����R54fn�;T�J�uT��-SUu
q$���!R�������)�f�,�H&=�Da��{>IU�F���~����A�����Q��LbE��+V���e�����kh��kR���J�2�Wz����,#u7sE:�Z��)��4���b�2��6 ��
'���5�1,g���Qu���E-��H��U�V�~�� .
?MG��O#�'-*�fVi��?�M��J������R� ��f�.
1���kZ�G��T���^����R�1�N��F�j���Vw���F�D��f��X�
�?�kiA�-R[��������"��5�J�4�u#z�H��npZ"sE=�\�5�<QA�;�O����Wi�����vi�@
���9��!�m�Z��B���i����IMR��Z���W�����7�FU�4y�h�7�Y�h��H[���������P��
AG[�������E(
u�-,��H=�%uD�8��TJz����r�����9r�S�������,��("c��1�a�q�t\3�7�R�e_T�=�&V���\5H�(�u1]�������$���/��
�@��{XQ6���NFz���q)����h�K�h��N5N8��J]�g������WO��Q�+��n����N���z.�lDTwNU
i��|F��Jt��{��x�*C�TH�r��m����+�J�uSVV7J��w�NZfB���V�sp���G��lG��~�l"�Bd��'h��D{'5k��~��<�=5�������\�1WY���h�j��>2LXG)T5tg�M$�K;P�����o������j�E��J�%��~hqK������������Ym�A�j��w?�%
�t��lF�z;�dW�/T���ZN~�������b��c��5�D�P�rr�j.�X���#���"=���1����vK]QDj*B��q5#D�3���I'�JPE�\E��!����;�[�p���71�v��(Kr�G���m��.)O�r�[�_�f��7#��_��Y��c���E6Gt����`�5W1��������N;s���+��/��������m���?��b�J_�Q8���!-�ku��G���}T4�������Jz���yF��	����i�J}���H��:�C9����)k��}Gj���T|���4luo��eKSH���D:�l���F>r�d���;A4�==��VO���.OJ�e^�e�)-j�DTu�JJn���,��$���	�s����~��.��-<����^?���\�1{m�gZ=���(9�w ��hJ�8Q7H0Q �����5F�Y���:�w�H�g�j�Y72��m-C��lO<�5���"9D�RL�p���Lj�����WO��Q�4���_����MCi��~�D5��"�;�j3�W���u�B����,�7�����t�!��FG����:��e��m���h.B���\�O{��}Z�\G��~�A�:t��o�W^���7v�T���V���G����������������*�{A][�Z�"�"����U��^>��L�[�B]s�j�(���
%�}�1���mo�������V����%�#k.��v��cT����yWK��{��r6F�������P�sGS���E��	�[�`rF��]'v]L^-b�TV�������VJ���t*N0�EM_���=-�a ��U��`���]�qQ�:q��v����M�OV7H���9���u;������"E��;�D&������
�c�C����$wo?���d�&�-�z����+8��j$$�*E��<�����u�({�k-Y���h��[�h�#R��H�'+6��u"��p�+(����O��p8w�i�lES){�R�}0�U&)���6��BI��-�12��h���u����,�C�S* 	���4�����5O%QE����j������H��}:j�-�T�5z���C�d���A����Z��:�W�%���:j��#=,��Z���&�����`�wM2�A��'"����@
��R��
H��4=����E�en� U
���5�B2��?;���<\������n��$�4��b��U,W�����V��
����(���������#�C�W�g����������$���S���Ile��:�����S�-_��>��pI�h�y�j8F&A�v�x�Eh���z��
����H:��O�]�AwG_kiQ��
R�����B�R�M��_I�Q2�)�j�D���������+ki9����%��\S��5�f�R������I��1����$����7T��Si{I�N�������K�zV��r�5UO�����j%����j�l�n$��v��t�h�uA#w��z���*�!?�����ZK���J��.M�=T�1���EE�?3y�v��1���;e(�N6L%������u�}$\�"�T������!!������������o*ePK=�*�F�w[��
�7N���0��7BZZ��\��i:��sB�H�.����$���#��o �T��N"<����(�k�:��4�zn���VT����R��5,t�;op�m�B����AK�F))�yU��FE��$+�N�P/g��7B����L������	n%�&5%?U�JG~X�b�)����M�t���&��Z,���������n�*�k����At����h]��
k����E���]"9	�.y�a��,;_����*�O7��3�����*�^�yY��n;�Jz���=v��M�D�<lGj�7MQ��c�wN�]��c����M����KAP�AF�A�[�3Mi)!H�Q<T��,���Z�v����V�MtL����*����(����)�"(�B
���J.=�zk(R��EH��`�y~����H��O3��1���8u��A����?|"n�Gn��M��Ld�	)�$����Im�'*�n�r���!��B!��,c��`��D�3d�&�P)�'1Qn��0��h���6�Q1��$�,���E%�D��i�!�Sn���y�w�`��&m�	�h��6A0�	�� R��`�����%1L%1D2���UXXXuW!S]H��1�,�Gx�T� �v���B6�������|�9�������)�x@������G*��K���[,�U����/�6c�I7
0F�9��R9��P2���+�
&
�.Y��`�$B&�d*i��@���t�!�@��X�3j��r�Pf��MZ�SNb��)
a(�����l���
n;A'-�Lv�k ��/�0`D�1�fS�B��h��b������)@L<#���M��Ld�	)�$����Im�'*�n�r���!��B!��,c��`��D�3d�&�P)�'1Qn��0��h���O��]#Z-/��j�.F����b�P3l'w��������t� b	@���}�G��K��D)@�}O^�0���J @�������x���w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5���������^����O^���d�S�m��.��I%#gj������!�1+3��Y��2�&2��"�L�1JUTL��9�1Jm��=���{<?[&�J�wH����)1{/
�����X�	�R���C6!w��a�')�)@ON��&UU!KR7�Hb�A ~6�!��0	C!�6�����u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E�n�;:�����:/6���������og_�B�����6vue�$/��T^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x��������������6vue�$/��T^>m}�_I��/6��������K���� p@N�z���
�l�N�y��wg���C�v�����j:~�T���
��Y8���J��s�<�B�����5��E�
�*������c�-�(12L���T��<.dPf6E)7�;�7����Dq��N,!T]��F[jq��Hf����FN�$������P�`�!��y������H�wJ��p�q�)&��k�*��\�"$P#��0�� ����v2������l�E����,^�T����r(�� !�p�L.|��$(p� �8@@x{���W$���P1s�n�D��Lq(�M<�8�6y��}�g^�^�FU�������%�
�Z��A�]F�L�1/����Cbl�>G!L�`L��Giv�e����n��ri�
�#������c�o��.�0�o���n)���	�;K�J9����2�\��&{9`6�>����x�m������,a/5�����m�4�WR$Y��d��q��G�P�A���n�
�YfQ.�;��qt�M��n�<�8�!�0��B����3����L����0����%����}���6���n�H!���r0o��\�`����(	D{�($l�C2����������UO|@#w������c�R�Y�� 8���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�q`�9Y&�Re��$I[��\��HB11��6c�	g����7����F��3���1�!o&V��&P9"��!6�
���kv��m��j~����j�J��r��$T�d�2J�	
`���
*��;�r�!PEB�P�6y{86C���J R�^���D0�}��zr�c���`������!��&A�/c�7��[�Y2����We:��LdZ��r0w��D���
�����k����A��� �12��D]�����
�(!�9������
��m(�ypm���V�v��c��<��[���b7f��GtD�8
��c(��4�2!��WHy'%!����`��2�v�+K�u*����!\�MP��U�TKB��x�[�(b�Dr {[qF]�iP���+����*&i��2��s������
��|��0�9�2��"�`�	D?���9DJ=�ef�t����w���s�]�9I�s��m����_x(�=@]H����o����`��t�5�$bdC&�D�	�D@2�r�'�Vr��r�dJ�pr���Mv��P��S�
Q��B8�Zv��D����K�F�����E'G1$t��)�U%Jt�1G ����;�*Y���
=��m��������'8~�x�c`cnf%��s�(�tq�y�0��<#	����_�����3{|
 q2`��|�P�S1v��Ha
s�(e��l�G������2���*I2BS����>�BfmR���`���(q�D��0���V��)LP,��r����l��YQO���,��@���B��)�r8d�M���|�N�=DAV��.PQ��LD��Q��1Sy�h���B �0��v`c���(�"��3�J�w}�	�0��9S`�/���=���]���f��,6��t���T�c�l�>���.{��G�	Gh���!��sD���@��!C/5"a��`w�����Q���}�"�d<;v`��R��"\�|�������,����08d=��g�����R�{���D�6@]���s����N����MA�Rl����;O�uC�w���������w(�c{�]��������@	�s���R�������vp`E1MB�����Q����.�8��������f�����������@����<�N"�}��@s��`)�.��zPWfc���n]��wLP��o���F(��`;8q�!�Co����HMM�g�������j��H�N�8P@�M2��0�9�l���.u8����������fo���Q�������d�H�6�`9b�N����bj:}�%U�|I%i���\��Dnl�T���������?��C�-��L&��l��f(����~�r���\�G������q�y��tK���{�m�3k�z���Z�*�A��*��e���%15H+�<��e��Tv��P	262�=W	V�j��#���`n�@`��a���z!���	@S.�(]���x��Ch}�&W�Y5 �?HU49GOL%b�>T�T�H�1��C,���	2�@LcdQ���>0d`�9�s]��Uc��M�:����U�H�����C�����#�>�k�:Q��-V�GT���&9����lW��L@�*��rf<1�P1�
�>�
�����c��01��P
C���vpp~�7s'������������9=I?����m.�j��v����B�HD
��W�#��`�7u��
'mPxETju�c�+�<���L�P2`#���5���&��4�Q�G���;I�!S:',�����8(�J��Xv	@r���\�r���SfA�Chm���v~������A�������6���ng�%���8������tfj�]��������+7
��Z2�l�#aI�q���s�a�`�w6c�W��RR���A6��V��O.��M4H*��#9��S	�fpn*���J$	q�Ib(:Nn���%k���J�B>��z�B�|��R+��ytW(@��`b���mNQ%��ZH{}\�k)(�lj�)�1������y4I�=��~\�0���x����R�,���^K���V���IN��������5u�F�t�Y����E�bQ9�;C���}2Q���B�����u=K59v���&%��-Q��#D�)��+��&�&���X�>�'Y�Wj�1�h�Y4��/����A%�f'��l�=�(��L��� a���)����V���G���`U����M�2v�i�\���N�$C�u"2�MD�HC{W:)���H���3}g��1�7P���B�5�2I�,�U;%���UwW.g���J������kK�IY[�fe�$RE�F����=?D��1��S$�5��Q"��*����g����*���m9@�������$C9iV:z����I#"L�$U7�(x�:p�������nr��O��y$�&��H��*�5ut���,���HE�eR8�D�39iC��M���Y(��Vn����gN�RWj)��W�V�GP�K��$�����{�$��Pk-���������j�j�}M0�N�7��i wU.�s�p[|�%�CQ������*[Ki����-@.>]�Z~�������n�b��&n��r�Mu�bm���'`qhZ^�����um;��t����w�7��~��("U���r�� }����������^�D��ne�hk��������Z�Cy$b������x
�9�f(vVG��z���i�y �����s�����$�%LF�n���]N�U"m���57��T[�v�[��������JJ��l�X��w��N��`E:M�&E���:�9r(j��b�[*��+�:�N�cJ(g�Z��V+���j���,�4��+�l�*}�
$`L'��o��5o�X�i�ap���pl�� UMQ'/+(&\
a�9!)�%0��Q0d"��{�Q����1z�L�!���T�(��
=�����!�43�������^\�4�����N��[rX�b���W�rV����QC�`��X��'(��"MWWm����9�X��*X���g�,��5� �	$c�dU(����rY��:��������m��&�l�gZ>�]���b|�����W_F��`@Iiv�lb����3&b������bt�]i'To�g5V�`�5E�g.�49c�Y��6�8r@���O�����h�|��������Qq(�>����������D�(��IF�IW-N��D!J�a�#�F����������&�-��Rsn��_�JY���{Vn��p`T2�G��_Q$�-����k�;g���T+z��P��+`\\6�,�"	�}@��`���������GX���F��p�}����Q�1JF�� ��Ie�P�TC�q�r�*�_�b����-m�m=VP�m�f�g���[�X���������o&�8�ISJ;���
"���OS��^:����*%):�6������
==
��a��JFH�7T�&�NC���+k�JY����K�OX�?�6��SI�yJ��fE������A����`f�w$���3��������K�)�Y�&hz�O��[9�w
yI�>����e����!��C()��/g^������J�Y%��
�����7R*x�����B-.U$]��L@:\��\�3��Re7��J%)�&�%Nb���EJe�f�c�VR����k�	:�����
�G����Sg�y�����`��K��T�5��%�!�o��e�e	��_zX8�F�w�L��U=sK�4z�R��be\P�QQheH` �=����X��jMu�Qs�t�,��&��1��y����+��Q�z���O}U;��p0	�_��\�<�%9c�o5Zk���kb_=h��J�F7�pFu	���xS��&X9,��;]i}P�bF������Qt/��t�+sL7]8V�T���]��P����1
��������-��)J&�Z;�\X�����AJ.bz�3R�P���YG�HP�7z %����}�l�J;���`��c����ev�+)70������$��9jA�'B��>�|�T��_����& &(�����S9�/g-��,��%��� ]h�mXD�2�������W�&�a�f=��>�a�5���l��U����PE���vkE#O8E�h"C�9v������;q�~��
���zy���=2����/��>A�yGF\�jC:S�H���r2������g4�
�;�y`��u�U�G��r��f��J6���b�	�� ���.�Y���*-�9�[�N���Nt�������j
�������������*�^5�s(�S>�G:M���N����;�}2[8J��]:����_J�
�l�A��3
�uJ� ���ndNa&eP��S�������u��/o����J�gGU���qsUS��g��[T�p%TE=�HO���1��������gl&���������'���E��5l�+��vL��}���'��aH������M7XF���a\����6jI�	��
��\��-<	�HVm��k�U7)�H&P����?j��/,�@���{"����~��
"�VU�����(V��n��H@��X�6���%^�GY2���G���cih>�f��[YU��������Y�&)qB�{�����������>��a��8*>v���r�N�����E��T�� S�<�F�1N�7U�����3��n5D�jf�|W��B&JM��xYV:PX�n�t��oCp������aM�V6��Fz>���9�0�"7�As��`��$`TS9�������m���o�Z�M�r������j���@�	����!�p��Pd�HE��� 6��gR6�Gs�Y��(����Ko�h���{Gp��-P��������v���11N�&& J]���-��kkMr7Z��SG����n
T���)�NA��y��t[�S��0��	����iz:�i������b�E��V6:�5
p����d\�%�;�]�"I��rw��#\�e��1P���V���eR�e�m�^�4<5��	�x����;QNFE�F 7�fj�D��*j���ykms���m
J�~��2�Fn^QA~D�n��$M��������D�B��� Q6]��Dr��1��j��':JO_p�0��0���*{�
��C�h��8����2��ok����+e_(�
��u,�P��2����R�P �����D��n�����-����F@�G.j����B��)TLc��W/�*�s�SM%(n4��}O��+���L�:��lN�*�'�����jbjjjVFBe�IsF����(�LRr��E=���8�
��h;�h�Gi�y��XU5��4A����(��,�Vd&j(��\�y(L��v��������:@���mM���L-mLUT��vB^M95����xvL�d\&���d�����j&������Q��kK��<m��r��Ls$_���	����*a�{q�9�S����-*����(��P�S�p$@f
7�.Jb�0��Q.Blj.��[2^������7��V&��l]��2�������d�%]��QU��$R���1��
x�E5[�gJP6�RZt4�YJ�/��k$�����NmF�����U�-��P1�"%���w�O��l�����j�a��W�W
/eRD�iR���x���i r�2,�o��R����3iO���%z�Ou�^>���:�kTRzz`�.@����f$�H��FN��R~UX9N���/��t�*�*&���4�Z��[����+T�VN$��Z1M5��8������{_�;)�(]jJn�i�����]��a�EL�����3�D�}�K�a����,-94�z:��]���Sj!��J"���1��!���g��������'g���m�7BE/!�Ut�����z���wk�!?��L�HP"@���m��(�_o��E�������T��'����k��y$��X�b��Y0��gyf,k�]h>������iuntu��]�kjy�J�C8rB&x�L�:Y~|w���OT�R�LQ�]��TQ2�k���^BK<��2^X���*)�M�� �3�����'@����x�IG\
��_���B
H�Av���St���
H=M'f;�\"����6����oF��U������a�
��&��%B,�0�v��A]��D� h�9�ypg����"V
�cY�g��j�m�#��>�51nb:��;az���)�
��'|!�[G<P���+7����������N���wZ�UiMGRd�gEb��2���$a�Q����Y������g��SO�Y���f��V��5GU�.��N��j ����>L���f�L��f�%�������5j�����J=T^����e�����]��nB7H
�!���[�.��4i�cT7�z��=����5p�*
����l��j'T[#;A-��0�pK�
��Z�����b�[t�]H�!,�|��jm����H�!����D�	�"
����*.����%}�<���BB�T�N��}+N[�
6����]e�%P�E�Zf�@�62����7,���B4�CiR�����!,}����\����������HA��[�!��I'����������]�6;Rwv^�[��Z�����f$�C���%b�J�����@@����0p�S�Zy������[Ev��;Zz�&��4�ebZ��w�HV��]�������y����.7A�l�"�P����TVL(�
p0f">�4k�� 6�j=Kh*��\�:�W�*�����'�`Z��,�B���P��T�)D�o����5?��0�h�O��yZP6jJ�0����������J@�Q�`�����D���!�Q)�,j�Y�����qt�l��^��Rd������K�!��{�7Q��D��1D��S	2����p�U7*�����`~��������*���H���������
3����m���t�g+#�(j�
2�c�G��2��t���/�	@@�9��Qi�[�m
:�����U���6����M8�$���"��{DZ��*d��s-��q��?�
\���<k�	_i��r�4�%'����jds$��i�B�����M�	����a(@��H��z�\���MmMC�������.�r�"�I�y������G�L7����<�N��-[H�Q&��}��D\	j�7����F���9�w2�E����t����!�	�=`��WO����L�����k��������4��(�.��K�d��L����9
p1�YoS��s���)�n��v��(��$�2�QR�D�!9EP��R���sn+{}@���G+k��D���OV6��+�(�>B��l�C����k�Hr��(���2\&��&u���1�0�E%4�A,�UN�l�$ d�5Q�(������t�(�.���4�w+z3E��i�AA"`R�!Be��&���z���=sU��QW��^�������M'�Z-�*4z*7P�8���x2o,:b�DL��#���t�D��e�l����[O������[\�K�K;�� ������J�!��*��@� "l��fL��!.�|�@���$L��7w�he���@��dUxEA#7�1�a�`������-N�At�75:�2��U�0�
(v��6�QTH`(��{��-L�4�������Y�7P�n�I3���O��:jR�tr�e�"g!L`0���{��*R���(���e<���};$��$�H�Q7��7����(��.�_z�����m����V�F��L���G9�8� a)2i$~Ps�9m��$S"�5���!�)�^��9�=�[6��;�v��J��������WCS�$}��=�Y�
H�D�2�0��!.)����B��*�Hz����#����uICNF��4�dn� ��&!�`�j�������f�#�&��$��d����}!��:H����D1�5��uB�PPW�D�>��\$�A����E�z��pY L�H��i���Q07�3e�A�w�
m�<!��w���}X�nR����5iiJ|����\�/��E��$�d�UTG>�3�;���j�����i:�*���@��5�����h�b""JLN%�C0S�LQw�*x8�� ���><l���vG���PS5x@x80SL`09D�9N$�L�>�DCxD8@:�L�!�P�)�01AA���������S��57�nH��@(��c���>�2 %*��(��*QL�v�
��pb��_jBr��,�+tnma�J����1$p��*T��"F�#	�J�81H��'\�W����m7K��n}!���EH�q�Y�.EU�)�p0d"be�$��Eb�������
����\���JN�������S��.�2~��=	S�
%.�D�HE�Q���S�DT�F���R("�C=�"
+��Bw�D3��V@Om�C#Uj�W7��Y�����<���Y���!Lb��G,�2
�9����P�8�������7�.�s1M�`��}B������^����cU"�Fn�w��O�S�]B�Lr�ya�g��(��6�����lIV�(Ru��k���T�I4(5����i�r�f%�>���=\��H�J���*8��)��m�?G������+r.� ��"*�.e��
g4�z���i6�W��+IT:�J���Q��% �ar^AI�yed�!p�T�+�8� ��#��K���m=+r,$���?GF�v��Q������r���'*M�L�\�����q��{�;d��c��D��}^Q��?�,��n���]
�a�d,��nN���x�P@� �[MK7;b�Pt����)�(j"r1�F\�B"��!�a��=�w*��;�ht���n��Ogf��3���Ule����~���%Y5_}=����&�|#�X���-G3UUY�9NB��nU)#5�n�j(UDDb��`�k������O�mEj���"���^+�
)	O�T���=C�P8,�2�Q'-�
�:@/$B��v��LD!�)d��+x���Q�KiS:�qP1?����r*�n��;��L4�{jkK��^:.�#K�Hi��v���nbt*���j��e�&Nd�?lE<�eL��mr[�Ahj���o��t]���/*���WFQ,��i�RB"8�R6@�uTK�1�8��M%�V�����un����J�5��7�r�l��T�_�}$��9��%9�r����K������MS:
$����"��E0����� 2�M�@2�����0y
8kJ����]�cUS��6�
��0���|��J�g���[(*�c&]����6����cu�V�uKz�#j�B6�X��c��G�`+���G)��f�(��S����-D7��v�^�[�Y�d�H�Z	+�P�?.�$~�h��,^}WY-3����.�)k)n�����)e���&�U+��g�t���M
�yR�7~��/Q�������cgj�e������������$�n�GQ)�J UGU�f��V�}I\���� ������R���
��*�|���o��!��D��Bl�(����Gh@#����>����������8�>J��)g�1�i�B�7��vS����Q����D�"8����$S��X��Y�RS)OFR�k������FoM/��M��WE���&!;3���+CK_+���5�������)p���iF���!>��n�E�$9����7�+XT��b5�8*j~:�Vo�`m�YO�������A���G2j����4SYUR)T�sv�P�*��	Yj���*��t�*���
���i��Ye,���r�yarR����������>�-Y��v�U�q�����Y7/�^f�C"%Q��%�gn��������q�n�����2����2��P��Q�.Z���GH��GF9��M�id��E`2��)��8���n�a����m���Z��j�B�h1��3��(����/�2��\�(�S/����w��ju��wR���������!\QPk�r�v��j�fuW)�T0�s)7K���������[N����>�Z�kR��({AAS���x��*�A��Q��tT��2�*���1�wT�#��r`����@s�2��ow`�E]�'�i{��JU���]gP~I���u]0p�����
"�@�;Y6�r@��)wqf�Du�a�4�ot�CV���4�k�p��{�X�E��R�p��Dn��3I3�*R&�J"P�]�E���������Q�n�,�c�j����x�
���7NC�QY0��'�Hr�5;bld5}��t#(*v��P���S(>8v������
���#�[�6��������^�-O];m*����)��d����1@�cL(-�e���U�ko�I_}e�v���z��v�D�lkuo#
�����n�u���*+	��Q�%I��L+!�^�z��gda[�BS	#o�����K*�NA$�tX�.�"�D�'
����?o[�j������j��EN��P1�5<�V��M�;�'�NBm���J
�A@�*bC��n�4��
'[TE��)[my4�\��D�AC�����5���\�
�1
����L30�u�z+�f]%Y�IW�VGC�k�������*d���r������1�2f��H�*�������E5U1t�L��C���@\���
Y���Q���I�f��+�t���)I�UQC����,V�-�!��ARV�JN��6/O��wkZL@-��
�UL\&�2�.��B��1(���l��7���,���4�H���
%	PD?�f��qDVH��S�J8���b%g��)���!���_�M+������)Pf�@w�b��G
b�JX���I�J��=����S� ������!��8"�4�� g��M�p�D���,�<~	�n*8U4��I�EU�TLsO2�' �flU���y��4���(����	P�(���M��v��1d�T ���	{��X�L�M��A0����e�Dr��2����&&�#�
���r��E����<���;.m���Ze���*J��3S����)xef�G����Hu��$��SN=�-6���>V�����eZ�3�R{-�)71'j��r�5�[�� B;���m�R�z[�X��`h
Y�]Q�#�GU�c���QU�"������9�R����8j�l���s����L�ee �&N ���}�'�6Y`��ID����T!�9fB��h�6�J�D��n��j���v��v���_Q��QOd�'�V��b���w"d9C�9
�8Y���RAU��EK��H3X�B�#��+oM������O�^T	���]����8�
r!Ye�2;�L��*'6�A�|6STt�/C�^�E*���\�R���UD�JA��N�S�(
�x"'L�7�<�p8�1vf��fc��+9�:����z���� )�S������r2���sE�~����6b;1O�r�M����}Kl�ZZz�f�C����0�E!(�M�����1�J�r�wM�Y@v�'�I�����
�r(��{�L�>��2�����7)HE�PX�*�0*f�� ��q���'|&��~�`���s�X9LA
�!����6����C�y$��M�kwO���aE�U��L��#�F��<��8��\��U���UD�[^���m])P��#T54"GM�D�o�`f9R��Tq}\C�P��C�,�j�@�g�N�I�9���(�p2f��8)�$��w��R(��=��a	�LUD
#�b[�j-�N�������r�c�����������r_�:��cny�#��7�(ER��(�e@�fLJ`0�p�e�������R���k�v���N%���9�Q�jqw��T���tO�%�";�
��S$��K��Ha�`�#���#������������*�������.�����'�Wq�l�L��u�T��#�Z_jm�
��sk���gJL"w��R*�!KI�����gSp�a n�Hs���:����J�_MH���$'�j�e��Yvr�5MD�	Dc���@��+��7(
x,�����~t�M����3pu�XP��t��6�bK�JG�EZ�]�L�rR�����$>�l���>�L�����o��IL]O�ce����V�Hf]5U`=9��
p������ �>���������P��
%�����`VO�3s **��m�*T�!�HQL��9��f���QPQ(*�j���$��L�"s��"�2�@{�pf6�i�cNV�s�HV!z&jY8%#cY�@�m���ER�L�P�2G0��9@
PSV�*�����op�i�X��V*6��\GC��������1���K�q��.�=�Z�k��n5s	�Kt.�:�����j#IGD�N�K�T�<�f�;:Q�M0*��������N��{]i��T��f���V���0�F��Q���x�X�����a���?����L��*���D7��n�y5]2���33(3��eq���V��j������"��r��-�������q�����V6�������I�����gR��G2K�g+d���"Y	DM�d����#�������qn�>��e���T��e�>vw�3Wj���;������&E/(��_����.{��DG-�'XY�`dt����k���n���=a��[��R�<l��u�b���I��B��� P��F���_L����a\Q����������D$��"�YtD�5R0�c��bC���e��r���][����
$p�o16��X#������I,���1�� �a\�kNtm����nU+[V7���mMI�Hj^�zr�J1��ZY�)����Sa�ro��*��4`S����J�%��F���5YL<��C�<�<�R4r�����t��jr	�]�,v��)F���<
���5�aP5y�|��d���UT�pL�*��QdQ(�����c�`��6]�
��a��3��-�l��\P��Q!�?~����
���B6l����T��G���+����PJ�m��Yd����c�q>bc�3�������T;�PwVT�u2��d���dq�D�M� \�s���3�������0�T�Ja*[��l0����s/{��-�o�8T�u2�J��}�T;�oD��wh��d9yNE#���3��G)Hb��\���~��uD�9H�
����}�f ����)w��'0s}���v�@�s�C�`���N]�.��
���&�rn7	��H�SLQ�"����2�9�U�/*l��i� �s�2�]����&B��D��P��D���sfl�;�9�#��P�����7}�@�T0�m���G�0
(\�{����{���w�6f9�7����w}M��1���������{���<��������}�(������
�M��xT@�~L#��t���yx7��0�D�\�,�&���ANU3	��D��r�xG&��J��T�e#�uN	��1�Lm��f#�?]���������4�s$ie�R2�m^��VI�0�bq(�����$�P�Q�]
K�s�Y�K���<���Ur�,�������#�QC�&[w	��N��q��{gP|9�3�akw��](��7������!
�������N��MOnm%��v����=�B��WNS5#�W����`ESKEA&����5E�9�s6��
G]Z������ADWu�u���]d��U��^	R0��8]�-YC������Y�>�N��L��>��������*���u��EK@J�]S�����tF��0dC��.M��<�����r%�	|oL]�r�]�m$3L��F�r�JS�1rL�7�nf4i��?�5}�oASi�
{M�����*������Y
����h���Sr�j���*D1�K�5��}��)��#-�����7�]dI).��j:rPc�ET�b�939��gM�e������d}ka��JR�5xih����ZF��"j��y*	���F�e�0]z:�eo{������%�����Q@���a6f�����j����V��q�T���[$p#8B7���������|��s�}�M��B3Q�>��W�jb��nt�c���5�J�]��o����V�(���c�S��T]�:��o�9K��m=����UMe�P�U�>Z�6�S�=%��	�	7����H\����w����n%����T�+5�N�0��b|;K�
�g2��b�k���S�b�
����������r�E
�H�	�����a`$���e���d�9cb�5������r9�]�E����:����Y�
����7bY���U���V����&�H�*U�o�����A&f�;A-���}�WO����Y{Z�6�k��F�W��Q���ev�qp�i�DK�YMWn�2JU7"�[:��]='S�
$�J]��m�]��+��9o}K�����tj;yq�Q9HVPn�;� f)%#��]�C��K����s�B�I��o�OX����:'s>**�M5��b�i�7��>��t-�(�w�MS
`	���BO�.�t����Lp7��\}!��]���(�t��6��cJ��}�C5H]��5�&Pv����^�i��m_M�V�H�f���]I^[i{% ��
�Ey���H.�4YH�8�$@P.4)G���V���W\��E������n��(4���$���K0nt�`���K����V�O����zj���cW����y�2��)�U�s�Z�1"�*��@��D�yL��de7�*���coy���;<�Gn�c�vv�h�kNf�j����Z������M?=O�����e�)��@��)�d8J���YS�"�������W:�������bg��6�>19#zzd�*L���R���i�O�i����7���k�"WJ��
1YD����[��u�%1pa!\.���UT"(&Sr%>E�h�>���Q��RVZ�����[���V1����"@G��S+��Y�R�F��@p��9G�����
��M�������j�iN�������J��r��?z�T��
b����	CjJ��n�tsuiJ�RD��s\�R��N���+�QsO�EQQ�Z��M��s7i�g���������;k�WX^�������(V�L$%Q*�I4J�d.���Ryw�
�����Q��?�
�"b�L���A���;r������
�������6���6`�!9����:�"EQB��T2E.a�f��1��d*�
���E2���T�&�;��� Nr����1�(������2���v`cNT�L
����r�$�h�
��6l�g�|c}��6c����������Stvg�d��8���0e��{@6�""��tE>K�"�[?�B\�1�DD��n�=����@m���a��w<
`P���0AC�o
��3���@D��	����<�Jl�g�]�s�{���sX��>�`���\��0�YC1��D��DL;DDv��o�)�&�0M�R���G�m���cL�����E�� ��&�� �{t�A�A��fa�-�(=�����L`��nE�<�g�X���@��Jn�r�C-�pc<���m��3�0��fC���R���@G1�6c��	�iO��rT	�U�8;����)�u7G3�y���J0��3����&�9��m���T
�Sp,��,���f����b�	7���{���2��	�Wq2����
]��S�����#���T�J�b���,�D�OD�|�`��>���YC���(��#��D���T�P���o��1�������HL&0�DL�x2(���DNP�L���@1�R��1@@�(�9wpP�0!�Bt�R)��!J �w;���8��i�DG1�c���=�o��
�o��t@�)��"]��b���@?$R��x�� M�	�9��P�L�9���"
�
��2�c�LQ6`P�
�w�n��e
pP;�DC�D��r���
������x!��e9r����{�"""m���S��~�(~�������cgza1�P)Hq0��@6�g������M�wN#�S(m��
�"#���9CcJR	L��#�Q�����%�	D�����`)��1EC3C��3m�7��m��Gh��A��
�
��w1�v���t�J.�if��FB$U�!jZ��?T����TH�9tP��@Jm����9a(���1]��AT��R���Y4��k�v��w�vc�t�m������`��6����ZB��O6`����S���N��f�d��c��L3!��lS�������V�\�:�X�[�������q��gX�M$����dFD$
�DH� Cu<��_�r����\j�z�^mB���.���/���	��M��PT|��`�rG�\�@rbq[�� k��S���8n������`��c}�[���C��d"������l����$��$�G�r��_��#v���o�?mn��yR�����86p��5)���rFLD� G����Yn���]]}K�;	o.��f��yqA\�O��C�[�Dy5J�&����j����'9�-����3�]5�����!t����d���Pb�����ml"*	���T��G-Z��B�@
�v�YZ����G[{{�dnm�����/m�Em^��
����0�H���B�H�����N��5�AT�AJ�`�H�3�=�"""a�h��e�M	#Q��Z���h�bR�z�y
7�x:t�����L"�|��L�Q��M�0�b�h��h������;I������7��v�T��,t)�eb2P�&Ul�0(o0 j��?k�h55B�U�h�s��Z�������p�5F���t�g+��_
o�!��+(C,�.�����u0��k\�S�Nbi+�>��!Cr��2	���7)\�;���|��F�4���w������6������J��,|M����R�����x��)��r	�2�9�b$%6�jZ�\z��<K���Z��rJ��:YgN�*=��V�2����8.�&q(�����i
%���M�����mmt�E7����U����-`���	�_���3�+.�t�������%��Uo(��l"I"�i	B��b�����x;�R���7^�Mo.�%�
N��Xw��4z1���\�4r��(��4m����r�}C&�QZ����s�.�[��g��`���)�n��ent���+c�^�rZ�\����[�
r�\*�D��OR_��UU�������),��r(&C��L��|�c��x�WWW�����k���RT�WG_gK�f���,�e�@��") ��&b�aL���){&'tkx�������U�@�ii�OI��4��^�A�����l�Q/���e�����{���*�.�P�e��E�����L�o��4�P��"�"��3�j��������t�uE�G2dQ�r`/y��
���}�������=/6�'/����	pa���ei���8��1�_��`$x��(b�"]��� q��u�q�|H����5��_
�������d*�k;k��c%&(z[���#�0 �b��4���^����-'�-,U�?�:���`.���1�.v������/�(�W	�E4@���9.P��ri��S�
-��8�@k&,c��U�4�����(�P�I�!�����[��Q)���Qk�Q�L��h�L��l5��V4�+�y$QZ��\9o���"��vC�C%N�r;]c�=M\+<����?v/M�fU�QGF������:g"��D�<;c�L6BS�OD�P7+Q���m9O�:���Nb�6��I��#%���pLH��L��a.�bD��2�cfb��a��G�8���ALD
�I�m e�v�����=�����@E.�a����>�GPw�s� M�.�&'	C�@�9p��/,P��D�c�!�%�ow,��S 9�
����`1T�Wxs.]�s���@F6b'�����
��a�2�����H Q �9� !�����}���7(*�
�(�{����f!\��������`0����b	�L)rb""%	�0��'8����7�wD6�������)��r��$1�da!�C0�6�}��r3L��;�2��9�� =���`
pK|�r 	�-��!���L)JR�C��f&�2Y��Dr�6����:�)�Gt���0�7��=�Yl�7(�bQ�y����~P��-��,�`}���U@�&��!)�Q(��}�����6�w��*S	H"U2��2n�������"!�`b�d_���"���|9�y�r��8�P@��	JCo��l�o���#�b9�����sm�����kCR��
f�Q�����Mrh�0r���86�ER1@�������;K?ck���o/?hk���$��pR���bQIu
Rr��)n��;��pEuA�E�����D��@9fl�r�fy�F��z%���I(��F3Q��C#d&����b���:1���O?��[L.5
��c1ji��W��t<bs���G	�A��'�J�Lo���~��j�*�������f�U��D���! ������&�#�@9���F��mYx5���U�A�[6���%�\
�G���@PHc�D��V�-�R�W�|��h%���:�DR"��!��������N�{5����diP��e��t���S����MU�����0�Y��u&-�ah���f�26���B:���8*�S��AAb��)s)�<�eZ�RISEH,yC�y�p&�����1������2�	�6�-����GZXd��&�����'U7�D3��.
�HO��Lr�J���J������k
�
4�)�4*UD�>���	sH���c�g�	U��%)3��T�@1�G#�w3�?l0������B�@�U	��`P��@�9��	D{������jZ.��m=KU��T�I�3yzf<�$����T�0!�!�<�S�^�.�:�LzU��j
���������|�1�����l�s*�$E2��n�Eq�TT��_����������u��2�9��(����p���n\�PPC +�4J�����J�^��sij}�7�L3h�+���d��@�sw�U7Jb��b�;�*+�%u��|��!)�����Z��oTR�9Yg�`�� rS�L�&O@�����Y-���v���Ed�h����w�����r�`���L�����7D�NL��q��f�CJ:�
��2��*��_���4�)��X�H�VO~`��1VAD
���q`�3��Q�%�}c��;�N����K�Y�oi��* ��Nc��|���L$�����-G�6[T�X�/��k��l��SWQ�q"g��F"����M��AV�I���p�R�j�k�Zk>�St�����,�T0�s$��V+�b��N9��eJ�d"�(�SSZe���w>F����Ukt����5&� X�+�b���nPw��S��BZ[Qv���v���WZfU�8��Jv�0zLB)�]�&�@�P�!C� ��H�X����<H������S2��X17� �����I�d����F��uQ����DO����g+�U�q�$/�:iH�z!�%8�`��vVV���Ws����T�:h���ETZ��������]=5B�S
�!Q)��og'hv�GT0O�&�X��H���2�2���������9�MF0]��
�n�yB�����$KQ��"�T�j���vu��7�,Z����I��%��A�m�5!�!�B���d���`�������(��#YM�\"��%L�E��&�)\�yC	�r���}�T���
>�����Z5���|*PJ?A��P�AC2��r��KBWz2�0��h��H]��}���u�k�BE#��U��R�(
��f,����j:�Z9sF��S*�qu���|�NR��G�j��6]��y��SL�)�&p����%��C��n�4�E��tM�R�oXQUu�o��R��q�p���Dx��3L�e5��VP�����S���������?��W]��.N	����{�1���������Y�z���F�i���:*����k'\*����E��A�&al�#���Nl�
B_
��R��������h�:m����k�*���I���%H����?'��
��9�;������P���R�7�r����f�5�P��x�����k�DY��)�TtnN��.�9)�����.A�F��i��;Spm=��o���S�NN�R
\6�����
�%#��F�:B'�1v�t��][�>���O4�iJ���=�qA[U"�x���{F�+"�v��uwg|����s$R�u2���iKY�YK����jb��v��-���[%����]��h�6�9��:2�r�Sd7�T}�Z�CH,uZ���-m��j��COWB*�B��b�d�
v�JP��N�1�
e�z�^�s��8�Y*�
��k�U��;IK�%>����,s
���0(Z��-������o�����e�g����1Wf��%Z��PHp.}�c��c��)��Hc��0}�\c��J�����Z�8��MS:s��&�13E�;��p�I��{L#�����m���+p���#y�;(��<�)����p�J���
��)�[��|@C{��iF��tF���
��bR�sO�����
�-S�N"���dC	�2@%P�(��a�ZP���)K�GTp���-G��o�6�����R��P\�0���1�]WEKT�5{w���R�*E�0zmz���J��Y��i�-�D�����3�
 D���"��J =�����t@xG��.��.�i�;_�J[����a&���b�f���VL[�-��R��QU�9	����c�F�*f�2���T dd���	��l�#��)DL`)wJ
����C�!H"Rl�f-of(Z�I-��l��v
6�Afe���B�]�r����.U��0��St�'(1R��@TH2X{����2�9�P*[��f��DJc�&c�JQ)�����	����rg(��Q��	���;C<�r0�1v�J;J =����yt����/_R��������]MV����Q�s���O���P�@L  4
mY[�k]V���
C?m�m�MQR�lH�J��v��U��8�5E$���"B
E�9b���	26e6�e���V�"�*���iY��Yir�����ZVE$S)�w�4�	� �,�MOh�W����w����������J�����BOL�Y5Y6JE�Dt�������#��7V��jr�b�D��UjU&�9��Qn���N
��[����6A�������i��_K�N��+��Tn��QM� ��������n�N��)�9��V�b"�W7�B�bG-���`��oR�2����1\�&��@����@Gz}����s��MS��Gh��!����IS7��H��Sq���M��G{f{�GW������g6����6�,��o�
8�3)7�.\�7�x1x�:T�sV����X7�R��Z]�K���Sa�9�c5V��-��y�*�����&X��,�4�HR!�e0�b}��L p��,���j��n��R��4�E�C���$��n�|�y3l�p�.!���PUV�"���'(
��|D7�������
��9A@t�s:�Q��C`���!�0`9�Yf��}���uj.T#j���T��%XA8 ,��)vfn�3&#�Q��r�!�b�CD��������S�mSj�������&�+PS��E�"g.h$D�@U��|���/.������ror@�����XD��y^Ve���`Uc	H����;)�����3EWt����1��X�Av�.TP���
��U>�� ��m(���]J���Te�y���z�N�$ki�j�������j�C��!�:��AOt����H:��{U4�s���mH<���5`A�Y����8��DS���}�N��0%��%���?�!���Z��q����{$��+`��{��*�d����g!�)�7�.���{�Q�.u��������5��� ���Na�AV�|��*��(��6��wGZ���v���D�O��;�k�]������&SSpI,��QU��.S}���@�����%\��V���+����AE����j*��Z��~��r���r�P���R��rI�1sX�(�V���MI��\�!H4�:�ZAuE���I4�`D��N$t.�f]�-c-��I5wL�T-W'
����F	�$V*�-	�s�1�J"9�+��(
�B}�:�H�r� S����;��n�Z������V�I���k��y)Wvn���sq��5����u����r�5�b���|��
�e�/�r��j��=������V5�;Z~ZB9qO8t�� ���*�V���c�M��W���5�*��j*�����-,�1v��x.i1D��T	��0��T)N]B�Z��g��f���o�����R�����R1;�T�2�w+2u�\�r�2)S���Bk��.z�am��V��|�ZZ���x
Q��Q�h���D�s���)t�
���h�:���J5jP�^)(�d�f]�r�LUf9	�3�������gG���j�i*�����V������Y22L�"��S1�C-9j�����]��S��n�����\�B��U�W+4T�U�[�Y��D�B�������F��6���n-���z�Z�kp��m\	�R��]3�E�UZ�D���0�u�~�5'J�^��d�fF�e�glm�5M���W���9P�RX��U��DH���c��.-Iz�.��Z���]mZP��b�����k��~��|�\nSl���"��7Q?���������E�N���Y�h�*i����.�%
��'��I�b��������I��5El�0�Y�"U^�;?L)DC|�D�]��p
���M��ww�_���#iU���*@�8f����R7!U`8�b�CnO�t-�R�_]*�h{�cj�Jl��z�V��c]�+#�g�.R�Rr��D7�<��v��cX
�}���5ei�Z����*����Y��3���� ����g
��H�������5��d�Vz��|����Z�u�>�tZ�Z�nS�������(sd8�w'�K^���j��-{,���J������uW�V���]B�Y�B��	8*J(t���
C����V�cF�'L�(��P��<�\��������A��N)���!��B��/hN�Ks�VQ���4�~����^��1��b�`����1�.t�4�;�R���M��	�%L�w�q�
�����x�@>�YjQU�

�Q$�������\�����DyW��, �V���8�pn�~����;��#����l\6-.���B�oH���,�L���!�tD3.F��T}u7�K�E����5�2��I��*�N��L��+�� d�S&&�qD�~�8:�
��?"Y��f�+w;p
�R���P(;TA�jf
���s����Zr���5u+[E��q)'�LA���J?4��O��L"]� �=����c	I�	
Q2����w�;��x~�/�����K[��Q��3�zY���"@���0`��rM]�yM�C��s1��b�L�T���FLL �������� ����2*`Rf!�`8�x��p�(w�b��q��	qq�0�����,
9|OuB�U��)�4n�x2�k ����&�k����@�`$c��yB����5������9����0���r(����b#�"M�*�of��'�qP�8{�@�9�2:�cn�
9��Cnb 9��,��������>��OY5=-9-MTPZz�����o�����eN���=l%:j� !�;n;
��q�K�@]��zl�91w��w%:wuI^E����P1�HdV���O0
�c���[MNj6��:���
sP���L���m]O�"*�q�����<Vp��6�ri�wR+�&�T-�lb��b���.����C`[sTVV�h�����'i�On���Zr���T���X�D? �7��7���qd[�K��E2�b�4��I��WVV�c�4&N%��t���U2����Y�@4���������+e�VL��R�b.N��4���=�F@���Ds6���*��U9�*��3o�e�����Ce��T�@>@`�xh��8�P"��E�/���ew�C��Y�[��"$LL�S��s��1��5�;��9��z>vr�igE3��a[���\���t�)��[��D�y"�d&��N��62��?Q�kUL�X��7Wo�/�
VPN]���OQ*��V9�Q�����a�5j�[���Z�)k�����T5���h
���S�4�R��$���9@�HyC9DS){��ME\�����Z�Q:�g(6�bn"A�4�R��Sn��1+�b-��1���u����p���!n�)�E�����v���#*9��xd(�����I�#W@d�*���j���M!�h;D��S���Z<ozZid�N�2fFDL��ll��!���'9LR���w
�y2G$������}D"a��	@���0����1�{��L@��.H������g��@�b�`L����x8?�w��wt�m���9EM��v��`Q088(�r�P�& `�V"� r���8yA�)NSPpJ8*E]Xx���	e��L��K�s�@��X(�J;�$��#��b%@s.�r��f#�3���Yd A(�e�	3�xY��(dSdb��6x����!!���%��;�#��g��g00���D	���Y ���m0n�LJvd%.@ ��8�������������1�j�r�@yP)D���� �r�9���T��f�8��(����f
���7��g���;�\���;�l�=����c�0S�|�so��*��J9�C��9���S)���0��)�e
�so�!.b"=��{�2�G��o�Y{!7zs�9�hw����������`.���������R�S(�u#�G1��3����>b ;� "�zQ�Cf���v�@��(����P6[���[6d0���/D��!D2(e��>�������M��GxGa����6��p`���BS#	N��l�=����6F�6`'6����;3
��f7T((]���S��;�{haBL%T��@�1�HT��J9�Y��r�g�P�L@��� l�@��o�����J c���H{����yA���!�>��{H$0�r���������7J&�� dP�Cfy���MS����z����"e0A9���M���w U���M���R�B;���U���W�kh"j*���Z��B!Y&Pt\e����M����f��Q Ja8�f��� �i���t�U{1������������0��R;�77�L�� 7J�%�0�����,����o(���Q�]Jn��f�j�G9�3����U
Q7��M��<��g�h�Z~��r\��*jv*�K����WGW#���M���r!C��1C"�p6�dH�������
Rd&������G1�-���#�mU<��3}XT�`��3�KJ������F�����a8��v�T��
A��!��nN��M���b���0��,�2!"���}UU8	� &N#������WVr����N��"���$�5^Ul��>�Z�VJ ���9�TWr��9���M��4��^���h��������YT��]���)����r�~���:t��7,��	L���;D��Q����%���Qd���W��M�������1�u�U��R�z
E�W�p��&7!�9���n�n�����AT������2���+�V���Zr��t�C�y9=	&����� ��0�6�u�{k��ZZn��6�H��#�D�h��*{�]�*Ep�}��*��&�2���@���s����c�1��������qA�5W�����*JfQ�4�[���(,�M���&0��3�r������
������T\\������BU���u*�
�t���]��
q"��|
�F����"����Eu��u���7
������cT����Q�]
HC(r�wJ]I��"��+���Q�Q��vU'L
;��#��1��>�M���kV��k�X�7n�
;li
M���v�T����v,��09��7�)297{,�B��e][��[���ba*�h���&���za�"����@r�0�c�����Z,�VX�j�oT,�����wL�+�R�����v�$�i4*���T�ET�b��9�&�y�@��PJM1d'���m�}����,�i-��f���*�~�-K8L9C�)S�|m������_k��^����I����*H�r+\{���;���Z� �-��]��r���V~��
ck,4����(�lF��T4��q#��VD�U�$�3��@�r��P����RZ��JgZZ��o�������e
r�������E��oC$�����$Q��6�� )	��o�2����V]{�OVU4{����j�������VU!T�8pw5�g�=B��]�=�Z"���]��5�>���������R2�n�K�����*$�.�;�zf����
AV�zw��CH���$��5z���e���s����;��3��R
��B)�6��1�.��D���@wve��Y�{r�3�6a��9��	���gs0��SC�r�RB�r@_K�#��#�@9`xD�c�xw��a�2��Xt��t�5|�H=l�7v�g(;!�r�Hp0{�B �  �a
�D���1q��pV��2+$��T�����H�D��J�&`e&9�D3�DDq�8y��r77{���B2(�	vwS�	������g�9�|���c�b;����7y��p���g�9��;D3�c��	������a�h���;�!��}��l	@p�����=����&
�*b<��'���#�~�w��L ���g�wV���v��w��X�O��3��H��'|��6b��`m�M���)�>����R�;�������g�,	@��&1�C�bem�**'��D{�0s,s�,���.�c�>�c�"�m����P��p�@��@L�s<9�m�Lg��w=�����n���1�������a6c�S�,�o��Y�������9�%�1�U�"S(�t3���{2���D?m��l�!�����8��L u|�#�e�������s2�n�=��9��M�����C	�La��"��"#�G����{���J@��v@=���{9��0"�1�`)� �G �"""#�.��f]��D�8����F�#l�}���@� ����492 �l)2��P6b�r���1��9�a�Y�/Ds�@=�K�A�����c�>���H�#:
/�������(�"��U�����.�L���r�~���#�Sn�9=Qi���v��E���L�����\�3���je�T�3�b�yr��Le3H�%����2i!^��N�d�Lr���GU3�Y�-�3�
u��7�wx�����yVe-f�C�&��u)&�B���t���<�;����@u��q2g� ������*���/UzG����u9NH��~���V���k���R�0E����UUHM����s.K(�@�6���LT���7r.��1��*����.nz�_�����ru,��Z2
��i�kL�4��|�}��Y�������*�\�7K���5��ek�D��]55*��f�,TD���c(Q:����s�Q������7�i����cS��[SYIQ5�����:5���rEF�J-R�$@@�)��jv���\���
f^���u��t!,�)8��PdL��q��$�]��>|�������&�jI�����*��"��deh�%��~���EV� ��:%b�e�4a�
}n]O��w��v��m+QJ<�W��������������r�eh�Z(��e
��8����,�w	�:���b,U/����M�9��.�(:1fi����g��
��|r��,�I�)��b;��K��#�����<;DG����92D�DN$(�s��=��xC0����'P8�"���������H��kR03'R�5pt�P���O>�s
��.)z�X�M�Z
����S�*J��\��x���*��K��)N!����h��T�Un�iJ����YB0������].�i95O��Q/LP�-��.Y�SR�.f)T�����DY�r�Udu�nc�T2dW{�S!0p���P�������\^�J���c
��5��7i2e�"�l��n�[Ls�P��#m�ks*[g	n��3v��-�]��i�����	�\�S�����@.����z��:|��'
�7��BZV�[�	)+kY���v����X��@��n�� ��a
���dxq��k�P���s�;����;�/�S)S������HR�JR�]�cY�rXmDV�`�����X��OF�t�Eme�t��;+H� �PJ��dpR�>�L:������xk}h�� �����|��UO��2�4l��U����v&1�A M��w��2����5�j�T������EoL^����T���#����������� U@�	�C�V���Go�7u-���10�f�*��G'
MK8|"b��HG��<9�"�ZZa���������:��[��J�
����
	\�3����fD�+uRQ,��aw_�w�R�UU���d$.��L���TF=�&R��n�q2��������(<��0����=���{�mBR�V��2M�C����6�@9f3�Q���z�P)�]1.�dQ���]���}�Y!om6���+���R�S������T��7
x���<���������*����,T��Z�}=1P���
�EJ.�u�K,DN�Jq��Dr��
B�T�c��M>'l���$��~U�:�%t
�B�e��f�
�D�C��*�U6��[w���eIBSqn)��PRM�eQ�8DN�l��rq�P7za�&����9��yB�$9H<�s�{ �v����h��;�TI��������<����e���r�O����"�A������5��ld=8���Hr����������Pno�8�&��CL0Qw�������e4M?���h@�)gpp�`���$LDh��
�����{�"8����5]}u��f�����\\���7B.�df���#��A2�(��-?~�TYC���3BZ��Z��l�Z��[�z���
���F**Uq��@�	*�_�Y�{�aS#�1������;�X��j���J��4������������.���(G�`%j�<=�u2V�����K[D.�����z����+qp����Z��fD�m ����a	��(d!�'&BSwp�M����%�)���!����#�(�{x�����y3w�0��6yo�����=�"�e��c20&l��D��nn��e�������rf��)LC�@?g�����C�x?t1�������IULP����5$����NNZ �r��t���5<(��%.��r�6Pqu����w�;RR�6�d�n�
Y*X[�(�`$*�������)�0/{�U�\�SZ��;aIo�7T��d��o�{"b
��L����������v�����.RQN�neG��r�K;h��@�	�����1I�N��*+�O��%aS�����FNH��U�j���"D#`2h$%.g��8�U��n�[@%���O�F�)������@,���&����UDH'2�����4��n�}Ecom�b�3^~H��0�v����(��g"��'|d�p8���0�@��� ��������s�f/�iCK�PHT�����1��^�f�JQ���o6UAwP""��e�p���_Zu��w�=I�m���D-7K\zz����+���j��L�JC��"��>��wJ8�=	���q%���RJ���hi����������2;�������&�M�&)6LH� #jt��]��i��\��Ku4���)K�q)��#�������`g���&o��(D�%�����eP�x�U�S��>-��	�����Fp���4�L�r��a.D�[�mj��hwQw>����L,%mA�8H#oE9�(J�@l/��D��9B	s �3o4������'[����6�M�3J�>�5M�QH��&T�"@!�#����2�Gf@&�_lq������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������Cf�5H+U[��h�G��"'����J�"��e�I�
nd�N%�7ws�vZ���k:�i��K�4�VI5sX�jD^���;(���+���	i�DNb��CL$��ko��1shK�G��cQ�X��Q���{4e!�4�C"ctGww`��cp*Y
��Zz&����1���������vR)����2��T��fM�Av���KC�,���cj!�"��*�����8������f���U\N~S�
��~uw����IG�(����$�J"A���<v�i�����1��������-���!1��$*����9r�Hq1Ne7C;��1x�X
V����hk�	���^�"�q���9=u��(U�$������n����J����cJv�j^�"�B�B�4yZHSt���6;'&:����:����\!��z��7����^���������<���U
r��Wn��!�n��H�7�*E���b��&��6��K�X�W�>�ST�uC-Z�nfj�aQ�
�����d��U�!�4Gz�
r�{i���������$t�mF\X#�B�]��3����w��4�
�1�t�=i���US��� b��ZuiOD����M��H���E��k���2{�&�t�.�K��on2��Q�80���C�x?t1�����YBl���nc�
��"�������~���)���C�
o�Q:�����0��3�����i����J$IY�u4��r�2*GAT��Sb P�J�2�����Z��Q���H"#�=�|1�i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#����I�2��&c�;P�$l��*+Q�L~����������+d���H�h��oF���c-��81����^S�DDKs�J&7�c�Z48�so��`@��}��DD?��@�?q%������C��E�0)Jm�H�V�#g��d���!� ����v�v�/�"`#��g�L�o��I�E���(�`fl�"ajOi��`�9����}����H��9S������"�����
���cyJ@L?�8�	���^��o���!1��N���P@6)�����J�2PCD�R�����aS}<��1�DJ��@A�K�2:�
t-�*M5AR����@3�L9����v��9�d��KTR���	�h�6�v�y�G����^Q�'s�)����
4�?�������J�4�2�u�RIe�"y@����s����]�'
��6��^�7�I� ���9�c���}�fdn��c���>�?�'����j�G���{L�J���~.���������>���,�����4~?�'����j�G���{L�J���~?�'����j�G���{L�J���~?�'����j�G���{L�J���~?�'����j�G���{L�J���~?�'����j�G���{L�J���~2�����u-����E�>�C�/���=��KZ�l(�������/�����!{R�K�,�]Ke�g�IE�=��_������-�t��[C?�����R;L���������X�����g��N�og���X��R;L�{�R�����������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*�����������t���wv�(���8���"����Z����(��l�I�/�����b>�tY��m�L�.�?�;_����>�c��{K�Jv���
���^%�];g�g��,���2��v�w������8������e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#�L�R�L��oWV��0��q%%��o����������[�j7�9�ECQ�l��6�`�n�~���C�M�����DH�L��9�b����=�	M���`%o���6����8�Q�87
m�d��R�K{��j ��6�#F����&?cfX��+��C@��!L�(� ��@7L;L#�vd	��3���1������1O���s�"t���$0�m�P�+����~��
���T��`��8�@G<%���` |����B��P
�EZ$S��f#����y����@�����L���q2�1y�N�l�R�M������L�2�������P1r�
Kv���,����V�Y�sT��pC)E��r����<"a��I�-�K�-��Y�Yb������8�l���H�2(���:���f9���Ll����1�i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#�q���v�@R�e����l]Yz/��B���+_�����A5��HH������bn@Cx�!s8�"`&0&���Nm���8�Y�xDr���JC[Z���Q�x6�,E����0zq�<�GT�����&R��8�O=������VS��S�z���;�)
>���1�h����i����]�`��!��h����i����]�`��!�%�������Nr�KrE@��B� bxG������r�G�2���!oM�)@��1���>A�7�m�0�����:�s�^kvr��L��E1)�D����r��;Q�L
(�J7����m��M'Y�A/n��nw���2���#��L9�<";G�;P�J�?*_I�v��b�����b�������n�.���l�d�]�b���}����c&r���BR��p��=�'��y-��~���F2�>��1LE_�r�����2��Z"!��T1����������7���=�H�m rQ;���s��]���"c�'QC^{xu��@��="���[��&�����i�N0'z�
�
&�f��MN�^������L/5�H pN��!�D7�6���1�G�3(��%��1�e r4a@@`o�\"#�@�H�0/o��S �r��D}��E�F�.���m���G3Q;Go6v�v�e�&������q�h���E�5�j��{CH`Jn�~�`��^�g��3�~�����dC~�KE��X��~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~����������C�%���/�	���P���jGi�C��m���:,��������K����� ��F���m�G�1)��vm���r0Q!�6v�v��;��w��3��$r�8q��R;L������9>�F
$1�v�v�om��w��H=�����n?����d�������m�G�.��0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~������������i�#���_���n��>_�aD��x1�h����w��
�e r�C���c��!.��>^�G���s�j7i��5���g��l�J�30{!u���tV3/jGi��sz��P����c���K����h_��D������?��m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C�}>���K�|�-�Y#���(��Q�gx�s��DD7;Q{K����v�0PG�L	�!��NX�>���U3/w�����C U����sv���fC��@���%Jb��!FD��|�,�#�@�{Q�J� QT�r��"9��M�r����r�=�}�����r�ne���F�.`a�����d?�+���������)���t/�(���S�l��(��v���[��w��
d�z�Qi
�1�v����G�'��#
9/�2`(��F�L#�f���c�7��I�.7�2�{t	��������"!���%��pnW�'���b�2=�����9����L�n���f����\9������c��y`R�S���6@P��A�&)V+���kS2���:���r��_k���Z�/���(n���#�6f"#���?�����m>C����K�L��>?�����m>C����K�L��>@�F�3�	��Z���L��=A�L9e���(X���\��2���w��f���+Q:]�$�Y�@��f#T7[�$RL������D}���
I��������(���o�Ei��u
&�p%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l�����v��^���A������g'�������D�G5)DE�L����������u���.�Sm�R���jq2�����U�IM���EL�8	�%�y���Z~�iOM��sr���JT�BT�����Z/��!�H�E7�A>bS�B�_�~
�����Y���jIW�n)�D�H�'l�5���	�P0`���M3�f�o01�;���X�K�5�1��6k�c�.l���\������_	sf�&8��|Lp%����!D	�q��6i�[��kCjd5�K���P�����-�1M[�r$+
��|���I,����j��C��3�+�l+Kd��_�$�>��)Yf5�hv���hz��I�T�c��*k�c'��m:�p��	�uV]TZ�
[�@�\"��L���D���0��n��KO4���)�Z����;�52�A\�����D2m�,����,r����:^���jk�Y��
�R�'��=3�:�j�Ig�6��fF�X��S��B�GMwn��\��O�[�Z��d���F���Br����9�b"U�!�" S	������i�	���gUS�����}<�z
A�G�,�<*�C`� 8)N	��(�;��XA]B�t��B#�Yw1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�bNvjA�<t�������F&.9���v�e �"J�=�{��@6��-��4:�Rh�����o^�FX������F���tBH���d���;��~�R�3�1�p�����F2]�r,$a:�)���2c��e�5�2�<������gJ[:E����B9{?&���R2m��i���@�dl���w_DT��ZR4�X������5��U�h�N�$O���AL�&R�9�dw'��5U�V���[)*�H����@$y$��V��9��%�`P�������n�iE���,���������(J�n
2��j�B�;�U��T��[�M�eL�E�����o-�v��"�AD�t��Y&������M��M^Q3���l�\�C#6k��r��?��\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\����Uj��s/|�~��0��f"y���tY���aV�N���L;a!�Q��r
o6���]������+y
X)lU��nt]AI��V���{&(�n�d�+���c�� ����_V^Z��G4���(�Q����dIYg�I�;!H�2�gM�2b`��-Q����+��II���N��q�����T	7L���Z���0�!�P(,A*j��XQ�	�kZE�"k�mcRtb����o%#
��t1gE&�8p����1(��������Gn{u�����1u1k���r�N:�x����|�H
D�B� )��[��}.���ez)���nQ;�
v kh�=*Z����Z�$t�"g�	+��r.	��&1q�ES~��\��1��@"<@	sf�&8��|Lp%�����K�5�1��6k�c�.l���\�����	p��_c�i���K���|��h0?�?�1��!��Z�8w�
�H.�� ��{x����?t3��1�ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����n���"�W�0>gEPV�	7
;b�gNf��UR9#"*y,�Q�6YY7����a�q�M\5<+	I�����i�/�L'@�AD���� �����+�j�Z��Z"F��\vq�����T��j�f����dSL�@�0�K��n�m���Uj>�Rp�t��G4�fU���6�>U���*$9rg�w~�����	�����ov~<p����&�g��	�����ov~<p����&�g���� ��N�g0���Lp�Cw!�<?cf#t���$�R�% �����k��[D��z���e#W��9h����E�{PC{xyS��P��2�������������Rh���*��cU�"-��S����t6b�%��3z���)�c���U�hZJ%�Od���D�`A������w7Mw����u���QWZO�������Q(��F���L[Vo��2.*�Le��Jp\K�d�qU^]!�I�����u"i
�a�&�Y\�j��G��Y�Gp���D�M3�0�|P7��U���.�F�Z
n����%[q=A%Y���6�Z���
�T�lm��
���C_�m���;����$(�����"����E��W(���t2�	3HG��1�*w�w�D�����8�1�ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<U���
*��_U5<����1qQ�u�tr����DUL�#	�G1
�CjN������Sqjvq����9_��U;�iE��U�j��������MF��{dq��+�d��l���_F�dW�����\E�U/*&��0����tt=?��R�S�U�����n��r%P5WX�6a�Z���1K�P�I�7�)T�#e�Sx��c�55I](���T�n>�2���+�����i"*8����7���[�'^�B�
��P��)�WQ�7:
���RQ�.*���3Q�;|��"��R�b�������?��6����������=qIS�����QF��)�t�����0��������\���ZQ�^.)W��j���E���I�
MbC���h�9�}�)���e�{�������x�7�?8M����{�������x�7�?8M����{�������x�7�?8M����{�������x�7�?8M�����	��v�s����l��i�D��5'u������Z������<s%?[V�@��H���
�a���NS�]K?rmd���%�v����.*$�x�4��D�
��+Fh4I�W"�.���HU�������%��_���������q%Q����z���PQ��L�����\��p�I�����p�nh�.M�=s��%��4kW������1�����0J���F�'	�m�(���&�m��#H�8��d��)�\�b`;�dS���3^]�
�4��wL%)�Ln5%c�n�]�yP�m\���PP�P��p�E�M1�����nL��u��L�S�H]����L��.��ue�����'(mJ�]t�Z2�9�)T����l�e��j�L�f�Nl�Q
�
���}�Nr���&����=����ov~<p����&�g��	�����ov~<p����&�g���&#��i�L��@�1�D}�Q�i��E)HP�q�l)@����9~������u0o��Z�YERn�qmH���1M3;`�L���Y��L����r�WHG�njjZ���fq��*y72n��k�S���!
�S	��&���������&u]Q�$��X���=��N*�t+&"R�n���M�~�h�I��,�u�����r���y���S�@!�R�P�3xA����	C,������
b�!P
��Re�������R;�h��7�@Y��S�nj��`l�%�.^\L���A��L
P�����
[U*�U��zS����!UvF"�g2�("bq��Jm�����5���5[Q�ne.-d��J
��b�e��KPN�[�;.U�X�A��*���J&�����Z�l�9���P/aj4�F�/��9�Kg�A%N��C���HpL;C�mp�u�csj+s5��*Z	��v��%j���k8������������r�F�k�
"4lZ�/N�`���Sqm�lU^HK�E���|P1����b�� �D��9w|�!�K���w�j�����TUe��*��6����t��%P�����S�s�QUT\'����X�$P�K���(�{���c�D@s.C����?Yj�d��46
���ns�����9�"C�g�t�9��v�@��x4$�����|�����$"�����HS��D%��&#�8$
lu�<��M�PA)���7��"NX�D�&�O�r��5u/m���-���:k����f�E��^/��d4���MH&��T
*5�Gp�-����:n�Q�u;��LeIK����)&��94d�]�����9�LN&.a�R��$��`��Yv�(G�I�@+���TDH����ppf�m$#���Q���KB�0;Z���>���D���FPp�<Ue�T����Ls��>L�I�"2	�D��,�&��y"�<�
S
*�YC�\����7���;M���w������C.�qa��M��W_�s5ff��s�I�Y�������P�@D��i�#��2�KT.[�g����l���E��
����&�����Sd���������:q�d�sM�v��T
5��H�|G�]&B�L���F�]n��W�*�5���lR�F����2�$'��!�z��GMA�����H��nwe���:���+:q�L�����l�����l�%e��2�����
d`IV�L�S�\�U����4�����Y������O���H.�VrdV]crH�   =��n���:J3T�	��C�I����N�����I�v�"�.I�:�9�
s�a��&���
*��r1ru�g�������(@�
b	Jc�������������`t�c��?�t��U|~��o�Z����4�GVv'�$K�$��v���]NH��dw&���"c����`����s����Eq*���$s��O��:*@D�%(h����"���6v��j��{�����&+G�a�wA��#�tH���}�����c��rK/M*�*$�Ux���]�s&�~���Gn=���@?op�(��'���D]����������q�B
� ���*G���c��D��S��IT��(	�9�
�	��}���F��Z�i���H���I�@1���b�H��/"� LL%)@���;�YUm�mt��TA��kQ)B��/(�@��*2���r@s�{�9��^{s���&�9�]:+	h��t�X���<�V�T'M�	*�����k8x�r�&#~�qS�}'U�o��U�������7���hf�~:FPf��mT.��T��(�V�:�9S�9���WaP?A��l���+����H�2O�����H����S�L$.EL�P��S�����J����kW����9YM����������"n0�N��8�3�
#��d!���x� �����Q�$e �o>���]cp�X�K���#p�t	M'QI�,)�Q��kZMr-�����b���f��%�j�u%�+Ge3�y"������
�_F������N�*���
j�RS4+f�sp��R�������cU�S�U0�?����W��IQ�6�3cXr/�
b���U�S:��^U��(H3����P��ef����,e��Ykf��3�5@�9�U�g)��@qa�o��5���j?��Yn5Z
��.��%2ge@����BS	E16f�;ER�mJQ���2���7���N.(1�{.E"	s��e����&���2-���(���%�U���x�T�5*�B�Q�I�1����y2�������I6.� Q��:�VJ�UFm���L�D0�s��'k����>�Uc�lfd(�NP]�sj}M*elO�9r>�}�CS��Z����������e�����,���{Y i�'%�)�Ur$Bn�=�H�}�����fY"��\����IK�Q8;nMDA�pU*�r*�0�
l�mH��:�`.Pn��A��
�T\;X��
Rd��1v��q��������j���u����s���.�����0�����g"t��0-��V
�9���M4�1�m�2$P(��l�Ch��b?���y��a�/�E%�\s������
C���L��P%��|�2�v`@�M�|$97@�|P��������{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<xa��������\�g>��H�f���3�D0��,
aQ���3�D{���z����.���UH�jK��j�#�x�D�|��+dPt�$q(��d&��,UVv��_��=��(�+L�
�i`�U�
@�T�+�)
��,�3�tDGT�/N���z��;B���XG�l��cn$�R��"<&�JS�)7��R��w{�q��vN<xa����=�8����'<0�d�����x�������4�<����#��>�����x���-�+�5��mG6���GD��V��V�D���"b;�Nu���(_9uo%MU�gQ1���
L)N�B����f��E)I�_��cc��c�jT�7.AT�?&�������)v�-����	
?76������GL��b�����C )������B�����l�q5/M(��9-}-SD��!�A)$!J��f���E��0jUZ�������\�B��R�H���2�`U L�9�&
C��Q�4�T���hj6�����������"����L���E��"!�mO���jOP	���5R��B�����9JY�5��P��p���PQNX�QS�(l�����D�*�[�jR��@�@�3�""9��a����=�8����'<0�d�����x�����{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<e���x��*��'���%�=Q������bE0�A����c���x3����jGV5������m9!oi��|�>Y �
1k�B�Z��T1��22�P"���qd�=|��qj��+�y��i�T�U�Y��u�����E�y������Lk�m�@Q���2���-P4K��]��%�o D�'}�dd�H���a8�%L-���W���v����iy�m�9S/,x��H�
AI�v��L����0�Y�Z�����1���v�KN+YU�?
��gQrr�$c�(F��&.C�Q�������62�����U��)J��E�vw�4u!# �2�A4�B9'��(���L&���WN>��I.����Cv�T��������P���$&�V�R()��R���&7�Ln�L@�#f#��}�xa����=�8����'<0�d�����x�����{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<����;�b�^j"������.������[x���i*�����`�eq����3�0`\��un������
>r��J���}��	OG�4<+� �<M%O}QX��M��F.�\jf�S�+�mE��B�O�X^(�:B���7�;�Z�Rr�NW|����Z��Q�C1d����t�]������+Y��W5��HWK�)&PP=W$H���&;����E_pd��i���Q�h�
`��N'+�����@��E3�1S�7�J\�16Z���U��DS�'h(���8�lT�o�#>��rJe��	����l����{T�������

�uo��M��������R�� �14����RAC���O��Js(s	��:�!V9Gi�g��d&�s
����'<0�d�����x�����{�q��vN<xa����\�����}�3()��P-��dQ�.�/�����x7��7�����	�������T�d�D���
���&m�fd�1���9C�����Y�1�����=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x�MP�����Q��*8������
>X���^3x@b��G#�>���au�������3j��=�)���J���T@���`NP�!�cfQ	k����1��-j���V���S�vRV�j�����#~�H����|�"a�c��d[&1Q�����d�-XD�2H��1n�[� �L��� 1�l�>=�8������=�x������=�x������=�x������=�x�QL�.nP]���S@�#�Y&Q.����j�N�������wnk�����Qu�������Q��4v�&����2&`���i[�\G��B�������*��2��)S����X��(3���c�DOa�A(���:���K�gX��V�N��5�-�d��*�^�����/�M�����HRf\�Mj~�^)=Ij-zX(:"����T'nm���}I[�*��<XE���s(���	
m���o�����=To�+=im���mIQ�.����+�M��'�p�H�&�D2�Sn��8�(}6�h]7#K��Q\�F]t
F�m�
a����B�S@
��*��S��9�)��Z�V��_O���@���b��=[VI�*���k&\����E)��(f&(w�p+�����S#��a��6<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/�'�/+[q����������#<���I�b��p*b�$����3o��{�-���Z������\�]EFi�KoM�JL4���J6��.�+�8��rl�n�@H9J4����5����5��]6G�B����h-�T�#����Z��p@��	
����-�~�����_T)KS���+t�P�@�i�n�3D�m@�����`R"b�%8e�Wc�W�2��[�[h���M���pc��B:1Tu!0S����H�P���|m����+zv�RQT�q��M��-A)������*������>�*+�)X���kKSn�E��"�FFAZi����iH�����M^L
.��f�D
P1
d�D�:D)N|�Q��
���=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x�$�)s6�T(g����RV������-ll�-u[R�+�v^��L�%NVV�T��*R*Q��8
f��U�w~��Z��C����]�F��
��b���f�f���1�jF��nBL������������+�kjGs��-X;��2��p��DA��B&�Q�T�a&�(R�����G}�j���Z}jZ�	h;ABZ�%��b^*��X�/ ��L��{�
����ea]I�t
�����JB���q>�n�ht�*���������]�o�k�g�k�Ki#si	Z�)�)	�t���.nV9�Ko*g��r���(��[+D���������I6ZeFI��I'��\�*s�`��wC0���)J� �t��P����������x���������x���������x������{uN&B*��7w���X��3��,@�@G"T�"k�?���6��i�so��6�:2�f�
���.D��3��@�� Ls����v���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���g@Dm�����*V�E������P8�*���-��5����1m�]�0dP"i�����X)F�D' U��t��i���C.����da2iIT��$Mm�@SP@@r�5���)!��O�����#�?����#�?����#�?����#�?����#�?����#�?����#�?����#�?����#�?����#�?��-���)��]����^�a)�r1���#��C���:���*%\�o�����$�L��}��aD�ob
�P���!T@/&D���` 9���86�"��� �����U� g�����@)��B>����Hr|Rl�TH��"^@��;�0��L��DrC����HC��rv�)�&
����s
�T�{�f"#���� �r���S0$��"��|d�]��D�`0�6�;�v����(9w�T�/G��q��G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G���C�7�t�4�*?����,�G1�p�Mo�
��r� �	w�!��E)�f\�n�
� ���E�K�@T�D�2��`6���INQ����r�
��9f%6�g���[�%L�r �,�j�C�8� 2��1�r
��-��9RX�LE�E$.�*�T" !�i�n��;�
����'PL���PR�E��D�`
s�T0[�R��:*�e|�m���W`�[6�?��l)K��������c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c��*��cy+y�� �ET_��Na�:|���<��������}3��	S3W	�b��(�>�����s�T�3>F����J

D9"9HD_ #�L�@��"\�7�v��@�Z��i�IC<Qc�\�"�29��D�Am(�(g��B�@A��j�\\�C*R�S!����n��7�R���&*[�U�T���'�Sb���$b�� 9
�% e�E([�r���1 TP�y"��7*�   @��	���1�9�V�0	�����������pv��W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q����������=��)��bb�p���7�DU�b���&0��D�L;Gf����a���v3��F����o&G1��G(}�C�0�)K���1��g���c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?����R�@3�{0��*���w����&2g0f�(�-�v{>��n�7���
����*�o���dL]��m���U37��T7&"')S�� �
�B9B�R��C"b��Co�)
p�H"�dD�� x����t A�0d!����;��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?����	o!��$q�D��Dr���9�t����� )�\W!���9V�S(������L%9L�:i��e�Qb�d@����1�%�1��)C�/cb[�)3"h
+&"�	K�6A���	�w�D��Ct�������`:�(��G��URg���)2�e�j
0@D��.�v;�7QKy��S�L����V�Sera9"*�^P����I��Hx��x �h���:�r��OH~�*Q�V*�\@�p��}����$=��6:����{_��I=��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?�������Hy�7��2������l5((D�"�����H���>����aP1��(�~d �o��L�8zbk�T�*�c2���`��` ��)����P*&���t�UBJ\�8vl�`��BoHb�H�L�(H>��b���"�2������!Ea"�T�L���5� �
��s0��"[}
@1y9>�"��R��fnTvo�y��ksB3�@
��?�Pys���1.[{����� �����J"�����Q��!��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������_��/��!��l�A��[��f��H�s�F�*r�i��������n���:����C<�" ~Sp�;@���fC�����R��$b�������I�T2C���!�GhB" kyNo(����r
d���r<��16�{���@t;{��"\�l���h���J&�N������=������^L��:-�$�P��2�(Nl��s�n���@�*R���	��M�a�&��ny���1�3D��L%0l[�!�:����{_��I=��������W��RC�c��)!����?�������Hy�? b@AL@}��9��7���S��h'�P
-�UEuA>PD���1�1�=���������;�L������1
���w-�#�
T�N�)*#N��Y�R�����U�����I��.�O.��<pc *���JE9>O2����4�p��Wk^��+\k�Pm%#m(���i�[�L��x/Z���1�So��0���4=p�wv5c��[i�������IZ[���V]�K7u����#�+�M�����x={��6
����}:X+eG�o�)�2���2������&��P����S� "PSf���h�����c2�E�GE�����Z���j��XHG�4���a/)�9e��w=�e���;�=�����Dv�e�
�}T��F�wO}�����m�kQ�Y��]W�N�h�y���r�I8�� 3V���W����%nMer��9h���,R�6����K{U�-U�.kj�u$$�@�]��(���<�()�"�Z*�������l�k�V��=���`��/7Z��G�[2����
��n�b��n������>�k}D�U�����f����{J�/rk�R�BRv<�,�0Jo��ps"d��r�e����; �S��V�~F��sZ?p�}��0U�R���
����n�|	r�Pvt�FU�:&��R��/\Wf����\�f���F����������W2I�8jQ:�,=�un;1�}��&��l�����]K��AJW��U�����r_HzF��yGq,^��s�M3��T���
�)��E0���0m
�Y�{?c*�4
��&�h
8��c�EY�2���9ZK���N<+4r))���wGfZ��v���b����b�����^����
j�	�����������>Q`Cn�������n�D<�d1Q]�1�3"��m��G`�4���zn=��K�
g4g�����5/ �^���k�	+��5�~��k��b2�K�;�'����ga�+�H�4�����������m;
����C�p
��	�!q��u_�����h]gq��G5ST�4�dX��n�eEI���["�GL���($SNb���s1�C-�tG�~��\�@�����n��L��n
gm�eKik=G�!���%(z������%)nZ�Pj�'���2���
�A*�0�{?�Z��V^��'uo�{�\�w&�����,a��x���p�]�K�G%j����!PHR�+K�q��@������jI�g
�vgv�H�C�UQ(�w���L��t�~o����#5����{)�3HT3���������l�ninT�+!����3n.�R�1r��^�
L�_M]+^���J�"���x��������P�_��@�"���d\�a9�19�EXKczn�����p������KX���'�@��M����H`S�~Uy:e(�Y����=���z���Fv����t�k�M����h������u��X�J�����	7��1G1����c�|^�����e�@Wt�.y�T���D8�@@D7{�s��;���i���������l��E7CS��%�w=,���2��2�r�J��A@�����2��u�t�7�����w��a/[S����}H�����D��[�1�)�I���x��Z�������(�uQA�W��A.!T[������;�$��� (��L7�
.��n�v�_+e_�2W��Z
5���qlm?l��p�
T
I(���VY(�FUd�"'(l8����H�b*[�g�*��`�i$�'�1�f"�s��"�SU�)�p����!���pct�M�)��a/zb���=���4�s�����[[v2V��WU��V������t�����z�M�(�E9�A�p��:bb��9�k�T]ZM�v�������sR�6��C+&�
=S�.�����QYb��Jq��b�S4q^]:b��O7���+c[�[�Wi5D�3��j�t��M��79�ER�5�{%r.�{��iZ���V���u5�{d/�D4�d5V�N��9X�A��*���`1�Sb�#���IjNW[7���bk�Ujb��%��:e�e��������rEH��L~����;�U��;��~��7���yz���������d�3�,�����n�](�@1@���=���Z�LZ��E|):��u-��-m��&�AJ�OU5������`a!J���*��������D��@��n[��w��]�e�l�Dr�o�?X�d��Jj6�I��}��2�t�6M�R���.��W#��M�;Aa@�������x��.�5}�k��Q4����eR]��~�����!7tmr�����������fFq�(B�Q:�Nc[k���6M�LV`����$����P�n�)�)�3�����m6�Z��P�&��/��������r�W&tR��v.��0�wn�7���O�2@!�g=G]f����kk���VH����R������-<���PP���*�#��c�P?�t�����^�jM��F����]i?9�OD��[���Mg�QwNc��A�b4�R����I�3��h���w2����"���:�
.
06������L�*�ddH�c���N�����M��L����{��k]��5�k�x������,t9��i5Z�
�5H��2��9@���yG����������f!{<*
�����et��K�M�j�Z���V������ ���mT�P�I$�Vl�t0�x�{�����u�����^����or����VV�'��W�j��S��^�VC���#�VU"��`H�&��{^]����
K3���[��(	*��b%QZb^�L
�=����"����p�N�*�w2��cJO������V���Y����l���������M$�����D�+����$b�G�Za�����1�K5�}Q�+]P���F�1��z��Vq���;�9��@k=����M�/G�;�������Y�s��������SRt�'Ul�6�yE
���2��:�EQ!��������������~�Pp������|�->�[4p���H�w��7M"$����i�B��1��(	���q�sn�c�9~��L|�TI����!yL�3�l�������J���.�=�^6���1-ml�*b���Tc#36�j��(QX����b�����?�~�����7�����z��V2�)jEJ������,��8�Ju��f%)�7NA
0^}"���6�4����K^��jfj�5Uu#��S�U:�M&��~A��p�T������b	��k�_UWR����n��
�j�����������E�5Y'h�9�2�
�!2L:K��f,���55IN�HWNk9�5+x��!,�G-��1&��
a�������&�~��s�?��+
I�����L:��=#o�j��E[
n����_~LV�{�	���d�,=G|�8�� �>������.�ikI^T9ur�m��5���m���Xf#Y"c"Wm�1UX4�r�5v�%A
)��WJ��i����s�V�W�S�B�)V6I("<YPfg�*j@�`)����;!�R��Y����!�������"�B�HM0���T�����g
6�%L���
&���-���)\k������{�r���A���G$�$G&��vm��d��R)DJ��F��P��C��v�3Z7gM�S&��om�I�ZZ��UI��Dl���r)����r��d
�57�p���,����V������4����!>�uT��p]��V\����=!�E�N��d���2��(��st��r.�z6e�}e��L�mG[!��cZ��q#�Fc!7g���+�S"��1N�kG%t�(bn�La e����j���Lm����+�p��������6��G�z��Q��N$N�:����Sd�n�\0��oEj��A�kj����kA�h9��!3$!6�B6xS�(�S�D�� !��������M	o5�ai;\��>�%����zB�fkb�@��E���URU3��P*�g��k>
WC�v�1�������\u�NQ�Y{���uI����q��UY$��J�($��m~��F��H����=@�5�U���$=J��j���6��'��(����R)7�@Cx�r��L%�B;Cny��Y,���i/[�A����:�-0�K��TZ�6��w.5={�.��i�@��K$��e�7
Az��r,�(iH5����p��V���*��oS����j7�$�BG J=nC�&j�J&'=��4t����=�a'x���J\JR"��6�L�����E��M8�j��T�QD�Sh������J�
&�VI5����Qq������[�Y�������U����'�����7b���-��-q�
�����,�r5^.���"i�I#.%������@ ���mD��&������r�{d������Z
��?�v�
~i2?k���E�8
T��@���:����t�y�G���Z)�TU��j��-�|�s4��mdZ�m�,��e�T~E�w{|��r�Q�0FLD� "Q�G!���~;��'��w�%�����s6������������A���G�a�Z[��)1�G4����(I1��+��08��k���B��tL�����p�����q}%�%QRQ�D0�MT�+�'(��u]�����)�.���K��Y8)jN��.�x���R���
�U�fJ9X��`1Lq(��.����c����4�K��[����o[��H)y�Alv��A�n�������H6&�+�qch���q(�;�>�!m��U��u� *C���Dk�X�=��~�G f�5�Yj�����Y����V��\)�S��B�[&������Y&��%�*��w��O0&jX�P�z����<���>���`���sh�FuE��i�)��w�w��:h�,B��2�8�U�]����D��U����HEIW5B&J:������h�`?�L8{�D�n���+���+��|j!�����al�L�����1��L[
Z
gO��)fBV���s�-��:���U[��r����-��zf�c3���P4wJQqQ����:G��F+<Y5!9]������n��6��[*�qqkK�������B8�^7��Z2f��v������D�2E���5��7J�n��%���/xn
aug�w��&�% (z��r���
#�3�LT�t�F���2n7(w|W0G<��0��6e�������`2�?�������VvZ�A�R�uU�~�M75-I�5d3"��US1�"��d�^��l����mj6�P:r,CrR��\!a��-u(��;��u4$W���l�!Q0��Plgf�Vk����3�Q��T����
B[�}:y���"iB_k&�E���.Y�u�L�R�.�e�wuo��F:��\�����I�&�GL��{F��2E6�L�ME
�C;���j��)&]�9W���oO�S����cZ�����Y�-d��K��A��$���p4/G�t�F�j�PW�����d�[[�1tm��+Zd���	��]�z�T��P��7���UUok��57�75p.9e �=^��+������Bi�AT_�1�%�\�P�ts��u0N5N�V���	��%d+���y'K�I��4�o$�+%*�(���HcyC,��uJ&�J'�E������������-N_	��0�J��u���+gJ���RJ���7$t2����= ( cy����3���-��'�h;N_&8�.�cF�s\���_�"����(	�zcR	L�%'(%b��{�?7�}M�/G���N�L���t�W	�*�K�uZ�$TvB���&0	�t�����N������~F��T?�-:}�B�m3��"�� W��r���s;: �6��h�j�}](�����{�wWi}	y.#*��E2��i����0`��
L�
��9�a3W���Z~���j-�u9U!TLR������2SM��. �2r��I7�L��YcXv��Zg�.���Q�]���X�����#�M�}MOG�s8v�d����L�Q���x�(s�C�l��H�����@��f"b�Q.�r2L�,�2�1�I��0�����������v+-����];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w&�i���'��_�8� �`���>�[0�Jf��I=r���1T+��^$���N�����������s=*��x�,�5���V�%4����S��1P�P�(f1�������Tdk�
����T�4���`u����>��>�,2�'�m$�[T�.�����jX��0(�h��$�r��>gHJ�@a�vdp%[N�O�f��S���E�,�Gt82�Jm5�@1���r��J����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b����[��-EX�u"���`,��X�%�d�}��r�
���a^Z�����R1�<�B�k�j�`U�Q-���#o�x����<��G�����TH4���g���e�!�<�}�d8���e�'	Q%��sW�}5�*X��7�C�o��*`����9���6dZ9��)/���	Yx�6OJr�+���9N]��7s��2V�#DH��X��
��1N#�(6������^D�@
�a�j����2J?%"����F�n����2`2�0�6`
u8 �4�P����[�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�	��i�:L�9l��*��6U.A�U�\�)�T����C�E5������?=0���;�fS���(�
��ar�l�ve�����j*1������=���8����K%��w�\��C<�a�I�������:��7�[=bGBr��Y�
D��25]N��r%��J�
�� �`�<�'	9G������2B�`����i�S��]��(�����@��@�@Gxv�����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��a������N����r����US'D�����=�����Eyv������#������-#CS��r�1��^(xr��Q��P�X�� �o	������Qq�s*h����|y�PD�L�4��0��07��
g���U�f�x���=��J=��W,R~q���QD�p)��8�����S�.IgQ���r�207:���)��8��%�2�$hI��X�RBa�/&���h��)U������6������b�W��"��2�\�
��EAdD��"�����?+���2�=#�b*���k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��3���v���/�\��)������5�t��!7�R]�!��� 8)�2)D@;�!����c'9
�����d�A!��K�Ce�����
YM��|;�6@?������k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/�������0e���[`r��c�>cf9sfWz�c�t�hZwn���(�uWD���E9�`��#�RNU�K��@�YJeZ|���*��S42����p87vAH����PU�������J�*j<�(�E T@��L����5��}���(��*��(�5+Eoz2�g�L]����Hb��K���K���W�L���O�U7
�T��fa�3[G��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w�V�];�q����Yp�VC�G��l��^�UM8#��j3R�h7z���	I�ES0��r0���������I����#�u8P�T����)!�P�%�!�Xi6����bC��:T�����(�voJ�i�xD��������������!!e���L�t�[�)_E���U�"dP�m�)\�

UL`��J�GI�5P��B����zY�P*���22�|���d�%m�Z�5�r��N�/>���STp���,B��0��>&�����x��%
����`�����l���4���1�"�D{�6�$�)��@�~�T��S�f"a��[Ml��v+�9��q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w�]NypOEw?�.��`�*�@�J��L�P)
f\��D����qXF����s�^���`��aS;Q����:�dD���T�n�x�}�0��<i�<��[�Y�$)���`��U�6���@���H�D@3(�Z�����ID�F�������M]��|�@
�g��D9�)71���q-�R�K�;�Na@��;�K����6�o�m(��$��irRP)<U� �;J0�Q*@�T)��)D2�����3�:%l
�I��6^�@�_C"2�$U�J��E"��Jm�U��d_�������*���se�[M���{�����*�kg�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����������;�2�d(Z�4����T����IH�T��*NQ<�H|��p������i���2k����j�����E��A4�c�NR&�ag�LH���U/&�&����atw�PAX%�f�@8�9>�f2���jE�� w�R���)<U���wI�� P�m�`�0�����.�-�J�����W��$������B��22�`�������^�@��XA�_���Y��n��"QH90����e�S��=����HQ�����#���Q.E�XH0E%Q��PH�{"aV�y���a� ��+f?��[i�����������;�[i�����������;�[i�����������;�[i�����9�VS���3������6{����D�Y�����w
�������J9� !��z=C���ZM��c������6f�;f��_kf7H��J^�7���"=��������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n���bf��3C���6h�qj�tPA%2��D�8�	�e�o�P������ko�$��T�s���q*�.��&n"
�iQ����@�nthU�!}�D�1G�)r�!�4M������\�'LU5m?>f+)� �x��2��Jc�=��2���oU���7C3h����bB�:�5�Xw��rb P|(7�l����h.���*B��f�RsR�p�F?�de�`3P:G
9�z
���������,	7�jz�&yb�� S��a0���jrc�g	,�6�.�k�zF�����n����
d� �D�
	D=���lo�El�~�e����v�&=�����1�f�����{7���L{��7o�c�����o������~n���^��o��,�����������m�4��AC�%!1%#.d��������Y! �yF��(=�s(+\�Z���4�/ �H�4Ub�	SI��\�
����
�)�`l�X����:�@��<|+�4�ER��aPJ��Z>5�����&�� b��t5���.Ur�H��uJU��CW��Q�y�I�\�!�*�t��`�����@Q��S0�i���@�**Y���4������j}��|���tr0 k[�rij�����RU�.fY�R3M��#xT ��s�JC���&�(����v�GVuse$#�CV����a"����Z(�b���r����LR���t;�7���7�#D3���{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L �[7V��&A�'��Ls�t�A1��7}��q�K~�t(Q?�*p���*TB�-Z�F��r
l�(�6`"rD�+e7Mc�$HH�u��|��U(�?��s�1�j{Y������q��u6�]���s �� �V���D�d�����)�&���HV��=�m����i����C��r�U)�Pt��\���������%d��5^V(0q,�.Zrv����A4������m: �9�l����hm���=��)i�zA(����N���$��Y���`�!����q��LS	�p���X�)$����H��s)��e(�t��2R1H@���Dv�#6m��l���>��o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n���&�D���#d��*���TdB������d%��jd�@�]5���G%2�S*�Gt"�MU��a���t��"��a�l�924h�B���^��7.A��Pp�9~�!r0w}@P�T]���m+QS�Az��p��t��Q�SR��j��P����]=@2� ����D�;=�r���'QR�����7��DQ�H`1C|r��1�5@@P3v���7��y�c�����o������~n������v�&=�����1�f�����{7���L{��7o�`��V�?�Y�~���LD�NNv�1
B������m9�����hr��UAw�(0U����9�����R.�b9m�����b#������}�=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&n�f�U���
�@]s(��jT@TK�yR��B&�������T���B>��X��4�[�"r��Q*=����	�L%	tQH�SqE�#d�����K��U3@��@��#�[0���/���.���&n����(�c�i5L T��@�M]�w�3U�����"�f	zMW9-
�B�`�uyu94���b��h�c�(��d,����E�P�g�|�D����qn�'���88
i�$��O��C�UU�����Ut��@��T�u(H8|-d� ��n���p@��b��T�#f�E���$d��b;���p�kf�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o����������U�jI���9����bb�I�m5J1���D9S>���4s�G���4���&L��L�	dT~���y$��i�d�3$d�E
�L(x!#TT��T�-�VRvx�"YE7`��<�=�H��/��K���$D�.b}���u�N,��,{J��`�k|����5,S��3���!�Q	hi�@���P�����������jVt���
���9W����@9L�[��$� ������\:l���P2\�r�v�0m.�Dk�n�]F���E8��OZ�t��1�V1LE�����L�a.�q�sN~L����&HL^�����81�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f������[6.Y(S�*("^��1
P�0���b��W:�QtM���������������G�*�� r �Sb��2�s(E�j��)��D�C���RHC��0�D2�}����]��(z��`��M:��_S�ys��sLR
:A�2MG\�(=�DvU����K.��-}QE/vk�A��K&��\80
)G�V�
�9����!t)��n�I���h����N������,
N���:��������{K����������V�e?�4�������S9���f�!��,�R�^?H�(���M��l���I5�r���4]%H
&�WH�Y#���Jr�r�����v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&2�f�|�f�?g��}W|�1o"&e��@��G�Rs����q����]pn(�-�4[19�.�&E�k-p)��M2�D������LV����A�U!���� ���bJVP���m�%������b[�Eudg�����"!��d|�tx1;;an-!v�����%7'K0���X� �=7��J�t���&R���(n�b��j[�O6�h������[��uh)V�Ml��/ �@0d��SwsE�������l��<N���M�yV	��Q2H���!Zo����c.�5p���*������,
�QX�+S�c -�(����<�2���s�b�
p*mU.�C#��)2�@;��DD3����v�&=�����1�f�����{7���L{��7o�c�����o����F�
n
#��g�h����cyHPL�'*;���!7����J�����l��R?�%���`��7������F^�DC�G2�g��< ����DC}'�y56��pq7m�$\�0!��U4��[R���EWQ����g'g�,��UT1wD�@���R&U���])	�L��s���RDD@��=����hd�;H5��%u.�Ys��C���1�j*R*���sL��_:1�f
�	%���`��{4�w$$*�[ruWS��?"�g)W��pJ�������FH������xG!���:�������i�
\J^��J
��Sc,�
��V���d��Q4�q[x�1����+Q���S�*�V�>���n�Z���l;�=���$�e]��dTH�dt�����l�a&�fZ"�����������9�M!}%��D�M�$�G�B��a9HQ!���A�^��SO�'(�;�6.d��rD�N�(�m�0����AYH�/'P��u��\O�e76�2��a��}J�4e?t��B���	�~J"R�gQ
<�L�D����T�X� ����8"�).��5#c�3�"Gn��@�&�DG`l7Ayoa�����58��Z��������QU����Q$�m�X�,r	�f!�<�5/�kK�-��������C�i}��b����I�Sh���Wn��tNS�#�b#��M��r��rSM�����R�.m7
I�&4�y��'LT���E��nM��B�7,�/��������;Y�oNV�����"RL�M�A�V�z�@����X7�r	�#��P_�X2�U��"�)����� l��>������U�CNX��h��n;h��B��z� �*��@J`��C(� ��a�,��$�f�:�^�7d{��|��L�rk=v�*���"`B�@4�pjG��sN���U���A�5YC*�N&P��������"a��/=)����l�5x�����������P�e�9g��
���D1��r*���.G���9p(�j��Wb��L�oD�JJr��� ����H�����"��R�e�M�c���d���/���DM���:z�_�311�m��EnW��7$\����B��*�V���+�6������t#�����
ND�� RU����/�� �(q ��M��m$����tS�sK�T���yfP/W.@eX6]f1
R��xB"��c��Y�F��\�LSvV�{�k���'�<H b����p���d ���t�?w&\��))Y{���k����
������])��(i�JB�i^���\HMK��<����Q�Sa�f��pc��Ls2�f9���\*~����i7�V�CG�t&g���)Y&�
��^>1SA!�H��J����T������_���%%(���R�MB����P���SE���)6�@)
�����(#�P@
`8�}D�h?����{��������lO��5�U_�?�����d��8��-�71+K�����q��-��[�}���S���5�g�+	�.����I����&$��9p�FF^^`��p�E��2�>y��z$�:�<2��(��b-X�,��*}wqo�c�t��b���`�� `����������n�������N���h��]S�"���.�s$�����"�@s�
���Qj���V�����NUTV��%hIER�5`.N��@M��W01@������i�k_I����w;F�1�@Rg���$L�4�p����d��ETL��s��{S7��U��*x+�xe/�r����>�|�;�2���@�[��O���3�M=�T�eU6���d��6J��P�$�f?	���b"8�"��Q!
���,��HDC0��9���g]���h�3e���������2���-*y3��Ql���*g6r�s�%�C�n�R���g�-m�4��+j�����B��f�� ����L�1�P�
�>�4a�����+z����u��p�6�a	�2�4ER�\�n�*�rM��Q0�uw�)i
#�kM�ij���FZv����.�Z���3J��Nv�f����(*
"B	��R�W�JT���
5XN��N]
�����m�JBP������bT�,�g
���R��G("<!�9i~����]���E���W���UlR�F�uw{R��QU��p���S���^L{C����#j~��Zu���J<����kOIy���m���|E_�Q57T���" `!4�b"�,����G1Cx����w����Um���D������*WK*�y.U.�H+���J�(oEn���u�xi�8����yQ�m�?:��r���C�!n�v����c�g#"�@�N��Y��6P���~���;�?�}�<A~Qg R�p6G��7q��J��H�B��/����7Z������B�����5��R��r��Z
B��l%P��Hu��;!��� ����"�������1n������^���@��rF�$���(*%*��O�����D��MssS��Z���j�/�je��zv2r=�SIR�z)*��P��"J]Li'R����HJ�z��j�:>�u]\���qI���Y�:���x��t��"�tCi��VY"KD��)e����������E���9)���I�0��(�!�8v��tv�G���$)7y@���Q)v����WU2)�G��I�V�����Zv����I����:I�E.H�9!@�xNP-����Kz��F���*5�'5[5�%6�R�f�DS~(3M5�9��8�1�;az)�UU�rqz})�8$�BI�tZ�/��l��J����#�������8�Z��5�V6�)�(��������� �q�(�J�$HRo���	��s���*J��6��^��PA?D�
"�F�N=8�6���������g"�B.Sp�lQ:���*����jI�^��mY.5���X��>J>>�����F.���Q[��"`*a�2�z�^*wO�h�9������PO���/�'������P&*�V2%��`E�:�"H��$)��f&r�$�C"S�-��!R
Sn�D�����<��������_��K����?���R?�%���`��7����]R����cHI���
������6�['n�J
�Up�PDs�.y�Ms����*�m+;>�[���i��V��)�����V����n��]��H��5?m"�|����E��m|��Q�D@i%����*"EU)�b������kB_�I����T�~��W�`���������U�N��#t�\PI0L�r���!���(�0����)�z�k��$��BD]'�D�5Em����L�_�����0!�;�b����������%d-����z&�B����*���WXJ�61�I�u]�P��PT�w���mPhoO�~�oE����r���A��mkyL\��%@�KK�;��"� D�~�a@�gt��_����4�SeH�F����2 ����eSLr����B���9�G�9���<��}@p " c
�wvn�}�g�����;�UY��F�X�f��������W����t��"U����?@�:��%��q�w����-�����L{���R�yJ���Yf����"�T���t�R�CT5����)}[IP������6�B��q��KVk��"�����w�m!
r	:�U��9g�u��� $�
w���
�5}0�JE���#8��)���B��t��^v�kSQT�wz��B.a1�EQAM8ZI_Dn��(���C�1J�`q����v�}a�sQ;�bkfUQ
1Vr���g����q�Ae[4���D�B���k�����B����Q�>��T��_���Z���������:�f��*�t�$^P�B����.I���s�F�?��{�LM�,�tC ���ul����������]�6�7�N��=4�D���������!��,��J���T����e}I+k�f��PU�"��$�M.���I���R�HHr�Lt�����t�K�����5Q�Ut[�v8�
G����"d���((�aL��AW���]�u�W�]��t���[Z�qR$R6��jH���.����iv�:Bp)�H�S�Jv����o����_j��[�[���5"DR��`������{�0���D���.Q
$]j�MntwBiv�r*���Vt�Yt���TP�h���;��AAv�P._�"	�$E/����yym
�����������ZU7��5�5L�`y(T
s���"F��(�����meGg��I�#�
�� �9������gw-N���:����-��R�Rn�J$�p�!� ?d8�;�l%�%r(:����U$�$*�C�}D�)�B��E�3����GO�H�e7h��n-(��
���tV=��d�#����'��S���*FH�.4��+)l�k���6���om�������r��A��0T�J$�|���I<�*fe�j�������D���'�_D\�o	^]u�2�����Z�nr-=����d���w�����,t�$��B��jh
�X�M�%d���8_B��T��P07K��L]�������f#����x~����O�=���PL���L~�'�N��*�����cUN��a�mp"!�>��)��B�T�n�Zm��(\���
���)@�Q�C<]-b�h���N��
cI��Ex���xV�j(�&��t�4����
�
�)@��`5���;=�Kw��n��b�u��-qk�cH#-�K�f��pB��;7q}�6�����
�^����������-m���j���2�Q��PUT[��9B	���b�;:nV�c�n�����ZV�����av�j M�Z
��0<#�P��*�O�����wu��Km`����8�{R7�$�S�;s0��������T���� �d7_����qXX{�V���?��K��$�mUy:y��_S�Q3�����Gt�L&H� il<#�>���\,YLQ���e$�����G"��` �@��o����[Ci�x6�������WVZ���m��-�=G��3NU�eYRM�U�kY:�u�k%����:D���&!�=��5�RP�C��E!#F���P�jz����G[*��h���G,�p�� �n�)� ":C�9BS:��
ur�,Ki��IN���]������2��j6YgJI�s71i�)xl�i��������u��k
v�����^F'�����A�!�����T@����t,�������=U������A9��P��G�r?#%U��FE����tS�D��6���o|��f�me���������JB6fX���
���:9��
�i�0!J�T_���Ks(����ue���]U��h�*�+��>RI�����!�Q
}�1�9�@�8%���d�����0�bl�g��l����m��������u7S�����9��0I��)�SdT��L��M���&{R�-5E_x�k��s�������"�8�[�&)2t1��L�&\��R��*��|M�v��������Tt�#M/��w��R$U��2�
�0	���-%���MJ[[�s������w���[���r�S�u�=W���$��Ft�G��&�0�;�-D�-q53�K�p/�qJ ���7^Z�
�����t��fv����QWKQ9�b�sSW��:�M�r�=��uaZ�����+9Z�NV�*l���4��� �eE3�$�Z�h�KU5^%Q��Z����LS�0�5[�\��z$�8+e�]�dY1"�����
���t���n�Rq�Mf^(��T2)����]T@����9O �p�f";�)C>�]�
�c�8�"!�6BP�����@�~c���X��`!�*n���Sc2i������+R��x���\�P*e��C������f�W��m���Z�DT���5I����W5|*�3&��7���
E���U�qn���-'-P��z��"�Ix��zqE�UOT��&>�QYp8c�.g�@�]��4=7��@�7I;�K�h��[�������M'������"��@
�Jn�	�������R4U�cx���6i���z��Z>p�J��=�Gx���rS�LT�����[H�P�������UT�wT;ZZ@��������BM��"���
$@9�C��[+��g^in��RSE
)Y�u���%vk��T��J%���I�V0�N���2eS10*�U�u��A*�����b�,�P���K��#Q�)/���~��o�
/N?��6��Z=�K<t��1��	RA#n�6Y��2�04�0���Y�f9~����4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������f����_>(�C������w���f�&(��8�AB;y�`��D�D��?�1r���MM��ET���5|�C�,�D��u�1	I2�&�Ki�����w����K���UPj�?���;��0\�h�*U�S>�8BSo0l�
`��p�~�0�?���LU�v,E��7s��oG1�f��	D���1K�S��� ���3�q�c	�M �s1�1�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�f3Tg?�1�i�@��i[BP��Q�eY<���.E=�3M��*��b�S�y3o���)L�2)�PFV��2gEb�D�UNTL�)2 �d0�l�Ji�<���d����)�]�C��b*����Qe1��a#���P7P�����92LGw=����g�,���iiu\&�E7n���2���
E �G�OQ������� u\Ct�ruP7(&�`6y�6����r����.}�
����6c��/�H����4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9���������7!:J�=5�����B�
v�c�$�.�l(��,I�1#�S,���P���l�Jb��a(w�9��!@
SJ����(�H��g�TC	�&:��xs���0&$�A��"�U��M�U2��K���[%�2v�2B ^D_�e���E��:���� � @��`�JZ�lT���1p�(�L��Pb��& 52���a��2�0&`��"��'_>���M���L`6F����5E�����5��d�@��fbQ��1���/>��s����|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�0�R������$R()�;��Fo���7������y�b9P�z�%VpBEU�E����Q6���
��7F���k,�Eu��&���w�(��09K�`S&d�P��!T�L���P��/�oK�J(4g���[��Wp[(�!��QG�L
�!�h���	�3"� ��2u2�Hp@>������m��}�C�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������!�e���zRy�{����r*��U
o��qE��9����xC,��@�~��?��['R�JS�c����&��_��X�"	���6��!����MQ{�#�; ^��?���4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9������LY�0�(	���M��9��������
�p@o)C�2J��y!����"b�.Q� �""#���8�����&?V��H:���P=�t
��12e1�J9�@�3ta�q�T�|��T���}�9���	�k�(
��}"9(R������l��`�3Tg|*�d��L%X;��R���3n�e�x"A3ErD!K����a(e�%;q���e��h�"<d��>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>:�������T_?��0�B�x�w d��{����SX��&QX��(���7~� r�%�D2 ar���Q�AS3aJ`(@���J�T�W���������f"p7'�9�w0	�3D�M��A'.�
�dR�.@�@DDD7f(��rJW�@���EC�e�zA(}�������	��K=�TD�.�f��	�p2fl� �@�4i��n�B9�`ptA�e��n`����s�tIn�|�m��"#�g�|���/�H����4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�6����G�|�2�n��
.���[��pc|1E�&/�?1*f����r�6�_���yjR1�1�+��(����T�*�R��Jf������\�Yw+����Z�$H�S=��$PDLa>���R�/D���Qn��d^���q�BA�<�C(S
�1���	����k8D�"�& An��P��R��DD6���n����T�Y#ltQ��%�1�ww@w=����9��Y)E
��U��E p@6c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1�(�RBB��YnH��%"�����D�;Dp�*K���!M7�PEar�{�[&!��"�wDx{��f���pMB��L�+(*��PE"�S(s��7�"a��Ox�2I�J ��: ����%�`f9p�b9���4W(�9",G/.DJ�$�	���bB�C�{�'1��#�X&��/�@�V}"��
B�n�e�0�f��<;�#�s
�i�9S,R��'.e�W��2{���@-������DD}�������l�v���b?�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>����j��
��R���o$����Tt���?�+���x�f��U�7���I(@>e�<�e��9��������c���Gh�ts�g����8��c���8��c���8��c���8��c���8��c���8��c���8��c���8o1x�[���4��im�+!T�u,7�j����[S�����)"�!�!�	GI[�MR�!�����v��RL.�� 	��*������w�@F���GZ���F��%���5�WPh5�2�������QB��e�t�%��B�
��w����L��t�\5|E�f�[���E�'(�)L������#)+'�mT�������?�{�c(����[i���&�y���EK���51�3������t�Es�mA���6����)t��mV*V�[�jh���b��FDs#��zC��n�������m��)�Pn�E��.���M��*B��0~�r9q|[��"��R�GK���5��9BE�Z
2z1C�r�����@��@��0[mv�-$�z��]�J"���[����d���b"$t����'����`��1@G!0d9m
�g�lq����lq����lq����lq����lqhtQ�1A�[�u�-[yU�����]1J�
b��3���
���SS �\�C2��T5����3hZv�������t�o�W����w�IF��{�r�j��u��;�..�����sZ�e@�#��B����u\>~����*	 @QU�\���������?j/MOg�-�q(�^��}�Z}&��(-��hnMB��P@7�QP]����hM=^���?�����U-IL���oS���-TEt�E����7D�`-����Wsx�_?��ym�k�1����Y�]�H�:Q�)��D�&��3TCx��k�j�N_���[v������xK�l�
�r�!�fi:���FF-�,��s���9�}�7�D���wL%6��@Dr��w1��1�<���g�lq����lq����lq����lq����lq����lq����lq����lp`�f���� 30���26,��iK!R�:���({�SB�5��,Le��mO�jGn�X���2����� �M��1�f6E�<�0�]����m����5d������������D�$�cR9�U%��:<r�c"n,��,��j[�ro�+C�Sq�OJ���������vl���~V��v�m�/M�4�z+g'w,��%s��+cuiio�k6��"�+���Y�i�������WC:F�����������ixYY���q�5QQ��Q���&�(�AU2��Sf%����,�������Z�j�9�zr"EhY�G�@qj�����@
�JUH)��o ��w�a�@G�>w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�3������{OlW�������e��HT�RQ��S�z}_\Wur�;$4$k`9��V�L��d7KHZ�����U����l�������n��|X��Z7n��PEeI�\�L��d�jb#\^��	h�
1)DijvV��%L��XGER�� *�������e(��" PcTP/��]����+�j�mr_!�cP�U��*�vnn�D�4B�X����UE�)m�6W���IL�O�oN�����1�~��r_ yq�-���?4���H,@PD��Cx�Q)�Xi>��k�W�S-���(���*Z6�2���� �,����s8%��^��%d�UJ�AM�S'���X���]+g+s�mID��������]��k5�V���*�HUJ��2�(C��Ha�1�7���9�`;o;������;������;������;�����;r�0����?�=����l�O���(l�
 �3~��#�s��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�3���.
��������Cii)Z��aF����WuT���TTKu
��^&q��!��$u�se���J��G^
�B]B���Oa�M$H��Vts$��	�59@m��c���9����.���u�����Z�Z��^eU	L0T�q�M���B*�7@����9�JTU�h\Sp���bE(�g�
���^��y�m/�����n��-=%gi�y�6��3"����)�G+���@�
�8�W��[�Z�sN�i��Y����=���fI���pb)�L�W
��S8d"m��CK���]�j��Mn���<SX)�J��*�oY(v�j�&��L��M��D��&����n����p�������l���{/�5C<�����/���r�&�Cd(��@M�����M�����z�Q���2��z����H�v���Dr��lq����lq����lq����lq����lq���
��]����G��������+�����m��`��*�h�&��P�b�-u
7h�Y��
un�����*�S�,�a%-&��
��l�LJ9K�M�W:�F����Mkm������������&�SpU~��H�,+r�EN

���������F�wP�SAj)���ZJ�`��i�m�l�T�Tz���D�Q a��+����~4w��������1uYP���wj]�+d����<�tI�Q6��|��y"���P���)�;��������o&��Fb:*5����D�UN���AC�I����g@��)��+�-�a�TRtk[�KR�U���A]+D����V�5f�6�6tn�[��S�3��>|#��f?d1��,���w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w���{���x��=@��[���Z��w*4�:�*E��L��*�BPpa �bQX��	�{'J�{�KW�*'��Jb����PR�BY�'O�����&l���)�d#���pH���c���DPyS�����K�d"`�@q�*�D�3KQ�}��I/D���;wX�Yj����	��di'q��4[+`2�Z��D�S i�Q�N��.�S�*�
�i����=-R�9�*Ui��I�Hd"�Ar��T�;���-'�=ei�+Ow��[���f$�K������=I�W4����6^�/FEB�"�{���Ms/����Z[���\��ot,=�wn)���T�����QE2
Z�,EE�`����[��@I^����qJI�5���bI8��@�0�����.��9�c����8��c���8��c���8��c���8��c���8��c���8��c���8��c���8��c���8�r�c�b��N��-E�����W���`Z���]*�Mq���U���nuD�#Z��US1��on�/��q��X��X7���V���Y�,�p(Z��M���v�����/���b1;z��:�R��un������*Z���S��#J��H�\RI"����b��@�}UQ�J�Ns�v�L�I+{\�1������/P���M���]������m��jn�����}oF���KY)����m;}+R����L��p)����LU�.��qo-�-���t�7oP���2V����1��4��DVrN�����"Q�U�����Y��������Mz�=�-��'��][]y-��U����1�k#
��#��Ho����T�19@�
�S��l����x��9�;������;������;������;���<��G8}�d����|#��5Z00��L��rX�4<:�P��g/I���
[��!�xJ!�Z(�UtB�~$)���7�"����q)TQM�Lr��dS4��!@�kmt�sF����2��r�$9
c��I�-�=�����:-�� ��������@��IX��Q~MP�LQ���N=�f����9����mG�����5��FK�!�1As8T�-���1wx
�b>�_���ob�Ho:`F�^W"qQ'e"#�),�sxLQ2&)���S[�R1�>��dPA#�4�*���)�"D� �)���q��$����:�4�� �W�����VP�H���c(����m��G,i
Gdv8��
�
��~�d��ApR���@�L��LR�C-��e�����-v����M���V�2n��6�����ji$�dI!s�_$"e
878�����1����R�m�}}����MF�E�!EH]ov����"+�Z�I(�����v���b,D��$"���^M�X�nq��![���y���dl���E�b.����9�s(�����z��h�AY"��;�m!�f��}��Whm���.��5-h��Idk�S?q��#*9H1��;M��1>Md��W�0w��u�x"!,����i5�EJJ�qk���+����SN)cF����QCJB"rf7��z�����	i��^��*
���)M�7]_WL[�oD��|��B�D����+�b���)��D�`
�w����g����G�}����
x��4�����i������)����:)�EC� 
�oe�0��Krj�YX��W������u"�*���h�uN�����U�J���@��Q1��<��	Dr�Z���*(��a��7$w%�B=n�DtwG1����[�K���?F��=���C�������kM�J���W	�8�+�):��X�cI�����D�P�������H�0���ST�����C�%(�p$*�i���E#����NLI��)���G�5;��2[z���1��9O���j������%G@���l,�E��P�p��H��������"���j:�B]5��i=Nj&	)��3�R=�����#�9`����p��
�L�
kb4�A����2�u��-�t��+Z^���N���1UPp��}-~Y1!
�]��(rE�-�3���v����%���x��N��E8������!n)�!��Y:�J	�!�t�T���n�7q�"C��;�5�uW<qn4B�_&��M$��v=��<���D����:j��f;E��s�A>��l�iG,�`c��TP�����!B��,�%�Q1AC���Jcl�!�XS��M�v�,F������:����m�������*F���g ����UX.�!��(q0���v���5��[������N:����T��~���
�����A��QX�����t}r{J�o�
O|�:�OZ<��lUSL��9\(ej�*���#�	�2�h*��*��"�%E"@O	o��	DM�t�]��9g��G^U1����-����)�dJ��F��{"��H����\������m��
.�sS�����C7O�!
s�b.CpP��;7��&3�on�H�����M��$��[8UA9a8!D��w��(�9&g1eP����TT�M��/[�x�T
*&@s�Sg�W�U6�7w�/����i"vNo�������o���\�1��DfF0�x��S��z[�����z#���9$-�����$�(�\����TNh�����`E�� T�.��<�
cnt��(���Pj�&����Yd�r�\i��9Y5�:�9A-�d`(#m��
�j��zDSM��(�hE��0;���1(&Sx$�@G���s_@Q�6�WS� ���>
���:��=���}�a+�QwZBF�J��r���9�Y>o�J�R������X����1�S�7����&��k��Qj6����*��
f������w�#��c�r��L�Tw�Q�y�-�kl��5/r���{��J��������cOI���&��4_���
�����Al��p�7XkR����j:"����U��nm��v�����Kj���g� ��N�Hd����!�n$�&��3���"E�c&����8;t�;�(������t@��D�ti���.����5-B�.���[b�;7s��e�����~�6A���EC$(+�����5Gu�D
����3~
QZ�����V���*T�@T�]c�8��;~e�
�2$$Q;���!��(�]�"�:`n�80/�e������:�TrR�pF��(��JrsM"*����9��T���!2'(�A��^�A����-7i�~�[��K������vv��R��%_[���t�"��d^�D�(�����-��6Q���H�����vNd!�|����r1��EP�L@�!
r�5Zv:��U:���!VF\gn�_L�[�aP
����K�s$����is%�mw;F�-Qv|>���`��q^SU�����+3T&�9b5r��>�(��b�Q'n#;X��u���jOCh�R4+T�,�9OS���b�uoc�%��z�����X��j�������,������u�HI�?j��^:��9�4q}�3�Q3v�J���E�W#;_ L�(F�X*e�� l���-�c�	��R��D�EF����2f[�'��
Yl��=�;����B�� �����L�����J�����:Qb��C��L^��k����:UaS3�8��r���D���3��A
c����U3�,�@����T"���7J a�(��`�pC�I2��)�G����dV���S	w92��0��������Z0��V2~���%�����������,�"b��]K��P��gl��H�)������&�o$U=h���-�:�%
��O����R���y2�X���L���d�g���*V���	k*=4h�:t��-t�7���.e�3NQU��:�I�8(9���3��%�[����@����|#��@J`�.{Cf{Cv�<<8�l1��c�=��{a���!��8C�p���l1��c�=��{a���!��8C�BS�:���h�eGC��������n�5L�x�F�Y�"
����.�y���`�z}����Z��7N�BZ(�7{#��Rv��`��MJ�n�g@S*����S�G�(d&x����k�R��E����ZU�b����I�%H��Vm\���p�v��P!2HZR�7���Z5������������v.w\�x�pd9
]��n�� "*&��p)�PN���MA�7O:��F��v���,,�WI=��������,�G;��Q�(UR����h��	�$�K����4�[v
�]�����Y�W��A5W|���.A��Q/z8�����Q]mn������Wf��@�$�4H�%bi(�M�T��L�(S���N��/�=bu���3�?T������>�C���������Z�U�zTj�
��`���S���/(6���X������UHS��=�<+@b��0�&:�������<9`
��c�=��{a���!��8C�p���l1��c�=�����]v��o	ZZ���^Zk{}-���;;��T~���U59Fd}�9NK�1�>�c)��pjMEj��r7�U�
�5������O������k�B!�>P��Nu3�(�=[�l�/,�Y��K�n��\��BQW�Jr���c0���R�&B��}��G�:��[��tj��x�|��-�*����*2Q���>�nC&���
���P��������v�r�ej4���Vz���%BT�(Y�2��K��D�U��L�@��@D���F�,�����`mk�e���M�V���:T�r����2�#�d��E��fT����e��r�"5��v���2�K6���Tk2���kP�L�	�A$��d&@%�� "��@����G-��L �e�[3����l1��c�=��{a���!��8C�p���l1��c�=��{a���!��8C�p���}�8l�$�j��M�e4]B5pA�)�]�Gt���iG�t��7���^����6�RB�q@<3�iYW*�P��P���[3��a/}1�K�m(77Pi��+D�E�$��7uz���f!Z&���n�x�
��VnB:�-��j�-�V���d���V"�T��=Kp_&����&��!����;(�IW�f����F��n
HR�T��b�P��G����e�
*)�(�3*�1�6�*K^�+�%n��@#dbt}h�l�1��c Bf�r��"h�{�"�U�(��5�c�
lVZP�����nMkg�g�;�ZVL�gW�[���t��D����� �	�D�O%
s�NX�PY��#^�OT5-K&y����*ye������XLeH=Yg@"E1R!JB�#�m���x�=��{a���!��8C�p���l1��c�=��{a���!��8C�p���l1��cw 7�����
"���R����Z�LS�5{�z�lT*jNf��9��>/|�d`����~����5��N�ATZ�����w4��&)z��.�|3F�H����3��*��|��f�F�v�V����M5���E�W��Z��<���L������D�)C�
B��A��3W�?�q)k��6_N����r��8JJ-�����	�h�T�C)��a����F��U���5�����45��M*v|��}N^e�+.�S��z�  @�
"�����.�k��6A�d���-�*@o�
�n��kMM[�%$w+��'�P�pT��&(MRkS���e�k(�����T����l����Tm-J��n��A2	;UA����8oa2	��� c�f6c�a�P�;s�{�8C�p���l1��c�=��{a���2�\�
d"a���X���������c�}��1�������u��}����>��s{������_������c�}��1�������u��}����>��s{�����y��Ki��I�
h����C�;�wYI�Ii�I'I���V0���d( ��t��
V��rY��KAP�����SB����k�1�h�G���r�T@�l���������u��}_�=$M�������E9BP�y�JZjvB4��6�J�lL��'�Rn	��V��������������SSo�N_j���i%W\t�\�OD�QglQ? Cd�`0�������]:��.�~�v4sF����f\J'�%=	S,Lc(�����D��6�����PUe]��H4����-�����TY7f����[9IzKE�$>f1�Nl�zuy����N�o�Q�}��L��gn�y�f��P�X2p]���g�L����yh�}s�n��V���\��D��t�����rV�cX�ax���]WMJ������I[�!�?E���-KA��D@S���E����$Q!DDD@DDG1�e�����~�>��s{������_������c�}��1�������u��g�}��0&�<�wn��;�I������}MS�]�j���������)N�'�p���,`/.���v�����W|��fn�Uw��B���T�+r(y��:y�\A|�T��0��S9S0�LB��]�+�'v��'GVv�U�R)�����h����n�/Cv��[���p�$�A�J���-Z��P�N�5KP36��UuMK�>���)Q��?n�S�<��L���MR�U9����\�=��f]��{�VT�M��1ARU*I��\�k�+v%w�)��w;:���
�k
	&B-E��^����N�E���6���u���X�#F1nc���*��gp������YU@�q.�kqjm@jn��;��
��t�E��J�4�<�ab&;�d�{�pu�P���(�Ch�w��0�Ls�3�8q�������u��}����>��s{������_������c�}��1�������u��}����>��s{������_������c�}��1��������uoV[YJ��y����WI:\�)(G
�9L��d8o�9��!��r\M[��WX�W��9K?@Y�b�����ww&J�1\� �y5�E�1:�9��P��a�k�@���V���<Q����2��f����G�H���(P'x�x�P:X�e������E%U��%MPt�n�Z��hX��/n�
�C?�T�bB�q�V�>����d�VUy�8��)�V�����J������L�u��d����fJ���6z"�P��]�����~�k
X��9NU0����m5%i[��U���4w(���������y	�lj'Pv������:��MP��5g�5p�f�\��~�����&
��f��"2Wx��ik�r����3'
j�������Ae��^��:�$�a��nS��L;�68K������_������c�}��1�������u��}����>��s{������_������c�}��1�������u��}����>��s{����D~������U�����oi��h�n�R��p����P��kZ
��:Y�)���D�a��]�.�*���V�OU�����:�����+eQS��tmIB	X�G�2+A�f�C�H�9�A!i�E�R������Q��������2��'7J��"�����L���&�n��v��������]��5E��V��������kJ����aT��.�� "��n�l�e���=�w�O���X��mm������m"i)�*�/�� �B��V�tM�4P���&E�v~X��Y�N�[���Z6�C����� ���P�������R9�\�\DK�$�n���Vr��J��k�kOl!V��bX���s����T���
�Q��	���9��1w��M���	�;xD2
��{������_������c�}��1�������u��}����>��s[`�0����%yG�d�����������7J b����f��*m���3��rv����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/�(o��[��������L��/7���|��^���!�o��`�Z\��dd)��\�d'��1K���<8�����X�,���T
�R���26�dg���"t`&�o��3b�2��������`�����1E���U
�h�s.���
�Hb���wH@LS6���f�z�l�p������XLm���n��JMB�FQ4C��\N&��7j����D0(�(4�F;�\R7|)"S�tGi��<�����j8�m�����|"���j*����� �.�@�F�p�)�������<�w@v������N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/A2r�\��A �b
@�x#�[x;�L�,U3�n�"�\�b�eTQM����o�a�����
��G��v���w��\&�	�d6{@C1
�!�����'�����"���P���%�!��D2���B:��)E8��e�[�U�	(o9M��s((��&b�(+ �V@T�6n���r(pC`�`LvT��(��c(�q�C�����
m���d��"��!����Y`"��D���`����9ctS��<9��������K������x��(�"����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*������&�j<������5�`
w&���d����'L���X@r��8L>Xw��0*�*�y1Qg�|��`Q%H"���������S��E����D�Q�r#��Dr1G#g�R�J�����,c��EA(�:I,)�A�D�cx@!�!R0�Q�j�\'���H����.�`#�pr���I ���;�S:d�0���P��!? "��?�S 
�;��|�
������A�!���A������zA�
U�������I��H��YfP
��0��������5y#gH6Q�L�e�wG����oKGi@�s1
�&����#�wq��S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���r��-���%�A�-��x'�iPQd�-�c]*��� �H�sn2�w��9f 6�4�dI1U`�9�\���@���3w�<�0�����H�'��2��*�1Q�]��0 ������?(��s�Jg8�9?�JS�-����3���RJrA��6Sj.���������L�7 sD�Rn���G�$;�]FK���t�c�&1�`��6b@ � ")��)��
�r��������*�o|$0dl�v��3�^���a����#s���R���^?JtC��x�U)����T�D=���R���^?JtC��x�U)������Qn�8=�u��EF��
#2����72lW@E5TPw�6B `�6g��`��������B�0���y�0]��.���W!Et�s$��Q�_�Yf?��y�/��F<���k������?����������mtc��x�6�1����]��^?���y�/��F<���k������?����������mtc��x��C�L]l��p;�I�L�!?��L\��ATN���  =�����i�j	�`T���c��r��g��@�����T�C*B��f&D�P��**.���(��)�}��s��2���)J�����`.��DK������2T�L"a(R���~PHE��p���d���E
XJ��!�D������)@2����Q�#�7�d7�1"e]R��{xs�8�L�J�����i���R��j,^A@� "=��}�����L�P�P�0�@r�.�T�D7�,��
t�=��b�/��E��,��h�\#�x��C�E����k������?����������mtc��x�6�1����]��^?���y�/��F<�����A1P�(��qQ�G��wF)S*�b�\�-�L�z@��rH�+z:��\�Mu{�hw�>�XIb���"��[��B����DT!�}��r8�
�7���.��*�)���"�NP�@�;0UPmN"�C<B�T��d
��P�8�����;��*�(b���&D�X���D�r�W�K��@@�@������s��!���F�(2	D�<��xD��)7	t��[�Y���u/ID�� ���\��<	LzTLC3���)Lt�)��)���p��g���pK���FA���]��^?���y�/��F<���k������?����������mtc��x�6�1����]��^?���y�/��F<���k������?����������mtc��x)�����f� Pv���9�3�m�807F���A��\�S(`YU��S1v�o�����h��J�$��]eEch�PXG��C��[�!�A����UCn�b��ey?��B��3�)���;v��mK�b�xm�jcl?���ow������S%4QD��8�v��r���:�*~D0��q�,���`E� t��\�i������c��������pdm�Q��@���U�!8��*fW!T��3),�s0�����2�)�HNs���;L�%�8x2
��i����1����;��0:�0��2�����?����������mtc��x�6�1����]��^?���y�/��F<���k������?����������mtc��x�6�1����]��^?���y�/��F<���k������F-������Kpnp)�U�QSx]���R����\9`�+z=���M�T9D��]6�*�cf`�6����Z=	SY�s�)d�����Em��?x@��oL��2fL����0p��bR/�,��@@2QR�p�UX�2p�gE���(��V�����n�"z9���)h���R���%��
P:�l���1����*�p'(u
�p_�P��M�p���&{��7c��~��n9�tC������������mtc��x�6�1����]��^?���y�/��F<���k��B4������R��+���7UOz/��dzgB�%o�2�5Oq5q�B��?l~�����K����to��Z^M�C��F1�������HN�j�y�c�2���de2(}��g�M9jB���=	R�*�������J�����T���QO���8]�~��i �����$&��E�lk����n�����V�aJSj�M�����.�W*(����a���v���g�L�c@�}|���Q�r &�
��/�u����� `"�(LQ0��i�F.���������{OQ4��)�yqe�!T��J.��J�D��*����2[��OaN6�����&�q%��N���V��\�+&OK!�R�DJC@3j�RZL��j��M8���C[���qT��`�%f*�OM�pBG��29�`07Hb��)���J��Z��}�����"��-��8���aP�pQ����B��H�7�&qP��h�Z��^8�g'n���U0��Vz�U�rrh��xS�b���B��P�;������ql������k�������������qP���4M6"�4��0!
9(S�DcQ)�8�����O��V��z�EK�8�R�"�����xA3�����)��@���F��5��8zB����j����l��i���,.���URn�	�+����gQ���ebn���������G�F��[M
�4��H*��IML��f�D"d�L���S^��l����}D�t]`�i�1���aq�TP����o���c2���	
D�����<���.]T�1mD���)�$���w���^T�q��DG<P_a���JjCNR�2]J"R������M��w�n{I�L�&���������+�[���2�^��T�8���0 �����p�.�-Q�',�P��Li������`.
��,����~���AT���2,��R���x��i�Ub���a����l�-�����t����� ��M����9J/ ��c9q��6t(#�$l��*t��`�.�k�R�����5��ay����n�7M=9YU���$L]	D�*-7LS��2�0������EP�����r[0�}aY�pc��`�GPV�� &��Wu��TgODC26������@bdShl��u�s�^y�"����x�v����R'o���hgF�*	�9M���=�������:{�M%�G��������t�����(�pE��19Si����Zy�4��}/[6bqT���`Yg�*�S
�$
E)������ao5Gs4�h,u����n��0�S�:����1�z��?���Ev����E&	�H�D�����et�����w������R��4������d���`�<\�HJ7I7���YQ@@6��)�u	p�gmo
���I�������:���)b�8R�E���|�������@9P0�v�v:��4��ag����+o�4�����-������p�$�Y��l�H�l�K�t�9���n��D�)�����a�'f'�W������nT�v%@�P��WprI1���V�W��R��cU�;(f��������`�`t���1"�T���faP�
��U@����A�N"?w�l�������O��Wb��]Zb��7����2��migj��

���6��
7
��8L�rB!�2Z'�����^Zc_+z��t�7�)�l�j>�-,�:<�X��TL�b|��J��f���)����VI���CO�����V�=:ELdSv\�+u���f����KvJT�/T��U�U}7!z�i$�{T�-Sx�Y���8K�2��5�
���uB���]��m���~k#j�Y��:Fr��QfUi��q�*����h���t�b�3���a�Kt[S����u�`��Gc�u*�k���~z�|X�]	���8��aM��[�H�T��by�nP���h]�����tL�dsH�r=�>�rF�L*��5���E��1���|�0%!2�"��\�<�T���gl���(�s7��
 	�� ����p?�?�1����:k���2��o�X�}�w>�;�w������s����q����}�w>�;�w������M3NS�Z�"%��:9V��UR��8�Te]�D�
�xk*C�s`�]�5����#i�	t��M#.��Bu3�j�R�U��x��!vd�0"�*�@�P�Z�Uon���f�2�o
����Tfp�[��"1����c�n��x@�5�)�X�r�����L��c���������(��v���r:��l��0��0ioV���Vz�Y+�_�T���T�&�R�3�L��B�U;�	8�e��S�6i|A0���,b@E����6E�yi$�0�	�D� ��� !���	�����=Z	:��e*I��Ep)l�Fu[���$K��+e\��Pn�;<(M&1�(�F����R�n��2�����r����#f��e���d�a)�00���)�%gD]�����RV��P�����N�U���{�.D�d��G"�iD�"S�w�K�e�����-��k5Li�f�~�j����������_����4Tp2{D�����;}bX*>�[�:��� 
������
H6repEA3m�.G���	��9m�,���}�w>�;�w������s����q����7��t��)n���l���<��S����i�{��(�V�����y�����TWr�y�E��Yg��D�P��B��?I�7N_ �V�xEW�r�(�R�������*��h^��v��/DS�ns,W�V�U'1O�CH�n�0PB`�Yu
d�2���4���Iq�Zr�����db�g�I ��_�5�D�~Q"*`!����
A\�k�Uv"�B!�����i�����L�X/U��N�C��?v+;8���B�5����qu#HR��k���=>���&ZT�.�V�c
�:�E�\$B���~6n�b�Qz���w?�����+-;L3D��U�*��� �D,T�i)�&r�\��\���P�0���h������6N��V���6���*��&����q���#`S���
�X���*�S���.}R��F�^���R7�c��Z�Q������W�7EN���G�D�A<�(���b�>�&
�B�8� b��!��w>�;�w������s����q����}�w>�;�w������s����q���LN�,D���%t�94�P��Y�r�����}�WV�+@����"��)�J?O0���{X�?�]�$]�21�K���I�!.;>c��16�P=����h�5����R�$�[3LE	Gu��8�+�T(D�T���6�����,���:��
[{������tZP������jx��!�U"��QP0�Bn�E�����d 'j�@p�}��>�g���?EU�����=�K�RS1�}XT�"��Y�w	�h�V�L?�`�
LR����s�0����,%5A-P� �~��i/Z��L�j�:l�rh�8�G_Z��W��i��������
�rz��3H�Yf��$�5L���L��E�D�0z��������<mq-�#��p��X�f�*��H���4�Sy"����O��w�&�T�������"�u�rJ��`�*#��pJ $�n�Y��������s����q����}�w>�;�w������s����q����}�w>�;�w���?�v������c��G`i��R��_��@������RFR���J�I����8Q�S��wJ%�o��/������:���n�V1p�u��9$fR��c�-�s�Z91f��D��c�0�&�`m�K{^�"��%��q
E��Ub6��%H3�5�8&�'P�(�C��UC�Z�)y+;=�j��k:�a "���Y��VLP"K�.V:)r�PN�`6f�Fjy^�{�k�4��oA���5F��������5zSP�%�"�#6�]��b*-���4�z���X}Nj�J"����6J���k��)%p���UN!���r�G�i�g�j���������T���mPX�����z����4 ��j�s6�z�L�)w�cw����DLR�R��*}����S��0w��t;�w������s����q����}���y��a�/�E%�\s����������u0o��V{"��L�F��M��.��f(6`����nB36F��<[��mPY��zR��d�/��"�mV��Ze��&�
�\$dN��xN�#�
=vn�YGZ���XF�������(��@�����B����@���i�\����o ���6)����T6���(��	���Ue.����0!s��&�P�*����H]/i��\
b���)��m�m��~�F�%oF��=[+S���\�$��l�w�>�xk����g}�-�l�#G���)�]gd������L�\�b���d�9f����--��.N�P��+	����H�4?�4��j�X�VMy��M)P���`���^�z:��5#;/Y��6Q2�����JRBu��/��SzH�YP($r�B��>���;���iv����u#"�f�yW'0�b����`v�.[������d%�`k���[�L[��E����[:�d��Z2W:��	h*e������H�D�)�#��GL��o�rB�=I�L�uZ�6���}+W���o�]
SG#e/���9C>�q k�6��ZT�����*��}+p�{TT���v��4Ld�N��h�?#��Du!LG�]	O[�#��>�Z�){�����	�&��Jj�����%k�Rm���Sdp�^{�T�f� !'�H����kwOVV�G��''h&�A��������k��D�NK�����bVt5�������f���co��v��+D�I��M�D�;�S��@@��y�vh-;�;�H�@�=�Z	j�
���$�"+9��vL�9pt�A6�C�{Hc-�T�������)7�:������f.�tl�����tr�2K	��LD��	Lj��~�E�r�dP�U;?I[�u�1����C7N�
T��� �p0@��L�-�wuk&UE�h��eh�	P����aQ�W1n�������"��,�� &&������K��n���}��������iRF�9Y��Q
*���'(�%EC����r����w7���$���k��w}�������;>�������[}�
>�(S�v����
���=��c����Z��:���F(�E�*���b����t�7E:�rWj�k���*���%�*����,AYgoJ+Vb	�j����8�P��HJ�Zk-�����Z������-*��9<�]&�L��
R�(���,�����/|����"m��L�WS�i��>J$�QG+�
�G����
=��q�k;qg��
��j��W�+E�S���*5�������9�����"��3^�+�TJ[:CXZ���]�I�h���O�`<d�%]�*1v��P���T� B$P>�7[�(T5
���5Q#��f���������Q�q���Us0��g�c�:(�a1���2c��y.��:ti������	�_QB�SiF��U	�#�Y&�I>U#�S6�@�2��S��T���@�\	H�v�:��V�FA�I�����"nYf�����Q��]l�+
9�
���U z�d�L��G=U� 	���w-�C,����1�S6�DG�F9Co������n�oU�5b��Rw�M������Z7����v��7#>�-�3���Sog���(���t��+�=$Vt����.�Q��Y[����QK�rb�EJ�L�u\�!O!��0��R5���In��gNE�J����!���.�bu�������k�=��P��cUB~G�����x��Y�7�v�L�+�L�eQW����y �h]����)���j���.���L�V��(�S�dp(��p��Ee9�@S�Q!1�-V��������������UN.^�4�c�����mQ���.����P�`�jq�7�ou����yf�I��r��j�����9��q)@6r��##�\�)����3D�.���9p����A��4���K���������b$�����������g��A��4�Bva��Eaa�~�Yr������l�`
�|.����
�eU����k�W1�%���rw4�)T��v�	H�&@T��  s��n�V0V������V���$�)Z��J�eg��*�0*&r�4�P�Os|"$�@G�PV�)�]l�-GQs�������k��U�0�����L�����K���9���;<t�`�1to��6xK}L��I�L�R1
��K���P��I��)��v�~�p��5v����GPU]�����6�����CJ]v��	��
&(�Dp	�y�tG���,����!|�&������B�:6�R��V;:b2�|���{�R���B;%�
�W�����h����'��������gP��=C �"������s]��3r)c��\[�����4�)���&n��a<�VdMT��B���`jcN����)��Oj�?�ndY�ypk��vp1L��,g���1�
C����.���z�$5��BN4�8��u�G�4P�1JT�O�f.d�DG,�nY����|����)z
�#}l+]��W��at);{3[;����
��sR�JF�Y�J?nf`���b��S�*-&���i�7�v��3��oj����#�Nir��
��
�pdU��I��1�2��c^]P�����9?s���;��������W�c1�������]l��T8:@@�c��SI�+Vu-h.���!�c�g�cG�V��v�|K(8�&F���I��nBS2�M��1B�[� ����m
b-tcY&	���L������C�j���G`�wO��J2YkIC���'����i�6Uz�����PB�e�0�����:
�,`.��]�����
�P�-i@���\��j*N����h�d������,�A��7��D�)t��UjR�j�v����2��)�]m��e+]O�C�W���J�Q,\,F��I�E&�(�1(�$���T�w����+j,������F��E�HZ]�� ,��5N�yf��Y��yC�0	D��"���d�������s	DC`�f����T�����dNX���@�)�M�s��v����ST����a�������-�g�)�����T\4nW-A���1����EM�*�U�vn�P�)j�5yi�C[��'�R.bi��$v�"Y(���-�J�uM�*~i"�����t�LU�*�\��J"
������?oVmn����(I��]]� *�	�[�Ehb��.��`�������c��@����d�:a�X.<������@������l4%QZ�vR�1��rz��3��LX@��9f#b[��E��^A����M@1
��P:��i:��0n�ml���*W/A;�lW�5Y)��R�DZ=P�*�9��`6�u�����}��Sv%�m����S
%i��n��oR��Q�^1�bz4�T�S8�Na��H��*�����7R�D�;*��G��hy&��\����������5 �";�Gx����(��U�n�,��9��#��\$"";�{��Dr�Ds�R�"���� do����^R�Fk	B��������m���J�Q�*�!RUB�P]�sf)��cj*������i�J�����	'n]��u���(��S�3v�.�sWU��X�*���
=]P�Z���Z#Y3�"�en��/$k*v�0rf*�EXQ��#����	�9x��k���<�%��d�$���_	L���Bb117��.�KxoK|f�)�j����v������Q�"��]�Q�j��H�k�����`���9�)u�h����1�60��Lc�>^�I�5�i:�z2�#��f�����9@�O���g�v��({a\V�����;n�?�w����i��1������A7zl�2eE# �A4R:i�r"�%"E2i���c�c�9�}C�%���(����q�?l������C��QP���RP���E1JA�<���=��T�l�D��)s�!�� ������[���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���[���������x�V�ky�x+y5��EI�������b���n���y-\���Q��<>��.�mi�W�E^���ax����8MeLAP��8�@Dvx������w&��EQ��S��4��n�
h�(����m�����C����nl���������B�0��������$�\	����)�����oM��CK]%v5�mO�HH��^KG�(�.UP��	��c��*
o\���aQ��=��Hb"�����R�����W�����P����!�6�{�ut�i�-�C�(V�,��iD:���f�M+ %L�s�����	Kgq�*f��sl����j8$i��"5h�#��R�S3^H� Q:x�E�kQ�������d�X��j���H
PL��6�xDDZ^;��+MY���#�~X���:�t�NZ �*�S�*����XM�D�A4�j�v���F��A�V�"R��
B��1�����Mm��������[���������x�V�ky�x+y5��<���o
�Mo7�o&������[��t�����n#��3����x5�
��wMO%H����W�*��z�>2@�f�	��*�@ H\��J6v��3��&*�J]���K4��h�H(�L�L&s8��o���Zn�[N�ST���;N���9����\�:�)�pK�f1A�@�)P������N���T��hA�Tue:�i���@E�Qdc��AI3��O1�)�@�H�$���v\�A��F!f��� ]'c��P"��e�:�9�NeT�b	JVR���"�4X{����U�c�x��j��O�T�����Q�9[�P@��������������sE�&���9�jeda:��.PJP������h
�j�Zf��bB.��3��lD�N������9�1�<�)ST�L�I25�H�D�!s&y��~���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���[���������x�V�ky�x+y5��<���o
�Mo7�.���{A5�����	��&�������5PVf��D(��PD���<9��Vu%@��}Iqg���*XR�1V�E)
J�m���]	���da
���_vf����ug��(�<���6�K�yF~�A��s���`R
K]����u����B���qn��$��RJ�&��\��<�xG<FVw�O��Up��:.~���#&��oA�C9�Ed�W3�G�{��aUvm=pm�C0R2���v�)�E�����3n�Gd(�"MHV���e(�3�i���vyj�6)O���W���J5^U�+L���*E�@��#��"".��������!2�E!U��	)�L<���E����7((�#�c����o �U@d��v�JA���"�M�7Q4�&R$�I(R�)wDl5���X�V����A��)*]�l�5l
N�����3o���xDs��2�#�]�	(p/�8�<#�3,�1���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���������4S��vjv��<�$^$o}�X�#����Abf_��[K;j(�kn��x��I���
���r��|�����(�����3������V��|j��J�
+D�U�c8R�e��.�s������a
uAi*���/*�v�� )�F/�&X�� �S_p������R.yr{����Ov��TJ���Vt���2�[��h����0�S�MP1�`PL��������r�"�?��������H�G5g
}4�) bt��<�i����2�P��&�^��=1K����p)r@���P+�f weT�=��`�?��1�s�5��1�x�?��}���<���o
�Mo7�o&������[���[���������x�V�ky�)�j�d�k{a<1.��Q����b�&�����J!��g|&0e���&/�����|���D���j�\�C��=�pm���n��(�
~�@���x�k���
���1����c�7�_���o&����M���&<y5�Lx�k���
���1����c�7�_���o&����j��o7N�Q
�MB�n��H��PTv��i��9	s.���}i����E�8moU���A[���s��Q6��*'�p��q1�����mO�U�<j��Y���H�i"�&�$�B�*%����gn(Zj��2pQ�5?�Ze�rO�1d�*�9@�&TLq�0��G<+v�F�mEr\�x����O����I��(�2%q��,�Y())�&)P������C��f������+x�B��(vI���$c�yE��D&��DY���K�j��l_0�q#G�g�P�"O��P*nk�&)(�b $.b bF��yM��\��+JVQ
LC�v� �\��T��3C$���u���m���+'+CA|IYC6M�y)HC(��"�]�G1P���+�P�f�J�����.(��u��T��y���	�]�
D�TYe�6`7�u�:K���"`R�p� ��D������&<y5�Lx�k���
���1����c�7�_���o&����M7��T��DI�H��@�D�C,�{��
���i���WBE�uU�i_�
�C���Y��9�n�EG &Y�Q��.CH-�~�B�V�T��3�5��A�j�c���dD� �@�U���T��R��[��8�N$��
�^;�AD�@.��!
P�p*�wJ����}#)oj��c���%%�z$��>��$��~���x {%�N>J1hYL�=���Hz3�.:H�2j�������C�	\�G��=onq�;J���������)������)�r!��7{���go���������1��4���8N��aEUT�&8�m��1N;��������*&�b�:
�������j�?�F���S11���:�a��<��8���$�";Dq����c�7�_���o&����M���&<y5�Lx�k���
���1����c�7�_���o&����M���&<y5�Lx�k��Ad��*�AYSEB��	y1T���A��rPl�,?����l�I_�����URb�$�f)�0�tV�M.A!L(�r���`�B�Z�:�����J��!,D+� 
�|� �SA0*h�c2�\�FX�SGZ�X�~�5
�SWnUYGJ�����S8QW�8�sd\�����4})p��=\������'U��j��dc��d�Q����*m,�~�LMAw�\����yxI2&���@u|��X��o��-m������0��:T]J!�u3a���r$uTB���[��
����iB/N�j�Az=�p/��htH ��O��AC�9�s�G2:~������'���\��%A!d3o�����r1p�3�La�!)
T�q��e
��(��"(@L"a��#���o&����M���&<y5�Lx�k���
���1����c�7�_���o&����M���&<y5�Lx�k���
���1����c�7�_��fC�^���<'@_{QF��1)F�I�u�"�L�jB�n����t�P�X
b���<�F�[{YF��D�qm��G�OK0��fR�,/N�qs�w�� "#��w����!��U��F�}���=0����?,'Xy5�S�1�cG��iN�[���8�OU��(�"b)��c��95���M��������k�W�"�����3sU\�����9I�i�dD�n.tI� S�������i����/1D�B$��y��Q8��
@�QCx
����E)A���*����v���/hJhbd���W�b�D�Qb"
fqI(��`!� ����a$�J'8��8L""?dq����c�7�_���o&����M���&<y5�Lx�k��Pw�QT��_,�/"`������)�"�R'� I�%����������_�b��9��S ��f���L	rC?c<m����b���/��>!����7��az*?���^���x������>!����7��az*?���^���x������>!����7��az*?���^���x��`�%��*d�B&T��xr�p��6����k�M�5�r�=PA�T7����>C�C�s��!L9�=�S"R9�D��"%�.������H��H�}������J�T
1-��P\���6�;�vt|K4���z�RQ_<�%�tDJS��f�x1������S&��Y�8�D\�	
R �r�)����l��3�%!�-��J���E��4�B�D������R���
#	r$��)�������	
b;��Hp�9�g�a�Q����6�p���Dvs�l�dV0��P8C"��	��*���
�n��]uc��$P2��)M���C|��C`��e�Q�eQAb����a$��)�f���xJ��<�`
���e����FGH((F/[���7YqI7fcA"��f)|?gh��`��8w�l7Jq�"�m�-��a����T���0����/EG��|C�Q�o��T���0����/EG��|C�Q�oD��
�O�~�����+�����*h��yQHTW�H��h����F
n�e!a��%7��6�D6���%
��c�YF�L�zI�G�L��� ��\�q��\=�����B� �h~������v@G1�#���S�&��'�1�@�DPTw����������?s���1����:bAm ��g�z�
#O��x�3C5(n�CtD�3�tv���O@���a:%�9�S.��A���)�1&��|�r*i��=�o�;2�#��Ao	�P��`b���2@;K��e��C!�!z*<��>!����7��az*?���^���x������>!����7��az*?���^���x������>!����7��az*?���^���x������>!����7��az*?��_� ����c�
��x)B@������u2����'6@�����
h��@����`y�Q�`�v
R��e�2��"�$B�f>���`�~O�
EO��CE�%L�L� �C�%'w�"C ���J!�H*�Q0�0�\��3�NB
�t�(-����yB��L�R���(�Yw0@@�F4C2���0�w��)@@	�)X�i���C�TO�p�z 8!�s��c�D
a�;�f�~��G�w����/EG��|C�Q�o��T���0����/EG��|C�Q�o��T���0����/EG��|C�Q�o��T���0����/EG��|C�Q�o��T����������=�oF3"���Ry��=�`Rz�*i�X�H�C
+%U2�� �T.�
���Xai�L�fR5�dXn��*	�x6��&�pb9�`L�bC�t6�@��6f#����0p�#�������L�G�A���`9�{����f�& 3Gp#���?��S�1�f��������a�x8@�(�	��{v%��Y�1��,���>!����7��az*?���^���x������>!����7��az*?���^���x��N�a��1l�4S-�5E&���&���"R�3��1�;p�@}l+��`�aL��X�p�HC	��Qbr��"!�`G�(l�DG��a�Ds���(n�a���7E0�x����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x����y�		}��L��{�)9e
e77w��B�B;���kJH�"���`�!������������ �e1��n�YT�pE)
*g�S3����%L�pDJ>�paX����e���SbS��DD��,�3�D�9R����0
�!F��9�\��E����&W�LSO%#e����C����H�4z�>-�gH=�-=�H`�B�s(�������d��]��n�7D�p���D�p��L���7B������f0�Bn�s,�����s�12���*	��==:�D�YAASd�J�T9"�M��������6�K�0�����60�Qw%L�!Dr�� ��%
JU�NT�)�,�oI�N�.�U0��
���Ch���zj)���n��rH&�*���&b�J�e�n}��00�9�	��)����A�{����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x)0�����n��9)����0EYg����E2��6@P�G�������)���Ear-�����&�25������HBG�6�B��]��"��Md�:��?ND��=�d���6m����Mu��q���a�}l*�Wr�;N6ZF���*�Q��8Q��+�M3�D	�	�G!�!�����QuH�/O��2�*�y^�v$v���9Nd�(�CnB8<!
A���[������JN����U��4��t�2q�4�YCD�/�P)��RAt��G��"F���������]���\Y�����JA����cF�jPME
<% ����n'��\{q����Bz�����``0����W\�
��"�R�����z�������[�jw��I���r@��	�w��Sd!�6����Id=&:f��0�r�K���`S��7�%�L���sCtS7����)����P�����(n�a���7E0�x����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x����y�KUUz�
%MA�#�Z��qNS���M�����)Pl�f�*`�bI{SX����!v
���S��j����1��|��Y�P:�!�D�xi	T�G&�����&�T�������+
"���l���l�2*uv��!�!��L��%�!����VV���O*�P����JF�*$�A�)��As�/"sl���T���sP���Q��p��K8�[�821n�]]����2K����T�
��D����)���`��>��������%�$&)F_���c��*���A���*&(��"P0e����F����1���i'^�Q�ds�B"+(����f���J�L���!��}II~C�P2��S���s0r���(�>R8TE@)H""S��]53lbj��$��iY	
a�M:��2H�����LbD�� n��WN��v���<3;�TP�S�B&c���y�&]�1�.[��1�MS�iY�9V,e"&b�D�E�GHUl����d�L��!�?��+��C�E1��w���G/c<�
���a�����7E0�x����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x����y�|E
�L<�>"���oCtS7��ABm��)�s����-����6���\Tu��n��M��1Z6�fuD[��u3(7s>�
����5�/$uSeQR�����*(9j�f$��������
�{�`8X���2&D�p�a�&P��q4�m�LyP(����#��Q���Z�A�4��mx	��N5�tC��9R���|���y	{����\P�>��"i��Jv��M���4��9�I!��d��\����SR�������{X�P�My'^�*���Br��Q)�����FF������{#L���l�U�
���q+&�����F8����<���d;�1l8s�)��(n�a���7E0�x����y�|E
�L<�>"���oCtS7����)��������$�*;`Y����+v���	n�h�N"IGh��R�����U�x��]����v�*2N�����Q�8Ib��N�N@rt(�{���j��5��W6�j�J:���	�*��F�
�= ��*$Q��r�I"B&'��R@W���4��Ic����t�*8n��F������$*s(U��E��<Y��*��5� �O��N������M������8��l����g!����`8r$�cx
�}�J����������AU����(w�U��;~�p��vE��!�QE���\��pp���{M���m��-E	w��q'���������m �i�'Dzvi��p�a["�R������j����������e��/$�������SM��Q%:wI�4p���f��b����������w5mi
�l�Ly��m)W�H�&�\O�	�f\��Z���gvj��v5K��*J�W�$-���}8�R4
;�6�EL&y��tU;���m�7an��}�����������B��%�S�
���R������`qt��� �i�{�4��S��m!Y�-L\J{O���������~���:������U��b���>8�DP\�A1HD�!���=LVn��Z5����
���w����,�4W�<UOC�#T���T�����9����B�^9�U�^����*�����Fz>u�>�ZYEqQ���#�*���'�ycnY�<!�=�?c��;����9�DAs����P��������������H���SGz���\�-Oj.a
������-�	��v���c��	)���J����]^�t�!
'm({�RZ�#��R�O*Y[���v�D���%C��=�J�C����O��k{b��s�J3Fu-x�j�z:rB�-L��!=2q4�p�:-�x����E8��:u�t��MK���E��V�������o����t�������������g�
P�`AR�P��42�
(��5  tJ�3@�I�@��Q;�P	�q�Q���Y�j��/M��Mq�X�0P�]��f[�ec��E��ii�{���t��f#�3������8��c\U���UE��L�T����UJU���y c�����G	9Z0@��1D��I�'L���u�ut'�c���#�_��p������rj^��.�B)�&����
=�0�����K�'q}
�E����>����7)��T$\0�9,ig`�P���f*d!@�i�������WJ��H�*�������j�SNE)3'��Q�]����B���B
���������?W9�$)*��@w/w1�~�f8����n�Qkg!�}��������qRZ�Ol�w��=(I��2�_�����D���ER�@�|v][�ys*����Z��������wQV�4���%ky�g%���&
�W�S��[��;=���n��qm/���-&jb�];�[��K�{��`n�E�od*Y���.��*6g��R3 �lv�R�����YWV�B-��)��j���.[N���H�5g���!U��d�p��Wx�Q2�"�T����'��=J�}�T��gu�O@�$�4t����j����3�!��UQ�TL����C�
������4}9O<���L�����a"�]�
�g���i'���U���92�|�;����p����k_�������N�JM�Z���dT}WP*KFDI���G���T�Q09�@1��g������Nk�L�7Ov���%i�r����$�����er�Y����aK��@9Bq��f pd�������������q�~��nYAX���V���jt��%S��fC�*R�/UC���L]��*�Z%LQ"�0�][W5&�5�I�D[����.$����@���X�VU������	�����o'�d@W���.)i/�QQ�����ik>M))�`:j+,FW���1WpN��Q(���+�n����mB[(�5����/��mC
���g�6��4;��Z���I�2�9C����c/����
��w��u.}{b��Oc��Y�W%o��Gqmj*�������w?&�m�K���u�w/���5sS�A��j���4�2�-�m��^7�h�Q��"��Q8��	�Gb�#u.%���E���������e���n9�Kh+S�uc�����p7V8����3���8�t� �Br���U'(�D@0(��l��d��V���}�F��@�k[f�4���DI�ZfY��#��;�z)��I��J8�
US��Z��4?1Y�/�z�j~�|�(���d"��(o�%)xD��5[}m+��\�v�N��'�nG?���|�Zd�)�&(f�.���9�,8��������<��}��V��e�k��/v+I��1{�C�V�U�8��G��T7$�-��)�7@���~�����3��J�����j���z����8�'S����7
�<\��n-�6)
T�b�
;���o��*����.�)�o����n^��mu'w�rP�����k����nR0�y�pU C�G_�W�n�.��]�2�\���VT�,��<j��B��d��<���f��Rl��
���D�^��s��h:(8 ��q�V""M�:���)D;�
����[���N�>Y��.�
r!��qN���Y�%-�5DS���8��s*��9P��1N&8��������k{y�
����{G��ktV���2)�V���I���$	����*�����f�e*�-0\N�J�Q/mOX���?v(�]��� �S:Yd�}�X�T�r���!
P������Kk�Y
C�v�C���������A�7NQ��w�d�a��A.���������������Q2�<�FH�6b1ndU�1�'\[��L&0��L"8�P�}��)����,MORT�)P^bfzZ�;8��zb"e9q)Lm��rY}Ph
wI���o!�����G�W�2L��*�D�%�q����9�p�M�	=9��}w�+ft��jn�SZ=�t���������^��tW��6�8�f�.J�5��������M<�zoL��vP������T�����F��RY�����E$�I�$�����Q5�R	�1���=��pfF��V�7J�I�/�q��^�z-���P��W��8O�\�}����a�^��@MVER��i"����XE��S���)��L��U�`� !�L\�N������6��[�r����>���*NZB�oE�T��G���*�)�2%�9C�Su���.��*
�����#CA\��f��<T��$���������W������a�hl&��4�{�x�H]�[X�J���:!�)�PIQ��9%`���<*��x@�n�2�M���9��K�J��]��X�|i��\I"��Y=d���.4�3�V)���C������������v{��B������ \�r��p��J]��t�.E�=���HG6V��cY��P�y�.GqY����B*�A��;Mt���9c������)5[�/J�������[�aw+���G����
���_������o���+OJE��
��Tt���]��ZO��S�s������
GM�n��uD����
B<)��$��!P��VS�����ul��eEF�UG�\x�V�F����)Za���Z�q�1�H�n������u�Ue����S�����R������5Qv�$��s�4�(����I�Ot����b����Vu=GH>�i��F�m.��>�Q���G��5#��0�hu����E#71��Wo�.%dYm
[�����^�[�+�\L��:���zT�J&R��l��D�"e)\����)��h4Snl���v�����v����u�kZ�D�����5�al���I.�|��������=%����z����H:<E���i���
��&Q�*������v���O���~�4�cq�������Q�������)�z)ZJe�Y�
�{"����:������7Tq�����v���Z��
����
�*��i�UE���*�Ho�Q*�]vEC�q>���{��R�/���VkQ�r����Q�0����;�M��
���	��.���3��tD�#�wf�����b�y����86���i���2��y�~��.�U����-n'n���+65EaG?*�%��^���'0�&(�SL��S��]��
��6�eCQ�Y	�����8�3�M�TJ��Z�T�c������F���IS?�Z��l�P���$ ������:��W�b�D�����8w���������[��P�=�;�K�����*m�acPH��jq��9X��B�*���9�Cna�kb����_���U5��2*�5�z���A{yN) �@��8�S9v�*_��P�tt�h'n���T�Ca�C���V�
����QLWyD���n��Z�H�� �=�� 	�Y18��+cCE�EQ���}/���gq��K��1l����p��H:�(c�C�1�"8/�9�v��1���o�;V^�V��-J�R���Q��q�%�����SA���M�
������L������Z��)�~�����)6t�����J1D��(�b��U�G	(B��a�6;\{0i{njR��v�����2�)�����Z��i��H�'�0`U3!M��Sb���������%Eim%���LF:~��k=pV/������+����]��pcN}��=���������9�06�����]����Z���wLd��U8�Dr���W�6�T:^��+�a-���5�*-k�
j��'��
r����g-�h�C�f*��`�MO��R�~��e������Jy�M����>K%��e[$�����lD��2�p&�d�J��t��=�F��3����Xi0r������)��% 
����:M�8&��r�������Az���E{����4�w,�0I�SXE_��S�M�z�N_�U�
��9t�P2
��wV�[�[�{{7�;��~��
�U5L%��B��a��o�^��+c"���)8od���ME�+���3��������%+[]��q���S��B$c����c��.D��������Q����w��MW��S�L�����+ ���*J�� G�5;��L�SB��<i�L��������k�-�AbJ���qP�����(��G^�C	�&�������r�Xz�&��z����ij�z>JV"�s4�Z.��x ;��H�,B�Cdl�2�f�����TMl�w`i`���ji);���Vc1\�P��A���n�K��B(`W�U#��C\�Qhu��Fj�N����B�}9Q��\]��1H�$D����2�Wuc
���&�v>]�Q�������$*
>���kz����3���T��VvX��� �H�T�B&����U����,(����(�i	�s�����k�n�ZL�*�"���ce�eS3&��+tHB&L�N�o�����V����c)	��y�E�
�����������"��
��u}+�cZ!��]��NQ��}x���Z]�jZY�C u\���'-��y"���0�����T�j5���j��T�B��;�J���-�1.�������$h�81d ��r�����<��,���LO��Ue��^R���e�d�i_�M"O��������r��Y������7)��7�
�n����eu}�5i*���Xma���UCt�uL�����bc�� ��������L9C�@!��r���1O2ofL��b!�a����6l�h���tk�
\�jF�������-�mw�G�UijB����8��1$+H��*�'O�P�9��vXjB��i����������,�uV�����\����Z�:�)A����;�&fr�Q)����}�6H�D���z��5K}k�%G����������S�)9Z����`�3:J���A��c�t&��I����������7E[�2+����37F�-"�������dd�M����xV��[n���;K�z��P�\�������@��
��B:~�*6)9)�,������5f{A������Q������"�$�<��b��=]14d��)�C�l�U�H��Bv����c�K����t-p�"5$���$e[+����ET����$����$P�~T����#d�F��%luqk)%j��E�`��������W2q/Eg.�A�1�]����h0��Z��L�R��3���6T�$��	B�nu@�L����"l����7�~��~��� (�M��=���"k~�5{Oi������-��*�U);oW8�5QD�r�K�{�1P�IA@I�"�Z�y�v�������I_�^Y�_���R�;;K[�r����d�C��E%Hef��\��W4}�;+;+]�hI�p�����������e�E'H�n&2=�����?j�x��meU�������v�<=��O��H�m�r��J9Q������"�U��6����k5
%-j)�895)j�M�HHCM��C/!+���J�& ��j��h���W����id4�[jN���%�t������-���!�oO��$�1�|Q*jf%9@���YN���VsX>��^�[�M�Y�~t���(&H��������1�3�HK���EC�D��D�	��� "#�����Dv�c]��7M7{U�����%�VQ���*qE����|�n\���Dr���������}�=V�[������F6���TruD\Uru�3�pQ��Ub+�uL�(���D6��2�[�Z�l������n�����S�`��
�*j�I��"�!�09�b�C]����lEum.E�
G��N3��TU#��4l�CKT���D� Q#R����@�#u��MiN���L���-+k����<eql+�Z�5�H���9(K<IQ(�9A.bb������	[~�I��v������&%-O��������y7����73Ph���Hcog�������>�&�e��>�����J����z�]rQU>9#��hrmswJ�Dkn�:v��^�SI�5���d����V��V"��j
tH?�/��j7@�&�& p�DK���@���E����Yz�����y+PQZ�v�>&����@�zn�U�*�"���R�k_S�zs�2����j�2��5%;sZ��G?B���Y�~��$�S�29o�h������>S:<�����/�Bp�����:$�v�<���{���P�:{�o��/�`���m�*����Z���z
�Zz�����}"��s\�L�
X�X�(��m
����f�$$�1)gm-+E�J$)��3�f���D��XR�7G�}B��4����,�Y����t��WW �TS�kO��*�61��$����(���l�g��7jF����Z���EY�����6��5��3��)��gjfF�*�����p*=m8��j���SZa���~�Q�W&��[�l��uJLU�5:���a%����e�)����$0h����n��-�����%ib�d���m���6yZ��*�lv��4����%�FL��p�;-Y:��t�'z*�JV��{����;A�D�E	e�S�6A9���������&�����L�h���UN����UD�/�{�%���&N_|L��{� �B7Z#K��uU�k����h��q��[oN�Uk�V����z���ht!���X�D��J�b��*X�����DS�i
����}#r�qc[���o��4ue�����@����#�C�e�JV��������{�7[E.�=#o����$jSNMN���-��a�g
���QD�br���+vneX�i����!c%*x�,���n-%�k�J��"b�3]H�V"dUT�Hb���x(tJ"R�@�9��\#�����z���_
!�HhK���@�]U�������� ��j���$�������4��m?�+�a-��)�;P7��������V��Q�b)�Nq6��#���_�Q�EM3fR��	��k�B4u~u	�t���������:��ub����P�j�F���$yE�JP��"h!X��)2���[��~�R
�=ogt�8�ZR4����K3f��(cn�
�)����c�("@-*���]��5TT����m���7R�>����*(��m��,����Y��cS5�������es5H�{V�����$g�+TV���x�D��H��DN`�?W+��[�,�������J�I�N8���kp�;7P�-�u���������vp@���^��{�q4���;j��b�[J�������x"E�F��)��.���p�Z�pT���2�;A�
{�.^����WX��]F��K�e������jf}7M�v�� N�C�\� �e��:�����+�Z�#rc��������"S�S�h2D��H�3\�"a�2��[y����j�D���*�WW������:��n�������j�������O�M2��������V���kyf		o����f*K>1�q���3
V
�L��I�&�/�"}�N'9s�!�(w�|�0�������6��2�����D?�1C��2���o�22�W7sM�Nd�U�J��2u�����d����}������f*$EH��D!r.j���~v���J�����#��=U�<�/��������jY
�E��e$dH�H����MR��0i�Y]�9�R����65i'po}4��B����(�r��8'���/�N�����J���XV���5�t�m���-6��R�V���M�J�F��j�(� r��C 26�cXT
����.%o
vn�0[7g�z��U�H��p259c��r��������"IScO�����=��������/M�Ugnu��6��B�����B$wXr�
�������}��X[�����^k{3^����4�z��R0�NV3�Pl���8��P�����(��x��r�t��v��C�p�=�={�f,���S����w:��%fX$P��F��E����$1��r�6�	���m��w5jT(���c�a�J &/ps�>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j���s����Je�P��=�)�RzC�-�0����C�K$���U��6�T�B����I�@��e0�D��m��>�(�z���nTduk]�T��_,��AQ����2��]UD��wH�HB�G-ni07���?�.������s�&%�9�[x0R�[ZJ(�Bz��In�	���/z��8 ��1����0��h�Q�����A��0pw�~�X��4����BZ�Lb�D�L��PD��Dr��.��)�U�+�{X�17���u�{P��Q�����j��A�FM�s��&�������Nc���I	��tHbL��
������
$PVOwP��������"A!�0��v�C������?����G`l)L2��3�;��{�������6�k36��M��n���!5������j��{A'����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g�(mn�(��.z����S�$����}������o5���h5pGm����}tt��F�RMY���E5��Dv���;�=M�������vNH�A%9R�@v��P�7z������`���Vsz��z�UD�U����3����`S�8-D�VZ(F�)�(Y��u�,�.����#0�(��A�YC*&8��9��>��~i)8n�@o��3��]&d�h���	���f)��aoy�ZsUZ#��*eD�2����>H��*>�����S
���%�b��b'���I�r�5>	���bN4�@D[����93Of���2
����i�a��	���]v�����"����ui$B�C�'(%�){�	C,����V���~�>�J�����A��U�N\�&P������9f<"9�
��V�0�z����a1�;�yf"9���sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"��1����CiL�����]��LC<���WZ�F:Kr��f�%��t�7	8O���@���9��d��������SdMAZ34#S1+"�#u$��L!S���%=%7�mS��d�:J���d��H$�z�d�EXHC	����!�^wUz!�t�B�ww��?p�?(D�,���)@��
�3g�H����������������#��l�#����D�����i�����1��r�Yiahc�G����-��~Kwx60��#a�������pl�2�Y�-A:��k @LDC�� 5;�g�����I�wl��@v����i%R	H�;Dvct���AK�d�5�(���&���ni'g��E��������~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3����i'n_������g���������#%o��������h�@�P�S%�0������TqC�e��,Y��*���W�@Q�	.}���N5u��r'2����VaX�f6[�����J�`�M�@�F<CTzE�/%�C���#��D�P�����x�9#���n}Pj�D�������6JQ���X[w�N`LT9��o��c��y�M��2(�<#��f��;&�j�H�O�N�[���1��l�=--�}S�	���c|l�8�.�94W|��NB�����.En��4��f����L;&��|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<%Y�+�D]
5��Q�j�yS��t���E�D& �U����d����!�1LPM]��P�}��(3����������o�����UDs�
D��c@�9P+�����"�%:I;T��J`*�r@�u^"0���]��("(Q��
�������z���1������������z���1������������z���1������������z���1������������z���1������������z���1��������10�j�I��������{������1�E-k����X�x�����e�vr�P������������HyZ���Vz��&��� �c�p������L�@0����rD����4���.��v{�6��v9
\
����������N��w7D��d\�@=��<��L�B��D���Q�Ds���g��4���L���
j�����Dw�h��t��m����������~*5=���h�XR�5['�\)^KIQ�*V��H
��bT����P/��lP�T�����������?#��2�dq�
Z�0?�Q}[~��D�����1����La�V&0o�w�-��r����_������{""&�GW��n�5x����Q���K���(���$�=X4�L����HD�.�&B��2)@�1�]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#�<���Cz�K�tI��th(]�.�	N�����mZ��X�����]����Sh�������t��MZ�
���u�	]�����n��DxG1�Hv��P��ShgW��7(>������9pe����`p8~M�MZ�,m�TN�'F3e@���m� 0�
j��s�cn�����/��=V�A�����s7@�J8Na� ��!�,��c}Z��~��](p
�)G{2�����
V��)���������J�C"�@/�>�b"$GW����hsW�S������of������L� 	�3��0�C �pm�q�]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��
�
r����gV�z2������j0�]��p������c�5��C��hwW��&�I��x�l��/g�-[�#����}Z����T��/��L���;��������j�m��?�oW\��EL�&c~F����!�M��`L
ue�s0��uvq7	��*Q�9�Dgs,�����2f��C$cw�3�FCxJ?c`d�+}[�A ��kr(��@�j<r��2
��A�07���������E3��=#�p1�!��0�q���c�2r�����*QD��s��Q��"b�f���2��Ja�JM
��2�TW�N��6|;Gn[0Sz6��9�����
c�Q����f���+]Zn�b�0
��J�&]���?#�J]�|#����V��(fcd��f��;�DDG����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#�'��� f��n�ba(�Gf c�����9>K��a�\�|�d	���p"�!��c��j�
!���J!���Q�e����wZj�a@��[V���01����@�u����G��cW""P1������j�G3���j���A��
���z6��7wDB��(b"c	IFf=���)
�Vy2
�
j��������ue�����{�V_A�]����ue�����{�V_A�]����ue�����{�V_A�]����ue�����(g�3�tr��5t�)�!5�x����%X�%R���%]��}���H�E��]4��f"�u/JhNU=��"�g6���x=��}��3��i�����f�t\�qB��[����Wc�y�����"c3b"=�CLz{(dP�e��@P��gp6c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,��1i��3nC�n6i�O��n?tcq�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f3�fM>}��^�e�L���O�{m�Y���d�����[m�{�f���O�=�/m������&���{o�Y��&�?B����6]>��-��f>lz{��o�����`{.�,���A�zw{���X0�Vn���fc/�d����Y�n#�c�f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>l�|�e���f>l�|��o��|�4��V^�c��������,���O��{m�Y����B������&�?j��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O��{m�Y��&�?B�����.�n�[o��g���|�_����~�|��&�?n�[��|�4��������i�~�����������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|��������-=o��^����G����T�2oV�t�d"H"S����;��M���������{��������$�����DGhn�b9��9����<�}��q����������������������������������������������������������������������������������������������������������������������������������4�X��8���qc�����S���S���S���S���D���D����qc���c���c���c���c���c���c���c���c���c���c���c���c���c���c���c���c���`s��� O��w�
�������D��c���#�����qc��i8���qc��j|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X�h�X�h�X�1�����ch�#���f?���Y��� �����qc���c���c���c���c���c���c���c���c#	M�K�xH9{r�za(ool�t�3����d�f#�b9��������
FK Benchmark.jpgimage/jpeg; name="FK Benchmark.jpg"Download
����0ExifMM*#���(1�2��i� 
��'
��'Adobe Photoshop CS6 (Windows)2017:07:27 02:24:47�0221��	^�nv(~�HH����Adobe_CM��Adobed����			



��W�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE��t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw�������?�T�I%)$�IJQ{���Hh&:'$I0%C��c�d�XwIM!�j�(��k���Kw���G��o��w�::�=�gc,�>[�����^������^L� �O�JhU�q������X
{-62����=���i�Z���a����L�xn��o�6�W�������"cP�%9�u��U�e���������������b_�)�i���kv� ���s��n���������:Jh7����o�pu��X5��I����1Y��nV5y
k�,�����/c��FP}�V@{��d���<��i(���;�I%)$�IJI$�S���Uc����N����7��T�X�c���������lzE���n ����������?��Kq���zh>����qIJ>�Z���>�!��#��������?�����J_q���z[������A�?�����J_q���zg��apc�D{���Nk�&���*Ye����=�����������N��IIC�`��������?�37ll��������%+q���z���lz����pi�����#��jP���%0����J�\��
������?�(�����?�}��IJ�t����f_S�N��1i��X�����C�G���^�zr.��������\t��n�
������m�=����mlk�S�Y��R�x@=?��Td�>��{�:���/u52�Y��]n���S�����������
������n���03��T�$��:���4����?��H:������o�h�Y ���8���rJI
��}���P��g����#����IH��}���JT7�Y���)Cu��b���g���%#����I)P��g����
��}���R?y�w�d���g���$�9N-�ea�����Gbus��X}��S,��a[���mh!��?H6!VE�/����j�M����*����m��7����<���)L����`~w�S������L��o��������%-�?����/����#���$�	n�I�R�����G�����?��w�O������%1&�	.�5'q��	.}��%�x�������e<l->���KG�o?�?����T�����wi?�����P���H������s�C�����
����k���F���:��@�7:�d������
���@�	 	<���O�`��n�O�v�z2�y��X��
��������)R|O�������?����1k��}���M��:���	t4I���}���i������O�(��K�E�
���g�v�n����=�{�}�O��4�r�M�2���i]G���e�Og��!30}�_s�	<��M�W��V8el�n&� Ecpo�����(�D��)����;F��R9���=��C�L�����?o�e���2�C�C��f7�����������Ck�5�|6mw�%6�c`���?��}��-�������� �l��CT����C'�kD��~���d��)j����}�{�G��q�yu�����r�0�h[k����{���j���G����m�c���K��Av���mkA�����<%���7�sX7~��������P��s�i��eN���7�?��z�c��M��G���$4��6��}4z�������N�6�����b��
��{E�������M��C�������u��n]��,;����m���B�o����� @
$�#�7�����T�I%4��l�v�VD��c5���k��c�5���U[Z������bv����o����n������>��n��m��T2�i����yX�n�������f9��v������}:�}�.h,�X�0�������j���u�����k�
������Sxf���I��O��+�?�K/!�0Yml}CW�\���z���c������i����
�_��!Z���-���I%6*�Y�2���z�Y[�[��^��s�������n������R��<���������n�ip���\����i���������������iq���k����k����F�s7���v���O��T.�S[�wN ����y�rJt�����e�w��1��4��p�rfe9�x.����n���~��X�M~������p��?��,&:���K�������rJv��}o,s���9�O�.�����}�VlcH��=��$y?��.v[�]�7d�X��[Qj��'�I�$��v��Jm�H������:��c���������P�l�:�zO<�!�i���f!u��8���������N�@�����;w��������I$�����T���$�����[�{���Be�ii�6��P���~���.�}@�Xs�����-|��J~����v����;�������� 4i0�����_5�����O�# ��PF���GH1�n�[����#�N�ZG�y��%�RI)�B���<:�l��\����;b�8��VI%?PgU�c2KA��qf��������e��m�R���8���};W�)$���zJf ����5�����l�������&����\��9�?�?�/�IO��t�����t6$����7j�8])�5��l���������mI%?H?���V��Q�cw�z������V-mx�, �v���/��IO�I/�RIO�����Photoshop 3.08BIMvZ%G=(bFBMD01000a820d0000663f0000e6840000968700001f8a0000f4e20000bc2f0100204901009450010006580100edbe01008BIM%b���:�RNv������8BIM:�printOutputPstSboolInteenumInteClrmprintSixteenBitboolprinterNameTEXTprintProofSetupObjcProof Setup
proofSetupBltnenumbuiltinProof	proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd  doub@o�Grn doub@o�Bl  doub@o�BrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R
vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlongcropRectLeftlong
cropRectRightlongcropRectToplong8BIM�HH8BIM&?�8BIM
8BIM8BIM�	8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM8BIM8BIM0
8BIM-8BIM@@8BIM8BIM�	^'20427083_10157093190012228_2139797675_o	^nullboundsObjcRct1Top longLeftlongBtomlongRghtlong	^slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenumESliceOrigin
autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong	^urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT	horzAlignenumESliceHorzAligndefault	vertAlignenumESliceVertAligndefaultbgColorTypeenumESliceBGColorTypeNone	topOutsetlong
leftOutsetlongbottomOutsetlongrightOutsetlong8BIM(?�8BIM8BIM��W�� �����Adobe_CM��Adobed����			



��W�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE��t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw�������?�T�I%)$�IJQ{���Hh&:'$I0%C��c�d�XwIM!�j�(��k���Kw���G��o��w�::�=�gc,�>[�����^������^L� �O�JhU�q������X
{-62����=���i�Z���a����L�xn��o�6�W�������"cP�%9�u��U�e���������������b_�)�i���kv� ���s��n���������:Jh7����o�pu��X5��I����1Y��nV5y
k�,�����/c��FP}�V@{��d���<��i(���;�I%)$�IJI$�S���Uc����N����7��T�X�c���������lzE���n ����������?��Kq���zh>����qIJ>�Z���>�!��#��������?�����J_q���z[������A�?�����J_q���zg��apc�D{���Nk�&���*Ye����=�����������N��IIC�`��������?�37ll��������%+q���z���lz����pi�����#��jP���%0����J�\��
������?�(�����?�}��IJ�t����f_S�N��1i��X�����C�G���^�zr.��������\t��n�
������m�=����mlk�S�Y��R�x@=?��Td�>��{�:���/u52�Y��]n���S�����������
������n���03��T�$��:���4����?��H:������o�h�Y ���8���rJI
��}���P��g����#����IH��}���JT7�Y���)Cu��b���g���%#����I)P��g����
��}���R?y�w�d���g���$�9N-�ea�����Gbus��X}��S,��a[���mh!��?H6!VE�/����j�M����*����m��7����<���)L����`~w�S������L��o��������%-�?����/����#���$�	n�I�R�����G�����?��w�O������%1&�	.�5'q��	.}��%�x�������e<l->���KG�o?�?����T�����wi?�����P���H������s�C�����
����k���F���:��@�7:�d������
���@�	 	<���O�`��n�O�v�z2�y��X��
��������)R|O�������?����1k��}���M��:���	t4I���}���i������O�(��K�E�
���g�v�n����=�{�}�O��4�r�M�2���i]G���e�Og��!30}�_s�	<��M�W��V8el�n&� Ecpo�����(�D��)����;F��R9���=��C�L�����?o�e���2�C�C��f7�����������Ck�5�|6mw�%6�c`���?��}��-�������� �l��CT����C'�kD��~���d��)j����}�{�G��q�yu�����r�0�h[k����{���j���G����m�c���K��Av���mkA�����<%���7�sX7~��������P��s�i��eN���7�?��z�c��M��G���$4��6��}4z�������N�6�����b��
��{E�������M��C�������u��n]��,;����m���B�o����� @
$�#�7�����T�I%4��l�v�VD��c5���k��c�5���U[Z������bv����o����n������>��n��m��T2�i����yX�n�������f9��v������}:�}�.h,�X�0�������j���u�����k�
������Sxf���I��O��+�?�K/!�0Yml}CW�\���z���c������i����
�_��!Z���-���I%6*�Y�2���z�Y[�[��^��s�������n������R��<���������n�ip���\����i���������������iq���k����k����F�s7���v���O��T.�S[�wN ����y�rJt�����e�w��1��4��p�rfe9�x.����n���~��X�M~������p��?��,&:���K�������rJv��}o,s���9�O�.�����}�VlcH��=��$y?��.v[�]�7d�X��[Qj��'�I�$��v��Jm�H������:��c���������P�l�:�zO<�!�i���f!u��8���������N�@�����;w��������I$�����T���$�����[�{���Be�ii�6��P���~���.�}@�Xs�����-|��J~����v����;�������� 4i0�����_5�����O�# ��PF���GH1�n�[����#�N�ZG�y��%�RI)�B���<:�l��\����;b�8��VI%?PgU�c2KA��qf��������e��m�R���8���};W�)$���zJf ����5�����l�������&����\��9�?�?�/�IO��t�����t6$����7j�8])�5��l���������mI%?H?���V��Q�cw�z������V-mx�, �v���/��IO�I/�RIO��8BIM!UAdobe PhotoshopAdobe Photoshop CS68BIM�maniIRFR8BIMAnDs�nullAFStlongFrInVlLsObjcnullFrIDlong&K�sFrGAdoub@>FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong&K�sLCntlong8BIMRoll8BIM�mfri8BIM��mhttp://ns.adobe.com/xap/1.0/<?xpacket begin="���" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" photoshop:LegacyIPTCDigest="DDDBF0810BDBE8CDD612F0EF2AF344C1" photoshop:Instructions="FBMD01000a820d0000663f0000e6840000968700001f8a0000f4e20000bc2f0100204901009450010006580100edbe0100" photoshop:ColorMode="3" photoshop:ICCProfile="sRGB IEC61966-2-1 black scaled" xmpMM:DocumentID="CE65CD01C083411533DF6131F0CC82EE" xmpMM:InstanceID="xmp.iid:62AEED856072E711AE6FEA541452C699" xmpMM:OriginalDocumentID="CE65CD01C083411533DF6131F0CC82EE" dc:format="image/jpeg" xmp:CreateDate="2017-07-26T23:45:03+02:00" xmp:ModifyDate="2017-07-27T02:24:47+02:00" xmp:MetadataDate="2017-07-27T02:24:47+02:00"> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:61AEED856072E711AE6FEA541452C699" stEvt:when="2017-07-27T02:24:47+02:00" stEvt:softwareAgent="Adobe Photoshop CS6 (Windows)" stEvt:changed="/"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:62AEED856072E711AE6FEA541452C699" stEvt:when="2017-07-27T02:24:47+02:00" stEvt:softwareAgent="Adobe Photoshop CS6 (Windows)" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> </rdf:Description> </rdf:RDF> </x:xmpmeta>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 <?xpacket end="w"?>���ICC_PROFILE�mntrRGB XYZ �$acsp���-)�=���U�xB����9
descDybXYZ�bTRC�dmdd	��gXYZ
hgTRC�lumi
|meas
�$bkpt
�rXYZ
�rTRC�tech
�vued
��wtptpcprt�7chad�,descsRGB IEC61966-2-1 black scaledXYZ $����curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#���G���
�k���0�����W��������G����r���;����i���3�����d���0�����c���1�����f���6����n���?����z���M��� �����_���4���
�u���L���$�����h���B��������d���@��������i���G���&����v���V���8��������n���R���7�������u���\���D���-�������u���`���K���8���%�������y���h���Y���J���;���.���!������
�����z���p���g���_���X���Q���K���F���A���=���:���8���6���5���5���6���7���9���<���?���D���I���N���U���\���d���l���v��������������)���6���D���S���c���s�����
������2���F���[���p��������(���@���X���r��������4���P���m��������8���W���w����)���K���m��desc.IEC 61966-2-1 Default RGB Colour Space - sRGBXYZ b����XYZ PmeasXYZ 3�XYZ o�8��sig CRT desc-Reference Viewing Condition in IEC 61966-2-1XYZ ���-textCopyright International Color Consortium, 2009sf32D����&�������������u��!Adobed@�����	^��g	
		`
0@ Pp!1789"2#:�A3$46��%5&���B'(		!1���7	A"2���6Q��45�8�0@aq�B#3�� `�r���vx9P��R�$�Fw��p�b��C%�
�Ss&y�c�T�u'(�����DtEe���:���d���VGHh!1AQaq��"2@`��B3����# Pp�Rb$450�rC���S�%�cs����DT6������d�t�EU�����8�����4J�:�Hv�8���:��9�P����@{�Q��	��y`e^�[T�%Y�y���0^?K�QL-��������q���`K`�4~�� D�2,`�fj@�������O����������?C�
s$���3"��+���6�;�&�?*��80Y?H���0�=���p�S4�����?0b��21�1�2$"m�&��������Yp��G��g�z0bJ�%3# ����T�S?�rA��2�/�`TQ�����)|2����Y��!A�0z������mr+��!L+K�0�&���H�,`z^Xy��0|?+3�L?(#�z!I�������
2�192�.�~O��X~UG��a�N�"P�|���������f�����[O�8�J����7N`Z����<��O�t���f]�
������-�Z(�T�G�L~}�����)qR�G�<[t���X�L�����,�f�h�g��Z���W�����:�$y�$��v?OS��?Rb��01�/�K�S>�"�{`�&e��G��e�\�������������������Y�fc���h�Y��h�9L@��dX�M�������{?-�-3����Q�1^Dg<���4���O�d��������K��Y����f�~h%������FJd0�2 1�2P�O�x���a�fb~��:*����)�4J2{�����~���~�'�6ghX|��0 ��=��Z��,Z��H����P��Q���)��9�Qbc?��,��_1�?Y��?NS"h�~U���S���?I�������X�����~�d�+?3#�!�n���L�������{�(�� ��h0?`P@�'Z,�e._������
�������L5�d�����u��L�������%=����?I��?R���2�,(Js%��jF D�#�A�����j��e���b$�:b�$�+A@
�D�?7��#'J>weE���!:r�<���J:~y��*��pW��U��*QCJ�z���)��Yx������`�=�<1o2�eB#i!���D�<�n��G�#'J>wg�}�#�$��JR��y�lxr�|���DR]���2�.�P��4Bp�Z����0��GlFB�����"�(� �GeT�y}�J�L���-VCc�2�1�!a��dD31�*���0�2�0�.�P2�����P2���c���d1�%���}���QI`[���C^����1>�@�����@����������L����b�p�U�:������%��vQbQ�>,8I#" `�K�!���i�hB�������a.
^4��:+�h/.��N�\�Ee@jhjhj��y���l7[��h|�[x����t������9��}��CM��$�;5��G�m��t��3�b�|���9[������n�up�Ky�������k2�������g������`�r����a�_&�?�r��������q7I����s=�E��[���7���LF��e�4`dN;�z?=�8n�V��p��u�\��W��|:�!�����<Y%�����G6V�n�y=���a��M*
iX3��<uS����\d�n��>��w�����NG��T����Beq|\��u�y��W����z>v���.]�<`<�O
�y�m�[0�w���y�������}0r���K��a�)�U���>s�]W�����_`h��x(���>�J:���[��������~�m����O�P�����;�Y�b���l��@����1g��zP�y��Y������@�q�������qR�/W���;5�>{x��-�=G��l,=|�:;|�O&8��s����������X+&�����(a�`
]wy�����������]�����uo���W��7�G�T��/�����_=�1�}�{�9�\g_Pc=r����S���
I��P���g�g����������i!������F���/O4�<�Kk��}8$*%�`�X+&��h�{=%2TkmS��99)4v�1���c����2[����,��U�'�W�����j�
\��S'���^�X+&�����j��V�^�u��#�?�x~����9�f�hc����hk���V~bf���K�nJ�������b��=l7�����q�Z'�D]:_
�|�,��<WiD��f�3�r��w����l,�������`�lNn����"�+�}	��8!Y5-��14��������&�d���Xj��]%q���k_'�����_u���p'�����~qC�z��v|']�t;,���S��?��S6o����(�,��}"�^Y����VzIO�s�3���?_�M_��������>�u*S~vg.����3xH�����r��6�������B�jF}~l[5��M���4���n������c�����Yw��u���V+���o�����sb�1���|7SuZ������o�>�N���N�v����JVX+&�
n����$o�>��G�*����!Y5D������ym��o�L���@�E�e����VM@�����B�"}�����<�O��)&��;������o�@Z���������_z�=-C`'���S@�65������~6�?yX�@�8�RM`�NZ:uC�?H,�no7P��;���2&R]�-)�'�R����o��^���-�����i����f:s��X7����!}�r����&� +&�c?���y/|Y���Tx�������#��2s��:?��L�_":
��31p#����|��S�W�|a�B�j#�c�����&�?.}Pl���C�kX��O��-��&S{��p
�������o�����*XB�k��kY;�����W�����|Q�@
��_�8�c|g�O�i<yN
�?'�%�x�!I5�g�o�~��~����Uq���@�d�����>�:B�>;��b�z���I
I�|��a�<C��E������S�[@�d����.��_��)p�1�2k&8�����[��'����=��]��`VM@H:r��I|���>�S��������>L�"�u|v�����S�JH�C��_�?P��������!Y5����.��:}Y�����WK���:��zd0�m�ZS3?e�j�-�"�m�D�C����B�>\��>��P��q��/����2�HZt������*����,#�o�t���_��>G�9t�-��}3����m\:~9��M }���S�k�xG���*Tp,�F�o�t�X(��E��/���S�����8S���<������l���^J3���4������}��Yxr����"�?���
I�3������W��~h��P�i���!Y5�eblG�/��|���
W��{m���&���vW�i��RM`������y�������}#���P7����x���.3�
||��+�zO���MPCi�b }��}!I5�t�&�?7��z����
��m�1��?����/�\�9�i�q�\�����.�><��`�������.%�O�0�/��_Dx��?���_�9�
��C?G�X}��sx��>��������zw�Z���8+��h����7�������g��3X�%t��:�^U�e���z�/�1/���d�1��#�<��A����2�Q\#��i%)������^lRM`,
�w��~�d+��B�j��zx�}u�F�}��R~�</����_��1y21=�@�$����l�����N�tt>H
���G|�3���f/�z@X����g�|����S���	E����XXO����~�d5�?�P�P4�i�M����lo�@����?�]����cFB����$������u��N��p�gW��P#wg�[O�<Z��2}<����y���
�o�|��


�bN_x�Y�p���+��������z�?Ml
-��o}c���c.anI�������T���E��-M�}!$���=�` S���4��+���X����4��g�'�M]=9������No�����i��5=��ieq������l��&������%	�jh��,5�O������0E�~��{����#��)0��@*���H�bw�+=Tn���MOINbD�Jm-1�^I~[���a�O5���I�q`�n]����4v���\M��� V���U�~z|yG��,_��\������n���l��/�5�	*��x����}�����K�>��y���P�G�?d�������{��-��{��;��@�EM<A��G��+��K�:���9��'�����=o�-)�r��������d������>����(�h�=^c��@>���k~�������[/�P�0|���?>��(.�[��1��!a"����B������$����7�_(�����?��DVM@,���w����Z�>�9m���z�aRH����1��l��{�+sS��/vO�#�2l1�=q�	�_
�e�<�NJ�:DF%I�����!G{�c��}O�/�T]�@�d�5�cu�_��'|c��]�����y
zg���bNb���*�yS�!��fu��P��60��`R�G�.�X�s�


�Xt�1g��`�7X>Dx�����U�}�p��������wsN�^��Y{�����G�H�N �;P�>��4;�;0%e�e�>��3�{���t�_v��&YEO����*G�2T��v�Hr`o+��B�jo~���#o�~��1��O������=�P$S�� ���;�y�����"��V�l���,������J���?����o!Y5)��%����s!����5�2����/��n�� ���������Y������a�������$��8�������}�d����k�@VM@�M���|'�dO��m��+���e�����!5�:zBm�6���L�`��a������;��/Z(�&P����L���$�Y��|�|��9�?i�!Y5�������2M���A�K����r!����kh����������.TXh����(b0^L�����X���e�����������A�T�L�8���u�q��{y|��3����8pd���za���.jB��o3B����S@C�L����7l���QlN7���-�K��3��,�L��)A$V�����	.u+1g��G	l��G!����v��RM`-}��gh/��+����(�������������"�4��4jh|�����������yvr����{�m�@!_NP��ra����a���d�kLL}�2��4}r���@!Y51������$dW�����^y������*v������E��R[l�0����V��#����-�g�I/=�_���z�/�r���?���$��B�j\�K����~�,�@��]��9�j��w��hQ#V���@[K����R@+��foo)�4e$>�t����C�y[�|�����_�@
ONjB�j����/�2V���}���>���~6�n���#,c��/?��Z��XO�.�0��<�@��g�'���������_�l��<;��XB�j�=�o?^���|�����or�k��G��W�n8?��u#�������������L)&�9����/����o�����1�����~L������?�}��o�|_��k����/�|��.|�G{�z�!I5��7�����\�x�(���@�d��>�:_a�q���g�[����}W�HiN()�;���.7�GX/w��M<��T<yNJ�)&�,w�^sN�`�� ��� +&�ZW��~���Y%|���
�}+}C� �~*���D�;���~�u�����5�����f�*�e���e�����	S6�@����/��d��o���������o�}.]
�u%��Hj�m,z�>�;\��!����Fz&����3���8^���n�;��&���N���^A]W������B�j(gQ��W�����T.;��c��e�����-o3�GF���O��#��H\�{�}��<�%v8q]n�����������l�0���+�1���|x�ib��-�n�Q�S�j"-���@>�[��{o������}����|U�[@G=�������^|�H�0�8�'�W�M'~I���@���X�y+y7�\�|��w~#�my�w���r1�����
MW[a��>+������^o��������/���G2Q�#���[�<�}���p�����.���As����RM`�w=�DW%*���Sz������Yu���M@-��>)�5eb��������c����'�qb�d�w�`Z[��]|�+c�����c��T@�%u�X#�M���^�.���ci�o������B�]���'j���"��sbq�������)%���7���/��_S4=�H�����g�]��;���x�
��)L�6�A����%�#��s�,��cK����G�������mc�9�M���_z���>���	�x>-\�"G_��w�����Rq����Y���5P�d�"���8��w��M�?��u��6��<m�u��>������Q���F?�]�p�����\N��5'?��<��J�5
�����c��iy�>�����h>�j�y?�\[��P�&����u��My6J_��?z�������r���.U����>��i����#�c�G�hSNk����.��:�=�s'�c��Y|������]�z�Kh����ay�b�+����S�^1�<�}��������uY� M���*�g�o�p/~���w�A�]M���~�����O_�x��U�!I5�-������]�-���M���M��^������zo
�S+&����0����z'���������/���Wu8���o���u�G�yH�x�~d�?.*o��o�['�;x>C�;�!I5�
#�{^^�;��K���?��V�v~mp�<�����C��Co����VM@�����!O}�@���W��Pmn���<��;��������KI�5���avc������5��������.=jB\���k�6@�X�.*
��@ym����;��57����-~rv�KY�9_��`�����*����`��kpt�75{m�[���O�����#��W�j��ma���s�JzF����	o�[�K��~���:+����4S���CI���������w+D�����3�I e���� =J�������]���*]�J�R��������hl\5���<����C����O-\�%�5&����{]�8���ps��8��2���%_���I+�������5��i[x���Z������l��-]V\=&l^c&O5L�7:l{}f
���IfO<���������������Wg����Qx'���JI�8�/���r�~��C.�:�&��nR��V�*�m��8�^
d�U�����7,���2���t��tVou8�z|{]F-������Qn��}>K������o�s����%�nG��W������}�z�
2��h�_���6�����w��7����a���������~�y���7�8y=^o�b�P�P�F�Z���.)�4���P���v������4�E�+���/*hp��[m[h�~]�i��
�[�(4��%u�wR���j�)M��)Mk]�+�����4��n-���u���d��lt���������m�knq�oq`�������~��]�1��}�pvw�������������?w~��T�jhJ��hm��Z
��t_�f{�-���>�!)�~�k�P
*U@.�t�
iZj��(
T��m@R��[i�B��+���
=Z�ZS��)�}G~(x����`��pWpe��>��r�'��4f�8r=�=7����|��%�O+9����o����S70F�d}Q�����}��>\�
���>��y�7���?3$�����0�.`Y[�f��V
��mG�-y)�:9`����u����djY�&�T�;��BCZ��e��[�����u.w��l��k2������-1��	����N��Z��R@�ss� ��������,���������Y.��<<�������Q�L����o��DH����S��2�������:�m1	��=M��,�������:��T�f�7k���1���r��r=M�}+�g6�����QNrz�=�!��z��0@y]
�f�����J���b2�P�<���pd���~��������Z&��nO��DCI�j�ZY�|��D���;����4F��"���1 �F�5uOa���3s
3��V1f��p�\��
	��u�8��L�!��Y�_?���J�s����� �BK���$����w������P<kl�Y�w5h������q��x�����Hm�49��%���ro�HG�cC��������t��,Z�m���k~�����H@��w���@���@����X���X�����>�|�����#C����!������X>C�6��|��j|�����
���y�|g�����X�hs!��)�SO{`���@[���T�@G��+���%G�#�)�W���p?V��$�!AJy��� e���K���;/F��e)2� ��[����HV����2*�j�j�+Yw�~|D%��^
�dL#�������&K����i�@�u�Y^���RF8De9L�Ly��]p������Iu�z��-�A2�'�.�a�e�bd�Z�����L�B��1W.�F���^�������0/:ft����,�gjcy2e��<��bO��d�%��T�Lf�b���,�������P�f# ������s�j� ���)�9����LU���Y�80�3+��
Ld Xh���O��8�������T2�:��unu��}@�>��C�;�:�����7'���O���
��+��	(Y�P
S@
��J�j��J���gnn6�����SCy�o�~�������5��'�=��o4(��`�Nr��IP�
�WB��H�jl9
@�9M� ;���a��F�G�M���or�F��CSh9M@�)����7���L>�(�POPjo#�]��I�q���1a-�]���#)�K��4�#�\�a�s#�:�E����
�H�����@K���Q���K���.pxR�l�?�a$�m��/R^D���o����-�S�'y
�^��E
->d�[���#�K��720�.<}��0_��T���"�rb,�X�<�<���-lx�!R�&����H�0�e~!I;�� T����|Z�E���������p�S�D*&������(!v����H�Ocpn�����A��Ay���<����������>$@)�6K{��/�`�\\�_#��1��M�L��P_��d�D�>#��4���[�����`R�4�� -&K������d\r���".�Vr:���$�8�rP���F
�S���-�V�_��h|&?��dQR���.*}����j}�O#���3"�&�xp3~t�)�v��
�3��8�c��p��1�hm9
����hjo9�a�`����6&Ao���&��>z�X������%�`K�>"-2�?=���U:bX����S��8�51�jq���>�i����
��#�����q����1�m6���Cq��7��Y���J�D��=iFK��L�ykC�L���&����$��!r����y�����"���P��ld�n@
Sq��q��y�}G447��D
�uE���d��=��hB���47��P�������T�Q����E#.�X���=��������J�J2�G�d.Z�M8(Js�.�rQ2��)I4	�B�h�������ng*YP�Xd��1+��@�%.^}�nMLa�����AP���,�>t������XN����/�{���0+�/KW��j�yC�����>��G p,�Lb�h��3&9��	u���>�p i��S�"	�r�[������	zr�&C� 0h�=��m7�F�����CCq���
����n7��1a%ih����������u�����E|2�9h����2C0�%�X��c
�[����#�{B��00q��u�~
N3��5�Phs� jhm�i���o8�cq��D�<�E��6�N]T�e��������9�j#�m�-�|��.�[�V[������K��Lx�����H����u�d=�ts�m8�cP8MM��d�"L�uB�e:"	�Q(�qN�"I`���a"q|"���4S�J��9�h
��Y����m6��
MM��i��7�M��f�Pq�������j3y��P��q���i��m9�����9@��	MMA��m7��
�7f�PSC@h


���S@�7�5���q��S`5���y,�@�q�y(1	���+]t<���g����[Z��.bw���
��bF�����L]%������Fh�y��^���|�������Y��M6@7D����OR���*�z������MP��>"����u"S���a�@[)�nb��E5�s�������h(���x���n};*����1
�y���gM��sc
�y���-A��>�;��=� a��4c�:�\�2V�n�_]y��f��e�5R�����5��:6�
���O������[An_��F{^~j��a��z�v�]e��`�
V����Qo���S�Vu�~������>+j����t�}���
��ZOvO����?e�eMmI5#O����/�	��\ ��D�7j�-�2X��e���n
s��}�fc��������SQY�+m�y���R�Y�k
��������C�C�"�����3��}�M]fB�����j�r�������l��X�K��e�T�-����f�m.�HcP-�C�@��uE��������r;���6Z����q�o���=|�����d\,�`e-���Lku=<D���#�~����qMZ�f}@i�X���&����������[�����T�����"�d�7�jr.�U()������v��46y�"�x���g'����M��/�p(��2��64��T��$�f.lq�35d��Yk����K��zV�m�
rn������tXr�Xj�+�)����!�����!M@���5���r�1������[����KOv;�i��G�����F@���n������o6�t�_�M���s������~������[��������
ny�3a��p�Y�&����<Z2Zb���w��_.��Ogz��Zm������_�%�8�����_6�9��5�����n:Us����Sk[u����V����S��9��0��D�#B��5k�N��?N�8���1J9����0�g[W(�v~���Y�K ����v63m��h?3�dd�6z|vXrV�;oZ�|�+��
��
��63��CW%*]�f`>C�O���f[D�5
�������iT�,w(���=)ln������d_����irS(�[X#bi��7c1��}BOu�eV����!�q�M�	�V����b��oG�6&j����VR��/��<���������� q�1wCPzcu��f�	�7%k^c���;�{����FW�l������3X.	�`�n�L�r�9Eg��e@:�Z��k������#�.���`d��7��o�d�+��!��%O8[��0�@6Y^+��\_niUM�]���[��w04"o(�d�m����iV�0�}��otu�����#��m��u��t>_��c�}�q�s����OBB�sP4���o#��u��'2x���m���@�S��8��G!��k�q�f�~\�6�W��o��k����x�9k�u���[�{L���w��2��bo�@>|�������iux�Y�u�����;�Uc������������9��' 

�������������Sf��VC�i�{y~�Ywg����1<f�.��_LF��kz�;z���&�6L����6�O�g=r����f��.���b�l�Q����@}�d����=�D
�xS�+���RMM��J?���E�'2����2�U�������n�]b�i��?3��\} ��Q2J>XYtT��L���
�������hR� ��J:#����=����
��K'���bf�C�1���l�c�6�?.j���Z2^�6;����+�\��)5�V�RB�n����[ ���]Z�e��w$Y��!��Jc�d,b�A��m.�],����Ag��������'b{�Im1�5��&�|zob�|D���g��p!%�����p�=��~���e�v��G~_���m�M�(_S���gV�vW@������j�/�b�xbR�����HZGs_�F�7\r�b���4e����.v����cc3!vT��s��v;n��>��.O(^X1��B��j&�������m�=[�I{{u����]����[8�F�9�Ar���+i��|�&�m�{n<�S>�����9�>�c[��\���6��_n��M��,o��������y)]�W~����{�����ZO���>PR�h����� ������j����-�W�����<� �iKm����/c�wS�����]��BR������j�:
Gj��9n���u6�>miS���ss�����Rz���n�hFI}����"
/��vk�f������-�iw2C�
�m�=!����o��v+8�Hr�Al����U���n�l����x�M�5����kgv���owl��d>�5�]`�_n���6M�q�P�;��������o�l&�[
�BB��������9N0n�v����zx�61����t��#Xs��e!��p�\Z�g���%������;]g6��qP���cC?�nYX�-���u]�6NMlZ_p��eY76���J�Y�����'OG��ef7������<w�dg������#��+���5n��pi���f����w��<t�����fju	�q������q�[�Wo��iLH���K�SV���=]���9o�jhj�jj�%�i#!3�h	L��r����OC���s���[ ���72]'7��nx����V��co5�u�����}���,��+��<MN������x��-�23Sr+H���*f�mF����]w5�����K9��x���)����5-A��R����m���|_I3g! ���B�Y~��;�h�u#�?�����w�zw�]]��c��qKqs]���:�<'Q�����A���}|�%��&l����i�W�y
m�������d��'�2�1,!p���_��qkS���E9���v:��3���������)-L���ku
�]H52����G������"���D�
8y^����#]a��W&=6�w��W���b|Z����k7���9��?N���j�)��BPR`�|����j[�O7�������������q��k�b�r_v���~���[�����GM�/����Hn�}MBK-
�kK��N�y[�����lV(lh��jz��.��u�:�����od��#�Z��N�� ����
���x���[m�6{m�_�W5
���Q��c��<����
JZ����M�_=�CWk�����Y�E\u?_ ��[nWw�WO��i�=���+c�c
X���v��5���$~hjp�&�)���>�q�,�-�����n��w�j�����O�����k���
�a�W�})���HFk��i�������wZ�qWWdf��M�SY=u�8�����}�����q���4P��n6�NCCy��s0d�[��kk����sc�����-�����dip��7=u�,����q�����WCn��=��T����Pf����-�w$������rV���-��?J�j��tm�,�{b�������
�G����5��C����g�����q�����s�����FL��z"�1�l������=�,�k��TrFy��������w7��.�)����%�������S�/��~}O������T���L�@2�d�7j�.�����LQ�������K/�Wp75)�;?h~����e�;�>��Qk��7��	7S�^r���z�����7%&��Js�R��q�i]��m����kF^�z�#d���ef����� |����t��S���Z�8���g���Y�TzC"��".�E��E�
@�%���d�w��:�p����v���9�|2w�2���"�z���B����I���p�bv"�C����}����_F����b�u��4�[B�d��h��yH]~���������B���5��6R%9�U�h������	�_��H���#9��5@52�YlH������y�9Js��;���� �w+�Ev�}�l������������9�����������^�����F��[���
��O���n�k��G�q����b�E{X�m��K���g���Br�����=�\x�R�
O��

���)��:��^0�*����j�SmV�Sn|>
*V�MBU9���n_5\T�%k���M�K(�F]pz���	,;c��/���Q��P<�f����]H�&�-RE�PC�����=IY����8�@sq�,G|��H��i3�2����7T���p�
�DE+.<�D���?�#J�+P������z�n�6��������|����������u��K���X|������Nsy�������'�7��)�l�in�lU65���
�I�l�z�����6j=1��y�nk��b��.��a��\|����g���[�m��+�����zlb��6
����[��u
O��
@��|��}�PrI������g~o������U�y��KgZ�[u��=����^�����#��w�����������H��MM�����Z4t�z���o��=B����69��u(U�M��}r�������I��,E�n����m���>��X4���1>�R3;�<$!��qxP�m��6,�`��vI+I���i_�57�����D�E�d���������)��'=���[�S4��:g�r]���|���s����5�@��ay\3g���wGd�n�I��:��a��So����ap�b�*Q�����B1"��8��zO�m���g���y����'W��:>z�pOFf�o5 ���D=
��E��>���������Q�&1�����r^~SJ��m�r*j��7'8Y�l���:m�|w#�������f�����-���bO3/�i[r"A�)uB�E�JnF3$�3�%���������uP�Q����v����n���n�]6�&���\f�F��^|�]fL^x�S�\�����?^^kND���[P�(�{3������\����NL=���urY7��O5{���>,�,��ql�!A�Q1K\��gXdcfI���3)&
��9��9C����q�7c-�`�gC����zX]k�n_�2���>[�-,��4$f]Y)c]�d��b��v�{��;����������u��������:c�h��|��w����d�v�-r����&��������9MNCp����Ev��fv�����v����Le;��;�^q�����������KW�H��������/�v>ksk}
)^���>��6��a��a��u�z}��p$)Q�P-�P@���6Wa�hPb����o���L�v���mM�vy26c�%��o�^\��Y@�q�i���V�$�f�f}~Kw9)���[�.��4�������Y���7��iq���K�jhj�����m�ir�b�6Uk�v=����� ����>6;5�{6-,�\ymV�����K�����e�U�`j���.]n���mZ^Q�.]]m�Zl���������]~���r��4��i��+��re�����Thjo5?������I<��`��:f���`�T���-+b�V�l����,�����f��4UD���)�����TU���u�������jo��t���EZ��V���Z�w�Q�Y��RJ��]]�Z��-�2�IMT��.rL��&F�������C���>��C���$���>Z�f��6�^�Q�v����Vbi�b����f'��i��i�0�/<_�S�Yv��"[6�J[i���%>j=1�D�Dw��(�����.U�-#�&�+cW�uU���2�|���uG��R�����R��L���L��$�;�x
��#r�NRMV��9��g�b8�q���"?���/UWP������j�9�l��/:�UGm\�����QP��*���`��_��d��*���t�Bdu�R����'2��-�Uj�����U�Vk��1�~�pS�U��%N�_��s:���3or����wwN��^�dh����Er%�^��o���1�!$"ie��B0��1�"cK�2�d����`?�/�Y?G\�-I!*�OM��=�E�[yLc�����X[���RS�&�TP��G��cK�=rG\��$u�rE��bm�}T�����b��L��VVj��������U���3\��7l�Aa������X��iiD����\����t�)�����^��U�,���=1pL\���p�R+�Y5jr�cCja�7��M*����M1�1v���#[EIS^�\5Zc{T��6��d�y���|��ow	D�My�HIl
��D�?��NJ�K<��t9��LF�mn>��V�����Q}P�����h�&N�*R*�T����������ZS�B��`���4��.�Q��r	f�����N�-5j�c0��i1�id��$�D��H��rC����ju	���)Z�T�R8�	c��#,�-]f��R���hc��1�Z�5
���Yi1UY���I-�nP*��$��m�~���i��l�^����Z���f���V~�UF���)�JC@?����SY����v�J�&�����$����4��l��;�j�Ay��4���L�]eP�I}���e�b(�R��f�r�2�A�mk~��X�����uZQt��Als\1RA�T~�v��vV{t�]�W@�U�'bn���Y�+J��Q����R�5���Z����YUn)7d�3�ui6M�G�Y{����0*D����Zs����<�e�tT�5vD���M�`E�wU��W�1imk��M�~��$��^������4
��rT(P��E/K�yg�*�k Z+��MV�]6��oV���+�+�l���{�j�(48���Zi����/��J���V�nR"P��M4'��HL��4�K;��a������������9����$�BY��Ic%0�����2i�4�eQ4�K�	��C���<�9��x��$�ED�if�o7��Yb!4a,�����yI��v�����:��rf�&�|���{*K��XL�%O�X��-�eT���T?e���>ic�?��Q�Qj�iV�
���>�"�m�r'HMK���c������7���M�����no��
&MJ� 26�UT��)�*�\���S��6Z\N�wO{����0�(��u"��Yv�g�L�9�x��(�����P>T�9���||�c��u��
�H��TW$��zaw�5�E-�����pV���$,��7�����Qw�9=u'Uq���d�NI?���*i4C�r�0�f�
M'�8�HM@�W*�����jG�V�����_���8C�	�1I����l�����eI���\���F�I��>Y��\'�����~�K.sL����mV�5�vB�<r�K�i�<�������u���jUK*�::_�m:
������T~��ES�IS�e9�hv�bM��j}C���	[���<�
�$��'�q��L�e�p)�n_�*G�N���-4��T�V���oU��J����6������k�<��s$�=�d�s�.�J��noG\�J���
�������*�IY�U����>,d����D���N7�����p�_��-:6J3U�j�P�e1JU�TS�
�$�����9T�c6�V��4�;�Z� &��8��W
]R�%�\!�_�B����JR��_$��[����zZjrN,��d���*
Y�k�$U���mbV]�u�x�j����EHA_�VZ�G��U�Y��.���0�f�Rjq��]5�R)��4�w�k�Tb4���G��V�ct��9���\��|�)�l��&�\>:i�#/K�%�������yK��$�M���H�D!Oo���
��Ur��j4J���j>-g����K�{pV�T��4�0(������,���P�e�S
���d�O���s\�W���������67�^��zKQ�E��f�����2J��]J��KI���,�����w{_��Tev��1I������Y�2�������J�c�c��.��je�H1"O�5�C:��d����]�J�6�����>���v�)}��#K	����!~��d$�4���{�XBX|Y���I5P�taV�!��[<��?�1�����V��k��xU�D����F�~�R-q��TX�$��Q-����TEuG�T�'T���"["����$�|c$�����R��&��ZDJd���������<��Qm�M�Rb-���?�WM��I�D��l�CO]lKT���j>*ehdJ����p�$���2�%T��4���M��KF��R\�MIg��������W�����.���U���NG�&(��1����65:ix��*V���i����T��S��i�C�N��e�����P��"r|uf[�.��'��T%L������(��4!����������-
5:{�����?����}�E�M;�N��3�7fH�^���%-_\���FV���L�R���=�p~���������fr[v��,��_�l=��' �9o���GM
=0�J��(K�"*��
��;���m6���5���Cn+�)n�L]K@]1���%ms����I����RW��u
��$�����6��Y�xOE-Z�V*�;X�5�mR���.����z����d�Y-���*
�+	�����=.�}V��	6��o�%���w������E�w~
\�=6���������J��d����!�p�
f;��%������!�'$���en;V�
E��Hq��5R��Kz�]
M&e�-��TU?������wiw��^Ui����Q����j�&�s_�)�����fU"Kn��{6�����%+2�^�R�x��B��m�)5j��Ai��6�X�x��"!��MF1�j��c��O�)>;� >�P�z�{>��.��T�!FJ���LZ����n,}�US�KmO-�cWR����F�����^��K�,��_�5�Uj�s��/[�V�eRi�u0�+���Z7:��O����=�d�OKF�&�AJ�U��"z�-C5eS�!���'�Q�����O5�q�$����m���nI�*{!���E�t�n�_��J�}�_������,�J/�m��u�zd��UR�]f4�}�F�M;�W-KMG{�J�+����4�c����ol;D�U<y���-;Z�QQV�d�IJ*k���l���D������i��tzw�:�O>�Q�����LD�H��T��R��%�k��S6qG��I����r#��j���K�b��O�?a�Jt�4�*�z��1���3�����\��i��'/S����������3^�D��,��(<���A�(t�f�S�3�]QF�	�����z�@��(�yk�V���i��N2���Ai���=����3wz�������-�k�4��$�sgl,�,�_����V�\k�e��M�F�\r�-{�-E%!�r�������U�u�ud��Dk�-bZ52���
?��^�X���k�\��y�.WJ����?���k����A4y�A�Q�6�M�I-��y��oB�.�Rk�����S~`��e�=+��k�>�2������9E%������E�\SpW��n8B��so2��\�4������>����_����T���V����J��u���%�������,��������O.�����xzR�:wL�[J����%�I.�L��M���{~%k��V�"�S.��m�_�1����buX�����E��?3q	�QO�i)2��Dc������ ��n{��Jmr��E�}��c�k��?�A^�c��Sz\��&@��g���.��-��x��"F����*kU$)	@��2&��-_���}6��������UQY�2�G�m�����[�����&���^����r������:�l����F�
��[�c(U���������'������NZ�5=))�=&C+�����V*�]X�����0[���82�e��Id���/��O�K���g�N��j�@�*��cB���/j���E�K"�H�*�k�z�)���?��U
�,�B�jJo�%�3L��b��U�D��L�<��y[�����_���<�@V.�n�
�A��k!����x�7Cd}��B�	�i
Q94�9�Pi�IJ�/2��_z�B�����[�Ya,�:)*��Hj�J��n9����E���u�Q���N������(���Nu�^M4�~-��=�t\�����.���!#'_��i��E/�)C�vL9��;�������f�P��Y|l��PY=!�s+PK�w1dF��+vI��L�������Q���ez������S�Q|�v�]n�q&';���-E�.���!�����5�r�hX��T8��n����s��W"����L"����$��<i,�Mt�@�l������U"U7&2[������*e�T�<��:��/0�&��'��R�I$�2�Q~��~jm�Y6��_�AE�qDn��z>;(���>���q6�"�"�����3�m��-P��;�����(IH���Ye�3��Mh�*��Q�A:��qI�r�"���2
���Z�-z�avU%���	K�_��*/��+6���5�E��
+>�QA	��+�?�N\|M��$���yKs���N��j����lZdZ�I%�4�����?�q���s�:���C�P��:��C�P�:���#�H��:���#�H��:���#�H��:��0@�0@�	��S��jHAu$^Z;����S~��m�V2[:�0OB����I/����������[P(�M�J�=&�W�t9�q���K7�\" Y��D��6�`��@@��%J|�Zr���V��B1����	����#:iDT���*�*�p�N��6�h$o�F����U�u)�S�:kb��2Yp�F������OU��y�/}T�����Ec���}��+�V;��w�X����E��KG|���-�Z;��w�h�������Dw��;�Q|j"/mf"M�w���N������1�y/���+�1������.��"���u����W�D]".c�%��`����wP��X�;��"������"1���%�i868�}+������mh���p�#J;����m,Gp��z���f�\zg��f���_�����M~X<f�l���Ib���	-;������/������w�A�����w�A�����w�A�����w�A�����w�A��";� �������;� �������;� �������;� �������;� �������;� )����'�J�S�T���2������3 "9����_���_���_���_���_���_���_���_��������#��D@��r���������W�r��1��3�9��	��G�����<��"s���Y�W�0���!�����y��B��T_�����)�����
22�����%�*�B"*2:"h�L�brq59��3P�I�m��1��z�%��0�=Dy�}���	�Bw�(N��
��0�;��P�rD�������?������>����?������>����?������>����?������>����?������>������/����>����������>���}A�P�����}A�P�����}A�P�j/��_��W�}U�U��_�MU����lH��t%S�T�U���C�@�:��@�:��@�:�#�H��:$��#�H��:$��#�H��%,�GD��(t�,���c�X�:E�c�P�:E�C�P�:E�C�X�:��#�H���$���@����N<�q��,�yd��&Y0����L<�a���,�yd��'Y8����N<�q���HO,b�4c��,�yd��&Y0����L<�a��,�yd��&Y0����L<�a��,�yd��&Y0����)��>Y8����L<�a��,�yd��&Y0����L<�a��,�yd��&Y0����L<�a��	S��?�Wj*��\�4���������^��E@� "��*���Y����]'YLj���s7%D�r�s���<(D�Wi���~Ejs%�����IKc\���e���%�*TkR��	t���e�r�*�Xtd	�UYSm��u�=&{��\/�b�j�o�k���v������(S9Rz�������"mVer����1��[��H(�jz[���,"�l��Xd���#�O���)2Z����|�����(��5��B��$����EIh�1���a4 ��'�]�=��(�_T�����m9a�_�+��SO�|.�&���o[�t������o��9�[A��(��E�����Hzh�Tm�==�{���rLK!.-N���Uv���Q���o�Wm]�����e�a��T���k+te���W����O[���'S�i���!wS)
n��x��iu�u
��M<�"��t)*t[�'VV���U&�SV�����%z���P�	��l�ZDT�v�w����a��2���rFs)T� �_�����}���B�'�����,��H�}���m+�&�LL�)�-�J[\�����bi���s�,2��_V�r�#:z��kk�,7��KjT��:�X�S�cL��I]=}S���(�9t�E$��]R��1�RgZ��-�I��]��b����S�J�d�uq�]�P�V�jV�3�����T��Q_���V���Q���R���N��eJ�cA<�N��U���V�Z��j����i�(Fi�S���-��K*�$��4(U��}��u
�TRYO���#�����eiu��&�]*y�����Z�����������-Bi�T�?"����r���^�B���P@(D!\��Q]G�W����N�����I���0���|�-<�j��i��5t5������z��kuEN��!<�? �bS�r�>�P�M>�R�R����v��\m���Vj�si�����*�#4e��B�]VR��e�Y��w�@���s�.�[r&��2�\�FX�������h�*HKf��T��2����yi���Mv���,O�o�aF��xN�K
�,����UT��{t'�S�GTr��\*�K~���`�I�[|����>'�'�T���0�����vU�#P������%0�a��&��a�R"K�R���|$���0�5�e��@���kF����
�f�|��X�d��3�%�P$��=��d��-L�����+�gV�����ls�H��\��O���m�N�b�Yo��ul�)��UJNtT��yc,&��2d�KH8��(��@�����uw����h�l��'���x�*�	%~�RY5Z����Y�J:Z�muI������fi��FM	��'�$)HS�&FRju,��6c����L�.��Y��Q�,2CT��/Vx���(��\��f*��L�G2���M���L��<�1s�)e�����UV�IXTz��/=a��NHI��P��g��\6�4�UP�&C�f�3&�SHA4�������j��K*J)k���a�����K���<��c��������lK��!�0��_��Fsx\9����-)�>y��l�X��L�Q������1�8����
��2�0�Y�����sO��D��sD����YG<&��W�><'��
�����$!2T���d����1,BI����	�Oi�����1��2��������kUUF�G��f����S��������L����B����6Ya,>F�Lj�e�4�'z��.��UUr����H��M1��5jH"��Z��yQ�3.��P��)�6�<�4��FI
$LR����Y����5144�.�m�
�v�5
X�m�u;��n�"{^�Z�u{"^0��#,$��*nc+�3��8�g��r4:�^�:
]RC �&Rqi�Zu}=<������_�$�Fz	��V��T�J��cH��
�/@��Z	.�A�/�������jT���j��)�N�[�e������m�"N�De�X���$�y��HJ�.�,�I�I���<���H�@��#rU�4��#�
���Y���ZD|���(��8�x
��������&�U]N�p�Thnb�@��B�`���Sr����iHa�S�:*|z��U�\&�^t��og�.[����E��9.�"����2�j��E\�_�><��#hI[����)7"����������	����k�r��e<#,�2�2�$DQp]?,�9Bd��0����UM!}BS&��a����K)������A%�s���de�!�#)�K-(�Q����D�e�)�D)�d��V�E�i�p���,y��9ER���b��EI��TA2�ii��NV�/�L�H#L�<�I��SH�"���4��&XU$�X�'�����I��)9By��!X|ya	��$���9^�%buS9J"U���9����<|fa�����e�3�������U��S��T"�8�yL�S�5<�X/!�	&ne�J��N��I<�(��"L�8�y��uN�I�	E7Q��D�B���Z%I���#9GTyS��'�@��*kv�O���\M�<�X/!�1�p��h�(����	*���&�������9)�Nd���4$�T�WZ\Dn2�����������(1F��OP�.UU��VN�-C���G������
��hi�r&4��%��2���j����$����N��
RO�\g��&:ZmYI�/��G�m��$����|s�I����a��W!�����)�	�U�BD�Mr<j�"��8��"J��Y�V'������J����
Ft)��N�Zc"TM���?��(JgIF�e�VGa�)��y�:B��r|�4�&�jOk\sA\����&4�H��%�-R#�.j��O��d0���	�u^8��L�Hb���W���e5d�nJTb��d E�U�*+��-q&+.�\��T�r�B&~����><�����8�E���4���?�&S
��**c5�\�
���������=���U!7:J��	(m���&�u��'���R<��e���'�]	J���b�������7��O�"S d�@�L���R2Fz)�����8�r�K-u"�(+���SO$���t%�F<f��EA'����H��/��9���/�0���I���$� ��L���J3��'������L��H��E-ta>:Xa�O�J�DB�$��|�,��n�c�H�4�i��T�q�"�i�f���y�Nd���:e��LS9�!A����r!f�t�3�/�e�Q�t�O�2��K�V��Vl�Sf4���<������3&T���n%�b��r��Q2E]"Jz��H������z��������$'�+-&9�����uU�"��,��'��S�8��,��+��,���Q2�y��Z�H%��������d� ������Q)�-���/�y[z�M>�S��<AR�i*J������gEf��x�1J|��	&��)4���4���mb��e�������AT#O�#��N2sf������Lb��%'Rn[�)�G\�i����m�yOKOD�%N�M�S]-t��B3C�~9�N�-B`�e(����2�,���l�J�.�RZ=�jR�$'��x�8l��IS�����E����p�kMo����Fh�RA�3�c,��_�)p�����z.��U�T==�Y� ����[=R��=2�%��������V>D��9U������X�rj�J���e$���7�"(��D�t�
T��i�e1j�}(���T�->�Q��Q���������7������v&Q)�n�]K>�]���i	�"5���J�K��d��>r�=:��jWB	J��.J�Q���������
�OC?��0��
M�(�L��X�	�I�����IP!\��2I�-!���<��J�iu�2i����Lz��N�� 0��Q���T�*(Jq4X���Ju��UJ��	J�S�"��
>�*SN�B�2��n�7Z�bH-	N�&�I��J��9*�#Q�%�)Q/H����|~_�	���JQ���IM@�(AR�����g��S�U��%2�O,�H|r��YY�z�!!��UR�����)i�dOQ��P\�s��'N�)��>B��R-�i��yQ�U)JNZ�R�(���l
"if�2�	e��f���������2-�UF�B�����d!�d#$8I,f��!�u��^ME)5)�f���:�D���*BE2�����<��o�iP)d��-8B��z�'l�h!L�!������g��UY�*�<�0�NO�I?U���i}���ZrB���6�$*��q�_F�\o�\.{d��P�M�����)i�M�QO���u�����$�i+�`��>�i�X�V��U�xCI�+$�ql�*N����,�UU�`a���i�1zc:u�����0��$��H:'��3�j���Aa�8�d�1|�%�����z��%'����E9+�����uo�X45>e}@��x����c�1��M4$��!"�*Xv���z�h��I=^�zK���}-A�*��3�Z�K�=;�
l��C^$�Z]������s���FAT�t���Y��6�oI
u)p(��P.C�(��J�%*J�iL�U��R��Z�+K����Bi�m9<���&����)�*��4	����P�'^y��^Z�	L���2��0��\�@��<�M !d*��'L�<�,�)h�c�$�u_��$y�)U:�	*RK�d�$=R���mI�k�h���P��+���Q&�!Fx��g@��x�I��=EBH��W��*��&��gLO7<�4��Zi��g6c��/���&'(��I���U�����A?��<��rS�0�Fx��a�BU&F�YO�"U2����|��'�4��u��>p�	�U�J�T�NJK����s����"�������
�2	���c<U*��O�?������T��=:D��L����%����7�U�VEH�g�]<����'.�0�<y��g��X���ij�@�cR��W��r�?�6Z���(��2)c:�9\�'�|��M	*�r����_�0�������+���y�2��UE������T,�O/�V�!$�Q0�V���/�T�	'�l�����j:�y%:eSH�Q�i���9��9�J	�iR��Q\�M_,�y���3��L>hHb�0�$�����6%F%�<����Y!��r��1Js��yM�D����	uJ%Q��hBx�YeSXQ��y��5"`[M_����a%�����U�RR�je�T�� ��u�zU7�O���2���)�)�G�]�n��h�\����r��-�@��4d��d8O��W�E�4�e�����$���e,�}���<�TS�%.���O'No��U��bd����2�U��a��)��������c,��5)������a��^����Y��Re�(��Z�Z��4`�(D|f�F�]�J&Yj����7�"��Va�B$��d�M���S�-�lO���K^���v�`��.IFL���SxP�J���hM7�kH�WN�*���(�#SyU���Sz���YQ��EO�I�*&���0�t��DW��T�����,[	��U����3���9<��R
���,���SQiSA
�z$�S�2ca��O$��#��,�'*���a�&�����	�.�����zI�!�:�Pd�
A�P���"KCI5�������Y���J���n����6�"[uGN|x�,���\��OMdb�,�B�D���-��NGO/�����R�e�Pr�Y���4�K,c?UF�
O55���,���6����e9J�y�:b�[�.R���NYeNL�:u�%�Q��6e3�l�K)e@%��m�
T
+�_����e$��)j'5d�����yS%�r"d��I����(0��	><����L��4�y�!)��T��g@��1�Q��4c4|11�if���u&����08���.N������#<���������2�0�	����TE����:�����	D��!��_4:Bb
�p>3C�	$��W1���3sG�<����?�.O�,���yD������sf�M4f��������s��1r�WVq<bd T��MA����D�������1��c	y|��sD
63�1������7��8�G��C�C�B�Q��!F<D�����$,���0�L*_��Qp(�a	G<D�Bq,��_�	�s�u"%��i������p��0_�������$��X��:���c�XB������E��7��Z��	�4�+��^��>�}yr+:�����&KAs���c2��k���W���p���o\r���G����@J�E"�$�+���[�����F�Odh��F�Odh��EF8���z�z����j2�����8��>�;��.��\T��\�EQRh�6�%��U�WKmI�1d�H�*�2�J�S<��Qj(���]�5d��t��a����h
��O�$�a��M����<�%�y&�"�yg��������4-���9
52�'�g 8@p�����UN������@��t���v����g����*�b���t�	H9h�*��H �Jb�U!R:jb�yU]p��C���t�R�S�����4��3��B����V-������^��������DF�L��s8�z�zu
��n��������o����1��!	K�pa�����4a$GJ��j�!r���������Ya$�<�F75�a^-Y�.��LB2<XJ%�%�]D}.�>�QK�����Lq�W�W��X���Sb�)����(UN2��
��{z�gI~�������s2K�u ��������^4e
ny*��s���*������C�m�[D;��	��;]�u\q�����P�]�Z%G���I.��FNC��X[u;�������w2LOk�-�!�����Ah��[����/;�)-o��h�1���U����6���4�!I�S8���@�z��H.D��Vz��LE=EN1������i�����<���X�5Vyh��2B�0�S!R�-^��!F�4��y'�O*C����js��2XF@�M>i,��	�2D��!��\�$|�#�<�#�<�"�<�+w����\H�=Y%*�]L����u�m�bVN*��2�t�Z�o��#oe%UW����+��o#�(�W*���MC=��uN�qW�IJo����,��!J���������{sq�P��4�L_fR����9J�~�����u�����|i)
���Wk	�&�1�>b�&kj5���X�%:�"U,M�lZ�s��I��'��>�p�(�T��TeT�C��Se��g���x��Q�����=���g����:�-.��S$�����{��@����-�h�Em���u���0��EJ�U[�I���MmB�T�m�7Kww+�%�V�pe���T��1H��A-!Ec�����B��Q���R���,U�J�v�,y��{|�q������r�V�b`��1��P�L��nF,JA����F'��R�.*id�A�<!J'0�!$����
:1S�,��12O9q.&2I!r�<�	�.y��Ic?�$�JO9�����d��Q��O/��1��!����4S�t�#�
�+��2��;L�-��.�n��ze,�*i�:����+��OOJ�~���z8��!�W/R���]��q7�H4����):i|`�IhQ0T����]yW���-�ze���5}J��u������HA:�0�;��}�h-	,v��k�1��+g�O:���qi��/�.�&�o<ym��:���Y���'�����%��������J�H�6���PM�|��
���3�U	�R��9�S�fH������r�h���j���^?���4�����J�k,gm�W�������|s���5�����F���TR��%q\�2�<c�����;F\�k��.t��H��W�l�������=�I�a������[<��%�,���l�+:��<�O��n�?�	%�������75�W+9%{q^~9�����oh��$~�DJ���1H��1B[��N��Z��K�R�c<cz��jb�fuA��?�9Ap�T���R�v��� �U���]V�jb����*6Z=#��zKz���m�P���9���<��bK;��~���'��v���o*+�U�����2����R�_/L_
�O>W��Sy�����u�-�UJ��X.�u�2R�������I:��\�����"Di}=w���?�^u3�OE���k����W�z}�m\u��-s�M�!���x��WMA�c],������V�xU*R���W,&����To������l�e
�j+a����l���E��; ��Z����J��
�<G����K��Wy]>9�a,)q��D�f9�2����K���L�����%Z����_�-C����]^������,�*���TC`�x������,c���X��
R}���5��c������U\V���F���-��Z�S���Z��g���`��L����w���b���@��z/���B8�������Q���{D�q���Ai4���E�}�[^�_uW����n���z�����mD+5���2��<u�7��!��
�l/���P��5f���T��]�w�Q,�Kc�>:��k"��%��h�.���
Z�s�M_�D���^���2�����t�]Y�f0Z���?$�Nd��S�O<�O�&r�[�Y�b���'8��F1�M
P_R�yf&FQ��_�2N����P�)�T��M�k��x%.-���)�H��I�����-�����E�X�x�j��#�6�{�������x|hF0������
J��RSRqm�b��9����U�C��)T�����SH�7�S$BeB���]��k����F�]�Sd��|T��
�L-+�)<�j�1FLI��&�
����Vr�bdS�x�"�����#f�d���������W]�����*Fj�V�<�9u��������7�Ye�_���W�w^E��H3�N�WL����g#h:�EMZ�����"��1v�8�?�!��L��i+=r��4cB���x������x�'+�j��I��{�b��_�s��F��?d��z[~��K	=�g�u��%s�F)E�0��}�OZ��PC��1�[����w����[���7�'�������=YsY�����Z�p�E�����51F�m:��J�����|���D����X�%��
������O����r��J���V��]����Ag���S�GP[�����KQ-eY���!(x���m�r9��g�B���:�Kr����u���GJD�7�����S�N�a4�X:�Iz�.�����<w��A�P[�\�6��6�[�x�+����e�EJ�*���9x�i�,-��["?	$���XVny�2�9�HIx�a�q�|o������p6�M>�M[?�$�d���a���7����o���:�o?v�S�w��)qo/�C�\6�@�m�q�#�?&D
���Z�u��f��1GL_FBrB|F����b4��D(��u���TD����	e��~'�a0�$_|��k�[����R���N�zr����[z�e��E�Q�+���<�Oz������U8�"���z��Z�/����������3�i�������YMu�]�c��]��{S��X������#,'��"��j����ZVj�R&)_YZ����K�b�����gg"���#�$�3�T��G���t	�x�SJ�Q����:�T*6'[��c+=r���YVe������40��/���p�~^+4��*��Rw�HM����E�s�J�@��duH����SS��i(\��XC"�F1�~V���?�L��$��?a���P���]�e�*�kUO�TJ$��#�Lc���,+�u�v|���NQ��l��-/D��}���x�_���"���H���M�/g�e7���Q�������������y��I�I��\���T��������0�!8�+���\��w5������
,��+GOH�6�:���C�t�MQ2�*�>X���B�P��b?I�c(�H�w���64hH����W=������v����w�/���N���d�h��|k�y��U�r|z����syN���.S�O�)Iz���$�.z���X.J�������$�I���%��o7F��^�w�C���������X�t��r��I<?�U�Ue��
T��l���d�j�&"1�b�����UU�+�,��0�e ��}�RR��q����8&��93Ih(��:�~[����zsJO#VA����-�z�q���������9��u�~)Rt�
�)	ye��c����|{�K�|����W�2�4��,��/����6�q�-��]��V�66/�U��U�Q��#�����*y��,��_�}�U��M�A�������=��L�mK��_t�~B�W1�$�EAR�S4�O7�LK�'� ����/[�}�~_�<�����w����|dM��B��T_Y?�I�(�F�MW\������qEy�K����-
w��������Y�v8�1�|y�7��ZE,c������V_IO�������H�	����JH��!�����V�6j�&u
d�H���}d���{t_^<�hK.%7d�\>N9���u��N������$�e]4������O;��%���BEG�R�1K�V$������(H�����q���+l�i�g��V�<+�oA����z�MmY(q?>R�W:_�
�J,�����SEQ��!���$*7}�J����R�L����a+�]�ce�z���)��"�so�)��QIW|��,���
j���V�
�m�i(X��m�v���M\���U��/�6H\aG� M����MJ��UW����N��6&d��T�z�� ����*d]�l�V�V�*�m�\:i��>3�id����O-C�d�
��������w�.8fL�p��6�m`��42I=%=O$U��~^5���A�3P/���HY�D�R�Tb�
F��y�U�FI
T�}�=#�B�b"z`N�a��jg����W��%p�_���9��l|fa���D���Q�+�Jk�\r��BYe�|z��5�����r�m�P�=Lk.-�_���������	c4K�+4ES�!K�0�&�"�����RX���qB����lV��C��Y������kn��qT(?�����a4?I��I�:F�A9�J�#�-����\<��� �}=x�z������������M����G�j#������6�����UL}.�>�RK��i5I�Ino������Pz�qUB1[e���c_�jBT�G��_��B�U����U�>?�/"e	��U)!bB�.��$���Y��_��4�B�<�aF"�""�L��(�:1�E�	����Z��K^�0d]��[���+X��	Y���J���FV5��H���#��A��+^y/�s�cS�k��kO;�_��V*��1�E�������ie��(��b�@y�1� <����b�<�c�<�c�<�c� ���S�:�y��S@B�H�}n��0�l�a%���n���C ��f�8��)�d%�GI��2;,4�G���2=,�����c#��r�d>��[# ��P\!����R[RB`�H��Ip�dW��s.��32\�6c��l�uf�'�1�3��X�H�1�.mc��X���;��9��~��2k3"��������J%�W��3Y���5��3M��&j�|u��M-S%]���w:��Let��
�!�@}b�X���� >����@}b�X���� >����@}b�X���� >����@}b�X���� >����@}b�X���� >����@B��1���:^iH��e��-�u���u�*�c���X��qV8�U�*�c���X��qV8�U�*�UP��Q�2��X�)���U"'*�:�G]h�����\<����6�AZ��V	V+�yP����%������B��J>��F��0���-qT�[�Ib���Z�(����WD���_ ���I	{��#�w�k���AQ�T:��r����'���,�DM�o,Dr=�dk�>D��d+�6Ad�w��0�=
�WU���	���a�V�a*���9����9����9����9����9����9����9���UJ��U�R�:�a��z���z���z���z���z���z���z���z����z�����\s�� eZ��r�$� .����sL9��i�4��a�0��sL9��1��b8�q���#�INA�(t�"�H��(t�"�H��,t�2�L��,t�2�L��,t�,��c�X��r�9e��YG,��Q�(��r�9e 8@p���� 8@p�r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YG,��Q�(��r�9e��YD!G�k}"K�{B�u
�� 2��>R���\TE�Z�t�I�������P�|�-D�j&�+�OB}u%���j�8�rR.G�%��R&V�J�k��"�����W(��4�%4��5�!�{"=U����"Q�k���}J��fJ
���W�J}�w|���n�!��z'�'%W����;uM�����!���U`z:���L}�C�Oi���[5?�r!4����W�J�b���E��+d�$�!QN�O��=B�/�-�H\��By~E��24K�P�e��B�\���z�4d��F�����-%G�B�p����RP���BJ�[D�E^��D�z��}b����;<i�}bz��(w\`��^T�����i"�%a]Fj���R�k(�+-�T���T���������P�K1j5���y)�'O�$�W��)S���:������Q�$�Y|�]>��������-�J�N��%OFE12���7���MT��J4���&h�T�
<���$<�*j�!x���b�X��	�S$����NL��Z�\�(���V�O�l�R��YS�[�:�W�/	RW�s��!B4���I$�����JP��H�E7J5u4�y&���	�aB#sJ�����IG$CN:�|=Hq�|��S���B�29-2e��'�����[�����S-��R���3R����|z�i��!�HRD�*%�Va&�\Zd�[J�uD��B�"z_���TII��=�$�J��M�Q�%���*�b�&J��O���HYY�@��(�-QmM"e�V������n��E:tf�r�.�(M!R,�����y��B!Fd�+1A��x�2��3K�He�i3\E�J����,�	�*\�Z��NMj����tzjO.����JN�(Lj�|p��E4�j��B��]2�I���u��3�a���\�JTj���������y�B�M��[����S�Y��#�@]����w:��i��U�,��������I�-�R��G|�k��8���0�P��"6D�%��A��{�t�I"�K9?"O�e���BJ�u���)UD�e%,�����g�4��������|lV]S�%��ifAR�h��R�*���bI:w*��r��G�XiPFd��I����IL�Of�8�J��bE�H��ST�o�T�YTT"A���}Hd�kO%�M��58�eJ����KK%�*SH����';�}B�&x�M\�������K���)tT��QJ��P\�� �H+	*g�^�X��=4�����Z��P�V:5z��&VRr%LO��I�S9����*FTs�$���P�s��yp6�Tc<�
�$�T�T&����a4��N�����RCmy
�f����M,
5D����y2�9*��4�9R�$��U�UU���C�G�FI*�#$$����4U/�5J#�]TO�E3��<�'(�E<���Y�O1����`��Q��t�0T��a��?��(ICg�	��0�r�Ly��>��%����H�8G�3����8�7BH�i1����a��B��4��Y���'�c7���9A��8�Ht���dL�V�n�d��+�c,��@y�$.&@�"Y�G��C��?��\���*����Us�J|VQ)���v���B��d"�&�����5����R&�)��!W1�R(�BJ:�'��c���Qqu)V��$KB�eB�U<�kSL��N2&T6	fO�'�1����4���T�	�����.G"�H[^�D����Cl�SF�n@�9�2cK��I,��B�Q��p��*����IEP����=�0����Zj� ��O48	c�s#$���Q*D>��U&#�t�J�j�::����17���+Dy��T�T��|��)i��A9��]��]kfi�2�M��C�|�����Y�����S��c=�a��������!4��?�m�|�����:	V�d-!Bi�^5"��^db��Xxo��k�O8��L��z�+�����V*
X����-I�����Y��!,xd�,.&�B��-������d�j�C9���J������Na�N$�/�3��w�,�UQ�S�(	�L�a�m�FJe�n��nTe����������F���i��$��G�$�����\/�|���T�L�|��a��T&4�u���|���a��*����T��%V�<��[�z��N�&,���)c���R�0���OI2���i����,�/@Z��J�J��3G������t����!iQK7 �Jr�(����\�M�x�C�><e�1P\�p��i���b:y?O>��5a54�)'*H�e��_�O1G��M�X����Q�<�tf�5�������(��"���y���Y	�(�:`����<��(�:`�����M0���3�OP"~�#�d�J������7�xs�M ��B��p����y����O�u��R����VH�����N�Y�!�����1�|����<�Q@���	�cM���-US�4e��YM�S�&QnR�����hS\�c]	o�m���4��(�!4�C�s~�P�!L�5FS�&�,����[JW�Mi|	�I�U����i�.�3G�V�4���O
��'��G�g����Rs)���%���r��y��%�K��������]���%��ER@�&�3��
��X��\*�m\�+U'R��HH���e������?���LO	��M@�<� �%�/����X�e��M�P#��<�#�iS����WL��}J����L|��t�6����r_����TQ0������RK��U%�V�N-L#%51=ZB<�%�����?�,�
�I�Z�����!T�*������ �~X�_�T���6r�G1r+���P���)������h�q�I$����������5!r�b@���@��&%��'^���!�AD�#��#������"|����$����x�)j��L��i�4��,�@�1P�,�ug2	��p��>ur$�hg,��*YL��~<g��Yc0�O"�H�2$$�#�J�
X��RK&��x���Bha�FZR�)k�������T�O6
0�c�)R��zNZ*#c:ix��r�v\�g�]���Y|"L������!��B��X���i�D����De(��N����
_�����q<�#)2����2��0��R�
�e���X�KVT����$	���S��?�&�X�SLJ�#�����!�H���	e�����Fb������'*%�]]
q��aknj�
��f�x�\d�
�H����j��*�����ND�D�:`������"����R�24��)	_[�b��S�Y��RX�o�|~���s�QVR�}6�|����ju���T�X���T��ZU�MGR�
��R���|r��&�&��D��	$��"����1I�C����P�-4�0���
���U���"��7(�.K�E�T�N��Y��2��x���h�H�r���*&�L�U��]���5M/��UUQW�����/���VQ�
�U:��J�^�f��74�.�4�&Tjue*��NL�M�9L����)hW-A}IW�8�z3�&*�^HG���7�	4��O,��(O��KnO#�J.�9Ry	^y�~�KY~<#f2X�AeH��r�,�T~����M"�Qj��D�J���&),�[���'���&��I),��������]XFT��S���y�<�[�I����_H��,�z�M,K'�EJ�!k��'�b��c&���$�����������b���4J:Y�i�Q�&	��~�	NgVs$���x��=���i�� j�%2�iDgEM*	\x!��(8�O,e���<����������.���`�L�"�!)�J�K<�K�bO/F3�K����HS�ND�������U�&U,�����D��D!4M�i"ij
�I)�O��Y�Lyq� !�><SB'sM�E��'��iQ$��A�s�)���H�Y�L�I-���)��]���-B���s�+XO@����T���9��AT�)a)�3��O���2�Z�*y.���H����5$�"k�D[��IqE_[/"��Ip5R���+%8�m%D���T���M5H�1��7��B������f��S� ���%T��S[������)���=��N)\g:0��D�����E&Ut���o
K�YQ3�\�D�Q�;����7�q�r�*I6[���WY�*�X%KO��By�0T����Sc,���+���%���S�*Z����"�N���j�M���=
Y|�&����s����.g��	���i�R��C�]�I6�T�=Mr
���t�ZrP���]]<gU���D��N��x��
" T��mJ�<(��$%k�~j��a�5G�e22���j�KY!aB(���N�d$HU19|�c'Vbu��M-E���K��U��P��$��y+-����e4"B���TO=\��N�2i�i�g��4<�����#��G�AH�R���<mS����~y�"�I�2Y�<����Zh������K��#:2�'��RO���Vys�\'6�9=R��/]��U��>Fi?�-ON
)1'�Jzl��ro�)������NC�;�!3���.�e�����g�:��+���UD
�TI9s�H$/�����9��Z9��u=%KLa�	�I*x�^Y�fO�4��1DI*i���eJ����\	�2i�eVa�����Y��\���s���H�|�9�Zq�5H������0$�e6*
2�y
+�K4�H�x�	xF��9���d�Pz8QsC�9'M$���2y�*XaIa!p���8�,��s&F�����_POP>iIVA�K!��/���L���)����2�|J$�������b*��LI��5)��hR�:�	>-62�la�?�&�j�� $�������g:��u
�(����y�Ii�������P.���T$���� ���H��0��7V���T�UM���s8M"��&����7uy�Ge\rZ�f�g�3��u/���(���������_1Ka\�
CDU9h�\p�+�RK,�"S<kuNb�K?<���L������*�*z=Do����Oo�!�SI1+�o�J���$9"[vr�(hr�%/���"R�(��L�XK�C\>dUO���������.S��.�\lU�(�NR>��]��4�'�7�3�jwq��7��'�/U-6�q�QLy)��2�4�KB�4��D�t�cG<�u��!s�&���iS'�����R��t�,��)��jK����U*���$)	�r���)�>���������e�rS)�S�<��t�5B
]k�<��D�����4������"j���������J������������3E7�e&I�_$gLqe�KM��Kv&�����4�g&����zYR�
N\��	���*RJ��2i`��(G�M-5*zm]Q\�U!1z��Vt��j��TQ�L��2������'�x��������In}T��IpS�j�����\�&��RNU$%��<�I�`l��<��w�����I���4�@���2@�5����C`|�3�@�3Ai5�N�9&LY��B�8I?P�I�M4a�~#�ly�M7����"��:�q<�x�,�t����	���RdM	&��q�a/r����Ybj����*
��7�B��I4��,�_�<��Yy%����������BN1Dg6T���<��Yy%��&�O�'L���d�Bs#$#	&�rs�qJ��,i0(�I/��\&�J�ig�Cc,#	K�����I0�HI,f�D!�#a�\����G����/��h����x������9�#1���0��4�����#3s��#?!8��$!$L�&K!p.I�&������?����nW�R�w����p,1K�Q�d�M��h���C��9"�|Ewe���T���!�**�>"�I�'��V�eG����"~�Xa=�e+Q�������_��������=����g�>��=����e�o]��C+��}�?�o��[J�6|���v��U�0a�K�o����F�;����������i�A�����Z[�{���8��f ��l=����h�K���������[�a��c��ZG}n��w�����<@�����>G���������������/������g6���)��������_����oo7�����V����V���u>�q����
��jf�>�[��c����d���.�r�������L6�q��m��wn6��<U3�w��c'�_���7��L��"�{\���qO}����]��	�t��1��C4�O��������o��Xc�`fY{��q�o,V������m;��P�/����M�}�;L�;o�C���������o�iv���g=����x0�l�md�m��p����'�'���{o�lnvO�;YtG?���#O�~�y��~�|�G	�rfNWa�;|f����7�b~~��"{���W�k-��|���jk����M��'�wqk+t�'�Y_����������[d
�7C�
�����i�_��[�Y{K�����d�4{!�����v~��R)�]���u��7���L��{l����sP{�w	��-��G$7��F���m��y�d��_��G�#:2�8*[{�P�����0-���E6����Y�~�M��9"�{�=�o��5��X���'�v����7~�7��j�q���+���Wg��=�o�����u�Y�=�^�wm��O����3�g�)��~��o2����\��s-�0�{}�]��v&��z�G�_z������d�7��v�g��x����b�������e�p����+����?������T�B�|�_Gj�"������r�n���P�c�����R�,��'|�g�����x������C�e��dg�%�^�������pl���}���t�{3��#��eZ�M���4V:{���ZY'����E<��}�j�(�����������f7��E�����f�+��������������G�#e�i�at��t�.}�o��y:����} ��=�)��H����9���m�ev*�����.C�>��~���{�����<r��m����s�������7���]��
=��Y���'yOq������MI�`�nb��������w�7����|���M�����>�o�e�v����'����z�t��rvH�)��v��������2{O3[l�a���{���o��q��{+��w����������7w�S�{T{U(�������~���Fv��_��[m���J/�*��?v����)�m��ST�F���/����e-f�j��R��r�_�������O�}��7q+h�u���=�-�R�o��&�~{M�~�^������+njH��k,�U��?�s�������O������f������,��K -�j������>�U��u�L�6��U����6��0��u�jkF���m���n�#���Fa8m�������g�DXC��������i��]�*���
����[�Y{S����
�t��J�R	�o��3���^l���7�n1�y��[��X����_��)� �}���!��P��`�v����GI��{/��u5��}���^�����n������>7y�#:vy�����G;�����=���X{���=�� �$����f������'[��v������ID#�����^oK������i�o��3kO���������Xn������^��%��S�u��d�lF�jnY�����?�M�cv;4���{���'�!����7����,����'���������4�u�Y��[k���V��^������������$=����o��������=���gg*��XaF������+{�?��K�!�o�e�g����n�3�+���uK4���>�Gb�d��C������peM�+�3P2��;��p�{o6����������T��+4���3���Ky����sO���3$�r�x�<v��
������l��q��60�.�i1����Q�fvA2���k���V��^������E��P������e&?f'��s���q�d�3l�znw��4{�-�fr��G�sj�{h�oC�n�"����a1`N'��5����������k�w-��
�ph�����]��S�=�_���_������s���BrF;�[x�Q`{�v����1r�7�����om�[j6���j�3��������S�������,�K�������^��c�'���a%�'�c���Z>�}����1� �%��wq��m��_w�������7y�op�Z�T���?���Hn���������I���/5��������y�\mdr��	����$�����[�Y{S���<{K�������FX#=��2���l������@��`�n	�~{_���{��p��b�ID#������������y���V7��Cc�>t�v���l�Lg��L���N�{o�F�M�Ye�XM��d���.r����]����TYq��h����������������1�m�7��C�����&'`�/��������a6"y���LJZ�K>�0�?�z`�����c����x��h�B`�����i-����Ye�Q��W����M-��V�����7N�����.�	�a�<�8�d-����e�q�&��5�c��q�6����2m;l\4�u>����m��$�S��&��F�{�5����x���z`�R��N�d>��Y	�l��_��6
��h��^��T��dm�a� d�a4�7e�j�������*�d��-��T�C���h7��M��d��^=0Y)j�,�H����d-����e/@�����L@�j�����oz�/$l��h������&�v����q�&��w,�G1��a���%-V��i{[�~�e��~�r{���a������A�t��&��v����d~G'������g���%�F���o�m,c�=�Z-��leg��;��NP�M������^���mm����������|)���[]n
mn{�_�p}���O��������O�����U_�-n��B6�MY�|Z�k�1�������~c��W0c��/���?�����Y{K���]��Sv7�����[�o.Y��
�Z��+{{c.���'��2���@h���m����{�?��q[w�����H��^%b;��N�hL��Cl���e�����3q`��.�1�m���{��4<.�����h-��=�0�k_�5�'�^@cC���_���mv��r��������6�+qJ�X��W��)Z}�w5��� ?c���B��vE���������m�i�j��]�vN���D+��5�������e�_�?���[���w���M�>���8x������g{](u+gs/qw���~�]�m3�Nn��mr���VK��2�Nn������PA���-����p���l}����O]�J3[Z���v��#�?ug���f��n�����/��H���������d��U�N����-���6����x�����{���p6����7l�8<O���)����vm5�j��2mm���**������{XI�"Xo�}��q�f|��r
�����������U�wi����j+�6�����m��7�lf���s,���c��x�����qd����f�Y�vab��1�!��]��r�W�,���{���;n�,A���{On|�n���5h��-7��p����n���K��7��X��������K��������:i~�J�������4}�k��F0��a���~h��k���l���k?��)���F<�1�Q�:�y�P
�
m6��|��"������p�V��xN����W~�d]7k�k����x���q�����mm�1*��wM�wY������Ugl���������j��.�X����7vV�$��61���<��N,b�����XI��?�YOCP��V���sa�p����Lv�y1����j7�
������L����.���dv�nu���9����_9��D���0��]xw�	�4��N5
������Xg��d_�*�o��\�5Sc�NNpS��slm��9u����
�,i�=-�!�r��s�E���nK�3����+={+�
N���Me���������U�����|�$4�\���6��fwb�OC�������*�M��|Ye���rH9$�I!��{2����yc�(��1=�����F-~\6�j��}�,�����I^z�	��u�_�/�iw���3oH���Km��6���2O�����V�e
������g�&v������0��5��"3�#Sl���N�����l������o*M>�i9vukm�m"
�l��cw&*L�\m7�"���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE���X�NE��6C�!���\�-��f�����M�Wo5�YE�~/��XV�W^�p��a����/����;�������/����;�������/����;�������/����;�������/����;�������/����"����~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����w���G~_����[5
�Z��1�!��*�S�)���#	�49��!,*5Jm!=*��k�D�K,$2C %���U�=f�N�),�b3y7�G�mk�x�,_��G�=<���&U�30wMy�L-�7����i�j{�d�����TY������1�;Lz����(j���)�{�a��q�ro�u������+���G�w����ed[}�����o���;�l�������m����fM�Y�-��_��,�{��P���~pT��r�;���1��+%?�_�����^|�.O=���9���:��:��:��3���4����]���$�^����N�i9�>}��������U��x���y��+����+��bd;�b��
t�w�__��m�r��0*0�����-+�w|+�R���|��]�b-��>W%?�_��������l��4����v.0��%��&!�]a�;0��,jd-�)�k,&��p���S)�=.��o�������[
�����pC��}1�m��M��-������u~����Qx�y��[s"Y{��X�7t���9.���[�ic;�\�a*V���2��?�%tl5�o�z_��{HI{��hw#�aZ2CK�����2�����]u�fU$�Y�����u~�����u{�����}�;�a���c����a@B���(�+M�c�z��g[u��������Ky�m@9[�[6Y����������������{�������j-��5��F�Yk�K��a>����;����#�uw&o|��s�r�zo
lZ���-c^U��2a���79�_ +VtwfW�4���`�w�I[a�[�>�l<��2����I��S��W��n��:���9�h�>�d��/_�x[.�=��|�ws�����c��w2�NN�u����D5�S���T~+�]�]��B.����4"���`�t�-�gn6����"��dN�9Ckn��c�W�p�Eg�<Bo��y0cK.���;�7�k��8����`X������>����^5�=��b>�Co[��Ah�n������v
��{����i��wKn���t�-���pPm���k������z�3,P�b�Oc8R���w��E>�k�c�����6~�-{'L��������Oi����"��hO/�����4������~4�s��;h��6��hRg+:y�Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y�:Y� Vt��u��u��u��g'�I�|��{�?���i���)(������V��N���i��4����Si��S)�2�$��/�����u�H!-�h!U+{a���E(��id�=:uEoPHE%
�Z4jJ�(l�6��iK99

��F-�zI��Q�*�!���b���c����m*l���u���V�	=EA�9�$���Q��K���$��_������cB�_Y���aB�\���x$�[Y��)����=���3���cF.���U<Y�c%?�^5���U�McS^�n�������7|��9�]�I��/�n���e��k��)����cB�,����e�I���Ho�,����T�d������_���������r29�B:�f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y���`j%��f�Y��fb5�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,��K05�
D�Q,����)G���v���bj%��+6i�Y�|��|>�O�l��ux�7�7c������*�N�;������a�_��������fQ����E�g�~GGY��O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����04��
>3O����07��5�6(����/�����F�Yd���_t&�������'A��J�a��U
����3�+�#8�1������5����/o�G���1���d�R��
��W�{��|����B��g��Y`��j;�^��m��e_*L��\�~�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�����]�fN2-f��;�_�q��y��7�J|����Q��-��><c��lE^������t�jBE�Q�
d����{�_�w���]�C��{��7��Ld�Oo�G���\��z5��
�n�Z�O�W��k��aZ;j��|�}($(�7r�$��>��Q���SIE����Vl�;�%���P��y��5�� ,��C?w'�l���tK�*�;������[����m�F�V���zmu�j��~��Q��w����k<o�5b�x��4���3�Z����n7���b{�~.J:�b�bzr<ZFvi��(?>72NA)H�oo�G���6l��l�� ����S	�O�i�����p�1On�s������;���Y�g��F�wm����kS������X�:�FM�����]t��oFK�cS�l�p�}��u?�~�cm��w�����\m6�������pd3��9�������������c	`��v�9��~og�.���M��o�G������r������2��nu�sk�F��{�X��F��������Ti�E���vW.o��22���<�����t���n���iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�F�.��iB�P�Fh[��{�F%N)���]v�M��.��&�[�:��L�/�{�?�RB4��������j�b�F'��W����v���k7���3�X��)����_�f^y�+WS��i�4�2��9�}��e����L�d6����h��e�m^�&�(�W��FK�8���:������b�����������9�'����l{���/��O�W����������h1�h����V>
x��4Gb��u��}�s$��j���a�Gz78d��n��,����{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{`���v��{oY.Pg�rx)���=��`��;��=�;���)F��W=��Z��Y����O~N��=�n,&�?��������}y���r*�������������"�������{�?9���o�\�j�#���'��al�Z���v������C�������O�W�����YX4������]����o�G���Z���bL�r���%�LVj�����o�mJ��Yf2�/�y�J�9��5��f�m�����s��rS�����]��l��4�S1������{�?�<�Ic������!���X%�&'l�VS��W�����U�'��U
Zu6��L��<�k�7.�������WRv.������4�y���&i0�IG�L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0�I��L<�a��4�y���&i0_W��P�2��K�%H_�����4�y���&i0�I���Q��?r	&4b���������R���S��B����Ye�_�/��FA������T�Q\|1��}�<O����a�a�M����2�����m�CDm��t4F�
�cDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
�CDm��t4F�
��K3���dh������h���#n�����6�h��#n�|)o(H�D�~��Q��v����Yql[��N����de������m��F�{����5����n��p/t'���������������(�}��E����Qv\t�B��B��d�Q~W���Y6�m���gW��M�v���-�K -�����|\��ux�=26����[	6����.3����Q��z��X���c�<f�O���%��9#`X��ke��x�.��/H=��t}������e}�K�l��7:����������Z�Nh�	E�&���$�Y%�����E�!���arHT��9�r�����~-U�����s�sw�8Wm}���S6��g0]�������y�RX�q����&me��XLk�'����>]��s���������B�R'��s,�N���~���O�jf1�N��]�6����!��.����������cwU�%��-t��4��$���!
^Uc}n��A2�����5��!Q/o�G�}��������%�o�&��CVi��zV(���^j�`����XK���"�������c�!�����
��C��y����^fdK���9����+��t\�r��c���w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����w5��o�s[����^�cf�lK�F������i�c����������k|;���������k|%r����yL��MF]�-����I�?	�:�z���n�X$��w]I��(/�f�
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
��T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�#T7��
�5C|�P�!^V]��6�\�!���F�o���j��>c���so�)2�T7��
�5C|�P�!>N���Jt�~���w��������������n�y=��Up������b�y�Mne�I�8[���?��-V|Je��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
$2�H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H���;,4��
#��H����o�zK��6c���1�D�H���;,4��
#��H���;,4��
#���Lf99�#�L�I��Sv��^����29�����n=��.P��xL��������\f�/����u=�S��lKY�-f��[�wE�����>�&>3{��0��c����#i�[q���������5�:J������3V���o�G�l�Xnt��I%�'��'����Si�����m�����Y�m�����e�+[u�g(����|Z��S�:����(��{b��g[p��pw-����b��[~����rS�������K���^j�,�V�cZ(��T~%�7v��1[3�z����0�	T��/��*-6��|=�\�l�����'*���t����V���'�%��Sdsq���9���a��{l4��n��������E8����l|��w�S�����b�`r��q,=��m���#h��0���>oM)�c���r��7'��a�����o)��N�d�6[#g������}��fN|7�j���E���G��v��~:cv�[��\��ux�y�.G��d~q�2�V�[��^������9���#"��Yf����+��f3mlS����� d[l��7c����)=���7z|�AD� :�X�Cq�.��)��?o���-�T�]s�g�JVh����$�o���_������l�Q�=�����
�-��t_pt�vJmE��^�]�����}���rsg�����pi���}��u�P��v}
����/�-������;�_r�?+!u���i=���������n��������������M������+%L:����3���i��!���w$�9e�I~'���Y{���r29���>$d�OoX�d�'�Kp����[c���e����G&��g;�[qLN���[���{>�n�������c��������p{t��r�n������+v�q��s�[���������������/v����F����f����a��Q��
��;�_��w���JSO&y�8�L�O�W�3F�A����-�R����g����&���=�7g�lC�wZ�;�Z|V��kY?�"�CMQ�5
m:���INJ
M.�)�zJ��J-����2�����
W�[l:����bnM��7 ������D�&�����}�VK��SI��p��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc��f8
Vc�z3m������������~=3����p����p����p����p����p��VTc��y*I�/o�G�L�R~j�YOB����z��Y�k��h�w���&�]x!E�'��e�b�s6����a;��bq���������v������rX�mqV�\w;j����d]�l~���e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq�\v��e�`Yq��1�����Y[W(r�,/���e�`Yq�\v��e�`Yq�\v��e�`Yp[��aEI����F��4���U�����������QaY4�����������r����U����������}��kTu�?��'&X������R,IPLV)%���~_' Sk�Z��fD�o��W��Z��n����-�rS���g����-����s
1�������o�G�=����&��N:����ID�j�_�4�o��#��r�g��q�1���=c^��yCI���[z_�����V��k`������`���&���.7�#��e���d��_�k��Bm#����N�{k4U��=�>������;C�����g{@kW��M�����z|��qp!�o7���n��7d#�;�wc%�_��nNKl{�"�������h�C.s�p������n��.Yn`�KO����������HQl��g~���!�A	�����r	JG��m�5�lQn�������jnf7����#rGz_������;MY�Xmk���v��V�/��n�������'���1^?��V����o[��nlOh#�������/��=���{{q�������{���b��t�Sl���=�1{��T{�������dn1�W�g!l5U��w�3;~.J:�KV�!�R�w����{tc�x���&���(/���g%^Y�ItW�!���u�e���8<n=��$��6�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����w}��k�w�����E�l ;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;��������x��^;������=3
�b�[f{F�cq��x��^7E��E��az������w}��k�w�����w}��k�w�����w}������<���
��
M�;?�U��o�;����o'��a��/2��������~n��T����c�tn�������X4v����6EgFUc������8���2T��a������~��C7�������d������Ua��v�������vK��X_����Mj���g�oM�.�����7=2����p��������������
��k����,�����H��`�&Y���`M+���]d����RY|xw������B1��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,1�Kx��4���,�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����<ia�Xc�����{d=��I��*�H��/�G�;7o�v�f�>-�&O��<ia�Xc�����<ia�Xc�����<ia���&A�Zb~~i��b�3�������:���>L��[K;;]e/���'4����Bl��ux�y�.L���������18��/o�G����X�����W"������2	�f��Q�m?L���-��O����i��)d�e���f�
�����Lhr�"+����)K�b3C9��^���~�e.�q�Wy�Osf9,��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lk	��f�����&lf>�M������>i2��B�XL��65���a3cXL��65���a3cXL��65���a3cXL��6	��yA���?�{�?�o�K�lf��3���<��1����nc�X��y�m�\��p���������f&/��_If����c!����6�r�s��aw���6���z"���=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C����h�=�=f�C��t����ri,\Ib�>��G����{4z���G����{4z���G����{4z���G����{4Kd���,��/�{�?F0�)g���e��i��W���q���Ri�*g�������Js����R�v(�)q]v����M���l���=����Q�l�}���x���#������w��O�W��i���,�?�.V��
�N�(�4��T~ �'�6�N��5B����~W����8����k��]�F|]j���~w�*������R�h|�J:�G��BZ�v]������������]�g����
M�fWk��j���:���,��/����D�@�V�����u��^J:�D�^�v��D���\����K{f|���Q�~�YCn�v��/�����
�[��[���|�����F���+7���`����o��({�?�d����[��AV�u�F<�-��������L��m��cF!�����5�]3�C�~��y�>���Odgz�"���?HR��i�������X�s�NS�t��4�.�IM,�G�j�T4*VB]�Vl�+6��������������n���Rr����f�\Y����~3��Q�����~\�{
d��M4�A��^eIdZ��L,�K��m{-m�#}@d�j5�T��N��ZV����I���k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B7��O�����.��5��k�*�T#X�F�P�b��B5��k�*�T#X�F�P�b��B5��kO�OP��4�������]���l6���NV�>��*c������i~>}>>�����>��~CM(����5�t�c�k{|��}�B/�d�)NZ����XX�=������������<�I<�$���@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:��@�:$JT�������kd�'� t@�� t@�� t@�� t@�� t?4c�
������������6����7�����ol#�/ob��M�o��E���s�� �S��u�!�kT(=Z������3���-��Y��n��Z�����_�d������2Ls�]���{��|������u�7�Ld���c����?�+!�?69U�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AOO�C�����{��mE���Z�c{C�������������������������������������#v����`�8���v�4k&�v����~{��M�������o�������c^<|���L�������,�],��+��Q�wv\��0�n����X���pf6I|���_�^��nK������K��~3IRz��="�@����oVn=��>[%?�^�����1;Q2u|����{�?��P����q�*��:�_l�
��n1e�e��6��=6����2��n�S���1��l�P�O�W�����5������1����������Cf���fGjln���O�{�����yvb_����>o>=�r4c������S��������R)��|b��t�����������:�%�o�z�����r�,�����Q�s|'r������2���S�Q��%��_o����������1��S�U����d��1���2A��7�-���U�o����|��ECrZN��vm�J��m��6b�j���fF��Q��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ��s�5�
G<CQ���4�EmV����������j9��x���!���j9��x���!���j9��x���!���j9��x���!���j9��x���!���&��|�)�B_���T~4�	++rIC��;v��X��|���_�?�c����o�;���]f�����1���q7z�/7��p�0��]��Ev�N����������m������#<��~�a\�Sf#q�5����y����Dn&���#H�O�����5
��+��X������c�-N����saB'�V_��_�$$��g�F���L�~/�a��?�����s��9	H�K���m��k>[%?�^T�)<����>���f������u��Fb8��5�3�Ynvu����/c��E���lN-$�����'�Z���I�=�p������+Z�9{�d����7q
���\�%��w#om��/���wa,�lj�R���^�R�ji�>�Nd�������*�%�zf��l��uxFi��#�c��=����F�M�"/�����Hi{��I��Y��'�6#�Va�-��iVS�7hINBi?D{�?ieKs�
�����S�	�Op+	BQxo��7B�y9��F��m����T�=�n��������'j0�J�q��o�KH�!������������U��o��,��lJp�1��o&�7%?�^
YQ���p����������M�V5NYn���P6��e�X�l:�}�0������1�!*H��%�����z��0���7o��)%���l|�wR�q�����O��]�2����;2��bm�i6/0M�i(��?�M������j5ev^�-�,��e������������o��l!�����)���DcB�}Y��ws5m!�����������1n��X[�����Qab66A
&�L�����j���M����"3���Ej9Djt�D��<�7
Xz�����m��[pz���������`z����n�b����}�=_i�W�c�����iB����,��;@z�������T��qb�h����,�W��W}����M��'���}��n�X����lil�I���4:o��T��&n��r��/XT[vu�g$�N���Uo^��=�Fh@L�<�j�6A5r�(��n�#u[�������@=�l���2�UyW��b�6qY Q�%���a9��0X�v��"Ln�����xL�?�)eY��&�[}�\D�������jo]���[0�S�Tm�-��EE�����B�oP(�~��7�|�i��.l#�L������x�q������>����<c�x�����>����<c�x�����>�����s��}�^!�=x����s��I���}��q�?u����n��	�>y���?"m�� Gs\���a��}�r�x�`��
���Q�Y�l�3�8�������v[g���9�|��N�����p��k��I�w;T@��3���l��r]DL�_�����&X�^])��
"f��'`���f!#q�'c�FNFm4d��>O
3���>O�6N�
*����H�+d���I�S"�1A��B���'�Nb%S��F&����41)�&Kp����5��U%�F�r�;D�q�(���G�~�>��Q�����}����?Eq�(���G�~�>��Q�����}����?Eq�(���A��[���r������~�>��Q�����}����?Eq�(���G�~�>��Q�����}����?Eq�(���G�~�>��Q������%���U6��T_��7"{-F(d3s��C9�Bid��Xr�|9�?���m��6���s�������sn~9�?���m��6���s�������sn~#6��
��$�a���{�K��,���r��:{��<����� �s����|<���d��K�}/t�������b>���t)���@��F���Mnn0�������Mi��,&�7D2���cU����nL�Ux�����sY\m��
��l������E'���0M��8�i��q�^H�m,�	6�semJ��6���	���H��q�	���P+ke�J�L�aE�@����BYF�gE��gqi��M�Gq7��TwqQ�M�Gq7��TwqQ�M�Gq7��TwqQ�M�Gq7��TwqQ�M�Gq7��XwqQ�=�Gp���TwqQ�M�Gq7��TwqH��n*;����&�������n*;����&�������n*;����.����Lw'q1�}�xwqX�F��8����L���~|��V�|�F�����f�^N��(#������z~�=?A���O�G��#������z~�=?A���O�G��#������z~�=?A3#�P�
#�������41��
}�>�BA�����hc�41��
}�>�CA���������Q�J({�9���
9I��FE���Q��������z@�=$}�>�IG����G������j@�5 }�>�HF��R������4Pt,�u�LIO�=$}�>�IG����G��#����zH�=$}�>�IG����G��#����zH�=$}�>�IG����C��J�������m}�>�IG����G��#����zH�=$}�>�IG����G��#����zH�=$}�>�IG����G��!��]�SOf�o[�����gA��_��kn�m�o.G��tM���:�W�L����#�<���wo*E=�kp��>H0�t#�$�[5+��c2#!���A������H�46����E��D�|�M!�����c+����4��'�'�������B�9�\�X�\��!1����b�;��U'��G!�A����'s���?��h�������t6�}\'����F����;��N�5���}si�`�O'w��������%rr����/�:58�t>X��?�2[�����s&r2��8M{;-nS|�L$|Zm�^S'�����9��m��_9�%��=��2��O�[e����=XT�\y=��e`4.�K���������7��������������k\�Md�c��f�D\X��w���d��:��R�n�,��f��i����vNe<������'Q���d�+�$��7��cS��A�>���Y�9'�2���2['^7�����^\���)t-G����	�r�U�t?R���"������L���.^�7�2���,�G�d)�v�����w�,�L�|��-�=�������&���R6��K��Cn���(�	/�Wy�$��~y,�VSo\�E~��odmN�[�"�2��G��ws*f20�#v������m|������Kwj�����&tp)�o������a0+����3;ww�����*jC�����~[�dd&3F����ec��cd����o�����B��O�����t3-^�Y�v-a�,��C���������L�m������'��pp���'���.UM�fv���������z�������[)�([���[�c.v������p��tp)�oEl7����d]�qc
1a�o�o����������J���x<�W�*����3o�&G'����2Qu�r�����[
����W���3s$�u��3L��
������m��v��zV����6@d����m��l�L��E�k��P�n��s�	$F�E��
��!"X�C���B|"�Hb����5�-'��S"4��K�*�H��*��[��,�d>	�J��������l���S,�U�b����XYj�$P��hI*5R-O�V+������-d���1�#W"��
��NQ�4���l�'�PY$V|$�$W��6R	N|�H�*�H�_�?������y�nn�������oVM�+���,K_���o9/����Xc��Yi���cY�|,g�s���������Il��u�����.����i�>{��-2��a��.�u���n[4�OF�
3�N�����77a��:.��
�j����)�6_{�aKj����,bpr���)�SI>)�3'�����n�����_sV+[��u	��{}���e���(����v|��h���899��<~�LZ��L��s���6frF/oomv[27n1���u���b~����y}������u�r�>�U���&��rU��lo�}���03�q��������S��f{��9&������r�q�eVGX���7W�'�o�����)�
�v����7z���b���Y����t�N�y���df��;�������]��89�n�
3'��{\N�'����������C����A��K���x��y�����e�=���U��|��s����{G�&�$�M��r��������_�k}��������Yg]���x�kk�����7��k���T�gM����^{���A��u���b��������{ogVa����g�C�+mv�Y�����y����������l��_��d���!���9����o��1��l�F]��TEe��tFZ��M����.���eQ����(4�6���S#�~�p���B]��s�,O��n*��=�C|o�	��g���f��5���6�{�=f7v�7�da���v8b#/��Tn������}�?���� �;���\����F�CgC���)(P������fm��j��69��������l�[��b`^����n�s�Y�p�T�k/p&���[���&�������|H��s~�r��O����6��s_�g�Z��?g��xe�F���q����F���`��m�v��St��d&3w���������_���L~��v.���W�k�������{�?��?�{���6mk�f��w���WbV��3q������w�%��i���=���O?r�t���_m�;*���^8{k�]�����o���=������x������?��G���k�}sv7c}����msH�=/l� �� m����������qwv��7��������ae���>Gd��(�w�����V��]����1��	��]���������IPM.�E��������U(�z�(������J-�JDi)��,��<��n����P�v�1g�Sh�z4�J
�)e�Qh����V�%A5:�L�&�*�Z=l�HQSR��=����
��^��;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on;����V���[���on"��s���Zn��y��\��w"��s8;�s�{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gpw����w{���Gp�����w{Q��pw����w{���Gpw����w{���Gpw����w{���Gpw����w{a��pw����E���cj�}]��<a�X�\g�R�@��-KC�9��aP�
5�B�i���f��N[0��}�1��<%���3��,8�'�&bk�Y�Iy����0��x������G� ���rA�9 ���rA�9 ���rA�9 ���rA�9 ���rA�9 ���rA�9 ���rA�))�[����-gB��k��HF3D������7R5��B����Z���'�s	w]��mZ�N�{[hBh��n1�7~X����KTI:��,X�Q��X�/ ���K�,���Y��<�K	$����I.�U��l�}M%R���@���FZ�m#���GZb�)�F=N"ca,z��.���L����ucS�c<��'D@�L!?�V*��
5�|��c����igsK�Fh��ni^\��|xP�<�k�C��b���`o4���F-5U�n���M����'�2���d�UM*����ar��nyD�Bh@�a,!��E7V���S_;����~x���h�{��t���������]����y-����gq��%��o>���.��2�$^����U6����������q�7	[[����������5�s�s�6a��9�u�m�����n����H2�����m�O�s-�����x2���d�f��w�y�c��WZ�����+fa���|��h��q��;�m��e����Y��c�^�j�=E��5�1no�:r�x<l�o���G�[>e&�9��veZ�����v����F�z�u�;7�k�J)�����6P�����nA�������t}��I�e���������x�k���u���p�gS��fSg���y�sG�wv|��.]�7j��t,�p\L�����v��i^����hrO}�:��|���e��r����wp��`�
�*��j��{�e-���,����
&���o_���^����7Q��{��*����/3,�����2��ld����}�
56l�r�v���32���qZm�3s)mf�O]3r<����
���{_,8��������]Kk�m�3�;w�����f�����9����s�$N��m�77�&�L��H��_���#S�&H�{.\yu���������&8�[Y�����N��$c|�~ dF[O�1�!32;��nr�q��7sK�x}���$\���n��b�qv��F��L/�S��]�I�X�����/����1��[�`�EdE�kc>zn����dE�����3��`[W����l~���������r�{m��G�i���������/���0�lG�?�i�#����!��,����i*����a&b-����O	p�4e�����`�y��nX������A�Cw�S6�h�oz<3�g�uJ���b�{F��_���zA��v������$��_������%��g�;�Xul]	��vUP�N���Q����Y��5�c���$Z�<L�rm�������s���=�:���hO/�xh�K������#b�������V$m���r���Y��\[������V���4m6��w�V��g�t�����BL��0Oovg���;����p����)��ne�����JX���j��w�)��r����-�9�sw�]���b��8g�������dV2�B0���H�G�#r���Nd���6!gu9���3�Z���
��T3x��m��6��q��]���0�w���=��s3�r�d*0�`�Q^�@���qgv�X'�Y��7��e��'�E��;8�����[�m��_���;;g�]����a���K���	�a?��POMMy{��n�]�����g���6E���\�/�:�P�r"�E�����I
)Y����J�4X
�T\��M�76�=��K����,�f�����46���>�L~���Gr����I�R��[�������+q�%T��[��
�7:��4�4�r�����:K�dH�y��rI�u�	�8?q[T���>i��1�?>gX7[��vv����n����v��c�N��yo���rdR�g��W_9hP���������;�c�h]ke��[���m��f����[�fsW������������g�X}"y+3vw�xIv����W�#�%k}�u�����z��p�#�\�����A`f�%�2�����h����H<�I�Q*Be!p�!s���MOM4�&���/$� ��*r����e�X�,e������$sBT���.0(�_�������}���aj����w��mL���n��L�C�~*����.[���������5�>�n�O�l��;��{d
.}������`���e��[�nn���������K��w6v��c����6����fa���'6�z1'���`Y��W<��c
��t��/�"�
��<�����M��@��vs�1��/k��~�x��mg�N�,��0��
����K������@�{�����so��������)��eL\�A)2���&O$�KK	��s:p��T���	�\�&X�	
��HI/NN��`�HK��t����d��_�����������#a)s%.a2@�S	dNT��1P���If"I�-)E	�\�)a��"	��t$��K����M$����u�}7{El�������,T.6���=��/�$����M��`Z�������<��l����X��n��c-1��*�����������+�����q���;�>�����"�s�c�%��{��n��>98y�u�w8�an��������o2Gv1�����wO�Iy�b[����yg��_�[h�r�����/������Z~���aov���m����w����rm��������:��/�#b�w!Re\�����$��<����.x&*�1q��!Bi!4bL�DO���LTad��FT�Xr��``���$B3ybx��f"X�B�vE���6����|����9��k�[tf�79Myn;��W��Y�����.Q<�z���;��DL�c��Q{����E��nt�F!�?�eK�Y�su��I�4���m���+b}�q�l����&3l��m����`���n�x������Mn�wSl�d����h�����u�_��tq�$6�����x���U������c�t���*X����F��0;��������Vv��5eYh��8|���������Z;��3gj[���0���f�l&�}>'n/�f��
��c&2M�v��m�\�sm��c���F]]����Tm���������6���&:��U`�D.1��!r
�������[�������3����sp-2�;[�W�f:xG�q�|\�T�<�QMynT����S���fYe��#c	��-��=�b{���o3�R���=���PM�f�-.��?r�����z*�7N�"�Ww��C���k���`���U���y��mK2e�@uM��hO/�v��m��n^�Q1?k&_	��o�
��^���a}���Xg���-����.�_n���*��8��X=��zbf���9Q���
��F�[\��#�a'�����U��*�)"��b�l���&�f�������(�����@����9_��_#s�vM��}�237v�r���K,��?nm�)�6�����_j��r��h���d4[����p�M���$�{�Z;G�S-�����W��l��p�72���+8���G�O���^�a[#K���T��vK�����������`��NLw,1$���E:��4
6i�}�j7&����e��1I�M$c4������;|����i����rv�����N�{q|��0^�������y���\.��x{��~r0���5=wi���-���k�5|�V�[�e]e��G`{�2��D���.X�1p�JL��$�M@��P�k>��)J�zC�(��L�'��� \�&.2�r���Q�$J D��p����L�N^n�|��H."�t�"\�C�\����e�� �HMe��^I~��j���u����
�_qC�Z�]��?���������;�__�N���#)[n��?9����&){��]K8�^��n�{~v#�Wsu�*1��o�x����9���%E��[���p�gI��Oo���������]/o�f���E�1�c����A����P���_V	4xGx���l�~�L���#)j�K�~��&i��e<9I�.M��Y#/JP���q[B��	.�P�`T��S��$�&�*X�,c*i%N\��<�.	��%��bd����e.�%I0�<�BI,�*X��!2I,!�FN���L���K,$�����%V��G�{����{��5�E/(p���}�qS=����P&HC�����FYXY�m=�M�����B�O����&o���r���T��6z�
�/����D�sK0��N�%��y��l���V�M�-W�p�����ck��,��X������?j3j�?(�4�BU6��n��\����M�������1F��E��L�59��	��K�+�06P�$�{+�i���2���:7-��{5�Y��h����nA�[�on�P�c;K�E��������i�����w6T�1Y��l����%v����a��d�{��O�Fn���c�+#��i��0�0�0�0�S�g'��PY�Bk�n;.����o�x��6�����������#�d�v����4���v�v��K�]I���_������_l��[[��h7�����K�*qm�pX��������������������������������������������������������������������������������������������������������������������������������4�����"���_�}��;F6������n���n�K���X�o�w�,m�
�,��c>6���"���4�x����Zp�_!��C�G�{gZ����D�K�a�a�a�a�0��%�C���6N=��I���%���4���<?#O�����\s}e����I41����W�X���i����0�w�Xi�������	f�G�i'�g��v~#:>�����O
<?CO����&������O����4���<?#O����4���<?#O����&���X��/�����4��Fy����:{~�4���c���O����4���<?#O����4���<?#O����4���<?#O����4���<?#O����&����_��8��q�<?cO����,�y}�4���<?#O����4���<?#O����4���<?#O����4���<?#O��<?1�G��1�����X�_�����6;�fF8���i���2c��4t��B&���yr���,4������4���<?#O���8i��~=�$+�wh��� 4��4��
:>CN�����4�������q{�r|!q���C�3���d!�O�
9����G�K������	�s|'�8��D�����r|%���H�c���lv|%�1���4��
:>CN�����4��
:>CN�����4��c��q}!c��4���������c��C_^�G���!�G�i��t|��!�G�i��t|��!�G�i��t|��!�G�i��t|��!t}8��1t}`4���i������4��Di���G���!�G�i��t|��!�G�i��t|��!�G�i��t|��!�G�K����K�o��No|!�'��N����(
:=���G�i#���#w|9��o�D1���Hc��,#���c�G�i��t|�� f8����V�~��HC���k�7���nh�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h���T������fs3���C|S����������������G<��@���c��9[��)�O.,n[ee~K��}Y`�fuN�2L�����,'�^1���������������c��U���jw7�$mh��]z����i��F�/�*~*`�d$�[y��|��3����51�<y�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�2O)��7?e��Q�w�J�m`�9�~'������v�n7L�n�F��-�F����DsDsDsDsDsDsDF<F"%e�+��y�,8r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�e�L*�;r�����P��*.v��t������9`9`9`9`9`9`9`9`��^,���o�*e]/'���k��Qq�2����r�������d�V3	2�����^1������������������������������������;a�������7�bB��<������.e��Y���M��NOf�[k����'��0�f����������������������������������dZ��8��s�W�����m���}�^�K����0�0����J6u�T���sKXXXXXXXK'Y�;f������)zDl�J�����f�ll���&�H�"�%���v��V�6�����9+\�cc���&�O�Dc���Sq���L-�^�as�H	c�;�B�n��Q�o*r`{���������l;�v�U7r7�*�V���N�Ls�c4~Bh�|G{�cg���.����-w���wVxn��;o����YSyd�����Q�??���+/��\��sC�|���������8���B��f����m�������Y�����x���Y]y��^�\��,om��2��%�H�se��;�<'��wp��6�Y�=
}�����s����%��G9����mUL�xw\�U�J%��Y����<��a��{C(��q|�q�lR�-v�[���I��uaY�5��zI�S#�D���b��:����=4d���b�1C���P�(s9��b�1C���P�(s9��b�1C������fKk�C�& ;��X6�:����h2�e����P�(s9��b�1B1*0~1,��h�����g#������52�3��b������w��������P�(s9��b�1C���P�(s9��b�1C���P�(v��A�m�r$l.���=C��-M���L�4b�?����6��kC&[jC�mYp0��1C���P�(s9��b�1C���P�(s9��b�zQ)�H�[����-��E�7����</�o����S��N������O��
�)�/1C���P�(s9��	��c$����'�����$���iG4��Q�(��sJ9���iG4��Q�(��sJ9���iG4��Q�(�5bsb�����
��e����Ii��p����iG4��Q�(��sJ9��pVng������/r���=�����1�pp��{Hr��.�d�.<�oE���9���iG4��Q�(��sJ9���iG4��Q�(��sJ9��c;Vm��E��������2��oWq&�#
�F��a�*."��f�c,4��Q�(��sJ9���iG4��Q�(��sJ9���iG4�xHd���t��w�iG^$,[w�����Q�WsA�m�3#�l���l���%��sJ9���iG4��Q1��b����x�k,+�t1���i��re��A�&Pi��re��A�&Pi��re��A�&Pi��re��A�&Pi��req���M��cwdJ�����iq��0�q���re��A�&Pi��re��A�&Pi��re��@f>3V9�K~f&:l{e�4����.��y�~f�1x���,1�����(4��
92�NL���(4��
92�NL���(4��
92�NL���(4��
92�NL��92���yfbd���)x��'��c�Lye������c�&#�L�F��A�&Pi��re��A�&Pi��re��A�&Pi��re��A�&Pi��re��@n>3D���n�Yh�>=1��>=�S�lxe����1('YHI�&Pi��re��A�&Pi��re��N��nYt�C��\�syU���p��*4���:��N����*4���:��N����*4���:��N����*4���:��N����*4�������G�yc>=�"��K	1���i1���4���:��N����*4���:��N����*4���:��lf$6;f��c��
�!D�����X&�y"��LN<��.;2���YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ve��`����#!&92�L��R��f��\f�`�T����O�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��ueF�YQ�VTi��zf%8�}d�,�~f�l�������r/YnI1���]:��N����*4���:��N����*#���an[TKN���'��j��t�g����MU��8�7���-���8��_^Y��D��>f�d�J�����2��1�r�a-��m1����}���}��
�?N��Or�T
�Q��M��;��;��4���C�:�����d�d�s�W�B��w��DdS�iH��!��x��7��8��������k2��
]�[uo����f�ULZj�=�7:���1+�3g2d����E�>��O������+�>�K���V�]�~G���e�c/��&�d�����,�k�	�f��)�B��Z��b���-
�\c��+��V�
kX	����YF1/��d��r���a�����b~���9��}�y�����1X����Q.���0W�'n[�$�\ ��a,x��������s���CR��r��b���kqv��w��9�y��E�n������Jo���R��9��W}��p�����r1��J9�jw��_s���gm��1���m�e�!�~�R���K|�q�,�kr��p����Vf�d���,�Sq�T�[%o,�M��#���,���>G}k>�L�g�����;�L��/<���&%������qNHL�<f�?"o=�uzn&�!c]��d�1�5J��x�p���
�6��Q6�������M_�Uv��1����C�gn]��3}��[�3Pwx�i��w6!����1�o/���2^"��Y{{�)�n���$��xf?�wiJ�4����Cl���c�)��l`67f����(����#w�&�����+>Z��%��fa��3��
����t���e�;u�����
����7���Fh�'�><����������Y�������{=�`�d��������*���o�����W,1�����a~��TZB�_�La��(z����������(z����������(z����������(z����������(z��^�D���X�[ZY��TH�J�IZ����_��c�	o�&I}we]�C�vP���=we]�C�vP���=se�vv�EG�E@�/@�Um�b��X��+����U��R�hQ�K4���$���������(z����������(z����������(z����������(z����������o���f����������C��4��V����������=we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�vP���&��y�������Hg-Z]��[�
V��W�Y��Z�W�hn��{-��/�*���=we]�C�vP���=we]�C�6_
uY\�#��Z��@�����=we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�W2�_��vi]�n)h,�j�;��&���+�vP���=we]�C�vP���=we]�C�6P���f4������9��9����,�r�*I,�pA_�)���
B���@M�b�	o�*Y}we]�C�vP���=we]�C�vP���=we]�C�vP���=we]�C�vP���'
nKP����J��R�B�R�6��'��'��t���UR����h����B��a_6T!��(z����������(z����������(z����������(z�����o�.1�	g�$��J5
�Ld*�[r���	����>����P-�+-J�W��Y~��������(z����������(}��������������(��� �yc�#A���F<�1�� �yc�#A���F<�1������;����aO���r3����q7�����l��$1���
KMPW���yc�#A���F<�1�� �y�^����R��o����f<�,|��W*��3�����~���v�)1���A
)��� �yc�#A���F<�1�� �yc�#A���F<�1��i�'4���T�����:���o��3%5��Y��A�\,����I%j?�$����F<�1�� �yc�#A���F<�1�� �yc�#A���F$�%0U3�	h����tskYK�����i@�yc�#A���F<�1�� �EN�Ye�����D��y��$����F<�1�� �yc�#A���F<�1�� �yc�#A.������;s��NC���kl;����V��l]�1�Eq��)Z���r�p���F<�1�� �yc�#A�������E5ncL�������Egr����g�P���#>-.Ec{�Z���yc�#A���F<�1�� �yc�#A���F<�1�� �ybzzYdp2?�w�	JOc=�T��ZV����g��w�m��U~���� �yc�#A���F<�1�� �yc�#A���F<�1�� �EHE�z��y�����KQd)�{6��J�w�&���f	�l�,�������! �yc�#A���F<�1����L�����������!r�#s[x��mF)ohr�RSm��2�y�v�v?����
��S��������2_�M�����Y�<?�}�P1�����F�yb"q'3�y�t��_����S]�#	Z����y4#��v����	�2�:=�pB���|��y��ofr8��s���dUGp���f�c��0��|-�1�>K//j�q�-s"�O�����}����Y\u�����	�����?����Y�������;�`m���x����t����2�C 6T��Z�T-q��0�y�p�I��m;���v�����$�c����q	1V�����	��K3���!���a��O��t7���+lcfmp������1�mo+���������W5����=r5�>����ldk0Kg���tm���0�c&�()�����X[�;�c[���Tj�saD���(Y$�����^�l���X�i?<?��?���������!p*��������+����n9i�V�8In9�J��n#3���9K��1�i����=3q^1�f��$�xY7����e���	����b��x�S�\W����_c0m3���&��B?y�I�����SfqO�Q��f���u����Kx���n�����E��������N6r��U�y�P��tlJ{����n}Y�sf�O:�m�_�9������lq�h|��'�V_�����������xPlv���J��d�;��[��^6c������X�N"��Df��{�2�����'X/���at�����1�4����N>��Y�����x���u��+l&#y�{z��|�.i�+�?x}�$Z����[���������y��k�m����m-�}2k.���.�[s�_�~1x��%�3���
�q���B,}l�S"��^���X2���g��{*�����L�����<g���6,�#��<��E��]0��Rhh��7t���!�wHh��7t���!�wHh��7t���!�wHh��7t���!�wHO�����:�\����0���Xa��8u!.�H�4t��n�
�CF�����4n�
�CF�����4n���������7txC��8j�M)xv�p���#�N�g��CF�����4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
�CF���:|!�n�F��N�V\@uS�<uL�L6s�as�9p�WJ0����wHh��7t���!�wHh��7t���!�wHh��7t���!�wHh��7t���!�wHh����F��P��r�<�n��b����2���,���J0���4n�
�CF�����4n�
�B8l�qa���h�I2��������
]Ia�wHh��7t���!�wHh��7t���!�wHh��7t���!�wHh��7t���!7t���nqR�p���h��a�� �
])�5ta&��!�wHh��7t���!�wHh��7t���!�wHh�����$�=sf�GB"L/s�/G���#��:<#�.���������4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
�CG����#������:u&�|6t'��]K&�%�6���7t�4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
�CF�����4n�
��'�7@��r��h����a��$��RC�G<�c������4n�
�CF�����4n�
�B\3t�;.�������^� 8@p���� 8@p����
�wV���,�g2['[��rK.���"j(����[�y���V�	��x�+'2M����-��/�s���q��� 8@p����_n������L_6�W�{q�m���U�n���3�"�G������������*J�c$�� 8@p���� 8@p����x�L6��~����hL^��P��e)���_�P�n2�T�����E:&e�}���'��� 8@p���� 8@p����Y��f�����]o��9b�C�������r���x[��a�8J��*���G�� 8@p����?����D�F0�� 8@p���� 8@p���rm��gl�Vf[j�i�lk�i�z28������e.�8�����[�7j�^�����kd���{�� 8@p����ge}��.���S�?3'2��)j����+������7���^���x��U��d���0��8@p���� 8@p����@d#�+��~s�;�V\��{uL�r.#xVU%�[�=������x���,�Z�K�� 8@p���� 8@p���if��-�+������p�K���J��+=�^�u��lkr���7]�}2��d��q�>������x@p������x_xkj��n7l��>���I$�i�%J��A�_�V�W�n���f���B3���B���t���9��_#��m���E2zT��L4��l\��4�y��|���oi/��3�74
���0�S�%������f��G.�r���p�:���g|�d�-��N�X��q��C��&����c���E�7	#����<��[/����d}��#1�m=1fn,���������l��^�3w��|���*��7��J����������c��e&?������9�U|�qN���gf�������c�t�0�����=���_���Gb��wA���&������o�f���[;������9p�|x�������&@6����1�\_\�}��>��)6���'���l�{w�����{�Z8c���9�:�:%{�-���TL��vM0������#[��<��M��>K�p��Q�1M��hq���8�q����0`8�q����0�m�}�:^��>&�����G�+d2}��q��� �������4�M�S�FH9^�J=V�cYf��9ye��0`8�q����Fb�N8��9��j��iH�������|p����������L�	�������]�C�����0`8�q����0`8�q�����e=*��kov�1-wo��%2#����z��!���p�/z�?j�9�����+b������0`8�q����0`8�M4�\���Q^�����7�9���1�X���GcC�8s���t`]���~��Z��O,'�0`8�q���?19f������sa�9�0���sa�9���F^[�\8���1���C��J�����U��
���Z��em�eC�{J�������<�,�l�y?�/0���sa�8���Bi��-�V?���c!��nQ_|_b���Z�&��[�~b{�o����v�6\%r�'0���sa�9�0���sa�9�0z�U.�c\���~+�\g��o[�F��+.����t�m�wQ9�l�����Z�����a�9�0���sa�9�0���s'�1�M��������Lg(��-?��%a��������Ky#�}�l7���2���H���a�9�0���s~����|5�<s��:�v�����'lk	��v�����'lk	��v�����'lk	��v�����l�w
*l�w���rIJ�wX��x���Z����wd�X���/���0]�a�'lk	��v�����'lk	��v�����'lG1��Ln]����v��,r��6R2��*i���.e��	��x�����f��XN���5���a;cXN���5���a;cXN���5���a;cXN���5�����6`���r�����������wr2����ir��2Hf���G~2C0��CXN���5���a;cXN���5���a;cXN���5���a;cXN���5�������xe��2����,O�.��I������?/�R%�^;RL^`����'lk	��v�����'lk	��v�s��`�*����<a���7�j��/]��W�����5z��^��W�����5z��^��W�����5z��^��W�����!��f�.�>yr���5v�#���f�/F9~��M]�2
]�f��w������|j���w��]���|j���w����w����wa)yn��	2���%�'��l�wI2\�x!1Y��e���w�����w��]���|j���w��]���|j���w��]���|j���w��]�6^�P���iL��^s'��w��wg�t�JQ9p�B%���Zy�����_;���]���|j���w��]���|j���w��]���|j���w��]���|j���w�r���ur�O4r��������+,�)d+.�$�_�q��j��6���|j���w��]���|j���w�2���c�:���C�������?���QJ��y}���yW�97y��%�s����3Ct���V������{��b������
�����y�z6c�I�
f��\��h~�~�w[M���YY����YB���
�������Z�k����&o�6�i2&���������p���Wa�f&�&������Xl����Z��Y�61�}	�i���%�
��������F��X=��;�������d���mn�d#���Ye���1�r��vn��a�'������t�+5m������,���s2)�<`����&���O�K�$!V_�������x��������������ej�C�q.�y��1���|s�����mq�����q�����ZE2w8��ss�5v�&�����c�ql���bV2=�����L�2��s�s�s�s�s�s�s��N�d���2/2�<����.Yv�q+��.��U�|]x��YKh�U��==�;NK�����?M4�e������������������������������%Ae����T��5���~�E
�|�8�1��Y���{�����NS���hm��V��l8��a�����������������21~�����|\s^k,e��kk�W \�o+�l��Z��=jn
0���l]���������x��?���������J���7>c�!�����E����������Y��[���ad��S LY�kE��q�k�����0 �\t��f���k�������F��K�aZnS�V��(�4�+#r�}so�����R�k�.�97=��Y��l��v���
|���y�:����5������
~����}S�X|w�Z��:>�k!n1�iQp�t���M�h���\���6��"HM	�B0��lw���G+y��Zc���V���G�j���j�����T���\�9����<D�J��>W0�����V��iMNdb��5w�y�[��m���x��6B2y9������K�
2Y�`�C�l*�&�����y,i�=�����c���p�>�u���{�����W1�5}�lR�IVa��/u�����Tv��!��f�m{^�d[=���i���&���.�&���90�c�mZ�{n��
n��%�;�����\�1�s����R\cPr)���s��M��dA�.~CS��5��7����kr�7�E��eB�5��eX��7�F����3,��3@�C����������.mL\�,�9���r�9c���X�,s�9���r�9c��PIO� 7l���9���s~lf��j�.���-m��u[9��$�W���������g�\a�8=�N���O���X�,s�9���r�9c����Y[�W*��l��w%�g�:;��X������F���v�%c������
����Bs�9���r�9c���X�,s�9���r�9c�����Is��sb���� !vnf����1O"ng1�e�{	��|p��W0�[��h�W��mp;	�����X�,s�9���r�9c���X�,s�9���r�9c����m#�g�l{$�Y*q�4�f���]�F#b�F�o���t��o�kn���y����r�9c���X�,Ld!B�3�%���+�\�<�����������������~�I������*clg��Cd7��gc�x[��������`]X9�����5
S�e2����o���u�0�D9�8�8�8�8�8�8�8�?�!�Om�E��o���X�;��Mki|]�#\���7e�G�q�#���c5v������������������!�V`��z<c#�6�>��8�l��L���Z�����Xu�9p�3����+�69,�4!�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q<�N�Q���g������Xg,
�V���������-K��f1k��1����������ca�P������h������G�m���pzf����m���pzf����m���pzf�[��'B���z���q��Ke��&Ci�J\���)h��Y%�KU5"�,�a6=d���i�������6����=3nL���6����=3nL���~�!�Qh��P�m�D�*	h����K��o�hp���XK=�,d�-����nL���6����=3nL���6����=3nL���6����=3nL���6�����<�
	s�
���������v����K�t���F�BR�	�-�np���=3nL���6����=3nL���6����=3nL���6����=3nL���V��4	M����-���oF2�-�
�����ht�6��1~���m���pzf����m���pzf������T!	a����������M[��V����=5oM[��V����=5oM[��V������e6����K�)i���R���J��k�ON2�����nr+=����-Di)�X���'n�T�-�����=5oM[��V����=5oM[��V��fPQ�2k�������4��eT5+���\�D��������x�W�6����ts&#,p����l;����xzj���������xzj���������xzj���������xzj�������GM�v%��Ltmn��a��%�����]��D,�n&�e�~���QO�jM��C]u4tk��u���UE�E�N*��FIm�zhzj���������xzj���������xzj���������xzj�[����.������#T�[��P�v���S�������S���Um��mP:^��������xzj���������xMl[��$'�y`�8��A����6�������X���h���w-Cu}����v���r�
�|8�E������+��#v�^���Cfv��5Vf���f.�{�m��E9�9�48�����Q�>G�5��!�M�T_8~�����fr���������������)���n�>���tl?�\<���[�pJ�>:�`Tw�v]���)_{of��g%�W!�������u��7e�&���|�o|�U+C$_��$���LYs���>2����������m{�n��#�x3[R�$�7*{�����yG��/o�q�xt��a�fn>��2��di'[�V�y@��������.�iV�-�����f���f�7�c`��|h4X���N��9�2e��R����j
�YlU�r�a�����"�������:����.��?����l�o���+p9CH�������S�HlDn0u��R�T��F`�����|or�b[+�����8���2,\\���GW�/^�����5�;k�z�{q0LS�;���������Rm�|����s�z\r,�)�i,�������|/�n/oLk��aq����W���[�,��W(V�)�[��,�h=�m������b�B���/,v������l���O�����6)��8��E�������+n��q�N�9���\������;��Ms57����
��d����)�r���<$����<��n������V#�+�5����f;d�<X���>n!�8����7�:�Me���v�I��a��=��`��mm��WF?��o\M�co���Q�����2���I���m��7��+(��7��������I������5�N��5^}���������w9}��d6�>�Wl'����:i'?7������z�����������9m1�X�f����6L�����o�a6���#��g�U]�x�l������o��nMw375�����mM�-���T����_���\�����A��s�v�~�����,llb
��=ngF+m��x������d�q��N|97>����L��uV�n�Sq[�2���49uF�k�\��U���W5�|�;�{d�f&����G+��I/"���5R��v	�=��U����m.���T������qb��9�_v��s�.���;���m9��~f�&v�5wuy]�}��g��u��d�!�U<�S��������Iv������=K
��z���6R�#�lN���x����$�G��1�/��[�Ej�`������������������������������������i�n%�'��O����j}�v��#����q-������	���iF�����4����,�q=��CqM��4����\�q�q�q�q�q�q�q�q��O&1F�w��W6v��H�����������3g�����������_<��������
)9��re��1��������������������������������6�������%���&��=�-bj9��UruY��B����B�2���u��*�n������K.�8}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��V3�nk�7=v��S����
��^'>���g\J�g��K)V�q��h�&�$�q�q�q�q�q�q�q�q�
���<��u��\���q5���`������������������������������������������������8+������-���j�_k���	M��
��
	���)�]�>����6��-0�{��}�pB3��0V��pP����.>��.>��.>��.>��.>��.>��.>��.���7��(FM��FA���(�&�8!$�o��K.�x% ������������-��_������������������������������`���{��#��
�	w��YG��y���d���!,�����C{<�{\�������������������������������������������������������������������������{��x�s�1�;������"�w��h	7��ia.��+(�|,.O�.��.��.��.��.��.��.�����X������|
}1���R��>Xi��@i��@i��@i��@i��@i��@i��@i��@i��>#Hx��<PC��<PC��<PC��<PC��<PC��<PC��<PB�:C��,PC�B�
!b��!b���@G�B3G�B"�����@i��@i��@i��@i��@i��@i��@i��@i��@i��@i��@iq"!�x��<PC��<PC��<PC��<PC��<PC��<PC��<PC��<PC��<PC��<PC�B�� ��
!b�b(@i��@i��@i��@i��@i��@Y�����!X|�I.i�p9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GNQ��t�)GNQ��t�9GJQ����:R����(��:r����(��:r����(��:r����(��:r����(��&"I�BAe����K��t�)GJQ��t�9GNQ��t�9GNQ��t�9GNQ��t�9GJQ��t%�%� L��J�0�R�9GNQ��t�9GNQ��t�9DI�h@�@B���?��?����h'����m�=F���m�=F���m6�V�����Y�yz��(���oL-Y��b�j�lt���m�U;M� �������y��� ���(���m��*�@M�y-�G]�
�����'x����Z�'�$Oe7���G�������]���
�H���:��f��s?l��d�;&�>D��_�*�*j*�s�p�����������	Xv916��5x��/#�[L�t��������,�7f��8����6����^��	�v��f��'+�":)9��7�a7��61�$�@*[���-�c��1�{�����G�-UM�|�3Fnh�/�mF����OQ<D�����<s+zu.�<n���m�x����j�D��K��:�\�������Ks)��o;�I,�����)�H��m���>���0O���m�Z�cx�Q�h������[SW$t��9�-�j��CIdg��
�8�WIL����F����[2`8����U�
F\rH��Y�/(��_t�����<�J����w��k��9�����KF%��M���Z�����p�mU��mc��U�$��������[��f����A�;vZit�a$������)��J�\�O?�'�V�Ga\��|��j-nX��L�;���G!�
�;W��73�!
T�ZP�]����G�i"qi��Hb�����c�q���m$ZI���'���W����ZW����/.'�	yh(\$�~�B���@��q@����}�[>����0����#|�C}���s���0����k[4��2�s����v���;1f�U��xR��j*�d)�-EM���(�k�����~U��U��Y���xu��Z���f���Qs�0;K�S���kP2C#N���Q�jJx����}��ag��/���,/�A��Dz��*W:m[R�]��Z?t��\l<IBL5�e����������� ��B�����Oq{%^��Mj���j��s�\�R2v��_j
bf4O����"]�w�+J�����X��O�)������]p����j�����(�geLj�"��ad����FK��[U
��a���`N�bC��)�S����h<6�Ru��/���|����}�����v/������>�x��\���(����4�������vCt�O!~g����(����6�w�^{%��#�D-�)��e�0b���Sn���������s�A�H�L��)��o�?�������3���jle������b��@b��?�C}����u��5�����i b@��_k���H�M�x?�EZ��H��R8�8�K��r�;C$h���\��o"��F�LP<ep��\��\Z�������I\\\/G��T0����*N'��6��7�qs�^�@�
��C����KJ��8���?is�K��9J��/����TI�3�
��vR��yl�����\��'|�G8�m�v��w�]������j��whD�#a"�a�����X����[yK��M&��>�uw��������'
h���G��jS<M5{K�-*�������������)���8���,����[I�jesi���j��UCQ�`b+����B���?��t���m��/eUDy^����(v��P�H%;]�u���;�i6�'G/G/d�iC�������T�9�tP��;�O�X�d�TJ�y�0&��������{��m�OY��=f�	OY������S��G�t�j6���4^m���a����R0q�.���-�L�^'%�>����o�jas�1F�yYA���Y����������p���x�4�������i�4��^�pM�ms��@ku6gkT+A:m�d�j���4��F������b��xO�{Mb�s~�x#��<M/Ol&�������.��mo��&�������e�����_���xwx����Y����%%�;/��a�A;s1�8f����`A�5��4c��������;�����dx��f���<�Z�`��Q��}�(�x�.y��+�2���3X�jc����H���2�e�W����*���6�Sw&7+Zpp�I��� B�NKp��cj��E���9!�9�`�8���h{,��a�M)���$�����f�������E����VBQ���;����i�N�v�ag����/rb:,�����(}����x]��������$�s��q?���}����<�v�#R�������]�TB���m#e�]qY����
j�'f���o�.�����\"�N#���:����P���u���o�Y�-�K:���gX�t�2		�ZpP����p�����q]x��18[��T��s�
�)�6��\ ���&�J���
iq"��:C�2�����4��<�M���c�N����Tq�(�S�!���M�t�
P���VF�HpQ}�.����D9}�Nv��=8�)�	�|N�f���M>��O_WN��W������2?7G�Zr���ZU,<jHj���\mO��*~(���������N>3���m�@�������y��2E��mXsrIW1�	?T�"��-c~/$]�o)�L-���-�z��{L�7��mQ��E[E#�Dy����H-��z-��R�$�Q�&��C��q�	j�l$��������	2���m�����QP8��,�3�p���|O�����{Mq���g�&�m6� �z�p|�\�j5�&��R��
��{v8o\n��S�
Y�tl�X�u������5��-%n�#i�B��=�����9�f
���Q�P
>��2�i{�YV�����i�>7��
�ku

�0-�k������}c�������o�]�����������Q����J��Q��i��|�^�3�������������~k�+����l��]T��G1{�����Px�I�L�Z���'`���Q����Ux�/���b����.�i���K&y{n��m*9^i�c�.�m�VxZ&�^��6TW8�8�j]^"����x�z+�[���-|�x�I�o�B�������>�'��N�a���P�u�	�c����!h�-�&���EE�8�g��Z�	�G���Z��T&J��Dr�������:'���o���so�q��2`�����J7	i�,�YE���8�vI�������so���|oT�
T��)'���C�
�%��Pf�"S`����4�KL���xb��m2����0����m�����T�Rjp�#o-q	��K;�N	��dw�/6��+gM@�����joE��=$6s)�ee�
��i�����p�]w(E�Qb���*�����
%�p'(aq�mgN{�E��c�+��M�s�����
�-��P��M"H���	N`[���z-�oi�,��V�;�)K$t���n	��50c�P�������#��c{�4��r�:l!0n���������q�@y��/^6T�^:��`����~^e���+���I��%hG��lK����f��`��1/!*=6u<]���E�<�\m���?f�y�caF�0<�m�2��al��8r�~{0����s_�?Up���S�����9��[4�9��}���F��b�5��q8���l��}�l�v���7��N��s8m7��0L���X����o$'����!�H$7��s����n.�Lz|���!���
��X�]�������v7���]����7�
; ���O�b�IZ^v4�r� K
Nw��Lm��������^�j���c�#��
���OKD���yk\q ��[�����$�E��$ai���;���.+��t��]����.#�,������7��S���lQ�u�����U^'�!���
���4��x^
H��S6j�/~)����	���v��'�����:��n�j���f����-����
�C[4m��H3�/�0���=�h�P[D���vIxM��mB��_�}6��c�'#���e�Oh�4����� � JZr�r\������(t�SOlg,e���<���m7Q�~Z�t8�cXY�������HM�w��Y3h��5�c.����K�q������g
�(��sZ9��,��Z
.��TJ���A�������9���J4���m�
No����l�/�����5�x����E��������Y14��;��8�^���|6��3N����*���	��f��ZG((|����P
��:s�=x���9j�^�����%^�O/�U�����Kb>��#~
zl��ZvhLT�5�����D;�����M�Z:m�8���US�P��J��vZ	w%�<m��F��X�d���2B��1J�D��|@LUZ�{��m6Y]&`\��j������;��zq���H��y�w�����y�M���������j������>�<?L�+A�*�@�7�t�G�F�����'��R��w5�Q�[�\:�L}��R������������{N!r�����.��y��G�-����y7���������\�\vLF!z�u��f��GH������]0�$�
h�%-A�}���0I:bE�=62����av�d|�� ����r���O��)
��j�1!�sw������J]5����+m[�L��������>{4�>�n���|��}SC�(~�bp
e��-YY�S�x0��Pu�k���6���G-]xL�XoC�_fQ��)/v�}kd>�OLU������7]�6.u����eEM��`��{���<�����&8[�%��|]@�j�����}Rht������&�E���m!�R�P�3F�B(��#(^#����{A�y��=4FZ�
&������3"tNE����IAj�E�5�J�I���#�3���;���D[x��*p~���8�#��q)c��%���i�\T��x[�H��s���������htH�1Bs����cn ���R������L.1���"�E�5������=&���fI�!����fR
y�P�h�0�Hbs{�M#�K��p1�M��|E].C]�I�����]6/����]o
x'�m�~.c��VDda`�����H�@�6����Obk����m+i�
.��#a '�i5����$����}��������J�l�jF
#2��?5��2�jkA���:����vl��LzV�6��G�U�4���Q�MR*�|r>�������mEI�7�&�c�j��'��s���s&S��;Y�a�G��B���]U�1�-5���u���!�2��u�c�!v�i��5<.�v5��OH����M��M`C1='�]M��
���w5o=��j��������H;������������eQ��>'��l3�ey�?��ZhH�5<n?f����M)��
nV�}�o	3M�����3b��A�-��H��k��JHh ".�?���251�MR��B�j���=�	h��^5���VS1����m
��U<��~��U[]>k�4�����n��8��9�$�K��k�����9���E��
�����W!{��*��,�X�5���m�m���m��o_���E#K����cyBz��~�t��i��IP��������d`�f�V�(<��ht�a��<4RmG�ZG�vqj7���y�Q�J��9c��x����Z�J]'K��L��/��f�>W��"~;4x���4�`N����0�h@9������J]5��];)�g����^��@��� ����} ��C��e�]�����t�=?�xw�/e��I������<�o�:?*H�'��#��
;��n��%D&v���VVF~�N���D����2)��E��O�^'�m��Se�K�l�TF8�T�@�_�����y�����0�K�s�������xN!w������lQ�s�o&�jO1��5��LG�"��Tk��3����G�t(����1�I<�Y�E��J`�h���)?��
y���I}51���#o_�Y%���(�����]�)����EQL��6�d�
�9��Ue]�P���^$g��:��CH��d�6��/��+A
K���<#���z?������c���'�7��Zj���@�6��w6��%=2���o��qNo��(�0iB����������z���{{m��@�I��)K�-uC��+���.+����'��1
�h���y�������Wk�n"".#���r�
)��[�p���3��*��/��8������f$`���n����r�`'�-'�k�i����7�O�<$,L9������giZc�*v�x@������o{�g����}�=���,uC�vIh(7r�P�	&7H���NP%����r��YH��l�hB5������mHJ���
�n��6}L��R\����d��J�vk�B�a��g��A��q���}I��e`�\pKJ���;D�@8�=>�'������h|)���1d��L�1"�|��f���'>���=��(��U�� KC�8�&�a�;�@�}��\pi)
��v� ���}���8�6|����#� �W)��`����I
5��N���Nf�%���v�[I&��������R��)�m����$��6��
9lc��\A���N�����������!��Au�uz�IQ#��h��������+@���`���y���bH����#��
*������I}n�@��U���n����-s���WV����l�h9%����]�5V� ��|e��	�<RK��v]Eqc	#�s*�MBJ��@;�����t�`�L���RmI�m=��t��"���X�T����v.��9���A��/{��OC�2�oeS�m���{���}�<=c�����8����(��V������^���E���T0T4���)G��{9
�6[�'nI��7��2�������<-��^�4
�(-������cf�K�}�?7���c���i|EV
2[?�g�C������^Q��I�'�������0MR��mK�V�����ZRR�-����B&��$��G�����kXI��/6����N�������:�,��Q���i��8�$
�n<���������.�k��9E�nb�q���ll�49����y =�����06ki���]_+D�z�y�ld�q|�H��)�>J{"s���J�~��#e�?�fiQ+c=�"�\����������;����z��K��Q2����W�q���7�����]�����ot����u�GF�'?/���F� 6����;�jjY����������H�J��7w7����fH�u���w����6�&��*IS�J�Ot]�vI�W���cv~j]Z?v�W��Am�����q1	���r6�5�����L�2��
�������\.�C�0��C����c+OLU��#��� h@9�4�-5C����I;�d\���x�����r�j�����j��I��7��:Z�]�vi*es��&��������r������^���7��j)�HX�x�.y6��:K�v��6���z.�)b�=>}�&^\@�����hQ������h����(�;T�~�LR1���_���[0��6y��x���=cLp�sB p�6��=wi�8��.<�~Q�������>��_�6��gSQ)�V]���T�PQ��n�2�/d^w�����2��l�	iG"�q���KT������SE+�$W�Syb��\"/&��i��������K��:�s���i38�	DKx;�-D� s��'m�H���
�F[TR�s��n�:<���!�G�����=V����2S���p(��h��	������X���:��`�'4���������I'y7�����5��K�Z�|���������}��Y[�J�)
@�B��V��^�LI��9H�9�|D���#���Q�x���R������l$5�+0,kZ]��u��T�u��?N��6�9_��8��U�U�8������F����#xQ���r�g�����d%TsYO�t�-sKQ#X9�?�f�@�N�����`~����g��sJF�����#X��Q�L�=�%-�����	^���?X�M����������g��Q��H��8qQGP�w�j1���
�Tt~�Ol�`����}]��v�N ����x�SSi�����a;E��STK���F���No?[y6��������+UB��D����_IJzG�����D� ����^�vZ�LH��wx��v�38�$��>:wd{�C]��q������������\���������(�B�Kx~���|d>$��%�S:`�OZ9���9�������v��F���Y��*���H��y&�P�"'�f�G��>B��������I���iT��Jci�Cwg����:�����@���)�����{�?���U�)he{����M��YNjJ0��P&���e}C�
v@���; ��Qy-W��}��f}dc3��#��\�1T����m����7�T���(�B�D��idw���+���Y�w���ZP��
���<L����n@@@�����i��"i���#G@��[���nZ��`�&����]��l�������=��Iq_���J5���i<EX�$D�[/�e��s ��gS��o
���
��o�n�������:���L���b�)m��K(�x�4�b^Gu�$����
�e#cw�e$����rH�P���x�G���E�GOJ�t���#��&(S-�mDg�WR������)b��������o����j����o�6|�:<�i�eBZ���^Pn�:0���
>�#����V������P�n�21��s�]�[py���)t���w;Gd��mC_vY\71�%��$��.��i5�����.!�<�]7J�i���fGv] i#<Kt�(�����j�Js"vGQ��v�����>��u*���c�eCAnv�/asS6��d"J��cH��J�kY��M�)u���3��:��p�9J{�	$f������qq�%|��<gS�����np[���,�R����N%o^�?Y�8d�����a`e�)�
�"������.�l��M����Y�0!�8p�M��xl7^�8e����4�(A�����(k���"��`�A0�C�����Kge����'c�Q�<� ��B�H���G������U����!��,`<��^�/���0���A��enr�`*I����_O)M�F��^R�O����vX6�������<���M.�Z�01�{�
kA.=Z�\�P���0��T1��;NK�������Z�Z�
8�^��w�G
���r��������^�:*S�R�mU��N��BGHW`%n���[����f�'E7fq������]$�s�N*���,d��Z�?W�-=9�8<��	����,�D�Q����q�4��gv��#����������ht�=�!�cX��kB�N$�I$�1����_3���Qz1���1������4�\��n�,�x�5����t�|�
h�qAm������'�-�A�����#�(/����cv�:(��y�v�&���ol
��P�Cs9\��
�p6�V��j���<�*�l���>"�bU������r�;{x`�i��W����[����$�
4r��<s�)��W�f���Ps
�~�]R����jd$vNLvr��V�������vPr(6}d��O���$��I������q���.�����`��"��& ��5
Z:T���-�<����^�� 0�K�*�����m��$-�@\Y�����(	B�������m�����v�r�j] ������������j�
�y��xB��4
����G������6j�;�%^N{GIF��=~~�x��%n�xp�5��P��{��T�Sh�?J~�2)�lksoS�����a *���7��!�r��OQ��=L52��C�bnks�6
�`���YP�S���v�M�7��6F����I$�&�I�����#�9�RI�$������%�?��1V&��s8w����9�p<��{)����h���FFNW���ii!�&�T>
���+����&�����V�q3q�]��kY���L���'Y8��{����B�s��k��qO�MT-�����Z:�����L���s 'dM(��<��������E@�OP6���r�����`��Q	�E������
�65�Aj*;N'� o�h��YH7>��Q%��t��-W�<�k!h�$P�����){�
hRM��'`����X�����"o����r4��S^���p�������A;�c���A'u���\ymS��4��/2��n�W�����9�����{Otj��k/&}^��os���#qL@������%I�N'��y6��.�r�z����2#�]��T1h^}���]".PJJl����������J��9ddr�=��%wZp�K5c$���v]Um.2D���T���������}�>��/���B�]:�$�8������>pj�z:�
.��a!8r�:mW�W8��=����:�����������0��_7�S�������W�������,�.s�$���T�M��y6��g��f����������<3@���s����;��V1��L
~4}9���xc�;N��+�v4p�6�@;5��o{�+�K��~d������v�����-_��?��q����FvZ��0��������8��Zm$t�8���dk�v�z���!��^�i��d�x^n�<v@��u�����\�SL�{"�@"�.�1���v�m���G���H�T=�hr�S��a�+�CG9)m+����Wj-T'��_��Vn�G��������)E�7��q�
�*�c�O.�&C��r�P�����?��������x����x�~�mA� �c������1. ��u���;�-U`���hv�q�������0#�$�r���7�~!��"���:�����m�`E�6���
�������h������	���_�\��N%��;I���d���s��H�,����34:���D��H�C�m_������Qn����(��#��r���<�jl��X�vq#�'����w���$*�9��n�v��!�K���:{�1�������#����1�Z
>�
���3��H��ss�;�
�����8�kX���� ��>��Y9�;oq=�Z{�� o���s��H�j�>�FVj`�J����T���9�3�J��J���) ���k,
�)����2���b?�i�(��_l���a�F=��I�*5��/`���9C����1�;--}k��L�=�8��$��r��X���l�Q{"E�=����q����?25�$Wj�KH=��vdp�"����<�I7�����F3IS+9��m;��Lpi��������6~�]|������j8�4�?�3���k
�4�G"
����I�!�f��k� �!A��I�z�i��j��	d�@#��xF��?��5��EC�YT\�/�E�������.��[X�Q�s�a��K�5�=���a��oK;W��e��1p��f-7���y���L��`M��h<9���n������;�>W��j��F��vR��Z�R���l�s�!�9��X1�<�R��2��9����c{GG����O��Dn�b�8?f��+c-8����?����/�W5�h��� 5�m$����c���{s8��k@o��I�E6-��(C���+��Y{��������Y���)lQ����Cx�-cAq0��/#�L�mK�l�u�#����@�����]����eLJ��G3#,�*0�����z%�����X*D)��_��
7������5�\������@�5���\�\��o�������q�GIq[���
n&�Q�6�����;�'{[�,��>������Z�aW	����v'��F��C�C	%�Tp\PlT����Z�*RYN�����F�����1�u��i��_#C�3;�lY�G5s���Fy�"<tDlY��
N������V?�k����s���6�c���;�5�J���"�S���f <��c#�%�5����H��/�-6�
��H+�0k��o"��F��/nG^�sP���-�y�"��I\v5������8:^����ok4��8�{\��+j/x>�����2�%��������� ���I�����"�V��2��h|M��
�Dx��^��-
;JZ����t�8�=g��3�a�_Z����9yr8��9��8��v~(�p����P�c��h>�������|�2��/-g
��q.r���O%�k�)Z��DD,M�D��7-��T��8����P~����m=��i�@.p��6(�kZ�`��X�\y�>�Y����ljuZ�z8�{��F�������,��*$��hV���+����o����MA�#X3��l����C�������MZ����C�qoQ6st��3bv�=�t�I!8������M*`����9Ir[�5�J�O�w��70������4x�
v��
�t�%f���^��F	�����t���x��b�������f;���(�����<C=K_�hs��7.6e0���w�%�����C$D����y�*7g��2��-p8���t��kB���p��+*�Z��8��\�4��������,"���8�
&���S���po�l�/�5?�������d0��$`Xa��c�<+l8:f���x��j,�cv,��\v���D�%Hp�l,\Wi��d�����.���XEGM#����h�R��!����7�m��o��(Sg0l���n���4����-���	}\����~cgS�:
�
�����F64�����]�F2����V���q�]��m�h������a[�-p��uZ��T3�L3�9����~�K-K�E�G>PS���}\Q����@\�����y���Mv�Z�f&�sx�#�k5�^�dj#����>R�4���?2����	��>���r4�����T��h�;��������������8�m����-�:�_�}�Z[`���6����Q�O1����m��j��x���������,�	�����7�e4w��!���[�}Y?^G�:���������J�\z��]J���{5O*l��(��./�%m��Ym-9�(�h�9�kz�T���\��-���s�B\}6
��� �/�|C����$C�e��"
X�,���is�0�`�P�����"�c���3a'�u.vS���O��`��P���2������XAL������5�����b��6:��l���SD�i�6��I�z�j:�����K����*������y�[�it�J������[��Z��������}�Z��W������csE� o���#�@�^�7���&clG]���[�:����[�:����[�:����[�:�������[���n�z�������[���n�z�������[���n�z�������[���n�z�����c�c4����,f�|�sZM��������=!l�a��������c%=S(�8�6��k`�[R�D�Wd�����<�l��p��-=;F��v@�g�������$4gk�=����'m���tT��X����K�m��{�E%s���9W���G#��m��ib�f��l`��y���%����H�Z@�3�RO|��V��F#w�K�z������z������z���\�H���>�G�l�����]��),�����3���n������nh�ox�>���o���oI�kY�v��S����O;�
�X�MKW<���@��-���X)����s���CU��h7�le������[�-�
V�/6F47?)E��NLz����I07>y���r���J_o�kN�c&s@�H��56!���L���0��m����S���:��}V��S�O����~��[�O�>�C����o�u?T������U����S���:��}V��S�O����~���:��m����C������~���:��m����]���So�uT��G�6��Q�M���>��cB���4����F���Q��#t):�o�/��
�����G�e:4���k��~����L�_����o��,��g���]���E�P�}_�n�J��[�CU�E�J
���,s�W}S��2P��S��n�P���n���>�v��S�U���^�������@>�v��g��[�A�}_�n���E���>��[�s��U���W�?���k�W�[�
{����}_�o���Q�[�~��O�������o���W��gO�����gO�����gN�>��[��kI����?Y�>�vt�c������n�}V��;T)�;����x^y��3����:�6�����l�����a0�����U����S���Z��}V��W�O���j���[�-_�>�E����o��T������U����S���Z��}V�E����o��T������U����S���Z��}V��W�O���j���[�-_�>�E����o��P�����U����S���Z��}V��W�O���j���[�-_�>�E����o��T������U����S���Z��}V��W�O���j���[�-_�>�E����o��T������U����S���Z��}V��W�O���j���Y���gpj�������HL��
��jx+��"&+��t����4�������:^E\�-T���s)UDOi?�[{�����]b��.�n�^�wb�[���������v/E��z-���n�^�wb�[���������v/E��z-���n�^�a��p�U�1�-�~����z-�^�����^����e��[�����^G���.�osX����YxQ�{���(�Ag�[�x������-�<g�-�,]b�������z,v�u[�F:E���u[����-���Y8�������|��k�:���!�W��M�M�_��K	��>�{�������a���f���o�[���}>���1���~��J��p�(�i������V�t��d���@�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X���u�	X��$]b��G�-�}b��G�-�}b��G�,�-y	x�m�g��7:_�����>��mS(�RT���P���)Z]F�3������6Y�m�oP�q�B���w�-�oP�q�B���w�-�oP�q�B���w�-�B���-�B���-�B���-�B���w�-�oP�q������-�B���-{GP�tuwGP�tuwGP�tuwGP�tuwGP�tuwGP�tuwGP�tuwGP�q�B���w�-�oP��i�h6\���7�[���=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���ov��=V�m���e�0�����o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q���o��{��Q�����������G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz����G����Tz��6�Q���<]���fl�f��2��9ZW!�Ou-�xoO{�i�=*-U���,���D�����Z�_��P�>���\���C���|��W���:�7�pyh5��qQ�o�R��Z�D�cR�{�Jh�#��[�@f�Ea�c�i�����U��Y*�Vg]�-����~�h�l��N�W:?z%�C�)w��S:l��vA)~���w�8�%g������������7^v��~1�Z�G9P�"k�O�l.�3]�h���uW��L�d^,uuLd�B.����=��C�����4BC;��ur1�7)p�In,��-$u�'��!��&v����]�������i���b����0�V����~����lT����M�1�H��.��Sm����>v�Z��d�s=�F�DtjUI^KxkW�d5��$�Z�?#��G`!&F�������\���C��H��t�+�(���4��H����L1�U���i�C�����B�0�$�F=�����|75E4�{��8faD�]o��5��#���b����T�>&�E����l~�*��.��������jYr=�K��m�n[A������{�m�c��'�;"!��:�w[�z��+����4�RBod��7��
\v-��|�;���OJ�J/�z�ci��r*!����M>!��qX0��r��M��u�	���`�IS^�I��h���4��/��>�u|T^ ���4�\�S�7��_��5���,�U����T����)YP�K�]��c-��������zd����:�_)ni^�j�m�Z]1���n��`���h������q�����|�
�uf�L������Zd���a��U����K
���;e��� ��<'4a�D�������1�K��5����iftn�k�
n.k�f���2����(�Z���(�cUPH���%�E]���9\�
�����sy.��MX|dD��c��E4E[�D��B����v����_��T�?�L)�`K��xq%p��<]E)o�9Q5-3��f��&yp9�n��������I��\��9#���gB�f:Q��,i!�}���vz
�]'�(���h{�u;�%�U�@���m��GE~�]OM�Q���V���
A��v}������.��N�X�j���Q;�s������r(��u{�cb��MT��������"��*��O"��Z���]GO��"O��\��h��b�Z��_�:��o��,L������!�������OM����rYi!7�sX�q��������|�)���Q|3����t����ym��"��������jX�������\�����b���_��$n�!������/��~f"�A)z�N6����U^+����x�8�r�Q���n��)��d�����I���������K���
�(��]++&c^���&�"����!�"���3*��X"l�(���
�e�o��T�k5��:����b�W���BU������5��"�{����){�����8�����jX{�r�q�oj���
A�?|���X�b���9��z�o������N���YH��0������9��K���J���ZN��b�,�������c���5�w|�9B�&�51����`o������Jbt�k|x�_�- s��U���j/�����8�����8#t�iG��8��-]Q6=B�Q��J��j^#k���%w/%�/�
��>zZ�]7 �q��p�?)��5���>C��ok���/��7��DS��
���x����s�h=�������Z��A|�����\.K6�J��T�����1�	o-�/�o�
c�����%�{K$$��M�v�G��E��W3Rt�'jx�$�$}�^�v)mK���s�:�l��PC[�1U}�������(��uD790��t*B�xV���Rt���6Q�PIDKk�Sv��75���2����������%\4M����bo5�N��F��[��������>�GFi!lWCpk;�f2p�������y%OO�?�S����//%�o������jq��� �
#���t���Z�&�]G�if�_+]��������.���,�����9�rAR������~�D~1"jo9��8�qcW��N&7<�T*�R��\�4}N�j_8��|a�'
�.j"�n63Q����k"g����8�!9qK����+�+$^)�8���c��W�����Z�A�4���s$��,�I�O6��.��z��Ee{����%��,Oq��M�!K�'���j���dc���|q����;0��S�e���q�*��$M��L�7�Vx����j��CY����F�	�=��"���G�i��h�dM=�8��K�<�|���z�EUA6�����es�u>�^k��x?Uq~��U>z&���G�u�#���������:_�����-�E,J���7#�
�u�Oh���?��(�2h�\����s\��m��!�P.H��G7+���\J�jj�^�i����{�<S=�.��fF��<"��A�uk%��5K�I������"amJ��s�bf�;�D�y� �.������i4�kP$&�W���g���h-�>��d����P_�-
6.�%���Y����g�g�w#����KY��m$���m9��� ���>�����-T���K��c�,r?�b�&�8����[�LOi~%�����E$c+D�
�q�wZ*}..
-4l�&m���y\o>G.�BZ�N\�C��u�%[��<��t��,2�8����NKV��g5��\u���k�p�(X�M���o b���$�([�(�xe�{�Zi]�_��|g�q��ki�2�! �F�w�I�:jYd��
�QER\I�`
�r�xW�����u|!�|C�,�Ib������B�-�TiY`��$q�T�d�@~��M����}�|?�o��}Z�+�����	��(s�R��F�������-l��HfnY��O�q�,�Ls��Z��^��{��������C�/�O-<�� �n�������m���QH����8��Q����)��;P����.�6� �]y[���MC��I�6�RB!�����2r���B��l��g��Se��dW@�h��Tf�dj]u�����t�I�N���fL�H�NJ�9��i�/��~��T�5q\���9��bqknDT���dq)�l� �<mTZ�t�����Oc~c������7���k��>$N�8�������
�m�k^k ���A;����7E�H���#����wb�P�m{��YIp�4��;A���Q���Fg�L���@��{$Z����kP��3�����,}8kS����Um>�I��U�6�Y�B	#!�D��k���x��McP���A	�2H�{3�U;w]�� C�����< �3�w�����\�Wb�MN��5!h�n-`����
����C��ZZx��fT$��U.����Q ��:�B�_���8��c1��W2��8h�����v�\�����]��}�<@��U������!$��4\J��c���m#����Nob�l�	�F�VL���(P�J���@��\�#������T��z����Mw�#;34!F��\8�kzDe�Z��`Qd�0>n @]��
����6�� �& �89r��ZH(p��r����s�,2��8���*P138�� ��b�L�H��B.m���B;3�7t�i�/�O��tDG#�.k�:bb 8�7�pkl��@��s�����EW-[�YJ#�Ah����^BNE�lU�
4>.@F^0q�s*f�vl��*�U��%�T�+Z@a�I��iW�����
�{��|\��\�2�z�^D��u9��"�-&Pq.����v_h%������kQ�����73k���2(�zf����_�k�k�y]>p�$pld�p���m]C�t�aI�W��p"����[I���|���u�WgF�)=v����A#�u�����JA����];����������%�4�;3�K��233SS��v	j�a����=��@��bn7#����z�q^������ro)j���B^%��0���S1DM���P��/��A!6`�������|����{Rf�.�H08�mOID�*�.��p�Z6���:��.bS0�B`KM���S ��������ZU���qa F>�� $8vP��"����gv�����0�����"lU��
ht��s���F]{�,=����^V���A����:5�M�#U�^o��s	"<��{Lk�@���"���nQ��������[kV�t�����v�����U2��r�U��CO�p��L��<��B�j���
x�f*Yu����}*����2��K�k����@U��(�������g��B�Ci�E���yG��[�w�	IZ&�����r�3#a2$3Oe����8���(h
M���l��������o�@�-�7��dv>y7��������%D�Q�\���-[��.Pp��5e`�.M)����F��C3!��\�(T$�V��w���h\
��/�Rs������i���=Q�	���	��"5vg������'��VF�*��k�^������AK������T�����V��Q8��T��Z���vkj������N
*���>TSzr���J��!m?�U���/��3�}�����,��j6Q.�^9-�W�������lv�xj���ua�
S���{�A��@p_x�{����r���L� �g*�0��;���o����.D���)����G�_�������pQym���T���"a�B�sd_�M�*��xi�q�r���yp8��m8r�I���=�vY��"�Z)%E<ns��y+_�L��������|CH�|Y���g��.\m����04�����������sneKPh�����V��4�'I�pu��F�\Z���q�_����A�3tX�����������~�z-���s'�v�P��.�V���A���2
����������Z�M��@���|��������������QIp�����I���M�j����qEC�8�����^�������j*I�k^���~(fe,E�8��2�w�C���	 !3:6�s���R���i����;�"�� 4b\ph�|�U?�M��o�L�H�*dzby�����/�PgZ��.���dk�.y�2�PJt�&���&!{�����r�0��|-RV:��RI�.t�f$��5���q�H6f�X@��S+�@�Zd���#���9M�
���vZ�Bn��
,\��)hL��bZ��ul��a���DY�r;���������9wy���������dLN^��(�()���L%��Ip��+�}�DvRQ�.n��I1�����[��������sNf.�������K�l�y#-�-���5�3���A�#+�3	}��KWM���5������2������;@5���)cs��������z�K]l���1fK������EV��AV������j/���j}~�����0�}�3���"(�6���
���?�U�g�Ks�f/�0�o����H$�C]�xx�5��/������2Td�qA���/iE��7����i����:U|������F^�\�jJ.���?��B�)/��]�m��"eo$�`�y����`���T���j���s�dL��9�S2�)ETSj�*���q�2����I9�]�cjW���B������U$]r�fkJc��KZ�5?Yhf��^+-��F8mQ"8��1U�F��;N��7��ifHh��D�������'���<�W4\Qt��:,�AK�A��s���R�������TR�����/��
�T3J
6^
v�v{���w-��U�h����C�S�UQnB9m>�Fs�����.���V��6���c���0u�8�*�E�����2f���2&\��P*��M�i� "��m$���8��K ����&��J���-
]I-tJ�

��q���C�L@d��I=DY���=
���\�������d���R�/������;7r�i�������@I!r���%��� 0A��j2��K�����p��
B];�Iyf]p�_��[9hj�h@9��TP�b�&c�p�f��T�KW^���D$W��87"������h"G�(3v���$����r#����E��j���V���]Ns�b%���(T#�i
-��5�jF<�GA�>��$U��^q(CO$IU�d'�#$�Nn\��C�9���J�l��Y��-���*A7�TS��6l��d*x7�3��q��p������,��>W[�W�������z^9�b;?E��f�����|��b����r��������cL0	w8���e.�#K���Q��Y]l�����,E�q�Xe�;1y����-�`�����o������\=(=>�����&]r]�e��E�i�������m����e�=	wG�l%8�����t�.?.���������]�%������^W�����n����l�>�����������;����uRY%�Y@# �Z��:�<9�k`���	9��[U�Tc#��e�`�62�C�..��Odv� �H�nw��������?Jui�\���=����8��Z���\�s� O�
28��>{dpr��=CT�2�����*\E-`����S0�&����	����Y�I��i<�(����`���gQ�����"��/Pr�j��26�X�jn$\"U��R���z�CP�m/�r�)�k��#&��2��\��-IR��Zo�� ��@�~��@��)�7j?�L[��{��������ze�-(�A)�p�F1e=��sZ�^	����'=�XV�r�)�|<H\���z�L�����@Q���"�� ��d9�T7��NU����%�Fo��(_�a�n*���4p�yNl��%@ka���%�����������"���YD���\���8^r��d�P�7mgN���f�)�D��������!�Cb��;Q��k�������wm�cWHs)���eE�P�.K9�!2��#r�o�@�	��[���z�N�Y�V���i2�%�^��v����fr���\��C�B���������m��T�t�x|${C���0%��v�(+O�"m)��"05�f.������$������OQ����6V���l�7s�E��}�����4�p��^C'J	yhk=�Bv��[��u@������26���������,�qB)����S�#T&�qU�V�<��}�j'H�#`
"w<;0%K0B��We��������ts�b6UkZX��q�=������\T��M-|��[�^����#�aH�.(�)���sLA��sJ���KXAvPI]��u�<Z:�\er$��D�F��� �848�������M�T�����_x���G*1����B�a}$|MQ���5�soV��I�1��J�`�Bf�Ly|-���J������P��/�`�S�azm�j�����8�w?������`��-��[\����]E�p>FU�gJ$*C�d
��05����rL\��v����S�5���0�;��{��x�Hd9\[�@�@�u��]?#�����9��
�i8��
�|9��u�s��[x�*�v�p���K(�Wei�kW��ST>&�W5Z��=�%��B)����2Lr���s�\$����A%�+��������5���>�4HT�"�X�pV�����%�����fB�*����i=����2s�sq4���qf.P��a�y`q7*i�{	��N5�h^�)��14������K�Z8������si��q@g�@�H�B��x��w%���r���#���Q�m��<�������p�����h����1���{���L������w��q9��n�����([�sk���.)�<T!n\���oi���NmK]��-c�W �Z���Bsq)����*��]&O�p��������6/����ho> x����h*��9��U�> ��E���K���A|Mle�-pP@�/�HKx����F~(UF��EP��v`v�p�B�� '���R��'0��E$�Hi��7�����o&�q��������x�M�.{WR9������l���Weqi!�������Aj��bK�l�c	b��b�\�6��G�At�/�����{$\A$�
V��/��G�-��(39�2�����S�h��.�p�%����&�e
����������@���������+��K���J�x���.�h���b5�q@�� �U�K�������H�_f�oU�9wy�"�2��&�������=���;�H������k$����e�L�r=�%��9]�[�����
!kHvg|S
����x�X������$�����`ol�����79ah5
W8��g(�|��0�3{�s[]t���{i�m��n��=W3��-����Rx�M��}�Ue1�L���I��X��h�1������P�/C�\�F� '}�b_��M-���X����r[_�
���O���V��ko'�0������� �(7B�������	�����yt�0sIF��\M�+t���N�Ns&�UZ�
Z.a8W�����D���tl�h*�@@��S��������s���U�����_����i��x���U��7�T�%�mKC�.Ui
��T����s8��E$��A�pm�%`SRX\�2*"&��y��uK� @��+r�� �����<��A��}�A$��o�����o@�����9�&�#x$�")�F]�\�}��vqj���i�����[�Z��9I���Oz_��t���A������������`+����a�M�y�����E�m�){X�����y�_a-��`o���J�vs��KN�w�N^ R�Im������4����2o]�m��i	"w=�y����r�b~�]��$��mA.j&f��^�g�/�M�ub������T�����DK|]o�Hv��O9r��S��S�v�R��Hl�!.4����'��Bl;���U�G+������fk2fA��v�
U����xs&bq��@i�aK�y�����������;�� u�����q�A��Y�d����Z��r���if��0���[�P;X�%���$:�D%j���PQI���	jFg{������A9�^���*m[���W;�
�r��O�E8
j�=W����/���D��gf @okIgPl�UP������<��V69+�|P�$n����Hvk���IA!FI�P���&��A��SKR�-!%�E���(qA�"��������!2�[)-;nPP���QH���.gb����8A�KT|C�5s���ZB*��*����)��Z����N���
�m����b�������^Q��qq��kE������7�v�d8X����/�,��[���Q�r]�l�����m��?.kE\B���=���l��-�a�\3l�O��*��y�r}���g�YO7/F��a��\��,��;����������w�%��n;{���u�O�]����\����w�F���?._�����f��b���<������5��9���i��kx��%��9���N���kx�V�!�h���JPH*�	���vU<3`	�����cqK�
���N'2.����c���1���I�O�	$J��G�j
�%��DY��k���*��6��[! ���wi6��P��%���2�O�s��	(�%����L'�NN^.\����NU�:e�XT��N.+xn��q!���Zj\�� o��F�!���IDn^(6�
�1���Zhx(���I-�E��H(��D��\Au��h�.c�G�ih���d���	���(i[���u�zo}���#?l�����\<�K��(j ��VjZg���L����8�����E�a��!��4'�l������KTk�������E�����h�G������B��8�OKJ�c8h]y��'����?�w��������s�����#�h��0*.m��F�c[��Kg`���71E�6�{8��Y:}���,�� ��O=���W���O��}�T��<��8-inR��K�J����a`	H#���)�����������nC#�q�[�[#�amsO�))>��P��%���'(s�=�|N!��%��G���Dr
��	*��bZf�����2�q��w%��*������[s�%k��)v`�pF�PT�>�R{�(�������m*�S7;�x@��U(N�y���G�'bH��}�@����S��kQ	 ��&�����������y7�������ma�)1��
���������M7 w�J��~���K%�����}6eF���7�(�a��Z������97��Q��������W��/���������3lZ�o��d��T�@�4�ga�8G�=� .G50+���������b+�o��o|v
����K��9�� �/kV�v+�����x(����;��V����pyW�?o��%�������Z�]�����u�[��0��9-��M�*vQO�y>k@��w���4����c-��Z�}���UH�B)�^Qn�\���T)>0�:p%��bl��i�1�p�w�c�yl	�`,~[<�����������
A��n-�HU)TkL���O>�EE���/'��`����o�
k������4�w��������
�*���������������J:����NW��n~���dj8�\.�������Z�t<k�������~�����o_�Y�������l��7u���LU��p8]�p;V�i5J���������9 ���P���THL�F;�'f�>��� �����P������17�\�}�P�  ���E���Ke������������ ������FR�/���f� 
�{w���%;�r�mF�A���~��3��a�f�����w!��O���39���.[i�u�<
����{m���wg����:�D6�Q�e�yvv���9�@T��	��-MwGr�Pd�C�c����>�P@1��.fM���p����<���yA��Dm���6�'a�9,��CW���\z���
C���*l�\v�E�S9�����.#����Z�����`����K\��n5!������W����tL$��{��8bW�|������Y0��6�%7�M��������=���6�(o����Znsc��A��8%��I-��y;���bG�� s'$�cA��������Z�'�C�����3r;=�Pwr���p�UA��&u�dP2���^D�\	��������813��o��K��iJ�$.e�"��B"�\��af�N�8lR!J�*KSAcUV���	'6��R�@<\������o������&U�uQ.����cG.R\;��8bu���h���!C��Ne���~+i��.�������6x���!pRn�P�6vk�L9��t*O(��I8����S���l"2��9@�m���i����;6���ED�j8���3a�>m��5�H$n�+/hr-<�2���AB	T 
=|��x��W�;���L��=��Q�O��l���>?��}����<��d1^+��T��J p�)\z,k&�+u���Qw��UW�������Pq�!QM�����������w�p�7���S�_�#���Z�r���P��J�K�s&1���?[pE��Q��bo�����f�Bl��1��taq��z>����jm~2���-��yjdC�7������:/��j�xRF(@yaLB+N�U���W��U��lK��v�Fv}7�>bpM����,
���1�!�b�m���,^TW���k��Q-QN�����0Q��g���m������N�l�@��O���>k#�uX�S��������btb1z9dc^���[���-�i$���C�pF�y'�P^��mV`n��*��F�p-
�n$���7�\
��!h�B/);	Ait�����S-\. ����/��E�����������xsk�V
���	�/����u������fv#�%|mD&��{����m�;�\�,n�w'�����$�l6N�H#�FP*=�GE��F�)s����\���$�so�[��c�/�L�n9��v���8��
WRelz���g5��5����	8�):w�����3�|��(�L�]�nF���`������Q�����Ps��*��b���4�yZ��veU�p\T����k��v�pM�xPvs�@����J��8�reR��n@/�����F���FW���+j�N������F��X ����dis�fs�K���O��k��4�'l�"�fo�*����7��T��3YlY����n$����^Gh�P�%���3Y��=�s�
�t�g�Dr�{9o$N�FQQza��T!�T^o(A� $\<��w���b"m����Z4�G��S?�3gP���@f@�����&��N������?�I�sw�@�d- ��R����9����������*�
���H�Z�%Y9G�6U..7����E�������vd$U9�����)�8�s�K�]P��@@�9�PM�,����[�%B_pyT�n� ��\1��a�@6�u��P����I�??�
����*T�%0O+Q�7���22(�c�7B�	K�W�-D52<�(�>]#Z�8��k�$"[W�k[�����q���8R\��e-C����)s���+�W��{M�������}��^Q����o#r����.���R���#B9/�q��m�y��9������5�����bw�.a�!,E�4���k��2��2�k����F�0���va�Q���o$�fi��=������4������F�0v)�G�C������"]�"x�<�I�_h�sr�s4)��N�����3��( t���Z�!.���hP3�T��"qr�#���C���
 `A���uYC�"�Z��	��h�QI$��O�
�&R19�%w�DD��L������3� �b�"q���%��2ZQ� 6FTq8�l�\XX���+Fdp$�����h�?.B3�.8��R�KxKU�cY[�0�487�[#ok�q�h!M�v`��������Nu^_�G;��2?�c1���8�C[�+q!NM5�Aq��@QW&PoSp �
����l�#y�
�a'-�`�� \H�0��Pi�A���W���h���i)v+.����o�+������n�j	�M1���L����#(�0KR��q������#8W;6 �5;��7���xM`�pq��K��+���m�^!�����������M/k��RH'���nSj�-��pr��gc�f�6�}�mKo`
��������V�
�������k�%�0s���"Y�������%-x������d��E\�/+sN[��1���Q��g�����=c[s��v������s'%�8g/�s��0��DP�N�8�-GZX2���ns@
�U��h6�r�$������� zld��5�{��^����i'�xp���U���[<�O�V��H`p�@S5�����h���X4�@�G?�p\�{7��_�0�@����o���{�����~��.P��n�m��	���p�j��$������c���"r�_���[/�6V�B���d���
T8Jf(:���08V�|����(m��dI;�mcI�NQ����)p�
�;l�m�&�n��-$�>�vA#.*��R���xm�.��u���`dhp�G%��<�t��5�0|����q���GU�[��8\�`-�v�6����VZ_�i����BHW��$M�5J�< xm���h.,h�7���Y����Q�P2�eq��E������w�����p��������N��s.:�	��
}?��=�M��yvE���i������=�R��	kr��(7����:t�����Q���	*�[�h���5��,�(P��;Jsa�����\����<0�����^o����G9��x ��UE��l������oT�K���x�!���`0����Y?E��>@�����7s/-�O����8cu�kd�q)x�v��A��n����NkOR��|���*����[R����>C����CxL]�y(�f@)DA���nu �B����n���o-�������
^\m����0k
4����}�����[��y�%KI'��\����zrq�tE�
;��l��3fe��E�\����d��(5�L�C�P���r��m��>�L��N�|��P�Cq8�����&��������0��M}z>5Ioh���.�O{K����'�pqw�&ss]��7"'���B����v�Ar�F���}1%�dE+p�xUB�{d��<�V��l�'�����(����>e��
e�.^U�z�=�$$��\������K�&�IQ�f�����u�S�2�[�Fl�@Z'�9�a.B�	��b�5.'2arz�6\	\9���m�y��������x����G=��V9U
���m�3	%\�T�(	r&&�S)���Do�Fp����~<�[���A@"��;!��0�{W��K<�������k$�\m}�yp�������;�����[F���������V�LN�h�����(.��
��$��8�.TQ-=l	,���H3����S�'�p�\�#��$�I,`,-�J�8l��l`H^���E�)n+z��Kd��r~��m������0rOI'���Z�[�o�������8�=���T�q!K�~�j]H^es�)IB!
w^o���Q� e��1��7��W�aT0<�
�97�1��vo�����&�a���wy�7�&�s�����zmO�x�5q7L�c�S��6%��G���v5�t���]����sP�q�����b^��ZMs|xr�����/r��.�����q�VDWvg8r����S��o{���������Z�JO|�J���rn6��D`���u��'����_x_i0��v����;S�m��y7�6���?"rq��/3W��QZ�kW��a#|�%�J)��^o9�s~���������j�ZI^������ZJe�x��-��M�Pl��
������o�.
+�9T�������pW @�-�Kpr�
o;�����.��<?���H��6%;M�o��;V��g�,M�e�a�� ;?[�u��2����������k9E��lh��C����l�~WY|����z�[�������{l��^0�����Y���zZ
�]����~W[:%�����S��N��u�O:*~�����0(�f=��wn6����0�J�c���)z�^�Ar�n	��bm-���e�i�w[>�_��S��e6C=�aS����K��	*
������0|���!�spBW-��7�����9^��F[���1
(����Fa�W��j:���4�@�A@��!���&�K��V��d��� 4"��f��gVIs��*\��6�`���pn|��<\�����Pv5����nn����&
��ri6��\�����w	��(��]�&�G��6���{?���@]�R����P5�j="����������9�vr2���1P +��"��E��6��^�q2K�l�r�D���49�����@@����89���qj��o&���kx��F��nC�f�HB8_����A�D<�_�d�N2 vR�� b{Y���7�9�	(\Hl��2���*�r�Z�i��t�7��Q}������\��d$(��`h@��7�m�F�9�����\�}��B�\�i.qq*��M��Qs!���� J�4�Gq�k��nV0������@�3SD*X��-"Irv�l��4`Z��.��L�����*B�������f�\C2 �66e;	!�{�7����y�H?$�\y���9a�q�������jz������������y--S�.�p��v;��o�s�o9J��M��C���%/�}���!��UZV�hq�V4����\U��$\�9o��*{3K�[sC� *����q���n,X���l+Ip*��}6�h�y!
te�"�}��������G=n
�������d��9��i(r���e��~��,kOy����%�����r'���I~8��j4�*�G�����w��f^�l��-�����H� �foi��CKN���P����q�%��U��?[�E����]�x�i5���=���x�m�a��.�7�b�)7���0�� �����w;��xy�e��vb0��W�x6�`NS�~������"r��fil��I�����4����W�c�e�|���m�A_N��������������-�������_]�[�%��}����{
9���/�s]����:}V�����s��������[�v6����l����i����/��o��������x����!$��3��9�����������|����%��EK����={��gxt�
��?��Q���q.�6������� b��Ja�t���'��gz��U������u��u�����?=�>�2���6��'.�g��� ����E�[���o�%�|�{6��7�z�o�l�b7�&�:v`S���Il�������
/��f�`1�+���s����}��qc�3q�J��X�������-��!�E�2��q����R�8{�a����2�]�m���Bf���(P����g��`1T
6����-M�����\�^.{r���xkU����&Q}���h��F=�h������
��KF�Z����1���UU���a���S-�)�v����^/"�T&{�*�%1���9H,\6����0�#��Q�(�S��/��@n@ILo�_��n�x�� �
�n���lge���.�K�6���/'x����
���'g��z����:��#(p�n%RRA|Sqsc�5Z�R������
�����l�sbS���02����/��N���Le_�S�r|e?o2U�	����yGr`�����oy���.��vmS����������0����64U &g�RRF$r)E��Ve@V�Ve���|}�RU�y��2p�
$������-�F����5\����ss�2�/�U2��[�-�����%��"�v��"��y���6��"����r���
yr�p����t�s����PdF(,��W�n�Sh�L�.q�9Z���T�Z:=P6'�E@*���1&d�'8�wUl�i��=��{K\����9?�������������(D$���������<����$��7�[IZ�1x��4�L����1��>��w`^bA�����w�j�b�-���o{E��	����O���~���>��KP���j��
��sv�+�}��Js����P�A�7�g�X��J�w-��c������{N?/��<%��b���q�3(x$	F����U1h�yp�&��T!��v����gx`��~��6�=P���+���d�r����<�����R1� �Z�>�������o�%�q�5jV���[r�� ��J����_��0������$�r��/��nk��Lm�Z:��������X�CE3��:��KAF�����o�����v�oV�����q-R�Q���t�]\�H�c���=�.�0f�\@������8$�N�TV�'1��BU��oL�\@*���/��A��UjUn�<\���23��6��}�#t
J��#k��X���H�	c���/��$��WP���Tf�0�����������dP[���R���r���������r5U�����c����^�5� 5B4�v�	��
B|��Vx���0>6�%	5
���	�����Qj���M#�,TfED�b�`�cm+�l$|c*��9� b(����s�r���1��.6 ���E�cj��M�N�~O����3����P����w��[H�����uC��TrH���!P��+o6�P"��!����qb<����8?��WM�]��
16�5l������{V�s�����2���5�7�mr�X��P.)�����J�^2��.#���e��{������P�����p!J���@�rsX��j
��g��n[n�R���>"f^��.D�����#%H�$h���
��f��5�j��jv�o�[ �K�'e���qoq��Sx��!��l�8�$�D����#�&��V���E���&�R��fv����iG%�����T�-����! =0\�i���xa
���i��tu�(�bT���bP��l�:"��$���U��4fp��Tm�����&���/��l-X������F� 45->�J�v�Z.�����?����f����S��P0�;��8��-E�qi<��W� Z�����e2���=��fV<��]TC`!�hDR�"�J'+������!n
7���������4�4,�R�������M�*f���j"�?���[x�Hs_@9U��6����"��i�D����4�F��b1i���S6�#���O�q �$�.��/Y(�.{XUq����]��"*����U�#pYv~l��/�Y�����<�M�b�/K�F9���+�o�.�L�=yP�9��EV��T�� ���g�r0�Q�%�����?��	W:&��Q�T�mJeX;�	�~���	C�E[�q��M��������L��V
���UOkq�S��K+J�<�(������$9���!����I�����8�t�0��nXZ'��H2�G����B���S���RB��[�~h���29��Z������q�����iM����	c�=�"����O����@_y&�71$��-�U��\I������:'���0�:C$����ysr�BUl�NjhY3A��1T!-$����e!T���MER�I�����89�|.�F�����PKqX����<��>'J��O2�������������!����3�P�@����������u�!���}��,��g��@���	[-�,1�����1B4?�GF����S�F�v�-; ks����>P3��-G�����8��r�p��u�x����`H-:����x���CZ��K{,=��!I(�������O���M���rI�1P�-�
o$A�tG]���D'32�o������8���WN�y��\�<��K@z�iv�	q�y#>9�1��9m�u��w�UT5��U��xA���\����� }0�������t�[�~��e e�z��S������xK��e��9����)jYYN���K{A=�7b>�iZ).KTVD.�J�_z]����QO���	*�B�[�!��R�V2g���\s�����Cg�/jyx8FlS�j�~Cw�N�{AaAx����
]v�Q�fq4BL��Z�+H<A�e�e-B7�^��&�����A��16A�g�������1deAm��V��U�F\X���$i|�RC���\H(��������.Ui������RI6�\�H�/�	��-5$��� 5�9M��f�X��X�#c��m��qq��;]�O%�E3��jy3�r��!{���o?2?6b�n\�-�Ih�s�����\�x-�7�%"Q�.!���m�SyS��L?��lX����3Y��71*���M)�D������F������r^mM
C��^%K�{�\�-��	h4�S�:V���\�#��T����h����,��������{o���-�6��?����Gd�������N`��(-�=��������������#�~���R	#M��I�*�4��_���0M�������P�C-�T*)��+`�.#`��T�"�n�����lc`w������)Q����yc����&P���~`��v���q�H��#��L,��"#]�3���>����:�0���-9�[�P�v}�������s�s�5O���77+Yr.c}��H���Zs'�xrf�)n�n��B�6���)q$����m����>������T�e��@�����@��7�I m7���<���/��M�Gw7��U$���3)�2�q�X�]f�8����~����v�.����,� �z�����D�����v����)��)�-(�&^E�������vmn�J�o���_+��=���.Aa*�9J��(��,���W[�]!��m�h�6���	L��IT�����w�zY������y����b�����v�1���,���Lv��1�Y/M���f���G�v9���7[���B�y�����0�*�J���l���O�Y��-���X���K'�`���d�����[]y[��&�p$��/����Z6l$��|��XJ}���o�����d�]�e6�v��m����y���������6�.��r�>��?B~�yfSd�	�p��� JZ����Q�?W��n�S�~4`�yS�����l�p�^V��bmu�v�*�'�-��]��b��m�. ���������/�K]e�����\7\9,#m�o�����s[�0������y[]o���l����o���8��J���	�����?����q����-�b���-�b���-%/i�84}���'M�����w~����xt��h��B��=���=]C�����j*Z���([ZIKGO^��_�jz8�M����u��P�^��o�}���\�w=�u�n'`���	Q#C\?T�j_���.n�}������r�Yw���8��!p�1C��A�T����zmW�����=����2�;�i8��-�<���gdn!mM�x��t���l�k��c�a1'�_#i�n�H����M�����o�}V��}c�����U��M�j8��jj����j����P�=C	��t/@���.��k������ph=����JQ���[��F6���$dB'8��^�����~.-d�lB[���,^�KQGFV> Nu��C�ZP��}��mD�ONA����f�y��W�G�2�������73�}��c��u*_V���1
�H�����B�Ex��(�u����x!��\�y<L�����t��/%�tm0�3K=�~Qu�cmkP�Z� �����U}4����9��^T��-%,�@��&�����N�L�9f�AZ/W�r�fi���J�o�P�B�H�fj��E#C�7�I@���`�(;���:�S��"��Q����][�[(a���	Lv���KK`~l��`�� b@R���p|o
�6����f�X+#�sy�����=�wZOe��o,��}Kh;agk,9g��w1zl�V���dwp{%�=����ac�6�P��<���n�%��L�����r�~�x0I�p���S
s*|����h�:����'x��z�%�yR��r�LHm9cE�h(5��������)�z��� �y
�?�j�X\K+H	^�|>�r��q��~.*!E4
��88
�^�_fx��F��9^��*������ �HqM�}�W���rT1�6oz'5*3v��{6�1�J
,���e�\����'Gf��jo����q�������V]�<���3z����.�P&���{OC���������IS��Z��������N����(�A�+��.�h���i_�)���6f��{+�s�Lm�������N��re���f�<�X2n�v����������� ���Jn��4��������p�UL��0�N��u���ny!�Oe��A�qK�Y���8�F���wh  .M�Y�~�x�������CIHa&���nO?YO�3X�R2����I�Qj���CA������)*��ES����+p��#�!�K2�����kF������I�}S������U���T���$���oq'�>�D�����-�����3�H�$���.&����SNnG��=��9mUT��D�h�����+�� � ��z�F�P���{�c`���gR2k��k\1hu������X��������d�����f�p8�:zl�U�$�V���r��)j�H��}+_����p�n��\�2�1o���qq�,��|Cs5�������N�M �	#
���o-���a����������<GH��&�
�����O���O���O����>4��<��C!@	��N�[���`k����vZ�G��jJ����n�F������G��8w�������RG��1pxe��Z_
�?
4���&0�1�58Ti���8��:-_6��$a����S��eA���zKz����e��4�~5;=���/+mj�|�pk����	o�~%!���r��;�^��Z��5�A�E@��}��wd�m�10p������U�cD�@��y��<�E�l��F�h*u��}8H��-�n�+���c�i��9f6��N<)jW���^�����3���m'i�����F�`�P�f�Ns8]��cUF��	R��6�W�9�  ���qu/�%=Z)��F�F�f���X���a���m
.�x/��vnk6z������e�Bi�]�K7����]���m��lr�L)�W�����������;��)�X���kg9by@��;��06��Qn������'�uc�D�]�s�IV����)n����[�n��-+��o������(���8ih��FV1��Z�r{A��L�J����Z���|9� S�1�J��@��u'4
Q�hqELmI������|�� �����i���mGP�+��"{�%�U�h�}KAh5P�Z�K�w�����w�j���oG��&<6T�%�#���bkTs����j���>02
�x���88t���v?u�|_Lx��������.�x����i�y����m�m+����"��B�����%�����m>���)+^����"��jJ�:>���>o�8[����y,6��{�6�}_�������2B��}�gx��R�%0	�'���N���Q�<���U���I~"��df����G�T�r��^x�6�f�����)4cw�6'-�7)�Xs�_��m�+��.�qA���J�R�I�{����Y\����CD>6��!4����Zv9}�/#u�W	VH?����z��w���Z.!�8|����S���[��^M��@����j#�9o�oa���yG��������m�6���i��z;�r����uMp�����u�q`)��M���]R�9{����P'"WO�H��v���qk).ici@��c�R1�h�F�H����j��K�c����mk�����k��8\/
2`I��4][�dd�Ko�G\z-�TD�B#�i�����N�c��1o=��k�
�-.!�-�m]=7Fc�J�w\cP2�u���-�����^�Xv�(-&��3�u�\	)jO��TG82&V���f%���&��D����n���G<I�����V��#.d�mV����t$CQGR�
����wE���W5�<��

(9�?�*��$a�������/S�5USx1���/6;q��Xq.���s�l�v�(����*pIs�Gd4�����iU�`�R�_�0F{c�V�C�w`	���ZN���:'0v���[1��_r��x��j�W��N�.���`C���jj*��hs�&w��
~|����wtO0%OE����m�j;e�f�9�pK�O�R�X[������,]d�.'�1�`��[.�dhKe{�����x�����{;�u�sx��v��_��#Nm�N�\�����y
Y�.�v)r��6-`@���Y�w�l�h$�!M�d�wl��b�k�.<��H�<�|�&X����d{A�l#���n��X2F�T�X1���7��A6�}�����6�>�UDO��"�{���P�����+�5���DYT&I;����
A��Z��gh�������������H��4�]���Um�#���O�z/�V�����g���s�������i���5��^��j�L
v���yV�0���(^e�1iD�9%������)9��Q�m���@�Z_�M��e��#��8���A����t�
MU2T7����������*d�N����8������x�]1F@�H�n��M���}F2c�b����"s��|���B�r��o��TV����.������H[�U�x�2��$�3���q.�j�������!���*2&V��&������C��G_�`XI�nC�g|C�����g�nYg�����"����^ `iGeQ�6�@����R�$��<)'�?+�-���Nacy�]�]�S���K���)��G����+�����>1+k)�OO~&�����{Dn�*�*� ���>z�x^��>q�x=��|N��F�	/'��7��j���1���i�����}�s��Ig��I$mS�cd��6�8�9��Z����i> �X*je�${�}�M<���&�����������Fv�<�������CnUU����T�(�H$
gm�&B�����5���9�vgqzt*ty�>�>0��R�i�GR�5����h���!���mU��p[� ���_��S���/pF����^8�E^�#�����
���������N�{��0&�,��������7���B=�6B-O-P���	�$v	�(i��BmY�1E4N1@����9	����U��2W��&�����F_�Z�F�b����s�IS�����r�����U���/����[��(cW��#M�dDv\6���������3dm.'�6�~����I@LT��*�
 as/^_�|>�?�W84��}������	�	d���);�ZqB�hh����e��<�����U�a[����m��*Z[SP�4����@A��/y@�aj��3SQ�����=�|ER2jZ���F4���������q$���O�Zo��.}�D��a{�;��?�������N~����=�����.�8�Z���tXxKp4;<Y{��.Ar�E����]�vVS��/*\:J[T����:�T����.b[��;G���s����T�t.A5S!��$�xq<2w �a~6�N�	����gl�.cd
���m��/����z<`��/c�
�9�m����1a �X��&��I�Q�z�M�/����W�M0Q��j�M����S9��\����=g��7��Hy:�����x`�������FR��s�/=�YK�Q�����oM��C�oGJ�q����cq9��F�h�?I�.��WN���DT> ow>��}���u��`��NY�qS�r��ht��	?�q.w����5���?�:�j ���9D�������&6����m�������
�]r������h$��cmG��8��F�8.�4��r��w�����R���a�������42F��z�H�@��i��I3��V�q�T�C���%ET4����}���;�Zo����F�F��=���2�d2�����4s�F�U�����N����P4o6��x%�0��(�V�������$�����;%9�I�=EZ��@�D��=������)��4��R��m�]S�����{�^������K���\m3�`gK��'�([^K`/o�CfNT[k�!���G_��8`C���y��,K�\����x�Q���G+�������hqj��Uv�i_x�o�����{d�!����RSV��i`�j��k
������61��F����i����
�BNm��_��0�t�45���`�	����]?l��H�Z
����~�5V����!j7���u���Q#�I��p�f�����p�����b����F��p��GY���������WG
��9�.�
_�n���L�����N�K�V�$����;.#�M%mAFD��y���De�VJ ��J:-����n���V��)��!q_>���8�bF����lqF�-�<=M(�����2T}�j�W��c����22bU����/�W9�IR4�xj���\�����=�<w�07O�`.�"�B����Vx�������/��4u'�E��-6���Ph��0�M�����5c&�D�T�pe��^F��=0��t�����C./���]0��B�q#h^[Q
5���N�i/|��#�u�c	RR��������L�������K�G	6&��o�OQ��k�{�d��qKZ.A���1a ��M9\:��G�
y����i�8�!����@[��W�m���4OT[s���?n;�u��`�xe��Q^���f�U��Uq���74��J�J�3)�is�!�I@:�O��7d����*HL����8��*2:���%�\�zm�"�W)
�N(�X�\�I7�sB.�O�_�����I��sb����/P��<m���5��-D���^	�1�7-���M��_�8�;�b|�u%7��<6����o����G�Dj&���L�����K�H������jnP����Op,/l�nr�@����m
3Cc��c@�����~��L�4��F�w_+B���'-��EZ�D�"6�s#������F������"��M��FDz�����H\�hL<��P�!���{�(����������>WE���p@���@�X_5K���M��_j?��
����V9��!
Z�P4�U�=�#?���U�����u��y�oi�$��^�Jh\b���X���BB��4

V��B�
%\zS/9Ki�#Z �>T�#�D�S��>�<F��20�@�b\��F�����O�j/2OP�=�;K��0���xj��">]�;���F�#�|D-�����8YO�qQ�}�3>�����K�C�6
m�~-6����"J��dM*I�D�~��cK�	�ou�hG8r����J}�I�K�]����Y,��R�p��6B�(ZJj~��7��n����}� �"vA�������Z���iW�Jd.%]�������Dl
��N�� 3_�r���"/b�����\�I'N'�OI��2���1n���u-m�(B#�b x�q=6t�s�$���O��,?��{��w������4�=���i�e��P *�74��&�6h\�^;G�:7�N������
���r_r&���6�F����k�����Ok�
/Hi�R���4+X������4_gN����6��~X���.�p7/-��0��������5�V?�����RC��<�(��H���|K����S�'�O��:4i4��2Y�8�h���6�����@W��9\:�r��Q�4��Aa����M5�`�aW�=6g��g�����,���(7n��S���t���Bb�X���.�����u�b�8�MGO�:[�O4���2w��xoT�����#����Cgqe%N�m��G�55mLT�a��F!��y�%L�
dLs�N��6�>���~�����a56\�?�~,N��j���h����j/�

���������T$`w��0�Rye9x�9�Hb��o"��fW�N�q��si����>g���p�l�O���J���Wv���vH��v(��|o��������c�'
��o��:k0�;��\��O�p�f���k���v��j�W4GW[��c��'z�ZZ��i&{��v��O�������q[?��D%x{�D�
l��d��fS������D�����q�Zd��{Y#{2�����T7��������������==6cS���7�������N��*%gm���)��A���|�)hl�,���R.sW�Z����J��sn�~i��(��'p���$
�����i���&6������cvC�|�7m�?����}�C�C�3���`� ��JOP4�3�s���I���mG�[����;C^��N���C��������
�j�����Q�,�s�zG��[���un.�w��&��W���u��AAM�?���9U-���j�q��f%�v<!��Q�?���k@�5�������v ��i+*\_$�.q%I$�$�i�����`��	Z�E��Q��Lm����$2�M������d�������g��Y�dk1�������j=
�ee4MgJ+�K�?���.�B8�7��*�)��>�v���m����t�Jc����{o�3��[S���3x"q�6���B���\�qt�29�J�	(:>�+�5����j>9�3�t���{���'B�yG�GIL��$pk@��PC�z�k-U8w�a�rYN'��!��:��i@��������Qm'�kB!�&6Z��Z����|������5#�
9��	�_j�T�����W`9����*���P4�!���`��P�>�Ux�������P����r�q�Mhq��
	��h��k��N����6&�(e���1p���`$^���>�+���N��cb�0�O�1����w���������ak |}������p��n�b���`�psO)c������)Jp�Qv�.v���<W��m|����KKI�R��"�yy������(��S��#����u%	�������xj��a�#X�����[��{Z�	��aj��<���U����E�rb���.�WU�8���@�
�<�o%��m4�:��k�#3YM�Fq�qM���h��K+f����6U84�����D����!ECo2 ��.GvI�-8FFI�&��F��y��$�27������
��T��j\��c��w��uZ�s�EM�O0��W�����6�3�`��W��.�?��s����:;�7�o��W�_5C��y%�}~j%���"iq�����N?��Vi��-R�~�V��b�{�cJ59�_?(�����^P���&<:��6���?�<M;K�W����H`"�2$�~�D��'�����r�z@�����x��o	i`��P����$A��_��G��,l���xn
���e�~:�-W�q(4!�3����y�\I<����\�M�[#�����=��p��)m��*\I'y8��C���Z	'�Zo��]/CW�8v�{���z�g�xO
�d5�vF�Q|��P�(��E��t�|	eU41��+�!$���(���r�Qxl)<>��|gS7�P�&f����	@8�T��}F(g������p��Un�QC<����"vR��q���X/��1�����r�I�5j�~'Uy���)�GU���,�^��4�wq�`V��-S�=�������Q������;�+"`�����i���F�HO|� U\n�o'���k�b1
[��KSWhW�i.c��\r�L/������������&3M�����.�T��eb��6�����ZJf�>���o�����0��i�5r�Q9e9����<�������&��
�8`�UWE������pF��h�
/������)����t>xl�k������qUE�F�0��6������g�)=���Z�������Z
7�x0he�N�����[�c��{���[Z���Q�i=��	 ���s��k���P����e��"��qCpKT������yy]�n���3�o[@��c�t�5C[���M�]�l�;�������%?��9���_����:-><������\1.>��=t����\�,_��z|���~�A��c��9�W�mU�k�'P��������gM)%�$�q$�W����kNp��]���
��h�y����8�� "���������	�K���;�Z�����7N�k����G�',�����Q�~J�@7��h��]��i��7�a$8��T������c
+e�6������������?q���CQP��(f ��������=}8�9t���6�RP8OT}���sN�M���:�tH�O+@��<�S`����{u��e�����of�,����������+H�22/$b��UP���K�M��T�7
����6��~�(�I�m��z�z��'(��q���R���i��\���mk��_fMW�/tt��*��~WrZJ��f�W8���I���^{�|Q80��h�6��:��W���K�@���Wt�S���v�8����~E�N�=�NM>�p)�0���&
|��������
�g��5.�I�:�2?�F��<���fAq�j�i�u>#�4��|��)�E�~��uj8���'������Z�K�hlt���h�����i|��5��Jjo��5�j��D�n���q��|�S0�{����~������F��?1��NQ�4��N�x���o���-Q|:ip�"��;-Q�V���{��W�����5�4���hSmo�J������oE<�w�o�_z�)hn����<���vPB��j����9�����'�]��vy%���@���W�CL�����S�On�{���+���6���<>Ca�����������������}!��OT(��F�6�������,�1|����KR�{Ka|�/
	�{���P��xY�j�OzR/c������='�a��@=��}]?2�J�+�PSc��������B@h$�q8��~�x3<�k]�q
�(6�e~�80�35���QnR����sJ���N�R�`$��6���c�J���do����!��n�.KU���.��G>��n��~
Ph��B�K����1h����p�����m[]]�P���m6�^�$���{�����������>�������x�=}S�X4����wG��[����;B����<H�cr����9-����_��������7�e�z�� �B��KC����;D-�������'����]]���r����*O	h���ffSD���z��A�����ad��c�p�w�����aM�/Er#GY�������y���U�0w�s�d�c����-C�D���f�gD!�^�815��9���|����1�?��[:#�H��*���so��<w�Y�)��~Kn ���z��x���<\Z��CZ�5@Q����C;�pxN�s� qh���l�;S9�cv\X
����.�������8j_|>$fm��?�����'y�r��j��8��H���$1�
O)KiUl�d<A,}�g�31�c���#����5�9���p�Q4�t�����6�s��
]�����b�s�E��7���]���9�d
(�RO"���j?��F�#kF� ����4n��5^}�bp�)��b��$�'N'�r��7�e6d�������^i����_��R���I�2�No������>C��e���GBSQ�X*��.��x|o����W�}Y�F8t�S�5W,O��s��E�o����lU:������)����*w%����&��>�';�Jr+H�KZSy�����s]YQQ��V]���o�y��������>�kX~Ns��[�p��:	q��8�G��������h%�;��N�"����O���P�����.������M��qq��#�-�+����MK�77�i����G����B��f�w8�fbl(PWx�w+����r��P��� ;]����Y���A�_�\bao����W)��q)����y�Y,�����7����a�=���k�76G�\])V����
����<��{%t������|�>���.�~D}��?��)�p��@�z��a��~[����~d%��f��#h��:��������Mw�'�j^.x�N���{*����x�3���%�Br�3�l����mW���F�Ken���9��i���:�����^��wp�ye���?�?C��:q�?��r��-�/qRo?�;����lO�F�G��������\��mw:m�Ud�Zra����G�V�r/����YH��{�@�����]Sd�*�9{���v��
������
�tv�;/vI�������
s�=?��d�e���Yw9�~��g�/<���g���W8��p�4���i#kq%�����uC����Y*��8&���Jo;�&� ��3ve=��ww��e>~��w�Yy��&cKX��e�9�sZ
��jP68Z}�y��]����>�s��8���$�=~F�������ZZ{de�q=^��C[y6������^���������v��>���LsD��c�mK�_f��g��.��3'y��Y��V�
[^���`��2��A��k3_�"a���fn�V��@��7��B	��F�V?�lp��p�_���i�7J`�������e�����`/�g�5`��k��/|�A.�c�I*zF6�jb�4��N���(��8ry#e�N������p�����~�p7�cd�z��E�0�>���G��wV����~�����%�t�+�TP�*��]$22�^}��vm�e��j��,n�:&b����<��U���6��X�*��<{1v�P���f�UY.d�|�������Zo��'������
,���t���8�I��y>}�D��~��~r,c�u�h��[�1�h6���v��S�k�w��0�������m?��L k� h��fo}�A�q��<��k?A���"�`h/��������.��0�E��wM�~`���R�]Y����f��u5���Dq8�y�K7����������������K�7� �%�����Tj5�@LgxM��-���f�C�O(u��t*
>!�p��A��h��EQ���
��b��s%]Dq4b\���"���W��7����N���
����1��:w��p���+��v@�����A 1$�	�}{N�#x���F���J��E�#���6s:}���=��e��u��4���^�_�q�������RO
��#X�������#���W(��lkw����@��!����:�������6/���{��Zb��Ls�a`�xR��;���M��%��(<>�Kf{C��y��o�����������`�6�;;����6��������4���K�6!C}��Z�G��`M�3���L�����Kfy$����^@�2�UF�?h�
���e��rP2(��N�-������$1����K�A�xz7�U���(�-������m�s�y����>$�v���2�2I���,��#�z�j��i���	[|�</��D��~3 �o�b�J����40sX�OQ�U�^B�%��G;�����^6������6�s���S��,����������������<4r�,��?�y�T|���/v�9��a��
6�����[��������6���`��MG��R�����-���_v~��h�|C"�V�irG����`b
���W�&��U���4�.<����@$pj��,�K�����?��R����*�9�e����
m�D���x
Ic�<]�PE����zM��O}�j:��~���6XO�x:J���JQ�yi?E���'�R���������6����``��,N��O.lU���o����q??��a��>���
ms2�[��,�?����s3[�G������6q�4��4�=AM�����
dO�BXp���vU�5�o�.�_����
9��)^��U&�a&���x��;� -K�y��cs;��	�	[���i��
4Ma����V�l������3��rO��7���������4�?���\��ms�}V�7}S�����;�os'�w���O��U���Q��{�>��V�}Gz��$���[�I������;�oq'�w���O��U���Q��'�w���������}Gz��<�Q��'�w��)����[�y���o�����U�����V�_�o�[�y���l�����7�� �4��p�2�,!��m '�kS�XI�_����	
~wC~=eN�������GN����h3j��],�-�� �����v��X��sf[����i�lds,F���K���	bf��]�'�?�Ll����[,�
�������)�Y#hh�	�Q���8QH��M��P8����=�C�x7�S��w�X�#��Z�k�z����T���7�G���S����l�	�����f��Z���'����u�_��f����V�i��)��v4�����U��H�r���4
�/���/���z����i��U�^�o9m�ShRB�vw�����Y��'�4�8�D���p��M����T�{�
w�XI�/	q*�l�P�6������@����6���hx�<�-������!��76X��W�M����Y��C�iV�i_O)��U�\/%��/��j�)�b������E����\��������k���oq'���OE����{�=�z-�$�[�I�����oq'���OE����{�=�2z-�d�[�������n�z-�$�[�I�����n��E��������:�Yd����U�{+9{#�o�mwCG���j���k���?���u��~�$�ui<���t��s����-Q�6_�~���������Y�iOC��R�����^\���c���`���p<'M�6&
Sw��b�� M��C����E���zpL/�n��4��_�����%6,v�?h�������������;'�9���������O
�I��o���������vQ������Nh?��E������_��xw���������n��|>���3�;��$V�x{C��=V�x{D_�!��?��'DC�o������C�a���BrD=V-����r� ��]������_f�� -��U�U8�#����-�����%�:�.���U�������ot��{��[�?����V�O���U�������ot��{��[�?����V�O���U������ot�{��[�?����V�O���U�������ot��{��[�?����V�O���U�������ot��{��[�?����V�O���U�DN
l���\~�v��
��[�o�H1����F��rp�\�O��mN�@8@�2�9��K^!��m�>�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�0�cQ�va��������a��A��zl���w �����	�����ow���M���{�=6�P�0�{�=6�zl��M����e�h=6��o����p[�8:���4�NSd�WL��ev�J�rl	������n������������B���tU�����D�G���D?�o���B?����Q�P������J1�=V)
+WtL�Y@����k�y�o��T0��U�5�����no0V�27����������j5���b�j�����^���2�wE����n��p[�-��w����n��p[�-��w����n��t[�-���wE����n��p[�-��w����n��p[�-���wE����n��V�_��B!�����,�P�
'hn-�l�X�r^���os�v�������clm���6����������n�����n�����n�����n�����n�����n�����n�����n�����n�����n�����n���u[l-�����[al-�����[al-�����[al-�����[al-�����[al-����[al-�����[al-�����[al,�?+��~#�TS�O+�s������FmC��l��Z��lO~1���d)�#r��;�]H��K�ck�����G��RVB���x��v���0����x��:���T}-�gs�(�\z����r:j]J����{�}.�{[�,�aoM����&�T2)i��1�?#nf\l��qO$M��pV;��J~X��M�����-A�?cSfr��m�����T�Yi�q�f�X��A��mOR�����LDl�K�r���d�OM�/h��\�$�;�C�Ok��q9�dw6V5������!hvR�p)��[H���a����[%?���fvM��=6��MK�gq�J�iU9�6����O��4���������.����t-1����,\Fw���${�c����"�U���*|�@�7`��g�g-�VHf�J�}3�>�P]�S��o������N�%E,�7��b,�T�N7������F7%�WR'��l���{L�O%UN����p���GU����c��@�j����`Dn�QH�i�etB��S���3�F�����B���5����UK�����@�^�����mL��4����;KK�����y��i�����AH��'�P	.����g�e ����.�gy�K	�+vV�����m���>�����c)\�\�^��-O�=�-UL�n�>�S��b.6�������P�M���g#,���j
^��`��EL�?�G����R�z�{�YH�,����2������m����uY�J�q�c�o77og�w�5=
d-�:�p�w������x��Z���=T�����L�FJc��m�Y������3�R��\[�/%�u�3�Z��jz7�a<S/}v�����u��G6�N����<�:`��2�0�9m�x~���<w�?���?���gl�������D�\��C�������GL��[<r=�s�<���
��;�������yb���dyr+Z���m^�R�}`N� �X�h�R���9�,��[V}�R~��d�JV�&����=��A���n�i!�{$u3;��W��J������/_�M���������3c��9�/J&�C�UE<�	
C�Y�/�nh�8$i}��.�!QS��TR�c�ch�=���Z���������QT?�
?{�6f�� ~��0v�%3!n�h���[J�I�,:�{Q"����]�'7��<�6f�c�p%=r��2�MV�����d86H�15=��o@����)�b�RIN;�t�;��(o���-'�^�I�ovX)�k�k�7����Go��i�l��_
�r�IE^[M�c���%,0~�������9n� jrZ����|F�$�uK;��F�Jdr�.D.�GV{��7r�78���O�k�� �z�+���vw�$����n�B"r�C���0��R�*�*G}���1�;.�-�`���Sv�&����]�0��%_���&�Jg�X��&$������@�B
*H+ad�a
c
b#%m��w���DR�#���yF���B��mZ�R�]b9��81��2����:m'��1�X)gfzfw]����E�����c�+c{b�s=���x�����L���������s�qz�ZZKS�����c�lm��4{�v^yK�>K�^�=�8<5�	sJ��q��A��^�Q%\�m�d���ZpF9���jY�2��P��x�.v��s��sF����dn��g�����f������#uvnp.�s�n����?q�"e-TK��v�cF�3���
��+K-^�)�6�L���62��e�.�j��
�>�)}H��K���O�qv8-�|3���4�A����{�d��6r9�6�5�4
�����\�1M��m/�^�1����2E%���=�6X�_��e�OP��l��Z�glm"���O�|x�sY�t��J#|��t`�Z����Y�E���^�,�&��z�����R4�3��0F�����8b��5���Rp}ed��w�H�S��x~�����������{;�^�
�������i��m�/��fd��i�3\��,���X����t���f��%w��@>��b	��R��M2WP���^��e��8p�+��V��/�]R��Q�;�e:���A�U��[-}eQkIb�a���>CO�j��*�V��7q"1����l�ih�v��r����$n�lE��i[i����Q�K�/�-���+^1�Hz-�<J8� ��Y#n���18c�	}�
5Em@���jXV3~�_�$N���0��+���8��o%����P[J�B�h��Z�A���bc�����E��]�-J��{a9�Q^;����[�u������+$cn��.�����V��e�f�\������9�Oz�lW ��i|1@��GZ�x2��`���w�4��T�����s��r4b������$�a~���p]�9���k�7�������6J���=�K�#[w��Y�:8��(IiV���-���K��x�GIU���cc�p����v�����:v���Y���r9�t$�������F������W��.�p��l<����P�%��s2%2�o��<�@���!�It�6�n'�h<[���������S��f�r��
i�Z�	�Q�s�_8v��)��n����h������N��p���mZ/�(����S"�`�����V,0��p��{C����N��9|�'��Z�]�� ��k^!�������/k�pSq+�[L������f�����vX��;-�1�E��P�=H����VX�E�9N6��
�
6�F�a%�����.B�7��-��������s��4m��������=b�2*d�������^��pB��Z:(��I#k�K�z\I�
S�Mj�6=��X����F��z�[N�j���q|4.���s��['kv�,i|N�V����+.�����XKzm��5Z���p�l1�V=q�1Kj�����D�|�\Y!`v���7�^(�]
,q��~ ^��pPR�j�t�.7���&a�g8���Qv�h���d�K�sZ�����~����6bC�/�������*zfM�h����a�
�s�b�>e.F�)�vPFd���0G�2��� @o�}�;�@	f�+L��K~&��"*����*cj�-]�F�(��I�A.@1p\���}I
���l�P��F�K�$��{y����= M�EC���L���!hQ�y����0#5��y �y,�e��P=+m'Y{[��5@��6�
HV��9�pAu��]��L�B��fT]~*
��V��������V��\�j�%�
���T���������yo����`��
����<�!�f��NKh�2���_qo��Y�_k0r��mE����<��>e��������������+��R��9�j�=�S�W{`�R{7���"�Pk5	�3|So�K������]�q�H�qK!�<c�m��r[JlS\�D���!`nD�B�\�0��"�������3b���j���}7(� ��n!6��|uB�{�#�Sp���������BY����
���ri�A-��L��eU�7ZZ)
a@B�J�=��b������;��-�2�"�OH_M�+��"��H9�TA��Uz	H#����\�����?
�#�x�b�Je(�AqSi�;��@9sc�;9-����W�:f���d��C��ZM�*T-6�)-���%���M�. ����q�s��j�9$s)%U��a�TtmgS��P���0�p
qPn�-�����.b;<"��<PNea�����G8�1(H���� �����z�����t�xi�/&�r8_��pR0:]D�A����:#�`9���Iri�Bx�
4�{�X_0~P�8�^nC�l��/t��s��2f%9r��2X�,W�P@�.�� ~!e�l�5@;x(��O��v)���M�#��n��?em�fQ�����"�4M0���C8�V��fIt�"oe���.@n�!4�@w.R������Fm=�[��h���q�P*��jZ��[$fWs��Spi�5�n���#�����wy��Q���)�V������&�o�nj�>(��P�no�3mD����j��������g�,�3�s�]_8��x���E�_����~-��u�x?��Dw��cz]��mi���������.D��Qn�����*��}����K�v�.2X��]�y�>[l>[m��B���|6������-�W3���6�d�&��\G�z�]/+=�T.N��o��<��f�>k�������1�N��96����"�����S�������Z�������G�a����5�#�oW���S0�������K��r�(a��$�ng�m&���9�s�#���7�n7 )fi�lK��%��������������-������j-��Z�R��L[R����F��2�{�i���$!��1�=�E�g
,��:RMU�C3�4����r���s(�P��E������CU3�Z�V������r�
�����Q3e&���{��an= M�zS�J��>L.�{X�j"�[I��8�<�\������.��y&����z��q>�iZ�Ge�@����|K$��� h���
�l,uHC\�w��Lo��f���79%�<#M$���������Fc�H2��8�z���H�V��hT�[)�~%�^Z�s�NeU��NU���K� �����8r��$��-E���1��Ln$g<W���i�wQ�@6�mxL���6v����0B/�i��>L��!$"&��z-.�P��i�f
�����"�����
K�%��XI
[���O&�"�1�W���������$^���D����sZ����2g]�2����y����v�W1����/��:`�*�������p��!&*1i����N�nb5�[q\l�,�-�����Z��2e�s���UT�2�����Q�1CS.\	qT��m= *�����d%�
��oPy����$��FC����bH���L!h-�*�$��!i������2�
&�������K���0�v�;�O�yk�&�
���_��������4;x��eD�3J�-�A�1W^Q1;��F���&f��23(�������
a|���r�/��������8�y��N\��"��8�f��`T1�
��*���1�d.M��<������	)��@#)��B.�"�V�"r���#�L��)��R@K�r���
y`���;C]�M�G*�}${�������2�E�
�������N��'*?)��;&�j}�i>~���L����2�#���2����=�\��U8����p Z	��=�gR�8A��_���2�������_z{v�[��w5�7����g������l�s]����?=��x%���7m�M����@��}6��}����p�9�����n�� q������}�cgS�OHb�����=Vo�����r/�����!��E������}Z��25.x$��F��)gr�3�P���o
�����53S�������2��N ~b�2��6�h�����w)���n�q���m3D�s�
_�q\o#2�B�!����!����jHm^���&4��4�9K���vV�e
{�Nau�U
����]��������j���|8�7�X�OP��xi!�/ 4���@A��F�L�a���{/3���vV��#��R���2�Rr��& �g*��oS�����o�hd�����

*35�2��7�8���Y�`L��9�q��t���&���G����l���@vR�r�������<;%���!B}*����C����z6ij"�<PQ����t���#T����t�#h?9r�vPZx�����l��'cB"b��L�&�%k�d�o����+�����J��p���f, \6��w]�%{RF{-9M�����
�7����/�tn��y,�;��	l�������W�F�����KC��.�f(��1�iAv�Q{���������0�#�]��4�������@P��$�/��$T�k���5�"e !��%�h�������
��]�����*�����
>s fW!j+A 
�P�Kh�� Z�H�6v�&1�7+�\s��Ff�T[!6=�����/�ZzYG[�/h�1��Z-^��#^���nW���=���)O���Uq3���dyh�	'e�J�-M�W=��P��ihx7��.h�QU�E������U����F���=Lq9��B�<������sL�j[ ������r�1������*-4�
��s45��d�k�%�gj*:�6d5�z�"8�P����7�y�_ ���
<m�o�2��KK\�"9����J��J��������]���iv|��P�(	i~�y�'x**b�t"l���w"�� P\���KSh����8������-
@U����V�&uS��4 $���m��u�����n��#���GnV�*o����4+�Ex���7�;V���m./�[Q���D�Qn�'�W[�	CxRB�V��y�H�����.��K7Q�
e#����Lo*.Lm�QL�_'2�HqyA�����7��M����o���~�#�t7_��b������n�m]M�P�~���S���q�b����$hn$d3�Q���k.T(�|R��q~�o���d��C��P4�Cr'��,-���x��fL�C]��U��+o�!��9����}����k�G��p��&P�������O�Q'���"��qC�b�w	�w^KE�P��-���KMs�. 9�43r��
�;5jH�0��m��N'x�oB�}��[�%�����n�����Z6�CM�����]���9H)�j��1�/��L.���Q��
����2NA�0��l��B��qPj[!�-19��Q@7��������6�yp,��9�!�qk�9X�%��j�#���;Gf��E�r��`2��F�^[WJ
��!.
J�0R��^��T.V����'m��9n�e�
%��q�h7�\A!	T���,�u\����;j-�7�����V��i���88phSu��DP<�"�@����A "^�E�@e5P�!�U.E=��~�W����E�]��-���$�>��T17{W]�4zN�J�N�LJbH�Q��J��"�8Nr�������a�1�
!���d���3�	�:n"�#�o����PPe*U�����o2'#���Cn���H����@.�����#�]�����j�D��� �I[��.#���yQ[bI�_pzmU�=�t�}�"@����r��Z��������s($r�J������ �H)�y��6�O���w��lT����8t��q;����*})��sD�K8w�}�������iIx�S�2��D`��Y��CZ�����	��
��\|�B/�"��-0��Q�V:%%�[z���K��*��������-����J�xM����+j�q���p{���n`r�C}���-7��=�qLF�i���|�8�Ip����Om�645��r��&>E�s&��!_������\�3��2����y6�Uq<Jq `S����
�2�Ai��z���pB�x��8S�)?��9�"+������������Rn	�/R�\���U\��BnQ���w�a��>a��XK�4�I�B����"�������%u�E����p�.���%�\� ��Cr�%q���Oy�3fC�&��w���F�s4�{+�M�z�~	z�-A�UPk�lo��
���s���[xC����d`E��=C��DM�n}��_���6����-$:���D
�APlii��J�[������jj���c!b�+#�9npCnKN����r�;<����D�F�0����m;0���i*�0�M�-�'���F�6���'�vZ�Pz���xh�x�qr�nm�)n%Um�D��]�B)J����e������L�w-����v`n�f�1�F�ar�.	�^��2��,��2�qnS�M��'-���K#TT[�%P�����)����R�p�����@��;
��������E��*�t��n��=�Tm��-���)�wX����$�`�~]6~�
���k]�o�l����������O��������`�>�����e�y�z�
���}�9�o(��������k�
�����,��Y��?�m���Z}Z�����Qx%��0�����'H������W7[���^c�6��pr�fu<N �7����k�Z�
�+y���o��9q�'�jj�{�8�A��+r�0��=�!+j�1NJ�c����)��*0Lldv'wW�
���)��EE	�}6��\��&BQw^�����r-_�g��.]��UWbZJ����&^�l]�T��.�[�UC��A"��A����nsf
\���]���2�@vl.8������wV&:f�����������L�wp���\� XEk���QN��o���&f���*(H��kA%���H��Rvr�3�V�����l��9����<fUs�/�
��O���.�I��4�5�k�(��aj�JbD�w@������U`o��
����\�m�8�����������9n\�do���l��"����>�=�q����J�R�8���t��5���2WU��i�!2!=��i*BID[����%�� q\���������~�=+c@ T>�+����kp��M�G=������x��� 3"!j��b����US#����;E�a=�*��t1|6R��jh�T���E�]�f��������o����f�����O
LB�^9�vw�p��4�q�R*���A;�P~�����~W��;y�>]s����G.��K����4���zA?+��8�g��p��}���N
�)���.�K/���O��Y�����q;���I��������[����og�x�n�����������,.����o�o��uY�~7���@~X�~J9m�V������������&�Q��z�����]�;�U�sw'�,>[E�y�ak����B���=3t��x�hn8�8��ik������}������sz\�+��f�}��9l�����>�,	��-�P��
�F�n;��jn7��?Fg���y-Y����+��!c1�kX�af�Ln�7��0A�|�,�������2Qp����6�^j'��243�1
�yS�2x�9�f[��"zM�R����=���1�o8�a=P
�����Nq�3��E���������H���H#��Q��� ��	hu��d����p��������d�x�]���2���K�
�9�'��if�N\��n���U�;@2�Z�.7]���������w����E�~?��$e��6�D����x�6.�4��0����LZ?UM�2\�q��>�9���E�����Fp�	�5=�b�^�s^���.u��\}�bqP�<6��H�c��h�9���]j��)�I#.����n�����
��qv(���[�(Gb�����`[�����Y����;��B�����@����H��]��hp]��M���(�1�,
L���so��NU�t�?o���mA-2%���U��XQD��B���~�|5!.��w��� ���[e���.<�wB�-��'O��S�(er�^p9q�e���s'i���-
�P�%�4h�Nl��K�)��y6eMi,�.p��/F��
�l�d��o��co�FU��q!7#����C����s�)�d�� n�r�����%5��:��B��"L���6�T�j���p�e��9
� ��
��XM�},�A�	k�[~k2|3������@�e������z	�cl��cY�:f�	V4��\�a�ZoTvrH/��h(
��`H(A�U_����
�w��O��[6]����m������F�����Q�[�A!�m[2���*r���6�I��tYW�`x��g�E�LyyQ,q>b;P8G���o��-��OLE�Y?����������rr��l�u&���������aQ���)���d�l�����G5��W��U���^b�f`v�]�������m!
�����q�!b����Z�Lc�hnR/����0���
D�g�k��18�'���l�}M�8=G��r�������?	���A�-��m������fuh��_Q�\�\�@��� ��{�-�Ky��	.k3E���w�\,c��s�y����Ce1fK��Q�;v����i)K�8.BH$���:����wV�J��)�p�'ly��}��#q����w�J�� n�99nv��DqR���q��q%.������9�[u�n�S\m0ab�������@,��n��q�[r�w.;��(�OM��!iq���. �(�kQ�4I!l�2���q(��R�v��L��%f��\� vGq���s����`���,�_Y2;^�����/�V���K[8=���NuDnP�������8�9^ ���7��J�; t�V�m�nP���SS�J�s�xF>��
��<�b���z�q
�y	�l��P^OL�
�$-%.p��V������! ��[r��S���U�7,�;�������O���c}�XN�	��e�]��9	G��^��Z���F�w���N\�.+���.o:��K�<�����b�2���;Od�m�����������xe��#qsT��\Kr��o*.����O���K��h�+LoZ�r4�c�
� .v�0
�LCA
��BIM��K#��r��+{�\q����[5��{ |�.$?j"]�!#b�`��#u���[��]����_-�����m>:�kt�J������t���2���k���ZexL�i,4� :�����oX4����<��g���\Q���`���������ia�7T�]�>4��"��/k>u�����ht��?�s=�9�BqP�^6��AOF����z�^G
�#�# �P�p
�Q�+���Se(���
�F68�A�L����+��M�MH�����1(	��`����t�������;���7p��(�(�H%
��v�=2��{��������f�G"�������~9��?8 �I=��v�
����]�\9l�c9+�=>��A�)k�_L��F�*��NU1��h�d��u�q��7%���N�H�^T�H�'�p7Zb�y���}��oQ�26��<W9{@<��E
�w�-���E.����0��t��wl]���SquC�;�q%kor�����K'�l��N!c@�������G�a�������Wu�-����4f�m���[+	��Y�`�UE�<���V��r�Fv/�����9O����{9�S�U/!-.�@.�6����_�2��\wl������o�+^����a�]�)k�H4�DBB�(!0�F#��m�>[���G�9��Dp�����K�~�������vU���,M���0��j�G���E�o
p��jY
�N�''�QH��@������,K�vk�w%���%�$B��)�r5�
J��/���ul�o���
���>�
�U�]��>�����J�[��?��G.R��{���t�G�oU��6���Y(7�7�C���C�-�vH���#����%��2��"���Aq���	�z�6Cu��_�<������Z/���n����	�m����W0�	������ �o\��a��2����yu���4\�}��V�5��V��g	�'76.�\����l�mnz����N�#��f]�2�)k�W���[�Tl%f�v�f[�/p�1��������I��.��.7�����
��=b�U�gt�A%P���i�oRy�TS+���@Bp���Wb%��oD=�������;�������P���������v�q����M�����S6l��Sj�=�wa�8���0�=�2��8�Z�M��z����Bb��0�a�Ow�H�������E�P��������w&����7.{E�+H\H+��q���-q>C�o�6��������������{
���6���m���Yv�%��`jL����������Iy<6A�5��������.�>�]k����J\
�t.��E���^���c��-EUvl�@D��J�(r\�@�x������� .9�����`8rY��&��n����&��9�_�=�
��<��n��d���9m�����#r��w��~�E����MaM�v~ah�����8`r�Z��qM��rX���gfM���8������4hS��N9�e�x��E�����7�A�]���U����{����o������[�Y@�Qpn� ���1�������.��`~"���-��\>)�5�i������?���1�D;ak�!7��Pm]��|& ��~\W�x��`?���@8���*�������0��kf����u��c���Y"I�jp+����p���������T��I���t�m^�{B���'�c�����av��B�}����p{���&6�v����/��Ve������?����-4C`j�Qf���Y��>b�+���}��8V/?/���v?��?�/�E���6��n2=�y�s1U�������>`wYG�m���%����?����*���>���J��r|�Df
��7XG T�m�F�e�;��F�`�����
��AfTo_C���d�v�<����$s[I����)5"�y�{\�*����&\�V�x�0�P��V��88]yW�.�tz�W+��<�vr�����
�M�j�^k�o[I�dC�*���cu�rs���h��^3���������iv?��<%��[���3����{������n�0[��E��q!�.+����u�[9�mJ��/��r�R���SS�I�BVj�c$��. ���X�7������S�am;W����GF�\�q��hL�jU��3�����k�A����F�u��oy�_������I���� ,"A���^�
�����j;'Z�^8m�����*�s�&r�+�-���>a�f����r�9.>��zJD�������
wd �3�<�����M�)bh�����g*��P�+f�i����
p�1�%�r��L�[�wL
�UV��i^�B �[�me���U�K:B�S0�,�:���kR���I�,,(O�s��eB��P*��ck^����#��7I��E���%�Hb���l��B����I<i;�� ��6J���u��@@��7�2��ej��{��zz-�q<�z���	�vl�[�'�[jZ@u��^���8p�F�K�*�(DM��
B�I��� NK�2�� ����vPc}��;��o6�'��-E,��Ne-���������gj�8�@G�����U�����B{��\T�17]l��O/������Mh���6qK�^�U��	i���C8]�-�S�n�q��j��������g�d��j�-a�����`!`A���ov+��xIs[�$x\@��N�����#�y����c��S����,�`���M��.� ���t�rq2�a�=6��$������c�����h��WR�����|�,��^^������'��6�w�l�{���������|��/����
�z������o����`;9l�i�����d�����aVo9�c��7��]��Ke��w�m�[e<�-��A�Xs�|��~��I�j�43�{q����}�|���������}��w-����X\
��n�����<o��M��&w����c�}r���H��2�M����N�4�����.�l�!C"�/����b��Tm��\�hu�I��e�����5�[���I��:����`�o�i�Z/�"�E/��������E��6��7Ym�z�]��^\��qK�n_��m�b6��r.�1����A�*�B������q�ZJ7~;����m	q#��w�Uz&&������K�M��7]��SU$��"&������n�����9*�@���dq_OE��nD����Tr�;�.��P}�f��������������
��Lw,){v����l��o�aEO�.l�I�����PZ���6�vg����E�!	�]b]��)����0�~����
�����,�?wN������Y�l���IkQ{-.�^p
����jkb
m?������\N�����9t�����3���E�y���M�!��f���tCa$EZp*�v?��v�:
e����t�c4���D`��(��9��-hq' Y3����B��W���`S1i([�6h����I�91�fH@�*��a�7��H���R\_q<���7W������?g)~$�����^������c�$��~LV�����Bl(��\F�z���4���ZJ9n,������[$w���Y?�c���`a���E�����i!y���P*���6�ee�ozM��6����g��fh@G�{AB�n[2���.N����Rj�	��Y�r����_�rUp���d���!$?�!9�u2�r.6�DU�E���G�T�_S�Ik B������V�������_��;Yy�����m�&����LHq{Z[�`�
���%����RnZ9#�B�8��0Z���s���P�B��s�����wY��S����PC
l�%�*��n���s���� ��2��_��s�����-�2�PB�~�����o��9��i��9��Rz�Z�C��N4�l�TT� W0�s$.k��:���-���&�lX�PG�:p������-U�U^U[e6�1�sx��RX��9������;Z�z�w�5�/8��jZ���:���Y�����RQ�t�b��6k���|������SA���
�3�yX��[�	LN�SFq{��r�6^��[U�@2��S<����5�pL17��/	w���F��R��������u��}�������"g���@/������R�r���=�R�:��I~�=�V��@74�D�qI*� �I^�a�;���[T�r`Akc�8�h���F9I���������a�)�������E.��(�Ic,c��AD048���w9TC����@JJ�D+w&�g�Yp���S���2oK�i.���]�"�]qqm!7
���6N�������[��������AGVF��e
kr��"���"���(Q��Tx��`t���(�K�i�����E�����K��,)�"�D������T���.kT���P��h��L1"��,����S����R4'gV���x��N�%i�����7�����1)#Y�T���(	��1[�������s��b7�l#:1�m8 �vZ�X���b�D��q�k������/��o�Z�����^�E��x!�.A��l�|6���
�q�����QO�"����=����"����~�����,@��F-����;(].+u�����v\2�:/�1KQ2c�IV������1���w�p��F���a�����@|�&G1��X�#2v� ���esHp����
>gA�px���a�J����35�\A���s��r7,���S�7�J ��*PMz�pq��W�����l�F��7��Z2���K�zm#}����������
G1��o���IK!ql�sa�������j8�8��*@g4]��u���-;Mk^����F��
b"9�hS������R�K	.k	 ���������5�g�����T�_��G��ox&|���i���Q)u<�w��27���P��E�Q�:�H�����UqX��\����]�4eq���Q����~.r���\�������q��{��^=M��$=�� R�T*p��,u�Vg=�C.*�`@]�-[��H���dp@��%��H-
����(P2��d�g���C��Ne��!�FI
����M�A��������v7���H��GF�^��q����A���J�+hd�%��r��W)�9W�6�M�����jV�n�8CP�3#A��T  i�Z"$�	V��R:H;��U���1��^Z�ba7��������'0��M�/���.������� �p���}��Q�� ���D��p�vs"=s+I\�~�1-��M��������1 �
� �?��5�yZ���������i�Y�S\��5G��!W^������h�v��_�P��f��4����\����_i!�s�%���'�I��� ����m>ds�vr	�T��r�Um,�d��]�d��R�\����lL��>_O��,ir5�$3BN���Iyhp\�\x��|�9�2���^�s{��q���mo���@�eh�4�������]�p�3�.w�n��4���&d-pU!�k�����9m��{�$T����hk���(���=����s=�����.�-�3)h���z
C�I
oe�5�����6�����Lis�b��g���*�-�p�G*��#��A���qN|9m��y,��AXI�O�(�Oe9��!���EAs��_*'��e�(9��<�<��{h�����|�q>7/���d
<�<���i4��X�P0�p�����^�7.��i��@Q����OM-��(KB�K�T�.�*�U��s����
����:x������8����m�u�|��,���m�;�[{�9�pAu�����y���-��������X9��Hm�J�����q����p��|��"��W�\-���X���@O�}�]ii;�����
�,�0q8I��n}�}��w��	�(CS,�@�u�Q3!���a��P��A�����F��r^T�8���������C��)���l#m�|�~�{�ce?/��<�%�4���?S����iA�[�
N��J���;9lk
��N$�r�o[��!S���M���_� R�gJ�l�.�_���O`��t��t����p�}�7������-�����2��������5H3;m���vo�V��a���6��wy��l�lei*z�$8���%��1��-L$�M�6��@���I��#��"����M������@�m��^I%�r.)�v�����kn�q�� �r]eS�d��l��'�-���NQ������&�=ke��0��f�~*%���v_"27}������%�~��
���(���)�u�0��f����?��7*��|�9�����Qf�U@E.U����9�B�;D@h�=v�9!��=v�9!��=v�9!��q-.�Jr*����R[t�(�C��6��������~�h?���������������Uw���e�'�o�~L�_�y��K���w���&|�]��o���[�A�&����w
�B���R��z�"@�]���Y3��S�Gt���-�KO��)�L���c��*�U�f�(
�S��
�������j���]d�d���`�eQ�r���B��
��$�1�9+��9E�E�%y'
�bt�1
���?UY��4h�3�����n��)���YeD
B�6�� �iQ���������|� �N���C�t�l�������e#���[��M�f
���2�@�:1
'�������=v�9!��j�����r�M�6oPD�����	������9�
R�DD?�U��a_W'�b7&j��G�lj�����^fI�L����Z6Ur��
��*n�j���)uV\�{K%M��l�z�v���c��N"���f02J��	��)w�(
!��8N�T���}T�S�3���'$��S;�'Ah)��r�&����*&�(���#����f�|;}��x�uQ	`��WE��Z����2�j����!0��J���!�

d�����AH�&~^c��)�����]K5|�/��"����T�v���F%�$%�
�.�&L��hqq� �� ��
��}R��
U��g���w�1pj����7�O��N��p��r�����/��ns.P���j�=���j��-�%&�i�}'HD�	�������n�d2��8���L"?U���]��b�~���x�'Q�
�9�#dbd[��n�b��O��w����12��76�&I�F)JU�������w�.z���ak%�v���pd�l��UO��<"��H�:v3m�'L��Wq:�BA�%lm�%O�V�����Z2��b�����9
��b������ �	�!_�9���U�����2�:��������M��lmT*�*T%Lt�R�U#r@�y'F"��
g�����,�M~l����ko���[N��A�'^Ssm\&�9��k���	�t���F�
f+9(�M�G�5n�����v��D5t�t�Jt�!�r�   !��;�?�g���\Q:���e?fY�UE}L����rU�����B���
Q6����99` 2.����o
����^?)K�����~5���0,��h���1+s� ���*R���,�V���5���S����Y���(z�����v�WA�fN�t�����)���t�X�f�P��C�.�'n)��5��b����C�YHi�2Qj*\��n&�.{��i��u��L��V����u������Q��S��������cW���;�Q����j��,�jB���J2���RW����C��%4����I>U4����j�,����u�[�%�+�M ����<�*�������`������
��yRO)����dE[r;�8i���,�������|�3�RF���F����1)��h�q{�{I���c&�E�j���tUP���rF�t���af�j�*):-�S5��GD�q(��9�w2���M��A�����1W��������;�!v5�P�X���W�z��%�������h�HN"�U6d�hQ0�m)L��lC^���[wp�9�l��m�:�NLbh	�V�=o����h��
�����{�Wj��*����fWce>���e_�f�o43
Y\Z�����_KY���70��q&n���O&��%E��U�b�9n}w�QQ��I������������T����YF����X�
�H6N�7)J��{d	P_[/$x�\V�
���2��xH����]������G�YG�S|����c�|U57[Q�Q�%%X�C�4�E��"����99hI��ifU[�l�K��G#�0lvz�v��U��s?��������������W���~S�~��~
�HS��hN�\��^���J�B���	�"�j��j*�������]�����3�U�jL�q�M���N���U2�LR(���$�W��k"��#������)
U��X5���-+U�B���u������r�G[�:�Y*�J5��BH�����o%[�����A^��O{;i�����2u�Uqn5����n��\�B�2N��V5s(F*3������&�>Y5R����}���'q�%~R��D�D�*.^�R�����L�:�9Wq�d��QP�!M5�������u�_B6R�jiZ�������\���J���h�~��'r�@�z4�1rD�x-&�$)
�P���!�/��^3
������WJ�W�����^�N�ejX��|g�zS���������",������g�_q�<����WV�j'N�9�,�DjN2��	jv\<n��b�����
6|���d,�(X�0����T�~�����S/�Y�g�W�Y�	e��u���s�����]��b�bZ�_�oN����[Gi�6J���
Ati�q���o������P0�uTn��Oh^��MR:7���oOF���"��Di���8�V�������SP�yETM%FM��XRV���T�o(*~.��(�V-�-9L���J�.-�H� �
B��#����Oj6�C�[U���P6V�1zH�����8���{&b��,��]���$��l���K�Y�u�oe�Y]�O��H���R��t�k�1�
;nZZf�j����*����`i
���AV�M�G�[M�p5Wlm�D������N�<��b�#����,��;�{��_8�U���,�h���J���d������{siJp���k�JH���Pl�����z$�a�\X��o�'�jY
"���i�'H[��h�;k0�5I/S[���R�*���(�B���m��RW)-�S$Q
O�gW����w��,��u}:�N����y
�R��"���H��#���ie��A q�[+�{�TY��zk����j���qv��D:�'~������ht����,c�o�`SM�N��������4�/eq7t�-R���`��h5Ib10'�n���LH��b�0~����(�FV�Z���M��k����Z{,����z�[�)6^E����")���L����EM�:�DU;(������W=�
:�f�&r1����QDNV�
�@2I�a5�����u����f�*<]w��hxf�-�L����+�t�����9�*�h�Dv~���o{d�d>��4J}��<$��I�Q��R
����"�@��,�*xI�4/�M���k��S���j�TIT��kK}h��Z����|����S�f�D�_�p�����kEvb-������~�6�?�#�&���n�iM���J��4��"zW���;d�@�8�(E���5s�4�]r��3V�n��!S��KC���8�p�\�H���)���lT��^�{2�J��F�h�L5&��kpV������YH��F"��	r2M�D�L��)��������Cg�7"�v�]���y�5#WV�]W1z��,�,�������������	N0��!"�*��rc��S�~��k=T�j����Z������)T�B��5<kU��t��(x�.�nU(��b�u��W���
�N�����X[����Z�J���!�S��-���|m>�5�V.���������;US6)�Sk^oT�n��>w-=]�
F[H�$�b)��I��iLS)M����S�D\���Ol�]W��E�����n���E9a�.��U�'�VnY��R���=�C.�KD�f����H�[+o.������J�T�3qS/�y,�����MK
'n:�,���o�����=K{m��le��y �BbJ���I�T��Qo���	�4�����HT	�/g7g^��������s�glV](�;�p�QW���U�mO��f�MQ�h�[�
�B(��jYi���jj���V��+'QT
CF%�����'p���+�\�&QS��"#������u�����WP_�Q��iKI���I[���s|�iH�-�MQ��>�����GyF$�(A�MQ(�+
�* `���������T�y�zZ5�<�4���2�N
���~R8l��d�$_�pB(��U3��]�}+(��tdc722VM�6,"g.�;p��I$�c�sJ"9��bTT���O;-	s`� �����@�j;�X�u�K������:$o"%dU�=zX���q]��������<���jh������\'��Gn��$��9�I��uQ'D����7;mX�p���E�%����bn
���U�)9�����X����3��I��Q���t��!1��wJ����.��4�55U��5K��y������)g1���PPQ:���P�L��I %sOvU\�cF�V��F�������Y���fV�:��UE1)Q.=��oZw�PSMG�Dp��F9�T?i}������%s5Cj*�V(���R:��Y��U����v�f�po��$���"fp��ix#ac5c+`���8��T
d.�S��n<T

)�xJ3:���.�>������c��8_��F=�j�*����
���`%.�����%t����DR&����	���k'��#u7v��Hwj����N�.bz��loh����)M�������x�
���c�"&3(Gvav��\.�n��R7v�����ey=<#��guX��o(�e�����I"..he�|���!�����(x�qd�O.
L�d$��3nS��@��K;�x��NbGn!�B�NV����Y�y�j��UgN�e�����kI<[�������M�_��
��Nj���Q�"�l�Q��������P6���z��{[�{���9�$���'h���(LSR�n�.����&�g���J����d�&�����m��w���G��Z��~��I,�&M����L�0��o���qe�ln��,+Z���u1�<�ivr�.T@wl�7D�.C�|��L��v��\#]�UX�pu����+x�<[�[�T���9���#�E1�GQ(w���Ad�����u��#{Uo������wY��-G��t�S���T_�������0L���W"�!�1�5*���*[f��{\�.}+a��L�A�yW�O�F^��Q��J|���j�h���V5��N�;�7���e�v���l�	���j��c,�<=?�����?��g-��i&y�R� vS������������SE��kS]�7|-�|��*6���YW�����w��\���F�=
gR�B��T�z��h!�+k�Q�3�X�
:u��z?�j��"���7�5x���Ef����E�<�ao���R�&��+(X��[g9���W�!(�7F~�Y�XS��!��V���TM�tLC�=Oj}^���t�����_}�5z�%�O=o[������g�0*n�M�Pn��v����j��zZT%��bkX��%--N>q������:��,�b_�
0p�P!�\�u�v��UZ��o��MMF��T���Z~Z:��Pa �JE��� ���(�F�q��Z��usuC�g��f\�.�V������i����,�a6�B�"p�i��������f`�Q��U[�t�U��#��Wzl�w������u_ro�X��'s���
e�W��t�K:��Rl�ND����*nrR��O�Y���WY�Wj7���l/k�[�Z�\Wr���l��Y��KC�%#��W"<�������������/Z��:���D�{w�/Ju�R�&>6��K6�J����eN��&AS��Qj����t�t#���\������o�v��.��/�7V����T�}��VV��:X!��iNM��3�q]1����7�������<V�#�����W�����yYU��5W8�[G'B�k�)�
��tQ� �,$�"r{���-��.�X8L��EP^��U41
�g���Z�p��%H
�y�����T�
E�tLR�D�
�O�E���]��Sc	wf%_:LDT��nS��� ��@��j��6F����/��&�&�T��gM�����*�����W�D�(��(�@UQ0���U{VR4]w�,���<��l'�JI��mM<d��D��EF�`~PP����ND�!I24�L�D�L��B�� ������
�;Q�K�X�]��Z�����]:I����NL�N�SQ1��(����G�n�����gl��{d���'�eR�U�����J1��zR$��n����'�$��7.J?�e<�o�Q�Qi{S�����_3"�5<��J�5��4l�z�&.�#L��3L8QW!w
��;�SKf���+3i�\�&g[�+'o������Qe�-�`)$��h�;.��������i��X�c����|)S2.o��������J��(��9�h���e�D} ��.Dv}R��Kx�j�5[��,�VJ��q%���D�]y�	L����&��0L�u�����z&��gh����nGqS��M�4�4�UJ����*�C!)�1g�������Uj��"�L�I�V���
%7rl�)��:��$.���
1RY���/����Ui��%�t2�!�����$�9"�Q��"=��QX�Q���:�(�3J�����d�C��G����<�lA��U#��e2�I�.������{Vd9��l������@|��*��}��<#���x��+P7��kC�1x9i�hM6[*�X�dMb�g%j(�c"p �xHl�F�����K6�Mv��F�[����mKY5�i)k@<G�e��	<����3>7(��]�&����Mh�9��.�V��qq��5r�m:�Qq�R��Q�����$�K��(<PH��DO�4���<(P�[M1����aT���2�U/�o�9F*���C�Kx�U��6�&������m���l���m�{BWj��):}��]����TH�]:XEU�QE�1�9�+�u�����Un�������7X���.���S��)�`��j���4�t��K+B���*f��
����`��6X��������
A0������95)M9T�]��h�������^�����cH��c�(���7b��fg
�U�G �������Rp��uH�w
� (��,��NC�@�1D@@@@r�{#�'���qb�tFnfK����p=YW)�P���RGF<Cp�J21RX��Y�PE�V����f����@ME0��(JR�e����T|�W������_Isy�Bg��w,[	�2�uV�r��V
8��h�u��'�#�/1,��\�f�F����#�=
�(�vjz1'�od�Y&���V ][sb������U����Py�;Y�/)����"K�F�@�*R(A)�Q���|-{�:�L�"����Z�y	�\�GN}m��q�D���49�S�&?�����-��� b�Z�Rw�������!$Z�1oD�4�������X�,�@��R���e�����v��,n4�x�,�/�UI�Z�a�s&*	��P�^�^D�L��U�4�
 ]S�h^������1�
��QO`�����?�����i'-T���h�H����KLSUC3Cf,�\�YMG��x�V&"����ZR��01H2������|���M�$�J��]"�	�NQj�L6��W�����u:��������=eLW���'e"�S6V?�
��DI�m��Jm]32��j���P�k���)9T���E 0�@��cP�S�
��7��T�Br.Ip�j7m=2��&�k�!fQa,����Vl��M�X��fm�Uj]�����gKJJ&(����\��M4��&d�&B9�;]7�
�-��R�f�n�J������U!R�]:��i��F�LD�]���E1�P�(���L�Q��������t����|��59-!5UMA������7EU%
����E9b��*~��������n�(�����66wK�5m�eJ��o����.�]�b�)��O��9�*������|J\���$�h���E��9JW��3.�` � �v
���8�	������C��{h{)�~�&gn`8���[���J�gRB
n"*(8�������GI'������L�%f�EJ������O�qT*�9d��4MOIT�bR�Q��>���|�1:b�1�t����,�dVSY���5yOQVM��z`
�����u�"v'L�X���t��*�T�1�@EMQ�Uj2�YmB]��F�1�B�q<����k9�Q��b���M���qMB������b�l!�`vS�V���%����������nU��_��O��oL�J�U����#��d^B�Kx�o�*&R��1�=^j�H�mi�kP�_.S	�+W���S5T���*��'*�P�Ub��h��5��A�4�b(���mt�k���&�64����i*��x�b&OJ��]����2���C�lv���l����KV���fR�@X����!�)m�X����&dU�+G��.� ��J���rp	�*�����kb��.gX��/����x�(�:����{��h%P�JL�T9Hr�9D�2���HD3yS��Ue��7,��Q�;+�S��X����r[Rb�'���ENU0�YW��N�����9u3t�U�MY�l��
N}v�N0�H �&H�����M�*D�Kg�r��j���,J�6t��������LI�xEQ�����\���D�0cN��6L�����b<�*�z�$��UH��7�L��zK���1����a1[7>�*��E���� |c�c�JX��R�{u#Qj���{�SUJ�I#
�-�5O$�i����#>H�Cg�L�������	QY;�0�\�7�r�+���e�uD�9.��������63L�)��	�qV�Z��V��|����3`*{�M�����*���L8^G��ZI����Y
�-�ss�8H�)�._�"�(�����5�i��M�1������=;G���r�����4]��E�f�����X�+pMB&21Hj�r�s�fN�l%���Y�gGh����m�GiH'#������U)�qc4�\V5���/���t�%�����,!�f���E���d�����y@S0(��1l2K*ugs���9�
wd�$��QUU��a�;@���_��#����j����=Q���di*z������1�)e��THD��yc."Po��?�g���\ivmcFVz��������TN�)	�Z��8��-UIV��B�"g"
���rf��qYv�{m�M�"��Au���
��3�"juU],1�w
&3y��Ta�m-K2�������I�$M�����f�|;}�\>��J6�z�TQ���)xI�M��4��z2%T�O|�>�D1�1u7j�G���<u7j�G���<"���)������S�L!���qYr��M4���7�����q��_7jS�iMFQ��#c�I��zBi6n^�Y�tRP��L����	�oLD,�v��S��MS�p�,�j�(Y�L��(���	��_�9L�f��B�JH��}����M�p+�SJ0��:;Vf;����<�P�U���1#�:n�����N��V�d�Jq��������j�H��������PQe����I�c��B�6�(�h[)K�5li�TZ��w&������I�Q7eS�����*�)���9����������H�C����f��F��6�����
��T�Vh��UmUZ�N����]��d���*��1��HL�p���?���������c���Q�����a�p�yP�����)$��a����nJ8���h{L���������sa�%�.�Yc
R���0���La����������������^5\����� nUI����J�j7r��r�F
���?���������������������xz����1S�ETt�G�^�*����g/;/c-L|�4�L�n����(����d�L�!�b�@S����F�C%���%�_B$Rq�("V�D@	��7wvb�v�vu�^���nc:�)
M�������<�%j"�h���:e��F�M��*�$v`�������/��k�0G���|�@m?��g���:u�L~��3\����K��z��`��!Z���gf�q�@W�m;/��b���2�� :dp���U:��k����-_NA���~��"�ubR��@��Ibny���W}#u���P�[O=/u�R���*W��T-�j�7�;Z��t��@`��9=��_�iu�IEz�J��(���r�&sen��x���I��1I"Sl2d"r�Nc@����*�������AS��L��G�u3��Z��I����G�KR�)��\(c���ljc�b�3]�Ux�5�E���)���i�*��S�,��8U9�����9�Sxu�������f}�U�P{G�=m]��&��uP�
�$�-��l����#)�Y�;��P�����KP=�0���A?-C����)�)S|!.�h�Yt���Ee�O%O��c���\���oU��q��V��F��u]���������j��n��$eEE%U���*���[ b��AN5t�"D)���:,PN:�[���x�7u�7[�1���I*�S���L�9������	��)c��Kb���]A�G������v��,n;:�����"�)�Z>�{MZ�uv,n���$���T�Gz/�`K/t+(V�L�9j��F���2����9!�)��0SZ���%�Z��_�U��K*�)�l�a����L��I��NT����g6�n�
�M-������ikkZ��B���"�j���R�
@MG�I�
�����TV�X��BQ������Tp������ �x���9H���7t�>=�������~�]�h(T��E���*e�+ �$)�
��u[g���%�:������8R�1wrZ]��"����N<��p"��x��E@�v�S���]�:���;F�dK^]�-��B�}��0�I�@�c(n���� �����������J���Z��S\�e�ok|}-���VNM6g%,����������U$^B�d�M��L���������g�F�Z[��z��+Y���4�/28��~�*��u�d�TJ�>GT �<�R���=i$��5^��>��E�=2H�Qh��x�`)��)(������W����W��]KI�-$�����Sal��u53J�V���js|*5
��DL�����H�
_��]���?�l|�j��n��Sb����@:��-��=9CS�g&jGQP��^S�V���r����Q��>B��4_������o�[�������Y��Q����#����y��
f���t�}���d�G���(�!��3H@����Ls�!� Cv�����LT���*���J���T�
,�M7�B�P2LB�(a*>��6���W�%J�-RV��D�:��"��JM�NL��RU�]\��C&�(�T�EP�Q5058o�9s�8q#�:n�����K�?�g���\ig�]������1�%,�)lX����/�����\?������t���i��/������v���%Qp�h�D�Q:�[�.�C��+`K7+p�:v�ejZ�z*���YU���f��UV����"�GlnC��jw���,�����6��{X.�TQ�k��A���/=c4��Kyn&���IU���4}X�K:jv���5����f#��L������-��J���Z��������������Tp��`�����w[���\���1J�������T��,�iz���d�������y|��,��S�B�����vAX��s�(;AHR6n��������]S�
�����<��$)�u�W1��z%+r$�	�+t
"��1L)�S@Jb�f(�p��\������o����U���YUY�!x����-/=�{(��G�W��C��t,��*�mQF={U�8����<X�#\�Q�k���[�LP�����R2�T�t.E���f���ij����=I8'rn]���b�E�
�
� �"���0�w�Q�i�c��(9�����b�@�s\��z��
��fU8��J�Q�$"*_�[t��=�_V_N���u������
+jf"P�r�+N&�g�n�\jlT]�g����7_�T����D�6�r����0v�Vj�����7(�0:j�c��@D�+-n�\���|4p�5]���aW�r�U���qSD�e"�w�c��"����<�jj�OP����n*+8���E�P0z+	���:��1�U�%1�m��BX�.�.P��l)*�*�+�a.er�F+R��/���p4����/��>|�eL��G*��"[5Aj�/}��1@S��^��J��+0Z��cO�`�&dps�c�*E��4��N���~���m��x�����v�V1��PJ����Ee���zY�H2����r-�0	c�z�Ddc��Jg/#�5��	��xZ+�'CZ�����5���}kQ��\������+���"]w�SQ����N�?��2(�$�<�,
�����0�=o�+����l=�����kp�� ����Y�b���v���ki�bUm~��'���|�����}H��-T,mEp�6��7�J�M�\(�;������?���������������������xz���������LZo������b+�as)�Z>���2�s���aj���L�P��w�Y�T�)UH�P�0Rw�����t�X��V�Tu�R��Vu�����/�i6��("UE�x���'n��
>�zm1V5u-+ �=J���L���Gn��1��V�q�T� 8AD�c�p���������K��Y�&�]��qum�P�W��1��"���p�6RW�b
��bC"2&X����N�]���������J~�*�MFS�*�"�^�Y.h�VjS�$�*9�j����A��j��RJ�R�����X.�l����h�!)�Aj����IQH�)��QR���q��h�n��(���+���Y;��is+��P~Q��a\�u1AS�]�aR�|����Yr��:!�y��r�]{��gljr��2�����bb3�AX���Et�L�!�b���v9(2�)=�Z)�Gn#WwZ�������4�$�N�71u
�,����\�a��$�J���I�rL�6��
z���`���:�TFf��+6hR��u%,��	�����1�L?�u/���$%������5���x�i�:i�1n�mQc����E2��(	�5��/�f��5[W��,���ipej��V�����R$;��lPM�<)�	S~���,<SwN���~,y
���0�6����p�k?��:��j`�r���H��1>z����&�;�e��H���]�������/5��E&���A�jQ�����u&?�����-���u�������]�������������_���I��M����Wb��6��.�.zA����`�T6���j��M���S�H�U������rt��z�����`���F�~U�%4�7li��1�p(���:{"��H�j��!��cn�{;��g����
�z����dj��x��Q������(��Fms6h�����/^7S�+X�����5�-v-�}O�ue~�J]:pi*�������v����1�s�nt���e�����	��Q�I�P���l��\�'Lv�D������32�cLJSv�6����z���t���#����,�\[3*j��d��MD�5��z�9�,~��/�&�_��L��i��������8�Pf\JE����c*�/�S\��(R����)J)@2��������������E�����uuY\���QA=��S�������
��d��MpM]�����$���p(��v��1��@�	���G/`q/�=����ik�F���5%7yo����I��C�51���U��Fl�W$Q��7�l������D�~������(Y��mCQ�;-��hI c6]�'����t��Gp�6�Q�Q�9V����F)/noM��m�h��h�Z~��ZAX����7t���H�t�) ���7|-L����N:���i����������������^���J��I����;'��`����9T��W����<JR
Z��s�+t^�B�H#I6�=4.H"%2��=wGuq��t�e0�=�{\�N�I0�F�����&�*[��EPIz]��7�n�?O*��9Vo����Pi�Y���c51WJ�����e#��i!Q�G����*C�YM�@�8��L
P��k�����Y��Uo?��<v�@
d��G�����?�5�% ��7����{-�0U��l�c3~��F�d�H�L�!��q@IW�M����V���x4=��5���V��LGf���I��G:��GQm��1���O����]
���Y���+��DA3�xUC� l�y_H��C?�����
�<��5��r�]��}��O����+Q:j�O��z�����A��H��4hb����)J)@2������7_�T����������n�4����o��������?���,�U����������y�hF�S�h4�J�iof��;[��u[Q[Ij����K��+B��&�X��I������=�I^6���t+�'�"�v�j�U�,5);[��I�l�{>������p���$eS�J	*"�M�(���\jW���Z:��X=3R���
��wJfN�HW���
�Y�MI"Z}�! �-Qt���h�5�"�����P��5{]j6B���DU�|
�J����M �j�j���OH�`�$E�l
��	�"=��Q/���_�J���G������u������Q��Sa]Z���l��t�L?y!��7��C7^VZ�(�����L*HS9�C������x�F������]�jR���\Y��w�>�6b�)H��E��GI�2h��E�����yu����>�����[��l���?)m���i��BT_L7����j�����$�F���Cs�NIbn����,���7P��v~��6���0s��fH�L�D��7r����d��&B�{t���Q���m��-�
b�+u��#[H����1�%�Z,���P7����1�=���������!�O!��:NV�`E�+���L�r�%�	��l��D"i&B��i��i�7HB�d�mG3�>��j��������!y�S?hv�#]�Bp_���"��}��3�8����4�W
S���z,�C�jQ���1rDU��)M��f�,�
J;���.UPU2QVB���
���p��[�!s0��@�-��t�c�-��N�.�9i-�)oa���1���U�R.��s���P�1�c�����i}4��Q��
�E>�n�]����oC���������?���zw�r|��7�w��i��Rt�B�����!EQ�1t�%J���J�&�� �A�MQ!l��$I2B������k�v�Z�&�����3�g�^���.��F
\�&�������2�U�%:Z������g��*zp���vrb�Q�4��b�
���6��l��Z
��b���$��tQ��h��iJ���	j��^��(�Koi�8TW�����[2j�wp�EC��0��Pw���X������7XU�b�L#��C���� ��9��x��b�b�eO����L�0mG3�>��j��������!y�S?hv�#]�Bp_���"��}��3�8����Qv>���&&�kVE����QwR�����;�cR����'��E���Rz� �p�E8e
h�ec�m��V�	i'���������LH�/.�U'H5f���;]gNL�r��(u&9�a�U/�����k����7:���4�h�������m!2����^\]�7`��k�y�6M�D�*)�Q���#ho��a�D������T�*��U�4�iO��4M�H�p�n��(R*�
`)�?��:X�=��n�=�X�Eo�;*��rGB=��Z
=�*�P����1
cD��I�_JZ~�sQ�*�eGs-EU�1�� F����e�E�G"H��E�JnI!I1,}mm4
�
^��p�jd,�!9����J]��Y,jd���od#�JR�JP����J�������UL��_j�YZ���|r!�V�F
�b���G6d�<�]s��`'85��s������S��1�����J�L����m��U%�����:���D�D4US���T�Z��]���6��h�
�����mET�Rt���T�J��/*�$�Sr��!�P��V�l�Q���^������'U)U�
�HJ:<�:r
E�R���yC�����1�])�+��%�J��
<Z*�&��'o<D�*R����P����0)� '�w��Z��o��c4�
x-�%s(�&"��
�=3Z4z�\���7��6��1����6���[u�A�mihZ^�QQ�������4����t����@��'8��G� a�%���H�U��:b*�ZZ�GS�2��5�{����D"k*��1�P)�@1N[�kF��������RT=
ODRT�-���(jr��E�&-/z�v�2���&����(��@T�aQQ
�����+�dVi/NTH9f�3�)��&�n�P���Co4��H2Y������zE��.Z�J4Y�fI@#��rb���g��ddsdYG�G�E�,�&	7h��b�4�L�"d(�������}X�iy���jm9�i����1�']�D�/]��at�TD
"|�Q��I4A2"���"�)�I&@��(�l]��Y�%�w���-��A#G�2u�Y�b�j�.&�e8�c��U@����@�9L����������T�[�82�����"��3���4��U������1a"�B2r�
j���d}��g��P5�"���m(��J��Lc����c�������"����=MX��]"���7�i��o�_����=}
���s�uB[�]��=H��|^�����v�xG9������w-�
t�9�m7D�jJ��f.��o+M���3pC�����"`������si�W�-��I�@�|V��wf�r;�� "#��}fm�i(8r8�*����I���� +z�n��]�J^���~�-E�
)��PU7�-;9{�e�����������o�j����R	�N%���21�H�����G��n�6,�D�f��p*i$�e)L���(*Z�������)��N����h����)Z�9Hz���i���h�=�E�j���N����*C�(�����-=i��d�[z���������������T�P1��|Fft��J�N	
��`QP��V��4�1]R���n��`b�zna��6��si.��c�"���c���w&��7�}/��ch��_�'}��K�y�^O�N"(�
����B�f�|
+H��St�#C$��A�$�V���RE"�;����s=#����O:��=�ma-R��3��`��5�J$'��(�*����1�c�L 8��uc����bj�d]z��u)X���s�v5,}=]2~�Z?|�'���S�P���V:���5m���q	omML���������Rt�Vl����t���(���P�c�����g�m���I��R������r�{����=d.[��r���p�������Qml���w �6���-/n(������U�V�j��J�\�Y���QA�D�#���l�H���p�B=�t^1~��"��7��U%S1��g(��)�@D15Qi�Jzm��ARF%QNYl-D��:��3Rt[�6"�*�As��p�w�?�CP�F�t�R_��57Z6�s�}����cF�(�b6F!I�I�z/�_��.����NI=�8�Z�����Pn�I��}����������v�����9E5�P�Q%�!T!�S�b��eunt	�*j��p��:�+/EH���@DP��u0���� ��8m��wU���.�t�v�"���l�b���@�$2f �LA�6e�w~��f����>�W\�������*��K&����mS��M�
�7��*��
�c
Am��	F��yV�����T�%iE����}AKT�9b�U4����r���2���1�et�M�2��������mL���<�34#
�����8Y3(	����(b>��]���������tu���]��cj�1�������t��Ddh��T���,D\.�NYB�*�X�[nl���ZI�%��4E3n�xw*���I�
Y�nwN�Y��"����C��cp��R�$�-1y�T�kF�r��m����k'
�������J�M��,����9�9�q1�#�
7+Mz����v���������iJC�C�#���� �F1�"
6t�+& b%ndWh<t
;,�
�*���l��^)�����>.f���6��)$�4�A*�G�7%m���)n?�;l�E��W5>�&�Q�i!����b~A��]���o��:.�0�y[sh��.m�^&V��J��5]���n�QQ���
��@������Mu�]ep�����u
H���cD_�����r���n��6��3��e��$���E��Y;UPb�HT����rf�).��{�7����+��}r���6�1�P�OS�^���!�&
�����JrF1�H�F�OqoKNS�u3UV3��z���R���+���4�MGND���)�5j�
P)QD���NvX��r��&�SYST����Y��%KQR�]��O u��{�Q�@$j����IX���=�X��KF��Vn��������3�\(������2��:nLT��m�3X�v�-ohv"����~&��ihiG����F����@� ���d����������J��Poh�ri�?1&j������NM%� 7VD��S���(�4���Jm��v��IG��������B�i�E�Ie��r�����1�D��5
�)��TF��m����c�#�j8�O@�W��c��)�Aw�03t�P�)p1�@1H���������k�e�RO0��������<u#�tr]TN�d!t���1�vZ���RV�j��v��an��kYH���XI����[�H)����7j
�%��Q�@WOt���Rs:���V�l���GQ+U������O5r���Ed�rM�X����k)W���k���PsJSsUE������=D�%����)����+g-����PIT���0k��c�{A��G*�K{�w�4��b�R:��RU�4��8"�Q1�.eD������������:R��%���lE���d].�'
�MF��.B.�b�MR�������%h������:j�T��
d���:�K
g��S2�����_����>���{�6F��Y���8��5bQ���Jr��&�z��
���p��'�JA�a}/�P�y��5M�������8�����v�V1��,����wZ�?�*��j?�h�e���-&������n��������.�r�]Y���8����U��--*�A��=IW�M�u�jo]�oh��C�j&���5ek}2[x�z��mO���������RM�hv�L���W/,�[����5�����yM8���oS�#m���.{�O��L�����t���8@@+mm����c�/I���WJ����Z_����g����hiI��F�Z1��%��<��p���G�b�p�v%��\AD�w���w24��m�:�@�2�\����J�h5��i����Yx��!���*�����������l��k�K�L�6B�Y����d��U�L�����d�GF"u�^�`�r#���Yd�)��s;c�4�v�]3_!�X]
Y�����O�,�=��j��dd�:�EDZ�$�.Ed*����&++�M(�2�GY�7�������d�us�N��(��8����&�Z��R�&�"�B��-�Vn�d�0:�D����M3#��m+o��*�;�l�����d)�e��v�ij�9M������Rz{_�����cian]��z�5���<!-�:������h�N)�P�5��@U*B�����n���H�T�q���h�<�C����]��,)�_I�5�����"
�)��X�V��,�#%��7�4�����z���l���#�meS������+���h�����)��$q!!�R+�ZJ=R�rU ��e���;����Uv��Q�������3XQulK9�r���jfRQR�O�t�IT�b��/w0�@�=�4�������#��'18���	'Q�[���E�;�N�d�I��L���huHuYRiW������+��-kI��s�����R�#"�S��V��T���aVJ���RB"Q��;;t�8��V��R��=���V/t�^h���6��+��r�,MN�3����:1�I�P�AM?IbS
��5G����13no-��H��.�$�g�q�Ns�,^�y3G�oP*�����@[�t�4�����H���h���z9��X��{)l��Z)���`[*W�g0�%TEV�!(�T��l�K�+m�)C���P����b�4Eghur��li9Z&��\�TtR�$�(N�����)�B@jV�n��]aVZ��M�;z�����bFv,�xe�}?�����\��:��T�jk
GX��I��\M`Hi"�����0V�����i�X��t�eVZ
s=�L��h��>��n�z�S�%�:�C�J[kyK���,���U;���LJ
���$�	DY�����L�L��5�����C���\�r*������-��U���bYX
N��j���&�������9s7X�!�n��Du[���@D��E�������h�Q�������q�����i�A:v
��nt%X��Z+�7'�k
j-���}�����H�9B����3#P�I�����Ux��	���wH8����e�MG��m�����r��[�U,�UD,�"`*�d��d�!��H�0�!����M�Lc��N�l����������S�b���ZM�4J��T�(	�t���{����e��b��4U���H�y�R	��F2�i�M��������f!��w��ju�[E<�d���,�9j)��$o��Vs���D7��1��J��^�R��Er��9{�N�R)"����4�����_�����77�����%�������Q�9iem���$��x�BJ��b���
q����p��(���I��$]#Q#�����(�I�&���z�����u� ��o��2�h�9J�jZ���H��Jf��I>|R�8u6�Q?z'E���> .%��X�}B_�
c���t��]O7�y�S1����n�5��w��)������R���b��U#V�%��Zk�L���{ �����r�l���ld�,�d�L�����i���+w���G0���3��7��Q7��0}q&�������L�n�"7*�!S�����4����v�GS��s(}�G ��Q�������M���d���m�fy�M�J]��v��yzc��?��[Wt�m��_���D��sQ:M������
��#��L�L�:T�z�����;-&��V�[�7�6��	&/�����~>*��'8n2d�f���WL�M%y0�����h����+�$6b��e�>|�t��f��B��N��%"i�B��9�)@DD1���OkNZo��8�F���p�=\�m�(�SO���MvO;���e��X��X.)&H$�]#`5}#�����F�j!�sY�i��.�z��J.�2L�\�� 5�$
���)��8O����
����n�"������������6
��*����F�JVU�
�bE���M���J�q�����?��\h����>�����P#g����������e�D��S�&�.V����f��p_������'��d������PZ�{y�k��y�KhkU�B�cN���L%+*�S�"����e&�ED�H��n������4�2�*��:��m6�DT��������%]	
%.eA�c�6�t3a��o�!�^�I3m ��}Y�d��j�
�#D�S�������U]��Z��5����5aZi���O0Y8V�����JeX��9�#V�!��E
DD�~��������]gn�U'?C����&��j��a�a��9����&a(��<� `
���~������V�2uL.���R=Z��L���R��)�#9.UN��+���Q�Gn�G'�)��]r�:7I���5E%����-���f]F�j�����;EER2k;Zi$J�m1toK-
i��3F[�kI�P�='�6��)Z^1(x(v�b	�l�i�L"a�3�DG�>����KO�����{�gk��!�ah��	*R��vJ�����y*n�n���x�B?�y��#��:KQ�o������V��au#�G{�n-�
^G��b���#�
!��j���j��[;Z9���G��:��md��S[$��$�����T�hF�Rl��A�"
V �l��w�:��j�Cw�F��k?^[�[Z�/}ii��f��G���	7��&Gr��b��J��J�r���)�:�����[+�#^k����I�Q���J���#[x�6�����4.T�\�v��W:�"L��9pZZ[�m.4��I���H��=�+�z���+��H�|�#;hUh�����n�
����;=�������)[�Yj���K�c8��J�I�=$��
���MZ
�!It�f�U�4-�gZ"�[=B����4o��Z�(rQ
�m#R���Naf�����o�	6)������.U���M���{�obo0��mj��USu����0�p���jZ=t�!E��IeS1Q6���MU��&*�>���.,���Q�1�P.[\T|��S	��&���I����}�:��e�����&k�M2����Uk/*�����������ur��p��#���Gn�����\]����@���T
l���H���l�g�
�,�f�T5'�IL$e�3t�K�~��6h
;*��_��ag4�����v����72�iV��5����T�},���3�TIi���{�0�&:�����V����*p��h��>I���8�3;X�4��1�!���N����S(�qQt�����:):F��N������!V�Uc��Nf��*"g��{�$U1
�I&�f� �N�^+3z�����%��V:r�$3������$��
�
����{��7]���f�����j��GCgj��3f#����*=F��}AL�n�;G�%5S1R�!H�-8f C������i������R�E�������yy����1"�9����E T�k���l�"N��Ue;H;@�j��JY�`�t-��ii�����uO�T�����6L���|�����\��b/��r�[�����+9j���b����R��g�TL�=�����l�3EAP�\5v�����
�����L]���md>��o�i�����������a��3!�Llp�n4���\K�)I"��Qtnl����USJ���q�Y�����*i5��n���n�
'Uc*���7����!YmL��cv�����db��gJ���
*9���R���M�_�p��8o��������h�F�PTy+���f�I�Jm�(\p��I(T�N�g
[�@�r�N��B��$1g�7��Tv��������f'P�7����!���0��+G%��|�`��Gj�T(jR�������i�)H�
���������l;6��������Lr���SK��ah��r7H
����Rm
S���MP9��E��P���+��2��u�Q�����+����	K�M���)�n"���Rq��"������*����*��P�T��)��P��� �;�7(�@e�M"��*>3����o����T,���J�!.�Jp���s~�>"_�d���H�1�#�3���6��Sh�}��m�9}l���D��UP"�E��'�lC����hs	_1������oaEHA��!�}���q��m��\x��o.�=�������������Y���
�e��T��*h�Nl�Q��1^�
0V'�4M�x�
�J"Y#�a)�!��hw1K��S����v�u��%M��p"d2��s�h�Z&v�1gS-�>���Q�t�Kx0�
������c�ck�K*��G3"�	��J�(d���^�n%i	���xUN��S�&m��������������dd�X�7��!2�z2a���pd���}x��~�gks������k��mj�Ii\� B�n�E�1�
����[y_�J���0A��A���r{���������%`��a���db/����n�-RI+����Y�;X>���r�?���R�� P�5�|�H(��W�D����)�.�����3+B�TO�	0n���r��g����]6z���v��WV�~)�e0������sJ5�i��Lb�������	M�[0�����;|Re*�J��E 6a�������K$��F &h*">�x�4�Ss�����`��N������$\�PDs7t�B�����*@J�jx�(�p@~�	?f��e�#�SX�>�@|I�x��q�4�+2��+S��Yb%�e�x	�q��G��c���������q��j?.�
��&��"������u ����V1�x�^�Td�'����j���M�J�*�������&��1E'�{�9gl���9�r��IM����A��U%��{c�����iVLST;��3�H�n�-���@C����Ul�R�g�'�&)�A�b��AZa��r�@����O����!�B�2�������1x��Q�H�(�US��PA ��,���k^�Bm�h�fJ��%�PQ!�D.�+��0DaDIQ��yG��rC��v_�������q|hKwn�����3��@�gx�����{8��M8�WO���8z���.�����;qE�{�g��{���k"���#Q�u�����L����'l.R9�P0�8����]����d��7�lW���d��0MN��>\8��E��*>�&}D�I�$�9LG�v�Q������������Vz�o�A)B��m�dm�����i�O��me�ID�����@�j(�������T�E2��t-/�z ���)��
�d8����iH�J��)�X2k���]uJe�g$��Dv-��+�����Qs���0�/~ag��^I�m#���|�Q�6���.���!D����!h���]��h�fq�iGo���%�$�"� ������e�{-B]�~v�B��w0������c�!�b' �����!�#�U[w����"�&���.F�Y�H&AAL"S����r���*��A�8o�0l�g��t��b7%����AG�$T��0�n_3L���a����`t�����t��Z}~@����y�7}`�)����o�����j��P�u�������DHB��0�du���30�[�E��E��*���p@Q�T���`���(�x�!���1���<����_r�=�����c�����I�E�b$|.H30��:��c$�g��d�PT�K)*��\��?�8�n�c�������QR��&�fy����T*�yq
��P��"�|*o,�d&A�a��!o��xY�ul��JID�QaG.U�%F��!.c�����������98&h��tH�L`�q~$"�R��D�1|
�"d�L�������0yJ�r4�n�D��n�\�����;��*~I�j��B@$Q�Z\��M`S�)J��[�=��C�������;E)���R���~$La�/��4��H������a��h�\�H#��WU��b����y��/*�����)@�!���p�2��:QH���(�J��e b
k,�1L��UT���!O;&Wh��"�������N�����t�|�#�C-�4 [C**���=C�i�3K���� /.�3pm�p{D���z�PS����v&L@JnT�>�(�7Q�8qE��hx&dT�Q36������DSQ	�(�V(G�L�����7(�����>����Q@!�D�r��C�6��g��V����������rVqsPR�2�r&V��Y����w��S��;=�R6�L����){���Q����L�Wo��C<���!d��<I$�3#��cf�v�;-Zs���T/C��N
6AZ&�y���hPw���r��a/��{1�B�v4�/����	DY��`&�zSp�������wO0��d*����i��1{�MR9B7
����f
��{=����Tr����~�:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[��:�[�����Y$UX�U_M��a������K�]D:���$��:y���������,<����3�`/�����x����V��(��'")�gR�d����$��uf
�HnQ��\��D�N���s:��%��E�]&u����[�x>��|�'�s0�i�_��Q��X��
�(��;���;�He
c����

27)��;B�?q!'0��F��U$���o��0����1IKXi��
c�?�����=rp&0A���������c�w?k7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������_��7�~|N,|����8��{�������=���'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qc��/�������>'>or���X�����qbR^4���P����T6�����"����EC1��!��G
�i-����z�W)��0�?l0VG~��%jg)��8D������f��8��B��|��sG3��w�Q&�g< �����q�I�8z�&������}�8z�M�b���'+e��iDk�30�@8DD���4�C��C����"�hg��Z��������}��D��r���f����9�W
&).��!)�x�!�D�H\[f��+4���u�����JD��H�'�9" �b��]�!�9bj�P�����������$�rk�6�����.�V�8�1�"AF�J���S7>-d��R.y�gH�
.�"��F�U �	T]���KDG�EN��!
�x!b)HP.Y�����ja��n�9"TBy2$2i~.MXT����l&�8@)f��]aT�
R��rfx@�����\6d��o��S�����}[L��r��'��A���.�$QM�N_��QQL����6E�-*-�5@��( �2�����S�
&�����Cg�����b��2���C�� 8���[x����[x����[x����[x��RB���k�a���
^�W�+E�\�Lv�&#������������j���
U�n�D����>zR��=��(��!��S�3 �S�������RUu��[���YQ,K*�\�3�]��������t����������(T�Y�G����s���w��W���u��(���@:���*�N��E"���\r`,�0.�x�C���X�Q.�
��z��������L���%�}�iB���@�,�d�*�WS�(-$K �N"C����@���	Q���,����d�b`N�QUp������w���yb����]�3Jq��G6RN1�"&�]$�����h*���U���������#��D`�#�xGf��
+m.[��_=�N�
��YM�L#��xQ�R���iYxg�7�`Y���V�$0� �F�����4[�~���~����Q�@r������w�q)�IS�t�����~�#jKOZ�AS�7�����L�0e��,u�7��x��:o�����t�?q�c���~�����s����A����b���u��E�82K:YE�&#�	�{�����b�W�����J���T��)�"7X�����+�Yf���eCM����T� s�T���2���%t+��|\��%�JQ;U�."�s8��5	m��-���)�4����8�V�Fi�vx9dP����	Tn]�rv*������p@�!�!�bcV�����F�u���7��)M�{���h��/j&�E�@�9�89�T�����,�}������(
>����T:��bW�P]!��qvhLS���E<����d���HPG��(�@��X��4���j5{6�2<IC���5S1j�����fb���,bnu3T�=Q��#$��.�V.I�C ����������'��"�	t�J�UE��"n����:��F��V9g��v)�51�t�P�cT����	�[��[�x�=�E(3�_Z$Z%XT_��+k��.��)�?���h����~K�m.�.%?�*��uR�����P�b�Sx��uE-JE���F1�d D�~c�B���g]��oN���7�z��$S�XN9�T\������2�*���dP.�o\"@q��)���V��(����'o%��F��P��MBd  "��p�����j���
�+�\DU2��d"9��0�%n���Z�@�Q(����q1�������aQG��WE����dT��NP8��8X����`�6MZ�E�$��D���
a�O7m �L���~���!�	��U�6��q#K�|U;-�|$��r&��T�Er�
��������P��	�<��5H�����T�P�G<����LjS8��On�0/���R�8%kJ�5�@[a4&����!
���!���5d�D��(�R�xQ�T�o�������%O��0{&�s��#��Jc�f#�;oO�vJ��8�!N7�ny&��Jv�0�g��j�S�^�#,�	G)���r���k��UW����[�J���M���N��}�!NQ7^���t3fm�	��K#��}�� !�ht�b ���UCHB����K�z��m�',�B���p�x��g�`�+Z�5z�2�B��3=!��D=�k�������E�`!��9H�La�D�����e�4�i�����"��a�?���K�mB%��	�w�S-����0��L@�P�9@�8oC���L<E�kN����IS.��9��Q��g��S#���t9R�17�"������$l<����K7�Ig���@��#���)� b�J!��C��.�.%?�*��uR���`5��b���0I��!�>�=f��$����|��x��/����E��q�mOm�|x�q����p:�����T������&��J�7�*�
���3DL$��b�\�f]�����t����An��$�E����%,��m�]���R�*%q�Z�A��(���8kQQH��b$�F�-��c��Q���8��"0���XR~�I�m�)�-(��nLV���X�lT=.bAQ��*���E�`�N���*vi���%*v-��E����QR�����C��E�3M�\�ei";R
]W�'�d�UJI%9o��0w1NH1�����QN�e��t��� ��H'
�f#�.�Z��8��)�m���Nh�2 c(@�{6m�qY_�n��5M��:}`T��P��p9�nc�b-���#g�����D\��!s�#�[�x0w�n������#����\*�S,�AB�"�@%�v����][~{eu(�9�)��BHA�D
����,�2g��@����|`*�&9�r�����z���I���[W`czGx�T�`����������hJ-V��&NP�Hf b��r��h�t�F�Fm�;���yP2(`10��>��h���m��z�Ax5���	��M1L��A
���qE�-JY%�Z�t\y�Y%��D�LR*dP�������Ec�UhY���G
v��.�U��vO*� �)E��YeVUu9A�&��M������4�����$�v#Q7�p�"ED�6Ym�EsF�~[V�%)�U��E�Q�e:e9�M�4��R�B�CG�4�h��T��e������0�q"��Zx�����"U%H���h�?�W)�6qF]*j�<����W
Y�(����+�P��=���N�����
��D�Q�c�e��
w@H9��`��
�fg-��I�*�b�Q5AAwr���f�1��w���gQ��:��j
���sU�O]Fz)�8�����52�����L�P�;�#�wMU�n�{6��3T��
����U�D��g(�C�2r�
���������6��kD�k�
x����t�+7�+�u@�9@�LK��\��e��R,�s"���uK�C���uR���cY�
�x��Jt\���6C�:�'�����������r~<z����� V��G�})N<MDOJ+.�vn93�C*l�1��"8��r(��)���`��59v�p�AF�(��f*{Wsm�B�������j��9�98����n�p.�us�W�+s;V*F���T]Gp�Cg��@��w��\�VfT<�NI���g��!W�se�����}����!N1p�r�H#�H�}�����k�w)w������{��h��9��~T�w�e#%(�^�j�Eb�T�$��C8Khn���isk����-?C��S��H�w�a�����rc�C�b�R����J��}G��;A�
ML�dQ��WS�������&��Na��M l��r����w2���v�����MI �yx�	5�I��S�(��1Ci�����?Y@ ^��k�U<�.w���J�^�|�?'OI
�f�J*�0�>XC �;��u+�JA�>����O���h�7�-�r�G��]#D��)XC�RF�����$�)����"r����������3\��F��B�	yAYa����Tn�L��I�+�����LNt�]����2T��|���9i�m�U|�h��*�"&�cG�MR"��
^��B-V�I%p96n��=��$%���1	6��t���A9VP����G!�c��-od�A�%1�Yq��"��DDvb��dhYRT*��N�:�U}-T�q��@C1�X����)���7�|�8�C�Z$I��(���A�9cLZ�-#%P�Q��M7K��E��+tI����9e�cN���Z
����d�7��,a� *&e� (��m�b�����l[�
�0~��n����)l���?L���B��w-7*�uU�ZK�;�(�DJ9�16a��b���Vw
�KC�,�(��r���@Q�D�����`�>��$-�7�v���5)
�B�l�L��A�!�3�1gT�:�pR�-3W���%���EO�����]'��M��@�{@r�3���)W��gGSM!!ga(�P�����L"��&q�C�w8q����3��{/�KZhV�o�0��_L �
�9T�)�����m�cE4�(�:wv1���R!�SeI�ox@���C�ug7��<�����{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs������s������Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"����E�=�g<��{��yX����.���9�]c�Vs�������u�}Y�"�]����{��yX����.���9�]a�������O�y4�����9?���o&.��$R�P���'�s<����uR����H�)��/�J����[�z9�%l�c��;�,��k�\k�l�VXG������8�X�q���9�_�&����
58d���,d@��gD0�i
N�E5X�6��d�J!����B�@~�af
�b�b�DWf�{T��#�*�BM��X���DJ��dZ�<"	 /��#$����w�7��r��X��DPI4QL�D�H�"d(p�.@�y%I����s3�p��0�&UT���c������l�{���l���H��,��/O�z�D\:m���!Yd�?�82Q��$D����1�x'���-���x�F�I�K�W)�@����K����
?F5�O��k�� GJ~�r�xlpd ��N%�"���C����aH�abR�XDVb�{B4TG�TnR��H��F��
��Y�� ���7;��s����n�=��=B�2�`�R��L���$4{}��|NI0�~�a.�X�p����VG.IE
"_�����.��U2(��!����>��
�LiDL�����xD[�w3��=X��-�Gf��K��sp=�|�2=�~[���6���
�Pnr�2�`���:m���4����n�c��T��=2n��e���L�$k�����o���L@22����0@R0p!M0������v����9d�g
����(���8�8?Z
=v��b9�,DJ#�� ��3������D�8�����0��.c��aE������|�� �E3�|�v�8I����|�d��"w)���
���������?�L������DD3�"#��b2BD��Hl>
|���E��� �Xj�\�!��0�����	�Q��5L��[<���;1��h�[iw�q)�IS�t�����~�n���9Eh:RE�K~P��iDF=�0�S|=�+u��R�����{"�2G��\�� �U;���}����w�q)�IS�mQ���gkz��aM���P]��`IE��$&��Ra�EI3�FV9
�I��H��H�m��l�i��U/� ����ATS�T^����Z��U�/����d����&sM��8���6�����c���7([�lV�)
<�~��`�<����&C7f����������S��<���]�\J�T���;6����B��]�]*�y�	7?��h�6�Tva�	��
�i��B�E!]���A���!�AI@L}�����x�.f��-SS�����m��T�l��}�'�N<�b��RMs���{AI�0�q��t����?�g�i%S6�L}=�vf�NSw��1�J�����zU�q����h�	5cTU�����TC�l�����;
a�mM��n�nb������7�"�W����64�6���s�Dg��[y��rd�� f 8�g��#�����~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_�����"��p��e��c��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X������A�sqc��?.n,z�����_��������7=~�������~\�X�����3kW��m�U�J�#(
�!3
�6Y{8���n�B�.�7���JYl��f�Qn������d����~\�XE��C���E"a:��
�tva5�0%HU8p�
��>�m��n��K8
�dP���x�����[iw�q)�IS�k]��t�y�#W���8���E"�"���=��w,85[U����Y�T�����f�P�������_�\��T��3)&ctr�*S~����}~��=+C�q���87��U�iF�LP����$�����bw^.���!��[y��$eZ�s�>���L��,�tjm2�j.���G��w���!^�<i����$���w�:U9���������jv����FQ�o)(F�K�r�*1i��
�l��@��H	Pr	�}>X���G0��0"6������6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57���)�jo^S���6:��y��luyN�Sx����������;�M�c��w����W��57��t�F�����<��Qk��)�j����0�-��c�b�����-1-X�r�����It�U<1K���W��57���N�S�U�G+c��f�!�@� ;p�)�D*i��!t����)7�TiY���(Y���I,�Rt����|x7��Q!��G��(�z��}���~�}K��0����]��D�����NL����l�b�����acm-\�����5�4��&�t��SG(����6x�T�R�u/T9�`��J�7�Fr�R���kk��OW��r���
�;s(�������sOwps�qj���r-�������(���&#7L�#��2������N�-?j��	�H���\D���?g�Ze��K�?fm�j
J�=)�IZ����=H�Qt��r����R����S!@�!JB��JR��J�`�qL9��M��l�&�L���2��c��n�c��z����f�N��
N0��]�(��2'.��J c�Dr�1F[y����^[���������'��QF2�e�*r�~���9���-D�qWoO7I���g'JMD�P1L�r��M*'����S�)��eL#�����
[H���z�����RsR��T~P���"f�n�'�)�X�].���]�qd����z��)��&�Jbl�������
��'����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�:��:���]t�B=�x����G�ou������C���u�Ht#�7����{���]!��|�+��Q��0��}<�T�O�#�U$Dj��T0�x�0�W�����Axdde�#S�9s%�<��T������"P��6��������@��mJV��~�u��.�qMd��Ga�Dw��8@�NE����JC�P�(��b�-2�������w&�R�����Q9���3X�'�w�9D2�������V������]�G�\��:2�`'?|!�c�r��QL��@�	
'(�
q�=�/ �.=��@������,����	I������Y�Q�%�rr���C�.�.%?�*~�,��(gJ���M/^=�9��Tc5�R6|T�Q=��6�B��l�i�5�\e��#�C�|�����i�	dl�q�D��%�V��`�QZ����Nza?KUGG�1�S�v�s���uR���~�t@�������k�H�U����S �'�����e����OF�G7&[�E�pL�|}�~��oK���O�J��:���&���}1"�Q�"M� *�1d@>�������r�15!M[�K3CS��0#.�T�]�����La;��e��#��-T7_q�%��E@���`��R��)HB
R7JR�p�����U/� ��IL?P���b�A��(&��p��Gf��q��:�����sEY�K	��wT��*F6�� 	�{?�T�EHEG�UVU��DR����=h�: �_�����������ij;�WC���U���d�&
z^�����p�L��4u;��jc��]�D���U�&�,�tt��We���:h�����5k��
����iB=(������V[a��]�_O��]���'��@HK3���~�'E���4��N�c�������������n����m�].�.%?�*~���1[����������Ds:���d��M�c��p�iU�J����D���eR7\;I��T�(�}�S�R�"w���^�
yI�-�}�� ������4�����~���������G%���D����+nm�Ce�������3
��h�iY$r���i�8��������z����i�ap5�C���iZv��c	s(�oi�R�?I���4L�I%n�`�E�!� ��h&�C�R����2G@���r�6M�d�E�:pb��
Lc�;���y��/q-.�;1"t�z��!$�N�y{��z�.���i�)���1�f�xwi��t���WK���O�J��'o��D�n��(`"i��b��9��h���VQ��vU���
��8���`>�gL=���Q>e�x�-DJ��-4(��R�be��d��S,�n
��(��
[�T[�E4H��Ei&@)@��e��K�?e�;L��Vj�i��Z\�(�mD�OK(9)vo�����D�D�L�&B�H�e�!@�c!)mU���%�Uyw�	��.��	������Pt��Q8���Sl�
�"�fe
�.�uG�	jy'$UHF�n*E�r*S�Ug%W(oC��;s.����K�����ZMY����HT�qR��"�I[��.�E��H�r-��h�v�"E�������?fS4��5qu���)�m?	�s�go��N��y�o�8Za���.�O�#�@�w7]�-����a�eJ
{@�V��LVJ�_iW�Ly	��,��Y�YN�8w����e��K�?e�
�TSaHS2��r��HE�loE�T�_]h\&����5��#��w�S-]�f���w���s��%&fa�%@^�Z�a�9�Sf�����y��kC��.�4���f�6���
sU�}\^�!*���`i�E�d��,����X\.�����o����\UwW���]V�j���0����O��v��� �cn22N�b�f�#d�
�6(���~P�S�E�Qk$�IFnH������"%l��
�R�!0b�W��jQ*���2[{Z���hX�'2��ULjf2�C�E6���6��V2���t�EV��[J�����L����b�j����GP������e�^�c�}4�������t���MA�L�NE�&QI�T�;1�J�9#��O63h"=��B�B��{�����0�@P�12GuI1�T��/ZB�M]���
�?-�@`��G���{k������h�}���WH&*'���S����|Dr%m��{&�"��n�"�w
B�}WL�����������Q�]�H��4;1:=�����!v���#������$F.������ TU��8	�|�Dv�cj��C����v�u3l��=�M�t��iyF6��q#d�\M�������-�6EX���h�0NA��1x-�tAS��L�	J*��F�
q��P��D��J���l�E����#�����J�_HIX�Jm�%eI��]�,qE�&���E���1~�*�";�yF��a��# �$���������<�������t�X[��F���b5�|����e�V�K��	��C�����m���.&��i����u!Z<��SD����
&b�bD�3&��T�W<����e���-����%r���<��m�������?�\,��]�{���aP�B�UBT1g��h�EU�8x<��v{�	o����J 9�wr6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6:��] >6++���\C�p��Y�'�G��@(3GpDD���9{8�u;\�Z����HGU��[���y�1��*ex���1)�
��������u&��5���PJ80U���c�����c�����a��\�H��i+�m������s*u��)$+(9�QL�Q9����i��U/� ��.���E�dTp����(�TQC�#����ARB���R6��

���"������D��-��r���g���U^8M�o`��=i��&�7��E/���kgm����]/;���g��j:�UV��V��
�UoW��$&�!�8������6��Tr��'���_����a�;k�m��58���A�7&��fC�t��c)��WM�k�n��1�:��L9@~�������%O������y@�e�V�U�(��$�9LrfP2b\�n4���n9�X�z���#�$�-���R(@�3�
)�&�4�S�(��  ��[���{���6]��Y#1�f+j��������v���(�2{5�Q��?x}�:z6�>�Z���|��,�oDR�r�8��'N�9Ql+�Br��m�_o����p���aZ_:�2u�K:�z�;MP\��
�L�c�(��G.g�o�~(�R�~�*T�/p��#4� ���	f#�,��|{�!W�E+IQMD�U��M�y��&�q��b�w0�d+;��{�V���]$�xEdZ�sw� ��?�r5�"Y�7L��E�\�e?����0�8�]p�M��Wp*K�t$�,&�/
J������-�?��0��j�'�#�D
���3��=G�_������i6������-������.�k[1^���!�)ETnVA5L�5B�!AB�� ���������?f���U%K��Z"����D�4O>�d���k�"i��5
_�K��iO7�i��������@6.��nRJ=��$���C�d09mE����[�m�)C��J]X4s2�k��7X�D��+s4�0��M�Z��Z#��kj��U�
^(z�>`��r��Q
��2�3&��rM���,������j����D)YU�D���SYw5��SF9L����	�1��oX���SR��6���/H�U*J��A������IB2*J)�G)w@v��[J�e)����	 ��
M�~P����e�b��=�r��|�%�@�Z3�UAH;���`D/���j��������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[���������x��[�����D.�����k[V���(���hAq� ���{����;1}$G��i��vGM[�DL�!r���[���������x��[���������x��[�����)~��I(��"�P�L��Hv��l�tUS�U$SMEG`�r
u?���6�5M�J>�h���2�U��{�J!U�E�}X2���W�W-�n�r�X��0�\��6�iO�����O��b��*���[}OU���yG?	�4�����|�l c�������<U5��;O��Z�����R����=��������n�1�'W�cX�Gz(�������}[K���O�J��!�ju���������4[7�d�����G=�q�>��:���yO�q�b ���~�>
n
2���m�!n���2�� �E �ri�F�\,.[N}����	�Q�(���8��Ck������%�;����oe�3�J9f���yA%N���L�����/��_�A�+�.@�14�?'4���RCjeRL�?��
@�x���+�5�����YI���9��^�:�	N@)3/c��w�T���%��U��Ne�(	��(�8�9�m�5WN<$�A�R)�` GL��Eb������NBa9UPH��w��������}�{�������o�?��VK�hQ_X�w�q)�IS�_S��4����L?\�)f���c��x��i
�0��nI�S�A��h����|����(�tC�^�
��,���F�rr�M6XJ��@SaLR^��a�_�T����WIi��S���F�1�z�O"��p���|D���D���\8��4
?�t�ci@)������p���0��#�g��D@DDG 
�"#�cKt[����&M
���2�g���>:��UL�^L
"?w�4c���6��d���-�5LI2� �|o�?�����K��������W��6���+J=�l��A������E,�`1��#�v�C�@�&CX����_�;��{�+�C��b������[�W�e�����w�������VP�����PH��D�$h��l�.�f��w�q)�IS�_o��o\�k��
��IZ�6��8���D�HM�
�Y�v����\��,4�f"��B��#�#��]CtM��-LT�4���rD��IRA]�5D�~��/��_�A�*:��M2��9��!x�0�m�EZu���j�0�@��<��()��2@X�#����`���t���&��\"�H��4�}��iRz/.	�(@����
�k����e,��d��AiA��!�pn��K{<�}�c���u���}�CA����E#
��sU�sQ�THj-��$������ ~t�P7��t@~���	��U����U1U&�����&�!�0�0�,G�+QVoT02�jB��������[�-��\���x���i�1�J"cg�cOW���tt���eu%HS��"�V6~��Me�6NJ�;�
�D�NPn�_����Kg;F���M�)�)l�i��T�8�Sf�y�DW+]�S2�-��\8��f�u4��"����d)�s��C��O��q��!�l������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�=���O��C����|!�S��������yT����<�|x��U><{�*�H�|��F-�v�u\$D�A�UP�9�/v��P-����)�P�������}�V����A6�������Z���I�kf���;Q]���8�A�P0�h��yT����<�|x��U><{�*�=���O��C����=2�������sN�$�gM����(�W�h�F�6.y������[�R77����yr$\�L~M���Q�G
��b;�?g���d�&�>5���],`"M��HV]em�)DGM��lg�{������E�N�EC4�q 9M�^U5�	�=����)@
R�dP�?�)�LSAR�2�U��� ��2j����C?c��k��YJ<��,��f.W��:�nW�HL�C86�r����3�U=K��SG��K����=5[G��E��Z�d}9.��i���eRr `��g�6Xk�m�)5���V��kT��^���V����HUYq_�C�������Ps�Rw=�l��qS�b��A��O�+M(AU�� C���4�g��K3���N���}Sz*�����w7��c�va���f0���~�����W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����z�w�>�8���~|/�q�����_�����������W{��3�^�����g�]�����=z�����&����������zj
�`��NE����L��)�B�wGo,���**����S�f/`c����9a)��YK�<�(���D<Qt��%���f/���c��Re�r�����s	3=z�����z�w�>�8���~|/�q�����_����������	\��H�H�n��8�m�*�v��n��P�l�h��}S"�xDr�?R�/��_�A�*���)�Bh��u}^��AQ4��q���S�
^D�l��A�0�Qe�)�V��E�&�A2�B��s�u)�K>�gR��m&�a��jY�����E!�/tLx8�mU<����A�@�4��J�.�*�o�1��f>��&�����2��:�:�:�[�F^����+=���������pTZ��tT�3d���������E�������R�n�L'_[��!����a(����w��mAC�
�
��
����]�\J�T��:�|�?��G`����1JU,�N���������1]�����i��R������z���Jj�a.���e�_�T����SPU2���:����v��$��{S90����dq�m}����uk�� ���F��[�U�`��"�fM�����W=E�#
�Q���t�*�B-[�*)�P�x�{@�K%���%�����$9���EAI'����!���vg�����x�u=l����Z�\=����uY�Y�V�J
�U���DW��LED��p�"��yT�I�����_��G���h*��]��/!M��Po�b���U���IC$eH�LM�&!L!�@C��]�\J�T�����:�y�6J������vU!j�d�G�9�a��*�T�v���("q�B�8�g��/�3Iw�oU&����f�OYJ�2u!/*����C12e>�����-2������Z�]c�\�i���#E�m&�Aw����0	��wqh�q[�I����E(B��H<t��h�#�������U�z��Q�Mg�l���d�`U����
`owDqMPt��i�V!�4[4J"M��	���f0�#��M*J�kO�)�Tp������J���Y����������<��V^����		k��M���������D�ETm�=(�FU�
�SH���*C�	�H���)
RO@���@��u�}�DG�G<U�Z]�U>�ml�����-L�-9����k(	�����9i�F������&~a@~�������%O�m��2�����J���r�r"S���P��9T�����q��f�ti�.F�F8���@���s9wC>�`�!@�!@�)@�)C"������uR���Lm4��U��}���������H*�.��$�M2�!C"��
����l������z��E�(h��u��M � ���&&�����tHw����z�i����0��T]��\T�����9b������kI��Km�j�U�����M�k�������J���j��j�\�(�oI03l��]:"�M/�Yi'����L�+=����E�W����$��R��&��.��&�Lw����=��������}%s�9����c%�	O7���(��jS��vv�"���d3(�m��K��]�\J�T��Ww:Yv�5��zN+�@@�������� ���������y�YRI��$pQ��������'&C���gR�Cb9wa����HC��^Jf�NTGh��w�=2�������w��PN��%�DT(�I���(g�M�vb��%j��������1�r��.����N�tL;������9P��l�����
D�D�����"8k���L�a|G��S�5MP��w*��*�F/}�"��DA�d�AS(4�H��i�����M����x��������:��Iem�iE�k��[�SG�oj�+b-����)J���1n! �1]b�D�!v���hE�U�=�zJ�|2d��GUA�R���%��$�qE8j[����ES�S�����KiKT�M��g�N����T��%3s���R��JY"�����q ��,�Jn4AP@Z�f�o��w�q)�IS�Yft-C.��*:�2~����""[.Q]������;1k4�I����#�3|�����I4�G��*�t>�1f�h��-["�H�&	$�8
�a�DD{�Dpk_{-���G�G�oSG�|��{O����B���g�����9n`|hq�F�=��}���Y��BSW��T]AR*D`���1���m�����1�fr�T�n�eU�9TIT��Q3�0��2������8h�]P����UEV�uLd�N4r��K��9�
��>���c
H���l[ P*DM�b�q(����[e-�������t�6�<�������gs
 �f�0�<�c�
0RMZ�d��+�A��?����T{�)a�*L��b�J���S�X�a��Kh����u�O���pZ�Z����H���[:���&��l��Z��`�i3��(t�6"A��Q�
�$��n�d��pX���D_4�L�S�:��'������y�8��Zx��M������
DP0L� �:�\]IH��B��;t����82��q�����R�@9E������`�
_�����R6��0�xr�E�������o#J��%+EE��%�#G2p����S��M���8���Q}��u��*�6�J��q�Ad���(�)j���;����
������5%��4���GvzJ�b�z����&2E�� ���*��0p4op�8F&&��	�(�@"M>�} PQA�����8��
�&�g���T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I���GV��FaM�>�vT��C��S�L�l����5]�Er&X
wS/7G���
���l�N�,�@��n�A��Z��J���^W5Zo_���v��h��������T�I����T�I����T�I����T�I����T�I����T�I����T�I����T�I���Z��1�`!
M�Lc@���r�r��LSe0w?Z l�D
�Bs�%ZA�Z�[�l�����5eB5��F�t������+�H�^���l�0��##j
���&�r�R8���[8����u8����20���o�4�{o,<c�5:�����������(g�&h��)�7�0� �n,�S8��G4�����,'<��-���CL�c�@
��<����;�,���\���_2��x #���U��_�?���k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$�����Y��?�)�_{��k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$����k?$���)I'W3a�Q���RI&�P�1�r��\��~���^;�-�F���)��C�NTW�#����&��Jx��&��Jx��&��Jx��&��Jx�����?S�@�1]��'�(6@�LPQC� ��1Uk����%OF�����p) ��b3
|�|�	T���:�����.:�����.:�����.:�����.�5��R+�(�e���DJ��L������t�#��J�#xIB�3}��!��X�~������U/k�����=O7�h��7����r��C���E|�28�qsu)��%����r?#?��+��5l)?��}A��&����_�ov���.��c���U?N���Sz��Z�����S�����u����������������[�	�H/����'��J�wIG����H�OF�X[�{2F����
�L����;���^�M�z��j���E�����%%F�1����"�o����@Q����U������Zt������^5MAY�R3"J���H u2jM���ft�����z��H�GgP[��d|�:t������C���?�2�3�8�t���g#O�<��x7���_g0���DG'k���+�)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_����s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s�������~<z��;_��)������s���l��h��J�^��>1��8Q�2���&�!��JrD{���R��S�n
z��Ic����GDMR�R(S�B^�|a��:m�Y7b���|��t�2w~��z��;_��)������s�������~<z��;_��)������s�������~<"�:}@U�f������b�Y��"����DE"���(�����j�LY%0��ST(��S��`��P�Wj�v��=\����EOP�����D%)"�F`�|�y,�����i�*R�Rq*��*iR[1��8(���@)���)LUA�C��mf�]Q6quh��b���!���&�c�I�7
�I�L\�e�ZN��mO���b�#Z&	6d��@�$B�i��0�D�6`��l?d�t|+��WWutm���r2Sf*K�B�| 	�tr����|�6ud�2]lr�%TS�k���	��";[nte�,����ZI]��
���d�q"�Y�F�>F�1GZ�U���"�)�B���� .��G9�10������8��6�x�QL���n�=r���~���Zn�����8��-=`!.D-���I�mc*m+i��F���W2\��P�yGHE
!�Cq��#5�ujk��Lp�z0ou/��9V���S�Jq��a"��)jF�����t���+I&b�7�����[���g�>�h��h/M0z*.�cmu���������U�uG[�R��t
�~G�� E�H6dg
*q(�WK���O�J��������{U��p��� ��B�����
#�R��W����5J�&�}�s���J6�ZU��D��Wz��m�V��"�����(��N.�U��&�QP�S�Y�]2�����{=���Rb�����4n|�y&[��t�Y�x3L���H"B��	��(dR&�@�!C��emu�gI��S��h*�$�LSb��F����%�+�g���8���M��E$J'^6�2�v'A5��L�r(�w3���V��[+��	)8���)Z�Hd�ER��T���"�Em��L����,U��phz���$�������b��3�,KV�D�Yx�"�'�����X����	jv����`j7���sW����B�E�;8�h��I���e�:+��
t�S����ub���Yz,-3w(	�g9�T�����Uc��!{��p�}F�B���9Rzr���5�m�q����������9j�)9�:/�E�a��1��+i��R���I�\�7��S�q�u?��q~�Pe������a���kMG<{
Q���Kh+z���F����]7egN?b1��nI��'z;����J��(����������t�!p�iZH�dc�����nF�\e��K�I��scn�&�\�CxC��]�\J�T��;���[�x���i��L`~�IU���
^�x�>@%�8�gf%�:�J���P*50��o�I0<���nOi��������"�����A"2�{b� �`	�w����k�_�T����Mt.�����H�J��b�'%l)�1�����.��ne\�����{4��.��+2�9��w������1�
R���"��� t�O�]{
`d�����L�Nq��t�u�;��L��o"�!�"�.�h�
�T�n��@�I��6�-�l��B�����U����@m��:A���������xh�J�*UnWJ��$��l��!>�M);�AT�e]S��u!TB�+�����������tM� �������0l��'����W�_]Y��V��RY�;O�I������w�2���*��Mg�.�2�u�$�&��*�rR�T��E��x����EjJ�id���6����$_�M�zf��SM�h�c(�e�r�57k�Oz���W)w��v��$���L�����3���y�W��K��$��T�������T1)MXX�����\�cL���14�%y3D�S�Mg�))i���nI7�y	5��.����'H����D��'������T���K��=�����-���������7�O�9n�^�/�U}P[�R~��ON���rn�����i����l�z��*��\��;��X��$z�#P���tm1Y%KU�D�USIU�M�S!�A�$����?r�,C�.OuCc�$f��������v�?��97v�~O��5;t�����~��$��Cu���,�	����*�������\�������d@�i"����#�IA)������\���k�B��3W��vnj!;=
tj�$&'m���KG��;��r���1�����\����v��E�7hX�/^��r����z}��Z�"�\B��zz�+�m�EWD36���5Ie�E#��8��ua�
{�6�=F6�������K]! ���g������!Eb����3&��E��lB����sQw����*B�%
c������2j������h�����A�px�U���u/q4��Uv�A�+N�%���M�}t 4_NSsu��_�����6�-��h�1��x���\����94y^��F�.,=���D\OT��x�U]<XE�ACE���)'���2�b�U�8�D�!a^��7�)��`�|��6���.���,�� *��X��tx�#��f��v�UD�T9�N���j������@3�����x�*G�<���dS�1N��*B*��:+���/l�yz�Vs��i�[H��Aii��^:�9j�I�3lm�Q��A�
�g�:��l���8K}=�'H����C���=���z���m|]}9>�c��y�����h�M�X�~��\6��;�RD�S��M�����7b�����V�\�O?�;O4� ��ru}5�6H�x)"�aC���xi����CP��eL�&c9O���U=�[8L��0cP=����P���h�W{�GSk_�����i;����xR1�*H ������dL��v�A��`Vj��t�����$��)2�0�)�sJP�����-R��,���9�����1���n��:���k^)��.�C&��,���Q�p%#$�����)2����f��K�?d�D����VW���V��jn����$�J]��1�=�-�����5LE�5n@(N���w��*'7����j]B���%CQ�jy(�$��}8����{ 6\#��_����������R��~�������[��������&��u�Wln��/}	Z��'������3pv�2A�b�f�����Md�B�_�m]��J�Z3�g@2q���wNU��G���&_H`�\�������q�7�o�������U����=>_]Ym"i��E��O�����*�W��$�]�H�Q���)���2�M2A����5si.blegn�E+7E�����H��S�y�%c��w,t�UP������qz,e������Q��Y;�l�_U��ih��F�`���F�6iw�(��L��:H���!I�Y��6����RRv��"�l�����A��EJ>���[��#�2}�o��!o�[�jv�X��|?�H
W�����=���bAT��`�\EA�V���U�GJj/Tkjf�0��2J�Yt]H��&�1�%)O������ ;\� Q�R��R��)@�(@R�pw�;|�����K^O�-p]��>:���c[6�z����Zi��|�t��T�����G��P�w������HO�������XQT)��������+ 8�}-A6�@���O]D^K���j�R7:J��J�E��5�9V���+N��7j��6gn��x�%\�z�`IN�)�K������{_�������Zo����sG[y�	����*�m
J8�eD�b#�,F��t�21r���]w��'�Kvi�%SE���K7%k��jq�L���Yf�e�p�6	"SI�H6;9�f��I��n�}*A��9x��Z�������'P��(	�"ce��DDq����h�_�����oC����X;��Ik�th�8�s�w	ZZ�����b����g��&1����di�5��������\J.���u) ����zF��Vb�:&EV�-�&%��e��+6����**�!�sU9���H�N�#:D%��������UVTJ��}EJ�2��4���[OGL?b���2����UMZ�M�T��c��� �|��
�9�M�C�=�[n%�HASuy%��<4�f��[G� �����(��QQ�F�`����:���"�@�;��<d����GW\��#��]uh���sI�C�4��e�R7�)n!��>M��3��Li���6'��Q��`o���t������pe����$
�aO=��3��7�7����?P]���������&P�5����To�$v���1��b����M�N];|�c��].�-�?�*l���zk:�i����h�'��(�l�D
�	��G/d1b�S���:��c���,�/��]8+��<1{�IT�}��qG[�m�v�4�tBDl�$��5lT����Ts�~��/��_�A�%t������]���
�t�U
��^MR��Y;_��+H��*(���j�ERO=���PD=��IN�:I�\K'��r�$�HUUC��T:��,��l���e��,'e����7xc@w��HB�JB�JR�E)J��������O��mV(=i�G���{=�F�����IS�U�'M�%G\[��A��WU6����Q#�����1A7=���N�^�s�+��k�5K-,��T�Su*k�\��1��5f+0BQ��G
���5J���N��Y����?puNX�=�������w#[?�����iYBRq�W^E cTJ&��b�>��"��n��H���w�V1Th�0R���������-h��N����?]����dT��vr�%-��������~+V�%�,�9!.�ix#��S����Qg�/�/�/�����&���%5�Z�V4T,��I�/����U�SB9fB����N���S�38YH�.�}5��[�$0�'���l�j���B�� �k�oB�$�b�9@V��1Xs�C{�J����=�aisB��G4�u
5r��.������
�M�P��Hw�,�.q�/)����?��M��w�u��}y[��7M�����-��,R��2��t���-�uET�K�����:��&�=C
�u?m�4���t�@Q-/5���oh��b��I����U`��N��YY��H��~rL��&
���Y�����������7cF�s����M��� T��Wt��3N�S���b���51*�!_;�L���:����6S^_�
�V���j�v���Y���^��!K<�Z�h�H�y�k�&Ar�����UdULI�v�h�������F�!v�-
2����*�+R�VS
�"c��u$�=�6��F�L�-�HA�&�sM7��'�{����i����[�y�33$��c��Q,3��Jj��:M��WTJ�������N���hy����>��$(jjY���jKwYV�M��H���*�1�
��m���Z���U8����+o?����� ��x�K�C��g�WDZew��BL)o��J��I�z/N>������DH������2h���D�c��|����KZ�f5�����wO�	B2v�eO�sICH���( �@��[7���5���|t���<��.����F�YWO�S��&M�7&��&u�_������o�"Oc�BI�/P>�"#���g*.X������%�w�A�d��FT�o�Uc�>
�����eR*�&e

h�H#���cK���O�J���F����i�������D��&/`���r���P(������)�!]9�l�*v��LN-��lE6��R��[���U/� ���)��cZVm����AUy���r{�{��n^�)��Q�or�5�hU��KL���aM�?���af�U��������a��jAu�7nd��q.f�r�Ce��K~1��$J�SZ^qd����|#��c�g���y���M����s(�s4�\A9W|�S��K���A����U�)6J��9�<j��8(����LA��
��n�$�A��"B��(�P"i$�
R��R�d�0�b�c�J�s�tV��+�J��
�]�
�fsf#���������)��]�e_�L���j�B����0!�6��?���q1���Lq,F
I&�%!*K?)9S
�
1�2)C����jk~����h������-���G[)$���^��h������dTV;���E�`U�
<h��*�.�='O<<�Q���Uc��qTO0�������A�~]�B��9T���s���t��^����t!�	;��J���V���Q5��;���M�W;�rMP\�W�?�e`�p��2�\�������Rt�����.��Gt��;p�]��[U��;U���gY�su�K��X��8?QDZ���T��!vcD��������/t$b/,\�O%-ITPOUr�L`i�
�H!SH���
t9�
�X���=�����XQT�0�Q��S)�92�1��T�;C,h��W��i�R.Z���H��l��2T��v��/c<u�@t�a����(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m��(�m�����tT��=;$�C)t����S� M�)����X�kf�J�T\G���4������E��=�b������mY��L�:�������T�q�|��,���:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�:��:y�n���TYu
�)u��E;�!�"8I�u��EQT��EP��98@@s�i��U/� ����G�+n�;�k���P1���l�<H]�l���#p��sD��V-�h�"���`�d)C�?V��5���A�P���QSr����3d�<&9�����1q�@/;%T��e���Q�����PSFN7���%�Cw-������c��
�*���`��i���f?c_R�����\6�V�B���wdc�U�����d��R5��W���b
��QD��C��� 
�$OY�:�a�e�X�T�	Fq���k$Zr�NE��(���m��XK;��WC��_N��x�"�S�)��$��90!ygN�0����u�8�(so��(X)�)��hi���Q��z�����E���
x@1W�VZ����5������UIB�F�����Y�X+P��Q4����@�[�U����v6�T�j�g�� ��d��UQ1��"�w�G�8&S�2�)�@O��v��z�����m��SO"�7Jz���EC�Q:e&C�'��aX�R�*U���D��|�lER6�	J@���Y�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LugGtY�����VtwA��1���l|LZM&�t�3��+��=���-��d��s8�����*>;Oj��k��G&hj�h��
���3�� ������Dm������lxGh��:���
�������c�c�:;��������6>&:���
�������c�c�:;��������6>&:���
�������c�c�:;����MT��ER9TMB�1���&�&�D*i$B��d)HB�JP�R�/��_�A�$�.ML���i
~Fe���H
D�s�L�f��
������%.�p0�JU��7-�~��
M�!��/B������	F���q�����ES���#'�|!�5B���������4@��i�h�&/t������Z9�e�������\�����-�dzTMd�Z�ip����c��T�Q���
�M�������3
����V�cii9���U�L��Zb���B�����&�Z�p:�$��m1jU�6��P�z���� �P���Wj����ShM�������]�"��nl����m��,���-��ii*��YT���|Jh^��h)g�ED(�.�*x��	�E7�w����2��$#�%~����10��l����n�r�����}�wRS��T��c1wa_�0����x���j����LR�;J��c	�Qg�/�d��e�=p�V���8\JB��@L!�@0���=f���wmI�e���+�&)��J"���t�s�Qkz<�fO�:q�Nt���c�&�wT�`�2�]�,oe��������KG�vwJ��W������B����]�&8�A�I�L�\���y��oD9Su�l�G�����M������d�G!�>���g|��n��;>{=�+&��SvfA�5s�{��Z-�e
�Y��N�)��fJ3x�!be
�U_v��ZN�kUNm�����=,���i=V;Nr�M����%�5d��*�E���h�e(��JPj������Pv�i�~�9�]����b���*Q�"���	7nF/f\���,���0d��5AGND�U����S�������'�+x�R
Fi��1I�L[nL�o�0����.��(*��j��qm��s�����e(�~��D�����Q1��o#P*�K�
�I&�
����C�H�<\i��U/� ��[�,�+��z���f�&vzD\�����L"�1km1@��k5��N��*�TC��q������SZ��j�
��1/S?' �H^�D�m��8@1'{.rJ9�����}B��2q�2j�c(u�S��@@D��}X���#�����z�����8f��?
��Q� �qJ�B���`1} s�LN��n�	G��M�z
^�M���&�����Zbn��B���L�)\�m����KMWb��K���3O��1+EB%q��RL�HR���h��N]�Q3��b��oG���e)n{2��P���f�!$f�:�|C�H(S��f��m��aP�����(�������������{WR�do��[�J�U�T�4�����
r��2��q�����2����Dr2"���MZ����R��:��n����Q���z��]SN����I�8���1�<������&R�	�A2&R������������3GI�r�Z��u�-�;H>�P����Z��x��Iv��pX�O��vU���I;2�����BXK�n�����u�f�%s40J���7��+�I��g(Q�z��=b�,AN�����h����}^�h�7l����T.�M��R��|�p��v .w�:����V��
�]N�i��pmu5j����t�F\����Kwm�����U��_5{;XUo�;�ZI��E�r�X�j�������>�\9�_m1���E���GU;
�,b���Y���Wq�y^�!w��$=-�T�������k�SZ+��E~[���Qj�%SR��WOQ��EhG
_�����$%Vl����M�\��/�Z�E������
<��V7��wS?� ���w2�ILJ@��l�U,HV��3:��7�b��T7^�;t���5ri���U��y���3}!��-dTr�E���)@9U<1��&�P�N��������V������PU�G�-�����T����v�R!����,s��KV���n�i3X�h���r���uS�e�L����;sRBT�n������v�I�����Z:le[)njMMQQs�Z��Ue��&��������W����i@AW�:�qe����\�1�Z�"��K�n�����:WH�M]�
��s=�V��=G��[�ag�b�=*3d���%H��R�v�k��^7Q��d�]'Z�W�d����WM��(Jq��H	:��"��7EC�:�D�Zy�>��n�j{M�T}������uB��!���z�zz���`��
fn�b���H�UK*��&�bv��w����k3�����i�+)G������5����(����j��lA���1��w(c���D��c~�i�]a��+P��{����]ni&5��a
�.�}[B��l�?H~���Ql��H�;v��E��U����S������iZ��;:��TM	(����&�b�(��e&�$�w�D�03�cH6OH���h�	�7�'R��z ��c����2�����3���D�!�P��B7�cp6�+����V��2;�J6H�����W��l9�A?+�cwvg��
�����r�n�\.����(�TUC�v�"#�]Y��t�%���	TTe� �+r�>��n�Qn�$�A"DIH	���(}^���6d����zjz=A��v=H�Fg1v�*��D;�������tf;rX�\& ��
;�����-�1�q�T�h�<�����L��d?a���&/���)�#h~�oe�����
"5���G����I.�����P�&��l7j,���-OkFr�Y�&b�^���3��2��"g	�c!��|���7$D�|�����p�d.5M�������8��2g"�
��11Q-<��*A�J`�;��1�����?��\_�������Q��v/�W���a�������)�n������B���y|Z���R?�:�����[&����9nn
^��q9���IU&gfV*�L�D���M#���qnJ*�*'T\������
.����z�Q�
���xH���M�~sren�d���{!(l�0�k��b�2:��*:�0�|T��=�r��N��� ��R#���S���GY�n�'�J������u��L��^��m���)*i����FH��x����#RA��7�C���_�X�����JF�Z�kO��+j���������`M�1�]u�0������+4���3[z_A+2
&���V�]�aT�q2l����&��U��/�j��]Re��/��Ow��t�PQ����6�����g��Y3q��_UD��$���p��G,l���R�ff/�Ap�U4\B\x��{��.�����N=:vF�����S�jf����(���u�"B�m^�QC�Z��Jje�U(��{�����Q��[�g������=���|u=����r�U��<����-�=�������I�	��l������u���p��Q�����!�������2�>`��6���e	���=�W����%��6��V�v�U�_�JZ�%J*��-��zz�59))�:��w)E��������M�E�~�������%O�4�������3p���LM��UP�jS"E�|��F��j|(�����6]���y����b��&U*���*��IT���� ;)_*=���O���E���U�%���0������Y/%?_\��m����?="��/�DK�t��q21�3r�o��WI�Y���[L���nf���&[�+P�T�����+	�/F��������x���JV�:����i�]����$����$@�9D����{�ey�So���#���n�a (��o�)�G<i�Q�a�CR�����!�M��U����2�����hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x�]S]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x���?Z@���&�ERLPx����'��$���)Nc�!����� �W��vF�U��<E9�dA���~�a6���8����48���5�hq�+Oij�RWJ��B��4+�U�D������>��y�RV��iJ�t���o*I9iZ�Mr�u�l�"m������5�hq���k�����t�I���^���C���]&�={��M<z�Mt�x����48���5�hq���k����i������$�Y$D�P��P���L�t�)NC�h��``C��v�C{��J3aS��TPAa���g
e�:�,z`�������S�&P\H(	���������STT5X�_i' i��K�6��kWBJR�u4\�&��V��s���:�B��E���G�kU�����x���+9\Tu�X�����%��E�Y����Rz4z	��RH����4s�+�V��[��)���SEOQ��@�nE����\������D�0��` Q0	�"GK����m-��B��j�X�$��oP����h���B.M�9&����b�b��n�Y���NI��(V���CU����m&	6!mhh(h��N�Y2���&t��s0�����n����<-��j��5���kOyY)B�D�1�l��
C�	��;�n���v��m��.U'n�����$��,�/Z�������c#X�O1*J.�H��F��LDd����Z�u���~�P���if�&���-���2�����bs��"�a"d(�CR�����yt};m)�Zz�el��! W�WP���\�_����>i��{�6F��`�R�\}-����e�g��|tF�Z=uN?�c&�d(�����L�H��{JV�f��-����IR�7
BV���4��q^�����X��*�B�6�@��P���Ov�8�n�5MYu�[=�4�qZIv���E�>xM�D
�a�P��O�|��i�9���B��O���"ODTT�SES���������&�]t��!����u��u�H��u���hV�,�#O�Q�]�>��=�v��HN�D�m�!�I���21��)���ES0&]T��*��s
����_[�q&��Xz^��} ��v��+�H�FEd�o ���B&ra���(9g5=�t�������sC]�l�@��K����N��'&��j���Il+"�������;�[uJ�����Z������z��.d������$�@�j��3�S��8�f�)���i���V���NCMKP�=[I[4%����US��l��&xuE�W*�ET+E[-��K[�]?�>����b���+�����9<�E[V��
�y3,�U��8A�	
� �
��)����������\j

�[Z���[���?DFj�Q����U%
d#���&�����k?���JjoX��.�.E�%='F�������f�M@I�y���
���Q5�r������\,����������K�pj{`�������5��`)i$�ER�E�t�4�j�e$A""�.z��I&�TN�h::�T���N�d4�:��������YT]0:���R�'c�����`I�-����w�q)�IS�LK{G8 �+�"����Z1���+7�A3d�in����;�(�T�k��q=�rPr�6PGb����og���)B�HB��)C"��
��G'hB*��*f��m�(�&"�`�6@#����&�X��5P��m�����Z��gY�g���2*Cf��s����:R"�!����c{S��2�W� �u��Qi�Ow�R�nW��b�����
�����c�:��l�������-�G�4��:F9�#	{��=��,K�8���X���M�c*��_8��(a��i���h��~Q�b.���H��[�#���w0#��o��|���S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7���m��%�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�^���9[B��m�^=e�7S�#g��
d����X��oE�+h����VX�)�D�J �Y�A�S����RW�51�
��y3"���RD��HT�6A�l�dqqukpie�q�!-%,���:$AQ)$1�2{�(�tG9���cL?����9m������x�1�8_��7�������~<z���/��S�����c~p�=Lo��������x�1�8_�8J�nU[�����UH��7pp�t�u$"I��u4�!s���b�3�3f=���O�������u�wj}@���{�]�#*����a��C�T����4����~X����(E����k)m=]�E@W�Bj
�6����q����G$T�Z�� B���4z��%Z�;c�r�pal^�k������R�����4����<��������qf���
T���������E)gf,�?R���l�����Q17��r���D��(���������?d�P�!
c���
R�f���7�VF�XF�A�-Q0��{��}���/�^Ps0�b2���M[�wU������RT=&=5�7R0��?]i��U/� ��T����Y��P�/��pM$�`������1(}�����\�e��|�C$�1:H��t"��dR�dfQ���[i��f�)��q,�N�K�TN�U4�`2��K�{��coe�r�b��[�@�P�"�2�s����0	������� �cSa4/y��Ofq0{'D@GoTp||�<���{�r� �-V��Z�b#�
�����u�/3Kz}i"�/�m"�/N�Y��r��pS��.�5!N��T��t�|�t;4��!��-E���#!e�b%\��.��.tL�Ae�5�����(���Pj���.���G��D�k�c������eN"&p@�������J3�������]�8���5�}naU����>��ZE!H�������F��d��"������$?$�b��]�9�!��n�]T�5���w-5����'�D�S��ww�7��U�@�d����m�����T�0V����Fb���j'���aS@9T��C�(v���u�/q�h��aoY`�2q�+�4�)N�K"���i�����M�*=���J��H��3��2		�����
��"���M����2������!��1���E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,|a+�n8����E�������J�[�,Vo)R.�	��4�6��n�7�iR�H
�y-�����Go���V����wJ}�
.�U0�N$\�e2c��}�n����"�f�%�E��M2l)J�>0���X��W��qc�	^�q���%z-�>0���X��W��qc�	^�q���%z-�>0���X��W��qc�	^�q���%z-�>0���X��W��qa���T�1���t��XA�B"���Y1�D�\���������~����EOH��	<���`�A�E8y��������3ZKJ�3�:]���EL���A����c��tD}���n�����dz�S�gP
����
lX5'	�&���o*k������!�@�������+�3���9e����" ����KST�Z�i���)�LK'��4�,;�[(dc�22�&a���?��VK�hQX�,����wZ����Q_��/�f������������[��QH���~ES�J����;���<8��&��+y�7��t� �����m���Z6Y"o��p�7����w�9�Z�P�-l������T�%5K��	R���L���3���;�WQ��VM���b�����j6�������.�s��� �%�����
*�q�9�$]�1�3v��%3�)Ch�3ZG��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�Lz��L�L5��[DE���ZQ��s6��b�tA�h'��da�@.$.���Xy{����4~�'��1�#f
"D� ��K�pc�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�c�h�e�`Z^�(��`�dQ`�!@�(JR�JP��Ze��K�?d"a�DDp��F#�U����e����Pt��C(�f{C,JR��(@�`�9��)D�1� )J��G��kOt��\��N��nL�Uw���[�
&�g�b�0 ���C�5E�tkT3j�
�H�n�&�Bd����`�r5��E�cc"����l
	NJ�N��T����w�u;��r�e[�n�A�
�Y#�US1LQ���0��"���S"I���k8�Cf��.%ND��tb,"9�����H�u�A?Ln��8�����Z�U��`���oL\�?Z�A$�ce	�U�@�8��Y����(n/�������v~�i
��������b��T�IFHP��jj��Qv���jN��I�[�
P0,S<\K;s{T4QU[k�B����R���oRP���Z��]�E�n�<`��s,��K&MB
`�,5��>�-im�8�P�s7s���"���*��<|�r��}�.�7}��@����R�m�eIs4�1�RN�Y������r����<�>��QP��5������3�T���L��}WK���O�J��J���:I����#���4�N-�����1J[y�,�������Wfx4]���q����s�TCr4���i��a�h�A������uR���
���@���VK�V��T��a�qn��p7�q1�
�1/}*���m���F�]���-a��:�Y*�����w�?QX�I~^�������*�2a����b�nL�l��6/Q��]������[%����1���n'����Y�m+PM�J>=�����A&�X�g.W>[Gt��DxGs!����������Y��G��@��*�%�e�����Yk�2G7Q'���}D�zp$���(�(�Ph�y�|1o�J��{)�;�M�d\���JU�@������m������%O�%%�x��)M3��1Q^M7( _H�c��%�{���Q�C��������#��:M��j����W��`�}y�_�T����C��n���tm]Z:h��Vl]w�$����2`c�n��������&����d��4���@LR���~��N��x��vN$$.r��v�RUP�6A�1Vj��h��.���KZ��Ei'2�aMU�@���sW|~���)JR� )@2�}l��S�2p��'+�?|���@(%��R�\���
���?V������.�E�&*'
�����H���	�8b����-?�*5�2M�4A�C��Ce�����1���iw�q)�IS�GT�s��Z���� ���R Q7�(`=�������%z2�g7(���1�%L(��h�4H�U1��B�&M��(%(�	�~���e��K�?d��k��:9����9RM6��3�Lc�`l(�T����j^�uom�W�H�x�9;�1�y"	�K���Q�'��{toc��j2�0�����^�uQ��9�"��
��({MN ���g�Bi)���<r�@���=���G^M�N�����(	�+,�y��h�.��A0�yA
�'*������2N�d\`S8t��)�A�I0�4�
�!JP�������*���AveY=����0/�7�2���z�C���b��>�bw�T�hf�������=��������K�����]�\J�T����"���WK�V�Q��WQ��^J8)G0"���xr�_������X���r�pE��I��.A�M������e��K�?d-3
���/C����E��H$���E� Bw�
&g��v�jgP
�*��Y���=5E��p�r�������_"���y"qP�)�8I!��)��:����,�r5�y(�Cs%���M_�'+
]%��e��b��<��9��>�N��<�)k|�bI�3BR�
�l�#<�fi������Q�V�[J2��'�D����%�� ����/&b��J��9�I"4�!SM4�"d n��!vl�J���T[�EG�l�RE
�(l��Dr�ae�#p�hK���`�;t����.�I�(�w	�0�8��t-��jk�N�BK���W3��D���5VH�,b��N!��U���-t���Q�s��EeU��*�D����E� ���-��)�y3�1F!A����f��#h��Nd�P@�E�DEu�0��R�%���+���	N/c,�
B9�&��D�;���`�b���-[�������+d��p��J���@32�oD}��t�����~�-��k�����b��q�7/�@��E�3&�8G���D�I")&@����@����Pz�o��@��,�k��8�("v��������n��%�@Q����T�[8��MS*H��� �@�.��L?dG��y>p���#`9SZE��F�6g�G+�4J9d]��w�	���;�a�j��G�c4�T1�D�"%A/IY�b���
��H�1p�+
�����(����G��E1�4�""�bQ(�(�m�aE�QE�YC�����*��}EP���a�v��"��*�p�T�n�)�U�YS�i"�D1�c��DrE�;E �&�9���wNa�t�qeT����[�#	D������Q�T�Q%b(C��!�t�1G`����hR�"�����OA�x�>:@����d������7�C<��_VZ�p�����z���7$Z��pe^�c��LT���d^v�V��Xw�'Q	��@Q�
X�M��Zi���L2L����sC�}E5Q��$R���QOVZ�"`b$q��cg�pb��1DJ`��&��f:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�'h�v������7<KuDa74 ����P�0�������j�a\U`���h'��`��!�0�Y��Q(r���:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��c�����O9��o��<�:���d���f�~m��a����O�Y4�E)�4����q�8���A5$�$�n��*@>���g��KL�����~���q/���|��3,�6��4�0��T1G ��qq�a]"/k�FVr�	�}��R�ve[��?}�'��w��+L���g��6���I�41HD&�`��w~�����|\��d��'��e&��m)��0��e����)NPn����>h�VFLQYe���H�n,u�@wJ8�����mXS)�� �b����Q$�Q����g0�q0����]uES:�,���I$�D�(����""9mIJ�]CR�+G "b�x����
c�J?Tq(��6|�~��N}�)MP.�$!&h��FLlr��K������`�5�!��PRL9Q�O�%2`#��c�
�]����j���PT
a)�5�)�
`���B�j:�H2���_�����/K&2e1 ���%8����e�;�C[6�����/Sr����P�Tr����8��d������
d.w�I8rG���H� d_�A�`n�b���(�a�,�M��5��I"($�iC����� �`DRHDv��d�~��~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,~%/&N,U@��C(��BHB��a�G��C����mmiFI}$��!/#�6n�/
��b��)�6i�$�����*���9m+�g�c�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2qc�)y2q~�G��U�b�]����|�*�����uX�<�u�@�*@*��9���hQ��G�r��%�^����VZ�G@���N��|��`L�p��4�7.���a���Jn�A/3k��
�Bj�v�LT�0D�1L��|�r��[�rA!#���P2��1�m��T����?at+o.Z��V�/g�C~�f�u�'dOn��0����2��6oA�Q��D��E�1�pa�i�C��y�%Y����'�����<UYR�_%H���pX�?k�n�A�I��)��I$P"i�����yY��%�U1�F�>��y�h�FD��=��'������R$"�awn�U��K*����2����YeN"c�1�#���8�5i�����������0��G�4p��;?Z���y��7���:*n�F���6[Ji��0�R+�G�`h�q������F0Ghp|����qHUe2"e1�`)��,�X�
`��r*��'*�?�8\�TC1����?��]�\J�T���uA(T3q��T�r*	�3�T��� P�<�M�9{!��Qu�*����da��G�Jf��PWZI#�d��3�������TAnj;~	�H���96�����>L9�{{,?�I�d�S��������%������MeF�+�&���raS{��5�o/��j��ecc-K�1�
��uvS�"C�"�*bA���1f�	@Z����q��g�^����v��nHK��J�3}P;-A�\��4��L�a:yw����>�+��s�������?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�������x���?�����?f{}6���\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u�������96l8z��bP("�!]M�d�G1�����"+
d����}N�Q$&Y(-98�Ln�Se�x�lL%�-Us����������xw�����M�������Z2��qP�d@��A���U����G]cf1D�Q�s�\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\u����\���<\K���{:��!O2*
��������BR(U�:`��[�����Qqr�J��FMsx�L�b&�a�E�p��Vr��]�-=�RE��&�'�� �o����I����(m�I^N�s6��h����@9����7P@� �7������#��omB�'�)����]<�� �
33���r�E��"�fE��]�\J�T���Zx��jm�8v�39���O(r����O��D�x2�m��$������`(�y�$
�@�8b0�C���*���Z���}����)��0��]| dE^Ph{<f4u25p%��L0��<�n�A+����l��u=MT21
�O��#���*Q�*��;L�H�;s �
B
B��(JR�d�2�������&���j����4P
T?��Q .���9���
����0��utn\��2��3�
�6�9�2`����Z��lf>e�
���!���6�
)MGr�91On�����Wt�l��wHihp�pf �Cp�������e���h���
H&��EP�VE2{������t����FVB�y�X�4���@��� 8��PK��x�G0�$`�X
%�,�z��#R��\�
�����w�  
V���!YD�v�F���F>&�H��-���F,P+f��/��!JP�����M�������3�7\��C�c�:��c<_�������$�� ��d�����(�� �����zA��}����P�?�`�W��7���Q���Qqx���}����@f_�
2������>�&����$�*���!���*���P���'&M�������NU L?�^�H��J�fR��\��T��r���B��QaIB��j�%��E ��C�D~�s�j�A-�4UNV�T�&�@�8�?�������-<�����rVcn���i~=c����"L�E\�D?R��d9%��G����M���F��$S0�xe��J�j3����O����w)&�qU����������s���I6���n
M%�J�{�b����(��x��8�r\�AE3��%�������?d�(�*�|����Dccf/\��1�JO��C��N:A0�j6(U3�Ht/%��f���E��x2��i��U/� ���;�Q��X�.���t�`���(�tN%���No
�����1v�����z��!�3����q�^�,U��(����wn�ZH�:Y���X���J=���C�+�G.]��/$X��w��d��Pc����(f��6��Y7��)��h� �+���:j>�UH����wmU"��"����;�������Cw@�c���r�e�Y�[S"��yj�L	NK�wND�@h��Ct�P�����IL�����f��Ro6��	��
�``]T���RP�����tp�-�#�eH�D}�1��x���������G��p���Gu&�$+�]A��(�~�az:�]�z�m���BG��+,��d��dWH��$%0@�X��T��*�uS}O�Yb�u8�t��T�I��  b�se�.�.%?�*~����qt�����%�T*@��72�7!���0J�TW��A��
DN8�^*�1�G	� ��C���a@
8)JP)JR��R� )@8;����/��_�A��ZE�^�����9������P���%�����#��p1b�Yn
������y���	b�
�����P��r��D{�c�6�#Z7b��E&�V�($B� ��;�KA�:�����2*p�yND&^��[9H��t�~��2Gv��P���^������0����&%l�G�>]�&�"#�����G��F5Y���������Tp������T
�:�1HP����L��4�>�� ��|�E��O�I��P�4�)�7�l�TLa�6���%Iri��#�
FE;5C*E`$�l\���v*B�tDn m�����Rq�54�@��=� �f�A���Q���*>[� c?�aP�;��(
�29r�@�g��������y_=��KOI�Q��R��]��L5�dvK�'S"��N#��/gM����"��W��kF
!�?C�Z[��-�������P+�M-�N�A��1����6���\e�#��������x#"�&�Y���>T��6cM��0.�yvU��J	����2�f"���������d%Ev�"^�y>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8�bV���	��v�e��\��Y�
f���$P��xd�t�UK�U���R���t�!�[��P��l�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�x���>Y<|�k,�>n5��C�7��!����c���������q���X�d8��q�|�xn��v��MU�ME������op0�u3uE5@�'9�L�d���Ze��K�?c�,��SE3��� �2��"#�b���ug�m�Mj��~�
���	G���y�|L&G��	�sn����F.��M�f�D9Cf`��LL�g��] ��z��^��]�����eL;g��($9p����T��*L���F[!T�&#�D���
�|���T,��)u����\����Dw_���b1D��f�@VSx�@P��+�b�P��rR���T�g�/S�vm�4�8Y
Q�O]�&�$�F!��fG{7��������5P���z���'��,�9�?�r`Ff�������T+:���n���=����Gh�p�6���D?Q{�>���k��N	5��h�4��*\���J�G�7?�2p2����vN#��:B�WI�KL@���;@sI\[qliXI�������"��~q;�0NeU��)���2������qP�eE�VO�^�i����W��r���:�"&2	�G<it�0������G!�bT�3����f";8DG
���:j	�?�VFa�\�D'��.�K���x�
�����T�/
bm��{��o������r���
a�1�9�����C�:������=n���X����P5�0��K��o1h��f���L�T�A�$�!C�
P�����U/� ����11� ��,�����������v����p���3�`81���	U@M� ���F��5]_^���0���L+�A1~�l��/����l�����_��j������)��r�z��U���n�T��3�,��l�Z<�AQ�?P��.j�{�I"��v��}���~����T��B�)3��B�	�?d8q	@��o	M����F1��9��s�w2�1�H����:��(�ECv���S��5
,��)� N��2F��U�[����N#��:���(��uP�s���s��DDv���"��"���.��d���(C�X7#�r�W���&C�R���$8E�TRn��I�n���( �4�E"�)@
R�d�������e$�Q+��M�q�����G���K���O�J��~Q���#��t�.A�;�������A���K�\�c���l&����9WW.���
#%�"
�,`(��80�u��)VO��o)RI�gh&o��M����c�uj����%�{����;+��k�7l.�g"b�������S6���������j�
�G<�^C"�i)M���A�8Fz������'�2�X�����M�����A7� 5����������r�����?�Ze��K�?b��u5Q���nC(���5)
P��"�����j��H���O�k'����'�R$o�9��8;F��U���Sj1Q���C����,`(�tF��*f=��6�5|���%8�U�1�"�ux��NM��E
������#����r' ���uq<�@!M#���b�r��=��tj�� j��p���(����
OW7n���_n�51	�<E��o�M���[7�qMZz$=>�w��B��v~�w�_���������n�z����9��#&�F��`����D6��m;�z���b�vn�>���������S@~����d2�(b��!D�9�;�!
]�";I6*U�S�O��	C�n�T��!7��7&b��r�X��[O�6x�Gx�r�k
��T��O0k��m������%O����(m0����-U�QW�MQ�h��6s^�E�I6	�`�W��P�D��G�0�;km'd�lc�G��%N���}���� #��T��O�����q�3�����]z�g�(����%�hs����Uj��
!2�8=@�i)#fl�A3	�����j]��RJ����.OAls;��s����Xn26�*��m�NB�r�����0�vg��GQ����j�
V����2/�U!����n�H&	�� }��?��e��K�?a�uT"d(b�����ZF����V��&UW�����b�|���:k'|)��m@����]����(&9g�G�������V�i��
��u�3�~���{_a��X��r���o�R��$l9�LkF
������C��p��*���B�B����/�*��V8��g��:j�(�[�c�
�+k�I��H��lE��C=�X�`��g����&���B8�3`"D� ?����h�\�(���p��K�	�@3�9� ��m(�GN�� dr��1���|Ed��_k�(}spY��$�vE:�<@��Q*��z)��
G�t�l�6~��i^������B���p
�����&>@�G,$��d�L�*���(�RN2*S�_�dC�	/^W5
L�wNv0MSQ�o�EUW�'sy50��n�/n)����!-"����A����3��6{r�w ��iw�q)�IS��?|��|;��"���D0����HB� "�(�����7m�T!���g(�S4t��6����s������d��*'*dQz��!�	 S�e��o������r���q�w�
**R��pik�<�����f��T�m�0�!��c������Je�F��PCh��s����7M��=R��)�]����Ds����6���"E&(D�9�P��B���f��Bpn6A$K���`��2������U������9]$	��N���2���q0��
�<�&1��(���U����b��;�&1C�(\�ve��e�����I�������~�]��xsh�����d�M8����!�a����(�z���~"d��p�V(&���,v�_F����G��RQ������L�@��]��.��|Q!�N4#u�T;��&��z�Z�@/<~S3��2l��$�ki(�DE6T���%J;q�#�����G/���>����.��(��Y��
�&&0) ;���?Q&L��\wPe�w��7��6lS���IThG4�wsY9F�*@n)�7�m�����$���">/E�~��)����}����oA3��%�o������1������24/����,���.��6E�T��-���(}���7q���N��b�'����9�N�:�����[iw�q)�IS�""�Dv�,�~���A�u��U�q!J��8�v����}$����W��bp��/z�G��uW��h������;%L)��7��l9��v:J�ES�&N�a���a�3�Y�~��W^��������0E$�y8�HJ!��{�p>@�)��
����r�I�?g�
��J��A!�mP�����bGt~�*�Q���!DB4�����S1�#����,�[����2�2D���b�v���{&�#�RU����')�9�
�1DQ� !�2�������(}�3�{c���b�����M ��".��_o3c���/������r���� �||	��|�>?��V>s���9���zQ������(��c/�8,����y�z���<�=b��fs�A��9�X��Y���cQ���9�Y������������9�Y������������9�Y�������j�x���9�Z������������9�Z������������9�Z�������i��&4�h}��p�
���q.Q*��H�� 'o���ZSr��<��gE2��9��L�okg`��^��R������r��`���9e�+Rv��5�`f�q+�&2*`������!��Z�e������n���~$������n���3rj��"%�����T���K�:+u��L�B	�8���a��H�JB(�#��
!�9:���
�F-���prE���t�<��;yi�q�7h��X�*.Jg.�D���gd��C�
K���?M�l�v4�7u��uWr,�L���e�g�	-+5\>Ot��Q.�4C�FB4LO`��]�"#��IS�<��!�RG��J�2o�tLl�Gh��H�V����(�M�P��E����2i[�T� E�(��������k&�fK�)�4:�)�%�0��=���1�.�t��c��A�t�����LE�/������z>�������8�s���1������F��]��j��Kw����(��W��==����1[���wsh�JP�Dg���}�(8uw���J&�[@��G���A6g����2^�P��#���q�����9�z���Lw���@}�KXv�GP�����7�N3����*�;;�r����My�N��n3J�Y��e��	������:�|�[���}��QH�R��r �6
:��.�P(�vc��=i�jH�D��V���I@lL�Q0*b`�8vcy(�[AN�w�U1j�AIO���(��M_�J����8k%0+���5U9!���r|�Wp��av������N�N�G����72v�3�]C�?��cG�'	#	�%)M�sF�L��_��h}kw]LHM�����l���Zv�J.5I�&���C�e	�!�%�f,����RN�o#�H�!EW��f�s���{�T
�w*�����)8SN�m*69'���3���a���c\�G����+Z�.�q3����=��XtL�:�a�3����D�c��=��XtL�:�a�3����D�c��=��XtD�:�a�3����D�c��=���tL�:�a�3����D�c�������������Z�D�:�k��X���DO�`[o���t�i]N�h��	��$�q�Z������>�P�����D�w,w������]C��m]*9���g���9;QG�������d8N��I�p��F���K@����D��6b=��0%-9N "" bS��%�K��Y�"]�(S�|>�fLn��{=���,��=����jB!�rN����<�t��g�Ja������Kt�P�	L<�,��`/eD�C�d��f;8�X8�P�r}�	��pr���A������yJ�(����5p�*x{���f�����}#P�,�x XY�?�L���~P{���2���.�o}�>@9	c�����sy.�����ZL~�B��7n�@���Fl�?k���@U��M�QA� 	�3�`�����#P�w��
W.���y�z� ������w����F���p�}J�����!r+q�=��*N���&�Z	��G��P��~2�Z�<�U7���+>uR�����U/���+>uR�������J�������g�*�V|������e�j�9�_+.{Ty�~��w{��j�����n�=�&�������������9����_H����}�$���/����z��ne�V���G����������ro�,�~�	�q���Q;�m���;���4�s�����H����I-�}�L�����JT����D!����x��r9�$���v�y���_C�����
N�����C��LQ�1��Lt�S4I�4H�$�@�	��/&�e�����(K�61����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]����wjk�m��r�9�v����
��bZ;��b(�S����b	���1����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]���T������tC�P\.�w�c����LuAp�!����.D;�1����~&:��]���T������tC�P\.�w�`si�����=!����F�	�:���n j�q9�*��l����������W����Dq���~Dy/��c���X�c��mE"d���e.
�_��4��
f�R��-���x�����ws(�0$A����"-O&��(D��	�v�����v^�[��?���U����;���kw�������x�����q�>>,�=�w���+�w�������x�����q�>>,�=�w���+�w�������x�����q�>>,�=�w���+�w�������x�����q�>>,�=�w���+�w�����>��v�����y��||dX�������?��tc����
����C>��������x�����w��yW~�;�������w~;g��~"��q�>?^{���WA�������]yH�
u�#�lWE������e{��<|~2��Q�>?^���������|{���Q�>2���>����>=�_���W��o���k��c��,|k^��#�{�dG����|Fb��Dvd1���3M�0���M�Ip����o�3����\"�?��K�qK�f����}���7\�p�iE��� �3yX\�Go�����2s9r�
�7��]��=��H}r�����%1�v-���G<���p�����+{�l����m��;�"<#�Z��`w�n9������^�p���smlw��p�z�S�*���j��,�T�}���o�	����IB�o3�K,���uW����~Oh8�������`�}.�9��Wo�{��oi�W!�w�o���z5�����z#���`��!�}��(��1�s����~C�������)��hpQ���S�0`;��8A�?��*!�b�P+X����d(P��g����*���EuY������;�7���dw�o�c���,���U��Y����#��VGyf�6:�����luY������;�7���dw�o�c���,���U��Y����#��VGyf�6:�����luY������;�7���dw�o�c���,���Uq�Y�������VGyf�6:�����luY������;�7���dw�o�`C�������~��uY������;�7���dw�o�c���,���U��Y����#��VGyf�6:�����luY������;�7����W9m��o��v:�c�����v>Y�3�i����o���g������ll��6����f�pO	��Asv��DN����=I$������E�Std�W!r���L��q-��Kjv�S�3�[D�*y�y�]B��r:y�sh�D8��������VP0�
%E�A�odD1Z��%�I@�?�v���H�$��e��s��|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L|I���L['q	�E'D��ji-���4�2 �N��{#l����=��5����":5������1����������=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����=�����}����}����}����}���t9!"U��#��Yh�VE��T��)���2�va�&I�,{P.d wCs�f�|S�����3�5�1�To1k�c���b����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����Q�������y�_F��.>*��-|\|U�Z����7���q�To1k�����b����Q�����S���,�4��U�[��s�Ud��.y�6oZ�e4n��#�S�3�%����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��M�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��-�\|W�[x��-�(D�IT�G`�If)n4P���]�� �+�1�\D���Y��,�F�D��\�������d����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��-�\|W�[x���;���q�\w1m�����b����q���������o�s�.>+��-�\T���,��E9`��� $AE��
��s���)
-���:�!��Y�"��1�N�Gh��e�T�NC�T�<�!�wwy������'�����egl������e�����u��X�'�5tS��U!0e���
~�T4UY�F%��0�h�\�<S�:��H(�����$�1��<�j�J�Ki���G��
l���)��r����1pSl)@2����4e��l�F�>��m��E������gE3_J)� m���qk)�]i�����K,�m6�����%�|A2�?L"G'���s��ue�����<��Z����Ujq�j0��Q�O��Y@:}�y<iB�_:���:���e�*^��3F����==�4G��+`1��UD��>�g��[KDU�T���s�S	x.�'����H{���5��M{*��^���h�q\�i��Q��wB��! �16p�b��W.��w���z}��rA[%Q��6 �8�s�HL�	��>b8���e���8��s�)*����0������YD-DH����f9�A�����j��A_4�:��I�!�)�*ew!� .W(�o����wp��@�PEr���UL>��O���v
�h�d��
�B�\ &�7�#�\���yRu��k��N[�=�qF!^�)M?pS.�-��L��A.��4����~*����������tc7L��nB�L�7(sg��j^��������^��l[A-S�q� ��*T�A\��*��$P�e����^��u]/A��J��LA�[��NH��	�,A\������T��xqp��k|�KDY
?���=7uev��R.��>�~`)�	����[�[�1��gnQ*.$������������~��D!�>�+9�F�;�ik�yQ������ME*���"���*��
�k����U��H��d��!m�n�(!7����z'��r��1�
�������zN����I����k���7��kR�!�f��L�LJ9.��i{�V�F:a���$UF2BW��kUL�W�s4XQ�S�[ ����u�[��ZW7�V�Z%Q�}� ;h���*��:�L�{�"�B�^���J����_^j,�[U�(�����r��t@�I3��=�&��_t����m-��m���B��j8�Y�2��������y]�������{Rw�����z��V&�l�
�]6O��@M���Y:����an�� ��Q�����+�m�L������T����^L����[��Wi��e�Dn�U9A�2NKW�I��1�B���|3��x��	���9���^j�������QL.f��������g%L����ib�G����wjB�\[��6���~v���d���(��C>�%�0��k���j:�i���n)-���>\��I���S�J��;��]����.]��U�7B�[�T�������(y�[�
�yc	
"�4�qoma}��e��u�G��j���q
,H��0&S��c���=C]������8�����F�r-X���� ��&���7{�3I��S��v���-��U6�Q1��6h���T�0�.Y�1}4grn�Mz��*^�����Z�S����R6MFD"bD�?�x;������RW���Kz��F&�[6h�����'������X�����]o 4�Y�A��SJV��7���jW$2��% &b�8��~��z���L����U��Y�n^�;2�F(�|C���P
�s�qP\��{[SS��t��e�0z}���&�g(�H>[3��#K\*������W��!��<���7�A�NM���s(�Tm^]���w��f)��U$���c^H"����@�O�L�2y�-�^�#^]����Gi����������������9�2zU�0.Y�,&�+;�U]���J�B��)Y�+AIC������!U*dX�@P��<h��V����Pz��x���5151o��N�(�9[��.�O�����8C��?���u�]H\~��+8�6��
���<�]����������1��j�������T��i���"��}����fG��oZ��g9��SS�F���&X�:�Tv.����V����:�j��q��>!��(Q2���bCK^���JZ���_^J3���j��d����D��t@���t�DG���F�syf5)%���a�h�.�2x�*�@K��"�E�9ow1tmr�eEy��|]!R����SU�������	���"t�	dP�?X�4�-Y/B��@��aW��_S��Dy)8�\NQ1��!�V���-�����[��]$��T�xf���D"d@��>��4���}��.��������CRR��X4Af$L8�6�JpCh��v�V7���"�e�sGU�.D�@�����5�wK�pr�@�8���2�:��Uee�+��YY9@c�	J���)�{�]4H��I���u1��5oI_j���4�\5aAZb�%#]S��AIP�����TLp'&r�����F�U��*�
���p�e�V6YaQ#U����,�$%8d����
��WIA��nL�4]��M��'����9}��4�{�������N����
H��>/��)�&e7����L���_z��Q�n��n,qh�bWU�p����������
C��B9cD�R��Y�����=��t`6-B�:m��D��������EA����f��uYK���J���m@Czn����TTX�n�n�Sx��QJ������������h���M��l�S���H���ow1P�����n������
�� �J��}WM�aR���!��IU�A.x�e����S~�SV�����x
����������DP@S�����E����u����8N���_Az�>p�0��+T��SLNT�
���#���m���m�-WV�Z&NF��~�-�)��f��9
���"9cN�&+�:��4�8�{y),��� \�;cF�L��.l���L��1t���?Q���Z���ni�mK�HFJ2�A��R� m9�s�����N)F�f!�d��N��� ��Pfb������N��;�h.(����Y�����h��N�D$�R$�C	�(b�����H\-]T�l����N��+h��:J���k���E�$u��P�QS	��,Yz�S5�=CiZR���hv2
%��6E���|s�GKw.@
�y}iQ���O���������2BV�$�S� l���!�T[
M�6U��Njxy+q.������TJ�Q��!�(�P2�.A\�`����]i����������wL?m�F��D�����<����!��p(9��j�f�R����%s��H>]�(Y��[�s. ]��r�1m,�q(zH�7Yk�@6���J�I�"�-P�T�������d���M�M"4�!�P������N�u������c�r�\�w{-�����^���?������g��XY�*����dc�1v�C'��}��"����Pi�JR��-Jr=��L��b�d��.�dT"D� pb��*R���i�] ��	��#\�s�d�yOR��86+e�"����@83��8�{�@�h��W��oQ4�c �����a��plTW3B�M��s�,��+H5e�����H��\�;��E�f��-��J���4��� "S)�D�!�-����V\��O �Yp�I'+��B�`({}c����mTi�,�(��Y�gP���\�r$����W���H��l�s�a�������K��}@.�%�(�L����+�e��e�����
kn��q��J*��0��|��J~-��'C��B9]>|�3������+�
.�^�yo/3z��������-�j1X�&�.C��)�hY�cM�����.2�X:
kp�w)����]��6t�Q(�&���D�H�`�g��&�����\j��u���s]1�qo�Un��R� �����ju�V���
\����&��+����nw0�3$�Z��td����f+T����8~��WR��V
�������U�4���Y%��
"��eA08'����z�;U_�h��	zn�2���V��dY4��p��I4�1D�)���su�_VP0Um5gd*X�����)h"I~P&H���0 ���1�b��J�(��
j���j��2����V��%5�y��ns[�����x��6n��m�K
^)s�������UG ��e"�n ���JB����KS�k�-r=���RR
�?V���+)pbs�fb���>�5.[�Y���R���t����zV����M8F��wbeA�
D@��z���Yo���{m���x�l�A�H�d2e���C��L7�1�#�~���l;�=����Z2!�t���y;LQp���0�G��p������������Y����h�)�����uZ.�1�j��%K!����j_Su7|.�d8�>��x�������d����r��f���~���Z��v�������U�4���P��
$��eA=���@2���G���m��f����������V��e�d��t	&����a���h���`��^��ejx�����)hn
B�@��L��0
���tG�6b���L
A8GR�<���7��.���v�EP�	����:�:��M�p���eM�W"�z}'��yIZ����]����gT^b�B�[��C��y]�~�o,T0��D�p&F�<]��������U��=����l����)T��N�r�QO�l�1���<�b��-OW�$������B��H0~���Vz5x�O+w/dT;R-�NH����
k�1d���E��oH��mW�Gv&M���/dO�&`)y���A�YY��O5M��hKSQ�U�B���=%&�B�U��!R��8�S�r����������EF����V��1+m����T�P	�;���`��}��������ym�N�2x���a$��o��2j��|�3�|��]�+����|��s]��qo�g��K&����J��������tuMFB]�������^�}"iW��6(��Cn3��]�F�V���o��J���g@�v�����U�z1(?1�(
��s�jT����Z�����,�!eN��cI&�JqH{�(��Sv�S���uJ�	��zv^�DK���+6��a�w��n��w��'t��T����hdlU�����V�~����K$u�& ���
��4�z+�sHr�}]P-���F�MH����FU/8�;d}��`a����w:��������������d���&ru���N�8�3T@��	�!�#�b�������b�]S�����k�u6�I7��C��#�K��Hn\
>������e�V��qZTl��pm����
M�c�=([��r��9b��"7�6����fe2�B1�U2��n���-�&�j�/L�4mOX�Z��LHJ���tUA�&b�H�J_��<��B�Y���CW���0���*���Z�l� f��*&�����nO�yfcK�:a�i�W�L���B�h��/Zu����>�Q&���L�<A�B�������������
[	u�y4�,�8:+TK����2����q�u���}�k���MDW��$�1��T#���b	��{��o^������IA�������M8���JR1����u����R��0B \�|n����"b��kVK3���z����f(�Le�FD�S��;�9���<�	MDW��v�ihY6�s�MD+#��\���9�P���J\���o�BJL�T�����
��LP��������s�}fc��B��(���)�G����'(�L�M�e��.��{��
S��fC�B�D]�R����4]���;� �b���
�#�6B�F(�a�B��}I�c"��t'(�G7Kp3r�2������S]�"��nR�(��m0����|0�����B9�@��� �,D]�PP��<h�5� �&�\���6Ys�J�:n*E�m����;�7n9��0EP9J`*�:J3���b���I���E������$Hr�}��)�2�>A�~�v ��P������+!(�wp�D�����
�[r���D]���t�8h'18N�8)w�=��0��IU�ET*D2�DQu���"�	�a��"=�$�H�ET�pM�*7\�?z�������9�x�*�f��������L% }���t~�F"��P��`X��JQ������	��}T�(����� +6�(��:m�a��C ����f(�1�!�U�f�F�p�gd(�C������ T]�f�)u�8AD��j���_dH"���� a�L B��9y��D}��i:D��M�U��
����
S���6��H�I��(�96m\<\D��n���8�����!�#�C0�!��>����vs:1�Eh�t��E��H�}��C=�p}Mv�����s*�G	�P�;9A5;�C�w�B;v{1��`UM'H�(�[�8f��f�NJS	G�L����������H��M�u�88g�I7@s��(����(
�gIB��<���(� !�}I���E����7���3�pt
`L��� g�gc���.+G����#�/$'�H����5�v� ��7�4p�|���zAK�A���{��%1U9R �H�J.����I��	�>�G	.B,�U �[�@7����)��0�I#k��F���Pr�V�0����6@������j.���������������NDU,y�IM�r-�qA`DV���������QH���S�t;��V��=UAMT4���QZ�����=C�%HR;I1!�2�_��z9�wS��Q�k����v����~E�����uA�G�����L�����w�UmZ�0��G�KT�]UQ������r	���s���M��6IE��YB�4�c��P�K��)jn�^
J������+{w�����&X@MM�W�M<���E7RlS'����b��"
$EO�����������u`�������X~V\��?�)��B���_!���v���\����j-Li����95y��\�,�[������}$����]3���L�1P0c�]������4�������6G
ACT��l H4)���@.�Y P��\��@��1UR�U������|�]oNR�}?POQ�i<Z9X��"%��#�+��2.�L��JCx�1�`)Jc�R�11�x;��r���n.Q���Nx�qL�&�Q����
u��F2����-�'�������l�I6���i���w���>������v�QU94�9�L�6Y�"�o��nW��i\T���5g�uB��T�$Q�\��i0�yt�,�#�~��r���5Mp���;M����U���s[z�U*�$_��u/(�.�R%����(b�I�������qMAU����>a��;R��5	#�� �]��+��E5I���
p��9Z��[^�[Wi�#T���{C-�wh�Au3N���r c��)Z�!���s,Z4+�i8�HQ�6������4�%gD���d�jzV��N^z�$Y�����G(�)�����5��+����g�mI]�K��y��iSR�4k�e��	=N����c*�C|�$��@w��1s6�KWI��x�V���$`DU|�8�$���'
$��2i)�!D��P�A��,
/t�~������%%X�� -�I���������S�sdm���g��	Y@��E�����b�m�5`��\+��G���}1EMH�T3.���U�����M%��� �����u��p�&��������d��z���|�m?N����_7q*�T���U��*�A�����j����e�1��8��)h��XSMf}�.)�G+�^�VR��d3Y��|"&E�����u�a�����XZ��]8�2������|�������MD����t�WL^�P3Md�&.����������B>��z^��)������F�m�l�����13(X��E$HTQMv�teB�[�Yi�@�7^E�*�kOH��f���$��.��fF*���I&��j����E�N�Pt�t\�r�N9n�n���]�)�r��(�X�t��]=kS�R���������/53meY�vk�NT@��\�]V1M
�;�����Y���b���Ut<j�u�5am������*��!bE���PI5Yd��H��������e}���V[�B����([KK������i��X�V30,L�k�S�2�D1SCdQ�4Ah��������N�_�R�G�����g���onE�,��h���z�f�"G���5�T�_�_i�K�n��h���r*C��:�N�%o&SQV�KT|�\,+6x�,���yF�S"�' M����������Oe$t��kd����Qq��r�
��<h�H�J���(�J�yqk������X�S�2���54{;�hm�U5��m#���r)�����BI�A���pAP�.`:]����T�j����MO�J�L4��K�0I�JU��k��U���S��
&���K��E��r%(�M��M-uj������m��_H�|\V9�+X�U�Bz<Ry~v^���x�����a���'�J0n&����Mbt�^T��QUM=ok����rg	��`�.V�Ky�SUZ;�/ZUWF��=�����T���K��������TJ��A�N_�n��UM�GQcx��W��5����$�BB�=R�Ff����|PU���^<U Q`;6.7HC�T�N[,j��fm��kw���%+T��V��m�~RQ�2�O[�����H�jC�#(}��f5Gi��mn��	p)V5Sh�UDS	�D�B����H�FE��U��Z�p�L�"����Uy��=;�u��5�]JR1V������}��16�����>]��*����Mf�*�5�$*�
������������V���PMG]�WL,��j�c_�4��0+%U	*5)P2fUTY��S�2T�4���GSp��w�VZ��t�LF�'.J���������=���+K������{# ����u���U�����MK4�X���1
��+�
cH��8�����!�%����Z�������g!���M�YRT� �����DVL���h�����������[Y���D6���5��w?�����^F?�OC���^Y�_�H��S�**���l]����lE�"J�������i���,���#����J�6���6L���sw�]y��-.�����VV��qkLRno��IW0�o��@�!���HH�p(E�s��L�k	�+:�iZ�N:���[����BA(�U$lS�	8l�w,��H�&�����5�U_���	�;#����z������M��_���MN��2�����;�I$c�|e�>K4��u�1��)�a����6I�������Y��O�����**����nT������_���7B�9��L��57����T�����������V'�g]�h�sG[ZU��G���kTG��d$��7����R(�b��.Q`�����5���J���������n��������9_W��&��J�2e��*H�T��I� �x����[
N8���KSt>�m56�Aa�KV4t������-�S3+2�v�,VLVQ���Dk�+�bm�Aau�CWvCIck\_}P���6�QU2���??_����nQ�\���KL����*�����
�)i�2������eT�g3�-&[���e�����O1;�-[F���mr��"$p
=��[�2jSM:������A�H��,G�5JW�NU#F���k�9U��9Y�TUx�&�Yt%Ud�k������y�Cm$���C�+�z/������J��]���:�����a�n� e�8�n���8t�g�6���$���m���y������f�-�KSXW,XG�,�I$d�����������Y�d�EJ��]>��F���k���/������jv�]P��U�CB����m��5��x����+���K�*�"��UA�GtU�:X�4�L_=3����Zn����-����|��U��,H�z��	&�k,��IU�S�u�a/:���7wYw���`\��`�3Z�.N�s����p���n�4�LJ�e���Z����V�^v��w]J�a���X������H���T��6�lU��j��G5���k!�W�q�e�������^O�Up����C�IK��J'��"�`i*�����B8�������zV�A����Q�y��(������d�9b�����Y�_�Vh4�����
$�j��K�)�	�s�d����L��D�!�1V���V"���������#@�B-I��Y�37+D���$)�`�vb�E����Q����YESd��#��BDLWYe��:�>[�0�kU��������������zJn����:�����rC(��Q���)�A�r>X�
�<{�-dMw�Y���=���6��G�_!n���2��.������������e�I�X,����Nw�:���E����e��z��7�#�\�.�J��8�ilin�����T������]�������m���9*~�?[�e�<�DP�7x��%���Z�����O7OMz�����}yt�;LC��F���Z>���������U
]�SI&���*�1s���J�}�Z�1��sE3A6������A�-��[�^�-+;�p*5y9���d�8YE:����?��u���k��TN�/<�<���J��wQ2�����M��NQ2��������������Ayn}���^6Aj�y�;@��-)&8�����Y���Y���T�������J]�Z��s���X�7U��Vt��xU�����A����r����r��S����D���F;:�����"�;;�V�R���]��>���9���q3DHG#5�GL�p����T(��(�
�[
f&��v������V	�h��r��$dTs&mD�T�L�;�
����Dq�����o�=-���p�+D���|�:�������f�D�j�����)���
*%��L5�j+��O�*3�Gm{�L`�zv�}Q��[���K��h�E�����D^PvN�9{X�R�:���3��86�Z���mM�����Fq2���)��DhQ/��K��ez�
������ ���������o7`��8D��u�X��E<�2%0*��O�
�i-e,�j}N���Q:��d����E�(Uwv�������m
�&]��J~.���Q�����i�1o4Ilkmy��(h��"v��#�W������#ycgUd����=P�7��vv^��=]8��!5��5M-Y��	*�U�WT�t^3#����~V8����WO��z3���g�=-#JV����S�5����bX
�	&mYTo�@�~I379NqL�)1m#�Ml�4�/����Y���m����
�/���G(��8p��@} �
�
�������R����)�n�����R54fn�;T�J�uT��-SUu
q$���!R�������)�f�,�H&=�Da��{>IU�F���~����A�����Q��LbE��+V���e�����kh��kR���J�2�Wz����,#u7sE:�Z��)��4���b�2��6 ��
'���5�1,g���Qu���E-��H��U�V�~�� .
?MG��O#�'-*�fVi��?�M��J������R� ��f�.
1���kZ�G��T���^����R�1�N��F�j���Vw���F�D��f��X�
�?�kiA�-R[��������"��5�J�4�u#z�H��npZ"sE=�\�5�<QA�;�O����Wi�����vi�@
���9��!�m�Z��B���i����IMR��Z���W�����7�FU�4y�h�7�Y�h��H[���������P��
AG[�������E(
u�-,��H=�%uD�8��TJz����r�����9r�S�������,��("c��1�a�q�t\3�7�R�e_T�=�&V���\5H�(�u1]�������$���/��
�@��{XQ6���NFz���q)����h�K�h��N5N8��J]�g������WO��Q�+��n����N���z.�lDTwNU
i��|F��Jt��{��x�*C�TH�r��m����+�J�uSVV7J��w�NZfB���V�sp���G��lG��~�l"�Bd��'h��D{'5k��~��<�=5�������\�1WY���h�j��>2LXG)T5tg�M$�K;P�����o������j�E��J�%��~hqK������������Ym�A�j��w?�%
�t��lF�z;�dW�/T���ZN~�������b��c��5�D�P�rr�j.�X���#���"=���1����vK]QDj*B��q5#D�3���I'�JPE�\E��!����;�[�p���71�v��(Kr�G���m��.)O�r�[�_�f��7#��_��Y��c���E6Gt����`�5W1��������N;s���+��/��������m���?��b�J_�Q8���!-�ku��G���}T4�������Jz���yF��	����i�J}���H��:�C9����)k��}Gj���T|���4luo��eKSH���D:�l���F>r�d���;A4�==��VO���.OJ�e^�e�)-j�DTu�JJn���,��$���	�s����~��.��-<����^?���\�1{m�gZ=���(9�w ��hJ�8Q7H0Q �����5F�Y���:�w�H�g�j�Y72��m-C��lO<�5���"9D�RL�p���Lj�����WO��Q�4���_����MCi��~�D5��"�;�j3�W���u�B����,�7�����t�!��FG����:��e��m���h.B���\�O{��}Z�\G��~�A�:t��o�W^���7v�T���V���G����������������*�{A][�Z�"�"����U��^>��L�[�B]s�j�(���
%�}�1���mo�������V����%�#k.��v��cT����yWK��{��r6F�������P�sGS���E��	�[�`rF��]'v]L^-b�TV�������VJ���t*N0�EM_���=-�a ��U��`���]�qQ�:q��v����M�OV7H���9���u;������"E��;�D&������
�c�C����$wo?���d�&�-�z����+8��j$$�*E��<�����u�({�k-Y���h��[�h�#R��H�'+6��u"��p�+(����O��p8w�i�lES){�R�}0�U&)���6��BI��-�12��h���u����,�C�S* 	���4�����5O%QE����j������H��}:j�-�T�5z���C�d���A����Z��:�W�%���:j��#=,��Z���&�����`�wM2�A��'"����@
��R��
H��4=����E�en� U
���5�B2��?;���<\������n��$�4��b��U,W�����V��
����(���������#�C�W�g����������$���S���Ile��:�����S�-_��>��pI�h�y�j8F&A�v�x�Eh���z��
����H:��O�]�AwG_kiQ��
R�����B�R�M��_I�Q2�)�j�D���������+ki9����%��\S��5�f�R������I��1����$����7T��Si{I�N�������K�zV��r�5UO�����j%����j�l�n$��v��t�h�uA#w��z���*�!?�����ZK���J��.M�=T�1���EE�?3y�v��1���;e(�N6L%������u�}$\�"�T������!!������������o*ePK=�*�F�w[��
�7N���0��7BZZ��\��i:��sB�H�.����$���#��o �T��N"<����(�k�:��4�zn���VT����R��5,t�;op�m�B����AK�F))�yU��FE��$+�N�P/g��7B����L������	n%�&5%?U�JG~X�b�)����M�t���&��Z,���������n�*�k����At����h]��
k����E���]"9	�.y�a��,;_����*�O7��3�����*�^�yY��n;�Jz���=v��M�D�<lGj�7MQ��c�wN�]��c����M����KAP�AF�A�[�3Mi)!H�Q<T��,���Z�v����V�MtL����*����(����)�"(�B
���J.=�zk(R��EH��`�y~����H��O3��1���8u��A����?|"n�Gn��M��Ld�	)�$����Im�'*�n�r���!��B!��,c��`��D�3d�&�P)�'1Qn��0��h���6�Q1��$�,���E%�D��i�!�Sn���y�w�`��&m�	�h��6A0�	�� R��`�����%1L%1D2���UXXXuW!S]H��1�,�Gx�T� �v���B6�������|�9�������)�x@������G*��K���[,�U����/�6c�I7
0F�9��R9��P2���+�
&
�.Y��`�$B&�d*i��@���t�!�@��X�3j��r�Pf��MZ�SNb��)
a(�����l���
n;A'-�Lv�k ��/�0`D�1�fS�B��h��b������)@L<#���M��Ld�	)�$����Im�'*�n�r���!��B!��,c��`��D�3d�&�P)�'1Qn��0��h���O��]#Z-/��j�.F����b�P3l'w��������t� b	@���}�G��K��D)@�}O^�0���J @�������x���w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5����������g�z�|������={>C���������!��_���O^������w�'�g�||��;�����>>k���I���5���������^����O^���d�S�m��.��I%#gj������!�1+3��Y��2�&2��"�L�1JUTL��9�1Jm��=���{<?[&�J�wH����)1{/
�����X�	�R���C6!w��a�')�)@ON��&UU!KR7�Hb�A ~6�!��0	C!�6�����u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E�n�;:�����:/6���������og_�B�����6vue�$/��T^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x���u}$/���|��:����^>m}�_I��/6���������_gW�B���������!}~E���������"��k���H__�x��������������6vue�$/��T^>m}�_I��/6��������K���� p@N�z���
�l�N�y��wg���C�v�����j:~�T���
��Y8���J��s�<�B�����5��E�
�*������c�-�(12L���T��<.dPf6E)7�;�7����Dq��N,!T]��F[jq��Hf����FN�$������P�`�!��y������H�wJ��p�q�)&��k�*��\�"$P#��0�� ����v2������l�E����,^�T����r(�� !�p�L.|��$(p� �8@@x{���W$���P1s�n�D��Lq(�M<�8�6y��}�g^�^�FU�������%�
�Z��A�]F�L�1/����Cbl�>G!L�`L��Giv�e����n��ri�
�#������c�o��.�0�o���n)���	�;K�J9����2�\��&{9`6�>����x�m������,a/5�����m�4�WR$Y��d��q��G�P�A���n�
�YfQ.�;��qt�M��n�<�8�!�0��B����3����L����0����%����}���6���n�H!���r0o��\�`����(	D{�($l�C2����������UO|@#w������c�R�Y�� 8���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�qc�h�X���'<!����}�q`�9Y&�Re��$I[��\��HB11��6c�	g����7����F��3���1�!o&V��&P9"��!6�
���kv��m��j~����j�J��r��$T�d�2J�	
`���
*��;�r�!PEB�P�6y{86C���J R�^���D0�}��zr�c���`������!��&A�/c�7��[�Y2����We:��LdZ��r0w��D���
�����k����A��� �12��D]�����
�(!�9������
��m(�ypm���V�v��c��<��[���b7f��GtD�8
��c(��4�2!��WHy'%!����`��2�v�+K�u*����!\�MP��U�TKB��x�[�(b�Dr {[qF]�iP���+����*&i��2��s������
��|��0�9�2��"�`�	D?���9DJ=�ef�t����w���s�]�9I�s��m����_x(�=@]H����o����`��t�5�$bdC&�D�	�D@2�r�'�Vr��r�dJ�pr���Mv��P��S�
Q��B8�Zv��D����K�F�����E'G1$t��)�U%Jt�1G ����;�*Y���
=��m��������'8~�x�c`cnf%��s�(�tq�y�0��<#	����_�����3{|
 q2`��|�P�S1v��Ha
s�(e��l�G������2���*I2BS����>�BfmR���`���(q�D��0���V��)LP,��r����l��YQO���,��@���B��)�r8d�M���|�N�=DAV��.PQ��LD��Q��1Sy�h���B �0��v`c���(�"��3�J�w}�	�0��9S`�/���=���]���f��,6��t���T�c�l�>���.{��G�	Gh���!��sD���@��!C/5"a��`w�����Q���}�"�d<;v`��R��"\�|�������,����08d=��g�����R�{���D�6@]���s����N����MA�Rl����;O�uC�w���������w(�c{�]��������@	�s���R�������vp`E1MB�����Q����.�8��������f�����������@����<�N"�}��@s��`)�.��zPWfc���n]��wLP��o���F(��`;8q�!�Co����HMM�g�������j��H�N�8P@�M2��0�9�l���.u8����������fo���Q�������d�H�6�`9b�N����bj:}�%U�|I%i���\��Dnl�T���������?��C�-��L&��l��f(����~�r���\�G������q�y��tK���{�m�3k�z���Z�*�A��*��e���%15H+�<��e��Tv��P	262�=W	V�j��#���`n�@`��a���z!���	@S.�(]���x��Ch}�&W�Y5 �?HU49GOL%b�>T�T�H�1��C,���	2�@LcdQ���>0d`�9�s]��Uc��M�:����U�H�����C�����#�>�k�:Q��-V�GT���&9����lW��L@�*��rf<1�P1�
�>�
�����c��01��P
C���vpp~�7s'������������9=I?����m.�j��v����B�HD
��W�#��`�7u��
'mPxETju�c�+�<���L�P2`#���5���&��4�Q�G���;I�!S:',�����8(�J��Xv	@r���\�r���SfA�Chm���v~������A�������6���ng�%���8������tfj�]��������+7
��Z2�l�#aI�q���s�a�`�w6c�W��RR���A6��V��O.��M4H*��#9��S	�fpn*���J$	q�Ib(:Nn���%k���J�B>��z�B�|��R+��ytW(@��`b���mNQ%��ZH{}\�k)(�lj�)�1������y4I�=��~\�0���x����R�,���^K���V���IN��������5u�F�t�Y����E�bQ9�;C���}2Q���B�����u=K59v���&%��-Q��#D�)��+��&�&���X�>�'Y�Wj�1�h�Y4��/����A%�f'��l�=�(��L��� a���)����V���G���`U����M�2v�i�\���N�$C�u"2�MD�HC{W:)���H���3}g��1�7P���B�5�2I�,�U;%���UwW.g���J������kK�IY[�fe�$RE�F����=?D��1��S$�5��Q"��*����g����*���m9@�������$C9iV:z����I#"L�$U7�(x�:p�������nr��O��y$�&��H��*�5ut���,���HE�eR8�D�39iC��M���Y(��Vn����gN�RWj)��W�V�GP�K��$�����{�$��Pk-���������j�j�}M0�N�7��i wU.�s�p[|�%�CQ������*[Ki����-@.>]�Z~�������n�b��&n��r�Mu�bm���'`qhZ^�����um;��t����w�7��~��("U���r�� }����������^�D��ne�hk��������Z�Cy$b������x
�9�f(vVG��z���i�y �����s�����$�%LF�n���]N�U"m���57��T[�v�[��������JJ��l�X��w��N��`E:M�&E���:�9r(j��b�[*��+�:�N�cJ(g�Z��V+���j���,�4��+�l�*}�
$`L'��o��5o�X�i�ap���pl�� UMQ'/+(&\
a�9!)�%0��Q0d"��{�Q����1z�L�!���T�(��
=�����!�43�������^\�4�����N��[rX�b���W�rV����QC�`��X��'(��"MWWm����9�X��*X���g�,��5� �	$c�dU(����rY��:��������m��&�l�gZ>�]���b|�����W_F��`@Iiv�lb����3&b������bt�]i'To�g5V�`�5E�g.�49c�Y��6�8r@���O�����h�|��������Qq(�>����������D�(��IF�IW-N��D!J�a�#�F����������&�-��Rsn��_�JY���{Vn��p`T2�G��_Q$�-����k�;g���T+z��P��+`\\6�,�"	�}@��`���������GX���F��p�}����Q�1JF�� ��Ie�P�TC�q�r�*�_�b����-m�m=VP�m�f�g���[�X���������o&�8�ISJ;���
"���OS��^:����*%):�6������
==
��a��JFH�7T�&�NC���+k�JY����K�OX�?�6��SI�yJ��fE������A����`f�w$���3��������K�)�Y�&hz�O��[9�w
yI�>����e����!��C()��/g^������J�Y%��
�����7R*x�����B-.U$]��L@:\��\�3��Re7��J%)�&�%Nb���EJe�f�c�VR����k�	:�����
�G����Sg�y�����`��K��T�5��%�!�o��e�e	��_zX8�F�w�L��U=sK�4z�R��be\P�QQheH` �=����X��jMu�Qs�t�,��&��1��y����+��Q�z���O}U;��p0	�_��\�<�%9c�o5Zk���kb_=h��J�F7�pFu	���xS��&X9,��;]i}P�bF������Qt/��t�+sL7]8V�T���]��P����1
��������-��)J&�Z;�\X�����AJ.bz�3R�P���YG�HP�7z %����}�l�J;���`��c����ev�+)70������$��9jA�'B��>�|�T��_����& &(�����S9�/g-��,��%��� ]h�mXD�2�������W�&�a�f=��>�a�5���l��U����PE���vkE#O8E�h"C�9v������;q�~��
���zy���=2����/��>A�yGF\�jC:S�H���r2������g4�
�;�y`��u�U�G��r��f��J6���b�	�� ���.�Y���*-�9�[�N���Nt�������j
�������������*�^5�s(�S>�G:M���N����;�}2[8J��]:����_J�
�l�A��3
�uJ� ���ndNa&eP��S�������u��/o����J�gGU���qsUS��g��[T�p%TE=�HO���1��������gl&���������'���E��5l�+��vL��}���'��aH������M7XF���a\����6jI�	��
��\��-<	�HVm��k�U7)�H&P����?j��/,�@���{"����~��
"�VU�����(V��n��H@��X�6���%^�GY2���G���cih>�f��[YU��������Y�&)qB�{�����������>��a��8*>v���r�N�����E��T�� S�<�F�1N�7U�����3��n5D�jf�|W��B&JM��xYV:PX�n�t��oCp������aM�V6��Fz>���9�0�"7�As��`��$`TS9�������m���o�Z�M�r������j���@�	����!�p��Pd�HE��� 6��gR6�Gs�Y��(����Ko�h���{Gp��-P��������v���11N�&& J]���-��kkMr7Z��SG����n
T���)�NA��y��t[�S��0��	����iz:�i������b�E��V6:�5
p����d\�%�;�]�"I��rw��#\�e��1P���V���eR�e�m�^�4<5��	�x����;QNFE�F 7�fj�D��*j���ykms���m
J�~��2�Fn^QA~D�n��$M��������D�B��� Q6]��Dr��1��j��':JO_p�0��0���*{�
��C�h��8����2��ok����+e_(�
��u,�P��2����R�P �����D��n�����-����F@�G.j����B��)TLc��W/�*�s�SM%(n4��}O��+���L�:��lN�*�'�����jbjjjVFBe�IsF����(�LRr��E=���8�
��h;�h�Gi�y��XU5��4A����(��,�Vd&j(��\�y(L��v��������:@���mM���L-mLUT��vB^M95����xvL�d\&���d�����j&������Q��kK��<m��r��Ls$_���	����*a�{q�9�S����-*����(��P�S�p$@f
7�.Jb�0��Q.Blj.��[2^������7��V&��l]��2�������d�%]��QU��$R���1��
x�E5[�gJP6�RZt4�YJ�/��k$�����NmF�����U�-��P1�"%���w�O��l�����j�a��W�W
/eRD�iR���x���i r�2,�o��R����3iO���%z�Ou�^>���:�kTRzz`�.@����f$�H��FN��R~UX9N���/��t�*�*&���4�Z��[����+T�VN$��Z1M5��8������{_�;)�(]jJn�i�����]��a�EL�����3�D�}�K�a����,-94�z:��]���Sj!��J"���1��!���g��������'g���m�7BE/!�Ut�����z���wk�!?��L�HP"@���m��(�_o��E�������T��'����k��y$��X�b��Y0��gyf,k�]h>������iuntu��]�kjy�J�C8rB&x�L�:Y~|w���OT�R�LQ�]��TQ2�k���^BK<��2^X���*)�M�� �3�����'@����x�IG\
��_���B
H�Av���St���
H=M'f;�\"����6����oF��U������a�
��&��%B,�0�v��A]��D� h�9�ypg����"V
�cY�g��j�m�#��>�51nb:��;az���)�
��'|!�[G<P���+7����������N���wZ�UiMGRd�gEb��2���$a�Q����Y������g��SO�Y���f��V��5GU�.��N��j ����>L���f�L��f�%�������5j�����J=T^����e�����]��nB7H
�!���[�.��4i�cT7�z��=����5p�*
����l��j'T[#;A-��0�pK�
��Z�����b�[t�]H�!,�|��jm����H�!����D�	�"
����*.����%}�<���BB�T�N��}+N[�
6����]e�%P�E�Zf�@�62����7,���B4�CiR�����!,}����\����������HA��[�!��I'����������]�6;Rwv^�[��Z�����f$�C���%b�J�����@@����0p�S�Zy������[Ev��;Zz�&��4�ebZ��w�HV��]�������y����.7A�l�"�P����TVL(�
p0f">�4k�� 6�j=Kh*��\�:�W�*�����'�`Z��,�B���P��T�)D�o����5?��0�h�O��yZP6jJ�0����������J@�Q�`�����D���!�Q)�,j�Y�����qt�l��^��Rd������K�!��{�7Q��D��1D��S	2����p�U7*�����`~��������*���H���������
3����m���t�g+#�(j�
2�c�G��2��t���/�	@@�9��Qi�[�m
:�����U���6����M8�$���"��{DZ��*d��s-��q��?�
\���<k�	_i��r�4�%'����jds$��i�B�����M�	����a(@��H��z�\���MmMC�������.�r�"�I�y������G�L7����<�N��-[H�Q&��}��D\	j�7����F���9�w2�E����t����!�	�=`��WO����L�����k��������4��(�.��K�d��L����9
p1�YoS��s���)�n��v��(��$�2�QR�D�!9EP��R���sn+{}@���G+k��D���OV6��+�(�>B��l�C����k�Hr��(���2\&��&u���1�0�E%4�A,�UN�l�$ d�5Q�(������t�(�.���4�w+z3E��i�AA"`R�!Be��&���z���=sU��QW��^�������M'�Z-�*4z*7P�8���x2o,:b�DL��#���t�D��e�l����[O������[\�K�K;�� ������J�!��*��@� "l��fL��!.�|�@���$L��7w�he���@��dUxEA#7�1�a�`������-N�At�75:�2��U�0�
(v��6�QTH`(��{��-L�4�������Y�7P�n�I3���O��:jR�tr�e�"g!L`0���{��*R���(���e<���};$��$�H�Q7��7����(��.�_z�����m����V�F��L���G9�8� a)2i$~Ps�9m��$S"�5���!�)�^��9�=�[6��;�v��J��������WCS�$}��=�Y�
H�D�2�0��!.)����B��*�Hz����#����uICNF��4�dn� ��&!�`�j�������f�#�&��$��d����}!��:H����D1�5��uB�PPW�D�>��\$�A����E�z��pY L�H��i���Q07�3e�A�w�
m�<!��w���}X�nR����5iiJ|����\�/��E��$�d�UTG>�3�;���j�����i:�*���@��5�����h�b""JLN%�C0S�LQw�*x8�� ���><l���vG���PS5x@x80SL`09D�9N$�L�>�DCxD8@:�L�!�P�)�01AA���������S��57�nH��@(��c���>�2 %*��(��*QL�v�
��pb��_jBr��,�+tnma�J����1$p��*T��"F�#	�J�81H��'\�W����m7K��n}!���EH�q�Y�.EU�)�p0d"be�$��Eb�������
����\���JN�������S��.�2~��=	S�
%.�D�HE�Q���S�DT�F���R("�C=�"
+��Bw�D3��V@Om�C#Uj�W7��Y�����<���Y���!Lb��G,�2
�9����P�8�������7�.�s1M�`��}B������^����cU"�Fn�w��O�S�]B�Lr�ya�g��(��6�����lIV�(Ru��k���T�I4(5����i�r�f%�>���=\��H�J���*8��)��m�?G������+r.� ��"*�.e��
g4�z���i6�W��+IT:�J���Q��% �ar^AI�yed�!p�T�+�8� ��#��K���m=+r,$���?GF�v��Q������r���'*M�L�\�����q��{�;d��c��D��}^Q��?�,��n���]
�a�d,��nN���x�P@� �[MK7;b�Pt����)�(j"r1�F\�B"��!�a��=�w*��;�ht���n��Ogf��3���Ule����~���%Y5_}=����&�|#�X���-G3UUY�9NB��nU)#5�n�j(UDDb��`�k������O�mEj���"���^+�
)	O�T���=C�P8,�2�Q'-�
�:@/$B��v��LD!�)d��+x���Q�KiS:�qP1?����r*�n��;��L4�{jkK��^:.�#K�Hi��v���nbt*���j��e�&Nd�?lE<�eL��mr[�Ahj���o��t]���/*���WFQ,��i�RB"8�R6@�uTK�1�8��M%�V�����un����J�5��7�r�l��T�_�}$��9��%9�r����K������MS:
$����"��E0����� 2�M�@2�����0y
8kJ����]�cUS��6�
��0���|��J�g���[(*�c&]����6����cu�V�uKz�#j�B6�X��c��G�`+���G)��f�(��S����-D7��v�^�[�Y�d�H�Z	+�P�?.�$~�h��,^}WY-3����.�)k)n�����)e���&�U+��g�t���M
�yR�7~��/Q�������cgj�e������������$�n�GQ)�J UGU�f��V�}I\���� ������R���
��*�|���o��!��D��Bl�(����Gh@#����>����������8�>J��)g�1�i�B�7��vS����Q����D�"8����$S��X��Y�RS)OFR�k������FoM/��M��WE���&!;3���+CK_+���5�������)p���iF���!>��n�E�$9����7�+XT��b5�8*j~:�Vo�`m�YO�������A���G2j����4SYUR)T�sv�P�*��	Yj���*��t�*���
���i��Ye,���r�yarR����������>�-Y��v�U�q�����Y7/�^f�C"%Q��%�gn��������q�n�����2����2��P��Q�.Z���GH��GF9��M�id��E`2��)��8���n�a����m���Z��j�B�h1��3��(����/�2��\�(�S/����w��ju��wR���������!\QPk�r�v��j�fuW)�T0�s)7K���������[N����>�Z�kR��({AAS���x��*�A��Q��tT��2�*���1�wT�#��r`����@s�2��ow`�E]�'�i{��JU���]gP~I���u]0p�����
"�@�;Y6�r@��)wqf�Du�a�4�ot�CV���4�k�p��{�X�E��R�p��Dn��3I3�*R&�J"P�]�E���������Q�n�,�c�j����x�
���7NC�QY0��'�Hr�5;bld5}��t#(*v��P���S(>8v������
���#�[�6��������^�-O];m*����)��d����1@�cL(-�e���U�ko�I_}e�v���z��v�D�lkuo#
�����n�u���*+	��Q�%I��L+!�^�z��gda[�BS	#o�����K*�NA$�tX�.�"�D�'
����?o[�j������j��EN��P1�5<�V��M�;�'�NBm���J
�A@�*bC��n�4��
'[TE��)[my4�\��D�AC�����5���\�
�1
����L30�u�z+�f]%Y�IW�VGC�k�������*d���r������1�2f��H�*�������E5U1t�L��C���@\���
Y���Q���I�f��+�t���)I�UQC����,V�-�!��ARV�JN��6/O��wkZL@-��
�UL\&�2�.��B��1(���l��7���,���4�H���
%	PD?�f��qDVH��S�J8���b%g��)���!���_�M+������)Pf�@w�b��G
b�JX���I�J��=����S� ������!��8"�4�� g��M�p�D���,�<~	�n*8U4��I�EU�TLsO2�' �flU���y��4���(����	P�(���M��v��1d�T ���	{��X�L�M��A0����e�Dr��2����&&�#�
���r��E����<���;.m���Ze���*J��3S����)xef�G����Hu��$��SN=�-6���>V�����eZ�3�R{-�)71'j��r�5�[�� B;���m�R�z[�X��`h
Y�]Q�#�GU�c���QU�"������9�R����8j�l���s����L�ee �&N ���}�'�6Y`��ID����T!�9fB��h�6�J�D��n��j���v��v���_Q��QOd�'�V��b���w"d9C�9
�8Y���RAU��EK��H3X�B�#��+oM������O�^T	���]����8�
r!Ye�2;�L��*'6�A�|6STt�/C�^�E*���\�R���UD�JA��N�S�(
�x"'L�7�<�p8�1vf��fc��+9�:����z���� )�S������r2���sE�~����6b;1O�r�M����}Kl�ZZz�f�C����0�E!(�M�����1�J�r�wM�Y@v�'�I�����
�r(��{�L�>��2�����7)HE�PX�*�0*f�� ��q���'|&��~�`���s�X9LA
�!����6����C�y$��M�kwO���aE�U��L��#�F��<��8��\��U���UD�[^���m])P��#T54"GM�D�o�`f9R��Tq}\C�P��C�,�j�@�g�N�I�9���(�p2f��8)�$��w��R(��=��a	�LUD
#�b[�j-�N�������r�c�����������r_�:��cny�#��7�(ER��(�e@�fLJ`0�p�e�������R���k�v���N%���9�Q�jqw��T���tO�%�";�
��S$��K��Ha�`�#���#������������*�������.�����'�Wq�l�L��u�T��#�Z_jm�
��sk���gJL"w��R*�!KI�����gSp�a n�Hs���:����J�_MH���$'�j�e��Yvr�5MD�	Dc���@��+��7(
x,�����~t�M����3pu�XP��t��6�bK�JG�EZ�]�L�rR�����$>�l���>�L�����o��IL]O�ce����V�Hf]5U`=9��
p������ �>���������P��
%�����`VO�3s **��m�*T�!�HQL��9��f���QPQ(*�j���$��L�"s��"�2�@{�pf6�i�cNV�s�HV!z&jY8%#cY�@�m���ER�L�P�2G0��9@
PSV�*�����op�i�X��V*6��\GC��������1���K�q��.�=�Z�k��n5s	�Kt.�:�����j#IGD�N�K�T�<�f�;:Q�M0*��������N��{]i��T��f���V���0�F��Q���x�X�����a���?����L��*���D7��n�y5]2���33(3��eq���V��j������"��r��-�������q�����V6�������I�����gR��G2K�g+d���"Y	DM�d����#�������qn�>��e���T��e�>vw�3Wj���;������&E/(��_����.{��DG-�'XY�`dt����k���n���=a��[��R�<l��u�b���I��B��� P��F���_L����a\Q����������D$��"�YtD�5R0�c��bC���e��r���][����
$p�o16��X#������I,���1�� �a\�kNtm����nU+[V7���mMI�Hj^�zr�J1��ZY�)����Sa�ro��*��4`S����J�%��F���5YL<��C�<�<�R4r�����t��jr	�]�,v��)F���<
���5�aP5y�|��d���UT�pL�*��QdQ(�����c�`��6]�
��a��3��-�l��\P��Q!�?~����
���B6l����T��G���+����PJ�m��Yd����c�q>bc�3�������T;�PwVT�u2��d���dq�D�M� \�s���3�������0�T�Ja*[��l0����s/{��-�o�8T�u2�J��}�T;�oD��wh��d9yNE#���3��G)Hb��\���~��uD�9H�
����}�f ����)w��'0s}���v�@�s�C�`���N]�.��
���&�rn7	��H�SLQ�"����2�9�U�/*l��i� �s�2�]����&B��D��P��D���sfl�;�9�#��P�����7}�@�T0�m���G�0
(\�{����{���w�6f9�7����w}M��1���������{���<��������}�(������
�M��xT@�~L#��t���yx7��0�D�\�,�&���ANU3	��D��r�xG&��J��T�e#�uN	��1�Lm��f#�?]���������4�s$ie�R2�m^��VI�0�bq(�����$�P�Q�]
K�s�Y�K���<���Ur�,�������#�QC�&[w	��N��q��{gP|9�3�akw��](��7������!
�������N��MOnm%��v����=�B��WNS5#�W����`ESKEA&����5E�9�s6��
G]Z������ADWu�u���]d��U��^	R0��8]�-YC������Y�>�N��L��>��������*���u��EK@J�]S�����tF��0dC��.M��<�����r%�	|oL]�r�]�m$3L��F�r�JS�1rL�7�nf4i��?�5}�oASi�
{M�����*������Y
����h���Sr�j���*D1�K�5��}��)��#-�����7�]dI).��j:rPc�ET�b�939��gM�e������d}ka��JR�5xih����ZF��"j��y*	���F�e�0]z:�eo{������%�����Q@���a6f�����j����V��q�T���[$p#8B7���������|��s�}�M��B3Q�>��W�jb��nt�c���5�J�]��o����V�(���c�S��T]�:��o�9K��m=����UMe�P�U�>Z�6�S�=%��	�	7����H\����w����n%����T�+5�N�0��b|;K�
�g2��b�k���S�b�
����������r�E
�H�	�����a`$���e���d�9cb�5������r9�]�E����:����Y�
����7bY���U���V����&�H�*U�o�����A&f�;A-���}�WO����Y{Z�6�k��F�W��Q���ev�qp�i�DK�YMWn�2JU7"�[:��]='S�
$�J]��m�]��+��9o}K�����tj;yq�Q9HVPn�;� f)%#��]�C��K����s�B�I��o�OX����:'s>**�M5��b�i�7��>��t-�(�w�MS
`	���BO�.�t����Lp7��\}!��]���(�t��6��cJ��}�C5H]��5�&Pv����^�i��m_M�V�H�f���]I^[i{% ��
�Ey���H.�4YH�8�$@P.4)G���V���W\��E������n��(4���$���K0nt�`���K����V�O����zj���cW����y�2��)�U�s�Z�1"�*��@��D�yL��de7�*���coy���;<�Gn�c�vv�h�kNf�j����Z������M?=O�����e�)��@��)�d8J���YS�"�������W:�������bg��6�>19#zzd�*L���R���i�O�i����7���k�"WJ��
1YD����[��u�%1pa!\.���UT"(&Sr%>E�h�>���Q��RVZ�����[���V1����"@G��S+��Y�R�F��@p��9G�����
��M�������j�iN�������J��r��?z�T��
b����	CjJ��n�tsuiJ�RD��s\�R��N���+�QsO�EQQ�Z��M��s7i�g���������;k�WX^�������(V�L$%Q*�I4J�d.���Ryw�
�����Q��?�
�"b�L���A���;r������
�������6���6`�!9����:�"EQB��T2E.a�f��1��d*�
���E2���T�&�;��� Nr����1�(������2���v`cNT�L
����r�$�h�
��6l�g�|c}��6c����������Stvg�d��8���0e��{@6�""��tE>K�"�[?�B\�1�DD��n�=����@m���a��w<
`P���0AC�o
��3���@D��	����<�Jl�g�]�s�{���sX��>�`���\��0�YC1��D��DL;DDv��o�)�&�0M�R���G�m���cL�����E�� ��&�� �{t�A�A��fa�-�(=�����L`��nE�<�g�X���@��Jn�r�C-�pc<���m��3�0��fC���R���@G1�6c��	�iO��rT	�U�8;����)�u7G3�y���J0��3����&�9��m���T
�Sp,��,���f����b�	7���{���2��	�Wq2����
]��S�����#���T�J�b���,�D�OD�|�`��>���YC���(��#��D���T�P���o��1�������HL&0�DL�x2(���DNP�L���@1�R��1@@�(�9wpP�0!�Bt�R)��!J �w;���8��i�DG1�c���=�o��
�o��t@�)��"]��b���@?$R��x�� M�	�9��P�L�9���"
�
��2�c�LQ6`P�
�w�n��e
pP;�DC�D��r���
������x!��e9r����{�"""m���S��~�(~�������cgza1�P)Hq0��@6�g������M�wN#�S(m��
�"#���9CcJR	L��#�Q�����%�	D�����`)��1EC3C��3m�7��m��Gh��A��
�
��w1�v���t�J.�if��FB$U�!jZ��?T����TH�9tP��@Jm����9a(���1]��AT��R���Y4��k�v��w�vc�t�m������`��6����ZB��O6`����S���N��f�d��c��L3!��lS�������V�\�:�X�[�������q��gX�M$����dFD$
�DH� Cu<��_�r����\j�z�^mB���.���/���	��M��PT|��`�rG�\�@rbq[�� k��S���8n������`��c}�[���C��d"������l����$��$�G�r��_��#v���o�?mn��yR�����86p��5)���rFLD� G����Yn���]]}K�;	o.��f��yqA\�O��C�[�Dy5J�&����j����'9�-����3�]5�����!t����d���Pb�����ml"*	���T��G-Z��B�@
�v�YZ����G[{{�dnm�����/m�Em^��
����0�H���B�H�����N��5�AT�AJ�`�H�3�=�"""a�h��e�M	#Q��Z���h�bR�z�y
7�x:t�����L"�|��L�Q��M�0�b�h��h������;I������7��v�T��,t)�eb2P�&Ul�0(o0 j��?k�h55B�U�h�s��Z�������p�5F���t�g+��_
o�!��+(C,�.�����u0��k\�S�Nbi+�>��!Cr��2	���7)\�;���|��F�4���w������6������J��,|M����R�����x��)��r	�2�9�b$%6�jZ�\z��<K���Z��rJ��:YgN�*=��V�2����8.�&q(�����i
%���M�����mmt�E7����U����-`���	�_���3�+.�t�������%��Uo(��l"I"�i	B��b�����x;�R���7^�Mo.�%�
N��Xw��4z1���\�4r��(��4m����r�}C&�QZ����s�.�[��g��`���)�n��ent���+c�^�rZ�\����[�
r�\*�D��OR_��UU�������),��r(&C��L��|�c��x�WWW�����k���RT�WG_gK�f���,�e�@��") ��&b�aL���){&'tkx�������U�@�ii�OI��4��^�A�����l�Q/���e�����{���*�.�P�e��E�����L�o��4�P��"�"��3�j��������t�uE�G2dQ�r`/y��
���}�������=/6�'/����	pa���ei���8��1�_��`$x��(b�"]��� q��u�q�|H����5��_
�������d*�k;k��c%&(z[���#�0 �b��4���^����-'�-,U�?�:���`.���1�.v������/�(�W	�E4@���9.P��ri��S�
-��8�@k&,c��U�4�����(�P�I�!�����[��Q)���Qk�Q�L��h�L��l5��V4�+�y$QZ��\9o���"��vC�C%N�r;]c�=M\+<����?v/M�fU�QGF������:g"��D�<;c�L6BS�OD�P7+Q���m9O�:���Nb�6��I��#%���pLH��L��a.�bD��2�cfb��a��G�8���ALD
�I�m e�v�����=�����@E.�a����>�GPw�s� M�.�&'	C�@�9p��/,P��D�c�!�%�ow,��S 9�
����`1T�Wxs.]�s���@F6b'�����
��a�2�����H Q �9� !�����}���7(*�
�(�{����f!\��������`0����b	�L)rb""%	�0��'8����7�wD6�������)��r��$1�da!�C0�6�}��r3L��;�2��9�� =���`
pK|�r 	�-��!���L)JR�C��f&�2Y��Dr�6����:�)�Gt���0�7��=�Yl�7(�bQ�y����~P��-��,�`}���U@�&��!)�Q(��}�����6�w��*S	H"U2��2n�������"!�`b�d_���"���|9�y�r��8�P@��	JCo��l�o���#�b9�����sm�����kCR��
f�Q�����Mrh�0r���86�ER1@�������;K?ck���o/?hk���$��pR���bQIu
Rr��)n��;��pEuA�E�����D��@9fl�r�fy�F��z%���I(��F3Q��C#d&����b���:1���O?��[L.5
��c1ji��W��t<bs���G	�A��'�J�Lo���~��j�*�������f�U��D���! ������&�#�@9���F��mYx5���U�A�[6���%�\
�G���@PHc�D��V�-�R�W�|��h%���:�DR"��!��������N�{5����diP��e��t���S����MU�����0�Y��u&-�ah���f�26���B:���8*�S��AAb��)s)�<�eZ�RISEH,yC�y�p&�����1������2�	�6�-����GZXd��&�����'U7�D3��.
�HO��Lr�J���J������k
�
4�)�4*UD�>���	sH���c�g�	U��%)3��T�@1�G#�w3�?l0������B�@�U	��`P��@�9��	D{������jZ.��m=KU��T�I�3yzf<�$����T�0!�!�<�S�^�.�:�LzU��j
���������|�1�����l�s*�$E2��n�Eq�TT��_����������u��2�9��(����p���n\�PPC +�4J�����J�^��sij}�7�L3h�+���d��@�sw�U7Jb��b�;�*+�%u��|��!)�����Z��oTR�9Yg�`�� rS�L�&O@�����Y-���v���Ed�h����w�����r�`���L�����7D�NL��q��f�CJ:�
��2��*��_���4�)��X�H�VO~`��1VAD
���q`�3��Q�%�}c��;�N����K�Y�oi��* ��Nc��|���L$�����-G�6[T�X�/��k��l��SWQ�q"g��F"����M��AV�I���p�R�j�k�Zk>�St�����,�T0�s$��V+�b��N9��eJ�d"�(�SSZe���w>F����Ukt����5&� X�+�b���nPw��S��BZ[Qv���v���WZfU�8��Jv�0zLB)�]�&�@�P�!C� ��H�X����<H������S2��X17� �����I�d����F��uQ����DO����g+�U�q�$/�:iH�z!�%8�`��vVV���Ws����T�:h���ETZ��������]=5B�S
�!Q)��og'hv�GT0O�&�X��H���2�2���������9�MF0]��
�n�yB�����$KQ��"�T�j���vu��7�,Z����I��%��A�m�5!�!�B���d���`�������(��#YM�\"��%L�E��&�)\�yC	�r���}�T���
>�����Z5���|*PJ?A��P�AC2��r��KBWz2�0��h��H]��}���u�k�BE#��U��R�(
��f,����j:�Z9sF��S*�qu���|�NR��G�j��6]��y��SL�)�&p����%��C��n�4�E��tM�R�oXQUu�o��R��q�p���Dx��3L�e5��VP�����S���������?��W]��.N	����{�1���������Y�z���F�i���:*����k'\*����E��A�&al�#���Nl�
B_
��R��������h�:m����k�*���I���%H����?'��
��9�;������P���R�7�r����f�5�P��x�����k�DY��)�TtnN��.�9)�����.A�F��i��;Spm=��o���S�NN�R
\6�����
�%#��F�:B'�1v�t��][�>���O4�iJ���=�qA[U"�x���{F�+"�v��uwg|����s$R�u2���iKY�YK����jb��v��-���[%����]��h�6�9��:2�r�Sd7�T}�Z�CH,uZ���-m��j��COWB*�B��b�d�
v�JP��N�1�
e�z�^�s��8�Y*�
��k�U��;IK�%>����,s
���0(Z��-������o�����e�g����1Wf��%Z��PHp.}�c��c��)��Hc��0}�\c��J�����Z�8��MS:s��&�13E�;��p�I��{L#�����m���+p���#y�;(��<�)����p�J���
��)�[��|@C{��iF��tF���
��bR�sO�����
�-S�N"���dC	�2@%P�(��a�ZP���)K�GTp���-G��o�6�����R��P\�0���1�]WEKT�5{w���R�*E�0zmz���J��Y��i�-�D�����3�
 D���"��J =�����t@xG��.��.�i�;_�J[����a&���b�f���VL[�-��R��QU�9	����c�F�*f�2���T dd���	��l�#��)DL`)wJ
����C�!H"Rl�f-of(Z�I-��l��v
6�Afe���B�]�r����.U��0��St�'(1R��@TH2X{����2�9�P*[��f��DJc�&c�JQ)�����	����rg(��Q��	���;C<�r0�1v�J;J =����yt����/_R��������]MV����Q�s���O���P�@L  4
mY[�k]V���
C?m�m�MQR�lH�J��v��U��8�5E$���"B
E�9b���	26e6�e���V�"�*���iY��Yir�����ZVE$S)�w�4�	� �,�MOh�W����w����������J�����BOL�Y5Y6JE�Dt�������#��7V��jr�b�D��UjU&�9��Qn���N
��[����6A�������i��_K�N��+��Tn��QM� ��������n�N��)�9��V�b"�W7�B�bG-���`��oR�2����1\�&��@����@Gz}����s��MS��Gh��!����IS7��H��Sq���M��G{f{�GW������g6����6�,��o�
8�3)7�.\�7�x1x�:T�sV����X7�R��Z]�K���Sa�9�c5V��-��y�*�����&X��,�4�HR!�e0�b}��L p��,���j��n��R��4�E�C���$��n�|�y3l�p�.!���PUV�"���'(
��|D7�������
��9A@t�s:�Q��C`���!�0`9�Yf��}���uj.T#j���T��%XA8 ,��)vfn�3&#�Q��r�!�b�CD��������S�mSj�������&�+PS��E�"g.h$D�@U��|���/.������ror@�����XD��y^Ve���`Uc	H����;)�����3EWt����1��X�Av�.TP���
��U>�� ��m(���]J���Te�y���z�N�$ki�j�������j�C��!�:��AOt����H:��{U4�s���mH<���5`A�Y����8��DS���}�N��0%��%���?�!���Z��q����{$��+`��{��*�d����g!�)�7�.���{�Q�.u��������5��� ���Na�AV�|��*��(��6��wGZ���v���D�O��;�k�]������&SSpI,��QU��.S}���@�����%\��V���+����AE����j*��Z��~��r���r�P���R��rI�1sX�(�V���MI��\�!H4�:�ZAuE���I4�`D��N$t.�f]�-c-��I5wL�T-W'
����F	�$V*�-	�s�1�J"9�+��(
�B}�:�H�r� S����;��n�Z������V�I���k��y)Wvn���sq��5����u����r�5�b���|��
�e�/�r��j��=������V5�;Z~ZB9qO8t�� ���*�V���c�M��W���5�*��j*�����-,�1v��x.i1D��T	��0��T)N]B�Z��g��f���o�����R�����R1;�T�2�w+2u�\�r�2)S���Bk��.z�am��V��|�ZZ���x
Q��Q�h���D�s���)t�
���h�:���J5jP�^)(�d�f]�r�LUf9	�3�������gG���j�i*�����V������Y22L�"��S1�C-9j�����]��S��n�����\�B��U�W+4T�U�[�Y��D�B�������F��6���n-���z�Z�kp��m\	�R��]3�E�UZ�D���0�u�~�5'J�^��d�fF�e�glm�5M���W���9P�RX��U��DH���c��.-Iz�.��Z���]mZP��b�����k��~��|�\nSl���"��7Q?���������E�N���Y�h�*i����.�%
��'��I�b��������I��5El�0�Y�"U^�;?L)DC|�D�]��p
���M��ww�_���#iU���*@�8f����R7!U`8�b�CnO�t-�R�_]*�h{�cj�Jl��z�V��c]�+#�g�.R�Rr��D7�<��v��cX
�}���5ei�Z����*����Y��3���� ����g
��H�������5��d�Vz��|����Z�u�>�tZ�Z�nS�������(sd8�w'�K^���j��-{,���J������uW�V���]B�Y�B��	8*J(t���
C����V�cF�'L�(��P��<�\��������A��N)���!��B��/hN�Ks�VQ���4�~����^��1��b�`����1�.t�4�;�R���M��	�%L�w�q�
�����x�@>�YjQU�

�Q$�������\�����DyW��, �V���8�pn�~����;��#����l\6-.���B�oH���,�L���!�tD3.F��T}u7�K�E����5�2��I��*�N��L��+�� d�S&&�qD�~�8:�
��?"Y��f�+w;p
�R���P(;TA�jf
���s����Zr���5u+[E��q)'�LA���J?4��O��L"]� �=����c	I�	
Q2����w�;��x~�/�����K[��Q��3�zY���"@���0`��rM]�yM�C��s1��b�L�T���FLL �������� ����2*`Rf!�`8�x��p�(w�b��q��	qq�0�����,
9|OuB�U��)�4n�x2�k ����&�k����@�`$c��yB����5������9����0���r(����b#�"M�*�of��'�qP�8{�@�9�2:�cn�
9��Cnb 9��,��������>��OY5=-9-MTPZz�����o�����eN���=l%:j� !�;n;
��q�K�@]��zl�91w��w%:wuI^E����P1�HdV���O0
�c���[MNj6��:���
sP���L���m]O�"*�q�����<Vp��6�ri�wR+�&�T-�lb��b���.����C`[sTVV�h�����'i�On���Zr���T���X�D? �7��7���qd[�K��E2�b�4��I��WVV�c�4&N%��t���U2����Y�@4���������+e�VL��R�b.N��4���=�F@���Ds6���*��U9�*��3o�e�����Ce��T�@>@`�xh��8�P"��E�/���ew�C��Y�[��"$LL�S��s��1��5�;��9��z>vr�igE3��a[���\���t�)��[��D�y"�d&��N��62��?Q�kUL�X��7Wo�/�
VPN]���OQ*��V9�Q�����a�5j�[���Z�)k�����T5���h
���S�4�R��$���9@�HyC9DS){��ME\�����Z�Q:�g(6�bn"A�4�R��Sn��1+�b-��1���u����p���!n�)�E�����v���#*9��xd(�����I�#W@d�*���j���M!�h;D��S���Z<ozZid�N�2fFDL��ll��!���'9LR���w
�y2G$������}D"a��	@���0����1�{��L@��.H������g��@�b�`L����x8?�w��wt�m���9EM��v��`Q088(�r�P�& `�V"� r���8yA�)NSPpJ8*E]Xx���	e��L��K�s�@��X(�J;�$��#��b%@s.�r��f#�3���Yd A(�e�	3�xY��(dSdb��6x����!!���%��;�#��g��g00���D	���Y ���m0n�LJvd%.@ ��8�������������1�j�r�@yP)D���� �r�9���T��f�8��(����f
���7��g���;�\���;�l�=����c�0S�|�so��*��J9�C��9���S)���0��)�e
�so�!.b"=��{�2�G��o�Y{!7zs�9�hw����������`.���������R�S(�u#�G1��3����>b ;� "�zQ�Cf���v�@��(����P6[���[6d0���/D��!D2(e��>�������M��GxGa����6��p`���BS#	N��l�=����6F�6`'6����;3
��f7T((]���S��;�{haBL%T��@�1�HT��J9�Y��r�g�P�L@��� l�@��o�����J c���H{����yA���!�>��{H$0�r���������7J&�� dP�Cfy���MS����z����"e0A9���M���w U���M���R�B;���U���W�kh"j*���Z��B!Y&Pt\e����M����f��Q Ja8�f��� �i���t�U{1������������0��R;�77�L�� 7J�%�0�����,����o(���Q�]Jn��f�j�G9�3����U
Q7��M��<��g�h�Z~��r\��*jv*�K����WGW#���M���r!C��1C"�p6�dH�������
Rd&������G1�-���#�mU<��3}XT�`��3�KJ������F�����a8��v�T��
A��!��nN��M���b���0��,�2!"���}UU8	� &N#������WVr����N��"���$�5^Ul��>�Z�VJ ���9�TWr��9���M��4��^���h��������YT��]���)����r�~���:t��7,��	L���;D��Q����%���Qd���W��M�������1�u�U��R�z
E�W�p��&7!�9���n�n�����AT������2���+�V���Zr��t�C�y9=	&����� ��0�6�u�{k��ZZn��6�H��#�D�h��*{�]�*Ep�}��*��&�2���@���s����c�1��������qA�5W�����*JfQ�4�[���(,�M���&0��3�r������
������T\\������BU���u*�
�t���]��
q"��|
�F����"����Eu��u���7
������cT����Q�]
HC(r�wJ]I��"��+���Q�Q��vU'L
;��#��1��>�M���kV��k�X�7n�
;li
M���v�T����v,��09��7�)297{,�B��e][��[���ba*�h���&���za�"����@r�0�c�����Z,�VX�j�oT,�����wL�+�R�����v�$�i4*���T�ET�b��9�&�y�@��PJM1d'���m�}����,�i-��f���*�~�-K8L9C�)S�|m������_k��^����I����*H�r+\{���;���Z� �-��]��r���V~��
ck,4����(�lF��T4��q#��VD�U�$�3��@�r��P����RZ��JgZZ��o�������e
r�������E��oC$�����$Q��6�� )	��o�2����V]{�OVU4{����j�������VU!T�8pw5�g�=B��]�=�Z"���]��5�>���������R2�n�K�����*$�.�;�zf����
AV�zw��CH���$��5z���e���s����;��3��R
��B)�6��1�.��D���@wve��Y�{r�3�6a��9��	���gs0��SC�r�RB�r@_K�#��#�@9`xD�c�xw��a�2��Xt��t�5|�H=l�7v�g(;!�r�Hp0{�B �  �a
�D���1q��pV��2+$��T�����H�D��J�&`e&9�D3�DDq�8y��r77{���B2(�	vwS�	������g�9�|���c�b;����7y��p���g�9��;D3�c��	������a�h���;�!��}��l	@p�����=����&
�*b<��'���#�~�w��L ���g�wV���v��w��X�O��3��H��'|��6b��`m�M���)�>����R�;�������g�,	@��&1�C�bem�**'��D{�0s,s�,���.�c�>�c�"�m����P��p�@��@L�s<9�m�Lg��w=�����n���1�������a6c�S�,�o��Y�������9�%�1�U�"S(�t3���{2���D?m��l�!�����8��L u|�#�e�������s2�n�=��9��M�����C	�La��"��"#�G����{���J@��v@=���{9��0"�1�`)� �G �"""#�.��f]��D�8����F�#l�}���@� ����492 �l)2��P6b�r���1��9�a�Y�/Ds�@=�K�A�����c�>���H�#:
/�������(�"��U�����.�L���r�~���#�Sn�9=Qi���v��E���L�����\�3���je�T�3�b�yr��Le3H�%����2i!^��N�d�Lr���GU3�Y�-�3�
u��7�wx�����yVe-f�C�&��u)&�B���t���<�;����@u��q2g� ������*���/UzG����u9NH��~���V���k���R�0E����UUHM����s.K(�@�6���LT���7r.��1��*����.nz�_�����ru,��Z2
��i�kL�4��|�}��Y�������*�\�7K���5��ek�D��]55*��f�,TD���c(Q:����s�Q������7�i����cS��[SYIQ5�����:5���rEF�J-R�$@@�)��jv���\���
f^���u��t!,�)8��PdL��q��$�]��>|�������&�jI�����*��"��deh�%��~���EV� ��:%b�e�4a�
}n]O��w��v��m+QJ<�W��������������r�eh�Z(��e
��8����,�w	�:���b,U/����M�9��.�(:1fi����g��
��|r��,�I�)��b;��K��#�����<;DG����92D�DN$(�s��=��xC0����'P8�"���������H��kR03'R�5pt�P���O>�s
��.)z�X�M�Z
����S�*J��\��x���*��K��)N!����h��T�Un�iJ����YB0������].�i95O��Q/LP�-��.Y�SR�.f)T�����DY�r�Udu�nc�T2dW{�S!0p���P�������\^�J���c
��5��7i2e�"�l��n�[Ls�P��#m�ks*[g	n��3v��-�]��i�����	�\�S�����@.����z��:|��'
�7��BZV�[�	)+kY���v����X��@��n�� ��a
���dxq��k�P���s�;����;�/�S)S������HR�JR�]�cY�rXmDV�`�����X��OF�t�Eme�t��;+H� �PJ��dpR�>�L:������xk}h�� �����|��UO��2�4l��U����v&1�A M��w��2����5�j�T������EoL^����T���#����������� U@�	�C�V���Go�7u-���10�f�*��G'
MK8|"b��HG��<9�"�ZZa���������:��[��J�
����
	\�3����fD�+uRQ,��aw_�w�R�UU���d$.��L���TF=�&R��n�q2��������(<��0����=���{�mBR�V��2M�C����6�@9f3�Q���z�P)�]1.�dQ���]���}�Y!om6���+���R�S������T��7
x���<���������*����,T��Z�}=1P���
�EJ.�u�K,DN�Jq��Dr��
B�T�c��M>'l���$��~U�:�%t
�B�e��f�
�D�C��*�U6��[w���eIBSqn)��PRM�eQ�8DN�l��rq�P7za�&����9��yB�$9H<�s�{ �v����h��;�TI��������<����e���r�O����"�A������5��ld=8���Hr����������Pno�8�&��CL0Qw�������e4M?���h@�)gpp�`���$LDh��
�����{�"8����5]}u��f�����\\���7B.�df���#��A2�(��-?~�TYC���3BZ��Z��l�Z��[�z���
���F**Uq��@�	*�_�Y�{�aS#�1������;�X��j���J��4������������.���(G�`%j�<=�u2V�����K[D.�����z����+qp����Z��fD�m ����a	��(d!�'&BSwp�M����%�)���!����#�(�{x�����y3w�0��6yo�����=�"�e��c20&l��D��nn��e�������rf��)LC�@?g�����C�x?t1�������IULP����5$����NNZ �r��t���5<(��%.��r�6Pqu����w�;RR�6�d�n�
Y*X[�(�`$*�������)�0/{�U�\�SZ��;aIo�7T��d��o�{"b
��L����������v�����.RQN�neG��r�K;h��@�	�����1I�N��*+�O��%aS�����FNH��U�j���"D#`2h$%.g��8�U��n�[@%���O�F�)������@,���&����UDH'2�����4��n�}Ecom�b�3^~H��0�v����(��g"��'|d�p8���0�@��� ��������s�f/�iCK�PHT�����1��^�f�JQ���o6UAwP""��e�p���_Zu��w�=I�m���D-7K\zz����+���j��L�JC��"��>��wJ8�=	���q%���RJ���hi����������2;�������&�M�&)6LH� #jt��]��i��\��Ku4���)K�q)��#�������`g���&o��(D�%�����eP�x�U�S��>-��	�����Fp���4�L�r��a.D�[�mj��hwQw>����L,%mA�8H#oE9�(J�@l/��D��9B	s �3o4������'[����6�M�3J�>�5M�QH��&T�"@!�#����2�Gf@&�_lq������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������C�x?t1������Cf�5H+U[��h�G��"'����J�"��e�I�
nd�N%�7ws�vZ���k:�i��K�4�VI5sX�jD^���;(���+���	i�DNb��CL$��ko��1shK�G��cQ�X��Q���{4e!�4�C"ctGww`��cp*Y
��Zz&����1���������vR)����2��T��fM�Av���KC�,���cj!�"��*�����8������f���U\N~S�
��~uw����IG�(����$�J"A���<v�i�����1��������-���!1��$*����9r�Hq1Ne7C;��1x�X
V����hk�	���^�"�q���9=u��(U�$������n����J����cJv�j^�"�B�B�4yZHSt���6;'&:����:����\!��z��7����^���������<���U
r��Wn��!�n��H�7�*E���b��&��6��K�X�W�>�ST�uC-Z�nfj�aQ�
�����d��U�!�4Gz�
r�{i���������$t�mF\X#�B�]��3����w��4�
�1�t�=i���US��� b��ZuiOD����M��H���E��k���2{�&�t�.�K��on2��Q�80���C�x?t1�����YBl���nc�
��"�������~���)���C�
o�Q:�����0��3�����i����J$IY�u4��r�2*GAT��Sb P�J�2�����Z��Q���H"#�=�|1�i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#����I�2��&c�;P�$l��*+Q�L~����������+d���H�h��oF���c-��81����^S�DDKs�J&7�c�Z48�so��`@��}��DD?��@�?q%������C��E�0)Jm�H�V�#g��d���!� ����v�v�/�"`#��g�L�o��I�E���(�`fl�"ajOi��`�9����}����H��9S������"�����
���cyJ@L?�8�	���^��o���!1��N���P@6)�����J�2PCD�R�����aS}<��1�DJ��@A�K�2:�
t-�*M5AR����@3�L9����v��9�d��KTR���	�h�6�v�y�G����^Q�'s�)����
4�?�������J�4�2�u�RIe�"y@����s����]�'
��6��^�7�I� ���9�c���}�fdn��c���>�?�'����j�G���{L�J���~.���������>���,�����4~?�'����j�G���{L�J���~?�'����j�G���{L�J���~?�'����j�G���{L�J���~?�'����j�G���{L�J���~?�'����j�G���{L�J���~2�����u-����E�>�C�/���=��KZ�l(�������/�����!{R�K�,�]Ke�g�IE�=��_������-�t��[C?�����R;L���������X�����g��N�og���X��R;L�{�R�����������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*��������/������I�2�*�����������t���wv�(���8���"����Z����(��l�I�/�����b>�tY��m�L�.�?�;_����>�c��{K�Jv���
���^%�];g�g��,���2��v�w������8������e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#�L�R�L��oWV��0��q%%��o����������[�j7�9�ECQ�l��6�`�n�~���C�M�����DH�L��9�b����=�	M���`%o���6����8�Q�87
m�d��R�K{��j ��6�#F����&?cfX��+��C@��!L�(� ��@7L;L#�vd	��3���1������1O���s�"t���$0�m�P�+����~��
���T��`��8�@G<%���` |����B��P
�EZ$S��f#����y����@�����L���q2�1y�N�l�R�M������L�2�������P1r�
Kv���,����V�Y�sT��pC)E��r����<"a��I�-�K�-��Y�Yb������8�l���H�2(���:���f9���Ll����1�i=�_�[U�?���e�U�_#��i=�_�[U�?���e�U�_#�q���v�@R�e����l]Yz/��B���+_�����A5��HH������bn@Cx�!s8�"`&0&���Nm���8�Y�xDr���JC[Z���Q�x6�,E����0zq�<�GT�����&R��8�O=������VS��S�z���;�)
>���1�h����i����]�`��!��h����i����]�`��!�%�������Nr�KrE@��B� bxG������r�G�2���!oM�)@��1���>A�7�m�0�����:�s�^kvr��L��E1)�D����r��;Q�L
(�J7����m��M'Y�A/n��nw���2���#��L9�<";G�;P�J�?*_I�v��b�����b�������n�.���l�d�]�b���}����c&r���BR��p��=�'��y-��~���F2�>��1LE_�r�����2��Z"!��T1����������7���=�H�m rQ;���s��]���"c�'QC^{xu��@��="���[��&�����i�N0'z�
�
&�f��MN�^������L/5�H pN��!�D7�6���1�G�3(��%��1�e r4a@@`o�\"#�@�H�0/o��S �r��D}��E�F�.���m���G3Q;Go6v�v�e�&������q�h���E�5�j��{CH`Jn�~�`��^�g��3�~�����dC~�KE��X��~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~����������C�%���/�	���P���jGi�C��m���:,��������K����� ��F���m�G�1)��vm���r0Q!�6v�v��;��w��3��$r�8q��R;L������9>�F
$1�v�v�om��w��H=�����n?����d�������m�G�.��0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~�������G�.�0[O����~������������i�#���_���n��>_�aD��x1�h����w��
�e r�C���c��!.��>^�G���s�j7i��5���g��l�J�30{!u���tV3/jGi��sz��P����c���K����h_��D������?��m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C����K�L��>?�����m>C�}>���K�|�-�Y#���(��Q�gx�s��DD7;Q{K����v�0PG�L	�!��NX�>���U3/w�����C U����sv���fC��@���%Jb��!FD��|�,�#�@�{Q�J� QT�r��"9��M�r����r�=�}�����r�ne���F�.`a�����d?�+���������)���t/�(���S�l��(��v���[��w��
d�z�Qi
�1�v����G�'��#
9/�2`(��F�L#�f���c�7��I�.7�2�{t	��������"!���%��pnW�'���b�2=�����9����L�n���f����\9������c��y`R�S���6@P��A�&)V+���kS2���:���r��_k���Z�/���(n���#�6f"#���?�����m>C����K�L��>?�����m>C����K�L��>@�F�3�	��Z���L��=A�L9e���(X���\��2���w��f���+Q:]�$�Y�@��f#T7[�$RL������D}���
I��������(���o�Ei��u
&�p%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l�����v��^���A������g'�������D�G5)DE�L����������u���.�Sm�R���jq2�����U�IM���EL�8	�%�y���Z~�iOM��sr���JT�BT�����Z/��!�H�E7�A>bS�B�_�~
�����Y���jIW�n)�D�H�'l�5���	�P0`���M3�f�o01�;���X�K�5�1��6k�c�.l���\������_	sf�&8��|Lp%����!D	�q��6i�[��kCjd5�K���P�����-�1M[�r$+
��|���I,����j��C��3�+�l+Kd��_�$�>��)Yf5�hv���hz��I�T�c��*k�c'��m:�p��	�uV]TZ�
[�@�\"��L���D���0��n��KO4���)�Z����;�52�A\�����D2m�,����,r����:^���jk�Y��
�R�'��=3�:�j�Ig�6��fF�X��S��B�GMwn��\��O�[�Z��d���F���Br����9�b"U�!�" S	������i�	���gUS�����}<�z
A�G�,�<*�C`� 8)N	��(�;��XA]B�t��B#�Yw1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�bNvjA�<t�������F&.9���v�e �"J�=�{��@6��-��4:�Rh�����o^�FX������F���tBH���d���;��~�R�3�1�p�����F2]�r,$a:�)���2c��e�5�2�<������gJ[:E����B9{?&���R2m��i���@�dl���w_DT��ZR4�X������5��U�h�N�$O���AL�&R�9�dw'��5U�V���[)*�H����@$y$��V��9��%�`P�������n�iE���,���������(J�n
2��j�B�;�U��T��[�M�eL�E�����o-�v��"�AD�t��Y&������M��M^Q3���l�\�C#6k��r��?��\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\������_	sf�&8��|Lp%�����K�5�1��6k�c�.l���\����Uj��s/|�~��0��f"y���tY���aV�N���L;a!�Q��r
o6���]������+y
X)lU��nt]AI��V���{&(�n�d�+���c�� ����_V^Z��G4���(�Q����dIYg�I�;!H�2�gM�2b`��-Q����+��II���N��q�����T	7L���Z���0�!�P(,A*j��XQ�	�kZE�"k�mcRtb����o%#
��t1gE&�8p����1(��������Gn{u�����1u1k���r�N:�x����|�H
D�B� )��[��}.���ez)���nQ;�
v kh�=*Z����Z�$t�"g�	+��r.	��&1q�ES~��\��1��@"<@	sf�&8��|Lp%�����K�5�1��6k�c�.l���\�����	p��_c�i���K���|��h0?�?�1��!��Z�8w�
�H.�� ��{x����?t3��1�ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����n���"�W�0>gEPV�	7
;b�gNf��UR9#"*y,�Q�6YY7����a�q�M\5<+	I�����i�/�L'@�AD���� �����+�j�Z��Z"F��\vq�����T��j�f����dSL�@�0�K��n�m���Uj>�Rp�t��G4�fU���6�>U���*$9rg�w~�����	�����ov~<p����&�g��	�����ov~<p����&�g���� ��N�g0���Lp�Cw!�<?cf#t���$�R�% �����k��[D��z���e#W��9h����E�{PC{xyS��P��2�������������Rh���*��cU�"-��S����t6b�%��3z���)�c���U�hZJ%�Od���D�`A������w7Mw����u���QWZO�������Q(��F���L[Vo��2.*�Le��Jp\K�d�qU^]!�I�����u"i
�a�&�Y\�j��G��Y�Gp���D�M3�0�|P7��U���.�F�Z
n����%[q=A%Y���6�Z���
�T�lm��
���C_�m���;����$(�����"����E��W(���t2�	3HG��1�*w�w�D�����8�1�ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<p����&�g��	�����ov~<U���
*��_U5<����1qQ�u�tr����DUL�#	�G1
�CjN������Sqjvq����9_��U;�iE��U�j��������MF��{dq��+�d��l���_F�dW�����\E�U/*&��0����tt=?��R�S�U�����n��r%P5WX�6a�Z���1K�P�I�7�)T�#e�Sx��c�55I](���T�n>�2���+�����i"*8����7���[�'^�B�
��P��)�WQ�7:
���RQ�.*���3Q�;|��"��R�b�������?��6����������=qIS�����QF��)�t�����0��������\���ZQ�^.)W��j���E���I�
MbC���h�9�}�)���e�{�������x�7�?8M����{�������x�7�?8M����{�������x�7�?8M����{�������x�7�?8M�����	��v�s����l��i�D��5'u������Z������<s%?[V�@��H���
�a���NS�]K?rmd���%�v����.*$�x�4��D�
��+Fh4I�W"�.���HU�������%��_���������q%Q����z���PQ��L�����\��p�I�����p�nh�.M�=s��%��4kW������1�����0J���F�'	�m�(���&�m��#H�8��d��)�\�b`;�dS���3^]�
�4��wL%)�Ln5%c�n�]�yP�m\���PP�P��p�E�M1�����nL��u��L�S�H]����L��.��ue�����'(mJ�]t�Z2�9�)T����l�e��j�L�f�Nl�Q
�
���}�Nr���&����=����ov~<p����&�g��	�����ov~<p����&�g���&#��i�L��@�1�D}�Q�i��E)HP�q�l)@����9~������u0o��Z�YERn�qmH���1M3;`�L���Y��L����r�WHG�njjZ���fq��*y72n��k�S���!
�S	��&���������&u]Q�$��X���=��N*�t+&"R�n���M�~�h�I��,�u�����r���y���S�@!�R�P�3xA����	C,������
b�!P
��Re�������R;�h��7�@Y��S�nj��`l�%�.^\L���A��L
P�����
[U*�U��zS����!UvF"�g2�("bq��Jm�����5���5[Q�ne.-d��J
��b�e��KPN�[�;.U�X�A��*���J&�����Z�l�9���P/aj4�F�/��9�Kg�A%N��C���HpL;C�mp�u�csj+s5��*Z	��v��%j���k8������������r�F�k�
"4lZ�/N�`���Sqm�lU^HK�E���|P1����b�� �D��9w|�!�K���w�j�����TUe��*��6����t��%P�����S�s�QUT\'����X�$P�K���(�{���c�D@s.C����?Yj�d��46
���ns�����9�"C�g�t�9��v�@��x4$�����|�����$"�����HS��D%��&#�8$
lu�<��M�PA)���7��"NX�D�&�O�r��5u/m���-���:k����f�E��^/��d4���MH&��T
*5�Gp�-����:n�Q�u;��LeIK����)&��94d�]�����9�LN&.a�R��$��`��Yv�(G�I�@+���TDH����ppf�m$#���Q���KB�0;Z���>���D���FPp�<Ue�T����Ls��>L�I�"2	�D��,�&��y"�<�
S
*�YC�\����7���;M���w������C.�qa��M��W_�s5ff��s�I�Y�������P�@D��i�#��2�KT.[�g����l���E��
����&�����Sd���������:q�d�sM�v��T
5��H�|G�]&B�L���F�]n��W�*�5���lR�F����2�$'��!�z��GMA�����H��nwe���:���+:q�L�����l�����l�%e��2�����
d`IV�L�S�\�U����4�����Y������O���H.�VrdV]crH�   =��n���:J3T�	��C�I����N�����I�v�"�.I�:�9�
s�a��&���
*��r1ru�g�������(@�
b	Jc�������������`t�c��?�t��U|~��o�Z����4�GVv'�$K�$��v���]NH��dw&���"c����`����s����Eq*���$s��O��:*@D�%(h����"���6v��j��{�����&+G�a�wA��#�tH���}�����c��rK/M*�*$�Ux���]�s&�~���Gn=���@?op�(��'���D]����������q�B
� ���*G���c��D��S��IT��(	�9�
�	��}���F��Z�i���H���I�@1���b�H��/"� LL%)@���;�YUm�mt��TA��kQ)B��/(�@��*2���r@s�{�9��^{s���&�9�]:+	h��t�X���<�V�T'M�	*�����k8x�r�&#~�qS�}'U�o��U�������7���hf�~:FPf��mT.��T��(�V�:�9S�9���WaP?A��l���+����H�2O�����H����S�L$.EL�P��S�����J����kW����9YM����������"n0�N��8�3�
#��d!���x� �����Q�$e �o>���]cp�X�K���#p�t	M'QI�,)�Q��kZMr-�����b���f��%�j�u%�+Ge3�y"������
�_F������N�*���
j�RS4+f�sp��R�������cU�S�U0�?����W��IQ�6�3cXr/�
b���U�S:��^U��(H3����P��ef����,e��Ykf��3�5@�9�U�g)��@qa�o��5���j?��Yn5Z
��.��%2ge@����BS	E16f�;ER�mJQ���2���7���N.(1�{.E"	s��e����&���2-���(���%�U���x�T�5*�B�Q�I�1����y2�������I6.� Q��:�VJ�UFm���L�D0�s��'k����>�Uc�lfd(�NP]�sj}M*elO�9r>�}�CS��Z����������e�����,���{Y i�'%�)�Ur$Bn�=�H�}�����fY"��\����IK�Q8;nMDA�pU*�r*�0�
l�mH��:�`.Pn��A��
�T\;X��
Rd��1v��q��������j���u����s���.�����0�����g"t��0-��V
�9���M4�1�m�2$P(��l�Ch��b?���y��a�/�E%�\s������
C���L��P%��|�2�v`@�M�|$97@�|P��������{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<xa��������\�g>��H�f���3�D0��,
aQ���3�D{���z����.���UH�jK��j�#�x�D�|��+dPt�$q(��d&��,UVv��_��=��(�+L�
�i`�U�
@�T�+�)
��,�3�tDGT�/N���z��;B���XG�l��cn$�R��"<&�JS�)7��R��w{�q��vN<xa����=�8����'<0�d�����x�������4�<����#��>�����x���-�+�5��mG6���GD��V��V�D���"b;�Nu���(_9uo%MU�gQ1���
L)N�B����f��E)I�_��cc��c�jT�7.AT�?&�������)v�-����	
?76������GL��b�����C )������B�����l�q5/M(��9-}-SD��!�A)$!J��f���E��0jUZ�������\�B��R�H���2�`U L�9�&
C��Q�4�T���hj6�����������"����L���E��"!�mO���jOP	���5R��B�����9JY�5��P��p���PQNX�QS�(l�����D�*�[�jR��@�@�3�""9��a����=�8����'<0�d�����x�����{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<e���x��*��'���%�=Q������bE0�A����c���x3����jGV5������m9!oi��|�>Y �
1k�B�Z��T1��22�P"���qd�=|��qj��+�y��i�T�U�Y��u�����E�y������Lk�m�@Q���2���-P4K��]��%�o D�'}�dd�H���a8�%L-���W���v����iy�m�9S/,x��H�
AI�v��L����0�Y�Z�����1���v�KN+YU�?
��gQrr�$c�(F��&.C�Q�������62�����U��)J��E�vw�4u!# �2�A4�B9'��(���L&���WN>��I.����Cv�T��������P���$&�V�R()��R���&7�Ln�L@�#f#��}�xa����=�8����'<0�d�����x�����{�q��vN<xa����=�8����'<0�d�����x�����{�q��vN<����;�b�^j"������.������[x���i*�����`�eq����3�0`\��un������
>r��J���}��	OG�4<+� �<M%O}QX��M��F.�\jf�S�+�mE��B�O�X^(�:B���7�;�Z�Rr�NW|����Z��Q�C1d����t�]������+Y��W5��HWK�)&PP=W$H���&;����E_pd��i���Q�h�
`��N'+�����@��E3�1S�7�J\�16Z���U��DS�'h(���8�lT�o�#>��rJe��	����l����{T�������

�uo��M��������R�� �14����RAC���O��Js(s	��:�!V9Gi�g��d&�s
����'<0�d�����x�����{�q��vN<xa����\�����}�3()��P-��dQ�.�/�����x7��7�����	�������T�d�D���
���&m�fd�1���9C�����Y�1�����=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x�MP�����Q��*8������
>X���^3x@b��G#�>���au�������3j��=�)���J���T@���`NP�!�cfQ	k����1��-j���V���S�vRV�j�����#~�H����|�"a�c��d[&1Q�����d�-XD�2H��1n�[� �L��� 1�l�>=�8������=�x������=�x������=�x������=�x�QL�.nP]���S@�#�Y&Q.����j�N�������wnk�����Qu�������Q��4v�&����2&`���i[�\G��B�������*��2��)S����X��(3���c�DOa�A(���:���K�gX��V�N��5�-�d��*�^�����/�M�����HRf\�Mj~�^)=Ij-zX(:"����T'nm���}I[�*��<XE���s(���	
m���o�����=To�+=im���mIQ�.����+�M��'�p�H�&�D2�Sn��8�(}6�h]7#K��Q\�F]t
F�m�
a����B�S@
��*��S��9�)��Z�V��_O���@���b��=[VI�*���k&\����E)��(f&(w�p+�����S#��a��6<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/<2{����'�/�'�/+[q����������#<���I�b��p*b�$����3o��{�-���Z������\�]EFi�KoM�JL4���J6��.�+�8��rl�n�@H9J4����5����5��]6G�B����h-�T�#����Z��p@��	
����-�~�����_T)KS���+t�P�@�i�n�3D�m@�����`R"b�%8e�Wc�W�2��[�[h���M���pc��B:1Tu!0S����H�P���|m����+zv�RQT�q��M��-A)������*������>�*+�)X���kKSn�E��"�FFAZi����iH�����M^L
.��f�D
P1
d�D�:D)N|�Q��
���=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x������=�x�$�)s6�T(g����RV������-ll�-u[R�+�v^��L�%NVV�T��*R*Q��8
f��U�w~��Z��C����]�F��
��b���f�f���1�jF��nBL������������+�kjGs��-X;��2��p��DA��B&�Q�T�a&�(R�����G}�j���Z}jZ�	h;ABZ�%��b^*��X�/ ��L��{�
����ea]I�t
�����JB���q>�n�ht�*���������]�o�k�g�k�Ki#si	Z�)�)	�t���.nV9�Ko*g��r���(��[+D���������I6ZeFI��I'��\�*s�`��wC0���)J� �t��P����������x���������x���������x������{uN&B*��7w���X��3��,@�@G"T�"k�?���6��i�so��6�:2�f�
���.D��3��@�� Ls����v���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���g@Dm�����*V�E������P8�*���-��5����1m�]�0dP"i�����X)F�D' U��t��i���C.����da2iIT��$Mm�@SP@@r�5���)!��O�����#�?����#�?����#�?����#�?����#�?����#�?����#�?����#�?����#�?����#�?��-���)��]����^�a)�r1���#��C���:���*%\�o�����$�L��}��aD�ob
�P���!T@/&D���` 9���86�"��� �����U� g�����@)��B>����Hr|Rl�TH��"^@��;�0��L��DrC����HC��rv�)�&
����s
�T�{�f"#���� �r���S0$��"��|d�]��D�`0�6�;�v����(9w�T�/G��q��G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G�����G���C�7�t�4�*?����,�G1�p�Mo�
��r� �	w�!��E)�f\�n�
� ���E�K�@T�D�2��`6���INQ����r�
��9f%6�g���[�%L�r �,�j�C�8� 2��1�r
��-��9RX�LE�E$.�*�T" !�i�n��;�
����'PL���PR�E��D�`
s�T0[�R��:*�e|�m���W`�[6�?��l)K��������c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c���(��c��*��cy+y�� �ET_��Na�:|���<��������}3��	S3W	�b��(�>�����s�T�3>F����J

D9"9HD_ #�L�@��"\�7�v��@�Z��i�IC<Qc�\�"�29��D�Am(�(g��B�@A��j�\\�C*R�S!����n��7�R���&*[�U�T���'�Sb���$b�� 9
�% e�E([�r���1 TP�y"��7*�   @��	���1�9�V�0	�����������pv��W�Q���W�Q���W�Q���W�Q���W�Q���W�Q���W�Q����������=��)��bb�p���7�DU�b���&0��D�L;Gf����a���v3��F����o&G1��G(}�C�0�)K���1��g���c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?����R�@3�{0��*���w����&2g0f�(�-�v{>��n�7���
����*�o���dL]��m���U37��T7&"')S�� �
�B9B�R��C"b��Co�)
p�H"�dD�� x����t A�0d!����;��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?����	o!��$q�D��Dr���9�t����� )�\W!���9V�S(������L%9L�:i��e�Qb�d@����1�%�1��)C�/cb[�)3"h
+&"�	K�6A���	�w�D��Ct�������`:�(��G��URg���)2�e�j
0@D��.�v;�7QKy��S�L����V�Sera9"*�^P����I��Hx��x �h���:�r��OH~�*Q�V*�\@�p��}����$=��6:����{_��I=��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?�������Hy�7��2������l5((D�"�����H���>����aP1��(�~d �o��L�8zbk�T�*�c2���`��` ��)����P*&���t�UBJ\�8vl�`��BoHb�H�L�(H>��b���"�2������!Ea"�T�L���5� �
��s0��"[}
@1y9>�"��R��fnTvo�y��ksB3�@
��?�Pys���1.[{����� �����J"�����Q��!��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������W��RC�c��)!����?�������Hy�u�$<�:����{_��I=��������_��/��!��l�A��[��f��H�s�F�*r�i��������n���:����C<�" ~Sp�;@���fC�����R��$b�������I�T2C���!�GhB" kyNo(����r
d���r<��16�{���@t;{��"\�l���h���J&�N������=������^L��:-�$�P��2�(Nl��s�n���@�*R���	��M�a�&��ny���1�3D��L%0l[�!�:����{_��I=��������W��RC�c��)!����?�������Hy�? b@AL@}��9��7���S��h'�P
-�UEuA>PD���1�1�=���������;�L������1
���w-�#�
T�N�)*#N��Y�R�����U�����I��.�O.��<pc *���JE9>O2����4�p��Wk^��+\k�Pm%#m(���i�[�L��x/Z���1�So��0���4=p�wv5c��[i�������IZ[���V]�K7u����#�+�M�����x={��6
����}:X+eG�o�)�2���2������&��P����S� "PSf���h�����c2�E�GE�����Z���j��XHG�4���a/)�9e��w=�e���;�=�����Dv�e�
�}T��F�wO}�����m�kQ�Y��]W�N�h�y���r�I8�� 3V���W����%nMer��9h���,R�6����K{U�-U�.kj�u$$�@�]��(���<�()�"�Z*�������l�k�V��=���`��/7Z��G�[2����
��n�b��n������>�k}D�U�����f����{J�/rk�R�BRv<�,�0Jo��ps"d��r�e����; �S��V�~F��sZ?p�}��0U�R���
����n�|	r�Pvt�FU�:&��R��/\Wf����\�f���F����������W2I�8jQ:�,=�un;1�}��&��l�����]K��AJW��U�����r_HzF��yGq,^��s�M3��T���
�)��E0���0m
�Y�{?c*�4
��&�h
8��c�EY�2���9ZK���N<+4r))���wGfZ��v���b����b�����^����
j�	�����������>Q`Cn�������n�D<�d1Q]�1�3"��m��G`�4���zn=��K�
g4g�����5/ �^���k�	+��5�~��k��b2�K�;�'����ga�+�H�4�����������m;
����C�p
��	�!q��u_�����h]gq��G5ST�4�dX��n�eEI���["�GL���($SNb���s1�C-�tG�~��\�@�����n��L��n
gm�eKik=G�!���%(z������%)nZ�Pj�'���2���
�A*�0�{?�Z��V^��'uo�{�\�w&�����,a��x���p�]�K�G%j����!PHR�+K�q��@������jI�g
�vgv�H�C�UQ(�w���L��t�~o����#5����{)�3HT3���������l�ninT�+!����3n.�R�1r��^�
L�_M]+^���J�"���x��������P�_��@�"���d\�a9�19�EXKczn�����p������KX���'�@��M����H`S�~Uy:e(�Y����=���z���Fv����t�k�M����h������u��X�J�����	7��1G1����c�|^�����e�@Wt�.y�T���D8�@@D7{�s��;���i���������l��E7CS��%�w=,���2��2�r�J��A@�����2��u�t�7�����w��a/[S����}H�����D��[�1�)�I���x��Z�������(�uQA�W��A.!T[������;�$��� (��L7�
.��n�v�_+e_�2W��Z
5���qlm?l��p�
T
I(���VY(�FUd�"'(l8����H�b*[�g�*��`�i$�'�1�f"�s��"�SU�)�p����!���pct�M�)��a/zb���=���4�s�����[[v2V��WU��V������t�����z�M�(�E9�A�p��:bb��9�k�T]ZM�v�������sR�6��C+&�
=S�.�����QYb��Jq��b�S4q^]:b��O7���+c[�[�Wi5D�3��j�t��M��79�ER�5�{%r.�{��iZ���V���u5�{d/�D4�d5V�N��9X�A��*���`1�Sb�#���IjNW[7���bk�Ujb��%��:e�e��������rEH��L~����;�U��;��~��7���yz���������d�3�,�����n�](�@1@���=���Z�LZ��E|):��u-��-m��&�AJ�OU5������`a!J���*��������D��@��n[��w��]�e�l�Dr�o�?X�d��Jj6�I��}��2�t�6M�R���.��W#��M�;Aa@�������x��.�5}�k��Q4����eR]��~�����!7tmr�����������fFq�(B�Q:�Nc[k���6M�LV`����$����P�n�)�)�3�����m6�Z��P�&��/��������r�W&tR��v.��0�wn�7���O�2@!�g=G]f����kk���VH����R������-<���PP���*�#��c�P?�t�����^�jM��F����]i?9�OD��[���Mg�QwNc��A�b4�R����I�3��h���w2����"���:�
.
06������L�*�ddH�c���N�����M��L����{��k]��5�k�x������,t9��i5Z�
�5H��2��9@���yG����������f!{<*
�����et��K�M�j�Z���V������ ���mT�P�I$�Vl�t0�x�{�����u�����^����or����VV�'��W�j��S��^�VC���#�VU"��`H�&��{^]����
K3���[��(	*��b%QZb^�L
�=����"����p�N�*�w2��cJO������V���Y����l���������M$�����D�+����$b�G�Za�����1�K5�}Q�+]P���F�1��z��Vq���;�9��@k=����M�/G�;�������Y�s��������SRt�'Ul�6�yE
���2��:�EQ!��������������~�Pp������|�->�[4p���H�w��7M"$����i�B��1��(	���q�sn�c�9~��L|�TI����!yL�3�l�������J���.�=�^6���1-ml�*b���Tc#36�j��(QX����b�����?�~�����7�����z��V2�)jEJ������,��8�Ju��f%)�7NA
0^}"���6�4����K^��jfj�5Uu#��S�U:�M&��~A��p�T������b	��k�_UWR����n��
�j�����������E�5Y'h�9�2�
�!2L:K��f,���55IN�HWNk9�5+x��!,�G-��1&��
a�������&�~��s�?��+
I�����L:��=#o�j��E[
n����_~LV�{�	���d�,=G|�8�� �>������.�ikI^T9ur�m��5���m���Xf#Y"c"Wm�1UX4�r�5v�%A
)��WJ��i����s�V�W�S�B�)V6I("<YPfg�*j@�`)����;!�R��Y����!�������"�B�HM0���T�����g
6�%L���
&���-���)\k������{�r���A���G$�$G&��vm��d��R)DJ��F��P��C��v�3Z7gM�S&��om�I�ZZ��UI��Dl���r)����r��d
�57�p���,����V������4����!>�uT��p]��V\����=!�E�N��d���2��(��st��r.�z6e�}e��L�mG[!��cZ��q#�Fc!7g���+�S"��1N�kG%t�(bn�La e����j���Lm����+�p��������6��G�z��Q��N$N�:����Sd�n�\0��oEj��A�kj����kA�h9��!3$!6�B6xS�(�S�D�� !��������M	o5�ai;\��>�%����zB�fkb�@��E���URU3��P*�g��k>
WC�v�1�������\u�NQ�Y{���uI����q��UY$��J�($��m~��F��H����=@�5�U���$=J��j���6��'��(����R)7�@Cx�r��L%�B;Cny��Y,���i/[�A����:�-0�K��TZ�6��w.5={�.��i�@��K$��e�7
Az��r,�(iH5����p��V���*��oS����j7�$�BG J=nC�&j�J&'=��4t����=�a'x���J\JR"��6�L�����E��M8�j��T�QD�Sh������J�
&�VI5����Qq������[�Y�������U����'�����7b���-��-q�
�����,�r5^.���"i�I#.%������@ ���mD��&������r�{d������Z
��?�v�
~i2?k���E�8
T��@���:����t�y�G���Z)�TU��j��-�|�s4��mdZ�m�,��e�T~E�w{|��r�Q�0FLD� "Q�G!���~;��'��w�%�����s6������������A���G�a�Z[��)1�G4����(I1��+��08��k���B��tL�����p�����q}%�%QRQ�D0�MT�+�'(��u]�����)�.���K��Y8)jN��.�x���R���
�U�fJ9X��`1Lq(��.����c����4�K��[����o[��H)y�Alv��A�n�������H6&�+�qch���q(�;�>�!m��U��u� *C���Dk�X�=��~�G f�5�Yj�����Y����V��\)�S��B�[&������Y&��%�*��w��O0&jX�P�z����<���>���`���sh�FuE��i�)��w�w��:h�,B��2�8�U�]����D��U����HEIW5B&J:������h�`?�L8{�D�n���+���+��|j!�����al�L�����1��L[
Z
gO��)fBV���s�-��:���U[��r����-��zf�c3���P4wJQqQ����:G��F+<Y5!9]������n��6��[*�qqkK�������B8�^7��Z2f��v������D�2E���5��7J�n��%���/xn
aug�w��&�% (z��r���
#�3�LT�t�F���2n7(w|W0G<��0��6e�������`2�?�������VvZ�A�R�uU�~�M75-I�5d3"��US1�"��d�^��l����mj6�P:r,CrR��\!a��-u(��;��u4$W���l�!Q0��Plgf�Vk����3�Q��T����
B[�}:y���"iB_k&�E���.Y�u�L�R�.�e�wuo��F:��\�����I�&�GL��{F��2E6�L�ME
�C;���j��)&]�9W���oO�S����cZ�����Y�-d��K��A��$���p4/G�t�F�j�PW�����d�[[�1tm��+Zd���	��]�z�T��P��7���UUok��57�75p.9e �=^��+������Bi�AT_�1�%�\�P�ts��u0N5N�V���	��%d+���y'K�I��4�o$�+%*�(���HcyC,��uJ&�J'�E������������-N_	��0�J��u���+gJ���RJ���7$t2����= ( cy����3���-��'�h;N_&8�.�cF�s\���_�"����(	�zcR	L�%'(%b��{�?7�}M�/G���N�L���t�W	�*�K�uZ�$TvB���&0	�t�����N������~F��T?�-:}�B�m3��"�� W��r���s;: �6��h�j�}](�����{�wWi}	y.#*��E2��i����0`��
L�
��9�a3W���Z~���j-�u9U!TLR������2SM��. �2r��I7�L��YcXv��Zg�.���Q�]���X�����#�M�}MOG�s8v�d����L�Q���x�(s�C�l��H�����@��f"b�Q.�r2L�,�2�1�I��0�����������v+-����];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w&�i���'��_�8� �`���>�[0�Jf��I=r���1T+��^$���N�����������s=*��x�,�5���V�%4����S��1P�P�(f1�������Tdk�
����T�4���`u����>��>�,2�'�m$�[T�.�����jX��0(�h��$�r��>gHJ�@a�vdp%[N�O�f��S���E�,�Gt82�Jm5�@1���r��J����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b����[��-EX�u"���`,��X�%�d�}��r�
���a^Z�����R1�<�B�k�j�`U�Q-���#o�x����<��G�����TH4���g���e�!�<�}�d8���e�'	Q%��sW�}5�*X��7�C�o��*`����9���6dZ9��)/���	Yx�6OJr�+���9N]��7s��2V�#DH��X��
��1N#�(6������^D�@
�a�j����2J?%"����F�n����2`2�0�6`
u8 �4�P����[�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�[i�����������;�	��i�:L�9l��*��6U.A�U�\�)�T����C�E5������?=0���;�fS���(�
��ar�l�ve�����j*1������=���8����K%��w�\��C<�a�I�������:��7�[=bGBr��Y�
D��25]N��r%��J�
�� �`�<�'	9G������2B�`����i�S��]��(�����@��@�@Gxv�����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��a������N����r����US'D�����=�����Eyv������#������-#CS��r�1��^(xr��Q��P�X�� �o	������Qq�s*h����|y�PD�L�4��0��07��
g���U�f�x���=��J=��W,R~q���QD�p)��8�����S�.IgQ���r�207:���)��8��%�2�$hI��X�RBa�/&���h��)U������6������b�W��"��2�\�
��EAdD��"�����?+���2�=#�b*���k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��3���v���/�\��)������5�t��!7�R]�!��� 8)�2)D@;�!����c'9
�����d�A!��K�Ce�����
YM��|;�6@?������k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/�������0e���[`r��c�>cf9sfWz�c�t�hZwn���(�uWD���E9�`��#�RNU�K��@�YJeZ|���*��S42����p87vAH����PU�������J�*j<�(�E T@��L����5��}���(��*��(�5+Eoz2�g�L]����Hb��K���K���W�L���O�U7
�T��fa�3[G��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w�V�];�q����Yp�VC�G��l��^�UM8#��j3R�h7z���	I�ES0��r0���������I����#�u8P�T����)!�P�%�!�Xi6����bC��:T�����(�voJ�i�xD��������������!!e���L�t�[�)_E���U�"dP�m�)\�

UL`��J�GI�5P��B����zY�P*���22�|���d�%m�Z�5�r��N�/>���STp���,B��0��>&�����x��%
����`�����l���4���1�"�D{�6�$�)��@�~�T��S�f"a��[Ml��v+�9��q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w��];�q�m5��~w�]NypOEw?�.��`�*�@�J��L�P)
f\��D����qXF����s�^���`��aS;Q����:�dD���T�n�x�}�0��<i�<��[�Y�$)���`��U�6���@���H�D@3(�Z�����ID�F�������M]��|�@
�g��D9�)71���q-�R�K�;�Na@��;�K����6�o�m(��$��irRP)<U� �;J0�Q*@�T)��)D2�����3�:%l
�I��6^�@�_C"2�$U�J��E"��Jm�U��d_�������*���se�[M���{�����*�kg�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����k�b��=m��v/����������;�2�d(Z�4����T����IH�T��*NQ<�H|��p������i���2k����j�����E��A4�c�NR&�ag�LH���U/&�&����atw�PAX%�f�@8�9>�f2���jE�� w�R���)<U���wI�� P�m�`�0�����.�-�J�����W��$������B��22�`�������^�@��XA�_���Y��n��"QH90����e�S��=����HQ�����#���Q.E�XH0E%Q��PH�{"aV�y���a� ��+f?��[i�����������;�[i�����������;�[i�����������;�[i�����9�VS���3������6{����D�Y�����w
�������J9� !��z=C���ZM��c������6f�;f��_kf7H��J^�7���"=��������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n���bf��3C���6h�qj�tPA%2��D�8�	�e�o�P������ko�$��T�s���q*�.��&n"
�iQ����@�nthU�!}�D�1G�)r�!�4M������\�'LU5m?>f+)� �x��2��Jc�=��2���oU���7C3h����bB�:�5�Xw��rb P|(7�l����h.���*B��f�RsR�p�F?�de�`3P:G
9�z
���������,	7�jz�&yb�� S��a0���jrc�g	,�6�.�k�zF�����n����
d� �D�
	D=���lo�El�~�e����v�&=�����1�f�����{7���L{��7o�c�����o������~n���^��o��,�����������m�4��AC�%!1%#.d��������Y! �yF��(=�s(+\�Z���4�/ �H�4Ub�	SI��\�
����
�)�`l�X����:�@��<|+�4�ER��aPJ��Z>5�����&�� b��t5���.Ur�H��uJU��CW��Q�y�I�\�!�*�t��`�����@Q��S0�i���@�**Y���4������j}��|���tr0 k[�rij�����RU�.fY�R3M��#xT ��s�JC���&�(����v�GVuse$#�CV����a"����Z(�b���r����LR���t;�7���7�#D3���{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L �[7V��&A�'��Ls�t�A1��7}��q�K~�t(Q?�*p���*TB�-Z�F��r
l�(�6`"rD�+e7Mc�$HH�u��|��U(�?��s�1�j{Y������q��u6�]���s �� �V���D�d�����)�&���HV��=�m����i����C��r�U)�Pt��\���������%d��5^V(0q,�.Zrv����A4������m: �9�l����hm���=��)i�zA(����N���$��Y���`�!����q��LS	�p���X�)$����H��s)��e(�t��2R1H@���Dv�#6m��l���>��o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n���&�D���#d��*���TdB������d%��jd�@�]5���G%2�S*�Gt"�MU��a���t��"��a�l�924h�B���^��7.A��Pp�9~�!r0w}@P�T]���m+QS�Az��p��t��Q�SR��j��P����]=@2� ����D�;=�r���'QR�����7��DQ�H`1C|r��1�5@@P3v���7��y�c�����o������~n������v�&=�����1�f�����{7���L{��7o�`��V�?�Y�~���LD�NNv�1
B������m9�����hr��UAw�(0U����9�����R.�b9m�����b#������}�=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&n�f�U���
�@]s(��jT@TK�yR��B&�������T���B>��X��4�[�"r��Q*=����	�L%	tQH�SqE�#d�����K��U3@��@��#�[0���/���.���&n����(�c�i5L T��@�M]�w�3U�����"�f	zMW9-
�B�`�uyu94���b��h�c�(��d,����E�P�g�|�D����qn�'���88
i�$��O��C�UU�����Ut��@��T�u(H8|-d� ��n���p@��b��T�#f�E���$d��b;���p�kf�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o����������U�jI���9����bb�I�m5J1���D9S>���4s�G���4���&L��L�	dT~���y$��i�d�3$d�E
�L(x!#TT��T�-�VRvx�"YE7`��<�=�H��/��K���$D�.b}���u�N,��,{J��`�k|����5,S��3���!�Q	hi�@���P�����������jVt���
���9W����@9L�[��$� ������\:l���P2\�r�v�0m.�Dk�n�]F���E8��OZ�t��1�V1LE�����L�a.�q�sN~L����&HL^�����81�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f������[6.Y(S�*("^��1
P�0���b��W:�QtM���������������G�*�� r �Sb��2�s(E�j��)��D�C���RHC��0�D2�}����]��(z��`��M:��_S�ys��sLR
:A�2MG\�(=�DvU����K.��-}QE/vk�A��K&��\80
)G�V�
�9����!t)��n�I���h����N������,
N���:��������{K����������V�e?�4�������S9���f�!��,�R�^?H�(���M��l���I5�r���4]%H
&�WH�Y#���Jr�r�����v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&=�����1�f�����{7���L{��7o�c�����o������~n������v�&2�f�|�f�?g��}W|�1o"&e��@��G�Rs����q����]pn(�-�4[19�.�&E�k-p)��M2�D������LV����A�U!���� ���bJVP���m�%������b[�Eudg�����"!��d|�tx1;;an-!v�����%7'K0���X� �=7��J�t���&R���(n�b��j[�O6�h������[��uh)V�Ml��/ �@0d��SwsE�������l��<N���M�yV	��Q2H���!Zo����c.�5p���*������,
�QX�+S�c -�(����<�2���s�b�
p*mU.�C#��)2�@;��DD3����v�&=�����1�f�����{7���L{��7o�c�����o����F�
n
#��g�h����cyHPL�'*;���!7����J�����l��R?�%���`��7������F^�DC�G2�g��< ����DC}'�y56��pq7m�$\�0!��U4��[R���EWQ����g'g�,��UT1wD�@���R&U���])	�L��s���RDD@��=����hd�;H5��%u.�Ys��C���1�j*R*���sL��_:1�f
�	%���`��{4�w$$*�[ruWS��?"�g)W��pJ�������FH������xG!���:�������i�
\J^��J
��Sc,�
��V���d��Q4�q[x�1����+Q���S�*�V�>���n�Z���l;�=���$�e]��dTH�dt�����l�a&�fZ"�����������9�M!}%��D�M�$�G�B��a9HQ!���A�^��SO�'(�;�6.d��rD�N�(�m�0����AYH�/'P��u��\O�e76�2��a��}J�4e?t��B���	�~J"R�gQ
<�L�D����T�X� ����8"�).��5#c�3�"Gn��@�&�DG`l7Ayoa�����58��Z��������QU����Q$�m�X�,r	�f!�<�5/�kK�-��������C�i}��b����I�Sh���Wn��tNS�#�b#��M��r��rSM�����R�.m7
I�&4�y��'LT���E��nM��B�7,�/��������;Y�oNV�����"RL�M�A�V�z�@����X7�r	�#��P_�X2�U��"�)����� l��>������U�CNX��h��n;h��B��z� �*��@J`��C(� ��a�,��$�f�:�^�7d{��|��L�rk=v�*���"`B�@4�pjG��sN���U���A�5YC*�N&P��������"a��/=)����l�5x�����������P�e�9g��
���D1��r*���.G���9p(�j��Wb��L�oD�JJr��� ����H�����"��R�e�M�c���d���/���DM���:z�_�311�m��EnW��7$\����B��*�V���+�6������t#�����
ND�� RU����/�� �(q ��M��m$����tS�sK�T���yfP/W.@eX6]f1
R��xB"��c��Y�F��\�LSvV�{�k���'�<H b����p���d ���t�?w&\��))Y{���k����
������])��(i�JB�i^���\HMK��<����Q�Sa�f��pc��Ls2�f9���\*~����i7�V�CG�t&g���)Y&�
��^>1SA!�H��J����T������_���%%(���R�MB����P���SE���)6�@)
�����(#�P@
`8�}D�h?����{��������lO��5�U_�?�����d��8��-�71+K�����q��-��[�}���S���5�g�+	�.����I����&$��9p�FF^^`��p�E��2�>y��z$�:�<2��(��b-X�,��*}wqo�c�t��b���`�� `����������n�������N���h��]S�"���.�s$�����"�@s�
���Qj���V�����NUTV��%hIER�5`.N��@M��W01@������i�k_I����w;F�1�@Rg���$L�4�p����d��ETL��s��{S7��U��*x+�xe/�r����>�|�;�2���@�[��O���3�M=�T�eU6���d��6J��P�$�f?	���b"8�"��Q!
���,��HDC0��9���g]���h�3e���������2���-*y3��Ql���*g6r�s�%�C�n�R���g�-m�4��+j�����B��f�� ����L�1�P�
�>�4a�����+z����u��p�6�a	�2�4ER�\�n�*�rM��Q0�uw�)i
#�kM�ij���FZv����.�Z���3J��Nv�f����(*
"B	��R�W�JT���
5XN��N]
�����m�JBP������bT�,�g
���R��G("<!�9i~����]���E���W���UlR�F�uw{R��QU��p���S���^L{C����#j~��Zu���J<����kOIy���m���|E_�Q57T���" `!4�b"�,����G1Cx����w����Um���D������*WK*�y.U.�H+���J�(oEn���u�xi�8����yQ�m�?:��r���C�!n�v����c�g#"�@�N��Y��6P���~���;�?�}�<A~Qg R�p6G��7q��J��H�B��/����7Z������B�����5��R��r��Z
B��l%P��Hu��;!��� ����"�������1n������^���@��rF�$���(*%*��O�����D��MssS��Z���j�/�je��zv2r=�SIR�z)*��P��"J]Li'R����HJ�z��j�:>�u]\���qI���Y�:���x��t��"�tCi��VY"KD��)e����������E���9)���I�0��(�!�8v��tv�G���$)7y@���Q)v����WU2)�G��I�V�����Zv����I����:I�E.H�9!@�xNP-����Kz��F���*5�'5[5�%6�R�f�DS~(3M5�9��8�1�;az)�UU�rqz})�8$�BI�tZ�/��l��J����#�������8�Z��5�V6�)�(��������� �q�(�J�$HRo���	��s���*J��6��^��PA?D�
"�F�N=8�6���������g"�B.Sp�lQ:���*����jI�^��mY.5���X��>J>>�����F.���Q[��"`*a�2�z�^*wO�h�9������PO���/�'������P&*�V2%��`E�:�"H��$)��f&r�$�C"S�-��!R
Sn�D�����<��������_��K����?���R?�%���`��7����]R����cHI���
������6�['n�J
�Up�PDs�.y�Ms����*�m+;>�[���i��V��)�����V����n��]��H��5?m"�|����E��m|��Q�D@i%����*"EU)�b������kB_�I����T�~��W�`���������U�N��#t�\PI0L�r���!���(�0����)�z�k��$��BD]'�D�5Em����L�_�����0!�;�b����������%d-����z&�B����*���WXJ�61�I�u]�P��PT�w���mPhoO�~�oE����r���A��mkyL\��%@�KK�;��"� D�~�a@�gt��_����4�SeH�F����2 ����eSLr����B���9�G�9���<��}@p " c
�wvn�}�g�����;�UY��F�X�f��������W����t��"U����?@�:��%��q�w����-�����L{���R�yJ���Yf����"�T���t�R�CT5����)}[IP������6�B��q��KVk��"�����w�m!
r	:�U��9g�u��� $�
w���
�5}0�JE���#8��)���B��t��^v�kSQT�wz��B.a1�EQAM8ZI_Dn��(���C�1J�`q����v�}a�sQ;�bkfUQ
1Vr���g����q�Ae[4���D�B���k�����B����Q�>��T��_���Z���������:�f��*�t�$^P�B����.I���s�F�?��{�LM�,�tC ���ul����������]�6�7�N��=4�D���������!��,��J���T����e}I+k�f��PU�"��$�M.���I���R�HHr�Lt�����t�K�����5Q�Ut[�v8�
G����"d���((�aL��AW���]�u�W�]��t���[Z�qR$R6��jH���.����iv�:Bp)�H�S�Jv����o����_j��[�[���5"DR��`������{�0���D���.Q
$]j�MntwBiv�r*���Vt�Yt���TP�h���;��AAv�P._�"	�$E/����yym
�����������ZU7��5�5L�`y(T
s���"F��(�����meGg��I�#�
�� �9������gw-N���:����-��R�Rn�J$�p�!� ?d8�;�l%�%r(:����U$�$*�C�}D�)�B��E�3����GO�H�e7h��n-(��
���tV=��d�#����'��S���*FH�.4��+)l�k���6���om�������r��A��0T�J$�|���I<�*fe�j�������D���'�_D\�o	^]u�2�����Z�nr-=����d���w�����,t�$��B��jh
�X�M�%d���8_B��T��P07K��L]�������f#����x~����O�=���PL���L~�'�N��*�����cUN��a�mp"!�>��)��B�T�n�Zm��(\���
���)@�Q�C<]-b�h���N��
cI��Ex���xV�j(�&��t�4����
�
�)@��`5���;=�Kw��n��b�u��-qk�cH#-�K�f��pB��;7q}�6�����
�^����������-m���j���2�Q��PUT[��9B	���b�;:nV�c�n�����ZV�����av�j M�Z
��0<#�P��*�O�����wu��Km`����8�{R7�$�S�;s0��������T���� �d7_����qXX{�V���?��K��$�mUy:y��_S�Q3�����Gt�L&H� il<#�>���\,YLQ���e$�����G"��` �@��o����[Ci�x6�������WVZ���m��-�=G��3NU�eYRM�U�kY:�u�k%����:D���&!�=��5�RP�C��E!#F���P�jz����G[*��h���G,�p�� �n�)� ":C�9BS:��
ur�,Ki��IN���]������2��j6YgJI�s71i�)xl�i��������u��k
v�����^F'�����A�!�����T@����t,�������=U������A9��P��G�r?#%U��FE����tS�D��6���o|��f�me���������JB6fX���
���:9��
�i�0!J�T_���Ks(����ue���]U��h�*�+��>RI�����!�Q
}�1�9�@�8%���d�����0�bl�g��l����m��������u7S�����9��0I��)�SdT��L��M���&{R�-5E_x�k��s�������"�8�[�&)2t1��L�&\��R��*��|M�v��������Tt�#M/��w��R$U��2�
�0	���-%���MJ[[�s������w���[���r�S�u�=W���$��Ft�G��&�0�;�-D�-q53�K�p/�qJ ���7^Z�
�����t��fv����QWKQ9�b�sSW��:�M�r�=��uaZ�����+9Z�NV�*l���4��� �eE3�$�Z�h�KU5^%Q��Z����LS�0�5[�\��z$�8+e�]�dY1"�����
���t���n�Rq�Mf^(��T2)����]T@����9O �p�f";�)C>�]�
�c�8�"!�6BP�����@�~c���X��`!�*n���Sc2i������+R��x���\�P*e��C������f�W��m���Z�DT���5I����W5|*�3&��7���
E���U�qn���-'-P��z��"�Ix��zqE�UOT��&>�QYp8c�.g�@�]��4=7��@�7I;�K�h��[�������M'������"��@
�Jn�	�������R4U�cx���6i���z��Z>p�J��=�Gx���rS�LT�����[H�P�������UT�wT;ZZ@��������BM��"���
$@9�C��[+��g^in��RSE
)Y�u���%vk��T��J%���I�V0�N���2eS10*�U�u��A*�����b�,�P���K��#Q�)/���~��o�
/N?��6��Z=�K<t��1��	RA#n�6Y��2�04�0���Y�f9~����4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������f����_>(�C������w���f�&(��8�AB;y�`��D�D��?�1r���MM��ET���5|�C�,�D��u�1	I2�&�Ki�����w����K���UPj�?���;��0\�h�*U�S>�8BSo0l�
`��p�~�0�?���LU�v,E��7s��oG1�f��	D���1K�S��� ���3�q�c	�M �s1�1�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�f3Tg?�1�i�@��i[BP��Q�eY<���.E=�3M��*��b�S�y3o���)L�2)�PFV��2gEb�D�UNTL�)2 �d0�l�Ji�<���d����)�]�C��b*����Qe1��a#���P7P�����92LGw=����g�,���iiu\&�E7n���2���
E �G�OQ������� u\Ct�ruP7(&�`6y�6����r����.}�
����6c��/�H����4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9���������7!:J�=5�����B�
v�c�$�.�l(��,I�1#�S,���P���l�Jb��a(w�9��!@
SJ����(�H��g�TC	�&:��xs���0&$�A��"�U��M�U2��K���[%�2v�2B ^D_�e���E��:���� � @��`�JZ�lT���1p�(�L��Pb��& 52���a��2�0&`��"��'_>���M���L`6F����5E�����5��d�@��fbQ��1���/>��s����|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�0�R������$R()�;��Fo���7������y�b9P�z�%VpBEU�E����Q6���
��7F���k,�Eu��&���w�(��09K�`S&d�P��!T�L���P��/�oK�J(4g���[��Wp[(�!��QG�L
�!�h���	�3"� ��2u2�Hp@>������m��}�C�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������!�e���zRy�{����r*��U
o��qE��9����xC,��@�~��?��['R�JS�c����&��_��X�"	���6��!����MQ{�#�; ^��?���4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9������LY�0�(	���M��9��������
�p@o)C�2J��y!����"b�.Q� �""#���8�����&?V��H:���P=�t
��12e1�J9�@�3ta�q�T�|��T���}�9���	�k�(
��}"9(R������l��`�3Tg|*�d��L%X;��R���3n�e�x"A3ErD!K����a(e�%;q���e��h�"<d��>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>:�������T_?��0�B�x�w d��{����SX��&QX��(���7~� r�%�D2 ar���Q�AS3aJ`(@���J�T�W���������f"p7'�9�w0	�3D�M��A'.�
�dR�.@�@DDD7f(��rJW�@���EC�e�zA(}�������	��K=�TD�.�f��	�p2fl� �@�4i��n�B9�`ptA�e��n`����s�tIn�|�m��"#�g�|���/�H����4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�6����G�|�2�n��
.���[��pc|1E�&/�?1*f����r�6�_���yjR1�1�+��(����T�*�R��Jf������\�Yw+����Z�$H�S=��$PDLa>���R�/D���Qn��d^���q�BA�<�C(S
�1���	����k8D�"�& An��P��R��DD6���n����T�Y#ltQ��%�1�ww@w=����9��Y)E
��U��E p@6c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>�������c�|�C�c��/�Hy�|sE��1�(�RBB��YnH��%"�����D�;Dp�*K���!M7�PEar�{�[&!��"�wDx{��f���pMB��L�+(*��PE"�S(s��7�"a��Ox�2I�J ��: ����%�`f9p�b9���4W(�9",G/.DJ�$�	���bB�C�{�'1��#�X&��/�@�V}"��
B�n�e�0�f��<;�#�s
�i�9S,R��'.e�W��2{���@-������DD}�������l�v���b?�|�C�c��/�Hy�|sE��1��h�}!�1����<�>9�������4_>����j��
��R���o$����Tt���?�+���x�f��U�7���I(@>e�<�e��9��������c���Gh�ts�g����8��c���8��c���8��c���8��c���8��c���8��c���8��c���8o1x�[���4��im�+!T�u,7�j����[S�����)"�!�!�	GI[�MR�!�����v��RL.�� 	��*������w�@F���GZ���F��%���5�WPh5�2�������QB��e�t�%��B�
��w����L��t�\5|E�f�[���E�'(�)L������#)+'�mT�������?�{�c(����[i���&�y���EK���51�3������t�Es�mA���6����)t��mV*V�[�jh���b��FDs#��zC��n�������m��)�Pn�E��.���M��*B��0~�r9q|[��"��R�GK���5��9BE�Z
2z1C�r�����@��@��0[mv�-$�z��]�J"���[����d���b"$t����'����`��1@G!0d9m
�g�lq����lq����lq����lq����lqhtQ�1A�[�u�-[yU�����]1J�
b��3���
���SS �\�C2��T5����3hZv�������t�o�W����w�IF��{�r�j��u��;�..�����sZ�e@�#��B����u\>~����*	 @QU�\���������?j/MOg�-�q(�^��}�Z}&��(-��hnMB��P@7�QP]����hM=^���?�����U-IL���oS���-TEt�E����7D�`-����Wsx�_?��ym�k�1����Y�]�H�:Q�)��D�&��3TCx��k�j�N_���[v������xK�l�
�r�!�fi:���FF-�,��s���9�}�7�D���wL%6��@Dr��w1��1�<���g�lq����lq����lq����lq����lq����lq����lq����lp`�f���� 30���26,��iK!R�:���({�SB�5��,Le��mO�jGn�X���2����� �M��1�f6E�<�0�]����m����5d������������D�$�cR9�U%��:<r�c"n,��,��j[�ro�+C�Sq�OJ���������vl���~V��v�m�/M�4�z+g'w,��%s��+cuiio�k6��"�+���Y�i�������WC:F�����������ixYY���q�5QQ��Q���&�(�AU2��Sf%����,�������Z�j�9�zr"EhY�G�@qj�����@
�JUH)��o ��w�a�@G�>w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�3������{OlW�������e��HT�RQ��S�z}_\Wur�;$4$k`9��V�L��d7KHZ�����U����l�������n��|X��Z7n��PEeI�\�L��d�jb#\^��	h�
1)DijvV��%L��XGER�� *�������e(��" PcTP/��]����+�j�mr_!�cP�U��*�vnn�D�4B�X����UE�)m�6W���IL�O�oN�����1�~��r_ yq�-���?4���H,@PD��Cx�Q)�Xi>��k�W�S-���(���*Z6�2���� �,����s8%��^��%d�UJ�AM�S'���X���]+g+s�mID��������]��k5�V���*�HUJ��2�(C��Ha�1�7���9�`;o;������;������;������;�����;r�0����?�=����l�O���(l�
 �3~��#�s��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�3���.
��������Cii)Z��aF����WuT���TTKu
��^&q��!��$u�se���J��G^
�B]B���Oa�M$H��Vts$��	�59@m��c���9����.���u�����Z�Z��^eU	L0T�q�M���B*�7@����9�JTU�h\Sp���bE(�g�
���^��y�m/�����n��-=%gi�y�6��3"����)�G+���@�
�8�W��[�Z�sN�i��Y����=���fI���pb)�L�W
��S8d"m��CK���]�j��Mn���<SX)�J��*�oY(v�j�&��L��M��D��&����n����p�������l���{/�5C<�����/���r�&�Cd(��@M�����M�����z�Q���2��z����H�v���Dr��lq����lq����lq����lq����lq���
��]����G��������+�����m��`��*�h�&��P�b�-u
7h�Y��
un�����*�S�,�a%-&��
��l�LJ9K�M�W:�F����Mkm������������&�SpU~��H�,+r�EN

���������F�wP�SAj)���ZJ�`��i�m�l�T�Tz���D�Q a��+����~4w��������1uYP���wj]�+d����<�tI�Q6��|��y"���P���)�;��������o&��Fb:*5����D�UN���AC�I����g@��)��+�-�a�TRtk[�KR�U���A]+D����V�5f�6�6tn�[��S�3��>|#��f?d1��,���w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w�w}��w���{���x��=@��[���Z��w*4�:�*E��L��*�BPpa �bQX��	�{'J�{�KW�*'��Jb����PR�BY�'O�����&l���)�d#���pH���c���DPyS�����K�d"`�@q�*�D�3KQ�}��I/D���;wX�Yj����	��di'q��4[+`2�Z��D�S i�Q�N��.�S�*�
�i����=-R�9�*Ui��I�Hd"�Ar��T�;���-'�=ei�+Ow��[���f$�K������=I�W4����6^�/FEB�"�{���Ms/����Z[���\��ot,=�wn)���T�����QE2
Z�,EE�`����[��@I^����qJI�5���bI8��@�0�����.��9�c����8��c���8��c���8��c���8��c���8��c���8��c���8��c���8��c���8�r�c�b��N��-E�����W���`Z���]*�Mq���U���nuD�#Z��US1��on�/��q��X��X7���V���Y�,�p(Z��M���v�����/���b1;z��:�R��un������*Z���S��#J��H�\RI"����b��@�}UQ�J�Ns�v�L�I+{\�1������/P���M���]������m��jn�����}oF���KY)����m;}+R����L��p)����LU�.��qo-�-���t�7oP���2V����1��4��DVrN�����"Q�U�����Y��������Mz�=�-��'��][]y-��U����1�k#
��#��Ho����T�19@�
�S��l����x��9�;������;������;������;���<��G8}�d����|#��5Z00��L��rX�4<:�P��g/I���
[��!�xJ!�Z(�UtB�~$)���7�"����q)TQM�Lr��dS4��!@�kmt�sF����2��r�$9
c��I�-�=�����:-�� ��������@��IX��Q~MP�LQ���N=�f����9����mG�����5��FK�!�1As8T�-���1wx
�b>�_���ob�Ho:`F�^W"qQ'e"#�),�sxLQ2&)���S[�R1�>��dPA#�4�*���)�"D� �)���q��$����:�4�� �W�����VP�H���c(����m��G,i
Gdv8��
�
��~�d��ApR���@�L��LR�C-��e�����-v����M���V�2n��6�����ji$�dI!s�_$"e
878�����1����R�m�}}����MF�E�!EH]ov����"+�Z�I(�����v���b,D��$"���^M�X�nq��![���y���dl���E�b.����9�s(�����z��h�AY"��;�m!�f��}��Whm���.��5-h��Idk�S?q��#*9H1��;M��1>Md��W�0w��u�x"!,����i5�EJJ�qk���+����SN)cF����QCJB"rf7��z�����	i��^��*
���)M�7]_WL[�oD��|��B�D����+�b���)��D�`
�w����g����G�}����
x��4�����i������)����:)�EC� 
�oe�0��Krj�YX��W������u"�*���h�uN�����U�J���@��Q1��<��	Dr�Z���*(��a��7$w%�B=n�DtwG1����[�K���?F��=���C�������kM�J���W	�8�+�):��X�cI�����D�P�������H�0���ST�����C�%(�p$*�i���E#����NLI��)���G�5;��2[z���1��9O���j������%G@���l,�E��P�p��H��������"���j:�B]5��i=Nj&	)��3�R=�����#�9`����p��
�L�
kb4�A����2�u��-�t��+Z^���N���1UPp��}-~Y1!
�]��(rE�-�3���v����%���x��N��E8������!n)�!��Y:�J	�!�t�T���n�7q�"C��;�5�uW<qn4B�_&��M$��v=��<���D����:j��f;E��s�A>��l�iG,�`c��TP�����!B��,�%�Q1AC���Jcl�!�XS��M�v�,F������:����m�������*F���g ����UX.�!��(q0���v���5��[������N:����T��~���
�����A��QX�����t}r{J�o�
O|�:�OZ<��lUSL��9\(ej�*���#�	�2�h*��*��"�%E"@O	o��	DM�t�]��9g��G^U1����-����)�dJ��F��{"��H����\������m��
.�sS�����C7O�!
s�b.CpP��;7��&3�on�H�����M��$��[8UA9a8!D��w��(�9&g1eP����TT�M��/[�x�T
*&@s�Sg�W�U6�7w�/����i"vNo�������o���\�1��DfF0�x��S��z[�����z#���9$-�����$�(�\����TNh�����`E�� T�.��<�
cnt��(���Pj�&����Yd�r�\i��9Y5�:�9A-�d`(#m��
�j��zDSM��(�hE��0;���1(&Sx$�@G���s_@Q�6�WS� ���>
���:��=���}�a+�QwZBF�J��r���9�Y>o�J�R������X����1�S�7����&��k��Qj6����*��
f������w�#��c�r��L�Tw�Q�y�-�kl��5/r���{��J��������cOI���&��4_���
�����Al��p�7XkR����j:"����U��nm��v�����Kj���g� ��N�Hd����!�n$�&��3���"E�c&����8;t�;�(������t@��D�ti���.����5-B�.���[b�;7s��e�����~�6A���EC$(+�����5Gu�D
����3~
QZ�����V���*T�@T�]c�8��;~e�
�2$$Q;���!��(�]�"�:`n�80/�e������:�TrR�pF��(��JrsM"*����9��T���!2'(�A��^�A����-7i�~�[��K������vv��R��%_[���t�"��d^�D�(�����-��6Q���H�����vNd!�|����r1��EP�L@�!
r�5Zv:��U:���!VF\gn�_L�[�aP
����K�s$����is%�mw;F�-Qv|>���`��q^SU�����+3T&�9b5r��>�(��b�Q'n#;X��u���jOCh�R4+T�,�9OS���b�uoc�%��z�����X��j�������,������u�HI�?j��^:��9�4q}�3�Q3v�J���E�W#;_ L�(F�X*e�� l���-�c�	��R��D�EF����2f[�'��
Yl��=�;����B�� �����L�����J�����:Qb��C��L^��k����:UaS3�8��r���D���3��A
c����U3�,�@����T"���7J a�(��`�pC�I2��)�G����dV���S	w92��0��������Z0��V2~���%�����������,�"b��]K��P��gl��H�)������&�o$U=h���-�:�%
��O����R���y2�X���L���d�g���*V���	k*=4h�:t��-t�7���.e�3NQU��:�I�8(9���3��%�[����@����|#��@J`�.{Cf{Cv�<<8�l1��c�=��{a���!��8C�p���l1��c�=��{a���!��8C�BS�:���h�eGC��������n�5L�x�F�Y�"
����.�y���`�z}����Z��7N�BZ(�7{#��Rv��`��MJ�n�g@S*����S�G�(d&x����k�R��E����ZU�b����I�%H��Vm\���p�v��P!2HZR�7���Z5������������v.w\�x�pd9
]��n�� "*&��p)�PN���MA�7O:��F��v���,,�WI=��������,�G;��Q�(UR����h��	�$�K����4�[v
�]�����Y�W��A5W|���.A��Q/z8�����Q]mn������Wf��@�$�4H�%bi(�M�T��L�(S���N��/�=bu���3�?T������>�C���������Z�U�zTj�
��`���S���/(6���X������UHS��=�<+@b��0�&:�������<9`
��c�=��{a���!��8C�p���l1��c�=�����]v��o	ZZ���^Zk{}-���;;��T~���U59Fd}�9NK�1�>�c)��pjMEj��r7�U�
�5������O������k�B!�>P��Nu3�(�=[�l�/,�Y��K�n��\��BQW�Jr���c0���R�&B��}��G�:��[��tj��x�|��-�*����*2Q���>�nC&���
���P��������v�r�ej4���Vz���%BT�(Y�2��K��D�U��L�@��@D���F�,�����`mk�e���M�V���:T�r����2�#�d��E��fT����e��r�"5��v���2�K6���Tk2���kP�L�	�A$��d&@%�� "��@����G-��L �e�[3����l1��c�=��{a���!��8C�p���l1��c�=��{a���!��8C�p���}�8l�$�j��M�e4]B5pA�)�]�Gt���iG�t��7���^����6�RB�q@<3�iYW*�P��P���[3��a/}1�K�m(77Pi��+D�E�$��7uz���f!Z&���n�x�
��VnB:�-��j�-�V���d���V"�T��=Kp_&����&��!����;(�IW�f����F��n
HR�T��b�P��G����e�
*)�(�3*�1�6�*K^�+�%n��@#dbt}h�l�1��c Bf�r��"h�{�"�U�(��5�c�
lVZP�����nMkg�g�;�ZVL�gW�[���t��D����� �	�D�O%
s�NX�PY��#^�OT5-K&y����*ye������XLeH=Yg@"E1R!JB�#�m���x�=��{a���!��8C�p���l1��c�=��{a���!��8C�p���l1��cw 7�����
"���R����Z�LS�5{�z�lT*jNf��9��>/|�d`����~����5��N�ATZ�����w4��&)z��.�|3F�H����3��*��|��f�F�v�V����M5���E�W��Z��<���L������D�)C�
B��A��3W�?�q)k��6_N����r��8JJ-�����	�h�T�C)��a����F��U���5�����45��M*v|��}N^e�+.�S��z�  @�
"�����.�k��6A�d���-�*@o�
�n��kMM[�%$w+��'�P�pT��&(MRkS���e�k(�����T����l����Tm-J��n��A2	;UA����8oa2	��� c�f6c�a�P�;s�{�8C�p���l1��c�=��{a���2�\�
d"a���X���������c�}��1�������u��}����>��s{������_������c�}��1�������u��}����>��s{�����y��Ki��I�
h����C�;�wYI�Ii�I'I���V0���d( ��t��
V��rY��KAP�����SB����k�1�h�G���r�T@�l���������u��}_�=$M�������E9BP�y�JZjvB4��6�J�lL��'�Rn	��V��������������SSo�N_j���i%W\t�\�OD�QglQ? Cd�`0�������]:��.�~�v4sF����f\J'�%=	S,Lc(�����D��6�����PUe]��H4����-�����TY7f����[9IzKE�$>f1�Nl�zuy����N�o�Q�}��L��gn�y�f��P�X2p]���g�L����yh�}s�n��V���\��D��t�����rV�cX�ax���]WMJ������I[�!�?E���-KA��D@S���E����$Q!DDD@DDG1�e�����~�>��s{������_������c�}��1�������u��g�}��0&�<�wn��;�I������}MS�]�j���������)N�'�p���,`/.���v�����W|��fn�Uw��B���T�+r(y��:y�\A|�T��0��S9S0�LB��]�+�'v��'GVv�U�R)�����h����n�/Cv��[���p�$�A�J���-Z��P�N�5KP36��UuMK�>���)Q��?n�S�<��L���MR�U9����\�=��f]��{�VT�M��1ARU*I��\�k�+v%w�)��w;:���
�k
	&B-E��^����N�E���6���u���X�#F1nc���*��gp������YU@�q.�kqjm@jn��;��
��t�E��J�4�<�ab&;�d�{�pu�P���(�Ch�w��0�Ls�3�8q�������u��}����>��s{������_������c�}��1�������u��}����>��s{������_������c�}��1��������uoV[YJ��y����WI:\�)(G
�9L��d8o�9��!��r\M[��WX�W��9K?@Y�b�����ww&J�1\� �y5�E�1:�9��P��a�k�@���V���<Q����2��f����G�H���(P'x�x�P:X�e������E%U��%MPt�n�Z��hX��/n�
�C?�T�bB�q�V�>����d�VUy�8��)�V�����J������L�u��d����fJ���6z"�P��]�����~�k
X��9NU0����m5%i[��U���4w(���������y	�lj'Pv������:��MP��5g�5p�f�\��~�����&
��f��"2Wx��ik�r����3'
j�������Ae��^��:�$�a��nS��L;�68K������_������c�}��1�������u��}����>��s{������_������c�}��1�������u��}����>��s{����D~������U�����oi��h�n�R��p����P��kZ
��:Y�)���D�a��]�.�*���V�OU�����:�����+eQS��tmIB	X�G�2+A�f�C�H�9�A!i�E�R������Q��������2��'7J��"�����L���&�n��v��������]��5E��V��������kJ����aT��.�� "��n�l�e���=�w�O���X��mm������m"i)�*�/�� �B��V�tM�4P���&E�v~X��Y�N�[���Z6�C����� ���P�������R9�\�\DK�$�n���Vr��J��k�kOl!V��bX���s����T���
�Q��	���9��1w��M���	�;xD2
��{������_������c�}��1�������u��}����>��s[`�0����%yG�d�����������7J b����f��*m���3��rv����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/�(o��[��������L��/7���|��^���!�o��`�Z\��dd)��\�d'��1K���<8�����X�,���T
�R���26�dg���"t`&�o��3b�2��������`�����1E���U
�h�s.���
�Hb���wH@LS6���f�z�l�p������XLm���n��JMB�FQ4C��\N&��7j����D0(�(4�F;�\R7|)"S�tGi��<�����j8�m�����|"���j*����� �.�@�F�p�)�������<�w@v������N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/A2r�\��A �b
@�x#�[x;�L�,U3�n�"�\�b�eTQM����o�a�����
��G��v���w��\&�	�d6{@C1
�!�����'�����"���P���%�!��D2���B:��)E8��e�[�U�	(o9M��s((��&b�(+ �V@T�6n���r(pC`�`LvT��(��c(�q�C�����
m���d��"��!����Y`"��D���`����9ctS��<9��������K������x��(�"����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*������&�j<������5�`
w&���d����'L���X@r��8L>Xw��0*�*�y1Qg�|��`Q%H"���������S��E����D�Q�r#��Dr1G#g�R�J�����,c��EA(�:I,)�A�D�cx@!�!R0�Q�j�\'���H����.�`#�pr���I ���;�S:d�0���P��!? "��?�S 
�;��|�
������A�!���A������zA�
U�������I��H��YfP
��0��������5y#gH6Q�L�e�wG����oKGi@�s1
�&����#�wq��S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���~*��������S�����N�{�/��:!���r��-���%�A�-��x'�iPQd�-�c]*��� �H�sn2�w��9f 6�4�dI1U`�9�\���@���3w�<�0�����H�'��2��*�1Q�]��0 ������?(��s�Jg8�9?�JS�-����3���RJrA��6Sj.���������L�7 sD�Rn���G�$;�]FK���t�c�&1�`��6b@ � ")��)��
�r��������*�o|$0dl�v��3�^���a����#s���R���^?JtC��x�U)����T�D=���R���^?JtC��x�U)������Qn�8=�u��EF��
#2����72lW@E5TPw�6B `�6g��`��������B�0���y�0]��.���W!Et�s$��Q�_�Yf?��y�/��F<���k������?����������mtc��x�6�1����]��^?���y�/��F<���k������?����������mtc��x��C�L]l��p;�I�L�!?��L\��ATN���  =�����i�j	�`T���c��r��g��@�����T�C*B��f&D�P��**.���(��)�}��s��2���)J�����`.��DK������2T�L"a(R���~PHE��p���d���E
XJ��!�D������)@2����Q�#�7�d7�1"e]R��{xs�8�L�J�����i���R��j,^A@� "=��}�����L�P�P�0�@r�.�T�D7�,��
t�=��b�/��E��,��h�\#�x��C�E����k������?����������mtc��x�6�1����]��^?���y�/��F<�����A1P�(��qQ�G��wF)S*�b�\�-�L�z@��rH�+z:��\�Mu{�hw�>�XIb���"��[��B����DT!�}��r8�
�7���.��*�)���"�NP�@�;0UPmN"�C<B�T��d
��P�8�����;��*�(b���&D�X���D�r�W�K��@@�@������s��!���F�(2	D�<��xD��)7	t��[�Y���u/ID�� ���\��<	LzTLC3���)Lt�)��)���p��g���pK���FA���]��^?���y�/��F<���k������?����������mtc��x�6�1����]��^?���y�/��F<���k������?����������mtc��x)�����f� Pv���9�3�m�807F���A��\�S(`YU��S1v�o�����h��J�$��]eEch�PXG��C��[�!�A����UCn�b��ey?��B��3�)���;v��mK�b�xm�jcl?���ow������S%4QD��8�v��r���:�*~D0��q�,���`E� t��\�i������c��������pdm�Q��@���U�!8��*fW!T��3),�s0�����2�)�HNs���;L�%�8x2
��i����1����;��0:�0��2�����?����������mtc��x�6�1����]��^?���y�/��F<���k������?����������mtc��x�6�1����]��^?���y�/��F<���k������F-������Kpnp)�U�QSx]���R����\9`�+z=���M�T9D��]6�*�cf`�6����Z=	SY�s�)d�����Em��?x@��oL��2fL����0p��bR/�,��@@2QR�p�UX�2p�gE���(��V�����n�"z9���)h���R���%��
P:�l���1����*�p'(u
�p_�P��M�p���&{��7c��~��n9�tC������������mtc��x�6�1����]��^?���y�/��F<���k��B4������R��+���7UOz/��dzgB�%o�2�5Oq5q�B��?l~�����K����to��Z^M�C��F1�������HN�j�y�c�2���de2(}��g�M9jB���=	R�*�������J�����T���QO���8]�~��i �����$&��E�lk����n�����V�aJSj�M�����.�W*(����a���v���g�L�c@�}|���Q�r &�
��/�u����� `"�(LQ0��i�F.���������{OQ4��)�yqe�!T��J.��J�D��*����2[��OaN6�����&�q%��N���V��\�+&OK!�R�DJC@3j�RZL��j��M8���C[���qT��`�%f*�OM�pBG��29�`07Hb��)���J��Z��}�����"��-��8���aP�pQ����B��H�7�&qP��h�Z��^8�g'n���U0��Vz�U�rrh��xS�b���B��P�;������ql������k�������������qP���4M6"�4��0!
9(S�DcQ)�8�����O��V��z�EK�8�R�"�����xA3�����)��@���F��5��8zB����j����l��i���,.���URn�	�+����gQ���ebn���������G�F��[M
�4��H*��IML��f�D"d�L���S^��l����}D�t]`�i�1���aq�TP����o���c2���	
D�����<���.]T�1mD���)�$���w���^T�q��DG<P_a���JjCNR�2]J"R������M��w�n{I�L�&���������+�[���2�^��T�8���0 �����p�.�-Q�',�P��Li������`.
��,����~���AT���2,��R���x��i�Ub���a����l�-�����t����� ��M����9J/ ��c9q��6t(#�$l��*t��`�.�k�R�����5��ay����n�7M=9YU���$L]	D�*-7LS��2�0������EP�����r[0�}aY�pc��`�GPV�� &��Wu��TgODC26������@bdShl��u�s�^y�"����x�v����R'o���hgF�*	�9M���=�������:{�M%�G��������t�����(�pE��19Si����Zy�4��}/[6bqT���`Yg�*�S
�$
E)������ao5Gs4�h,u����n��0�S�:����1�z��?���Ev����E&	�H�D�����et�����w������R��4������d���`�<\�HJ7I7���YQ@@6��)�u	p�gmo
���I�������:���)b�8R�E���|�������@9P0�v�v:��4��ag����+o�4�����-������p�$�Y��l�H�l�K�t�9���n��D�)�����a�'f'�W������nT�v%@�P��WprI1���V�W��R��cU�;(f��������`�`t���1"�T���faP�
��U@����A�N"?w�l�������O��Wb��]Zb��7����2��migj��

���6��
7
��8L�rB!�2Z'�����^Zc_+z��t�7�)�l�j>�-,�:<�X��TL�b|��J��f���)����VI���CO�����V�=:ELdSv\�+u���f����KvJT�/T��U�U}7!z�i$�{T�-Sx�Y���8K�2��5�
���uB���]��m���~k#j�Y��:Fr��QfUi��q�*����h���t�b�3���a�Kt[S����u�`��Gc�u*�k���~z�|X�]	���8��aM��[�H�T��by�nP���h]�����tL�dsH�r=�>�rF�L*��5���E��1���|�0%!2�"��\�<�T���gl���(�s7��
 	�� ����p?�?�1����:k���2��o�X�}�w>�;�w������s����q����}�w>�;�w������M3NS�Z�"%��:9V��UR��8�Te]�D�
�xk*C�s`�]�5����#i�	t��M#.��Bu3�j�R�U��x��!vd�0"�*�@�P�Z�Uon���f�2�o
����Tfp�[��"1����c�n��x@�5�)�X�r�����L��c���������(��v���r:��l��0��0ioV���Vz�Y+�_�T���T�&�R�3�L��B�U;�	8�e��S�6i|A0���,b@E����6E�yi$�0�	�D� ��� !���	�����=Z	:��e*I��Ep)l�Fu[���$K��+e\��Pn�;<(M&1�(�F����R�n��2�����r����#f��e���d�a)�00���)�%gD]�����RV��P�����N�U���{�.D�d��G"�iD�"S�w�K�e�����-��k5Li�f�~�j����������_����4Tp2{D�����;}bX*>�[�:��� 
������
H6repEA3m�.G���	��9m�,���}�w>�;�w������s����q����7��t��)n���l���<��S����i�{��(�V�����y�����TWr�y�E��Yg��D�P��B��?I�7N_ �V�xEW�r�(�R�������*��h^��v��/DS�ns,W�V�U'1O�CH�n�0PB`�Yu
d�2���4���Iq�Zr�����db�g�I ��_�5�D�~Q"*`!����
A\�k�Uv"�B!�����i�����L�X/U��N�C��?v+;8���B�5����qu#HR��k���=>���&ZT�.�V�c
�:�E�\$B���~6n�b�Qz���w?�����+-;L3D��U�*��� �D,T�i)�&r�\��\���P�0���h������6N��V���6���*��&����q���#`S���
�X���*�S���.}R��F�^���R7�c��Z�Q������W�7EN���G�D�A<�(���b�>�&
�B�8� b��!��w>�;�w������s����q����}�w>�;�w������s����q���LN�,D���%t�94�P��Y�r�����}�WV�+@����"��)�J?O0���{X�?�]�$]�21�K���I�!.;>c��16�P=����h�5����R�$�[3LE	Gu��8�+�T(D�T���6�����,���:��
[{������tZP������jx��!�U"��QP0�Bn�E�����d 'j�@p�}��>�g���?EU�����=�K�RS1�}XT�"��Y�w	�h�V�L?�`�
LR����s�0����,%5A-P� �~��i/Z��L�j�:l�rh�8�G_Z��W��i��������
�rz��3H�Yf��$�5L���L��E�D�0z��������<mq-�#��p��X�f�*��H���4�Sy"����O��w�&�T�������"�u�rJ��`�*#��pJ $�n�Y��������s����q����}�w>�;�w������s����q����}�w>�;�w���?�v������c��G`i��R��_��@������RFR���J�I����8Q�S��wJ%�o��/������:���n�V1p�u��9$fR��c�-�s�Z91f��D��c�0�&�`m�K{^�"��%��q
E��Ub6��%H3�5�8&�'P�(�C��UC�Z�)y+;=�j��k:�a "���Y��VLP"K�.V:)r�PN�`6f�Fjy^�{�k�4��oA���5F��������5zSP�%�"�#6�]��b*-���4�z���X}Nj�J"����6J���k��)%p���UN!���r�G�i�g�j���������T���mPX�����z����4 ��j�s6�z�L�)w�cw����DLR�R��*}����S��0w��t;�w������s����q����}���y��a�/�E%�\s����������u0o��V{"��L�F��M��.��f(6`����nB36F��<[��mPY��zR��d�/��"�mV��Ze��&�
�\$dN��xN�#�
=vn�YGZ���XF�������(��@�����B����@���i�\����o ���6)����T6���(��	���Ue.����0!s��&�P�*����H]/i��\
b���)��m�m��~�F�%oF��=[+S���\�$��l�w�>�xk����g}�-�l�#G���)�]gd������L�\�b���d�9f����--��.N�P��+	����H�4?�4��j�X�VMy��M)P���`���^�z:��5#;/Y��6Q2�����JRBu��/��SzH�YP($r�B��>���;���iv����u#"�f�yW'0�b����`v�.[������d%�`k���[�L[��E����[:�d��Z2W:��	h*e������H�D�)�#��GL��o�rB�=I�L�uZ�6���}+W���o�]
SG#e/���9C>�q k�6��ZT�����*��}+p�{TT���v��4Ld�N��h�?#��Du!LG�]	O[�#��>�Z�){�����	�&��Jj�����%k�Rm���Sdp�^{�T�f� !'�H����kwOVV�G��''h&�A��������k��D�NK�����bVt5�������f���co��v��+D�I��M�D�;�S��@@��y�vh-;�;�H�@�=�Z	j�
���$�"+9��vL�9pt�A6�C�{Hc-�T�������)7�:������f.�tl�����tr�2K	��LD��	Lj��~�E�r�dP�U;?I[�u�1����C7N�
T��� �p0@��L�-�wuk&UE�h��eh�	P����aQ�W1n�������"��,�� &&������K��n���}��������iRF�9Y��Q
*���'(�%EC����r����w7���$���k��w}�������;>�������[}�
>�(S�v����
���=��c����Z��:���F(�E�*���b����t�7E:�rWj�k���*���%�*����,AYgoJ+Vb	�j����8�P��HJ�Zk-�����Z������-*��9<�]&�L��
R�(���,�����/|����"m��L�WS�i��>J$�QG+�
�G����
=��q�k;qg��
��j��W�+E�S���*5�������9�����"��3^�+�TJ[:CXZ���]�I�h���O�`<d�%]�*1v��P���T� B$P>�7[�(T5
���5Q#��f���������Q�q���Us0��g�c�:(�a1���2c��y.��:ti������	�_QB�SiF��U	�#�Y&�I>U#�S6�@�2��S��T���@�\	H�v�:��V�FA�I�����"nYf�����Q��]l�+
9�
���U z�d�L��G=U� 	���w-�C,����1�S6�DG�F9Co������n�oU�5b��Rw�M������Z7����v��7#>�-�3���Sog���(���t��+�=$Vt����.�Q��Y[����QK�rb�EJ�L�u\�!O!��0��R5���In��gNE�J����!���.�bu�������k�=��P��cUB~G�����x��Y�7�v�L�+�L�eQW����y �h]����)���j���.���L�V��(�S�dp(��p��Ee9�@S�Q!1�-V��������������UN.^�4�c�����mQ���.����P�`�jq�7�ou����yf�I��r��j�����9��q)@6r��##�\�)����3D�.���9p����A��4���K���������b$�����������g��A��4�Bva��Eaa�~�Yr������l�`
�|.����
�eU����k�W1�%���rw4�)T��v�	H�&@T��  s��n�V0V������V���$�)Z��J�eg��*�0*&r�4�P�Os|"$�@G�PV�)�]l�-GQs�������k��U�0�����L�����K���9���;<t�`�1to��6xK}L��I�L�R1
��K���P��I��)��v�~�p��5v����GPU]�����6�����CJ]v��	��
&(�Dp	�y�tG���,����!|�&������B�:6�R��V;:b2�|���{�R���B;%�
�W�����h����'��������gP��=C �"������s]��3r)c��\[�����4�)���&n��a<�VdMT��B���`jcN����)��Oj�?�ndY�ypk��vp1L��,g���1�
C����.���z�$5��BN4�8��u�G�4P�1JT�O�f.d�DG,�nY����|����)z
�#}l+]��W��at);{3[;����
��sR�JF�Y�J?nf`���b��S�*-&���i�7�v��3��oj����#�Nir��
��
�pdU��I��1�2��c^]P�����9?s���;��������W�c1�������]l��T8:@@�c��SI�+Vu-h.���!�c�g�cG�V��v�|K(8�&F���I��nBS2�M��1B�[� ����m
b-tcY&	���L������C�j���G`�wO��J2YkIC���'����i�6Uz�����PB�e�0�����:
�,`.��]�����
�P�-i@���\��j*N����h�d������,�A��7��D�)t��UjR�j�v����2��)�]m��e+]O�C�W���J�Q,\,F��I�E&�(�1(�$���T�w����+j,������F��E�HZ]�� ,��5N�yf��Y��yC�0	D��"���d�������s	DC`�f����T�����dNX���@�)�M�s��v����ST����a�������-�g�)�����T\4nW-A���1����EM�*�U�vn�P�)j�5yi�C[��'�R.bi��$v�"Y(���-�J�uM�*~i"�����t�LU�*�\��J"
������?oVmn����(I��]]� *�	�[�Ehb��.��`�������c��@����d�:a�X.<������@������l4%QZ�vR�1��rz��3��LX@��9f#b[��E��^A����M@1
��P:��i:��0n�ml���*W/A;�lW�5Y)��R�DZ=P�*�9��`6�u�����}��Sv%�m����S
%i��n��oR��Q�^1�bz4�T�S8�Na��H��*�����7R�D�;*��G��hy&��\����������5 �";�Gx����(��U�n�,��9��#��\$"";�{��Dr�Ds�R�"���� do����^R�Fk	B��������m���J�Q�*�!RUB�P]�sf)��cj*������i�J�����	'n]��u���(��S�3v�.�sWU��X�*���
=]P�Z���Z#Y3�"�en��/$k*v�0rf*�EXQ��#����	�9x��k���<�%��d�$���_	L���Bb117��.�KxoK|f�)�j����v������Q�"��]�Q�j��H�k�����`���9�)u�h����1�60��Lc�>^�I�5�i:�z2�#��f�����9@�O���g�v��({a\V�����;n�?�w����i��1������A7zl�2eE# �A4R:i�r"�%"E2i���c�c�9�}C�%���(����q�?l������C��QP���RP���E1JA�<���=��T�l�D��)s�!�� ������[���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���[���������x�V�ky�x+y5��EI�������b���n���y-\���Q��<>��.�mi�W�E^���ax����8MeLAP��8�@Dvx������w&��EQ��S��4��n�
h�(����m�����C����nl���������B�0��������$�\	����)�����oM��CK]%v5�mO�HH��^KG�(�.UP��	��c��*
o\���aQ��=��Hb"�����R�����W�����P����!�6�{�ut�i�-�C�(V�,��iD:���f�M+ %L�s�����	Kgq�*f��sl����j8$i��"5h�#��R�S3^H� Q:x�E�kQ�������d�X��j���H
PL��6�xDDZ^;��+MY���#�~X���:�t�NZ �*�S�*����XM�D�A4�j�v���F��A�V�"R��
B��1�����Mm��������[���������x�V�ky�x+y5��<���o
�Mo7�o&������[��t�����n#��3����x5�
��wMO%H����W�*��z�>2@�f�	��*�@ H\��J6v��3��&*�J]���K4��h�H(�L�L&s8��o���Zn�[N�ST���;N���9����\�:�)�pK�f1A�@�)P������N���T��hA�Tue:�i���@E�Qdc��AI3��O1�)�@�H�$���v\�A��F!f��� ]'c��P"��e�:�9�NeT�b	JVR���"�4X{����U�c�x��j��O�T�����Q�9[�P@��������������sE�&���9�jeda:��.PJP������h
�j�Zf��bB.��3��lD�N������9�1�<�)ST�L�I25�H�D�!s&y��~���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���[���������x�V�ky�x+y5��<���o
�Mo7�.���{A5�����	��&�������5PVf��D(��PD���<9��Vu%@��}Iqg���*XR�1V�E)
J�m���]	���da
���_vf����ug��(�<���6�K�yF~�A��s���`R
K]����u����B���qn��$��RJ�&��\��<�xG<FVw�O��Up��:.~���#&��oA�C9�Ed�W3�G�{��aUvm=pm�C0R2���v�)�E�����3n�Gd(�"MHV���e(�3�i���vyj�6)O���W���J5^U�+L���*E�@��#��"".��������!2�E!U��	)�L<���E����7((�#�c����o �U@d��v�JA���"�M�7Q4�&R$�I(R�)wDl5���X�V����A��)*]�l�5l
N�����3o���xDs��2�#�]�	(p/�8�<#�3,�1���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���[���������x�V�ky�x+y5��<���o
�Mo7�o&������[���������4S��vjv��<�$^$o}�X�#����Abf_��[K;j(�kn��x��I���
���r��|�����(�����3������V��|j��J�
+D�U�c8R�e��.�s������a
uAi*���/*�v�� )�F/�&X�� �S_p������R.yr{����Ov��TJ���Vt���2�[��h����0�S�MP1�`PL��������r�"�?��������H�G5g
}4�) bt��<�i����2�P��&�^��=1K����p)r@���P+�f weT�=��`�?��1�s�5��1�x�?��}���<���o
�Mo7�o&������[���[���������x�V�ky�)�j�d�k{a<1.��Q����b�&�����J!��g|&0e���&/�����|���D���j�\�C��=�pm���n��(�
~�@���x�k���
���1����c�7�_���o&����M���&<y5�Lx�k���
���1����c�7�_���o&����j��o7N�Q
�MB�n��H��PTv��i��9	s.���}i����E�8moU���A[���s��Q6��*'�p��q1�����mO�U�<j��Y���H�i"�&�$�B�*%����gn(Zj��2pQ�5?�Ze�rO�1d�*�9@�&TLq�0��G<+v�F�mEr\�x����O����I��(�2%q��,�Y())�&)P������C��f������+x�B��(vI���$c�yE��D&��DY���K�j��l_0�q#G�g�P�"O��P*nk�&)(�b $.b bF��yM��\��+JVQ
LC�v� �\��T��3C$���u���m���+'+CA|IYC6M�y)HC(��"�]�G1P���+�P�f�J�����.(��u��T��y���	�]�
D�TYe�6`7�u�:K���"`R�p� ��D������&<y5�Lx�k���
���1����c�7�_���o&����M7��T��DI�H��@�D�C,�{��
���i���WBE�uU�i_�
�C���Y��9�n�EG &Y�Q��.CH-�~�B�V�T��3�5��A�j�c���dD� �@�U���T��R��[��8�N$��
�^;�AD�@.��!
P�p*�wJ����}#)oj��c���%%�z$��>��$��~���x {%�N>J1hYL�=���Hz3�.:H�2j�������C�	\�G��=onq�;J���������)������)�r!��7{���go���������1��4���8N��aEUT�&8�m��1N;��������*&�b�:
�������j�?�F���S11���:�a��<��8���$�";Dq����c�7�_���o&����M���&<y5�Lx�k���
���1����c�7�_���o&����M���&<y5�Lx�k��Ad��*�AYSEB��	y1T���A��rPl�,?����l�I_�����URb�$�f)�0�tV�M.A!L(�r���`�B�Z�:�����J��!,D+� 
�|� �SA0*h�c2�\�FX�SGZ�X�~�5
�SWnUYGJ�����S8QW�8�sd\�����4})p��=\������'U��j��dc��d�Q����*m,�~�LMAw�\����yxI2&���@u|��X��o��-m������0��:T]J!�u3a���r$uTB���[��
����iB/N�j�Az=�p/��htH ��O��AC�9�s�G2:~������'���\��%A!d3o�����r1p�3�La�!)
T�q��e
��(��"(@L"a��#���o&����M���&<y5�Lx�k���
���1����c�7�_���o&����M���&<y5�Lx�k���
���1����c�7�_��fC�^���<'@_{QF��1)F�I�u�"�L�jB�n����t�P�X
b���<�F�[{YF��D�qm��G�OK0��fR�,/N�qs�w�� "#��w����!��U��F�}���=0����?,'Xy5�S�1�cG��iN�[���8�OU��(�"b)��c��95���M��������k�W�"�����3sU\�����9I�i�dD�n.tI� S�������i����/1D�B$��y��Q8��
@�QCx
����E)A���*����v���/hJhbd���W�b�D�Qb"
fqI(��`!� ����a$�J'8��8L""?dq����c�7�_���o&����M���&<y5�Lx�k��Pw�QT��_,�/"`������)�"�R'� I�%����������_�b��9��S ��f���L	rC?c<m����b���/��>!����7��az*?���^���x������>!����7��az*?���^���x������>!����7��az*?���^���x��`�%��*d�B&T��xr�p��6����k�M�5�r�=PA�T7����>C�C�s��!L9�=�S"R9�D��"%�.������H��H�}������J�T
1-��P\���6�;�vt|K4���z�RQ_<�%�tDJS��f�x1������S&��Y�8�D\�	
R �r�)����l��3�%!�-��J���E��4�B�D������R���
#	r$��)�������	
b;��Hp�9�g�a�Q����6�p���Dvs�l�dV0��P8C"��	��*���
�n��]uc��$P2��)M���C|��C`��e�Q�eQAb����a$��)�f���xJ��<�`
���e����FGH((F/[���7YqI7fcA"��f)|?gh��`��8w�l7Jq�"�m�-��a����T���0����/EG��|C�Q�o��T���0����/EG��|C�Q�oD��
�O�~�����+�����*h��yQHTW�H��h����F
n�e!a��%7��6�D6���%
��c�YF�L�zI�G�L��� ��\�q��\=�����B� �h~������v@G1�#���S�&��'�1�@�DPTw����������?s���1����:bAm ��g�z�
#O��x�3C5(n�CtD�3�tv���O@���a:%�9�S.��A���)�1&��|�r*i��=�o�;2�#��Ao	�P��`b���2@;K��e��C!�!z*<��>!����7��az*?���^���x������>!����7��az*?���^���x������>!����7��az*?���^���x������>!����7��az*?��_� ����c�
��x)B@������u2����'6@�����
h��@����`y�Q�`�v
R��e�2��"�$B�f>���`�~O�
EO��CE�%L�L� �C�%'w�"C ���J!�H*�Q0�0�\��3�NB
�t�(-����yB��L�R���(�Yw0@@�F4C2���0�w��)@@	�)X�i���C�TO�p�z 8!�s��c�D
a�;�f�~��G�w����/EG��|C�Q�o��T���0����/EG��|C�Q�o��T���0����/EG��|C�Q�o��T���0����/EG��|C�Q�o��T����������=�oF3"���Ry��=�`Rz�*i�X�H�C
+%U2�� �T.�
���Xai�L�fR5�dXn��*	�x6��&�pb9�`L�bC�t6�@��6f#����0p�#�������L�G�A���`9�{����f�& 3Gp#���?��S�1�f��������a�x8@�(�	��{v%��Y�1��,���>!����7��az*?���^���x������>!����7��az*?���^���x��N�a��1l�4S-�5E&���&���"R�3��1�;p�@}l+��`�aL��X�p�HC	��Qbr��"!�`G�(l�DG��a�Ds���(n�a���7E0�x����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x����y�		}��L��{�)9e
e77w��B�B;���kJH�"���`�!������������ �e1��n�YT�pE)
*g�S3����%L�pDJ>�paX����e���SbS��DD��,�3�D�9R����0
�!F��9�\��E����&W�LSO%#e����C����H�4z�>-�gH=�-=�H`�B�s(�������d��]��n�7D�p���D�p��L���7B������f0�Bn�s,�����s�12���*	��==:�D�YAASd�J�T9"�M��������6�K�0�����60�Qw%L�!Dr�� ��%
JU�NT�)�,�oI�N�.�U0��
���Ch���zj)���n��rH&�*���&b�J�e�n}��00�9�	��)����A�{����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x)0�����n��9)����0EYg����E2��6@P�G�������)���Ear-�����&�25������HBG�6�B��]��"��Md�:��?ND��=�d���6m����Mu��q���a�}l*�Wr�;N6ZF���*�Q��8Q��+�M3�D	�	�G!�!�����QuH�/O��2�*�y^�v$v���9Nd�(�CnB8<!
A���[������JN����U��4��t�2q�4�YCD�/�P)��RAt��G��"F���������]���\Y�����JA����cF�jPME
<% ����n'��\{q����Bz�����``0����W\�
��"�R�����z�������[�jw��I���r@��	�w��Sd!�6����Id=&:f��0�r�K���`S��7�%�L���sCtS7����)����P�����(n�a���7E0�x����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x����y�KUUz�
%MA�#�Z��qNS���M�����)Pl�f�*`�bI{SX����!v
���S��j����1��|��Y�P:�!�D�xi	T�G&�����&�T�������+
"���l���l�2*uv��!�!��L��%�!����VV���O*�P����JF�*$�A�)��As�/"sl���T���sP���Q��p��K8�[�821n�]]����2K����T�
��D����)���`��>��������%�$&)F_���c��*���A���*&(��"P0e����F����1���i'^�Q�ds�B"+(����f���J�L���!��}II~C�P2��S���s0r���(�>R8TE@)H""S��]53lbj��$��iY	
a�M:��2H�����LbD�� n��WN��v���<3;�TP�S�B&c���y�&]�1�.[��1�MS�iY�9V,e"&b�D�E�GHUl����d�L��!�?��+��C�E1��w���G/c<�
���a�����7E0�x����y�|E
�L<�>"���oCtS7����)����P�����(n�a���7E0�x����y�|E
�L<�>"���oCtS7��ABm��)�s����-����6���\Tu��n��M��1Z6�fuD[��u3(7s>�
����5�/$uSeQR�����*(9j�f$��������
�{�`8X���2&D�p�a�&P��q4�m�LyP(����#��Q���Z�A�4��mx	��N5�tC��9R���|���y	{����\P�>��"i��Jv��M���4��9�I!��d��\����SR�������{X�P�My'^�*���Br��Q)�����FF������{#L���l�U�
���q+&�����F8����<���d;�1l8s�)��(n�a���7E0�x����y�|E
�L<�>"���oCtS7����)��������$�*;`Y����+v���	n�h�N"IGh��R�����U�x��]����v�*2N�����Q�8Ib��N�N@rt(�{���j��5��W6�j�J:���	�*��F�
�= ��*$Q��r�I"B&'��R@W���4��Ic����t�*8n��F������$*s(U��E��<Y��*��5� �O��N������M������8��l����g!����`8r$�cx
�}�J����������AU����(w�U��;~�p��vE��!�QE���\��pp���{M���m��-E	w��q'���������m �i�'Dzvi��p�a["�R������j����������e��/$�������SM��Q%:wI�4p���f��b����������w5mi
�l�Ly��m)W�H�&�\O�	�f\��Z���gvj��v5K��*J�W�$-���}8�R4
;�6�EL&y��tU;���m�7an��}�����������B��%�S�
���R������`qt��� �i�{�4��S��m!Y�-L\J{O���������~���:������U��b���>8�DP\�A1HD�!���=LVn��Z5����
���w����,�4W�<UOC�#T���T�����9����B�^9�U�^����*�����Fz>u�>�ZYEqQ���#�*���'�ycnY�<!�=�?c��;����9�DAs����P��������������H���SGz���\�-Oj.a
������-�	��v���c��	)���J����]^�t�!
'm({�RZ�#��R�O*Y[���v�D���%C��=�J�C����O��k{b��s�J3Fu-x�j�z:rB�-L��!=2q4�p�:-�x����E8��:u�t��MK���E��V�������o����t�������������g�
P�`AR�P��42�
(��5  tJ�3@�I�@��Q;�P	�q�Q���Y�j��/M��Mq�X�0P�]��f[�ec��E��ii�{���t��f#�3������8��c\U���UE��L�T����UJU���y c�����G	9Z0@��1D��I�'L���u�ut'�c���#�_��p������rj^��.�B)�&����
=�0�����K�'q}
�E����>����7)��T$\0�9,ig`�P���f*d!@�i�������WJ��H�*�������j�SNE)3'��Q�]����B���B
���������?W9�$)*��@w/w1�~�f8����n�Qkg!�}��������qRZ�Ol�w��=(I��2�_�����D���ER�@�|v][�ys*����Z��������wQV�4���%ky�g%���&
�W�S��[��;=���n��qm/���-&jb�];�[��K�{��`n�E�od*Y���.��*6g��R3 �lv�R�����YWV�B-��)��j���.[N���H�5g���!U��d�p��Wx�Q2�"�T����'��=J�}�T��gu�O@�$�4t����j����3�!��UQ�TL����C�
������4}9O<���L�����a"�]�
�g���i'���U���92�|�;����p����k_�������N�JM�Z���dT}WP*KFDI���G���T�Q09�@1��g������Nk�L�7Ov���%i�r����$�����er�Y����aK��@9Bq��f pd�������������q�~��nYAX���V���jt��%S��fC�*R�/UC���L]��*�Z%LQ"�0�][W5&�5�I�D[����.$����@���X�VU������	�����o'�d@W���.)i/�QQ�����ik>M))�`:j+,FW���1WpN��Q(���+�n����mB[(�5����/��mC
���g�6��4;��Z���I�2�9C����c/����
��w��u.}{b��Oc��Y�W%o��Gqmj*�������w?&�m�K���u�w/���5sS�A��j���4�2�-�m��^7�h�Q��"��Q8��	�Gb�#u.%���E���������e���n9�Kh+S�uc�����p7V8����3���8�t� �Br���U'(�D@0(��l��d��V���}�F��@�k[f�4���DI�ZfY��#��;�z)��I��J8�
US��Z��4?1Y�/�z�j~�|�(���d"��(o�%)xD��5[}m+��\�v�N��'�nG?���|�Zd�)�&(f�.���9�,8��������<��}��V��e�k��/v+I��1{�C�V�U�8��G��T7$�-��)�7@���~�����3��J�����j���z����8�'S����7
�<\��n-�6)
T�b�
;���o��*����.�)�o����n^��mu'w�rP�����k����nR0�y�pU C�G_�W�n�.��]�2�\���VT�,��<j��B��d��<���f��Rl��
���D�^��s��h:(8 ��q�V""M�:���)D;�
����[���N�>Y��.�
r!��qN���Y�%-�5DS���8��s*��9P��1N&8��������k{y�
����{G��ktV���2)�V���I���$	����*�����f�e*�-0\N�J�Q/mOX���?v(�]��� �S:Yd�}�X�T�r���!
P������Kk�Y
C�v�C���������A�7NQ��w�d�a��A.���������������Q2�<�FH�6b1ndU�1�'\[��L&0��L"8�P�}��)����,MORT�)P^bfzZ�;8��zb"e9q)Lm��rY}Ph
wI���o!�����G�W�2L��*�D�%�q����9�p�M�	=9��}w�+ft��jn�SZ=�t���������^��tW��6�8�f�.J�5��������M<�zoL��vP������T�����F��RY�����E$�I�$�����Q5�R	�1���=��pfF��V�7J�I�/�q��^�z-���P��W��8O�\�}����a�^��@MVER��i"����XE��S���)��L��U�`� !�L\�N������6��[�r����>���*NZB�oE�T��G���*�)�2%�9C�Su���.��*
�����#CA\��f��<T��$���������W������a�hl&��4�{�x�H]�[X�J���:!�)�PIQ��9%`���<*��x@�n�2�M���9��K�J��]��X�|i��\I"��Y=d���.4�3�V)���C������������v{��B������ \�r��p��J]��t�.E�=���HG6V��cY��P�y�.GqY����B*�A��;Mt���9c������)5[�/J�������[�aw+���G����
���_������o���+OJE��
��Tt���]��ZO��S�s������
GM�n��uD����
B<)��$��!P��VS�����ul��eEF�UG�\x�V�F����)Za���Z�q�1�H�n������u�Ue����S�����R������5Qv�$��s�4�(����I�Ot����b����Vu=GH>�i��F�m.��>�Q���G��5#��0�hu����E#71��Wo�.%dYm
[�����^�[�+�\L��:���zT�J&R��l��D�"e)\����)��h4Snl���v�����v����u�kZ�D�����5�al���I.�|��������=%����z����H:<E���i���
��&Q�*������v���O���~�4�cq�������Q�������)�z)ZJe�Y�
�{"����:������7Tq�����v���Z��
����
�*��i�UE���*�Ho�Q*�]vEC�q>���{��R�/���VkQ�r����Q�0����;�M��
���	��.���3��tD�#�wf�����b�y����86���i���2��y�~��.�U����-n'n���+65EaG?*�%��^���'0�&(�SL��S��]��
��6�eCQ�Y	�����8�3�M�TJ��Z�T�c������F���IS?�Z��l�P���$ ������:��W�b�D�����8w���������[��P�=�;�K�����*m�acPH��jq��9X��B�*���9�Cna�kb����_���U5��2*�5�z���A{yN) �@��8�S9v�*_��P�tt�h'n���T�Ca�C���V�
����QLWyD���n��Z�H�� �=�� 	�Y18��+cCE�EQ���}/���gq��K��1l����p��H:�(c�C�1�"8/�9�v��1���o�;V^�V��-J�R���Q��q�%�����SA���M�
������L������Z��)�~�����)6t�����J1D��(�b��U�G	(B��a�6;\{0i{njR��v�����2�)�����Z��i��H�'�0`U3!M��Sb���������%Eim%���LF:~��k=pV/������+����]��pcN}��=���������9�06�����]����Z���wLd��U8�Dr���W�6�T:^��+�a-���5�*-k�
j��'��
r����g-�h�C�f*��`�MO��R�~��e������Jy�M����>K%��e[$�����lD��2�p&�d�J��t��=�F��3����Xi0r������)��% 
����:M�8&��r�������Az���E{����4�w,�0I�SXE_��S�M�z�N_�U�
��9t�P2
��wV�[�[�{{7�;��~��
�U5L%��B��a��o�^��+c"���)8od���ME�+���3��������%+[]��q���S��B$c����c��.D��������Q����w��MW��S�L�����+ ���*J�� G�5;��L�SB��<i�L��������k�-�AbJ���qP�����(��G^�C	�&�������r�Xz�&��z����ij�z>JV"�s4�Z.��x ;��H�,B�Cdl�2�f�����TMl�w`i`���ji);���Vc1\�P��A���n�K��B(`W�U#��C\�Qhu��Fj�N����B�}9Q��\]��1H�$D����2�Wuc
���&�v>]�Q�������$*
>���kz����3���T��VvX��� �H�T�B&����U����,(����(�i	�s�����k�n�ZL�*�"���ce�eS3&��+tHB&L�N�o�����V����c)	��y�E�
�����������"��
��u}+�cZ!��]��NQ��}x���Z]�jZY�C u\���'-��y"���0�����T�j5���j��T�B��;�J���-�1.�������$h�81d ��r�����<��,���LO��Ue��^R���e�d�i_�M"O��������r��Y������7)��7�
�n����eu}�5i*���Xma���UCt�uL�����bc�� ��������L9C�@!��r���1O2ofL��b!�a����6l�h���tk�
\�jF�������-�mw�G�UijB����8��1$+H��*�'O�P�9��vXjB��i����������,�uV�����\����Z�:�)A����;�&fr�Q)����}�6H�D���z��5K}k�%G����������S�)9Z����`�3:J���A��c�t&��I����������7E[�2+����37F�-"�������dd�M����xV��[n���;K�z��P�\�������@��
��B:~�*6)9)�,������5f{A������Q������"�$�<��b��=]14d��)�C�l�U�H��Bv����c�K����t-p�"5$���$e[+����ET����$����$P�~T����#d�F��%luqk)%j��E�`��������W2q/Eg.�A�1�]����h0��Z��L�R��3���6T�$��	B�nu@�L����"l����7�~��~��� (�M��=���"k~�5{Oi������-��*�U);oW8�5QD�r�K�{�1P�IA@I�"�Z�y�v�������I_�^Y�_���R�;;K[�r����d�C��E%Hef��\��W4}�;+;+]�hI�p�����������e�E'H�n&2=�����?j�x��meU�������v�<=��O��H�m�r��J9Q������"�U��6����k5
%-j)�895)j�M�HHCM��C/!+���J�& ��j��h���W����id4�[jN���%�t������-���!�oO��$�1�|Q*jf%9@���YN���VsX>��^�[�M�Y�~t���(&H��������1�3�HK���EC�D��D�	��� "#�����Dv�c]��7M7{U�����%�VQ���*qE����|�n\���Dr���������}�=V�[������F6���TruD\Uru�3�pQ��Ub+�uL�(���D6��2�[�Z�l������n�����S�`��
�*j�I��"�!�09�b�C]����lEum.E�
G��N3��TU#��4l�CKT���D� Q#R����@�#u��MiN���L���-+k����<eql+�Z�5�H���9(K<IQ(�9A.bb������	[~�I��v������&%-O��������y7����73Ph���Hcog�������>�&�e��>�����J����z�]rQU>9#��hrmswJ�Dkn�:v��^�SI�5���d����V��V"��j
tH?�/��j7@�&�& p�DK���@���E����Yz�����y+PQZ�v�>&����@�zn�U�*�"���R�k_S�zs�2����j�2��5%;sZ��G?B���Y�~��$�S�29o�h������>S:<�����/�Bp�����:$�v�<���{���P�:{�o��/�`���m�*����Z���z
�Zz�����}"��s\�L�
X�X�(��m
����f�$$�1)gm-+E�J$)��3�f���D��XR�7G�}B��4����,�Y����t��WW �TS�kO��*�61��$����(���l�g��7jF����Z���EY�����6��5��3��)��gjfF�*�����p*=m8��j���SZa���~�Q�W&��[�l��uJLU�5:���a%����e�)����$0h����n��-�����%ib�d���m���6yZ��*�lv��4����%�FL��p�;-Y:��t�'z*�JV��{����;A�D�E	e�S�6A9���������&�����L�h���UN����UD�/�{�%���&N_|L��{� �B7Z#K��uU�k����h��q��[oN�Uk�V����z���ht!���X�D��J�b��*X�����DS�i
����}#r�qc[���o��4ue�����@����#�C�e�JV��������{�7[E.�=#o����$jSNMN���-��a�g
���QD�br���+vneX�i����!c%*x�,���n-%�k�J��"b�3]H�V"dUT�Hb���x(tJ"R�@�9��\#�����z���_
!�HhK���@�]U�������� ��j���$�������4��m?�+�a-��)�;P7��������V��Q�b)�Nq6��#���_�Q�EM3fR��	��k�B4u~u	�t���������:��ub����P�j�F���$yE�JP��"h!X��)2���[��~�R
�=ogt�8�ZR4����K3f��(cn�
�)����c�("@-*���]��5TT����m���7R�>����*(��m��,����Y��cS5�������es5H�{V�����$g�+TV���x�D��H��DN`�?W+��[�,�������J�I�N8���kp�;7P�-�u���������vp@���^��{�q4���;j��b�[J�������x"E�F��)��.���p�Z�pT���2�;A�
{�.^����WX��]F��K�e������jf}7M�v�� N�C�\� �e��:�����+�Z�#rc��������"S�S�h2D��H�3\�"a�2��[y����j�D���*�WW������:��n�������j�������O�M2��������V���kyf		o����f*K>1�q���3
V
�L��I�&�/�"}�N'9s�!�(w�|�0�������6��2�����D?�1C��2���o�22�W7sM�Nd�U�J��2u�����d����}������f*$EH��D!r.j���~v���J�����#��=U�<�/��������jY
�E��e$dH�H����MR��0i�Y]�9�R����65i'po}4��B����(�r��8'���/�N�����J���XV���5�t�m���-6��R�V���M�J�F��j�(� r��C 26�cXT
����.%o
vn�0[7g�z��U�H��p259c��r��������"IScO�����=��������/M�Ugnu��6��B�����B$wXr�
�������}��X[�����^k{3^����4�z��R0�NV3�Pl���8��P�����(��x��r�t��v��C�p�=�={�f,���S����w:��%fX$P��F��E����$1��r�6�	���m��w5jT(���c�a�J &/ps�>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j���s����Je�P��=�)�RzC�-�0����C�K$���U��6�T�B����I�@��e0�D��m��>�(�z���nTduk]�T��_,��AQ����2��]UD��wH�HB�G-ni07���?�.������s�&%�9�[x0R�[ZJ(�Bz��In�	���/z��8 ��1����0��h�Q�����A��0pw�~�X��4����BZ�Lb�D�L��PD��Dr��.��)�U�+�{X�17���u�{P��Q�����j��A�FM�s��&�������Nc���I	��tHbL��
������
$PVOwP��������"A!�0��v�C������?����G`l)L2��3�;��{�������6�k36��M��n���!5������j��{A'����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g�(mn�(��.z����S�$����}������o5���h5pGm����}tt��F�RMY���E5��Dv���;�=M�������vNH�A%9R�@v��P�7z������`���Vsz��z�UD�U����3����`S�8-D�VZ(F�)�(Y��u�,�.����#0�(��A�YC*&8��9��>��~i)8n�@o��3��]&d�h���	���f)��aoy�ZsUZ#��*eD�2����>H��*>�����S
���%�b��b'���I�r�5>	���bN4�@D[����93Of���2
����i�a��	���]v�����"����ui$B�C�'(%�){�	C,����V���~�>�J�����A��U�N\�&P������9f<"9�
��V�0�z����a1�;�yf"9���sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"��1����CiL�����]��LC<���WZ�F:Kr��f�%��t�7	8O���@���9��d��������SdMAZ34#S1+"�#u$��L!S���%=%7�mS��d�:J���d��H$�z�d�EXHC	����!�^wUz!�t�B�ww��?p�?(D�,���)@��
�3g�H����������������#��l�#����D�����i�����1��r�Yiahc�G����-��~Kwx60��#a�������pl�2�Y�-A:��k @LDC�� 5;�g�����I�wl��@v����i%R	H�;Dvct���AK�d�5�(���&���ni'g��E��������~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<|�4����_�x��i'�j������O�"�������E��3����i'n_������g���������#%o��������h�@�P�S%�0������TqC�e��,Y��*���W�@Q�	.}���N5u��r'2����VaX�f6[�����J�`�M�@�F<CTzE�/%�C���#��D�P�����x�9#���n}Pj�D�������6JQ���X[w�N`LT9��o��c��y�M��2(�<#��f��;&�j�H�O�N�[���1��l�=--�}S�	���c|l�8�.�94W|��NB�����.En��4��f����L;&��|�4����_�x��i'�j������O�"�������E��3��sI?H�U�g����~����=�$�"-W��>{�I�DZ��<%Y�+�D]
5��Q�j�yS��t���E�D& �U����d����!�1LPM]��P�}��(3����������o�����UDs�
D��c@�9P+�����"�%:I;T��J`*�r@�u^"0���]��("(Q��
�������z���1������������z���1������������z���1������������z���1������������z���1������������z���1��������10�j�I��������{������1�E-k����X�x�����e�vr�P������������HyZ���Vz��&��� �c�p������L�@0����rD����4���.��v{�6��v9
\
����������N��w7D��d\�@=��<��L�B��D���Q�Ds���g��4���L���
j�����Dw�h��t��m����������~*5=���h�XR�5['�\)^KIQ�*V��H
��bT����P/��lP�T�����������?#��2�dq�
Z�0?�Q}[~��D�����1����La�V&0o�w�-��r����_������{""&�GW��n�5x����Q���K���(���$�=X4�L����HD�.�&B��2)@�1�]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#�<���Cz�K�tI��th(]�.�	N�����mZ��X�����]����Sh�������t��MZ�
���u�	]�����n��DxG1�Hv��P��ShgW��7(>������9pe����`p8~M�MZ�,m�TN�'F3e@���m� 0�
j��s�cn�����/��=V�A�����s7@�J8Na� ��!�,��c}Z��~��](p
�)G{2�����
V��)���������J�C"�@/�>�b"$GW����hsW�S������of������L� 	�3��0�C �pm�q�]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��
�
r����gV�z2������j0�]��p������c�5��C��hwW��&�I��x�l��/g�-[�#����}Z����T��/��L���;��������j�m��?�oW\��EL�&c~F����!�M��`L
ue�s0��uvq7	��*Q�9�Dgs,�����2f��C$cw�3�FCxJ?c`d�+}[�A ��kr(��@�j<r��2
��A�07���������E3��=#�p1�!��0�q���c�2r�����*QD��s��Q��"b�f���2��Ja�JM
��2�TW�N��6|;Gn[0Sz6��9�����
c�Q����f���+]Zn�b�0
��J�&]���?#�J]�|#����V��(fcd��f��;�DDG����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#��]Y}5w�;����cW#�'��� f��n�ba(�Gf c�����9>K��a�\�|�d	���p"�!��c��j�
!���J!���Q�e����wZj�a@��[V���01����@�u����G��cW""P1������j�G3���j���A��
���z6��7wDB��(b"c	IFf=���)
�Vy2
�
j��������ue�����{�V_A�]����ue�����{�V_A�]����ue�����{�V_A�]����ue�����(g�3�tr��5t�)�!5�x����%X�%R���%]��}���H�E��]4��f"�u/JhNU=��"�g6���x=��}��3��i�����f�t\�qB��[����Wc�y�����"c3b"=�CLz{(dP�e��@P��gp6c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,��1i��3nC�n6i�O��n?tcq�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f3�fM>}��^�e�L���O�{m�Y���d�����[m�{�f���O�=�/m������&���{o�Y��&�?B����6]>��-��f>lz{��o�����`{.�,���A�zw{���X0�Vn���fc/�d����Y�n#�c�f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>l�|�e���f>l�|��o��|�4��V^�c��������,���O��{m�Y����B������&�?j��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|�������������/m��1�c���^�c��������,���O��{m�Y��&�?B�����.�n�[o��g���|�_����~�|��&�?n�[��|�4��������i�~�����������/m��1�c���^�c��������,���O�{m�Y����B����6==�����f>lz{��o��|��������-=o��^����G����T�2oV�t�d"H"S����;��M���������{��������$�����DGhn�b9��9����<�}��q����������������������������������������������������������������������������������������������������������������������������������4�X��8���qc�����S���S���S���S���D���D����qc���c���c���c���c���c���c���c���c���c���c���c���c���c���c���c���c���`s��� O��w�
�������D��c���#�����qc��i8���qc��j|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X��|X�h�X�h�X�1�����ch�#���f?���Y��� �����qc���c���c���c���c���c���c���c���c#	M�K�xH9{r�za(ool�t�3����d�f#�b9��������
#54Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#53)
Re: GSoC 2017: Foreign Key Arrays

On Thu, Jul 27, 2017 at 3:31 AM, Mark Rofail <markm.rofail@gmail.com> wrote:

I have written some benchmark test.

With two tables a PK table with 5 rows and an FK table with growing row
count.

Once triggering an RI check
at 10 rows,
100 rows,
1,000 rows,
10,000 rows,
100,000 rows and
1,000,000 rows

How many rows of FK table were referencing the PK table row you're
updating/deleting.
I wonder how may RI trigger work so fast if it has to do some job besides
index search with no results?
I think we should also vary the number of referencing rows.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#55Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#54)
Re: GSoC 2017: Foreign Key Arrays

On Thu, Jul 27, 2017 at 12:54 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

How many rows of FK table were referencing the PK table row you're
updating/deleting.
I wonder how may RI trigger work so fast if it has to do some job besides
index search with no results?

The problem here is that the only to option for the foreign key arrays are
NO ACTION and RESTRICT which don't allow me to update/delete a refrenced
row in the PK Table. the EXPLAIN ANALYZE only tells me that this violates
the FK constraint.

So we have two options. Either implement CASCADE or if there's a
configration for EXPLAIN to show costs even if it violates the FK
constraints.

I think we should also vary the number of referencing rows.

The x axis is the number if refrencing rows in the FK table

#56Erik Rijkers
er@xs4all.nl
In reply to: Mark Rofail (#53)
Re: GSoC 2017: Foreign Key Arrays

On 2017-07-27 02:31, Mark Rofail wrote:

I have written some benchmark test.

It would help (me at least) if you could be more explicit about what
exactly each instance is.

Apparently there is an 'original patch': is this the original patch by
Marco Nenciarini?
Or is it something you posted earlier?

I guess it could be distilled from the earlier posts but when I looked
those over yesterday evening I still didn't get it.

A link to the post where the 'original patch' is would be ideal...

thanks!

Erik Rijkers

With two tables a PK table with 5 rows and an FK table with growing row
count.

Once triggering an RI check
at 10 rows,
100 rows,
1,000 rows,
10,000 rows,
100,000 rows and
1,000,000 rows

Please find the graph with the findings attached below

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#57Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#55)
Re: GSoC 2017: Foreign Key Arrays

On Thu, Jul 27, 2017 at 3:07 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Thu, Jul 27, 2017 at 12:54 PM, Alexander Korotkov <aekorotkov@gmail.com

wrote:

How many rows of FK table were referencing the PK table row you're
updating/deleting.
I wonder how may RI trigger work so fast if it has to do some job besides
index search with no results?

The problem here is that the only to option for the foreign key arrays are
NO ACTION and RESTRICT which don't allow me to update/delete a refrenced
row in the PK Table. the EXPLAIN ANALYZE only tells me that this violates
the FK constraint.

So we have two options. Either implement CASCADE or if there's a
configration for EXPLAIN to show costs even if it violates the FK
constraints.

Oh, ok. I missed that.
Could you remind me why don't we have DELETE CASCADE? I understand that
UPDATE CASCADE is problematic because it's unclear which way should we
delete elements from array. But what about DELETE CASCADE?

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#58Mark Rofail
markm.rofail@gmail.com
In reply to: Erik Rijkers (#56)
Re: GSoC 2017: Foreign Key Arrays

On Thu, Jul 27, 2017 at 7:15 PM, Erik Rijkers <er@xs4all.nl> wrote:

It would help (me at least) if you could be more explicit about what
exactly each instance is.

I apologize, I thought it was clear through the context.

I meant by the original patch is all the work done before my GSoC project.
The latest of which, was submitted by Tom Lane[1]/messages/by-id/28617.1351095467@sss.pgh.pa.us. And rebased here[2]/messages/by-id/CAJvoCutcMEYNFYK8Hdiui-M2y0ZGg=Be17fHgQ=8nHexZ6ft7w@mail.gmail.com.

The new patch is the latest one submitted by me[3]/messages/by-id/CAJvoCuuoGo5zJTpmPm90doYTUWoeUc+ONXK2+H_vxsi+Zi09bQ@mail.gmail.com.

And the new patch with index is the same[3]/messages/by-id/CAJvoCuuoGo5zJTpmPm90doYTUWoeUc+ONXK2+H_vxsi+Zi09bQ@mail.gmail.com, but with a GIN index built
over it. CREATE INDEX ON fktableforarray USING gin (fktest array_ops);

[1]: /messages/by-id/28617.1351095467@sss.pgh.pa.us
[2]: /messages/by-id/CAJvoCutcMEYNFYK8Hdiui-M2y0ZGg=Be17fHgQ=8nHexZ6ft7w@mail.gmail.com
/messages/by-id/CAJvoCutcMEYNFYK8Hdiui-M2y0ZGg=Be17fHgQ=8nHexZ6ft7w@mail.gmail.com
[3]: /messages/by-id/CAJvoCuuoGo5zJTpmPm90doYTUWoeUc+ONXK2+H_vxsi+Zi09bQ@mail.gmail.com
/messages/by-id/CAJvoCuuoGo5zJTpmPm90doYTUWoeUc+ONXK2+H_vxsi+Zi09bQ@mail.gmail.com

Best Regards,
Mark Rofail

#59Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#57)
Re: GSoC 2017: Foreign Key Arrays

On Thu, Jul 27, 2017 at 7:30 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Oh, ok. I missed that.

Could you remind me why don't we have DELETE CASCADE? I understand that
UPDATE CASCADE is problematic because it's unclear which way should we
delete elements from array. But what about DELETE CASCADE?

Honestly, I didn't touch that part of the patch. It's very interesting
though, I think it would be great to spend the rest of GSoC in it.

Off the top of my head though, there's many ways to go about DELETE
CASCADE. You could only delete the member of the referencing array or the
whole array. I think there's a lot of options the user might want to
consider and it's hard to generalize to DELETE CASCADE. Maybe new grammar
would be introduced here ?|

Best Regards,
Mark Rofail

#60Erik Rijkers
er@xs4all.nl
In reply to: Mark Rofail (#58)
Re: GSoC 2017: Foreign Key Arrays

On 2017-07-27 21:08, Mark Rofail wrote:

On Thu, Jul 27, 2017 at 7:15 PM, Erik Rijkers <er@xs4all.nl> wrote:

It would help (me at least) if you could be more explicit about what
exactly each instance is.

I apologize, I thought it was clear through the context.

Thanks a lot. It's just really easy for testers like me that aren't
following a thread too closely and just snatch a half hour here and
there to look into a feature/patch.

One small thing while building docs:

$ cd doc/src/sgml && make html
osx -wall -wno-unused-param -wno-empty -wfully-tagged -D . -D . -x lower
postgres.sgml >postgres.xml.tmp
osx:ref/create_table.sgml:960:100:E: document type does not allow
element "VARLISTENTRY" here
Makefile:147: recipe for target 'postgres.xml' failed
make: *** [postgres.xml] Error 1

(Debian 8/jessie)

thanks,

Erik Rijkers

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#61Mark Rofail
markm.rofail@gmail.com
In reply to: Erik Rijkers (#60)
Re: GSoC 2017: Foreign Key Arrays

On Fri, Jul 28, 2017 at 1:19 PM, Erik Rijkers <er@xs4all.nl> wrote:

One small thing while building docs:

$ cd doc/src/sgml && make html
osx -wall -wno-unused-param -wno-empty -wfully-tagged -D . -D . -x lower
postgres.sgml >postgres.xml.tmp
osx:ref/create_table.sgml:960:100:E: document type does not allow element
"VARLISTENTRY" here
Makefile:147: recipe for target 'postgres.xml' failed
make: *** [postgres.xml] Error 1

I will work on it.

How's the rest of the patch ?

#62Mark Rofail
markm.rofail@gmail.com
In reply to: Erik Rijkers (#60)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Fri, Jul 28, 2017 at 1:19 PM, Erik Rijkers <er@xs4all.nl> wrote:

One small thing while building docs:

$ cd doc/src/sgml && make html
osx -wall -wno-unused-param -wno-empty -wfully-tagged -D . -D . -x lower
postgres.sgml >postgres.xml.tmp
osx:ref/create_table.sgml:960:100:E: document type does not allow element
"VARLISTENTRY" here
Makefile:147: recipe for target 'postgres.xml' failed
make: *** [postgres.xml] Error 1

Here's the fix.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v4 (fixed II - docs fix).patchtext/x-patch; charset=US-ASCII; name="Array-ELEMENT-foreign-key-v4 (fixed II - docs fix).patch"Download
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..b4aefd7aa3 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2324,7 +2324,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2369,6 +2379,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..90de1ca102 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -937,6 +956,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..416ed60b0c 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,64 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* only items that match the queried element 
+			are considered candidate  */
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +192,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +280,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index d25b39bb54..4e0d0bdda0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1211,6 +1211,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index bb00858ad1..dc18fd1eae 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6995,6 +6995,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7002,10 +7003,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7082,6 +7085,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7098,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7179,6 +7227,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7239,14 +7346,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7275,6 +7380,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7317,7 +7429,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7341,6 +7452,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index b502941b08..cb017cbe14 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..4f089d53a9 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3075,6 +3075,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 45a04b0b27..01238bfd71 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2843,6 +2843,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 379d92a2b0..119d100b37 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 4b1ce09c44..d1df75dd6e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3437,14 +3447,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3635,14 +3647,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3675,7 +3688,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14686,6 +14722,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15803,6 +15840,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 9f37f1b920..163719c7a8 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -743,6 +743,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..8c9eb0c676 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..9e7d66df7e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&countbuf,
+ 								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+ 								 paramname);
+ 
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,25 +2649,29 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop @>> rightop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+ 	Oid			oprright;
 
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
@@ -2586,15 +2682,46 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 	{
+ 		oprright = get_array_type(operform->oprright);
+ 		if (!OidIsValid(oprright))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(operform->oprright))));
+ 	}
+ 	else
+ 		oprright = operform->oprright;
+ 
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
 
+		appendStringInfo(buf, " @>> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2928,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3007,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3063,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index d83377d1d8..680623534c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..586eccab6e
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,553 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..8d5363efbf
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,415 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#63Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#62)
Re: GSoC 2017: Foreign Key Arrays

These are limitations of the patch ordered by importance:

✗ presupposes that count(distinct y) has exactly the same notion of
equality that the PK unique index has. In reality, count(distinct) will
fall back to the default btree opclass for the array element type.

- Supported actions:
✔ NO ACTION
✔ RESTRICT
✗ CASCADE
✗ SET NULL
✗ SET DEFAULT

✗ coercion is unsopported. i.e. a numeric can't refrence int8

✗ Only one "ELEMENT" column allowed in a multi-column key

✗ undesirable dependency on default opclass semantics in the patch, which
is that it supposes it can use array_eq() to detect whether or not the
referencing column has changed. But I think that can be fixed without
undue pain by providing a refactored version of array_eq() that can be told
which element-comparison function to use

✗ cross-type FKs are unsupported

-- Resolved limitations =============================

✔ fatal performance issues. If you issue any UPDATE or DELETE against the
PK table, you get a query like this for checking to see if the RI
constraint would be violated:
SELECT 1 FROM ONLY fktable x WHERE $1 = ANY (fkcol) FOR SHARE OF x;
/* Changed into SELECT 1 FROM ONLY fktable x WHERE $1 @> fkcol FOR SHARE OF
x; */

-- ============================================

Can someone help me understand the first limitation?

#64Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mark Rofail (#63)
Re: GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

These are limitations of the patch ordered by importance:

✗ presupposes that count(distinct y) has exactly the same notion of
equality that the PK unique index has. In reality, count(distinct) will
fall back to the default btree opclass for the array element type.

Operators are classified in operator classes; each data type may have
more than one operator class for a particular access method. Exactly
one operator class for some access method can be designated as the
default one for a type. However, when you create an index, you can
indicate which operator class to use, and it may not be the default one.
If a different one is chosen at index creation time, then a query using
COUNT(distinct) will do the wrong thing, because DISTINCT will select
an equality type using the type's default operator class, not the
equality that belongs to the operator class used to create the index.

That's wrong: DISTINCT should use the equality operator that corresponds
to the index' operator class instead, not the default one.

I hope that made sense.

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#65Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#64)
Re: GSoC 2017: Foreign Key Arrays

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

... However, when you create an index, you can
indicate which operator class to use, and it may not be the default one.
If a different one is chosen at index creation time, then a query using
COUNT(distinct) will do the wrong thing, because DISTINCT will select
an equality type using the type's default operator class, not the
equality that belongs to the operator class used to create the index.

That's wrong: DISTINCT should use the equality operator that corresponds
to the index' operator class instead, not the default one.

Uh, what? Surely the semantics of count(distinct x) *must not* vary
depending on what indexes happen to be available.

I think what you meant to say is that the planner may only choose an
optimization of this sort when the index's opclass matches the one
DISTINCT will use, ie the default for the data type.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#66Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#65)
Re: GSoC 2017: Foreign Key Arrays

Tom Lane wrote:

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

... However, when you create an index, you can
indicate which operator class to use, and it may not be the default one.
If a different one is chosen at index creation time, then a query using
COUNT(distinct) will do the wrong thing, because DISTINCT will select
an equality type using the type's default operator class, not the
equality that belongs to the operator class used to create the index.

That's wrong: DISTINCT should use the equality operator that corresponds
to the index' operator class instead, not the default one.

Uh, what? Surely the semantics of count(distinct x) *must not* vary
depending on what indexes happen to be available.

Err ...

I think what you meant to say is that the planner may only choose an
optimization of this sort when the index's opclass matches the one
DISTINCT will use, ie the default for the data type.

Um, yeah, absolutely.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#67Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#66)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Jul 31, 2017 at 5:18 PM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

Tom Lane wrote:

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

... However, when you create an index, you can
indicate which operator class to use, and it may not be the default

one.

If a different one is chosen at index creation time, then a query using
COUNT(distinct) will do the wrong thing, because DISTINCT will select
an equality type using the type's default operator class, not the
equality that belongs to the operator class used to create the index.

That's wrong: DISTINCT should use the equality operator that

corresponds

to the index' operator class instead, not the default one.

Uh, what? Surely the semantics of count(distinct x) *must not* vary
depending on what indexes happen to be available.

Err ...

I think what you meant to say is that the planner may only choose an
optimization of this sort when the index's opclass matches the one
DISTINCT will use, ie the default for the data type.

I understand the problem. I am currently researching how to resolve it.

Best Regards,
Mark Rofail

#68Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#67)
Re: GSoC 2017: Foreign Key Arrays

To better understand a limitation I ask 5 questions

What is the limitation?
Why is there a limitation?
Why is it a limitation?
What can we do?
Is it feasible?

Through some reading:

*What is the limitation?*
presupposes that count(distinct y) has exactly the same notion of equality
that the PK unique index has. In reality, count(distinct) will fall back to
the default btree opclass for the array element type.

the planner may choose an optimization of this sort when the index's
opclass matches the one
DISTINCT will use, ie the default for the data type.

*Why is there a limitation?*
necessary because ri_triggers.c relies on COUNT(DISTINCT x) on the element
type, as well as on array_eq() on the array type, and we need those
operations to have the same notion of equality that we're using otherwise.

*Why is it a limitation?*
That's wrong: DISTINCT should use the equality operator that corresponds
to the index' operator class instead, not the default one.

*What can we do ?*
I'm sure that we can replace array_eq() with a newer polymorphic version
but I don't know how we could get around COUNT(DISTINCT x)

*Is it feasible? *
I don't think I have the experience to answer that

Best Regards,
Mark Rofail

#69Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#68)
Re: GSoC 2017: Foreign Key Arrays

This is the query fired upon any UPDATE/DELETE for RI checks:

SELECT 1 FROM ONLY <pktable> x WHERE pkatt1 = $1 [AND ...] FOR KEY SHARE OF
x

in the case of foreign key arrays, it's wrapped in this query:

SELECT 1 WHERE
(SELECT count(DISTINCT y) FROM unnest($1) y)
= (SELECT count(*) FROM (<QUERY>) z)

This is where the limitation appears, the DISTINCT keyword. Since in
reality, count(DISTINCT) will fall back to the default btree opclass for
the array element type regardless of the opclass indicated in the access
method. Thus I believe going around DISTINCT is the way to go.

This is what I came up with:

SELECT 1 WHERE
(SELECT COUNT(*)
FROM
(
SELECT y
FROM unnest($1) y
GROUP BY y
)
)
= (SELECT count(*) (<QUERY>) z)

I understand there might be some syntax errors but this is just a proof of
concept.

Is this the right way to go?
It's been a week and I don't think I made significant progress. Any
pointers?

Best Regards,
MarkRofail

#70Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#69)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Sat, Aug 5, 2017 at 10:36 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

SELECT 1 WHERE
(SELECT COUNT(*)
FROM
(
SELECT y
FROM unnest($1) y
GROUP BY y
)
)
= (SELECT count(*) (<QUERY>) z)

Well, with trial and error the correct query is:

SELECT 1 WHERE
(SELECT COUNT(y) FROM (SELECT y FROM pg_catalog.unnest(%s) y GROUP BY
y) yy)
= (SELECT count(*) (<QUERY>) z)

This passes all the regress tests and elimnates the DISTINCT keyword that
created the limitation.
However a look on the performance change is a must and that's what I plan
to do next.

There is another problem though. When I remove the part of the code setting
the default opclass in tablecmd.c I get this error message afterwards:
CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF
ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
- ERROR: foreign key constraint "fktableforarray_ftest1_fkey" cannot be
implemented
- DETAIL: Key column "ftest1" has element type integer which does not have
a default btree operator class that's compatible with class "float8_ops".

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v4.1.0.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v4.1.0.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..b4aefd7aa3 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2324,7 +2324,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2369,6 +2379,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..90de1ca102 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -937,6 +956,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..9e5aeb5f24 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,74 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
-
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* 
+		 * since this function return a pointer to a
+		 * deconstructed array, there is nothing to do if 
+		 * operand is a single element except to return 
+		 * as is and configure the searchmode
+		 */
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		/* 
+		 * only items that match the queried element 
+		 * are considered candidate  
+		 */
 
-	switch (strategy)
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
 	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
+
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
+
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +202,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +290,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 25c5bead9f..ce2131b931 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1210,6 +1210,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 1b8d4b3d17..e91861668c 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6995,6 +6995,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7002,10 +7003,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7082,6 +7085,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7098,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7179,6 +7227,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			// elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			// if (!OidIsValid(elemopclass) ||
+ 			// 	get_opclass_family(elemopclass) != opfamily)
+ 			// {
+ 			// 	/* Get the index opclass's name for the error message. */
+ 			// 	char	   *opcname;
+ 
+ 			// 	cla_ht = SearchSysCache1(CLAOID,
+ 			// 							 ObjectIdGetDatum(opclasses[i]));
+ 			// 	if (!HeapTupleIsValid(cla_ht))
+ 			// 		elog(ERROR, "cache lookup failed for opclass %u",
+ 			// 			 opclasses[i]);
+ 			// 	cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 			// 	opcname = pstrdup(NameStr(cla_tup->opcname));
+ 			// 	ReleaseSysCache(cla_ht);
+ 			// 	ereport(ERROR,
+ 			// 			(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 			// 	errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 			// 		   fkconstraint->conname),
+ 			// 			 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 			// 					   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 			// 					   format_type_be(fktype),
+ 			// 					   opcname)));
+ 			// }
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7239,14 +7346,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7275,6 +7380,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7317,7 +7429,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7341,6 +7452,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index b502941b08..cb017cbe14 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..4f089d53a9 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3075,6 +3075,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 45a04b0b27..01238bfd71 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2843,6 +2843,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 379d92a2b0..119d100b37 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7d0de99baf..1974625722 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3406,14 +3416,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3604,14 +3616,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3644,7 +3657,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14655,6 +14691,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15772,6 +15809,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 87cb4188a3..2ae32c8e34 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -744,6 +744,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..8c9eb0c676 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,117 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid element_type,
+				bool element_isnull, Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	if (arr_type != element_type)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare different element types")));
+	
+	if (element_isnull)
+		return false;
+		
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool element_isnull = PG_ARGISNULL(1);	
+	bool result;
+
+	result = array_contains_elem(array, elem, element_type,
+								 element_isnull, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..2f5c3bf71b 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&countbuf,
+ 								 "(SELECT COUNT(y) FROM (SELECT y FROM pg_catalog.unnest(%s) y GROUP BY y) yy)",
+ 								 paramname); 
+ 				// appendStringInfo(&countbuf,
+ 				// 				 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+ 				// 				 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +599,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +792,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1016,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1173,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1353,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1520,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1697,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1864,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2056,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2376,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2395,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2448,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2473,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,25 +2652,29 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop @>> rightop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+ 	Oid			oprright;
 
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
@@ -2586,15 +2685,46 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 	{
+ 		oprright = get_array_type(operform->oprright);
+ 		if (!OidIsValid(oprright))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(operform->oprright))));
+ 	}
+ 	else
+ 		oprright = operform->oprright;
+ 
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT){
+		appendStringInfo(buf, " %s %s", sep, rightop);
 
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+
+		appendStringInfo(buf, " @>> ");
+
+		appendStringInfoString(buf, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+	 }	
+	else{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2931,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3010,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3066,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index d83377d1d8..680623534c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..586eccab6e
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,553 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..8d5363efbf
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,415 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#71Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#69)
Re: GSoC 2017: Foreign Key Arrays

On Sat, Aug 5, 2017 at 11:36 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

This is the query fired upon any UPDATE/DELETE for RI checks:

SELECT 1 FROM ONLY <pktable> x WHERE pkatt1 = $1 [AND ...] FOR KEY SHARE
OF x

in the case of foreign key arrays, it's wrapped in this query:

SELECT 1 WHERE
(SELECT count(DISTINCT y) FROM unnest($1) y)
= (SELECT count(*) FROM (<QUERY>) z)

This is where the limitation appears, the DISTINCT keyword. Since in
reality, count(DISTINCT) will fall back to the default btree opclass for
the array element type regardless of the opclass indicated in the access
method. Thus I believe going around DISTINCT is the way to go.

Do we already assume that default btree opclass for array element type
matches PK opclass when using @>> operator on UPDATE/DELETE of referenced
table?
If so, we don't introduce additional restriction here...

This is what I came up with:

SELECT 1 WHERE
(SELECT COUNT(*)
FROM
(
SELECT y
FROM unnest($1) y
GROUP BY y
)
)
= (SELECT count(*) (<QUERY>) z)

I understand there might be some syntax errors but this is just a proof of
concept.

GROUP BY would also use default btree/hash opclass for element type. It
doesn't differ from DISTINCT from that point.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#72Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#71)
Re: GSoC 2017: Foreign Key Arrays

On Tue, Aug 8, 2017 at 2:25 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Do we already assume that default btree opclass for array element type
matches PK opclass when using @>> operator on UPDATE/DELETE of referenced
table?

I believe so, since it's a polymorphic function.

If so, we don't introduce additional restriction here...

You mean to remove the wrapper query ?

GROUP BY would also use default btree/hash opclass for element type. It
doesn't differ from DISTINCT from that point.

Then there's no going around this limitation,

Best Regard,
Mark Rofail

#73Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#72)
Re: GSoC 2017: Foreign Key Arrays

On Tue, Aug 8, 2017 at 4:12 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Tue, Aug 8, 2017 at 2:25 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Do we already assume that default btree opclass for array element type
matches PK opclass when using @>> operator on UPDATE/DELETE of referenced
table?

I believe so, since it's a polymorphic function.

If so, we don't introduce additional restriction here...

You mean to remove the wrapper query ?

I think we should choose the query which would be better planned (and
presumably faster executed). You can make some experiments and then choose
the query.

GROUP BY would also use default btree/hash opclass for element type. It

doesn't differ from DISTINCT from that point.

Then there's no going around this limitation,

That seems like this.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#74Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#73)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Tue, Aug 8, 2017 at 3:24 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

On Tue, Aug 8, 2017 at 4:12 PM, Mark Rofail <markm.rofail@gmail.com>
wrote:

On Tue, Aug 8, 2017 at 2:25 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

GROUP BY would also use default btree/hash opclass for element type. It

doesn't differ from DISTINCT from that point.

Then there's no going around this limitation,

That seems like this.

Since for now, the limitation

✗ presupposes that count(distinct y) has exactly the same notion of
equality that the PK unique index has. In reality, count(distinct) will
fall back to the default btree opclass for the array element type.

is unavoidable.

I started to look at the next one on the list.

✗ coercion is unsopported. i.e. a numeric can't refrence int8

The limitation in short.

#= CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
#= CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT
OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );

should be accepted but this produces the following error
operator does not exist: integer[] @> smallint

The algorithm I propose:
I don't think it's easy to modify the @>> operator as we discussed here.
</messages/by-id/CAJvoCusUmk7iBNf7ak_FdT+b=tot3smRNH9DOjDMUEzNFXgrfg@mail.gmail.com&gt;

I think we should cast the operands in the RI queries fired as follows
1. we get the array type from the right operand
2. compare the two array type and see which type is more "general" (as to
which should be cast to which, int2 should be cast to int4, since casting
int4 to int2 could lead to data loss). This can be done by seeing which Oid
is larger numerically since, coincidentally, they are declared in this way
in pg_type.h.
3.If the rightArrayOid is larger we cast the left array, else If the
leftArrayOid is larger we cast the right element to the base element type
of the leftArrayOid

For example:
#= CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
#= CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT
OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );

The left operand here is int2[] and the right int4

1.get int4[] oid and store it
2. compare int4[] and int2[] oid numerically
3. since int4[] is larger the cast is applied to int2[] to make the left
operant int4[]

If the example was reversed:
#= CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
#= CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT
OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );

The left operand here is int4[] and the right int2

1.get int2[] oid and store it
2. compare int4[] and int2[] oid numerically
3. since int4[] is larger the cast is applied to int2 to make the right
operant int 4

This approach works and I have written some tests to verify the approach.

However, if there's a cleaner way to go about this or a more "postgres"
way. let me know.
The changes are int ri_trigger.c and the patch is attached here.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v4.2.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v4.2.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea655a10a8..b4aefd7aa3 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2324,7 +2324,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2369,6 +2379,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..90de1ca102 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -937,6 +956,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..9e5aeb5f24 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,74 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
-
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* 
+		 * since this function return a pointer to a
+		 * deconstructed array, there is nothing to do if 
+		 * operand is a single element except to return 
+		 * as is and configure the searchmode
+		 */
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		/* 
+		 * only items that match the queried element 
+		 * are considered candidate  
+		 */
 
-	switch (strategy)
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
 	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
+
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
+
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +202,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +290,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 25c5bead9f..ce2131b931 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1210,6 +1210,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 1b8d4b3d17..6be8516c8f 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6995,6 +6995,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7002,10 +7003,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7082,6 +7085,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7094,6 +7098,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7179,6 +7227,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7239,14 +7346,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7275,6 +7380,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7317,7 +7429,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7341,6 +7452,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index b502941b08..cb017cbe14 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c2fc59d1aa..4f089d53a9 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3075,6 +3075,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 45a04b0b27..01238bfd71 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2843,6 +2843,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 379d92a2b0..119d100b37 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7d0de99baf..1974625722 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3406,14 +3416,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3604,14 +3616,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3644,7 +3657,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14655,6 +14691,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15772,6 +15809,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 87cb4188a3..2ae32c8e34 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -744,6 +744,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..e13e75fba7 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,111 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+	
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this 
+	is handled within internal calls already (a property 
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..dfc8669217 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,25 +2649,30 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @>> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+ 	Oid			oprright;
+ 	Oid			oprleft;
 
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
@@ -2586,15 +2683,56 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+ 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+ 	{
+ 		oprright = get_array_type(operform->oprleft);
+ 		if (!OidIsValid(oprright))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(operform->oprleft))));
+ 	
+		appendStringInfo(buf, " %s %s", sep, rightop);
+
+		if (rightoptype != oprright){
+			if(rightoptype < oprright)
+				ri_add_cast_to(buf, oprright);
+			else{
+				oprleft = get_base_element_type(operform->oprright);
+				if (!OidIsValid(oprright))
+ 				ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find element type for data type %s",
+ 							format_type_be(operform->oprright))));
+			}
 
+		}
+ 			ri_add_cast_to(buf, oprright);
+
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>>) ");
+
+		appendStringInfoString(buf, leftop);
+
+		if ((leftoptype != oprleft) && (OidIsValid(oprleft)))
+			ri_add_cast_to(buf, leftoptype);
+	 }	
+	else{
+		oprright = operform->oprright;
+
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != oprright)
+ 			ri_add_cast_to(buf, oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2939,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3018,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3074,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index d83377d1d8..680623534c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..a4a7b344d3
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,599 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..9238a30a40
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,465 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#75Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mark Rofail (#74)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Aug 14, 2017 at 2:09 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

On Tue, Aug 8, 2017 at 3:24 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

On Tue, Aug 8, 2017 at 4:12 PM, Mark Rofail <markm.rofail@gmail.com>
wrote:

On Tue, Aug 8, 2017 at 2:25 PM, Alexander Korotkov <aekorotkov@gmail.com

wrote:

GROUP BY would also use default btree/hash opclass for element type. It

doesn't differ from DISTINCT from that point.

Then there's no going around this limitation,

That seems like this.

Since for now, the limitation

✗ presupposes that count(distinct y) has exactly the same notion of
equality that the PK unique index has. In reality, count(distinct) will
fall back to the default btree opclass for the array element type.

is unavoidable.

I started to look at the next one on the list.

✗ coercion is unsopported. i.e. a numeric can't refrence int8

The limitation in short.

#= CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
#= CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT
OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );

should be accepted but this produces the following error
operator does not exist: integer[] @> smallint

The algorithm I propose:
I don't think it's easy to modify the @>> operator as we discussed here.
</messages/by-id/CAJvoCusUmk7iBNf7ak_FdT+b=tot3smRNH9DOjDMUEzNFXgrfg@mail.gmail.com&gt;

I think we should cast the operands in the RI queries fired as follows
1. we get the array type from the right operand
2. compare the two array type and see which type is more "general" (as to
which should be cast to which, int2 should be cast to int4, since casting
int4 to int2 could lead to data loss). This can be done by seeing which Oid
is larger numerically since, coincidentally, they are declared in this way
in pg_type.h.

I'm not sure numerical comparison of Oids is a good idea. AFAIK, any
regularity of Oids assignment is coincidence... Also, consider
user-defined data types: their oids depend on order of their creation.
Should we instead use logic similar to select_common_type() and underlying
functions?

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#76Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alexander Korotkov (#75)
Re: GSoC 2017: Foreign Key Arrays

Alexander Korotkov <aekorotkov@gmail.com> writes:

On Mon, Aug 14, 2017 at 2:09 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

I think we should cast the operands in the RI queries fired as follows
1. we get the array type from the right operand
2. compare the two array type and see which type is more "general" (as to
which should be cast to which, int2 should be cast to int4, since casting
int4 to int2 could lead to data loss). This can be done by seeing which Oid
is larger numerically since, coincidentally, they are declared in this way
in pg_type.h.

I'm not sure numerical comparison of Oids is a good idea.

I absolutely, positively guarantee that a patch written that way will be
rejected.

Should we instead use logic similar to select_common_type() and underlying
functions?

Right. What we typically do in cases like this is check to see if there
is an implicit coercion available in one direction but not the other.
I don't know if you can use select_common_type() directly, but it would
be worth looking at.

Also, given that the context here is RI constraints, what you're really
worried about is whether the referenced column's uniqueness constraint
is associated with compatible operators, so looking into its operator
class for relevant operators might be the right way to think about it.
I wrote something just very recently that touches on that ... ah,
here it is:
/messages/by-id/13220.1502376894@sss.pgh.pa.us

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#77Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#75)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

On Mon, Aug 14, 2017 at 10:35 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

Should we instead use logic similar to select_common_type() and
underlying functions?

I created a new adaptation of select_common_type() called
select_common_type_2args(Oid oprleft, Oid oprright) that takes two Oids and
returns the appropriate supertype.

The new function passes all the old coercion regress tests included in the
original patch written by Marco.

Attachments:

Array-ELEMENT-foreign-key-v4.3.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v4.3.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ef7054cf26..f16638dcda 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2322,7 +2322,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2367,6 +2377,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..90de1ca102 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -937,6 +956,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..9e5aeb5f24 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,74 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
-
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* 
+		 * since this function return a pointer to a
+		 * deconstructed array, there is nothing to do if 
+		 * operand is a single element except to return 
+		 * as is and configure the searchmode
+		 */
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		/* 
+		 * only items that match the queried element 
+		 * are considered candidate  
+		 */
 
-	switch (strategy)
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		PG_RETURN_POINTER(elem);
+	}
+	else
 	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
+
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
+
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +202,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +290,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a376b99f1e..3bd0b772a4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2098,6 +2098,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 25c5bead9f..ce2131b931 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1210,6 +1210,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 513a9ec485..c841f2649e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7008,6 +7008,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7015,10 +7016,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7095,6 +7098,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7107,6 +7111,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7192,6 +7240,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7252,14 +7359,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7288,6 +7393,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = tab->oldDesc->attrs[fkattnum[i] - 1]->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7330,7 +7442,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7354,6 +7465,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index da0850bfd6..68f06930f9 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 29ac5d569d..363a065e69 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3090,6 +3090,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 72041693df..544a69d0da 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2845,6 +2845,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 5ce3c7c599..1a5b535877 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7d0de99baf..1974625722 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3406,14 +3416,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3604,14 +3616,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3644,7 +3657,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14655,6 +14691,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15772,6 +15809,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 0bc7dba6a0..3bfd0314f2 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1319,6 +1319,80 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ * 
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm. 
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/*
+			* both types in different categories? then not much hope...
+			*/
+			return InvalidOid;
+		}
+
+		else if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						rightOid;
+				}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.  
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 495ba3dffc..7f7339e43e 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -744,6 +744,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..e13e75fba7 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,111 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+	
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this 
+	is handled within internal calls already (a property 
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..9efebe48f6 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2649,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @>> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,15 +2681,77 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+ 		Oid			oprright;
+ 		Oid			oprleft;
+	 	Oid			oprcommon;
+		
+		/* 
+		 * since the @>> operator has the array as
+		 * the first operand and the element as the second
+		 * operand we switch their places in the query 
+		 * i.e opright is oprleft and vice versar
+		 */
+		 
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/* compare the two array types and try to find 
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		oprright = get_base_element_type(oprcommon);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find element type for data type %s",
+							format_type_be(oprcommon))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
 
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>>) ");
+
+		appendStringInfoString(buf, leftop);
+		if (operform->oprleft != oprright)
+			ri_add_cast_to(buf, oprright);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != operform->oprright)
+ 			ri_add_cast_to(buf, operform->oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2958,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3037,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3093,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 7469ec773c..3aad8dd3ba 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 06f65293cb..f5bad57b70 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -68,6 +68,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..c0ebed4bb4
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,599 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..9238a30a40
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,465 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
#78Mark Rofail
markm.rofail@gmail.com
In reply to: Alexander Korotkov (#57)
Re: GSoC 2017: Foreign Key Arrays

I have a concern that after supporting UPDATE/DELETE CASCADE, the
performance would drop.

On Thu, Jul 27, 2017 at 12:54 PM, Alexander Korotkov <aekorotkov@gmail.com>
wrote:

I wonder how may RI trigger work so fast if it has to do some job besides
index search with no results?

Best Regards,
Mark Rofail

#79Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#78)
2 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

Okay... There are several developments...

1) Whenever there was an index on the Foreign Key Array column and I issue
the following query "SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;" I
wouldn't get any results, even though it works without an index.
This confirmed my suspicion that there was something wrong with the GIN
index, the results were too good to be true in the comparison here
</messages/by-id/CAJvoCuv6ufngfZBPNq4icCy=x6NpqVVyyPaio97ZHcZVvAC+Zg@mail.gmail.com&gt;.
It's almost O(1);

Turns out the index search wasn't performed at all. When I fixed this bug,
the performance changed. And the new benchmark graph is attached below.

2) About coercion, coercion should only be allowed one way not the other.
Since casting the FK column defeats the index and performance drops
drastically. I don't want to disallow it though. Should I leave it up to
the user?

3) As of patch v4.4 DELETE CASCADE is now supported. The rest of the
actions, however, will require array manipulation.

Once the updates are confirmed, I'll update the limitation checklist.

Best Regards,
Mark Rofail

Attachments:

FK Benchmark2.jpgimage/jpeg; name="FK Benchmark2.jpg"Download
�����ExifMM*#���(1"�2��i�$
��'
��'Adobe Photoshop CC 2017 (Windows)2017:08:21 13:38:19�0221��	^�rz(�IHH����Adobe_CM��Adobed����			



��f�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE��t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw�������?�T�I%)$�IJC��M\Z^+k�Z�.;F����\�@�xCX��-a&���{������e��0��at�
o���jUu�[�}L�����F��v����{[����j�4�$	2|�	)����]eU����mk�D:���I��eU�o����������.���
c&f����g��#]]����i�$5'INe�{���U�Wh��cd�@��zM���o��������=�Q��k]cZ�{�������r�W@@��3��>�X�#�v��5������������{2q��`sYkC�����;^�{���c�P����m��1�Hp>i)"J5�]�un���'�����I$�$�I)���T*�F�.w�I���-������05�op�1�����]o`
}��������)'��}�{����?�Px�	)g7sK\���APA�t@Mpsq�i�C ��G���������?�JW��}�{����?�h#��%.'��������<�wO�DmS;������X����`�e���rJg�Z������j�n5n����;O�H>%(>%%0���im5���$0�|}�z��������	0��R���?ki���u�%��k�?���	-l�d��E���m����.kL�}$��'&��SYX�D����,����������F5Ci��n��E6ccU[���1�$��h����KrJ�������&I�YQ:CCH��v�f�j�3q�[F;���yp��{�9
�7��Tm��wA�3w�g�v�R�����Z�0�����9�rJI
��JP���-��
R����C|�7��)K|?����))P���dC���O�����k ���U�M[��_,���4s�&i����������%6DvA���!�{�����1�����F�������ai6!���?�v������������S����R<�������){|�<����?�����?�^��<�?����IH^�y�u��3����Cj0��~h4�M�{���������,�1�����7�&��i���4R��<����t�o���\���>>>K1n5���kZr��m�c]K�;��������H�7O�!���g��e�k��"���A������)����(0���8
����6�3s����
0�!�m��o���)$��� ������o�S��o��y���A"_X`����;�=��RL�,������_�����w�J��52�mm
l�`U�E�Z���$=����o�������������k`����am�5��]������n	���X,kC&�=�� �Uzz������
��z�tv��������j��������=���������n�n�����|���;�b������.h
i�����?����^mw	�{2���S�v����������!��������A�������48�a"Kd�)m�RRI>Yp��=�!�n���}�m9vY���2�s<};�����mVnm/���6���-���jJK{���CC�en5��p���r������5�������}�{����O�m���c��������4�u�[�VT0�������V�}���?��r���G�5 �W�Al�)�)����T�N����nh�q�!�w���7�{�o��=��s�����0�����A#k_�?1�����d�E��H��n~��C�CF�o�7���5g�4�����_�C�&�$F�����Sy%��y���y�"������������4��>����[b9������Zb@1���mi{��F�q%���K\���s[���?��O�����;�m-;�Kx ���=��ZJt6��k�	��f�����v���\\A��G��3���_�5��h~-v�As������]��RRR��<
h��YQ����-/��2��[��-n�u�~���j@�-.�����F��5��������$�p�e/s���2����V��_�;�y���N����������G��JtRY�{�����X6�4�����E�m�_g�<��n�C=�������w��Jn����hy�M5�&��]}����@�5�k����i3Qh��+^��>�������������nM����m���^�0r}����}-�A%?���^�����C�m$~�����%R�z�Y���&��l�ag��;� Gy-�J����Z\�F5�Ip���S���z8�a>��i�=����=���~�����gB8�4���
^�Y��6^�Y�������O�?#$zA���8U���h��s��?����0�0rz�����V��7���������������&Z�����>���zOBi�%�T.a�����������[X��[\�4���D�Y���y�����xY}Q��q���M��~p�k��������&���{�����l#��������oA���H���,��V���Sm�����
���T�Y�V�iqw������I`d�71����@;�|@�����G������nkw��~�,��N������[8���Q����n�:���~���C33����`��p��H���{��M��_�V��wN��2-����:{M.�w~�Jr���#���L�z����\�.���Z=B?�7�
�U�B�R���9�
��������=��M�IM,��V�x}O-�d���Wk\���u�������-=���w���;+�����|4�-�����q�@����������]���j\H�<RS�m�W~�$�-��_|�\�������6�w�/�O��������kw���_��r�
�k�cG�k�����u�y����4r��$��:��2���Z���At������z��J�K�����6:w�6�����6�Q!��]uN8od�kUms�Z�}����i\�#8���b��A�84�t��������?�OP��A��k����n������n�����9�f[��H����Z�O��������g�ik�����6i�w���������;���v�R#��������S�����#��_AZ����}��
������=?f�����IO����[���g����'��{A;��G��_I%?O?�n����#]��#���S���C;g������y$��>������N�������z^�����lO�_,����?E�	��*y�}_��Sh�����m��������IO�8���W}�������6��OK��K����]�~�;�o���W��$����c�=O���~?�����E��^��L�ZO��d��}Og�_/������XN�^Ds�`l���Gj-�d���>���M�y�����K���S��'��Y�d��X�&����3V���$������Photoshop 3.08BIM~Z%GZ%G=(bFBMD01000a820d0000663f0000e6840000968700001f8a0000f4e20000bc2f0100204901009450010006580100edbe01008BIM%�N~�+!��*S��hw
8BIM:�printOutputPstSboolInteenumInteClrmprintSixteenBitboolprinterNameTEXTprintProofSetupObjcProof Setup
proofSetupBltnenumbuiltinProof	proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd  doub@o�Grn doub@o�Bl  doub@o�BrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R
vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlongcropRectLeftlong
cropRectRightlongcropRectToplong8BIM�HH8BIM&?�8BIM�
������8BIM
8BIM8BIM�	8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM8BIMR8BIM0)8BIM-8BIM@@8BIM8BIMM	^FK Benchmark	^nullboundsObjcRct1Top longLeftlongBtomlongRghtlong	^slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenumESliceOrigin
autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong	^urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT	horzAlignenumESliceHorzAligndefault	vertAlignenumESliceVertAligndefaultbgColorTypeenumESliceBGColorTypeNone	topOutsetlong
leftOutsetlongbottomOutsetlongrightOutsetlong8BIM(?�8BIMC8BIMe�f��@I����Adobe_CM��Adobed����			



��f�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE��t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw�������?�T�I%)$�IJC��M\Z^+k�Z�.;F����\�@�xCX��-a&���{������e��0��at�
o���jUu�[�}L�����F��v����{[����j�4�$	2|�	)����]eU����mk�D:���I��eU�o����������.���
c&f����g��#]]����i�$5'INe�{���U�Wh��cd�@��zM���o��������=�Q��k]cZ�{�������r�W@@��3��>�X�#�v��5������������{2q��`sYkC�����;^�{���c�P����m��1�Hp>i)"J5�]�un���'�����I$�$�I)���T*�F�.w�I���-������05�op�1�����]o`
}��������)'��}�{����?�Px�	)g7sK\���APA�t@Mpsq�i�C ��G���������?�JW��}�{����?�h#��%.'��������<�wO�DmS;������X����`�e���rJg�Z������j�n5n����;O�H>%(>%%0���im5���$0�|}�z��������	0��R���?ki���u�%��k�?���	-l�d��E���m����.kL�}$��'&��SYX�D����,����������F5Ci��n��E6ccU[���1�$��h����KrJ�������&I�YQ:CCH��v�f�j�3q�[F;���yp��{�9
�7��Tm��wA�3w�g�v�R�����Z�0�����9�rJI
��JP���-��
R����C|�7��)K|?����))P���dC���O�����k ���U�M[��_,���4s�&i����������%6DvA���!�{�����1�����F�������ai6!���?�v������������S����R<�������){|�<����?�����?�^��<�?����IH^�y�u��3����Cj0��~h4�M�{���������,�1�����7�&��i���4R��<����t�o���\���>>>K1n5���kZr��m�c]K�;��������H�7O�!���g��e�k��"���A������)����(0���8
����6�3s����
0�!�m��o���)$��� ������o�S��o��y���A"_X`����;�=��RL�,������_�����w�J��52�mm
l�`U�E�Z���$=����o�������������k`����am�5��]������n	���X,kC&�=�� �Uzz������
��z�tv��������j��������=���������n�n�����|���;�b������.h
i�����?����^mw	�{2���S�v����������!��������A�������48�a"Kd�)m�RRI>Yp��=�!�n���}�m9vY���2�s<};�����mVnm/���6���-���jJK{���CC�en5��p���r������5�������}�{����O�m���c��������4�u�[�VT0�������V�}���?��r���G�5 �W�Al�)�)����T�N����nh�q�!�w���7�{�o��=��s�����0�����A#k_�?1�����d�E��H��n~��C�CF�o�7���5g�4�����_�C�&�$F�����Sy%��y���y�"������������4��>����[b9������Zb@1���mi{��F�q%���K\���s[���?��O�����;�m-;�Kx ���=��ZJt6��k�	��f�����v���\\A��G��3���_�5��h~-v�As������]��RRR��<
h��YQ����-/��2��[��-n�u�~���j@�-.�����F��5��������$�p�e/s���2����V��_�;�y���N����������G��JtRY�{�����X6�4�����E�m�_g�<��n�C=�������w��Jn����hy�M5�&��]}����@�5�k����i3Qh��+^��>�������������nM����m���^�0r}����}-�A%?���^�����C�m$~�����%R�z�Y���&��l�ag��;� Gy-�J����Z\�F5�Ip���S���z8�a>��i�=����=���~�����gB8�4���
^�Y��6^�Y�������O�?#$zA���8U���h��s��?����0�0rz�����V��7���������������&Z�����>���zOBi�%�T.a�����������[X��[\�4���D�Y���y�����xY}Q��q���M��~p�k��������&���{�����l#��������oA���H���,��V���Sm�����
���T�Y�V�iqw������I`d�71����@;�|@�����G������nkw��~�,��N������[8���Q����n�:���~���C33����`��p��H���{��M��_�V��wN��2-����:{M.�w~�Jr���#���L�z����\�.���Z=B?�7�
�U�B�R���9�
��������=��M�IM,��V�x}O-�d���Wk\���u�������-=���w���;+�����|4�-�����q�@����������]���j\H�<RS�m�W~�$�-��_|�\�������6�w�/�O��������kw���_��r�
�k�cG�k�����u�y����4r��$��:��2���Z���At������z��J�K�����6:w�6�����6�Q!��]uN8od�kUms�Z�}����i\�#8���b��A�84�t��������?�OP��A��k����n������n�����9�f[��H����Z�O��������g�ik�����6i�w���������;���v�R#��������S�����#��_AZ����}��
������=?f�����IO����[���g����'��{A;��G��_I%?O?�n����#]��#���S���C;g������y$��>������N�������z^�����lO�_,����?E�	��*y�}_��Sh�����m��������IO�8���W}�������6��OK��K����]�~�;�o���W��$����c�=O���~?�����E��^��L�ZO��d��}Og�_/������XN�^Ds�`l���Gj-�d���>���M�y�����K���S��'��Y�d��X�&����3V���$���8BIM!]Adobe PhotoshopAdobe Photoshop CC 20178BIM���http://ns.adobe.com/xap/1.0/<?xpacket begin="���" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" photoshop:LegacyIPTCDigest="62EF98A83ADB524E7605DCD49FE5AF90" photoshop:Instructions="FBMD01000a820d0000663f0000e6840000968700001f8a0000f4e20000bc2f0100204901009450010006580100edbe0100" photoshop:ColorMode="3" photoshop:ICCProfile="sRGB IEC61966-2-1 black scaled" xmpMM:DocumentID="adobe:docid:photoshop:3758fb16-8665-11e7-8ac3-b41d458b9002" xmpMM:InstanceID="xmp.iid:71c710a7-5526-a34d-b9f8-a707d19c3ebb" xmpMM:OriginalDocumentID="CE65CD01C083411533DF6131F0CC82EE" dc:format="image/jpeg" xmp:CreateDate="2017-07-26T23:45:03+02:00" xmp:ModifyDate="2017-08-21T13:38:19+02:00" xmp:MetadataDate="2017-08-21T13:38:19+02:00" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)"> <photoshop:TextLayers> <rdf:Bag> <rdf:li photoshop:LayerName="600" photoshop:LayerText="600"/> <rdf:li photoshop:LayerName="500" photoshop:LayerText="500"/> <rdf:li photoshop:LayerName="400" photoshop:LayerText="400"/> <rdf:li photoshop:LayerName="300" photoshop:LayerText="300"/> <rdf:li photoshop:LayerName="200" photoshop:LayerText="200"/> <rdf:li photoshop:LayerName="100" photoshop:LayerText="100"/> <rdf:li photoshop:LayerName="0" photoshop:LayerText="0"/> <rdf:li photoshop:LayerName="10" photoshop:LayerText="10"/> <rdf:li photoshop:LayerName="100" photoshop:LayerText="100"/> <rdf:li photoshop:LayerName="1,000" photoshop:LayerText="1,000"/> <rdf:li photoshop:LayerName="���0,000" photoshop:LayerText="���0,000"/> <rdf:li photoshop:LayerName="���00,000" photoshop:LayerText="���00,000"/> <rdf:li photoshop:LayerName="���,000,000" photoshop:LayerText="���,000,000"/> <rdf:li photoshop:LayerName="600" photoshop:LayerText="600"/> <rdf:li photoshop:LayerName="500" photoshop:LayerText="500"/> <rdf:li photoshop:LayerName="400" photoshop:LayerText="400"/> <rdf:li photoshop:LayerName="300" photoshop:LayerText="300"/> <rdf:li photoshop:LayerName="200" photoshop:LayerText="200"/> <rdf:li photoshop:LayerName="100" photoshop:LayerText="100"/> <rdf:li photoshop:LayerName="0" photoshop:LayerText="0"/> <rdf:li photoshop:LayerName="10" photoshop:LayerText="10"/> <rdf:li photoshop:LayerName="100" photoshop:LayerText="100"/> <rdf:li photoshop:LayerName="1,000" photoshop:LayerText="1,000"/> <rdf:li photoshop:LayerName="���0,000" photoshop:LayerText="���0,000"/> <rdf:li photoshop:LayerName="���00,000" photoshop:LayerText="���00,000"/> <rdf:li photoshop:LayerName="���,000,000" photoshop:LayerText="���,000,000"/> </rdf:Bag> </photoshop:TextLayers> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:61AEED856072E711AE6FEA541452C699" stEvt:when="2017-07-27T02:24:47+02:00" stEvt:softwareAgent="Adobe Photoshop CS6 (Windows)" stEvt:changed="/"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:71c710a7-5526-a34d-b9f8-a707d19c3ebb" stEvt:when="2017-08-21T13:38:19+02:00" stEvt:softwareAgent="Adobe Photoshop CC 2017 (Windows)" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> </rdf:Description> </rdf:RDF> </x:xmpmeta>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 <?xpacket end="w"?>���ICC_PROFILE�mntrRGB XYZ �$acsp���-)�=���U�xB����9
descDybXYZ�bTRC�dmdd	��gXYZ
hgTRC�lumi
|meas
�$bkpt
�rXYZ
�rTRC�tech
�vued
��wtptpcprt�7chad�,descsRGB IEC61966-2-1 black scaledXYZ $����curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#���G���
�k���0�����W��������G����r���;����i���3�����d���0�����c���1�����f���6����n���?����z���M��� �����_���4���
�u���L���$�����h���B��������d���@��������i���G���&����v���V���8��������n���R���7�������u���\���D���-�������u���`���K���8���%�������y���h���Y���J���;���.���!������
�����z���p���g���_���X���Q���K���F���A���=���:���8���6���5���5���6���7���9���<���?���D���I���N���U���\���d���l���v��������������)���6���D���S���c���s�����
������2���F���[���p��������(���@���X���r��������4���P���m��������8���W���w����)���K���m��desc.IEC 61966-2-1 Default RGB Colour Space - sRGBXYZ b����XYZ PmeasXYZ 3�XYZ o�8��sig CRT desc-Reference Viewing Condition in IEC 61966-2-1XYZ ���-textCopyright International Color Consortium, 2009sf32D����&�������������u��Adobed@�����	^��,��	
	


!	!��W�
1Q"���V�A��SU��X�Ya2R�#u��7w9qB�T��5v�8x�3$��:��C4%y�br��&�'���st6�IZ���cDg�(�d����Fi!1AQaq�"��2R��#S��B��U�br�3$T�Ccs4%V	�������&��D�d�56��?����������������������������������M����?�|�9�'^���Y�G�R����pb��#��/�kZR���]��a���|$��`�kG�Ho���a���|$��`�T�<�*8����n��J���k �j�h~�E�)�5�z5��~�Pj����\�|Pz`�U�\�������}u_}��e�O����e�����������[�?C�V~�5�;#��^�o���\�b[&����w
�B���R��z�&@�]���Y3��S�����5+@h^wu���-���L�E:����n��8!TA34YJ)C�)�N�R��8���@pR�5��m��H��O�I	IVY�I����c�J��Jp�J�"�A��D���g"�z��z��/-�)TU���1�n��b�{�i^�*���t��u��p�F��:�:Y6��D��U�V�)
ZvjcV��"6��f\U�=�*���j����|�������-T9�4��J��
q����I�D�7M���tCS�V���z��s�rB�E����R�-+��+^)P'�����$7����,�nj�����r�M�6opD��������Ls���JR���kJR�@v������������|�k�3X��r���J�tb�2H��2=��h�U��lp5)B��eh@�G���v�r����v����1�����,,��gO����gm���9��V�+.�Fc$���L�!IZ��-*�M�o���;�3�."��]1�����-jI;qg\��	�-8�NR�o�8L�Q:t�Z�JjV���?���������y��������P�����q����o1�m<&Ge��k~S>������gt�a9&�-��yD:���x�����h+�q���d���3�x�q���d���3�x�<��J�r|���f��fz_#���u+�/��H������;��K���,b��;f�	J�Z��C�`����;���sF�A��c�W�po���&2
�bw��oy>V����v�]�z3���]W@�a���`|)`�v�x�{�p��lck2JM����N��J	��iw*$��e�1�z��j���@e�*�t_��g�������>�"���5�v�?���b|���.$�bp���n���W�f�?j���C1�beVnmTL�D�R���]�WE�Z�����@�����0���'Sy.��-���&JgoJ�x�n��U=T���hc���lz�3U�(��u��� �W��yb�[��8����,ya[�v��fZ�mam�f��jV1p��lJD�A�R�/���kZ��`*��t��u��c-h����(��������o'�l��pe�R�T�1��YHkmT��QF�N�EzHU3�-�	\��{��-�������s��9��m��8D��]�A��~[sM\&���5�0fU%WM���n�S1C����I6L���7 ���/Z�E��f�8j�����:j�9Z���iZv{�*��e����Y�g\����=W����Y;{���gy]7��KC�_Nc�b��*<5����"�sT:�����z51�t���t�i�X����W�){]��j��h��t)�������J�iR�?���JW�42��w��Fx��Ry����.���F�x��?T���h,Vrv:�=�F���lZ�mU�b����]3�z�4�}+�?n�m���X�����m�\g�]�N�[<k���g�v��YHi�2Qj*^9������6��k��0�������f@}9@T�V��,������T�������?�v����b����������y��������E_�%��;�Q�����i������9Kl�����1�{D�-�Z&{���g����-�U�=�$�T�2��T�
,��J���(P�m/�y��yFKT�"z��V�����X�����E���Rb"�}�,627��<�s��J��m��p�=m�X6w$�W�����d��h����[1�e$1�^��7w4����I�F7������T���o"�5zu�7EUJ��W��&���"����������������TRvZ9��S%���d���}����UR�I&�Z���f���U���>t�|���U�b����.����"�cp��9t���R������m�::�T��iT���jj�m)MB��!��������v!�NB�\w��9�p�m�w��1��$HY[L�~>��"���UK]m$��Wj��*����
�r��w'�,�,�M���y	��������
yd[�+����ka���70��q&n����&���Qx�c��NE�t��@^���m=���8����N��������r�5s���Y?�,����Y�����d��r� �z��8?��7I[�<�	pgL/$x�\^�
���2��xH���e������G�YG�S}s���c�|U0}mK���m{j�����KJ����mk�!�EO[�zr��Qn��U[�l�K��k��1MN�@Sg���
��o���;a�V���e�����!�U���g�[�H~��{�%���G���&�����_���yO']��D����/+���sW�W5�p�e&��V������UCp���)J�\�y���V�i�6���B��`�>�������8��j�Aum�E	�S��l�RMdPUDc��Y4�:e!������u���^^�w��|j�f����������H��/������VJ���gR(CI������U�]t�gRz��������Y�~g��������2w���r6;���n����C,2N��V5s(F*3�����ZI���MF���1�?h��C���������<��9�;H\K�������n��4�C�^�����k&�����UM5��*t�Ep9[�������E�-�����}���f��0���y�U����I[J���_��;�n#�����M�Z$N�$)
�'�>�?8��{	x��7+�|������ed,��/��JE�W��Yb�-���r���k�u5�����lHb"�!�e���%��g�e'�v���_��;����YW$lF�������lI8��D%��z6x�������tl��k���L�~��=S�[Wb������2����]�~��*����_�g���H&�=u	JP�D����F��`>U����Z��W.�1��}
���7�NV�-�s��oLHv�.#��%{f��]v�An�R��J�J��Pb��s������z��e�9n���+�MZ:og�!�.�$��zE��
:����*��c�����SP�z�TM%k&�G,��1���l[K�J�����o���e�j����-�r�X��CE�)A!HB��^5�j����m��1O)�H�������e�����-b���26O��q#�L�S�"Y�l����C"�#�v�f�,u�G�^��T����i%t�T�Z�7j_7����R2���m�r�7sw�e��T�����`i�c� �s&�;��r���yL�7��naYj��6hK����sFS��"m�������L�M�=�nD(W�!�x��(e�MT���������.�C%�@c�����rm�n�v��h���������]�c=�jKFu��ut�!J��`�6:������6N��d�#����f��%�lyO�j�eY�J��\,�:��.b���In�L�k@�7�a��;�r�?�;y�����-�g<Qw_��$�y<x������(�*v�$�a�^�^����(�*UP�h
�z���3^�a�f������;�sM�p_�
�c�M�����=a��;�(~�)����N�N�P��	�!hj(9�V���~[Z�tn.V��wa�
�L�|M�r\��,�B�M��*V5��<cw���u#��9�S��*�>`��'���z�F�Z��e�&)�u���{2�[LO�e�]�5~��~�&���B}�j�\�8��������:��~c���m��u���:E�3'G��O]��p2M�P�LD�{u�Q��B�R�I3-S�z���m��g�b�Y%_�]TrMf�*<]���q�<3W��UgU2�����9��sUW�V����
�z�[�5W�!����	d�}���(���h����'���e��)OE��C�c jp��EO�'@������o�����hM���F�d�w8em��$�VP��>�-�Z����	��3�4�*f�jw/��NS��F5�"�;1��)�GIT����s���d��p������Km��[�,�Fi_���=+�r�N�*Q�QF�9��� j���;]�8wL/-U�<���n������lwp��%ZV=)���s�Y#U��JU:,�)�T�#r��~t��1���w,�������c�7&�m�FA[�r����"����4%��79Q3;�����.������!f�C����q��#��s�2�l��zYw\�j�3�Y�Y|agE��G�7����	N0��eD����)kW&9�z��������������y�N��q���Rv����e��\�&���Q^*WO���2���Z�YE�����_^�76�_d�~N�_~��-��h^���k��R��fS3�r���:�o��~��U���4rf�$v���T��tg������3����{K��w�x��O_yc1�l��u��R��k4�-����+w����:I$�f�\/�{����#I�������e���YS�E)j�Z�T���d����K4��QR�c��he�Ic(�B=k�{��Xp���f��\+�2��|�����T�g"�Z�w��7�h�|�R����c�Yd(r��$/����nb\�p�Y��3����Wg�'r
d&$�&:��iuM���O�8��qJ�^��%�	�&��{��4>`Yo������f�eL;#�5�U�1Yt�$�.B�-�|^��fEV]���e�I5kT�h�[�
�!X��BKN���u�&�u��r[��|���p)
�q�'���N����U�.z��*s��j������X�?�g��r�
��K��[�Z������
(��{#��������I\��ds��mH�-�MY��>�����K��M?�%c�V����p�Jb�CP,��ku���������[�R������+�Z�O4�\�n��?)6z�2Y�/��!I�L�%K��L��������GFF3s!"����f��$L���n��I&SC���KJ���@<����y�sX���s�\T�>�O;-	�`�!��
��Jf7V�o+�%����TP�Y�7��j�������(du}_/Y..�c����\��*U���<�����C�����d'��Gn��T��9�I��uQ���J*�yl��[�������;F.�(������������+�zR���nL���,�39iRO��D�W�z��B�P������[�Z�n�����o��75u��7K��y������)g1�QD
��)TN�d)�!S"�1RJ�
��;!�����|����u�������1}���������C2���*�-��K��q���xB�����M5���i������w*�~g������%�5clVx���O��:WF�����IA&�v������+�Iu[ D��0�W��������2��`�����{Sf�F�P�]�'?f�x�S���fu[=j^�=������c��!=�(U���}���`�R�|����g�}���!`%2J����%����DR&����I�n�k'��#u7v��Hwa���z��W/5���c!'U.Y���6�+�y��D�/���H��r�<�X�U�55�Zo������1���� �2���Z9v�����e��;~���2��`����i2����N$���Ze�7w�H��|����c]H��s��f	C���%��� ���J+! ��p���nj���K;�x��NbGn!�B��(N�\����D����k"9^k����F�{3 e\u~5��-�ZJ��qk&�/����v���8��8�+!�M�D���X_���8�k3�}��8� �x��{{�|��Z����zN�R�R�L[R�n�.������U���hs$G]+�[3v�C�}���M��1�
��	����[2�P�[��~���q&����N�)�@��K���g���:��	�a���|a|��X���`�9���<�ivr�.TB��.N�N��9:dMZ�$��K����s
�Mn�����QX��wKz3L��k�>���LN��L�a#_�S���u�~����&g/m>��|�=c
����F�T�y��S!�d,��������r��k��5��p�0%U�c��+B��Y�U�a��-�Ll�Y��T��
���)��\��,1�������fo��!e�v�{^|�E��+Z�]ucZ�t��v��#�s���ND���34<fyV�J�������j����W�E[�:�U�8��:�����J����^�v��io�9Ts����!q��'�.|�$���xo8c(�2Vm����'�%�6���\���F�;Mg�}�TS�I���/-�{_P��y=��l:���S��Y��p��:��=��n��"���7�5x���Ef����E�<��Q��O��f��Z9lW4���r�,|�.2����w�!(�7J��X[��!��V���T�Sx�S�j�m�X����x�=��y����%�V��n������/�i�z�&������>��Sp�6�MJ(�)��� }��i���j���Q�iX�����b�d�h�����M��g�)u��,�b_�
:8l�c�jy�)d�%��tr����]���4��l����<=�o�G_��QV	��)O�j���h�
(���
XiO;nj�{�*�����M�f{O�y.��W���������daKr��e!r8X��% �1�s*����<��U�GH'�?.�u����'-�#���4���\o+j6������Z�fY<�g\pS/l������bY�MR�gE:���r����t�][�,�����:�P����b�����h{����=[�V_b�[�x��������3�i�`_��zY�$G��P� ����}$zV�f���s���.j�e����6�d�$��s����x]/���-�t���9��M�;�������Qj��x��:U��i ���������y��������P����'q�x��oCj�&|G*��1k�S/��*�*��gkR8�����gE����x����t�+�~B��[���G3��~B��[���G3��<�����A�+o��c4���r%�k
:�^�m��u�m&�����+W4C��;H�_K���:U
�z�9�}�������d��+�4����������#al[�JR�J�A���U)R�����T�J��e�B8&���P:lZ�E��u��Fv����.�b���d����%Z�J��	����L�d�o�h�
P��+Ncq*����_���6%���kw`x�5I�����s��3������)!'u��F��eQEJ�UT>�`>Py�]�����/\w�e#e�|��R���`�M���i>B����l����9(����P���U�u'��i��dI"4�!S!-�i����/
R��8R��iO2|�p�?/����z�6��F�f{��r���j�������r�&F"�I935:�"����i�'�8P��z�5�����Q����lLA}3�vV=�R���2���Fo-HB%��;iA�7p�^��I��&j���j���!�����Oz����c���w�R�
���=�s��L�tP�����]����o}$���b)�4�cm�
"��/@�����P,O��������V�sIVg<�xL��U���c���6Dk���(l��=��L���� ;����]��l���l�L��3�����������
��Rg��3}T��9�+�Q�)�W���[6����1(ZU�w����=k^�7H��J�-����G�/�^��o���X�1Ku$F��\Y�$��vY����QE��5Je�*tM.�(� J�eZ�&�����tY7��;g^��r<��-��-Xi�i���QMVUIZp�MZ�?rT�Ik������od�;U�xi�f@�OR�� Y)��3d�N��F4:�M�Z�HZp-�V�W�0U��~���������.b�N\�.�E������$��"�e	X�D�{(�zR��P>��)���DG-�']gTl��cw���d����G�k�Hy&�����G�1�e2���UQ����=�QT�����n�[7>�]ON�4��KUVUJ�����j��>K���LGz�y�1��V}�&�Z?���A�#��F���et�����T��j�V2'�*n�Hn���g��9Y�y�e�K6�Z��R�c����oka5�y)l`<G�e��	D�\�A����vC.�U�b!�e9�����{3Pf"l<E���`�[�cKN..���V-�SJ.;*c�j5�rD��c��A��yB�����Z<���N�7=�����FxZX�[Zc��1������a�e��_��������������_���tM �n�s��c�z����on
��p�/�q�{B�J��-8"�wKDu�9Q#�t�j�U�QE�1�9�P�.=`�Kn�]�����Z�EV�[8mz,��%RY�R�1Z��)�ZV��+N([��)c�t���au����
j�[��V���*�+f��
���#`��6X�C����H���p����O��V�,�������.�^q��jk�����6�[9J6
mK�'�a�X�3j��;=��
��:L����
B9�}J��n�������QI�g-�"��7X�Q�Y:��!�Z�-kJ���+���k����D7�Q��{����.%f�fd�Z����n���r�j���k�:1�p�db���FX>�m��j��PE�F����f����J&�"�(R���
R���)JR���,��o*��pl��G����h��p�rv����{j�r��N���Q�Z}�D=
�����Z�J�%tX���%}C9;���k���j��]�h�{�5������.�oF$����6��2�J����v�\�b�����]����R����������u+�Mr$��n�+C��H�*S���|��\��|r��s�yr�F������[�g
���u�1D����HGN+^��l��|AQ2�w��1+��n�o����)���i`����+or��;F,�vO?�}�8�s$$�`�&-��F�s ��]t����J��2���B#Ot��n�n�����C�������4>���[z���T���w&s��6��g����w%���;S(e�cm6�����c���Q/E�|G��i�-���7���s�cK)���������1��$������)��.�g���������B;�OYc�~E�+��SQ��6�����s7�v�lTZ�a���2�43�SkD�IV2K�^�HuJr��"+���A�?x9hm^����~^Y7&Y��1�����i�+b������;(������UR��I�7H��L���r��gnZSU�b��(������?��H_�c��j����Sn������w�[�9b���NItS_�����nYw�d�Mb��,�,%�����d��7('���������_�nlUk]�\�Y����N���1�r�]6�}Y���D��t��4CD�V�U �l�v���_sf�d%�����u���B���]FY6����X'JV�r��Q�T�J���B���@?T�Z����9��3T{95����;$h�;�%��7-!5uL������0n&��Jc�����rR���@�uo������?���@W��v�z�9�J,����p���^��r;V�s�$���wJ��t�[A?"Ts U����z|zu)x�"�7+[�������%U��Q)@���l���+E:�3�P]69�Z������)�B�"�����'d-���A��'����L����v-�R�����M�E����77��$�6:��A��I�D��h�[��wJwg]��������z|��B�#�M�CE\���R�j�� 1���gS�UP1�C�t�7Qf�"����ny�5��.��vS������e�6�M�����!��W�;�r,{u��M���)1j)Ju*Z�S������h��l^2��	�r�����L�y|5���sp.���
�����"�MB������b�mZ���rb�`xS���))�d�/������t�?b��D�9+f���O�<������1#��G�"�$����H�t�����1j���3�'v/�v�f[�H�m����K�\���+w���[WT���������i�*�1i��Q��s�|/������;|�^�*��m��d�Ek����n�c����m%t��lD��R����xr�^��?
T�1�7h���U����M�dtOl%�IJq)d`0l��C����l�����@���8%����VR��Z���v�5h������r{2e]b��b�7�PD�]�.
o�����r�;���k����ugz���x�m*UD���C��%jZV�b�(Q����������;HD2ys��U����,��Q�3,�s��X���C�����X���!L�B*r�F0�\�9i���������f���V�����y+&��6j���>�{'E�A�$*�~��M��P��	����U��������r?�nb/'nX���t���������$�<"���S��zJ���YJ�5hj�@<=u����d�����4�n�X1,������$���UH��7��P���:r�������*��c��!��+f�����F���j���ZS����@a?\�&?�S����:����-l{���T�F����a�u�tI*T{d�,>��v�����Cv�ZF<|�2�*�����NT�&l�]��Y���hG����R�U������_��4S�g��J���*���`akb��C���������)��	�qv�[��V��z���*�-&cMB��:o���R�����ks�^���,���Q�2�I����J,��Lt����/�G�H�Ir�|E�Z� >��"�wu+�[9�
��\O�6��!e���������e�����d�� ����V���f��Ub�����WP�������hIH�!�w���k1p���s��j�[:;G�����4v�jJ���.�
��:
�SR�+��s�������n�����-����K��1-�g6�a
5o\�-�g� �fR�7�=z�)����S'��5r����2K*ug���R�J���o�t����~��_�n}a�b��J%���Z_R#\��D�����`��,�:��1����%oA���"��P�;��,���UD�H�c�cz��n�P/][�,�����:�PA���1/)V�Wf�<e��9Ncj�k�"V�p���-��/�/�Z�������D��ESU���5U�lOW�����9I�;nf������c���l���7K�����A2�B���0A�*�;�kZ�L���b(�dh�����������y��������C��o�q����p���,���]��h���k�N:l��<:����D9��������8��._�'y�^o-���<���7��q��6��nZq�����Kj(������Sh���i�/F1���~����;5����l����]���=�����@�lc0i3/hM$����"�xs���-NTU2uS�V����7]���)�[�7]�=)��MS�qGI�N��Q�,�&R�'{�5S���d�����IH�?=9f��:��;J��~o�\���+����ZN�3Ut���c����IV���OJ�>�>cX�����t��S2��5���sy�G0�V�d�Jq��gW��������q`�����
��.��*�)%C�1hB��??U��~�s-��F���e+�f����.�P�/$�<|x���;�'#��v�u^QUIn��uU:���=r� �G���H?����F�?�0���H?����F�?�0	v�� �_XU-{��.B��-����~J���G	�-�����O=�U�t�D���'
�)JT.}y�����6���0�����<�?��]���p
y��P���.3�ZG��[!
��!�C<��l���E+N�jRI7�iJ��V����\o������E�nJ8�$h��[�W�C�}ia��RP��i�%���p�_`��!jcV�)iS��(R���S��)O�P)�V�
.z�lr�����g'o���+u�U����+�%\�[:J�*����g!��5+J��PVP1�k���G�:r��)���P/][�,�����:�P����b�����h{��|������>���l\��w�q��/+����g/;/�1L|�4�L�n����(����d�L�!�b���}T��F!;}��`�N(D��N!(����"��!h�[Q!Bt(Oq���|�9�r�����sB��Ik������-6OTc�Y^@�I��(�Z�2�9t�=�F�M��*�����95sq�|�u��J����3�=k�`�������m?��g���:u��?�"��?n3rR����n���d���b����wH;�P�k�I33U8� /�����n��SUv�A�%J����9(U:�m;;�w�[|Z6����[�[����!�'��r/pF%-���J�IR��;<x���Sy �k7w�����3����u{5�M����s��[],/;�u��u��&����������NKJ��N[�����',1�r������xm(��xj��K+#.��T�p�_�o���$��:�]$�M�d�D���5hB���'�]�O�O5��e���h��As�t�e$��u3���Z��I���p���%�	I
�:��r�C�L��?R�KF����1������W�#�M�f]�6��n\���pe*���x�K�)��:�?O�L��>q����Og���Z}W7A�y�{���4|���`�RH���AV���'!o�"�Q��E)p��C�Q9C&�?T��^8��mk��>&��B��a����������.��u��z��QJ��	�T�%8����������s�v���@@W7�Q��������;�=]y"F<[�/����X������)�H��/l��J�J��g�H�
`������G{��]����	�flq?/����M���=��m%Ujs��D�3��?f������F�>��<L������w�T������_�Q�)��w����z�u���,h�9��N]����B��@0�Y'g3�0�r��,[>�{mb�u�0n��{MIi4�+�4g��_(^P���Vr����3:���l��c&g�H`������u�D[3��mlM�H�-.����I_�7,�H���mwk�
3�S$b�9S7AEV��4���/NW���Oor������2+V�����ca����<�
k�)o�G�I�
��VQ���C�V?��R�5����r������G
�@>h^���y^s���e�A�����9h���7t�>=�m�����~�]�h(T��E���T��cJ�R�Q*�	���y�Y��9�q���>������g,�WO5���������^�H�M��t�=�u�'J)B+B��z��;]�k���r8���!�����h���o�����XY���t��A'
�����*�kB��kT�V��,������T�z�������]��j��YL�sU�x�-���K736�6>>����VJM6g%�����������U$^B�d�M��L�Z��+JV�
\��Y�G/�~#��W�Gb\��z��+y���6�/2=��X�P�L�:��D�QR�O����\���3hB2y ��s�{�I�j�q�X��,��!^�Qh���r�
b��J(�E2�Bj}X�O<�9�i�v�6�Md|��vZN�i'�����g'����U���4�{S����T��2������H�(YC��o$�f��#v����o$�f��#v���kv�b}L���\�d�[��3��5��nf�uy�{UY��w/\��8V�Q��?
��.�������:_�
w_�Pv�w��7�Uc���0����,�������MOQ����d����7��s���/�T��-���L9��$��&�=} ��`=�
��U��Yr42)&�s��sV�0T�o�cY����ET@�%��s���px�&^���Q&��H�*�*(�
J�!kJ���B`��������������k�xT�T-{�����5��_)��prnRrfFr�����uUT�N�����d$�MT��G"��B�C�j5=:E9^4�+J��i����c_�f?�����L��(
�z���e������*��U7�ug�n���C��0�����)���i`��/��l�j��T~���!�?�����x���F���]����H�ko��0��t�����@}J@|�6���\�=`����s�n"c��;c$]>��W�nW!�V������U�)2���1��f��UV������������^�c���Z�B�����|����*�E����P���Z�3j������A�_��5���=�5#]0~d�{'���J��x~�����Y�S�]��I�&��&����)C��T��b��%	=�K��[�Z�����XC����R�=�B�%��;�Q�����T�V��,������T
�M�h�9��|�����1j����T���eZ5Y�m{���d��_y%Y$�w���Y��"��\�;���������I��+oNN�C�
�����<����L<U�������!o����S��V�c�z��+r$�	���Q`�Z�9hb��)�C��*S��C��i_�P����������y��������E_�%��;�Q�����B�>�Xo9��E������g|gp�������%[1"���o��$A����YW\�A���x�LF�T��?9�L�-~e82�F5�nW6��U����dn��g.�V�����RN	���s-���Qt��Z����Tn������1���a�����q���`�lW������U)���.����fU8��J�Z�(d�Z�@�V���nV������n~��_vgN���u�s����
/kf&P�r��n&�g�n�J"��F��E��q��P��5��a#�9_�����r��d��L�HDJ�o!*��l�if�X>@�^3r�������C���ZV���N|����Y9�Slp�:y��������Y�)*k����2���%^�FI�
�t#��E�w�c��"���yP�N=���C��+[����\[uU�����<�gz���j����IC���������JbU�m��!	�O������<���l
��l-+��s{�eXL�|�Q���y���M��~��n����f>f��A���V��(_�W,\����
X[�������-��������%�}��������6I����jE��4���reT8Q�����]��l���l�L��3���������OY��u��w��K�����Zo/���fR�V���*�y#CR�9�����nJ��^G�kCR�qWnF>����O�Cw�f	;^�f9�l(���Z��������e�|H������r������:�����F�%b�a������y�P�Y�.gh�X�����F�-��������\���,{M���neh��t^���U
�rh�u��s���6�������l!r?n�G�Sa�+
������IWi�+�'�)�Z�J�����c_�f?�����L��(
�z���e������*��U7�ug�n���C��,X�_������Ur��c��@7�����a}�|�h�_��&[2�}�g�"e������j�����P��^�K"r*��*����|�6�_��c�{i�,�R����������2��i��^����yqx�I��yh�T]
n�Y�2!kS�D>��������[A����l]�J���dG�wc��t������=UJ�N<����
R8AD�c�p��m��y>����v��z��_j�u��;d�+��'W]�5��c��-	,g#e!yC��]��dL�
94z������WA9����m9���,{�-�0��u�o �h�m��d���Y�n��x����;r�~�lRQ����mw�E����%uR���'��\��l���cx�*�����q]'$�R!�E;^*!�U/����^�C��������A�;��Y�1Di��������lh�L�}d���g������
�"�
�[��U=[�e�2l�����!�,����\�KN��sv3����R��]�]��"�LLC�b:iU����P�Md�r�-
@��^u�,l���J������M.<q���]�/=�-��*=;D���*��z�oqn����N��J�C�S�:�jh��k������n���+ ��V	\w���c!�*�hR��O:��pn1�ps�5jj����9�2����r�y������w��&��7�3kv��ZvN���eE��5M�J�ER�1�J��������7.{7��gF
�A�k���{��I�=�!J\5��X��������?��[�����TB�N��o���I��+�����iM�;
�>x��+VN$��q+7������:�����U���$�?IB�S�
������;cb�v�sJ�����#���wUx��
�������R�G���A�j�(�An�*U�J'����)���i`��/��l�j��T~�`(��������]yo�������_�*�����%P���G������E�����������N��;��%�h5��A���\R�VP����u9���P��^�Z�Z�rt��6�!��G���]��2M"���G|��Ji
7lm��1�p(�L��=�bs�J�
U�Q�E��\���<����������������u�=t�rF���5����wr���Q�U�Fms6h�~����/^44{��k�\�1���������@��l��/�.���IK'nV�����=��m�L�G8�s��X��(�RG��|\�ix��fU9���i ����f�P+�*�u���)���`z�Z,}��[���a�+�5�Bl�4M�gn$���b�'���)G�Ys������2��|�*t:eMD�����L���-mL�O�?P�.�MD?2`�k�'��b&vL�j�f\JE����c*�.���T#N����!
B���
R��)KJP�-)��-)�R�b�?@*��e����Y�g\��-z����'A���d�x�����,�r��,'��+q�K��qr1n�;�I��(�k�5zIp�R�-k@�o]�I(ST��=
n�M'�Z�����I�V��}�����T<�	��7[���/�z����kf7�����9���rM�I&�����\{;v	WI���H�sun"�U�8Z_����ur��k���HEk�^J���q0������5�����f��3e��y�L��;�	�*�R�A��<{��
���o^��a���i��n3� ���o^0�A�+��J�wIj���F��X�P���J�>dZ��w�7�!}�y�Ke}b���Z�<����Vv|�v����>S�7k���iu[�;~����t�;m��L����i�}rvZ�F�^���w	�Q�S���){���)��4�i�UrJ��2��;Z��W�8q�������0�Wj��6c��/��I�?�����06��$������V�/k�pF������Pt�G*���p��
T>���\��nB�\r��<<\��*�&:R����M���%�f(8|��dY6I�*)��
Z�;�s�|/������;�;�?�������E�
U����\�?�r?��q��������2�GW?����b^&2�����d�Nj=�L�k���I��f�����2j�s�r���k@,�����^������J����n��l��W����������%�b;4M�H��9���E���c�]��e�z�\�<[|�.+����AI�����|kZ��_K��]�Cq=���T��i�O�@Wc[p��z�|�k��[+di�=��&����������:�8=x�n'MQ���p(g�����Pi��#v�h���!
B���
R��)KJP�-)��-)�R�b�>c������t��S2���^���Y`?�����u��7G�M��Y�[�7���03��c���J`��X�K��[�Z��������fO��!�4^��z�������j��>�>Z����.���-������R�(-�����=`��[p�9[����k`��<L6Y����17��m\}7I^6���uU��I��]�Z�C�i�������z�]6Rv�q�����}7�)U�1�+rH��l��+B�w
&���7M*-ZT� [��6�	��G�W��r�wf�z�j[�hn��t��d�t���cvB�Zm�GH��A7H �T]7hu!F��^P6������:��8����O\�mu����]�v��9=<�v3=����y��b_!="������mF�(��:�D,��c0?�Q/��@@�$���o���;������
�z���e������*��U7�ug�n���C��5��v�����Ev�^�f�n�[�HD��(��}�������J<�Y��I������n.�
C�e�Vy��Tc�]�7x���L/k9q�o[��}�p��R����5�J���6�M��W�#���1�qP�x����}��>,�6,�-�x��etw��.:�Vu��,[���
�jN�7cgq��RA�G�{a�����:*&CP:���t�xI�c\0��n��,����qe��`�'�������0n����p�fR����tKJP3X
l�=8����e�Z��3�x���
�lgh��0�2�<��U��=h����Y3p1���P���D���w;�����dC��C�%�v<��+�(j"���G&f�zF��j�����S�H�i��dI"4�!S!-�i����/
R��8R��ykm'�6Y���Q�����u��|��b�31�g����l��M'*�dQ]��Zt�b�)�J���nr���d-����e��YX�1��,�n��y�"*����StL��JW���NJ\�&$T�w��Pr��T�Ea&:���V�N�v�/V�!�h^���)@�|#�:��6�l�v����'R��nbL{jc�wnzF9�>cj�jE�1�su�ec�5kZ���@k�t��Y����������"�za�u��G���?�%�_F�w���a����������u)�C,Y�e��m+n�����a��l,u�hYVd]�iZ��;b�����r
$�d��Z�D�!hB��(Sw���r���l>��3�j�6-d�
r�x����{#
��hR����&�������2�U�%8if�N�������x�Q�y�����`Na0^���|����Qaw�����BM��������.��H�C��H��bjv��{�V��pn�`lw-y^k�����q��
���7�V�fMi���8Y����9�j��)^�|�}_�Ym�������S
1�Q�����s�t���nKz���v��n���7�5���?XF�SN��L��(X[i>������z��m6�������!��s>hv�#e�i9W� ��������c��MZT6x�z���R���v/��dD�
n��;5�K/*Z��S�p��V����Ddh��T���".H��P�k��K��x�e��n:�8�	i'����;�����V^]h�N�j��s�v�������(uS�5C#��K�D��$eu3�D�}U������������Gt�u',�m#m	��I�����)�-�\U�X�6���B�����_p.����}��8�=YL&�Ll���l��k2��Y�I������D�$������B�USP�5*6��e�6S�����+^���L��0�"������9#��}����@�(DTpS��1�Z����5;a4CJ���)=��-�sQ���2�����������F����%�E�G"H�����7T�kJ�$�P����,<5tG���A�B�����-���d'!�!^��K�p�%�Z��Y��?
��.����-
ZP�-(R���
R��(R���)�(�ly�z��r>��K+3��VR�������#b��n�b��)��tz�&��Qu��I��=(����������5�g8g���C��1h=�hX��T�MjkN9T���,���lI���X�&�!�����J�IP#"�lu����e���8��h�}�`�[Z
���V):M�L�V�A���t�X��@���C��"��s�uOWu�;�j���)^G�V�K��y�����*��=�K
:>�������]P�J�+��z���Tq��h��	��1������E�M,��5��94��;y���!�H��SQB;��S�t�Z����
��g��=�s�?RM���6`���L�������X�����*�o�)�/T:i���58��y�.��
�c��V(��W�<�`�[��T{�wf}*���g�f�%].s,�D���R�9�SV��`���:��q�0�%�87a"-g���������m�� V�� X����f�����r��)hSV��($X�%��-sc[6���
��
���kz"��-h6$��C[��-�1h�}�M� D�N�KJ��:>F�x�0Y�X�,�^O�.F������kB^v���2+3��.$�r��c�YR��i��A`92���.�T/.�Co4��$��X�l�>"�r���mf��R�2=���Ju}$����Y���g�L#��"��m��-�3h��M$�%(R&B���)JR��w,[� Hek�B������5���nms��S��5ji��r*U�������V��kS�!k@�DQI�I7n�h �dA!RER-�I&JP�)KJP��8R����|����[��������<�l\��]�C��;���Z1K�x�
�n6X���R�N�M���r���k����z��7�"��"�
�|����2"���D�f�H���W#{����9�E��d�*U5Hs��a���Xe-X�b�~ ��DM������^4����u0�w��ao_L��FA��5I�h�b"�t�ze
`��w�������]'>��V_�O@?C}u����.�X�.�x�X���N��V��hE�ei���������o�{&�}��{�2.0������2�<����:��f���i@^���e�����m����nt�Q3dMJ��-i���B=+�/�i�;�^\��GT��2��@�:d�
Zw�������������+Z��cG�������4�1%�B�ec;:��m8��J�coZ���K������J{@2 
k��k�;31ql���n�\�b����n���+�@C8uW������o�j����RT���^�x����1g��tlsF�#��7E�&�#F��h��M$�L�"i��)KJ��)J�n�N���[�����~��oK~f��l��:����Z��R��nk~a5�?�~�e��d���':J��1�P�x7Q�GX\\���X��^]^H������-��+����)����g�fgN����z%U��t-T?�`b��l��m�����/�Bu������U�m�4?��J����W	���d�Z�@#��T�!���}\�����]G����o�~N��{���#��_��Fm:����E�a����h[�����m8�n��`�8$�"$Z�D����E->�vP��I���f6�3�}ci���wt<6����{��C�}q(%I��YEW}���3�=Jj����0�k�����}��x?g�"&�kvE���YyR����G;�er����O�# �G����4h�p�E=��0sX��\c�c,�q���KI8������q��������EZv�Vl����t���-UYC�z��1��`��Wal������nq��I��R������r��>����=eW-��:���M>����>%�{YLq�
��
�����lKb�����}.���^��l�������e�(�2�V�=jj��2�eX���f�F6E��������N��wl�4qC&�J�cD�Z���JjV��k��]A�i���[�O[u���#���0���b~��>B&jN��`���\�X�.s��B��������{�0���F�����������9���&��-�7�~H]�d��&�'�,����h�n�C�9:��!��1j�/dl��`��1����t����kj��;m��]���n��QMt�!It�Ur��5ZV�����G+�AvF_X�AuJ��!���K�R2�o��L��#�����+Z�6�)O�j����r�VN �5�;U�.�j6]���%[������Z���8V����
�yar��r;<�k�f�[�>6�F���a��������K&����kS��M�
�7���^*QJ�5Cmr9��n��1�V�,���.�T���<�k�^�]�U����
�r ���:��S�r���)M��iZH�:����	1lk����m�2������,��L���<�36#
���t�B�L�Q2�.�iJk��^�`=��c�]����?Y7[�.��x�����m��9�;+���}2~�Z?|�'��E����)�E�)���8�{+`�[���6�ZI�&=�6E���xu�dU��Z*���`������&E�j��C��1�P��5������No�-M$�[c2��^��2����j'5�d�*�F�o~���*I7
����+�.s�s�1�Z����������7��k�;9������n�}��n�]�'5 �Y�F>A��c�kE:A��J������;D34�O��:��qB�����\%���k�R�cgE���{f�Y�II$Y��T��S�Pz�O����������Sx�#���pn2��p[�j��&���? �����n��)����^R���������9�����7 ����y���d�������J*9�s*��Ti�:�L2k�Tj��.���U\�,�0^�[�������u��cdg����s^�nL�6��3��f3�$����|�������
�M�+��0Q;,��>�'1�����o�3}�-��]g�*��#`d�"������iI���Q�x�N��%���T.��������vf���[�����L�W��j-y���[�k�����M$�t��MH�I�T�j�J�$�
�\�12����]���4[�7abs��q��5�8���ob������$�]I�����R�H�Cz�IP�F�X��nN����s����h�����Y9���>��`����������� �z��a�rb�u�l���+���VE�ic[:���
�h��DM�h��,������$����b�(D�n�dI2��R�;P����������������������������������������������������
�k���-8�;�wc��������]�4����5�~G��Vk'&������"������iZ�r�}���=_����������Xyr.��~�NJ���-�.���4�Y�*j(�
S��i�+���;Y5�a�Jb���x7,�	[b1��7$v'�d/��1��� ����K(C�=jV��k/+�`��3�C�v��������o�e��q�0��������<u#�tx.�'Q2������kZP$8s�o�u?��+]-�v�"����s�0�Z~����o�}�$�|cC��H)����7jUJ�E?�MB��-)ZT'D�lv����������E�9����V�a6-m���R�������j�����Ed�uM���,N�x����>��o���e/
q���?�PsJ[sWF�����E��%��&�Ka�f�J��gj��V�*��/@��C46����)��C|yl���N��J%�M��yK1W)F�%��o
.�ODV���~�j^%D���@���8�d1���pFE�r�+�c�'j_d�2�r�����L����p�t�n���"��!�]4�!�@�� �Ly���������ib(�7����5�.kZ�e�g\%�3����i��NS/|���
�����1���W��_%wsD^�����R�)�����l1��;�n���OlVJA�t��������OS��m����
���_�����v��������g��k��1����e�2�����:�`"��/��l�j��T~M��1�������u�����c-d���������e�Xz
�e9�2��{a�U�w���f���s ����������X8���9�r]�6�����l�d:�d��T&�a[�Y1�<e�|O���H�L��|�4T�p���7�(����)����Z:���;q��F��4v8S\[m�oIV�#q����=����Q$�h��^��!��C���i@�>����y�[7��c�aV�,�N����W\q-����b�Y�;>�ZRj���V�sS��U`���(G���x�-�X4�n�}�G��$�y�*Y7�a�y����8��^��v3d����K���X�����,�U��uZDPt��E�RL.'�?a�~�jb���W���Kf��X����'p�r��`����J�8��D�H�n��r��f�Y:�!���k��z���/�t&�e��l���j�.�������O�,�>7�n��dd�:�EDZ�&�.Ed*����'U�
��I�>��wT�2�Gr9|�'x/^�����NE;������#
�t�=k'mJ4x�( ��U��[�UVn�@��U�7���yM[��Iif���dt��K��Gi���S�vs[�u2�1�Fa�9��(r"�+�K�����.1�f�L������(M��q,.K�yOd
���Lsn���:��[&��2J!���V�T�UekCV�������s�a}mn�n
���Gd����}u�v/2e����I�7�����#F�����d�v��Gm��b�M�����z��r��-�\���f�w�8_v�!���o��k^��s�������mH�BB*-2�W
��z�|��8A�Zp5=I��������a�Pzdlq`����N��2<�`������bY�[�$�S2����~C��J�s�1~�p�)P��cY.]�9��i�%��u��*;��%��6?�uh��P�L��.��Zw�&rOre�<C�C����%+��4��������t��/�`[�&c��22�wc�Ld���Nru��R�Z������QZ��D��Pvv��p"�g�k�q��q��������4#����_�E�lu���ni9[*��\�TtR�$�*�R���,Jj�@�>P\��>jzIbm,;6�,��9����ide�I����99��X�f�>f2�k����
�(j�!_���&�y��1��v�
��'�+`5�0j�/�lK���I��s�����S#$�S��v��T���g0�%TEV�!(�T��l���Y���k/�q�9;#i�����{�W��a�d�"��NV�����~U�F<�0����i����$��1��lZo�����1��vb��n5:_�-������xe*�������A���f���O��B����y�dX�}0���5�����S�����!�8n��������Vx�_���n�L��A�g�i�S����+&���sI�)��B.}��(���
Sc�]G,md��r��(��Zu-�)I\��!�J9���L�L�oR�c-����eoV>���nE�0Z����d�+���,��p^�����xTTJ�i8N\��:�v��$Z�67�3M����kyg�	��"w�K�/1wcT���3�%�3G���{�Z�p�r�N���V������Ez�������
���v��x�E�-��R�m�86��j�#��r������)D��kT�4*���M�P����6��%�o����uJ[2�&��jn����t��[�M���uD,�55
�6.�9J��&�G!�C��y�����{���&�&5��������SA%n,���,>0�T��T{-&��%�x�EJR���)P��UV���y'�2���cw�����o �VK�#���EH&��d����-��UED�O���s�����G���u��jw�[e<�d���,�9[)�7��A���I�he��j@����q\�����������c:����Oq���v2�I�C�iUY���/�j����(h��t���.��U��yP\�|[5�y�k+�����ESW�D�+�Ui_��S(R��P�6���}o=�q����p��(���I��$]#q#����%�Q��M��,��s���u�%L~3p���-�>�7 �Y���/(i�[�z5#!Yv����)i>zB�	F�D�����5:.:������|r�����,&9`�~S���Nb:Bj.���}<�����Ur]���[��l�����5���yh���l���e��e�+-\�ZL\��k^g�����r�����fE%�`�� ��X���)8���a�/�WX9g��?�ng"J��{c�BJ���b��	(����>��
���`GSj�i7b��E�DHT�ZP2�]��>���h�?���'���D��)�b���.\JO���7hEp�|m��Fm$�D�1�L�qJ�����;x��?"�$���9\�u��|���"��i��5�-E�yL���fz���M�_7���<��\*��RG�@�SL��o�M���e�.�e=�����;6������k*��`����������d��d���b���J�&2tmP��'?��h?�Fw��Y@.B��8�n�$6b��e�>|�t��f��U]��NW�H�i��9�sP�-+Z���
X�~�a���5>d��������vm��
[������6���4��d���k
V^�"�5[�`�RN�IR����?!��zWi`
�>�����]N���>Mge����-�&
,���0~yr����j)�$
�����/_V??���O���h
����~��+���-�v'`^f|��3nF����X��l���oJ�v$[���&Rt*%*E<��5���P1���@h�6�U������KlA�,�=J�p��<�a�k;-6Yoq0ie\�I������QN(� W��(	z�����B��xG�@m�$�S�o)\5��m��;�3����p����6
������`�����zUS�"�6�A2���Q)R(}��a|�����^�z��D��_z�0�*��;��l�S�o#+����*��-J^%A�c���ti��������K0c)�
��:I�g��[h>Q��O+���P�x�&b����J��;>�rP��j�Ms�%��`�[w�oL%1�.���X\/)<�d�Z[��m)�c��shF��C������J�����������������m�y���i�����6��bn;V��Vv��Z����&j��58�-hjR�
���O��y]��Vw'�����]�L���{�r=[����]�j�v�L�����S�v��$�z
9h��X����<���sD�-Kg�&��;7S-9�k�KW�v�h�N��:�7uu�7lTY�)UH���i��*|Z2b���P�V4��6�v6'�V�]�����c���#~���-[^-(x(vS�h�v���jj�������Z�(����1g?X��u��9�-~�\�'�v��"^8�����!�l���v=n�G���v��*w��#����2=N��X7�i�ks���f�0���:��,/K~����G��r.Q��!�q�To����N�UW~�V�J��������n�qF?\#��V�J/��Lq�MHKq�+eh��ke&��FD�)X�*v:�t}�d�NV���M8��3���h�t�{����1���m3}����f�WL#�cd�N����VBT�^�IW��d��)��C���^<�t�Fi�lO�s�3�R7����^���8�>��b<9���.M�!m������/��;��C�r$�����9��+,-nd��2�L��p�E�o*�"���w
��,!��6,_8H��E�8#gdE~���
:�0o���mX
�;A��c:�0�2��E��/-�����X�;���egFOI4+��q�CJ1YZ:j���� a}c��������<������������s�#��\�a�����ic��n�i����s5',t�~�$��BQ���\�yP�f�]�5��k�������O�1�Nf��8��*�]�|1^Q�	7	;�����A�YUh.�%�L�D�$�M�7Jg^A�(.�\y�����\����q��������p�"������]����Q7YB�z��� wr�������6�(������2���`��}e���r���������������Y��L�r�hg
�3����kG.�h�sqF��T�|eE�����
�^�)��(����=��
��S	f��+���YF�(�������/�L��/,lYxa�O��X��}_�re���q�oW�]N���Yg
�f1MTI��hZ"_sCP��MPw�����pN�'1^kW���D�2&*�p�'�2�P�^f2v��m�5�u�!���'jHFu)�`�T]%B�A�����_�mm�;);F��N������!v_Wc��Nf��.
3�J���*��M$�E�d�j�&?�����,�f,3���ov�.�R��-��`��X���i#/h^P��D���.�������+Ei��j��GA��X�����up����Ma���.���cqd>�����i���������*�j���cB�j���&7�f�1�
P���+�L�)i"����2d�����sJ���q�Y���E T�k���l�"�Uc*����c�#<��8>c���k�Ja���,�\il��������,)^)}CK@1�l����UX����I>�K������J�b��Fb�9�[V�oR��/r�Hf�5����2����TL�=�����n*��V�K���4t]5�=k,�gW�9�����b����7C��a��v��>�-�+�����F�ZQ8f4!�&���aBcyvic�q�-��D���.��9C&M���]W4��y���>�TRM&�q
�6��!juV2�(w�|�����n��o+\��
�l�"��9k���db�����a�����g���gB������n���+61)P�����G�n�O�&�����B���^7~7:�ii�Km�(�p��I(T�N�g
[�@�r��h�*���T!�����x�#Y��y���x���Z�5��N�@��vtcn����"����V�K��
�q0z�E
��S�B�$��.���K�`6_uv�sh��h�"d/�[*��z������d������[51��FMM.�S5���f�n�
��������1q1I�5���]5hs;`�e��pb�)���@��u���`������������g��W7~�sQ��a�yf��-���-�8�gmI�NX�[f�"n$�Tn���5CT�7F���-:�R�3?����
�[�-��
�Z���U4�Z�T���z����'�Z���?�����t�����63�j��T�#�
�C���������x�������O�@��������
��h�5�������.)^=G��+c��nZ��1]��f�;��2�Dl�V�z��-�b�Z��hcb�39��;Ir�c0�5G-K��v5�2ufY
CRy���
w���e�7�m�����MBJT�4s�����Z��.T�-��0��=�0�b���;,����,���c�&T�MF��tU��BQ�j�����c�zY��s����l]��\3�VfM	)9y�3�(�f��`Pu'/(��5GF4]��)�D�9�������t�-��q-�x������$0�m�y�G�;�H�;�����tk�8�*r����,TMR��N�'S����W��g��V~��U�c�6�[�������m�f��b�Z�VrvaDZ�n�i�Qe�)Of��Z��kJ�s-\8�V/��08�"g�d�\���5S�2mbe�a35����{E��T�z�^�UU(�G=�����Kr-��r��x�y����#���y:eFv;uN�K����tt�����C$��"U�Cu4R��R�j�������,���.(�9�#���BJ2F"n0�JZ�������J41�G1�mp�CU>��c���x���+_�������qa�X����>�Y������[|����,�D:��(�����j&z8M#��N��C�r��id�cv���<�m������YF�V��nM5+���iF&:K��G)�r�+���w ����kJv�)ZW��+������i_b���+�����=�����(��Z���iO�����s^���7��#Z��"�E�����S�����@'��,����������
i���g�����8�8�$��?&�f��,V�����s��\�-	W��A�
��U;�;�w�9��4v�b�S��#1l�r��;�/�p�1��D��i���c|������l�j���&����Yfn�3�z�3�6]����tW�$�����e���_����������o���-��1��h���x���eVIB��[��*���{}d\-n�rq��%��6���A��
��`�����Y"�W�:��E#\w���KEZ>����L�%CXr���x��rg�'���G����e!a=�z��V�mT�x�U�'Id�������Ud�Vf7���$p���N���#������*���,]V��IW����M��^#Z�b�rZ4h����s&�u�5:k���e@z��),f���&�
R��"�5)��2f5
J��h���/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~��/�Q?�����
D�b������5��?��w���O�,�~�j�������vRV�9��I�Hj��(z�Z��d����s�f��M�>Zw�'��q�w�S0�v���������yB]�lT}�m���qk�E�J�R�qE��F	��k2��/���w/���~X�#�V�_!b�����5��m�Y�~F�$F>i�"�X4�:m�r73�*�2��!t��i�/��T$��A�i�u�����-1�����C�����+v���&��nzQu!����z!���&W��3?X��������9����X��iG��B��2R�FN.%ugY+�^���W��\T���N(�����`>����5�h��pm
�vg��r�4,��Y��������$�IU�W�c�������D�����e/���}o�����Yk#I9�����8}%$��+��cu��;}(��,�2����*e�J%J�Uh���_�^���������1o&]IEXw��S(�������B�B�C����	J��F�@u���<Y4�I�MU%HUQ<�����"�-����+J���@~�}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq�������������:�����19��t��?��bs������'�<����X��O(y��?��>����P��'@<}c��<��'8�N�x����yC�Nq���k�lG�[�E�J*�VM��	f�m����	U����I"���QC���d��)�_�Q�t��U�N������F�1Euq�&}�]4�)���=���m����Go���r\x��4{�v�?���������rO���v�g�6����������I�[���������{�_t<;�}�<K=�;u�=�m��������I�[�������c�U���M�e��T��)%Nn&-x{�kS�����<�LQf��xv*�9{��j�S-�Wr��"8��p�����`�~�
a�O�,�Z�F2MKZ�H���2�5}��>�������mjy��_�d�s1����B�vk�.��-��6����w���:���/�-������V������N�.�1*T��S����S�J���FO�����s��v���d���O��Lq�/�t
okh9��������5Z����D����uZ��V������Gv�i!T�p�5R�QSR��N�>����������n�"���:)�'��-E�Te�Y�0�i�����p�\��������dvlm�me�X�dU*��D�:�&�IZ�x��Fw������>u=��5f'��wzq��W7F��f>�^4���������O���V����Q��T�I2���Q3tOE�p�
�WE�Y���2�8�<1�#!�rW�+��������Dq�X���v�g�8����
h���"�)8m��j��O�q�K��Az��fo/�����9�����F
:��g����������g��cd�F�k���1�~O�B\��L�cb����b���k����5\��Vc���O�L��?G����b��Wn�w��k�����V&~^��ZI#m ��t)R�t�'L��.>��P�t��{1�
r{�\q�{���y�k�~����=����5���R����<��	��v��n� ���N���_lUh���3VC
�#:�<�����A�N���=3��3a������$�+g��.����{�S��7�ZV�._W����kh��rs�����|O[�W�/���d&&�\�)�>,��s���v��$��e�Y����O�#���N�L*9�z�/����Y�����t)�������G�����]����v�>m"��|����jAD�����Q&���|RTv�t�[F�F��3uFg1����'��O�"���29��oj���9�����V���
�������aB�\�k�8�ehY	�'E)(V���[��f��dez����}'�ht����"��V1�b�4-{ho:�^�s���M�5GTt�=�b�	���
x9�o��^����;j��n��(N	�������6��nl�>%6�:8�y�x�����lh��]�V�>��ho6Lq�y�'by���V���1
�G����J�)���	L������5�.{���17i��k;won,���z��O�=��{��Z��6�Z�g��Ht��U�J�)RV�P�i��������U����z�DtD�b����uh����2���g�c�
)�=�+�X���u��b�++$d��H�����iZ�\E�����^��k>����"���e�����Z�:|��Yz=X����j�4�j�6)������6~	�r�;)+��8�bJ���{U�4������^���j�X�O_sbY\�cH�ymKqOv��&|�����]����*�8H�"�kJ���^�Z��V�m�+�r�W#
���������/��������K�^�M�{Q'��<L��B9E5�J�t*��C����+����@����
O��ss�z]����U��v��7���UfP�5�j9��%����2��H��*���)���  wCy�i����
���q���s��XZ�x����/�[!������w����wu#v�-��O�dL�e���T��W0h.Z{yjrr����b�Kl�75���Y���o�Z������,3d����[�����*?���:!��3:��s/�Q����7.NZw���6/u�LSgdX��{{�+��z
���r�����G��I�x�!�G(���������Z���2�d9{ng-�h���r\�������
�}c��������E��Y{o[t"�����N$g����n��j���_���$�u���0�)g�U4g<)��Q�����6,��x�1�������f&��;��(�*���C��xR��i��b\T�������v������l�mK�g���AGj��\�S�%T��*��8��}���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@=���f�eew������l����w��!�w���� ����3�������_��a�6VWp�z;����;����G}��|�Y]�����C0��++�@wkR���45���N�m �n��-�{u�%SIw��"�U9KZ��=+ZS�J��V�y���'9�M��&�w����-)���b2]�cO_��=���e�7(��v�mI6�e�`�%Y��$��/U��v�3�0�=������r��tj���wF�q��l��Z��o��;)�v	���F��+-v/�����*�+%���I������#�ynO2h���O������:��nKr�������9_��mx�M�M��#�N5�
�f�"�/V�EW����
����9���F��u��M�kj~���*�um\W���j��@���FE�E��z?�b����r��5�����rsb������/^c3F%�
R��V�).=���6��-�%�������YO�3X6�d�Gm�e�l���$��g,k��M�;g���t�2n�b�*�YK":J6Z����!5t�
>,����U��\����J�{���O�M����d{��O�d@�
�s9���\9�1��J������U6+,D����	���^H����mz��:(�33�Q��nv�|��������NZ)�������J;�Ts��;p��9��\� �r��~�!_��h������<Ts��;p��9���A���6��?���~����x�Q�K����P�������� ������*}��G9/���C����_So���{�7�.����X���[�R�\}*���p���b�������[�!���h���w/w:��q����;j�r��_9�%#��Q��u
c!Z�S�x����^��l�A�eyDGz���:p���e��{S�g��UW����}\|��u�l���
�r���%������S��{y��\�-Rp��+N�E�hj�~����h�{��oO�/���������������n|�9-R"�5�c��;��k&��)��s�w)�s�������n3�A�����P�O�Qr�J�[����n�6����~�Wf0����)�����Met_��w��j��N5E1?C�mp����frl3K�f���6Q��Gp�u�iR��)��+J�dsgM����n<�8Uw7\����s�-�f������Wg
m������c����U�c7�7�U��JK��{*(N�N��Su�������nX�����Vj����j+�>rf��3��+�,�%\�����Z�UU=r8���J���L.�;��PV�q�]%p),�r���b��9�V�V�?��{!��WO�����ianf�L���\����vyX�.3����Z�����/�M���"�&�}`��7o9���rv(��	c*������+������9Ar������I9����>>������7&J�Nq��F|R��x��^nx����	�����(w�2��1iJ��J�����"�e�+O�l����n+�.���\q��Y25L�[�,����g	�:��n��^�s��D���%g�Y��������������k_lc;or��������M9���y~��{�F,�x���ie��KW��z�xWU�>f��=�#+��3�����������`#[4�S!�R�>���^���-+;������V��Wb��-����"��WR�2[����#o�ni�W8�<g�Hw��=���}sN>Q��w������.�jZR��{"�o/g/����e��;�z��8DtK�j����>�UG��=x����l����>?a^�8��k��c�L�FW[��#�d�Vq�������,���]�v��Q7%�pL9��$���8����\�s�-
^'�7/$�='U���9�{�)�T���c�u�7t�+|S��&k��n*�:c�c��KmY��c�v����^A���`�[N6+�h����]S���1�{#��������6��M72���������C~��~��p�����
��}1��!��.v��v�ER����\���*�h�BI�r�k�v�Z�7W��Zv��s��sW~��DQ8��t�1/-5o1��u�T�n&������e%��q��Cf����v�,�U�����[�(�kJ����8����=���9����c��uw�������&#�K�x���~�����u������1��|����1.K����q;��h�,KJ&�7��Y�jdJ��%)ZP���y��3|��k:�4U����;��SG~x�<|�����[)�<���w�@��L������8t�������t�f��	[�����\��R�J���)����~3��9�����������]=K��^WJ��M��-�{�������i&��6����O"Y��L%�wv�����2�]R�n��8��k^�D�����<��{H��33nh��f��0�;T���r��A��}�����E\b��z=�Yo;]��N��g�gB�E�Z����N��^��j�j����=5U3>w�k-g'����Qn��#�!�������=x��OZI���q$��+��U�"�J�B�v�j�t5+Z�58���A�Tc��c�����A�Fm���zq���Q-��5�G�k��dq1��LB��)�C��LSR�)�jp5Z�+J��W�9��N>2:%��0g�:����j�6��S�EF��RR�5kZ�����q���u�����������lp����gIRD�!�Q5C��g�D�9
���i^�}��|ltKR1�`�1�U9�g�mS2�������Lj���)��x��B.2Y���c&����h��$p��r���-^5����N5�P�Ax��O�:�`��[��h�g�z��V�7*�K�N���{ =��O������Sdo�{���@A���0�R���i_�������'�K�
:����@��/�4��%��~�������)���)�R�?����4g�ok���!p��������r�xX�U������W�����2����R����>�����o5�Q�g"��[�TcU>irz���_5E��[2JV�t��5�s�,��D9z&�.N%���kW�fv���M4��^�������c&Xuz.^��F�~������g����L�dj�%�rm���#%w^�.���)��nx�Z��c�e���{�[�����Mx��J�z���S�n��LOV��b�[��1�I���U��"Q���%�E���T�,�	JS���N����:�eX���"�K#L�v�1�������V�D�o����4���VSn1�#��o�Ck�agu��.�)%�Dm�9V�����/
��x�b�g!�g�d��]sE�W)�b����=�z82��w/g1N���k��|<Vj�?K�,�F���g��������9
B��:�?^���Z���JTM�����;�7����Vr�������p�!��k�������&���L���e"Z��'�<Ny���*$A���Z$D�N�I���Ql����??�h~��F����5c��+�r����{��3��GE���w"L���<��7H�N�Q>�m�K�%R)�^�>�d�#jr���QrnS=t�3�1�_3Z�w7���^���U^I�k��Pz�+��$��{n!!I$`V�-cRZ���)Q�����c��2���}w/�.O���DE����b:<�V���ze�|:h��6���l+������8gZX��n4Mb�����f�5i^<?�8������g�e]3D��1>GKy+6���Fi��<�������d%���b���St�^�h�$������E�j��o1F�������NJ��Sn�<<0�0F�LU�.�����]0����z��T!�r��UR���iZp�k�E������r�^��������q�yfr��Z���?��0�����z��6�%�fK�r���v21���u	Z�McR�8V���l���#3g7���8L�d��^�L�G�D]�W8�F1�lyZ�nr���+���Oku\���	HS����-�Jp%(C�����~�N�bu��T�3\OK�i��
l�zf)��UE1�"a��������M��N����T�t���S����Y�)JV�������.m
n���5�wV�Z�q��<����������r�aU�V���r�1��^��Y��|2���X&�i�Z���R�JP�z��{�5L��c'�\���UD��j�'s=s��������C��]�k�j0���k������,!���|������zLHU���:��7Z�+��P�N��d5��S����Qa>^�;�d��r�����h�F"gq�/�D����r��p����H6dX�Q27I��N�
���V���u��&rq�����m�������J��8Lq���[6�u�o�[q	�(�V(G�L��b7n^�e�b�����\��t�����]��}5N2�G���/�B�b���bV�QE(C4��u������J�c�wG>'�oc������@����
q���s�?����`68&��^i���7�=��o� ���?�����hZV��
S�Q��Dc#�m;
���ZKF�z�af�=n����(�
�����v����S3c�����^�f������y�)G%dw�����V�r�\��jTk^�~�������Z#�8y��)�j���#�ZP��Zq�}�&"c	�8�@��n�44UW��������uU*N���9�����|�
�k�_�����JZR��)JS�)J{��@�2�""0�BFR6%���?g���p��M�/�TZ���Q�U�v�)�����w��u�������l�����`%R�j���'+V��H��~���������f#�b:W.[�1j�fz1��uwj�MZR�f��)Jv�L�t��"���==������11�?c��N8�{H���)��h�*��?�M+���8���M�^�1�1�#����&)���D=�������
q���s�?����`68&��^i���7�=��o� ���?����J{=�b����(�q@�+D$f#��jq�N� �����jTy�v�����'�*�9,�b���UW�L�=?�V��8_�~�q������~��~����x�ej|������������>��~����x�ej|������������>��~����x�ej|������������>��~����y���i���a)�����`���h�O��)�Qs��������|�d�W�+U�UZ8Ir��]{=$�_`X7^f�;k;{/W���c�f8Ic-~�r�9�&�Z8U�����sv�as���!��9�s���;�� ���:)��H^�����k)�r�6����g5�+�/r��x�g�G���Z���F�lF�������&xGJ^rI�n.k�|���&|orY��B�X�jq'MS����#�����[�)�ar���b��B��xOc�����M����u=���DL~�1�T�l�3,_�W�1�V���.V��yVK�(����\3S����V��F���N^�Q��Ww���)�z�]szD��m��j�v�c��L;f<�V�����8$�L������?M4��.�B�JH%J���cp��]��7>Ckek�����V�����c�|�fs�g�9���QU����0��g��[�^<�u����;[��<-�{6A�C���1�J~<8�-�E[�W�t}3��"*�����x�������l�O���)�D|9�N���>�<i�s���m�=qt�-��E~������/p�+ZW�=����WA�qe���5�������S�t��Q{���4��M1WZ:���M����F[�u�3d��.&����*d_$��3Q3������ZE[��:N���U9i�����+%�jT��{=�SDW]4��pENm����m���l
�r�^jZ�]�7<��i"W��t�!T=kZ��%;��gqU�y���.Y��G1�Qa�tw*�q��b����F����w9zr���z��=3>|?*c.�m��4��	q���,����d�b`N�QUp��Yz8�i�8����Y3��Tj�e������)�����J������Z�V�.\�f�8��xc���2��[Sezg�kWo���r�8�����]�57R�$�Z�����F�Y��._M�h�f-�k��5���'��������f�������_~��LU�?��<���E��!w���+�%��,��'d�(�� s�G
�5�v(&��N�c!��2�X��^��:�Wr�#��\�����W����n��4�����������c�o��'dt,Wd��^�4{[����uO�M�{���0�J�nL��UD���7*����aL�<"��3y}�z�f��S����~�z���GFO�	=g�R�����x����ob� ��
���1
���x�i�=�k�����r�^��:'1��~~�b���"{��F�fw>��enF^��q�5N�c����;��Q���ce����o�}m���YJ7-+��;c��R�,��_�������.X�N��f'������w�J��L��9�V�4���Xp����
q���s�?����`68&��^i���7�=��o� ���?���{�77�v�F5>����$�Jq��_yd]��-��	���;�G-hE���j����){5)JL|�������w�n�5������*�3����x��z!�[�������uS��9����g���8�mX���W8��������,F��������nb�����N�58~���#���j���^�\�i��rw�[k����)E��<*��i����S������X�w���)K���_�-��~�����5�\����1�~�}�?9C���������)�_���|���������?����>�����5�\����1�~�}�?9C�������.��Q������s����q�����w���>�����P�q5i����%�F��]�x����w��E�/T�t����xR�V�`^s�L���u
3�Muxs����l�����^���mD�1�Z���l��|{8�f�Y�?���Q���"SuDn�����=���V������n�������)�2��S���|i��>&K3DS]�5La��4@sm�tsSu���,�W�~6���yw�W*n�9�D#�)���8vFe�[�7��v�����3�f�s1�T�����o\�c���+��s��g3v�e����<xu3\���1>��i,������x�.�R��l�kBv��R��+��u�Y�U�����z��������";��d<��f��+�2�������MX{��=�����[	�q�N.Q��)�4����v*�@�f�+������Z�\��M�9�5UE��V��3���G�TiZM�l��������R��v�p���<}���%wl�W{~O����+��P�l���N-N�h^4�Zp�����E�L�����{����3O��?:�F�������Rxh{j���~����tt�z��6k��6�r5�+��H�N�u#���Yj��n��������i��'+t������'����z����3������c���6mD�F��9�m��u^>.�2���D��C���)�C�N�* })�g���X��x7��k��f)�J�d��s?{P��������X�.���
��]����e�hB]6�������lJ���Z�kJti������r�T�7m������N1�11�f=(�I�S�Y<���f'%��W��8L���	�u0�_�k�9�f�$���a��K���yI ��x���=]ZV��NM�����������������
�5vt�4�s/����M//�e��o1��3gr�E���F��B��EZ=�M�oP�9*MT�V������i�J���*���cfm��g���~�4cN=��Q�-���`kVmW��UE5G�f0����WwhE��lH���f�~{�
�.�E�d�V���t��N������w����f|M/O������LS�{��u��;um\����,��B��r�W�����4��2Rtj4�M���g��2c{I�3��i.��i�:�,zt�Z���j3�`�)�:�w;������������Gxt�=(�h�u
����o��E��k�3����-z����vsw����R�H�J�,��2N�jc��ZT���r')f� w�-���+����v�2�cfo\�z._�3c���:1��d
+����������	H�T�V���8�����)iBq���m,�b��NVj�
.��L�q�K��%��kd��QL^�����>u��2t��;�F)�V�m*������}��)���@����v����}�����
q���s�?����`68&��^i���7�=��o� ���?�����Rg~a���*t[�u���x��H��#�n7���T��N�Z�{$^�����;w�Z��V�zk�/�^z�bz��O]8����;����>���Q��=X��]���]q�)j�Qx�L�����"�)�_b�58V���^�j�V/�����bz&��i�*��cKO
�k~n���H�y���<��D����Us��k��Ee�Y���m�Z#��1gK����gn��c���M���
�V�����c�t����$S�Z��UE�N5�k�#��U[s!K��������)�MS����]{�����>=yx����i�#�����3���2U�qH�^�o\"N�������Z�[�i�L�v���{�+�Sj���v�B�:�x���D�9Z0�8�%l�N��anM"v�quL�6t���N����+J��������N�J�c��nbi������[t�>��'T��m_���G	�^X-k���5��1��f�'UI�$$V/��kUN�4�
��{<h���X���>���U�-�z;�gm77=�O�w3��U<&�zq�K�c|Y`�+qO[Q�����Q(����Nj��5N�5�����.Sw?rnM�=Q"�\�S%���D��������o�]a��bo�u���R��g�d��+��-
J�iZ^^����F����f�
k��W���5e��+���v������p���o��l��%?�E�$��D���)JR����P��Y��������=8�,��-LQb;�OF]mn���\.���<�3�q3&c���!����U�N��Yl�W+b2����N1G����+39�������#z���F9����IZ�
�n��u��`��A�U%H�^R��7V��v�s��k+NGR���E=�i������%����'5��(�3��3,{ki��Y��W��`#�.,y�Rj���+Z�eIB��k���8��sI�z�.FO�����u}N�����b���Wf���w����pLnZ����7D����u=(R�c�G�^�o��&m������u���r���}$�����0�8��Iz�Z�mn�!V��M�1:'[Jq�Zv*9�������e'�g1=��G�q��K���n��~;�Y�(���;!����n����=����%I+2�E+����E�������^�����v.����i���f�:#�vQ�?����
q���s�?����`68&��^i���7�=��o� ���?����v*���;,e�%�E�>��K�#*J(��#Nh��N����U�_�Sp���l��7��h�������UQ��E8��i�u:4m5���"�����Ov=5a
T�o�$qn��GW+'ze�&sU�����-7�_�q������{B��%?d�������_}f���M��w+k����O�����-t��n�������w�1�������{�
�=~Nb��9����MZ��R����v��U^�=�i�fg�!�15U�L����b�����A�d�xs�9q��s�6==���MS��]����^��D����U�����:j���f,�uI�k��"��3�<�X�>�m`<�����2���t�_*�}�=.�F��;73����\���=����VR�7�������Yuuc���lEo/ud[�6��o^
��8M�r��:��?����K/~����.|z��
��K3�����]��#
����|�:��d�{bna�(f���6��P���.�����8�WL��h���_s�Xt��h����ww�����1��m5+CR��f��+J�����iQD����c���t��
:t��D�:��Z�-=���W.���~��g����j�p�1z�s�M�n)�w�zU'^�B��J��x�T]�z��]�i��c�:k��{��.J��J��Q�UT�L�W�2��������=����Z�L�:��p����������L�j�}z�B<K�
��4��L��+�)z��b{�������# ��:��-\}y��Y�<Zf����D�cv)���=9���iqW���(����;�u�5�����=�����W���L��2�J��:�*.���*������L��F�&�8f)�����-�7r�j��m��8��(�V�����h�J-NH�N����N�4�>B����^J<L����#�T�u�u=o�N[+Nv��mW8ES�3�����L��j��!���������f����LpsF1�.6fj.��w/0��Q��NB"�)��ucv)JPR�s�l�s�5�%QM8���C������Z����#����G"D����c?���\�����������g%��M1��h����;T�^�r���q�g	�;��z�:
��l[2R&��#!�'U�1,�8"K=T��P���k^=������_�-����1�#����FZ��q��:j��;���9JrV�)�����ZW��;�M3���x[�E�"�������c�p����
q���s�?����`68&��^i���7�=��o� ���?�������^vf��%�I����}�&�J�5	��G�\���/tB��i^���iC�c���y������)r�?��D�j=>����6�y��Gk��_S��n�Q1]��p�t�*&-�$\l,[r4���g�*P��b��Z4n�i��H�
ZR�b�!�z�b�w�Oz��������g�2��[���l��)�"";"#�q�'pW��-h��^i��$�Z���R����4��qk7z�uOT�����'
��>����R�������>T{��h�����h�������h�Q��h�����h�������h�Q��h�����h�������h�Q��h����
���O��N�����8��4{�}���r��!�!�\��n�5^�Q��P��U^=��V��2�������#��1�z1��}t���4�>�O�Q

��x?��G�{Vrelowv�����eB�����55IN�� �+U�����m�x�5�u����-����no�������G��'�6�S�]1=�9��+sZ��:��r{z��]�*)�R��25%W���4���)��������'n��I����bV�U������{���E���j�O���)���������{��m����U�V�jT���B����Q�h���dn��
)������q����M+D�cK�^����x]��H�y���v�E�e�����e|�n���
WJ��1�Z��)�_f�1���j;�K�zE���EUUrz(��5#��g����n
r��~��e�GM�g��%s��l
������y�G��cU�E�����+��q�(9j7���4�S�������U]�����w�����k�G���US���LU8c�Kk0~�x����C��$����K�2O)D��)C����]���u��;���������Smb��39��h��n��z��q18��c��	���PV����A�][�*��S�QR��:����8W���r�?����?Cc��	�Q��g4����dc�;���E���F�j~'�����������H�H)u^<�*�"����j�:g1+CS�	�����qgt���������1��3=��qY�
���'.5Cr�z�r�uN8��.0����[��-�vE�������u#,�c������Y�@��g��{����7V������W0�����G��l��kW���[��3LLDO�E8�>�3����<h~K����k�p����0m�S*H���+��Zv;#�����3C�����}B���U����}�����KskY�3Y��s%Mq>Z��������+`-}i�/��������#���Ezo�E
D����g�xPL\��4���'/�S|�o/E6,�x��F;e�m��1�f����'f����>3���n�'�9���u�����o�����Nhc������k��G��o#�_�����~�{��T�f4�w�\��S)D}�k��mEt��y���Gv[��
sFQ��$2u�/��-b���52��E
T�^�x��Js���{M������|l�����t�^=+���r5�-V��x5Wn#��a0�#�:wfo{��L~|e�,����P��	^�
�kQ���������U�.N(���X�o=��{�t�N����������mwm\��)l�B������hz$���BT�=+��8���m�F�w�6vQ���M~$�F�,����\��������U��1�>���^��m�Cq�]nZ������E��C�;�����z���l�{f�$Q�v6�W)����m��>^������.�f�Q�{����Qa�=n����X���O�W�,=�bYj�W�i��FC�hb���>�E�B�gS�4-b�{�3w����b�1\���+C�Z�[�n*�Z��&1�|�w�y�b���i�u��p���w�h��2(Z�MZW�}����fw��kV����}�^�O�p�Xt)�d�<�'���]�ow�S��?y�_`%�t���q��z�Ax5������6��N��T�Zt�U����u}���������7�WL���#��Y�|���s��35w2�����u��F�u�7sF�4�V^�L$�*^���5�$�L�I�"�E�W�g�����d7��R�/E��J�]�S��yn;����L��fs}t��������5�]:+�V��9IC�)��1L^��9�ET��D��������H6�3�%<b�U�zh�;�F|�K��vf��]JA\R�!�����u����j��?c�����k��^���[Qr��j��Wz!���*�OR��WWr�3]_'�!�Z\�s������8����&��n#���Bn�$V�1�p��Z���w����W�]�QQWT��1n������WoQ���j�����:e��O�2��"��a>[^�%-�U������2�2�����n�������n����&f�G��~��@�����tn+�d�Da=w>*6�m�VI��Zu���CCGI4�h��p�'�b�-=M��i�����h:V��k���x�J&����*��xg3z����ZvC-����R��=���$������s�5�x�&��vy�F��sZ��F����C��`��EG�����\�n���?J����r���liZ%��g���nQ�TGC+?���\}fe+j�<����b��^��Z�C�^�U^�+��Q]���h;��3r^�6���e�3�+�1��l��O;���=��������|?���x���F����]�E/�%���D�Q�c�p�P�	^�*J�����������Q�nks���������z���zx-�����e�i�Fc5��/[��=�1���-���/K��N?���Y��38D��p��oa���&l�Y�eD���yr������?���ONyZ��������
q���s�?����`68&��^i���7�=��o� ���?���P%����u����g�^gkG��:��r�I��!��U��QRP��D2<;��33�7��9�^�M��~���O�	�#�D�H��}��+��mh�x�;<k�g�����-�J@��]�r���~��W�h�*S���L��O���1�_���f�C!��TS8-9��w�EtN
�#��z:�+0��wO���g�R}��~W��G*|�s�R��;��l����u_������=\������N��>����W�7�=r��W?�'�������>��U���^5�7)���K��+_b�v��k�N�������:}��_�����x������V]�����Sq�����j%g�{Kbj9���]���c�_4\�y|��xEQ�����"c)lN�YY"�~���{ �
E�C�'n�*
7QJp�g�{f��U�{/i�m>�Y���UQ�������sU��s^�v�b�^�b���NfQ���������|W�q���7�������
w�8����7�G���Td���ewo�v��f0�j�[��}�]�c�\x����6����U��}�-��-�'��-�O�����S_�uw2����_�/s:V*B���T]��d;�xp�*�z~��z�k��S��zk�'��w�Y14����2��'������
*��g��z��7�����D�3*m�x��L�2%U}�kSS��03��.4����m�����M4q����L���%�hZ�����i������D��_{��G0��}�62h
����}5�p��H[�\3^���S��[t���+Jv8
��U|���:6��������i�6��
��ta�[�e���<��uMr|-+E����W
*�"p�����Rr9����	6h�v��c#�GR=�I6�E�R�j�H�m(n�>����������_����tS���}z�����Q&�^��9�����3o/5�n�3�4��y0�%�w��?Xc��JJU�������MS�d��)��K�N���@�>�sY�v�j�s��E�����:i��:^��f;�r��D���t�G�f�F4����s������%��j�t��0�FaG%E$�-H~�J	Gvk�����skZ��~���n��UDp�=<Q���Q�����.M��w{�m�8FWD�B����r>F���m&@���g!g���1n�oJ��$�����)N���y,�����jj����~�|p���y�^��[�t|���m[���p��s��[dT��k�����K�g�u�S�AR:�H��2g-����-�Ee�j�����&����j��t��S1�a�G�����<b�f��+��cq��~-��fR�|��	���#"�7$�������a&�j���ZP�5)�ni�����i�C�r�~-U��z~�#�e�r��y��f�W�{^���5G�ntL�� :M�����K]��Qx[��;����](��J�T_�RR����Z��tj^h���kB��n���;�&*��&��F	�h��Zh�h������34��r��q������%}8�!o���GB�Y���j�CT���8R��O�1�HZ���[�I��[��c�3�\w��a����g7������1o�L�z�����W�~l��iH2���p�I��P�^S�^xp��9}1c`fl^��S\�Q�����S�����'�4UO�|������L��w�6TZ���3U$a�j�����N�H�B��4�)�������w~�fnfi�-Ov8�j��;;��KK��j��r��-4�StL�yU���>��.]�v"s�2��������\��F�M*�J���+BS����W)v�GD��O{x�My����x��]�:0�N8�.^������k��xzn�Et�h���6�������Ssqv.�w,w����eQ��3��$`Vh�}D�*u9�1z|8vE�si�v���'T]���/]�b��b����`�O=�k����:�3E7��,�=t�1Ck���9sk-�g��>�������QG�&��b��4�MJ����������_s}�����������b1_������]��l�o�q��&g����Li��G\�����Bk����j�*I*c���R�"������m���UE��j�~��c3>����ue6Sf���b����ta�6����z����������eI6��t��%NU�!k��g�Z�gbU�����|:+��z"�}$j�n9/{-D�zf�)���BV�����V�c��Ml}$��)����6�*E){5�k�g5��3������g�L����T���mQg�3�����orx �����o+vF��%������j�m�J�^*�����;���:66g)1v��,�������X��z�OpEs������w���9�����b[q�S�7o ��m���H��T��%/p��^#���W���g2�Ev��fnS�#����:#+�f���[���u�L��6w�������E�d��5�	��t����n�*�z��Zp��'�jYm���n�Vf���bmQr�3MSt������)��<����O3U���z�������.���u�8�]
L���%q��p�b�j����t)���kJv~����G?����nb�_��s�7":&{fc������?ma��n�M1o��D�1L�v'��N3Z.L��s���.���]�Fn��Z��K���~�����������������h�tw����i�6��uK���D[������U�1n��K2��3���ck�m���l���'+���;�(�kR�����h1~a��o���[`Z����1M��<#�G"YN��������/S�^�f��m���z8�������'�M��X�}��U�C}Ih{��ET*Ux�Y������M���D����^em���x�=��G�T������oF0��M1�u���O�N�T�V�������y
C����b�������2������i��1Wk�@����
q���s�?����`68&��^i���7�=��o� ���?����]w$]�k��|���
j���r��?����RI���V��T�5i���'������e�����c���)��/�b�S-s7zp��5WT�)������S���	��B�H��v�1�Yy���1��K�
i�B�N�D�]B'^�(���)^���|���-��s�6Z�Z#������g���qG\��v��p�c�uL������G�0��<�O�L+JV��{4��J������QFF0c18��%��:g������������U2������UTZ�>�tS���}j��q����[r�$�}�IN�|K���J�4�����,�v��yR��b�>|:K��&��z����<��=Y�>��*C\������,dO�)�����6i��E1��a��/I�vmx3T�>.3������v�uC[��MV�h�X��L�V��
�DP!KZW�h=�UVb�Z�O~������<6�����wj�����F��n�f
�b�d������h�U�_f��RP���4^��E��>{�w��G���E���^���1�g��K�a�F0i���J��dZ�J���B�/�A�r��������������E"1�����i���J������N���U�jqT�����GD���.��uK�I[�DPI$RL�"i$B���P�!xR�����5L�s��k���������%U���n�vn��;��p����US���-G��V��gLS����r���T�ye�GBCD v�Q1�������&�?vzi R����{]�]�{��k��&q�����m�z�E3�%���-.�|����<sS����p�MOuU�M:�~������V^��n��c�3���.���]���^�>
Uq��L���\}a��e	fZ����u~X�<����(�O�������������szg38�=y�w�����A�^%�'E/@��h�P�d�qK���G4�UM�'
j����<u��4�15F3O7c��LZ.�~�k�-�:�6���g��B���-G��Or��k�H���wz1�����n�������D��t�H�$zW���~4���w-Z����Q�����Eu���1>I��%o@��H�abR`�,�8��h�k��TnRP�������D������q���q��:[����^����|�t�D��M�#��$m;4�+�eJ��
�^���;����b���WOES�c�3�SED�DDD��F��G�/���\{���C�h�f}�v���8~��z�s�����������]V?������8�6E�Bw���Xuf���!�������'N��z/^�GT���?3��v���]13=s��s�d�:�b��z��Yd�R��/��T�ES]<&zf:e�33G�3��u{�if�8D��E%�9zIRD�J��Jd�J�����u��+�q�<x����8y��!!�ff	�����Z��5�CV��j���� �s��]�Z�>��4�C��q��=>_;��<J���dz��:,�������t[��
}��uUr������3��}~����C��e��Qq�c�t{Evm�g��b��c����K�Q{"�:1����W]���3F=8p��ql{.1��Zv�i��nY�F�\����I��������(��LGG	yUj�q�t���1x��u�^MY����g�d`��/���c���[�T��LQ3�1L��j�\�D[�T�M=3�G��;:��2f��`�
����C*���*��:5������u�v�SUL��L�d�L���]�W)�.SDN1�Ol9P������Ts�m�gNY7]��%eKS�J�;?���������W��K�Q�W�#�'�C��;�z��2bJ(��v���(w���H��z?(���������������h�I
��;QVH�r���2tX���FJ���R�J��kN�
�����-+�n-+����q����f�&�f����Wj�*�SS���������d${�i�Q����9G����7'��v����d��9�JS������#[���1S�������i+��R������D��9LStM^�i^�r�5�n?��(��8���D���w�n"�������8���:=wQ�g'O��'K���J�}��E������=0�*��(�ADS5z%:�h��ZV��V�=Y�����F4���n�u4�kC�����q,��D�^1S2��(B������5����yZ\HZ�V�7k�(�����bw��L����V�NN�n�R�8�����bl������#3��6����3���9���n����������m�w]���&���n�u~K	c!T}�81I�u5)�jr��D���6�oz���q��L�s7rg�"�34���4�IG���\�m[�������Qs7*��?���b\{��~=�0i��U�f���N��%$RLtb����C,�~��Z��QkZ��gW������7k�>N�S8y�'�C4����7/���6-�DV��}8c>VB�x�\���x4#�5&���%�����W������4�}�������
z����uKf�4���������\�����fv.9���.R6A���H��)Sl��^�RP��*8�����n�jn��[�������\Yj���n<o�di�q)��-��I�Wp�5���z��sU�UR�4�J�"������s�k����.�o�w�$�����7)s���X�R��\@�y�����[�F��&�K�dr�eR:����7Tp&\���|������m�>��5�.�D��������|��6�����kq�*�"P���q�J:���J��d���i��d�?5����<������s���o���0�"�D�h�������etf#b\�u��5+���DC������3�_]5�[����q�e����jH��1����:����f���3xd��RB)�X�8(�jd��k��Z�������x��0�\�n.\����nfW ��x�A3�g�nl��-{2F��������l����[N�jG������E*k(%�����Zl{�c9{Xx.����"�>P�W��KJ��l�/.�
8�VE���s�5z��1�C��M@���E�����e�g\�qkm��[��sCQ
�������s����)��~h���U����8��*NUqR�e*�VYp���6j��T\����}��9g�p�z���[�,���f�p���w������
-+ �TL�����N��J���l�B��~��6A�3��2~&���4��y8�gng���L\�%���9b�f;^)���E#^)���V�,\�7���X:�������-�`HZ�.M�f��Md,Qv�����]�D��y��(�KJ��k�#Z��{�����l���x ���?�x��"�D�u���4
c�i��--]��=���K��{�}B��#w�5*E
S���)�%������F��m��V�g�����%k�n�k�1����(�Z�\�F��GZm��w?�W�n'��})m�R�����J�q����"������mq���;���Z�x����Q4SH��L�))J���B������W-,��o{b����`��;+Y0VVj�����Y��:���P�X�.�D��ns�D�O�T�j��C�!���OVs|���]�#o[���mm��m��,����YB��Uw.���'W��3�|��@��2�5*���K%�Zr���.�n��\�p%�[e��$���8MG��\�I C�B4�H�Up��(J!W!N�Z�����������=���~��L��n)�-YC�7X[7��v1��Y>��J�bY���MEJ�g\��`x6��=����nXvC�J}_:��;���r�������(�����:
��;+9R�\�P�kU	SQJU0�0
��''e���t�kYFmF���a9f�����
M8kW��OZ��^�c��.��������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp�x�������w�����\^jqWp���
�z�MdQ�2K������b���l�'�@����MeH�n���MN)^;�eq�\7��L��1��&�t��\v��t>I��4p�<�d�]B��gP���%(j�?�dywa�ibs�����>��l�l��cs-���V��n}�rA1�����+�n��u2���9"�DQfV���z�wdu���?U�i(x����hpF�[����.�k��<�w�����V
���6~t���EZR�$U��IY�
��
���A������?p3R���F3���=���*��.;a�m\w�B�}H����Q]$�)(�T�.`X.O�����+`�����;��;g�$+{�8���0Y.�)��\h+n�6�z�����u�@tWs_��j������f�:������/�����m�nF����[���"�.�"^=I�ZV��J��+B�$�f�hk�e)������qFA3D �����^�[������������(j<AZ�S7V��@��5H8e
;�(c�G�&v�)��32�*i�P���B����Jp����?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?�x��?e�?9�����3��^���?���Y)�)p���L�:�=���%:F9�i��)��k�b&g�2�f"1�^r��6�v���j%��{r&j����E�S�Q�jcLc^�0,��|�/�E�B��*RU��4�A2�V#C�4-�np�V/^����^�{f#�8T��y�����m|~���V����V0���������?e�?9����R��&��=�������"l���{��l�~�&��=�������"l���{��l�~�&��=�������"l���{��l�~�&��=�������"l���{��l�~�&��=�������"l���{��l�~�ZX�
�t��L���G�&�b]9��[&D��
f�.�'� z���"B���V��`z�.���f���� �S�d3vn�������= 1��O��>����'�Z����
^���X�')a���9��cM��g0�<�{�Z��p��u�?h��W-\��+�����!M@����>�d�[1������v�9��y�-fL��:n�'md1�g����x���(�A�Z;D��d�!���g�|��M�n������X��f�+������L�Y�NF9�GH����7I"���k$�����uST�=R5������)�u�
���-�����"d����GY7�-��,�L������gt�i�Ja�=�]�� ���b���h�-.�e���f_x��d�M�+"X�#g!�T������e\�*k�T��SO4S4.��-�[�q�������=t�y"��:�e!~�������[U���I���kE�+d�!�Z�����w<��O��fc�E���]������l�������e	�e�3������t-���L]rD���F-��Ae�Ub��iQN�
Z����n�b�8gV������&�5�fF�����l�%��y��^F^ITQE%��]�t�!N��B���3����e�l��u��9:�c�������Br&!�Lc�r�..��es&�����n��lR�2�@�L�"X�XX~��1n-�-�X�e�e�v�ch{v��a��lLLkB�4�I2���)���cV��kP�����RI�I��S`L�_������P.���lFj�����,u�(D�UJ�
P:�������	{)JB��-
R��)KJP�-)��-)�R�b�1>{���O�M����d{��O�d@�
/�����u��f+;�������5OC��/�jD��t�gUX�/f�
����z;�|i����nE��Kv~��|�����7��:6���(�.M��G��z������;������Vp~(�fNF�����*�KG
\�iVz�3���s�������Z�}�P��vw&��5��V������vGv��<����F���Z_�[�O{��W�^=����[<1&H�*����),_�US"�����@x;��"���������
q���s�?����`68&��^i���7�=��o� ���?���[��sN�������F��7�	�Y���HX���Jd�:��L�������Z	�����;����+��11a�����T[�'�����Jx�]��^��vb{��&��`��� ����
q���s�?����`68&��^i���7�=��o� ���?�����Bgn`[��j��-�U�{V���N�b�n����?`�����:�"�=�����������c�������}V�O���=J-�����7����d�u���]���gT��C	H����)8���N�D�9I��'�*u���q�/%y��������
q���s�?����`68&��^i���7�=��o� ���?����v;,��X.�������r\m��zdRQ�q�
���4U��K�
�����mm���y-�c9��Q?����>�q�B��5J4]5��8x��?�����!����L�,�,Xk������Jf[�W����oMp�uV7�?E���?f�8��z��c}�#+�����ma�X��G�����yo���6�[���3�b�=u^����� �5g@����
q���s�?����`68&��^i���7�=��o� ���?���|���_6���\+��3�����%J��MT����+��rr���/�����)��L|��F���7�b1����WN1���M������1�e���m?kY�+��4QW��s���?�)����#�D��M�t[&��"Z�� V�[�Jv(R&R����J������z����f������f|�������m[�)�"";"#�q��7p����
q���s�?����`68&��^i���7�=��o� ���?�����k�<��k��m��[�c����U�2�S1���T��D���E�UK���\;8��7����_+�o�������|�O�k��<��-�=����M�/������LS3��!d����{���eHE�?��������j���IO�w�`~tY������
�s4������C�����G�����Wt<����.�$�7��|�!G�)���L��:��@��51�u���p���7��6��_0MU�Kla+/(�$V��-��!�E��h���^��\m&��H����C6tr��\Z��`�6��W4K�j�;m4�e��SWv�W'��`HK3����rN��?�6��N�c����������Y�s�rj*t����w<��O��fc�bl������#3��6����3���9�z�����R�������3sL/N�1p1�J?V���*I��%����Z�������1�UuE1�f����V�n��E�j���m15O��k����dp��WJF�]��z���\(�X���S
��MhcR�*DAUH����S�{2�9�Vmn<�������kYX���1U����D�^���{�4;��f>�S�r���&����DD�G�)"!I@����
��Vd���sz��r��� nu���#U�o�F0��2������z������D��Q6�FUR,�����#J����kH0����
�J>g�r�A��Y�h�< ��.���4�ZvLc��������{n'���s6����LK���"u�5�KBE����7OlA�8�~>e��R+Q�l1���z�u^�H��-$\v������<w���
�������l���x ���?�x��"�F�5��Z���<gj,r�[z���n��E�����,����V�p�M�{�R����7�Y��*5l�w��]������q�����3��lmz����6�r�Z���J�l?�����8�X8�	4�����z�c��D��PQiG��H_��2uT��jcV���Gz��{X�s:�bq�3r����T���#��L���4�u��b�4G�b#N�����������=�SI��YP������%��Qy�l	�Zk��$�;~���:kS��{�6��uW!;3(Z~b=I�_mgQw1�[�-o$�������p����j���U�N�hb�fZ�x��Z�^�h&�����`�K�����ZMY����H���r�N���/{�qE����R�!EV�[#B�h�v�"E
��;q��yG��;�����������������o+���5j��Y���������('�z���B�������/J��~��}�����F��������e���k�)�d�Jb���f|K���h�&.�����z��5}Ww{Ah�/F����������uM1Us�M���TLM�0��w1v0�M��f�16{���O�M����d{��O�d@���J?sH�@�����Lupl����&���r���<L���C�W)vx��5iN�j&�#m��T���ok�����V�{�vc�S=�"�b~��V����kL�Vj���~��{Fc�-�J@�xZ$����I��Z$������cV����b��c���_�������
�m>C������������.��~�[8A�L�`S�����4Y	_�.���H��(��$X7�d����p��7L;_�����/��d%�-@H?-�^<�u+9�yoy�d
���X�v����^9}h�[����;���up��4a'T(��1_��e(J��7 5�n?��(��8���n���,;J���W�G[�}�1s��X�M&qQ�I��9��J$�^�h+t��kU�,i�*f����Z������)�=30������f5\�QE������xDQn����xp��,rX�f�dV�o���dn���w�_��b/���5�B2A3��2U��B�N������6K�K?��o�������������EY���5�=���j��&�}��g;3��������g]�W��q���U^�ar��p�&�4q�NX���16{���O�M����d{��O�d@���&�j,���I�*����d/H�9���)JV��G1T�4��q3��M��F�j��-�|J��o��Vv?z����������#:��H����B}���L����]?C���������#1���l�tOeH��q:�sV��8��16�O�>�8y&,%�C	D����
\�9�]�yTs�������m���<coo���v��m�F8��q#��\NH������-�6EX���h�0Nh����e]\/�'�jBUNH����J^�Ik��!MZ{��CZ���J�)Z��}��H�,�s��1L�wa;��f��;+_�e$rFs������B^P�,���B��.I6w�����E���+JT�	��1�B��5
R��1�ZP�-)��5k�R�f�*a���m�p�[�/5_ )c��_}h|��-g.7(���WVk�m{���]b�������T�#�� ��J�uRL�L$�������Z���G�lV�����'c�-k^���L��l���Wx����h���y���d��u���Uh�z��l��������]tk6fr5�~q�O��\��l�����8at�L��n���>*2ZF9�%�^(���x��J42���3v���3��W�{!wif��&:�����,+��y�>���xi���39X��;}�'4�����&t!�9j���Okv~�����_��/5��k�ll����v��������Tc�7yY6��fYkbY�HYI-Iu��N�*n����w<��O��fc�C�;�;n���X]l��9���k"�G� _�A{�tQ/d��3��X���^���M��i��\�����h����������1]4�bg�bb���������3��6���Y������Lt��j�����v'�����������CE�~Z��.��X\5��l�J��Gp����7Yj�e�E�fQ�AJ��YJ��n���~`s���j�uy������U�ESLUW���c
h���&"xF=���r_��u�\���m�i��VB�����&��1EuUM�i��~�[�vi���i��r�5H�������wd��Z��$����g/VXN�m����7B�wu��<�(����Q[���T�A�������CH�;�fkS���������9�q-���On����Z��I"�:�g��.�nC#EM��T9���X���j�d�^���NL��W&c��#�q$��<_�������#pL���"���6v����K"��F��^z�9��a���������a(�<z���>�f�����"�xx^���4!���R�U��H���;�O�&������9����!�,���_;�����d�\��V�2�����{�w6�G]sI��;����T1��p�,��d��/X�(�X�V��2E�,�v���Z������dPr����f�H�J���R���+P������l���x ���?�x��"�iO1�����yG.D�Y+Y[�L�9uu�����E���jUIWG\��O���,t*w���7cT\���-����'�>v�uy�v�s7n~��<;~Z�����������
%�����5Q'���	K��!J�K�Y�\�uR��N�p��5{5�)���-��]����
ki�z��3�����LpWm-"4-������V��v����x�{�-��"q�s0��yiq�����m�S{T2��������&������
��S�;��<b��nolg��������le�=o�Y�����2��P�Y:�z�B����C�q����	&m���L's�7O�:�k�������`l�0�����d���b�O ��f�3
!��E��g1���+��5��D���!N�d��c������V��,�p����d�v������a�,r����5���4\��M���c&hkY���4�-$���\0N�!�~a���������)>n���t�p,�{#e=%�rd�Ks���c�'k�������<���,���:x��+S��%�"�w}z�6�j���Q���-����6p��ed�>H�	?=`^�����&��E��~b[�X��z���������W/5OW��(e2
�G��Q4��U���������:U�j�):G�R��R�As(j��An���|�qm�2��Oe��.>A����o��t�^"�ts9�4#U�4�Z �Q�hp%*R�f���=j��s�)�x,A����d�S$f������]V��(f�1���Y� �'%)��c���*�,�F��.E�e�3�V[U��3��lYy��:S-�{�6���5�8Qb���{������`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|����L��>J�H�&[�%wMs�#6��;����g�����c�o)�Y�����m����5�J�uYd�E+�;4�8�Us�s��E�y����vU;XO�����z>�-Q�?����W�i�?/�a��9��c����5t~�N�*����|�����Y�b��zcf�<���x����G#=#���FE�sC���j���R�:+J:jn4��>|��O�\��>�_L���{&��Ly���Oc��4�y�g��Yo����{�mF"p�NR���w"&f;�:b'��z0��`H�&[�%w�;�H�&[�%w�d�-������2������]����`���������e�~a�WpzF@y2�?0�+�=# <�l�|��2E����H:cn_v�c�$�D��&����2��J+��A��)NQ*T��b�����.�/���9�~6��<K�,(�������n\_�Z��t�;u����v��|<!�.�J�R�"T"�8Q�f)�Ut�i�\�����Z������^h{�/^�)������������M$��\�����i���C��.�?C��yD]��R���O�6���Mhg,��6n���C����;X����>f��z��1OU8�J3a�W���=����	
��g��dH�Tj��\�qcS���T�dfhO8h�V��H�kZ,���y�\���������h��������4�e�n�iK^�E\��1��z�&�)�s(rQ*J���������,�_V=���]�li��E\1��_B�!�"{j
�jvH�#W�U%8��N�-jZR�3����
�RF��-h�>A�����/+Z���b�XBH���G��E^7��+R��:!5��
D��#2t���f>b��s���1�[$��kOf�5x{u�@r���/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%������o�|�^����/&���%��.7fW+�-���K����=���]PYzRb��R��ny'v�E�U�&Z���Nz����k3r�'@���z�
��,����a��z��{��f(�z�k;�E�����9�����=�{bj�<�%�[�����?!�2�N�l�|C��������y7�>y/�p�l�|C��������y7�>y/�p�l�|C��������y7�>y/�p�l�|C��������y7�>y/�p�l�|C��������y7�>y/�p�l�|C��������y7�>y/�p�l�|C��������y7�>y/�p����:xK���`���{Z����sU8*�����9Q%�)����{%)���p3���s7#[�%��d�C��u�)�������(q����:}�����@��W����NC�m��y��YG���	�L���o>EX�����XGi5C���b���S�r�Cq9�Z����/���?*��YS��n���=���G1\��Sq��hd[��bY�+�(���������b�U��dT��cT+���1)^���B]@h^����T����;��v��l�y>E������BB���.�F�����|{]��C�k���1�0^]�k��\C�.=T��R�.9���b�����F��=����F���6kp[SM��]33�H��"�U�C�jO-,��v�S{7kj�n���M����_
�1�$������,�$N��*bVu��](N�t��r8}����.��6��V�-�{=wXq��=�cDg,-�6%�����g+'�\�U�rD�m�Ut���5O�Yj�3O/�]�:R�r��\�vkn6�����cf��Z��e/�Kj���jY�Tio������$�����)���P"!$5�n?��(��8���[c3,�`���.%H�ib�I�?
���MX���Z��wN��d�J���JS�Q��������!�rq��o���e5U������S��5�w_h�l���|���D|j�0��=u�4��U��+�GAy9l�_���f]�m���?oH�Y:@�� `J���I5\�j���V�������s�l]���k��+J��Soe��e��������i����X�B���\��s+u��v�D���3�j9���~�bf�s3���t\��fq����5$O�������Q5��Ym�(�|RY���RJQ�iW�������J���M3������r�E�k���az��\���s	��,S���������s7���g!\U�i3nN)��,�&�+��a��7�F�T�D%`f�\G����
$�y��d&��31���l���*v{6,3��k����YY�=I�g3Ed������
W�2YrE�l_��&���4k����2��
����6bk&I;���6���D���:;�H�p���h��h��Lg'	Y������ �.8��j���e���������D�C�m'�u��u��IM�*�MZ�����=M�"�J[I��,c�{��������=�7���.�����(M��#e3�2�/n(����k&f��\K�";]v��U("n��F�5j�-��E&��7H��n�Q4PA�B��-(R���)JR���=�Ay��������2
�����'��2 `Hj~=w�v6mz�����j�4qJ�vuN�!do���=?�=^&���U��i���=��i����Ez������l�]�������v�}��5��Wyy�'fzc��rc�{�c�Kx����������Om$y�k��[{������2�VL����B�f���:�e{���[�������J��B���T�n�/�rY�grfP�>o��x�������~Cw�D��G�o+�9���I�u�7�}U;�
V��=a������l�����I���vo�o�������qT��ob����
��/�;�Z�^��c-���&���{)�����w<��O��fc�A�9��[.�������%��y~
��F�9���VT�n��zD��Q�j��p��=ZW�6���%��(�y�����)]6q��5z�����b�Rc��-]���3:����Uxf5��]�����������c�F^�;]���E�&����Ec�����h�����V���8�,��u�$b�H��l�QJT�<�:��tF�s=����%��x�r�y����5U����7)}��P�����o�^�DX�NZ�D�8�uE�]�1�Sw��c	�r�����M4S"I�$�
�i�R�4�!z$!^�)JR��)���DDa�UUUuMu�3<fg���\�`�������l���x ���?�x��"�a��l0>���Ad�K�7���S�JL ����S�|v�����*2
����[�%���g3z�'�38�>�"��,��U�D��z�����]Q�(�V=5a
o���d1N�bt��Y;�#�����jS�^$���C�V�����h�J�����kY�������<��Z�E��p��U>�?��.�/h�b�}.b&��zf�����Y�=
��9Dn��V�n����=�����t����t��(�)�;~�zZ��9��q�Q>�>�UR���"����i��V�z���2�Z���S��L�LSL���z|��.[��v��>��-j�����������Mt�r�?�o�5D��V�'��j��R�3V��:��zDYLS��NEDV���~�N��M5�?d;�����.��>�����
�����������a/��e��
q���s�?����`68���^��2������|=����N9�Y+��������(D�#(�rV��Y2�m?2�Q�^Ch[
g��j�V�����qU�k�}D����s�y�5��5����o��f�+N��b���6�����Q��]W�\4��f]���{�s���$qV��u�����2��U�TEc!r����~���������o\�N9��n�=V������|�����?=�����~�z%t�{'FwQ�a��C3a5a�j��b�N3�9�{!ba,>|�16{���O�M����d{��O�d@������C���E�rt�v<Z��n�Etq���;��v�4�zH��j���J������
(�3�����e.UF1�o���j1������.���t��fp�R��MXt��s��7BTc��D����l�8��mc�4D�Z�d�[5l�~�HB����A]�r���]��U��3=338���R]�tZ�M�q�4�DGdDa���:;�:vC���_b^9�~�e�c[S7T��ND��\�;�j�iJ��N�L�x���i���g1k)��5~p��3T��#\�]#=�5|���Q73��Z�Lu�r��::��fz�F�*�������YA��d���]_�:)�b��0J�����[���j��
J��*��k^�*1M���z��7^�W5�?�n8[���6	��V�i������_{O��"�Ss�"+�]�8L��)����F2���5���Jo����)_��?=Z{'�%����
�z����~�<�pC����f�a��$wzY�iv�
rD��g8��gj��JF<�j���-hU�!�J��{�I�o�=�+���@���������n� 	��������n��nn6��#��ObEl��uENZQ�g�(��DsF($r��x4EJ��r��8���N�
q���s�?����`68�s���SN3�cI�[�V��"�9�����Z[��S�V����tn�f�H��)Q%r�gU����m���Y��\�����]��4�c�TGZ7����	�������~-�V'������	��*��<c��g������\�1F�Z��>�o��=���iEn	9���SW����T;x33�L�d�U�5�f�������V��z�:e]�o]�M�SOG�f{��1����"n�
���$r6u�;r�:<<������u��oM=��5��Y�:�&}jr��=+i��Aj���-{���j����v�R-%nN����mJ�R��{$��F75��/@���z6[J��f��g������3>�1������2�������f�]�����Ov���fp�f�tG�[".��������l���x ���?�x��"�D��s�6\�uW��e�~��p�&Z*��?'��S�X�v�Gr�/g�)N�"i�Dm�L�r�����Q��|��F�������2�:�4s��:F^-S��^�V>X�f1�%�B�L��n)��t��/+���l�������9������&nwn)N�_��QJ�?�
��1OZ'v]�?{-�2��f��\��l�8�>��=
��G-���k�z�16�3k'G��f���G��5w��Eq8��X��(�Z��d�l�
���"�Y��s$��)����A���E�t��SLDDvDF�\���������W7/_����=5W]SUUO�ffe���`������7�fW|s7.L��.0�hh~�X�E#
��su��Y�T�{-��$������*?:N�J�Cv��5�BV�k����Q�'��p3�� k�EM�;��|��T��V6�6����+�2���V�K���He[��/T�+CU�j��jQ�<���.X�nl�����������n�����*���q��>tW�{�
��K��Exg�0�j��)���mSz�'����bgd&�s���H������^*��_��3���*���:P��h���B~�����R������|���{�}�gp���O����������������<k����8E1]:]���uY���j1��J��\|�bl������#3��6����3���9�n��b�kB��gV�x[B�����5iJ#���8��I#TUdrw����^1�~�-��WTS�T�����R�r��E�*��515O��or��������7:&���Yb���5^�r3
�����
V���B��
�
v8	O���4nk;k)?A���ei����LUrp��������_��V�w]�G��w�f&�5LQh���:QDD�@���������a�����J���@�]�r��P���Ls���JR���UT�L�\���TGL�lX���F[/L�r�QM4�c5UT��33���\�]��g�bW3%��(\��yA�5)�0�9}V'�cE	JR��R��U:�N����N���5j�����/O�g�TN����Ke9�z����$��O��Ji�������U��M��"z"�8cJ`�n�`O�f.hf	�l[T�]�JF�~X���}��C&�;��>^e��-8�_(��_������
q���s�?����`68���8�/$�\��>9����8=A�6����+�n�HB�1��R����j�����L�]s��33�DyfxC���v-U~�QMD�T����f|�eZ�I�QL�;�1�Q:�I��pz'O������N��R��x����5+UH�}�W��{K�9nYr�B�����^Rs�������(�x���U��z�Q=P���y}�{@s�;�m�Wp�6���S��Y*&��������k�1EVnv�h�
�;������Q�c�+�ao�We�d��x�v;E5:���Z�.�Z���R�I�c���m��s|s�u_�g��3=�D�5�^_O��7�Gp�z�����H��[Z^^�?.[����GGz���y���2��o���&��^i���7�=��o� ���?���\�/�h=Qy�mE��do�/���*d���.E'e����d�����iZ)���c�Zu����X�G�}*�������t�r'�\���43�l���2��j-����'������Lz[���(�Y��,kD�a�����H�D b�������Z�U
���8�������s3r��������1�c�9�r6��>��g�X��#�����]�[������nFxz���`���=���a[_���\���M\�t)T+C����uT�N�W1�������]�#F�����U��S?�4S���l��������`k���m{g�����&2��UW#��4DO�o������#�������H{V!2��FY�en��K�z�*��W5?l��o�2L�N�������Z�)�G_�zg���6��7^��nMV��c;z���8�5��S��1�4�S�*� ����������,k����=�e��W4"w<v,����{5��{�
���FP����z+V��z�����l��H�6?��rx�1��c����r����|�s]���m�\u�-[7�f�q�l�zY�l%� v�U|����n���"UC����P������������lp���r8H���Me�e�G��2d�I"�g ��e����kU�+����U:}�9{;�+[���K����iqV{1T���G{�7f�|�=�C�u��yo���&~��U;1N=��b|^�q�i���M=����@������V27.n�m+�`�!�;;"�|k����I�����K��J{��k^�(5��Ky����J�Vj���77'�=����Y�4QG{�o��u�n
���+�������{�GL�-��0���v����3��z�&&f{���Z���!��n��m�)F[��$U��8"��q�����RE"��Az�f�^�{1���b�c�"0��D5S�s��������c5r��k���\�k����US3�s��B�����?�6F�g��m���<g��s"W0����^�bt�w���cI��y ^���}]��A�F�J�"Q����+SR����g���o���>��f�;S�6m�U������y�v�?~�+!��Z]��7#����6�|��Q�KP��5p����������z���c�u
�X��kU������u;d�-kZ��K��U6��<���rx���b�d�������O�������&�~Y[�5ri�u(���s�)b���""���D��&<g-a����
�jv��y�X���������2��-�����rt<�gxq�1R��v1kq�R�	���7��UW�B�"N?�x��F�W��G��s��5�Vs�d���d�j��-�V

��UY7
�U�b	(dL�I�����5i�������w<��O��fc�@��nG8,��r��3f/��i:��S#����m������I�Z�������)��j���.=��]�W��������1Te��Sr����"���8[�5KuD�+�+K�TG���V��������SE�)�����)L�7����I]��_����S��;�2T�
fp�5���pi;������T��RE��+Z�niN�������x�[��6�����h�UG�b'��S����Q�Of������P����X����rfl���1��UTGG�����"\|�bl������#3��6����3���9�5�I�*���I:�*��R$�e��P��b�-)Z���i���i�fxC���&����Y
���F�nL�j���p���G��Q�0��(1pn�k�����kJ��y�Th�McZ�nR���:��^�c�Du�T��sL�y�Wv������ng���V�'�g�����e(�4�6���=_��c�U��_����r5�zR.o��z�7~��V�[�wt9;%P���*joujw4�"���o~b�����|1�F3��1�+fe�������i�e5g��U�c/�����	���)�	�����4�^a�c\qf��K��m�
tJ���Y��X�����)Je�����R�=S�t5k��&�F������4S�Oms����3>�/�������7fc�3v|*:�����n#��6����f:[,.�����M�iZW[}�OJ���*=L�����b������Sa|����
�sG���g~6�C6b�h(��.�e�i�y�!1c�Y#���qv}����,����'����A��i�H��=N�*NJ��S!/�!��R��O`����)z4��Rn�5}���}���	����������"n�4��wql�"���1L��9����o(	���Grr�2�#�ech���G��
J��N�
q���s�?����`68L�����l�$�������i��u���*�]����'UjR��D�T�Z���J}�r������e�\�=����Z�?�r��::��g�8������4|��������r�����t�ua�^�v������Mu�y�<��c(��s�7
���N\�.�W��!���3D���"M��2l�����R����M�����D�:N�R������QL���Ub�������+���y3���7�����z�G=wU�UTz��t��UMU�D[������)�u[��O�,-XKN4w�7
��gi�wdcR���dk��)n�*��S�Wq�	T��D��^�)JS\�f�m�t��+�{�?�W�U�L�c��=���_7y���+u���_��S�2�o��1�G�M>-X~�����C(AM������Sdo�{���@A���0H9�fU�n�f��5j'sM�u��jT=S]����-��3��E�W*��i�>#?�~�N��9���+w<k�����V>I��O����^t]���[����
�l�w��<�fc�������z���5�Om
	��dIe.Y���UqBp���8q�5{5�"�������?�c�7�W4vxt�v�N�R�m]&4=�����mZ�*���z�|����Y�!����hn�*c?���a����+=�����	��
ea�RT������-:�V�5?���5�����;&�}?"=��+g��<���/���k���]�2����~���+�'��c�r�����
��!�Nf��x.�V\������1.7��������'��V�jY{:��4�|���F����X)G�v����~�t�����_�����6�:�I='d�Y�����E^3#���b��Q~���)WU*I��I���H�(�c��snv����Z��}u��������h���%�	o7���(��jS��vv�"���2�s�����\v������<w���
���m�l��'�����ekcE4jn����%[<�dL�������h��	�z���/f})�U����q��[���z<Y���N=Vr��D5��O\�F��lM"�n��S8��k�k�"&f��U�u�z�������lO4
��c���{���������3)����c[2&d�5:g1N�K���xSR�!�iW0���2��Lg'�M��3����]�i�%16��%sO����O���]���:���z�T�>�j��_�N8�5���L��y[Uc�6�A��=�Ay��������2
�����'��2 `J�M)�6�G51..�KyI��P���3um,h����������t�+_`�%h&~^������}[�9�]~%����=����6(�z��wV����$��GWr�=��������-BJ@
[��a����:�#��~H�*.�+7~����|R��v�z�J(�;5H�W�F�����W����i����xS��� ��d���������"���[����W3���f"~4����u�O\5r���*wY_!8������$r%��&%~���vH�5��nD��k��i6��^��[������3�5��q�F�_9������������(�'��>
9l��D��
��\��
����"D@�kJ{5�?�ZP��O��*����
�����9Us��[��	0�1�Qej6S�\�s0|�9WcY{tZ�M�R�1n! �:��j�.�J������\'vS��,([q��#�OG��_VL��h�>z����AIvp�2�QG���n��R(�}jt1)S��Bf�l%�����{��iK\���<��t��kuoI�[9;1O�e2�d���*j�h�	�����A�
�
�z���j�c:ln�+1L��y����
��NU�-������c�\N�����j����ZP��j�f�����r6���������7W\N2���7n2�T�G�MA�X�6]B4��RP�1z����l&����Y���ga����ICG�9>���XJ�,^�8�z����9�R�U�P�!L�KB��r�/apV�����e�u�1���Q��<ev��0�cR��K���,T7��E�/�Y>4���hl���f�����C��;N���}m@d��n[3�1�-V��1�|�]���R3���QOqU:}�#f��~E�`/�u[���u����.�Fj6��n(g����`�a�Y�����$�AS��+P��������x��0���
��y�l���:Z���	�����@���]�x��p�\���NYr"j�:�oN�kN;C���9Q��c-����n��f�q���Y�����Uk����������_k:t���kD�:~V�&i�?��6bxc�v�����#-EX`��c�����S��Pa�����WE�wM�b�]�:��4{3)J$�Q�eM?����3��h^����_9�3�������%�j���'{��SK�G�N���=gm�>m����'N�j�D��;~�������,E��g����D��XJm	G�D���#���vI�mP�o������f�}����%SP���T+�#�8����D��+C�-iP�#1�Z%�9H�Fmdc$�� �>F=�r����d�Ed�UU3T�-hb���*L!y�r�����D�k\�{����X��^����n���8�0M�h��
C&x�Lg49NJ��!�P�y��[fV��%���z9������H�hh���w!)+(�����	����)B��5)J��k�0����kk^�k�o�`/#'ic|�j��"����e��G8:��&~Q�R��zD�OJ�0n8M������Sdo�{���@A���0$t������{@�J���� �s��8iV�je{}?�\��������Z�z���	�|O��.�
�O��k�/�D�w�G^���E�O�w�u��<m��rvg�0�����cTF>t�Y)!�a�Sqy�a][e�O����������8�l���GYo�����=boK�N�Yj��x������cH����E���_��'�����l�c�<��y�w���%Ui�UTe��n�<1��DOD�4a12�����/5���&��2I%h��z��Z}�(�f�����������������
X�%�
��t�[i��l�e$��ql��N�����fx��e��I�G�AC���
��k��S��z�|�Z��$��_�L��Zk}��g4�N���T�GN����q+��o��@N���!���
k�,�p�.���Xk"��g����u%"�
C8v�Z�WOE�=juT9� 3
[�4u��)g���qS�m�/��Y_9b���bq\��+i���A�7�h��~f�v���T�Zq��:���c����n�^�����5�����]���b�;;����<]��������O���Reh��H�����n�~�������W0��8�19��m���k}�w�a?hZw��[��L��[(O��!�R2%%jVeJ�1�F�H=�qg�i��7�0�L]��9�h��i�q���b�T�s_n"��a�h�9WV�Z�����z�u�w����3�[�i�w4l�lZ�#nv�f�k\y���-��X�Y;#�+r�AJ0�D��U�]����V�~U�F������k��s���i��%��1��6��8z�����v���3����Q)X���h�����*�e���\,�\���>�e��1�Z���^�+^�=�v@l`
}����:��s����8����`��)��~�v��R���fEf�p����)Z�]������t��cs��������z�_��U�b;�s���;Q��p�)f������>��8����E>�M2�B�|���W-��Sk��g�wM�N��g�\�M��Q����i����9*�/E7�+��MZ=���n
�N��*����,QODSbc�?���3�E���A��%������������Y�����3�S���?�9kw����GL����kg��a����kkb���a-+J����a���U�uYSW�S����0M7#gL����x��SDy���}=2�w����������W{3��ofny*�r�����&)�:�"DV��v��m�$=2�sv�e�k�f�6P��T��b`F�9.d�����o9Q�(^�6��%Mr�����n��(���*4�y6Ok9B����9��e����5�z�����)g���F�-x��-g����iO��=�'Fn��T�b����7�n9@j���+)j�>��-�w�MY��X�#2����l�;X��L��"�$��r�w
�Y�+��n��!���T#kc6r��!���������W�r&:u��0Iv��"�ka���[o%[�J��Q��J�t�2��U���
����7i��`.`�����G��p�^�q��]o[X���1���c�	�IC���OJ��l���J���U#����?E������eS����-�*��l��\�S�^�kR��i�`=��v�����y[���(�%��������2���I9��
��2�*E�e�V��g�����
�2JflbE��L�5�n��9��)�giZW�ZT+����b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;�$�[�����W�6T�'&�[�������$$e.������ee^W�Z���k�Pd;OE���.GC��f�O�q���QO�e�z�&�����<UU��
c�T�zZ��n��xKO�l������BO'�$�o;y?�����P�\���[��ezT�x�����y��[���v�Zble��������xxG��O�b���sJ�9Z/�o����L�z{����4�����x�F/������s�/yh��[������b�-���r��k�.���Ew����6]�1p&��{+4�=��e
���*����m�)j��N�"�Q���r7s��Qj��}��"<��h������
���7����O��>�S���k��L�G���,�7u�,��q�~|���[4d�%n�&����%�g�A���E�`n�P�N����=�8c�C%z��V�������}�|
|�O���h=����m������m�4�2��������Wv;�OL�1�Ig�^����8�;�e����^Z1��tzE�/-���s�="���_�����x�F/�����H����qnw@�^����8�;��/yh��[������b�-�����^Z1��tzE�/-���s�="���_�����x�F/����������t���}�7s��t���pE�����uI.�&
�b��41�JV�������
�Z���f	��I,�l���S������S^r'}�/(��7�����*������_�
��C������)�������3��.��&����?D�_�l�tk�v�z�������]O��j������?5O>���
���������Ni���M��O��1w����,lx~�]�w_���R�\�~�v��z���~j�k�o�W�s���^t���o2R�O[������d�'bk��.�
�x�C����)�z�d�B��[�������9�unY�����9��[q.
v������ea�=���))��E��Z+h'>z��UlosG�`�8�����y�s��K��.i8]s���|�"���go�q�{��v,-�<�m;���N�SeU���Y�L^��������
�~����8Jv"j�/=%q������,��i�%���s��e�N�J�.�qT%�����]&r�
rK���0o/h-���yke���K�/�c�o8K:��L�4K�e[Fn�3�,�G����(��mG}A�M:R�m|����y��F���[��V�<�9yF��k~�mM���&9^���C:�z�T�2���3�c�S�,lF�����,_���Yk��6r�jG���Vi�u�+J��%jZ����������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t�K\<����@=������*?t'sT������k��v�����?ew�M��c�^J�*�fr�Z�D�u���9����p�6���/gi�;��Y�c
#+U����f��p�1�tLt�u�������V����U�j��o�b'���L�L�<#��L�����a�]�osy��U���zj��Y�������R����;fZf�(c"���J|�:G�hF���qQ���������U7-i��MS��~���_�{�vq�Q/���+g���wor�-DX�7�������j�N�M��Z�0��f����N�y���a/E-p�3a�J��������Fl?�Q���Z��f�������Fl?�Q���Z��f�������Fl?�Q���Z��f�������Fl?�Q���Z��f�������Fl?�Q���Z��f�������Fl?�Q���Z��f����#����&��F�k*�'R(B�+D�9A:�������Z�������(�i&uU9I2EP�"i�Jt�s��)JR��Z��y[t�7g�~�oL��Z��������#���-�#H�!��H:U�d+U�n������$lN�D�P�F'����Usi1D5�1o���/1���.��D�P���G�!�1���LV����h��gm"������B��R%B\6���d�M98b,��������bn�A���Ce3}�|{���0�q,�N&rD�~�6%Rj��j�b���Y���.
��wu��]�*���m���Y9���#��A���7sH���?m
2F�:�mU���'S� ���6s��s���������a�K�p��fd7�>���9k �[�8g.J�"1�Z�WG��U2u9[�@�b��k&q�Q+vL�d���*
Z�D�S�5hR��kZ����a�)��/4T����@��N�A�)����� c�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�"s�k��!����%'�9��ir�)�KX+���;oJW���[�B�����yAEU�[{�#4��so��E�����a�E����B�;jY�[Q����6�{�1������(�,�c�"��sF�X�@�"-Y�D��7D��B�->�(!��+�r��g�US33=338���RuQn��n0���������{\)�S�Ptv8S����
{T�T�^/���|������6�>l������_
n�Y*�L���R�3T�����-kA��Z�V���b������TO
g�S������6��y�����-�����Y��8Wv����nq��c	�8L%��6�Z�b��
�n�F�[�D[�j�:"��	'J�!B���
R��;7��b)�0��k=��/\���������g���ffzfg����Oj�j��C�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�xR��8��.Ky���g���g���o���� :��w���� ����
]�|��0�^�K[��Wp�����[�d�\Q'x2����\.�^������1��d���P�z��J�QB��F�7����#�a��#K���<�sd�z�7�-��`�WNT�x���R�N3�$V��-���6�R.�1Ei$�WF		����G����
s��0��g+s��nYg�~v����z��E���]�fo�7�2!�|U�q��^����Q���]�h�I���EOR�-�
g
m������3b<�i�^��[�w�y%����G��������8S��
B��hjV�8|�z���R�����O�N������������M����6�>P����J��)Z�-��z��6v�&>��)�3������L�b[W�9v��[�����9MD-LR�F�R�1������vS��6	�b���V"��e�a�|kh���mNB�E@[h6jC��/X����MZ��g�*�����e�cWp��
�+RS0�K"H��^�E�0�{u1t�M\$���M��b��)x�B��[q�����d<$+�q1�����cX�4PA"�M$�R���JR�90����������lp
����s|���$��[��h9�]Mt�J������l����V�)��j ��5�kD�U�
S�i�>�Z�r��E�tO�����G7O��WxWTS����{�������V�f��o5FF�QM4������S<"1�Z��g�������I�'���x��cU���������_�te���	$�
��_J+E�C���)�W}iJT�w���k������o�����LO^1DS���~�\����|jT�u���S�d������U7j�	�{�35^����~q��3���?�)NS���jT�)�J���8T��}�W����r���p�Z�����|�yd���du���up"�^�����5����H�jr�R)E(t�b���n��t�A�["�v���D[�n�(�( �t�HB�)JZR��)JS�
W��GI���b�mH��w=J?q*�1B�lw�K�9U{3[��y��-���E�����k�6�N26j9�D�{h�F�I���A�t�iUL�2tS��J��"��Z���iZV���H��V%��Zu_^����m�I�A�,,y/4�j����f
V;D�c&�?R��Z�2���Bg��/4�T����A�������D��;J�5��xS��+L��V2�^�*���9(����J�GH33��58V�!i��8��Q���M��?1��j�\u�^����j��yE�)���������X��=�z��������� u\��U�q^7+����RV���[�T���RO���E3���f�8S�<�^���U���D�3�����?!��s�4��r�b���5W]QM4����Eo+�jg,9���o�+%vmm��p��'un`%���hv��k�I����JS���*�*j�a�F�y��n\�z���Lzi�D�DG�p���^���v�����������z.�7����{f��v;;�S������q�j�ymIT�FZ�y9X"3Rq<{~Z����#UKyR[n����Q����g�����d��������m�'!X���`I��������b��3�,iv�D�Yx�5]��h��&~���H�(w��5���m�K[��k�
�&�rk3c���i��Gc'-�I5�9l�gEt!N��b�5+@���:�z�7��v'����v�-���	�g<T*4�#b�X���/�%{&�=��u�������r��Y����=r���6fm�#��#r�9����x��z*2t^��;���q����S���%�!g�+i��R��"$�.�M�
B�����,q�����>�����s����1h��lr�w�X'p�v����<{
q���Kh,z��&F����]7egn?cX�*��n�I�k�-��xC�����{�(����'����)�S�[E�snC����3j�D��#e�M�[�7��b�.�'�����R��.N�:U�o�
q���s�?����`68��5����������Z]O���VHe�������Y���TQ�UY�kOc��%^Jl���ei�-�{�(�����l}%q8�W1Ys�wN����������nr�&:b��h���q�L�w���so�zqt������j���7_u��su�l��&�rT�*j�6IH��{��X��LZ����y~,s��\�}��7���2�lm��\�n�����=o�_���T{4{$nnjv���9Y�d;���3���O	����Z��������ar&��f��QM�V����tID�A	D�E"�R���KJ{����b)��CSn\�z�W���US33<ffg����2�]�=�Ay��������2
�����'��2 `X����
��/��������ye�j�GAF�&��5{��7W��^�s�t��cr�t[�?�]QL~YSg3V�9K���������LL���rr���K��z�?����W�m�v��;��LK���f����i5H��Z�x�;<��\������J���{YZ":;��rb:�j�'�J?�~R��5��}6�z�b����ULQ�DF1����$�"c�U�;�bp��c�_�}{����g��-�l8,�F�uD�S����D(zT�"�)^<)\3w��������3��U����q�}=�c��4�����9��Qd����Y��.�����������p��z8������ygZ���8�b���-���Z�D#G0F�-)�5L�3��Ln&�f�n^����2�c
-���� [T��z�cX����������J��MUO�<#�8;@�[�'^K�5r��8���;B������^:'�!*����{^��1�W��`��-Z8�TE�]*���b��nH���4��{ZY*��2%�pF]�=�nB��}�
��".f��NZj1�;
 �������MN�*���'�������h������:���
-�v�'��6J�����0��.���x��om�V�*k>�u�������6@�p�T���!mZGS���sV��4��p�M�^�e�Z,~"M��:����So�����4��[G�ES/S��9�l9�����b���`��e�=�+u	4�$[,-�nfL�ufG�U����f�>|�"�5r�zC0w/����5���[�����m�[�B&�����l��k~I��m�-9�V��z���[��tL~�J�"�}v�i���Q����$�v��O�6�����)|t|��_���w���t{�����C�������a���9g����*��1��?g['�q|M�7}�L��6�kX��Z=J�����_&�E��b�"G
��W�yX�	��F��m��Z�J%��J��Bi8��I �����2~�
,C�'�P���|�9[r���d���`8���>9��=�����2r�;�>�������W���Gw�$�cN��-D��)P�:�8N�T�P�*_�-�lY�ya�R=�xl�a���q\V����$ZB�{���sD��Nd]���*^%���bVl��D���D6K%Mfl��wa����F�^FB^w�L\�|C��W.\�#+.h����Uk�oU"D����
�����kb��y{����P�������"�N�����\3l�*�!��^FA�K/��s��(GU��;��v@��]��
��x����?'�������v�J6{=(��b�U^�4���Ev��J�'�9f����w5��r�>?��/�X�>�od���&�v�F8�*��R�R��z<L�����)^ )��w���}�'�u/�5��VZ�vb�������O������������lI�m�cu��<c���)�-\���U�<�.#�
���g��M��L���%���,�;UW/�H�H(h��{%$�sQ�[����'^�?�Mjrl/��M����`�|��6�]��F�)�T��4����c6�����rV<�[,�R��*����)�Yw��gd�\5{@dl]����M�l<��K��+��h���)�t�ARTU!�X�T�!B����hC�sw�kqy�L^����GbKh����1�	�]rN-�a�"�GlC8v��E�d�&p�.�}0�]l����6l��������f|��.+E�6c������u��-�J�]��74�X��h�W.�T]��"p�����������q��O��Nz��r���_�Y��b��{�����������T���kl��~�$S%;�13�����S�w��5����CX��eL����[�5z�OiV�=>��4�hk��r��%��16 ��������k�h��m��,gs���yWZr.aH��� �91mVf�v��B �����J���w<��O��fc�@1)H�����l��rb�&���lZ�Q�0��e�2�pn):6nz*E���~Sv)Zq��U�G.�1�����1�����S����#���cf{�����f��l��O�s�WNs3n������-[��5UM>c?j����0�>�����i�c'C2d��G���ebq
���V�b��N��*��JS,��+J��?yyEz����l�O���f�=V��=n�t��Y�������[��H�"t|�:������=�;�O�������wl�DB��Z|�bl������#3��6����3���9���������b+AS�����f`�a�U*Y%�e�����t��A�'IR���UkN�,�gN�w������M����?t�Q��SXG��������O��7m��������c�LLO�R��x�e�l|u�h�����D�*D�H��RR���)S�>��f����^��<����nf.Wr�{k�j��������;!gO�Qf�h�54�#��`����EWML�.��*i"�E��UU��)KJ���xR���&b#�v����(�&fg��33��x��mN�l�0)�*��m"�\5z��C �9�]��.������Y�)�T�N=')�KQ�m��cX�n[�m�����(�Z���_�
����yy���9I�sUSN����9���6k��m�Oe����,g
cR��!�8�d�&�N�6�{������%���'n�\��Y�;E�V�:B�+�nIN��5��B�����snM������6�\�J�b3�g@2\����{\��'kg��d/l0H�e�jU��U��rU�xv�0���'�������h��P���t|'���s�g-������e�/Z5�G������{��H��-�7��2�ak?zs,t�$Z�*UE�`�\���������?�'8����Zn��-Y�0m#;m�1����|����9TICR�"��^�f��[�/��+�g���f�c�v��S���ep��������nE4���7���6iw�(��L��:H���!Hs��4^��/:�ZSk!n����e�<`��;H��3�m����0T��T����QU��)��d��:GPnK����v�E���>d�Y���$�/�kz����IC�G��M��N��V��_Z�P�X�[�����dE*���6/h��������d��6�]��&�1�%)o����������B��L-nB��KJ��
R���JZS�
ZS��>�~�|��xm^���7n~.���������,�����~��������U��=��J���P���WjV��z�p	����z��B���9[�>��	��|���~��,��OF���-�)WEeC����*n�
6s�2p��G��nnXZ�}DfL��.m6���,��Y(�\A�y���v���' �����T��) ��J�z���IN�)���
�.U���eE5c<ng7������q�����F������8�W���6���=YZ��Dy������&F.TsP�^����'��b�����d���c	��y�.�L7%���[q�L����Yf�e�p��D�)����EkT���Y������*�\��2�$�iv������r����Q��Q��+S�~�J�������Z��_V�D}c�������y��b8�v��!��Vf��}���F���g=�����j1K�!��D����%Lc'D���dQ4��[#�+-c;����]��r-�?�n�Q���%��X	�W,��Z�t�N��+�p�
v�]�����Yu���|Wo�����\����n�e��"�SJ�Ag}k����
�����
��U��w��������XfR�&��k�����p���'25�s^��o%Vly���O�1h�#���hZ�K�����Dr��
�����.`��w��]����l����h���h��a��(�x��6H�;��������7��&$���J�C�]��5}��4(j����:�������������������
�ou��(��fTi�X�L'5%��)�2���r��C�~w�73��N��i������TkN�8�����qw�|�Xu��j���V]o�������W����S����
��)��{qN�g.e�����w�1�8&�����5��1A.F��I�l3�ucX��>:7�@�v���o��t���5�n?��(��8���l��e�+=4��xH����M�l�25���z��`�$C����G�[/7����S5��U4QLt�USLG�fb!�������f�UE�SUu�=�LMUU>H���)2�v�j��n�j��y�g�t�Z"�;������n4a�JP�$h����b�����k^�x�w�G^�a�
��M�n���x�OMy��O�>I�f�XO���?�/�k\������7e1F�������0�v��)�lEX�E7c/������+eiF�CjN���y�MS�s��L��Z�~SM^�f)�{.������Zv)Jni�--�[�SDES�\���Ms3�f���s����7�rg�c��]�fq���ao-k�o/E�?��[h���16{���O�M����d{��O�d@�����~�����zO�-F����@�!���W��e&���R��=��v+����"g���|��ui�okY�2���l�������S>�]��9������*�Y���.���x�b;�G�-J ����n�_��V���;Yt�`Ld��x�@�j�gx�)���h�(�!��ug]3t���1]�����##����Um�_�������v�~��~��*���0�v����S�g����s=���������[��V��\#�����		��(�x������G���^��j����t�M^=%*/zfB������|T�>y��L�>�e��V{�������������3�G��"�#��+���^�O�Yg�����u�@7��
���v;X{���?�w����s��-��=�x�v��\w�1I�TEuShYx�9�IH�����B'�Q|�����<M�N�^�s�Y�Y�l����S���NT��-�wD�����V`�����������U)�0m�:������K9����;n`�A�	��)��F���7���������TctJ&�����u
�DD��7�p��<����S	b����U/X-|�c�d��v��[9���g�D�-J�����I�S�I��T�	����6�;��5�;����n��gr�8z���}[^�uV����Y�|��K���*���"��p~�Mb�*�)������]�cbR�g����|�)�mT��,�([�q��_���U?����@&�t����P�n�Hj� ���.##�A�-�6d���Ai���"�FKgx�}K�����:�P��T��8�jV�zUV� ����/1����_��%��,-\�Kb��f����r�{s�������4��;�U�(Y.z�����SS�����Y3�4no�Q��+F���vw&OX�s��|q��������\��V-�|[���A����L�cU�����y%u_6M�z��V
�C&so�K��g.���1b��v��f\����"���o1'���WLv�kv^�ef&	#I��32��6�3: ���3p�OWS|u�l�vk������,i����0��5��z@�a\���f��S���b���5�*�!_;�I�Z9�N�e0@7+M�����s����K��{k�v���O^7K;�9L���mg��[�T�'����"d*mN�\UVET�@��iv�dD�w���X�y[<����e�Cl���&J�
����x����I:�m�"��2�G���x�h�0t���`hd��o����������@�Z�L!|��Q���32N��&;�� ���4�cW|��n��]Z�*����&�8��Sqs0�	r���y������cY5�,��������F�U��w(R4��t�V�1���=V��K���������@=m�������<�n�np����V��=����@��/�4������o�Cs�<�t�Y�mF�L)�����4���^�`���gI�����C��`���4|����uJW��I��i�����r4�/�cp������v��IH��������
#S�dZ �@��[��)�5x������G�M��W~q�=���z�����G/aWO�s��&M�9''&u�R/�WhUR����'��!$���@�@����������lp��;���&�N�6Z���6^���Vs%N����k�W)����U�yUiZV��NIO�'�f������kV��#%���=~��V<�>����~j%�G�k�.oiv5g5���Z��{�Ss��0���mc�z�iE^��������|��~Pn�;zXy����BzrAN��H�y�WUJ���Z9�iZp5�|��7����������+���z"����z|:)�L���{��Z�����l�-cgZ��������#n+�E�#	���j��p�s���mv2���16{���O�M����d{��O�d@��4n��*���U���5�("J�������kZ����UuEF33�Gl�����f���3�D�,�2���nD�U:���`�u��X����6������9�4�^G�c��y�]:F_E��'������y��W^1�TF��-��R������?���x�Y�����Y��%�C	D
�Z�nW2|�����8SJ#�`�0�+Eb���*l�v47����UYd�S��oZ��Q�d"u��{R��_!f�d���*��:1�����4���Zv���j����3��]*'�����b��rbq����)��XJ0m�W�m
�]�W2�G4JI�T�:e]�	EOCtK��5x���@�FB6:Y����e&�C�3�j���#�D�v�JbV�5(b���V�h�E���v�&�&DA$QE"����d�
R���
ZS�)��Q�L\QW,\t|i.wN���ver�JR�r�[��5
��Nn5����<K���\����dJ��IvM�~���t����U�zF�B�����HHXt���N&59�)��`��k�R:$����1hT�Z��8��)@�����
�Y�A��]z�������/�\�����Mf���h�e&��K�W��5}�>�������c�9[���QW((��.Bw%�����������h�v���%(�j�t��!
���>qS�]�����*��O�Zu��[��9����a����Xk/rj����>�I���0��P�R�]���lu�����M�o	U\������W�8[,�������x��0�������4��w(���A�n|�x�U�������=�-���Q3:^AX6�x�"��^�p����r�kT���L���6mt�_e�D�Lq����{&.�=�'g�����V��V�&_I�f.NTQ~�v��������f������l63�����N���(�G��y2u��o	��:�9��e�f��YN�Y	�jZ��o��R���Wi�lhU�Y�9�J�W����fg���Uq���S��{i��5����XQ�����2��b"�oSE���"�9j�������-� M������Sdo�{���@A���0G���E����{�-~���m�c�)��r���K��`�W�ND�.�?�HH<������C)z1�j���E�1�L��f"����`j��m,�f��v�>�����r"<�L�y�cR��Z��#I.���`�3��R*GR�z���2�����M_��.��*���?�L��W4���=�q��)]6��N��rzTFf�1WW�1��}5L�$c�Iy����`������Wy&�+Lo����y+�o���+4�c��IW��ZpC��
�������Z�v�(�s]|)���}	[�����OI����s��
h��������������7�h����,L����5�r<�jUMd�����$.S�1\�V�����N��(=v��>�k%?#�\��W�����P�k{��-���tp��_�������R�1F���>U6�^������,�R����}UiEP�}F	/�b�Z��`=�E���Z���?����
Z�M,�=�����o�l��a ���s��������
G9����5��A��uK���qBV���6����N��$oa�;���	Y�V;js�8�����dKn\���S%��O�=(n�x�,�u��5������|7���/dc�}���������Q�y�:t����K��,z��9���@k����Q�'��p3��1�^�����,�kw���+�Y4�h�$;IU�4U��T�}�ZR��E�oh�������c{9z��xc��TS����b{��2��=s'�t���'9+7/W�b�3Wv1��b)��f!IK� f�)�u���#�y�m����d*��kv9�\R(�Z����y���!���IB��JTd~�[�����>Gm����V���#�
h��S�	��-���[�&q�
���>����7�����������������7)��g������Z�&0�7jb0��Y���h��-��M�f[������M�l��LKZR�"H"�JS�����-er�elGv�t�4�e4���S�j��{W�k������^�~�s�k�v��]S=�UT����{-�M������Sdo�{���@A���0%7��=7G�=.�#n�M��L:EQ���8H���$��f�r��R!�wR�bh���l}�����]�r9y������g��;�1��-�q������q�Ms��]�_&<�c��-bJ@p�U���{lX���8G��J7��r�������*��\��He!��:���"��^5*����O�����q������o��c����1=���c���Y�^�SV���^�Uv��3���\E��i�8M5S=0������;���;m���f:�<����Z�&$����H�F�6����W�#2�Wt,qSj�
 �|�%��T�Jq)�%s
��]������f3|`�r���s���]�T��[b����������&�Z�zb��(z��������j��l��m5��k��Nm���oj��X�6�Z�BmF�L��M!V�tf��Z�U$�n��|��<�>��9<){f��xa�_dc�x�]9&��1�;v���^���)g�ED(�^�Zx��T�b�*��n!gv�P��<�c-�B<�+�-�p���~��x�#��W�N�����L}7��N���v������v�kR������Y[�I��i�Y��xC9bSQ�b*Tk�-+����0����g�g�O0d�he�=p�V���e2��R����JR��;5�~�<h��/:l���QF��.����^�Etjb���Z��=�c)��7��JG?u�k�6d����*s��>E�������JW�MNK^XV�`s�r������s,g�W-����,�yd���o=r"��d7�^�$Lq�#IQ2R��B�E��cg!�j���r�hr����
v����M�j��W�n7
��}������
��"�����m�/	=��:��������ko�����-l-����i*�A'���_3���5J�L�Y*����8W�Rq^��_�s��Mk��/��3k:���O]����w|���f
Y ����t��
L��D�R��6G�k�����v������.������9�������\\��K3$X���&������U�E�t�FH��Tt��3����w<��O��fc�BW:�������,x���=�����m�EUe�`e�H\�O�������5+N	���*6g��I�d��S���?���R����~�Sn����r.a���k?�����h�g-�j��n��s�1f�tL��q�|Z�M\c(��S9Y����s�-��m�`�B�-������	b������\��,U6r����}�uN4�h���f����o���^'z��-��MU�UU�N31�0�}��>���o�E�^��E1c9������F��)�,����������S8��l�$��16{���O�M����d{��O�d@�����;��������&�����^�X��wy>�rn�h���:��tz�x	�}�m�_m��O�v�5g��1U����S3=��v�������<m���������ri�-Q���!d���������O8�&H������1�W���wT�^	�Z�v�T1S�MBT��+���k��#L��]��L�Gm]��f!�r�gg7�����K���i���Wj=k�&z"(�O�mv����0���\��_4g����d����Z����8�kq��0dt��^V�p�8�[6��s!�����ff�����|b=�y�f���M��.dt^^�E:~J��1k-�Mq�+��������
� ��F���G'����`G�n���R�R���p��}K��Q�4�XE�Z��XTMC�+���N����>c,k����A(����oC��S}��'����&?V���j���^�{����+���9�+vJp�������RZ��&/�������b/5*���n�&w$ih�n�>y��fV�rb6N�
Sv�
��1>�����a.%q�,�\�v��f�4�3L�|�!��)�tY�E��s,���T���+TTL:�:_���{���������n�E��#�����u��K=k��qib;�+��`�����������X�N5���5S*���tk���3v@n� �\���Y�{-������v�Ku:��W�����]�,�(��������cS�K�^��7A2�J'B�2&R�a�����L����W��~�m�:Og2-zX�9����@��r��:U=���&��}%��U�b�?j��*����y\������Z��9e���V��,v���v[��:^����`U;�/7��+�I��g(Z�=e���^����0e��*a,;��7M����1����D�$���i4�Wl�:G�R�KJt����k����*1�+�_#/�'�;������Nb������C��R\��Ni<���*s%��[X�;����&�����|g"��G']l�g�^��[���v����U��S�*�@�����)�X�*���C!��&v�G���������aa\��By��>�������#������MI!�n��0��Ych�)��/�Y���lE���������VZ�	\��2av[�r��Z�W�2x�����������t�U����2}���h��Y��6��{���`��>?��y;����fFA2����% f]�I+��+V���f�Q�P��T
j���y��9Z�����"6k$���u, ��F���f(����-dTr�E�����Z�����_+��:{���v!�����$���Z�/�����_�DC�c������.h��F�iT�f3nj����r�8���	�Z��9GmyR��������.Y3��\�Yr�,n�����nHK�M��w��&��ERl���#���V���F\���y:���f�������Wf-�+M�j���we\����p��AW�:�qe����\�1�Z�"���������C[iyX�8����u���F�D�����u=G��c�]g�����jEB&n�W�(�"[�@��G���6[2��{��l/��d�F���%�����Ut���B[�d
J$�n0�Q��6EC�:�jB-<��-����
�n�I�nG��v[�5���h�~��>�5�qi������Vr����
�f��kGn�b]T,��(�E��6E�CF����U�y�sO��|3��=��t����g�����=qg\
r3W7����k���w(c���#�N�?��m
���a���6�`��U�Y�{���/�w�������/�d)�����j��}������A��^�eZ�����
q���s�?����`68>w�iL�dw�tY���4������n9�<�W��������
��y.�^�Z�7c����o�k�;'�����n����b�b���TQ�W�
����X}�9eO���^��C��Kvf"�sJ��M]���{17lU�3��8��'��F�O4O�G����}n"���+��6B)n)���^���"��(��hJ�[��'�g+��0�4��?�\�����
<��h}�y�<������W��[��L�de2���U1��+�LuUz������M������Sdo�{���@A���0�\k���1��J���
�1S��I�3�+u�n�*��[%O�5E�tZ�����F?h�E3�q�}ES�Y7&�N����Z��UG������1
�K��zi��e�Q;���s��UW-����V�p��S�LF��AJ���|FG�mn�s}g�X�l��������b<8��MQT��d���V��r��G����s�����,D�O��":f�q�
�ow�^���k!�p����$�Lvk�Z%�,�R��)�n*�%k��\�/e:�����������c�����>y���z�;�<yi�mk��}L����������5~��S���&'�&;��S��X��mC^���g�l�#o]�2���z��S
;�\�3���QTP��>�@|��n��������k��Fc�C���Fw5��MG0=�m��C��Ry��_h������K�?�-
�����z�&/���)�G���a�,[;�V],��Jvk��m���nEk�:��5�j��|�]�f�����8�_����9�0��1X8�z����he�Z��oX�C��q��2�&���:d�a�t����������
n�k/�A�o��\��l���SJNV<����i�zt�LCP���k�����K�JjT����+J�h�Z��k����c�'j��O[C��������Q�	��/�>��k���,���4��M|��������'��!9���R���z��������W��.*��c��s�G���@p���u��� ���[&�
�{9�r
���q=g��IUfgfV*�L�D���M#��U8�%����Q0����x���2m�r��V�lJ�w=�(��p��$i�$��?9���I�gV��p�i����)�����y�?��^�b�2;*nTvHa���{+�	���dAE�ER#�����CR�jvji�tLs�������+7g�&'��6������f���)i[L
k2F5��]�6��I.(n��9n�l$�B`sG�o��k�+�snn�R8�c[}��{^��lRPp�	�UC�E�YCT��f�%9X���%VP��&?�.��{��ok�R�������9�ox]7�D�+�ey���WE����Z���T�Yz������DE�Kd�Z[iv
��;���t���>��Y�#�L�Gl���D��$���p��g-H�Q�J�Z33���&�M��$^fL�����L��w'W%����'��#f_���-��3KR��2���s���j���������4:u�s�1I^�5�����;�6�zi���uk����:�	��K�q�����h����
�9�jU������l�omf��s]�N�z�_��)��b��������	I6hz�h�jf�ld,P��(iZ�Q�����!��X�V�R��:��A�V�x����b��4O�\�����������2�&���\��e�V����R����x���MN�Jp��b�Qtp��Z�n�t���R\v������<w���
��;��uwW3Vrt�d{c���H�D�G���ig3�OZu�<���iK��Un��f���ww���v�=���b��>��}{�c���al�[����u-�3&Z�^N�����<zbn�N?��z�-�l
�:l�.��E��u�I^e���v�o_�Q5�m[��)�UQ�N�n�w�.�<hn��v����h�{S!1V��i��SO����b1��""h�[��o�����r��T���7����*�0�������g~%��3��c�D��R��)JS�)��)��)O�AjkPg��/4�T����A�������D���iN���j��C.r��L�oR�*��m����������d��Z�S��c�����(�gW�������x�����'���<���UW���������h���f��\�vt{�\f��{6� �VL[ ��dK�I�V�Q�$Z{!B���9r���U���UL������L��(��n��)������{#���e�l�,s{���Z�
�3uM�9�J��3�Qzu���-D���1KN5�()�y�Y,������t�S���������?�u�������3�h�n?�]QLL�#j�����s���7�m��'3:9kt/��U�N��{{"�������R�"	��\���Jd�G�J���[�e.����l�sr�GE�c��L&�hms#k]���@�7kX�)N3SVj��MSs���f*��'	J��Z��Uyi������K�7��)M��>=J�����\������^�=�i�8�3[�w1IY2�z��T�����+�y��=��Y�{"�Ve�qX�bW~%���2=�p�����)j���sL��eZ���V5Z���Q*��H�a��v���]����-w�����:��YV*r��$����=3t����f��]�T��h�M��)S�Q���06�m����E�r�.R�9���Se�Y����nE����\������D��#eXV���S��h!����[^r��l
����r�0�L[W��I �t�{�����F�3i�6l��/�5��b�1�/��:�����w����-�+5��j�����~.���I�M�������m�e�),�h���	DK^&�f�'k��mg0;&�����pa��r]�t�Y�q�K~��d��
�U���jmd&���%:%/�C�s�l=��X.�N��&J����pY�$��%�� �TY3��qI1��a���%D�pU#Nc'Z��L�
@��e`���m��u��M�6�-;	���\L;���[���e�b�dTr�-�e��t�c��"d-hZx���N����>`w���b�.�C���Kf���Yc)��$
�K�Z����%����2�:)��n��mV�X�}�9�X2T��`�<?�.�{�Le�q��G�����d�"�����=�t���5;8}9�l{�Z���K��W;�v��+Vg �BJ�r��s/U�	n>%�����/I�r����q�MP��>YS�E��1���	�6�_1����K���h������4��hW�V��*<JO�?
����G���0D���%����&���hD�8���K�(��w��*��t�b.�Dp�xVn�n��!�
��z��em8���\����6������F��v��HN�D�q���I���21��L�b��T�D�E������e��
�r���s����@���V|�=�s�>�~h,x����Q�J5�Y4�,�r����MZ�0�UZk�����6���ss��O_���n66]��d	J:=�w�"�;s�D��:M��Up�.��"���
������
�?���wWZ�,� 0�����&�=O��(�z25��I.(�_6%S:�9S��	����d��R�4���r����4���kR�5�v�X��C��lg<�d['qI�Z���Rh��h�e���M0��+�z��uW_��c\WX�����;�.�w�O#q^���CF-�L�=Ug�f�UP�" ��"�k�+e��9�c+�6�����d,,��lY���L3�Dfr]�9m?�RP�B1���17]�NV��& ?����,�K���v�bM��k�O2F-�'f���7�r�>�������<�KE.B��A8�EY�Zz�Vo�"�
v�����ko�-C�]�����"d�0�k�I�7���Z�I0��.���Z4�j��I�H��E�r�I$����/]�]�0VN��VtF>��3��d�ifw���j��x���2���dT�T�z;I�F�LQn��N���4Kp�jrz���imZ����e�#�s����o�;1�s�������l��I&�H����2��n�*�������@��z��	��yhs$g��i�����\�-��������,O/�q]��.�	U���k!$G
u��<z�T����������R���^1(����;`��al{�*!w���8���<QcZ�P��X���R/D��L���D��;�����a]�����l\I�����;aH�]V��������p*��pWc7/���\5)
gK�M"����������;���=@���u_v�����}����,�wn�7���	1��5(��d;z��u
��z�+P��Y;��oN1���Y�x���������i,m�,�����Y��*�H�B�4Uf�*f��U�En�"�����w<��O��fc�W���D���SU����YYR���/�OzP�x?�;��U��W��\����P�
u�B��J6���r���������N���/��c���b��"xU��
&#�v�����T��2v���������v�3�i�s��L�4�T�����"�(����gM��}��7�"
wnN]�J�j����)������"�/v�niX��B�������8ho-mf�I��mS��������U=s��S4��C�_���l��W��h�O��'N�E������TcUT�p���oa�Vj�DB�bRh8��VM�5����F=����)���m�v��$���IUhB(�[�T�Z������ 3�~��:�7���K�����-��"OH`1�d����������b�:B�gG�5cSZ��$V
�P���mZT���nu��#�>7��ec�[�O8AZ���,�������u�����M5lc+V+V�^ ��3FE���"`�����9iZxomy��O2��^���b�����6F�r���_�n��}�9&�����]���GK�t;R������9�d�m��kUu������]�q����M�YV}�K�)g����n\C�F�G�h�/x�v�P��X;��z��z����`���r:���m��[������D�9/����sIM6���������ME5JdTL��'�&��^i���7�=��o� ���?�����Jl5��|���?NqN%��R�Q�y+"���Y�5h��t�Z}��>��\��i�����3\u�=[~zf��Q��]���y������lSb��������#g���%@�-�������-���x��\����U��:}I94]���e!�&S��N�K��e8�;���,�WlY������:��8�?�����l�",X��.���N����N[!M]5�=�f?�QV3�DW3�)m��������f�t<,s(�����6a����nN�$�
BS�b���(��tE�#
i�����
o��o�373�����j�������f���,�������R���R��&�)N5�j��%����/��������mM��+m�����`����>��]#ZFU����cX�9��1�:i�;��	.����!B�E���J5�L&W�,�����e�C`_�Bj
�����Q�Y��G$TbZ�� B�����=f]R�B��9jH���-�y]m.A���I|���/�[�Z���%
=;�vW%��v��8�U*�hC](.b9f�V;sH�,���D'd[�oS��%�}���}�g�I��]�r������~���MMK?:h6l����*r��-kZ��^mkq�I�S)��J�{�����=g����X��.����e�6��l�$��E��Q��S+C�g���@��#��}[B�KG��n����wL��\���T�e�DJ���J��}8P��t��D��f�d�5Y8�tQ�	r���N��M�ma^�{�1*��~��Y�q�eD�R(���R��*Z���=�9���1����u�{g�:���o;�]��;=o}{w��gK��x�?V����^lrL�Y+g���<��2j���D��M]>�+�QC�R�ex������MJP,�Ev�\���,�;����Q��s�n��w��Q3�M�U��xR�"�'G�����������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�w�j���:��i��P���YJB�#��W
R�����MS����C���;�N*am~^��#{g��l������-�^X
(�+�UP����k��r�et�3QR���r��*�$��j���w�\���\���#Q���;��8N5��S__���x�M6�����h�9��7�}�w���br�g�7�U6���L�FR���S�\�FLD���=���-�pm��(�����l�sV% ��`���ygi�,����GnM��IUn5�!]+N����4����E4G��L��g�,�����9���]���9�W5{3\c�S��5Sn�F�3M�#��b:�o�v��>�xI�?
�"v��~�/	2g���������&L�T�;q�\�$����;gn����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?v��~�/	2g���������&L�T�;q�\�$����;gn?����3�Pl���}r��&~*�����^d��@������L����v��>�xI�?��
�MF�5�M,�h���������U^��'���9T���Q"��<kJ���![���\���g����l��gv���k�1�k������-n��5�]���a��e��;j��+�h��$�M��a<��"��=i�o�*d��,��I�K�s������������2!��R��c������T:�{��z�Zh�M�j�uc��1���H&uQ5��j�Ib�"'J����{���8Z��
Z���Vk��>�S��Ku��rF�aa��k���,f�fY�������'���b�K�-j�Js���4u%}rB��RY{�ns����M�j��M#^;u.��-*�lz3]u�B�ekB��Y@����)7����;����E���W0V�l��NQ;e��^�����-:�v��+��xp?�=�,St)	zg���z&Ba��:�+B��jn�)����Z��|S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��H����'�,�����\��-�l�]R�S��$�|b���UMh{�$J��}���?#{T���r������Ng�]QL~YSgsv�;����WW�����43���e���y��9*���j��3��x��H���U���YK�EC8;dz��*��B�4�J��9��k�tm���w��Z�Q������z�	���vR�;v�g5M�����g�
���'���R=�����sO������-�� ����671GD������uL8�f1������
V��T�H�9�_b��GZ���r���bfg�#���-����[�e���]��(�8�UU1��31�n]X�����:o����]��0�����E��6?��d[�*K[������<{���?[E*ja[V�z�o7���Wr�O���p�?�1�#�\�_gh:$�����fu
��������TU��QV�a�V|S�?�i��;� 3v�)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������{����>��$<S�?�i��;� �����sO�����O��}��Hx��8��xw�@�=�����{���)���4�����Ot�p9�������h������d�U�|���I��[�X�t����HH�z�S���QB��J�@w�F���oVI�����%(�{I���SS�GF��@c�G���\=���w������+�{1�[#����Y/�����1v��_#����+���^f����*E�_\�E�]�
�G��:DpS��(J��f��f���v2��5�[s�n��f�t�~cc	K�2Yv5*�l�vAs�j�1�J��b�Y�]to&�k^�����tg
[�b����s����3�q*u�M�
S*z�����p�6���D�����m1����%�������"]�=m�l����0�.�n�������H�T����su}>�X4u9�h5>`��%�:�~�;(�Om��Slm��v���an��2�8Fw/l�H#�H�7���������l�[���,���m����nj}��A^V��G��VP��b�c�b���nf���EA�
��B�J��B��5�T�/c6�����m��kZ�F��>�I��B���m��sV(���%iY��'��3!�qC.W+P�"�6W��/;�Scvg-��@����oNS(�&A�-� 1�P�b�bo
(Z���l��p�?��(�S8pu:%1 h)����������VQ���'�o;���f�)�#����e;����f[�s����[��J�.$���������J%��f�X��u���;+x�a����9v��k#���Yk�!_r-�Y������
�iWU�~��VZ�u�
��;q��yG��;������j���i&^�������K��R���{�"P��U�W���F|�#����$��!�to^f������j�����-X��'Ws�D�eR�������_����4�sT���j���������.G����@�*�}O,s�ED*�����,D)T<\��e>��dM��/n2~�i�����h�j�b�����'�~�����!�U9\�i���Z�i��nLuU1/��f����mmnX\�m��[�z�Q�E���������i��;4N���S8�[�]z����h��$|���{"�&%6Vq>��"!R�
��-V���W�@���E�����U7P�rz��s�q��9)g����I���	;�w~`��N��6=���a`"����&�#�!�[ B�"���j"��tcg������`W��c-�wt%��kK����d�yv|��7���0�����$��nwUd�v�G
�t�L5!�5�a�0���9�4���[��������2����)�1pi+N����D[(�Z� �y	����u
�c T�z�s5�����[Z6kS�-����H/k���;�"�?��WT5��s$�L�
E�o\�H�7R���"u�hZS�����.�����gw�����Ak���R�>��c�M�mtf��}d���>�I�*���iT�k���,��.�g��/4�T����A�������D��>l���f�6�v��������v�V��?;K�\�n7m�����B��_�-^��-rgO�wwN�����M����z1�L�3�3T�ZQ�43�m���2�����yj":p��k���V0�$�+�Q8�����I�
dZ��bi'D�FP1iF j'Ob�*T5f�������Y�O18��\��^z�������N������Qf�h�51���
�\�2-��c�@����[����,b�
T������=��J�Uzi��#���j^��q��0����VV����������h��W��l?����Y�s���4���k��&8\��M9[Q�	�k����i��3�����1���l�dakX�5���"u�V$d��Q:R�UZ���o��c����'��������(�LSh�?/L�
��g�6����]��r�w�OO�]ST�c��LuDD;��Y��?�8���?������
�����������a/��e�>l_�e���7#���
k�{������(���\�`��][���+k�<P�@5�n?��(��8���g�[���j��UU'�������������JZOP������p������P��n;��Trk��usj�g�H��!�	�����=q�u�8�8M��Y��g������^��h��~[3N���<b�Z�Fk1UQ����M�3��K���;��M~����R]L���r;���	CL<w��/mT$��QC���)Ek�*��iJ��M9k�W��{W�o�&o���S���os	�,��w��2r�����7G��J�����(�~�����~h�"">�7(�c���o��	��Q�=�Ay��������2
�����'��2 `J�� 9�ay��m
@�SY��B�!���o�	g��d�G�]���'O������������b�����q���g�L�pE��}����C���f��q����m�b0�<���C	I��iJV��)JR��k^�)��kZ������So��aw^@�y���]���Ub�Fn���V���a�������)+B������R���1��k^�����vp�����{'�s2)��)�^UX����wu]S��+����zc;�D���<g-ap���V�$��8�(�h8���oV��M��@��jS�k�����k^�)Z����g��nJ����-��MU�T�E4�z��"|�<#���TQL�W���B�o�W�����k�X��Q��/�"���F�R��oJ���PB�uC�u�e��ZV�]k���+�s:����+��NV�E��(�#+�G�1�W5U4N<1�u\�7������ua�8t�N0������-`e{�u�]'Vl��i2S�%�j�=H�*n�c��/
��U�Dl���v���E���7�����7<����O�����U4�/Y\���
g
�'����lG�$,aX��@]�n�~�jG����="���)�^�N�?�V0������?����
����������-��[	����Y��w��3D���*��J2B����[V����L%#Rtv�L���)hj,S09�9[z�y��L;�y��E�����wcL�l8RR=��c�p-k�w�������
��W	,J�MB�5��~Q~������g�K`b\gX�f�z]�E^�!VH�\x����.��N](ou�����}�Ir����\�s0^e�/��rd�G��RN�Y�����������<��yeC'�:�z��P�*���RP�QT�� 5�n?��(��8����q�Y���w\O����h9k�vI��F������z���$:���AU��fu,��?'L�z�t[�������i�<�T�)3�������gk�vr���r����)���|�LL��,a..a[W����n����>�>��KU{n��L ��6�,�t/�)8j��q��z&��7%x������s�~�����-x��L���w���i������s	����gO�W�.lnU�c��s�����\�4����^��8c����ek���[�^��N�d��k6����d��d2f�" ��F�Q�� �(R&�
R��)JR��`G4�M�F�DtDGR�z�f�y��S]��MUUT��UUN3T��������2�Gg�g��/4�T����A�������D��:t��W/]��v��Y��
��I����,�����MZ�T������#�b";fz!��������"1���D�+���[�����v+;N�����7
q�61��a�gt�h�c���|>��������-�������M�:&��^��uU1��[EZ�z���u�Qo��g��"z��2Y�0�Q���`f�~�J[���s����v	�q���A[���b�K7I?�:,�u���Z��R��n�N���M���fb�����|1��c>|_!vfSvo�y�k
t��Z�v��Y���D�F7+�i�p�S�������=}��B�(��k�e1 �
Z���Y�uc��������C�hZ������G�m�:e�>���b&{j��}33,#�{�7�����3�����U��Z�V���8w-�1��8�[`����?�x}��1�k�'8��f8B�y�gei;}����6�=A@)�����W����B��49�5{�{��tl}>�5�n��:���j|����z��l�Z�g�e(�3��?�Q5��)���������R�U:zV8�c�� ��U�r�e�9l�A�u��.���K"�\C���Jb���dsn���,��U3�LL�����La18�LO�"c	��J��f^�/(Sr�6Bb��P���^��c�!U��KH��#��(^.E�s�y�R�l�(���uMf�����������l�LL�u����c=|+�����z~~���b�_��t���N)g��A����*�R��e �+�*OZ���7�R�J����G��C����C�����
q���s�?����`68>����q��x����yi�(L-n6Ej���2.S{{<ncV��*����S���^�M��l��MG~��uy�4��b�~�ua��m�W�����Uv'��k�������:6��D���b����N3U~-t�t�G�&m����#������K�M�Y�[g�R+S����S�&:���uwOE$��4	(�#�(�C�U�
j����y
���w277u(�����1�11S�E�l���������!�����oc����-:�{V�p��~�W����z�U������3EVfb0��p�p&��^i���7�=��o� ���?������3�/���z)e���D����-9�2*������UM�8%=��}����Y�S�o��Z�cf�s~�=n�x���f"�K��V���w�O������L�v{���"f}������1�[�DT���2�J$U'�kI��B��Z�w*V����on���s��S�f/WU?�����"�]���N���zU1��j���Lc\�j����i}C���7C���z�ja_qY��*kc/T�$�t�Z�u!��TJ�)Z�TP9kN�i\���v��/�Gr���W����{b=�S<��_K�����q~�+�L�?ED��^�{�L��Uq=	��X@�.��lE��;�j�:P��Vz�&�����1QH�����)LjR�t��:$���n���=3��x��}Jz��W
(�-ULc8N�T���1~����WWG�g�[������I���tw�w��Y'F�4;�J�C$��L�z	'N�	B��
ZP|���,���^�u
�K����\��T�8u�c����"#��]Wj����fg�?#���Z��.��G������8��'�u��D�w��{\�:����#f���bp^&����i��jS<��R�����jP��n�#vG�����z�3z�EQ�q�/�h����U��M������yi�k��=j�$u{�>�|i�	���?����
q���s�?����`68'�����H������q*���q�E���/%���:���{���#�U3t�o�"k_f��5�Y��>�7�/3F��sQ��������4��	�MQ1=1���q�&��[�'���noX����+2��Y����4�,L}���3�Ey�����i�q��-Q���������M�!aX�����Q�N���O_2U]S����]uG��TL�x�]���F�����p������}j��L���$s��9�nsg\���������SV8������OD��(�G����e�����=�Ay��������2
�����'��2 `H��M�wKG5Q
v��r���Qbz�VAc�I��%�D������G�;x�h�3�=������r�ry��+����>Jf���"���n�lS�����]�_'�V1t�])5'y69��kM��"�s4������^���H���k:5�eSQ��r�e�UI8R��(,��T�H���8���]\)������9K��sd6����_����-��z�����#�<;�S��r������pP������V^�\�Q��M��Y��W���1�����iN��p�j�-�����[�w����vz��|j����Ws�|Q�y���r\29|2�:#�4er����:��&�]�:��/���������$��q�}@��mLz�d��:H��u�P�[��1X�f�c��\��hj
*�����^������3LO
�LW3����/�<ba�����s���(���A-�
���"l��X��lel�V�������\�I^�U5;'�����
�s�"�I���Uo=�E��8���M���TD����v����5�M<j�9Y�_��z�����u`�&B���!R��-(R����/
R��8R��
����0��GDGG��-�?c������E�O��1;�+D�^�l8'��J����|w��q}��-/������
q���s�?����`68$�Yr�l���u�.5�.��gP����1�]�Z?b�<q�5@���P���dSo��^�����cw;z����+�"���E8�WdD����)���r����V.]���E34����(�:��!K.Xx�q��ci+�#���9�tsk��:���;�d�q�K��S�.xv/K�r��?f���pe���VO`�����v����]�+�����j�-�]?C]3���c]3���m�o���W;u�|"�h���f���;�n�?o�U�9�5��L/P1F�16{���O�M����d{��O�d@�������m���x<����ma���Q���	
��y��N���
W�s��D��c�{am�����U��G_~�QTv�Gz=��|���5��<m���������rb{&�'�)k�QC�l*{���k�<%0��G4�����EL���Q<ei���^���^���$�
bP����:dq����w�nO�t�n8y�=�&y]��GzU�z����?%=����j�=t��"���9�bS3���5�ksbxW���pB^7/]g��-UE����&����U��U�K���q�Wz���������fq����S5\�Z�����4S<*�E��}��1����������*��*s���:��s��(s��s������kZ��������UUuMu�3<fg������q��b�<{^!���5p��v�QU��K$��t:��p���( �|Ls���JR���kJ{5��]����UULDDF33<""#�����1���G�5�7�X�&�(����'oD���t�i��-N=$�'B�'
�LjJR�V��?,�e���-d.�j����Q��Dz���m��OT�z�T���Z2�"���3�������(H������
q���s�?����`68{=`��ic`|y�-%;U�^���o����r�b��~g,�R�D�����B������f����-�?fd�;5�c��_!z��p��5r���E3<;�G��u^���[mk���?��g�����l�V��{���v��}�1n�3��q�-��L��s^�6�:���ql���K�n�w��*�W�����[X���V�bP���!�_�WJ��p���^[�������U�g����������r��|�U��W�TDp��?��q�y=��r?eG����M��YkQ>�5��j��b0�k��������nZ�g�O��H�����?�6F�g��m���<g��s5�j��l�Y�..�R��`�H�V�*gV�]�c���������nB����6v�^����3����D���ET�[�U�D���V��l��i��Q��!�9la�8SMp��J��a����/AwwVFq[�������Av�)O�'Q���N�����3��5F^�uE���G��c�+?/t��}���v0�v��l�v{���	��3b63�:��2^j��! ���'p����4����������^�R��)Ajy�ZfB�~���L��������K�/kg����m]61���E���L�5�>J(���%2�^V�N����!�2�[8���!�2��T7o#K��ug[���?�c�BT�1��7���m����9���Fv��rz�o�O�i���=��^CZ�tm}�1N��N���>�8E����v&&q���&:RZ2�������y�L�2�zI^QV���ub\u���=���#�~�P1k^�2�lsV��Ebp�Z�]'pi��c9��������]���)�p���M?�����z��UM�rp�>����@�E�*�p�H7A3���(T�E�S�����JR��1�Z��)���:W]���&)������"#�fg�":I����G����RNe������ l���
�b�-Z�*dk�����\�-
D����������^���s��~�c���8���3��8a7'����4��1,G=��3~j��1��v�����W�����0z5������8��a!�
��X�keY��e�a�"0%X�Q����Ebt�Z���+��h����hS�l!vDk:�[�?F9l�Q�c�y����,Z�b��+������J�����tS�����������<nf�������
q���s�?����`68
y�^W'1fg�����7�����6��G�!��&v�2m���$;�I�,���U�j���$�i����]��:|=Kx�#S��cFR�T�4��
���9��19i�K�����o������V�]�ze�;L��&���n��&�S3�7�����1U�����c���6%����%���V��m��p�@�1ICD���Jt�D%n���{5FW-g%�����v��i��������!����������.x��������k��������T�GWC�
��������l���x ���?�x��"�D�4W�rk�T���jw[�m�w��
tq~8X���������2U��v�c����En�&���/�
/)\Z���_���D�h�xvT���]Z�zf��<u�3s�6���c�xq�%��V�Z�d�7h�Z�A*tSA�t��(�_�R��-)�PCU�U���s�UL��l���M4�LQLaDvD!�|���m.�h"�qf!"�c���U�J�7��P����RR�%e�q)�7J���9���*0]�����6��6���|J'���?���O������\�wsSL��V1���O�^�:�}������a�A����I���I������)���I��
R���KJp�;�DDa�Z���sr�������33=33�/(���;C���X�Rq������ �������r�j���7)1K����jZ���^m*#�g�:6V����1���E����Q����N5�T��8w�y��e�MQ���S��G�.��v�2���(��K|��Q��UWSv��N&R�5TU��
�j�M���Z�����]����/�39�^,c8�W,�3��UQr��zg���H�>=TL�(���L�>�p�����8�G��g��:8��Ws��U���S���iT�/(n�hi
f��H�)^�* .|o�4H�
��g�|L:h��1W�n�4G�"�^�����o��x����(��b��;c�q���(�����9�����9r�VU�7~�pm�����9&��S�&C,n*8qZR�Q%��t}�d1����h�N{^�lh�m=���������5Oe4F5U=3��n��r�)�fg���<���%�b@���s��
E���W��uJq���QcS�h^�D����>�������[B�g��"j����5���]S5Of8Gf6,�b�Z���%����������5��%���N��Tl�S�5)��k��@�������������
q���s�?����`68�o��������NPB~�wd��i���t����R�J���r���^�MCv(Z��*6}[��:^�������zz;�-}%����R����)��G��Tl.]���*���3E��o��;1�8\�*��=���V����2��f���ZF���p��?^����!Ww��J9-���]jk����P��^4�37�<����[���Zn�TiztDaLY��jj�"f=z��}�p���L��S���T���/=������'tn����r��������T}��Qs������s1���M������Sdo�{���@A���0%��i���f��n��GO�<6��P��f� ����V��T���5�^�8����Y���CK�V����3r:���)������E�w�������������n�U�LGz��%
��-�{g�7�� �U�f���=�"��T�C��RFA�zu�+R���R����)�����e�W��8Qn������e0iZfwZ���F�D��f�Qj�1�Uw*�i�vc����V�u��f����k�6��u3j4wJ����-W��6�z�^�i��f^�1x��nj����������/�,�aw=^4����xQ��6�S����+�:
qVKl��/M=s�b+���������3\aR�36�?
(D�e9SM2��(sP�!N&9�n�)JvkZ��UE5U�"1��S����f������k�)e��t��
�
�[������T�iMR��IQ!�$?���gy�����L�2����T��]�:���1���#��X�1���z'����}��tm}�<_��qu�^����I5z]'4j�L�b��5)Z��O��,�Y�����Vj��E�i�?��}����>����������&"g��:�c��2u����������uFp��k�I����[��T%kN�����)��Ns��Z�f����M2�����������$G�����"�����t�r�TM��E1���W$Me{���'Lb��~u[���:Qq����������n�H�K�*cR�7�5j>q�����z�c]�N�������E������bfx����g1v���_��1�E��������L���_;�P�sU���#:��k)5���5��i���3�I����)����+R/J������W�u
}{�6��?�k.]�-s�g�S=4�_���v��Wg�>n������l������
q���s�?����`68O�e���$F%���QF����&�j(��[ic���"b�J���prT��%(Z��������G����i�=v�i]Xz�j����M�f������.�U�g��9y��v���2�����b}_�t�n���q����9X����5a�-�?U�t3c�F}�~]0~5�z��v����K��7�iJ~�=��E���b�����
�������:����\����	��S�V�{Y�J�m��\�Yz��,���d��?g������������a��u$�f-obl������#3��6����3���9�?!^�8�������
eZ��L��(T�FPQ��.^���T�N�/����L�^�5nZ1���E�z��TS�I��Z��7���
,�Us��&g�#����2�Yf������{g+������Y�R�im�wJ�=�D(�u��Ui_�$�s��\���9���X���#�)��c�T�>X`\����nU�f���+�35���]XQ��c��w4+�);����������e2;�51����vI{�i�JT�sT��g)����J��5h5�w^�������������4q�}=�n� 4�����s�\�'-�lLe�������2�Gl��3z��10�R���m�v��X#nZ�qV�j�Qc
�����>�i&B��<8����y{4��SDE1��G���G?��s��<�sr�b�w.U=5W]SUS>y��>=`
���K�S���7����9L�"q�c��~�q�����(ZS��V?���s�{}��F������4�U1<m��+��r~����0����U�x6�g���u���	�/g�����}�?������t��O�cxC�J�����N�+�����T00������q=�L�Z�^������3Q���o��v�+p��d}$������y��]�w���1������e���������O�eq�=����{��DHs���e����&qGk7|����^MD�b�-{4n���b���T:��5)�����������KX]��OMxcn���DO~���Q�U�j���Q��xG��Q����Yz8B����$�j������%u;�s��N5����CH���V�QN%n���iU�%+�x�f;i�7�������s=����Y��^J�����T�����3��t�t��#�?,,o����
##X7/Al�V��^��B���Z���'��e�[y,�n��i��c��i���c��cM1M1LtG�rB���������Y9o�����W��%d��
��8_�d<�s���?�w��f�H�lL"�ggdY�f��eV�b��z��6���F�������-��m@����sD��m{m�)���;jW$%iEJ����{9���{���n����u�M��{���B����������kv����1�w��En;��r*g��i��*���~��M �=T�}}��m�6��-n1zA��#;(�`�[g�QV�L%�������]��IC��2u9QS�M�z��m+b��+sM7v��KF�wjO�������k��&�nL��=Y�]�V�7��'[A��An�:}��w���l�W X��w]�|[��u�s�:M�5�l�q��ANE<K�Un���.�����~��\v������<w���
��t��&��Y6� ��.5�
��UVYCW�)KJ����;�����j�cUS33�"<��r���v��i�&fg�"#��B���z��9�D)"�f�[,��+���B9f���I�����b�*TcY�Z��yc��g4���F[W�^�Y)�--���gsq�����	��������6��\��v���&��Kx��j����f��^{�����;�MW0��~
s�c�2�������c�b��&��&=�����TE�tsc<z�n�+^�i�7
V�)���d���;�m4�Z���}1���h�k�����E�m������h��Y���j���fSma{��F�h���G�`������x.G=����?(`,{:���]�')�����Z�Z
E$���"����M2&����H$��
9���<����T6ST�wC�Vr�'.�w��XK+k8������n��]�3.��5���{	"TM3�������:�'1�[����/�2��l��LJC`�e�p�S��o�GWE��^G����$����z�i��
�A^�u�*�m�v�)�}o��h�]��P�f@������������I�&�W�q�*��-�{��n����d���P���=�Ay��������2
�����'��2 `asc�ekDv�U5o���VN�h�z�g��fst;Id���]B�;4*�}�"Z��B�{��9���su��w��b�L��S�yiG��]�n��eg��+����^U\����HM�m@b�{lZ1�olc�>"�����3����bE�9��"(t�j����j#
O?wQ�f5<������s=��5L�T���#-���d���SE�)��g�i����Gj+9} �h6d��\
�R���\�-h#��Z4�6��b�`���=�|Z����j9-+�=h#����y��v=Z����U�'�Q�)�V�s��|��Z%�UD_�Dj:�vzs��}KUa�6�a=]��L8����dL]'���3�b�w�X0n�h����U��iOl�r�����Oh�i�<��U����:j����=]3>xcz�1���O����*;���������}�-q��>\��~1]�f.�M��s��d�o��{��m7!K�v�w��i��]����>���v�kD��k���S���5S�����Y�s�b�s�3�'�e!�ap��b3cK��}����]�n�*n������e��+RR�2���"���f��wf[fm����*���Y��^���7MUa�(���pS�����7g�Y��p�����I��kHK��;��|��K;~��\�p�}����
R�=�v;�No5��3ws������U]u�MUU=��|�<{<�B������fq�K�����c����cH�S��X7�>2J~q�Sz�����*������*�hjP�1S=\9-iJ�U*��^������;Sl�;F��E��c���������W�=���{������g��0���7T{����A1� �x[�$�C]�u�W�wln��/�!����s�����r�[���������nX|�&���������JU��N9��\�`�����U4�:T7F�!MZq-+@���.76$'�Y�E�Z�Ej�mP��s	d+&�J�7��R��F���_`�����)��e'�B���7g��R�Vn�r�u��d.���>�*P����
�f]Ou�!��L� �"�������������6U��7U����mo����n�<�F��B2����!JpQ�*�:�u�[{k�0���cj�m����!��o-����>^�w��lKU������J*��*�����P�5OP��V+!]Y�N��]�����Ye�{�d�IE-[9�������4��a��jf���#r�CZ��	��[{�,�p�W�T-�I�2d������}zSm7Wu#h����ab<�u����n����>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�6v�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6;9�o}����.��yG_!Lgj)9�rm�D�u�v�,�)��!�z.��� R+S��O�kN<&F�Z~��������%���r��
6rt��U3�
�E�=S=�����ogF���M�krfr�>�j�{�3:���DS�cMs~�S���W2����4�;[�c�R����N����Y>�l�X��il��X'm8?�]T*N������-KZ
n���C���psY��������p��/MXZ���E��p���>��Xi�/%6V��7�5�Y_��js�Q8�S����/UW�j�7����Fo�WD,���>�����_���4����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M�zG����0���l�?}�'y����`����y;�>u�����{��a�����~0��N��&�=#����w�|��6��>�����_��H�a����:�M��6^@�/���[����r�6s����l�����Rv�k�>=E����!�Z�*jW������.U���]�:+��
�+"�jEU3��1LZ��-i���Ti�fl��k���j��<�d�b���f���^(6j��)M2�!Z��)JR��s7v�H���_�:$�3��
�u�FIdlY��\��u����3��+��Z�w
(JP��j���H-v�\�e��mu�����$��+����#u�&1[;2�\,B�:�Q)�Rt�`����r�������!�Y�G�-Q��T����H��f�e���x�U*i�?|�9a�7���J8Yv�,�2��y'_v�
c������7`��n�odc�r�(��:�B2m��[Q:��P�-OT�T�(������[�&��k��*����D���2j�������T���zfE�F��
���O_sN <���)�DSsb��S!�V�^���&�%k�B��b��zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�����g�e�9��>YcjF6��SV�x��qq�����Y��t���t�iF�pt�*V�-=�4iUF���{Q�V����-D����s�L����[����3���kI�U��<[�E���>Wv�K�3U�`lQgexl���l5c�=�.{y��f*B�XJ=M*�Y�Z�J��z)N������5�xgoY���r���=TY��"~^h�+s=���������pG��l��P�L������q������0�{�OKmp}�``<C�����3�V�8�b�x�����Q�X!J=�pB7��<qU]�Z{*(j���i�:nJ�B���LS\:g�3���Q6����������N7��k�W�{���J)��{"��T����]�|����+����>������'�v}�/{w8�O����^��pH8�%��������q>K���{���= �|�g�2��s�zA��.��e�n�����]�|�������>������'�v}�/{w8�O����^��pH8�%�������4�y��'a�w%G��|�-������'jJw���D�$�X�T���6(��)�1��i^�+A�^�Z4���WZ�N5��wg�E��g��[�OJ��Z����4����F��n�������;���W��������M�%ebI�
���"���N=�����	���������
3�k����Z&�M�b;j\��������s����
������>��}��"	�k8���j[o:�3��)�QS��R������*^��C��[�J�:�J�V0��u�x�;�t��}���5[�1]�b.��8LF�8�wbj�;�[S�x��:g����F?��iE}��iA
���s&�-4���l3��������$���j�)���2�ZV�E#�nP�e�M�����3y�;�,�����
��Uk�q�{���E3�z%_�e�1�����8��G���g�?��F���������
 �ki�W�-�`�-�m\��zi��vu�i�H�wU�u\x~����z5���~�dZ�d����"I�1KP���1����Uh�1��=�b�v����b�����-k]V���k)tZ�
(<f�>5Mv��!����@��9�4�<���.������x����Z������^k8��o�;�k���w������h�iL�
<dR�YU�c�M7n�6��)��zr���W�������C������~���/\��\cK9E�&�N�k�������hGGp������^`{�hh�s����I>gV�q�����S��{�^:���k���8��-B[�Gu3/\��92�Rp��Bxyni�
�}f�6O�%��\j����A�X���= ���w[w���o!p�I�F��?EZt�Z�-w@k��W��������fc�R��)��Fz�\����K��-o�w�����s���3P�V�S���je���3�Z�)��s���^���>j�Oun`gi�r��_w�f*����r�������)O��b�������7$���&t���r���n5\�S��W���������S�Kh�>���_�����x�E�oY�8H�N�OcX��3G"������p�^5��T�1���:>����|SF=����N3>u��;�P�F��������f��&��������p�����>Ja�E���+�}a����o���(�N�\_(�\k'�[��B��;"��d�v���Z��6fN[��R�(��*��K�9MP���5�9����[V1d�p����U�u��Kq�M�\��Y��F���>A��7yq7`�w�
7L�������G!�y���<�6'B�����o��s��+inv�e}���:����������w[#8��Rn���"���cu�83�������v��i��4�c�r���Ns��U��m�v�����%�+�;��9�O�7#r��5�P�2fWE�TR��U����s]���_�����U4�^o,9�6�����~o�Y�2<w��	q��'���me!YRY������kC��!b��=�Ay��������2
�����'��2 `���X����]&��7]��+�E�V�Ue�T��P�!jcV��(;QEw+�v���������u��h�k�p��f{":e<������}��nt�l�x�J�����o�q��n����n��V�^������&NoUF��>��8��e(�0����{�1�=���-i�Q��u��*�35w1��k(�z��3�k�U��36�8�d��2y�X�ah����*�)�q���Ij��3D�%k^��W���
3
ws������M�=�\�i\v����;��b�XrOK�����*�S�#��2���X���p��'���b����� I���x"�K�u+kH�1..��j}���S��� ����xO|���6����w��b��?�Q���ixf���z��L���1�U��f������a��G@�c[�k���4j~6��.���v������)��T:��O�CV����j����(�>�z�����k��=4����6nM��������VsAt����"�8I5�Y3P������P���CR��+�G�
+����=�j�������o�Rw#8x��X�<�/{��������5�R�&����KV���jvh����
j��;��Cl�c)_w;��[��M����N�LE3���x�J�����c
g
���>����V��i_�Z������x������r���E������j��9G�c���/X������F����ER���G�W/;�����7.���(�:j����b;fxG�����8zec]|��0�1����*�������8H���-_�U)JT��B��z���	"V��T�~�r�h��{f��F{�����U��>X��O���x����x�X�}}3��������@��lZ���-{2��"���*�h���_�&���|����
q���s�?����`68T��8sd�����(�n����������&9I7���S�i��.N����L����7/���j�1�U��(�"<�0���KB�s:��\[��-\�r��"�-�5�3>H�R����9�|�r��d'{m�ww&NN�J����y��Ly
��-
jF3���xV�H��k��b�w�����<��hh�����+Ze���\�Dc���13Vb���O�Q���Oi�A�����S9}��=R�������t[s��wi�-�^�3��0�s�0�v�lj�g��/4�T����A�������D��.eYm��L�-
����(����E
P�����m��h�{'Q6�8qB��Z'^D�V�F���6o�cb��]���,G�8�D�SO��sT�I�9��g�oSm��5���a����C��N^|���yd%��j�����
iS>��
�v�=�f)�f����/F��e-k��#�k����CR�N7�����u��=�xyi�"}	����y}wp�;w=�?L����s��le���������=N=UL�6�K5�/U5���]��`�'z����;\���.��)J�c�UD�T���&�
����:]>�g!O��k����T�x�Of�����a��Ct��n����:�����h��(�������m0�#�����Z��d�����*}KH��A�bT-)D�e�I�R����h�V��?b��>o���{yj:N�m��h��w0�o�%t���f��9���T������$�~���c������8����XsX�#+�\�[�U�-�n�*��/*R&��e�r�������n�cW����>�r�pY��w��35�1��6��3���cD�T�h�+���]���)�F8�W��lP��9��m�wq�� �����zD�u���J�*�����;��
(b������w������31b���L���&{�:��fk����c�!�g/�f������G���5�j0��S?]��k��5����K�}`��N<��>�]���6jK��\K�#0R���d��RF���UJ����#�����{�P�Yi�2�1�Uvc
�DvZ�p����c
�^4��U\�j��~�GW�04�(6������ZV��R��jj���)N�kZ�&b#��%SY4�EB*��"�*���j&�zDQ3��*Z���+J���Mt�tLLLcbbz&'��0����]Vm�z3M������ZB��������nb��(��~_�i_�����
q���s�?����`68��;F���6G�.��8K9�dV���>
���
�8��X����Gf����
K)�r��85Jb�S#s3j'���~'/�������������-�lW�<�����
UQ��:���b�q������������9KUEq�+��;g!-X[[�
��.���[ �q�*�5H�(���m1�s�,R��\"-T�-E\�ZvMZ�[9w��Y��W�*���N�y�������M]���=����[����������OkS�-�����,��r���n�4�q��Wb*���4c����4�������l���x ���?�x��"�D�����x4VQ�������d���dx�3������e#��5��O�n���5�v��r�po
�[���!bz'�{	�4��L�8t`�7��y��f8��UY���[�-��cTNw_�G�;�|o��<�"	,��j�=�W�_�&�1}���l�b��S]��jS��������t����{&�}�H�&<���W�o +��5m�_r�����'���/�8D�������������,�Ed�B�A.�{��V5��_���]�D����&j��O�D��xi��V��M�����)���*���j�3���������-wo�w���|�>�9F�� ���;w]8Z3�A��u��}$U�C� �FR~��r�f�?
��(�+J�S�#��?df�^[�7~.U\O�����vw�����z:*�E��e��GES���?3��^��F�w�k`M�����-��RW�Mh��U�fJU������	�:��5�kB��
���3��\��ztcw1\S�1E<f����E8�=�O8;��]�����2�M�fBc�B����;Z��B9�+�����p���JP�8V�]c��G9��G��F���'/����l���)��:j����j�z����cf�6m�n��a�8���}�������q���G@�r�5��9�K���!z}�%.�)%���G�)��^��M#X�{oo�����������1\����>�e�s1f���Dzx��-I�9���,��s�N���K�c�~��R�=���/l�"mk�f�1�I�{=_T�O�n|�\������
�[/G�q5�0����5��'����-K^�j~�T��R��G�b�]�P����c�����Z�����m��,�h��&����^��P����+�j"��g����������q����u��Q%�z7s,�(jE7^�N)�uI�j>W���M"�������JZ�E���]�o'�������\�MuSo��~[�i�L��
#
bb��Q�q����{1r���x�y��7�:H �dl�$�n�$�AHT�E�D�I$���)KJP��8R��
��E����b�i����""8DDG����"#���wr����
q���s�?����`68'y�?��]�Wi]��g�8�!,�f��1��1�|�4�=.�Ul�'m(z��R��'�R�]��v�+��S��Y���Fbu�B#�S������W�k����j���uGKe��rYm^�����DU������5a���g{����f+�]y<��OM�����+�D�GAEFA��B:"=�TT{RQ6�#���m���SI"�/��)Af�E������b"":"#�G����fs�����sr�������j���j���������� ;���=�Ay��������2
�����'��2 `��f_������2���u�B�\���f�������R=C�:��J�Z��6�*6G,t]�W�f���q�7���f;b&c����y�ms�3n�>��8��FW/��nD�DSN1?b:���W^f5�X-��&Q�a�2r9�2K;�O"���,��^.�:���Z�iR(ctT*�+�F��+�t�>������fzf���>h�<���{o\�����H��3L���J��1c-�U1���w��0�&�����
4l���%i�R���n���K�V�������zN�\�>�T���?4_��-Y�#��]��=}����<��Es��k��������b}�:k��i���?T7c�Z��C�2? ?�?g�~��"_�����q�2D��#{5�[m��$�%(�A%(�������"�J��^(��5+�����f�����������afoWEM��{�5LF7�"z���&>���Y��h�1L���������3m��z�i�������%Z��m(��#�vz���Z51k��dVS��Z�k�s�`i4��^v���c��<;sZj�SsT�[���|���G�9�]�z��?��N�"B�|�}�K^�VM�}$���
u/�h"mk�?V�5Q��-X��+�UWj���Q�����������|��}���[�g���U���L��SF@���d�NB�`
������_�Z��"}g���^����v(���S��1�4��w��]���P]�f�p�����?&uL����2��9�P�:�9����sq�kZ�5��0Y��f����:����<i�i������\<�0~�H���C���*i&�s���B��!{5�k^�?��4�ULQDL��������8�a�{��+��O
b����%�su3����:�^��(��������iZ��2�����Ul�v^����p�fp�����c���e�}^�;���a^C-�k��Uq�{����r�N�+@n����E�o.)"F�YJ$��"�j���b��t�8��c��;�����
q���s�?����`68����������i��[~�M5*O�l�FF$be=iC�� ���&=(2���������Uw#7z�+��������vSj�5��z��e����F��9��4����U6��7o�����q�+���j��W
���X.s'������<���;%��iW�:�s1>�+�)�3YbR��(xv(�J�/I�5��s��{<����^V�4�nF��S�FC'M6,wz�kV���t�u�����j�h�Q���LW�8���-�TLw�j���z�7f0������*����Y�:#q�K�=�Ay��������2
�����'��2 `�m�`G�fi��T�:��	���L�*�\N��6�E�
T�~�z��FM�4J���h����E]����s>N�J��5h���sU��6���1�Zax?����h��Q���m�{��5%�Y��~��������T��������H�P��LR�:���|���e���\w���b"��<�5D�����zO���fs����j����	�E7������1�>�OGz��beg1L�@7 �������th��nL�T��VE���9����*��)��-+Ag�U���������o����b���8��!�v��n�s�Q1��v��'NY:H�:f�f�P=8(��)T�IJ}����+N>���r��7*�z��TL�Q=1TcO��XT���zz�����{���?��!����=��/dT*���|�E�x�g*���@�Z��R��))^�)Jv(=/_�f&*�r��UST�GDq�����������<�K�p����w��.?����y��*j��{>�����������8���7�C�w����u�[jc�H,����y[�����K��j0-J�^�)���SV�v�^���_����������1��c�TG�-p�=�����\����{�����fz=�y7<�t�g�r=Gl?%|����^�H��%
���R����3n��� k������
q���s�?����`68c}e��uh�lS�����9��op���9���������TS�U,���:5�*1�k���1����SnM�ff��n�:&�1���������8�v24]�����ZH�o�~_�~�/`j�SsD����z�W����Ub�z'�����2�U���]XaL�����5��8�8� ���e�}��(N�dK�������n���r�d�J�����b����h��{+�S[�;�|z�j��L�y"�hNgf9��={����g35�_�8�em}^:#�������UO[s�D�@�=�Ay��������2
�����'��2 `0s��0Q�V�s����~�b�\�N�
Sa��sM3yB��' ��["�
�����8R�[��k-����9��l���{o����4�������K�}���&�����k���MQU���������Q��Xb���!�v{$23|��W���.���Gp��6x��-N$E�]J�d!�4*��8tiJk���fg#sZ�x�u
��s�T�v=�����h]{L�������4��b�����]�">�w�MU\����D�ZQ^�����q��{oeR����4E���.��������e��%�M���)N�W���|�������lQN�W�����'$W5��V%���uGo��������";RG@�B�����C��g���4���O�����;5�d�����m{��wCP�B
�����V�"��8���Z��������6����4����}qj�w&<���<�����\�-�5y�������t�+LG�X��R�����,��v+S�G�P��^	��]�g����'}���-����37�D�1��-E���U��������5DQY��F?��E���>�l8N�����o������k���8�kSt�X��SW�N�t�JJ
��[g%���_B�a1f�Z��;�*�r�~X�3���N3�r�i����=]>Y�d��������
q���s�?����`68��K�8����7c<vV�)Vir����c�)S���xz���P�W�S��W��6��U�wL��1�+v��=5�G��)��������5<�V�p�Wv��3��f��S*�b�|�9�S%22����V����V�O��ff���,%	C�3���f�(c&WU�S�b��=�����|;�W/V{S�&����=��U���i���������M���e�~�7?�����������|�:�5ET]�@�b�^s��.[�5w�,�U����L�LR����&��^i���7�=��o� ���?����J�D�2VJnR:9����z�=�%)jcWN�B��+Z������"�^���z"���|�����Vh����)���b#��
!���4�,�t�t�n[��=���]�)�������k&���e5�?��Q���b�_N�j�]��Y�#�|I�p��2�u>bl�*f���.uQk�O�;�1��f=�%�����6L5��l�[1i@�V��������6���VC��p~�	M-JF�5T�~�)�����j�����\�b������CS����E,aN^�UG	���k���(��%?{3Z�����I�X���+�F�M�;�]�3�����3��n�i��c
�D�1[>=�K1q�Pc��|{&��&��3D���n�{"i��!i��)JF�i�����"0���G��]���1~����MUU3��US���\��3/pvy"c�E�������=�l���E�JR�;k3C����]�5�P���
Q������;p���My{���-G�{�=��6��������������Q�,t?�?����>�t�3���g�'�������Lp�{��rS�a������A�sG��nz)6lS���P{��������m�r��)�����DD���c����g���^�l%��*����b�i����v�P����sSHp��Y���'E��05�+�#9ks�y��XR~���*�Z~n������?��6W-b����I�Z�j�U�RR�)N�U=7Cq���������of�}[��R����y��s���2����z�D{��6����{�j���W��5�����)�1js���X���g�m���KZ/'��a]��9���y���8u�+�
'�n�����=��������1�b���1�H�-��A���j�?p�v�)	O�-(${|�V�X�QM�)����i�4DDG��La�y������x����9B���-�)�alK\�(�	V�=_\�+�������n\�H/o������
q���s�?����`68K��>=��jM�K���bIU�%w\Q6�>�����Y"����-k_�Jq��i�6��_�������3��n�����8zV�S[��<�������������[�#��s�����h�<Y�]�|\���j��,&������������"KB��U����}�5����2�[X���G+oI������M�h������?�LG�	�������4��~f����1�d�Ur��N3����\�"g
*�|������L#gi��C�0�z��uq�����p�c_rwqVU��BU�4�
�����.�
��V��=�ymUQ���g9��>�OJ��b{&mFb�����n|����>�����4]��)u���KX���S�D����m�=q�W�b1�cc.w�r����\��{�����C���s*���V���h��e�)C.��{����i�W�_���_��9����f���kP�i�GEqL���Gl}�t6/'�j�h�G-���W84m����f�O#w��SL��bbrk���LW��}h�Y�r��7����j��)H����+��s�j#^&�sv��)W4�N��k�9k���jb�������m.�Oke*�4emQMtGdWW�v��S���h^�����Sqf��g�v�;�����]��MSn��,WL��=�c��60�y�\�����3x�Fs7���:����U���
��*+���bSP�+F��|��tR���D*D�m������c]�W��z�������k�\���UU3US5UUST���DDC����G6,����tJ6����O��zm���,���L�M4�G�n��h��v(������J��������?�6F�g��m���<g��s8�i�xJ�N�F�� Z�w����2D��H�U�����)��ja�f���������ODST��1����lQ7/USuLD{���3���b����k��lS���-g#�'�t���k$��H���w%�>���!�����L]��Wf�]��Y�<��LU����5^e���1�����-cv��Gs��b����&G��[kd�1J��F��~Z8j�v����%��v���c7!��i��8��sbl��O~���N�~�}��Of�{��Wh9�fo��g�?S����n�b�V�����";q�<����l>Vv�:[El�4~���cif�s%�����T�
��
�:'�sQj�Sv��1����z��xz���Y�z*���31�Lwq�z�YLZ�_�F�k�[�5�m��5Nb���g�b"k�{c�K���
�����u��O��HT����=�>6�:�v[�)�meZ����E����z5������9�r���&��h�g�5Mw�<�U5G�q\,�*rB����%�r�
�B��h�z�*���j��3�w1�/]�l�I1������Jj;c��.6�����{a�F������wG�kZq�Dy������L�Mz�h���sT�GdG�NI�����L���2��~�M�B�[�������������j�����w^�R+d���2$<M�se\�"�����e���$Cv��k7:�!�S�V�I�)kCRh�v��z�r���9��U���p�:#3�z!`�77s��M����������u����S4��WMu���TS�D�4���3<7�dH���e������%������a��u}�V��W���c�y^��a��F������D��ws�<9���SqC�Z�r�7����*���9�R��9�B�����
R���_`hDcT�Sg���b��go���9��J��7���~�S��j[r,���Q��3d�-8��Lz���+^���^\o}�V����*���E�0����1�UV����h�8v�G���VW-���R��}�[�W�s���;��:;(���i7H���%V�=�u�	cF�r���^�������4�z�4�^4��;�����]����#�8�����/C���-)1|>O�j�tK���W���c!h���\��;�D���+aiXW��s=\u��8c�Qn��%q_�g�_kJ�[�15O��?��[�}�g��R�����JZ�����D�/�U�2P��5�������%-7G�tk>��������h���b1�,���n�an"�4`�\?���.=n�c�?�����@����
q���s�?����`68�#%�yiQq���r�E���'��]��������l��\�9z*�]]�T��#����r���b�m�OMULSLy�p�hg����2�Z�;j\3L3g6�6���2��S������������.�8��MJvD��9
�m�k�y="�������+f)��]���y"Q.���*����f�ky��Uw)����Wj��E6b��O���fb:��=e�ao��,�]�-J�E�,�q�,SU���m{F�
����*��T�ZR�����=Sa�s�������r�m�MY=:g=������L�xZ������������-s=��T�N��Z��O�{j���v��c�L�WN}?���n�H�n�&YMtd�uXBj�"�jF�SR�3���y&�O��G�����x�bu�A�3�����������4���Qc-_��8�����yJ8u�b�_�������T�������Fp���N��s�D�Q��2���:*��]�c��6?'�l{;*���������p��w^�eW�
�hj{�(�����ej^�.���f���N&��Q������}�fdt�������^��wg�cU�i�����V�<%~�=���w����������[�fc��'����S�����UQ�Qs;���i��z�'X�����,����Wq�����R#�-X���	J��U���^%�[�fn�4%i��������{�<��z��T�Ew��X|_���1���p��5h~�|�����>�\��{F�q��y[y�����-Z�M��35f.��q�8D�aM���"����d����&�+�*�C*NQ�t���V�U�	��j�/��iN�����g��er4U4�M�nLa�c���g�}�=���]���>j���4�o'4���g����+��������B@��Q�D[��0-�Z6���g���)Z ��H��?jZ���Vh�vi�)�����!���{R�U��oW��WMw+����US3>�r��J�����?�6F�g��m���<g��s8���Ku��w�Tj1����i��Lu]�9-)Of�0����9��g+n���E4S5U>h�������������tGMULS�����e^g�G�;e	|�u�6�
�cv�o��p�Jj ��1�KZp�L����=��W�����g������������v�^�����pb��}���FKG���~g���w7\�dx�N>N�7�?�	���p���xe�I��E��[�.B��J��I&��;SQDk�:T�E�3g��zf7V��Wr��u����=qMt�6g�\��v���h��D]��9b�]�V��6�1=]7j���6�:��l�P��b}���	OT�����&�����B��R��Z�9����C�;�����?������)���c-b����1���;YU�e����y��]mQ?/�SV7L�6��i�#�����;��1����Y�~��;� ����Z�r��'��ISV��*x���z��Z}�S�^�O8o��>���{n��/M��L�Mu�X�uLE3��g����z�r����S1�����-T��S��������t7grHe�Zd����g�#��|)k�x�%��S����H�����*�G�����)���V�{���M��3���D^���;"�f)��&�g��[�;����^h�UT���_l�=�UU����b�/��*�]RL�B; OUr:Z���3�M����W���p�n�����l^?����)���R{����]�&k�{x��C��Gs�\���X�)k<<�e�����1^z�����c�l��c�����)j����`�����E$�k��h2K9l�Z��^�4Ge4�~hC����k|}[5{5_��r����3.�=��)�j2JQ�E�1w"�J���b����lz�Z�:g1kR���^�iQO��X���d�T�����*��MQ4��18p�Z�*�i��c>.�f��_�J�����]*R�~�)���JS�(���������=g�}����z����O�rbnO��y��X�����u���v~��2<������q������
q���s�?����`68����J���������|����v��hUnVRw�%xt�!����Z�(R���=������������8�7����O���{���,���59y�n�W[����c(���U�������L��h�g�s��������E�~�)6|J��5g`[+��hESq"W���q��!>4�P��MKd�]�3���t��<j�X�:�v?�)����v�=L�d��h�p�W��Vn-w/\�Q��e�G�����1�=�t����.�>z����M[_P0�j.������"M����(gw$�O���|���o��+���^�q�7hW<��k{�3OEW��?'3t��nf;�������������5��K���h��!U>��w~��h�uU�Wc%T��j���g�w��2���v�������U����.:�Y�ekT��m*����*R"�5�?kN�i���W��=���7.4e��+���1��~5��4���M�s�gJ��e��ll[�fy���_6�;��4^�!�x�q�����}�����u���=����Q�������U.���-��
�T�I����\�N1h�f����iBp����/��`\����5=[c����g	������OV����4i�Jrn�YOfNOm��3����V��z���)��UEh�&g���8��K^���������vU�=�7�����9�9!z4Y3���n���E�/g�ZS�)G���gie��T��������G�!��loibU\k��5f�t�3o)1���=S6"��Z���JI � ���!��X�~!�85���g���
�,�D�b��-aj��4E�4��DS�G��s��O3VsR�s1z��]���\���f�����@&��^i���7�=��o� ���?������0��.I�{~1�*���&QLPL���v���ZS������g5Ws-n���M3T����������)�g�w������3/sQ�L2WiO�{v��g�x\t������kCUpDQ�iJ��x�������J���o9������b�G��MW��^N�E�mM����6���j�8a9|���8�_�����z�=�B�|���NU��g5J�Fi��R�g� �z�m&�B���WHW�i��k���l�]�s��Z�~�C'TQ>l�fm�1��r�,{6���Q���tm|����u+sr�:{�l�\�'�7c&�!u���:,��������Y�m{�dT7�����s�1_t��%k��s���z���6��f:.�����c�lX�-��'��3�^N�N��.kP���hZ}��?F3Y���z;�4��p���Oc����m>���x��zv��n|��?
���/7l~���4g����kZ���y���9�h�,La�iyk9X�~-U�M5�Z�������Z�Wb������4����������(�5\�G�b)�&xCq��$�'�{U{�;!���t�oK�����)��`��F�d�^4�k�^�V��:C���z��������w{���.�=xw����_n{Jo��^������w/1�Q�dlY�#����f>68�o�4�Mj��7O��[f�zM�C����H��,�����5�V�Z�k�|����"#'��o�#w*.����7EUU�5��o����4��"���+?��t�����&[!Ht�:�u���������M+^ 1�S���6��������
%����b,���e���5,�:,�����\%��Vb��LT�'��F.����<2J��O�Z����vJb��1MC���b��)�Zq��Z{4����
q���s�?����`68+����h��r�U���!�Je�^�l��hzq'G��&cV��-+Z���h�Osn:��B�o�m���c�U�wi��1�kxm]�T[�5�V��
��.U�x��L�E4��+;z�����o���K�5�2��\qm8,7l�B��W1��d���y�ni�R������6�S�q�Z5Tq��y����<�L�f.�����Y��������/r����_�w�������=]�CU�'����S5�������]��ukh����;��+	�[n]�kT�xN�5mBW�Lb�hj���xT��?y�\��L��������zfN�������ng����`�h��������ya���fsU�Z������!�����f�c�	�������[�R��9Z�"���l/	ud�v\z)-Z�Z��q"r�T��Z7z�jW�J���MZ�|���DQ�����K}~���3�������a\v�j��z��?���&k���������-���F�5�8�me)��]��"1��&#�jl� �_��J[f6�"di���q�u�����G�W:�OR��S�E&��8V�'f���
�f�����S�b�E��X�zi�������c9�=�y#��b�b�����E1M9��Z3��i��r/�E7h�8L�5q�<e.8?�.v-Mc������e���*�)M�~(�
z���|;<
�bR�xR�8R�:_/6~����TUTN=������{�}{b�G�
k�[��6�S��YI�)Gw�E���U�BH�� m�����$E���q0q��c��
�0"i��RPf�Z�D[�LQLtE1��
o�g���f���z�b�
����]^z���}2��������<:��R�Z��k���b�%�N�����x�������4������5�3�qN.�]�G��H�*������zF/d�/X�8��f�����X���X����q��S���V��v����������G�2=���SP�m�^5'��O����[��cep�F���zs6��MKV�����6�������e�Nn_�k����\(O�t�T��_j��~�b��NUX��pdz�
�*�����%[�oQ������l]a���k>nT�S��3yg\(Of��v��Z�{J�?`Yo�A�w/���3�g���]��>��R����9�g�O��[Wy���;V����Cp�R�S���h�:������S�����_��'��j7/t��bx�q�O���)�}����U^ku�-0����/JR���D�H��(��rz�JS�R^�Rq5c���P��������/c�2uO�5G���;�D�
/U��>�L=2n�����C�%j�LT�kM�7�x��+��c���
z}��\�u����G�X��8WW��q�r�?��y���q}�~�������z��%(r)��������kC���UxR�;&��;~<nl�w��������{��t��up��G?����Vb��q�2Sc6@��^�^��g��5<D(EI����;4kB�E�iZ���sw�����l<���N5��	����0���2n+��i#�^��v{+&�������������i��9���B-�F�{���J��-xT��<M�q��/{sy��U�r�}_k��i�*��v��3r��TS�����;��F1������1��FgO������nF4�\��$a��Bve�c�sV!��9���M�q5����o��s�Z6�m\)��A������.z�6��QS��L�5iJ�@�������n�]�K��m��nG�����MnI.�Vj��g��b���� WI'���:}"�@lhM������Sdo�{���@A���0��y7��u��9���S���}�m��xq��i��-M_�ZW�~�=��W+O3r�quU�y��K�u�n�X��w�u����r���SR=�O8�	��T�c��d��38F�������4�	(�RjZ(orE{b��55���n���Fc��&#�j��O��a>�`�=�y��[���24�3L�s��e��:~]��a��-���=�u���OZ&�m��7�m��U�|�cU&�p��&J���;+���P�8i�^b�w��]�r��p�[�_�G�w���3�7����)�M��73�q��q��DU�>W�s��*��o��n��N�s�b��.���Z��JG�
7pzT�����x����8V�������<�LLO�Vb�:��&h����y��f����l�u��z�&����#c����]����*�������N���'7�;9��
3�������o�E{*�4)*���
v��)�����k�.��������3M��-LvM�]�j��bg���6������������e����{i���z����Z3�*�{[\�'�m)Jj�h���S�zT���^����9M��rS��Q5G�W��j����������Z�����_��Uz#�M�����p��b��x�(�������i���-(�6D"e�
R����An��T���i�����!��y�����n�z�]5WT�T���fg�r������Rp��nN>�Id������G���O��#�1�
���������kN�S��j5
u��S����]��=�EsW�l�7�Vh��r�����Y�n:j����u��S�^��|����R��;q�AOc�?\��
�����j������a8O{1f0��5��Nc/5���}��f����1�ru���������h�c���q����E��1v[X��w�����T��t��R������o�X#z����1:���:�%�O�%�T�����`Zo���9l|mo-��p�j��X�}^S�d#��>�������+T�5���k_���+Z{	����:U���[���*)�:����M��-��~����?/���s�z=U�4��ST��f��(�K�_�58���������w3�.c�2��?��=N���c���>��'0������#RS��g�nUV�
��qI��}�E%>������0�������1�|d������u�)�
Da���=kS������V��\��[���
��{#���E������������WD�{Z��n��U�.���7FT�BB�q;e����j�
vj�USP��`����s�=zp��]b�=9x�&;q����uL��{��W���2�/�4��u����}S���}���U;�Z��{���T�7����*�����o�c�>�����W��lN�;5i���&�E4���6�:��{;��J���_�Svh<��|��8eve���s9f�'��p>������MP�S-n���-a���������G7[_��N�1��q�=��Gh�����������L�==�&=_�}�T��z���|�W�;[
k��I�u�T�}��V+�)O����u�Y����-J�����8���~s��'�����/�+�9�b��x^�:}"��}�T��*��.�G��#�}�o���la���|�xa��g���~T���=-8f
SW��Qd���*��!��/���^�8�F����������\������xZ���������z_�����T�Mz��e:J�����e�B����W�lsS�w�#3�������T���p���>�?
�1���[�#h��B��[o"��9f/���c��I�h��8�)�=:r�j����K���J��y
��y��Cv�]\�����Z�k����8��#	�8c�qw�)�����1�;����a4�`����
<��S���u�6�H/t�]x��E�uU����f�uh&�>��Q���n$�:.=� "���+�W���1%���e����������9V����2������.Ks|��L�E����^�;I�ff��E
��T��=\��3*l9�'��^�_wX�[���_�&��A��<��)���"���rn'X������=@N�
q���s�?����`68���kUz�2[����J��E^���
~�CR�+ZV����g-�����h���TS���]j��"&����px��
�Z3�������:���t���=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~8��O��.�|��|z}�;�
�Z3�����?x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>����-�^���������]>�������w���g�{_���:���t���c������o�����~x��_o����=��O�~��F����}���}��O�x�>=>�:|�\����2��-������R��d���hz�]j�iZV��b����V�ma�����Gz����Ao1��r�V�S5Q�z;���c��:s���F&�^gX��=R����V�S�RV�_���Cwum���G+O8�-t�|76�X�v��SUt|(���:��K���s�����T�"t��o�9��!K�?f���s���3U�k%LGN9�<?��>��a3���bf}zxDt���{Ov70l�����������c���j�&1�Uc��x��J����)Z�/�~Yt����k������o��7k�Z�;+�����q�^����B�����-+�������~�����(�������=��y]��+l���pd&<��uO�L��E���L�����#�Xc=���#�8C�����iZ����S��_dO�B��|�����r������{���7���1g������T7S[��-��:R�/6]������D�F���������_&����Z��g1T{����:^�{J�}���L�;�G�0����\�<]�n	��D�-6�2H-�-
�M9P^���-x��J��k��d�5���������<������z����3�������2�nEE�2�I���'Z��q(n��/J�Zh��+�������+���}�9?���>l��>lh���ps�kfx��g�����L��T���'���������K��5i��
���F���L�x���������}�V��s��+��65�{�
��Q3��7P��/����������g���F5�����i������S��j��	T�S����8�RS�U���Z���O�+o�}����fn�WO�����[�%�g���3������q+������5�Q
����h��"}gA'6qC��D�N�����P���������������VY����gN�������T�7"b��a�L�3���]s��-LB����XS�r���
�����5����7��1�-��]���1N��j��.�]��|�5U������b&b�|&x�q�Cpx�Eg
[ZM�x�����[���%�����(z��;`Q��)�]�?wl�F������'�V,W����N��������ux�������f:b'��f:�R\����=cm��d���T���xI�I�BQE�1��'������G������U���>�W_��}��:���?���9{hflZ�}_i���&*������c���C���Te�^��*NWM�,Y��8:-�S�r$�.'�������=���Nb]������S�7g��p���[���������'j����\�e)�&��"���E>\p������L������5^�)�lX�q�������J�

Z��z�P�����M��G��:���+�j���r����x�]��XLp�*���Ur���r��p�k�]�i��=������8G[e�w����dv����Ok��_���!�~(xX�U1j�X�hRu3����U�J����8PH79��;o)Lm-���7f#�.}��z?N���+��]xE���E�F��i��y��F���S��N�L�a���t\�����������Gs�W���.��^J�3�TuE
iR^Y>�{#8�+S�����/�)�Z��IJW��#]������}���yy��X�L|_�����vDQ�t6������'rsk�<���{5������f��U��}�;�����x���3��Ap�+�w��}c����1�Ut.,��
�'*���m�,��8vz%I�iJv)�N��s�K�g'�t�i��9g�_51��Z�����w0f�n
b�6�S��Y+�����cf�]������A��lE��������I�2���a�b��Oa6�H��e���e���+f��gii�SNn���Dfpk�{p�'S�U�����/W8�r�bnWT��]W&��<�������
�~4����_����e��'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����<c�?���|6e��?�����M?��?�'�[��}����~��w��z�`�f����^�n�d��z5M3�/b���n�i������[���7L�z#13�����}���i�����[�i-���T��;oQ_�Ed{�������V��g������Y�������q�\���p��q��M��w��^�>Y�<�2����w�1��8bx�T[�:z�z���2�LSS��n�GX�=�s5MW5m#/L���5W4�7�����.#-�
�������fc��_�b}���W�kE�J�cR"�N�MZv:��I'�����9�b{Dg?��vZ�<g��G	�������gI�������V����u�e������?*�U���SZ��H���N���N>�h<��<��3Vs�c8Z�SF��c��p������q��W�[q~WC�mF�_q���fU�h��t��M�UJ�P�����i��rtf��e�5k�~�QG��?
xvA����}W1=|&#���'�0j�C���/S����T���7IUS"i�:\xp����<��e�nL�{r�W���f������z�#�lKq���W����=�h^S�|�2d�x��W���z���qB�e��7��E]>�����31�����v�	���=oX�:$�k]���e�4��iiS��|���b��}tO9�*^�iJ�jv+���V=�97bf~��\�����������`m�?��>z���v��q�M:\1L���n/�s��S�R�E�P��%�+�E����&����X�>Wj�����}j�6f����Q>y����k.���x��K�B+��E_���n���{����*r���N�1?�D����UTm}�o�d�G�}�pg��[
pi��t��x���9��*DkZ{b�!�����,h�*x��
fx���U�h�M�e�G_�t��}��g���v����~����8p�)�%Ou��g�K;wo����{xN>��t���Lq����d��h�54��9��jZ�V��J��*$�hcS��J'JvkOf��k/b�af�h���G��E4QO���4=����&�E[�����e�Vw��i�]���2�E���y���&6�����mI�v�i���#����?T�U����5��k��>x|�vK���v��c��������GZM.l31nD&F��F��UU%����,�5Qc��D���16{��)N�k��5)J}��3��V�LXB��)�S��SQ�)ZV��+@��q]����������v�v�77�l#wN��/����U"�N�~�kStiZ��J�����Vc1�f-e���b��(�L��Gz���{1��USE3]s�G\��u�<ua�+8���[�����g~��~�c��~����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���9�g�ykwPl���/��|��Yo���G�x���Vq����u����������>����~T{���7�k�ykwXl���/��|��Yo���G��} 0w��s����o�
���'�E����vK�h�Q���;��9�����c~����k�o�}m*H�w�a������{��h�������������|0��p�@�����Z����_[G���]��h���e�w�H�9�7l*��������1���j:��-�n���c'�q����EX���Dc7h�P�}&u������_�)�y��+��]>���������y^�>=k�C�?���r�����N��>T�:��z�������^~������=;���PzL�������t?�y��+��O������C��hu��}j�~��(b��9��7{��C�^��59sf���g+��'�F2�u]6��o�����Y��?�����������s�:}���}*K=o��g��/�A���?�Yo�>������|�=,�����X����,�}e�\���_��������,�b��������s�|i_G����p5��	U�
�J)Z��Q�W�)��*7@������r���D�����eUO��]j���~b���=?L�_��l���r���TGN����������=��}�����_��K^�#.C����NFU�i�4���yr�&c��<;)�1���x����b�LOdO��/�z��J+�j)n�8�HD\�T��%YS��+��)��j�f�XuSE��Dxn�yd��U3=�MS3�*���h�.BY�k^�����NzF�[S��8���V~��������N+3�UM������W|�����L�%���'N����	�xt~��
�xpU���4��.W��/zc�>�K���Q��=��k��1�i�kB=���?�K\J��5?�-?�_����#?���Ly����{*s�n���6Fxr��"(c���T��a2��dL�������<g��Q�9����-1���kZuUDU\�c�{�LG��L����9�a����;C,����>��y��+S)�/�&�xp�:7J�{�J����+�r���j����D���c�����h�*�s3�����$P����X$9i���5-je�ij5����RE5�Jp�
�?%��o�:��UQ���O����f9\���Q����l
�����t�^U4����;�^����*9�{��=|�����z*�)8On�T�u�P��U��3�6b?$����ze�kV:����*z59����k��R��j���+��)�N�)�S�|�{�N��M]Q�j�fz��}*�����{�+�y)�]�����<�3������EZ�h�3�N���T��Bq&gG�C��@/Z������^��t��^��kU���l���������ofs��:h��3�WNf#K����7�7z4z�X�W��q9�Njt�)��e����JW�N���=��<�����.��.a��Up���*����������dr�����S��+�u���e�fZL���I�����5)��U��R-iZ��~������>����?�����
�z�,"�.��M]����{�������`��m��QB����gW��S�*-N�$c��t��+_h������;���	�������U��z1�����D�|���g�p��~gNK�3��x���T�;�sJ�����MgM)���8�^�}�����+������:�q^<?:�unRGt�~�$����������|�9���\sD��_�tmIST�C�'UZ��
�w:jS����j��4���,�R~s����;s>&��\��7��>NZ?+�S2st�7l!��8��J'���,������Z��[�~�
t}��9�?7�Oz����b�g5Ub����[~����]����y��-1�d�����z�*dX�l�������T�h~�h��N����4������S�s���7���R����(����W1�:�1��p����f��L��+.��,�����Sy�Xc�kt(n*��(�!�N4����+��+�i������;������=4e��\��*�\��2������,�wi��!o5L�M��j�����mc��;�CX�e�2���l�p.t�,�*�[Ub���%Tj�:��z�V����+��w����)�5G��j?h���j���N4��[5i�{g�}�%������Zu�H����)����&���� X���}�4��.����2�h�9�Q��*/O��Bm�k�j{�Z���/6�o9i����e��)�~�j�p��"��<�>TQ�n��������������3r�?+�b��S��t���n��Mp���_te$�RFD��:	����K�g�^�nz]�knd����9z0�����g��1���=������MMN	��";U�f�����R��{#����TaF���=S9��#�V>����V��O�b>G���k�����������o|�&��v�T����^��Mu/�G��-z<{==>�c����h^��������k��/�a�����7����)q:�=���.�/g���a�	w��I����5Xzx��I�8�?G��H~a�}�o
z����WHk��l���[SU3tz?��������~�w��sI��W�v����p�����V��2��isr^��gFW��IY�O�{OR�=����?dqV��	r;��iV����W�	������Yn?�/laf5
�{���j��(�9|e�J����TG�SR��P��>����k�dG\�R�c��8c�q��]G�{^,����������^���������G���>k�V��>K��ku����V�?�P�cH���7d�K�i^�+�/{���t��V��<g�G�<��>������]�u�3��;U��j�n7��Z����P��J���c��>n]��n����2v���c�i�MFx�g50�W[���x?�K��S��X�wn�T����j��S����#���h^��z_��)g����}�?=9��S�5wb5
�w�j����F�M��z������V��_f�;>��9a�:���94��r�i�v+������_&=���W6��}���%{�b!Hj���P���i^�i�{#��f���5?����~���_��&H���?��~�q�G����S�P�����k���t��W�G[W��9?�]T�v�E+������i����O&u
�k��V���b�DL����>���1s�~+����Ncd�R@���d*�D����E$
J��4����Q��B��s{�X�=3}���b)�t���~��Y�.�b�x��!�IZ���]��.('_�$�V�;�<G�rlU��jw{;���GdaOY�M��U���K�^^���a��R�����D��&7���R�8T���>�3��������������<�U=g��)��������>���c���'�5����8	Z(������+-r���t��={�������w�'!���}�>��j�4%<JZ.*BP�'��{S����t��1����N"�G$�Wn">��V�V>~�s��]�K���T~Wba��������v�K��[�W���Z��lP�}�����X�?-���D�Gw�������w�?#OE�}�me���yHFx�#D�U	��e���z�&��nj��{;ee�"����'��jx�h��e2��[������X��:-1����:)����:�{��zvg�{gm��kO�S��������x�b:(���>��o����;n��1���H��_���Y)�������i����[��)���E��9�c�N�(+�����
B��r[a��k�p�Sgqf�{����x��V�.���v��t�����rUju�UC'C��+�8r�����K�^&�������OEu���g~����h����[��d��-�(Ie���hH���(��rD�N����^���]{�c�R�pk�9�7\�Cer��-�$�;��}<�-���H�����j�bd�UNv�'I�7@4�h04���2d��gII�v��0�`o��UC��)�G[��9���W�����k�F�q������N��q������N��q������N��q������N��q������N��q������N��q������N��q������N���4g
�Sn+�g(���l#{�v�	'�
��N�����"hG+RP�����k^%����\����{�����Z�4����t�"��=Jj���3��D�^8Fgm�z�v�j4�3j&)��U1�q�b'xt����������f�~0����������|����m|K����>��m�txc5���*\��
�����?6������������WG�3_����������|���m|K����>��m�txc5���*\��
�����?6������������WG�3_����������|���m}]��U��W����<1����.O����{���k�\�e^��~ko�+������R���l��w�q�y��%��U��W����<1����.O����{���k�\�e^�c=�smo3����7$���T�����&.`��Y�/^U�tMGU�UoZ���W��&��W58���<|�c�q��������s��2O�������f�~:��.O����{�8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g�����y�~���*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��}������x���j������1w���fR>�%�;*���
Sv�k0�%��
��Q?�c�O��q��|��/{�'��r�l������������WG�3_��.O����{�8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*����[]�~�?��'��fk�������.~��|��5����������r{�6g���8�<�_��*�����5�UL�>1��-;^?"O6l^�;&*%5iJ���~�������Q�����,����K�������d���f{����q�������O�{�uV-��������,�q�T�h�T��=�q>�<��}�5����z}?�q�nmJ��e���Gw���]��a�U��������?��5o]�=
C���g�B��r^�c��������'-U}�f�:������*n��N�Dh�0��i�13�T��O�v�f���k�:������(�|�tQ%)N�(z�R�^�`�����u�q�r��T����TF��-O���2V.GEtX���w����i�=�*�WxT��|��RT�'O����hS���%k��{�i��W[��(�W���(��es��L*����UUYkvh���g��Z�i����U��LuK�S���,d����t���|�^����x�)_b��R��r��V�zF?�1?�eq����J+�+6h���_��Uc~>Z�:g�	sir��ti�)�Jt����?��g����u<��T��D���k�����Z�[�9Z��L�3b�U�����S�]�^^x-sT���
T�)�qy���)�-���sp�)JV��Edl��Lwi�2Q�e��Z����"�����:)���i�x��j)�=��x�K,��=��k�*�4���f!��'���_��*.���z��5j���n�\j���kYN����SN�����������m��z5<�G3~��4Sr"����"#�"!�I�8i$��O�d�!zA(�h�'="Kr��?b��*i�4�""������6pT�O�}j>&8������������q�����s����9�}*��=����u=x���kB�{5�^�������v�6�;"�"=�����y���kZ�n�=5W���T����zg������H���fY���T�R��n�H��P�(e*�8���
q75�N5�Z"�t�m��dDD{�NkS�s�<l�o1~��;�/���#�1���#�1���[�%:)g=�@��MR��
����)J��B<��xR��^��3�����q�UUOG�T���������^vG��;�p�z8�������pz8�������pz8�������pz8�������pz8�������pz8�������pz8�������pz8�������pz8�������pz8�������pz8�������p������[u��/����9��|�K���[�������}�B���g�tx�@d�G�y�:�G�y�:�G�y�:�G�y�:�G�y�:�G�y�:�G�y�:�G�y�:�G�O;#�B�������d|�S�=k��d|�S�=k��d|�S�=k��d|�S�=k��d|�S�=k��d|�S�=k��d|�S�t����h\y~LYy�e$/�2����'��(������Y�x�Q��tD�D*Z�J��ZW���]�]�5��]�E����#���.�4:����-)R���iB����{^�5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)��5���>t)�=�Kj]�NC������n� ��N����������F�g
0V��d��FY��~����R��l(
������~�N�od�kb���iE����R�:Q�>���Fo�������k���5�(���P�6t�OTH�����.�������������<���]~X2mo[.���-6�n�����V�Jy��e\�����/WgH�kR,�g�%�l����H^���J�*�{~8��Q+�19��l�utt���AN�J���P�~�a��1M��<G)�lGG%�
�E��J�R��?��������a�7�/9yC�����qy���@=p�����^P�r���>o�^r����F1�~����?�z0�����������|������ �8c����/(~9�Ij��U�nn��+#*�$�����d���K.���"�4�1=��L�5K��xV�����swem�w.N�v����Sr�b���{��18L�OC���W��W������{c���j��������?�W�_���&~r���?��=
5K�]��@��C�W�_���&~q�f��T����.�� q���+���Y_�?8��O��OB�R�b�8�P��W�,����}���U'�F�y�?�|(~
���W���>�������T�����>?yU��+�g�vi�UI�Q�^B�O�
�������3���4����(�/!v'����^U~���������Rzj����������*�qe~L����?��twGpR7�Es?�,5��jZu��5��!	T��U�J��<�zq5z��{��[�3LG�9X���W?��$G�����R�����.�� q�����*�qe~L��vi�UI�Q�^B�O�
�������3���4����(�/!v'����^U~���������Rzj����������*�qe~L����?��=
5K�]��@��C�W�_���&~q�f��T����.�� q���+���Y_�?8��O��OB�R�b�8�P��W�,����}���U'�F�y�?�|(~
���W���>�������T�����>?yU��+�g�vi�UI�Q�^B�O�
�������3���4����(�/!v'����^U~���������Rzj����������*�qe~L����?��=
5K�]��@��C�W�_���&~q�f��T�����^�������|(��W�_���&~s��2�����jG��+����{~���&W���w���~���zjG��'����?�a��+�?�s���Q��>i�1�Bl�z�������L�����S�(�]4���!6O�Iw@~r��&W��w���~�������k���l�)d�wK��^|�|�#+e7���x�"�^�*�U������tiZV��;��XQ=����=X�<<�?��;Qvm�M�(�L�Gnx������w�N���=�s���?-�r�U
��3���Qc�l�	��!���w`~���.W�P}�������g�N���=�s������r������e��X��=t��E������������T|g{-~�������i���j`{F��i_r�}:�����yJ����W.-���E�������Q���mxQTv������S���_k���/���z�r��6W�T�����o�Y��)��}_k���/���?9{��+��}���[��d��W������n��^������x�.��5��2������A�_���������������?����g�L�����/-1^�����Z���I�ivkN��!N?���r����4|��4O��F_|n,��Vj�=8��s��//9vii}�m{������Em����Q���rq?�����/<����W<[�X����S)O56"?#��t�EkS_m���nc����c��k_���S�6�4Sn�3'OD}�����w�33b;�QE�c�DDy�"Zr���-u��9M�b(���7�EV������M���i�8�����^0�--����L�E��������UG�a�/.�''����q����'_��Gj�������D�p����nFP��g1z���������������{������}�=md2"i���DO�m�LL���Y�����s�z�������RuMp-��.57T�Y��_f�ZO)N?�
�
���8G�c�xUUUU5�8�������[�5�Mkb�P����O�3�/f���JP����)x��8��WVo7\�]��������g�S����Qj��%��9v������3�eZ!CT�E�����C�Lj$��K��f�;#������s����^��M�H���?����;�&~8c.quV�6�Ri�P��d�x�k�*L��]p��^O��M�zLR��1'f�UJS���W��SW��Q�'r�c�4�-�����Y>�?��d;�c�2?t�|;Jp�%�JS��2vR�)��w�;����?T��@_b��g�P�t��49�.GES����^!�t������������=��k���S�t8���>��e���a��0�=�����4��g�q�����w���;)~:�]�?��\7_f
���rnQ�r8�U�?���k�
��3(�9g�~}p�����^P�r8F1�~����?�z0�����������|������ �8c����/(~9�a�7�/9yC�����qy���@=p�����^P�r���>o�^r����wV,�/��$]������K��r�OD�8h����i�����J��x������i�;����qy���@=p�����^P�r���>o�^r����F1�~����?�z0�����������|������ �8c����/(~9�a�7�/9yC�����qy���@=p�����^P�r���>o�^r����F1�~����?�z0�����������|������ �8c����/(~9�a�7�/9yC�����qy���@=p�����^P�r���>o�^r����j�����m�"���t����e|���T����~�����;8}����|������ �8c����/(~9�a�7�/9yC�����qy���@=p�����^P�r���>o�^r����F1�~����?�z0�����������|������ �8c����/(~9�a�7�/9yC�����qy���@=p�����^P�r���>o�^r����F1�~����?�z0�����������|������ �8c����/(~9��0�\y���Ym���������j������OrE<��"�|�2U�I�Q)
N��5MC���6����L�\�����E*�"��e)O����������������
Q��GI����a��H���:�U���z����s"�z5o��d�z�N��u�6p��Q"��L��K�6�>�X��s�|qce�ss F�
���X;���E%(�%���$5Z���Q#*���J���hS�^�k
����8?��A��H=�1-�k�21�Y	&v�V�r��=(��9�J���vf��*	(����H�=H�J8X�/g�h�J����ZV��n�\"��"��RP�#�Un�)^�ET�S{t5)Pp���fT�t^-EV"%�F��R�(uJ���	O��n���p������G��g;b��0��^:���q�c��2���S<�����a���,N����IRI�/(�9i:M
��#&���z��#"e�Kc����zd����������������N��Pq]���E��s���6f��\�Z	&�8&B���8�����n��\yO`�h���)-2��C]���i~f�{Esnd�75�v2r�I������{���S�TSQC�
��	���>�Nb��'*���OFn�Yyk�n���������X���o_�:���rv�N�=���Gj��f"4kD��9��
����dr^���W1v����7��� b"��W�����q�!s#����m��V$�0i% ��M$^�'Xcu��w���*��o�����+�Y����v��rW%�qL=���egg�UY��+�2��T�={&5j&�o���2���.�g������6?'���`�q����%��B&����S���������$d�������+��n�C����3V���8�E������|��;�+6���Vow�5�-���������%�$hh��H���T����B��:���/l��/����;�
�R��>�V��
�n�oc��R��K�u��d��@��
���$�H�%:�9qJ��h��7|��(��y|���=J9�����~_4�l��[<�d�<��9�c'�"�5,�L�Z��"�5N���u"�	��I���Q�2�>�gVz��'f-��e���.L���J�����r���V>�'��n��SYT!*��
�]��.c��.��5�R���;`�:������y�ic�U�Xg/LV�������H��Y�uT�
�%hJ�^;m�����6M�v�����
�%U�YJ�����5b�*�������s/1=�������+e��dh�%���}�kga\cr8�m���M�fe���%X�y �b��� �h�1[�����sn$�{����g���9�#(l^�]�L�%��9H�����x��~�5��t#]�%�R#Y.q���-�Y{g��x�}n]���nj������l�t[x+��}2]���p%Z�ld��&�F�)�Q��UDkF���9�����Kv[_$�-]��5�1��I������;!{]�X�*^����R6�yoO�U�Y"��������y�j�\���V�2}_�����'Z�|V�o,���/��`��(��X�#�j��\����NBU	(�H���c~��Vs�ZZ�$M�l��|������.HWU-IW13����8�+�t�T���8��@T[�}��w�>t�{[s.(�� `H|�������K�6~A�s�[�W�Et,���K���u�"�2���H��,������=v��y ��W�,��'�5�h�F3�n��Q��R��s����J����P��n]�)�/E�y�f]���~�����M~��Y���p.����V�����PnBHA&����Q�IU�������]���gw�a<����	Ff7m��u�� ��iW&�����pK�(��Vu�#6�dD�V�uV����5���c�yon�O���d���n���sg��0�J����Z��A^�����	U�$���(�mE�4�T�E�����m;���0^����������PsF���}g�y��f�pFO����|ec�~c0�%�K��(S����b2O8f���/l�������_�V�����Nlv�dak����-�`��f������u��j�zUhu6 w~[Yk,jw1���#�s�����4��^�i�A��,���!u���oi�ls}��I4���m�DA��*��(S
�,�Z4W^<�1�e�'��U����l��l�������
l�,+�nG-�>���������/$LQ�]$-�F+v� |���<g��8kn�o�����9gN2>NsX��z#�H�FV��%LT�J4:�*�V�{V�L��uS�����c369����d��$���dl�����|'���K�4�h�����F����7�4nWF+5b�e���9��keL��s������^��3�E�r~@=��������q���Z��*�b���\8U4S���C���24�m��BR���
�o/,A�n����B�����#=G���m���j�	DmxH2eY0z�T~�����34_G���\�r�)��1�����[V�n^�\������'�2�>?�X)�L�N���un�Z0�W�#�������7�x�����wiv#?m,��Q��?Tt�k�~�p�-�8�76��2��fn&gg$7i#'�%D���]7�ujm�Cc��������<�'��o-��a�!s�������YN1����NB�+d}?V,!&��:��:������u�Y���c�Z��O�Oblw0����f��(v��F��II\��`�=-H�B"0�M�(t��l�*U�dRT#�{pu�����.`Z���g�1e��1f1��o�;�����p�N���?����t�<u�&�.�+�zV�O�H�&�WA�<���Y��d�����������7Ct�>��Y�^��P�!��>�
����$��
Y�L�Mz�U��-�����<��3��k����\�>eV�`���-���vk�������[I�"�N�#t6z���J���Goh��@�"6(�n�v���WS�=��Z=�y�KL�f�|�z��_����\��2��a����v��ku����mT���P��ayBf�������*}����y����^Z���{�%�m��9��5�h[����*����S��u:��Q�������"����������}��0>�\z�
!r9����6��3�=42�����;�7,m�E�v�Nx�*�~���*�MT�*�W����/(,9~��~ek�G&�F��I����~�3%=e���t8t�T��B"��h�B�-)@[l�!���sm�z�v��WKyyb[tl%��r�������?�U�mO�kV�J#k�A��*���j����U^)��r�?xe�����N^y�,�]f����r����Wd�F�8������J�N�e�u�&���w���z�Y���Ng&p�a�[���<����K��h1f���������+\s��� �oa�����6���+3q3;9 ��I>�(�&��
���P�j'3��:��/me��e3�&���J��������
de���+d��&tIi��6fA.�"U38"�����m���<�����r���CsT������pCg����X�������uk�Y(��-��c%oI7R5�N��\R�#Z7�M�*��70_:���R�ore|t_��"[;e�'Y3�1�Nm���MK?#V�7H�MS�j,�H��;y����������"�y_�����3u��^YYn����1����lK��'qI����Y���f�=hZ!�-�y�g6=2�+K7g���|��L�g��[�n��1��+�-�.���6E��=�F.�l�� �qB����E(�D8lQh�\��_~�<��{��{F����`�!�����4�3^=�"��2e��;9C$��v��c=�t����)����Z��s^3g4>]Y�������l�����Kvi��{j�T��2\$�r��
9+j�M���S�Uu1P�Z$@���|��V�9��V�n&��C!~�Z�`k�����i�1��dm�@��fY�3��d�f%d�UIN�UI��m@IO#
��{��K�c�"���W�vV����oV��,��d��������s�%�)���"V�::�L���l�L���Z����J���^�LZ��(b��Zq��N4�?`F&mM�����-��������^��i���-���Hd���]��U�``a���A��d\��#�9'+�h��f��+|��/-j.����K��v�p����]rl� ���Y�Mf�_������X����iUPQ2�;S%�J��E�0-P���5���O��u���$�]�����������,����`drMX7K����J�%)���o�5��b��AkK^���m�v��qWpWTE�
���*�&r=98�%}��*��>��*uw0�
����^*AI����	uZ��]��i����"�%��"���N *��0����cL_��ysF��$r��6���Y,}���,�p��	�pM�rC�D���L��=+�3�g
�|����$k�f���A��kWu>�=����6����K,����a
e%%r�a�`��#���6���:]�wh�W
�IP�-����"�_\��k��m�@��>t���~1���B�V�e�Y:J���Rku�D��l\���h�M�Z�?E#$��]�n�����Y�y[��{*`�N�Z���{z����;�������[x�4����+
f�,����x�D����*[�d�X|��w/5��]�Z]�� �ml���s����v"���VM���d��������$�yY���T�2k��QRn|���a\��{m���8�!�Z������<A����7q��e���P�w����gnZH=$b�
0Qc��l��nr�����/����9��y�fk���3}�Z%{b�p���7�s���
"�\oX8E�;�2]L���r�i���+����h.��=��,��{���n���}��E�M����+VV�p�{~ZvO'V%M��Fe�b��X3��\���5�VV�[��T��Z�6�po~��G0����[g����T��a�����U��/�3��Q��j�����H���r�_;�������rF��
���>_�xWa��..,�d��
�M��m�;y��I���9(��M&�M���1E�us��}������>:���RZe�0���+����x�<�����nk�d���
�[�����j�����v�7g\}���9S�NU��������������)/�o�i�v��B���u�U&��r��{���2��]D�Dh��'����JjP�%kJ��/F�-kN1zT�8���V���6��k�?�Q��o�d�g�/`n��W���O��2x�_.�{*��0
��F� ���.iK������4]G3t�@��w����Q�\%���E�{���]��6d�acd,�&�U��L�A�g�TcG�4��(�^�����QP"���e�L�k�'�������u���o���������b�����29&�����	D�%P����hZF7���g1J� ���rD�6��w�8��+�
"��uR��s9��s����MHnc�
����<�9�����6w�:�}|o�Z�Z��n\99��)�-����������)�FZDN�B�Re���U��t����V����������� g\=���{������2��Q��FS���� �g���2�
��"�����)C�
�L������p��!�wj��q0�g����;_v.��x�O���#m���2�Y�e� �h�1+%0��H"t
�M��j���r�:�5�q��@^{��w�M�<��*�
���J������d��4\7w�����;�n�H���ct�no5����r��ss�w�snhX[
�������������nx��X ��u[
Z����=�ZJT�+�1iV�i�1�=?���c�3���.B��zz��{r��:=UI#WL��KN���S�H�|��~��j�f�a��/[p~	��� ���)����>n�&�#!x��(��H���oX}&N)��� v����"��n����O/����e�+�wD�J����U���������\W-�9&u]<x�s����
UT1�P�9�Z����y�c���Oc6�o1�;��o*�)�u�?_x��XW��,[~�}e�e�)	V.^H:����H&Z'D�V��&�?5��9^�"����3&�r����}�$��u6G7"8f��2$_��q�]�n�G'T��C��p0co�^��>^5�[�|w*����},�;�>��
�����L�h��\�GV�mD+zI���Jur��Q��Bn�WnQ�������z�s{�+����i��(�y:��y�2sh�O�ERjY���!�E�j�SQd�EN���.b��r�������=~����������Q�7=�v�������o�)hXz�1fd�`���L���nd��u<%�9a��������w1iv������`2-����| ���%Y6�B��s'[rN�n��m�dJ;9S@��Sv�uQh�\��_~�<��{��{F����`�!�����4�3^=�"��2e��;9C$��v��c=�t����)����/�[��4�s�.�m�O��#����c0�W�Ke�����+{�m�.��"����&�8u'U��v���2h��(b�V������Z'�e������h�y���\E�/��k�5n\�-�%��$�l
K�D�Y��L������-|�w~�����nP`�fcv���Y��K�rn-�X��"��EgYR3o0vDL�jgUlZpK�BT@b��	��LM� 0m������$����-�n��K������oI$����WN�p����x��/(������Y�n���Fa�i�S0�>k���t�<���[��������-��y&�V�!c�"L�l��\��c���A79]����Z�kXr������5�m������V�aku�9�c�X��7�"��
.���dT�9@4�gq����`4`p�mG�=���L7
lVm���"�f&�kal�+~�v��-�������v�2��Nb��q.\����++G-�|	�z��Q�U�7��_����n{��-��u����R���lb��*�����u(��5UP�xK$r��
��y����b����9#kd�d[�/�<+��AJ�m��s&�N�����I$����vr���X����Z���nyGq��b3��b�[���GK�V����A����slm�)�Vf�fvrASv�2}bQ�M�Z�z7V����6?:K���/]���y�6���F�0\�(����������t�)b�A��b��nc������h��e>w����Q�\%���E�{���]��6d�acd,�&�U��L�A�g�TcG�4��(�^�����QP"���e�L�k�'�������u���o���������b�����29&�����	D�%P����hZF7���g1J� �
��y����*�	��6	�y[���orn�yc���_�-KC�[�d��B�r\�4��M~�UZ�A�t�}�D���L������.h�2�S0Y�v����5�k���Ku�����o�e��=b�H%\P�r���QJ D�q�FI���t�e������[��|J�����r�����L�l-t�w6E���L�2�"t`����-V�J������;'�]�I�\��l�s�?�q-���Q}f�F�����kf�����^�*�����Z��A�����(S
�,��`?����U�����Ud?�������aF���L�� ������d�8�g���<����l^F��QdJ�K2Z�����H���M��X'O�cW�N4�
b�9mv\��s��v�G��8_	j���Z+	7���)z���V��l���h����#��V��d(p��
����\�?�r?��q��\���_�*�����4k��c��,jk�k)i��m&��Vo[��@�7�n(�e.�*T^��H��:�3����� B���m���o�����V�wtj��nJ���,���(0���B���HF��d�r��R�J�8[wl�,y����Z��1!tv'3;�z�F�c��8L��O�U**������J�u�X�O��)��>�)��%(�������o�����+C�+g*����pU)�n��}���)���'g���N�
�z��>������w9`���k����i�X��#Y7�
�!$�)7�}o9h��*(WSlSUU��+�!MSV��j
�WIR�����$�4��:��6���ag++hd&;!s�����T�A�,�X�����S���Jz�{�K��,�Z�1���ife=���Ls$�C>mz�Z?z[�6z��!JgL��T�Q4�D��J�:��B�1��b���m
����Gbs3���Tl�>�c��q���UR�������d��ZU�d������������\L���f��j�f����E�Ce�����:���T�*L��V���SVE2���'z�y2������j�j��1��
c�r.�//t�Y,BD���4nETr�&��!F��T��B{�R�%�_����a,o+SVSb,mdIT�WJ��K5����1���nn=����N�������+g�W_������Y���cK������Y�j�
�������&D1�Z��F�h�H��X�k^���6d����4(���F��4gB���x��!������*�t�4s�9�'ZqH���R��4���ExNS����h���vgv5�v�i��fX{���uH���#j�.�*dY3�d�TN��wb��}e>\y�^a%�-����5sL6���uz��G<5�y��Q������miUJU
D����>�$�[��X�����7�4|a�P���w�W�P���b�#>�hd���
�:j�zQ2t����!�a�v��}��0�b���}�I���4Q�<���i�iTL�Y���UU%��K�Ru���=��U��YOue,y8��u��5���U�q8���/�.��D�'D��Y���C������s0�����Z�p�X�QFdw��E�r������2�������t*j �s�Nd�cq)�zV�=p|��&��u�9��x�2s=�v�;�T�4m��a�����+BU�7�>)�P��j����0Z�VW�����S�?���}�����>cw�&3�������)��(-uc[r���.i��u1���3���W��'Ztz'%@r�����Y����>o����5�������Lf|���k����+w�3r�Q�f:���"}W9C��`��c=�����_�c�[I�����2�$�M�[�2YFK�J���2'N�L�"���D9H_(���6�X'i`$c�b�L��:�p4x���������Y}�������p�yzt�j�~��T�s������ooO =�^�a%����d���!�/m�1��du�k�;����SE������e�T��O�1���(�.~U�������l��`l7n�y��n|�3����Ql�B���D9:��D�-8��.�^:�Wz�v<���i[�!��S���gE�w��s�=�w�R9�e�5�������E5*n��v�k.��9����i��K������r�����q�,���Nu*��E�����n���sz�Z(�����������u���L�^2���yfE�+�,,�k���7m#�c6SM`�<b��^�8��)�j��i�r��!�;-�M+d�|%�:���!h�$�CR���tF2yZ���5���'Xd�ZZ�E����+Y���b���v��?>�^��;&X�V�������E�c<Ku��2����S*WK����ee��QZ�=��-S?��n��/�y����7}Rc?�����b��"��V5�,)�b���gS��3>�K�}�A�u�G�rT-�.Z����������#]�>q�h�\4�g��[��*�hR�x�7-�O�c���"'�Es�=oV
�v3�<���]����;�����Y�n�)LD�u��%�d�d�Qz�A#"t�t�b*Z�C��
{C�e������.:vI[
���6�+�`������(gt
�Z��!�1�)�Z�=HcQ*�m�y�X��+[CmkpG��������m��5����2\r)>UT��k7�j7Y*���b�>���@���V3�}��>4$b�Z\v�E��u5$�6-����,��a8^I��H���1���x~��R��N�j��Z����U��lm([��9��n�;���Y�&��-x���WN�B���B��k�!�St�����3��!-}��<��-���=w)Z.[Gb�l��d�R�(T[J�M�6�N�K�7�%��,�*O���|Y/�7Y����%�.n���a�Y�R�����lcv�<�1�e4�	��*�����+B���
sO���3�Y6�!H������Sd(�*W+d�*���kBP�!���;fN��P�2�N��C����9N�����jn�h7����u�����F �b]m%�����S^8�?�-)���P�L�9�V}Z(�'��}�J=TXm�7psn!�j��k;��M�Z��
(D��^J>Q���
~��JCZ������c����f����G8�byM���V�6�n��2�������b-t(E��g��A���f��p;��Zthj���^D���3��y����2�n3�X�������7�G��1����U�I�m�Q�D��#c�����	w��!�3��K�������YU?U���R�e���rq���@�/�j��.��fC��������Ky��������7l��k1�qn�d}��U������[.����^���n�/-���R�O�s�!KSP<������V���"�W�;Y���������j����_��E�-z����������St�8pz�n�k����&��d����h~���h���3o-��q��w0`�@�*�W�#�%E�e%U�S�3����$�~��'+�x��������v\j��*������Yc�v��J���3%:��AC+RP�'XIZ�Y���w��S������Y�������	�e�X�IQH�:����B��-+S��Jvj��_E[��=_����$����C]~ZF��:�[d����Y���M�Q� ��4���Y��T�=K@��?v[�	���4y/�vk����6�DYh��X{ba��w��gZpQ�ZehG����*��D�=@z���;��<������Lnf����cb�n�v���t{,xD�:�}R�$��^�m�:���*f1���$�~��'+�x��������v\j��*������Yc�v��J���3%:��AC+RP�'X�Wy���_�n��UI�K�\��/#L���%~���-{x����yLc��i���U1��'V�1
@��;.[��9�e�i��l�/��X_\�-���j[�n��O+BS�a�f�{�����C�T��8X�k7��7!����w�����e����7��]ZX�X9���D�����VV������%�,jh;n���tM����i���8z�y2������j�j��1��
c�r.�//t�Y,BD���4nETr�&��!F��T��B{�R�%{
���L���������1�/�-Q����q5r��{x�����E��F�"
��MZ�'J�+P��Kc���s��y�k�'0��M^7Y�����@��OcJ�e"��=j��(~2]2��'L57cp�������f������B����Q�RE�f����V��^�i�����!~�Q"f�eT�S�_��jd^MZ57�4�xp���I���X�O��.���zDL���w���NE(c&b��T��
]�����A��ZN�����b��m����nkg;^�����5mV����J��y�B���
;����1<�v�h��a)����%�[]�9$��k~a�.,X��R�����d�h�B���%xp�'�6�1/)_�M���T��a\�r��J0��S��G�b�zh��RdID��T!�R�B)C�)�"��7�Bs��\��Rc��m���8�u��t����gj�������n�sV��]R���JC+C��;�����Z�p�X�QFdw��E�r������2�������t*j �s�Nd�cq)�zV�=B=������g�M��Fr��2����&9�A��6�m��-��=r����3�r�E�R��u"u��C�dV����f�c�V������i���9����*6km1�d��R|��QT�oD�n�UC�*�2}WYN�
�o��u����x����>T��<����VQ����������~�it�B��yB����S�+��P����;��<������Lnf����cb�n�v���t{,xD�:�}R�$��^�m�:���*f1���$�~��'+�x��������v\j��*������Yc�v��J���3%:��AC+RP�'X�Wy���_�n��UI�K�\��/#L���%~���-{x����yLc��i���U1��'V�1
@�X���
����1,��8��.,���l�+���.3�.�l���J�^��s�"��c�K��,d��%8Ow(l����8h.Q-���`h���g��5�B/�qKK"U���h��r	�N����9+���@i��5�V�yFbR�Cbv+f���0�x���2���cP��L�K6������&r��*��9��`+Y������U\���o��`�XS^���L��qn�����R����vrs�>������eG.:�:�*�MN���
�
��'3[;�����d#\���m����
��;�4�7���r�9�Z����]�J�[��?�'�^����xO@��	��|��\�uF���"�E����nK��3:�����+B=P�L���WUB$�����1�_�a�Em\��Bcs4�V6�u��}���`;�&9�S��Y'J���h�	���1S1�~��&c���9X��ofu�_�7c��T�W��>�vw�����P��p6I�)�t�
Z��):��=X61��@����v�������k�Ef����	1}����Q����E�9�����1��h~�R�!�Y�o�
���28�g?�~��N0tWl���v�o�2�:8�IJw��������c,z�*t9�����"	mr�����9�E�\�u��w<T�k�;^�%��y�Vi��E��l����H���T�(`�%�H��>�G�����,��<5����(���yd|�	��Q������$J�R69	��J���e�g�.�H,�d�3��m��$����s�3d�vb����5���������U��9Lz�3�5�e����	k������of�����H��r�8�cf�k':�iB��U�n��ru
^��Q-Yd�P��,1������Y��[����I5x�f�?��a��m=�*���"��Q�����T�t�N��0��[e�ZOf���������1�
��9��D�L����V�������W���
�R��b�I�����v[loV��d�v�m�o��r�:)>E��r���f���L��5MT�t�Z�LSS�*��ZU�9v�v)��)?�.�e��\����R������I��S=�����#���&��������"D?X�N���M�Gl&�;�_�;K��#r�X�(eMD�����e@�����F���fb�]��F:X�z�$I��(6M�=+�����p��c;w�Y!��������{&������9Z��)]L�=�S"���hT�M$��d)hv�.�vSg
t��.�'?a���/KM�s�6���[�����L4~�Z?YFJ�b�-BT%����������8_X1���9`���-){��D��#n5�FN�7�c,���N�=�u��R-;4cy7�L���������
�y����6{M��:��1pM�������XI����nU[��0I��������Z���������Zpm�H�]k���[����z����+!z]Y����&���YC>p�����7L��IS�/���
��b����H �oG���/���PU���&�-F��"�s��I���@7��^���!��	�����ab-�r*:����� ���7�����hFqQq�
D�l����B��)JZR��r�4�N�i%��v)�2U�%��?�v�(!�f-yV09&��Nz�J���Q�"*(j4m"��E/
(�Z�j���%���6+��������UqV�jS�	���.P��u���Og��F$�J@��#?*k:��Z%F�j���fnI�c f���p�����/�r=���}�9�3���p��������4��'$[u��J�,�WQG'�n(��Fu�U�.�k����/�Y�J�����,���M�Y��U��:�P�oe�.�����:��YU��z���������*�������}��������_��Rnb�o�(�;{a��
.�{������NR������a����L��m��^�B8�_"����-v$�[s��AH�����������WA��%L������e��0���v{uw*��K�����gks$>A�j��h�}�u0�!�"�1-
��NBqwGg��D�Ex����a�
���k������V�:��:���������&�F��I���
<��(�%#��s:��2f�j��9LS�)�R���*S��R���i_�@3s����$�%�V6�o���sO]�WE��wB��+�F�xy�6��CA�.n��<�v�N�n�mZ"P����z���������0�M�Z��ra���v}���+]�2
�?���U���#�b�X$���x�L�lG+&u�\���w�=��2�M�iFb��^��y����s_���h���Mu#$��Bv��It�'^���C����f�f��G�s��nf�V�}�-|���2���8�Mt�����������z�4Q��X��Q�*��8Y��q�Ub-��v^�Zy�b5kl�E�6&����a�7�+~���c,��������#�
��]1���E^�D����E�x;B�K������we+�|��s�h�\�\���#�I��x����Hv��I:��6d��T��$u�2�����n��/f�/�;������~vojNf��8�8\+5�t��31
*h���b2R�3U��Q����*�@�=a�L'�8+�~�Y��cZC[�
���2��ZnjI�L��9'���JA����*�����P��h��a�_��z�p����h������W��6b��}�r�tDe�k+j�B��"	�����r��2�U��1(@�;��nnC�Y���u�h��<��`������Uoa�����ss�,�N2n	e�w	���V��Qe��l9���t��n�Dr���;���k�We���S?]����/�BF�*+��+fi'�TN*!�F��E(�T��j��lo&�I�v��<3����3[�v��Oi�S��Q��.	�[����	6���m��x��	7t�q�US�SP8-��5�����.I!'v�,qw�KZ:F�H�����D�r�e��2�pU��i/'=*�eN���+6��f���V^����l>Z9Z�C"������'p����L�{aF�+<�,��q4i6��#���ps��S1�`����b��3�h�]��[�^�����L���L �X���v�6��
����3�M���$WF��H�P6{z9z`�����|�-�1�P�Wr���lwg)x�gF2v=�D%���*iI��h���&��G�n�TC�i�+�;�Z��������j�����Wjo����"��D��c{��q�fqT��e�:�]2,����7i�H����'{a��it�dn[B+e����{�l��;v3(��4L�\���T��K�ORD� u�E��G�zA��#���x�gn��#d;���^�[/d�����'+_�%+����*dU��-
�i��L�-n�i/���u����rd��Z�rF�e��^v�]��p-q���F���bd�]c�S�!��)C�Cq5B�{!����o���[����.�k���#"C�YR��l����7i��>SOB*�F�LT��N��'[��nnC�Y���u�h��<��`������Uoa�����ss�,�N2n	e�w	���V��Qe��l9���t��n�Dr���;���k�We���S?]����/�BF�*+��+fi'�TN*!�F��E(�T��j��lo&�I�v��<3����3[�v��Oi�S��Q��.	�[����	6���m��x��	7t�q�US�SP7{U��_��C�N
�����q<�kr�uxO_����d/K�"�3�Y�����(g��2}��6�"�a%�x5a�y�U�;��
����������
��������1�Qnv���:]h�!���b��5R����e����J��c�v��+�����G��@��,m`����l�p�����(���J=jS�C��d�:a�;���o����dI<��2^��}�
��7g����.��R9���u���h��M(���3rT�2�u����t-7�{�u#+_5�����VC�c1����M���d^5��4�,obR":.6�*��L��W+�E�C����7)Q���l1~��.����hEc���5#�XOs-�Z�n�ez�����wJ��b�I�H�$����4Ch��H0�b{�����qdl�~�w��+e��w:���$�k�D�u34��L��Z��SM4�"i���G�I�A�n���n�I������f�w7���F�f��}���/S�x������\��F`$Z�R&�J�IC��,%�q~�bLy����ab�Uj�Y�-�E��
 �#9vur�Z��v���8r��p�EP�0e �n������n���:D2�u��+��jq/J��tkN4�T��e����v�#}.��%0��go�[o���\m<�8��,�[�F���[�z�����bT���W%*��;�F�a���y]�����V�����$w-�����gl$�',�2r�/c�,����E�uY"��{���2F�s.�n��[:�q��u��nd��8�
]������<$]f%�P2i��N.������(���A3��zs�]���������v�9���Q���LL�:uI�U&��+y�M������9�5�
�j��P��2����
��~�^��-o�O�X�k9������z��,��2��p�I���r��s��9xW�C����Lx��\Q�3F��������T5���f(��jaj��[�����XV��5���zh���"�4E�DZ��[��o	�k�I{��~[�{�������w��3�/q4D�\��S�Y�3y0�:����b� ��-2�=C�������\�C*���b�C6�	��sf���6c�-�eEU���RY�F�AG�Z��\Dst�D���8;t�H`
 ������\h�[�%[1�����l�������S"�H�x�r�V���MxE��uW��$���T���hS���y�Y9�*r���5��k��5�<Y+���t�b�����3�q��w�\
��VPP�r3.�J�s���5IW*$����<�ug ���<��\$��.�6+���Kfe���l�����B4�W�uL�"����W)t�?l�l�K4]d����q.
�V��e�����������p���9.!��:	��������VEU�����dNdz��Z���7�����x���n����_'�g���m`g^�h���������f�a�ug+$�tAEHZ$eNz��I�m��*�r�Ue�3n���mB?-l��_idl�v[����mYl���������+h�������W&pv�0��M�Gl&�;�_�;K��#r�X�(eMD�����e@�����F���fb�]��F:X�z�$I��(6M�=+�����p��c;w�Y!��������{&������9Z��)]L�=�S"���hT�M$��d)hvH2��a���Z���E���e�3��-����	�]�6�c�lw�
���#�Q����UX�G�1*kP�X���L���#^����<�������X�+[�m{���;��|�u���N��O�9M��
M�GI"�����P�l=��X�#�9�g�Wr��d������v�2C�A���v�G��SR.���4�d'tv}YTJ�W��v���,���4�:����z���3�[R�u7���g�&�}���Ej��-�~"�����hQ����e��eH2.�r��[_������&�j��V��lM�����oV�e��Y!��/9G*�R�c��r�
&�
�S���B�v�������d���W��6��x����7�GL��^��w�������t*
�l��N���H��eC�O"td��tbM���O��7s��vWZ5�5�c��.�z�;��uo���}��lj0��"���4�T*J�X:�����Aj}��-X�w����,R��emgX��A�������X�~�U�������Yg**���V����q�m�]t���d�/�������,����ub��8K�������$�����kH)��(q���F�'��v�����j���l�""��tID�AS�
B��JR���)JR�y�k��k������5�%J�pvt��������DF���wZ�z��>�M�.�Z�H�c�'J��#S��k��u�`�t�d.	k'��i�,�K��s��J��v[+���_C�`�i�0EG��b��S�$%J�B0s7$�1�3^^�8_hwSK�9���>����q�p�VkH�[�fbT��-��d�`f��(����U��#:���S�������,�%`�K��oPY&�,�L����y
(y7��r�Y���Gk���T�=@Di}^
Xn�kE���@��z?��yx@g�������)71j7�i[����N��Z��Dj��X�)
T�e�c�Oym�a�o���v�n�k��6���7���-��l�U���j:�ED��N���3Z�b���G�puTIJ�MP�-�������$��[�-���������u��X���"m�hh�������l�Y���1]�QR�S����~[xwJ�\��Yd��{!�P���[9�W�Y1�������V[),��b ���J�."9�f�hU���L1n�r��	�N�����>����V>�SQ2<5��2�P%�v�fQ��h���q��Q��+D���@�*�
�D6�Kt{�Vu�0,,�{�������g���S0d���m]9,_rE�����*i��j�I4�H��B���?����N�]�cl��a=J��4���t_�t-
b��n����a�`���4���IAC�7hd�f����%	�������%��q��	c��mCY�M�m�F.����	��A�G���v��M$�Zv)N����H1�a�1�[o��������������-���]�6�c��vv
����Q���IYHL>*�T�D��L�<�19�o�)�Y��5��
�%��{M�D�5C`F��{R.RR����NM[5UB�g>��)��j�3J0�`������G��f�.�N�����_�����2.0�#)��L�)S����b#���K�]t
H�nP����Gh����n���_lOY�R����������\jb�f����a+"�*�����z�'2=qS�KP���o	�k�I{��~[�{�������w��3�/q4D�\��S�Y�3y0�:����b� ��-2�=C�������\�C*���b�C6�	��sf���6c�-�eEU���RY�F�AG�Z��\Dst�D���8;t�`�����3.�_[G�vcp4c1�kv.��I�7�p8�?<��7#+rZ���a&�Rv-�Uo<�&��"�:��ujjx��!���������?������$�������9e�l�|������|$\�>$���)IDQ�Q�d�"A�ko+��9YcXY����v(c�����F��G^W��������j9��K�sq��;��n(������J
����e��0���v{uw*��K�����gks$>A�j��h�}�u0�!�"�1-
��NBqwGg��D�Ex��oG/L�6�:o�e�F4�J�V���
�n�c���/,��FN������Y�M)8��3uD�:������t
7�{�u#+_5�����VC�c1����M���d^5��4�,obR":.6�*��L��W+�E�C����nUX�k�]����d��A��*�y�����|��w��������$1�b���"�B�jWLz��QAD��Q*`3v�h^����q;��z]�J�_#����/98f����q��9.�v���N�A�6��7��3v�u��n�����c�sV�jJ��2�3�����������I�X����v����PZ��n�O�?G�D�'��J�7u�tZ6��e\�]��&���o]PSW
��uE�D,j���P�IR��N��JS�k�;�
D����y�f����<���c��>.W5c����[	�4�j�+������������:1z~�����v�]w]�bZ��z�0���g��]]�q������r	���s���M��6IE��YB�4�c��-+P�����no&r�u�T�n2fN����m�,{����j�, &f�����aoH���6)�����b��#E"� I�
T�
��=1�;�)�)��~�X,%����7����sq�%���L�hu�+�M��v���.PV_f��U���kv���~�� d�B�A�fls1
1��d�e��&�g-�L����)�9LC���h�������Z��b���3��1�O����o�;![tx�:��s�]���hR�
�@.��*(J��Y�-Z���@������=uZ�VF�����|�]�nZ�}�pOY�i;Z9X��"%��#�+��2.�L�Q%	Zt�jP;��R�5hR��1�j��)iN51�_b��5�l�������r�8�F���9����x�G�R��1Ku���2�J�U���Y�<z&� ;7l��\�n�J�����y��sF�qL����7hES�I3���f9�p)kZ��5�O�KZ7���u;%x���.Y�A��m�b����w�;�9**N�O^���gD�����^��5�m6�]�c
�lF�d?�v����&��W���r�T�p�-�O���yE:�J�.�LLBq�(b�57�w}��l�N��${�i^���k������nh���$j�Q$���]%z���:]S���vp������&��4r�����&/J����#i�M���E�	c��v��,���(R ��B63����X�hWi8�H�w_�^V�l����x[�df��ou�RP7=�rF�/=�
��7t�T�H��d��
�rO��?X�������j3�3l
����|�/kK.�f]������5�f��Pm-�H�w����V����T��{J����M�
��.F6u�r��i;^6���nI&���c������D�2�M#Q2�R��C��Z�r��'�9�kcm��6�R�1�����S�����I�B��$���\������)���Nn��N��}����k�w'^PY��C���_f�1QX��}��bd���}�eMH�\3.���U�����M%��� �����X�X���MF�_�	���F�1#���Lq
�zO��N6��QQIg/���p�mc\����qZ7;��Q,o:z�Z��z]�>����q��r�W&��Mk3�ar���qr�����+�A�5��'|jdZ/T�f����]�{M�7Sc}������$�q.e-��3s�%c%�����yB���t�WL^�R�SY#��1z&0T]��h�?^{��^�_%P������lKu����nP�A+c�<c���O�&e����
�)����n��N��f�V�2�;�;e���t+��d�����qf3]���M���Z��r����j8�I���^����)�(Y���������h��6r�R,��u�E]��Jb���b���+J��@�m��5Z������.���1<������h�y���k*�s�^*r���er�$�z����U	�VD��
�C�[����x��3���]������a������-HU\�B�����PI5Yd��H�YV�F�`
���8{���][c����vc�B����(\K
lN�������"�cx���2I��N��I�N��
������<=p�;�li#�{7�f_L��y=Z��=��a��z���\{�2d��.�7f�&�VD��M�k��V�A4`+���b=Z�����:�����K �9!����N���&SQV����
��\-U�<C�b�f�cW)��TD��g��m�;��&����w����Y=������N�[u��._A�;�����W�e�DzV�%���!��i�����0_/|��T�[O|�l����f<A���n#iu���K<d.�4V	$U�+TpJ�CR��J�(�k��������b�N��{����76���mX:���	4�[����X��{8�}����u��v�H�T�'RR�-D?�������������?�&�������f��|^<{�+x�����x���.�p_����9�~�=���gb
���,�d&Mv�S5������/���-�{���$\Q��&���*.V�K�����e�b<�u'�tE��y��.���$+���
Z���+KU�c�mjZDY�%MW���'/�7IG*��#�����G�T��
n�����3]����hX\����3fbr�=-d���s��+��E���q�!s�����L���,��D�{�"���xg�6�}�p�-[�~���Sl��%���Z")�r0qI:���E;R�C�8v�Q�\w����6�'<��
 Z�n��Ln��(��B����H�FE��U��Z�p�L�"��5CA�_������/U��fMwW+��oK���b��)�o��{�bq��p=�|�W�U>��h���U�j>���k�5�����1��l���\�L�m�,sa`�&���/��Bb5s1��e�X��
�Ui"eh��R�&eUD;n�s��[xa�m�{�J����oj�6u�
�����r���,�b8��*D:�.��Z#JR�9O��L"=����l�Q��u����]���������
h�eU��g&����j�!�B�Vt�Lj��Z���x�cq=������1VM����E�u�9��J�&��&�*��A�g	d"���!�@�`"�����zzik��%r��X��_��P�<���7���3���y��v�
���^��_�$Luv�c�}A����**���pf?���lE��&N���������	����vr��Ds �:������-uz�:�|��������^�vNg�uw_k�2V��Z����kRU�,���:�F�.����t(�B.`�|���j�2��'a[���d��U�o�q�;-�>����$�uq�E0} ���Wr�	��n�*�
.���������r������9�z�q���|s1�{���c�<d��w�}����A���[�'����I���Z��\R�*u*p���E���d��� ���?��h��:���k����g.�m?�W��R\W'U���d�Y�:��B_���R'G�2�x�^}]����?�F���_�y��^�sq����o*K�[sZ���g{`�p������&���X���]2�I�*o�E��Q��;\��	wI��_E���v�����vzV��m%��3/;]���/M�Jr���M3>�|d��)�*H�T��I� �a�`+��$s+��kG2�9���f�e�����bq5��A�K]�6t��J���-�[3+2�v��VLVQ���F�5�Ut�3�-� �ru;�;����}�H�6��x�Z{g�U��5e?����nQ�����KL�U�tp��wjS���(dm��i��'�-�eqg����+��)��b��b�W�����<�Y��'r��b(�39M�nU|djGi����
��Z�zl&:�M�������3�b1"���<M��������4l��NUn��Vl�^4I��]j����W�����Ud?�����~9�b
�1�q��"�-����3�A���P1+���W�,��6B����]�xx���q�IDp�d��m�5N@�����{��rZ;�v;Ov�.�-����)�/�,#���I$dP��hU^V-�:U�K8l������z����?�]}�j�M�������^�e�`"w6����e�{�[��^�S��R��Ee�4_����5�f���9p��2�Z�]�U�E�B������"t�l�s��-���f�E[�Y����Zn������bL�X�*�g!bj��W�$����tW�$j,�B#^������
U���K��$������mu���Y���`\����+�Y�k*4\�5Pt�LW��cw	��u*�����9��\[}�y������"��k�vS����W��u6�������y�;�m������G5����O��?X��������sJ������@���N�i,��fO��!�4^�������)�?�h���kY�w�S�$\,
%qb\��#���|,��
g���:
��OI�
�1��*Z�������2a���1�����.h��dA�������Vh4�Ck�IF�#8��SR��s�d����L��D�!��Z^X���e���-Xx�T�����*>9�0�{kM���(���Z%J5"J��t�jZ�����#�n9:���r��639�b��(�l���s��hC��M:���T��)S�s����j'.�!`�/Z��NX�a����"�������`����[�u�%w����Q���������yD�x�	[�������/n	�x�+Jb��/X�c��{m��nG�*�b�
�Y�S�HU�L�5>^����j���X��W�-���&�V�+��������gv��,�r�Q������(�y28u�QuJUU)�s�����X��{cW�w2��t���R��fw�-fB���V�s����G������?�<�DP��d���C�������������,�e�����``-��fmK��!��#z_p-B�]V�}���]
]�SI&���*�1x���[C��������Q�	]�w���}������f�M��1��s�Q�-��\�~�-/,��.%��������O�,��U��P�8��`��{-�#�����}&��d��g�����:���U��q��"�C'U��.��(�N�2��r�-B4�U|/eb�K��v��6�{�9\�'����d����s��YiH���q�EOS�Y���T��z���p���=�,~���^��V��r~����w]���kL7��Z>����
�O0�wD�]	gh��z��1>���1s���{������_�*�����%P<}p�}�����-f�R���{��}��s�+�f���Bj0�3�S)E��T-hr��1k��[K�;��cf&���������V
�h��r�`�lTs&l�D�T�L��D��W����j��������������=[g��fV�U����u�i�/k����D�[��x��J~�u.B�D����,��Y{��u�E���-�����E������n���;:��j����L�F�-
C�U��/� �[�n�XxO49{x�R�;+�sO6r��ql��-��#��(��8�n���f�i"���z�������-�\���f�3B��	�w�� ���?��
�-t��rD�"g�:�,kf�O��D��z��a����]��[nd������;�����I�MJ���^e
���W���]7m�aZ�e�+�����ve��G���N0��������Zci&0���0�(�C@�8���4�H�3��mz��B���������)��z��	w���=(��s�`����e5��w��L���mk���Kp����������&�v�������$�c�Y�N�7W_y����hL�G��mK����j~��SQ��{B!"��+��m(������3s���f9H��{f������;I�q�F�K�8��bufkcwq7|���kd��(�A����+J�������P�������x��T�_�0	T������?�W)�����& �qG&�@{jF���V�n���*�~�\�]�|I2E���J�X������?���t������5����l�M�Z����J�V4�fk��{VV1s���������U�\
�����-��5��7s=�<�����[K���J\������]�1:V������E-z\��_EE��[�z�F����XZ�'O�����I:��b`�������d�p��-��6��l���������� ���{��}����mJ�2rg�I�~�R�R�j�r��1(�L/�Gj9�s����V��X��u�~�m$��W�q>-��l��m���#]�|�V�;����C�d�3\�|��*�	��z�1�/��� �lia`-��Wu�{�l�nD)jn=�p�����I""y���D��{R��c������'����e��;M��k�����[�w�,�i��������z9Ui4\�!��g����$Z(Y����Y�~V�-�Z���U����8��TL�	Wp��Q�$h�If��DJ��B�Fc�M������i�l����<��Q��2������K�sk�<}I��R�h��=TP�Q�/i8p�W/GN�]��8
�p���N���[��������s��1�j���kZ��
�z��F��9h�|���'4���w�'�bI��li
f�=�L�]FWu-"�*�R��������~�M���#
�����onN/5�������KF���d��(��52��S�9���K�L���p��[C��������Q�
����y�.Bw�a�R�@��',��{.�lTN������ �6DrS�e�����(�J��hr�KP�� >k�&��������]��7]7e��������Y���nU��9+~��{&�����.�'�;D��kP�7�p���s,�;����#�f��=k�k/���R�m�{����G��WU��c$��r�CWFzT�I���
�^ /�����
�z�?�e�?��)�����X�5����fm>����7�A����t��n[��mo�oq����SU���zP��H�<�b4�����P��Ufew/y9�m,������5�������3�w���'P�rr�kWi�v�9hb�b�MJ�����I2>�o�)�m1����xV.�����"=����h��"�$�2)h�R����i����;�[�p���71�g��>�s��)����	rV�mVZ��M�������~�4�-����<�������]�)�;�$���U\�L:������)�?�h�����&�y��1��v������������`-s�?��������Xf�O��x���L���D��l-�7��z��6�������g��}�i�����G�v������U����R���7:,��H����v���f.q��������r��E-���cv���V|��lu����e�sH���D:�l���F>r�d���;A4�,�`r���yS������g����j��w�����%�Y�����EN�G� ��,�7`��d�R�B�\�9�c�Hx1~V<�����W����?��c�g�2V������g��$�;��z�4%f(��(��x����n�������y���.������:��}��nNK���KaX�AF�A�c�3Mi)*�G(�*I�wp����]�`�����+g�W_���_�}�?�����|X
��[i��{]��
����!������Z��M}�N���2�S���Y�o����:E��r�-B�\�����I�
G��7���Sr6��<�\A���K$�|��/��C!������Q��P��|r��.�Q������#��A��#�X��W/�
H������{�K���m�v��*�2�q'��*
�f�W���^>��L�[�B]s�j�(�'_���.`��_�x�����Br���\[�R��������������`-����k_�����s����$h~�b$0���8���/�����#dn����oU��;�:����7]S��D�rF��H��i��jVe��WR��qwh����,a,�gI��e8�Y5�3p^��U[�����
V�����7�Wh��<D&[����|�ynk��_o����$������oc��,�s���+z9�4�B����{�����a@��[�u�/0m�-��#�������d��b�_�s�k��]f�%RI�.E��>*�)"�zt\�C����j,|�#\��1eU��i�(�9sHF�f��H�NV>mW0��u'f�;V6Q�w
L�k��==�jJ��z�����m3>p�LL�z�������Y\,��3n@�U	'���p���M�����v'*]su�L�iD�My���n[�;Yr3MW��:s�\Q{m����t��o��z���N��t�F�
�f�U�~��ul��2�<{c��W�o��b��"b��;�o�\�e\V�����k4����7�d/�i�*Tp�:�����UR�
��k�_?�*1�6F�������2c,wqQT.h��
em�~v1z��.Z)*�<�"��xd�&���B�������x��T�_�0	T������?�W)���=^��b���J+���w��1�Q���#�Q��-������������s��/��X
jz�?��&����j<�\������o�`.<c,�1��q~k�T�KW�������i��d����x���"Z���Q�HWM�&�q��Wwm��Pv�<���n�U�������)L���rH	�k�6�2��B�q2�)�j�D�����^�XD��8�#f�K�wj��Nb��"	�����}��3N-k4[�e�$��r��R:)��'%:]CuLZ��Lw�3�A��@��O�w��5�5OIu�������u[��Y,uaB��S5�eZ�"��&����/�V����^�������y��X]�Bg�����v]�6�W��������x���-�,���R��HQ�kR��;e(�N6N��z�;�y�r���zw�2�����dfK�<_����$3��1�1�����M�ifY�������`�p��(���t��h�U��<�����7�����1-���A%m;��ub�8�.����$+{F������oU$#*���Z�NO�7�G���������8��}X��r�L�Xi-Lo�2�:�nH�6x�!����1�����<�RS���5t��w�HW��P(fM��+k�(�������9B��=�2�`�A��zX��Z�cr[�ZV�uo,]� �XqQI�n���]���v�E��I�������������������^Uvn������3����^M�zN�_���Y�E5iJ���J�V�*t���8�g�JsL����b��y�[yT�-y�������&d�1�q��z=���,I�w ��hJ�8Q7H0Q �����5D%S]�����l]�9ok���u1�������k������������'�f��RUH�Q<T��,����-Z�\�a�����
���%[�I5�]3������*��Q%S=*S��hb��+N�@zpp�i��,<\:K��.�\{H��P���EH����Jv)Z���>���p��T$Dc��{m�|s6Nq=T�l���1��jouZ�{>�`+8�m�bce���\���"����M7d9Jn�kN�)��kO��d��kTX��l���Pf��-Z�S����
B���kZ�������aa�M��Ll�t���BQ�YSW�Ru����)M��i��8��i�@{m�`�l�d��(�v�I�d�f���4)J_�-)@���S��5(b��)�jR�1kN)�_f��4�E�v�����*k��<�&Z��EN�2T��{4�@s`:�N��xY�j��~N���0��S�-J�($S��J���]�V�@vdl,<9W$DLdQ��9,k�J�n:���������q���Q,�4T��nIH�r@�R�P���B��)��xq�N>�M4�I2$��i������M4�N�HB��)JR�)J{=vLY��E�k6� Z�l����1����P�-*j���iN�kP�l�?l�7�[=h��M�Wh$�����T�Aj�/���t\dCj2��c��:�i�M������A�JZT��k��������"�y���v�)�$�����F��SM�R��Z��Jq�Z����1g�1��0d�jT�n�V����*(!B����Z���;5�@{�?��������������������������������������������������������������������M��|S5�%3��jZ���Qf��*j�]����MZS��N�i@�oY��E�{���9%n���:j�:��E�1^��Z��=���2#��������E��"Wj�N4:�6�zf-8W��^�P����\8Y&��L����$QI2�����Z�-)Z���
P�t�N,�������
TVL��D�N�)�ZviZW�@y@z�;j�F����*�P�5Ie�MG*��P��!�J��-*j���xv@{<�5d����n��4�Ur�d���j�QekB��kJS�}����iZR��+J���i^4�+��iZ������\����+�:�������&j�
��R��*jS�+^=��]�;�Y��s�A4�]�VL�I^4IEP�zE)�W�Z��xW�`����
������.���0CP6+lM��VM�q�{bM�Q���6��I�����1l��p��Z���R�qZ0?�f��Z��v�n����7+�&m���O��3-!��m.�����e������3t�O�D��SZ��m{&^.r����������m�%��)�}���{A��.��fu2���T+z�~�)JtxP;H=q�>��m;�9��V�EZ"��q��*�Ij��Q%a����������><+J�������t�MDL���g)�Q#��EH�kZT��x���
���[�_�W}y�j�+I�7�u�i��Y����Gym���7%.��=o�L����Y�H��7V�����#9ru��<�yh������lo�26w�'���O������[H���E�������cGJ������K���T�0I=�t�ta������Md)/q�������m�;�5J�P��������R�����qnN����075�z%f[�7T\���MB�;b!���~j�����^5���J�E@�>�������j��9iW���#�6%Up����"H��iSEB���Z��1�����H�^�LU~��Me���y��e������W��x��*u�:f1)B��@w[������M�7-�i�t[^�����+��ng��$�z��!*~5���@r����f�B9�g��� ���K�����R���4r�LEP���r�1kJ���@p���h]����u[w=a_2f���\�zd���G���Uz����RW�zp��I��t,�=�1v[Q7-����';�rs�j����t�9�ZV��S7
�|��u�"���W���!\8�D%���
��Y�WU�Y)	���e:1�=k����Z���}���,{�����gT�'�I�����7Ab7��UdR�jJ��b�;
����������}��|�m|��e�3��#�r5�u��dGj����v�A8�uq5Y�
����[&���c�hR����C�����^	��]KP�Q���1�JI�
������(�R�q�)�Ya�����Fe<q#����������fvIw�uj7tg��"&s�C��D�5M����0��������w>`��[-�\`�b�����^M������wl�S���Bu��)Lj����R�@���{��=�m`�)\o~��g.o5������mE����H�v���4FM�H�M��SS�c�B�:��8-d�o���Q����i,Ka�n�-�������ik�~mw�jC��.f�7n�l����
�Z��:�z�����q��v����[�����A���gc�q����%r�/$��X� �J���U�jF��j��O�(W�����s��+n�^m�������eo�t,;��kq��<�������.Ct����q�������c����/���$����r�<M���������g\������]���I��vw������"u�@�T� M�����86��l�b�x�-�Z,fQ����H����AU�
��+E�\���K�Z��@�7�d�8�FId������I�X������~�T�L�"\��R����%+N=�dm�.kr��eq�W%�oIE#���Vp����n��JF(�
���5S=x��{4�PSye%��u!�eI'����$����=U�r	�JP��9�:��J&��z����Z��S���k�������P�'|����h�����+�����Lz������k��j}h7N�rG�S�x����j��;p��4u�-��X��Z����Y#V�P��S��C��Z�:u�'S����JO8�D��vtZ��w
-Z w&5H�D��E�B��%(ZR�'���9`�&e|k����������^�s$�T�4Q���X�2��S�i����@�6J:f=��C�R�RMP}'����9N�6x��S5RP����f�MJ���h��HH0�`�VQ�H����d$d_�E��g/�v��M$�L�QEj��MZ���@T�w6|9s9�[�������	_RX�i$��<��s���N���<��I�C�Y���f�r�[�fE��r���.�k�?�Tx����z�C/��b*)|e�k�<R����6��E��3u!#%*�����4���Y�:��z�N��a�\�����i�!��X��VD�x�����M����m����,��S�(��E^�w���M��N���
����8Ww,��n���*/����c�Y*w%dD���T�&j�r�B�JV���j��#c�.������'Z���j���������4�����~F�kju��[�D��v����\�su��ZV�) :��b�R����i�R���B~*
�����Z��Q�b�elj(C���K^�L_f��
}�I������M�y����+��n���5{G��I��Ig�)��w	�V�*��D���'��rzu�r�
��)���pw�9f���Ed�/G��s	GK\NV�Yu�-:h������N�*n��;��V��K�����v���N������Q��
�������R����q5}� 9�/�I�g%���t�V����I�'���G
^3t��MT�L�:j�)�ZV��+J��&�a-�����T,rtZBbnA�T[jz'E^H>:i$^�iN��Jq�)�@z���k�qd���H�U�n���1;����8@�j*�NJ�Z�k��(�\��=G�7�r��Pn����(��"���F��Ls���Z��(�F�i��9�^$1�P��h���y�O�Sl�����3�k�H���YDAM��F��p6��Z����31�`��zV��P�18�5+p.����cW����w6��u��������f�b��A���dG�m����g �M7��yakS�:&�
� H�#Nj9�"�V���U�{�\a���������E#�cxED>p�vp�2b9��]"9d��+D\&�!3wfB�l"3R��,�-9*H�.���#��Jr34���Z��-OBq���}���r�N����I5�]
�+"�ht�IRV�1LZ��5+����3�sA�_s���W\]i'�!�=�L�I�3^�.�Th��u���i����'���a:���7W@��V��+J����ZW�+���V}YWe�)x���l�eZ�p�3���5NR��b�\��jR�I#S��5�����YI;+���4V���V�J��D���Ej�����+R��8�����-��~��~����������kNn���r���bD��!EQl�it��z��F�Lc���<@n@����Y�S�S�������fymc�6e��.i����n�������;ds����U����e�R��|�9�m.f���/Nddm���j����9��1�����t�v�U�(���8�/U�$�S��A�g]��9�JT3��	��'��/9
o���d��0�Jq	lL����d���Y�.fOh�.�U:�h����*��!`�4�'u��R��I|�R����u��4��+Kv����B�^���S�����N�4`�Go�6d�R��v�M��J��*��V�/g���=+CR�-iZV��+J��i^�+J��������n��\(�����n�.ke�����x��Cp�8��z�
�,��.���h�U�M���������C�J�����8����RNm;�v��u�����w$4����d��%n&�����Y]����0�&�iWn����1$R�A$�j-Z�t�m�L������\��x���[�e�	�����-�'~Yq7L� OZ�VBJ,�*�]�2�VAt��]�V�r���@����^~���9�����s<��m��Z$G�W��������:�Mz ��]*�(bV��@sQ�#K\��������Xv�Zq�L���i�����n��'�q�Y�J�4�p���n�Xx�����g�l���$i���d
n�/0V&vb��Q^����!�<z\+������R��������\{i���o!�{!��fJJI��M�9F,4Vn�rC������s{����
r��,��)J���JvkZ�)JS��j�[��{��k.����b�������>�s����G��YZ"�iJ��R�7��9������J��^Q�yq�+J;qF�������n�Jc���/G�NB����Z�:����)KB&�����4����pD����)�L�JB6X�[��U"��$Zq9)���C�������S�-���;���y�#����'��$����`�*�d��d|�f����\:#Z�D�5^5*�!�cy�q��k�-�Y�=��L�5�vI�{�����7�z���m�"n��tf����r �����I'���p�O�n�����(HZcf�l��lv�������
x�r��|�����I�P�j~&��S�X,M����r���!o�6^��3��Z�w<$��f+Q����4\�P�*V��ER/@��M������l����l����dL�t��g+���t��iC�������{ =v�>@�X�n���r��U�p������*����JjT��^�iZW��W����*��U��*��m��N������:T�z|8q�i���[�y�m�?�����|��t��Mp��}��pn6���1,�
�$��5A�V#u� gk���*�D�J�R���w�W"<�����l�6�/�Y�(Cb��)��0�w/�9��M ����nr���,S|�A'��r���X�-P��gM�5n���3t�'M]�T�7p�t��.Y:��!�Z�-xV��i^:�������F.��,��N�e����u�]:���"�-uTC�JU?�J_uJ������+1�:U��Ko[����7�I��f�8�����"N�=������nezZ��P��JC����������k.�]��-�s�<h��������a!��|�9�.�?�@�oUS*�1�Cts��=Ct��g������#�6]���WI�6m%U��v�z����S��5
R���iJ�-����"�7g\���u�lI{jf:v,�[��]�_���U9+ZP�����f�T�x�o[�cu��Y�Z���u]�Q�dF��@�nsT��uUj�J�u�txt��-Un�U��a��xZ�C�y�YO��n��ou#I�cVT����X�Mj��NJn�@V���S�:M
���W�dM��3������l�f���V���QL�f�+��C*bV�H���L�=�e�}������jU��a����2x��}|���53^6M��C�m�%W�;"u�OJ%D�F�5NM����������0�'��Wn�b��a�AI"z�����,�k5�s���{E���E��A�t1���N������EH��9���@5e���6�];�r2�U�h������N��g!���c�S����u���|�
 r��e!	J�Pu���Ny��z��|9_����4�Q�:���
V�v���Z�"t�S��u�4u%VI��eU�^���'E��#~�b�v�yB��y��o����m�Y��b�=g���zI�ADN�z�n�\�!�N%��Z��>m;���6o�+�OO����1��}�����V$2v���'�-��~W��R�H��I�u�(�zu-j^�Z��j��������f�0��
m��0��;����NE;�����	��$Z�����������#�����:m��3��{�;+/�d1� ����e����V��	x�b0MYd�.u�U��U'P�V�=-	R�:g4�}��-��r���`_9^&�5��/��-��TQ�����Z���l��+v������v�L�#�u���;�:����D�-����V�;����������:(]3p.�r�N�u��Q��E#3*�KST4s�g0H.XZg�v���3Y���9c[�X�w;M�����mk3Y�����4A�����5xP�'t��+����o���p��i7���K�[v}���!��y�������"<n���d��$
N�Hd�Rt�����������W6��@I��`$f����`��F�ih�������p�:uF�T��]r�-)S��.�������FE�������jUgO^:�[.�����:��9�_f��@{����y~�0r�'�l���'��T�4v�
u�9n�;%:g)NC}���I�S3`��p����y�.f��0�*yC!�W�a���XzB*�;�Fn��6kGfF���J]*W�@��]�U�b��-�x�G[V��3u]W�����[��r���R��T��j�������)�^�T��*��^��7)�?i���Wd���Oo���-�����N���I�
4H�uV*��A������6D8
���X+�TDFy�����6��\
ar�C����^g�0�����������x��j������Go�,�N�����6�	b����w^,�d-�d����m�M����j���m_4V�Q���EJP����-���I����L�.s���	ZY=g��ldXh�)����pA;A����	u��5��C"��r�Y���P�:!)4�~�]���'/�:���W�RQ���k��d��������I�2q�
���T�Y6Ux�Me�R��G�P�:������{l/c l�>7�#�e�f�E��r�&��%�+��8�����������#��$1S(l
���yk,c���}��w�r-�o���������������r6-b�]��d�������O�t�:����P�������SJ�m�^�a-�r�!��f��n�c\�O�/��e���Y�_J5|�R-U�(�@���J������i��\G���.r��m���-��e��������/r�Z6��xVm��?:G)Lj�����F��ZT�	7�����3O;����M�{���q���jH8����VA�K��VB�t�{'����v�V���K ��k�Enk��l��j:�������j1��YfWDS8)a���W������W-���8M�4C�oR��:��%Hfs�����6���M�=g�p:���������+�� !��F�7
��LjdT)���MJ�@t~DW����������;��������n�����]�I�JMK(��")��N��5B��
P����Xz��A�#d4J�[4�}���5��n�r�<g�-���v��x��W�c�]�V���T�KN�L;�$^f�'2-d�����F<��f���7l�|[E�����G�[D\��,�V�%�j�#"e�T�I7L�I��9�����G3NQz���Yhbm��2�������1q�����<9-���K��/o8������KZ���NX
�s��a~t�O+��uw��u�?10�����,���~�$���G��E��$�4���hz�P��LjE������{���c�2���������ol���������g����&�M�]�����+D����F��h�d�AmZ���m�r��d�M��lE�m�����^z=9Xy6�=
j�����J���D��J�@u��k��;��z���+"��.�q�*�?km�-2��:�R��T�����B��N5�hG*b�������xLS-��7��f�b��m/U���'
g�\l���t����D�R�g����J(p�Pe�,��!=jnW��(�H|Ss�nI���|]�p��w�{3k+?e�pX��x���p����55
J��J�L�m<���hg3����:��GM����c�k][K�����K�#�[�m���$�AN�J�d��L�n�u��*#Uj`�~%��r���3b�����2��md�`n�Y�Z��JnA2���7X�:g�Cq!�C��D+���=���o�'/���_�p8�#m����ii�H]
�%tJv���^�����SN�=5)�P�L&���c7h��KC��R��
c$�OB�����I�Z���sU�9G8k�r��a���9�M�>Y�y2yy�z����}��e6�X���D�:���T*��kB��	����o���)�k83��R�{�0�S���]b,�m��q<�b�e�U��j��GH��h��4`���Y,Wsk��l�����5\�v��-����8	��m�������vf�Z�q'(���v���tH�]S��YP�P%DW=V���2�����U��&9����8���=w�h�<t:���V��jP���H�+N4%Z�����������p�2�^�����\��=��p�����sj�vY8���8��](g&#��t�B��YJN�C[��rr�����9R�>�[y���y�&�������]�7Vf���7���S�.��k�G.�&)
dT�?�=@}
��S���k�6�
v���������9�������w�����]�������BM���k�)R�)h�jNeY[@�f��u������k/��E���n�/Yq�Od��Q�@�n��]DC�}[��e�����T��c�����hv>��;�s�v�l65��
�V������2�$�m�3kN�r�yf��6N�Uy��p��
�v��*���O�l�+w98lC�����r��)3����n<_~%��M�a�����*X���j���p��$�j<qU�����{��b�W0����[��Bu���F%�_�~����$���>���e��t���}5�ph]��_T��O������k>~�����)�K������^�|�n��j�����M&�+��#T�5j�s.�*L�58n&*�
��k�����-+���b�����4<�9g>b0z���y7�g��\����^9�-�I�~a	h�����P��iV1d3Fp��6^�]����h$c�[�>u��-�Nx�1]X�S1e�����.�H�I�yf��9�&\Q	U"���%�PL�U��IR��]:9���y���>U:��������5����4.����n[��"6|U�b�VSG������tc�Qt{X��\��-�|���Ncv;$4q?���\�99V�z�����C�����	Yk-Y���A2��UU4�����F�15������#r�,��8�:�xW���Y��s-��_T+�t2*�qQ��C��f�d�T�Z�G3�������d4���������<��q�Z���q�����E���es5ERC���%:5*�t�G/��	V�Q��_��+'/��ZX��CP��b�u)N�H��_�E�P������D6���[-�m8���2�3�����&�����X��cc�#u\�2Uhkzb�P���c�&U��Mgkv��Vu�N��4_H�����`�����;����+�-�������gq7f��i����9R% ��p�Q"g=)J&�M���%�_Z���L����w����R�-6���9��)8R�)����(ZR�����b�����2&������+`��\���Q��a_Z��I��qB�W���xvJ�}u
V�.�W k�=�D6�%�c����S�/�1������h�;�/)-mH�<���K-6k�B��~G
]���j�
�ZJ>��s���z��T������;��p�S��]SvcG�
�!h��Z��!
Rt�4�
��Xk�y��S���9$���>\Zs3�0�-��k��z�U���;�cX6��-�8�v�������kT�\�����^�$�JP���]����9!�>�e�j��N�6�����.�_\.����*2�������Uttd�C1��DT�T==���aM��\I��l1���k�y��Se��m��Hi�IG��	�?�[H'���%Q]�������*E�5�����b7���u�WMd��P2��a�_3f���s��3#1���Y�i;�v�aY��s���f�IE��]8	��N��9s��r��V��y#%\w���k����s��ud�u�q����_j�I�(���TM�����T�%-(���y,�}�q���y�8�7��i�"���{�@V���d@�eIc[�����c�x�M���2�A�XB��YS#���{yAc�����sK���-I�����;)��\���:z��+J�u'8��U
N�x��d�TZ�Cut��s�z�o�{;r��[+�4��m�-�^2����;��5�>K��r�X�T�N1��S�(�7'\��u]U���g���Dc�a�y8�[=����ic��IqJc�	�n�|�����(�3��;�I����jP�T����x��z���+�D��-z����2N:��*Y�_!����U��+H����f�$[I��B�U�����U7F^���Z��J��U��>����e'n%2��<[��D���������O
�^�(��N�&��FU�H�
U�)B��h4r��#h?���lY�������qa��=�&][
5d�F�	��U@��Q�r�UI�N�%MCP+�������k�����1E�6�-�k��5�vg�v��lZ]Q��Eh��=�~��F��^�4�E�T��uS@7������]y�l�,M��������N�K>y���L����c�TY�'o*�u��8��U�I�^�$c���hs��.;�'0���z�6�����	)]�������r���h8T�.iJV��+JV��^�M�n�<�4|����RZ���U5<��;����:=kZ�OrD��&RR��i@�+9%	0���D��r��R"��#����N�S�N����CS�KZ��*�|��o�;�e����;/wr+KJ=Ge��1�+�qd9��$�P��"4�*sT��H��B1�_^V�[V����e{���]r�:������� �f����9G/���0��(�6��q��J�7TC;�h�z��	������Z���]����9����������!):[b��l�!�����T�)HULZT�������Y+��������Z�u�s���-�9��|�n/4}
������'I��
���z�*�aD\T��~Z�lz���ygh�-;�g5��f7u�h�wl��Px|����c-+�^�\S�*�wu5WQ�E��e
�Q��M��]���z�{I`k��-�ly}iC(�^���7�����a���4�5�#!.d�t�Dh���R���)SR��Yo�)v��U�9C_���].gtX�RD�R�jn�v)Ou��
S�����98cd|��{d���k�i���
x�W5���v��/�x����1�����#��dUh�BF�~��n�t�U�����<��tg��3�M�y6������3`��>�~���os�o8����bu�.�V���i�Ux�^�����QP�]��=�{�����C�/����� l<�vG���5K��D����y	�t����$�J�������v�������eQ{�$u�v��LI�z��v���:��K��<�&�s*1U��6{Wn*�F��s���P�n/>����m�����i���W�����]��1��������6���z�8R�>{�{+��7�0>5��y��)�~2����n7���w���� ����������6����
�����o6�c�1�s�or��)x��'q�=i/1q[��Z������\R��9tJ��i�]
*���^I|��*��2���a��Jw/'7�w�q�l{�mi7�9�-8f�%���T�I�d�2=H�(��Z����T�E���yh�\�]��L7/b�:�,�H��nY�m��\6����U%��������r����:$����#+���;����_�A�4��;J[��L��/DoC�~�o�,iC���H�����zU)z,K����yrS��4�6rN�z�������I����!*�f�����r�����VI��D(�M�2mC��VSB��a��-��������r^`���3�\�m���o9�,r�I���#�U�g�f�gK�uS��L����k��������WFk��&S\X�C0e
�{���&��>�\�Uj.�TR�����T���=
s��cU�]�h�}C��c�VG��}�y�_�����\�uc�S[,I[-{k�>��B�0q��I��8�d�vW.�jR�Q�g�^�f]_���e��q������������EL`���4dQW
��F��v�
�V����%;YH-(}e��C���O�
�����$`=Q�;�3Tb�[>����nt����$�:�3�#����;B�S#�I�>�bf9QRR5�9��V0�}C����fj���3s"�k��}Z��m%.W�����_��#����j��J��T�z������N��������]�L�nk�^pr�V(�[Q��dl��U��Vn��� ��!���QY
�T�n�Z���p;�t�w��Cc][�����
����2��T����k���s���6��kT���k_�@rsf^r����kvc�������}q�2�\����R��q��g���"�E�Wp��LN��:�-�M���U��P7S�1�O}^�_lr���.�k�Y�2-'���+�X ���^H�*��=��oo������]vIZ�� �OU��������Y6��3�����;��)$�s9�N��v����~D�$��I~�t�*�J4����8�b�����3vD]��lA�wX-�YkQ�%�������������V�}F�wScD���Z����B��@R�f�a]%��9kl����[i����9m�]�l�U3�VLk��	��z)%$�%*�F�d1��*RT3����>w��-�Pxg3lE���M��sm����u�p��l���z�\�E��>�]wl�����"h�*�oWOA��_�7�/mw��\����*����o���g��n[��M���������,a�U�/%�N��
����0WG��+�BCN3�����k�����pd�[wY��!!�e2>fi���������)��U�El�'dx�J b��Y�Rm�#�y�r-�����o+�/][�5�[.��1���R�1������yl,�n{��\8~��*72��H�)i@��Vg���m�a����U��vV�^2�u�����c���
e-#;�`\�h�e:��
��:5���M��o�5��'����\��2VD����w���!������k?���������h��>-��E�]�'G
$�fL�P��#����v���8�-��M�7��5u;��:��-���m���������>E�k����v���Q:�Uz�jR���0ve�/Z3T�~��X.L���8K�3Y,���6�-��Qy�#���d5#�eaRw,�J�\Q�f��B�=�t����&���/	����[�w�4�]d�e�����(^YE��4�!��v��!,��L�Y�A5��d�u�DB�:��T�����V�b�i���,������������L�Lz���IRP������9����������)�_�%�_y���)^fz��[�J��2t�.���-��*���>��%���f��2��t�J�%IX8T�c�I~!���]���������������n�v�wJ�u?m\v��17����j�K�zvCR�dp��wF���^�r���$�}g�NA�����p�K�u����8��8[�q�f�J����8zwR�j�U3g�S8in�r��s��Q�s�W�:��7X39lE��&S,�el��[��^�� i�������+�(�\��*�d�v]����8UJ��[���{-����
��k��S�[�Uo��{�/�@�9���NJ,�I�w�T���PH���l�3�_z�S��!%��F�:in����U�v*�m��V�oE��E��E�&��hSP���U�|������N�H�\���V�����t��=��������;����3t����:}I�#T�@wN�8�q������}/ec{�+B��G��-�[����kA����QE	oH-R#���UR�trz-T��[5���m���k���7M��<�qRv��r_OW�g�\Uq���k ��I�C���R�e9CT�e+@�����s�R���B�va��;�y���;Q��\8�Z���g�f�-WH���d$��cO��f�ur�0��r��{�ca�o��>n����\LJ_x�d�x�����[����,�t1�dF�t�(�G�uu����6�����V���R��5�w�s c��Z3n�����{{0����KJ��x�f�pY5�V�)��t��,�E(P��y���7�d������F	�{�0c'Ve�uZv�]��lk�e�����YK���&j&�A
B�RB�C���=_NNZF�Ty}�J*���cz_�v�2�k�h]Rt����C$�8�"TP���UH��b���P�9�������`y|f��&[���tcj��q.;����g��zGG��������i���hJ(Uo�Z����8�K�r2��*�lu�Z=p�]]������F�����x��qY����tA_�O����������1�j�R�UR�u��F��Z�v����^0���{4|H��C/b(�U��.���&w-e���Ve�CE��N#�P=�����#s��2�[k_�����|s���,��.����8����f�
0��|�u�<a
$�A��L��v����R.p��+����JW������s��_�\���}oa�;s>�
�f3NJ��u�\�X&+'��[��v��F-�*�aj��IS����7K���\�t/�}��;U�#�}�|���������	k�E��21I�F�kd��QF�U5+�W�
����]~��Mr�Z�	y�y'
���+�"H�+{\����D����M$�p��V�JR��-8R� 7�~���yi��7�5�}Oc6���-�����������n��v���RYu����*���t�*��t
@�a���6�jT���e9�/y2���1�ZW��b�����u��7�C}5����e�NRa�z����)="TUP�OVg�V��-������.^���b��"�3��7�l�9%�w\E�r&�.���/�d��:v�����Q�V�Z+?�9lg�s��r���\�vf���	����(�~0������
.����Z!���6�nW��z
$N(}=�o�~K�MA����v.�����{{���w�&��.D���B���X�����5������J��F�&N�D#���������e,+����^m�9`���rL�/��7�����P� u�������j��M58t�-h��|�y��^���6��llZ7���>M�E:R���'�T1�*L�D�j�������3*.��� ��z�9t���|�9���4c2�al��>�wu��F��v+j)�����r�j�"��k@���o�Y�|���j�����;���\��,_0�4�K�l�%�������K}�/)�-v7t%cf$�E�(��z]���+��.�2��P6�cs8?U�_k����#b���&)��L�h��~��j��]�Y�����r���nn��*����J'�DL���g������Y�yV�����_v���W,��$K�����-e2�(3��+U����2�������bb��S�
�z���������v)e;�vqfG�Kl�s^r�2�>!���-��UU����\1��*t!���*�.�o�1\�������m5�Yo%���[&1e�����8F��L��8�h�@�N��[����1�h�kJ��5����^�����������t+Fqe�{�gv����]1��\���q�YrDv����K���"�0d��z&J��0Zs��))N\�"���?0\������S��*�3M.�hl�[���yF��m���]�Y�;F1����Yr����8o1�����I��2�Iua�5� �^�"�� ��'Y��Q�YQ�/�W�7*!\���m:@:��3����<�����\�2yM����(���$������o���v�JE�r�Q����gf*G;v�uS��D��r��������sF�|�/������(��H�#�3����e����n@<�T�h�P�c��"b
�5IF���fI0�G#m��;���U�;-:VK)��W=����l�����_Rx���v��"RX�i�8*I&J,��"d-(Z�n���m��1g��U,�������������[*���o�A/�$mH�#��\
�,K��c��a*�TjjR������>����a�p��p��$���<?d����-gu�=�#!�������b�pE�J���KSt������Fo���y�g{��m��f�����,&�m�|O l�Tus5�U*e
F*6P��
!YgLh��51w���[�v���[�z�����U���4�����	����lV�$�U�'5�erLIq���N�M(�\�'=p�-�n_y�v�����,��!�u!��`_wD�az�\��Vr����zK�/����.�t���
u�^9[�E��5��o0l�j`�o#��d4��y,���LXNZ�YK���JM�;���'n�)E�����|�w�.�����<��>"�JO�S��{3����h4QK��N�m�/���U�XJ����I�r�H+�WY����g��oB�mK���ZJ���nun��k�o�x������O^F��Y��(�X��Z��St���P7k��7F�!�%?F[eM�5+R��[&�R�b��@b���#��e�������n)m��p�������)��J��m{b�$^/���rq�D,�QI��eov��+T�|��U��M�X�f��z9�F���w%e}K�$tFH�\-#s���%Y�Y����G:�rQ/a��*��j���:��EN�?���d�(r��n���9�B��/�s�1��)��j]������<��a�7�WJ9m��������mz[�."�=�d��iY6l��+��HO���NQ��3$�j����+eoW��v���e�;�u�?d�����{9��|��VS��V�)
n�8���"J�)�)�M����+%��t�&�}%�@�����\Y�Kr��Ggc%w��,b����-�����x�5(b�h�%��U=x�z�<+P�����s�~�Y6{4YD�T������D�j��vc\�v��BR����%^8T�8���
���ke]8��o{E�3i����m����~��X�A*C�b�����(��r�9S��V�������V�2/��e��S��X�Q���Z��ZN���A�m�U���v�
z���SS�hP��R�O���y~byM�����������	��w������&{�������wI��1��������Bm�kJ��Hg:��2�&�z��R����I����y.u��9	)�#l��Z��HB,�� ���SvE1�;�ZQS�{9����9d�fe��)^a�v���[j<o|���)I�kL,�Gk1)�3�[,��A�$�)�J�Os��g��NS��B��a6[�c-c�eJm�����i��*pO�3�#;Qh���;��Q��5\��hr��%��-�;����C�m��9��_ZE��3d���-�Y=�N�a+�Q���
��D�t*�>
�j��j��*e��I�
d���m^S����Q-�:\�{��f�{���W��|N����v�]S����U�B9q���>o�!�9��~�l��U�������9>b�#�k������^���<�/i��I'Q��
C��U��9����;��G�.����e�t����u�(_����I�nF�knnvAw'3dX��
7�QS���?I��iTS@$cp9P����[���<������A�����E�����8��&���WOn^��1�3lv���)D���S��b<����.L5�{?��������[{����9I��h��n�%��HfU+�8��$�VV�<d����:�����������1��1m��X�������?���E�is��Y����������"��=���.��P�&.<�����$�IZ
mf��ZL�	V�nZp��1�T��tOW7e���\�9�d|]ua+z�G{����^2r_1���O�Yh�8�b*R��k"�z�R�;n-����{�w����w�����Yk�����Ly��}u�a�Q���m;r����N���1�7b�����LC��U:�9�YyC��%���7g��C��������-���x�����O� ��#��\J�E;X��Q����lC�"��v����q��V�-�X�Euh�����;(����3�����a%���1E��D�B���eQ:7T��}�U��-U!���6��I���[��!���\}���\�}��3������M[73}Yd#��i�z�;����T�(����r�4�n�y���}�u�vrL��,��O��5��B�ti,~�;����	��B1��SM$	J���r�5���:�����'���]���y�K	�2x�2��5��a�Bk�P9=���i)��U����:�u5��-i@��Q��s�1~Z:�q���gu�q8��������)�"����e��p����.�����l��Q�}5�j�n!����yy�rh���r��N����z������_��W"q�u�;;"����3����(������n��:��X����uZ�Jt���iZs+�z���iZV���ZV���[y��H�H�5�y��}����Y������� l�����d�Z7)��7)"&pe��$��
1B�3g8)���]X������^z����r����Y�b���������J�j���Z���@l�=m���z{K9{i�@���I�k0%��g9V=�O�vrL!/+���Iu��l�i�D�E���O*��!���b���!��?�?�v��c;���9�����N\�mXU.Y��j���.�p���N�����;��A%Pp?���U�`��~;�o�=�x��6W�����?����u��ul��L��U#���@6��P�MN���kD(`�os6g+�y.f�zj\�����D�WTO=B[Xr4����-��������2����E�����@V{��{�|���o�RxOgm9>������f���#N���.W��HI4�V��
��C�1�P�]A�Y_t}b��������r������x�&����Wq�
R]����]\S�������u�:�:%!JwIm����������<?�`tAH�{����d��}��w}pQ���%���Z����O�?3�{�i�V�*�Y�T�]��L��]H���e�l\ac��{k����y(�M[�w����E�c���i�lW`���9�sCu{Hu�r��K&���0���B7�r���1v05�pZv�2�u`%%���+�2�v�D��G��N�\��&������������7l���u���9g�/V�J.�Y	[�2��r��n~�%���
�p���p�dU5
~��7�K���oM��}Y����=��e5^�&<��q'��".�.�fv���&�U��3�*O��Ex� ��V�������~����c-m����k��I�xt���j�f����������S.C����Ty������1�Q���9�����KO<�v��4|�&��)IFvF=�jdT�r�7T]�e�uVw��&��Pror���'�l����w���r�#��b2{����C��A<�q[j�����yX�$�Y6�J��sP�Q��;�o����������{w���k��G �7� 1|$��]�������������2\�Ii6L��M^�sH�G��ckD�4�J�C�wF��l�����<eE�k[`m�������^Y�"�&������
��/����V�.J�����i�?[vM�V�i�p~1��#�"������~R9�O�e��w+��]a�j���k^<j ��1=���g����B��>Q����^��KZ�d��*������ME\�����+C���y}_����[d6�f��J��:�?3�t���=Z%�5��R�D�5�WG����t���{c�tj�m�LT�
JK�S��~�o�q��������N����t4�����d�������2}���jc,���������mv^���v�	��j�D�5l�+�
�h�hq����g�-�MC�l����=lU��;C�y�1/����x��1{�J��	[3~��$�WM�"��2z�b��s*��cFy����U��Gi���=�9C9��w��EU���+�[�����ky�^:���\�4�"��t_Z�`6e�3�
,��#[y�<]9�;�+���k&�Wj�%}}]������uG����\�:����hS���.d�s���ew�/%��(��wwo,���3>3���7DV=[���1�j��IZ����c_W
�����W����2�\��������w\�t�T�(X�*%K��;6*�G3�+&��r��s��O@�'�������D?U��>�i��l�<�]��x>��7{&�p���:�d����Y�������v�;`��SV�b-KOs�
�����a�;���h^
h�.G=d���H�J5d�D�������I5�EI����"���]w�lg�8M��r��;��Wm����5��mC�����*8J.Fu�r����c"F����7��"�Y�TlBP�W�SP�W.���y�r�����9�*�w0��qa�����(�B�H�$���/�L�U�����"�Tn������T�k����5��0���Nl��y�n��*�s��)���7Y��d�F��9�L�3�$"F:�UR���kR�~�.�+�:~_�
O|w�l��,���-���$��u��y���\�"l�)#�7���"U:S����B�����h�����?�xG����:��z��w��*m��gG'2�#e9� ��<;y�����8Q�4j���	�����7r���f�m���e�������+��o���/��wIMG[�D���i�Q���*��T�T�SSu�
��%�
�����b&�Szj����F��m5�AKe3�Jx�'������A����My�*��w=EX�b�qM���s���5�6s2g-�7	y�������7> ���Wn���0��g4�a�3�����/WA�8b���������1~O��yz���VD�\B���������/��W4$��s�����k�(X�de��|��
����1:(c\��{S[z�xo��<�����K�������m;��G�7��V����M�YF��*KD��"�+��D����N������9�yb�ieb�=��$����������*���"���d��b �Lz��L��@���G��+?i��im����l�xIdh�6�>s�2�&7��5�gUV�20p�x�+J6l�w*��"���G=k[�o.�@m��/�f�������!���+3��+�%����r3AH����P�R�j��:���>��D�R�s���w�g�5�f���',Zv*��9a�L����l�~!m>tT�|��M��x�tD��*�7]4��69����Lr���:J���)�=�������)�x���UR�\���*LJ����P��iJ���w�kJS��)Z���HU�yDr��^?������n��T�R�v�n�G���w�*�w|�����������������]�{[2���S�n���; ��bj�V�d�V�)^"��m=a��9� �����x�I����^'_V�+F��_,-���2}#p����`�d{5�B����*)*8���w.�rx�����n�������s5�#Fuum�������_�rTr�2I&�n�J���"�����B�:�ns����s>�b�Ue�L���-k��v�c,�V�7����r��IS��
J���,��a�>Q{��{�����6��|o�31�\=l���Yh�F����h�k�{�b�d��R*�**+D��S�A�qa	[�������P��y����zQc��SD���g���UG*����3�q������?�M���V����y���3~�dL��d.��d�S0F�����a��7������bj�=GL�H;1iE)����C�d�����~�si���u���.��anM����cp^��-R��S�����K��K�*�:R��b�zP��J���g�y�_Z����'��Jp5+���XZ������s����T�7&"-{4��nn���i����������%�iCt���+ZR���oj��>���:��(�\�+J��"aJv;=�Y��Z�P��1K�s�Lj�����j���"���_�Z���=���j��)x�������"V��+RV���S�Z}���^������c�)9zo��b���-�1�j��)K�'*c��R���P��M�s��.~j��!I;��
�����	���;���26�����20�m���/ZV�r�3�-Z�����s�G5����s&�e��&������U��n���m�v����X+�1h����:U��G��hg	�M�o��b\������D��b��7��q��kU�a��v"����Q����"5:1Z���(`�.[��>���_QtN^���}n�li{z�����dByS���e�*�[���5.�QI�H�S�V��)B�D����/IG.�d~v2����s���>���k����j?�%��A�_]'�Ir�l�uB�6�j���y$\x:������Y�|���]���%�3n�i.���������Z���nJ��!P�IZp5iN�e�u����Y�����g'��b`<�sc�e7����l�iWW����E����)G/���I�����PW���cm0�������r^���s�!k��ug#��{U�TW�Be��x��+.��&���SU�Xc���|�����& �<�/����(��d�y\������(�J����a ������MR�1kJt�MP��s����\q�{"���l�1�����{��,�U��6��J�Ue��D�R�Z�2���P�
<�3� �S�Z���]qu����$�����*���o[]���{V�Z�l��d�� G��G�d���V�Y����@�')�����-����U��i�������m����6�B�t����
�v���9q"��*1dL��R���S�P���82���v�Z�xT��9����a�����k{�.m��&��'MF�\�R/L������Q~F��q�+�.����b��S����2b�(w��&�����^�fX[�t���r�r�B%��b�=�~�n�Id�7���"�<1���M3e���� �z����A\��,�x�V��'.+(���,c�
����<���(7�V���>r��xr���kb����,��f/��[6r���7�������f�Q7N�!X��|�*�M�QQT�EN��n��S�C���f����
J����5+J���iZ�=j��9ER��+��c�p�iJ�J�*�����@r~���,l?.����/��Yo6b��s�f��.Vvwh���2:rM
s;�]�������1����E�%�~�\�X���m�#���ZX��i%���1�����V��d��q�����EuP��2����pE�N���,��"���#
������/�}z�{K���m9f3v��o�\�."�a%��tn�f-S:G�+�����Vei�t}�x���~���>$�i���nO��ZW�~�p��V��;�35�J�mh���{[��:E�z���x�����k�^��������*i��z������^6��k�8�3�����+G[����I��������(����T^�n�U���U0H��g������c������;cg��7�-a������;�v�a)m���f�.���b��^U��h��)�s*u�D$���Nq���+ZR����b���N�t�c����^�ZV��$M��ZS�i`�v{���f��	�}
�.>_���Qx��j���j��nV������IC��jcW�����U��/��9��1sUd��g~Hc�)3o ���������&��\�H�
�����D������*�A��g7��e��{�rl�����mI��n����m����s�Z=h�22"�N��]�ME[����������8k�R���Y/]��m��S�������/gv�:��\J$��aL����K(�j(b;>�fL_���E������0� �:���r��.��s1J��f��
��6����L�r�3n��GH��v���p���&���G��{cY�����I,L���;��B�V&��]�UB?s���
F�olU��oETQ:T2��z������bL���/bK�[M35��t-���2��}��7t��.���Yh���#��R!U���h�?��������������V1���}e'�-�,��F��6�3��,��M��c��1J�^���/��gF�cM�+�
��J���������O�^���]����C��1	:���+ZR�;'��)����?�_h��Ao��ZS��q�)���'�g���ZT�H��v�J����������k�K���x[2���E�j��>2zI4����]T/�
Zq���[*r��<9�R�����X��������	YUU�$�[Vb�s�U�tN�U����?D��L�Oz���|��5���������{5i�\���D��[�
�C�{�����]�USdI2$���_�����e�W��V���-������� �O+ke,a���$��8mG!.�u�o$��S����Pr���Qd�E��w����
����#�k���v�f�	�6x����-�����FPL����Y�ZVB�jU��z�TH����B��������;B��w��zuB����FJ������K�*$�����!H�[p� �8�%S�bC�s�iir���M��-Xy��A����Q�#m�n_���q���TKv�*��3orQ)ZUW
6%)�SP6W���w	t�.oH`t��2m��{Is�v�t�U���/���
�2P�m���f��9h��M>S�EPm�E��[���W�4t��}��v�A�*W�Nh:|PqC��K�%xq�iC�iJ�-��=�j���{j�Q�&��B�?��� R��~�xv@U����
��
R��2v6����X������{I��:A�������l���"�j5�J��-�6W�S�CQ����n�'.\�i�� ����r�� 5z'����:�4����������S;z�\L�\rU�X��w��uc�7[��w!=H�`I�����V�+U\&�2�,%�c���_p�N��)�7`���(!�W>`:]�|�"5�;��(��i�I��a��u�Zy
Jz������[v���{%G.��#�*�+��k�u ��IC���U�����SP:k����W2FW��w3
a�lh�4[]5fE�I$UF��R����'�l���p�Bl��x<�#/��1���{#�v++X����e���7"R���"���7J!C�����Q4s���!�@�l�Z��jq�����?g�yp�>�d�z�U�9n����S����cm*R�$��y�n\<�LZ��6�j��b��)�\ZV���J������LR���j��->�Mc����;w]k���R�?�Q�X�q5�/�h���5��T��r6/D���J�"��X��RO�k'���7EN�������q�7�Q<��r!��3���l$��B�U�l��r�C�(�W���n�6�q~���`��!���	���14>4��U��s%.q��q���ll��v2��'YKD��
�,�����D���&V�x��R��F�
�C,��G���i+�q8"�IKR�]�hdh�4�`�Y����)X����T���Jt@K��!�9�R�$��������L���l{yaNc��7hJ�6�3��m&W.�U5c�2�X�(N���>|����v����������`uW�L���!���9��V1�Lyn;�cTU��H!;.��B���^�KJ"^9��,�'�m6�18&�v��r��
v�<;5dS`�JR��Q�-P)j�K-�@�'R����U!T-Bi=^�N[P�Nj��9x����w�L�4I$������bY��B��A�
��(N��f7��(N�:�����)����~�y|Z���j��eS���H�pSP��T���z51x�MZT-���fH$��t6D�[6I4H�x�RE*P����
�z�w�
���W�
�{c�V�S!�/6t��-�wx����Og�y^���A�Qt���Tr��p�A�ZUf����V�9��}d<%��gL���b����q�f7����������������������H��������n�i*����X�u���$z����������9g"x�����B��%������+UV�
��%*uO�L���J�OW�������������m�iY��J����SL�{�jVE�jv����U�ux���e1jUjj�h1���O~�&��<lK���1}�x�|�7t1�|�i!C1��n���M��\q�1�F�y��f���	����r���A��g�oe3o-��==yy���eZ.�	[�)_V��#b(�Z�j�^���Q"&~���b����!J��5;���iZ�,�9���h���NRr���9�B�|p�kSV��(\a|��k�R�j����������yK����3����6��\�2W'p.yy����!T��r�,
��[�'I6E�����n������Z����%�r��#�t	�1������!w����73��oC���n$���^�&|��RWQ ��i�J��D�S�J�����k���\R�{�>��mg�d��������B%��2��z����W.
S���5zU�@Q��o�[�j��]���������N������:���/��\�,����n�7�EI����T��"�T�L�	�����+�z�6C mF0�.xEkW ����l�����+pc�s��' ���p�9�t*�b�kU�h��(W����/!m��o{�]���.�jOB�=f�N_�)4��pt)Qpx��&T��d�����W�4\+�pjg���@}TK�?���K������@&���x����������������
Hf���(?[&b�17�#-d��"x�
 �9,[�x���+yF���8mmN�x��k&���R��T���0s��<���$k6��Y�cf�t�`�-�|#lY��G��R�}�+
�5��	V(�r�oN��V�uDX�	�vt������f�k]�mv&2�=�pF8a$��G����G>�S���IB�M�S9hr��>y�lvE���y�r�������Ysbd&[>��fu�7=-����*ej{�16���,B�2������	�����\��}^���r��`�xfh�M[@�L�X�}�n��r����\O���d��<5*T���Z�0m��l=�^d���������v����x�����E;�+��B��#��+5W����"OD��.�B���Z�%7�v�x��e\�`���a�=��;)�/L��U��\�nJZ�;d��[&Q�=��u�F�,�E$�UEd8� �����S����
�������-��%[��/���	d]�6.h���Y�h�rJ%W��@�jr��dh�a�Y���?��r����U@�?���[��ZI�jy���b�bv��X�����s���� �����_����L^������{�eR�)C�LX6%�b�5�d�7q���i+���,��H�"�3�3<�*�"�T���J���KZ��(�v��eY);B��-{E	RY�6�����%SEWi�"�1Z��=+ZR��;>n��~$�����5\%����f5����l��}J�����P���h�}�J�J��.�h�JP��b��5�j>V����:�W3�������;q������������
��!�y+Aw��tZ�5�n�9�@�f�~�U�)H��$�$�6"��/�b�8h����2j��f)�P��LZ���iZTu}k[zR{�v�/�������d����fF-�f��p�Z7�z��3�EO�
ZV��=�A��s�{W���iE��6$�K�|�����evK?���[�8���k*Wq�T���qB����T ����>m\�6�������;rg��S������e�~EJ��0�[��E�V�t- �7}*�S��z���4���"���y��+��x�������r����r��l�|�u&[���P|��"��r�b9��)��*B��z�m�������u��u7�-��l���t�t,��n��S�5hR��kZ���jJnY{���+;�����k���[
��L�M����Y��ZKj1<u$"��Ic6��hU�f���8���������G�ad�b[x��p�Q,��Qf�S7��C�JQV��p��"��/\���^�f�C���L+��,�UI'�,�HU*�^7�[�J��T�7�Tr���[61���>sHN����;������W�a2-�x(����hu�n�[�D�a����
�$���U�e*�����b�����g5X��b�3;��=����dqr�I��{B&R7II�����l������F�)��.�3��i���r��]d���{cn��Vxf��8�u�J�aL���S,��Kx�_��U��{�5�Fw���;�=�Z��2u��v�S-�`\���|�}�|;��k��.9�2Q�I�����H��Y�n�oSN�EE�0��������y����l�m��[���	cY��!�����$^6�n���rRx���/|\�&M����O/]��|z��N��Ce�����W0B���+o��6��������V��<|C��T���U�H�"��C�z�?�����-��k 5��:���W7�>%?�~%��e������T8wa2��k1�a���fZ����G1Y�mM���>�l���M��Q������L����4��0U���Gzr����Y������x��]�a����7�������3���^�2i��.iD���T�v�dr�K��z��n�$�;C"v��������3s�6r�j��2~���xT�/c���u��%C�q���al�o����<�?�U��2�"�@��cs���<c�R� ��;>n����H��a�E��:�iZJq�Q�0|l$��[�!^u��3q��nRv�
������d�T�
D��`�_����3�_PV����61���[�M��<��IEb��"�G����h�#�9����9+s"�����Np��X��D}\�����j���Bw�g��[��YZ�~���/���������&4�W�r���a��G$��LY!~H\�-������"��W��c*�����5k^�d��.�L���t�dS�������Y32�"�4�t�R�R���4�(���5����9�sy��K�f�.}����m�k�8�����-�M�-�-�4�v��6~�^��7"Ji$VP=�NVv���Yvq�.��+�V6�V�EkZ����aL���������I��t���t�����S��
��C;��j.N���egXS���h���v�*�yx�K'D7�	(��L���r�z��������KG<kGi�A��9�nYdK��-Z\��d�3r+I���#+���ke�RH�����/\��E2��T�C��*�\�<��V^/+c��~��>������vO]���B�vY�iGU�Wm#&������j(C���L8>f�Y�{s��M���J���]���� �n�AGO-���u����	8�Do&�~��#����qAuKJ�H�}�����_������������0������@
����Q����Z����@N6���3����R��tF�������7I���z�8$��}DQO�8��n��WC�&E�Z����|��[f�������/������~V�K�:�}���c/jt"���cd��U;A�S���jGQ��=ME*���L����[��i6�����v�c��;>����:���nf���N���u�e��b�Z0T����0I�_"W�b�e�b5�_$���d.V7�=��N�v����	�n^�fvgJ�R���N��<J6�k���:���
��5�+�"�k	��wW��s�_RY���j>�;�_8U�j.G��*f�JZP>~�U�>�WnoV���|�\}����M 2�`������?|m�\��
�E��G���F���Vj��'���L��Gs���aw��u�d��9��bY�).���6�-��Q�jz���,��Nc*z���H�KR�7#����5����/�9��f�������]���m�>xk$�8v��Q'X�e��^�FF�=Ljqb���|M�3g�����e��Z��4-��+'%���i?uc������nv����uJUP9���=(rV��+@����v����`L
�p�IST���.0���Rf�K^��-L��x���zU�%��� �T����,-���`fu+nV�F�m���aGp�>/��V<�&����{�E��z����Iz���*�mGe8h�8S�4k��f9��O�*��7}��3f3>D��k7�1tF������V3�;����f(!G�"h��L�*��I�@Z��ZjkB��E1N�������Y���J��IU�9L�i���8���T�-���P���-���������t�K��r�R�=�����E���Q3�&����s��H��(�t�l&�z�����b6��
��|G,��p��n^��3�d���#X�'*��G��=Pn�K�U$������^��F�!����[.���h�[
��{����k�];n�����|���]*,�$*��+��U$��
�n��.^T�7�����K=b��S������kv���w�%9q���g�@I�
��_�[[M���c9���m����n`nqz�T�����~�h���$�K9�H_v����QVqr���q�����
C�D�@��V+`�����w[1��L�Yy�c��R���I��K[���4�D�h��V���s(��S�:e��#�T�S�}��_�n�sW�M��2�`K=���"���k��������Y����3i	)��%{L�,�"���:�	�{�O����^;���Mq����������� �!s�73)�����K����]��n���R�3�@o����9��S�����4���6��F��eb������j���4�d%d�S�P��S�zE)�3��`��q\��=�e�]x�T9g��
��	�>��J����rh��(����'��z)�h�u"�'����j����V���|�|����^-h���J���.�r)n���F���C=z��I#��X������4���%�*�X*��vM�����$m�fA!n@0)���Z"��I���k^���;D��6C��]���%�S�@����=�����k�k�a��%AE]k
c��p�A3��d�H63|s��f��N��g�tQeO����]^��-k"6����B��oF���������6%4[��+Z��I2��S����������o�d�#W�?�t��q�rm���3���n���7����n32,��(�K�^��*��mZ����}��^T�m�����;~��3T~��S;k��?%��[p7<1����52�.Ae�\���������*"�S�7����W���]$b�[z���Ap]���UZ������Zr25/�*fr�ZR�N�K���-
�1~V�,u�����+���G{N���v���B��q��]E�J��zJuu1�J�ZPO�U���0>;�.X���1���N��y����~��p�4�Q��s���Q#K���s�.�D��7Q���M�j,�bn&�e�}k5��]��1������E�#��K���,}.i������
O����<"u*� D�L�
�z���4���|��R"����}�^��� �;!@[������W��W<��$��/�F�����3���_+C[N��Z6�Q�dlf�^6�D^���Y?�*z<�k>�!���
XG'��-rY.��l�����#b������v�M4z���VZ'�Jt@g'
�v��]"���QQ���"�8AbU5�Y)R��-jS��+J����3���U�w=��yz�3��JaI�	%0u��o�WuW�$����TQU�eV���5jc���@He�n[��$]�jAC[�#4��m�z-�,$C)�A�\LiA�$�`�$�KO�@��-I�s��]����]����o8��;FW(�����z=jw�(�#6j�j��H���0�w�<	�69q����m�q�&X�IY�J�����g�Y�t�x��WI7h&�t�pB�B�ECP�5*�����[e���ZV��`Y0q���e��-�^����\$Zi6j��E*h��e!KJR��t���0v���1��b,q�����t����t
�o�S�F����]4�$jP�8N�P������3�O/=g����K��_����KGZQ�LjtP�p���c9iZ�����RT�)���y�j���F/L���]���6���������v�����m� [z�������A���G�R�#D���^�xU����Ge%�6Cc�a!.��kh�k*��`��AV���\(.�Iu�M�4*�"������r�_�}r�c1V�8�cXg2b�LeiBYV�'����U�0��(7��V1�]j�������@k~u����f�e�^�
o��tZ?�oQiI]���R�l���V�t��R�*]���%;�N�
���g�+'`�cabwCw������kG�B��,��A�z*�^�^�L��*s��,�Xzo���3�����	���$Rh��c�1���.�\�IL�U�������d����Qj�uHE����)���7��[1��NOf!�n�Vz}��GYb<��
m33K�f��!��9�$���j�kD���3��k��Yhc�����:XmfY�m-,�e[��+�=[2�ep��h�I%�H��T�j(N�@��C"YvU���j�����dX�d$m�h���;~��m�v�c		�M�5l��( �HB��-)J��&9�2��s�<�eZ���.`n������K��)G1��3),���J�5�58���f�����{�Z�b#���c�#���}6K+Y�VM�Y�J&Y)�bm�PEGn(�TY��UB�5hR��;	tBL�7,De�n\QRS�3l�CM�K�<|�D�c��-\����Ab��!�R���u�T��S�gm}d�X�[�D�'�HlG`[6	���Q�s-�����d��H�t�B{�tK�����i��^6�B�m\�y��������r�*��k���k"yv���W5�&�'j(�6�gTENu
J��Ch�t\����g��e�l+?'c����n{��"n�R}��E;ZZq%�.R��9:��R��9x��kn����9�����l	!z������+q��UE���G"W�AE�Q$�S)�cP�5x��9��.,���������}�I&�2������I��v�QT�g�p��~��JT��"�7
t�^�#�7X"3��9��r?bT����������'��e����6�~�T��F<�&�)F�+����e}Z��9���8��}�go�k�U�-��V����C���f���z�UV�N���Nd���R���+�\v\C<�z?���ai<��a�!p���~6��QE�\1K ��j��UE;i��c���Z������V{��&�����8��I�=��������J:E�����$�e�]�t!S�Z��dP���Z�?�
b]���ck#�T��nX8����m(N�H�1&h�(D�n��;]w+����*��=jcV�
a�\��x����$��,�����"D$o��Z2d�I��J��lWO*J��9UJ��
V��u�Su�T`�[:�����/�R�1V?�l��9�)J8�^	�*�R�-)C�9�N�P^�S5�k`��{-��{;�����������{��M����'[,�CV������~�@c�{����:����H��)v>oVn��{�-+~�U�Jr��v�h����D�(CR��Z��:���JjR��+J���J������=�u��U�%bk���N�����YKSY�VE����I&.7Q� w�Sl�%W�:U"I��E2����z��v)�v���/���nC���t�K6��)�v[e�An�~�j&���J� +�����/0.Z�3��Kv4kRI�%2��
Mx]X�)�&b�����2����)c$Y*~�V0�.��5�Koy�k��k.W��n�=��|�����a�a��Q.�r�����xFRyR���;&)EQcI��u��B����5L$/�w.mX�1��Kp�m<����{������U��c������,�H�'�����\>�������dL��I�~
��Xh���q�<
K�3.B��&4�z�0������G�+�E�FUC�2f�jZ���b�Q��v?�qF�m,_���KGZv�l�v�U�p�%4��"�Yu(�)�QC��Lj�����v���d�6"������F*��������7�
Z�C\��d
��f��dD�]s�n�8pE>�t
��>��AWh��
���r*���'��r���As�U�C�I�wM�P���A%���^��Z�@{��c���l"�����Z���u��60����SL�����	1h�b]<IJ��:E��C��h�#���7�+�y[c\�~`��k�
�7��q\���p�e���&�U�c�����Y��5N�'�zI'R�d���{�gq.s��N]�7G{�qX9���m)�D�#3y()��n��;n��t�R*�Z���h�����8KV������j"6��-�(��0p0P��
�����V���v�����JB��(��w�,�^9G.W<�]'�;�1�0��w�.L5cK\�s��*�'&�;fj>x��!���TR�)M��JT�Z�	�>��Vv'���]�1�G�P6�,U�|BX����bn���$t��[D�j�%�1QH�L��HZP:~��.����km��L�mH--m��K�-�$�
6v�y�U��'B����ahZ�B��dlQ��f�-�S�q�������v����-��B��A��$.	$#U�,���D�e9�=Ls��
K��Xr��������=S���&[�O/IL��KH\-V#�'����������	Z��5OZ�@mX�8[<c9<1�qN>�x�e(t%1��i�\�C����J@�knUZV��6n�^	t�btjZp�j@�Z��Dm�m�q��;6���p����I��M4PE2��!JR���(��t�x&[%O�|5�1T�e���/`Y�6��G�.���]��T�|��\�g�s��*~=%OSg�2�#���\��4��?*���6�U�[��U�q6��Fe�33	���Qv�����u�*�/��v�KZ���#`-�r&:
�x��XH�d�����hR$�f�&�("�
B�)iJR��2��k�r������F!�� �<�+��.;�/+�L������r�W��U�5Z�49+�"����Z�3r�&�j"�dUHt�IRD�MB�N��7��kJ���Z�[���+������^��5uL>ZNZM�	��,����W/�c���WUSV�QEQ5OZ�5kP�i����o��V5�n�v�2&ol�p�������c��-�%Nc�I2���k��j]�����n��Z���7v�&9b�2��W;���m�����G���7����(����������O�U
Z�l�x
��?��;�q�g����d$�\�jC^V��we�Xy�VG�l�J�P�9
�)���;m�a�8�����7�������-{:��a�[���nC5+�8H�$��V�����)��-)JPl�e��\�����;�&3��k>�,��'f@>����&wG��-���~������ ��-h��xtVV����-��m)�#���c]Q����u�sZ�b�������If�Q5JSU5�1x������
O��9`��\/����Q�V�����JbK61[���b�l��6�6�Qh���,������!�S�j�<m�1��-|_�,�c��&)+B��!�������2����M���5h�d�8���kP�5��B�<����i��Ll{����_��VS����c�����N����Y��&�2g�\�B�V�-*c�~)�������Y9S��L�����x�sMMJ�����E�U�q�J�*���E�+JT���/����;�Z57��e�i�]X�Z�����z}(��L�Q�[W�?I��u��-xS�e�]v������I�9�e6���Y�j}f������'GTl�^��Y�U���3d��88^�8,�H9����6�c��gqe��_v<�5��������,L��}���MV�U�����S��Md��kC��wn����v���"m�V����-�n=�L�o��N2)�H�f�$�
��B�4�R�-)@�M��.�kr"����+R����-��iB^P�W�����a<�����\����9(��J�9�P� 0m����v��Ocn��n<�a�V
��S�����V�5h�������O$�
Q��4�����Ju��~f�����bc'��X�����`�R&V5�UA�|�k�(��*C���S���ZTx�ry�W
v�|�����CYDf��c�i.��_7�i�4IR,R�C&�:&�p�	���������a
��|\LS6������
��hR$�)�"i&J��)JR���u/W�����Ek���k�/�����;��e�X���f����REB��V��S8�L�"#Z�2��c`u_Z�����vkb\�l[3��m��a[w�\��Yh��wAs ��(t�J�3T��Z���i��
[�b���2h�m��h�*"��f���M4�R��-)B���)JP��k��sE���8w����nFY��g�� d����I�1v�����r�1dB6Uz��l�����f'�������X9���#��&������7��Y������\�H�Eb��'Z��1k���G-�_��d#bi��Z��,Q�r}����m���k�$���k$�W-[�j��(DTL�J�58��xXh�r&���c�1�,�bbb���ll{&�*h��$"H�B��!hR���j���B�VgSb��������}-(L�jb&�i)<�f����1���G/Rr�'nU5"�C�5*�:k���!lm�Xk��	gH?������
���I3c>��A�u�*��:
��PK�=/��Dc1�����*7�{�l]�m�FF~���H�r�M�t����T��c������j�@����=������9�#[�����",���y��hH���j�_=j�X1*h�X��[7/�B��6���Kj��<;��]�o]q7���,�+�
&��Ev��3���M�t�9I''J�UBq����f0Qnr��kOu�~a�x�f�m���q�����o��������#6�c�5 �����Uv��S��x�QZ�?������m��[�b��EmFy�Q�2^Nqv^����I8��al�H/E�	���L~�'{�:a��:.M�8�4Xf*�VE��1�����l{���l\���Uf�DQI�)NN�x��*��NR���z���T�+w�'K��3I����<�[?�����u!~P�T�����
�R�'�98{�m|�6�!�����8��c��b�� �[��;c)U��h���UeLu��?IU�1�X�P�5CL.�S:}�1{�Rcnm����VJZ��	0B^����mys������1�"�<mi�!5�h�F�i���f�����?n1��v8����L:]�f;����^���m7d?�yJ�������G*���S�(g,)�����<q����KG�[>
��m�H�������:":����z���B���p����5kPtyz��0�;m�
���4�\������,�/z��Z��-w�#(��G��h��8�d*��R�
��V����dH|�c�Lm�x[��H��e��!��8YX���1�gi_Ro"���MD�]��N��N������
�������|���>o������q�(����s���H�����f��;UJ4F���
��zfxE���8nF��������m���Lh������?tZ��lW,cg��5�|�e���������$���S���WJt7U9x�W�GQ1clS�%��+�n4��v�N����"��\7����V�Y�L�q���$*d-8�
*��@����,Lg<��m�72�sw^����8���������Tu�&����)	�?U�\���j��ZM��K�v�r�6�`�[0��j��:�y{����be��e�v8}.�6�Yj�l�����=I:��n����O�V�������i�F�Y�O�{��f��k'����V+�c@&���Y�����UKJ/Z�P��*}�]����p�/-��u���/��y�wb����^��i!��G+:K��+��uj��P��l�jV��u����Id�Ay�
�v�<��m,��r]�)s���/�,��	,C���xT���1�P�����m(��n�kM��9��
f��mRM�W"�\���ni���.�o��U��n(wO�����B���xZV��i]-��v��m��J��ve��f������rf�"�M�e�D�!�n�
��*JtO�6�������m�k���X{�E���}=�sj������d	IEQE�$�[�2�X�=j��o���.S:	��*��X�c����D�W	/��t$�^�J����������j��92L[����B����s���F9�����>
��n1��g,�k����xg��&������1uV�(�+(�X�)
�hp�1U���n;�����6�U��,+x���f��-��m����>s��I*,������s��j����������}�~c������K2��m/o\���C1����vS&�+$s�5?f��iJ�"gX=_�T�{���=�5���[���Y2S�''��V<��UX9��-k�]�WI�I�����P�$��!���r"�u�9A\��z��O,�In+����|_;y�D��-z���b���Az��".��!HP���)����,����m�����C�� A:���b:}��D���E����"c���B��B����ns�`�]�����s`��g�Z��������d�������p�{$�u�e�G��J8��V���d�T)�-(u(p�m��u�B�e��GT#P�4�%�����"�n��3�;y5;h�R�#L���c>t�d�rj�E���1�����"���b�ui��=k[��V�;�"A[V��(G������\Ue�r�kUVUET�UC����+��G�l�'�M���Es�q��u���|)/KG��M�AK�VN�i�'���t7Y�N�D�������?1����k����r;�L�e�9t����3��a%��	�s�&Hu���Y#8M��H��kPOU�_R�q�m����a����$�j��r%��rz�|�k�=���b��W��$,�l�6����C$�*h�E��B��w[�����hLd����J�e��S|��B:-uNcw���S��u��pzP��
J��xt���+��[��t�{V'&�Z��d��r������S�U^��������IS�E&�CR���ZW�	@�m+v��n���Fn��m��J��p��P��nH�a��U��T�p�eR1�P��
Z���
�0>�i��h����X,���!�%.)�{i��t���'u�+;:�Y������g+�*�jRS�IB������%�{w�5�)l4��}�FH�X�S��.�u["���\��L��~�	N�%��I$�;T�����p��;��fcno��>c��C��e��{�'�Z����7s310S����I�d��g�e1t�C���$����1�3���o2����s�1��lv��os�ku�����|�L�v[�������o�{�\��H�A����j::�l�L7.���H�����`%r3��
7��V
�99?o[��_��I\���iF�
2�n��Af4F���P����\�j!tM�?��t�]���q�&9qS;p��[z�e^���M�B���������g����^�.��,u��&�=���L���Vjr�V&&�V�:*���]�rc.��G.Nn&���)J+�z�8�msn������=�����2A���F�
�o5�g���~�K
U88�,vQ:�j��j������']��o{)��i;���������w^��#>&�4T|����#W�I�O^���\f��N���2���G������kX��O#;���Z���O'�����wy����������j�Or����2�"�N%�l^����m�C������/��Q�?��<[�����/j����"v���hH"wP�.�I%�1���>�NS�����'�8{npvC��j���N%�-�k�7=m�*���i�dJr�r��c&��u�v�Hn$�+Z��-C���=�u�c��m�,�_���
������J�����	eWt��I2���]ET7�s�5C&�����r����pg����d���y��E�������K��Y��f�����jH;�I*V�����E=�
���4�]��}���"��Y=��������mx�9	<����ca1pXD���]i"����J���7�������� lM��PyQ������=I)�R��Hu]���|Z.YJ4A��G������IUtT2IT��t�D�s��S�F4O�Gwl��-k���$��Y��Q2�4��x<|���ZG0iN���n�I��%
<s����a2��d��
&.��d���c����u�rK�vg�dd,�
a�ZK8T�Q��Z���5L�L���0]����ti
���[������1��������2���_����-&WTvu��2�S��:����T��:��l��������l�39p�Wj��
���]�rc,��G.Nj��8��)@�8�C�gm�o�+��g6*�����G=�xIV��m��l����2o��aJ�+�;(�S6L�5MS����5gl��[���������~=�6�e�">R���#����������\�$��j4]C�T�W�L��k@�`{r��<���V��z�l>�k8�[�q���
�Gp��CA��6�$�xiyL��F�2����m�*�M�r�Y�p�)�����y���W�����l[�:����t��]�&E�QT�]���UARdNEHC� �������[���$�I,Y���9�<�g��Q�Z��'��S�Vj�djN)��O���U�q��v�$�M��q����dZq�D[��;s�D�FG���:g9�_d�1�j���ju�Yh��)y��Ep����)�s^�7���5��5��� 
%X:�<��U�J�J���
�n�/�H�1�-�I����eZwsk��jK���e`�v��!��p������t������MJ�:�4�@��u���K��|Y���Z�6�m�����s����(�`m�v�::���� �%:���x��5kZ�r���+U$�>�,�/M��[��lK	���/2�]MUd��������x�����R�'Y����_vwUu�sq���SkfWp����b�l���Y�j%p[��E�\�b��[IG9A�EQB�ZC���K���+��_)Y���m���n�T�{$_�#&\v��yA>��,k7z��^�:���!��zJ,z��k^ %��a��g����i��Kj��v%�������Q*Fm��t�����2�\(sV��MP{#��r����;o���c�����~����:�A��%����,��B����2�Q�c��U8�V���H6�i��o,y���
��9s��73g)H@K���'=i\�
����"J(�E�Az�'O�c��:����d��j�2�#�$-k�$���[�����k'f3��2,��S��H�lGd�R�J��_:'��o�������K��i�q�2Y.���`l����W�mv��{J���*�`�����!�Z'RJ�=q��s���g�YK�eH�����������{)f���Jr�r��s&��u�v�Hn$���-LZ�f�8��%��;�����%���}`�I���,�j�'	Y9��;pd�H�2��QU+����kP�`5ZJ��o.����to�w�+���.J5�v8��s����iZ�QF�n�`G*T)��*j6^f"������������p�,Z��L�I�3)(�X��:.8D�Et!��b�-k@[�������E�����2�e�#.\��u�{���GI�5m��NJ�Y1���h��R�>���=���{�.�������{����e���[��f�,�k�Y�����Q�2Qju�����P�����Z��j����;PrE��1�E9����E�g]�"���E��p��I�A��]�*�9��7H��g�����B����0��kd{6����������:���R����sE�=	"�+J�MVUKJ��)�JV�5Fysi�-���:y�<VZ���K��n��{���g��N��L��2N��
�*h6Ib�N'=	�P�0u��V�+q�'1�|�p �B?)R���ng1���l��!"��~�N�A���T�"G���RP� `?
&E�Q%C�����!��1k���x��3�MZ���n,G���Yb]���O�"�r]�c����b�.Fi����A�k��5I�D�MP��zU0m����O|�9����H������������u�x�%!��b��]���s���*���M�V�s��B�V��>7���7G��e������e����A�W�k��e�4�{_�=d���uD�!B�p�$�J4�Oryv]���bK��N5�2�%�[7msY7c3��}V.�!���7
4r�NY>f�N�B*��P�5J�3��/�Zwe�~�q��l���s�3Y"_��Z��I6Kn9K�Q�l���H.�Z�C�dQ��S�O�F�rS���B�g���[an|���8��]�r]������F��1������#tJT�T��E*H2��g�.���<�l�P�-��#�*��<�|�����zUdk���W{3$T*��n���I��Ji���9mH�
[��yr?X1�q���%�IkK������&��/d��~��P�R�I�*��)�T���t?V�a��i��5����I����Mu^1M����$�����W��dLU�Ed;��~�BP����|����.j��{qDE�BI�V�P�LJEH7��j��=�ERV��jE	Zq�;1����n6�V{��Q`�,U������ZUR8/E���f������?����W�����ju����j������������V�bI���3ZEI��������v�T�'��gS�@�5>���f���I��]j�������pT�X�G��;���S�M3�-+Z��JV�5Bw�_����M����k�j�������U������I9D��QU������J�SP�=)^��b7H?��8����<qt��md+�����9������D�v���\��F���j�:�p�h��1=b��k�����Kh��J�3CAR��R�sj6M���%*���V=��7=(^�>gZb�`�Ptd�D�K/
+,�w*3p�c���A�4��j��LzBP���j���N4���@`�����\h�1��W�p�1g3o/y^��cI����DZfD�(�����H�f�
C��C����XK����v�B2Q�Y��*�^�z�\�v�bq)�Q3�5+���+@�	�v�]�����-�l�z���K5����Zg�Q���Y!^�uj�7��*J���45Un������+��������+&�r/�0��3��� \��V�~��u��:�Ee)�-
�Ns�-k@�5d�F��[�:e��)��wM�'#�H��qh���"���Wm�5r��^����1�JV��Z���Q�g;m6���f��z}wV���d��P��H�q�Z.��R����1o#�����	J�������6�6�k>����di+��n�y��,9lZt���Im��&'��\��G�hc�S��4�*b�$9CN�Y�V��u��i�a*�5��F���Ybos���!���7VA9
AB��J�"�FUj z����!@?7�{8��������y�e��*�=��v����6�Q����k��3E�B&����g6V��Q�"�}����e�m�M�<�5�e/�]��R��8�.�B�}�K�R��6��[D��A<�1�P���M>���	Sc�_j�����1�s$��~f|��9��:�e�������Z6�fXpj'F,�T���;f��"�nuL��P�.~m�k��S[n��.��oRe���Y�>A���(����c�7]��EV�u��h�^���^�N�&@*�$��r��L���Z��!kZ�7�Q�Z������{4���6�o���>`��%��){r���� [���p�m��|a�v���n�*���V�MT��'�jT��:)�b�P���o+[>�a�����r��
=�����w�U�.�i6o������s j�h�i�3dL�%
���b�������!��:�����[���m-q[��I'
7
&��E�WM�MdH�)�j��*���������[�����1#�l�E���JS.c�>X�%g;!z���4"�#����s��$�J�Z�d����;'�6�������9.������4���-w���mf�-�af����J2X�E�T��l�:+"J���Z�vw�U�z��9gi�ck
zm+^������o��u�N�j��-����u��L�QG�@�)�*�ST#�
z��/�2�>�y:��}4�r��k{=�
z��V�H�w�F[��_I��u2
�<��S:��D�2���
���eZ���[��G���i�������,y9�Yj]�;z���W{T��p���@��j�G���6���v�n�F�k����wR����r��
��R^Q���0�P�+z�W�\��M�#��*e
R$��(dl#�as�!������KZ��6t�o��[m��{��\lK%[��vs�������j���P���Sq-)�97j5��=�r�d����O����tM�pd�X���}j5_��E]�K���c(�d-*s������7������~����3�a��/;���J.��!��U�����	�9Zvjc�-*cR��+���8c�C-�+�!�K���f^�����.8G|h�F1�]��j���b���R���+@���\���n0�V5���+����a����\X�Bs�J9���n4j��n�:'S��t�!�S���D�)<K�����mm��[��'���s^y�+�|�k���+�� 0�������fV�N����3���L�YB�E(h�������C���������9��M��J���1��k�A�FB6yK*�b�."(�l�<Q��u������MR��@���$\��.��_Y�_.�*��$[L[�5�6�Y�L��C%�8AB�����1M���P�x�`���6��?��e��[U������M���!�F���Eb��EY��!���MR��I��}�9>���7�m������\6��hMG�V��$�0����QV���J�����-i�TkR�Q��1�s��&/�^��h���&�`!�{�4�qp�;f�)?�%RH�!8��	Z�����E�l��%��.����fB�L�l�]�p�q=�q�FR��������r�t�r�i������-j�����k��W}�u�p�Q�� v�LT��T���U<��B�#FH\A$p���wB�^��z��J��,�-�U��Rn��J,��(D�E�S�����)JR��1�^�f�#&��C����k�����/��KV�a����$��j�I��-�o�^�Em����{��cvB����9����(���'��+�Q5Jd��^5S=8R�����k_��{S����{�ls�7������@���"W;��)����F^VYD
r�t�Y.d�ZJ����G1�����R6o��;i��6��,�>���3��$���r��e'[�I�Q�9�ZJ���1M��d6A@s�l{:�������I��+j���u���yBU�El����P�M%�b���R����Q���c0�{3��\)b����lM�~L��Z��j��m�SP�9x�
,F�&c�i(~����.������������4V%L�������ZR��y��������Kk)X�2���N���}�b]q�T��B���W��X�d�C�j�T�E�q�N�
��1��=����XsD�'��?�m���h��X�-a�D���"L�]R�Yk�&h�8�O���U�Sq0h'(LAs���~P��������.Af�	��(�9\��3]��Z��:�Q�'V32���U���D�*jT�	����7��v�m�\�I�W�ik
���,v,�FRA����Z��RI�I�^���V���>�S/���������2�~9���]���O�L�����v*�����������t�^��akk�%�����snF�����]ol�&���-�=#2�D�*�V�:�.������?���{����XX{I=���?1��:^�Ecq?Rj@������m��pb����H�Nz���T7���#>B_���_���g�Ubg=����Q�5������~��z�6����}�h[��E����*��D�9hj��)�V�=�����W�M\[c5������l�}mD���s�y�$n	���$�����G��j�*���t�T�!'���e�(��P��NE�z�����%Y�
������_�����6ht�S�Q/�r}W�3��&�a�l�u�m��O�2vS���
/x]��Sv�'���N�B���b��u7E2%Z��1���-m��5����������N�_Yz����'�"���ku\���P��D��t�6�)te��j�V����{�
��6cw�����?P������65V�NN����
�Y|��\��>*�9�*]�U��5	�b�fhT��y�����s��WW�{�Ye��tb;���5��w}�3Y�h-s��#-I�h�:�T](����Z�����R����. ���Vq!r
�p�`���Y���q�+defh����i�ZED��N�����v�U��49Wf+������-]��x���NW��#%GG2���&���r�����,iv�k+n��"����>�NL���hH�R��
ZP�-)B���)JR�)JR�`�_=j�;t�J0��c�<l����[��e���1�������2.���
�se��-�V�"m���9R����7�������j��uy�lf���2��qF6��j����%R"��P���Md�E�:��\k�������X�|n������ey?������Y��������W&�\�7�*V��Q��F�C&������v�U���4�9�~Lf���1����1/$t�fG�O-�q'g"�B���+�zU�M�J�"��
S�KlK'&��1,w��j��o-��v��e^q�%�s@I��Y��,��k5v�d�R*����xV�5�����Q�W�+��B�������g�1���l+���L�\�-^4��yf*��Mr$�U#$�hBS�Zp�~���kX<�X��5�gY��}��n���x�06��oB��������M&��A4�n���d)JB���H���b���t����cgG��AH�|������3��������qdY"U����SD'���L�G���kz�W���y�jYe�������I�12��K�>��fN�'h�JQ4��u$��)���z:�1��@*���W?������V�b����w�	���g[Z��y�����5��g��0���
���#VG��q��k4V
q*�Z���P:�8e�ZcQ5�V�'[��[����6/Y6o@c�����U-6��ik���Qh��1{��b�&eZP�$�����p�ZSk�>$���w&�������0��%�f�c,����o�v��^�R�B$����z�n���j��"��'-+_J��3�5?^6%,HX�����������%��l�Uu��&��[���;��Y?H�jb���n�h� ��U�l�^������=�zE�M��8�*��RB������*����3��|�
�;�KJP�T��J��
F����,������s<����~���mn�+5,��7a�U�����}nYP31q����<M%{e����:�*@����_����6����z��[il�o�>Hjl�v�F��"�
�i�V��"��:���%3P�qV��S�4�!5>�����OX|��JE+/x�l9y�1����q�]���=n��aM�td�p�6�9�b�����,�C����G�/��/�!����*Y�YZI�V����p��|�������.���r���[���r���]�)ESeJ���b�����
%�����>��[�#��\���f����v� �V�)X\e'���J,���N��=����*��I�miT�h9�i&Z�t[]n}�r�f�r��=y�Z�`�up��s�!i��-��*Z��Vfa$�F1�Q(�Q*j�����jfk��;�Y�k,I{���Y�i3��=X�����n����u*j�J��+2���j�I3����(`��U�5�������]�Lf����L��,�X1w���(��������2����Z��jf�z��z��~i���?P0���^���t��{�8	fQ�=�b�sV���mv�$e��E`��z4��H��p�7	��HW�{K����vo,�~g��m"���kff��������������f�cd^,�$��U�S��/@�(h���y�Ty]�b]�����-��_�=�EVz�S��\���=^�*T�zS���iJ��1�e
T���ZC\��+�/����Y����F�=��6�f���d��*��JG��HZ��r�����(Y�d��jn���z��s�3�7���pb7����"c�=�������N��UB���F�2)��V1�D�g�F��s�����[��{$a\/}e_7>N��E����]j>�x�I��w�ES3v]�,��:&)H�B��a�"�6�j\����%�d@I]w���jZ6�2I�1r��%�����AS�r���7@�9iS����N������A����4��M������|�`��{J����Y�*����*S���r�����"����������9��i�R��r+\���V"�nt5k`��j5��sX�����N>���l��+$�gi-#V��"���51$�������bu�a
��<q�
����%q�b$��u��5�h���������Y*����h�:�]F����q��i���bX;��.<co���b�'xOi�rB�B���.*�V�y�
RK�=�I��ld�S�Mf1k �D�����i�/��GJ������>MDY��l=�i��A�T���\W��D��tR*�L��3.j2��=d>x&����0�/�3���;�v%�X{3�6�z�b}l��.��Ro3q�dU��Pp��k��j�I?n�;q�^�j�4.L��
'��m7P��������|T�sghWeS'Z74�r���Wy>����L�!iJ�5�)^9�b��15��o������0����.�uw���\����Lb6xE��s��Y�T��H��e�mn���Y����DkX,��/�d�g�pv�����%�V�"�Y9U'd��Ct��i^ (���8�{o�Z]�s�6�-h^F8i�%�'��������Mw���rP����70�N���(�S���X�"e�hg=�Y�Ky����}=)m���:�d��������;(0���f>��$��	�/����?C�C�5w�Z���+\����o�{E��L���m���������*�������5kZ�e�PH�H�J����rq.~���Z���y��kk$�N��r��)�r���MJ���i��Yi��%s���zoe���9�
����3%��.�����d���,�����
���v�=z��\���*6������'�j��x���Q���Y���o������l�q�2q*]�����U7(D�7��'J�1iP�V
)��0�NS������"�2j���P�:g�*Z������O��^�td������$������V�=`��.��i��F��!Jz��'S���KC���(b�k���'�y�}a�}��DJ�����)E�^���n^��T��N�QD�C�9c��KZ�9]f��C���(�x�D#�h6539%�����Xu���ED�����\H�x�5IOt��(w_\��>Q����}$�]���#h�n^�_��qS�T����8����JS�R��R����A���r���0m����Q�!��%���W���su����L�ZAXyi��������%zjP��}h}|����c���������gf�i��/*�R��1"���F�Y�����xC�Y����]38cU�2&�����'wy�Hl��b�I�����.�o$���e���p]P\��7��,��Ad�+�@�-C�5�Q@�X�)I�������;��9{�	��3�,��we��(\gz/)7r��������!�����S��Fl�"��wk��%�z��)����J�vwb.��y��3s���dBI�r9�r��{��$|Kj�:�$��os�/f�
<�S���0}��<�5u���U��1L�
��vX�Z!�����(��&�+w��1�E�V<�	�D5Wg�4_����
��X2�+����5�r�=�#%n�k���$}��c���������"�e�,����Qi����{�r�JG9I�|�F��;@�4]3x�\5r���NC���P������SL�9�B���P�-(eR��1�Of��)JV�b��g1b�H�2f1iS&c���Z��+ZV�����R��B��1�j�-*s��s���5�kZ�������D���zV���v�A�]��#E�^�����������P�"�*��
��-Z�k������)Z����'K�B�z����3���7f����@~�~hB��5
Z�*sR�������Og�;��%U(R��R�����R�1KS{<)Z������1ztNR��Jn��CS�CP��
��V��=��@~�zI�G��y$�2NE�DE����G�O�V���Z(r��8��)��=��
R��)KJ��#���*cP�%j���
R�k�)J���QQ��Rp�b5�]2*������)J���;�i���6>-
5�`�9�c���3B�7��D[���_�^=���Nu
�
��(r��9�N=
�������2*Z�BB��9k��*q)�����)��N�)��)��������z��;g�y������'[��	\����Tm���2���X����YB�~��v�C�5T���I&��Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ir��9~�;����Ih��������0�K����������0�K����������0�K@<�_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}R\���_�����!�}RZ�r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/������r��,w/��r��L�����g�6��������T�<�U���,a�-��	���tv��V&D���Uhz�:�%��n�]�3�&7��^.~Gw�,�8�.^��:��)��y#�|�:��������
�[�T�t�j [�������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���n4����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L>��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w����}x��?���nt����������q�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�?G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������s�G�,7O���g��1�>�a��{<������
��p;���L~��<Xn�����7:a�|��t�\�y�������w�����x��?���n4����������s�?G�,7O���g��1�>�a��{<�i����
��p;���L~��<Xn�����7:c�|��t�\�y�������w�����x��?���nt����������q�?G�,7O���g��1�>�a��{<�����	��|�	�g���M�;�����rFY��P�]ch�(2��,a
��z2G�:�Z�~���	B��������?�J�@��qJ�� ���L4��p�E[����n�����B�@C0N������:m��H��u�P�����F>'�%�Y�g��J�����5�q<�-[��z�0��a���G]/�Ic���,T���R���Z�j�))�u�"I�QC�-+Jt�j��8��)����>�J��X�f�_�8���?6�v������`���FT��A��tJF5�**t�Qh���XS��9i��o���F�oe�3z�^C�T����;����ql��S�>��g�m��1���R�?l���2g%��1(ne���p>:�r�e� ��4�������'E�9pVlY�A�T]��K�3b�%]CP��j��(����Y���{i,�O4��;{`��*��:tj�d����z)�����Z3��7
R�2���w[���iND���rZ�<����;ze�_D��H�Z�f�9TIJ}���(jV�\Z�/+[���D���6E�lN^w��&�a	m������pz�=��N��E*D���-*u���5wW�-��Z��W��^���d:�
VwZ������]e���'2|Jt�B���N�7�w��i�i�6�Jn������{2�<e�f9�mk~��kKb���V�����[��J�����]R���ur�I�p�4��{"�ybb�Fz�����0���m�3�5XE�����RE>��ZS����T�aNZ������TU%���i�9+���KZ~�+��j���
���f���ya�sM�%Z���l���[�AI�&F���t\%�p��J��J��!�@��C�\��_I]��h�n<�}3��b�Y���nvg2��~Kz<�M�WK��f��].�JW�*�"� c=T����i���v��C
g�l�?���a��/�Y�3��[���oh��xVpU��N�DS�=(TL�;u�Am�.����v*�VZ&����|�U�5X�:���Bk!T���tH��Bu�"�=kJ�bL�ggY�36<u ���v�=�g<��R"Q��<�mF��-j���1;'H��K����Y�Z���"9d�tM�&���m�KY��}��J$�]���x��1�E���G�J�;�w]u���ip�=�,L����'FIJ�
\�&���x{���"I�^��{���T1NJB��=b����X�{~Oc�_�i+��V����9;�!�el��������ej�%MD�z��#C�S�OrN���>���N��(L��'��	�A��9��ihC��N��x�m.x����ZEZv���Z�J�H��0K��t�d�)�r�9Z��9k�1LSviZW�ZT�	������$3��8�ua1x�SgnPu'7rO.�Gmm�>��)��H*�J)D'E4�eV:IR�vg=�����K�?a����B:�����q����P�f�,�;U�P����6!!�ujBP�(L�i��Z�)������U�Y:*��,�jC�r�!�Z���Z���@b\���v���;�����3�q���Ir�3��3��EED�E�R�����I��ICV����i���M��7S���{�V�����zZ�Z��.T�P�3dY���Y.�t�����CV��(b�T�;�u�f=���x�B,�5��h���9w�vV����d��3�L�9�JT��$S�P�����w��fq��Z8�D����\)b���F��W�����z��)V���7B��b�3/D�����Ct�jV�Jb���+N�H���y?����1v}�`������F��"
��?�Z�-o�}��v~�hW��Y�������L���x�"1�B,�Cq�SV�j8��9P���Y$�EB��"�8N� �g/�!�r��ZV��`�[#�:�9�������9V[��i�m&jKA@#�I>"g9Hs3f�
j���+^=����M���z����hQ��[�M��;C-V�y+lH���d*zT�]fEN���+J�3��jB�EQ$RA��]uSn��f�Uw.\�Z�"i&B��(sP�-*cV��jM��W@
{�Stu����Z��$F�mT�
4��jR�q�u��?���b���+R��)S�Q5P�Q%RP��LC�1NZ���iZV���
��e�z�f�l�b,:��t4��/(\���=H��{>3���H��z*��K��7�MZp�����i{���y�-V�[�}9�.����c�h��Vs(2=\1YT�S���R9�J���
��;;j�L�7T�%�k����nk�^>���C�y������l�x��QeKN5�)��(W1����X�S�X�op
��Wt���M���oU7A6P/e�����7��Q�����kJ���1�r��!�C���NC����7f��i�����r�`��*�F���:��vk�E5���k���=iJG��"r���N���%+��v@w�/Y�����v�B2Z=��T�5����T�B?��b�*����YIZ��1LZ���d'�Y�������y�a�e�����7CK,��c�!#T1��(J~�6-�?���JT8|%�����$���;b���\�'a�
de���Z������Q	6iJU2*��e�������l���z�269���d������b��c��/��("�;'US���5�m9�r�x���=nsy�D�$:y*(��]SP�7B�R��QST��NH���Jr����s$�D�T�!Q#b��re�^�U��	�q��=��d��tD�1
���S�!�\�b�)�^��_�g��`1n���]��������r���8[~����d������k�������1SE"R�9�B���i@�'l���9���e�7������3�2&C��)�0�Q�yTc&IZ�QTUL��z&1JV��s������y��{��X����-X��^��B�f�k��}�6����{A��>�|�a�EZ��j"�Jn$9LSR����JT��KJ���(R���kZ��)JS��~�j�X��)�ul���3�%rVN-)�������)F�(4�V(�	Z�R��JW�Zp���Z��o�j����r���6�}o����e�m�3*�D�#&��Y��)�b�R�)�R��5+@�u�3#���o,����$�]F���k���x�$L�V���Y%�R�2MH��JV��o�wS�]���{��C�f�4t���g])��E���_���M�����-T\���iZ�����f:i���,�v��U��N�E�F��%U]��NT�H��Lu5
ZvkZP���;��������b7�
��+�\R�H��R���
Ex�����~����+P���Id�p���l��w�5Y'-3v�4x��2j��f*�*��C��1kZV��sf�k~�3�}���atf[*���u����d��J�!��:�7����5f�z^���������v"�sx�<�����f��%����r�.��5o9Z��z�R��~���i��J���@Jn��C)���G��@mX������?�J�@��qJ�� �A�����s_��������L�ic��,�a`�V�����h��{�$���v��HU��Hn��
�`!�5��c�X7��Z�����6���[���`e$����Vr�e\.�����&=z%!:$(Y��q���Z�S���G���tF,���q��1�����#(�����0v�����J���
J������Z#-��& �N��6��}#��8������{e��[�')����~���H���D�c�� ��(����)�����f8����V!%������������b�Q��R��H�2����1�~��`�
��}M���Tzr<���'d�\��-cr��"��U!a#�,��C�v1W+2���%]UN�z<Bur�(��� �0�m�Hc\�bM�*���Av-��e#���M����u��hR��L���-B���}\r�-���V�����w�1mJ���>���j
�)Ld)'I�P/
T�=IR��%O@J�55�{7��Jc	���:�@�0{�	g5�������,1W�*Z�%p,v�������9�t�rZI�}	n�4�Eo[0����o�L-n��
�g��l<D{d�B�&��M���-+Z��jI��o��sX�����7��3�p��R���������o4�F�U�-�C����j�l�e�TU:T+��5sQU���*HV����=���������V��-���W�V�1���+F)
D���W!hU�R��������F5hR�Z2�jcV��)�S�kZ���[{������v,�6�[m|�n��2��-+����������*BM- ��"��9(r*�:4�*j���I�.N6:R	�<��D�!�-�q��%#�S�FFB �j�x���s���zU�l����>d�?��v��;4��p�Q/f��P��F7�|�7���k��e�)�0���C(�c���4���1�H����1�!*dqJT���joX��<6�k����k�5sc�E!/��R�-[��H��RAt�E��ts��9=J�I�S�:���`���n[�#�o[V��X�2i����or�Q4�J�2N�R���iJ��)^4�����!�nK�a��l[P��%�p�+D# -�
J�MH-_����J��}���f�U��1������&N�|��q�Y_9}�Ws��v�.&�W�^�����\�R�D��VN�#'F��N�,z�ys���47GXqMz&���A�p�� 4�{t\�]p�W�S����b���,^L�����q3�G��p�2��((��������3��^\�8�<����L������] $5�+�2�&2Lc�>c,����&����L���^������kvA�O�eU����@�[��R�1�P�W��f��������Nb�oa���K���{p���P|J����(�k������*C� �+i�V����QE�66����UcQG
\L����L�B��2��U��P��n5�^<j�
���tf����mo�	��1&�����_�2��~k%MF�y�u*�z�.��[QcD�Z����)�-Qy��8m��=��7Ts�d���c/0�����v*�e�pD*�L�USY�k�V��M���j#��0$��-��_���=&����wa����qT����e�����T3xU�����iR��k��R�*�kZR��kZ���8���{�)O�r�C��2;GV#�������-���������g���8T��R���)��r	�'�)���1�N�z����R����R��H�4#����(R���)iJR��S������f����6F���Z��G\Q���2z��wU"��z����:�n&a��j��t"�z(�L��w�I�����������Y��1w����)���p��A��J"��cR��I��@YZT��kJ���F�5*Z���T�-{4�=�$F�<��ek����0��Aw��#?��
^�����k�X���n#e�`�c�<����,����Y��^\I��7
!�$����t�d�{���Z����U��w����
?�9�`�+�"e��Q��"��1�Qb[G��\+&�:$z�����H��A$�BP>��1in[O$�21q�%�#$�}��f�z���+���g�{��G����9�l�r�Y;�����
V�����y;m[�Wg�|/�"�F����\�rFEUB�5
���0u�c8�����Xs����,�er�Cdf�������"A�JZ�w�A��m�<�u=P~��P�L�Zj�C/jWL���J7���V,%�hz�=#���$��W�TIRP��������	�Z�ng����gF�^H��xVs��6��\|�Z&�Z���rup�:���F��TMesnP��n<$�Z��{�@�n�����o"L�
pU�b�rB�����b/D�:3������d��P�
:���5��yGe�wS���gY�##*��&�c��������9��[��M�9�T(THj���:e�D�7
W�ZW�����^<
O�Ol������+&e\�s`g6���\�����_�,�n�J.����
v1qmRV�6E�TM��V1HJ!�b{OX}cY,3���l�=s����hq����{
������t�TX��3Y��r
[��v+?U�=YMT����2�Y�o��.��zj3[�*7g������+�qIG�a_�4�����������.�>t@��a|���)�vd������&F�����p���-H�z��,H�.���g!�U���#U�$�^z��X�*���e�S[x�G.]z��l�wJkm\��������5y��m����J��.���w$�+Z��������Ag8�_���������^;C�2F2���$>��n��i��'b��d�!�QEW�%T�u�j��:�O��P�^JR�.�`B���
P��0��)J}�S�@D���:l���(*�dYjR��P1��������M�������1�4
�����J4�8�1]ug���Q�l�Z���
0��rn�rtX1d�����>v��:���s�����.�s��"N2���t�1�4�\y�,��;���m�����FR2C�oB-C ��W
�R�g�=��������nX�Z��Y������"v+�H�7v+��;5�f����'q��A.���R�������^Zn.�Z�"������W4S��S;ACT��5RP�9B=��r������CZp����z�����g�-�����#[Q��v�:F��d�����.�nu�WF��jP���2m���[_fG2s��V����2�d%0�e��
�E���c����&�R��I B�RV��k�o�Q�cz��&5MZv��j��
R��J{T�?�-�C�L��*������LS�9p���7�X���og��K[V�����R�g4�s&�R��1�u1k���9�H4�f.��`��������xGH8�F�`�w�a��.P��EgNJ�-jZ�~�^ ��������<t�inm�;y�`��(9�7l���;���v�>=��*������G�[V��JP����i����k�9\>��Z	�O�S�9L�r<V������Z�*��t��ZQ"�c�
����r��
�l�d<,fAiac�z(�na/<�6������Jj�cU��5�F�nSv:5�^�{����m�X���^1�m������f}��tO]Y"8�T�9�Z�Fl�&��3#&��&wj�u������%��se�.[v����]�a��x&���4�vK�Z��.����2��XI��t��E$b+*S��P�i�Z���;���#>�����m�q����r$���OjC�I��ZR7���ZE���WN�b���J���`��tZ���{c�p��,���
��|,$5��#�g��`��D���e�Xc"�d����8U"$���\7^����d����u�����Y={�g{�D|�gd\n-9��{r�B�N�Rq��l��H?M:R�!S�%kCP4cg9ir�����	7��GX�.�RYB�J������b/d��<���t�RU'�V+�V������y.,�?����d�!m�����R��\,�lCl����x��S�Z�Ru�v�$"I��Z�M�+o��s�{J��L�vle�����2��gb�F�`�m���0U� �E�vL��G�V�t�L��8v�c�Y\�y�~�[��gm��-����-�������ZV2�hS���%,�J�oJ"��".�I����fm�f��Ei�V�l�;�R�����@J.��C)���G��@mX������?�J�@��qJ�� ����*o�R����,Jo�����7K�M�:<+����N�������yS��P�\�^c�r6K�QH\��W������\���KZ���\��2��y`��:M����s%�6��e��f&�^.Zq�u�H��|=���8��I�9�������������)��1����"wdN�nbS��$�EI#R���5+R��B��+��|�lv<������m����-M�J�J��[�N%��V�S*GV��)�p�hUz��+@�)��[����T�[�d�%\�M6� ��' ��7�I��xp�*��tb��gi��Ev�.s�����t�����f�G��)��QE&*���tjJV���P���|��7�2��e��n�m�o[����Y�t���-�}yHi���t��M$��d���SQ"��(�������,�.���<��f�l�M���/������e��I8R���g2�(��4B+��$U��r�D�I4
@�\�����1Ncw�����-v�.��� -�=Y;����cS���=�a)��T�
e�R$�iOq����������'�'X6�,k����Mk��6����A�w|<|��j�fdUe�Qj(�"���8-��S�\�����y�Y��4r����gt�4�n�1���yCR���-R��p{s2����0n�1J��O��J�/u�:�,�en�^����
��2+�����{b!m�o��9�L�{��v��� ���:G1UO���i^�'yj���a]�W�k� �������eoY�f�����u��5�d�*���(r�5z\+J�I���,����'t��xOV�h|8����Z�E��s�2�;-)BIVo�l�
�&����]j�,t��]6��n�j�,�Z��F�I7%2�)��z4�
��do�_����nh�Mc|�������~�d�<B�gm����t�C:�Z���Z��O��=8�J���FL�uGc������b{N��n���IC�!q�*!���$�	^��Q2p��Bpl]��`���{�v65��K�h��-e�Lm�.�A.4%Nv�9�Z���xR��8���z�#*2�8c]l�5�8�d���r����A���+`IF��Y��l}
�7������.IB3�U��;�P5sy��[���t�Lc�[���*��1.=w{��-�q�m�J2cK�t�J��$oB���5L��sq1�P���n 3f�������)���#)��V=����
Xt���m+IJ(u��)'S�)��8�my��gN��V��	�N���3�R/���t������>���;g�����&%w7.�H�����T��{f.�!�%����b�zG5jsT����f�\����,5�����x��jV|�5~���=�i"��Bf����)L������t;��z,Y���>��kZ���k^�k^5�k_f��@W�MVX��k�y:��&y���l�	�R�3�M����zG=�#RP�)����z��	��;�j~�d�Z#i��_�~�
��!�w�"�ZT�Uu�E2�Ls�����#��]�#dr���d���WN^�L�p���J6�����H�
���������=��<I�5Ct7�3e�r�����m�7}f�b�i�-�H[�]��w�6�Z����	,�� ��Ij$D�J�u�*]a�����&��p���= �av^�e\�|��X�g�34]j��r�wR�]T�R�����{U�fR�r��������7�p*�/d�ev#x/k�#!��J�����%�D�����X��j�L��J"S�5iZ��kj�	�~�^�Z�A�-|�%�-���mk�E�[2RL��69I���	*�a�j&��H�.dM�-h����j5���%�<u��>�x&��V6�x����5����[���j�i1���M�Z��(u�A5�1kC��h5z���>��FE��Q{����Cx]�U/Ag����BVQbp��P�v~�*e+Zv+@��?��O�2���]��`h��������x�K�Z��d���#�?�q)��;���[�p�9A��������ZV��V��; *��=j�H����.�w�������E����$���J����p�N��R�>�=j�	!�4�
���f��)�H����$����a��>*pp�u�F�vd�R��kJ�m6.�,�5�U����`���(�3��tU�N4���MC��b�h�^�j��76~I���1�)zN[}�td�d�r�=���e�Z�V��T�7b�R�-x����R�m��ME{��}
��5���Z{|{+u�R4�Yo�~J��5���q�o�5U3�����:��"4�:���d�'"���f�JR�L0�y��������g|��W�0�cm4��	���`�t���n���\�UW�h���Z�z�tR��#�u����x1����\e����L[#qm�Y�����	{�X�Q��Va��M#�� ��G\�I7)�l�c�D*u�g��������6��F�ouNe��]{��-'h�E-&I���I������v�;U�*$��WH%t�\���������\���CW������F�XV����"��!��N�X�f�)ID�Q��(v�D�MT�4L�T;���h��\������g��h�#��Zw���Ke����NQh�&�)��:=�<@u�X��-2������@%�@Z��8��C�?�J�p�
���f���
cQw
�)M��zF�
W���WK��l�>����!�mq�{r�\q2Us��$S$�rD�R��U����D�H�-k����'(��/��*��;zmF7��Z�t����Z�j:"=/u��T�R��xR����8���������W�*o���&�I���O�-6qO�L�)��U���N4�+���B��ss�W]������\��������n������+��m9vENA����J(��U�J���8�.�rD��M������7m����~[�v���l5�gm��z���f�V��Y��d[v�Q9�T�:I��P$���1��]�^�Cb+���a|���6���#$!!un��q�9��)f"T�W�S]QL��D��l����.���n����Qlcf�shF�+D��rT���-����z��]��-n&��J��������:\�c��*�:n���d2<��\'V��5S�H,�J����yT�JpZH���(j��$��*�)�*���I��L��5B��kZR�+�i�nd<���Q��������[��V�������3����z�T�H���1Lz������B��1�c���j��1���1����}����X�.BK�����U��&��B��F,���+�*~�
Go���8��V�}�+Z��I3C�E�BB6KbW�5T�6x��>�Q(,J��!�^%5+�� ��Ksz��B�������Z��UO��VS;�h���
Z�e'���J��IJ��J���]��[�i��Z��vs?�������wuk��Kn���^.������j(���W(&���1�r��T�^�����%<�nsyzEs
�R�]���5����O�k�K3x�{�s�d�����S;��>hZtU1[���V����qCd�{xZRrM�����nkRm2"�v2���!.�g�RJE�n�X��XD����2�������N����K���n]�����R^��9~�}b���22T�Ek��%QF.-M��)+S�7�����X.��n\Ija��7$F�����m�7f��v���EE����z��UQ$�N�IS��E0�[C��0�
�9�����������{�����	�������so\q��*-Fm] ����*H�n����
�+���]�C��o����\�������C���]���]�{�m4��^<��dc�E�!�_���P����9��p�kTW~�djn5RQ���M����8���7��S�[n������������?�J�@��qJ�� ��{]�d1�5���h�7��|�N��+��-�l?�M�D%f,o��]W��4EN��SP���
������L�]�&�b�)&)p3���T���,Ox�-K���m���z������<;,;����-�3�u�}�
{gsdw9&��U��g�/��"��-n+��I3(������7/k8P�F��t5B
-�G�����p����D�xs#�z���{����"����rB��RQ��h�J�I���Z�����)������#i��a{_�U��d�<���}��r�������jJ���/J��<�� ������;]�%��`L0���h_1����(�s)xIb���n��#fF�;��/��v��z����8�x�S����Id�E��O�!B�4N���wY������Z�n��������.����YGC��8R-��oC%$z���P�QC��Q5\p��c�k��_\pcw}�`�3���*���&��3��l�p��M�����2��!
ux�J:�
a���U�xv����d��<�qe7���sR��.��;`��0�;Y��$���&����D��1�z��
MK���}d����_c�����Z����r9�l��}Z�V��^�U�fA���J]��$�z���&�5�G���Z8qJ��1�Z�#����L���z�$�hD�v�I�����!�Jv{=��-��,���[B/�>�����K�9��ky:����k!�Fwz�'o����Z;:	��L�W�M@/���3f�I?k`������{������$�M)nI���f��rnb��1��@�"W�:��N�H��x�������Z5����J!�^����C(0�T�I��U�J�&G��2toR������*�
���������S�f&�����_Yk-��"���/wIU�z�&S���H�#��*b�����8r���6#�V�[[�po�.<�`�,�� Iog�O� $���[�M�D�����T��j�����/���w�E�P=|y��k3��b=�����FYW\\+3���Z��q
�������f���f�j�$�2�6hU�Glp�~e���Y�,�S64���!r�;���+p�V�n�H�����lT�|S5x�����W�8�1	�7����c���r����5=C���\B,d�\���x�sR���*�x�x��������j>����t���3&1���%����&�H?x��K��57.(�LS���+�5)Z��/\�������|�u�;�q
���$�\I+n?���(���K$��nz��FY�G�;5!x�{����v��b+c��X�+����.�s~��a����[#
/q�A�N�h!^���r�zu��:]YC���E�������w�bW��6��a��Nb���_�����T�y ������"4�jb�T����'��ow�9�	��L\l�F������,!6����v���e#��z���r4-RE����t��W��J��6��-+��)I�n��M2���)'f��!J2�)KJ��)J��L�'Eb���Kb��,-h��2����BY��N�d����I��v��HR��Z��?V�
�(d��W����W��;�]k���4���?35f��m]�r�Z�{h���[��$p��I/�UGI���TH��m���,0v�����z��~c'[��cK�d��o?JM��!'+��F�p���)�&�ST��uD!X2��[T��x����h�A�%�W4Y���G�%
j>n�2�xN�j����
e��2��P�z������>�;���L�nI]��rU&�Y��;6w�v�K��"Rn��oZ$U��N*��h��7Y���wm�RR�A�*��|��R��Z��q�vF7,�6��Aa������F�[7�����c9�����s��b�6}9�����P1�"$U2���=x�����q�8st�'5Fk��������-���;�v;b����\,Z$��lz��p���3uR��n�A���.���	;��k��M
q�n�����{Nn��[��������0��["T��Q39:d]c�IMr���j��FQ��ZE��1e�G�EF5#�����*M� �h �i��)KN�HF���y?����1v}�`������F��"���=�Z����[�#�~���-�{Y�_G��
�o�/W���F*��Mh�*��$J��zR�L
��z��nLot���"��m�5l[d�x���E��e�4�����H�eh�iD�C�/b��{ ,��#7sU�NA��#���	�l�
�OI���l��E���P���&�fW���ZFU�J�TL�+SW��B���|��Wo�����p�{!�r����V�X�]Ead_�\�8�!ZQ����^5�)R&i�j���+u�3,����/�a�������d�������x�b��-����?�=�kc+�3��$`�MENMJ*Z)U��#U�anW��u��ZUU�:�T���P�#tH^�)���S��x@Ew6��7gc�\3n���dv��>�v�6.nA*�<���Y�:���Q�s��B�Z%��KB���o�7����;[��F��=p�*���5��!��:��kX�\��A�)&�P�,��:�(�R�Q�i���r��(���g+;xd	��\����	�����.T�M�.��X��mQm���)��j9�	�t
7��N���W<���&<C������FPnf�U(��mU��T�d���+s��y��
������j�z���/,��;������5K ������e�R��t�]FOQcV���A���j�_���F�n�0������=��k��9l���+�']�;i�O3yt�T�	��E�������n�&m���rP���-�������������\U��X��k[$Xs
V!��!�]5xG��UL��k��=(O��R�f�yf\�-*kD�9v�
�#���|�z1����e�IRY��aZ���UU''l��MU+����t�J�S���,me��c`�kXkY�=���U�!���3cG��;�G)�t�{]U_dp��^��7�U.}f��������e]I�������$����#3jE{f�R�Y7u%8q/N��	J�=����:����^��*��v���k�o�I�+�Y1��tJv�vM���J69�*k)T8���
e(Z��e.��kB�����kJ�Q#���K^�i�����L����e2��k��i��M���]�q#���G+��	����Z ����9�
\�r�';w-�����75
��l����'�ZQ�W
rl����>R��O�l�����$����f�7Uu�$�l�p�tr����o3,��+c<k7���f\�?�����%�����Vi�
��OX$DHd_?���"t�S��aC.m�����.�.�9���*�8K�
C+�,�=�F�����.[��8h�yT%����Q�zM��F�����;�`|�/;Zr��<��6�s�. ������^c}/&����Lg��H9$y�U�Q��R��C��R�Y�eyO�T�/�\S^�}���u��,fi�W
����R1��G�v���C:B5�4������W:e�4N�
k���{��
���o�����B�h�}��)�n��]V�U�!9#���n��hQ��f�7Pc'44E��hF�G4i�2��."5��E�E:P�E�t�A"��HR���(^v���8�Y3m��X�����R��\z�j_=)n�\�f�D�f�Uri�~���tJST�j/(
/��M-�m���y�S��|$��s5x����	��b�k�X�&��
��x������BP�k���e����u��zX���h�q��)i���Q����2H�2���j�u�)�e���x�7k��P�<+fjVU�q�6zc
�������,s{��"hd���N�G���d�SdWD;G�B&��NQ1�Q�kLs~;�;#���Km�����)��m�
���60`�7�yv�Y%*�X��"��H���U:���K�������\3o�r���?��	!�RFn�����b���zw
�VyWlW�;2uh$c��)h����=��C������:[�z�5j+k!�o&��|�s����z�q�����5s+C����9RmR����D(GF�Z��y���:�)��������j�9����o���V����m��pV4:��f��h��P3�h7J�Bg�*?e1V��gc����/q�V4��4���0�����p�B5�p�1�l�G	��E�J��)�1�S�4�+�Wrc�6�quh�{����RX~���%����94{"�`�SQ�DZ]4�))E�T���Eh-��Xb�q�����a�O"��3����p�������"���~��{"��J���(T��ET�s��0|yu��m���2d��9��:���v.c^V�N����P�N�������Y:�J��M*���:��j^�f��/2na����r
�g/��ST�����o��]);���n��k3R>|B���Q��!F��&�����2���t����������K~����n"m��]�,H�N�&
VM�-�&s u���(z�5ISq�+J��Zq
P�z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w�����+���>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w�����+���>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��J��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w�����+���>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oO�.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w�����+���>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oO�.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oO�.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������>E��2oOn.��z���<����]��&��F��`�w��������o��B�C��4������d��1#W%M���f��M>���iCT�xq�d��EZS_5�xS����{��G��N�?t_���'�����'���:d����L��/�T���E�
�2~���P�O��*t�����@�?t_�@�?t_���'���:d����L��/�T���E�
�2~���P�O��*t�����@�?t_���'���:d����L��/�T���E�
�2~���P�_����O����O��*t�����@�?t_���/�����'���:d����L��/�T���E�
�2���n�2~���P�O��*t�����@�����������_�@��CW�e(j���O��n�?�2~���P�O��*t�����@�?t_���'���:d����L��/�T���E�
�2���n�2~���P�O���*t�����@�?t_���'���:d����L��/�T���E�
�2~���P�_��*t�����@�?t_���/�����'���:d����L��/�T���KBU^%��Z��i��q���'���:e��zW�8S�S���~��B�H�F��%?
���*�S��x�����5+������P��JzR����5)Zr�2�5x�N�}��~�@:d����L��/�T���E�
�2~���P�O��*t�����t�����@�?t_���'���:d����L��/�T���E�
�2~���P�O���*t�����@�?t_���'���:d����L��/�T���e�
�2~���P�O�����P����Z{��V���*�
Z��P���Z������L��_k�����E�
�?U[�hZ����S�-?�J���O��*t��t������L��/�T�������@�?t_���'���:d��~�:d����L��/�T���E�
�2~���P�_��*t�����@�?t_���'���:d����L��/�T���E�t���E�
�2~���P�O��*�Qn�*R�����(~7�iJ�@~zd����L��L�8�����-+J���i�V��+O�V�?�W�^&S�_c����n�?=2~���P��{��U�IO�z|K���x��������@����hUz4��B��+��R�?=2~���P�O��*��6�+�S�+J��m���x���@m`����>V"*u��SQ�e�u]�$���u�=sg1
�P�9x��jR����:o�\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<Rb�'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��LY����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9�����������/��x���Nl�~�.-�sc�-� )qo���h_��K�|���B��\[����Z�@<R��'6?������9������e��z2:�*��bX��iE�7Iu�]�HN���1�q�������
����������Wu/Im&�����2b��5�8���L=���b#����\�]��U&��J���EHd*���������>�����\���,m�lWp[���$l���*�zRR�]5�=�J��%x�K��g�w|���'�w����������[��~h�w�0L�qp^����+��a�i������u��H�U^5
����=e�^��n�����fZq��~�*C/o��E[f��`nw�u�g��4�_�
:���e2*�DQ0[�R��k��r���@�T��
0������h�Jby`��������]-�5�MD�!� v���{e4�T�/��=�f��b��B�E�������j���n;�J9F�qu\7�����3�[��u��"�%U\��r�%���?�������/k�4�lG'q���m?l����V��kB�]��%��v���U��Y5Y"��U�(Y�Zsj�wh���H\�{_4f��}�a�o�v��Kd��p$e�t��N\!�����n�eTUF��%v��#��+����Epn�F���rV8�-g7�K��rL�\�b����)r9���d�}&��n;I���	R�������r��<O�kRq.�a��c-|�������<��{[�*�^�D��)
���
�ID!H��Qv�h���n�
�^y��,���#�j~�j6�aK^��aq������^v�q�������E��#�z�8n�����^�'N�Q'S��8������Z|�0}��w�\�V�(�1y �2�V3��u-�i���s�JF��Y� ���*T�����'O���	me��S�Z��0����#����q���gu<�2�CA�1s=���E��g���Jt"�9v��n��?_T�7nF�c�"�����e9W6�_]�1�H��ru�J.��Ms*:��r�=��9"�������@�~�����Op�����WqU�L��5�13�fL�8�l������8�5`y8� ���+e�Up��OD�
����b��Me�E����,�k��#� %\M����w#�r�z��*�'
2��r���:tx�'	��v��S����7g,Q�wd,�����V�l���\)����"�mj���L�Y��wW2�	�k>]�`�>j|�yp���kO9�]n���2��n���u�A@��O�����v��D�I�z�'<#����J�I���Q��;ns�J�����c�e�����n6��IB^R����c��$e�����3�����81������-U Lg/�����G�Gfo��~���#e��BA��9x�hL�3�o*���5"����w*���C(j�j1���|��.m>C�rF�����l��T�r^X�hh�y�"O�S�"�����S�i�uR��[�F�g�[��w�^w�a<O�u)\'�����3'�2Yf6frJ��T���IE�[�b�z��D�3������@)���a=��y�aXqF�9qdM��t	�x��//|���wL�scWqS-���!9N�C����~-�T�����\a�^h����m�7T95�]y����p���~�m
�\���RE���m,SlZ�P�*�Vo[u�5E��]����G��jW5����,~W��qN�r�p�������U."b<��>���rv2�9�����p�'H������h��A�����Cw<�`��������]�iz���`�^����\m6�r2j��D-����j*�Hc:*d*�9�j���
e_Z��2�X9T���S���<+^��\����J~�
�gYm� ��s�U����6������H�Q9!x4��l��]-��WM��+U�SV���X9���9:���� ����
���~�����&�5v����4lT��^�W1/I�9j�GQ�
�R����+����+�y�Tu�9^�#n���X_+�1��n��aq�Low���I��.V�9x�eNz'B��1����������!�l�~�q>P�-��V��F��+�B��m���o���.�7Y��l����V�wE
Z�qT���D4���4���I5�6���<Q�n�S���1��1��=����u�k\�O��[����% �D�Z�T�-IT�@��
^����M�2��jr�����_X�gS*��v��*]j6��j�i�%i�#8���B�P�"E9�/���'��kK~j�������1�����\���kqZ���h�B����x���M�r�*�b��T��)hp�,���7��,��.�c�vR��o;�A�n��jg�r�o��
D�L��
q1�����j�O�������~?��:���g�J���Pu'g�F]�dj�	�=�_,t&S,�)g����SU$���\�9�j�4<L��4����R�W��wF�����VD��;xB���8���Y��.�3rN�R��Ib$���N�^Y�Q}w^���Sb���ur��H����y(�n!�2
�0�J�Q�
�q�>r�FL�SB����P���<i?1|�
�S6>F���v8v���rc�i�>��gE�R��o�>��K�L�l��YQc���*�����e���I�4�_�!���~<���57����<r���I��9% �D�0b�3(��)iJS�j}d�f�P��m���I��3G-v��2�J(��T����Zj,V�B*�P�R��jq)	J��-B�Z��ol0�>�L|��\I����-�&�M�S*f��?�|D��|��j�~��)�l�5Y2(C���W�m=a�#�r�R�����'0��N���5��S8��R4���n���7�����]a�8H�r�C���ycs���fW���`l���;G�����u�?����c�0]&S�V��T�	�t~��-#�S��52������W�q6D�8�1e�sFUi�,{;
A�N�/����������c�~�����
�����D���-��<Y���������R�>��%hb�*Sq��v{d�f������S�k#a����W��+���{2"F;��[����#��"sH���@��C�kP����ml�3��h.����0���|��p���<Z�c[v��q��D]IN�E��F�=����T��TIUO�ps?�hX�����������6n_�y2�����=����ov�&��j��"���t�
������	������t��o�s�����#k����6�������`Yi<�:j�t��w5*h:p�U�x�t�,�E���_><-��0�I6]�@��Z �� ��}�+�Bu��]��z���p�r:�jGTIR3Q���:��.k\�u���>4�Z��n]���nik{��0�Tu�d�#��#\��|���h��j��T��n�D�Aus`m]��,#��<L�
��������[�-�H�K�)��3�F.��&��*�E����^��N�
��_T�{^�^�!r���6H�������c-�sD�)�1	7%
�d�l�S]F�t��"+�u�Ec��U��������\6�����������J���l6���}��F������v��5��uZ�R�T�2���6���3-d���m���RWT����/��w
�~��^�W�z�0-�E[�N�����n���#,�5P�6A`����8�yto'+�`�m����h�s`/�z�����{RQ������YN��zJ=v�j�PEc"r����z�y"����pE��E�m�]�}���a�+b��Nb
r-�~�V��������MJ���=	YX��)��(�hXh�����E�E�73�	))�"H7A"U�T�!Z���iZ������i�	������������q�FA�|5�\F�#�N���tw��=�Q2E(�v�1(���T�P�>\��u����3p�}f������ ��meLOvU#,�5�n����G"�d������������@$$I��8|	��R����b��k��U��l�������B�{$�>��^��fQ��<f��U�p^�T3j!�(
D�X���Ia�~�j>����� ����&d������2�`��z���*��f�j�U���F}�GI5|�>F�q
�ye<�u�X��[S7��x�oR���m�}���fe��ML�5{5��MZR�[�>��=�7�u���0���KE��{�i,�]�kYvP������m�#���79��;�Q�Jj�M
��(Mv�o�����
����k���v�ve�!�lxG����M�n�����b������u�Q'-p�T�8F�|��a[y�+k���V�s�:���2��{���a�
������d��)D��)tVL�5�YU-E���t2���m���/���a�L��{O��w�������ZY
�;w1���E���#�9l��.Qh�,��hT�"�	�����q�w��
������n$��l��5c`n,��� Z4������a�Q��*�f�J�Qj6����J�*��[�G����������G��N�\����~�SJ[���:���V����6Z^�;�#�S���FMV�
���z<+Z��G<�>���=s��`����]�C6��V�8��/{Q�eO����f�KN���8p��^�f����Q��[3��.�bk9�
B�u���1��k+J�J�&�����ZQc��z��W�7gB[<�1��TsFO�&n�w����OE�������>��ZUR�A�jZ��:�S�4�j���.��n�kGp���fb\�Y�N`�[Y%/��7��k�Iy���==��5)�)@H���0�C��y
a��/�����bZ�w-ogR�2���G��2yb��@��n�
��G�*���e3!$����X���j�e7,�73WM��?�:f1k�R�T>I[sW7�3nB��7~�TE����9v�)K^*)F���?j�a�9���eSR�����B.�s�����L9t�0����� �7Y7��K�>5�I��d�Y�$?k�BEt���*�q9�P���0����F������>Y��Dn$�:�����7Zq2���y��Y�b���cn0h��d�e�U��Uz-�������gc�I��O(���$�d0�/r�sLE���|ygY�-���Z��(��R��I���:�g ��k���D��VKT��u��{�%�����)��ur����9JO�|�����hS��Us&�
�!B���������~�+�����3u�{u�1�2-{�6U��i�4�\���L�X�]�N�*��N�J���
ua�X�2r��7��lv�6�-i\-���N���Y������)�mb���{1Ms[��#�"�N�n���c�&��B}�	�<��,����������+���g=������ia�9VF�\��-4g�J����2DM�E�O
�z��	e[����N�mL��9��5����P�L]��P�����J ����VSR��zt���(7����f�I�{:F����A��KY�TU%ZIH�V�uJU/������s�)�b�0�#��V�s$�Z������l���E���g��z�.�N�H��)NzP��8���@bm��L[������09����^]d\��N���,H�.��:�5;vfUv���1S�j���I�j\���)��D��7�o��}��;�����Ux�����b��X1����C]1�dU���=z�H���X���H�������f,X��9�� �=������p��U�Z{�=��|�P���2�N�P�2���$��E���J����k�bO���� 6��n���/b^]�v�Ew��%�!�1c��5q&!"%���'��*�0k��<!J�]'O���E�@q��Q�N�\>������4�p�0k"Q�2WU����e�+�r�:����g%^����M*&B���bl�|Hc,�2LJh�+��6F�#qE*�����y�kQ*T�!�nZ�J���@W7���Y��J�n�$�L��������CU�����d^9P��kR��j�i��:5��Z���=j'�rW%���f�����VPQ��dt�ZV����:Y�+Z&w6�Ju�*d�c�)���-��~����.�h�fk>�3�D�6���V�VF�Z��[�)+!���)"��EEiCu}mb�
z�0VH���/WYG�=�������*O���3\]�he�V�e#8�w<|lKf�Ucud��tz�T�!�,r&`�&��gp�<��.���8�*[l��&������D��KR8f��8h���Q��.�M�g	��t�Y3������jX���N����z��a�L�=�j�����R+������I�����*I��9�j��V�	u����������`�m�m+T�R��-�|���}����,4in��VRJ�3�V�h�m�='nt�#-TJ��*RP�1�!�]��c�G�:��`����CQ9�nV#�]�5�����#i��-uy3��4�Y��!{��FQ9����b�?����-��k:�`����
m����v������0��B��E7�X�Xh���X����/&��	��)�����>�	��������`����r��M��.��Tl�v�wg����J<S�Q��V^6S&sP�Q�x���C�_���$�]������m���M�fuip���)��ft���z��_��9�hv'^�16B����@UC�[�e�7��1}^i"ylw�s��b*�v����|����+R�USG�L���g9(�z�zt0voT�����f�����%���-{yk��ur�B�-��6/&?���cdd�eR�j�1�k7$-
F�\���x�|c�=V�E����b����x�i^�n����L��|��&���i�_T��+!%�GU���!N�jZV��g���uZ6��B&�.;rz��~��1����k�-:�7�; ;
�z�+F�N�rC��u;~|U���|����I[z�����[vM��^�h��iT��(W]:���*P����j\�|�>��a�lk����f�'������IX��H����4D��f���G�T�Rp��T��2����73m%w1%&�P������;l�l"m��i;D�����ZQw�{�k6��T��N��V�@[�V��{*�$�vU�kY��WD��t���m�\����W�n�����J?9w�:k�b���j��)�t��f�\�L��#R�Z5�����������p������F".�����md����
Jv�`6{���-l[�7&_D���u���}��w��kZ
U�.	���Mg*Q�F��T��uM���j��	-���/'L�|E��z�Yn��"D�3�"r-���]�l4csd�x��,�eH�T*���Z�!+^ 9N~/�v�9�:���J_��e��:�t[q����jv����y�}�]��S�t���B��E��4���������x����Se���~��)k)��g��x������t��v��E�%hn�GdL�nDJ�,<~X�����������IU��t�P��Igk��+�v��QB���=x2C��)�5~�
�z������i���S���{)�7}����b��&2��!|��
�p��5'� ��D�X�e�^���z�6k\��c|-��-jf��������K���p4ux��94�SuhK�Q�EJ�R��P�QN�[F��cs�A���w{nx����J�8�fD~��D���P�"����ys+����g��4u��qu�?}_D��SKj��RRU��=��T�5E:EOR��Ls�
E�X�#m�-�q<��2Z��6�Z/<C���x�%���[WVp�ZjS�{y�@��.�$*��G��f�G%�|�UMR���X�It�*���D���<ds����JR��j���9�r�����7-���Yhg=��k����-d�<��x�.5��d��i	;�w-d!��tVE	�-S5*��nm��������?h�l�~���2��U��d_
C49H�b*���od!U��1���=2Qc�-*���g#�|�y���j���������\qe��r��U�y�%D���B���$Up�^t�F������AC8@:�5nk���C��W����m&�Z��.(��Ri�b[j"���n�����l���1Y��NaDT���������9�T���.�������?�0���.��N>V���M)��H�(�Q�V#*)J�*}:P�@m�
�z���sri�S[13��K�V�1��T��
����'
�x��y��j��Z��*Jp��j����6F��.�`�}�:��8���f�u��g-v��v>M�(Z���v�M���Ys�u5��f�z��m�l�V������s�B;��q�����R��S�JW>���*��-*���T�:�:��@knr�����G0l^U�z����u��J�7e��^���M��U���s��g�hU:A�=��P�/L��T��������o/
A��"�enL�)�vk0���6*�u��so�������,FMdj��c�B�<pD�
���������k��;-o�����8~�w�+w6\q_^��$��CuF���V���(�Hz�:��$�\Gd`,C���6�aoX8���1��
��A��	C�)��C��u���S�c�1�Z�*��e�v����}�v�k��Z�3e���i���r:e�#%L�J��Aj�S��T��JR���b���|����[f=��f�'}��XW�M�8�����&�y�kZA�7.&�'GU��1��U+S��5@V�N-�y���75c�.�7�p|�"���n�Z�>�e����%zK9Y�Z-8��$�D�IT�J��2]����������E�[C��(�����HM�SXs
�����Id5/�.����mC8���v���t:u�ISP��Zx}P���mX�����;f�������Y��H���Y����z�	v�&e�3���Z��B�OR���F���������&���//f#f[V�Y�(�e2�.��hY)d�n����iQ�J�h����Y��LO;wy�o���{'�2�D��G\]�qu�s0����*�.�q{Y���	���3�J������uJS@��-\�;���!��'���x=��&�3:����86���E.>��<�E�0����r�dH�H�
��T���f$��s����F#����96�N3)��_��[y������W�A7�!$�Q��,*���H��r�H4�}~�Y�c�����`�Iq�L�sU��f�������
o:��MDdf�<���b��Gu�&�������������+sA�c�[b��)�����o^4�m��H����d��CJ�~����F}P���,��[����Ur��9��9fc��*�apD��_�9�mXk&A���Y���E�CvK��U2�Z�����Uw	����5���:��7<�-�s ��b�cif��mi�cH���t��y�V��h8����9������v����9�Y����R���i5$X@�Q��<��*���MF�r����D�S�c��@w\��g�F7^3;���
f�F9��.����kC4~x�T;W�LU:"j���NB���
x\���������q���%���+�@��q�����:2W����`�������
��';K��|�V�
��^W����7>�����V*d<yf�D�e,��}�XO@�G�~���F��aYI�d_=Y��U��S��]z!���6�y�����&������7��a�s�_q����-X��+���MG���vFU�4�R�"����(	G�s�9�k7 ���;e�{pl���-ly�r��[�5�lE���~w�v0��M��*;gV�Roj�t:oD��*Uj��]tN��������x�����[e�!l]PY�y�y��U��*�5���|����r�1�V�hd�#r �@� ��f,���?[���{sr��]Y�]��y�O`gK�I�I{r��:���i��!�8���o�����.(�����{Iy������^C�����%6'\!�	"��l������q*rw�z[���v�����W�5V��0�>��HG<��@�?�E]�;�;Q�-a0tW�v�,�H�����z�Z5����r��h�gd�Qr��5P��p��K����	]��8�_�C��EcI�r��u"��9 �������:l#�V�I:�$Q9�R�����7��l9���9�L���ek�Vw�7����e��s���K�=+9l���M��L�37���^1Lr�"���'��`�snD���.��2��Z�N����$E_�v�(�$��9h�[7|�kB���P��g�k��
������^����f��me��9[��%���q��{��W	��N9,f4�����dH���,�]���gD���J�`��w�?��,fk^�m?+kO����)���-s�����]�q+E����Q����) �8&�e(Gw*��5�6.m��a��(���_M��w.3�_��4vt��������%\��o�,���R�R�lG+�n�sN�\�u+e4���:���!c��^J���'� ���\V���2)���L�$�����
�n��2���<�q�;���
�ivSE�<�7���
\��X����l��ih"��yY��Zj>�MS�2�Y���)���@]cM����0d,N��9�v9��i��[���<qo��:��61w
H9��T�t�Q%c���0m8��,���a���h�4=�h��t�Ju1�.he�_��F�9kT�?d��i�+J�@U/�9�����>Y�i�=��zs�9Q��1�~�+�N��Y�wwtk�&����L7t��FI$T�QJ������s�����m���hb�a�4��k�����U)��s�����D^��L�����*��T��K����p��}�=R���X��q�"�������-��l��w���F.�
���(�j��Tp��r���n���������R��f@�
�8�����~��R�Td���:Ut��;#I1���C���/
����s��k�.����{������^s
�o�].��}�.���yn�Vu�n��V�|����������j�)��B=V�O�1/&Msk������Q��lL�*�����z8��e����H�Y�;����:���V���+P��j9�<���&����n�Z����W�L�o��e7��+���p�k��x�r�|�n^��'�Ur��j�Tn��TX�.�)�d�Z���kJV����+�b�B$��F��N�i.�TP�.�J�����S�P?U��&�+��GY������QWH58����jT�
J��Z��+O`��|�}W�V��!������n9�S�n(�ag#Z�N��3���ZS��	o��,+�������S]�c���%��3�B�4�����t�j�3��mJ���eK��J��&k�N\��NL�|������g����fA�H��}�E��yw���*m�b�C�*��-(�h��B��
oz�v3������a�dO��Ol�z��@��M���v�q�EON�,�RJ)E�a#��*P�(dR��k�7~5��?xr<�$�d�m=2rg8g#��/FEP���'j$�n�z���S�h\�e�k�_��`.��Um�����h����y�-{!�Lj���]XeW�s#E:���J������H�v���EO����7)�����oM�P��������8��*�/sk���r�#��v"o\�H��Fg����|��%�DH�	(��H��^���-MB��x;v�=����7d��u��x�d�4h��uY��N�H�i��9�z���+Z���
���>0��������v�.�,�^6"r6��!7{7��T�7Zo�=;]���������S�r��o�f4��V�������6�����#o�Bp�������,5��6P��#�L�|d�vf�*���4|�����R�r���\�H���7Wd�S�[q���9�u�/�^X���1&R�V-���+�*������J�"��K5�`���(�����x�����cw���+6i�v���k2��Ir����b��Nb��
ZT!��ivM�k�7���14%���L�x� ����g]��E�����1<Cv�;^I�-����C"�5���2�H�{���������t��%���'���"7/\_o�k��B��H��x��
�2nJ~��T�j�Nc0W���:��)�Mp�>az��n��&�,�G/fb��VYJ���I0(D*�S���T�B�����1���c��[����S�5�C5����G�e�}-wmFG�j��V��n��<�1�s�}D��Ss��d�*�]����o�h�hd]7Y��5+Z5��G-iJ��ZV�dD=QYc|'�_R���2�om���I�~�p�|�6,K�#T5T@�yhJ������(cW�(����iwin�j�RN��F�o&*�l�� �rA�$,�\������.b<��iN�#���D��U	C�-h-[b��������Dg.:��x���]~��/L�N�7F����)@���cv�,����X�V�Cd5;)�wW��E�"�9"sbyx9�C���B)���z����z���������\�y�l=��i���$m��\Z�_]c�y��!�1n ���g�U�&i��TstD����L�!z%�H�%�����������n�lf�1.��H�Cd2c8��Nr�{q����6\�����nz�4�S��x�����P��Tk[5��s��F�&��]��1�A��+>���,���c;~����l����/p�25�E]R*eJc&N�v�|�k�4�E[����v�����ap3������N���mh7��B�M�y�3.�(w�j��E��m3���{��\9&a��w���������\�r���L����v������TR-'iGQ�P)T=�U(�f*4z���z����s��,i�B��P���|c����m��&D�H.�{?4-r�Y��A���,�T�UNJ�v����*\�����+�g]��+B�Cd����j�
�53(��^�����)[�-��H*�*uM�UV�V��Z�%Pj�l�c/��1����Z��+a�$�
tu"��a>P�Ux�Di=G
+��
D�����9Bi�O'[9�Ju'+Y�h�������F��e[�'�#�Z=�1�W
U��r�J�"������+�Z���[�;�������_��Vm�=F���\��%�$$�
U�%��3!�MZ9�pJ����0[��lV��������\W���Va[�����d%��mvG�^N%���Q�#�>"��x���>]
�\������������\s����t�x�����y����x��w&,�z�B�nbu�4M�j�cGdp���.�v�Y�j{,r����7/{\Z;������Y;Y8�r�$y5*����s7E����Upz���D��u�H.#f�����j�6���-�����-��5}	qF%1�51�b�����)�J��iZ���|�������<=��{y���m�X��fD�$nD�AO'�$z�(�X��Q*KS�%*e	J��(X;b9mh>���{+��4������-��{3w��]g1�)��'G�I��.dhU�Rt�B���d���#�y|��N�����naS
mL����r_x��q'�ikI^V4e�������D��pE(�K�|����u.�����2�W/��g���y�^R�_+����%�3.O��%fZ�7���P0�I�nuRj���	��S��K�9�P������r�� �H�~�*H[�1��S}�r��J<�zG�����x*�N�h�u��i_d�l�����a��l�-���*�����f�Az���{nza��}&���kH��E�t9�U(ES'�?UO�5����7��h'�~����r���G.(Sv�fm���dJ��������KJ.����b�x���~
*65�<4$K��1�J�:*25�H�
�D�E!HB�)hZR� <������O�2������~��q1pB��s�C�w����6c��:��1��I��kR�SV��J��h��h+.��9mb;1w-���W�w5�8��X������\��=���*�]��M��P6�����6��x7a�����5���5�v�3���f���;EDL��]�]4�4z�d� �J�*�����`����,K�
�[���U�$IXLo��fI��sW���mGvs��I�)���kH(�*~�d�!�S���-y;E���0�\����ul �6p����hY3�dI�Z���T-
Or^�8��g-�H����?�x�B�������v��.������D6�'lK]�]-F�2h�t��L���jUUP�9w���
��y{���p����G��x-_����v��]�o��n��gN��)Q�j�"�H�i@�|�t���7m�&����ZlS�/��]y��i���k��p�Et:�(�".F���:h�5j�O�oE��o/�d�9������.1��I�=�q[
a2s�O���c�)I7���f�
t�B��SQR�6C ��,X�^4����~c��J��l��)���r�����J"f)�N��,��S����N�*�=V�P�sr2Px�5X0�o��^���7,B�����n���q �TQ?f�RniJS���JR�	���.���mp����KX	9,���w���4nV��/�YGsH�N�$���R�S2��
�[��B9����N���&25��8�W,X�M���dd2K,�(��Ut��k.��5�Mt�T�Q
&e����>L<��u^Y7\���������K��<���:I$]A�O]K�X������ e�Jc�J����u3�~3�q.��R���b�M2-���s���#h�P*���������o ���1
���U4� n�E�l�����"c`�"���m�������z��'��)N5�W������e
t��rX�0ZrU�1!o�������,�b����q)jU=+��^4�iP��&����qn�bX����
���;�"�e_�?���h�ED5y1(u9P��Ze�S���\�xD��[s��l�(��b2��O�6s�������[E7��VQu���te�2P�"���4�P�@��-��}}k.F�6������v?8a7P�}�l6���?j�a���$����1�<)�5b�ME
p�	����o��RG9gL91����\��o����C��b�����m$�n�"6A���rD(T(�RB��t;���r����j�oh\W�P�{�.I���'^i5rw�YM��R�]��j����S"����Q�����<�t�{�n�e���oo{�V��.�K ���m���-7q�qF@:A	F'{�z�xC����Yb(�����Nc�}�f��e�Q��Hc�����g����j����v�.�<oG]���P2�Aj��UH�L�;1'�+�#��9��3������,��/|�c�wUT���g�5�iT��	&�?
u���8��d�5�H����G�l�&,Y �Vl��J�5h��)I2�M2�)iJR��W���]�?_S�%�qa�����;)q�5.�f���J^EIWUA��LB�(j�N�F�)J�l~�r$���Y�a5�dk{&�v���#q��yC0��c+
*�-��Qf
��LtR��=��L�P����w������6fQ�[��/K���oI�{$c��[�sq&��]�"���#�nT+�������!)D��\����Ya���������e3cz�Z�5h���1N���7�{5���v��bZV��l5U��f������w���gn���i)Er���E2wU+N��1�ST;
������<��F(�����#���ac%ly�qk������*�\�H��rB���n���
T��B����-�oS�sq}�-�q�6c��y��)����r��w���z���Ik��n��N����I�����)�C����|�-�������W�������x�"��72
oK���|I�|�	'>�M�y(�$���]��&��:8��2��*���K����Xsr��5C&J�k���m����*���X���;������<��i=)iE�D�T���3�kr���\1���o�������_�Z1ar�+��.����\uN�tDbQ8���[���Qu�8Yc�.s�^%���Kog.����,�{]2W������cl�:��]�=��G�d��0�����U',����$���@�<��YD��nX���mu��9l\�]�B��KmG^H1M�&A�.+������aiSC�~�l�D��R�t�B��#��w.l�Wn=e��J�7ZZ>��y�#c�x�$�7]��G�-�E��o��R��E�F�EC&�Ao9@���8����9�0��g��q��+kk�#��qTh����H]T�N�����N�*,�jW&tC(U�Z���KGu�j��[�qV-�V2
��U��� �Y{�����RU�����>|��B�ULT�I��<y=r������*Y�s�]�}���=�l����[����JL�<Y+�ZR���<�O+F}Z�F�%T��("�_>g�t6�u5��E�be]��n���������kaL��( �te��	�d��5J%&������� n�������x������������h��<~�P1�S�����A��f�*�Hf��bE��M�B�QR��%)P��a:1��	���x�.ayK2�5�������A�U��FR�Bu%��m:��h��H�iH���j���(�IS###rJ�q�]����9�8��&�n������L"�Ly(��k���j��H��Rv�c��R��Ib�t������Rz��W<��B�a���1�KLaf�-�������V�Mw1��/l)�X����=U�A��\��}�	\Q{s���1l�vPS��>�K&���[�*����#
��E�!�W�MQR��7[^ %��?.��7_`l�bY�����*�K��rY2d�D���z����T=T�3F�E�%)	C(e�X7�t6��^ug���1>V�����6g�J/`l��Ge'�W�j$��}kH��~��5t�7��3���6r��.�U�2��[�ds���*�N�a��������8��\�^����a��fz�,�.;E�H�T�R�r����>s����9��3��n�]z�#���/��^�ms�mx��	h��r[J^�nF(�mGQGF�:�=~�R�AG-	�I���������
C?�Y�B6VI�������UZ���T�s
��}��m���:�����R�����\�����E�_=�f�uVO�U%JE�Zt�]��f�
x���=�ma��^��	��Q!wGF/��wd�hA/0�)��n��F�"GX�-+JT��n���6K�FZ�NR���I2>�T��G���',a�s���^�e(U�g"���|��\�t���\�M����Oy.d{o�9�s&�����[	��������~�sG(v������(��<xd�[7Eg+��U^�/�����M���gr��bo
/�]|�so����a���m3������x��nZ����b)Z����z�T�D4�'���_�6d����8�,��}t�r�����d���ZH�wg�j�y����D��c�AT�t�7t�L��`[�|G�:����@�nb�=k5�mH�Nh�M�I���9���>���z��	]Y:�+*�
Z��g��0�\}��VE�y^�gwcL�f\V�m>�����t��.��F�Q#�MTWD�Q%(US1T!M@��&����Im��{���*��e%��c�8k����&���U��E�q���"��]�{����pc9�DUZ�%���+l[�;dF�W���v?^Kd�����Z��������E���]�Y��U��Z������\�]��.cP1
��<���w2�}��nzc����:p���lh�0�����D1O!�D��^��]�����7+���^7v��/�gY'T/��eD�L#��������{f��L��p�f��������uU����U+@j����n�^����13�,�E�����|Kr�5
����Y�V����R����T�6M�� ��j���o������Lb�jR����Q(����]'����������=l��b�I���%S&t�d���|�����.GT5��|5��Pmd-{{�Zm��9c��:����z:Q��
�j�mZN�#Zp�2�L�$�MW-�\x/�.���8YI�������-�{�R���Q�j�i���pS�t��H2`���dR��.gW�w������WL~�s��!0��?9?
�6��9�Ww�y�����B���]FD;��$���
ZR�)���������>���;�knM���a��.yK=�����%�<�R���b��u���Q��&�Z���dg�(�0�@����
~��lbK���5qJ:{
�m7�3b7r��"z�r��t3c��Zp�{<x���}6����������`|�������M��}��v�w�zmX3�{�{��n���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`��������M��}��v�w�zmX3�{�{��n���{������v����������>g���n�x����>���{��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������v����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zm�3�{����j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��n���{������V����������>g���n�x����>���w��=6����������`|�������M��}����v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������v����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��n���{������V����������>g���n�x����>���w��=6����������`|�������M��}��v�w�zmX3�{�{��j���{������v����������>g���n�x����>���w��=6����������`|�������M��}��v�w��X�5��D���&�Kn���&KS.i$TY#7����V����i��de���D�G����c����'H�d��\������H^��!�����f���p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?�x��R,�	���(��dxM��8qG��#�h����<�YC�0�Q�"�����<p��)G�����yH�<&��`8��E��4?���w������d�uVY���n��\77Eth���^�+�1x��}��������?�J�@��qJ�� �i�����^���Z)��T������-8W�S���\�4Q5�"f�-�S8^�
�r��D��n%+��*j���R��iE��L��9lu�2ep�LJ��d�. ?��uND�!�UC���js�sW�HB�kZ��JP���:�4L�Q�T1�f����*�OUZ'Z�Z��-8}�U:)$���dq�u���D�tkR��Q�KC��+J�kP�Y����Q��=
�CT���7�Z����P �R��
ZT�5hR���jcV�)JR��k_`�FN���(����E��g�'Jt�uY��T��;<LZS�d�Jq�)N�kZR���Z��JP#��_������?��H�QF��S�n�JR��LcV��R����=v��:=Sl����H�fT�L��P�%+���5�b�AS"���E�$z&���#�R���5VB�)M���5iP��:�"i��(��B���sW�B�����=��J�{�L�����v���"�
thn��2f���(n��W�2M�^����QN��r��")R�*���Z}����PV���j���N�1Vj����G	V�����Z��I(��I�����M2��7
q���^�����+�9��2�p��*�R�.��T��L���J�"��7g�N�~���@��J��f�(�Z�&�����Z���f������U���%H�Mr��+R��\��N���'����A����6EU��Lz����B�Lz���xS���*dTr�h�t�D�p����Z��j��LR��c�j��< <�l�$����D���r�5J����jR�-~��*H,��TS:�)jsP����b�7b��^���b�9jS��)�jp1LZ�1kJ��T�:�"i��QC�!S��5x�){5�}�R�=�1ve�lTwI��Bp;����MV��T-8vx���T�h�������o�`7��/�*���g��!8S����
{T�T�Oj�h�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�=�}�p��O�@�������>�:4�������>�:4�������>�����)�S�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����
{T�T�Oj�j�)�S�p��O�@�������>�8S����
{T�T�Oj�j�)�S�p��O�@�=�}�p��O�@�������>�8S����
{T�T������F��>�F��>�8S����
{T�T�Oj�j�)�S�P�=�}��������O����>�8S����
{T�T�Oj�j�)�S�P�}�}��������O�@�������>�8S����
{T�T�Oj�j�)�S�P�=�}��������>�8S����F��>�
{T�T�Oj�j�{T�T�Oj�j�)�S�P�=�}�p��O�@�=�}�p��O�@����8S����
{T�@)�S�P�=�}��������>�8S����
{T�T�Oj�j�{T�@)�S�P�=�}�p��O�@�������O����>�8S����
{T�T�Oj�j�)�S�P�=�}�p��O�@�������>�8S����	N�jp�)���t����������?�J�@��qJ�� %�#7�����4��?����Q���W�����Ya���.�gC"���*�&��,��zj�C�P��T*3��I�KVqn����%f��r�H,�?5h�vI�h���c���gf�&,�����F�!^&���7D�\ ���L��#C�-U=	J������/M�����%j�����!�1,�����w��c�!kH�SQ1�3��n���M&��7nz�6��`��F+`�^����N�]�{V��\E�-k�D}
o��������-���U����qj���2����9�-�)N�G	b�����Mq�p��k
�'��~F����E�����v��o�N���X���Yj����]���UT576��Fu��P��Ks�D�����J��1qH�v����e�G�)fd6R�J;V
����y#��Ur�T!S�Lf��U���<����E��Y`��
�A��G���Bhb�	���""��IH�%H������T��B�����>wv�X�]��<�e�����4�go;��W�c"�:����������"���kv�)�C���%P5T
������7�1r����1���$ru���]32.����9�v�����>�=�����2�L�M��S%j���
����7���`��T�]X�#�yX��#3ES?��5�����x�*vos&��z��d�� d��UL0�R�9�-�Uv^:���[���!p��	3�����KF(���n�f�����VlT�����Ls��g"��|�76��}���J:2��r�X�*��hV$�.k=������4��F>f��$B'W�sT�L�)h`��3z�C��o��`���2QM�S�Qf�	��T�=L���������>7!�c���i�1����V�#t�&�_�v����4�����j��l��_���[��syC1��c�>�t�����E�~h�
2A'tR�<����nb�'�p����{�����l������$T����V��2�Cu2e�f.\�J�Tb0������[�9(J�U(;�_U����_w?A2�g�{������L�#}Yy9X5����?J�z��v�c�Z�I��U��j���������}n
�o�����{���u �>v�!g��g*��.���q����J���F��C6�rw��
����]����0b;v�������k}�����xf��.�m�D��*��jvx��'CT����lB��/�������n��9����y���P"����(&H�U��JP�QJ�:��
��!��BS�c��-)����
R����[����&�mF�r�W����jQ�1u��%�����y�w����e��#QV�Y�����^��l�jD�v��0����E�Z6�R�n\u�7�Te��7Y�=�)~���jy���z.Tz�f�M�U����l�J�������v�V�2V��\�p�z���'���~�3�����r7
�jr��[�����g���iYN[��af��E�A�I��5������B�2V�7���h�������op����C�����o�'�b���\���S^4��r�Q*��%C��Z��k�������E�g�*�k�(�������y�e��:iQJ$����%B"�H�i��+��R+��H���YK,\v>"���61�}��q�:�v�b��C�\�pg��Wq����@���w
�R��!��]�yr����]���^�z���^n��0�R��d$0���.D��[r�f�5m���t�I��������BTwL�>������8Zm�b@���T�2Y�*���C���z(V��������[�ZT�F�?Z@�^`Z�=�&'���lsm�bmde<=�o�wm�y�r%��J�7�c��)6���J6v�E���t�t�'H�nXyTg�����U#q�����OU�%�
��XCp���_�t�N5���f�9}���HK
��7V������|�Z���Z-�eR�Mh�2�sRU]t���J�sUt
C�H��k��O��{p�V����36V��y=�/�����T��`�s,m��l��t�5"���Z�2�(s��yQ*gT�YN�*��:�8��kJ{~�
��m��[��h���(�(��{*/if!�U��>���
mVW���g�"�h�e���e�)���n��=N%��o$5R���y# �W����	NH?z��������uVYS��UeNc����Z������v7m��W��*O�dK
�d���k���<e�h��!n��U�t��uU���E�Q�{j,�fsC&��^�������w2���w�G�+c�k���,U���*�{�rq-(Dl�VZR�=kJ��3f1�^��J��:F�)N��p1�Jv8���� 3�����+[���
��v�����xG��P�6��e�X���y��V���9��q�k������B=�l;
UgN��r��d	��������P���z��r{�{Yp�����;��G7���YDIQ�����j�1�R�B�a��[�Z��W��dz�w�Z�I������J�2���o"���kBQEM�-k^�N5�@{@ ��7�K/<w��a��
��h���k=�������:�Z
mh��ZR��P�36�T�6nd�93��@������G.�^���q���2L������1��.���MY�7�T���n��\�L$��*}��)W���{|p&!�*o���Y�--��K���c��n{�R��Y�r��6�K>9�?1�R�+wK��"�B��W0oX3l����Z����&�Z�3��n�i#�����}<��Er��r1�j���^���Q�L�^�:�HS�~7��/{J���:��[�����k���Nf��� ebn�IVRQ���Q9��E(E���B������]���W��7����ss��Y^����'��{�5��}{��V�5��hYD���+C��C�M@�Z��{��sm,���-8�_���~K������Yk������_XR����9:-\����:*�W���D�j��U���X��P�*^4�ED��=)Zv+���@ 1�7x�}��r����F�We����(f���rI�H��f�v$Qr0b�*��[��)���U�f�h
��xb���;����������kL�1�lJ���di�7e+�w

Hb+��RUR�4UUZ�	�-����X���!OhI:����F>Y�|��r5�D���A��E1]���r�dP�+B�B�����"7l��`���r��6R�f�{{�1d��$�|1����5z��3x���Z�le�s��3�� ���D���[���������t�>a9����h8<o%�o��{�����L�NEf<jv��1�Z�)T�S����v-FX����ad���_����S0�'`8+u�5����.������d#�!Exv���+�(�����/�^���M��5Wm5�[������7��nl{K�E�\�����C�������Q�TG(���������8�����VNP��\�h�Y*����xB�9W(����T�)�;2��c�
#�-�7��X8��~"�����Qx�Y���5d�\=,�c^���nt�h�f�#���{���M���E����su���{���E�3���s�`in����x�)��"*�TT�]���������+J��)?�)�b��1�sP�!iS�5x��=��������{���q�4���F �����6?msS%.�b��������n��.���(�*����9j��Mh�UC�A��h��a
r�h|5����H�h�������*B_��F%8���,�&�l�b���`���X��]�d]2�*��*�*�����IR�E5Hr��+J��5#q�1��Mq�e^D��m�NH���.�8���?	�v�M��Q��kJ�!�i�V������B�E�����f��%Up���o�M$�C(�����5{��0�~��]��7~�7�n�}� qf,��E�������H>s~�j���;���42�]�J8�*Z�B<�7�0������L`�l�mw��I-��6��"��95s���9D��j���uh���TZ����3������{��X|q�/naQ�^�{��G�&��v�um�:�}$f���DQJ��~��������N�lz��8h����A"��YB��jb��9��-s���8�5�xS��
�lW8��.�Ze��\X�F��X�K��wU����X�.�n�+KY2J����0n�d�)�I�j���mt:�H��;A>=Z.WH�*�7A5jB���k������c���l\��Nm��jDc�Sf�_c���w���o�:%��N�����&H��k��kZR����]�_�x������N��%w.�g��i9����i2r�{�����36/�nn�E�L��NuQB����
����#l�����iq� �S��fR����K:���'���[I���3z������uP]���t$�U�D�o�����o.��1�����l���n]���~�WhIr���cT���c�j�e�u(�l�l�W.W�R
r�{a��4�=�[�?���N/[��������
I�u)�p�\{6�U�	$�h�9l������]��@�	���k�lSu�[��g���*�r�n���J��2JE��\|ip��Q]�i7@�Qc��e�H�+�����Y�Z�9�Q�~!5bs�&-�o���[�����dT=�t��K�Ekr+�d(h���Z�c��x�Jd�y|��)������I7Mm�[���2E�jp�^�)������	���/~�~OI���}�{���\�{�~�?{;l�@���GC�J���q�Z��d���a��A����������[�..��V������is6����/fH��A���������5�B�O
������R8X���kZ��Z$z���{%�^�J&��C)���G��@mX������?�J�@��qJ�� ����S�9z'�+ZP����n�?b�)������/�����(���,eH������?:%8�E��C!T��M���������S�5��}
��(���4�8��}���=�+�_g�@����;����N���v/K���]&m��x�=5��q�
�W_Y�-BNt��z���s�!��S5���Q�t�N�O�����@Z���n_{�N�~�9z���p�X�*���N�~�d2����w9��8���7\�z��zT<����:=4mZp���8�4e�W����|5�q�|f�^������v~�����W����X����2�e?�%�c���G����!^	�}T����^��t���_�_(&�*z����u�&���JI�r^d�T�S�*8�iCt+��J�K��'��+ ������(�����O�8���<@W{��I�Xk}8Q�-��$�-j�e
j%n���"���BV?�kJviTz\k��XH$����������v���o�&t:dVe�jJ�mULJUiI%ZG"^�+S�JS�%9�k�	�w�4������.k+J�=*�������$�
-��6��ZFEI��hH���*$�gb6�o2e����yn�\r�Wt��/+D�A:,�tl[�9��p�U�DH�B(� V�n���L�\�l����lcwGF��ub�����s~����t��^J��Y��7x��.h�����bmT&��>���R��5��Y���<+je8�F�aX�n��
��1S�3����.f�:f�Z��)�����gsK���������v���clb�ev�h�oF13��FBd�&Wn�eMTL�v+��=j���x�9�%n������Y�n�j~A�9�i�
�ck\�|��3;��kuI����d��jj������/TR	i�[��g�)Z���u:*��F�^���������8��������b�e���K�����:2��Q����tguq�j��UJ��R��t��� 2��^F��{yU^�L����5�F�zE:��7UU=�������HY"a�(I�;��0�$�$+Z��t��(�e���Z��QZ8�kZ��.=�gvu������Y�x����!c���
[�(5�nVwj�U�t��Z�r�r�.�+��*������Vbz���|�?�mHX|��6
�-����a�����s
�.D�V�2jgM�E
�*��u�
��9��|�5���y�m,|��o��>a��L����cV	�F]V�+.��z��G�R�l�%����S�#��Z����r�`�\���7��6�u�}�'�y�J�;��kI��Rj]��G�h����� �
��V�����[��qG1;%���s�H�l>[�".�6cj���`)D���j�LKF��QR?2%dU�(�q�,��*��E3����I2��9���K@��e+�_{����W��]#���v�4�t�7�DS���9�eS�Rv�PA[y�SP�QUd�(S4hC�U7SJ6��f��l��RumX�j�[3b�?�RE"�$��
ZP�uu�_3_�y�������C_?����O����X����k�?�����~z��n6R���Z������}��
Z��W��R�ob�����Q�����E���Y�R;�&���S�
��x��,�\���su���]V�,����!�������t����Z���Y]*F��l���������%�8� A��a�2����-���������w���8'���9{Y��uMN��J�������������o�`7���.���g��!@t�����Z�gq�U�m���n���sY�i%����T'c���R�*�A�V���k�Q"W�p�S���A�,��l������TLc6��1LQ�*,b��6��%)J)Ob�sh_��-/�.��j��S�ZS�h�/VW$z�L��=	V����X6���F#��I�-"3%xP����[��R�����X������vJ�3M����������jx�)����R���'�7�C����K�������Z^MV]�����c�a�����Z��L��^���J���z4�`��O��v�.�
��d����`�8l�>�d/����(O���o\.���9�_����%W�\�������.���{��t;ENV�^�H�*,���*�-���Hcp���(��lS��n��I��%v��1�3O;/Y(b^�	���B��v�5��)��2W��}j����Kox�������fZ����[K �)n�5�Z�j���58T�?b���Z�KL�T���gR�5�(����]GR�7nT^���1�c�mZ���W��+��o3�I�~u�Rr�Js"=`�G�\�qQ�T���T���)N<x���KU���ZCK&��t�h����=J�+Cq�+J�4[.@
���y��X�������$���j�2���^������Z����	�?��St�^dX��<��j�kD\�j��-8��*�H�F�f���T���eXL�����A�6�g3v�MH.��jb�+��4�� /��qUT��;�T4|bHR�&��B$Z$�����l������'Ho�!���Da��������r�!���3�$�r����v����H��E�`�������o��)��KA�%1f�F�����M'
e!����,z�9~�kZ��
Z��(���y���c�$�>�9o��y[�&^���3j���.���F�����@�,���;��D�nDUY�5Q`��-�o����k��1�p��p������.�k9>����s!H��~u=S5
�jZ��D�.(I���,���+�I0�d\����>U�Z������9V��D��L��^J�k�j�D���z���[�?�[6���`'h�f�1�	����p)�n��vN�I��x��)N�~�du�[�����y^I�t����7,������v�I�mux�� �b@����iUMZ�kP����=
�9����klI�}SUR���%�z���i���T���iR��d�D�/7k�:�J�������Hc2��-��/
����Z*��Z��Zp�{<@{�"/���JkN���������j���x�*!uIp�;�"������Z�F1^� rV���)���CstKX���T0F��������n��z�jf��R�q[�#H�Z��'�%�d�*j�����
Z��@�����F;��,\rH-��������5���+���7J����MF�����0�C����DdY����e��e4���-�i���2�z�(�Ym��c��WmM����z�4��G��I4���wnd�o�(��\��OV�n�J��S�,����<��nS��|'���BF�����wN���~Iv�Th��h��Hj�������P���\1����&�o����O�n6�Z^��w�����/K�V������Vvzp�N�"Z��<I���?������z !�$��-�V�!�y�4�s�e
�P��5e�����'`�3�Vt�O�R��{�R�	d�6�E��0�o�F:
����"=�(��������H��R�����!bz��
�[ �3n�;}w��.S��+�Q��KU{V<�-i������p��]��-^^��sNe������x
����ls
.�������f�\���V�i���t�K�)���5t�tl��s����6Y�<�����Y��&�q�\��o��7����B��Z���F:!��r�V]�U��!
�J�H�r��_ r���+��+�{�V�g������ti�6���x���J��&*gF��D����E��eW���U]UR���*��E+B��iKJ���xR��v{d��?9�q'�zpE*�zJ:r�&��G9P�5b��u]��k)Z� �N��5iB��5kJR�+��EZo�1����0�g��]W�f�?�n�!�Y�K���Y:T�j���L��O/��J`%)�o��������`?������?�J�@��qJ�� �Ky�������
�9�+�$����t� ��4���~�������jv�j�^��k*B���B���,�Q���y�6���o�
��b%�>��GG�d�5+���"����LEkj%��*S��P�����{��+?��7�O�W�����'k8����a7�I/0H���2�8��V��gL����z%��}�7i9�dM�e��\\�����s[R��l�7s]K�B��;�o(�[�Y5Nb(��W�YE���@$�j���)�),!xeO�E�`������B]8���J������^�op�QI���)����DWMz'~��^����Y�K^�P0shKZ������b�op���%�+����^��P�eE�%*����"��
����g.��p�����5q\X*k"��,I����8k���1��K�e
�g��Q�'Q�Ac���i~����[��f�,+��I����6��������>i �V�g���h��Li�l�3��)B3je�5\��X�.��vr���}�]�XX�������sU��U�������\mlJ����J��1q��$��"�trT���B�.�i�?�&<�Zi���.I�j���lh�%�fI�OK2o9i�V=���r�7����W��\��!���Uv+5n~l��������S!�b���1�R�}��������9^�N��Qvl�:$��n�u"KP�lu�^����E��i�&rVX����{@��7n.��������"������z��j)VoVZ�(DT(��y��������N�{)������[X�:��I���
��b��V*(��h%�2���+W=M:5@�:������@4J��Vk.�L��s\C�������,�q�;��o���cEQ9�Y�V2u1OJ�9�Z��-�'
��j[O�Y�=�;i54�}��xF�5�a �>4�Q�W�W�������!B?9�J_{S�����'<�
���/lL�Oj���6���oNG��n�(5��Q#,^
��)�Ub�	���-�6��,�:-;>���,�J��6���,��+T� �nL~���5@G����4�0�ZY�^s��
q��3�;I��5��*�Y���&��hT�d�.
*���:�U�:-�B�JI�
�
msE�g��]xw7g;�8^A/{�����
���kN�F�#��9~���wL������&�huV:i��)�����S���Y#f�k���1e�o��{}JB�b��wdKz
�T3��\P��O�V���5�L�T�����>���:����;'���oa��;sO���DX�JK>YF������T\��
������K���p�>�mV�Zf�Y�x�����"^�$���K�b�hY��c(������A��A�f�X�U��L&��%���J�:G"�����7H�����|����1
���f=�s�+�
YZ����y������WP,#��K�J��m������%p�U���ey�3\�{T��������6�co�6O��i���v��EZ(��Z:|D5L���X���EW�K2��y��
�vNgZ�9A�2miA�=�ml24
��II�G��P�27+&�*���os�0d���U�k��O_�VY��9[=�@�q<Cy���]����]�m�B��h�)���Q��P�P�(C]~������a������lo�����o-1y*��
I�W5\�d���G�d���'CQ�Z�����Er����U���%��6�����lV����������e��Yjv�}r��RL�&�q[���P��_t�^R�v��na8�0`��������=��'r;�1Wa��hY�|�����t���tUY��*t�H�;�G����Bn�T�95���E��O�{[�lI<|����#�Xbr�Eubl�ZUG'v��*�-:��|���"���}�8���+����u���Z������?\3�����N�,����h����J���3�G�P�u��w)�;������im���]�r��^����{���#������zf�&�EM�b&�"�>��'�9�c��e�<�����u�l��a���D��:]�Y�752�W�B���j���NS�-j������!����<�"� �������K��''�	'���bQ�N��U�U7�Uz�=h���e�����n��]
sj#8b�;�2�w#����E,�,���SF�p�����5+�O����,�3����*��s�7�A�!�����;���}^�����XG�����]���^�Zv�*�**��S���E+����6"GIaY�f��-�3(�T��l�	������'����l^�Jr���hj������[/���X1C\��/�^vF�w�m�j/ad��\L;1����U��N�cR��Z�Hyis#��d�N�X�8�l�n� g�\�������x��gy�K��N��"��#EU)��Zd�X�d0kv�%}r���j�5m�/L��Y�7�;D�@w��������oyN����5$d4�G+�V��2��V�P����my��u�G��8�9n�����.e����Lk����S���&����
�3��R��QpT:�GI !���3bLQ�a^�R#�K����P��6U���
!N=]^(��u\k��:k��P�g�S���V�������|��3����:���lLQe\�''��v=���+v^w+�����Tx�zO$��1Jw��t)c��R���Q��=��r���������<�ic�*�b�z�������dL��z�E��U%J���@\{^6�VvU�6����o�n*�����<���6������4�C�ty�E��SpS�+���j�js`�k�{�9yB���;���V�ukF������2���&~���f�^�DTT���3�J�p��Y
���]��-�4�7�B����
#]*���K�2�kC���E�$u�N�gI2R���8m��)�KW�6��:�����;�+d�Z���������Ld�^V=���z6o��]1�VR����d���5���q����V��r��mq�bs�\�N�G���,�Y5.��*��,;���>�
j7�b���G=}y_sa�{�^w�s�>�2��G�E����WG"�/a:x��[�2}l�����[��ND��T��S��V���ewsrn��a������3IR���q}l%�K���f��5U�TjI�[��D���
�����6X\�7�k5�k��l6��'�Mz_��o���,U}U�)��*�2i2�W�5z�����o�z�[�v\����"��T�;�+3C[�q����UG��������Y�����F�C�l����Ht�Q$�j�����j��MS����B�(j�Q�3�*~��2I����P����I�)��fo�8�Om]d���:Y�Gr��.k�6��Q�6���m'QAZ������UT�qn��������[��P���-�����yq[i�xf���/Z�}%J����U��B�T�z�r�~q�������%���=��2�����3�}a��x������N���/X���!�)�!�S��	v����-�yuIk�\�r�8�����ik��D�e\�������H��;�7Tn��N��Q�'�S�B'��md�~h��e�Z���~6o�,�y6qd{E������������#(B j�F�(b�
tC��z���=���J�����f.m����V��"�Zo��j��K���=#� s��A���G(���D��OU��p���m�Oy�����3���������'|AGI�	����h�7p�]��Z/��
R&~�������<��:=\V<���9X�#1-+u;��v��!����|E�*��?r��H�������`�\��'���pF�W&���f��R��
sp&K(��-�n��Z@�_�R6��U:��]KeTk��e�#W����F��,}��;f��m8�B��b����!-�v�����-���PO����z�C����h���en���j���Xe��C��Vk���rgYB����XrV��iZG�p���U|��*q'���-"�g�U�tn�U*N�����W�'�^��+_c��<��kX�_0�\�.J��b�r^,�����wY�#[Y��������*�D5U;GpZ�=S��&�a��N����rp��c�[������,�in�����x������)#$�:uh�UkB���6[������r���la�je��c�����o"c	F�L� �JQ��Q���$�*^���-*�����dr<JA�*��Y7��$U�,���C�b�N��hjW���5���2�y37�,��r��qm��+�k�?VeF��D��s�s$��SV������%'�y.����oG�}�q�[��m������6�m_����%S����~�
���8���Y�;\]����s���7%���3,4!�U{b9�2u$�(W*���
��F���j�)�B�a`��9e^��sr&RF#<[��Dqu�WsU�r�l
�RK<�����]5�^G"���N�AC����I~`�7x��i���Z���x��f�a7��q����)�km�r1�T�z��+<c�UD��C��Uj�"��.3��nWD)��_�yF��f���xp������jw�����3���x��������u��z�l�
�����X�y�2|���V���Q�J���4N�Gj���)�YWElJ5�O�U*����E;�%qg�Y;nZQN�v
l������q��m].�B�2���UZ#B��R��:T-h��^������z�p����V?Y��R��I����kq~���YH�"�	C6�����SQ��.C���h��2��/���n���}���������fh��5�y<�en�wh�������k��^�������hG%��G��J������I��������<=��BW�r�S��]8��|�J8�����I��;���d���Ck��=n������Yc��&[8�9+"~�8n��z��uV����P�1x���m3z�f���Xz9�p���L�cYn������;+������!��mS�n��6��U%h�O�%o���obAa�Y��\;�i[��Y����U�tz���u������ ��Q�
��%���5
�����y�9G�����B*��&���_+������c�"p�k�R��b���@Y&ZF.Fz|����JfF��&V:P����tX���Bt�J��.xW�!���L���L���������c��I������.�$�S�J���;cR����u��iP�]���/�\�M
������@|���fr��o�9R�?�1i"��������/��6�����2���t����������?�J�@��qJ�� TW]��v�*��^�L��H�/=���xq�����K����������3�u�L��5����,��m��,�'p1��,���X�L�[�:v���&t����D�\�V�1�1�.���}k���%�O]���_�2-L�L�������J�h�qQ�������R J��h���P�j��D���l��u�B.�C���;u�bT���x��P�*$l�E&���M�"
S9�lt�#B�������d�5TD�U����Q3��/p�D��Z��R�T��I�W
��U�F���T�vT*���5
���5x�������E���J=l���%+��@��j��{<ZS�d�U�\�b����%/MS�����
^��Z�����t�U9�P���5Hr��Jb�i_���eYg	T��rZ���H�.���R�r�(���{5��P*V��+J��-iR������V������QU�*��~�K���#t����Z������d���R2��!�Z��
�5R���N4�x{iJ�4��Mu�"�&��IjtVJ��T�xp����MN`���G�t������(��i�l��t�v�)+_��x�&�������P�z*&s��N���+@��b83���oO�;��I7����Ek�)�~+Z��1�Z���MZ��MZ�kZ��?�?eUB��z�n�)E�����Z{]�!���@:�����M�5�Qj�J�Tjn=*��.'5��-UD�Z�s���tk��D�"q��W�Oj��v@~�]tT����J��J���MJ��&�r�������J���8oD�9[�\��)7r�K��s�JS�����<������j��t������t�����F�(bR�{<hP�,��I(n�
pA
W����(��IO�-(�����R7t�T�5H���Z�����%iN=�v@y{�%�A��Z�����P�QC�E^��sT�5}������? <��p��3u�B��(j�����N�(j����������n?|���^�2��~47\e
UzT/F��+^<xv=�`��2��sT��hJq�-8����)�R����'#JR��{JR�)J;^��)�R���*����k<t�u�+T�p���K^4�Jz����h������J>��MN��Z(��l�����_�Z�*����&l�����;f�������L�7�IS�����?��O�2���]��`h��������x��sF���o�!���]��%D!y����B�%�Y��.���:nZ���m]"�'��t�^�8��_�~�L~o������6�Z�'H�r�����b�������l��o+�'���IU��l����b�p��i2D���%(n�B 94��R�;]���v^����NF��W�n-��yk����r^W����L�:R&�����\��M�p�����k���<�l[��b\�������7}���JGn�+��=e�����
��[�Z���R������-�o��������oh�wm>����I��$�.W-f�����>��P�;g.[�TMN�t)��(R�#��h��:>~�`�*~q�ih���TL�R2f9�N���S9��K�9kZV�!�������_�+`K��O� ������	h����iE�Q�cW�DqJ��T���%C�|a��(Y��_��]5������b�����vL���OJ(���T]c��7
p
D�.W�9�w#�`��%�&�������b���cY��2��d MD����G��d�J��
R�9�J����:�Vo\p�;n��n���E���/��X��"o �.K��4k��{a�zh��?�1�^7�S�,+)�w.7����c��1Hk���������P�W��4S�hb�U�1IB�D�E
SP"���+(�����\�	0���;6���n�#�+U���ug%3���MJ�]��b��n4�B^X5g�:6-�|dT;qQ0�������lVl"c������JT�A"�%(ZR��Z��Z��,�,~�cs���^�es���rN\�|�(����VuUL�=���VH��Z�j����6��^�n��)}��)\������k�.Ae��*���o(���H���
_R�c���kJ��T�r���>����2����[�c%����k�#�1�%A�4m�r�U#��BR���"4V�h�NZ�@w����Y��~2���9�Q�E���������JD�Q�6���Z���UoU��J���������,�Ex��q:�!{��8M�+|�����l��A�6u�NUR1rt�L�%��=���)�J����P�#V�����
R��-�d!)J�-(R���JR��)JP�1+��8��%x���J�*C����J��5�[�sj=�;���)i��-�?��c���������E�iy�gTQT�:mP!�L������l
�.[�]����.�a����b�.+#Z7��~���Y�Pr������6�YZ�E�j���H�/��jg.�:����5��k��S3��Y
��f����!S$u������L�J,��"�-*�O�Jr��/����,�'f�W������[E�+�~�u8��b�
w�����G��E7mT�J~�#S�bP�6q&��d�s"V9�x���J8�fx���w��Q�%^�A��%zI��1k�-*[�oPu�L,����[:N����������o{���2$u$��k�E]�T�'E:t!uT��,��.S�)�c�5C��)�b��LSS�J���V�#Sa�Ar����S*d��$������Y{\���� ��Q���o+F]�RP�9�R(��c�S(s���W��i\����U��|L ����wNL�,�F#g�Q7M���F�\����Dh����9MR����������G��VR��#��2�6�e�5lw����(�M�y�'n�^�:���)����k�6%UN����heP��ZR��N��s���b�����)�J��B��jT�!L�1jC��JR�9Z��!�R���+J��������_���b�����VF�yW��8�(^v-�������Z���+^��E�R�cT�'$���Q�����xF��1�5��������������ZJVA��;���)N���������?D�-�iN���_soF8;]��-������$������mm��oh,����^=��z�T5S��R�P��b��k���}6�y������������]��,Jk�|������E27l��UT��S��-
�U9yi���#)�V.������������D�9T{��r���,b��bT
�)B��-(Z���keflk~����<�����{A��}�V��J���o/t��P��*E��U	ZR���7 S������7F�K��,�n�}��}��:��:������w;b�����/u�r�~�*��p��v����F�IWk��nB�J��9�R���4�^svr�[�,�[�)����p���F����V���^�H��x��:�r�:��A�K�%B�����jcV���Z���kZ�������Z����	M��e?����=(
�����uwb\o~�!1xZ1S�m�����\�$��t�b�3������c�5@uoF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�v�kn�����n��Mm�{w����3����n���y5�}����z7`�&�����PF������
���<������@=�g�[w���(�f���E;.���I.�ed�����fC&����7d�9�N=��>�v1�M�;eN����g	*���6�t�yj��:��}>�������
=�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
��4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D��:��)���S��1L[J�1LZ�)�jH��i_b�?j���U�UYJ������P��i����#Z�)���
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6���x#���6��i<�Q�q�4��(�z
��4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yN'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<���A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�8��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
��4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�q�4��(�z
���O�@=�yM'�?� �n<����A�SI�������)��G�D�m���x#���6��i<�Q�xcYe�O5I��^VS�a��V�KQn�����i��K����,����
8�����^X�l��Y���6������pu%/��2��l����Tm��w������R��*��A*�5��8=Q���%�z7-���$�����gE����Am(��ZHy9D���{G��:U�u�jUP��5�t�	�;��bLyI�������r�����dE]?�|�D���f���X�M"�Y���+7y+���y�Q�5\Q�r��qd-JU��U���U�(�����J��{���ZP�0�l��ll�������T{�����q9��F�!W*k �+&�gl�����U���]%(e ����V�������s�o�6K[�����5	u^1�{���w,�:6�jv)�zU�H�\���C"���&r��C�a0=�%�p�r���K3�;~����(�H�F����b��3d��(��p�(b�Mc���Kf�m��h�
��7f�^8��jI&�E�w/?8���=�g����JK�1V�&c��QS�h$���o�?\�����
f�X�SdY'y��r��9��-����d_�v���u�����r�P�����B���4���2c�7-b�����
���,���~��
�mM3+��h���*����
J��C��)�@������5)�x��m��fj��{n\�F�l�x���i
I�o�r%)r"��mW1�*�C�s"�T�E������sK��{�Tr�����=�C���)�<�b���R
���uWIFO��~���t�����UR���$����+���p�&~�j����,�o��v�����q��.H���{�W
HD;^-�N����*2��P��Da�k>[)��|a�41:]"WW����}�����
�w�b<�o��S��
���akek����
��t3�����,C[����\0|�w)��5�C����%��?7���r��_;a�cm7�M�8�q�
d�r�D�Wj��]��B�]�P�q"��1B��:J�-*�Lv��^�b��������1EL�Z�o�d-���PK�:Mx������9�2NT"��)�S���������p�6�4���y�[�<y
����E��*Fw����J%Z�Y�[�CE��	�L��G��;������c�����%�a���raBQ���0oS��MU�JJV�E#�ZvC��j�Y���0�sFi� q�,�P��W��s��([~!��v�hc��*�h �D:�*r$���J�o��[O�=�q5Y����
�����D���q:oTb��2�����pb�T���R���r�,/�{)���	�{���NJ�y"(����G�Z7rvqrq����/��If��;E5����T�1k@��u�j��\��v��QwP�����*���Z�)iS��)JS�{!�I��hW0M���[d���Y���w%w�X�b1��kXwk^^��nr����U��D��Y�4Y:���Zp3`##�O6�?�Slc{�h�/g9fZz:��1�����%YZ�R���c��{�1q�p���������B���!����l=����c1}f���e�md�*�m!��m�q�����YTZ�/�(^�**z����������y}k�A�q>=�vp��kp���L�g���	���i/#~O<��]�5:j���	�R���2)B�r���������cW/i�.|l��\���$l��h%%J�6Y��u�&�=u�~����d���MZt*+|����-�_����uo6�gIkc�"��wv���sT�QxK
������d�v���t(t���:��@�(Y�Nm������[w�F��m�q�6�[d�\_v ��v���"_H�h�A2*�Tfr���Uc��9����b�N1�I(�&���H�p��/��F�=d��L��*��t�!�S�1kZV�����x��9vk�z���t�;Yt_�����;��.�m��
���n�U94N�]bj�%TA:)�1�������5��a��8��x���d�3��s	IXV��bf�@�l��g����-"��l�	UULJ��5L
@�}���^�|��k�{od��J����|���z]nZ*���e��i.�A�� ��"Iui&C*��$S)@�{W�����&G�W��Y��d��3NB���T�-(��R�d�3mC�U�<y�DkUNR����Y������)�2Wf0���s/={��|�����;t�I��La�b��2u�h�^��1*S�
�T��9k����-������?�?���zu��6��
��8�d��������]�R�
Y0����)�U���9U�c��T����Z'���@E������$��ef����3^R�*�mv�k���o(��d�j:��Q"�WMf���(�u�t���Ij&����5d6�����6gIvb�R�X�qq2��F�p�"8�����|��_�z��G�73���mU�:I����^�l���%�l��CUZLBEOEHK�U�UjIF�T�!�W�3u�/{��{;0Aw�&��<u�~�Ad^SA(�J��v]�s�*�R�l�t��].e1HJ$��cV����2�J��I�������TVH�Q%RP�:j&�+Z��iZV��Zvh��z��kG�]�`��'p����j��	�����R��-;&1�JS��/�3�
�R���4�l�1	^��U�����J �#��(��x�V��&zpT������@b�a0>�����8b"��Q�-�%�v��(�����q�/Qv��P�!(�F��ZR�kZP[IT�I5�Q5�Y2*���$�J����N41MJ���+����W�/�@���%�i�6�R�n;�����Y���]LN,�t���(��rf7�����~A�2E�uT@��u���]%���Z�p�
��)�b�N4�+J�iP�	9s[��-�\�%����4j����\�S��[��D�u
�Z����s	����T�EP�Q55����"�/V��x���@~�x:l����A�F�w.�,�v��H�5]ukB���+S��)Od:�3N������Y�yR�x�:z6��-k��$�:�]��g����J���K�/�����g,'t�2����8���}MX�Y���a�d������G����5:����}���@1�����-u�'e�g�^��A�;����So���l�!�������iZ4hc��)J���.��t�d��r�k�p��Y�X�Q�Y:��!�Z�-kJ��i���$oJ!��K]6�[����e#7��dT�4�v�U)�CS�Z���vh�wZs.��"���^�5+8������\:�h���=J^4��
q�da������ci���ar$�uV2����m�"�bUF��d|�zD=8��i��������Y#b�En\�~�x��F������iB%Z��R����������=���h��n�N��gsYE�x�r$*���7p�>L���Q��B� �jS���8V��+@��-��Y���j��J.���H�v�$Z�U�YZ��!iJ��5iJS�P�����)�,�e\o���t��,;�����|��I�9d��N*�T�Z��B���)ZR�2@JFJ:��Iw���Y$e����A����:v��M2S����x���gX�)	)3��&�1O[H1pZv*d�1�=?d��Dr[��13������6����b�B����o.���Q��B��"�-kJV��`4���������%����t{bJa�H��:f���x��L�k��H��P�'��� �9�Y.���^�p���R7�UA�1Z�����y��68�us�;�����D:�n������&�zGQ����7L��f�:��(�f_�6G�ktc����-����\Ve�tA;)�C��e��]���+J��R�������
���;���*o�2=��2F��~�|�	������0S�i�g�n�$�_���U��4�
��L�p�n���M���?���A�����M}�����l�g�������Z3)����j�����-6����G�IH����s��4~�f�>���GO��)�=`���&�S���x�{����1
���G"�fJH��Y�%�*��w%v�7Y%T!�.�J,�w^:W�6q����)�������&T�2�����hV�jY5�J�2��+Z��teUM�YS�4�L��sW�H�e�����JR������`Z�����l���$,�Y0Zv��������NF���*��l@$�:%���n�R�5��q`k'Kw�G7/\-[_��4��2�>�ii�T���"v����*h��V��(����+��T7dc��su��[���O���,��c���z���mz�B���G��S���#��F�P���T��u�T�b~x\���$�������!�K'�0��	eB�\v[�<F�2J��X&��\�D�&�����;:�z���\^�����q�-�yt�p�[���e,�`�H��{:��Ba8�N^�R�=�q:F��C)Z�b��BZ=Q��J����;�����v?-d�������.wm����;'�=���w�����M2&W
��*�l�J��:%�.�[G.j�n��9a1v�S�,�`����\�>>��j�����>�z*~�
�MCR��LI�y��ga�� ����6�������ZRQ��F���PWD����Z����tKZ�j�����������~9�;��������C�����F��%8��3����;YOa��s+_r�^�	:[�f��u+	i�8���#�6�4������>l�o��lk
;f?4f:��K!F��$Cc��m#���)SY��"e l�g���������u���{���Nl<�r�e���k�l\����}�t��88r[v���\�9��\�(�N�D�P�*���@�]z���sk/6��_wG���!JV*�����]���*�Q�������+J���d���}�KB����_c���<O��+W'�;�-����ep��h�D&�����!�r�n�7^��C��kZW�u�M�}�����k)�6��*d�nU�s{R���t���z���V	(�D/B����kB��Z�SZ��`9de��}��,w�v�$\8m����A��e[����Aj�4�s�j�JR��U���Lj��@W��V�e��G�&�O+�<�������4�\�����C��s�lN��&�=�L�US3�S�#u�6�0G��`q�^����X�!8Li��3Z���gD�������Ol�M9@���Gq!"�JUE�����j`�/k����m������R��m������\�E�l[q�LN���7a4�EU�?�)kPh�6���#J�����q�6���9gYynck���[j��/H��-����^�u�2i�diY2����5����+�d�.O�<�_�6`7��lG���v���N/�d'���K���I\�L����$�bi�����U��KT�(sV�5{�Z3l�����&��XDb\w�&`���f�-9zf6����:E��D�]]��,��F��'���2j���y���5c��+>k9#\y�Ju�;���-�7w��r^�5���������I6O���������i;Z?�'<���.b�����no.�n��Y!��<Do�����2�e�qe����T�sF
��E:4��;F�T����7�&>�l'9�z��z�s\E��<��.'�����Brb��X��2-*��^�E���u�������&�\���i>��,���l6G`��{aW��^�� ��oo�t��s�����Y�t��(�N^�i��5�k��n,���c���:�MI���4��n�B;\��7(�L�9��B�M����J���i����W��yZg�7�7��&������m�\K����+���;���h����n��!Nn��^�B��a(�L;F�f���z��7��I�#J���2�miQU�EH��>�8y����57�9N��!�p9$����-����-%c�(�k�Vu6������hy�:-�c��q�Z�����@�!��
gpO���3wE�(����$�����&�6��ee$�Z$���*��J���^S�B�S�����<,�����y;�="F]R���,3$K�b&=�i��f�E�JT���H��(�/.��<��E������L��W������.���F�� �������F��2����:�����7T�D~����q�8u�l�{A
z[��Rvc���!��U������)-^
������9�Z��j�i�*���H�d�S/��*�Lq���"��V���\�he[�j��]
����8���[]�qv/9���X�I�y��kf��x��b�Q���w,4�����'��	xw�n�(��$��#\���$yFm��L*�����8�����[�K�N�����e.��&��-m��`��*"��-J�Q�����J����Z���b^a��.Z��N���������o���J�Y��?x �Z�����&�y(��*D�����N�(~�������yw�nf�l�t��m���2^2y�P������������HL���=Jso!.�J5v�K��TT��������w��r���|��L-o8��b������hY��X�.����*�R�E���m#J�h�n�"V����@|�}`�����y�`NG�[%�X�Q���-��������d��0����x�j�4�.�p������er��5V;z�
Z�k�b�N�[����-.K#+���/q�A���{�j����,�����4s3��<c��	�����J�I��@�����-W'	��7���v�i`-p����jN�-��z[���}tym���bL�5p�C��&�EP��[~�%���lF�����H-��HK�&c'��	/j�M���B����WG�72�R���L1R�^&R�pU8l������n����k�ja����Az��>����M��?�X���:��D6v�%�X�(�m��$J�����<�r'�M�a�����m-+�x��r��1���7��rW�v�-�l�� �1�������F9Q�9N�)�6����_�W7�q���5d��V��]�{��������|����&����k6�-�t���,Rgj��+�@�T>���5�f�A��r��d3r�x������u���9
CS�*��p��F��t�-��EW\�T��n�UE�]e+B��-*c��)JV��8�t����0w0g�e�&�Q��6�r���x�[_4�I��	�� ���g,Wlr1�Y*Q%���B9�wE����������|Aa���S�����&1�����P�Bo�B����Ok�s$d,�dr����/�,a�.i[�?����M��/b*�\[��b'�9���(����U�!+�����O�3�X?[W��[_�x������Q��J�;�)HF7��.�L�pR��&:�2����UR4G��e���d�{rn���yauw�����;)X����)�y�z	�u�i<n�m��ht��7h��f��
���.��B���sz`��6$�������2t�B��V\y��R]�{&�.����[v-]�U�c���"u[O��g[����\�����v�]1�K�S7-�������:��������)UF���2��+�duJQ$��
��!/�}%��s�R���Gk�sF�|����M��LZ��&;���b-&��Ua�Z���Q�\��AT����A���+r������g�-�kl%���Z�H�?qY���qNfq��
����h�p�)��B�|�d� ��p����R9�z�|�m=��/[�#��,�������$�/nLi-��o���!�h�RIJ�i�=JN��T	���@\�4>��-���#@e{Z�������vE7awC�7E������;UTL�X��*n�iE
C&�z����t�C�m�f����m���^�a���Nv�{| �J���W1�dd;E���]��#Wo�t�J�5�^��+�k�q�d�����$Rne��X���XI���#��7o���H�q�d�4{�J�UT������L�{���h�9���9gl�/l�[���?q���v�������r����cWv��X��Z��I�+@�.U��\�v��^�s:����|�7>
���{]�TV=��?��;ih{
�Jt\���]:��*9�t�b(����9�o]�nV>�v�k7.���6�^���k+;��������]*�z��m��"���n��x��@�Q�E
��j,�7�e�����-3�}�����"n#���n�v���)G�
��4B�x�x��]��O�V�$����\*��C�&��b��g�?+��#j�i�Y����F%��K�:�ay5zv� {���5Y������*v��I�s���/;���Z�X[*���������X�P�cd�;9���=����T�U��N�5kR��kZ�@e�@��tLsT��\�q�����X����0����l���{Y���F�i��I����JH7=jj�p�;bt���55M�S��5�hl)J���J\�$R��*��)Jp�Y0Ts���6R��XO�����s������/r�S�5k�p=�UQB5��5t�����2������t��g��.��M��������!1.C��,}����q�wBV�A�����E���1L����:G1���^!u���'sIs}�����I��t���g|��n�E��Cg>`���R�/��U��id��#���$�R�x�R��z��y3r���c��9:��1�j���+�cV���>�;��M"�<����5K����l�q�^v�����7M�r���b��r�J�F��z��*.h���X��s�]W�UWQ�n�d�{��?�W�',������un��Q����q����3������2���Z"�I�6j.���sUY*�J�@����
\�*q����;5��l)J}��T��)��8����o������^�TD���\����	i��1
%h�Tj�^����Y�p5*e�m,�C���8*N���s�X��f��G�����fX���B��r�rN'ue��(c���b�r��c*ZR��iJ�g=H�w?�[��2�m��<c�"
���N�O�Nfg�N�(S&�.v4)�Z���Z�J���j\��F@�.���d]������7v��eU�hL��]c6V�MZ5�J��58{���g��2�0�]�x�1����N6N��J�~ilM�����L�u2ep��4�����Nb��N���v+�:��N]���d�C['+�*�"Z����HB�L�5�����'B��Q2����
{��-W����vB����/kv��}p��]D"��	#�
�t
UV��h���x������i@�=��h�����]3�i������v��\�3�Y$l5&���.�U���e?jZ���������,�W�C(��������M��x����^?����"�!h����P�N�7E���^�}Q+�
���a�qR(;����:�w;4��Z*ZR�O#�j�+�n�>y������N��Z�����k���N�1���ZX�9g[���=T�t�b,��;f�n�UL�-n�^�P�"��hj��}�2��Y��F��8���E��)���O�m���Bv4�%2�%���b�@�,D�*(B�r����J�-�t�)��)������������5�1��y��.6��M�h^��}zC;-�g�fgq�21�z���2��H�AT��������y8j���n)�������iu�������4��e��������%E���9Z���t�`������$����v�a��^���#hW���?���X���k�z��l��0�g5�y-j�|ge�J�g�"IK��{'��WEA��~�YD���������ih���G+n%��]�7Y'p����f	���;<����	f8�������� �S���;n���H�X���9je|��y{i>e�N����;Wp��|��I���>a#'r��b�"�IC����JN+{���)@�n������a�9V�]�3k������wwm�������8C]���
V�FQ�QU���t�k���d���iL����a�k������������l�n<��la��Q,�~3��T�?x�j��*��cUNj�Z�9�B�)�R���	JT��i��ZW�f��; (��\�sN�������)�k-��^���BKj|��2�:�e*�+��+�v/������}��.����pX���ax�n�z�7>��\<��z�@[�oF4p
�M(K�>c�[�o��KlT�����=3���@�,+����e��[�
���i��J�����w]�{�c��<aLz7�eU�Y�9���rt���
�z�7����}o��W��.k�����t��+�d������,��{k6�!��wt(�N����@�`t
EQU�u���"��[�:�`���������!��l���"p�"��cZ[���L�dV�t<sTD��g�)B���t�����3���z��'�����u�Qp�D��a�T��ff<\kkV�������.z�jj N-x���*`���9�^Z�%k�&�[*g>h{?�c�3x��S
TI�u�����c��kG���95P3��#���C=�}�ifr����:�:�Wc3-�L����N�\�d�� ��Y�I	:����L��Q�v�UYU�H,T��8%9y�g����i��������'��g;��o��/]��U%���1\��VJ0�Q;F�dH����s�8k [x�c�]�*��nO9'����N���"_r��:�u�Z������	}�p���ZG���Z����SIh���l���q���@��n�;U��s�;���mD��hV7]�s���e�����`��[�lRUEISH��rC�����G4�����K�P5v��n�%�n�������n9w$�n%'gf"Vt���)hu�T�7�j�Y�c�X���/h=���7{L��XJ�X�q��Z��(��l������X��)�lB"��']�R�!�� :FJ�6�/��.�c�zN��oK�E�M�m[����JVRA�hD�M2��������ZR�R<{`d/Ykp,-��V���9/j
��K\q�����{��m�0��w�����-��������J���lj;}8�0��I&�i��dI�D�I"4�M2�H�d/
��)JR��J�o����v(��7I�R���2���8���[�8��-,��Nx�	C�HRB.�?q��BV�F��L��j]���}���c7�W�[��L�V�����o��T��!�&�HI?`�_�^-)@�}����{������2�u�����a�vWY/*Y�t�t):�f��j���C��E�Q����,���E��~�7+�#\���q�w;w7�x��}�xGW"�5=����������>��4A�T<oJ!����)\I6��WN�/Q�1�8s	��D���!��f>�;R���#c�M-�����iZ��hj���;=�PS�l�`��
o�Y�?���@JG��W5��F1z�����*�+�l����N����n��t�X+���������F����=;�h�m�~n�k�e��}���S�K_V�n�d=�v��6-�w���RF��f+��
�����e���j����?m��,���:m�u���"���}�F�V�1���:|Xc��i�i�F�����8W�b[x�/%��S��2��*��s��IJ�>?g�SW��)P��&s-�U�SJ�+��s��"�����F���	6U�N��:GM��R�iR���{>�|��h�(�\�d^�4������F�j��v+_�.U+���b��
7�m(��/4g0�b�C�YUZ%U(d��h���IrS��L��U3���xti����Q�F��\��9x�>4�����Z%t�z_g���W���>�~=xZ�����$����Z�_t�E[��*U�i��j��/���}q*��d�F���l}f ��J�V��&��@��I^�
�+Jp�d������{c
r����o�}��1''f\�.��cj���Q�AZ��+p�.��K:�I�S�pWR������J�i�<��7��Wo#�&�e<?'jb]w�,�Z���<��2�Vl�y7>��C���JE��LJ��U2�*���B��@��d\{}k6	cc��U�����a������ne`/�����p�[J��*���?G�F�k�|��jf�����2&��!�t���yK)����6$�W���1�>i�7mA� ����0*�v�T�z	��@���'0oW�a��:1������	�-M{�X�kf
}\������~�����s����r����t��=���:	_�4e�z��_LQv�2z%y��;"�G:z����&�9U��Q�T9*�Q���O�N<+P�<���~��IF	�t������B c9��?��t���
Bz��~�t�#�&���NR��{5��������NI�G�IC�p��Z�Q(����U���u&O�N�Y@��:�}b.[8n��g\�����x���,/��v�ZX�	�>i$����@��)Y5��@�����b��F�*�S��j���o-��O���Z;���[B�.�����nGx��wdm������WRs(Q������u����S)J�^���T�����E��tu.���s�o^� ���
�K]���a�v��]�G���T���`��`���2�Q����xs�������K�3�g\���u�X�]��W2�8z�b^�PnW��}��6d���B� *�J� �{�Y(b�N�c��Q�zz-H��o;	�Q_���*�A������T�Z��4S�[�D�8�?_���sF$��������~�������Q�m��2���W�eLU*J�(E��%���W�(�9�s3��Q��)�1�����6��f�^�����������kG_#X�ox-S���9��+Wm�U���2�zC��N}���d��sY�NX����U��3�l�+�`v�����{g���-�Z�hE�c�)�P)���g�Z��P.�c���Z��Lc��JZS�kZ���R�t$$=c�dx�HpqT�����''��a�\�kS.��W�m�q��T2LF�}��%kN������[FU�\��1LYE��i����
�f��h��FL�7�SI$�)H�d-
R��-)JR�=�������cIr���l��AZ�����&������l��<�yRp)Y"�KJI��'�Bh��?]T�`��\8kh�.���vs������W���:���nn��7�����`���"���-��;YJ�U��D����5�Mr.='(\	��Y>0�����n�^��L�$���j��_��C��1��:��O���Y�B��n�]����J�-�9��hv���.�]��{�3[�2.E�tdsL�}���/���������sIU���k�}�����9D�a�G�NA[Y�.����(�����3
��-�2we�;��y~�g��*<x���\lJJt�U����V�Ly��dly1�KC�({����`p!NY�W\��
�����q-o2pwm�C��e�-
c���cR�9��v��G5K����
s�f��m�\���#��3��-��>���-�!I�j�S��tZ�f���&�0��(�/����'��ly�S���}��d�<��\�)�����U�\Fip�fK:�T`��F�jt���*���s����
�sM����t��2��u��p`�h���k�����7�V���2�o�6����_4�z����J�W��ER���LM�}T�nZ�K���s_�5�6�{��K
]a��R��w4���>U�;�J9?��T)LJ(j���6.R���@��T�e-,��^2��ua����}!
HY�S0Y�d"f��IX�:F�1P]5H�TM@��=W^o�X:��y���zMg��,�2���w��J�Z���o��hJ*-��i1W��P���m�/�<�9S_�5��b�����e�=wH��k���������:oF���'�-�����5d�� �$ V����,��l
����5��`gf�#����"�[�*��J_��#O�n�rrUm��9����d��Z�`�c~��W�����O,M�o�Y���_^w�L�������k��5�`���7/����YY�W�n�gT����i@��7�C������
�GpM������o{�r�qvZ�)������-�.�	b�����j���7R����W��rl�\��E�c��c�Q�q,��������w>�6�
�vAV�}+V��t�Qp���p���n�+������:�8�[v��$U����M��X�s1�7p1p���%r��Z�F��F�3(���*�jG1['T�TT��]�L9�\�-��Z��Oa�{R}r:�������/�[�M�m��Y�/�I?z�$k�k�d
��Q��U�����yv+�g5J�|��v��
��1���(�:L�]�VRo�c�P��\,���Jc�$�QC���?�;��CA����E[;mFc�a�2��+n[V�g��qcc��j.���H'r�/�UW�6hn�hT:����b:����W�������1:7k�������"��1����v��-���k�I ���M���Djz�P�����������N`����������R���@�����Swm������h����:�t��U�n5��0z^�H�:����X�=W�d�,<o�������JN���d��t������S��t��7o���T��hW&��>_�&c]������o\�3��D���r��mw��|JpLer3��:n�5s ��t#d�W�T9���
C��
���U�L7eo���Z��Z_�<&7������"��)kRJ���r���h���I7U9�N��H��i�\���w��F�N���G�4��:mp�2�!\<��!vN�������I���u/wN����>�@����>iW�|g�|���A`���H&��|��Q�X"M��	_���$��4������2�)�U�GU��R"@����2na�u��3�U��5��P�:����qld����"�
����tDj�c�1������Q���8�8L�1�H��=��kQ5/.�j��{���<��1O[@���:a�k��j���s�J�A�M�*d�Z���W�@�������.��d�/����U�^6���������<���r�3�����~
�x��udI"��$�
c��sL��M�1���[74��K�b>�)h=f��]�f�Y�E��^��IZ�(z�*��'�!�7��Ke�����|�e�K����3#I�_�\)���
6��������������N����{���Gm��^1�*�
���+���p���uFM_v�.�E��#���o���L����7�j�e��T�(J��
%n�6��3>�����!!�n�Q9�J21&O��&S�Y��3�KCW��Zq��Ty�k%���9���e\�Vm��qE����{��3�����Y(���P�J��D�58��
��P�t;]�]K��^�����n�
���)�� |����m!��Ky:��t�*�!�<8���P*����y�jNt����|��-�i���d��d�8&Z���;���o���&[��UT���Lk��/k�J�:L�tTu�Z}`K=��i9���S��k����;�u�.����v�������G��qT
G%vN����*���~d��2�m6 �)��8�O��[&��r����_��d�h���k*�J�H���VtV��eh��;v�7
T�|���o-�%����XlM_��E�_e��Bq�R��
U�X���F����P�wR:�ZtA�z��`���k�.���u�
�-����cY�]�#�%XE#�����*9��pe����d��,����P3����(�MD����X��
��/G���<
Of����
����X�������k�m�Md^����8��1q+��P��%�+�c�JS����N��j��'�H��9v�_�p�\��w�g�ww��Y��|:�Y���
�O�P����hdT�.�<M)&����`���]p����|�F�g}����7���q�]������a������f��;=�-��"�6F<��e�J�����L�s������]�w`]���m�j����_�/h��������Jc���Z]5�J
�o\�9�'n��uZ����k��~���k��=���D�+6�����KZS���-�r�qp��R�:)6j�$�E:~���M��X[��0Kks|3�:���K��~� ���:��h�Q/��%�l��p��X���D�TP������<�NT�S4���9��FM�7V�\F����2:�5�i����/��iR1G)��������Y��=���	�	�{��_�M���C������}�h���1��\Q1o��A����l���O��8L��i(���L�_���16�rl���qgs����n���f���sg� 5�]_8tuT���N�Ude�N�F�W�hdV)\/G���r�,�����m�.���������j_��{�s#Z�1��<���K��m������~��UN�[�:	��*�(��_f9�r������|�v'*Lf�[0[.1��3�V�e�L��brr�X�m-w�9�"������U5Lz��)@]�����nz��,G�a�`������g���E�;��DOX��/f.�����n��F��n�����]�h�Z�+}��������E�tK����Vs�-n����)���[�rB^9�����_��#���7hI���R �����X&g�Z��:=e����Nkg��$=�kck�T�X�X�&MK�fv�dJ�Fr���+X����1H�E��Cj�8�c���B�\�S�����c|�������A������&��6B�n��d4�YV;��j��&k��E)W}a^��\��:��3y�:s^�N��m�k�f����6��^���^���nh���H5!������@�59�My���5X���|�o)�+"��!rfK��	w�k��[��i��.��s�@��[P�J�,F�wO�g"j8n�+s�x�e�i��r�g��]��S�xNf�+�o����\�����F�BR|��eH�.]7��(��p����5n[ZD�.�nX9����i����nL����+Y����%cP�q�v��\�t��cv��
��#v���r�2���(l���}������<���D�6�0��[���q�
�Ss��J��Y��{v��3�g'E ��lE����5<���>�_[G������k�������������>:Q+~����&�%���]U�uj�5��h`N`^�G6l)�[���i{gC�-�;
��9��2�	�?���F/r\�<��|�>2�0l�z����*��q{������V�A��l�sU�e['�m������yl)*��a�[>Z95R���Z�C��P�R��W/��"^��>{��Y�IG�L�'B������y4o-���nU#-s��r5wDrc�P�$c�^�IC�,
���������5�����9b�!1�N������s�6j����ey>v�E�:����$�+C��JP��9=s�a,�����=�����J"���.�7���G�I-:��/,���>�`G�#�M�g��
N��x�����9�o^U��{`v+��0���o��5����3�3+�;�N��l�'n�T�����w(�2F8n��"��a�lU��^�����9����Z��kW�����g��W��d[����vs�����h����7;�G�v��Sj�nry����<�/�cGq������.\^�&5GJNeL51(�����3���L�6bE��� ��e�(ca��e
����Z���0W[��l���-�\�����}A�t^�-���-��K9Q��
��Qd�U��#C�P��^z�9�����-�sb� �7�[�l�Z����Y�t���%��V�*%=*�SuL� ��^���i;�YcK����|����[��08J[X��sx>Q&�������;&������D�Z�7Q��@���'dq�@��f;��*y7�~2NK��$���a:�,|8I"�^��1��jU��
�cYS�I��U��Jk��������'^V��t�Z�&�����(Z1�K��j��/���)� ��wF@��RZ����A�c�w���I�n�������9}^R�B���xF��_����p�U���]&��Pm��.��6�??|T|��R�s�����1��WM.m��2NZ%�q�AF��l���-&�gl�����Q�(���'F�1��j$����/<����S(�/�~������5g��k�V���qtc�K�d�����/i��M#��hEE#�R�Y>�}��F�y7�w1���2;Ng	�Z�/\qr�=5���\*��0��P��^���TMT��u!T6/��,���z��yGpm��������tZ�;O�x��V��WM��m�.'�d�&�c&��h��)F�P�����4��7�/-���������/9������a�m���%�9�Q�qH�J�n���PU6O3p��T2.]����y�������l����f?c�������u5����������l���11��-C���=#rG����=fM��+1l?�z���u,���k�k�W]1-��oF���������1u�i3�s����;t��j��j*�Wo:a�5�N�h��5�Z9:�a��}����H�����L���7��2Y"�%5&�(����5���Rn�(������hu���x�(b�>�5��6�����j&Y��������l��Gl#�CQDIZW��>������]��m�v��f�s	wG_�6�����}��>q��U�eU6�P���SP��c�ENT�t94C���-k�5�k�2�����cy����8��r�U����U[�*}RtL�1�R��xP���������l���,
�����r=��ml�����e,�t�!q�A�)���$��e��9�S��9�{c�����N��#��\�X����V�;a{'>��<E������$�W��Z�E�g�qG(�7,�A�w������s�^���\�rJ2����\���M<h�x���r�M���*�Q���L�7tx��-.c�4���6}�������c���������*���"�#�k�}�k�>Q�&��3y��
4x��2(Z��D��f
D��lx+_�������Z���������5����H��;�����bQ���oF������Y.�i�'HNo����wh��_�CBm�����������p���/�[������S�xg�S|�l��V��J'T���CD�x9lk>���mj�$�|��/���{����	&3�d�"��K��k�3�"��W��@�*)�����/9tl.w�x�l�����mK�7F��y�mf��7Yz��-.��������,H��f����]�5X�,��T�0v�����C�'���LvC�>��E�����m>5k�$(XUUk/��p�wk�\�b�S�v�%���:8]L�����/xZV��3��-�G��WI�����r�c�d���<T��*b�=)��)���*���������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�06�b�@�K7�vH��*�K�B
Rz����,���Jz	W���L��� ��'U�9S�������+
����WX��[p���f�S��d
�l�2$t<4K�����)���;5����kZ�;���o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=��3�A�<+������
��\tx���Pl�
�{��f7��dxW�31��#�����������@��o�����<fc(6G�p=����m���MoO�N���#�CJ���S�Z������ST�74�x{9�N�oz;��6��J":�.&�������y��v����N�A�PU�*EH�!SV��C%nL�\�-,�z�l��;y��������V���V	iS�GYv�
����z��2�
T�������L�tr�������T�>S���!���*�LR��>QJ�8��u}�/{'����^�O��#�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��#�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�~�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�~�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����e��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��#�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��!�����p�C�){�>�P��R��}�����d��B?yK���:�>�����u}�/{'����^�O��#�����p�C�){�>�P��R��}�����d��B?yK���:�>�����u}�/{'����^�O��#�����p�C�){�>�P��R��}�����d��ByK���:�>�����u}�/{'����^�O��#�����p�G�){�>�P��R��}�����d��B?yK���:�>�����u}�/{'����^�O��!�����p�G�){�>�P��R��}�����d��ByK���:�>�����u��/{'����^�O��!�����p���FYC�B������Z�.�q�~a��sN������������i>+v���m���9���(��H��=�+��p�)Zn�L�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Cl���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Cl���s�����q�zL�?���Al���s����6�q�zL�?���Cl���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s����6�q�zL�?���Al���s����6�q�zL�?���Al���s����6�q�zL�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s����6�q�zL�?���Cl���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Cl���s����6�q�zL�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Cl���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Cl���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Al���s�����q�zL�?���Cl���s����6�q�zL�?���Al���s����6�q�zL�?���Al���s�����q�zL�?���Al�	�[���q�'��CLK���eW�j��j���&�.��i'�i^z<k�kP������?�J�@��qJ�� z��m�h�w��2���,kjv����]F�v�������������"��"D1���B���*�Y30�(����v�xA��)m!�s��)=\�8��p���:4�:nJ�Wn_�3�GoCu4MkF�3�k�^�R�F���7dk�V�2�J��,�W�q,�:�E�8R�$e
R�jj��y�s|��{nc�zr��Py_cZJ|��n��;��u��_}Y�d�-�S�z�i����H�I26US�Z�������X'�>!�����+�����F���-��JC� �5\���|J�R��:�8)J�j�kQ"�&���0�����d�Zd<�~J���������]s���U��; ��q ������7�X��6lC�U��aW/2X;a(���pF.m���a.3C��������'k	rKD�H����zc�F�o\�*��)Z�5���}����X���a~HJ;���2>>4�%�bd+x�^%��JC�b��H�,�dT��!/Z��7\�2�"d-Ls��!KN51�^�KJ{u�
��w8���)�������L������}���.�Ak��B����FSnP�������HMM�T�pU
T�!�����8������5�F'�m��
���%[���i���oG�ak���XJ�m��]T����i(�e\�\��tL����e��7�M�m0�s�Q}9�,)7�o�`L�@����rx���n�MZ��z�B�E�H�,@�;����X�������z�s�m�Z����${X8[��9��q�i��cY4kB�u2�i�X�P�P�'P�f�o��}$c��]kEX�u���_�,��g1�=/�Z���U��*Bw��RGz����u�P+�g�M�E�:��w_-�w���������v�6��g�p������fYvX���	������t��H��%V
��������"���c�,i�x�.n}���l��{�Z��������s��L�!���A7#����E75����`��]�sNS�N��8�����	SW�bE�'J�>9*R�U����(�2�H��dr��Y�[/�m�v�c�[�qfK�)�����n;m�!l	i�����.�����5n�pUZ���.J"U:���J����4�[y�/d��J�Vk!�&��6���k$�D���Y��Q:�M�FI�J���P�Q^�B$6_d��r��Ym}[M�cE\�L���M�#h�c���G��
�Fl$Tf��+4�\���X��f�Q�P�������.�����2��m�KR��T����XI&OsG-�Y��{��#���*Z�2Sd�������V]$�Z{4���+Zq�=���������}���H[c=^�[��~:����n���v��v���������z&�(�x�+N"�p�5E/�����Q�*Y���6�+8{���}�v�d��E�wiv�]Sp5��x�-��[}an����X��w�r7�����q�F����V%����z��!4���� E=:fM��*�L"�&����6��2�_]3n������+�u�9��
�@�Vn��c�U�&�RE�	�(��H�H�jb��L�zc�'|d�;���"�������*���!�L����k�rn)��"���O����j��u�8C��}axK
��$�)��^j�y�v�����wm���6��W��N���Q!��&7I,d����z���7�������:�J����9<u��f��?����.�z��T��,���h��2�QC ���]a�}@yIE�IHeYB$�e�E
B&B���kJPh6��^��{:H}Q�1D����5�4���7���~K"�+��Jd8��o[P�a�$�b���D��ERx�(-�9���M��`�8��%�v��*�t��lwK���8UwN*R6h�8UE�L���5�9��&�X��]iCR�#��e`�6@=��S�"���R��x�@�=]��I�2�V��N��.p�~[�����u�g��6��U��VV������y@�%X�ok9�8Q
&�����n\ �+�x�z�����'��|�N=�M��=�l���~�Z����N����[�g$���G*���\:�pT���5���v��������QK#2n�5�j�"������t�[Qk"b'�!�V.�h��jK6N�(f
=h�7���r�UQ9�`�0��GS)��!���ql�;�m�	���d\2�.Y�MJ4��`�$W�'r��D�5H!�/�Xbk�f���? @��vB����aYR�]�������8��m���6iC.����&U����V4_km��\Q����M�@��5�h�{�5������-�m�)T���W�t���!�j�P�W�R�@Z�}�Kg�������-�����-3u�s��	���������y��~�*QCR�'
��H��+�UK����4�6���z��M�����5��f��Y"�QD���]��T�
E(�C�p�������F��������������D��
M��ktRU(�����$�"�QT/V��� #��0
��m���f��S����^0��cq]��r�5�=+u[��.k���*�#�MW���4�hT�C�p�y%U$�Z��(BV��iC��h��������b�:���1��f��f��c�e���-�� ����C�����IP�1JR�����>W�"�&n���N��*Y��>Vx��o��4�A\���#X�������V��]5�@H�
K���x�����6���<��/#���������)�N%IG�+'������(�H��z(�xu�?ABvh9��M���ll�g�~�������\����f��UJq��V�.����k-.V����J�W�����9�l��&xLU���|����d�/k[iF�!r�q�
��Z���xd�R����)��!�m�4�d�-2��6�mW��~���q�E�Ka����D������B�)�+ER�����f�;Y7NV#��g����|��Y�����������_v�������5���BAy{q7��T�I��$*�N��~���h�5R�lN���.������ m.��+z�.,��l��
��V�^���oS$�h(
>n�&\�2�U%)���5��&�l�����{;�-��]s5��b�1�M1�<��V�<�b=|IN�u
�M�Z����9NN�L�	���O'�Z��.�o��?�]������<B��m���-�����N���u���5���'��;�" �t�:�;����a)ZV�������Y���e��������%;���U��p8��y
���U'�WL��T�-(r�5*�m&������2��dvX�������6������Ec-+N�<zd1Ux�	D�ZeI�/�-����j�#��9&��r�RH�AOf\~��d�>rc��]P�R�F�s���j5N�9(c�tBf�,�9���O����w%)'"��(���
���������-Q@�YWR��:T�7G���Xw��z-g5�_  �Mx���>�+H���j���=m#pH�<z��*�Nc�.UR�t�}"��*Z���Cj��Nd���
�����Xw�2���M�A7/m����*ob��MT�Q��Hj��P�4�S�3X
n�]��]-�(eM������%)H+u�l�]�7�*�F�v�1x���1Ux�ID�ZeI�-��y�r��w�v<G$�W+7$�D�e����7�*r�+��JU��b��q-F���%r�7D&m���[>}&��dt['rR��/�2����lg��d%��j�2��:�L�����=��~z����{�k9�@���
$��{c�R����V�*����7�c��8����=��U.K��-*����6�DfM|���+�.�
J���9Y��&���u��%M�\�	���3x�
�9'M3�
a��i[�����~�������Yb�um-{��8�(�Bu�k�cW��N��o�:�)�L�N�5C���mz9�W��)�'"2����Gc�l���.�U����&��l������f�AGB�R�p)�!$�<����SA���r��)ZS�s��)���S��{�j?p_3�.�]��uk
d���-Z��T|�6L�+5�6
�mt����R�^"��^�t�D����2�5
P�����?W1��]�<�o��{�X�nr��9��U��Z[��bk=��]$:� ��)j��-M@��>~<�$��kvv��8�
�p�G'dl!q����I�����l�+�z�N�;e���RH�Nj�)��5t��Fr�YIF��k#'���d�s�
���l�C%�����+$s�5Z����AG+��P���SL��J���ZV��?�WV����3�ry{vbN
U�~@]$���=�i,T8�U3P��)���?v�?NW�m�j�f\����7oD��	_�[�'4�8�p�Tz)���JCvN5��Ns�t���.\��7�&4����k)=.e���Qj��-���*�JE�S=1d����cp)
cP#"7��/�fa�\�{������]���v[���RD�:.b��*�����]x��D�e{)��_`f!��h+��������&2z���$���PSM�jU����\��Eb�R���i��i�9���9�.|yo�f�q��]��\k������e=^8������ld�IuX,��P��>��@��R�=c��.R��|��[�Z����G�[w�����$e.�Bh��l���_����n�Vz&�LZ���`:��z������E��,K��^r�������r�hE�e_���'H�L�-s��M2��)j1����L�*���&lJ�^%l����1j�(b7���o"���(�(�-JT�-x�kJ�cL��35�je\OyAdq|E'5j]������bs����Ur�R��nE��C��r��5i��i��^��)�w
���Yw�;
a�6O)d�5;R�g�xHS&�j��5f���TU.*��U:`<����Qwfr�����=�-6N��\/��'��(�G��D%�������bB�,f�*R��M@����[��mY�F��o�F�
ZJ��������Z�M?J*�jl�dH��jT���H�2��@l&(�6�m���.cg�&�L�j���D���qO�-���D�^�J�u%iZ��hr��Zq�����`k����_��g�Z���m=x���F����O8�n�*�b
�j��)�~��=:�M�����z������5�����/+Vb)��}���-M�b���W�&)�o ���:�Q*+����Ki��Pq��[c�l.4�����'|��;���*tT��e�E_�:!
EV#TLTS�c&N�h�8�o�W�E������0�����k��G5��k���d�H�]k����P�E7r�j�Xr�/��-�&t�:J��Q3�%xq)�^�xv=�h�	����:��������]ev���ne�����4�C>=�e�dY���"S*tZ j&Jt�1)R�
�y��u�{Y�]_g�<�s[��4��6�-�{L�.H�
�Wu�4YD���l�KCP���r�����WY����������L�������v8���+�//oC�\w�U�n[�o�n�u�h�8H��y'11(��I�f���,���
Z{|( �y�r��y ��������1�:�v��[yh��Ye���J�]Dj��,���9LCv(j��p���H<���M��l�����Uc*�$����y$�:I�J�X�D��!�C�9���-����������v�/����Y>�qS���
������P����J6b��/��L�L��=�����������3X����`b��.��z��R��n���rQ5L^��5JzW�k��(�����2���t����������?�J�@��qJ�� �l[w��q�W�e�g�02���lM7��k���#�����k��kW�UU�����!�JV�������jZ��T����-{z��-\��b��.��eo��,h���E���4S�HR����C��(s��5B�<�(J�n�u�*��������%P��qF�
Oj�8TT�(�@�+��&�=%n�6�����T��o-vfH�rQ�ek�)��������R��@l7�_nD+�4��;R��gwf;Q�kC	�l4���Jv+N�/YJ�����=���Ny���A���>���2z7��9�Nz������q�?/����Q�����jj��5q
��m�
��z�=��u7(�h��-Ql�.��Kw��B��HF�`�����2�@+���M=_�m���O�p��$������g#$�m�
���4��)���\k�(�ErfTQ�C��Z�Q�tB��+RR�L�Vi�o]���q�9K�X����������Pqt*���ZU��%W�{�)��@s^�dK&w���MHf��F\��$����������Th�{4�w2OTN������b.x3���0�[v-�c�[���G{,^���J�2���mS�S�+�&�J��{@ZG�5�3��|�$���5��$���x$��)�k��]"���x����]
S�P�[��T���Z:VA���/l��%j�h�Kt�D[N��B���S-)��Cq�P�u���>V��Z9�V�o��.�-��/#&��B�l����P����C}��%>�@Cn7*x����bm>�����%7�b��"R$������I�d�(tW�twj���7s@R����������n8Q]j��v��s
�b��3�e�.W��\{y�J�U��L�P�B�Qg
��V(^�M}dK��F�X3i�b-�Q+v1�V)��-��M!E:v
B���P����L�/���>��\�<SyZ��EK�#��^Q�0��U:eYT���W���	��D�-P��0�g���
'Ei��'/K;<�P
���od��h�(�V��������\���p���R#T�d���8��igal�0�;�$�?���������5v��n�B$V�RN�V�RX�RK��C��z�3T��@e�g"N���z$M�9���HEhcW�=��Fs��H��0wx��E��vN�m���m{��Y�lV���K%�[��WE~��nQX�_C�@���hP��+�����.������I�����>���Yr�(��8�J�`�T���;��7:o{Q�$T]�j��\ ��(JG����G�K���:\8t�{|;+�^^Gl�>�������e��f30e2�*O�������WQ�^��k�k��M^� ��JU�P,m�
*.5U���m��6*Q���j8��v�u�:��oJ�"�����J�����nz�v&/��,}	��G{\m$,{c+l��{
���Z����s��BE���*�>M�t����*�KJ�����5�k>����0Xy��"��2������/,����M�#�S�"/
X6��G+I��R����)�J���h{K}`�=h��y�d�s�UpN�CG�������:��j��9���f�����9Rt�W5:
��m��W�M0�nV������|�R�=�Dj���#L�(���_�J��<����z�M�m��)D��X�����_l
qg����~��5Hs�o�s\��C�Ch���O������#��nC���v���(�(
}�q�,/E�����$��t�cW��kP��7��&��)�7i��y���:�"1}%�M>5)�1�8��Z�/F�?��j�8����JS���`+��.�����i�&Z���8�-�ch�:G#��Z.R�;ru����x��W�b�8������H���.�F��U��a�.��1��U/e�1�<C��:��".���ZV�5*Z��,;����5 �EKM8�u������M+p���o����{v=S��d���A��r��T*E1I�����usw&
�0����+��v�{���;�j>�q>.��������R���t��l�U6��
����1
��c�e�Lg��M�8���o4YL�$ow��r��G#]�������Q#�d��$cd��*M	G	��T%"�S�eZG�\���Y7��Y�S�/��f��V�a#,�r�L�#�]�w��Ec�}'Sq�BA���v;���wj�H��'Sv���{%7���RQI�qH������7bw+6nt����H��J��J�A5P���cYS&��<�cw�"���f��SIB���"��%\�I�N��ARj�V���W�D������[m�:�0�@�MtNj�)L���R���@V������1��r��6V����i~���\�i�Qe�-�%���kg$v���JV�&���UT�!�Z����o�V����q�n[��+Q6��`�I��*"���k^��'d��������~�W����;�Gp�g�T�iZ���+ZP�(jR��
JW�(jS���{ !+�>����Z�X��sl�]��X�-��sP����'��h~�E�i�JvN��(�
DV�-�X����ByC
.���$�x�es�m�;C���a�����Z�~I�e��
�g?��l�)h�o�f�G��E�G�2"�r�%�J���8���|~��<r���{5��G��4B����T^�%I���fq����pJ/WW5�C��7B�$�Qn�
R��JU8����d����1��M;$t3���3Nq�+y�o
�d���&��Y6�V��CB��1�P�w!�[���jF�92�-�������b���;C��?���<#�D(�g�g��Z���R��)�Cp�*��KZ��
J�+���Ki|�,mM�l���s5d��K�5c���z~F^�as�HQ�|%� ����Q�mQU���:���h�	��Bs9d���O��8���=����f�dU�=�8�����[\�=��kZt��A�19L�i������j)N)t��A2�7�#�]n�4���xo�|7w��g��]�;6&�$�9����J��g�)=3��h��]2U�z�QS�M����o�����)2���.�����+$ee��\//G����EUI*���q��L�Ic��S�q���^�N���1�K���ul�8q}�k���XI_46@z���kb�|S?��}Yv���B�vE��Uk@C��^76����������Y7������oz�L�����6
R�*��H�@���S�
~�D���
Wo[F{��b�R���}�q��`�%-s�tX�v��ix�������f�O8��tSQJt����e(n7�I���j�E��0���n��YJ�����vlM�I�s{2w��*��M^���l\4t��]2U�z��Z��M����s����+)2���n�����+$ee��l
-,W����*�IV����S�N�e�K�:�8I�*�YZy;�7	Fe��E��x����r�h���(|����F��������}Yv���B�vE��Uj'=[��7�wgt�^y��\v6����Z<R�4�5��,i��3S�E_1x���)�Z��*�*����1u��[�v�m��Z�y�Kj6G&��91�
K�)���$%!�P�\���f,\"t?k��[�8�{�~��m��-��kB���]�Y9kg�N��K%b;��KLFDF���*�H�:n����ps%Z,z/�I�Q���+t'�!�������FX���v���}�Pa�Cc�
�����kc���=��_�r�8Y��{�)FYS0�r��Y���&��5����(n�5G���v9�Nx���x��$�q�,wq+��
^WS�J����r�R��LI(���t�B4i����dLC�����9o��kr�������A�W[x�c�v&�g���UV�VxC��+�R�1Jb�[�������Vf��T�8��{���o���-j����������DL�;j�J���@��f�;St���6���4�xs���c���,�h����,D�UJb�NRe��nZ���H�
�>)D
�J������n�+ZV��kJ��iZV��+Ob��u���b�El{u�P�(��]���,��GQUTiS�5kS��kZ��kP��`��`\�,�9o��kO+�p�%
���;l��,���H����c"���S�"�}�(z;g>�	�2Z���?��z��[����A�c��opKA)s\�~��Z*���*�uF���U9
��8g�f���Y#��]gm�Ls�������:���rG^w����N�m�ko2MY�v��Z�w�4l�5F���I#�I��f�U����wn"�I]T�v�3'�E��{��s�vu���\b7qYF�j,E��U�T!��%�Oyl���M<s�w����{-�wR��K(���w<�YM�"�J����T�H3���<G�QVlRQ: �&8p���TsG4Nb���bW��<��c����m��~�s{�����F�]��e$�}V��A2��p�����N1������b������4M.;"�jw�7!f����L���E�V�
�M��L�5*^4�aM����5s.��'0�>��7u�1�j�w�M6���VU�cD��d�/T�7d����Vrt:�����6+�8���'Y)��d6Q��^G�v�����cwP��i�A���g3 ����)JW�V-*U
s�!	��v~�*6������?z�uRw��a+�s,!����G�~�5PR���T��7�7�x9��3�-����
�h[w!G�10�F���j��A��*�@���h���K���U��s�w�1�	�9�kF2/�P�=<r��-kR��,d�r���+Jq�}�$��4L��rLG����)p����mo�0RVnjEsv�V�����z%�5����"S|5���6��h��������[�CZ�����_9�������q�]�M�
Uh��T�b"��	�����r��u�9�Yc����k��P�1Z�t�8��y��6�����kw�H�7��\�fO,�>BjFi��SW%��at�=3�������!iN�>�i��
��t5���������r�sM�
�����'�������t��Z<�b���j�x�l^��IW��G	@�{mf�X�Q�6g+[�b�[s�q.=�����#�L�~��� $H�U�(�F�i��P�1�T$�F���&���l'&�~0����y�bf,�����`���Y�o#�{�������-8f�[����V�d�������%f�s2�MY9�|e>�-*�d�n�����a��=+C��1�@WKm�9]��?q�bk�+�2����)N�����pI(�J��B�X��?k(�y��1MS8o��+2R�7x�i5Wc�Oeb���sl�R�%�i��M�*���T��m�(���S�*�P�R�CR�����kZ��5MST��SV�5MZ�jj���k����qx�0��[�)�0\l����.��U�`T��]�g�l�[���l��Q���l��1J�;��dE�`�
�;��n_���k�q>!�Y��t�7��������U�n���+���������MW^�������0��`a�������6�;M�r9+^���q��������u����w�>j���h�,��T��X�
���^Z�p���}���,;����&����9����+Y�I��c��dgG��x����D�Mjuz�?�9�����y�i@Jn��C)���G��@mX������?�J�@��qJ�� T��%�9t��� -�bV��'�W+X�+~	���SRn��M�V�*��W��!��S��2��N��)��Z��x�3MZ�>����,�r�A�H����|��-R���gL�)�^4�P�9^n>���~�l#���<�3-���l��,�{(k��5�y�|���#��q��$��&���ZV�
�if@��_����7fn��^�y��>C���m��R����t�2-RF>�#�Y�
r$E�s��Q�}�����z�V�����6�|�������<sY�u�P��,-[Z����V��;f�j����%U�N��"� v�Y+ZnIc���6�E�����5jn\���F;b�Z�s"���R� ��1�B��O�7thw���4�{�VJ���a�y�5k��������:��Y.��P�o=��Y�(^�z��W=Q2�T���*����s�wD��n����e�r;���U�W!��n�u[�&F-���^n����^F��:��-j����{����,<#��cX��|����c;h�NR�<�*���&*��E��Jt)�C���<�2����n�k��\�X������H��{&�22���$.�{).��VI�l�Ud_+^��]��z�:b�i��^e������w\Vk%���#���9�����.�^\�BN��[�0q,Z,��I��f#�QEK�@��V(���7�;MkF�5b�8���L��B��������1r�%��E�"���d9iZ��N�@�(H�4~m�U{r��>'3���r^�������^:�-��K5Z�^���M%�����g�/X��Q��Lj������V�e"���K!g���gh�Tdw��6N��R��Tix�����x����U��t=L����s��e�3x`s�6�w^ �w���C�u
��`^�������QP��4�+��F���T�nd�=�D5{�����{��x���4�&5���]�����+v�3�O�"e��c����(ggk��J�r~�1@]�L��T�(�dLbB����k�d�����=IZp5)���
���.l���c0��j4}r�N��9
��p4��|^Wt��^�������H��k���$��X��N��`���]���.I
�����P�Y�g>)�����1���lJ�����L�j����S	�������.��cg���,����4�{�U���n�B1��'e�4d��"�h�H��Z&�H���S���Mq����q�
uc�H)�cqF��zbr
f���K�9����iVU�$�J����fR���w�:1�$h|�hr���fe��%����N���\:�����\�����F�2�>fST�I����P���i��h,��"��Z����fL�����)V�`%�ci4���3
��BQ�h��:�t����
���������{������*�\G\���mKF.��C�T�9��ZV�4����`�-@W�%��������/�SP�*+S���6'$YXMZP��J�:����;i Y�{~�n����U�f5S�O����^��6~5�p��7s�����������]I��+|����]�
�Z:�������	��:L�v�0����'j#�2�
��Y�y����gW�>���E���M�0��|Z'�b'�n�I.�Q$��h�n��a"y/5b3b��2�I�l,f���o�!NJ�K<��s������.� �ZT�wS��*s�RR��s3[7�%���(�e������~�����k!c��V�^Uu�.�����Z)���*e1�Z������X����L��u���R��/H��2����p��l���*���6�Y��:���T�24�B�@!�e�'x���[xu�i07����8��f\c1�^�xc0�W���Q�����;�
 ��qT����J��0E7|_����4�m���q�1������,w�)f:����������;>��@�"����N��z����b��y7��������d������Zsc��KCI��9�����jgrm��y��:��E�(e��m�-=���7�Z����
���m��B��j�����{���J��X\��H�TM�r
Wq�%���=K���qid�=��_�[���G\�����3X1�Gf���^���P2/,�Z��:H�!q9��5+V.�����E���5�����-w�!kA�q�8��|
p�E#���8sTh��I��*��*�Q9ORp��!���t���&�ZN�ab��W����v��H*QnP�=�"d��Y��d�i�YJ�Vf^)��t�l�<���q��d�5qB\Y�i��8Kc;zI��y\����uJ4��;��E�&d����w�� J��(u���^�}�8sare����,�m�S��%���3+�m{�~�$���f��������J�!���1��3�o����D�������;�gk��u����qZ�"�"������v��*qi�"���U���P!������o4\�
'b����]��`�"����	k7ozKB�s���+�����J�����P��	������^>���sd;:U�rZw��-�F-
�S$��AB���)��+�9P���=���&��k��6J���(�M��C�V�%a�t�X�ty�����v"��[��h��j��D����b"�����a���F�����#��ZD�IT���J���+Z���k���
�������O7G�.Km�{�]n�����k����+R2�Yr��iB���G5xR���*Et����;l�eU��nv��G�,��s5	_�b����(��R�5hR&C���^M4�UP���B��5k�)@���/�mvW�&��$Z5Y�V��nKG��7ED�*n(�uK_���$�/�-)Z���]������ �\���;�P��v+ X�c���M�����R7tj�n������P��P��vFd�T*� N�i��r�K�Z��/Z�����
�b�{��Fuv����Z����*������SJ�(R����{��x��������$�x���x�-r�te<�F�]���J��C��/&r��[����U�*�}�N�:��n��s	�8v���
��� �_#�=j�`�{f/�GI��\T�#GU�J�$����n�06�h���t����8N����6�V6Z���N������Ud��e#�����YR���
R�4����XY�����w��r��G�a��a��G���P7�l�g�R����_E��
���ur���R(�I@�Dn����a]�B����0L�k� �(����a��� ��f��]�FbY�	���1z"S���S�1R�iK�6�2��j�(��C�,�%uBtQ�Y#�5*Z���x�����+��nz�����#q�q�w��3<��
G�R��U��N�t��|Z��T��E���q��5(b��)�C�5C���S���J������
��@�?��O�2���]��`h��������x����+�_]���M�k��k�S�c���W�xw�:���V�Z��Z�7-i�{cQo��gn��d�X+\��~=��A�jS�����X������s�J;+i�9bm��~���S��L�rp�iN��'
���)N�&-*�X����]n[��1.RA��e����G)5��g����],JtQ#���������/��)��.������[;b��N��j�Y�[3��5x�;W,WIh�7�@��\���p3�N����V���h�2i��F��������5{i3(b�����J���-i����e^�t��QV�*�C�N��p=K����n��:��qr��M��4�b��L��~\���k�������2
�AJV�1�O��	x���hh.X�44�����s� �����$��?�d��J��S&N5MZR�)N<LZT /m1}�kz�<��db\$�������*�Rk	�q-iH�X���Gi3�7b��G�K�[����q���	�����a�,x7NP7P}d����n�����+��`�5{W^F����}2M�J��
��p�U>�h����FAH��)�W�P����Zvx�w�Uva�&j�[P����1^;�$#��BO����1���u8����d���S�xv@~�iH]�����}{x��\��J���:0��LsR��m8�vB{�`�k���j����m�N�p^���hZP���z���k�*���k�Q#�i���*��$�]4�9�J����)N�R-:jU"�����������T�Y����}�����q��������E��g�ck��j4�X��;�5e��J���k�(g������@����u��:�Gm���V��/M_���a7i�#�
��H���Y��?�'��JS���`��`q��k��we�?+�v7�;���S��.�V=���e8���?�~R�@�TU)�5kJ�o�|����7V�h}���Ogp��vd�kwDdIK�����m��`��^)�r�7M�Y2�f��!�N����s�G�]���Ge���=�O��.�c|�D4+��V�M���T���Rl��giv�t)Dh��(�S"�I0�����)���i��i���8������
2������le�����d{����d����@�#q�:�E�Yd����cp)MZ��5���!�,�F����s�w{!��e=����
����T�*�5��s8��x+$ob��[����x���<��5{>��{���R��9�iw�X�5#�s�cm	T�c' ��97*��4[�$�������"+k[-��������7��!m�l%�z)m�V�l�o���d��fo�E���M�VmJ(�K�s�����j���'���9�d�~��C^�y7[*8c
u�AF��_'^�+:�A��MC*f'%!�*h������5Lk�|����\��X����p;;w���X��=+'NnY��!\�f�pD�*DVUUiJ�KHs���������L��W�?/��7���tB��He�c��������N**�A
�����A����&�&�L�����ZT���;nf�IC����L�/H��i��+J��	�������B��6�P�9	����ed���ql���Q�D��^�<�G��������R��!�5G���lvy>�kN�\��>Z�����o��%����.�O�.��������3�,�U����F�U@��O�c�9�"���n&U�,���.�,��v�m��o	I��LLV�t��Y���y�8;�[�:�5*=I@�.f=t��^[��$n^���l��6U,��6.���M�$���p�8��7�MGk�����:l�/D�R�P-�$�I�:A:�7/�M2������P����)kJq�
�����\S��d�2T&*����;#��m�-}���
�sO�mr:�����Hz���dQ�Q�tV[������n����5W�����M��blSsk��b��a��b�
������l�oZ�����X�9����
����x�<��
��".G_���X�;�R��N��L��ml9��x��Jt��C�N�#(��iZ&zP3V�r�����S��>b{����T$���okU�X�Qd��+x�M��l�i��gZ���SV���40��^�[�����������h�J����I����2�kK�2�2�����BR!V���"Y�U��.�1�w���^�L�,��A�����D��(�D����F�}YTaf��D��wfQ�%�t���Uz&�S]D����I��
������v3>���\-lmk[��
��[�u�V�<��%#?s8E&\6[���z�����j��$��6-��������E�ii,`�B|��c3z��B����5r��Z���/J��I�5i��$p�:��&j��
r���7D��/���{��>�bh|�=��K����oI%���Yr���;=����1����U�B7+��QEi�;�<-3��M�i�Z��l}X�x#;��-��>�K-������d���C���2A�(J�J�z���P�5�*���mK��Z6���+^��f�U!H�������)N�H��-��)N)���8��]�y,�hZ��<�s���)�P��K~��I����/j����1�U�Q�VO�W�2��u(G��@x�8��yok����|���\�tf�gh����d��V������2��fj ���L��+$u�2U9���~W���y)�n��{���c��e��h6��4�x���y���c[�$�p����o�A*8d�"��F��?����_��������z�s
�[;��D����7��S�[n������������?�J�@��qJ�� z��������+�%	�>��.2��tuSm5k�Q@�1���P�r�������-
����J��_�����s����@lv����]1�������!��e��.\���n���Qe����d7H��	��:)B����C���|���xI������������11e���)�eI��n*����s���yESH�1��*cq����t[Kng7���a��,��B��	��x@4r���miJ]
�X��#5�b�k��*�@�-Cp�V1�����v]�����.����,��998ID�V��dM���l�
�Gm�E�R�:J��-�~B��-K�>�m��3���RI��we��q��*C��m)o�vR�lZ�*���!��=
@���BcZ��5����]WU�����wc�
���n���[I�&�B�T<JN��H�&��S�KS�{�%��5���-���q{	�������yUQWc�J����$�����\������C#U[35(�e*`�M�����)r�nes���[G3�6����|��fC&�r���H�M���d��Z�J�H�-)J�S�miF��I�Z��cm��],�d[�jb�����H�����nuR1��!h����S�1�Z�����b]�����8c�k'����<��t���}���4|�c��G_�1�f�����V��O���B5,D<����z������+�=a��m�z��8�Z%IkVM��I><J���:����~%��Sd�D���f
�4`��t�`��l��M�T�A�T�A2�%(B���((��$.X�����V�+o\��_�!�����2n3��E��V��.��u�M$�cV��R�7�k��lx�k�/�q]��t�;��Ae��t�Q����D�?���T�}����)}�t!}��#��=
�y�iZO����xu��[�x����*�����U��E��J�yF�w��vkZ�������ui5�6OZ�Z0�U�q0�����s$��;���U[��(�
N���P�T���1�%J?��r���k+�+[wJ��E�c��D��
��b�$������u�1KR��k���5+ZT%q�6r1���3h�N��!f�'����<#�J�oB�Tf���)��*U���)�5�V��\����1��c�X}�t:�nF'�n�s3���UI��X��h�[�����/sZ���i5�����C��]o5����EZ,�+d����z~��-x��j������"E��)N�
��-R�E���������wV�M�����������;�\��J��k^������5S!*cV�����>�����6[
>���;U�����������x��$##4�_�A�k���RUD��
z���hZP5���/��\�s_��0�Yp����U�sk��iEX�X��#������B�N(���7X�p���v��ZEJ~��� �U4��r�;�U)d��Kd��'V��������?o��W��{W�:��t{%f��,LUe������<������U��=����������R�U��Lu�R�QesT��_�V�n�Fc�|�h��#�FH��v�i�`��
'o,�k}t�"����8��?b�/`����8;���:�=
ZP�R�����G�x��/�c�������`���[!�Z���9p=<��n8���?�d�,~���Zp���W5LuH���1�R��`$c��U�����p��m�mk�a-U�i�����|������x����;|�UT�:g�(ZP1D&�kE��^�B�D����n�l\����g�E��z�Qw�A��M�]�-���������C���E�����c���0�6��v������(;���vR��J��U��pT�#��[�Z�/Z��R������k@5�k���	"96.���{��}��%�N�����B�YV�����'G�7�����-xV���������1�u���X�$�7|����i �)6t5��8!����(��E�E�T�9����0Ft!NUv����K]'&;E�6��\�����St���E������,b����-6��nY���h[�6��lC��m�J��al�����v��P��+tZ���z����MS��cV�9�W+L�s��kc�A���Y�V5����j���v����Z�����}�P�k��k��YJc�m�6�+�]���k� ����t�>������:����Z����&"u���	S���1�;�dAm7y�#q�����H��������6i:c<���Q�n�����Z�C��k�4���/��\�s_�����U������q\��k���-[&�VRNmX�6�UxF�LL���'�����p��S���(��1
C�Z��b���*Sq�i�����+��+��u���u�{N^Uz��g�2M�b[N��Ue��#�j�c��D�/�)JR��n���>�������xz�����Y�����j�������6w�]M{(���RN�L�e5MZ��z[��Uw���>c4���N)?�$�p���;ZU�������E&Fx����zC��SS���Gm�oV��:���|h�Ho��g�l���m�#��A�{������UT]��:���1(dS1iJ��I������?����	��c���a�u��XX���3u!
���n���'��ed����9xs��)	Uz$)BR��!�;���&��Yl��5��r��g�\�8���l���r�����@�K��G�T9���M�Uc{�c�5Cr5�Z�6�c���]1���,4RM�l7m���fh��k?w\��/!*���D����RS�N�kZT0f�r�����m[�gq4�A�l�d�u�+�/�����/9��
��qB�r�R(�r��-
��J�}@|��6����k�r^!a�-�8+j�A�P��yTYr��[��B���w&:�Q�$�T�9�=#���kP�]�������b���;C��?���<#�D(��*H��e��D��������jtx��c�qQ���k��i����M���G�]���-��h�U��~����a�Z�Q�P"��M���*W�Z����r����[Or&�2�b�t�]s2����a�f�6���g&���[��X�e���_��1��
J��f�m�������6�j�E��{S�����(��m�;����������!5�����J�.N��]���D��
��?�s�����c����kUU�|���/+����d'MmZ��Tli�d�nR-;2���iC��&���a-���]#��V���l�F����������8E"c��-j�����_$u	��,��=�M@�M����.����R��b���w9�XU�����XK�3��V�Jjy�|�h���i��9�n��1�`��T|��.[8�����X�����!�2�GmhH"��ED���M�{d���p����T�9p��2i$�)� ��T-�����ci���xOk��������+$��������q������B@�)�G�3hu�BR�%\��=�����m����
����[�N�qH���w�{5�_Ym����O�W��NT@���h��tS��]����o����2��Al7�:��R���o�J��dg�mZ��Tli�d�nR-;0���iC���&���a-���]$��R��
l�J��K�������8A4�����J�N��t$u	��,��=�M@�M����6�b��R�&�b�z�w9�c����U �����Z!)�E�-�I�sw��k�T���*�1�nySr��ydb;����$f��1;��C����q���l��8��Tr��r��}�T��$�M�u�\�wnE���������/���vn���Z/�����}y@�8�g!7m�89�$s��V��R�jQ��v�K������Cow4��lf,�fO�\v�<�ey%p��-S%����I���HU�M�X(����"�T�2�P,�����US�E9����Ls�����}�������{��)70ZR��JR�)N�[�J�1��C6=�ko�S6���MH{����������>)(���j��?�)V�{r�����JR���7�vDa���(�od�s-v�O�9*�-��3�U���;~��[�;c���U���c��t��d�"G�F�R��������G�tO[1�B�sk�|��]�w��A�UJb��~��%;]�ZQ��EC��	��-BX4�V1����:��V���R�E���u$k7y^W���7��V�2dQ����4L�#v�"��1S�T5����+�����$��"O�qq7�m�D��@�38f������#Z�Q�$��1�3����v�n&�����@��Y2���#t=c~]n��,sv��71&�On&�u\��p��������T���
X�o��X�����&��q���69�E�&�&�)���KJ�a|��v���|��W��X7q5mw����ty�1��m�]Y�BI������8B�����h�v�R��(@��e���+^��������<��u��{/}N^�v��3��O��w���Gk�Qd��L�Q2��J�)B�@��E�Kb�^3\�������j]1�" ��E�?}�S���q���
���v4�`�������9�UC�a��/L�����r��M��X���q]��]��u�g�s�amI����7P����p��$J�I�:$L����
�0{avs
�<�b����,%1��ab(�M1��oH�@I?*J�\�(�&�"����8t�j(�K�
}�<s�r�����9��Y��f��r�aqF7V�zgo-;��?[.Cv����%�kT'H���g��b��k+���r����p���q�"�j���M����FI4���X>�kR��ZS�m->_�/lOq�n�y{1���+�>e�(�`k��G��8x�����g�OTMw���\�]��O�DS/���jd;��#?/���$�����"�tX���g�?��v���t���nb�;����T�T���
��������Lov�f;s`�!��K+1�b�����r��H@c�.m���\�j���"�I.�����*�C"�+����qv,��9�`{�'/3���.�vi���a��s,�>2��|U\8��e���J���t5�^1���Uy�b��H4���+(��m�$����B��E)?���vk�����Zi�Z�`�������B��MuM8��;��I���1$D�����>����J��x�9]G����-n�I���`�7�n-�5e��\00�z���p�=rI)^�uL�}.�4�@Fr���
)��0����
T��I�q�v[B<�U3f7cx5#�t�)U"�u]<7T�X��+P��3��z_8�%�S0��wf�-�Z���v���B9FK��h�n�oE�f���c5B�����r��5i6��3vw��t����\*V����G�r�r*���]�w��{�*��$�36eX��D�5�2��!�z�}n�~Nh�OZ:������u/U�:vyV��C��"�2FQR�/MdT����&P��AU���:���	 ��f���n��&,�#fL�D��0d�*P���D"H�ZR�!JZS�~�CN��6����nb\�r,�s��e'����M����L*h6`Y�eX��I������d
���l�3�b1���o����E;����?^pu����z����,�v"J���8�����-�U]�9ZtZ ��VqP��e�v3���4/1�����&�N\s/n�t&��Xg��W#6oL��~�u@�����R���S8xwcEo^�CkVR����}����l���6o�,�c��|�*uEGR����PJ��B�U����IP�[}��3a�D��P���T��Q�b�]�5z1��h��5�uA2^=��u	�g4O
J�j*z��
�����6�I����2�9�n6��mtf���=��6���J����D��=���9wV��j&���Au������!�����zmf�6���h��R��f]oj]�i`nJ��M�o�r���U4���MR��"���_����I1�%�����}���J��o	'�U�pd�������XW�[�EW�lE���[�W�U
R��aE���n��{[�S����_�t��u��K�������)o��������`?����
c���`�X\���[�c����BL���������F���k�����G��
"�o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���=[�Q{��N��o�E��-;��e������A��T^�"���~���"z(�U�IJR��������������������M\���5kSV��J���x���_�z��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp��*/|i���-����E�wz��������2����Zwp
���=<,���w:�/�G1n*e�R��>� �4!h��u�>��k^8}� 3���s8^����}-"���k���]��M��u����c���Lsp�`��k��@Ew�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vo�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
���,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+7� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w�����%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y����F���������sH������@���s�E�Qj��)
6�*.��YN��5��?��*P��_�n���:��/�&�^������*��.���E6��\w�Up�T���F�=z J&�KJ��
��e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w�����%�;�|��Y/��������x��~N��f���K�w|�+7� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
���,�����Vo�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vo�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w�����%�;�|��Y/��������x��~N��f���K�w|�+7� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���c����>
�|�,�����Vo�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@<Yd�'w���_��%�;�|��Y/��������x��~N��f���K�w|�+5� ,�_����Y���e����>
�|�,�����Vk�@IF�B��bD���%!����v.c���������S�N�M��~�
�������D�u9SM2��9�B��-:F9�n�)JvkZ��>Z�y5ITq�L��	X#���V=�n]�C�NV��$�oU*��%�z]p���� 0T��[�R��sv�`99"b>*f<w�e_T��egwH�YZ��!�B�hjV���h����"\��M�(�l�M�H����o��}{	(��������z��+N=�-���]n<�re�g��F;�!t�W4-�n1����nM����^��?�V�����J����bu�?3{#�3��q��2r/�&M��;6
�)�z��|���9iZ��+Z{t��ZR��kJR��kZ��)JvkZ��5���j����?k5��R��_��<������������G����G����;�$��l��������y"����J����x[�E����R�&�g
[�/�7IZp�f�8lO�0vz�qq`���3=��j�w;��%��a����J�8���<@���������8��2��4AgN�E�f�����
��*��,���HB�1�j���+Z��
u�7Q/�LQh�N�]9Ih�5�3�1���tUH����%�*�:���n<NZp�jq
��r����z�39���R5)c���`�����:,R�ixH�QZ����B����fv��n�X������-�tj�*~��c7&���+��,J�-L���V�x��9�5�q[��3������m�������&�5*TJ��I��$��RP���V��k@b���hf��r��u���Q���3?����I�(�
tk�7@��^�@u���q^�����L����lU�����c[���heL�����bP��*j�Zp�i���La���n�M��,�j��Fosc��������}r5Ff�p���rV�/EJ��f���USE5YB$�D:�����i��zGQC��
R���kZ��k�.�j��~-�-��������|q�������T�jU�2JH�T��t�zt�E���lY������3^a��z��o)dKD�q[��%v�h�i�������_f��~���*[���a~�y�y��K���`�y�I"�^����p��Hr�k�MJ��5��vlV�okF�JME��V��!���lB��&'�Y*d�b��N��iZV�8�QG`03��l�6�'\��f���6j��p�J"�$G�1�s��!KJ���)Jq��q\������p������Nfn)f�M�r�n��J$���R�=*cV���:���\����+�@v�S%������>@�o'Q���A��u�\N����+�F!u��jT�1�JV��)^4��t{['ck�F^��V=�-o��OE��d
�#������*��7���K^=�ds]t���+$��t�]���"( �$�����V�)
ZT�1�JR��^�fmF��k�S������D�^���+3/�����pjT�o)kBH����B��"����;3����Y0��m��v3b��e�,!����q��=*���vQ�4�W��TL�M$�cP��)Z�C4EJ���2���a1$�7q��O�G?h�zI:d�����������+Ob�=�f��l����n�f���q���������pL�W���UE�~��?�R�����*�������9i��1g�m���LQ�,���V�k��=��H�)RW�jp7��g�.��6�U�_��
vc_��"�����f\r��T�R�$�l���#B���Jn��Z���d���9S;����n���B+N)LeL�h���)��)�]��_vb���V��k@���,��o��q��k�v��(�e�f�7=�"��U
��E�l�jS��jV�+J��&������N"��6
�,�T�%s�6����P�$�6R�RV��9J���JjR�iPs�yr��s,���af�nH�S���\�$�=�1 �R-�~�I���buT�iZt�=i����PS�������.������9*�Y�w�	#u�R���V�)5�U��*�N��Nv_s���;`C��`v(I���p�k��V�_%Y����9Z���w{�i��(S&N���5*Zq�8�V��h_�m.{���Km�+V7
�9q���)CV�%��Y������J�4�t��%c�wH�d���K6�F���n�+b����j�X����l(Z�"%��:T�N�w$�Md�Y�J��$�f)�Q3��E9x���+J���
��[)�x5x���?aL<�Yf���e,�b����<�J��n�����MD��+Sp�F��Pbn��e9oK�OBI�G1����E�71�Z.�A��ERV��(t�Zq�{ 8[���1���#����k�)�����HkV�D�;����n�
�sT�S�KZ��J�Z���	�8s�8O0����
)9�2
��a�����NN�v�{����%�=�TR����
�s���q\���O�|]�-�8��`bX;���0�Us�6�V�y/wYJ���	L�d�bQ����bb��A���Z�E0�_Q�����:��������iN<+s]���xS����
����9ql���kE��l�)�)��b>`\��gZ��K��U"��${�J*�R�5�lt�1Hj��L~I���$���C�0��Q�����i�j��e(���4����4���]ig�g�}�,�"-�M�d�ru!��Y���4+�~�rl�w�����\9����;�F���&�a��g��G(��t��$_H���*�M��9�@�0b\�|����vC�����X$�)��
��6E|q�eS���)��f�[��H���NVn��H�EPd�(S�.�=�m�[L����I�1�]�����w���Mfw6��V��W���%-��*E��|���h��QB�"�TsY�-�1�������~a6)r��-o;wv��[�-�!��eIf��g�]\��2J��z���[;p��U���2�������<��dww	`���������'k[��2f>��3+�H3fWh�=NYU�����ZEN�b}S}��;�����������f�dt�jm�����9�n�,dy�wt�������IE:����[Z�����D������������rf�k;\�%c���&��q-�}5�,n���+�a'y82s����]u��P�*L*�1�2
a}��sQ����y/*�dXv7���{M��������g��d�m��u����t��5U�GO���.���rs	�����]Z�w��#���l��Q�dO=�,K��J�������GF"nE9U���bQ�k�Ezv�\������U�s��W���a��'��Z,�_#�YIYh'6FBE��&�{~��b��
qI8s-�r"�������H'-�vY"?���;w����]��vWv�F]W�����������7x�����s��D+W�C����Q��YeO@��H<�1�9��y�s�{v���/����)l�0����`�-��.I���S=R�������l�8�T�EF�D;G���s-.v�������V�.��aZ��F.�#4wX�>������rZ�^�E�B�������C������^�g�7������i����6��]�h�����m?�����j~	���i���N&�
u�2o!J�f�L8W��5Rt�����-+JR����JS��)���Z��
��\�4{mv{-��+�v�~�~��:�*���+�v[(VQ�������b�L�9l��K.��QE�n�*�b�/�6�%YH0��\��V�o���,�����t[�L�����V�x�����d����Au]5r����fK(��$�b���z�(�M���������or����\�NY<��y8�+D�kY	M�J��c��J�j�����
�c��r��[���lm�ar��V+�+b����������8�}��*���e��kH����H��pv�L7������y@�����n��%g\�"n;�w.�����Rp����z��.�GV��E��UWhu.�c�j��4`)��W���F��;��f0
vkn1F���~�G�o-,	�!����mjc�M���y��t+s0��B:x�w!��-w��y��������H��79�����c_�{�f���24���rH[�n�������1OS"�������+su�����W3�D:���uo\M�2^��������	��ko��j�����g��UZ�ul�g�I��J��OU����5?�r�����c�9�<<m������sq�5S���4�Z���Z���@K�i���v��m��O��,���pH��\W-����i"��=Bj�v��uIb�JE�S��)�R��w��1�{��nB�����fXv���wO>�{F0���������r�Sf�*������+P��j=�����C����3��?+N��N��MN����X��ZU��)��gn��.��#�Wf��HV��,J.Z��n�L��aj���iM��w)����K���#|��\���fm-H�=bR&�E��
](E[5uB�6���q������F.}/5m��K�xWW4��Zb�����n��7K��+rH�=|�������H��@9�"�������$K��q� �8��������F.��pe������^�~�
\�oL�t�$�;Z-UY6�$�r|��\�^q3�.�5�������i=�p6_�7fAG!��1,"��|,���n�^^�{Q7����r�N�������\��?`=[[�z���K��9�����N-���K	�R��N�;t���*�����UWP�WW�kW#�R\�v���'�l��-]��[u\[��%�q���Ws8�*���Y�]�8�1J�n��"e���U������{v���>�n������H�,i����k������;F�����V�i�"r�D�t�������U\��D��ri�����=��gyG;[E�nZX�Y��
�o���1!'!/���5�/#3%Y�r��}I�n�+"�:��h9�i~�����������������X����]�����K���=X��$�*hI�H��QfN����S88\7x�+y5�{[�L�����z\Vs��{
�I�W��g[�
�x�+��,f����H4�c c�R��9L7�_������rll���m�}��f	��2��m/;���vX����)��3r�9��G�����/hzT�T�h�j d�h�_M���;�N�� �z����_32��.G�$.���q%�-jLNKH(������v���+B,�TT�*�EO"����q�Z�����i��>�\�j��#��MbL���R�ih�+�j�i�Y�vH�����-����W�,���-�F��k��INY��/\qr�:r������}���L������Uj�F�f�Gk�^�m�"�dPhD�v�G�G-�`���y���"e&�|-�K��O�vqOl��]��d�U�2������T:��)�Z����yA�������������M������y��x����E��v�m�O8j�������]#�����rt��\�u-������b2��y��d-�rL��b��������R�f���$n5M�S%Lj���n��k�:*�SXc��R�z�#�������'��[�xd�tfl����$�-T���J��D^i\��N���#����g��l�7�?&\����@�{J:�����%��qs$��~
���hT��(��S��V�H��/P��/.[�%e����E��9�2�W��?��N��.R�P�U��n:����+�Q�QP�9M�gE��[��(��S�(C_*|b^^���������~oHe�"9�����Ik�_@Z��'#��V?|���$*n\�U��l���8d���@q�6�D����h88��S��c��dd�^�1SE!�YU
B����ZR����9S���5Gt9�_��������1��W���^CFOc���H|��0��F����{*���*E��S%����f���7+����|t���4�[!Y���hwl2+�Y9f��Q���\�C��J�)MJ�����/i��h�����,�M���(I|���fs���gV��(�:��,��i�#�o�uU�nR�I���5�f��I�
��%�*ny[G�����9
4�XY��j��z�og�ck��#'s���d�����t7vc���B��U�l*�L���[�-�����r��.:���<Y���9�����Zb����U��BBa��]��������P�%������O9�Q���8j��|�L_������6e���~[v����zM��o$�^H��1�M'Q�>h�.[�z���Bo7^w��KW=�����9n	)|%��39����&��"g�������^E�$�����H�6fb�E�q�
��{y������N�lsd��l�V�l�V}�g��n�gmI�\3T���;n�7M
�UH��S�NC�q�V�D����h88��2�n�e��dd���SE!�UU
B����ZR��
&���8Ng�5��#mm�_alH�V6Q���i��7�����.���-k@�<�u�	f�I��s*c��m�oy2z�{1�wJw�'4<;ma��f��o��l3� ����y��w�l��^3M������%����DPlj:l��e9����9o���P5�gm����e�[���w5�`��T�����{R�t�Jb��z��DC��*&�
��XE���!�#����yX�����������Y�M��gc[�I�E*�K���E�2�L��Z���s�t��D����}gng���yu+��Vu���$q=��,V�d��~8���J��"c�*R%0���9AU829\(��I��(S���=�;n�1�wwO�'��F?��v�$&>�.�.XK]��M1��@�F����E#5�yh�@�X�QpJ��XW�W;��o�{!0�6T/����Q��g�����n�"����i2u^4n����HF.����DMWG#�J@�(
�����t���qf�i�/�������K1��#f�{f�����m�=���������p=ID�!�r�V�
�~���A�C&F���r���%��/U1�����=������j�U1kZ��I1��Pj�N:�h�E��)�H��|��g����u���Vu���$�E���F�d��~���5N��"#��B%.����AU821\(��I��(S���=�;n�0�w{P5'��F?���		����K��vwL�|`M�u]��������X�S�E��(�!�H,/�/��w7�;�X�*l�qo!�m;Y�������S\��F����W�*���R��tfkU��x�Jc���������9k�J�V�X�8�N��o��t�1�����v�������j"��rSG����Y'���n�I����G�/Xo���o������
��I��q[6�&W�����m9{�L���(���B���W���j�p�mF|]e�;W(�P3��g��w�V�8��a���`�K���_L�6C��1��Z5j�U���%
~�M�5+��*�����A�����������/FL��F��� .N���_Z������~��q�)V7tM^�F�an^��q]��3hg���/�	��u�����W�	��^�������|j���
�z�'S���CM���\������h�
��.a�������d�x�
���v���_�h�u���b�d��v��n�e�t�����lk�f��|{|d|��+7X��h�-�z��$�>��&�����Y�c?x���U3���*��MRqL�a�#�k�gl�O+e�]����9I������+�Y������������NV,��uG�|�:�s%�	�#���}�-��� �S�2Bv����4�jj����i���I�K�C�����Ns��J����� *����2�fa�������|_���s<��{xvR:�����)��4^YpT�u��[��v��k7L�\.�7-r�V9�����
�������5���������������!��S���nd�I��� �n�
���������$Z��lg=~a�a������o
�9sj���������%��)�����3n�J�
����T���D�Z���{����L�������B��9c�~�Z)-O���J~�O^u�(�]��E��{�\O��x;�	���M��m\�nd��WuwFf9���D����@���^���.R�e��:w.f����7��F���k-�p��E��F�1�7��r����;}[���]���{*����11�S�Z�l�H���z4�{=�V��g�N=��y�}f-�o?�p~.��\��s��4��]/bo&1ON�!�M�9hxD�Z��`��jt	J(J����y7�{�{k�������;/���,�V�m�T��>�|�[rR����y �u���^�|�W�$�9lTiE�y�sA����g�������{��&R��y���G�|;���=o)�/��,������Z� ��B,�P�r���
������+#��g'����Qm���|Gm]�"����F��%�2��,����b��������E��3(�0���;i�4������p���2����f5o���",������~�U���.�,k����
E:t7��DO��[g��)����`�$f|���k��m���/,;U�;����w�}��v9�yk�\�,����&�:T����}R��j���:�,�'��sW�����u��������m%o1��~!����~��	��M�V���m���x���J��f�tQ��YdCK9�C��b��0�?r,�K�n�O���6���\{���_�����Nb}yide��$�7Z�V�i���O���{}qW-]D�k��?�������lxwH3����zX�>��v��
�r~�����j�I�����f4����f���c�r��Qs��W����]�{����\�>�A������w�M:3��J)B��l����%7��4�_������Y�o�w��M��m���K�nGGV!I"$��r(�5����u����QVgY@�>c;��yui�]����HR���}�f�j�#����M�q�Ji�T�H��tpt�c7hG.�Z���#ys.��;5�:��"����!��
�%��-��W���^���yj��e&��Yh��2ET��UzJ�J����s��dv��0O-�@��FB��-�u�r���Z��a���K����{#/ ��k&
^^�#�F��Eh�@�r��������r�5<e�[�YS$R��oMeg-ub�R
�~�*It"+��A����NS�#U�M��*���-;��������Bj��-�k���mE
�Z��NZI�V)OB.�d�%ZW�����``\���`�]�=�-�a�J���ff��}y������s��I��	��I:��"��E�J���*�
�=r����#n���&��>�c=e�1^�!���7��6P���I�8��!��Y���0�U]I �kC ��K�nd�J�h���3�>`���!�:Wh�y_����KX�.��vv-���n���/���X(�lcj����H�7l9�8��;�"�����9tb����,h��u�F��CCI�Z�4��wv�c��R�dMUQnS��I�jz��)��	~\����\��7/l/hl&�lt;��yNA�%�8��]&|��M�g*QN��p�z;@������*�&�@6{��r�ifl0�}F��(����o5MkD�ee,[��X5q��h��X��SE������M��Q��n��^lN����������^=W���B�%�~I|��QR��R��2�qD�J�^4%S��\\9������Jg^�F����JL�Ea����G�Y���6�K��*��M�[(�k�v�&�}J����~bu�	�����Q-,�o�*����v�h�_����N��v:��Q���l�����9�	�N��B��/U��t��c�'s��S9I@k�"�ir��y�qvv&�����;w���=�S�W�]�z�����I
�Uf�]������9�i?1n��������nn����l������+���F5���jt(u�-���bVg|��*���B�@?����k������Z�_�w@(�;K\����w�r��>� +=�m����r�����sQ�D�Q�r��S���Zt���
���`v��$=M#2��i9��?�*J��K�72�2�%kZ�:t�n�����j���K���]�3�(�nj�U��F�A�f��~�����J��Z49�ZtU5	�j��_�ep��=�bl$�J�9�;:�Z��gX��mU���P�7H���5KC{<k�����^	������WJ����&�9h��7�a]r'���2����)S��f�!��l�^BD�Mt��OY[I���h�n�MIt��q��'/���=��7�k�>����C@�e��[�b]@����US#d�6�1T2�z=�
��+�8�������xS�$��^����d�C r�;�����sZtNr���TN��J��)C��^zD�)�6�.�;7DC�n��� b��?p�K�
������� ���f�Yp���g��s��iT�P���5*�����+N�8��i�2'�����\��]�,��3"��tV�IYH"�����r����MJ{���Z������N�Mj�3Y�{�I7��s�X��,�c�h�KDx���9
��
CR��@^O���r��4���n��67*�������j�n�MUND�/�c��f�������z�|����d�u�z��G2GE��a7��Q7�E��9f��N=P�f�.G���h�%L�r��4�[��KRV�vl�"��=Z���F����
S���j���<���d�UR?aowo�`�^���6�=Jn���+D��H�e�n��}�)@H����?--�;.�����i�����*����/�Waa4�T�*i�4Q5�$�����,�EN�*s�v[C4G�~I�2>�����nd�����W����a�M��Jn!)��3���\����Iu]�iG����=S������Z��M���`����b�6+\��d�t�Uy����?�_]F}��^�C�������!�6#ao��w�1�"�W�,�
uLZuq�Plx���$�l�#���p�h�C��
�rz�|��w~2?��64�7��KiLi��	��%�-\%��6�9R]:��N��r���t���LI"�L����"|���V1�����������f�c���M#��o�e{��l�m>k��*��m��uI>������Q�I�W
��9+�6=f�<-_w������w4�o��@��L�|ij�1�����l���8��'"fJ)�T[�t�M�9R;p���w,=���c�{�63\����������2h���,���L�%Q�M&gA�u�+�$���j�SB�3t��8n����.�f��U��."-��D�Qe�YJ��!J��5iJR��k���m�������+����W���2/4����Fp/h4���5��]�l�krU��g��W�iG�9�B<���Pd	�O{��/�d>�Og���������/�(��i�71����~����J�U0h������������	��_�s5���!^��du������:������.�db�~���d���V)�p���Qb�����/�;���Js��h�}�m#pXJ��}���L�g��}�|3��s���fN��j�z/;]u�5�n�d�P-��;�����9
���=��w����vW�[k���i����"eqV+��^�*e��_N�-
������_�u�	����&w���r���""���$��}����G�v������t��*F`��jjQ*@��F��N��j�5j�{7ckj��Y4���D�/�w����m������t��]��� 6,t��v]�q^73����N
^��e*�F6=IIg����*($���Z���R����+���������/��]���JQk�Z�y`���q-�z�-a��\GNdY�6��n�2r�twJ�E���"�DMUX<k�8��
I�����e)���8le�0����YW6�H��������q����L��N,���E����b���kJo��_D������>���9KIwE�Q�M��w���MZ�cf��~��=���3����)�$&A(�8� <�U�C���mi�]��:����ST�*��8��3�e�f;��W�+m&�I�����t�y%��D�.��v�����L,5ON����'1��1:�J'J��[�F��(��������j��&Mu�{IY�,2�L�C` 'Q��]���d����C#$h�����Y��E�h�8��Bj9m�+�[d�Q~�[�%��T��9
Z�K�v�b�T���3��y��������g/��~�U���r�����l��@4#~5h������_��D�m��Jj��,<Ygd���s�����~������h�N��l�jn
�j���$�i�\��Cs)�4�����������[Sv������"�Ati��D���I�VeYm�����@��VsE�������<��e|�i������}��b�������+j_, '����fg
����}R�%X��*C���y��LDc���9�f�������������&�R�pI�X���r��2U3&Wn��h��-��E���}�2}�&9�Q�����e=n�nT��z��@�CY"�Z��-�J7��"�)U��UTB���}�u�JC*�M�Z���=}d��$b�k(e�������A��e�g�5h�f��/Rf����/o�J<��8i.�����_=Fj����E_�9������$���0�*�S�7��#~�K�*;���g���z��U�[���\�@�Pp����dK�&(B�:��n�V��U��k�{Y5(�GSMLJ�.�k8���,��^���{���w����^����\w�a��-�7���1M���B�.oySN����$��E�vZ���TBVqK��q��RAs���bTk^�J�i�R,���'�Fs$��g�X/�lv����v1{��/[�l����r9��IY��uWU��4#%�7k"�U���,����+���.
{�ef{;^�m�xY]��9����������p\���U��F��i�*>:�hgdA��}�EJ������������i��k��n]n�1�*���d���f]�P�����^H;:h$gR�L�P�U����s�,y]X�-�7��[��!��XS*<�Y"���_/��a+��mgo&�Lwl�wB��F��V�5A~�`�X��N3��|M�4�}�����i�s5��]�k���gg�N�}@��+���������w��%l��M��4�P�����������^:�w�{/C�\�@k4=�
�q<����{K���/}&"�y����9�Y�MC"�"�-����;M
���k�&B��v{��������NO>L$�&�[�%U�]2p��J ��+E�E�h�Y3@��H�v������b����������i��m�Ui�W�����D����r*�FA&��Ug��"�g�Ns��/���I&L�X8I����t��h�h�*.��F�%9S��@{@0����)���������Kb��.�r����F��lN��~L��<)���x�z��AJ�eKS�b�>{��Y���7�J�s����sN��5Ns��Qi��9���k^�k_d�D_���'��)�aE��x�����#?jb��T�H�/TD��iCv��iJ��i����
��Rj��������`�;�������!���-�� $�c��^�Ql������C8V������q4Cz���}Y=�9v��_�5��'�GR��.��m.U�}�^A�B=�)���N�����N��m��"#���p0��5+y��h�h�p�����������J5	����5k����z�pW'�fY�n�l=��wM���zq�O��.��Z}���?B��c��xq�+@�f��K�G�;�sf8��^.[qs�0WU!�z��76Ewh����Nf��e�)LZ��%x��}�F�-����l4sH�/uw]��dC&��Y<���"r���\�FI���*���8R��
c���&,������w��Cm����lu
H�}����Tt�k��&�(�
�i�������������]R*>�*W/aY%o2�-m��3��I���vRQ����x/J��g�O���i��\����f)����]��q���>�yd�t�i���w�V��pS�4�hO�l�|�z���l�3��"��0�3wR��q���Z�i�S�*:D��Z���t�^=
��#+B����9�c���n��2!�EY��[���9MZ�Y����n
�UZp�i@��q���nw��l<|���6���n�5T�*8�9���{mjb���ntPP�7������NF'y�0��s)��<]����.t�nC��/�Rp%
��i����N�h������[G�YB���/0�L�R�f��|�<�#�F�*J�!����]#��hek^=�p�63�sq�|}p�QU^OY���\�]G2�-�.�����Z��b�@wp����}j��Y|C����u�4Z��# W�w����!"��N��r�H�UR��N��N5S�\���K��/����"��pz�g�4�2���F�3L�������a+%S�BH���UU�J�
V��X_�?5�\����,��o.h����2�����2V0�~����9�w-�2{DU��'
"�QY�NPp� ���o��3����,�zo�������u�c�'
�F2������;�����O��6��x�r�U��Q"$c�C%����J������3�X����7��)l�?N��[.�h��g	7I������J=�]iUx�N�r�?���3b*�a(��9�[��t����`K�)���5�4MG�9S>��*�Z����e�"EJ���m�U���K���)��|����?VkjU��g�7#f�>������I����r{����u&�(UZ��sX�J��sG�"}�b��^����PXw�������������
Fr�]s��ro�.��������csrfU����MeZy��"��B��"q��	���zB�f���{b�V�E����������OL����3N�n��9=zcX���n�����Fp��y�w�Eg.�H�iG�uJ�UJ�J��	�����h�5������v�vb�����9����+���E��-��T�����D�.�Q�RT��R�7��r�O��M[~����n�;�\Mm�y�*��s,��Q��������A�Ls�:����
��w*W��8�*c���ll��.�{�d�b�����&������d�C�R�^�g�EbT�C&��J����t�S���dc�kc	c�����Z���n��:�d�{s5.����b��-MZ��}X�^�,�@�[����-��g���B���'Jc�R���T2���M��e�JULN��jN�L�h�@ Ozy���7�2�����w/9�lc�u����2[�:����-���%e��� G%n��#T*J��JEz��
	�vm;sm��x9�_9�]��� ����.�M��X�����yyY6��	2�����E�k)���+�W]v��/���L��s>�s�����q�k��a�>����^1�9�XzYYi�
��f�;��2�L��^�@�%VM�$v_��������Z�B���y���&�����tk[�$��]���[�D��O;��j�B&NAFg}Dz	�!:o��8��8sc�G��)bb���v\=Q�z�K*	n����x�J���)�C��5i���Z���u{���/.���dJ�'��W�v�?E�����V�x����.���%kN�������cn@�$�A�h�K�bv��1"�bs��t��O���F�h���9h����N*�s��[8P���	������r�y���%��
����,K���L��*��Zv������u�����"����9�Z�E�W��������iYD%�X�����7����x�2s�d�X�Z��B������U"�L�,���*�=z_���*`�P~G5C�����%���L�T�s	�+�f;+���3.�f�+��R�]O�^&��L���^�f�nv������-�NW���*���Ob��:�G�4�R��R�UBT��Af3����	��>�������T�T��'�A�$�N'O�7k�_S�9�����6t��6+��H�s]&H�c�9|���vr��������s��;g�q..���K�����le\�I��6vU���m �T*b$u���2�-MZR��dP�^��������)��N]+b�}�r�J}��%,�38fW�"�n��BQb��S�B��
�h��.�k��ci��0��,X�\��.&v�6�V]��#�t[C��R�3*J{�TQ5D���=J�e1�ZT+A�Cd���y�=l9��v�d�o���������$��Q�c�����pJ��]2V��S?n��Y0[�3��<�hl�[�d���,�.z���o��5����_1�,����R�-�!dN��aW]��T��
����&�P��yvDNB�	�6��H��m�Y
�@�2��%��"�}~(���T�-����^�q-j�{K�W�/SX@�`�*��u�E�t��;���H��{�
G��Sv��R�O��D��4�L��y������2���E;��u���}d����uY�������6�����t�iGLQ�Va e:��>���R�8J7*�m/��8���J��Y�	\m�����E�Mo�]q����U*]��fO�7tv��*�\"��US����$z���3^�&�v�Q9�eZdk�P���)��cl�/))9+wb�sB��b7$�n�����gi��GMZ�tA�e��s5���r]���&5�����:3[������J"W9�?�pC����M��ZFQ�z��e�u���@?����
�sy�W�\�"���9�cs�F��p�K3�c<�Bv��x���JG�8�*=������i��,���(I.x��n�ra�O����x;e<���l)9J���j�����,U��M��N��x�|z�\���L�E�-���3]o���~`Kb�kH�r������K��"������p���U��*��Z��sQB/��Gby�z���-������j���7�f����I��/.�u�.[v)�txU����l�m1=N�(��9���<�y�����]��&���y�K����o{J��g�k#)o^������q�X��8��2t���e"uN�W}Z�Pg�s���D�m<��'`����|���-�/��{&���Mj�;�G��k�J�N��[7��)�B7���2�P�n�i����kip�_����N���Y���������qu�eX��FF�p���6�h�����6Ud�]���+�v�6�N.��<
RBO%|C��]b��;�����������+��E�X��#���eD��[�k*�'3�k���9�k�56������������8��w�1���B���Qk'�S��8!L�QL�r�$8A^^�	�n>�3�s�U�kf��,�,�3��K�-��e�o�i����	�[r��v�m?8�^�N����L�r(�Zk�W/	N���l�^�W8=e�63<�%"El���{M:5���sTHx�x�������$��f*K�D�����W1<���>����gX���M��<��V6�P�f���hLY����[���������-Q������H��r���7�C5J��ma�rY�m{���6��l�8��=�/k������V
c�Ud�-�V�T��d@�m�.���
s8��S���p���`G6�C�V����W�1��q-|:�,�W�f����"��IOR=���j���������������X?i4��V��
qc=j\��%�(�������r������=�+oJ���{`�p��k��)��!�iw��������������$-�������b�����f�$4��Qj��n�E�W�.��V���n���T��,����m�]����O~\�K���^r�O �������������
�"���fQ�#F��Y�h��Z ������9���s^�������2b����+�
�����zJF�����@�M4�����`���U�����3Yu�)��w)
����>�m�?j<�y�7�w����L�o_�Y��5��rU�hG���;���rT��3����S,D��+W��n,q^�a�6���m����0�N�!r�6p�2m����(�r�-iZU���G.H�i�q�:����tkR�2VM�{y�n�I�)��I0"G�������B�5��kCp���e�e���K;g�/g�w������P�2Vnv��'n����*H�n���f�z�P�
Z�1����������&�oyT���r����|���8]oq~�dq�l ��^�Qh�:���ng�Z0njQJ!�I��t|`���y{�������������D�b�q����1�tg1
Z6d�u��E�N�#�JT�G����e�����h�7��\���������2
�n�a^�c��uf�<9S��n����9-"���F��q���������?#�g�l\�"�V�F\�	��z�~��Z:�������d��U��5iE�%JuYu�U �>F|���,\7���]�;�o������i��R�����6���2���M�4m��j�$����(�DQX���T�n�o��g�|��L�s}����Sg[�Y����wI����r���^?��<z��O�r6w�����9��r�����o��~Y�U���������oH��2��m^/��r�����4Y��Tx������X��gR�+�C0LY������/���4�.h��r��n�If��*&����$��2�goX]��;���2j���������������CI���r��{��3�+�uQ�k�(����[�v���C�Q�J=v�)��Z���R�I�C��2�|������6KpQ�,G�)���ox�B*���&�[x�T�RIB?�b�sE�t�Z"V�l������Z�����X'z����m��m�R�EIW�����e%,�r�3�rF�p��!JeNsP��x���kv�n�?
��O��G+b��������y�����u8����<�h������n��2G�L��'���39��\�\��r����.X�(	�Y$�:be���b��J�D ��*����5i^�@E��[���v����?�Z��SZ����W�9n�(i$^)��kB�~|�=�����|]'$Z�8v���I6��P���L����|��_ld6#I9������&�����K�*��e�#,����V�j>����N�r���if�FU�r�&���m/4c�����M6��0lM���|��iq��v����I���"��|�#�z��I�h����G.�M��w3�%U�!%�K]P
��,Wi�zO��2��sm��Y�{�Rc�*�1erO��$53��SQr��N��\��3T0������}�u�8���7�b(������-�����������"��A#�j�w��^�Q%h�a��[j��g�i�/��sp2���p�V��l���w���i+���[j��f��!�k��Uw��v���Cz�
��1q���:�ti�m�_v~0J��v�kn�K�E�kF"Y��w[u��L=���#V���Z�������{��{�F���A���u���I]�Y�qj�
^��*I[Q���|���Uek��U�L]7�$��(e],��@!�}.b��K,1������h��0�V�K�]��u
�:6����Xvk��h����$��;��hG
�4EuV(���������K�����e5���h��:~�J��eu��w.��nI��6����7pC�;�����4�������q���5�0�he"�����8�KsZWs�{X�wU�J$W1�7_J-F	�)JC�hU:��z��r_,�/�-��))�[��s�g��~�R����m
	b1�aJ7x�6�{bA�2x��m�U�I,�a��|{7bJKX9+�O3�yn5��Sh\gbF��c8���[�/���n��%*j��N��N����.Z�U���}r9f�>�nq������m�����#�T�W%�p����nM%���nb���]�v}���P�^g�6k���fM��[�s�5��[XV���L�A���/EIj[7Em��]V0+����z4/k�P�zG-*e��r��������B�^�gy9
���N�_��/�������Z�Z�����`�7FB���
�j��`2����7,�8���S�����"�,b��E�N����l�����p��)Z �8���D�9�R�(��ci7c������7%�h�<.�l�L�~C]��s�)|@7�l��HEhvK���#l�H�<�S��N��Z�mh��}���Oo���#�<{j��Kk,V�J� �"�v��kU:��VIRF�F�����5T5U*As��%���ao'$����1R�Zd
�.z���_�FSRT�FD:����
��(�j�����:����9�b.k{���.�k6���-�`�Y)t��]�R���� )0�M;�|���
^�>=�n�Go�J�3���3�9�G,%�I�o�2[�sbo�-���o����(H��ZF�v��U`�VB�3�Q�;N����V�
��N\�+���&@�-W�y���-��;�!ZM'&�mt$�����������:pD�Z��UCS�Nn!]N~���Z���������f/�t�x�+v���dg��V���	]JD��	�xv�fc��A#��=)B��	��MM�:������
�fdy�Uy��\x�#H��fXK�kY��$�E��O�V57��d����+J����)�s��W�����A>�(��#���r�P[���~��e�z���qZ��=��FB�}J�+����9r��lk�6{��0�[�o����JW[.����-o�u���<�n�U��h��&��(��k�e��9Y@�6���0M-��o^��s^�j
�[��~{�WId;��][m�pBe\P��]��&(�$��VQ��I����!�u��������kN����y���z�[[
���C�8�P�����W:1�rm����]��*�v(35�EF2�����D���3��n^�[�`��Z�^?`�����{�5b��J���-=��L!��k�%i�j(�~����n����1e*�j����:9NZV�!������]_��x���s�~�x�]��kX�9.��c��6�}tlu�q�l��$jDVU�sg/��J��G�x��-C�����X�v��{�5�^��k�1��W�-"�7\��{r�yc�*/N�����W"e9���D)�P�����\��Co�:][�u.Li��{ ����byZ37�m���6|���?;��7p���P�?D���
������[1^��f��Lq��k���,u2����](+d���P�����d��Z@2]VJ�G
���G+u�@��;���5�ab��]�=������rdK{��Jc�H`�����z�V.N��b"�'B��wlN��P�<<��[����q��f:8��9$������[�F0���d��j��;���	0��H������O����E�l.ky��Xz��y����:� M���e��l�n.��f�-�+�b�FT��G�uZ*�~�S�^���j�3�Z�Gz�����e|k�llVg���;��j+c]�n�&��$b��ad.�f�R���Q5z��QZ�rX�]��rc�/s~�b�k}�N>7�8�f��i�VS9{f���dJBuk�-�%����;����"��BBz��������d
��"�uxYq�[����rF�d��j�����Grx���*�z��H����U���W=]���Kr����������JI���o�����ws��K����� �������Qt�B,j#�)��VY�,O[��d+�|#��V-��,�E�$[m�1�0fK�Q�
.����K0��H������W�����������)�
������>{�s�Q�r�1]�FZ8��d��Frjf�r�v/deT�B=��QU������CW�����8w�Y���v���Xo�ca�E���������uq;��J���vu������K�?QD���-QZ��\�_��rc�/�v���m}�N�7��b��i��[��&�-�b�U)	������,ZK�V;Z��"����`{�j7?�����.���������*[���/'���H��q;�����e�Ui��j�������F3�U��u�t/�o:�b_��ol��+6�O,�,��(�))iU(��l��`��� �Rn�K�R�����3�8���G��M.�L�h��e��t�������/��27y���]���n��b���z�G�P��cp��$C;~">�Q�$[�4T�QZ3�hFm������/H�f�����2�5��l�D�����lw�l%�[����mX�w4�k^9��Qj���^�f�UT�2���x��9I����\_����a������B��eh�����~\\�V+24�V���-D�vz\S���^=s��u��4��*�����vA���m�~_///��$���R����Wr��T��)&������A�yrOA�_����Y����7��el^����e��E�����+^x���nF�JZ���W���xT2���q����=:��}���xy���E�@Y�T��O��$�UJ�n�����t(��2��O�[�����1m��������md�q��q��}��w��f�A:�,4�]gl[����~��,O����7mr�z\&��c{��+����m��������R^�����I�]l���[vjv)�d:�J�]�L�v�T�7tK�hs�pLc������-	�S��k�v�nkNZ������i���7l��+�V��Q:�3���7ET�P�o�
T���Zkx�y��-�����`��`������&r')KJ��j:�g	T���)�(~���5oH�]�w���v�����A���,\}�V�e`]��J		�����V���7,��*��=%
Z��&�Ak��s�����B��C[9p_�nV�\J��c���t[����+��M��zQc��a�������RpKf�?��0��O��r��m��-|e-uB�_%��K��'�-�����:�P���=
~�x��X>�+��uas��g��e��8��3�#��^�N������������k��U���[�j1#z�9�*:�������4���"%�����x������e'j���9�I�hz�����&o���*���"�"�1hk���&����r'��N�i���-���X��E��5h�������M3�����u+N���;4���m�v��b����hD3��;:���c��1�����D$C�Z�Ql��H�k���s�8[����������km�����0��#8�8F*I�I�9iZ�$IET�)^-{:>��w`�H|���������6��otD]0.Pt���)�D*�RV�5:��tUN�J�
jV�
ma��)�[�ROB�D�ku�]�u��1���+J&}�������R�+�%CS�����3�����Y�+�?Zwk�����`|��YM��G:-�5���"��VU���3*���3^�����f����QF}d<�W�+}���q��k����{3��1�H�y�������n=�*���Y��$s��2*6UW
#��UH6������_*]�6J����>�������{���3�IX7��T��W������(�����P�0A^�:77�XW�wE�Y�T����;��Q5
q����t����E��j�B����/(���f���D�����>{�F���U.���'RuzZ���N���-:�s�0#��P�@��U�J��
�U�TD�r���Ud�9�����=iZ�kJvS���t���s�:��$Co�:
�%L����kC�7R��+J�����m,wx������m��w�����U�n���f\��Y���(f��qV�O��%\�ZP�dkiu�#k�.���j�s�SV9,�Q������MI7����Z�1Q�zIH7rr(�r(��"�1(A������O0�?"� �����p��f)�3QOm���������$���Kb����1_�;M2��hZd��Y����`?[5�j�\����^nF�?�ZZ��.�YY�������*���TT�����	 �8&�e(F�-<{�^G�6��Q�zSo���^��wU��/Y;�iT���j��aT�O
��u��*��Zu�E�n��a���6��o�2�^������o�T�����W�AG\�ePQ3����:lWj����S�S��Y�P�nR����;�#ov���';sA�[1dE�m��8JI$����n�k�h�[1~��@�l�%,{b�O�Wm_6E�'-�4r�Un����l�F��DWF�)�_�R����.��j�\ ��5JJ��iP��jj��R��^�xS��6��lO[����t��WLm>��r�5z�1��?K�MN�H��p�S�x�������Q��5�Z�����&���ydUr:�i,���-����f
d�v�f�&k t�RR���7F�#����Y>����6��T3��e�K:���":���d��kF#�f��b�1@��I�-�/D�z�v�1�����fl'.��}�n���O���&�e�����m��+z\u+�v�Cv�*�C�bu!j���9}���(�����5�n�����V���<Sy�;wR�
z1t�����q[�E��5�6��or���s�|��+�~fZ�g��������f��Sd�o<��j����nn8��?H���!(Z�@�	#������Ub>�c�n�
�Mx�X���yw^��AK��v�E(�d�B) ��SH��n�D�Tp�j`�<���q����u�����v��|���n5+��~:qI���%���,Qni�i	��j�Ux����.���S�����m������k������B����My&�����I��9�HUs������=B�<�& ���<���l��W�����v��Z����%��\W����+��s6eHZ�P�l��Z9'H8�V��dr_0}���1������K -}�5�#��d����&*g0���<�B�dB"0mz�6��P�������/1�S���b1�2���v��q���
/,��.	���2�$1�nUg'�#�f��7��QeRaB�C����U�m���V��
��3��:��o��V�ld\#�.�D\�)r�.�"�H�,�1�Y�q��F�~V������L�b����d�625�f��"��,�+v��4nR��I&R��i��)iB���)@�
#�1����i�k�,y���r��oc\�-0�����NI���X������+�u���tr�JZ���C���C0�-�P����[��
�j���x�f�����4�i�xdk���zQ�������(V�j�#����A���/�f����g������,���	�[$�V9�H�����&A���$��Y�N�z���^�
�t����L��@���y�Y��~P���f�`���6&��5�����zd���;���������K��%I�%���;���:��� ��M<�r���a�k���J������l�������f����t1I^�F���KB�t����"���
p��V������;��p��*�v�R������<���]�e�\���.�6�.c(��F�(�J�W&YZ��
���WZE�N���5EXo��6N����$���{&���X���{�E��s�c7�ldY�j��nS��0s[��kM��c��o�X�;!���9���vR2v��bH�*d~����A�b9�IQ�3�F�z��aj�u(G����\�u[*Af;SN�{��v�R��m�f�E�mN��M�������p�R)�� ��=(�E"�)��t����l�e�o�]v��
%n�����f���fx�hY��(���PP����1CT��iZ�sn�T���y�]�a��k5��RQK*����u���+U���d�G/55kZ�R����T�B��6x��W/�n��0�,�����]�����������Z��e���J���M�E�;���KS��K@+�y�~������������.�NY���n"� %m9��{�m/[�Z"l�q��������1�Go��jZ4@��������'�qX�n�vCal�s#e]d��k���zT����y�����nh�Tv��Q���>�AZ��J����(�T��Y����������|v��y"���#�������}��.�������j����Q"�R��	���[f��n.�����B����n�^��g3p�L�<|�,�L�A�W((tWAb�!�SR��h��_�m���������R�����(��jf��:�gU�����3x�������
�O�D��Q�e�i@��t���������-<=�mn�R�����"�|�]#-$���v����;��r��J���JTw��"�[<�o�yocp�����E���evLc�����@�cX�JC��%j�"����Q�I�&�Q!S�vM����������x<����W�����pJ�,��I$�{oMO�E5X��pX����
R�:����+�1y��{g��������E�oy��]V*m�)$&Xu��Q���f��8n�j��I���r�S�Q���P�&~5�G	�Lt}��*Y���:F/��wW��Z��){{�JR���T�����7U�}����Y�w�W��e��")'.xU���'�g����;��U���k*sv@j��r��.e0��=��I]7-�e>@��^r^��6RK�NA�(;��U5h���C1w������H�W�����?-���f�M�&/�N���9������g'Tlj�j�*��R�MeIW�����s�E���Z����������y���NO�[�������nI[J]g�����;i�c�t�G��2��z*�!�R���l�F����l��kn��`m}��N9o	m�%
����eV9E2�U
S����Z���
!��Xo�M�`��Ls#��g+�:������K�����-�H��.�X���{F��Z��y���=��������YN���1�b�3�*���o�<M�2�fO]�{v~Z��nWE����Yd���cW�!��O4�C5'��4q��[���v�J�V,�R�=�0��#�L������IGN��Fx��K��"e9�P�;���G������F��t���Y���.� ��$�!"��E�j;lc����z��5�-js&B�5CJpG�[�gd�<�l%vf���P�m�6/&]Y~��~���� ��<�b]*��/WIn^55	��LP�r��)HB��!hR��JR��
R���R��R��x����-����n[W<����yF����z�J.�B��-�d��(f�����:���J�d�%J�NS�����c�c��K�e+*��l�\�TG�G>@�^�~��L�������(Z���JjV��W�"����o��Z���N���u������
��];7ae[��t��2����H^I2S�M���.����%l
C�v�,��U�syO����|_b��{����Ww"������\��:���t��o_+�"�AnEm���&,�����"&'l��c����:F��m7
�����2]EZ����
����c��r����
�?�rnrql?��%���E���&�$�$����tc�
Zv;^I��=O�,�3��f�>:=�v,1n�FLY4J���f��
�I$�JD�!hR���)JP��.[�+�c����_}�����'���������HZ�QC�fGr�(��Lux�����{�G�#�u�X;vsO0lq�d!�s>C����R�}�#t'�G?����O\�'2�"�8z�Iq��~��*����w����s�vfR��S#��v�[
B���%�I�7MEZ�Pj��v�����u���C�"t hSOU7��y��/����Z.��6O.�3��SV�:22%���sW�~5����	�_�i����1v.6c��X�V�b&��}�����q�;��
fI%�x���Zu�P�V��������W�&$���'3���
v(��TP�T��e`���{N��*4��BR����|��1��[Y��Y��<��f��m(������T�:29�JB��cW�Ls��9�s��L�n�k��l��m�0�������I�/'v�L����]J��?P���Z8V��iCV��`��(�����*�v^i��sy\y&�������h���Q;=����a�������9�_������9�T�@�����������?-~09���8�QpF5��#'��<��6*f���e��$������Ywnw.VS������BP���(gP	���uK�=��-=��oY��]=3q���rE��^3���N2Z�ZN�v�j��<���T�S�zG��/�Sy;��y4�~pJI�}S��S.������k�,�9}�{5i���@��Z���c�o�1�P��������+�����m)8���3���p���(���EV�S)��%M�L���[z.��.Rm%���%m�t]V��4�H��$�
����*z�5Z�iZV�5�J4�����oY��v�����;q���l�$���g��Zf`�X�;��b�
Jv@���}����^�� ���}��mJ�W���s9�����5��1w&�o �DkX�WI�QCP�YU0v]������q�^/��E����d�i[b��e�&D_=�/;yf���H���l������'�
,��W��F��Ko`,LUzd<�c�gx����:����$k���� gU�j��zm_*�G
���uV�=i��c�#��K�e+*��l�d�TG���@���~��L�������(Z���JjV��W���]�B]���t��?��R&��1^0�y����Y"���&�V��)kC5b��Z��"P�(Mv���
�Un�
q����V�\V��#K���u���z������#��,�s���9� #Koy����/��>�lL�s����M����w��� ����v��F�rz7N��Q�l�n&Ye
����<�9r�VB>c��a�������sd�n,��m����ZR�j��e2���9�+�5H��#��%����������|�
�Yoo0]aJ���M`��t�q�;�R>rFn�|���:��N)#FN�v�Y�DJd�uX��	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������=����~�X����p��o|��K�m�v�8O~��t_��6�;��'�[�:/��}�}N�����u����>�	���������G`S���{�E�]co����{�����.������q���W�g��-��R]�1<�dw{-���*y�R�}��e��
�����H�t^e�R��	��@���<e	�3�.��la�����x�Ga�,�9*��������/���v�.��y�r�pj�z���D�P#��>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/}g���7sB��N���>�������|G�K�Y�z�M���#������=~��h_�����}��Sw4/����x�>�_����zw����g�����=;�^�����n�����/��u�������+�����O�B%�s��/c�L���Z��\w#*�x��]�h���i�C�BtL`������L$�/��.��nx�6N���K~�R�5�[Z�������V��].�K���_��������������������������������
Array-ELEMENT-foreign-key-v4.4.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v4.4.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ef7054cf26..f16638dcda 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2322,7 +2322,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2367,6 +2377,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..90de1ca102 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,21 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +916,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +926,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +939,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -937,6 +956,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1876,6 +1950,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..4246f6f704 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -43,7 +44,7 @@ ginarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
+	get_typlenbyvalalign(ARR_ELEMTYPE(array),	
 						 &elmlen, &elmbyval, &elmalign);
 
 	deconstruct_array(array,
@@ -79,7 +80,8 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType *array;
+	Datum elem;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,45 +96,77 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* 
+		 * since this function return a pointer to a
+		 * deconstructed array, there is nothing to do if 
+		 * operand is a single element except to return 
+		 * as is and configure the searchmode
+		 */
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		/* 
+		 * only items that match the queried element 
+		 * are considered candidate  
+		 */
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		*searchMode = GIN_SEARCH_MODE_DEFAULT;
+		
+		elem = PG_GETARG_DATUM(0);
+		*nkeys = 1;
+		*nullFlags = PG_ARGISNULL(0);
 
-	switch (strategy)
+		PG_RETURN_POINTER(elem);
+	}
+	else
 	{
-		case GinOverlapStrategy:
-			*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			break;
-		case GinContainsStrategy:
-			if (nelems > 0)
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
+
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
+
+		*nkeys = nelems;
+		*nullFlags = nulls;
+
+		switch (strategy)
+		{
+			case GinOverlapStrategy:
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else				/* everything contains the empty set */
-				*searchMode = GIN_SEARCH_MODE_ALL;
-			break;
-		case GinContainedStrategy:
-			/* empty set is contained in everything */
-			*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		case GinEqualStrategy:
-			if (nelems > 0)
+				break;
+			case GinContainsElemStrategy:
+				/* only items that match the queried element 
+					are considered candidate  */
 				*searchMode = GIN_SEARCH_MODE_DEFAULT;
-			else
+				break;
+			case GinContainsStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else				/* everything contains the empty set */
+					*searchMode = GIN_SEARCH_MODE_ALL;
+				break;
+			case GinContainedStrategy:
+				/* empty set is contained in everything */
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
-			break;
-		default:
-			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
-				 strategy);
+				break;
+			case GinEqualStrategy:
+				if (nelems > 0)
+					*searchMode = GIN_SEARCH_MODE_DEFAULT;
+				else
+					*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
+				break;
+			default:
+				elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
+					strategy);
 	}
 
 	/* we should not free array, elems[i] points into it */
 	PG_RETURN_POINTER(elems);
+	}
 }
 
 /*
@@ -171,6 +205,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +293,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c
index 7ceea7a741..62189838e1 100644
--- a/src/backend/access/gin/ginscan.c
+++ b/src/backend/access/gin/ginscan.c
@@ -178,7 +178,21 @@ ginFillScanKey(GinScanOpaque so, OffsetNumber attnum,
 		if (i < nUserQueryValues)
 		{
 			/* set up normal entry using extractQueryFn's outputs */
-			queryKey = queryValues[i];
+
+			if (strategy == 5 && nQueryValues == 1)
+			{
+				/* 
+			 * strategy 5 is GinContainsElemStrategy.
+			 * we are sure the strategy is GinContainsElemStrategy, 
+			 * so take the datum directly without accessing an array 
+			 */
+				queryKey = queryValues;
+			}
+			else
+			{
+				queryKey = queryValues[i];
+			}
+			
 			queryCategory = queryCategories[i];
 			isPartialMatch =
 				(ginstate->canPartialMatch[attnum - 1] && partial_matches)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 45ee9ac8b9..3fe6b1b247 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2100,6 +2100,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c7b2f031f0..db7978ec45 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1213,6 +1213,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..c197cec11a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+ 	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+ 									   INT2OID, sizeof(int16), true, 's');
+ 		for (i = 0; i < foreignNKeys; i++)
+ 			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+ 		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+ 										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+ 		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+ 	if (confreftypeArray)
+ 		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+ 	else
+ 		nulls[Anum_pg_constraint_confreftype - 1] = true;
+ 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 0f08245a67..d14e6372e8 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7021,6 +7021,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+ 	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7028,10 +7029,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+ 	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+ 	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7108,6 +7111,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+ 	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7120,6 +7124,51 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_CASCADE))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions")));
+	}
+
+ 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7205,6 +7254,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+ 		 * If this is an array foreign key, we must look up the operators for
+ 		 * the array element type, not the array type itself.
+ 		 */
+ 		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			Oid			elemopclass;
+ 
+ 			/* We look through any domain here */
+ 			fktype = get_base_element_type(fktype);
+ 			if (!OidIsValid(fktype))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+ 								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktypoid[i]))));
+ 
+ 			/*
+ 			 * For the moment, we must also insist that the array's element
+ 			 * type have a default btree opclass that is in the index's
+ 			 * opfamily.  This is necessary because ri_triggers.c relies on
+ 			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+ 			 * on the array type, and we need those operations to have the
+ 			 * same notion of equality that we're using otherwise.
+ 			 *
+ 			 * XXX this restriction is pretty annoying, considering the effort
+ 			 * that's been put into the rest of the RI mechanisms to make them
+ 			 * work with nondefault equality operators.  In particular, it
+ 			 * means that the cast-to-PK-datatype code path isn't useful for
+ 			 * array-to-scalar references.
+ 			 */
+ 			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+ 			if (!OidIsValid(elemopclass) ||
+ 				get_opclass_family(elemopclass) != opfamily)
+ 			{
+ 				/* Get the index opclass's name for the error message. */
+ 				char	   *opcname;
+ 
+ 				cla_ht = SearchSysCache1(CLAOID,
+ 										 ObjectIdGetDatum(opclasses[i]));
+ 				if (!HeapTupleIsValid(cla_ht))
+ 					elog(ERROR, "cache lookup failed for opclass %u",
+ 						 opclasses[i]);
+ 				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+ 				opcname = pstrdup(NameStr(cla_tup->opcname));
+ 				ReleaseSysCache(cla_ht);
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+ 								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+ 								   format_type_be(fktype),
+ 								   opcname)));
+ 			}
+ 		}
+ 
+ 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7265,14 +7373,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+ 				errmsg("foreign key constraint \"%s\" cannot be implemented",
+ 					   fkconstraint->conname),
+ 					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+ 							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7303,6 +7409,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+ 			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+ 			{
+ 				old_fktype = get_base_element_type(old_fktype);
+ 				/* this shouldn't happen ... */
+ 				if (!OidIsValid(old_fktype))
+ 					elog(ERROR, "old foreign key column is not an array");
+ 			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7345,7 +7458,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7369,6 +7481,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+ 									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index da0850bfd6..68f06930f9 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+ 	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+ 		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 7ed16aeff4..8639854f4d 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3092,6 +3092,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 72041693df..544a69d0da 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2845,6 +2845,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+ 	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..d35f3d1d9a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+ 	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 5ce3c7c599..1a5b535877 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+ 			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7d0de99baf..1974625722 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+ 	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+ 
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+ 	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+ 				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+ 	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+ 	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3406,14 +3416,16 @@ ColConstraintElem:
 			| REFERENCES qualified_name opt_column_list key_match key_actions
 				{
 					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
+  					n->contype = CONSTR_FOREIGN;
+  					n->location = @1;
+  					n->pktable			= $2;
+ 					/* fk_attrs will be filled in by parse analysis */
+  					n->fk_attrs			= NIL;
+  					n->pk_attrs			= $3;
+ 					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
+  					n->fk_matchtype		= $4;
+  					n->fk_upd_action	= (char) ($5 >> 8);
+  					n->fk_del_action	= (char) ($5 & 0xFF);
 					n->skip_validation  = false;
 					n->initially_valid  = true;
 					$$ = (Node *)n;
@@ -3604,14 +3616,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+ 			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+ 				qualified_name opt_column_list key_match key_actions
+ 				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+ 					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3644,7 +3657,30 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
-
+ foreign_key_column_list:
+ 			foreign_key_column_elem
+ 				{ $$ = list_make1($1); }
+ 			| foreign_key_column_list ',' foreign_key_column_elem
+ 				{ $$ = lappend($1, $3); }
+ 		;
+ 
+ foreign_key_column_elem:
+ 			ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($1);
+ 					n->reftype = FKCONSTR_REF_PLAIN;
+ 					$$ = n;
+ 				}
+ 			| EACH ELEMENT OF ColId
+ 				{
+ 					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+ 					n->name = (Node *) makeString($4);
+ 					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+ 					$$ = n;
+ 				}
+ 		;
+ 
 key_match:  MATCH FULL
 			{
 				$$ = FKCONSTR_MATCH_FULL;
@@ -14655,6 +14691,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+ 			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15772,6 +15809,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+ 	ListCell   *lc;
+ 
+ 	*names = NIL;
+ 	*reftypes = NIL;
+ 	foreach(lc, fkcolelems)
+ 	{
+ 		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+ 
+ 		*names = lappend(*names, fkcolelem->name);
+ 		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+ 	}
+}
+ 
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index e95cee1ebf..fc320a988f 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1320,6 +1320,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ * 
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm. 
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+		
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.  
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 20586797cc..4da64b9385 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -744,6 +744,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+ 				/* grammar should have set fk_reftypes */
+ 				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..e13e75fba7 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,111 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+	
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this 
+	is handled within internal calls already (a property 
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..9efebe48f6 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+ 	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ 	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+ 		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+ 		 *
+ 		 * In case of an array ELEMENT foreign key, the previous query is used
+ 		 * to count the number of matching rows and see if every combination
+ 		 * is actually referenced.
+ 		 * The wrapping query is
+ 		 *	SELECT 1 WHERE
+ 		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+ 		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+ 		initStringInfo(&countbuf);
+ 		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+ 
+ 			/*
+ 			 * In case of an array ELEMENT foreign key, we check that each
+ 			 * distinct non-null value in the array is present in the PK
+ 			 * table.
+ 			 */
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+ 							paramname, fk_type,
+ 							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+ 		if (riinfo->has_array)
+		{
+ 			appendStringInfo(&countbuf,
+ 							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+ 							 querybuf.data);
+ 
+ 			/* Prepare and save the plan for array ELEMENT foreign keys */
+ 			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
+ 		}
+ 		else
+ 			/* Prepare and save the plan */
+ 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ 								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+ 							paramname, pk_type,
+ 							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+ 									attname, fk_type,
+ 									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+ 	 * In case of an array ELEMENT column, relname is replaced with the
+ 	 * following subquery:
+ 	 *
+ 	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+ 	 *	 FROM ONLY "public"."fk"
+ 	 *
+ 	 * where all the columns are renamed in order to prevent name collisions.
+ 	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ 		if (riinfo->has_array)
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+ 								 fkattname);
+ 			else
+ 				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+ 								 fkattname);
+ 		else
+ 			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+ 
+ 	if (riinfo->has_array)
+ 	{
+ 		sep = "";
+ 		appendStringInfo(&querybuf,
+ 						 " FROM (SELECT ");
+ 		for (i = 0; i < riinfo->nkeys; i++)
+ 		{
+ 			quoteOneName(fkattname,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+ 				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+ 								 sep, fkattname, i + 1, fkattname, i + 1);
+ 			else
+ 				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+ 								 i + 1);
+ 			sep = ", ";
+ 		}
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
+ 	}
+ 	else
+ 		appendStringInfo(&querybuf,
+ 						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+ 						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname + 3, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname + 3,
+ 						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+ 						fkattname, fk_type,
+ 						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ 		if (riinfo->has_array)
+ 			sprintf(fkattname, "k%d", i + 1);
+ 		else
+ 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2649,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @>> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+ 				const char *rightop, Oid rightoptype,
+ 				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,15 +2681,77 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+ 		Oid			oprright;
+ 		Oid			oprleft;
+	 	Oid			oprcommon;
+		
+		/* 
+		 * since the @>> operator has the array as
+		 * the first operand and the element as the second
+		 * operand we switch their places in the query 
+		 * i.e opright is oprleft and vice versar
+		 */
+		 
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/* compare the two array types and try to find 
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		oprright = get_base_element_type(oprcommon);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find element type for data type %s",
+							format_type_be(oprcommon))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
 
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>>) ");
+
+		appendStringInfoString(buf, leftop);
+		if (operform->oprleft != oprright)
+			ri_add_cast_to(buf, oprright);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+ 					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != operform->oprright)
+ 			ri_add_cast_to(buf, operform->oprright);
+	}
+	
 	ReleaseSysCache(opertup);
 }
 
@@ -2801,6 +2958,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+ 	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3037,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+ 							 Anum_pg_constraint_confreftype, &isNull);
+ 	if (isNull)
+ 		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+ 	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+ 	if (ARR_NDIM(arr) != 1 ||
+ 		ARR_DIMS(arr)[0] != numkeys ||
+ 		ARR_HASNULL(arr) ||
+ 		ARR_ELEMTYPE(arr) != CHAROID)
+ 		elog(ERROR, "confreftype is not a 1-D char array");
+ 	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+ 	if ((Pointer) arr != DatumGetPointer(adatum))
+ 		pfree(arr);				/* free de-toasted copy, if any */
+ 
+ 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3093,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+ 	/*
+ 	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+ 	 * indicating whether there's an array foreign key, and we want to set
+ 	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+ 	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+ 	 * in this module.  (If we did, substituting the array comparator at the
+ 	 * call point in ri_KeysEqual might be more appropriate.)
+ 	 */
+ 	riinfo->has_array = false;
+ 	for (i = 0; i < numkeys; i++)
+ 	{
+ 		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+ 		{
+ 			riinfo->has_array = true;
+ 			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+ 		}
+ 	}
+ 
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 43646d2c4f..4662cf5d56 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+ 				Datum		colindexes;
+ 				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_conkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+ 				reftypes = SysCacheGetAttr(CONSTROID, tup,
+ 										   Anum_pg_constraint_confreftype,
+ 										   &isnull);
+ 				if (isnull)
+ 					elog(ERROR, "null confreftype for constraint %u",
+ 						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+ 				decompile_fk_column_index_array(colindexes, reftypes,
+ 												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+ 				colindexes = SysCacheGetAttr(CONSTROID, tup,
+ 											 Anum_pg_constraint_confkey,
+ 											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+ 				decompile_column_index_array(colindexes,
+ 											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+ 								Datum fk_reftype_array,
+ 								Oid relId, StringInfo buf)
+ {
+ 	Datum	   *keys;
+ 	int			nKeys;
+ 	Datum	   *reftypes;
+ 	int			nReftypes;
+ 	int			j;
+ 
+ 	/* Extract data from array of int16 */
+ 	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ 					  INT2OID, sizeof(int16), true, 's',
+ 					  &keys, NULL, &nKeys);
+ 
+ 	/* Extract data from array of char */
+ 	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+ 					  CHAROID, sizeof(char), true, 'c',
+ 					  &reftypes, NULL, &nReftypes);
+ 
+ 	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+ 
+ 	for (j = 0; j < nKeys; j++)
+ 	{
+ 		char	   *colName;
+ 		const char *prefix;
+ 
+ 		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+ 
+ 		switch (DatumGetChar(reftypes[j]))
+ 		{
+ 			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+ 				break;
+ 			case FKCONSTR_REF_EACH_ELEMENT:
+ 				prefix = "EACH ELEMENT OF ";
+ 				break;
+ 			default:
+ 				elog(ERROR, "invalid fk_reftype: %d",
+ 					 (int) DatumGetChar(reftypes[j]));
+ 				prefix = NULL;	/* keep compiler quiet */
+ 				break;
+ 		}
+		 
+ 		if (j == 0)
+ 			appendStringInfo(buf, "%s%s", prefix,
+ 							 quote_identifier(colName));
+ 		else
+ 			appendStringInfo(buf, ", %s%s", prefix,
+ 							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..55a43d0b90 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,7 +689,8 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
-
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 )); /* anyarray @>> anyelem */
+   
 /*
  * btree enum_ops
  */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..bea6f82404 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+ 	 * If a foreign key, the reference semantics for each column
+ 	 */
+ 	char		confreftype[1];
+ 
+ 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+ 	 *
+ 	 * Note: for array foreign keys, all these operators are for the array's
+ 	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..06f4313bae 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+ 					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..7662ef8018 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+ 
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+ 	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 06f65293cb..f5bad57b70 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -68,6 +68,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..c0ebed4bb4
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,599 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..825c4894ce 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key element_foreign_key_performance cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..090db8eef1 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,8 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
+test: element_foreign_key_performance
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..31f5b81e4c
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,505 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- EACH-ELEMENT FK PERFORMANCE
+-- Define PKTABLEFORARRAYDELETE
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[], 
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE 
+    ON DELETE CASCADE 
+    ON UPDATE NO ACTION
+    );
+
+-- Create index on FKTABLEFORARRAYDELETE    
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+
+SELECT * FROM FKTABLEFORARRAYDELETE;
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @>> 5;
+
+EXPLAIN ANALYZE DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+
+SELECT * FROM FKTABLEFORARRAYDELETE;
\ No newline at end of file
#80Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#79)
2 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

GSoC 2017 has come to a close. These three months have proved
extremely beneficial, it was my first interaction with an open source
community and hopefully not my last.

In short, this patch allows each element in an array to act as a foreign
key, with the following syntax:
CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
CREATE TABLE FKTABLEFORARRAY ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF
ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );

The initial patch was written by Marco Nenciarini, Gabriele Bartolini and
Gianni Ciolli, and modified by Tom Lan.[2]/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan

The GSoC proposal was to overcome the performance issues that appear
whenever an UPDATE/DELETE was performed on the PK table; this fires a
Referential Integrity check on the FK table using sequential scan, which is
responsible for the performance issues.
We planned on replacing the sequential scan with an indexed scan under GIN
and to do that we introduced a new operator anyarray @>> anyelem that
returns true if the element is present in the array.

I'm proud to say that we have realised our initial goal, overcoming the
performance issues produced on RI checks for Foreign Key Arrays. Outlined
here [1]/messages/by-id/CAJvoCuv=EeXMs7My-8AKFf1WmvXO+M_ngUEP9B=7Xaxr4EqFeg@mail.gmail.com.
The benchmarking test showed exactly how much rewarding the use of the GIN
index has proven to be.[3]/messages/by-id/CAJvoCusMuLnYZUbwTBKt+p6bB9GwiTqF95OsQFHXixJj3LkxVQ@mail.gmail.com

Having accomplished the initial goals, I compiled a comprehensive
limitation check list and started to work on each limitation.
Here's a summary of Foreign Key Arrays limitations:

The limitations of the patch:

- Supported actions:
✔ UPDATE/DELETE NO ACTION
✔ UPDATE/DELETE RESTRICT
✔ DELETE CASCADE
✗ UPDATE CASCADE
✗ UPDATE/DELETE SET NULL
✗ UPDATE/DELETE SET DEFAULT

✗ Only one "ELEMENT" column allowed in a multi-column key

✗ undesirable dependency on default opclass semantics in the patch, which
is that it supposes it can use array_eq() to detect whether or not the
referencing column has changed. But I think that can be fixed without
undue pain by providing a refactored version of array_eq() that can be told
which element-comparison function to use

-- Attempted limitations
✗ presupposes that count(distinct y) has exactly the same notion of
equality that the PK unique index has. In reality, count(distinct) will
fall back to the default btree opclass for the array element type.

-- Resolved limitations

✔ fatal performance issues. If you issue any UPDATE or DELETE against the
PK table, you get a query like this for checking to see if the RI
constraint would be violated:
SELECT 1 FROM ONLY fktable x WHERE $1 = ANY (fkcol) FOR SHARE OF x;
Changed into SELECT 1 FROM ONLY fktable x WHERE $1 @> fkcol FOR SHARE OF x;

✔ coercion is now supported.
CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF
ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );

✔ supported DELTE CASCADE action
--
------------------------------------------------------------------------------------------------------------------------

The final patch v5 is attached here.
I also attached a diff file to highlight my changes to the old rebased
patch v3

Thank you, everyone, the Postgres community for your support.

Best Regards,
Mark Rofail

--
------------------------------------------------------------------------------------------------------------------------
[1]: /messages/by-id/CAJvoCuv=EeXMs7My-8AKFf1WmvXO+M_ngUEP9B=7Xaxr4EqFeg@mail.gmail.com
/messages/by-id/CAJvoCuv=EeXMs7My-8AKFf1WmvXO+M_ngUEP9B=7Xaxr4EqFeg@mail.gmail.com
[2]: /messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan
/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan
[3]: /messages/by-id/CAJvoCusMuLnYZUbwTBKt+p6bB9GwiTqF95OsQFHXixJj3LkxVQ@mail.gmail.com
/messages/by-id/CAJvoCusMuLnYZUbwTBKt+p6bB9GwiTqF95OsQFHXixJj3LkxVQ@mail.gmail.com

Attachments:

OriginalPatch_vs_NewPatch.difftext/plain; charset=US-ASCII; name=OriginalPatch_vs_NewPatch.diffDownload
diff --git a/home/mark/Dev/GSoC 2017/New Patches/Array-ELEMENT-foreign-key-v3-REBASED-42794d6.patch b/home/mark/Dev/GSoC 2017/Github repo/postgresql/Array-ELEMENT-foreign-key-v4.5.patch
index b125541d09..248a4c4623 100644
--- a/home/mark/Dev/GSoC 2017/New Patches/Array-ELEMENT-foreign-key-v3-REBASED-42794d6.patch	
+++ b/home/mark/Dev/GSoC 2017/Github repo/postgresql/Array-ELEMENT-foreign-key-v4.5.patch	
@@ -1,8 +1,8 @@
 diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
ref/create_table.sgml
@@ -199,13 +199,29 @@ index b15c19d3d0..c3fe34888e 100644
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+       Also concerning coercion while using the GIN index:
+      
+       <programlisting>
+        CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+        CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+       </programlisting>
+        This syntax is fine since this will cast ptest1 to int4 upon RI checks, however,        
+       
+       <programlisting>
+        CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+        CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+       </programlisting>
+        This syntax will cast ftest1 to int4 upon RI checks, thus defeating the purpose of the index.
+
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..2587cf9ccf 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,19 +95,35 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+		if (strategy != GinContainsElemStrategy){
+			array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+			get_typlenbyvalalign(ARR_ELEMTYPE(array),
+								 &elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+			deconstruct_array(array,
+							  ARR_ELEMTYPE(array),
+							  elmlen, elmbyval, elmalign,
+							  &elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
+			*nkeys = nelems;
+			*nullFlags = nulls;
+		}
+		else{
+			/*
+			 * since this function return a pointer to a
+			 * deconstructed array, there is nothing to do if
+			 * operand is a single element except to return
+			 * as is and configure the searchmode
+			 */
+
+			elems = PG_GETARG_POINTER(0);
+			*nkeys = 1;
+			*nullFlags = PG_ARGISNULL(0);
+		}
+
+		switch (strategy)
+		{
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
@@ -126,6 +143,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -171,6 +196,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +284,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c
index 7ceea7a741..ca8390a147 100644
--- a/src/backend/access/gin/ginscan.c
+++ b/src/backend/access/gin/ginscan.c
@@ -178,7 +178,22 @@ ginFillScanKey(GinScanOpaque so, OffsetNumber attnum,
 		if (i < nUserQueryValues)
 		{
 			/* set up normal entry using extractQueryFn's outputs */
-			queryKey = queryValues[i];
+
+			if (strategy == 5 && nQueryValues == 1)
+			{
+			/*
+			 * strategy 5 is GinContainsElemStrategy.
+			 * we are sure the strategy is GinContainsElemStrategy,
+			 * so take the datum directly without accessing an array
+			 * since it's an element not an array
+			 */
+				queryKey = queryValues;
+			}
+			else
+			{
+				queryKey = queryValues[i];
+			}
+
 			queryCategory = queryCategories[i];
 			isPartialMatch =
 				(ginstate->canPartialMatch[attnum - 1] && partial_matches)
 diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
 --- a/src/backend/commands/tablecmds.c
 +++ b/src/backend/commands/tablecmds.c
@@ -458,89 +602,90 @@ index bb00858ad1..dc18fd1eae 100644
		i++;
	}

-	/* Array foreign keys support only NO ACTION and RESTRICT actions */
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
 	if (has_array)
 	{
 		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
 			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
 			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
-			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_CASCADE))
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
-					 errmsg("array foreign keys support only NO ACTION and RESTRICT actions")));
+					 errmsg("array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions")));
 	}
 
- 	/*
+	/*
  	 * If the attribute list for the referenced table was omitted, lookup the
  	 * definition of the primary key and use it.  Otherwise, validate the
  	 * supplied attribute list.  In either case, discover the index OID and
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index e95cee1ebf..cf273e7c03 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1320,6 +1320,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..b2db8baffd 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,112 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
 diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
 --- a/src/backend/utils/adt/ri_triggers.c
 +++ b/src/backend/utils/adt/ri_triggers.c
-@@ -2586,14 +2682,32 @@ ri_GenerateQual(StringInfo buf,
+@@ -2586,14 +2681,81 @@ ri_GenerateQual(StringInfo buf,
  
  	nspname = get_namespace_name(operform->oprnamespace);
  
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 	{
- 		oprright = get_array_type(operform->oprright);
- 		if (!OidIsValid(oprright))
- 			ereport(ERROR,
- 					(errcode(ERRCODE_UNDEFINED_OBJECT),
- 					 errmsg("could not find array type for data type %s",
- 							format_type_be(operform->oprright))));
- 	}
- 	else
- 		oprright = operform->oprright;
- 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
+	appendStringInfo(buf, " %s %s", sep, leftop);
+	if (leftoptype != operform->oprleft)
+		ri_add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
 	appendStringInfoString(buf, oprname);
 	appendStringInfo(buf, ") %s", rightop);
 	if (rightoptype != operform->oprright)
 		ri_add_cast_to(buf, operform->oprright);
- 
-	appendStringInfo(buf, " OPERATOR(%s.%s) ",
- 					 quote_identifier(nspname), oprname);
- 
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoString(buf, "ANY (");
- 	appendStringInfoString(buf, rightop);
- 	if (rightoptype != oprright)
- 		ri_add_cast_to(buf, oprright);
- 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
- 		appendStringInfoChar(buf, ')');
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		/*
+		 * since the @>> operator has the array as
+		 * the first operand and the element as the second
+		 * operand we switch their places in the query
+		 * i.e opright is oprleft and vice versar
+		 */
+
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		oprright = get_base_element_type(oprcommon);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find element type for data type %s",
+							format_type_be(oprcommon))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>>) ");
+
+		appendStringInfoString(buf, leftop);
+		if (operform->oprleft != oprright)
+			ri_add_cast_to(buf, oprright);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+					 quote_identifier(nspname), oprname);
+
++		appendStringInfoString(buf, rightop);
++
++		if (rightoptype != operform->oprright)
++			ri_add_cast_to(buf, operform->oprright);
++	}
  
  	ReleaseSysCache(opertup);
  }
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..4e304a9fe4 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,6 +689,7 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 ));
 
 /*
  * btree enum_ops
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 06f65293cb..f5bad57b70 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -68,6 +68,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
 new file mode 100644
 --- /dev/null
 +++ b/src/test/regress/sql/element_foreign_key.sql
@@ -2242,6 +2927,10 @@ index 0000000000..8c1e4d9601
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
@@ -2251,10 +2940,6 @@ index 0000000000..8c1e4d9601
-CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
-DROP TABLE FKTABLEFORARRAY;
-CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
-DROP TABLE FKTABLEFORARRAY;
@@ -2361,6 +3046,31 @@ index 0000000000..8c1e4d9601
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
@@ -2604,3 +3302,87 @@ index 0000000000..8c1e4d9601
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @>> 5;
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
Array-ELEMENT-foreign-key-v5.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v5.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ef7054cf26..f16638dcda 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2322,7 +2322,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2367,6 +2377,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e9c2c49533..42eaa50c18 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -812,10 +812,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -839,6 +839,35 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+       Also concerning coercion while using the GIN index:
+      
+       <programlisting>
+        CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+        CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+       </programlisting>
+        This syntax is fine since this will cast ptest1 to int4 upon RI checks, however,        
+       
+       <programlisting>
+        CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+        CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+       </programlisting>
+        This syntax will cast ftest1 to int4 upon RI checks, thus defeating the purpose of the index.
+
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -901,7 +930,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -910,7 +940,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -922,6 +953,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -937,6 +970,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1876,6 +1964,16 @@ CREATE TABLE cities_ab_10000_to_100000
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index a5238c3af5..2587cf9ccf 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,19 +95,35 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+		if (strategy != GinContainsElemStrategy){
+			array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+			get_typlenbyvalalign(ARR_ELEMTYPE(array),
+								 &elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+			deconstruct_array(array,
+							  ARR_ELEMTYPE(array),
+							  elmlen, elmbyval, elmalign,
+							  &elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
+			*nkeys = nelems;
+			*nullFlags = nulls;
+		}
+		else{
+			/*
+			 * since this function return a pointer to a
+			 * deconstructed array, there is nothing to do if
+			 * operand is a single element except to return
+			 * as is and configure the searchmode
+			 */
+
+			elems = PG_GETARG_POINTER(0);
+			*nkeys = 1;
+			*nullFlags = PG_ARGISNULL(0);
+		}
+
+		switch (strategy)
+		{
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
@@ -126,6 +143,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -171,6 +196,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +284,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c
index 7ceea7a741..ca8390a147 100644
--- a/src/backend/access/gin/ginscan.c
+++ b/src/backend/access/gin/ginscan.c
@@ -178,7 +178,22 @@ ginFillScanKey(GinScanOpaque so, OffsetNumber attnum,
 		if (i < nUserQueryValues)
 		{
 			/* set up normal entry using extractQueryFn's outputs */
-			queryKey = queryValues[i];
+
+			if (strategy == 5 && nQueryValues == 1)
+			{
+			/*
+			 * strategy 5 is GinContainsElemStrategy.
+			 * we are sure the strategy is GinContainsElemStrategy,
+			 * so take the datum directly without accessing an array
+			 * since it's an element not an array
+			 */
+				queryKey = queryValues;
+			}
+			else
+			{
+				queryKey = queryValues[i];
+			}
+
 			queryCategory = queryCategories[i];
 			isPartialMatch =
 				(ginstate->canPartialMatch[attnum - 1] && partial_matches)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 45ee9ac8b9..3fe6b1b247 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2100,6 +2100,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c7b2f031f0..db7978ec45 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1213,6 +1213,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..924affcdcd 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 0f08245a67..fbd9756194 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7021,6 +7021,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7028,10 +7029,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7108,6 +7111,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7120,6 +7124,51 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_CASCADE))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7205,6 +7254,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			Oid			elemopclass;
+
+			/* We look through any domain here */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7265,14 +7373,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7303,6 +7409,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7345,7 +7458,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7369,6 +7481,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index da0850bfd6..2151eea371 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 7ed16aeff4..8639854f4d 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3092,6 +3092,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 72041693df..dc34cfe6bc 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2845,6 +2845,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d92c03633..8026f9f8c8 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2575,6 +2575,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 5ce3c7c599..916ccbf483 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3490,6 +3490,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7d0de99baf..a4c49bf78c 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3409,8 +3419,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3604,14 +3616,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3644,6 +3657,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -14655,6 +14691,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15772,6 +15809,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index e95cee1ebf..cf273e7c03 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1320,6 +1320,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 20586797cc..7dc6bc3418 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -744,6 +744,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 34dadd6e19..b2db8baffd 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4232,6 +4232,112 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..765da69d8e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+		initStringInfo(&countbuf);
+		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for array ELEMENT foreign keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+		if (riinfo->has_array)
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+								 fkattname);
+			else
+				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+								 fkattname);
+		else
+			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		sep = "";
+		appendStringInfo(&querybuf,
+						 " FROM (SELECT ");
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+								 sep, fkattname, i + 1, fkattname, i + 1);
+			else
+				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+								 i + 1);
+			sep = ", ";
+		}
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname + 3, "k%d", i + 1);
+		else
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname, "k%d", i + 1);
+		else
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2649,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @>> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,14 +2681,81 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		/*
+		 * since the @>> operator has the array as
+		 * the first operand and the element as the second
+		 * operand we switch their places in the query
+		 * i.e opright is oprleft and vice versar
+		 */
+
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		oprright = get_base_element_type(oprcommon);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find element type for data type %s",
+							format_type_be(oprcommon))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>>) ");
+
+		appendStringInfoString(buf, leftop);
+		if (operform->oprleft != oprright)
+			ri_add_cast_to(buf, oprright);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2801,6 +2963,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3042,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3098,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 43646d2c4f..1a5143300f 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index f850be490a..4e304a9fe4 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,6 +689,7 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 ));
 
 /*
  * btree enum_ops
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..a6b296d4a0 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for array foreign keys, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..9805ed220a 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index ffabc2003b..8a9d616d29 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 8b33b4e0ea..01b207d363 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4308,6 +4308,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5f2a4a75da..77c31c9b48 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 06f65293cb..f5bad57b70 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -68,6 +68,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..2d19fa6abd
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,703 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,2}       |      2
+ {3,5,2,5}   |      3
+ {3,4,4}     |      4
+ {3,5,4,1,3} |      5
+ {1}         |      6
+ {5,1}       |      7
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+ {3,4,5,3}   |     10
+(10 rows)
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {3,2}       |      2
+ {3,4,4}     |      4
+ {1}         |      6
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index fcf8bd7565..25ef369951 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1811,6 +1811,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1878,7 +1879,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index eefdeeacae..d88ff3772c 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..7c0e84e2a5
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,549 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @>> 5;
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
#81Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#80)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

As pointed out by the CI, created by Thomas Munro, the btree_gin regression
tests fail when running "make check-world"
https://travis-ci.org/postgresql-cfbot/postgresql/builds/274732512

The full backtrace can be found here: https://pastebin.com/5q3SG8kV.

The error originates from src/backend/access/gin/ginscan.c:182, where the
following if condition if (strategy == 5 && nQueryValues == 1) returns
false postivies .

The if condition is necessary since it decides whether "the queryKey" variable
is a single element or the first cell of an array. The logic behind the if
condition is as follows: since we defined GinContainsElemStrategy to be
strategy number 5. are sure the strategy is GinContainsElemStrategy.
The if condition needs to be more precise but can't find a common attribute
to check within the ginFillScanKey() function.

If someone can take a look. I can use some help with this.

I also worked in another direction. Since there was a lot of modifications
in the code to support taking an element instead of an array and this is
the source of many conflicts. I tried going back to the old RI query:
SELECT 1 FROM ONLY fktable x WHERE ARRAY[$1] <@ fkcol FOR SHARE OF x;

instead of
SELECT 1 FROM ONLY fktable x WHERE $1 @> fkcol FOR SHARE OF x;

We were worried about the decrease in performance caused by creating a new
array with every check So I put it to the test and here are the results:
https://pastebin.com/carj9Bur
note: v5 is with SELECT 1 FROM ONLY fktable x WHERE $1 @> fkcol FOR SHARE
OF x;
and v5.1 is with SELECT 1 FROM ONLY fktable x WHERE ARRAY[$1] <@ fkcol FOR
SHARE OF x;

As expected it led to a decrease in performance, but I think it is
forgivable.
Now all the contrib regression tests pass.

To summarise, we can fix the old if condition or neglect the decrease in
performance encountered when going back to the old RI query.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v5.1.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v5.1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 9af77c1f5a..67c1490bda 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2322,7 +2322,17 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
-      <entry><structfield>conpfeqop</structfield></entry>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
+     <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
       <entry>If a foreign key, list of the equality operators for PK = FK comparisons</entry>
@@ -2367,6 +2377,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array-vs-scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+ <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..75da196334 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a
+    referencing column which is an array of elements with
+    the same type (or a compatible one) as the referenced
+    column in the related table. This feature is called
+    <firstterm>array element foreign key</firstterm> and is implemented
+    in PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>,
+    as described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text,
+    ...
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day DATE,
+    ...
+    final_positions integer[] <emphasis>ELEMENT REFERENCES drivers</emphasis>
+);
+</programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>)
+    to store the results of a race: for each of its elements
+    a referential integrity check is enforced on the
+    <literal>drivers</literal> table.
+    Note that <literal>ELEMENT REFERENCES</literal> is an extension
+    of PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    Even though the most common use case for array <literal>ELEMENT</literal>
+    foreign keys is on a single column key, you can define an <quote>array
+    <literal>ELEMENT</literal> foreign key constraint</quote> on a group
+    of columns. As the following example shows, it must be written in table
+    constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, ELEMENT moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+    On top of standard foreign key requirements,
+    array <literal>ELEMENT</literal> foreign key constraints
+    require that the referencing column is an array of a compatible
+    type of the corresponding referenced column.
+   </para>
+
+   <para>
+    For more detailed information on array <literal>ELEMENT</literal>
+    foreign key options and special cases, please refer to the documentation
+    for <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 824253de40..738329da29 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -834,10 +834,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -861,6 +861,35 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+       In case the column name <replaceable class="parameter">column</replaceable>
+       is prepended with the <literal>ELEMENT</literal> keyword and <replaceable
+       class="parameter">column</replaceable> is an array of elements compatible
+       with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+       in <replaceable class="parameter">reftable</replaceable>, an
+       array <literal>ELEMENT</literal> foreign key constraint is put in place
+       (see <xref linkend="sql-createtable-element-foreign-key-constraints">
+       for more information).
+       Multi-column keys with more than one <literal>ELEMENT</literal> column
+       are currently not allowed.
+
+       It is advisable to index the refrencing column using GIN index as it considerably enhances the performance.
+       Also concerning coercion while using the GIN index:
+      
+       <programlisting>
+        CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+        CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+       </programlisting>
+        This syntax is fine since this will cast ptest1 to int4 upon RI checks, however,        
+       
+       <programlisting>
+        CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+        CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+       </programlisting>
+        This syntax will cast ftest1 to int4 upon RI checks, thus defeating the purpose of the index.
+
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -923,7 +952,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -932,7 +962,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -944,6 +975,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -959,6 +992,61 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>ELEMENT REFERENCES</literal> definition specifies
+      an <quote>array <literal>ELEMENT</literal> foreign key</quote>,
+      a special kind of foreign key
+      constraint requiring the referencing column to be an array of elements
+      of the same type (or a compatible one) as the referenced column
+      in the referenced table. The value of each element of the
+      <replaceable class="parameter">refcolumn</replaceable> array
+      will be matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with <literal>ELEMENT</literal> foreign keys, modifications
+      in the referenced column can trigger actions to be performed on
+      the referencing array.
+      Similarly to standard foreign keys, you can specify these
+      actions using the <literal>ON DELETE</literal> and
+      <literal>ON UPDATE</literal> clauses.
+      However, only the two following actions for each clause are
+      currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1905,6 +1993,16 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> foreign keys and the
+    <literal>ELEMENT REFERENCES</literal> clause
+    are a <productname>PostgreSQL</productname> extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 05e70818e7..4677c94d8e 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2124,6 +2124,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c7b2f031f0..db7978ec45 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1213,6 +1213,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..924affcdcd 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 96354bdee5..6116999df9 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7103,6 +7103,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7110,10 +7111,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7190,6 +7193,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7202,6 +7206,51 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_CASCADE))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7287,6 +7336,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			Oid			elemopclass;
+
+			/* We look through any domain here */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7347,14 +7455,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7385,6 +7491,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7427,7 +7540,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7451,6 +7563,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 269c9e17dd..e4d08e3889 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -635,6 +635,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1006,6 +1007,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1035,7 +1037,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1174,6 +1179,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 7ed16aeff4..8639854f4d 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3092,6 +3092,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index f1bed14e2b..26e2d3da94 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2847,6 +2847,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8b56b9146a..581bf601ce 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2576,6 +2576,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index b83d919e40..100f6fb570 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3492,6 +3492,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index c303818c9b..5adeb61d99 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3438,8 +3448,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3633,14 +3645,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3673,6 +3686,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -14684,6 +14720,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15801,6 +15838,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index e79ad26e71..108c997ed9 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1320,6 +1320,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 655da02c10..456a2cb76e 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -744,6 +744,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..8800fba4a5 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+		initStringInfo(&countbuf);
+		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for array ELEMENT foreign keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+		if (riinfo->has_array)
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+								 fkattname);
+			else
+				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+								 fkattname);
+		else
+			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		sep = "";
+		appendStringInfo(&querybuf,
+						 " FROM (SELECT ");
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+								 sep, fkattname, i + 1, fkattname, i + 1);
+			else
+				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+								 i + 1);
+			sep = ", ";
+		}
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname + 3, "k%d", i + 1);
+		else
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname, "k%d", i + 1);
+		else
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2649,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,14 +2681,67 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>) ");
+
+		appendStringInfo(buf, " ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2801,6 +2949,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3028,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3084,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 0ea5078218..93140cf267 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..a6b296d4a0 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for array foreign keys, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..9805ed220a 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index f3e4c69753..dcce78f8cb 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2075,6 +2075,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2110,6 +2114,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 06f65293cb..f5bad57b70 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -68,6 +68,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..0a2996bec3
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,703 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,2}       |      2
+ {3,5,2,5}   |      3
+ {3,4,4}     |      4
+ {3,5,4,1,3} |      5
+ {1}         |      6
+ {5,1}       |      7
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+ {3,4,5,3}   |     10
+(10 rows)
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {3,2}       |      2
+ {3,4,4}     |      4
+ {1}         |      6
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 2fd3f2b1b1..fdd6720fb8 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..17ef03760f
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,549 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @> ARRAY[5];
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
#82Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#81)
Re: GSoC 2017: Foreign Key Arrays

I have not looked at the issue with the btree_gin tests yet, but here is
the first part of my review.

= Review

This is my first quick review where I just read the documentation and
quickly tested the feature. I will review it more in-depth later.

This is a very useful feature, one which I have a long time wished for.

The patch applies, compiles and passes the test suite with just one warning.

parse_coerce.c: In function ‘select_common_type_2args’:
parse_coerce.c:1379:7: warning: statement with no effect [-Wunused-value]
rightOid;
^~~~~~~~

= Functional

The documentation does not agree with the code on the syntax. The
documentation claims it is "FOREIGN KEY (ELEMENT xs) REFERENCES t1 (x)"
when it actually is "FOREIGN KEY (EACH ELEMENT OF xs) REFERENCES t1 (x)".

Likewise I can't get the "final_positions integer[] ELEMENT REFERENCES
drivers" syntax to work, but here I cannot see any change in the syntax
to support it.

Related to the above: I am not sure if it is a good idea to make ELEMENT
a reserved word in column definitions. What if the SQL standard wants to
use it for something?

The documentation claims ON CASCADE DELETE is not supported by array
element foreign keys, but I do not think that is actually the case.

I think I prefer (EACH ELEMENT OF xs) over (ELEMENT xs) given how the
former is more in what I feel is the spirit of SQL. And if so we should
match it as "xs integer[] EACH ELEMENT REFERENCES t1 (x)", assuming we
want that syntax.

Once I have created an array element foreign key the basic features seem
to work as expected.

The error message below fails to mention that it is an array element
foreign key, but I do not think that is not a blocker for getting this
feature merged. Right now I cannot think of how to improve it either.

$ INSERT INTO t3 VALUES ('{1,3}');
ERROR: insert or update on table "t3" violates foreign key constraint
"t3_xs_fkey"
DETAIL: Key (xs)=({1,3}) is not present in table "t1".

= Nitpicking/style comments

In doc/src/sgml/catalogs.sgml the
"<entry><structfield>conpfeqop</structfield></entry>" line is
incorrectly indented.

I am not fan of calling it "array-vs-scalar". What about array to scalar?

In ddl.sgml date should be lower case like the other types in "race_day
DATE,".

In ddl.sgml I suggest removing the "..." from the examples to make it
possible to copy paste them easily.

Your text wrapping in ddl.sqml and create_table.sgqml is quite
arbitrary. I suggest wrapping all paragraphs at 80 characters (except
for code which should not be wrapped). Your text editor probably has
tools for wrapping paragraphs.

Please be consistent about how you write table names and SQL in general.
I think almost all places use lower case for table names, while your
examples in create_table.sgml are FKTABLEFORARRAY.

Andreas

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#83Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#82)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

Thank you for the review.

Please find the new patch here, with your comments taken into consideration.

However, the following comment "Related to the above: I am not sure if it
is a good idea to make ELEMENT a reserved word in column definitions. What
if the SQL standard wants to use it for something?
I think I prefer (EACH ELEMENT OF xs) over (ELEMENT xs) given how the
former is more in what I feel is the spirit of SQL. And if so we should
match it as "xs integer[] EACH ELEMENT REFERENCES t1 (x)", assuming we want
that syntax." is outside my area of expertise. The original authors should
take a look at it (Tom Lane and Marco). They had a whole discussion on the
matter, here.
/messages/by-id/6256.1350613614@sss.pgh.pa.us

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v5.2.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v5.2.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 9af77c1f5a..13a0314552 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2322,6 +2322,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
      </row>
 
      <row>
+       <entry><structfield>confreftype</structfield></entry>
+       <entry><type>char[]</type></entry>
+       <entry></entry>
+       <entry>If a foreign key, the reference semantics for each column:
+         <literal>p</> = plain (simple equality),
+         <literal>e</> = each element of referencing array must have a match
+       </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</></entry>
@@ -2367,13 +2377,18 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
   </table>
 
   <para>
-   In the case of an exclusion constraint, <structfield>conkey</structfield>
-   is only useful for constraint elements that are simple column references.
-   For other cases, a zero appears in <structfield>conkey</structfield>
-   and the associated index must be consulted to discover the expression
-   that is constrained.  (<structfield>conkey</structfield> thus has the
-   same contents as <structname>pg_index</>.<structfield>indkey</> for the
-   index.)
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+  <para>
+    In the case of an exclusion constraint, <structfield>conkey</structfield> is
+    only useful for constraint elements that are simple column references. For
+    other cases, a zero appears in <structfield>conkey</structfield> and the
+    associated index must be consulted to discover the expression that is
+    constrained. (<structfield>conkey</structfield> thus has the same contents
+    as <structname>pg_index</>.<structfield>indkey</> for the index.)
   </para>
 
   <note>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b05a9c2150..19868a07d0 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,108 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array ELEMENT Foreign Keys</title>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+     Another option you have with foreign keys is to use a referencing column
+     which is an array of elements with the same type (or a compatible one) as
+     the referenced column in the related table. This feature is called
+     <firstterm>array element foreign key</firstterm> and is implemented in
+     PostgreSQL with <firstterm>ELEMENT foreign key constraints</firstterm>, as
+     described in the following example:
+
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text
+);
+
+CREATE TABLE races (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day date,
+    final_positions integer[],
+    FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+);
+</programlisting>
+
+     The above example uses an array (<literal>final_positions</literal>) to
+     store the results of a race: for each of its elements a referential
+     integrity check is enforced on the <literal>drivers</literal> table. Note
+     that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+     PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+     Even though the most common use case for array <literal>ELEMENT</literal>
+     foreign keys is on a single column key, you can define an <quote>array
+     <literal>ELEMENT</literal> foreign key constraint</quote> on a group of
+     columns. As the following example shows, it must be written in table
+     constraint form:
+
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+
+     On top of standard foreign key requirements, array
+     <literal>ELEMENT</literal> foreign key constraints require that the
+     referencing column is an array of a compatible type of the corresponding
+     referenced column.
+   </para>
+
+   <para>
+     For more detailed information on array <literal>ELEMENT</literal> foreign
+     key options and special cases, please refer to the documentation for <xref
+     linkend="sql-createtable-foreign-key"> and 
+     <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 1477288851..f40eefb019 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="PARAMETER">index_parameters</replaceable> |
-  REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ELEMENT] REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -76,7 +76,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) <replaceable class="PARAMETER">index_parameters</replaceable> |
   EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable> WITH <replaceable class="parameter">operator</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replaceable> [ WHERE ( <replaceable class="parameter">predicate</replaceable> ) ] |
-  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
+  FOREIGN KEY ( [ELEMENT] <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -833,10 +833,10 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -860,6 +860,37 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
      </para>
 
      <para>
+        In case the column name <replaceable
+        class="parameter">column</replaceable> is prepended with the
+        <literal>ELEMENT</literal> keyword and <replaceable
+        class="parameter">column</replaceable> is an array of elements
+        compatible with the corresponding <replaceable
+        class="parameter">refcolumn</replaceable> in <replaceable
+        class="parameter">reftable</replaceable>, an array
+        <literal>ELEMENT</literal> foreign key constraint is put in place (see
+        <xref linkend="sql-createtable-element-foreign-key-constraints"> for
+        more information). Multi-column keys with more than one
+        <literal>ELEMENT</literal> column are currently not allowed.
+
+        It is advisable to index the refrencing column using GIN index as it
+        considerably enhances the performance. Also concerning coercion while
+        using the GIN index:
+       
+        <programlisting>
+        CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+        CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+       </programlisting>
+        This syntax is fine since this will cast ptest1 to int4 upon RI checks, however,        
+       
+       <programlisting>
+        CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+        CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+       </programlisting>
+         This syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+         purpose of the index.
+      </para>
+ 
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -922,7 +953,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -931,7 +963,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -943,6 +976,8 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -958,6 +993,67 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="ELEMENT REFERENCES">
+    <term><literal>ELEMENT REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+       The <literal>ELEMENT REFERENCES</literal> definition specifies an
+       <quote>array <literal>ELEMENT</literal> foreign key</quote>, a special
+       kind of foreign key constraint requiring the referencing column to be an
+       array of elements of the same type (or a compatible one) as the
+       referenced column in the referenced table. The value of each element of
+       the <replaceable class="parameter">refcolumn</replaceable> array will be
+       matched against some row of <replaceable
+       class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Array <literal>ELEMENT</literal> foreign keys are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+       Even with <literal>ELEMENT</literal> foreign keys, modifications in the
+       referenced column can trigger actions to be performed on the referencing
+       array. Similarly to standard foreign keys, you can specify these actions
+       using the <literal>ON DELETE</literal> and <literal>ON UPDATE</literal>
+       clauses. However, only the following actions for each clause are
+       currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1904,6 +2000,16 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a <productname>PostgreSQL</productname>
+     extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 05e70818e7..4677c94d8e 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2124,6 +2124,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c7b2f031f0..db7978ec45 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1213,6 +1213,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1336c46d3f..924affcdcd 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 563bcda30c..aa43c552c5 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7103,6 +7103,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7110,10 +7111,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7190,6 +7193,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7202,6 +7206,51 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_CASCADE))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7287,6 +7336,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			Oid			elemopclass;
+
+			/* We look through any domain here */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7347,14 +7455,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 			ereport(ERROR,
 					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+					 errdetail("Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s.",
 							   strVal(list_nth(fkconstraint->fk_attrs, i)),
 							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
+							   format_type_be(fktypoid[i]),
 							   format_type_be(pktype))));
 
 		if (old_check_ok)
@@ -7385,6 +7491,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7427,7 +7540,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7451,6 +7563,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index e75a59d299..8e2a482dd3 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
-			pk_attrs = lappend(pk_attrs, arg);
+			{
+				pk_attrs = lappend(pk_attrs, arg);
+				fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+			}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 7ed16aeff4..8639854f4d 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3092,6 +3092,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index f1bed14e2b..26e2d3da94 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2847,6 +2847,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8b56b9146a..581bf601ce 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2576,6 +2576,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index b83d919e40..100f6fb570 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3492,6 +3492,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index c303818c9b..5adeb61d99 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -392,7 +402,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -622,8 +632,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3438,8 +3448,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3633,14 +3645,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3673,6 +3686,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -14684,6 +14720,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15801,6 +15838,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index e79ad26e71..4722a1bf79 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1320,6 +1320,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 27e568fc62..a59b213ad2 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -745,6 +745,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index c2891e6fa1..8800fba4a5 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,22 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+		initStringInfo(&countbuf);
+		appendStringInfo(&countbuf, "SELECT 1 WHERE ");
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +435,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for array ELEMENT foreign keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +596,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +789,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1013,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1170,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1350,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1517,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1694,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1861,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2053,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2373,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2392,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+		if (riinfo->has_array)
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+								 fkattname);
+			else
+				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+								 fkattname);
+		else
+			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		sep = "";
+		appendStringInfo(&querybuf,
+						 " FROM (SELECT ");
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+								 sep, fkattname, i + 1, fkattname, i + 1);
+			else
+				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+								 i + 1);
+			sep = ", ";
+		}
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2445,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname + 3, "k%d", i + 1);
+		else
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2470,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname, "k%d", i + 1);
+		else
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2649,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,14 +2681,67 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>) ");
+
+		appendStringInfo(buf, " ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+
+		appendStringInfo(buf, " OPERATOR(%s.%s) ",
+					 quote_identifier(nspname), oprname);
+
+		appendStringInfoString(buf, rightop);
+
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2801,6 +2949,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3028,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3084,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for array foreign keys.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 84759b6149..3b5520ddf1 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1882,7 +1885,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1890,13 +1894,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1904,13 +1916,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2185,6 +2199,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..a6b296d4a0 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for array foreign keys, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index a4c46897ed..9805ed220a 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index f3e4c69753..dcce78f8cb 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2075,6 +2075,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2110,6 +2114,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 06f65293cb..f5bad57b70 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -68,6 +68,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..0a2996bec3
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,703 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,2}       |      2
+ {3,5,2,5}   |      3
+ {3,4,4}     |      4
+ {3,5,4,1,3} |      5
+ {1}         |      6
+ {5,1}       |      7
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+ {3,4,5,3}   |     10
+(10 rows)
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {3,2}       |      2
+ {3,4,4}     |      4
+ {1}         |      6
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 2fd3f2b1b1..fdd6720fb8 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -103,7 +103,7 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key element_foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
 # ----------
 # Another group of parallel tests
 # NB: temp.sql does a reconnect which transiently uses 2 connections,
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..9cb8638b4e 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..17ef03760f
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,549 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test ELEMENT foreign keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the foreign table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @> ARRAY[5];
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
#84Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#83)
Re: GSoC 2017: Foreign Key Arrays

Sorry for the very late review.

I like this feature and have needed it myself in the past, and the
current syntax seems pretty good. One could argue for if the syntax
could be generalized to support other things like json and hstore, but I
do not think it would be fair to block this patch due to that.

== Limitations of the current design

1) Array element foreign keys can only be specified at the table level
(not at columns): I think this limitation is fine. Other PostgreSQL
specific features like exclusion contraints can also only be specified
at the table level.

2) Lack of support for SET NULL and SET DEFAULT: these do not seem very
useful for arrays.

3) Lack of support for specifiying multiple arrays in the foreign key:
seems like a good thing to me since it is not obvious what such a thing
even would do.

4) That you need to add a cast to the index if you have different types:
due to there not being a int4[] <@ int2[] operator you need to add an
index on (col::int4[]) to speed up deletes and updates. This one i
annoying since EXPLAIN wont give you the query plans for the foreign key
queries, but I do not think fixing this should be within the scope of
the patch and that having a smaller interger in the referring table is rare.

5) The use of count(DISTINCT) requiring types to support btree equality:
this has been discussed a lot up-thread and I think the current state is
good enough.

== Functional review

I have played around some with it and things seem to work and the test
suite passes, but I noticed a couple of strange behaviors.

1) MATCH FULL does not seem to care about NULLS in arrays. In the
example below I expected both inserts into the referring table to fail.

CREATE TABLE t (x int, y int, PRIMARY KEY (x, y));
CREATE TABLE fk (x int, ys int[], FOREIGN KEY (x, EACH ELEMENT OF ys)
REFERENCES t MATCH FULL);
INSERT INTO t VALUES (10, 1);
INSERT INTO fk VALUES (10, '{1,NULL}');
INSERT INTO fk VALUES (NULL, '{1}');

CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
ERROR: insert or update on table "fk" violates foreign key constraint
"fk_x_fkey"
DETAIL: MATCH FULL does not allow mixing of null and nonnull key values.

2) To me it was not obvious that ON DELETE CASCADE would delete the
whole rows rather than delete the members from the array, and this kind
of misunderstanding can lead to pretty bad surprises in production. I am
leaning towards not supporting CASCADE.

== The @>> operator

A previous version of your patch added the "anyelement <<@ anyarray"
operator to avoid having to build arrays, but that part was reverted due
to a bug.

I am not expert on the gin code, but as far as I can tell it would be
relatively simple to fix that bug. Just allocate an array of Datums of
length one where you put the element you are searching for (or maybe a
copy of it).

Potential issues with adding the operators:

1) Do we really want to add an operator just for array element foreign
keys? I think this is not an issue since it seems like it should be
useful in general. I know I have wanted it myself.

2) I am not sure, but the committers might prefer if adding the
operators is done in a separate patch.

3) Bikeshedding about operator names. I personally think @>> is clear
enough and as far as I know it is not used for anything else.

== Code review

The patch no longer applies to HEAD, but the conflicts are small.

I think we should be more consistent in the naming, both in code and in
the documentation. Right now we have "array foreign keys", "element
foreign keys", "ELEMENT foreign keys", etc.

+       /*
+        * If this is an array foreign key, we must look up the 
operators for
+        * the array element type, not the array type itself.
+        */
+       if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+           if (fkreftypes[i] != FKCONSTR_REF_PLAIN)
+           {
+               old_fktype = get_base_element_type(old_fktype);
+               /* this shouldn't happen ... */
+               if (!OidIsValid(old_fktype))
+                   elog(ERROR, "old foreign key column is not an array");
+           }
+       if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+       {
+           riinfo->has_array = true;
+           riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+       }

In the three diffs above it would be much cleaner to check for "==
FKCONSTR_REF_EACH_ELEMENT" since that better conveys the intent and is
safer for adding new types in the future.

+           /* We look through any domain here */
+           fktype = get_base_element_type(fktype);

What does the comment above mean?

         if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
             ereport(ERROR,
                     (errcode(ERRCODE_DATATYPE_MISMATCH),
-                    errmsg("foreign key constraint \"%s\" "
-                           "cannot be implemented",
-                           fkconstraint->conname),
-                    errdetail("Key columns \"%s\" and \"%s\" "
-                              "are of incompatible types: %s and %s.",
+               errmsg("foreign key constraint \"%s\" cannot be 
implemented",
+                      fkconstraint->conname),
+                    errdetail("Key columns \"%s\" and \"%s\" are of 
incompatible types: %s and %s.",
                                strVal(list_nth(fkconstraint->fk_attrs, i)),
                                strVal(list_nth(fkconstraint->pk_attrs, i)),
-                              format_type_be(fktype),
+                              format_type_be(fktypoid[i]),
                                format_type_be(pktype))));

The above diff looks like pointless code churn which possibly introduces
a bug in how it changed fktype to fktypoid[i].

I think the code in RI_Initial_Check() would be cleaner if you used
"CROSS JOIN LATERAL unnest(col)" rather than having unnest() in the
target list. This way you would not need to rename all columns and the
code paths for the array case could look more like the code path for the
normal case.

== Minor things in the code

+           {
+               pk_attrs = lappend(pk_attrs, arg);
+               fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+           }

This is incorrectly indented.

I suggest that you should only allocate countbuf in RI_FKey_check() if
has_array is set.

I think the code would be more readable if both branches of
ri_GenerateQual() used the same pattern for whitespace so the
differences are easier to spot.

You can use DROP TABLE IF EXISTS to silence the "ERROR: table
"fktableforarray" does not exist" errors.

I am not sure that you need to test all combinations of ON UPDATE and ON
DELETE. I think it should be enough to test one of each ON UPDATE and
one of each ON DELETE should be enough.

+-- Create the foreign table

It is probably a bad idea to call the referencing table the foreign table.

+-- Repeat a similar test using INT4 keys coerced from INT2

This comment is repeated twice in the test suite.

== Documentation

Remove the ELEMENT REFERENCES form from
doc/src/sgml/ref/create_table.sgml since we no longer support it.

- FOREIGN KEY ( <replaceable
class="parameter">column_name</replaceable> [, ... ] ) REFERENCES
<replaceable class="parameter">reftable</replaceable> [ ( <replaceable
class="parameter">refcolumn</replaceable> [, ... ] ) ]
+ FOREIGN KEY ( [ELEMENT] <replaceable
class="parameter">column_name</replaceable> [, ... ] ) REFERENCES
<replaceable class="parameter">reftable</replaceable> [ ( <replaceable
class="parameter">refcolumn</replaceable> [, ... ] ) ]

Change this to "FOREIGN KEY ( [EACH ELEMENT OF] ...".

-   <term><literal>FOREIGN KEY ( <replaceable 
class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [ELEMENT] <replaceable 
class="parameter">column_name</replaceable> [, ... ] )

Change this to "... FOREIGN KEY ( [EACH ELEMENT OF] ...".

+ <literal>ELEMENT</literal> keyword and <replaceable

Change this to "... <literal>EACH ELEMENT OF</literal> ...". Maybe you
should also fix other instances of ELEMENT in the same paragraph but
these are less obvious.

You should remove the "ELEMENT REFERENCES" section of
doc/src/sgml/ref/create_table.sgml, and move any still relevant bits
elsewhere since we do not support this syntax.

The sql-createtable-foreign-key-arrays section need to be updated to
remove references to "ELEMENT REFERENCES".

Your indentation in doc/src/sgml/catalogs.sgml is two spaces but the
rest of the file looks like it uses 1 space indentation. Additionally
you seem to have accidentally reindented something which was correctly
indented.

Same with the idnentation in doc/src/sgml/ddl.sgml and
doc/src/sgml/ref/create_table.sgml.

-   <varlistentry>
+  <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">

You have accidentally reindented this in doc/src/sgml/ref/create_table.sgml.

The paragraph in doc/src/sgml/ref/create_table.sgml which starts with
"In case the column name" seems to actually be multiple paragraphs. Is
that intentional or a mistake?

The documentation in doc/src/sgml/ddl.sgml mentions that "it must be
written in table constraint form" for when you have multiple columns,
but I feel this is just redundant and confusing since this is always
true, both for array foreign keys and for when you have multiple columns.

The documentation in doc/src/sgml/ddl.sgml should mention that we only
support one array reference per foreign key.

Maybe the documentation in doc/src/sgml/ddl.sgml should mention that we
only support the table constraint form.

Andreas

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#85Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#84)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

I am sorry for the late reply

== Limitations of the current design
All the limitations are as you said, I don't think we can do much better at
the moment

== Functional review

1) MATCH FULL does not seem to care about NULLS in arrays. In the example

below I expected both inserts into the referring table to fail.

It seems in your example the only failed case was: INSERT INTO fk VALUES
(NULL, '{1}');
which shouldn't work, can you clarify this?

2) To me it was not obvious that ON DELETE CASCADE would delete the whole
rows rather than delete the members from the array, and this kind of
misunderstanding can lead to pretty bad surprises in production. I am
leaning towards not supporting CASCADE.

I would say so too, maybe we should remove ON DELETE CASCADE until we have
supported all remaining actions.

== The @>> operator
I would argue that allocating an array of datums and building an array
would have the same complexity

== Code review

I think the code in RI_Initial_Check() would be cleaner if you used

"CROSS JOIN LATERAL unnest(col)" rather than having unnest() in the target
list. This way you would not need to rename all columns and the code paths
for the array case could look more like the code path for the normal case.

Can you clarify what you mean a bit more?

== Minor things in the code
All minor things were corrected

== Documentation
All documentation was corrected

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v5.3.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v5.3.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ef60a58631..e911bebd16 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</> = plain (simple equality),
+       <literal>e</> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2387,6 +2397,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+  <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index daba66c187..f22fd34a32 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Foreign Key Arrays</title>
+
+   <indexterm>
+    <primary>Foreign Key Arrays</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Foreign Key Arrays</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Foreign Key Array constraint is on
+    a single column key, you can define a Foreign Key Array constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Foreign Key Array options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index bbb3a51def..7a0e2c638d 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="parameter">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="parameter">index_parameters</replaceable> |
-  REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [EACH ELEMENT OF] REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -867,10 +867,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -894,6 +894,20 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
+      In case the column name <replaceable
+      class="parameter">column</replaceable> is prepended with the
+      <literal>EACH ELEMENT OF</literal> keyword and <replaceable
+      class="parameter">column</replaceable> is an array of elements compatible
+      with the corresponding <replaceable
+      class="parameter">refcolumn</replaceable> in <replaceable
+      class="parameter">reftable</replaceable>, a Foreign Key Array constraint
+      is put in place (see <xref
+      linkend="sql-createtable-element-foreign-key-constraints"> for more
+      information). Multi-column keys with more than one <literal>EACH ELEMENT
+      OF</literal> column are currently not allowed. 
+     </para>
+
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -956,7 +970,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -965,7 +980,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -977,6 +993,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -992,6 +1010,85 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="FOREIGN KEY ARRAYS">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a
+      <quote>Foreign Key Array</quote>, a special
+      kind of foreign key constraint requiring the referencing column to be an
+      array of elements of the same type (or a compatible one) as the
+      referenced column in the referenced table. The value of each element of
+      the <replaceable class="parameter">refcolumn</replaceable> array will be
+      matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Foreign Key Arrays are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Foreign Key Arrays, modifications in the referenced column can
+      trigger actions to be performed on the referencing array. Similarly to
+      standard foreign keys, you can specify these actions using the
+      <literal>ON DELETE</literal> and <literal>ON UPDATE</literal> clauses.
+      However, only the following actions for each clause are currently
+      allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. Deletes the entire array.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it
+      considerably enhances the performance. Also concerning coercion while
+      using the GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+      purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1961,6 +2058,16 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a <productname>PostgreSQL</productname>
+     extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 2bc9e90dcf..d9ca06f4e3 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2124,6 +2124,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c7b2f031f0..db7978ec45 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1213,6 +1213,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 7dee6db0eb..07d0fe980b 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 165b165d55..83fdccb254 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7116,6 +7116,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7123,10 +7124,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7203,6 +7206,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7215,6 +7219,51 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_CASCADE))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Foreign Key Arrays support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7300,6 +7349,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7358,17 +7466,17 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
-			ereport(ERROR,
-					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
-							   strVal(list_nth(fkconstraint->fk_attrs, i)),
-							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
-							   format_type_be(pktype))));
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("foreign key constraint \"%s\" "
+						"cannot be implemented",
+						fkconstraint->conname),
+				 errdetail("Key columns \"%s\" and \"%s\" "
+						   "are of incompatible types: %s and %s.",
+						   strVal(list_nth(fkconstraint->fk_attrs, i)),
+						   strVal(list_nth(fkconstraint->pk_attrs, i)),
+						   format_type_be(fktype),
+						   format_type_be(pktype))));
 
 		if (old_check_ok)
 		{
@@ -7398,6 +7506,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7440,7 +7555,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7464,6 +7578,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 92ae3822d8..e876db9242 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 08f3a3d357..3724c083e3 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3164,6 +3164,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index cadd253ef1..7470dcc020 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2846,6 +2846,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 2866fd7b4a..045ed984c6 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2584,6 +2584,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 291d1eeb46..cc6dde0243 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3496,6 +3496,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index c301ca465d..e98dd2c0d3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -393,7 +403,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -625,8 +635,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3512,8 +3522,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3707,14 +3719,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3747,6 +3760,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -14739,6 +14775,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15856,6 +15893,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 7d10d74a3e..00f9dbf36d 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1386,6 +1386,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 8461da490a..984fdb6b14 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -745,6 +745,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 4badb5fd7c..987014880d 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +440,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Foreign Key Arrays */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +601,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +794,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1018,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1175,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1355,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1522,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1699,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1866,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2058,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2378,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2397,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+		if (riinfo->has_array)
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+								 fkattname);
+			else
+				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+								 fkattname);
+		else
+			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		sep = "";
+		appendStringInfo(&querybuf,
+						 " FROM (SELECT ");
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+								 sep, fkattname, i + 1, fkattname, i + 1);
+			else
+				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+								 i + 1);
+			sep = ", ";
+		}
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2450,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname + 3, "k%d", i + 1);
+		else
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2475,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname, "k%d", i + 1);
+		else
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2654,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,14 +2686,60 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;d
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprleft))));
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprright))));
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+		ereport(ERROR,
+			(errcode(ERRCODE_UNDEFINED_OBJECT),
+			 errmsg("could not find common type between %s and %s",
+			 	    format_type_be(oprleft), format_type_be(oprright))));
+
+			 
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2801,6 +2947,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3026,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3082,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Foreign Key Arrays.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index b543b7046c..919f1eded5 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1899,7 +1902,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1907,13 +1911,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1921,13 +1933,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2202,6 +2216,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..903f9e19cb 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Foreign Key Arrays, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 37b0b4ba82..cd1ce3c94e 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 34d6afc80f..09eea88b77 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2082,6 +2082,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2117,6 +2121,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index e560f0c96e..c4a2e118ed 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..e9ad9bd54c
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,703 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,2}       |      2
+ {3,5,2,5}   |      3
+ {3,4,4}     |      4
+ {3,5,4,1,3} |      5
+ {1}         |      6
+ {5,1}       |      7
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+ {3,4,5,3}   |     10
+(10 rows)
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+   ftest1    | ftest2 
+-------------+--------
+ {3,2}       |      2
+ {3,4,4}     |      4
+ {1}         |      6
+ {2,1,2,4,1} |      8
+ {4,2}       |      9
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index aa5e6af621..552f8d4e8a 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -104,7 +104,12 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key  cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+
+# ----------
+# Another group of parallel tests (no room in the previouse group)
+# ----------
+test: element_foreign_key
 
 # ----------
 # Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 3866314a92..eb7710d518 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -142,6 +142,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..9657ea1a12
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,549 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- Check DELECTE CASCADE ACTION
+CREATE TABLE PKTABLEFORARRAYDELETE ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYDELETE
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYDELETE VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYDELETE
+CREATE TABLE FKTABLEFORARRAYDELETE ( ftest1 int[],
+    ftest2 int,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYDELETE
+    ON DELETE CASCADE ON UPDATE NO ACTION );
+
+-- Create index on FKTABLEFORARRAYDELETE
+CREATE INDEX ON FKTABLEFORARRAYDELETE USING gin (ftest1);
+
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYDELETE VALUES ('{3,4,5,3}', 10);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Check FKTABLE for target rows
+SELECT * FROM FKTABLEFORARRAYDELETE WHERE ftest1 @> ARRAY[5];
+
+-- Perfrorm delete
+DELETE FROM PKTABLEFORARRAYDELETE WHERE ptest1 = 5;
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAYDELETE;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYDELETE;
+DROP TABLE PKTABLEFORARRAYDELETE;
#86Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#85)
Re: GSoC 2017: Foreign Key Arrays

On 11/10/2017 01:47 AM, Mark Rofail wrote:

I am sorry for the late reply

There is no reason for you to be. It did not take you 6 weeks to do a
review. :) Thanks for this new version.

== Functional review

1) MATCH FULL does not seem to care about NULLS in arrays. In the

example below I expected both inserts into the referring table to fail.

It seems in your example the only failed case was: INSERT INTO fk VALUES
(NULL, '{1}');
which shouldn't work, can you clarify this?

I think that if you use MATH FULL the query should fail if you have a
NULL in the array.

2) To me it was not obvious that ON DELETE CASCADE would delete

the whole rows rather than delete the members from the array, and
this kind of misunderstanding can lead to pretty bad surprises in
production. I am leaning towards not supporting CASCADE.

I would say so too, maybe we should remove ON DELETE CASCADE until we
have supported all remaining actions.

I am leaning towards this too. I would personally be fine with a first
version without support for CASCADE since it is not obvious to me what
CASCADE should do.

== The @>> operator
I would argue that allocating an array of datums and building an array
would have the same complexity

I am not sure what you mean here. Just because something has the same
complexity does not mean there can't be major performance differences.

== Code review

I think the code in RI_Initial_Check() would be cleaner if you

used "CROSS JOIN LATERAL unnest(col)" rather than having unnest() in
the target list. This way you would not need to rename all columns
and the code paths for the array case could look more like the code
path for the normal case.

Can you clarify what you mean a bit more?

I think the code would look cleaner if you generate the following query:

SELECT fk.x, fk.ys FROM ONLY t2 fk CROSS JOIN LATERAL
pg_catalog.unnest(ys) a2 (v) LEFT OUTER JOIN ONLY t1 pk ON pk.x = fk.x
AND pk.y = a2.v WHERE [...]

rather than:

SELECT fk.k1, fk.ak2 FROM (SELECT x k1, pg_catalog.unnest(ys) k2, ys ak2
FROM ONLY t2) fk LEFT OUTER JOIN ONLY t1 pk ON pk.x = fk.k1 AND pk.y =
fk.k2 WHERE [...]

= New stuff

When applying the patch I got some white space warnings:

Array-ELEMENT-foreign-key-v5.3.patch:1343: space before tab in indent,
indent with spaces.
format_type_be(oprleft), format_type_be(oprright))));
Array-ELEMENT-foreign-key-v5.3.patch:1345: trailing whitespace.

When compiling I got an error:

ri_triggers.c: In function ‘ri_GenerateQual’:
ri_triggers.c:2693:19: error: unknown type name ‘d’
Oid oprcommon;d
^
ri_triggers.c:2700:3: error: conflicting types for ‘oprright’
oprright = get_array_type(operform->oprleft);
^~~~~~~~
ri_triggers.c:2691:9: note: previous declaration of ‘oprright’ was here
Oid oprright;
^~~~~~~~
<builtin>: recipe for target 'ri_triggers.o' failed

When building the documentation I got two warnings:

/usr/bin/osx:catalogs.sgml:2349:17:W: empty end-tag
/usr/bin/osx:catalogs.sgml:2350:17:W: empty end-tag

When running the tests I got a failure in element_foreign_key.

Andreas

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#87Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#86)
1 attachment(s)
Re: GSoC 2017: Foreign Key Arrays

2) To me it was not obvious that ON DELETE CASCADE would delete

the whole rows rather than delete the members from the array, and

this kind of misunderstanding can lead to pretty bad surprises in
production. I am leaning towards not supporting CASCADE.

I would say so too, maybe we should remove ON DELETE CASCADE until we
have supported all remaining actions.

Delete Cascade support is now removed

== The @>> operator

I would argue that allocating an array of datums and building an array
would have the same complexity

I am not sure what you mean here. Just because something has the same
complexity does not mean there can't be major performance differences.

I have spend a lot of time working on this operator and would like to
benefit from it. How should I go about this ? Start a new patch ?

= New stuff

Everything is now working correctly

== Functional review

1) MATCH FULL does not seem to care about NULLS in arrays. In the

example below I expected both inserts into the referring table to fail.

It seems in your example the only failed case was: INSERT INTO fk VALUES
(NULL, '{1}');
which shouldn't work, can you clarify this?

I think that if you use MATH FULL the query should fail if you have a NULL

in the array.

== Code review

I think the code in RI_Initial_Check() would be cleaner if you

used "CROSS JOIN LATERAL unnest(col)" rather than having unnest() in
the target list. This way you would not need to rename all columns
and the code paths for the array case could look more like the code
path for the normal case.

Can you clarify what you mean a bit more?

I think the code would look cleaner if you generate the following query:

SELECT fk.x, fk.ys FROM ONLY t2 fk CROSS JOIN LATERAL
pg_catalog.unnest(ys) a2 (v) LEFT OUTER JOIN ONLY t1 pk ON pk.x = fk.x AND
pk.y = a2.v WHERE [...]
rather than:
SELECT fk.k1, fk.ak2 FROM (SELECT x k1, pg_catalog.unnest(ys) k2, ys ak2
FROM ONLY t2) fk LEFT OUTER JOIN ONLY t1 pk ON pk.x = fk.k1 AND pk.y =
fk.k2 WHERE [...]

So the two main issues we remain to resolve are MATCH FULL and the
RI_Initial_Check() query refactoring. The problem is that I am not one of
the original authors and have not touched this part of the code.
I understand the problem but it will take some time for me to understand
how to resolve everything.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v5.3(fixed).patchtext/x-patch; charset=US-ASCII; name="Array-ELEMENT-foreign-key-v5.3(fixed).patch"Download
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ef60a58631..1861ca42e2 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2387,6 +2397,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+  <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index daba66c187..f22fd34a32 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Foreign Key Arrays</title>
+
+   <indexterm>
+    <primary>Foreign Key Arrays</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Foreign Key Arrays</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Foreign Key Array constraint is on
+    a single column key, you can define a Foreign Key Array constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Foreign Key Array options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints">.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index bbb3a51def..7a0e2c638d 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="parameter">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="parameter">index_parameters</replaceable> |
-  REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [EACH ELEMENT OF] REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="PARAMETER">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -867,10 +867,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -894,6 +894,20 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
+      In case the column name <replaceable
+      class="parameter">column</replaceable> is prepended with the
+      <literal>EACH ELEMENT OF</literal> keyword and <replaceable
+      class="parameter">column</replaceable> is an array of elements compatible
+      with the corresponding <replaceable
+      class="parameter">refcolumn</replaceable> in <replaceable
+      class="parameter">reftable</replaceable>, a Foreign Key Array constraint
+      is put in place (see <xref
+      linkend="sql-createtable-element-foreign-key-constraints"> for more
+      information). Multi-column keys with more than one <literal>EACH ELEMENT
+      OF</literal> column are currently not allowed. 
+     </para>
+
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -956,7 +970,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -965,7 +980,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -977,6 +993,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -992,6 +1010,85 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="FOREIGN KEY ARRAYS">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a
+      <quote>Foreign Key Array</quote>, a special
+      kind of foreign key constraint requiring the referencing column to be an
+      array of elements of the same type (or a compatible one) as the
+      referenced column in the referenced table. The value of each element of
+      the <replaceable class="parameter">refcolumn</replaceable> array will be
+      matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Foreign Key Arrays are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Foreign Key Arrays, modifications in the referenced column can
+      trigger actions to be performed on the referencing array. Similarly to
+      standard foreign keys, you can specify these actions using the
+      <literal>ON DELETE</literal> and <literal>ON UPDATE</literal> clauses.
+      However, only the following actions for each clause are currently
+      allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. Deletes the entire array.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it
+      considerably enhances the performance. Also concerning coercion while
+      using the GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+      purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1961,6 +2058,16 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a <productname>PostgreSQL</productname>
+     extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 2bc9e90dcf..d9ca06f4e3 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2124,6 +2124,7 @@ StoreRelCheck(Relation rel, char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c7b2f031f0..db7978ec45 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1213,6 +1213,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 7dee6db0eb..07d0fe980b 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 165b165d55..91ee3f79b9 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7116,6 +7116,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7123,10 +7124,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7203,6 +7206,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7215,6 +7219,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Foreign Key Arrays support only NO ACTION and RESTRICT actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7300,6 +7348,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7358,17 +7465,17 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
-			ereport(ERROR,
-					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
-							   strVal(list_nth(fkconstraint->fk_attrs, i)),
-							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
-							   format_type_be(pktype))));
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("foreign key constraint \"%s\" "
+						"cannot be implemented",
+						fkconstraint->conname),
+				 errdetail("Key columns \"%s\" and \"%s\" "
+						   "are of incompatible types: %s and %s.",
+						   strVal(list_nth(fkconstraint->fk_attrs, i)),
+						   strVal(list_nth(fkconstraint->pk_attrs, i)),
+						   format_type_be(fktype),
+						   format_type_be(pktype))));
 
 		if (old_check_ok)
 		{
@@ -7398,6 +7505,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7440,7 +7554,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7464,6 +7577,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 92ae3822d8..e876db9242 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 08f3a3d357..3724c083e3 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3164,6 +3164,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index cadd253ef1..7470dcc020 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2846,6 +2846,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 2866fd7b4a..045ed984c6 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2584,6 +2584,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 291d1eeb46..cc6dde0243 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3496,6 +3496,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index c301ca465d..e98dd2c0d3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -393,7 +403,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -625,8 +635,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3512,8 +3522,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3707,14 +3719,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3747,6 +3760,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -14739,6 +14775,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15856,6 +15893,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 7d10d74a3e..00f9dbf36d 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1386,6 +1386,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 8461da490a..984fdb6b14 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -745,6 +745,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 4badb5fd7c..e4c1fc6c1d 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -118,9 +118,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -204,7 +206,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -395,6 +398,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -407,12 +411,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -421,18 +440,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Foreign Key Arrays */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -559,7 +601,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -751,7 +794,8 @@ ri_restrict_del(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -974,7 +1018,8 @@ ri_restrict_upd(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1130,7 +1175,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1309,7 +1355,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1475,7 +1522,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1651,7 +1699,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1817,7 +1866,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2008,7 +2058,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -2327,6 +2378,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -2338,15 +2397,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+		if (riinfo->has_array)
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+								 fkattname);
+			else
+				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+								 fkattname);
+		else
+			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		sep = "";
+		appendStringInfo(&querybuf,
+						 " FROM (SELECT ");
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+								 sep, fkattname, i + 1, fkattname, i + 1);
+			else
+				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+								 i + 1);
+			sep = ", ";
+		}
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -2360,12 +2450,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname + 3, "k%d", i + 1);
+		else
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -2381,7 +2475,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname, "k%d", i + 1);
+		else
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2557,20 +2654,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2586,14 +2686,59 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprleft))));
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprright))));
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+		ereport(ERROR,
+			(errcode(ERRCODE_UNDEFINED_OBJECT),
+			 errmsg("could not find common type between %s and %s",
+			 format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2801,6 +2946,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2879,6 +3025,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2921,6 +3081,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Foreign Key Arrays.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index b543b7046c..919f1eded5 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1899,7 +1902,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1907,13 +1911,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1921,13 +1933,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2202,6 +2216,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index ec035d8434..903f9e19cb 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Foreign Key Arrays, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 37b0b4ba82..cd1ce3c94e 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 34d6afc80f..09eea88b77 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2082,6 +2082,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2117,6 +2121,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index f50e45e886..d3f4803006 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index e560f0c96e..c4a2e118ed 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..ed991e2fae
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index aa5e6af621..552f8d4e8a 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -104,7 +104,12 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key  cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+
+# ----------
+# Another group of parallel tests (no room in the previouse group)
+# ----------
+test: element_foreign_key
 
 # ----------
 # Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 3866314a92..eb7710d518 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -142,6 +142,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..d012589430
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
\ No newline at end of file
#88Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#87)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 11/13/2017 12:32 PM, Mark Rofail wrote:

== The @>> operator
I would argue that allocating an array of datums and building an
array would have the same complexity

I am not sure what you mean here. Just because something has the
same complexity does not mean there can't be major performance
differences.

I have spend a lot of time working on this operator and would like to
benefit from it. How should I go about this ? Start a new patch ?

I am still not sure what you mean here. Feel free to add @>> to this
patch if you like. You may want to submit it as two patch files (but
please keep them as the same commitfest entry) but I leave that decision
all up to you.

So the two main issues we remain to resolve are MATCH FULL and the
RI_Initial_Check() query refactoring. The problem is that I am not one
of the original authors and have not touched this part of the code.
I understand the problem but it will take some time for me to understand
how to resolve everything.

Cool, feel free to ask if you need some assistance. I want this patch.

Andreas

#89Michael Paquier
michael.paquier@gmail.com
In reply to: Andreas Karlsson (#88)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Mon, Nov 27, 2017 at 10:47 AM, Andreas Karlsson <andreas@proxel.se> wrote:

Cool, feel free to ask if you need some assistance. I want this patch.

The last patch submitted did not get a review, and it does not apply
as well. So I am moving it to next CF with waiting on author as
status. Please rebase the patch.
--
Michael

#90Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#87)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Here's a rebased version of this patch. I have done nothing other than
fix the conflicts and verify that it passes existing regression tests.
I intend to go over the reviews sometime later and hopefully get it all
fixed for inclusion in pg11.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

v6-0001-Support-foreign-keys-for-array-elements.patchtext/plain; charset=us-asciiDownload
From d513b449722b6e848b958584d0c81ca19b289d22 Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Fri, 12 Jan 2018 16:28:51 -0300
Subject: [PATCH v6] Support foreign keys for array elements

---
 doc/src/sgml/catalogs.sgml                        |  16 +
 doc/src/sgml/ddl.sgml                             | 110 ++++
 doc/src/sgml/ref/create_table.sgml                | 116 +++-
 src/backend/catalog/heap.c                        |   1 +
 src/backend/catalog/index.c                       |   1 +
 src/backend/catalog/pg_constraint.c               |  14 +-
 src/backend/commands/tablecmds.c                  | 138 ++++-
 src/backend/commands/trigger.c                    |   6 +
 src/backend/commands/typecmds.c                   |   1 +
 src/backend/nodes/copyfuncs.c                     |   1 +
 src/backend/nodes/equalfuncs.c                    |   1 +
 src/backend/nodes/outfuncs.c                      |   1 +
 src/backend/parser/gram.y                         |  66 ++-
 src/backend/parser/parse_coerce.c                 |  84 +++
 src/backend/parser/parse_utilcmd.c                |   2 +
 src/backend/utils/adt/ri_triggers.c               | 245 +++++++--
 src/backend/utils/adt/ruleutils.c                 |  88 ++-
 src/include/catalog/pg_constraint.h               |  27 +-
 src/include/catalog/pg_constraint_fn.h            |   1 +
 src/include/nodes/parsenodes.h                    |   5 +
 src/include/parser/kwlist.h                       |   1 +
 src/include/parser/parse_coerce.h                 |   1 +
 src/test/regress/expected/element_foreign_key.out | 639 ++++++++++++++++++++++
 src/test/regress/parallel_schedule                |   7 +-
 src/test/regress/serial_schedule                  |   1 +
 src/test/regress/sql/element_foreign_key.sql      | 503 +++++++++++++++++
 26 files changed, 2000 insertions(+), 76 deletions(-)
 create mode 100644 src/test/regress/expected/element_foreign_key.out
 create mode 100644 src/test/regress/sql/element_foreign_key.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 3f02202caf..aa5f9fe21f 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2387,6 +2397,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+  <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index b1167a40e6..5ca685b991 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Foreign Key Arrays</title>
+
+   <indexterm>
+    <primary>Foreign Key Arrays</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Foreign Key Arrays</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Foreign Key Array constraint is on
+    a single column key, you can define a Foreign Key Array constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Foreign Key Array options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key" /> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints" />.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index a0c9a6d257..39b0012b1a 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="parameter">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="parameter">index_parameters</replaceable> |
-  REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [ EACH ELEMENT OF ] REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -867,10 +867,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -894,6 +894,19 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
+      In case the column name
+      <replaceable class="parameter">column</replaceable> is prepended with the
+      <literal>EACH ELEMENT OF</literal> keyword and
+      <replaceable class="parameter">column</replaceable> is an array of elements compatible
+      with the corresponding <replaceable class="parameter">refcolumn</replaceable>
+      in <replaceable class="parameter">reftable</replaceable>, a Foreign Key Array constraint
+      is put in place (see
+      <xref linkend="sql-createtable-element-foreign-key-constraints" /> for more
+      information). Multi-column keys with more than one
+      <literal>EACH ELEMENT OF</literal> column are currently not allowed. 
+     </para>
+
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -956,7 +969,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -965,7 +979,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <term><literal>SET NULL</literal></term>
         <listitem>
          <para>
-          Set the referencing column(s) to null.
+          Set the referencing column(s) to null. Currently not supported
+          with array <literal>ELEMENT</literal> foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -977,6 +992,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with array <literal>ELEMENT</literal>
+          foreign keys.
          </para>
         </listitem>
        </varlistentry>
@@ -992,6 +1009,85 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="FOREIGN KEY ARRAYS">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a
+      <quote>Foreign Key Array</quote>, a special
+      kind of foreign key constraint requiring the referencing column to be an
+      array of elements of the same type (or a compatible one) as the
+      referenced column in the referenced table. The value of each element of
+      the <replaceable class="parameter">refcolumn</replaceable> array will be
+      matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Foreign Key Arrays are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Foreign Key Arrays, modifications in the referenced column can
+      trigger actions to be performed on the referencing array. Similarly to
+      standard foreign keys, you can specify these actions using the
+      <literal>ON DELETE</literal> and <literal>ON UPDATE</literal> clauses.
+      However, only the following actions for each clause are currently
+      allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. Deletes the entire array.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it
+      considerably enhances the performance. Also concerning coercion while
+      using the GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+      purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1982,6 +2078,16 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a <productname>PostgreSQL</productname>
+     extension.
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 089b7965f2..21836ab680 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2126,6 +2126,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 330488b96f..33b40ffcb1 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1215,6 +1215,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 442ae7e23d..37b7a3e275 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index f2a928b823..58f53495e1 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7058,6 +7058,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7065,10 +7066,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7145,6 +7148,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7157,6 +7161,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Foreign Key Arrays support only NO ACTION and RESTRICT actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7242,6 +7290,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7300,17 +7407,17 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
-			ereport(ERROR,
-					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
-							   strVal(list_nth(fkconstraint->fk_attrs, i)),
-							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
-							   format_type_be(pktype))));
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("foreign key constraint \"%s\" "
+						"cannot be implemented",
+						fkconstraint->conname),
+				 errdetail("Key columns \"%s\" and \"%s\" "
+						   "are of incompatible types: %s and %s.",
+						   strVal(list_nth(fkconstraint->fk_attrs, i)),
+						   strVal(list_nth(fkconstraint->pk_attrs, i)),
+						   format_type_be(fktype),
+						   format_type_be(pktype))));
 
 		if (old_check_ok)
 		{
@@ -7340,6 +7447,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7382,7 +7496,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7406,6 +7519,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 1c488c338a..510d6c91b0 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index a40b3cf752..f10757b122 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3164,6 +3164,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index ddbbc79823..51e971d555 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2850,6 +2850,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 30ccc9c5ae..18d14b59f8 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2594,6 +2594,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 5e72df137e..3a4d9535d6 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3501,6 +3501,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index e42b7caff6..5ac121d91d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -393,7 +403,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -625,8 +635,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3527,8 +3537,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3722,14 +3734,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3762,6 +3775,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -14976,6 +15012,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16096,6 +16133,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 085aa8766c..7fa070a3c1 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1386,6 +1386,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 128f1679c6..4f41827d4d 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -757,6 +757,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 8faae1d069..d577df3512 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -393,6 +396,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -405,12 +409,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -419,18 +438,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Foreign Key Arrays */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -557,7 +599,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -815,7 +858,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -971,7 +1015,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1150,7 +1195,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1368,7 +1414,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1585,7 +1632,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1904,6 +1952,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1915,15 +1971,46 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	{
 		quoteOneName(fkattname,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+		if (riinfo->has_array)
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%sfk.ak%d %s", sep, i + 1,
+								 fkattname);
+			else
+				appendStringInfo(&querybuf, "%sfk.k%d %s", sep, i + 1,
+								 fkattname);
+		else
+			appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
 		sep = ", ";
 	}
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		sep = "";
+		appendStringInfo(&querybuf,
+						 " FROM (SELECT ");
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&querybuf, "%spg_catalog.unnest(%s) k%d, %s ak%d",
+								 sep, fkattname, i + 1, fkattname, i + 1);
+			else
+				appendStringInfo(&querybuf, "%s%s k%d", sep, fkattname,
+								 i + 1);
+			sep = ", ";
+		}
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s) fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1937,12 +2024,16 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname + 3, "k%d", i + 1);
+		else
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1958,7 +2049,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->has_array)
+			sprintf(fkattname, "k%d", i + 1);
+		else
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
@@ -2134,20 +2228,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2163,14 +2260,57 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprleft))));
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprright))));
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+		ereport(ERROR,
+			(errcode(ERRCODE_UNDEFINED_OBJECT),
+			 errmsg("could not find common type between %s and %s",
+			 format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.@>) ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2378,6 +2518,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2456,6 +2597,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2498,6 +2653,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Foreign Key Arrays.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 9cdbb06add..229d5d8c93 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1899,7 +1902,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1907,13 +1911,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1921,13 +1933,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2202,6 +2216,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 8fca86d71e..96eea9753d 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Foreign Key Arrays, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 6bb1b09714..e720745546 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index b72178efd1..2b84d8a960 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2086,6 +2086,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2121,6 +2125,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 26af944e03..af00143580 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..2955b57ecc 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..ed991e2fae
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e224977791..52505e7539 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -104,7 +104,12 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key  cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+
+# ----------
+# Another group of parallel tests (no room in the previouse group)
+# ----------
+test: element_foreign_key
 
 # ----------
 # Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 9fc5f1a268..eefd1df73b 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -143,6 +143,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..d012589430
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
\ No newline at end of file
-- 
2.11.0

#91Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#90)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

According to the last review, there are still two main issues with the
patch.

On Mon, Oct 30, 2017 at 3:24 AM, Andreas Karlsson <andreas@proxel.se> wrote:

1) MATCH FULL does not seem to care about NULLS in arrays. In the example
below I expected both inserts into the referring table to fail.

CREATE TABLE t (x int, y int, PRIMARY KEY (x, y));
CREATE TABLE fk (x int, ys int[], FOREIGN KEY (x, EACH ELEMENT OF ys)
REFERENCES t MATCH FULL);
INSERT INTO t VALUES (10, 1);
INSERT INTO fk VALUES (10, '{1,NULL}');
INSERT INTO fk VALUES (NULL, '{1}');

CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
ERROR: insert or update on table "fk" violates foreign key constraint
"fk_x_fkey"
DETAIL: MATCH FULL does not allow mixing of null and nonnull key values.

I understand that Match full should contain nulls in the results. However,

I don't think that it's semantically correct, so I suggest we don't use
Match full. What would be the consequences of that ?

2) I think the code in RI_Initial_Check() would be cleaner if you used

"CROSS JOIN LATERAL unnest(col)" rather than having unnest() in the target
list. This way you would not need to rename all columns and the code paths
for the array case could look more like the code path for the normal case.

I have repeatedly tried to generate the suggested query using C code and I
failed. I would like some help with it

Best Regards,
Mark Rofail

#92Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#91)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

1) MATCH FULL does not seem to care about NULLS in arrays. In the example
below I expected both inserts into the referring table to fail.

CREATE TABLE t (x int, y int, PRIMARY KEY (x, y));
CREATE TABLE fk (x int, ys int[], FOREIGN KEY (x, EACH ELEMENT OF ys) REFERENCES t MATCH FULL);
INSERT INTO t VALUES (10, 1);
INSERT INTO fk VALUES (10, '{1,NULL}');
INSERT INTO fk VALUES (NULL, '{1}');

I understand that Match full should contain nulls in the results. However,
I don't think that it's semantically correct, so I suggest we don't use
Match full. What would be the consequences of that ?

Well, I think you could get away with not supporting MATCH FULL with
array FK references (meaning you ought to raise an error if you see it) ...
clearly EACH ELEMENT OF is an extension of the spec so we're not forced
to comply with all the clauses. On the other hand, it would be better if it
can be made to work.

If I understand correctly, you would need a new operator similar to @>
but which rejects NULLs in order to implement MATCH FULL, right?

2) I think the code in RI_Initial_Check() would be cleaner if you used
"CROSS JOIN LATERAL unnest(col)" rather than having unnest() in the target
list. This way you would not need to rename all columns and the code paths
for the array case could look more like the code path for the normal case.

I have repeatedly tried to generate the suggested query using C code and I
failed. I would like some help with it

Well, the way to go about it would be to first figure out what is the
correct SQL query, and only later try to implement it in C. Is SQL the
problem, or is it C? I'm sure we can get in touch with somebody that
knows a little bit of SQL. Can you do a write-up of the query requirements?

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#93Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#92)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Mon, Nov 13, 2017 at 2:41 AM, Andreas Karlsson <andreas@proxel.se> wrote:

I think the code would look cleaner if you generate the following query:

SELECT fk.x, fk.ys FROM ONLY t2 fk CROSS JOIN LATERAL
pg_catalog.unnest(ys) a2 (v) LEFT OUTER JOIN ONLY t1 pk ON pk.x = fk.x AND
pk.y = a2.v WHERE [...]

rather than:

SELECT fk.k1, fk.ak2 FROM (SELECT x k1, pg_catalog.unnest(ys) k2, ys ak2
FROM ONLY t2) fk LEFT OUTER JOIN ONLY t1 pk ON pk.x = fk.k1 AND pk.y =
fk.k2 WHERE [...]

Andreas has kindly written the SQL query for us. My problem is generating
it with C code

Best Regards,
Mark Rofail

#94Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#93)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

This new version of the patch compiles well with the HEAD and resolved the
following issues .

2) I think the code in RI_Initial_Check() would be cleaner if you used

"CROSS JOIN LATERAL unnest(col)" rather than having unnest() in the

target

list. This way you would not need to rename all columns and the code

paths

for the array case could look more like the code path for the normal

case.

The RI query has been re-factored thanks to Andreas.

== The @>> operator

A previous version of your patch added the "anyelement <<@ anyarray"
operator to avoid having to build arrays, but that part was reverted due to
a bug.

I am not expert on the gin code, but as far as I can tell it would be
relatively simple to fix that bug. Just allocate an array of Datums of
length one where you put the element you are searching for (or maybe a copy
of it).

The @>> is now restored and functioning correctly, all issues with contrib
libraries has been resolved

1) MATCH FULL does not seem to care about NULLS in arrays. In the

example

below I expected both inserts into the referring table to fail.

CREATE TABLE t (x int, y int, PRIMARY KEY (x, y));
CREATE TABLE fk (x int, ys int[], FOREIGN KEY (x, EACH ELEMENT OF ys)

REFERENCES t MATCH FULL);

INSERT INTO t VALUES (10, 1);
INSERT INTO fk VALUES (10, '{1,NULL}');
INSERT INTO fk VALUES (NULL, '{1}');

We agreed that MATCH FULL can wait for a future patch. It's not needed for
now

We really need a review so the patch can pass in this commitfest.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v6.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v6.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 71e20f2740..91d4fd717b 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2386,6 +2396,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 3244399782..9ce3939351 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Foreign Key Arrays</title>
+
+   <indexterm>
+    <primary>Foreign Key Arrays</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Foreign Key Arrays</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Foreign Key Array constraint is on
+    a single column key, you can define a Foreign Key Array constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Foreign Key Array options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index a0c9a6d257..c4318ce5b2 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="parameter">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="parameter">index_parameters</replaceable> |
-  REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [EACH ELEMENT OF] REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -867,10 +867,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -893,6 +893,20 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable
+      class="parameter">column</replaceable> is prepended with the
+      <literal>EACH ELEMENT OF</literal> keyword and <replaceable
+      class="parameter">column</replaceable> is an array of elements compatible
+      with the corresponding <replaceable
+      class="parameter">refcolumn</replaceable> in <replaceable
+      class="parameter">reftable</replaceable>, a Foreign Key Array constraint
+      is put in place (see <xref
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more
+      information). Multi-column keys with more than one <literal>EACH ELEMENT
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -956,7 +970,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Foreign Key Arrays.
          </para>
         </listitem>
        </varlistentry>
@@ -966,6 +981,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Foreign Key Arrays.
          </para>
         </listitem>
        </varlistentry>
@@ -977,6 +993,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Foreign Key Arrays.
          </para>
         </listitem>
        </varlistentry>
@@ -992,6 +1009,85 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="FOREIGN KEY ARRAYS">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a
+      <quote>Foreign Key Array</quote>, a special
+      kind of foreign key constraint requiring the referencing column to be an
+      array of elements of the same type (or a compatible one) as the
+      referenced column in the referenced table. The value of each element of
+      the <replaceable class="parameter">refcolumn</replaceable> array will be
+      matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Foreign Key Arrays are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Foreign Key Arrays, modifications in the referenced column can
+      trigger actions to be performed on the referencing array. Similarly to
+      standard foreign keys, you can specify these actions using the
+      <literal>ON DELETE</literal> and <literal>ON UPDATE</literal> clauses.
+      However, only the following actions for each clause are currently
+      allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. Deletes the entire array.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it
+      considerably enhances the performance. Also concerning coercion while
+      using the GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+      purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1981,6 +2077,16 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a <productname>PostgreSQL</productname>
+     extension.
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index d0fa4adf87..e7eaee8a01 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,19 +95,35 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+		if (strategy != GinContainsElemStrategy){
+			array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+			get_typlenbyvalalign(ARR_ELEMTYPE(array),
+								 &elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+			deconstruct_array(array,
+							  ARR_ELEMTYPE(array),
+							  elmlen, elmbyval, elmalign,
+							  &elems, &nulls, &nelems);
 
-	switch (strategy)
-	{
+			*nkeys = nelems;
+			*nullFlags = nulls;
+		}
+		else{
+			/*
+			 * since this function return a pointer to a
+			 * deconstructed array, there is nothing to do if
+			 * operand is a single element except to return
+			 * as is and configure the searchmode
+			 */
+
+			elems = PG_GETARG_POINTER(0);
+			*nkeys = 1;
+			*nullFlags = PG_ARGISNULL(0);
+		}
+
+		switch (strategy)
+		{
 		case GinOverlapStrategy:
 			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
@@ -126,6 +143,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -171,6 +196,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,7 +284,8 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsStrategy:
+			case GinContainsElemStrategy:
+			case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 774c07b03a..a54981aef4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2127,6 +2127,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 849a469127..0482f4b234 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1263,6 +1263,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 442ae7e23d..37b7a3e275 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 2e768dd5e4..18b6d9a95a 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7131,6 +7131,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7138,10 +7139,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7218,6 +7221,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7229,6 +7233,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Foreign Key Arrays support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -7314,6 +7362,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -7373,17 +7480,17 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
-			ereport(ERROR,
-					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
-							   strVal(list_nth(fkconstraint->fk_attrs, i)),
-							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
-							   format_type_be(pktype))));
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("foreign key constraint \"%s\" "
+						"cannot be implemented",
+						fkconstraint->conname),
+				 errdetail("Key columns \"%s\" and \"%s\" "
+						   "are of incompatible types: %s and %s.",
+						   strVal(list_nth(fkconstraint->fk_attrs, i)),
+						   strVal(list_nth(fkconstraint->pk_attrs, i)),
+						   format_type_be(fktype),
+						   format_type_be(pktype))));
 
 		if (old_check_ok)
 		{
@@ -7413,6 +7520,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7455,7 +7569,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7479,6 +7592,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 160d941c00..6c69f18757 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 74eb430f96..e492580765 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3164,6 +3164,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index e5d2de5330..c2fe0abbd3 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2852,6 +2852,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 785dc54d37..cb90ecad73 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2596,6 +2596,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e0f4befd9f..fe69d762bb 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3505,6 +3505,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 459a227e57..f6c97d7d2b 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -393,7 +403,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -625,8 +635,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3552,8 +3562,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3747,14 +3759,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3787,6 +3800,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -15003,6 +15039,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16123,6 +16160,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 085aa8766c..7fa070a3c1 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1385,6 +1385,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 	return ptype;
 }
 
+/*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
 /*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 5afb363096..ee7dd99505 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -754,6 +754,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 0cbdbe5587..c5a3d0fd12 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4284,6 +4284,112 @@ arraycontained(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+	FunctionCallInfoData locfcinfo;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair
+			*/
+		locfcinfo.arg[0] = elt1;
+		locfcinfo.arg[1] = elem;
+		locfcinfo.argnull[0] = false;
+		locfcinfo.argnull[1] = false;
+		locfcinfo.isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 
 /*-----------------------------------------------------------------------------
  * Array iteration functions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 8faae1d069..cf038652b4 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -393,6 +396,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -405,12 +409,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -419,18 +438,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Foreign Key Arrays */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -557,7 +599,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -815,7 +858,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -971,7 +1015,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1150,7 +1195,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1368,7 +1414,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1585,7 +1632,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1904,6 +1952,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1921,9 +1977,29 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1934,15 +2010,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1958,10 +2042,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -2134,20 +2223,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2163,14 +2255,65 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprleft))));
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprright))));
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+		ereport(ERROR,
+			(errcode(ERRCODE_UNDEFINED_OBJECT),
+			 errmsg("could not find common type between %s and %s",
+			 format_type_be(oprleft), format_type_be(oprright))));
+		oprright = get_base_element_type(oprcommon);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find element type for data type %s",
+							format_type_be(oprcommon))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>>");
+		appendStringInfo(buf, ") %s", leftop);
+		if (operform->oprleft != oprright)
+			ri_add_cast_to(buf, oprright);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2378,6 +2521,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2455,6 +2599,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
@@ -2498,6 +2656,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Foreign Key Arrays.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index c5f5a1ca3f..a5314df257 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1901,7 +1904,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1909,13 +1913,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1923,13 +1935,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2205,6 +2219,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index 03af581df4..35b71c5c0f 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -689,6 +689,7 @@ DATA(insert (	2745   2277 2277 1 s 2750 2742 0 ));
 DATA(insert (	2745   2277 2277 2 s 2751 2742 0 ));
 DATA(insert (	2745   2277 2277 3 s 2752 2742 0 ));
 DATA(insert (	2745   2277 2277 4 s 1070 2742 0 ));
+DATA(insert (	2745   2277 2283 5 s 6108 2742 0 ));
 
 /*
  * btree enum_ops
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 8fca86d71e..96eea9753d 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -103,9 +103,17 @@ CATALOG(pg_constraint,2606)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Foreign Key Arrays, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 6bb1b09714..e720745546 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index e74f963eb5..d1609e4f41 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1570,6 +1570,8 @@ DESCR("contains");
 DATA(insert OID = 2752 (  "<@"	   PGNSP PGUID b f f 2277 2277	16 2751  0 arraycontained arraycontsel arraycontjoinsel ));
 DESCR("is contained by");
 #define OID_ARRAY_CONTAINED_OP	2752
+DATA(insert OID = 6108 (  "@>>"	   PGNSP PGUID b f f 2277 2283	16 0  0 arraycontainselem arraycontsel arraycontjoinsel ));
+DESCR("containselem");
 
 /* capturing operators to preserve pre-8.3 behavior of text concatenation */
 DATA(insert OID = 2779 (  "||"	   PGNSP PGUID b f f 25 2776	25	 0 0 textanycat - - ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index f01648c961..dd430fc4a3 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4353,6 +4353,7 @@ DESCR("GIN array support (obsolete)");
 DATA(insert OID = 2747 (  arrayoverlap		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));
 DATA(insert OID = 2748 (  arraycontains		   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));
 DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));
+DATA(insert OID = 6109 (  arraycontainselem		PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2277 2283" _null_ _null_ _null_ _null_ _null_ arraycontainselem _null_ _null_ _null_ ));
 
 /* BRIN minmax */
 DATA(insert OID = 3383 ( brin_minmax_opcinfo	PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 93122adae8..f673e3829f 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2067,6 +2067,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2102,6 +2106,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 26af944e03..af00143580 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..2955b57ecc 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index c730563f03..0a9eff4d04 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -737,6 +737,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -761,6 +772,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -942,6 +966,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -953,6 +982,15 @@ SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
    101 | {} | {}
 (1 row)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -971,6 +1009,14 @@ SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..ed991e2fae
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 684f7f20a8..4df5709cb0 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1813,6 +1813,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -1880,7 +1881,7 @@ ORDER BY 1, 2, 3;
        4000 |           25 | <<=
        4000 |           26 | >>
        4000 |           27 | >>=
-(121 rows)
+(122 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index ad9434fb87..9b7884533f 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -104,7 +104,12 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key  cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+
+# ----------
+# Another group of parallel tests (no room in the previouse group)
+# ----------
+test: element_foreign_key
 
 # ----------
 # Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 27cd49845e..048f260866 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -143,6 +143,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 25dd4e2c6d..f6fb507bdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -313,8 +313,10 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -325,11 +327,14 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..d012589430
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
\ No newline at end of file
#95Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#94)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 01/21/2018 10:36 PM, Mark Rofail wrote:

== The @>> operator

A previous version of your patch added the "anyelement <<@ anyarray"
operator to avoid having to build arrays, but that part was reverted
due to a bug.

I am not expert on the gin code, but as far as I can tell it would
be relatively simple to fix that bug. Just allocate an array of
Datums of length one where you put the element you are searching for
(or maybe a copy of it).

The @>> is now restored and functioning correctly, all issues with
contrib libraries has been resolved

Hi,

I looked some at your anyarray @>> anyelement code and sadly it does not
look like the index code could work. The issue I see is that
ginqueryarrayextract() needs to make a copy of the search key but to do
so it needs to know the type of anyelement (to know if it needs to
detoast, etc). But there is as far as I can tell no way to check the
type of anyelement in this context.

Am I missing something?

Andreas

#96Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#95)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Wed, Jan 31, 2018 at 1:52 AM, Andreas Karlsson <andreas@proxel.se> wrote:

I looked some at your anyarray @>> anyelement code and sadly it does not
look like the index code could work. The issue I see is that
ginqueryarrayextract() needs to make a copy of the search key but to do so
it needs to know the type of anyelement (to know if it needs to detoast,
etc). But there is as far as I can tell no way to check the type of
anyelement in this context.

since its a polymorphic function it only passes if the `anyarray` is the
same type of the `anyelement` so we are sure they are the same type. Can't
we get the type from the anyarray ? the type is already stored in `
arr_type`.

Best Regards,
Mark Rofail

#97Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#96)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 02/01/2018 04:17 PM, Mark Rofail wrote:

since its a polymorphic function it only passes if the `anyarray` is the
same type of the `anyelement` so we are sure they are the same type.
Can't we get the type from the anyarray ? the type is already stored in
` arr_type`.

In theory, yes, but I saw no obvious way to get it without major changes
to the code. Unless I am missing something, of course.

If I am right my recommendation for getting this patch in is to
initially skip the new operators and go back to the version of the patch
which uses @>.

Andreas

#98Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#97)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sat, 3 Feb 2018 at 5:14 pm, Andreas Karlsson <andreas@proxel.se> wrote:

If I am right my recommendation for getting this patch in is to
initially skip the new operators and go back to the version of the patch
which uses @>.

We really need an initial patch to get accepted and postpone anything that
won't affect the core mechanics of the patch.

So yes, I move towards delaying the introduction of @>> to the patch.

A new patch will be ready by tomorrow.
Besr Regards,
Mark Rofail

Show quoted text
#99Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#98)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sat, Feb 3, 2018 at 5:19 PM, Mark Rofail <markm.rofail@gmail.com> wrote:

So yes, I move towards delaying the introduction of @>> to the patch.

Here is the promised patch with @>> operator removed.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v7.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v7.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 71e20f2740..91d4fd717b 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2386,6 +2396,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e1f3428a6..0cd8e50f1e 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Foreign Key Arrays</title>
+
+   <indexterm>
+    <primary>Foreign Key Arrays</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Foreign Key Arrays</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Foreign Key Array constraint is on
+    a single column key, you can define a Foreign Key Array constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Foreign Key Array options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index d2df40d543..d43eee5cb5 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -65,7 +65,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
   GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <replaceable>sequence_options</replaceable> ) ] |
   UNIQUE <replaceable class="parameter">index_parameters</replaceable> |
   PRIMARY KEY <replaceable class="parameter">index_parameters</replaceable> |
-  REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+  [EACH ELEMENT OF] REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ] }
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
@@ -867,10 +867,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -893,6 +893,20 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable
+      class="parameter">column</replaceable> is prepended with the
+      <literal>EACH ELEMENT OF</literal> keyword and <replaceable
+      class="parameter">column</replaceable> is an array of elements compatible
+      with the corresponding <replaceable
+      class="parameter">refcolumn</replaceable> in <replaceable
+      class="parameter">reftable</replaceable>, a Foreign Key Array constraint
+      is put in place (see <xref
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more
+      information). Multi-column keys with more than one <literal>EACH ELEMENT
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -956,7 +970,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Foreign Key Arrays.
          </para>
         </listitem>
        </varlistentry>
@@ -966,6 +981,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Foreign Key Arrays.
          </para>
         </listitem>
        </varlistentry>
@@ -977,6 +993,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Foreign Key Arrays.
          </para>
         </listitem>
        </varlistentry>
@@ -992,6 +1009,85 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="FOREIGN KEY ARRAYS">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a
+      <quote>Foreign Key Array</quote>, a special
+      kind of foreign key constraint requiring the referencing column to be an
+      array of elements of the same type (or a compatible one) as the
+      referenced column in the referenced table. The value of each element of
+      the <replaceable class="parameter">refcolumn</replaceable> array will be
+      matched against some row of <replaceable
+      class="parameter">reftable</replaceable>.
+     </para>
+
+     <para>
+      Foreign Key Arrays are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Foreign Key Arrays, modifications in the referenced column can
+      trigger actions to be performed on the referencing array. Similarly to
+      standard foreign keys, you can specify these actions using the
+      <literal>ON DELETE</literal> and <literal>ON UPDATE</literal> clauses.
+      However, only the following actions for each clause are currently
+      allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. Deletes the entire array.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it
+      considerably enhances the performance. Also concerning coercion while
+      using the GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+      purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1981,6 +2077,16 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a <productname>PostgreSQL</productname>
+     extension.
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 0f34f5381a..21371c29f4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2127,6 +2127,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index f2cb6d7fb8..d5437ee821 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1265,6 +1265,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 442ae7e23d..37b7a3e275 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 89454d8e80..7525302fb4 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7145,6 +7145,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7152,10 +7153,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7232,6 +7235,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7243,6 +7247,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Foreign Key Arrays support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -7328,6 +7376,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -7387,17 +7494,17 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		}
 
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
-			ereport(ERROR,
-					(errcode(ERRCODE_DATATYPE_MISMATCH),
-					 errmsg("foreign key constraint \"%s\" "
-							"cannot be implemented",
-							fkconstraint->conname),
-					 errdetail("Key columns \"%s\" and \"%s\" "
-							   "are of incompatible types: %s and %s.",
-							   strVal(list_nth(fkconstraint->fk_attrs, i)),
-							   strVal(list_nth(fkconstraint->pk_attrs, i)),
-							   format_type_be(fktype),
-							   format_type_be(pktype))));
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("foreign key constraint \"%s\" "
+						"cannot be implemented",
+						fkconstraint->conname),
+				 errdetail("Key columns \"%s\" and \"%s\" "
+						   "are of incompatible types: %s and %s.",
+						   strVal(list_nth(fkconstraint->fk_attrs, i)),
+						   strVal(list_nth(fkconstraint->pk_attrs, i)),
+						   format_type_be(fktype),
+						   format_type_be(pktype))));
 
 		if (old_check_ok)
 		{
@@ -7427,6 +7534,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7469,7 +7583,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 							new_castfunc == old_castfunc &&
 							(!IsPolymorphicType(pfeqop_right) ||
 							 new_fktype == old_fktype));
-
 		}
 
 		pfeqoperators[i] = pfeqop;
@@ -7493,6 +7606,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 160d941c00..6c69f18757 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 899a5c4cd4..d0a300d695 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3164,6 +3164,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index bafe0d1071..cbe4cdebff 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2853,6 +2853,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 02ca7d588c..113fdda5b2 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2596,6 +2596,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e6ba096257..e3f863b03e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3506,6 +3506,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 5329432f25..5296ef15cf 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -393,7 +403,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -625,8 +635,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3552,8 +3562,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3747,14 +3759,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3787,6 +3800,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -15003,6 +15039,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16123,6 +16160,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 085aa8766c..7fa070a3c1 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1385,6 +1385,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 	return ptype;
 }
 
+/*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
 /*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index d415d7180f..e4acb68a25 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -762,6 +762,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 8faae1d069..402bde19d4 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -393,6 +396,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -405,12 +409,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -419,18 +438,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Foreign Key Arrays */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -557,7 +599,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -815,7 +858,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -971,7 +1015,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1150,7 +1195,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1368,7 +1414,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1585,7 +1632,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1904,6 +1952,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1921,9 +1977,29 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1934,15 +2010,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1958,10 +2042,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -2134,20 +2223,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2163,14 +2255,59 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprleft))));
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprright))));
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+		ereport(ERROR,
+			(errcode(ERRCODE_UNDEFINED_OBJECT),
+			 errmsg("could not find common type between %s and %s",
+			 format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2378,6 +2515,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2455,6 +2593,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
@@ -2498,6 +2650,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Foreign Key Arrays.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index c5f5a1ca3f..a5314df257 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1901,7 +1904,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1909,13 +1913,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1923,13 +1935,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2205,6 +2219,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 8fca86d71e..96eea9753d 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -103,9 +103,17 @@ CATALOG(pg_constraint,2606)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Foreign Key Arrays, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 6bb1b09714..e720745546 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index a16de289ba..01ba28bdd5 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2069,6 +2069,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2104,6 +2108,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 26af944e03..af00143580 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..2955b57ecc 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..ed991e2fae
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Foreign Key Arrays support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index ad9434fb87..9b7884533f 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -104,7 +104,12 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key  cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+
+# ----------
+# Another group of parallel tests (no room in the previouse group)
+# ----------
+test: element_foreign_key
 
 # ----------
 # Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 27cd49845e..048f260866 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -143,6 +143,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..d012589430
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Foreign Key Arrays with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
\ No newline at end of file
#100Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#99)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

The patch looks good to me now other than some smaller issues, mostly in
the documentation. If you fix these I will set it as ready for
committer, and let a committer chime in on the casting logic which we
both find a bit ugly.

== Comments

The only a bit bigger issue I see is the error messages. Can they be
improved?

For example:

CREATE TABLE t1 (a int, b int, PrIMARY KEY (a, b));
CREATE TABLE t2 (a int, bs int8[], FOREIGN KEY (a, EACH ELEMENT OF bs)
REFERENCES t1 (a, b));
INSERT INTO t2 VALUES (0, ARRAY[1, 2]);

Results in:

ERROR: insert or update on table "t2" violates foreign key constraint
"t2_a_fkey"
DETAIL: Key (a, bs)=(0, {1,2}) is not present in table "t1".

Would it be possible to make the DETAIL something like the below
instead? Do you think my suggested error message is clear?

I am imaging something like the below as a patch. Does it look sane? The
test cases need to be updated at least.

diff --git a/src/backend/utils/adt/ri_triggers.c 
b/src/backend/utils/adt/ri_triggers.c
index 402bde19d4..9dc7c9812c 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -3041,6 +3041,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
                 appendStringInfoString(&key_names, ", ");
                 appendStringInfoString(&key_values, ", ");
             }
+
+           if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+               appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
             appendStringInfoString(&key_names, name);
             appendStringInfoString(&key_values, val);
         }

DETAIL: Key (a, EACH ELEMENT OF bs)=(0, {1,2}) is not present in table
"t1".

-  REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( 
<replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL 
| MATCH PARTIAL | MATCH SIMPLE ]
+  [EACH ELEMENT OF] REFERENCES <replaceable 
class="parameter">reftable</replaceable> [ ( <replaceable 
class="parameter">refcolumn</replaceable> ) ] [ MATCH FULL | MATCH 
PARTIAL | MATCH SIMPLE ]

I think this documentation in doc/src/sgml/ref/create_table.sgml should
be removed since it is no longer correct.

+     <para>
+      Foreign Key Arrays are an extension
+      of PostgreSQL and are not included in the SQL standard.
+     </para>

This pargraph and some of the others you added to
doc/src/sgml/ref/create_table.sgml are strangely line wrapped.

+       <varlistentry>
+        <term><literal>ON DELETE CASCADE</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. Deletes the entire 
array.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>

I thought this was no longer supported.

+       however, this syntax will cast ftest1 to int4 upon RI checks, 
thus defeating the
+      purpose of the index.

There is a minor indentation error on these lines.

+
+   <para>
+     Array <literal>ELEMENT</literal> foreign keys and the <literal>ELEMENT
+     REFERENCES</literal> clause are a 
<productname>PostgreSQL</productname>
+     extension.
+   </para>

We do not have any ELEMENT REFERENCES clause.

-           ereport(ERROR,
-                   (errcode(ERRCODE_DATATYPE_MISMATCH),
-                    errmsg("foreign key constraint \"%s\" "
-                           "cannot be implemented",
-                           fkconstraint->conname),
-                    errdetail("Key columns \"%s\" and \"%s\" "
-                              "are of incompatible types: %s and %s.",
-                              strVal(list_nth(fkconstraint->fk_attrs, i)),
-                              strVal(list_nth(fkconstraint->pk_attrs, i)),
-                              format_type_be(fktype),
-                              format_type_be(pktype))));
+       ereport(ERROR,
+               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                errmsg("foreign key constraint \"%s\" "
+                       "cannot be implemented",
+                       fkconstraint->conname),
+                errdetail("Key columns \"%s\" and \"%s\" "
+                          "are of incompatible types: %s and %s.",
+                          strVal(list_nth(fkconstraint->fk_attrs, i)),
+                          strVal(list_nth(fkconstraint->pk_attrs, i)),
+                          format_type_be(fktype),
+                          format_type_be(pktype))));

It seems like you accidentally change the indentation here,

Andreas

#101Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#100)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Mon, Feb 5, 2018 at 9:46 PM, Andreas Karlsson <andreas@proxel.se> wrote:

The patch looks good to me now other than some smaller issues, mostly in
the documentation. If you fix these I will set it as ready for committer,
and let a committer chime in on the casting logic which we both find a bit
ugly

A new patch including all the fixes is ready.

Can you give the docs another look. I re-wrapped, re-indented and changed
all `Foreign Key Arrays` to `Array Element Foreign Keys` for consistency.

Best Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v7.0.1.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v7.0.1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 71e20f2740..91d4fd717b 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2386,6 +2396,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e1f3428a6..ffc6a92571 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index d2df40d543..c005984881 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -867,10 +867,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -893,6 +893,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -956,7 +968,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -966,6 +979,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -977,6 +991,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -992,6 +1007,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -1981,6 +2063,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 0f34f5381a..21371c29f4 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2127,6 +2127,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index f2cb6d7fb8..d5437ee821 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1265,6 +1265,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 442ae7e23d..37b7a3e275 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 89454d8e80..fd48ff415e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7145,6 +7145,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7152,10 +7153,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7232,6 +7235,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7243,6 +7247,50 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					  errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE RESTRICT amd DELETE CASCADE actions */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -7328,6 +7376,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								 strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+				errmsg("foreign key constraint \"%s\" cannot be implemented",
+					   fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -7427,6 +7534,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7493,6 +7607,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 160d941c00..6c69f18757 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 899a5c4cd4..d0a300d695 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3164,6 +3164,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index bafe0d1071..cbe4cdebff 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2853,6 +2853,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 02ca7d588c..113fdda5b2 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2596,6 +2596,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e6ba096257..e3f863b03e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3506,6 +3506,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 5329432f25..5296ef15cf 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -358,6 +367,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -393,7 +403,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -625,8 +635,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3552,8 +3562,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3747,14 +3759,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3787,6 +3800,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -15003,6 +15039,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16123,6 +16160,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 085aa8766c..7fa070a3c1 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1385,6 +1385,90 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 	return ptype;
 }
 
+/*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool leftispreferred;
+	bool rightispreferred;
+
+	Assert(leftOid  != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can not coerce to it implicitly right to left, thus coercion only works one way */
+				return leftOid;
+			}
+			else
+				{
+					/* coercion works both ways, then decide depending on preferred flag */
+					if (leftispreferred)
+						return leftOid;
+					else
+						return rightOid;
+				}
+		}
+		else{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/* can coerce to it implicitly right to left, thus coercion only works one way */
+				return rightOid;
+			}
+			else{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
 /*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index d415d7180f..e4acb68a25 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -762,6 +762,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 8faae1d069..e748c61e02 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -393,6 +396,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -405,12 +409,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -419,18 +438,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+						"(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+						paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -557,7 +599,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -815,7 +858,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -971,7 +1015,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1150,7 +1195,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1368,7 +1414,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1585,7 +1632,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1904,6 +1952,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1921,9 +1977,29 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1934,15 +2010,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1958,10 +2042,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -2134,20 +2223,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2163,14 +2255,59 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+		 /*
+		  * we first need to get the array types and decide
+		  * the more appropriate one
+		  */
+
+		 /* get array type of refrenced element*/
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprleft))));
+		/* get array type of refrencing element*/
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+			  (errcode(ERRCODE_UNDEFINED_OBJECT),
+			   errmsg("could not find array type for data type %s",
+					format_type_be(operform->oprright))));
+		/* compare the two array types and try to find
+			a common supertype */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+		ereport(ERROR,
+			(errcode(ERRCODE_UNDEFINED_OBJECT),
+			 errmsg("could not find common type between %s and %s",
+			 format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2378,6 +2515,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2455,6 +2593,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
@@ -2498,6 +2650,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array flag
+	 * indicating whether there's an array foreign key, and we want to set
+	 * ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
@@ -2871,6 +3041,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index c5f5a1ca3f..a5314df257 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -314,6 +314,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+							Datum fk_reftype_array,
+							Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1901,7 +1904,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1909,13 +1913,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1923,13 +1935,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2205,6 +2219,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated
+  * list of column names for the indicated relation, prefixed by appropriate
+  * keywords depending on the foreign key reference semantics indicated by
+  * the char[] entries.  Append the text to buf.
+  */
+ static void
+ decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+ {
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 8fca86d71e..8ab7a745cd 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -103,9 +103,17 @@ CATALOG(pg_constraint,2606)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the array's
+	 * element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 6bb1b09714..e720745546 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index a16de289ba..01ba28bdd5 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2069,6 +2069,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+ #define FKCONSTR_REF_PLAIN			'p'
+ #define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2104,6 +2108,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 26af944e03..af00143580 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..2955b57ecc 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_foreign_key.out b/src/test/regress/expected/element_foreign_key.out
new file mode 100644
index 0000000000..0d772fb164
--- /dev/null
+++ b/src/test/regress/expected/element_foreign_key.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index ad9434fb87..9b7884533f 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -104,7 +104,12 @@ test: publication subscription
 # ----------
 # Another group of parallel tests
 # ----------
-test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+test: select_views portals_p2 foreign_key  cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
+
+# ----------
+# Another group of parallel tests (no room in the previouse group)
+# ----------
+test: element_foreign_key
 
 # ----------
 # Another group of parallel tests
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 27cd49845e..048f260866 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -143,6 +143,7 @@ test: amutils
 test: select_views
 test: portals_p2
 test: foreign_key
+test: element_foreign_key
 test: cluster
 test: dependency
 test: guc
diff --git a/src/test/regress/sql/element_foreign_key.sql b/src/test/regress/sql/element_foreign_key.sql
new file mode 100644
index 0000000000..d7f7d78871
--- /dev/null
+++ b/src/test/regress/sql/element_foreign_key.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
\ No newline at end of file
#102Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#101)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 02/06/2018 11:15 AM, Mark Rofail wrote:

A new patch including all the fixes is ready.

Can you give the docs another look. I re-wrapped, re-indented  and
changed all `Foreign Key Arrays` to `Array Element Foreign Keys` for
consistency.

Looks good to me so set it to ready for committer. I still feel the type
casting logic is a bit ugly but I am not sure if it can be improved much.

Andreas

#103Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Andreas Karlsson (#102)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Andreas Karlsson wrote:

On 02/06/2018 11:15 AM, Mark Rofail wrote:

A new patch including all the fixes is ready.

Can you give the docs another look. I re-wrapped, re-indented� and
changed all `Foreign Key Arrays` to `Array Element Foreign Keys` for
consistency.

Looks good to me so set it to ready for committer. I still feel the type
casting logic is a bit ugly but I am not sure if it can be improved much.

I gave this a quick look. I searched for the new GIN operator so that I
could brush it up for commit ahead of the rest -- only to find out that
it was eviscerated from the patch between v5 and v5.1. The explanation
for doing so is that the GIN code had some sort of bug that made it
crash; so the performance was measured to see if the GIN operator was
worth it, and the numbers are pretty confusing (the test don't seem
terribly exhaustive; some numbers go up, some go down, it doesn't appear
that the tests were run more than once for each case therefore the
numbers are pretty noisy) so the decision was to ditch all the GIN
support code anyway ..?? I didn't go any further since ISTM the GIN
operator prerequisite was there for good reasons, so we'll need to see
much more evidence that it's really unneeded before deciding to omit it.

At this point I'm not sure what to do with this patch. It needs a lot
of further work, for which I don't have time now, and given the pressure
we're under I think we should punt it to the next dev cycle.

Here's a rebased pgindented version. I renamed the regression test. I
didn't touch anything otherwise.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

Array-ELEMENT-foreign-key-v8.patchtext/plain; charset=us-asciiDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index a0e6d7062b..d6ad238cd4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2342,6 +2342,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2387,6 +2397,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+  <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 2b879ead4b..8b95352256 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 9e8e9d8f1c..24814d347f 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -885,10 +885,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -912,6 +912,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -974,7 +986,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -984,6 +997,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -995,6 +1009,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1010,6 +1025,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2000,6 +2082,15 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index cf36ce4add..c2e69ec5d0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2127,6 +2127,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 431bc31969..dcf7ac9284 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1293,6 +1293,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 731c5e4317..b01b085e3e 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -82,6 +83,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -119,7 +121,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -136,6 +142,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -188,6 +195,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 74e020bffc..bc0ffb02b1 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7160,6 +7160,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7167,10 +7168,12 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7247,6 +7250,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7259,6 +7263,53 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7344,6 +7395,65 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7442,6 +7552,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7508,6 +7625,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index fbd176b5d0..3bff553ef1 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -661,6 +661,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1032,6 +1033,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1061,7 +1063,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1200,6 +1205,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index bf3cd3a454..a47c70d0f8 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3163,6 +3163,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index f84da801c6..32eef6197f 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2863,6 +2863,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index ee8d925db1..c0f8d23841 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2598,6 +2598,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 1785ea3918..d91953672e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3517,6 +3517,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 06c03dff3c..2cb5738b4e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -359,6 +368,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -394,7 +404,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -627,8 +637,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3557,8 +3567,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3753,14 +3765,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3793,6 +3806,29 @@ columnElem: ColId
 					$$ = (Node *) makeString($1);
 				}
 		;
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
 
 key_match:  MATCH FULL
 			{
@@ -15029,6 +15065,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16152,6 +16189,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 665d3327a0..fded728776 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1385,6 +1385,102 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid
+select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool		leftispreferred;
+	bool		rightispreferred;
+
+	Assert(leftOid != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can not coerce to it implicitly right to left, thus
+				 * coercion only works one way
+				 */
+				return leftOid;
+			}
+			else
+			{
+				/*
+				 * coercion works both ways, then decide depending on
+				 * preferred flag
+				 */
+				if (leftispreferred)
+					return leftOid;
+				else
+					return rightOid;
+			}
+		}
+		else
+		{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can coerce to it implicitly right to left, thus coercion
+				 * only works one way
+				 */
+				return rightOid;
+			}
+			else
+			{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 0fd14f43c6..9d0244fc6d 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -761,6 +761,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 8faae1d069..f535a2eeb0 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_add_cast_to(StringInfo buf, Oid typid);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(HeapTuple tup,
@@ -393,6 +396,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -405,12 +409,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -419,18 +438,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -557,7 +599,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -815,7 +858,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -971,7 +1015,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1150,7 +1195,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1368,7 +1414,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1585,7 +1632,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1904,6 +1952,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1921,9 +1977,29 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	appendStringInfo(&querybuf,
-					 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+		appendStringInfo(&querybuf,
+						 " FROM ONLY %s fk LEFT OUTER JOIN ONLY %s pk ON",
+						 fkrelname, pkrelname);
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1934,15 +2010,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1958,10 +2042,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -2134,20 +2223,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * The idea is to append " sep leftop op rightop" to buf.  The complexity
- * comes from needing to be sure that the parser will select the desired
- * operator.  We always name the operator using OPERATOR(schema.op) syntax
- * (readability isn't a big priority here), so as to avoid search-path
- * uncertainties.  We have to emit casts too, if either input isn't already
- * the input type of the operator; else we are at the mercy of the parser's
- * heuristics for ambiguous-operator resolution.
- */
+ * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * The complexity comes from needing to be sure that the parser will select
+ * the desired operator.  We always name the operator using
+ * OPERATOR(schema.op) syntax (readability isn't a big priority here), so as
+ * to avoid search-path uncertainties.  We have to emit casts too, if either
+ * input isn't already the input type of the operator; else we are at the
+ * mercy of the parser's heuristics for ambiguous-operator resolution.
+  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -2163,14 +2255,62 @@ ri_GenerateQual(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfo(buf, " %s %s", sep, leftop);
-	if (leftoptype != operform->oprleft)
-		ri_add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		ri_add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfo(buf, " %s %s", sep, rightop);
+		if (oprleft != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			ri_add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfo(buf, " %s %s", sep, leftop);
+		if (leftoptype != operform->oprleft)
+			ri_add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			ri_add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
@@ -2378,6 +2518,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2456,6 +2597,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 		pfree(arr);				/* free de-toasted copy, if any */
 
 	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
+	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
 		elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
@@ -2498,6 +2653,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
@@ -2871,6 +3044,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index b58ee3c387..96eca70838 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -316,6 +316,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1914,7 +1917,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1922,13 +1926,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1936,13 +1948,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2218,6 +2232,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+  * column names for the indicated relation, prefixed by appropriate keywords
+  * depending on the foreign key reference semantics indicated by the char[]
+  * entries.  Append the text to buf.
+  */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 8fca86d71e..f3aca8d400 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -104,8 +104,16 @@ CATALOG(pg_constraint,2606)
 	int16		confkey[1];
 
 	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
+	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -150,7 +158,7 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *		compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint					24
+#define Natts_pg_constraint					25
 #define Anum_pg_constraint_conname			1
 #define Anum_pg_constraint_connamespace		2
 #define Anum_pg_constraint_contype			3
@@ -169,12 +177,13 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define Anum_pg_constraint_connoinherit		16
 #define Anum_pg_constraint_conkey			17
 #define Anum_pg_constraint_confkey			18
-#define Anum_pg_constraint_conpfeqop		19
-#define Anum_pg_constraint_conppeqop		20
-#define Anum_pg_constraint_conffeqop		21
-#define Anum_pg_constraint_conexclop		22
-#define Anum_pg_constraint_conbin			23
-#define Anum_pg_constraint_consrc			24
+#define Anum_pg_constraint_confreftype		19
+#define Anum_pg_constraint_conpfeqop		20
+#define Anum_pg_constraint_conppeqop		21
+#define Anum_pg_constraint_conffeqop		22
+#define Anum_pg_constraint_conexclop		23
+#define Anum_pg_constraint_conbin			24
+#define Anum_pg_constraint_consrc			25
 
 /* ----------------
  *		initial contents of pg_constraint
@@ -195,7 +204,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* PG_CONSTRAINT_H */
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index d3351f4a83..fa60568470 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -40,6 +40,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index f668cbad34..722d6c9016 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2084,6 +2084,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2119,6 +2123,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index cf32197bc3..ac3394aaa3 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..0ee94ee95f 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid	select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..0d772fb164
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index ad9434fb87..b99e984071 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -89,7 +89,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext
+test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext element_fk
 
 # rules cannot run concurrently with any test that creates a view
 test: rules psql_crosstab amutils
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 27cd49845e..e5738f5f67 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -133,6 +133,7 @@ test: sysviews
 test: tsrf
 test: tidscan
 test: stats_ext
+test: element_fk
 test: rules
 test: psql_crosstab
 test: select_parallel
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..d7f7d78871
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
#104David Steele
david@pgmasters.net
In reply to: Alvaro Herrera (#103)
Re: Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 3/7/18 5:43 AM, Alvaro Herrera wrote:

At this point I'm not sure what to do with this patch. It needs a lot
of further work, for which I don't have time now, and given the pressure
we're under I think we should punt it to the next dev cycle.

Here's a rebased pgindented version. I renamed the regression test. I
didn't touch anything otherwise.

I have changed this entry to Waiting on Author in case Mark wants to
comment. At the end of the CF it will be Returned with Feedback.

Regards,
--
-David
david@pgmasters.net

#105Mark Rofail
markm.rofail@gmail.com
In reply to: David Steele (#104)
Re: Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 3/7/18 5:43 AM, Alvaro Herrera wrote:

I searched for the new GIN operator so that I

could brush it up for commit ahead of the rest -- only to find out that
it was eviscerated from the patch between v5 and v5.1.

The latest version of the patch which contained the new GIN operator is

version `*Array-ELEMENT-foreign-key-v6.patch
</messages/by-id/attachment/58007/Array-ELEMENT-foreign-key-v6.patch&gt;*%60
which works fine and passed all the regression tests at the time
(2018-01-21). We abandoned the GIN operator since it couldn't follow the
same logic as the rest of GIN operators use since it operates on a Datum
not an array. Not because of any error.

just as Andreas said

On Wed, Jan 31, 2018 at 1:52 AM, Andreas Karlsson
<andreas(at)proxel(dot)se> wrote:

The issue I see is that

ginqueryarrayextract() needs to make a copy of the search key but to do
so it needs to know the type of anyelement (to know if it needs to
detoast, etc). But there is as far as I can tell no way to check the
type of anyelement in this context.

If there is any way to obtain a copy of the datum I would be more than
happy to integrate the GIN operator to the patch.

Best.
Mark Rofail

#106David Steele
david@pgmasters.net
In reply to: Mark Rofail (#105)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On 3/26/18 4:50 PM, Mark Rofail wrote:

On 3/7/18 5:43 AM, Alvaro Herrera wrote:

I searched for the new GIN operator so that I
could brush it up for commit ahead of the rest -- only to find out that
it was eviscerated from the patch between v5 and v5.1.

The latest version of the patch which contained the new GIN operator is
version  `*Array-ELEMENT-foreign-key-v6.patch
</messages/by-id/attachment/58007/Array-ELEMENT-foreign-key-v6.patch&gt;*%60
which works fine and passed all the regression tests at the time
(2018-01-21). We abandoned the GIN operator since it couldn't follow the
same logic as the rest of GIN operators use since it operates on a Datum
not an array. Not because of any error.

just as Andreas said

On Wed, Jan 31, 2018 at 1:52 AM, Andreas Karlsson <andreas(at)proxel(dot)se> wrote:

The issue I see is that
ginqueryarrayextract() needs to make a copy of the search key but to do
so it needs to know the type of anyelement (to know if it needs to
detoast, etc). But there is as far as I can tell no way to check the
type of anyelement in this context.

 
If there is any way to  obtain a copy of the datum I would be more than
happy to integrate the GIN operator to the patch.

Since you have expressed a willingness to continue work on this patch I
have moved it to the next CF in Waiting on Author state.

You should produce a new version by then that addresses Alvaro's
concerns and I imagine that will require quite a bit of discussion and
work. Everyone is a bit fatigued at the moment so it would best to hold
off on that for a while.

Regards,
--
-David
david@pgmasters.net

#107Mark Rofail
markm.rofail@gmail.com
In reply to: David Steele (#106)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello David,

On Tue, Apr 10, 2018 at 3:47 PM, David Steele <david@pgmasters.net> wrote:

You should produce a new version by then that addresses Alvaro's
concerns and I imagine that will require quite a bit of discussion and
work.

I'll get working.
I'll produce a patch with two alternate versions, one with and one without
the GIN operators.

On 3/7/18 5:43 AM, Alvaro Herrera wrote:

so the performance was measured to see if the GIN operator was
worth it, and the numbers are pretty confusing (the test don't seem
terribly exhaustive; some numbers go up, some go down, it doesn't appear
that the tests were run more than once for each case therefore the
numbers are pretty noisy

Any ideas how to perform more exhaustive tests ?

On 3/26/18 4:50 PM, Mark Rofail wrote:

On Wed, Jan 31, 2018 at 1:52 AM, Andreas Karlsson

<andreas(at)proxel(dot)se> wrote:

The issue I see is that
ginqueryarrayextract() needs to make a copy of the search key but to

do

so it needs to know the type of anyelement (to know if it needs to
detoast, etc). But there is as far as I can tell no way to check the
type of anyelement in this context.

If there is any way to obtain a copy of the datum I would be more than
happy to integrate the GIN operator to the patch.

as I said before we need a way to obtain a copy of a datum to comply with
the context of ginqueryarrayextract()

Best Regards

#108Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#107)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

Hello David,

On Tue, Apr 10, 2018 at 3:47 PM, David Steele <david@pgmasters.net> wrote:

You should produce a new version by then that addresses Alvaro's
concerns and I imagine that will require quite a bit of discussion and
work.

I'll get working.
I'll produce a patch with two alternate versions, one with and one without
the GIN operators.

I'd rather see one patch with just the GIN operator (you may think it's
a very small patch, but that's only because you forget to add
documentation to it and a few extensive tests to ensure it works well);
then the array-fk stuff as a follow-on patch.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#109Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#108)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Tue, Apr 10, 2018 at 3:59 PM, Alvaro Herrera <alvherre@alvh.no-ip.org>
wrote:

documentation to it and a few extensive tests to ensure it works well);

I think the existing regression tests verify that the patch works as
expectations, correct?

We need more *exhaustive* tests to test performance, not functionality.

Regards

#110Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#109)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

On Tue, Apr 10, 2018 at 3:59 PM, Alvaro Herrera <alvherre@alvh.no-ip.org>
wrote:

documentation to it and a few extensive tests to ensure it works well);

I think the existing regression tests verify that the patch works as
expectations, correct?

I meant for the GIN operator. (Remember, these are two patches, and each
of them needs its own tests.)

We need more *exhaustive* tests to test performance, not functionality.

True. So my impression from the numbers you posted last time is that
you need to run each measurement case several times, and provide
averages/ stddevs/etc for the resulting numbers, and see about outliers
(maybe throw them away, or maybe they indicate some problem in the test
or in the code); then we can make an informed decision about whether the
variations between the several different scenarios are real improvements
(or pessimizations) or just measurement noise.

In particular: it seemed to me that you decided to throw away the idea
of the new GIN operator without sufficient evidence that it was
unnecessary.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#111Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#110)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Tue, 10 Apr 2018 at 4:17 pm, Alvaro Herrera <alvherre@alvh.no-ip.org>
wrote:

Mark Rofail wrote:
I meant for the GIN operator. (Remember, these are two patches, and each
of them needs its own tests.)

Yes, you are right. I have been dealing with the code as a single patch
that I almost forgot.

True. So my impression from the numbers you posted last time is that

you need to run each measurement case several times, and provide
averages/ stddevs/etc for the resulting numbers, and see about outliers
(maybe throw them away, or maybe they indicate some problem in the test
or in the code); then we can make an informed decision about whether the
variations between the several different scenarios are real improvements
(or pessimizations) or just measurement noise.

I'd rather just throw away the previous results and start over with new
performance tests. However, like I showed you, it was my first time to
write performance tests. If there's something I could use as a reference
that would help me so much.

In particular: it seemed to me that you decided to throw away the idea
of the new GIN operator without sufficient evidence that it was
unnecessary.

I have to admit to that. But in my defence @> is also GIN indexable so the
only difference in performance between 'anyarray @>> anyelement' and
'anyarray @> ARRAY [anyelement]' is the delay caused by the ARRAY[]
operation theoretically.

I apologise, however, I needed more evidence to support my claims.

Regards

On Tue, Apr 10, 2018 at 4:17 PM, Alvaro Herrera <alvherre@alvh.no-ip.org>
wrote:

Show quoted text

Mark Rofail wrote:

On Tue, Apr 10, 2018 at 3:59 PM, Alvaro Herrera <alvherre@alvh.no-ip.org

wrote:

documentation to it and a few extensive tests to ensure it works well);

I think the existing regression tests verify that the patch works as
expectations, correct?

I meant for the GIN operator. (Remember, these are two patches, and each
of them needs its own tests.)

We need more *exhaustive* tests to test performance, not functionality.

True. So my impression from the numbers you posted last time is that
you need to run each measurement case several times, and provide
averages/ stddevs/etc for the resulting numbers, and see about outliers
(maybe throw them away, or maybe they indicate some problem in the test
or in the code); then we can make an informed decision about whether the
variations between the several different scenarios are real improvements
(or pessimizations) or just measurement noise.

In particular: it seemed to me that you decided to throw away the idea
of the new GIN operator without sufficient evidence that it was
unnecessary.

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#112Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#111)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Mark Rofail wrote:

In particular: it seemed to me that you decided to throw away the idea
of the new GIN operator without sufficient evidence that it was
unnecessary.

I have to admit to that. But in my defence @> is also GIN indexable so the
only difference in performance between 'anyarray @>> anyelement' and
'anyarray @> ARRAY [anyelement]' is the delay caused by the ARRAY[]
operation theoretically.

I think I need to review Tom's bounce-for-rework email
/messages/by-id/28389.1351094795@sss.pgh.pa.us
to respond to this intelligently. Tom mentioned @> there but there was
a comment about the comparison semantics used by that operator, so I'm
unclear on whether or not that issue has been fixed.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#113Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#112)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

I was wondering if anyone knows the proper way to write a benchmarking test
for the @>> operator. I used the below script in my previous attempt
https://gist.github.com/markrofail/174ed370a2f2ac24800fde2fc27e2d38
The script does the following steps:

1. Generate Table A with 5 rows
2. Generate Table B with n rows such as:
every row of Table B is an array of IDs referencing rows in Table A.

The tests we ran previously had Table B up to 1 million rows and the
results can be seen here :
/messages/by-id/CAJvoCusMuLnYZUbwTBKt+p6bB9GwiTqF95OsQFHXixJj3LkxVQ@mail.gmail.com

How would we change this so it would be more exhaustive and accurate?

Regards,
Mark Rofail

#114Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#113)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

I am having trouble rebasing the patch to the current head. I resolved all
conflicts, but there are changes to the codebase that I cannot accommodate.

issue 1: `pg_constraint.c:564`
I need to check that `conppeqop` is not null and copy it but I don't know
how to check its type since its a char*

issue 2: `matview.c:768`
I need to pass `fkreftype` but I don't have it in the rest of the function

In other news, I am currently working on exhaustive tests for the GIN
operator, but some pointers on how to do so would be appreciated.

Regards,
Mark Rofail

On Wed, May 16, 2018 at 10:31 AM, Mark Rofail <markm.rofail@gmail.com>
wrote:

Show quoted text

I was wondering if anyone knows the proper way to write a benchmarking
test for the @>> operator. I used the below script in my previous attempt
https://gist.github.com/markrofail/174ed370a2f2ac24800fde2fc27e2d38
The script does the following steps:

1. Generate Table A with 5 rows
2. Generate Table B with n rows such as:
every row of Table B is an array of IDs referencing rows in Table A.

The tests we ran previously had Table B up to 1 million rows and the
results can be seen here :
/messages/by-id/CAJvoCusMuLnYZUbwTBKt%25
2Bp6bB9GwiTqF95OsQFHXixJj3LkxVQ%40mail.gmail.com

How would we change this so it would be more exhaustive and accurate?

Regards,
Mark Rofail

Attachments:

Array-ELEMENT-foreign-key-v8.1.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v8.1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 3ed9021c2f..cf5e30a58f 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2389,6 +2389,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
      </row>
 
      <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+ 
+     <row>      
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
       <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
@@ -2434,6 +2444,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
   </table>
 
   <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
+  <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
    For other cases, a zero appears in <structfield>conkey</structfield>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 2cd0b8ab9d..27def5ffbb 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -882,6 +882,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2a1eac9592..9ea9afe5fb 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -910,10 +910,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -939,6 +939,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
+     <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
       given match type.  There are three match types: <literal>MATCH
@@ -1001,7 +1013,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1011,6 +1024,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1022,6 +1036,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1037,6 +1052,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2027,6 +2109,15 @@ CREATE TABLE cities_partdef
   </refsect2>
 
   <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
+  <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
    <para>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 39813de991..700d31926d 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2276,6 +2276,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 8b276bc430..cb99f28c9b 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1310,6 +1310,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 7a6d158f89..68f9900efb 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -63,6 +63,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -87,6 +88,7 @@ CreateConstraintEntry(const char *constraintName,
 	ArrayType  *conkeyArray;
 	ArrayType  *conincludingArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -139,7 +141,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -156,6 +162,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -214,6 +221,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -452,6 +464,7 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		Oid			fkreftypes[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -504,6 +517,20 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned)
 			elog(ERROR, "confkey is not a 1-D smallint array");
 		memcpy(confkey, ARR_DATA_PTR(arr), nelem * sizeof(AttrNumber));
 
+		datum = fastgetattr(tuple, Anum_pg_constraint_confreftype,
+							tupdesc, &isnull);
+		if (isnull)
+			elog(ERROR, "null confreftype");
+		arr = DatumGetArrayTypeP(datum);
+		nelem = ARR_DIMS(arr)[0];
+		if (ARR_NDIM(arr) != 1 ||
+			nelem < 1 ||
+			nelem > INDEX_MAX_KEYS ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != OIDOID)
+			elog(ERROR, "conpfeqop is not a 1-D OID array");
+		memcpy(fkreftypes, ARR_DATA_PTR(arr), nelem * sizeof(Oid));
+
 		datum = fastgetattr(tuple, Anum_pg_constraint_conpfeqop,
 							tupdesc, &isnull);
 		if (isnull)
@@ -542,8 +569,8 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned)
 			nelem < 1 ||
 			nelem > INDEX_MAX_KEYS ||
 			ARR_HASNULL(arr) ||
-			ARR_ELEMTYPE(arr) != OIDOID)
-			elog(ERROR, "conppeqop is not a 1-D OID array");
+			ARR_ELEMTYPE(arr) != char*)
+			elog(ERROR, "conppeqop is not a string array");
 		memcpy(conppeqop, ARR_DATA_PTR(arr), nelem * sizeof(Oid));
 
 		datum = fastgetattr(tuple, Anum_pg_constraint_conffeqop,
@@ -576,6 +603,7 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned)
 								  constrForm->conindid, /* same index */
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  fkreftypes,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index e1eb7c374b..9a9bf9179d 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -580,6 +580,7 @@ static void
 refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 					   int save_sec_context)
 {
+	const RI_ConstraintInfo *riinfo;
 	StringInfoData querybuf;
 	Relation	matviewRel;
 	Relation	tempRel;
@@ -593,6 +594,12 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 	int16		relnatts;
 	Oid		   *opUsedForQual;
 
+	/*
+	 * Get arguments.
+	 */
+	riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger,
+									trigdata->tg_relation, true);
+
 	initStringInfo(&querybuf);
 	matviewRel = heap_open(matviewOid, NoLock);
 	matviewname = quote_qualified_identifier(get_namespace_name(RelationGetNamespace(matviewRel)),
@@ -757,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 riinfo->fk_reftypes[i]);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 0e95037dcf..ba98fce5fc 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7282,6 +7282,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7289,10 +7290,12 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7384,6 +7387,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7396,6 +7400,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkattnum, fktypoid);
 
 	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
+	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
 	 * supplied attribute list.  In either case, discover the index OID and
@@ -7481,6 +7532,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 		eqstrategy = BTEqualStrategyNumber;
 
 		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
+		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
 		 */
@@ -7579,6 +7689,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7647,6 +7764,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 57519fe8d6..0e769739dc 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -743,6 +743,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1238,6 +1239,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1267,7 +1269,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1406,6 +1411,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 175ecc8b48..881ffa6145 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3162,6 +3162,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 7c045a7afe..3c7656f705 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2900,6 +2900,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 6a971d0141..317d5377a0 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2591,6 +2591,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 1da9d7ed15..a06b5c7dce 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3560,6 +3560,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 90dfac2cb1..3716ebda7f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -359,6 +368,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -395,7 +405,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -628,8 +638,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3560,8 +3570,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3761,14 +3773,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3802,6 +3815,30 @@ columnElem: ColId
 				}
 		;
 
+ foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+ foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15066,6 +15103,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16190,6 +16228,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index c31a5630b2..261121e916 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1385,6 +1385,102 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 }
 
 /*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid
+select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool		leftispreferred;
+	bool		rightispreferred;
+
+	Assert(leftOid != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can not coerce to it implicitly right to left, thus
+				 * coercion only works one way
+				 */
+				return leftOid;
+			}
+			else
+			{
+				/*
+				 * coercion works both ways, then decide depending on
+				 * preferred flag
+				 */
+				if (leftispreferred)
+					return leftOid;
+				else
+					return rightOid;
+			}
+		}
+		else
+		{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can coerce to it implicitly right to left, thus coercion
+				 * only works one way
+				 */
+				return rightOid;
+			}
+			else
+			{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
+/*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
  *
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 17b54b20cc..aa49a76ea5 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -755,6 +755,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index fc034ce601..4d49c242a5 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(TupleDesc tupdesc, HeapTuple tup,
 			 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -392,6 +395,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -404,12 +408,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -418,15 +437,38 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
 		/* Prepare and save the plan */
 		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
 							 &qkey, fk_rel, pk_rel, true);
@@ -556,7 +598,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -817,7 +860,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -977,7 +1021,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1160,7 +1205,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1382,7 +1428,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1603,7 +1650,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1923,6 +1971,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1940,11 +1996,33 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fk_only, fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (i = 0; i < riinfo->nkeys; i)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{		
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+					 	 " FROM %s%s fk LEFT OUTER JOIN ONLY %s pk ON",
+					 	 fk_only, fkrelname, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1955,15 +2033,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
 		quoteOneName(fkattname + 3,
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1979,10 +2065,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
 		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		appendStringInfo(&querybuf,
 						 "%sfk.%s IS NOT NULL",
 						 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -2155,21 +2246,24 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop" to buf.
+ *
+ * As well as adding casts and schema qualification as needed to ensure that
+ * the parser will select the operator we specify.  leftop and rightop should
+ * be parenthesized if they aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2338,6 +2432,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		isNull;
 	ArrayType  *arr;
 	int			numkeys;
+	int			i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2415,6 +2510,20 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	adatum = SysCacheGetAttr(CONSTROID, tup,
+							 Anum_pg_constraint_confreftype, &isNull);
+	if (isNull)
+		elog(ERROR, "null confreftype for constraint %u", constraintOid);
+	arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+	if (ARR_NDIM(arr) != 1 ||
+		ARR_DIMS(arr)[0] != numkeys ||
+		ARR_HASNULL(arr) ||
+		ARR_ELEMTYPE(arr) != CHAROID)
+		elog(ERROR, "confreftype is not a 1-D char array");
+	memcpy(riinfo->fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+	if ((Pointer) arr != DatumGetPointer(adatum))
+		pfree(arr);				/* free de-toasted copy, if any */
+
 	adatum = SysCacheGetAttr(CONSTROID, tup,
 							 Anum_pg_constraint_conpfeqop, &isNull);
 	if (isNull)
@@ -2458,6 +2567,24 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < numkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
+
 	ReleaseSysCache(tup);
 
 	/*
@@ -2831,6 +2958,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 065238b0fe..59a7a990a0 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -317,6 +317,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static void decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1934,7 +1937,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1942,13 +1946,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1956,13 +1968,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2251,6 +2265,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	}
 }
 
+ /*
+  * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+  * column names for the indicated relation, prefixed by appropriate keywords
+  * depending on the foreign key reference semantics indicated by the char[]
+  * entries.  Append the text to buf.
+  */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_relid_attribute_name(relId, DatumGetInt16(keys[j]));
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
@@ -10907,7 +10981,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -10923,14 +10998,62 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfoString(buf, rightop);
+		if (oprleft != oprcommon)
+			add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 7c1c0e1db8..096b0d583f 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -116,9 +116,17 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -172,7 +180,9 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
  * constants defined in parsenodes.h.  Valid values for confmatchtype are
- * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.  Valid values
+ * for elements of confreftype[] are the FKCONSTR_REF_xxx constants defined
+ * in parsenodes.h.
  */
 
 #endif							/* EXPOSE_TO_CLIENT_CODE */
@@ -216,6 +226,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 6390f7e8c1..1aabaf5b7d 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2086,6 +2086,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2124,6 +2128,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 23db40147b..9107e9179e 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..8a677eac9c 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid	select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index d0416e90fc..2e8e84b2c4 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -81,7 +81,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype);
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..4e6c8f2636
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_fkey"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 16f979c8d9..7a2b82368b 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -89,7 +89,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext
+test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext element_fk
 
 # rules cannot run concurrently with any test that creates a view
 test: rules psql_crosstab amutils
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 42632be675..257602b9c6 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -135,6 +135,7 @@ test: sysviews
 test: tsrf
 test: tidscan
 test: stats_ext
+test: element_fk
 test: rules
 test: psql_crosstab
 test: select_parallel
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..8c70afd7d4
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
#115Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#114)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

I am still having problems rebasing this patch. I can not figure it out on
my own.

On Sun, 27 May 2018 at 5:31 pm, Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

issue 1: `pg_constraint.c:564`
I need to check that `conppeqop` is not null and copy it but I don't know
how to check its type since its a char*

issue 2: `matview.c:768`
I need to pass `fkreftype` but I don't have it in the rest of the functIon

On Wed, May 16, 2018 at 10:31 AM, Mark Rofail <markm.rofail@gmail.com>
wrote:

I was wondering if anyone knows the proper way to write a benchmarking
test for the @>> operator. I used the below script in my previous attempt
https://gist.github.com/markrofail/174ed370a2f2ac24800fde2fc27e2d38
The script does the following steps:

1. Generate Table A with 5 rows
2. Generate Table B with n rows such as:
every row of Table B is an array of IDs referencing rows in Table A.

The tests we ran previously had Table B up to 1 million rows and the
results can be seen here :

/messages/by-id/CAJvoCusMuLnYZUbwTBKt+p6bB9GwiTqF95OsQFHXixJj3LkxVQ@mail.gmail.com

How would we change this so it would be more exhaustive and accurate?

Regards,
Mark Rofail

#116Michael Paquier
michael@paquier.xyz
In reply to: Mark Rofail (#115)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sat, Aug 11, 2018 at 05:20:57AM +0200, Mark Rofail wrote:

I am still having problems rebasing this patch. I can not figure it out on
my own.

Okay, it's been a couple of months since this last email, and nothing
has happened, so I am marking it as returned with feedback.
--
Michael

#117Mark Rofail
markm.rofail@gmail.com
In reply to: Michael Paquier (#116)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Greetings,

I am trying to revive this patch, Foreign Key Arrays. The original proposal
from my GSoC 2017 days can be found here:
/messages/by-id/CAJvoCut7zELHnBSC8HrM6p-R6q-NiBN1STKhqnK5fPE-9=Gq3g@mail.gmail.com

Disclaimer, I am not the original author of this patch, I picked up this
patch in 2017 to migrate the original patch from 2012 and add a GIN index
to make it usable as the performance without a GIN index is not usable
after 100 rows.
The original authors, Tom Lane and Marco Nenciarini, are the ones who did
most of the heavy lifting. The original discussion can be found here:
/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan

*In brief, it would be used as follows:*
```sql
CREATE TABLE A ( atest1 int PRIMARY KEY, atest2 text );
CREATE TABLE B ( btest1 int[], btest2 int );
ALTER TABLE B ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF
btest1) REFERENCES A;
```
and now table B references table A as follows:
```sql
INSERT INTO B VALUES ('{10,1}', 2);
```
where this row references rows 1 and 10 from A without the need of a
many-to-many table

*Changelog (since the last version, v8):*
- v9 (made compatible with Postgresql 11)
support `DeconstructFkConstraintRow`
support `CloneFkReferencing`
support `generate_operator_clause`

- v10 (made compatible with Postgresql v12)
support `addFkRecurseReferenced` and `addFkRecurseReferencing`
support `CloneFkReferenced` and `CloneFkReferencing`
migrate tests

- v11(make compatible with Postgresql v13)
drop `ConvertTriggerToFK`
drop `select_common_type_2args` in favor of `select_common_type_from_oids`
migrate tests

- v12(made compatible with current master, 2021-01-23,
commit a8ed6bb8f4cf259b95c1bff5da09a8f4c79dca46)
add ELEMENT to `bare_label_keyword`
migrate docs

*Todo:*
- re-add @>> operator which allows comparison of between array and element
and returns true iff the element is within the array
to allow easier select statements and lower overhead of explicitly creating
an array within the SELECT statement.

```diff
    - SELECT * FROM B WHERE btest1 @> ARRAY[5];
    + SELECT * FROM B WHERE btest1 @>> 5;
```

I apologize it took so long to get a new version here (years). However,
this is not the first time I tried to migrate the patch, every time a
different issue blocked me from doing so.
Reviews and suggestions are most welcome, @Joel Jacobson
<joel@compiler.org> please
review and test as previously agreed.

/Mark

On Tue, Oct 2, 2018 at 7:13 AM Michael Paquier <michael@paquier.xyz> wrote:

Show quoted text

On Sat, Aug 11, 2018 at 05:20:57AM +0200, Mark Rofail wrote:

I am still having problems rebasing this patch. I can not figure it out

on

my own.

Okay, it's been a couple of months since this last email, and nothing
has happened, so I am marking it as returned with feedback.
--
Michael

#118Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#117)
4 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Changelog (since the last version, v8):

Below are the versions mentioned in the changelog. v12 is the latest
version.

/Mark

On Sat, Jan 23, 2021 at 2:34 PM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

Greetings,

I am trying to revive this patch, Foreign Key Arrays. The original
proposal from my GSoC 2017 days can be found here:

/messages/by-id/CAJvoCut7zELHnBSC8HrM6p-R6q-NiBN1STKhqnK5fPE-9=Gq3g@mail.gmail.com

Disclaimer, I am not the original author of this patch, I picked up this
patch in 2017 to migrate the original patch from 2012 and add a GIN index
to make it usable as the performance without a GIN index is not usable
after 100 rows.
The original authors, Tom Lane and Marco Nenciarini, are the ones who did
most of the heavy lifting. The original discussion can be found here:

/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan

*In brief, it would be used as follows:*
```sql
CREATE TABLE A ( atest1 int PRIMARY KEY, atest2 text );
CREATE TABLE B ( btest1 int[], btest2 int );
ALTER TABLE B ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF
btest1) REFERENCES A;
```
and now table B references table A as follows:
```sql
INSERT INTO B VALUES ('{10,1}', 2);
```
where this row references rows 1 and 10 from A without the need of a
many-to-many table

*Changelog (since the last version, v8):*
- v9 (made compatible with Postgresql 11)
support `DeconstructFkConstraintRow`
support `CloneFkReferencing`
support `generate_operator_clause`

- v10 (made compatible with Postgresql v12)
support `addFkRecurseReferenced` and `addFkRecurseReferencing`
support `CloneFkReferenced` and `CloneFkReferencing`
migrate tests

- v11(make compatible with Postgresql v13)
drop `ConvertTriggerToFK`
drop `select_common_type_2args` in favor of `select_common_type_from_oids`
migrate tests

- v12(made compatible with current master, 2021-01-23,
commit a8ed6bb8f4cf259b95c1bff5da09a8f4c79dca46)
add ELEMENT to `bare_label_keyword`
migrate docs

*Todo:*
- re-add @>> operator which allows comparison of between array and element
and returns true iff the element is within the array
to allow easier select statements and lower overhead of explicitly
creating an array within the SELECT statement.

```diff
- SELECT * FROM B WHERE btest1 @> ARRAY[5];
+ SELECT * FROM B WHERE btest1 @>> 5;
```

I apologize it took so long to get a new version here (years). However,
this is not the first time I tried to migrate the patch, every time a
different issue blocked me from doing so.
Reviews and suggestions are most welcome, @Joel Jacobson
<joel@compiler.org> please review and test as previously agreed.

/Mark

On Tue, Oct 2, 2018 at 7:13 AM Michael Paquier <michael@paquier.xyz>
wrote:

On Sat, Aug 11, 2018 at 05:20:57AM +0200, Mark Rofail wrote:

I am still having problems rebasing this patch. I can not figure it out

on

my own.

Okay, it's been a couple of months since this last email, and nothing
has happened, so I am marking it as returned with feedback.
--
Michael

Attachments:

Array-ELEMENT-foreign-key-v12.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v12.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 43d7a1ad90..dbd57f22a6 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2645,6 +2645,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2700,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index c12a32c8c7..7fffaa780b 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b8cd35e995..8885c4ee7a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2049,6 +2049,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..e0e3174bda 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,23 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_DIMS(arr)[0] != numkeys ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 8687e9a97c..646b0563f3 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8380,6 +8380,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8387,9 +8388,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8478,6 +8481,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8489,6 +8493,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8602,6 +8653,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8701,6 +8811,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8760,6 +8877,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8772,6 +8890,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8815,7 +8934,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8885,6 +9004,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8970,7 +9090,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9019,7 +9139,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9153,6 +9273,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9188,6 +9309,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9296,6 +9418,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9328,8 +9451,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9372,6 +9495,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9442,6 +9566,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9476,7 +9601,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9555,6 +9681,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9593,6 +9720,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 3e7086c5e5..bdbff5034d 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index ba3ccc712c..f39a4c7215 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2977,6 +2977,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index a2ef853dc2..383a8e3cdc 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2641,6 +2641,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8392be6d44..38d80f228e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3602,6 +3602,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7574d545e0..10c85d1b15 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,13 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +198,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +249,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +384,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +422,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -641,7 +651,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3620,8 +3630,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3823,14 +3835,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3864,6 +3877,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15272,6 +15309,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15806,6 +15844,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16825,6 +16864,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index d5310f27db..8ac5197a02 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1408,7 +1408,7 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
  * and it seems better to keep this logic as close to select_common_type()
  * as possible.
  */
-static Oid
+Oid
 select_common_type_from_oids(int nargs, const Oid *typeids, bool noerror)
 {
 	Oid			ptype;
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..0ee264da5b 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2115,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2163,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2446,6 +2562,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 8a1fbda572..0b7bcdee8a 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -55,6 +55,7 @@
 #include "parser/parse_oper.h"
 #include "parser/parser.h"
 #include "parser/parsetree.h"
+#include "parser/parse_coerce.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "rewrite/rewriteSupport.h"
@@ -330,6 +331,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2010,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2019,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2041,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2378,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11343,7 +11418,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -11359,14 +11435,60 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid 		opr_oids[2];
+		Oid			oprcommon;
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		opr_oids[0] = get_array_type(operform->oprleft);
+		if (!OidIsValid(opr_oids[0]))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		opr_oids[1] = get_array_type(operform->oprright);
+		if (!OidIsValid(opr_oids[1]))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_from_oids(2, opr_oids, false);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(opr_oids[0]), format_type_be(opr_oids[1]))));
+
+		appendStringInfoString(buf, rightop);
+		if (opr_oids[1] != oprcommon)
+			add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (opr_oids[0] != oprcommon)
+			add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..d3c5995bed 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index f3c3df390f..fb9ebd4662 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,17 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -210,6 +218,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -250,7 +259,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index dc2bb40926..50c08d85c1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2162,6 +2162,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2202,6 +2206,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8c554e1f69..365d3ab437 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 6ebdbd63ee..b34d0067d4 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -61,6 +61,8 @@ extern Node *coerce_to_specific_type_typmod(ParseState *pstate, Node *node,
 											Oid targetTypeId, int32 targetTypmod,
 											const char *constructName);
 
+extern Oid select_common_type_from_oids(int nargs, const Oid *typeids, bool noerror);
+
 extern int	parser_coercion_errposition(ParseState *pstate,
 										int coerce_location,
 										Node *input_expr);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d1c185cfaa
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd..d6bb09136d 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e7..c13d5172aa 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..7df55a4b81
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
Array-ELEMENT-foreign-key-v11_COMPATIBLE_V13.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v11_COMPATIBLE_V13.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 2f579a7c04..5f2bfcafbe 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2653,7 +2663,6 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para>
       <para>
        If a foreign key, list of the equality operators for PK = FK comparisons
-      </para></entry>
      </row>
 
      <row>
@@ -2701,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 0ef55a0f79..268c074a3d 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 087cad184c..bbb668b243 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1016,10 +1016,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1044,6 +1044,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1107,7 +1119,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1117,6 +1130,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1128,6 +1142,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1158,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2289,6 +2371,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index e393c93a45..b50a2de704 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2422,6 +2422,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index cdc01c49c9..d9c4523b38 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1894,6 +1894,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 90932be831..8f75bf3c11 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -121,7 +123,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -138,6 +144,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -194,6 +201,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,23 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_DIMS(arr)[0] != numkeys ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index f80a9e96a9..0c255df0e2 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -753,7 +753,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index f0da5b2303..77189256f1 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -448,12 +448,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8338,6 +8338,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8345,9 +8346,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8436,6 +8439,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8447,6 +8451,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8560,6 +8611,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8659,6 +8769,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8718,6 +8835,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8730,6 +8848,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8773,7 +8892,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8843,6 +8962,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8928,7 +9048,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -8977,7 +9097,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9111,6 +9231,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9146,6 +9267,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9254,6 +9376,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9286,8 +9409,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9330,6 +9453,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9400,6 +9524,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9434,7 +9559,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9513,6 +9639,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9551,6 +9678,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 672fccff5b..232dc54498 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -713,6 +713,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 483bb65ddc..e9f709a8ab 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3118,6 +3118,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index d8cf87e6d0..6fd3e67a9f 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2975,6 +2975,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 627b026b19..e2dfb444bb 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2632,6 +2632,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e2f177515d..faafa25c1e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3578,6 +3578,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 5fa322d8d4..a68be85f25 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -135,6 +135,13 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -192,6 +199,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -242,6 +250,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +384,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -411,7 +421,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -647,7 +657,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3560,8 +3570,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3762,14 +3774,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3803,6 +3816,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15340,6 +15377,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16481,6 +16519,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 2ffe47026b..4f39796914 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1405,7 +1405,7 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
  * and it seems better to keep this logic as close to select_common_type()
  * as possible.
  */
-static Oid
+Oid
 select_common_type_from_oids(int nargs, const Oid *typeids, bool noerror)
 {
 	Oid			ptype;
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 7b5502a06d..4aa4139faa 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -770,6 +770,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 06cf16d9d7..c3e57b365c 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2115,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2163,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2449,6 +2565,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 076c3c019f..7a39bd96eb 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -57,6 +57,7 @@
 #include "parser/parse_oper.h"
 #include "parser/parser.h"
 #include "parser/parsetree.h"
+#include "parser/parse_coerce.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "rewrite/rewriteSupport.h"
@@ -332,6 +333,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2007,7 +2011,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2015,13 +2020,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2029,13 +2042,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2364,6 +2379,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11149,7 +11224,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -11165,14 +11241,60 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid 		opr_oids[2];
+		Oid			oprcommon;
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		opr_oids[0] = get_array_type(operform->oprleft);
+		if (!OidIsValid(opr_oids[0]))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		opr_oids[1] = get_array_type(operform->oprright);
+		if (!OidIsValid(opr_oids[1]))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_from_oids(2, opr_oids, false);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(opr_oids[0]), format_type_be(opr_oids[1]))));
+
+		appendStringInfoString(buf, rightop);
+		if (opr_oids[1] != oprcommon)
+			add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (opr_oids[0] != oprcommon)
+			add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 9c9cb6377a..dd33ade365 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4456,7 +4456,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 9600ece93c..9f00eb83a0 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,17 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -197,6 +205,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -237,7 +246,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index ada17bf6ee..2a522153f7 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2147,6 +2147,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2187,6 +2191,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 08f22ce211..b76655e4ed 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 8686eaacbc..5afb68ceba 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -61,6 +61,8 @@ extern Node *coerce_to_specific_type_typmod(ParseState *pstate, Node *node,
 											Oid targetTypeId, int32 targetTypmod,
 											const char *constructName);
 
+extern Oid select_common_type_from_oids(int nargs, const Oid *typeids, bool noerror);
+
 extern int	parser_coercion_errposition(ParseState *pstate,
 										int coerce_location,
 										Node *input_expr);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index a5c8772e95..db77f98656 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -73,7 +73,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 026ea880cd..fe39ea6cb2 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -78,7 +78,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 979d926119..556b990719 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -138,6 +138,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
Array-ELEMENT-foreign-key-v9_COMPATIBLE_V11.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v9_COMPATIBLE_V11.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 9d6d65acd9..7c5ac400a2 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2382,6 +2382,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       <entry>If a foreign key, list of the referenced columns</entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
@@ -2427,6 +2437,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 7538200d01..3d514473ab 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -935,6 +935,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index b3d7fc6fbf..fdd4bce551 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -929,10 +929,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ]
@@ -959,6 +959,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       declare a foreign key that references a partitioned table.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1022,7 +1034,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1032,6 +1045,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1043,6 +1057,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1058,6 +1073,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2075,6 +2157,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 3c332e307d..1ccf27053a 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2374,6 +2374,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index df52ee9a36..d23ee1e9a8 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1349,6 +1349,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index c0ae92c005..c6b2a35ac0 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -64,6 +64,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -87,6 +88,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -124,7 +126,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -141,6 +147,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -194,6 +201,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId = HeapTupleGetOid(tuple);
 	Datum		adatum;
@@ -1206,6 +1219,23 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_DIMS(arr)[0] != numkeys ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index e1eb7c374b..341d0d0b1f 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -757,7 +757,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index a149ca044c..a0a93e0b81 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -7470,6 +7470,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7478,10 +7479,12 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	bool		connoinherit;
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
 	Oid			constrOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -7575,6 +7578,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -7586,6 +7590,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -7671,6 +7722,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -7770,6 +7880,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -7843,6 +7960,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8046,6 +8164,7 @@ CloneFkReferencing(Relation pg_constraint, Relation parentRel,
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -8073,7 +8192,8 @@ CloneFkReferencing(Relation pg_constraint, Relation parentRel,
 		ObjectAddressSet(parentAddr, ConstraintRelationId, parentConstrOid);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap[conkey[i] - 1];
 
@@ -8227,6 +8347,7 @@ CloneFkReferencing(Relation pg_constraint, Relation parentRel,
 								  constrForm->conindid, /* same index */
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index acfb9b2614..25edf41801 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -743,6 +743,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1237,6 +1238,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1266,7 +1268,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1405,6 +1410,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index f64787de0c..7232f1abfe 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3191,6 +3191,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index a38d6e4db1..e04b25510f 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2916,6 +2916,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index cf5238e9e0..b2798f61b9 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2592,6 +2592,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index fcc0fbd703..b9d700f84c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3599,6 +3599,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 2dc444c5e8..cb2463a66e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -126,6 +126,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -183,6 +190,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -233,6 +241,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -359,6 +368,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -395,7 +405,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -628,8 +638,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3558,8 +3568,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3760,14 +3772,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3801,6 +3814,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15088,6 +15125,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16212,6 +16250,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 065535a26b..9827f6ebf3 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1389,6 +1389,102 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 	return ptype;
 }
 
+/*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid
+select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool		leftispreferred;
+	bool		rightispreferred;
+
+	Assert(leftOid != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can not coerce to it implicitly right to left, thus
+				 * coercion only works one way
+				 */
+				return leftOid;
+			}
+			else
+			{
+				/*
+				 * coercion works both ways, then decide depending on
+				 * preferred flag
+				 */
+				if (leftispreferred)
+					return leftOid;
+				else
+					return rightOid;
+			}
+		}
+		else
+		{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can coerce to it implicitly right to left, thus coercion
+				 * only works one way
+				 */
+				return rightOid;
+			}
+			else
+			{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
 /*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 9b4874dc11..f7c7307b26 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -773,6 +773,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index d3225094c7..03fb282446 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -115,9 +115,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -202,7 +204,8 @@ static void ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype);
+				const char *rightop, Oid rightoptype,
+				char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int ri_NullCheck(TupleDesc tupdesc, HeapTuple tup,
 			 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -392,6 +395,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -404,12 +408,27 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
 		quoteRelationName(pkrelname, pk_rel);
 		appendStringInfo(&querybuf, "SELECT 1 FROM ONLY %s x", pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -418,18 +437,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -556,7 +598,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -817,7 +860,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -977,7 +1021,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&querybuf, querysep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = "AND";
 					queryoids[i] = pk_type;
 				}
@@ -1160,7 +1205,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1382,7 +1428,8 @@ ri_setnull(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1603,7 +1650,8 @@ ri_setdefault(TriggerData *trigdata)
 					ri_GenerateQual(&qualbuf, qualsep,
 									paramname, pk_type,
 									riinfo->pf_eq_oprs[i],
-									attname, fk_type);
+									attname, fk_type,
+									riinfo->fk_reftypes[i]);
 					querysep = ",";
 					qualsep = "AND";
 					queryoids[i] = pk_type;
@@ -1923,6 +1971,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1940,11 +1996,33 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN ONLY %s pk ON",
-					 fk_only, fkrelname, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN ONLY %s pk ON",
+						fk_only, fkrelname, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1955,15 +2033,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1979,10 +2065,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -2155,21 +2246,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2341,6 +2434,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2388,7 +2482,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2763,6 +2876,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 9796d274ea..d499a11cf2 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -54,6 +54,7 @@
 #include "parser/parse_oper.h"
 #include "parser/parser.h"
 #include "parser/parsetree.h"
+#include "parser/parse_coerce.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "rewrite/rewriteSupport.h"
@@ -317,6 +318,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int decompile_column_index_array(Datum column_index_array, Oid relId,
 							 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 					   const Oid *excludeOps,
@@ -1943,7 +1947,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1951,13 +1956,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -1965,13 +1978,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2294,6 +2309,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
@@ -10995,7 +11070,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -11011,14 +11087,62 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfoString(buf, rightop);
+		if (oprleft != oprcommon)
+			add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index e29efa1023..88d9e7f09b 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4179,7 +4179,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index cdea401baf..733382e172 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -114,9 +114,17 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -214,6 +222,7 @@ extern Oid CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -254,7 +263,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 					   Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 						  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 50f7e228d5..6105b2b852 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2089,6 +2089,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2127,6 +2131,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 23db40147b..2287c37060 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -141,6 +141,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index af12c136ef..0ee94ee95f 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int parser_coercion_errposition(ParseState *pstate,
 
 extern Oid select_common_type(ParseState *pstate, List *exprs,
 				   const char *context, Node **which_expr);
+extern Oid	select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,
 					  const char *context);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index d0416e90fc..2e8e84b2c4 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -81,7 +81,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype);
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 8112626f3b..04fff2696a 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -89,7 +89,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext
+test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext element_fk
 
 # rules cannot run concurrently with any test that creates a view
 test: rules psql_crosstab amutils
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index b2a8f37056..b7a572173a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -134,6 +134,7 @@ test: sysviews
 test: tsrf
 test: tidscan
 test: stats_ext
+test: element_fk
 test: rules
 test: psql_crosstab
 test: select_parallel
Array-ELEMENT-foreign-key-v10_COMPATIBLE_V12.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v10_COMPATIBLE_V12.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 1429b2d05c..a3cdbdb2ac 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2387,6 +2387,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       <entry>If a foreign key, list of the referenced columns</entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry><structfield>conpfeqop</structfield></entry>
       <entry><type>oid[]</type></entry>
@@ -2428,6 +2438,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 88a6702480..5cdf15ab3c 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE races (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index c70d2ed7c9..cbc4f7f656 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1019,10 +1019,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1047,6 +1047,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1110,7 +1122,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1120,6 +1133,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1131,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1146,6 +1161,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2264,6 +2346,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 46a383294e..c8c85ab725 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2432,6 +2432,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 5b2507cd29..0d1d8196a0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1886,6 +1886,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index b6145593a3..178fe8183a 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -63,6 +63,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -85,6 +86,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -122,7 +124,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, 's');
+									   INT2OID, sizeof(int16), true, 's');
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, 'c');
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -139,6 +145,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -195,6 +202,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1164,7 +1176,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1209,6 +1222,23 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_DIMS(arr)[0] != numkeys ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index 537d0e8cef..613e5527b9 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -757,7 +757,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 6f4a3e70a4..178127bcb2 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -429,12 +429,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -7904,6 +7904,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -7911,9 +7912,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8002,6 +8005,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8013,6 +8017,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8126,6 +8177,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8224,6 +8334,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8283,6 +8400,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8295,6 +8413,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8338,7 +8457,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8408,6 +8527,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8494,7 +8614,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -8543,7 +8663,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -8678,6 +8798,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8713,6 +8834,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -8822,6 +8944,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -8854,7 +8977,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap[confkey[i] - 1];
 
@@ -8897,6 +9021,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -8968,6 +9093,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9002,7 +9128,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap[conkey[i] - 1];
 
@@ -9081,6 +9208,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9119,6 +9247,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 5d26f998fa..111eb240c9 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -766,6 +766,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
@@ -1256,6 +1257,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 	char		fk_matchtype = FKCONSTR_MATCH_SIMPLE;
 	List	   *fk_attrs = NIL;
 	List	   *pk_attrs = NIL;
+	List	   *fk_reftypes = NIL;
 	StringInfoData buf;
 	int			funcnum;
 	OldTriggerInfo *info = NULL;
@@ -1285,7 +1287,10 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 		if (i % 2)
 			fk_attrs = lappend(fk_attrs, arg);
 		else
+		{
 			pk_attrs = lappend(pk_attrs, arg);
+			fk_reftypes = lappend_int(fk_reftypes, FKCONSTR_REF_PLAIN);
+		}
 	}
 
 	/* Prepare description of constraint for use in messages */
@@ -1424,6 +1429,7 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
 			fkcon->conname = constr_name;
 		fkcon->fk_attrs = fk_attrs;
 		fkcon->pk_attrs = pk_attrs;
+		fkcon->fk_reftypes = fk_reftypes;
 		fkcon->fk_matchtype = fk_matchtype;
 		switch (info->funcoids[0])
 		{
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 320f1c5285..595b7b841f 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3189,6 +3189,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index a0ef3ff140..30d2cd0018 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2926,6 +2926,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 88e17a3a60..74cdd42b22 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2601,6 +2601,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 4a0e461d36..90b76d3dc9 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3526,6 +3526,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 9de9dbd8a8..58b11bcf3a 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -127,6 +127,13 @@ typedef struct ImportQual
 	List	   *table_names;
 } ImportQual;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -184,6 +191,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -234,6 +242,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -365,6 +374,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -401,7 +411,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				publication_name_list
@@ -633,8 +643,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE
+	EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
 	EXTENSION EXTERNAL EXTRACT
 
 	FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
@@ -3526,8 +3536,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3729,14 +3741,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3770,6 +3783,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15091,6 +15128,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -16217,6 +16255,23 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 903478d8ca..f9edd583a8 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1389,6 +1389,102 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
 	return ptype;
 }
 
+/*
+ * look at select_common_type(); in parse_coerce.c(src/backend/parser/parse_coerce.c)
+ *
+ * select_common_type_2args()
+ *		Determine the common supertype of a list of input expressions.
+ * 'leftOid': left operand's type
+ * 'rightOid': left operand's type
+ */
+Oid
+select_common_type_2args(Oid leftOid, Oid rightOid)
+{
+	TYPCATEGORY leftcategory;
+	TYPCATEGORY rightcategory;
+	bool		leftispreferred;
+	bool		rightispreferred;
+
+	Assert(leftOid != InvalidOid);
+	Assert(rightOid != InvalidOid);
+
+	/*
+	 * If input types are valid and exactly the same, just pick that type.
+	 */
+	if (leftOid != UNKNOWNOID)
+	{
+		if (rightOid == leftOid)
+			return leftOid;
+	}
+
+	/*
+	 * Nope, so set up for the full algorithm.
+	 */
+	leftOid = getBaseType(leftOid);
+	rightOid = getBaseType(rightOid);
+	get_type_category_preferred(leftOid, &leftcategory, &leftispreferred);
+	get_type_category_preferred(rightOid, &rightcategory, &rightispreferred);
+
+	if (rightOid != UNKNOWNOID && rightOid != leftOid)
+	{
+		if (rightcategory != leftcategory)
+		{
+			/* both types in different categories? then not much hope... */
+			return InvalidOid;
+		}
+
+		if (can_coerce_type(1, &rightOid, &leftOid, COERCION_IMPLICIT))
+		{
+			/* can coerce to it implicitly right to left */
+			if (!can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can not coerce to it implicitly right to left, thus
+				 * coercion only works one way
+				 */
+				return leftOid;
+			}
+			else
+			{
+				/*
+				 * coercion works both ways, then decide depending on
+				 * preferred flag
+				 */
+				if (leftispreferred)
+					return leftOid;
+				else
+					return rightOid;
+			}
+		}
+		else
+		{
+			/* can not coerce to it implicitly right to left */
+			if (can_coerce_type(1, &leftOid, &rightOid, COERCION_IMPLICIT))
+			{
+				/*
+				 * can coerce to it implicitly right to left, thus coercion
+				 * only works one way
+				 */
+				return rightOid;
+			}
+			else
+			{
+				/* can not coerce either way */
+				return InvalidOid;
+			}
+		}
+	}
+
+	/*
+	 * If all the inputs were UNKNOWN type --- ie, unknown-type literals ---
+	 * then resolve as type TEXT.
+	 */
+	if (leftOid == UNKNOWNOID)
+		leftOid = TEXTOID;
+
+	return leftOid;
+}
+
 /*
  * coerce_to_common_type()
  *		Coerce an expression to the given type.
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 577fe1e752..2ba14347d1 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -776,6 +776,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 76cd0edb45..8dad7c4b53 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -109,9 +109,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -185,7 +187,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -344,6 +347,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -357,6 +361,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -366,6 +378,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -374,18 +393,41 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel, true);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
+		}
+		else
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel, true);
 	}
 
 	/*
@@ -504,7 +546,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -694,7 +737,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -800,7 +844,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -919,7 +964,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1099,7 +1145,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1372,6 +1419,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1389,13 +1444,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1406,15 +1483,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1430,10 +1515,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1644,7 +1734,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1814,21 +1905,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2011,6 +2104,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2058,7 +2152,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2445,6 +2558,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 1268ac1dd0..be8ec1c79f 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -56,6 +56,7 @@
 #include "parser/parse_oper.h"
 #include "parser/parser.h"
 #include "parser/parsetree.h"
+#include "parser/parse_coerce.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "rewrite/rewriteSupport.h"
@@ -318,6 +319,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -1983,7 +1987,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -1991,13 +1996,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2005,13 +2018,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2340,6 +2355,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * get_expr			- Decompile an expression tree
@@ -11056,7 +11131,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -11072,14 +11148,62 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright;
+		Oid			oprleft;
+		Oid			oprcommon;
+
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		oprright = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprright))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		oprleft = get_array_type(operform->oprright);
+		if (!OidIsValid(oprleft))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_2args(oprleft, oprright);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(oprleft), format_type_be(oprright))));
+
+		appendStringInfoString(buf, rightop);
+		if (oprleft != oprcommon)
+			add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (oprright != oprcommon)
+			add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index d0ad738c24..8b7524f162 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4289,7 +4289,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index c1e60c7dfd..c6c17f5b18 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -116,9 +116,17 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -198,6 +206,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -238,7 +247,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 96ad25208c..7ff35c8180 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2129,6 +2129,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2169,6 +2173,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 00ace8425e..ff4dcc969d 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 37d73ae2cc..19cdbf7f46 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -67,6 +67,7 @@ extern int	parser_coercion_errposition(ParseState *pstate,
 
 extern Oid	select_common_type(ParseState *pstate, List *exprs,
 							   const char *context, Node **which_expr);
+extern Oid	select_common_type_2args(Oid ptype, Oid ntype);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 								   Oid targetTypeId,
 								   const char *context);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index a3cd7d26fa..7a15b5fb26 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -69,7 +69,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 3710bc8ee0..9eb7fbd2e0 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -78,7 +78,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index eead306a34..fd032f9d16 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -135,6 +135,7 @@ test: sysviews
 test: tsrf
 test: tid
 test: tidscan
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
#119Zhihong Yu
zyu@yugabyte.com
In reply to: Mark Rofail (#118)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi, Mark:

+ CREATE TABLE races (

Maybe 'racings' is a better name for the table (signifying the activities).

+       if (ARR_NDIM(arr) != 1 ||
+           ARR_DIMS(arr)[0] != numkeys ||
+           ARR_HASNULL(arr) ||
+           ARR_ELEMTYPE(arr) != CHAROID)
+           elog(ERROR, "confreftype is not a 1-D char array");

For the case of ARR_DIMS(arr)[0] != numkeys (while other conditions are
satisfied), maybe refine the error message mentioning numkeys so that the
user would get better idea.

+            * XXX this restriction is pretty annoying, considering the
effort
+            * that's been put into the rest of the RI mechanisms to make
them

Is the above going to be addressed in subsequent patches ?

+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)

Maybe add assertion that names and reftypes are not NULL.

+    * If a foreign key, the reference semantics for each column
+    */
+   char        confreftype[1];

It would be nice to expand 'semantics' a bit to make the comment clearer.
e.g. mention 'Foreign key column reference semantics codes'

Thanks

On Sat, Jan 23, 2021 at 5:37 AM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

Changelog (since the last version, v8):

Below are the versions mentioned in the changelog. v12 is the latest
version.

/Mark

On Sat, Jan 23, 2021 at 2:34 PM Mark Rofail <markm.rofail@gmail.com>
wrote:

Greetings,

I am trying to revive this patch, Foreign Key Arrays. The original
proposal from my GSoC 2017 days can be found here:

/messages/by-id/CAJvoCut7zELHnBSC8HrM6p-R6q-NiBN1STKhqnK5fPE-9=Gq3g@mail.gmail.com

Disclaimer, I am not the original author of this patch, I picked up this
patch in 2017 to migrate the original patch from 2012 and add a GIN index
to make it usable as the performance without a GIN index is not usable
after 100 rows.
The original authors, Tom Lane and Marco Nenciarini, are the ones who did
most of the heavy lifting. The original discussion can be found here:

/messages/by-id/1343842863.5162.4.camel@greygoo.devise-it.lan

*In brief, it would be used as follows:*
```sql
CREATE TABLE A ( atest1 int PRIMARY KEY, atest2 text );
CREATE TABLE B ( btest1 int[], btest2 int );
ALTER TABLE B ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF
btest1) REFERENCES A;
```
and now table B references table A as follows:
```sql
INSERT INTO B VALUES ('{10,1}', 2);
```
where this row references rows 1 and 10 from A without the need of a
many-to-many table

*Changelog (since the last version, v8):*
- v9 (made compatible with Postgresql 11)
support `DeconstructFkConstraintRow`
support `CloneFkReferencing`
support `generate_operator_clause`

- v10 (made compatible with Postgresql v12)
support `addFkRecurseReferenced` and `addFkRecurseReferencing`
support `CloneFkReferenced` and `CloneFkReferencing`
migrate tests

- v11(make compatible with Postgresql v13)
drop `ConvertTriggerToFK`
drop `select_common_type_2args` in favor of
`select_common_type_from_oids`
migrate tests

- v12(made compatible with current master, 2021-01-23,
commit a8ed6bb8f4cf259b95c1bff5da09a8f4c79dca46)
add ELEMENT to `bare_label_keyword`
migrate docs

*Todo:*
- re-add @>> operator which allows comparison of between array and
element and returns true iff the element is within the array
to allow easier select statements and lower overhead of explicitly
creating an array within the SELECT statement.

```diff
- SELECT * FROM B WHERE btest1 @> ARRAY[5];
+ SELECT * FROM B WHERE btest1 @>> 5;
```

I apologize it took so long to get a new version here (years). However,
this is not the first time I tried to migrate the patch, every time a
different issue blocked me from doing so.
Reviews and suggestions are most welcome, @Joel Jacobson
<joel@compiler.org> please review and test as previously agreed.

/Mark

On Tue, Oct 2, 2018 at 7:13 AM Michael Paquier <michael@paquier.xyz>
wrote:

On Sat, Aug 11, 2018 at 05:20:57AM +0200, Mark Rofail wrote:

I am still having problems rebasing this patch. I can not figure it

out on

my own.

Okay, it's been a couple of months since this last email, and nothing
has happened, so I am marking it as returned with feedback.
--
Michael

#120Mark Rofail
markm.rofail@gmail.com
In reply to: Zhihong Yu (#119)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Zhihong Yu,

Thank you for your prompt review.

Is the above going to be addressed in subsequent patches

Yes, all your comments have been addressed and included in patch v13
attached below.

Changelog*:*
- v13 (compatible with current master 2021-01-24,
commit 7e57255f6189380d545e1df6a6b38827b213e3da)
* add not null assertions to"SplitFKColElems"
* add specific message for "ARR_DIMS(arr)[0] != numkeys" case
* rename table in example from "races" to "racing"
* expanded on "semantics" in "CATALOG" struct

I have also included the new "@>>" containselem operator in a
separate patch. I think it is a good idea to keep them separate for now
till we reach a solid conclusion if we should include it in the main patch
or not after performance testing and.
Check "Array-containselem-gin-v1.patch" below.

I encourage everyone to take review this patch. After considerable reviews
and performance testing, it will be ready for a commitfest.

/Mark

Attachments:

Array-containselem-gin-v1.patchtext/x-patch; charset=US-ASCII; name=Array-containselem-gin-v1.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..7e8302f704 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,16 +95,34 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy != GinContainsElemStrategy)
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							&elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		deconstruct_array(array,
+						ARR_ELEMTYPE(array),
+						elmlen, elmbyval, elmalign,
+						&elems, &nulls, &nelems);
+
+		*nkeys = nelems;
+		*nullFlags = nulls;
+	}
+	else
+	{
+		/*
+		* since this function return a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return
+		* as is and configure the searchmode
+		*/
+
+		elems = (Datum *) PG_GETARG_POINTER(0);
+		*nkeys = 1;
+		**nullFlags = PG_ARGISNULL(0);
+	}
 
 	switch (strategy)
 	{
@@ -126,6 +145,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -171,6 +198,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,6 +286,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..c26aee6ef9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,112 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair; treat NULL as false
+			*/
+		locfcinfo->args[0].value = elt1;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 0ee264da5b..f12df99a22 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -1917,7 +1917,7 @@ quoteRelationName(char *buffer, Relation rel)
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
  * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
- * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @>> leftop", adding casts and
  * schema qualification as needed to ensure that the parser will select the
  * operator we specify.  leftop and rightop should be parenthesized if they
  * aren't variables or parameters.
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 0b7bcdee8a..00d319966f 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11437,29 +11437,14 @@ generate_operator_clause(StringInfo buf,
 
 	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
 	{
-		Oid 		opr_oids[2];
+		Oid 		opr_oids[2] = {operform->oprleft, operform->oprright};
 		Oid			oprcommon;
+		Oid			oprcommon_arr;
+
 		/*
 		 * we first need to get the array types and decide the more
 		 * appropriate one
-		 */
-
-		/* get array type of refrenced element */
-		opr_oids[0] = get_array_type(operform->oprleft);
-		if (!OidIsValid(opr_oids[0]))
-			ereport(ERROR,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("could not find array type for data type %s",
-							format_type_be(operform->oprleft))));
-		/* get array type of refrencing element */
-		opr_oids[1] = get_array_type(operform->oprright);
-		if (!OidIsValid(opr_oids[1]))
-			ereport(ERROR,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("could not find array type for data type %s",
-							format_type_be(operform->oprright))));
-
-		/*
+		 * 
 		 * compare the two array types and try to find a common supertype
 		 */
 		oprcommon = select_common_type_from_oids(2, opr_oids, false);
@@ -11469,12 +11454,20 @@ generate_operator_clause(StringInfo buf,
 					 errmsg("could not find common type between %s and %s",
 							format_type_be(opr_oids[0]), format_type_be(opr_oids[1]))));
 
+		/* get array type of common type */
+		oprcommon_arr = get_array_type(oprcommon);
+		if (!OidIsValid(oprcommon_arr))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
 		appendStringInfoString(buf, rightop);
 		if (opr_oids[1] != oprcommon)
-			add_cast_to(buf, oprcommon);
+			add_cast_to(buf, oprcommon_arr);
 		appendStringInfo(buf, " OPERATOR(pg_catalog.");
-		appendStringInfo(buf, " @>");
-		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		appendStringInfo(buf, " @>>");
+		appendStringInfo(buf, ") %s", leftop);
 		if (opr_oids[0] != oprcommon)
 			add_cast_to(buf, oprcommon);
 	}
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..6f4b0adf4c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2778,6 +2778,11 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP', descr => 'containselem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index b5f52d4e4a..017a2dbe66 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8172,6 +8172,9 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..b3a149229b 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,17 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +793,19 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +987,11 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1012,15 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1038,14 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..c92ac78a4b 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -2029,6 +2029,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2101,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..6b4fc73f3a 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,10 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +333,15 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
Array-ELEMENT-foreign-key-v13.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v13.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 43d7a1ad90..dbd57f22a6 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2645,6 +2645,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2700,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index c12a32c8c7..e38014ba3e 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b8cd35e995..8885c4ee7a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2049,6 +2049,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..1030942ef0 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,24 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 8687e9a97c..646b0563f3 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8380,6 +8380,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8387,9 +8388,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8478,6 +8481,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8489,6 +8493,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8602,6 +8653,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8701,6 +8811,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8760,6 +8877,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8772,6 +8890,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8815,7 +8934,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8885,6 +9004,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8970,7 +9090,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9019,7 +9139,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9153,6 +9273,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9188,6 +9309,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9296,6 +9418,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9328,8 +9451,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9372,6 +9495,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9442,6 +9566,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9476,7 +9601,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9555,6 +9681,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9593,6 +9720,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 3e7086c5e5..bdbff5034d 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index ba3ccc712c..f39a4c7215 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2977,6 +2977,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index a2ef853dc2..383a8e3cdc 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2641,6 +2641,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8392be6d44..38d80f228e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3602,6 +3602,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7574d545e0..c238640984 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,13 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +198,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +249,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +384,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +422,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -641,7 +651,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3620,8 +3630,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3823,14 +3835,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3864,6 +3877,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15272,6 +15309,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15806,6 +15844,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16825,6 +16864,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index d5310f27db..8ac5197a02 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -1408,7 +1408,7 @@ select_common_type(ParseState *pstate, List *exprs, const char *context,
  * and it seems better to keep this logic as close to select_common_type()
  * as possible.
  */
-static Oid
+Oid
 select_common_type_from_oids(int nargs, const Oid *typeids, bool noerror)
 {
 	Oid			ptype;
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..0ee264da5b 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2115,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2163,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2446,6 +2562,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 8a1fbda572..0b7bcdee8a 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -55,6 +55,7 @@
 #include "parser/parse_oper.h"
 #include "parser/parser.h"
 #include "parser/parsetree.h"
+#include "parser/parse_coerce.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "rewrite/rewriteSupport.h"
@@ -330,6 +331,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2010,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2019,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2041,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2378,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11343,7 +11418,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -11359,14 +11435,60 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid 		opr_oids[2];
+		Oid			oprcommon;
+		/*
+		 * we first need to get the array types and decide the more
+		 * appropriate one
+		 */
+
+		/* get array type of refrenced element */
+		opr_oids[0] = get_array_type(operform->oprleft);
+		if (!OidIsValid(opr_oids[0]))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+		/* get array type of refrencing element */
+		opr_oids[1] = get_array_type(operform->oprright);
+		if (!OidIsValid(opr_oids[1]))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * compare the two array types and try to find a common supertype
+		 */
+		oprcommon = select_common_type_from_oids(2, opr_oids, false);
+		if (!OidIsValid(oprcommon))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find common type between %s and %s",
+							format_type_be(opr_oids[0]), format_type_be(opr_oids[1]))));
+
+		appendStringInfoString(buf, rightop);
+		if (opr_oids[1] != oprcommon)
+			add_cast_to(buf, oprcommon);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (opr_oids[0] != oprcommon)
+			add_cast_to(buf, oprcommon);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..d3c5995bed 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index f3c3df390f..db48be3aec 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -210,6 +220,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -250,7 +261,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index dc2bb40926..50c08d85c1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2162,6 +2162,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2202,6 +2206,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8c554e1f69..365d3ab437 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 6ebdbd63ee..b34d0067d4 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -61,6 +61,8 @@ extern Node *coerce_to_specific_type_typmod(ParseState *pstate, Node *node,
 											Oid targetTypeId, int32 targetTypmod,
 											const char *constructName);
 
+extern Oid select_common_type_from_oids(int nargs, const Oid *typeids, bool noerror);
+
 extern int	parser_coercion_errposition(ParseState *pstate,
 										int coerce_location,
 										Node *input_expr);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d1c185cfaa
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,639 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (EACH ELEMENT OF invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd..d6bb09136d 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e7..c13d5172aa 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..7df55a4b81
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,503 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- -- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
#121Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#120)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark and others,

On Sun, Jan 24, 2021, at 09:22, Mark Rofail wrote:

Changelog:
- v13 (compatible with current master 2021-01-24, commit 7e57255f6189380d545e1df6a6b38827b213e3da)

...

I encourage everyone to take review this patch. After considerable reviews and performance testing, it will be ready for a commitfest.

...

Array-ELEMENT-foreign-key-v13.patch

This is awesome, a million thanks for this!

I've tested the patch and tried to use it in the pg_catalog-diff-tool I'm working on.

I found one problem, described in Test #3 below.

*** Test #1 OK: Multi-key FK on (oid, smallint[])

Find a suitable row to do testing on:

joel=# SELECT oid,conrelid,conkey FROM catalog_clone.pg_constraint WHERE cardinality(conkey) > 1 LIMIT 1;
oid | conrelid | conkey
-------+----------+----------
12112 | 1255 | {2,20,3}
(1 row)

Corrupting the row will not be detected since no FK yet:

joel=# UPDATE catalog_clone.pg_constraint SET conkey = '{2,20,3,1234}' WHERE oid = 12112;
UPDATE 1

Trying to add a FK now will detect the corrupted row:

joel=# ALTER TABLE catalog_clone.pg_constraint ADD FOREIGN KEY (conrelid, EACH ELEMENT OF conkey) REFERENCES catalog_clone.pg_attribute (attrelid, attnum);
ERROR: insert or update on table "pg_constraint" violates foreign key constraint "pg_constraint_conrelid_conkey_fkey"
DETAIL: Key (conrelid, EACH ELEMENT OF conkey)=(1255, {2,20,3,1234}) is not present in table "pg_attribute".

OK, good, we got an error.

Fix row and try again:

joel=# UPDATE catalog_clone.pg_constraint SET conkey = '{2,20,3}' WHERE oid = 12112;
UPDATE 1
joel=# ALTER TABLE catalog_clone.pg_constraint ADD FOREIGN KEY (conrelid, EACH ELEMENT OF conkey) REFERENCES catalog_clone.pg_attribute (attrelid, attnum);
ALTER TABLE

OK, good, FK added.

Thanks to the FK, trying to corrupt the column again will now give an error:

joel=# UPDATE catalog_clone.pg_constraint SET conkey = '{2,20,3,1234}' WHERE oid = 12112;
ERROR: insert or update on table "pg_constraint" violates foreign key constraint "pg_constraint_conrelid_conkey_fkey"
DETAIL: Key (conrelid, EACH ELEMENT OF conkey)=(1255, {2,20,3,1234}) is not present in table "pg_attribute".

OK, good, we got an error.

*** Test #2 OK: FK on oid[]

Find a suitable row to do testing on:

joel=# \d catalog_clone.pg_proc
proallargtypes | oid[] | | |

joel=# SELECT oid,proallargtypes FROM catalog_clone.pg_proc WHERE cardinality(proallargtypes) > 1 LIMIT 1;
oid | proallargtypes
------+----------------
3059 | {25,2276}
(1 row)

Corrupting the row will not be detected since no FK yet:

joel=# UPDATE catalog_clone.pg_proc SET proallargtypes = '{25,2276,1234}' WHERE oid = 3059;
UPDATE 1

Trying to add a FK now will detect the corrupted row:

joel=# ALTER TABLE catalog_clone.pg_proc ADD FOREIGN KEY (EACH ELEMENT OF proallargtypes) REFERENCES catalog_clone.pg_type (oid);
ERROR: insert or update on table "pg_proc" violates foreign key constraint "pg_proc_proallargtypes_fkey"
DETAIL: Key (EACH ELEMENT OF proallargtypes)=({25,2276,1234}) is not present in table "pg_type".

OK, good, we got an error.

Fix row and try again:

joel=# UPDATE catalog_clone.pg_proc SET proallargtypes = '{25,2276}' WHERE oid = 3059;
UPDATE 1
joel=# ALTER TABLE catalog_clone.pg_proc ADD FOREIGN KEY (EACH ELEMENT OF proallargtypes) REFERENCES catalog_clone.pg_type (oid);
ALTER TABLE

OK, good, FK added.

Thanks to the FK, trying to corrupt the column again will now give an error:

joel=# UPDATE catalog_clone.pg_proc SET proallargtypes = '{25,2276,1234}' WHERE oid = 3059;
ERROR: insert or update on table "pg_proc" violates foreign key constraint "pg_proc_proallargtypes_fkey"
DETAIL: Key (EACH ELEMENT OF proallargtypes)=({25,2276,1234}) is not present in table "pg_type".

OK, good, we got an error.

*** Test 3 NOT OK: FK on oidvector

Find a suitable row to do testing on:

joel=# \d catalog_clone.pg_proc
proargtypes | oidvector | | |

joel=# SELECT oid,proargtypes FROM catalog_clone.pg_proc WHERE cardinality(proargtypes) > 1 LIMIT 1;
oid | proargtypes
-----+-------------
79 | 19 25
(1 row)

Corrupting the row will not be detected since no FK yet:

joel=# UPDATE catalog_clone.pg_proc SET proargtypes = '19 25 12345'::oidvector WHERE oid = 79;
UPDATE 1

Trying to add a FK now will detect the corrupted row:

joel=# ALTER TABLE catalog_clone.pg_proc ADD FOREIGN KEY (EACH ELEMENT OF proargtypes) REFERENCES catalog_clone.pg_type (oid);
ERROR: insert or update on table "pg_proc" violates foreign key constraint "pg_proc_proargtypes_fkey"
DETAIL: Key (EACH ELEMENT OF proargtypes)=(19 25 12345) is not present in table "pg_type".

OK, good, we got an error.

Fix row and try again:

joel=# UPDATE catalog_clone.pg_proc SET proargtypes = '19 25'::oidvector WHERE oid = 79;
UPDATE 1
joel=# ALTER TABLE catalog_clone.pg_proc ADD FOREIGN KEY (EACH ELEMENT OF proargtypes) REFERENCES catalog_clone.pg_type (oid);
ALTER TABLE

OK, good, FK added.

Now, with the FK on the oidvector column, let's try to corrupt the column:

joel=# UPDATE catalog_clone.pg_proc SET proargtypes = '19 25 12345'::oidvector WHERE oid = 79;
ERROR: operator does not exist: oidvector pg_catalog.@> oid[]
LINE 1: ... 1 FROM ONLY "catalog_clone"."pg_type" x WHERE $1 OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (SELECT 1 FROM ONLY "catalog_clone"."pg_type" x WHERE $1 OPERATOR(pg_catalog. @>) ARRAY["oid"] FOR KEY SHARE OF x) z)

It seems to me there is some type conversion between oidvector and oid[] that isn't working properly?

/Joel

#122Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#121)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Joel,

On Sun, Jan 24, 2021 at 12:11 PM Joel Jacobson <joel@compiler.org> wrote:

HINT: No operator matches the given name and argument types. You might
need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM
pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*)
FROM (SELECT 1 FROM ONLY "catalog_clone"."pg_type" x WHERE $1
OPERATOR(pg_catalog. @>) ARRAY["oid"] FOR KEY SHARE OF x) z)

It seems to me there is some type conversion between oidvector and oid[]
that isn't working properly?

This seems to be a type casting problem indeed. The coercion part of the
patch found in "ruleutils.c:11438-11491" is the culprit, is there a cleaner
way to achieve this?
I am aware of the problem and will try to fix it, but I assume this is
because of "Array-containselem-gin-v1.patch" can you give the v13 patch a
try alone?

I will work on a fix and send it soon.

/Mark

#123Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#122)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sun, Jan 24, 2021, at 11:21, Mark Rofail wrote:

This seems to be a type casting problem indeed. The coercion part of the patch found in "ruleutils.c:11438-11491" is the culprit, is there a cleaner way to achieve this?
I am aware of the problem and will try to fix it, but I assume this is because of "Array-containselem-gin-v1.patch" can you give the v13 patch a try alone?
I will work on a fix and send it soon.

Actually, the error occurred without the "Array-containselem-gin-v1.patch".

However, I also had the "v3-0001-Add-primary-keys-and-unique-constraints-to-system.patch", to get PKs on the oids.

So, I've retested to ensure it didn't cause this problem,
this time only 7e57255f6189380d545e1df6a6b38827b213e3da + "Array-ELEMENT-foreign-key-v13.patch",
but I still get the same error though.

Exact steps to reproduce error from a clean installation:

$ cd postgresql
$ git checkout 7e57255f6189380d545e1df6a6b38827b213e3da
$ patch -p1 < ~/Array-ELEMENT-foreign-key-v13.patch
$ ./configure --prefix=~/pg-head
$ make -j16
$ make install
$ initdb -D ~/pghead
$ pg_ctl -D ~/pghead -l /tmp/logfile start
$ createdb $USER
$ psql

CREATE SCHEMA catalog_clone;
CREATE TABLE catalog_clone.pg_proc AS SELECT * FROM pg_catalog.pg_proc;
CREATE TABLE catalog_clone.pg_type AS SELECT * FROM pg_catalog.pg_type;
ALTER TABLE catalog_clone.pg_type ADD PRIMARY KEY (oid);
ALTER TABLE catalog_clone.pg_proc ADD FOREIGN KEY (EACH ELEMENT OF proargtypes) REFERENCES catalog_clone.pg_type (oid);
UPDATE catalog_clone.pg_proc SET proargtypes = '19 25 12345'::oidvector WHERE oid = 79;
ERROR: operator does not exist: oidvector pg_catalog.@> oid[]
LINE 1: ... 1 FROM ONLY "catalog_clone"."pg_type" x WHERE $1 OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (SELECT 1 FROM ONLY "catalog_clone"."pg_type" x WHERE $1 OPERATOR(pg_catalog. @>) ARRAY["oid"] FOR KEY SHARE OF x) z)

/Joel

#124Joel Jacobson
joel@compiler.org
In reply to: Joel Jacobson (#123)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi again,

I found a similar problem with int2vector columns:

CREATE TABLE catalog_clone.pg_index AS SELECT * FROM pg_catalog.pg_index;
CREATE TABLE catalog_clone.pg_attribute AS SELECT attrelid,attnum FROM pg_catalog.pg_attribute;
ALTER TABLE catalog_clone.pg_attribute ADD UNIQUE (attrelid, attnum);
ALTER TABLE catalog_clone.pg_index ADD FOREIGN KEY (indrelid, EACH ELEMENT OF indkey) REFERENCES catalog_clone.pg_attribute (attrelid, attnum);

SELECT indexrelid,indrelid,indkey FROM catalog_clone.pg_index WHERE cardinality(indkey) > 1 LIMIT 1;
indexrelid | indrelid | indkey
------------+----------+--------
2837 | 2836 | 1 2
(1 row)

UPDATE catalog_clone.pg_index SET indkey = '1 2 12345'::int2vector WHERE indexrelid = 2837;
ERROR: operator does not exist: int2vector pg_catalog.@> smallint[]
LINE 1: ...WHERE "attrelid" OPERATOR(pg_catalog.=) $1 AND $2 OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest($2) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (SELECT 1 FROM ONLY "catalog_clone"."pg_attribute" x WHERE "attrelid" OPERATOR(pg_catalog.=) $1 AND $2 OPERATOR(pg_catalog. @>) ARRAY["attnum"] FOR KEY SHARE OF x) z)

This made me wonder if there are any more of these "vector" columns than the oidvector and int2vector.

It appears they are the only two:

SELECT DISTINCT data_type, udt_name from information_schema.columns WHERE udt_name LIKE '%vector' ORDER BY 1,2;
data_type | udt_name
-----------+------------
ARRAY | int2vector
ARRAY | oidvector
(2 rows)

/Joel

#125Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#124)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Joel,

UPDATE catalog_clone.pg_index SET indkey = '1 2 12345'::int2vector WHERE

indexrelid = 2837;
ERROR: operator does not exist: int2vector pg_catalog.@> smallint[]
LINE 1: ...WHERE "attrelid" OPERATOR(pg_catalog.=) $1 AND $2 OPERATOR(p...

In your example, you are using the notation '1 2 12345'::int2vector which
signifies a vector as you have mentioned, however in this patch we use the
array operator @> to help with the indexing, the incompatibility stems from
here.
I do not think that postgres contains vector operators, correct me if I am
wrong. I feel that supporting vectors is our of the scope of this patch, if
you have an idea how to support it please let me know.

/Mark

#126Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#125)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello again Joel,

UPDATE catalog_clone.pg_index SET indkey = '1 2 12345'::int2vector WHERE

indexrelid = 2837;
ERROR: operator does not exist: int2vector pg_catalog.@> smallint[]
LINE 1: ...WHERE "attrelid" OPERATOR(pg_catalog.=) $1 AND $2 OPERATOR(p...

In your example, you are using the notation '1 2 12345'::int2vector which
signifies a vector as you have mentioned, however in this patch we use the
array operator @> to help with the indexing, the incompatibility stems from
here.
I do not think that postgres contains vector operators, correct me if I am
wrong. I feel that supporting vectors is our of the scope of this patch, if
you have an idea how to support it please let me know.

I apologize for my rash response, I did not quite understand your example
at first, it appears the UPDATE statement is neither over the
referencing nor the referenced columns, I understand the problem now,
please disregard the previous email. Thank you for this find, please find
the fix below

Changelog:
- v14 (compatible with current master 2021-01-24,
commit 0c1e8845f28bd07ad381c8b0d6701575d967b88e)
* fix a huge issue in type casting (ruleutils.c:11438-11491)
* remove coercion support (this causes the issue Joel described above)
* remove composite types support (since search is now array against
array and "get_array_type" returns "record []" for composite functions)

Todo:
- rebase containselem gin patch to accommodate v14.
"Array-containselem-gin-v1.patch" is only compatible with <v14
- work on re-adding support to composite types

/Mark

Attachments:

Array-ELEMENT-foreign-key-v14.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v14.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 43d7a1ad90..dbd57f22a6 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2645,6 +2645,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2700,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index c12a32c8c7..e38014ba3e 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b8cd35e995..8885c4ee7a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2049,6 +2049,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..1030942ef0 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,24 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 8687e9a97c..646b0563f3 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8380,6 +8380,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8387,9 +8388,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8478,6 +8481,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8489,6 +8493,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8602,6 +8653,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8701,6 +8811,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8760,6 +8877,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8772,6 +8890,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8815,7 +8934,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8885,6 +9004,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -8970,7 +9090,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9019,7 +9139,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9153,6 +9273,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9188,6 +9309,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9296,6 +9418,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9328,8 +9451,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9372,6 +9495,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9442,6 +9566,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9476,7 +9601,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9555,6 +9681,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9593,6 +9720,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 3e7086c5e5..bdbff5034d 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index ba3ccc712c..f39a4c7215 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2977,6 +2977,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index a2ef853dc2..383a8e3cdc 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2641,6 +2641,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8392be6d44..38d80f228e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3602,6 +3602,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7574d545e0..c238640984 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,13 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +198,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +249,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +384,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +422,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -641,7 +651,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3620,8 +3630,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3823,14 +3835,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3864,6 +3877,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15272,6 +15309,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15806,6 +15844,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16825,6 +16864,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..0ee264da5b 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,23 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, or if fkreftype is
+ * FKCONSTR_REF_EACH_ELEMENT, append " sep rightop @> leftop", adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2115,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2163,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2446,6 +2562,10 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
+			if (riinfo->fk_reftypes[idx] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfoString(&key_names, "EACH ELEMENT OF ");
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 8a1fbda572..f3f2acd285 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11343,7 +11417,8 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
@@ -11359,14 +11434,64 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
-		add_cast_to(buf, operform->oprleft);
-	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
-	appendStringInfoString(buf, oprname);
-	appendStringInfo(buf, ") %s", rightop);
-	if (rightoptype != operform->oprright)
-		add_cast_to(buf, operform->oprright);
+	if (fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		Oid			oprright_arr;
+		Oid			oprleft_arr;
+		Oid			rightoptype_arr;
+		Oid			leftoptype_arr;
+
+		/*
+		 * convert all oids into the corresponding array oids
+		 * for cast checking
+		 */ 
+		oprleft_arr = get_array_type(operform->oprleft);
+		if (!OidIsValid(oprleft_arr))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprleft))));
+
+		leftoptype_arr = get_array_type(leftoptype);
+ 		if (!OidIsValid(leftoptype_arr))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("could not find array type for data type %s",
+ 							format_type_be(leftoptype))));
+
+		oprright_arr = get_array_type(operform->oprright);
+		if (!OidIsValid(oprright_arr))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("could not find array type for data type %s",
+							format_type_be(operform->oprright))));
+
+		/*
+		 * no need to convert to array since the refrencing column should
+		 * already be an array 
+		 */
+		rightoptype_arr = rightoptype;
+
+		appendStringInfoString(buf, rightop);
+		if (rightoptype_arr != oprright_arr)
+			add_cast_to(buf, oprright_arr);
+		appendStringInfo(buf, " OPERATOR(pg_catalog.");
+		appendStringInfo(buf, " @>");
+		appendStringInfo(buf, ") ARRAY[%s]", leftop);
+		if (leftoptype_arr != oprleft_arr)
+			add_cast_to(buf, oprleft_arr);
+	}
+	else
+	{
+		appendStringInfoString(buf, leftop);
+		if (leftoptype != operform->oprleft)
+			add_cast_to(buf, operform->oprleft);
+		appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+		appendStringInfoString(buf, oprname);
+		appendStringInfo(buf, ") %s", rightop);
+		if (rightoptype != operform->oprright)
+			add_cast_to(buf, operform->oprright);
+	}
 
 	ReleaseSysCache(opertup);
 }
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..d3c5995bed 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index f3c3df390f..db48be3aec 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -210,6 +220,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -250,7 +261,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index dc2bb40926..50c08d85c1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2162,6 +2162,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2202,6 +2206,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8c554e1f69..365d3ab437 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..6a34362291
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,526 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (EACH ELEMENT OF ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (EACH ELEMENT OF ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, EACH ELEMENT OF fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, EACH ELEMENT OF y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (EACH ELEMENT OF x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (EACH ELEMENT OF slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd..d6bb09136d 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e7..c13d5172aa 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..48c24c96b7
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,404 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
#127Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#125)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 2021-Jan-24, Mark Rofail wrote:

I do not think that postgres contains vector operators, correct me if I am
wrong. I feel that supporting vectors is our of the scope of this patch, if
you have an idea how to support it please let me know.

I do not think that this patch needs to support oidvector and int2vector
types as if they were oid[] and int2[] respectively. If you really want
an element FK there, you can alter the column types to the real array
types in your catalog clone. oidvector and int2vector are internal
implementation artifacts.

--
�lvaro Herrera 39�49'30"S 73�17'W
"Someone said that it is at least an order of magnitude more work to do
production software than a prototype. I think he is wrong by at least
an order of magnitude." (Brian Kernighan)

#128Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#126)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sun, Jan 24, 2021, at 21:46, Mark Rofail wrote:

Thank you for this find, please find the fix below

Many thanks for fixing. I can confirm it now works like expected for the reported case:

CREATE SCHEMA catalog_clone;
CREATE TABLE catalog_clone.pg_proc AS SELECT * FROM pg_catalog.pg_proc;
CREATE TABLE catalog_clone.pg_type AS SELECT * FROM pg_catalog.pg_type;
ALTER TABLE catalog_clone.pg_type ADD PRIMARY KEY (oid);
ALTER TABLE catalog_clone.pg_proc ADD FOREIGN KEY (EACH ELEMENT OF proargtypes) REFERENCES catalog_clone.pg_type (oid);
UPDATE catalog_clone.pg_proc SET proargtypes = '19 25 12345'::oidvector WHERE oid = 79;
ERROR: insert or update on table "pg_proc" violates foreign key constraint "pg_proc_proargtypes_fkey"
DETAIL: Key (EACH ELEMENT OF proargtypes)=(19 25 12345) is not present in table "pg_type".

Excellent!

I'll continue testing over the next couple of days and report if I find any more oddities.

/Joel

#129Joel Jacobson
joel@compiler.org
In reply to: Joel Jacobson (#128)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Mon, Jan 25, 2021, at 09:14, Joel Jacobson wrote:

I'll continue testing over the next couple of days and report if I find any more oddities.

I've continued testing by trying to make full use of this feature in the catalog-diff-tool I'm working on.

Today I became aware of a SQL feature that I must confess I've never used before,
that turned out to be useful in my tool, as I then wouldn't need to follow FKs
to do updates manually, but let the database do them automatically.

I'm talking about "ON CASCADE UPDATE", which I see is not supported in the patch.

In my tool, I could simplify the code for normal FKs by using ON CASCADE UPDATE,
but will continue to need my hand-written traverse-FKs-recursively code for Foreign Key Arrays.

I lived a long SQL life without ever needing ON CASCADE UPDATE,
so I would definitively vote for Foreign Key Arrays to be added even without support for this.

Would you say the patch is written in a way which would allow adding support for ON CASCADE UPDATE
later on mostly by adding code, or would it require a major rewrite?

I hesitated if I should share this with you, since I'm really grateful for this feature even without ON CASCADE UPDATE,
but since this was discovered when testing real-life scenario and not some hypothetical example,
I felt it should be noted that I stumbled upon this during testing.

Again, thank you so much for working on this.

/Joel

#130Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#129)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Joel,

Thank you for your kind words and happy that you benefited from this patch.
We simply assert that the update/delete method used is supported currently
only "NO ACTION" and "RESTRICT", this can be extended in future patches
without rework, just extra logic.
Please don't hesitate to give your feedback.

I would love some help with some performance comparisons if you are up to
it, between Many-to-Many, Foreign Key Arrays and Gin Indexed Foreign Key
Arrays.

/Mark

On Tue, Jan 26, 2021 at 1:51 PM Joel Jacobson <joel@compiler.org> wrote:

Show quoted text

Hi Mark,

On Mon, Jan 25, 2021, at 09:14, Joel Jacobson wrote:

I'll continue testing over the next couple of days and report if I find
any more oddities.

I've continued testing by trying to make full use of this feature in the
catalog-diff-tool I'm working on.

Today I became aware of a SQL feature that I must confess I've never used
before,
that turned out to be useful in my tool, as I then wouldn't need to follow
FKs
to do updates manually, but let the database do them automatically.

I'm talking about "ON CASCADE UPDATE", which I see is not supported in the
patch.

In my tool, I could simplify the code for normal FKs by using ON CASCADE
UPDATE,
but will continue to need my hand-written traverse-FKs-recursively code
for Foreign Key Arrays.

I lived a long SQL life without ever needing ON CASCADE UPDATE,
so I would definitively vote for Foreign Key Arrays to be added even
without support for this.

Would you say the patch is written in a way which would allow adding
support for ON CASCADE UPDATE
later on mostly by adding code, or would it require a major rewrite?

I hesitated if I should share this with you, since I'm really grateful for
this feature even without ON CASCADE UPDATE,
but since this was discovered when testing real-life scenario and not some
hypothetical example,
I felt it should be noted that I stumbled upon this during testing.

Again, thank you so much for working on this.

/Joel

#131Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#130)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Tue, Jan 26, 2021, at 12:59, Mark Rofail wrote:

Please don't hesitate to give your feedback.

The error message for insert or update violations looks fine:

UPDATE catalog_clone.pg_extension SET extconfig = ARRAY[12345] WHERE oid = 10;
ERROR: insert or update on table "pg_extension" violates foreign key constraint "pg_extension_extconfig_fkey"
DETAIL: Key (EACH ELEMENT OF extconfig)=(12345) is not present in table "pg_class".

But when trying to delete a still referenced row,
the column mentioned in the "EACH ELEMENT OF" sentence
is not the array column, but the column in the referenced table:

DELETE FROM catalog_clone.pg_class WHERE oid = 10;
ERROR: update or delete on table "pg_class" violates foreign key constraint "pg_extension_extconfig_fkey" on table "pg_extension"
DETAIL: Key (EACH ELEMENT OF oid)=(10) is still referenced from table "pg_extension".

I think either the "EACH ELEMENT OF" part of the latter error message should be dropped,
or the column name for the array column should be used.

/Joel

#132Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#131)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Joel,

As always, great catch!
Kindly find the updated patch (v15) below

Changelog:
- v15 (compatible with current master 2021-01-27, commit
e42b3c3bd6a9c6233ac4c8a2e9b040367ba2f97c)
* remove "EACH ELEMENT OF" from violation messages
* accommodate tests accordingly

Keep up the good work testing this patch.

/Mark

On Wed, Jan 27, 2021 at 5:11 AM Joel Jacobson <joel@compiler.org> wrote:

Show quoted text

On Tue, Jan 26, 2021, at 12:59, Mark Rofail wrote:

Please don't hesitate to give your feedback.

The error message for insert or update violations looks fine:

UPDATE catalog_clone.pg_extension SET extconfig = ARRAY[12345] WHERE oid =
10;
ERROR: insert or update on table "pg_extension" violates foreign key
constraint "pg_extension_extconfig_fkey"
DETAIL: Key (EACH ELEMENT OF extconfig)=(12345) is not present in table
"pg_class".

But when trying to delete a still referenced row,
the column mentioned in the "EACH ELEMENT OF" sentence
is not the array column, but the column in the referenced table:

DELETE FROM catalog_clone.pg_class WHERE oid = 10;
ERROR: update or delete on table "pg_class" violates foreign key
constraint "pg_extension_extconfig_fkey" on table "pg_extension"
DETAIL: Key (EACH ELEMENT OF oid)=(10) is still referenced from table
"pg_extension".

I think either the "EACH ELEMENT OF" part of the latter error message
should be dropped,
or the column name for the array column should be used.

/Joel

#133Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#132)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Wed, Jan 27, 2021, at 10:58, Mark Rofail wrote:

Kindly find the updated patch (v15) below

I think you forgot to attach the patch.

/Joel

#134Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#133)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Joel,

I think you forgot to attach the patch.

Appears so, sorry about that.

Here it is.

/Mark

Attachments:

Array-ELEMENT-foreign-key-v15.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v15.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 865e826fb0..d24ba6a2a2 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2645,6 +2645,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2700,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 02d2f42865..9ff71b243b 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b8cd35e995..8885c4ee7a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2049,6 +2049,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..1030942ef0 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,24 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_HASNULL(arr) ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 36747e7277..25021f2675 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8487,6 +8487,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8494,9 +8495,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8585,6 +8588,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8596,6 +8600,53 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	 * Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	 * RESTRICT amd DELETE CASCADE actions
+	 */
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8709,6 +8760,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8808,6 +8918,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8867,6 +8984,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8879,6 +8997,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8922,7 +9041,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8992,6 +9111,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9077,7 +9197,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9126,7 +9246,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9260,6 +9380,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9295,6 +9416,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9403,6 +9525,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9435,8 +9558,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9479,6 +9602,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9549,6 +9673,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9583,7 +9708,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9662,6 +9788,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9700,6 +9827,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 3e7086c5e5..bdbff5034d 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index ba3ccc712c..f39a4c7215 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2977,6 +2977,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index a2ef853dc2..383a8e3cdc 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2641,6 +2641,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8392be6d44..38d80f228e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3602,6 +3602,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7574d545e0..c238640984 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,13 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/* Private struct for the result of foreign_key_column_elem production */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +198,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +249,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +384,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +422,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -641,7 +651,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3620,8 +3630,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3823,14 +3835,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3864,6 +3877,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15272,6 +15309,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15806,6 +15844,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16825,6 +16864,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..366519b9d1 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,22 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2114,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2162,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2446,6 +2561,7 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 1a844bc461..39be652822 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11344,23 +11418,37 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
-	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+	{
+		/* in case of FK array, override operator with <<@ */
+		opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(OID_ARRAY_CONTAINED_OP));
+		if (!HeapTupleIsValid(opertup))
+			elog(ERROR, "cache lookup failed for operator %u", OID_ARRAY_CONTAINED_OP);
+	}
+	else
+	{
+		opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+		if (!HeapTupleIsValid(opertup))
+			elog(ERROR, "cache lookup failed for operator %u", opoid);
+	}
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		appendStringInfo(buf, "ARRAY [%s]", leftop);
+	else
+		appendStringInfoString(buf, leftop);
 	if (leftoptype != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..d3c5995bed 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index f3c3df390f..db48be3aec 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -210,6 +220,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -250,7 +261,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index dc2bb40926..50c08d85c1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2162,6 +2162,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2202,6 +2206,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8c554e1f69..365d3ab437 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..549e9ed6fa
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,526 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd..d6bb09136d 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e7..c13d5172aa 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..48c24c96b7
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,404 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
#135Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#134)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Wed, Jan 27, 2021, at 20:34, Mark Rofail wrote:

Here it is.
Array-ELEMENT-foreign-key-v15.patch

Thanks.

I've tested it and notice there still seems to be a problem with int2vector?

Reading your previous comment a few messages ago,
it sounds like this was fixed, but perhaps not?

This is the comment that made me think it was fixed:

On Sun, Jan 24, 2021, at 21:46, Mark Rofail wrote:

Hello again Joel,

UPDATE catalog_clone.pg_index SET indkey = '1 2 12345'::int2vector WHERE indexrelid = 2837;
ERROR: operator does not exist: int2vector pg_catalog.@> smallint[]
LINE 1: ...WHERE "attrelid" OPERATOR(pg_catalog.=) $1 AND $2 OPERATOR(p...

I apologize for my rash response, I did not quite understand your example at first, it appears the UPDATE statement is >neither over the referencing nor the referenced columns, I understand the problem now, please disregard the previous >email. Thank you for this find, please find the fix below

Changelog:
- v14 (compatible with current master 2021-01-24, commit 0c1e8845f28bd07ad381c8b0d6701575d967b88e)

Here is a small test causing that still fails on v15:

CREATE TABLE a (
a_id smallint NOT NULL,
PRIMARY KEY (a_id)
);

CREATE TABLE b (
b_id integer NOT NULL,
a_ids int2vector NOT NULL,
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a(a_id);

INSERT INTO a (a_id) VALUES (1);
INSERT INTO a (a_id) VALUES (2);
INSERT INTO b (b_id, a_ids) VALUES (3, '1 2'::int2vector);

ERROR: operator does not exist: smallint[] pg_catalog.<@ int2vector
LINE 1: ..."."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (SELECT 1 FROM ONLY "public"."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(pg_catalog.<@) $1::pg_catalog.anyarray FOR KEY SHARE OF x) z)

/Joel

#136Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#135)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

I apologize for my rash response, I did not quite understand your example

at first, it appears the UPDATE statement is neither over the
referencing nor the referenced columns

The v14 fixed the issue where an error would occur by an update statement
that didn't target the refrencing or refrenced columns

Vectors as refrencing columns are not supported and out of scope of this
patch. Try to use arrays.

/Mark

#137Zhihong Yu
zyu@yugabyte.com
In reply to: Mark Rofail (#134)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi, Mark:

+       if (ARR_NDIM(arr) != 1 ||
+           ARR_HASNULL(arr) ||
+           ARR_ELEMTYPE(arr) != CHAROID)
+           elog(ERROR, "confreftype is not a 1-D char array");

I think the ARR_HASNULL(arr) condition is not reflected in the error
message.

+    * Array foreign keys support only UPDATE/DELETE NO ACTION,
UPDATE/DELETE
+    * RESTRICT amd DELETE CASCADE actions

I don't see CASCADE in the if condition that follows the above comment.

+ char reftype; /* FKCONSTR_REF_xxx code */

The code would be FKCONSTR_REF_EACH_ELEMENT and FKCONSTR_REF_PLAIN. I think
you can mention them in the comment.

Cheers

On Wed, Jan 27, 2021 at 11:34 AM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

Hello Joel,

I think you forgot to attach the patch.

Appears so, sorry about that.

Here it is.

/Mark

#138Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#136)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Wed, Jan 27, 2021, at 22:36, Mark Rofail wrote:

Vectors as refrencing columns are not supported and out of scope of this patch. Try to use arrays.

OK, not a biggie, but I think the user at least should get an error message
immediately when trying to add the foreign key on an incompatible column,
just like we would get if e.g. trying to add a fk on numeric[] -> smallint
or some other incompatible combination.

The first error message looks good:

CREATE TABLE a (
a_id smallint NOT NULL,
PRIMARY KEY (a_id)
);

CREATE TABLE b (
b_id integer NOT NULL,
a_ids numeric[] NOT NULL,
PRIMARY KEY (b_id)
);

joel=# ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a(a_id);
ERROR: foreign key constraint "b_a_ids_fkey" cannot be implemented
DETAIL: Key column "a_ids" has element type numeric which does not have a default btree operator class that's compatible with class "int2_ops".

But you don't get any error message if a_ids is instead int2vector:

CREATE TABLE b (
b_id integer NOT NULL,
a_ids int2vector NOT NULL,
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a(a_id);

It's silently added without any error.

The error first comes when you try to insert data:

INSERT INTO a (a_id) VALUES (1);
INSERT INTO a (a_id) VALUES (2);
INSERT INTO b (b_id, a_ids) VALUES (3, '1 2'::int2vector);

ERROR: operator does not exist: smallint[] pg_catalog.<@ int2vector
LINE 1: ..."."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (SELECT 1 FROM ONLY "public"."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(pg_catalog.<@) $1::pg_catalog.anyarray FOR KEY SHARE OF x) z)

This means, as a user, I might not be aware of the vector restriction when adding the foreign keys
for my existing schema, and think everything is fine, and not realize there is a problem until
new data arrives.

/Joel

#139Mark Rofail
markm.rofail@gmail.com
In reply to: Zhihong Yu (#137)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Zhihong,

Thank you for your review, please continue giving feedback, your help is
appreciated!

I think the ARR_HASNULL(arr) condition is not reflected in the error

message.

Added to v16

I don't see CASCADE in the if condition that follows the above comment.

Added to v16

The code would be FKCONSTR_REF_EACH_ELEMENT and FKCONSTR_REF_PLAIN. I think

you can mention them in the comment.

Added to v16

Changelog (Main Patch):
- v16 (compatible with current master 2021-01-28
commit 6f5c8a8ec23f8ab00da4d2b77bfc8af2a578c4d3)
* added customised message for ARR_HASNULL(arr)
* removed DELETE CASCADE comment
* added FKCONSTR_REF_EACH_ELEMENT and FKCONSTR_REF_PLAIN comment
* added is array check on FK creation
* total rewrite of "generate_operator_clause" edit (shift to <@ instead
of @> for less code)

Changelog (ContainsElem):
- v2 (comaptible with v16):
* made compatible with Main Patch v16

The next step is performance benchmarking, will report the results soon.

/Mark

Attachments:

Array-containselem-gin-v2.patchtext/x-patch; charset=US-ASCII; name=Array-containselem-gin-v2.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..67831d51bc 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,16 +95,34 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy != GinContainsElemStrategy)
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
-	*nkeys = nelems;
-	*nullFlags = nulls;
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+
+		*nkeys = nelems;
+		*nullFlags = nulls;
+	}
+	else
+	{
+		/*
+		* since this function return a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return
+		* as is and configure the searchmode
+		*/
+
+		elems = (Datum *) PG_GETARG_POINTER(0);
+		*nkeys = 1;
+		**nullFlags = PG_ARGISNULL(0);
+	}
 
 	switch (strategy)
 	{
@@ -126,6 +145,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -171,6 +198,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* result is not lossy */
 			*recheck = false;
@@ -258,6 +286,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainsStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..30fc6a6f39 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,134 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair; treat NULL as false
+			*/
+		locfcinfo->args[0].value = elt1;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	Datum elem = PG_GETARG_DATUM(0);
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 0f7613208c..15e748a082 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11429,7 +11429,7 @@ generate_operator_clause(StringInfo buf,
 
 	/* in case of FK array, override operator with <<@ */
 	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
-		oproid = OID_ARRAY_CONTAINED_OP;
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
 	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
 		elog(ERROR, "cache lookup failed for operator %u", oproid);
@@ -11439,10 +11439,7 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
-		appendStringInfo(buf, "ARRAY [%s]", leftop);
-	else
-		appendStringInfoString(buf, leftop);
+	appendStringInfoString(buf, leftop);
 	if (leftoptype != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index b5f52d4e4a..1020e6f2e6 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8172,6 +8172,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
Array-ELEMENT-foreign-key-v16.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v16.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 865e826fb0..d24ba6a2a2 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2645,6 +2645,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2700,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b8cd35e995..8885c4ee7a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2049,6 +2049,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 36747e7277..1370f391ea 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8487,6 +8487,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8494,9 +8495,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8585,6 +8588,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8596,6 +8600,68 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				/* 
+				 * Assert all referencing columns is of an array type
+				 * 
+				 * we have disallow vector types for operator compatibility for
+				 * now function can determine vector types have to do it
+				 * explicitly, luckily only two vector types exist
+				 */
+				if (!type_is_array(fktypoid[i]) ||
+					fktypoid[i] == INT2VECTOROID ||
+					fktypoid[i] == OIDVECTOROID)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("(%s) is not an array type, cannot be used as a referencing column",
+									format_type_be(fktypoid[i]))));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8709,6 +8775,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8808,6 +8933,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8867,6 +8999,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8879,6 +9012,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8922,7 +9056,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8992,6 +9126,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9077,7 +9212,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9126,7 +9261,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9260,6 +9395,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9295,6 +9431,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9403,6 +9540,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9435,8 +9573,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9479,6 +9617,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9549,6 +9688,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9583,7 +9723,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9662,6 +9803,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9700,6 +9842,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index ba3ccc712c..f39a4c7215 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2977,6 +2977,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index a2ef853dc2..383a8e3cdc 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2641,6 +2641,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8392be6d44..38d80f228e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3602,6 +3602,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7574d545e0..f350ecacd9 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ * 
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -641,7 +657,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3620,8 +3636,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3823,14 +3841,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3864,6 +3883,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15272,6 +15315,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15806,6 +15850,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16825,6 +16870,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..366519b9d1 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,22 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2114,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2162,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
@@ -2446,6 +2561,7 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
 				appendStringInfoString(&key_names, ", ");
 				appendStringInfoString(&key_values, ", ");
 			}
+
 			appendStringInfoString(&key_names, name);
 			appendStringInfoString(&key_values, val);
 		}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 1a844bc461..0f7613208c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11344,23 +11418,31 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	/* in case of FK array, override operator with <<@ */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_CONTAINED_OP;
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		appendStringInfo(buf, "ARRAY [%s]", leftop);
+	else
+		appendStringInfoString(buf, leftop);
 	if (leftoptype != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..d3c5995bed 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,8 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL,
+								   NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index f3c3df390f..db48be3aec 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -210,6 +220,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -250,7 +261,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index dc2bb40926..50c08d85c1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2162,6 +2162,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2202,6 +2206,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8c554e1f69..365d3ab437 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..e0e38bc82f
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,539 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  (integer) is not an array type, cannot be used as a referencing column
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  (int2vector) is not an array type, cannot be used as a referencing column
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+DROP TABLE IF EXISTS PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd..d6bb09136d 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e7..c13d5172aa 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..d1d0a9e119
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,417 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+DROP TABLE IF EXISTS PKTABLEVIOLATING;
#140Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#138)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Joel,

This means, as a user, I might not be aware of the vector restriction when

adding the foreign keys
for my existing schema, and think everything is fine, and not realize
there is a problem until
new data arrives.

Please find v16 with the error message implemented. You can find it in the
previous message.

As always thank you for your great insight and your help.

/Mark

#141Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#140)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Thu, Jan 28, 2021, at 22:41, Mark Rofail wrote:

Please find v16 with the error message implemented. You can find it in the previous message.

Thanks! It's working fine:
ERROR: (int2vector) is not an array type, cannot be used as a referencing column

I've pushed a first working draft of the schema-diffing-tool I'm working on that uses the patch:
https://github.com/truthly/pg-pit

I've added links to the functions that uses the EACH ELEMENT OF syntax.

This project has been my primary source of reviewer insights so far.

I will continue testing the patch over the next couple of days.

/Joel

#142Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#141)
5 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Greetings,

I have performed the performance comparison.
The purpose of the test was to compare FK Arrays' performance compared to
standard FKs.

The results are shown in the figure below
[image: fk_array_perfomance_figure.png]
The Tests were carried as follow

1. create a referenced table of 1k rows
2. create an SQL file for each case
1. referencing table with array FKs
2. referencing table with array FKs with ELEMENT operator <<@
3. referencing table with array FKs and GIN index
4. referencing table with array FKs with ELEMENT operator <<@ and GIN
index
5. referencing table with standard FKs through many2many table
3. each case contains INSERT statements referencing the referenced table
4. after which I trigger an UPDATE and DELETE statements on the
referenced table
1. UPDATE: "UPDATE pktableforarray SET ptest1 = 1001 WHERE
pktableforarray.ptest1 = 1000;"
2. DELETE: "DELETE FROM PKTABLEFORARRAY WHERE pktableforarray.ptest1
= 999;"
5. I repeat this for 10^1, 10^2, 10^3, 10^4, 10^5, and 10^6 rows.

The test data used is attached below (except the 10^6, file size too big)

Changelog (FK arrays):
- v17 (compatible with current master 2021-02-02,
commit 1d71f3c83c113849fe3aa60cb2d2c12729485e97)
* refactor "generate_operator_clause"

Changelog (FK arrays Elem addon)
- v3 (compatible with FK arrays v17)
* fix bug in "ginqueryarrayextract"

I will post this patch to the commit fest.

/Mark

Attachments:

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


IHDR������9tEXtSoftwareMatplotlib version3.3.4, https://matplotlib.org/T��	pHYsaa�?�iIDATx���ex����_��E�;
�����)��-5�x����B!@�/�V<H"��h�)�3+YI��s]����s�����Y����a��<_Hh@H��/��h@��t�$��� �t��h@H��/��h@��t�$��� �t��h@H��/��h@��t�$��� �t��h@H��/��h@��t�$��� �t��h@H��/��h@��t�$���p���G���g�V�hQ_��{@rr����}�������*W��"E�(k������y��={v_�
|����}}]@ll��N��O?�T��u9p��01{�l<x�r���zJaaa^�����w�c����w��K�{
��L�>]����i
[�nU�*U|Z���h��:v���X�F��������~��)11�r��_~Y����GkA���C�*&&�r����k��a�)
H��=�b���8��������)S&���[���W�2eT�bE��WO�*U����*�;�]�V-Z�Ptt��K���c�T�D��	P�����0���W%J�P��eU�fM��QC���n����t�nL�8QO<�����-�{��������KU!�Z�`���sI�6m
�@*������X��������g�V�Xq+�;wnu��Y���W���}X)n�x���v�J�9@�d����R�'))I7n���k�t��9���[+W����1�Z�h�=z�c��
�gt����p�?�PC��l>������N�9���_;���;�e�W���?�/��R5j�P�f��u�V_�t�{��t��I���y�q����x-^�X��uS�b�4y�d��p/��y#F���/�h�M@@��O��'�|�KU!-;p��������6m���	����j������nYi�;w�����k

R������?�������Sbb�����X9 =9y���z�����c�.�T�t�f����{Nc����.C�Z�`���������9�P���xU�S��������U�V����u9���S���wf��I+V����3��uk,XP3f�r��{����U�Z5m������s4������<z�������INN��A���'�Xn�)S&-^�X:t�NaH����5s�L��s��%-^��C�����9�o���G}T���n�V~��w���#T�~}/V�t��E5k�L�u)�
�@*����+11�����+��a"*Z����y;z����nILLT��=5u�T���f��_�U-Z��ReH~��7�:u���9�j:��1��s����;wN�w����35p�@�����1�/_��_~���7����7��������^���9��{���n����g�j��=Z�`���y�,Y��1�����}{%$$x�����^��t������}���7o��vaaaZ�r%���i_��i,O�<���~�M�O��DI���s�\�r����&O�������>P�L�����O>��M��P):�+W����,Y���{����'O�-[V�;w��~�}����T�������]�����P)�
� �����#�<��~��r�
h��Uz���T��K�.i������>�H�s��KJJ��3<U�����^��
��|����_|�K�����;gst�Z�������[k��-������?�����x�2R�@�p��e=��CZ�b��v����5kT�|y/U��$<<\���6cY�fU�N�,�U�O�����T���|�r���Yn�j�*����^���u��e�X��Y�W���9sf��5K��5�����K�7o��� u��z���S�&M�~�z����+�5k��x��^����i�Lc�;wVpp�z��m�������x�4nP�H��5��v���^���v���X���X	�^�9s�(s����}��w^����t���<yR
6��m�,��Z��V�^��z�0�;;v���-[L�7�k���r���ng����Z�l����[n�d�/Us�����u	�{\�<y����[n�f�%%%y�"R�@�u��!5h�@������^�zZ�r�����T������4V�H5l�����VA_�`�bcc�Z�6l�e|����t��w�>��G�xtt������jH=}]��o���Z�j���_������z��bcc���3+o��*^��*W��
�A���)��K����KZ�l�"##�o�>>|XW�\Qtt�2d���9s�X�b5j�m���2C��mSdd�6m��C����c�v��bbb���3+_�|*^���V��
�Q�F��!�q��u�V-]�T�����}�t���[�y��YU�P!U�PAu��Q�6mT�@_�����h���/������;o#qqq��)�r�������F�j���4h ����{��5k�����r������~��{JRR�6n����Hm��E���'���Xe��A�3gV��U�xqU�^]
6T��u��oO�8��S����z�)�4��]�V�����Xpp�^y����.			�3g�i�W�^������������k�k����o�U�>}<RkJ�>}Z��������G����k���VHH�r���%J��O>�\��Y�ah��-�����c����_g��Qtt�n���,Y��`���Y��&N���.\�����g����W{������u��U]�zU7n�PHH�BCCU�@.\X�+WV��5��qc���\�vM}��i�W�^*Y����3�{�n-X��f���O/���BBB<^Gj��I����<��^��v�J���M����������;w���#�������x���(K�,*\��J�,�:u��I�&*_�|������w��_���[�o�>�>}Z����~��BCC�/_>�(QB�-�u�N��������;v����:{��bbb����L�2)k��*Z��J�*�:u��q��*]���K����f.\��%K�(22R�w�����u��U%$$({����'��U������S�N��%K����m�~��gm��U������t��(G�*Q��j����~X
6�����_��
6�������{�g��:uJW�^��k���3*$$D����}���
*�Z�jj��������z�������W��_������~]�|Y111��1�r����E��r��j���Z�l�*��p��"##�a����[�����w�}9k��*V����+�����^�zn=7�����r����#����L�9t��*V������������Wk�����o��9�.(&&F�����9����r���^�zj����������v��6m�!���r�J_�h��k���>���X���c1�����z�26m����F�i:���#m�g���F��m
���i�\����c�K/�d.\���.G������������8r����E�q�xIII��i��J�*9����-[�4V�Ze3��!C���3����=��Z]yM8p�4h����+T�������_w�V_+R���ck���C96o�l����}���oo���{���_�e<���F�<y\:~���g�����S�RT��7�|��������[k���i
��w�J
���w�Y��}���u�&M��n��qc����o_�>���������h�����W�����r����7�4
*����|����?����������������)�6:t�`,[�����y��L�{��'�6��>}���P�N����s����(_����3g�LQ�_��������k�B�
�'�|b������?���#G���}tt�1~�x�t���o����n�jv�����=z�3gvi���+�����~2���Z]������}6m�dt���p����9���SO�.]r�yIHH0&O�l�-[���U�T)#<<���\�~�zc��QF��
�2������3���kL�>�����H�+W�4������K���c�>'

5�y�����y,V�_�nL�2�h���S��;o��w�1p�@c���Frr�GjM��x�/�	���k9�_|��1
#���k��Y~N�0�M����)SLk		1�\�b7�����)>>��:u���aC��I����&M����[�[�5kf:��+R���'��|<aaanyy��5�|<�|�����)���������h��z����k�.��DGGk����Q����i�#G���R�;vL�[�V�f��x�b%''{d�s�����S�%��������.������I�T�lY
4H�.]rs���m�6=������v����}
����K��Q#���C/^�-�������w>�n���#F�|���<y���������'5|�pU�\Y6l�P��Wdd�|�A]�p�r���{��o����o�V�T�bE}��:w��Ky��9�?�P���+��������'((H0�O�2������o�V�^m<x��kp�i����j��is�[��W�Z�������s������;*""��cO�<Y�K�������'O�%grr�V�X�A�)_�|j���>��S����t5kG��������C=����k���)�u�����9s�������/��o�1���������o��9df����V��Z�h�o�������_i��a*Z���O��Rw���T�lY=��3�����p��e���]������R��������S��E5a�����'�s�'�xB5k����~���$����?�\e����?���}��_����k��A��w�S�8p@=z�P����~�k�.���k*^��j���Q�Fi����q���9
����k��_?�)SF���wc���7o���)�7�x��s���h�?^������ZBB����"E�h���Z�r�S��;�8qBS�LQ�f�T�ti}���n���|'W�\����h�����uhh�:t�`�9s�Ky�5c��X����5kV������dM�8Q���c�=���W�t.�����+W�C��R����[���|�A���+R�[�~��w�������N�v����gm�*U������`
�v��I��WO�>��]
�)��O?�b���<y��r:j����Z���,Y��qf����e�����Vbb�[r&''k��)�P��"##���[���k��][��oOq��s��Z�jN7�x��s���Q#�;6������W��������������~S�-t��U���q��1C���?T����?������z���T�J���������������VM��J�R���=:�;�9sFK�.5��5�w��I�2e�3��
�7��7O5k�Lq�������{w
<��MO�W�V��M5e�EEE�5�M���������{/Eyz��a�(c�9�����e��.]�xt���^�Yll�S������_?=�����eKJJ��������n�ZW�\q[^{��������C�^mf���?�\�*U�������������?������3n��O���s��	��SG_}�U�����?��m���&7n�4h��<�$-Y�D
6tyR![���~���������c�����w����	)�����C��{��:�|�r]�rE�����/����l��y�*U������u_�t��A}���n��w�e��9%I�)����}�����]�C��Z�C�9bY�U}�r��!��[WC�������w���W���x�
�'��j@��<n�����o�>���t�Fy���}h@����7�z��Z�~�G����j���z��g��j�/���-Zx�yM������SO�O�>���3z��5w�\��w�>�@�=����������c�_�����O�:���k��8��P����.T�6m�6��������/�����zbbb��cG����[�x����U��V�\��}�)��-[��=9���7,W�4h������3g�6�[�n6c���j���i�3f�|%����+..�����qC�<�������q�-11Q�����q��c�����W/���'�����gO�	����3�3�R���-�Sj��%�U��N�:��1n2C}��������)99Y���O?������W�z��n�h��|��9A��]���/))IC���?�h3>j�(
>�m
������i���o�7o��5k���/{m����k�N'Ntk���_c��uk�����K��W�������A�`o��,Y��x�����4i�����4��U�g��eznV�`A5k����;k����^��6l�����a��7�T�N�\���z���+l��I��]s�6GWPO�J�V����x
����m��7o��g�:u?W�C?��3=��SN��Y[�nU���S�B����D���C_|�����)!!A�{���J�)5}�t���KN���������uk���x��K���ys��xx��
����#����g�V�����,��[o��w��x=���j���WV����V���]Z�n�����o���c�
�-2]�2(((U�Nge��i��V�ZY����wo���c�R��{W���/z���}2v�~�|��=a��	9r����:N###�g��s[��i�elZ�(�.^�h		q(��}���aC���_�(��X�7��9�k�����g{to3Cti�g�kN�:�f��y�5����k�������'��799Y={��+�'�|���G�u,I��q�>����������c��nk��rsB�%K�x$��Q���5j��|�I��Z�	|g�z�;'��={����}���oym3{�l�N�e����W/�����9~���j���W&�����K�WBP�F�l��z�j�krt����W��9���dZc``��c�^���Y����g��U+������O>�D�7o����������x;vL�/���?�l�������_z�	 ..N={�TLL�]�L�2�m���<y�6o�����+..N111:~���.]���^
�;����`����.]ZO?��������w����JHH����u��1�^�Z#F��<`�'))I}�����[������lw���`���K�����}�t��u%''+66V{��Uxx�z��������{��!=����(���}�j���w�=k�������N���[������������g�M�>];vT@@�e�s�����_�T�>5a��������~~~��������z����D�k���dW�ZU/���-Z�}������JLLTtt�>�e����_T�2e,�����C�:~��S��j��t����8��5��|��j�k��������q=a����+cZ5aHR�f��?~��Us��\�pA���SRR�]�����[�n�3g��l��S�N����^��-���?�9r�4��3LW\,[��^|�E-[�L{����K�������(m��E�&MR��-S�\R�D	u��E�����.]�]�v����v�����u��U;vL���������Ce���n��c�j���.�t����n���qO��n��F��R��G�MK��9c��;���N���>���O[n��zHc�����+u��!EEE)99Y�.]��}���7�h���v�=x����a:"""�t��"E���'��O?��]�v����JHH�����k�.��5K�:uR``��>�l���u����9� >v�X����e���\�/��c����$]�rE���>���c��.�U�Vv�S����O=����������{L.����u��E������Z�z�^y�*T�2��k��������������/����������w�}W������Gu��u]�|Y�����3�����}}�����D����s�U�Vz�������j��m:r�������X�:uJ[�n����5p�@��onZ�b�G�����G�|����|�u�����#������Wu��A����2d������d=���n{O{���~^J�,�^xA.��={n�/������������p�B���kj���2e���o�;��!))����+V,Ec��}m5�����]�4����:dOM�-[�L]�v����%Ku��E������u��qEGG+11Qg����;4q�Du��A3f���p�B���Z%��&r[V�\��v��]��M�\c��-�
���WW�,Y\��I��6m�!���r�J_�h�a$''M�4��U�Q�rec��5��v���������hDFF�\���#Msg�����O<��q��E������O�6���Gv��
K�,1���~\K�,1*U�d��t��������_G�1�[�H�r�a\�~�(]����d�����g�y�����6�-Z�t�i�����^SE���o3f4^|�E#**���;v�0j��m�����{��u�~o��|��5j���m��}�����c��^������[S�6m~�3�HJJ2f��m+V�2o�F��zO0�3f�i��+:���:|�����g:�o����1=i�����%G�F\\��/���i������+n��o��N}�o����P�+W�.\��z
��t����%K~l����\�����������w;<��;w�=z�l���/n����4���3M��������3�]�f�����9i�$���V� ���#G�u��/Z��I2V�^m�#..��Q��e�2O?��q��!�k�v��1v�X�}(�1b��������q\�@c���F�;�
����o��.?6[~��w������4^}�U���k�\�f�q���[��d<���)��W��V�������o�3g6����uHtt�1l�0�������k���
�+V�~}c���=���W����G�?gf�<f�z�)#""�HJJr:����������;((�����RT����w>��������Cc����?w���y�;?�-Zd��]��Z|��N����6����G}�4$�����w���s�M�6Y����g\�z���im_[}/��c�9��buMV�F
�ry�{-�0��9r��|����c���������{��1���v��~��w����}�i���+;���q��A���������8����i�W_}����G:�i�}��)vH��O���"""l6L��V�|y���.�n�,|�-g������]��;v�����[��?���&������=zX>��_���������c-�

2���]�={�l�����'���*T���s��c���>��e���z��������_��s�!C�����Z�K�.��'K�,����]�e4m��r�)S�8������`l���[�r�����k�c+V���6_���5�e�f�x��P�;vX���'��vG�n��-�p��#W��������l�k����v�Z����{��&���������_7r��i�w���n{�a�'O6+44��[o�v��7�|c��kob�W^y����J�r�A���;wZ~��<��U�;o-Z���k�[
�qqqF��%-c��9��X�������w������W����Y�{+\���o�>���w~�����o����c=z�f#��[ppp�'��d������s]j:�%**���������k��a��~�-c������]��{fJ'N:{��f��	&�h��:d4�(]����M��x���	�}�Y��\m�5�������+�\��es����_��~���?w*����JJJ2���k�\�l���Im�?�b��D�N}�'''�s�������8���5N�4�f>��$�4i���a=�����|�r�rp���������+�����G��OW������Q#-[�L�2e2�f������/������0�X�B�j�rK>�04p�@%$$��g��QK�.���?/???����1�����!C��n3n�8�?����v��E�����q???����{��.�����f������n�J���u�T�bE���)S&�����/��6���WRRRJJ�9�04l�0������e��I�/V��R����5x�`�x��9�n�:�����1�g���K���G1�f��Q���w8g�����M��������JRR��M�f8p`�9��w����+����{;�����W���M�V����(QB�V�R�R��>����5u�Te����y�+��[�j��%�S�����+WN������+g���q�\���}����y�����{w����u��h�������K+g����;v��?4�W�^]����U��r�+V��
T�pa�����9����h���-Z��_3�|��<h��%�~��w��_�������={��u�f��/����8��;�S���+VL���*]����5j�4h`�g�}v��>���3����)�����4�o�������h�"m��]��u���{~��={v��;W]�v5���o����'�2����-]�T]�tq������~�a���]��s�NW��s�=�.���d��+VX^G;�x���4i���[����� u9s��&M�d����iu_w����{�+W�h�����ii����|���X�\����&L���k�������Yy��qy�.]�h���


�?t���L��p>???5i��f�0�\�����w�7��Y�v���@7n�Pdd��Xpp�����T>���M&L���v�*U4y��5V�^]'N����>p��Y_��e������;m���f���_s��1��������5k������m���/��B111����~Z�:uJ�]�t��O?����1cF}��7*T���9�f�����4~��y�_���������A���O?��.k�����_��E/U��k����6c!!!����T�B���Y�f�X�b6�'O�������9t�P�����u��5���Y�d�N�>m3�����eo�j/Q��S?l����il�����w�S��C``������UO�Q�����+�LHP�HU�R��y�&�����L�n�����{�Uc���+u��!���i����"�4h� �������oZ�f��6V�H�������D���%K���V�,Y\����y���o�1m*���ou����cK���5w�\�&�J-�_���?��r�)S���=���_��M�<G8s��S
c���{�����������s9�G}d����m��v����^py��z���r��.����m�zd���k��Y��$'';}����?�X�7NQ��>����R�����m���sM�������T�n]��[�����3H=��{w]�~�t����'��SZ��9r�P��mM�3g�t�>+V�Z�n��1�	������t��A_~��[>6lh���{�����d��=����1�fr+fM�P�%��{||������X�n��qY�N;���h@R��M�*00����M�:4�a����M�~~~���/���^�^���Q#�����S���.]�X��
��0@;vt�X2d��)SL�:m�4������l��X�<y\Z���1c��h�)w;v�[&4����r��e��4��EFFj��������i���.�D����x�y���kn]i9G��M�����C�����O�Axx�S��X���uk����-�x���G-W|����S�z�������/VA>|��V���q���4e�����m�����>k���]�[�L����ju�V�RE5j�p�8i����:��V���e��,Yb�6m�r���R}���Y�t��0�~��j��	iz�sI�7o���;go�����9�Wpp�]+u����;���{�/����k�(G�5T�|y�������*����,��?�Lq~O	

�l�w���Q�Z�����Q%J��\����w�yG�a���
���!��w�Ctt�z�������^x������1���6[�Z�g"�3g�8]�-g�������R�4a��={�f,,,LS�Nu����a�T�Z5��������~s8�;�w��e��*44T5k�4}�uv�+V����K�������d%%%y���5k�������^�z�u���>���io��n�&???���;n��v�Z����f,[�lz����:�$����M��N�Rdd���t��5kt��)������-[6���-[6�5�-�\�+W.=��Sn����;��Sss�=V�!�T�@�Z�J<���*��w�}������+VL�?����l�����6l��c�����������mh����S���_L�imU�3fX��]�0o��j���i|��Y^m���9��x�
���_��wW�J�|2��X5�Y5D�$����MW�v����-W�Mk������G��77}���~�����&L0�u���#�<����+���?���5l���I4��5k�i,00����6i��������N��_���h5�������m
���y��c����:q�D�����~X����i����=6���#���G��1W�s��=�~��4^�L�\����|�0�����^��,X`�m�r���+��4NZ��-Z�P��ym����4g��j�Sxx���o���S�����Mco����g���1_{�5��3�~�J��}��g3v��A�>����6l���@��pg����i@��tw����-���
s�x����5kf_�b�����:f�F�T�xq���j������V�~���LcV+Iy��J|����������������Q�VHH���5h��4�o�>����������~rhLw�:~�|�I���`s������2d�`3���j���N����_m�@]�pa�l�2E���0�}^�n]���X5�����Z�t��9]��sg��\l��N+�+�r����m�������oo��s����`��������6c�2eR��=S�?������q�T�fM���~~~z���M�����7o�i��HR�����U+���G�j���n/=�/^��U�L�?����)��1�n�����:���}��[7����%W��5-����z����2Vhh�����m��2��<��#6�����;vxd�:u���G�����p��.]��T�(!!�4��/���N|g�]�����������h�"���+*S��y���aaa�����)S&��N��:00���q���N��J�=z(((�-����u�L��r������{d�v��)g��6c���.�ot�mo�|������������u��U��������m��d����#����.��-3��/_�#+[5�%''k���n�o��n�'IK�,1�u��������A�����w��5�V?dm����f�����f����[�5���V�t��J���w�X��az��'t��5������1???u���cc7n��4����;wnu���4��U����5u�T���L��R���9r�4��O���k���}����v)�+<�9���E��a��>��������t��A�rY6���8�w�.]�([�l)��$%%������o�����!C��p��>|�C�?����S��i|�����S�J�R�j�\��w~fX��)�:u���|��b�
%''����?\U�vm�,Y�4�|�r�����\�sg�M�qS�j�T�H��w��Q���	V�f�-����s
(�\�r��������%{��n��,%���=�����@�n9s�T�%��];���{:p����%K�����S4iaz��V�;v�������w��;wZN�����;���O���;z�I���O�5�;}��:�p.w4�'%%i���6c7�s����+�����@��f��IE4h���@��p���K ^q��E����4����o��re)w�(����v���S�l����,�R*G�*[�����;d����r��u�U���m��q}�Q���j�����K���\��7n�u��b���j���W��#""L��x@�
�������*����9t�P�Xxx�bcc��)�31��c�l�,W�K���3f��.]���7$$��i����\����� �~�Xi����U��"��)��G<��1��_uy���{�Z�/
<�������fAAA
S��e��W/M�4���t6l��>��r��C=uns��q��U��U����3�-��X���j���G��Z1v��]�|������{n������x������cIR�%Lc����+��l�R�^=�����9w���yn��a�)�s<�������������$�7g���������7���Jz���*UR�*UL�)]�j�����_U�VMQ~wI�~V
�+V�p(��-[l�������}��f�;9��n�����4����U������q3e�d��V�Ffge��=E+Y��q�F�X�
<��7o^��z��N�>��������r�IO����u�)5j�P@@�[sf��A����qo��.aaavW[�v�Z�j��J��`u��Z�������;wn�����;�4��aC�f�+W�h���N�(Y����eK�6�����W������[�n�9r���j������3����*_��2f���qly��|2�'X����o��-ZT-Z��KNN���S]�;e��X��}6)��x����F�i��%��!��v���0;������]��qlu�P�jU�����j�5���T�j_/^\aaan��������x��5�6�$e���4���=��d&C��n��-�i�������K����qwO<�|g�z����[�n��y��M���k)}�k�U��������T���������o��{Z9�+T��J�*e3v��i�r�5�7i�����Y�����V���x
�@*�r�J���[DD������/��'�{�r���]��j�����
*�}�;Y5�����i���7�e��Qe�����e���z�e�<�7k������8���i*T���sh�]dd�Z�j������Z��7n����N�2d�i������s��x�b�xZ[Uy����+����;E�6l�"E����M�������j��a����O����������]��V�Z*^���g������������m��1�cDEE��F������v�������H4��|�???
6L��-Shh����aX6!y�3�[�{��8v��O>F{��������������?~������W�j���z��w��_?5l�Pe��UXX�2e����@�>����R��dK����N�
w]�X�'KR�Z���i���C��w�A``����3f��=5=��=z�^��9s�rup+��-3�4#  @={�t)�����K���6c�3g���sw�����n�2��+�7j�����v���s�,��t�����9s��������t�9y��i�p����3��������s�t��
����I:p��i����R``�Go�~����g��u��u���Z�J��������@���<%�+���Z	��G�iA��n�5�f�=��#����`u����+?~7m�d:�+�o��}M_;���s��m���JHH�+P��y��k�%��\�r�U�V)�����^�z���o�n������K�c�<yRc��Q�*UT�`Au��Qo���,X��7���#�r�����\^!��R:	H���U�P!���'Oj���N�[�p�.\�`3�����
h��u7n�C
�g���lN�S��G?/�6�y����w���7=&$�N��;wn,X�4~��	����}��s_��^w�g5�;'y���������iS���K=��^}�U��1Ck����}�t��E]�~��U���T�����G���������Pg��A�����_|QU�Vu�9zz��y����?l�9s�S�n��8�E���/�Ky��j_���(((����M�6��;�/�l�/����n���?���f�����Y��z��wmg�V�\i9NDD����m��\i�w���6f+I�l�p�F,��*Z����WY5�����$������_��������<��pS���=����IrK�/u��Ys����2��Z�J�[��h���a���?~��r�f��]]�v5�;�
��)SLc��S�}��i��u��n���e��>}�X�=�
�'>�R��'N���T�hQ�9��J�����h����qg�S��;u������$W�\<x���[���W;�:����$�^X}f��|���!�b�����5V�49�W�*[�l�v<w�c���j���*T���+Vxe���~6����s�&t�����Q����A��{�n5h�@���K�s��}��o_���E�,'������Z�h�K�y�������%���U�U��$�_���w2��w��	 ����5�[��n��;���m���Lc�np������n�
V�������m��k���Rnj��K��=����r�J�i��#������U_s��:t�il��Y7(EDD��������{���|�������kwT���-�Z���u��
��e��}5��i�T�BM�6��d�����*00�fl��%O�s���f�A��T_Z���������Ke��U�&M4d�}��g��e���;��'�v��N��W��|��.V�4�o�E�uM#�n_y��7-�ko��A�+W��#t������	�R�s��%��/����+�!�0r�H�ay�����3g�i�&M�2E]�tQ�L�,�����C�vWi�'���6m�(g����,X�T�o�����>{��j����5zJz��aaa����m�.]��m������Z�����Y����j��<�t��jJ�t���
w�(:$$�-y����3���*F����RzX��^��[7��9�ns��+��m[�7���cWr���U���T�b3v��%}��w��Z����R��E]��7���4k�,�x�2eT�fM��g��~��E-^��mc���s�m��_~Y��k��2�',XP�[��KLL��i��3u�T����e��a��.���8�lvsU���X]�pA{����+4a�=��S�Z����]�/�������S_������V|y]��F���������^�7���}]�=��xJm
���3�W�xRHH���������������u��i=���


2�_\\�:v�����<vz��2dP�n�L�3g�t*��3Lc]�vUpp�S�<)��K�&n��o��q��z��������c�l��������{m�
(��e����sh@p�Y3g��������j�)��VR�=zh���v��/_�v����xK����*��'O�{���(�F�������K-W�����[�����2d�`w��w{��������%W@@������-cX�:N��oJJJ�|-
8���p��������n��uMj����V�X������}������)%�h�GV�M���z�����l����?��?�l9ITT�:w������I���o������H9r��<G�Qdd�K��Bz��f
��yzll�6l�`3f���:u����5���9�:�?Snc�TLL�G��������h�[��McW�^�����������M�f�X������];�+�:*=�={�T�,Yl�"""t������5���y��U��mS\�7�k�1b��v��7�e�����j��"##5b���-^��z���?�P?���6n��c�����K�q���Pbb����qR�y��*^�������-1$i��%:}���X�R]OZ��?3��k���5�����x��z�����aaaj���F����p���:x����?���8%''+))����������x����b%���z4k�LK�,�|�l��Eo���K�����Y���
��a8�
��Y�L'X*]��i�����}��aC��EFF��ta��56�^�lY(P�t,�fw��1��t�t������R,88�4���a��|-$$�4���/�0�������'�?�V���k	�S�>}4u�T�?����_��}{�4�[����W_���m�����-44T={�4�O�2���V������ns_jr��E�������l�r��JRR�����az������l�Mpp��{�9���G����3�����]�v�Q��
.�9r8����]���4x�`���qh/��}{����\�f�3c��=>�����w���s��|M��3Fg�����C������s���?h����������%J(,,L3f����eo|6�%V���/_�^!�;���~������-�y����w�^�s��}m5���Y��au���O�k�4�}�7o^������O��YU�zu�����_�����5�[��.�7��\����i@R'��&{���1O7j\�r�2nU��e���4v��%/V�z����4���S[���_?M�2�n��/����;:������P�����;d������m�d&I�����]�l����4p�@���-�g�N�k��O������K�j��m��%Jh�������MWht��?�n�����
�.��l�N�:�_~��4��A��R�������?3�{�
���I��4p^TT�&M�d

���s��w��Q�Fv�q�/W�\���vM�w���A���U+�xBB���t����{��e:Y��C���X���?���C�l������w���nV�2��[5s�j7k��^�F
e������>}Z{����o���c�l�)^���)b9���m���o;u��G������gY���w�}��������_Pbb�G�MLL��<����M�<�n���%K��S�5)_�|���~�V�RE�j��;w��/^l3f��r�&MT�dI���-��M�u	6���W����ui������e����U�re�����?O�<j������74c������ZIII6c%J�`�@�:����gFzb�����5
�����(..�4>k�,u���m��>s�B�
��N�<��J��;��i��	


5����/Z�l�S9���.T�����V����M�4Q���]��S����7��j��j��������u�������W�&M,�	T��
m��lj�Z���J�<�t���q����=����5��'O��AS��E������o����.]�4��{�zd�={�(>>�#��=�=��&N�h�	��T�.]LW�vDz?~�j��b��k�4�|����U��n�������S��9>�1C��/7����[���+�V����������:u��}��Uvq���[>���3#�VXX�i|��m�������&2@�b����S'�k����y��)-(V��i�����+��Bz��H����>����������N�L���o���1�	9����`����������?�����3���_�^������������Z��r��aw,���;����T�-���B�
�qO6kX��W��Y���e��{�!�|����7��j�����k�5h� }���v�(-Z��]����nu��]�����I��]M�l�2=z������+&&���aaa�����K�����=�|]�~��e�z��3m�

R�=�:�a���?���J���U�lY��}��i�����m��e�MuAAA�����k�?M�e��1����������W�4R����s6o�l�DC��M���3-�:���
6x���� �>|����c��q�~��G����}��}{e���f����Z�x������u��e����Pu���]%������x��:u���%$$h��5��}g��M��Jn�<~gc;
�@�E:�������u��yd����[6kT�T�#��K��5Mcqqq��q��IBBB,�k����Z�h�G��7���?���v?����u����D���:~�=�'N8�35			Q�>}l���ke[�-���Oe�����y��7n�Z�����m��%�5\�zU�}��'~�r��!�X���Z��{���������!C����<.���6m�(o��n������s������'�������^o!�HHH�<Ol��������?��3-�P�����M���}��R���P����5��|�y_g��I�;w6���9���KR���9s���	y��U���M���=�VM��m:7kw�)�R�J
���QQQ�&���k���;g��*T�������6�r�R���M��������-2]qW�4h��q��N�:�?����_�XM�a����~�IW�^u�xW�\�O?������'�x��&����^��ww�	���]���:t�il��iJJJ�$m���r��A���6OZ�h�eq�^��RG����;wn�xj_�=5�t��i�@�no���n�iO��}b3����***J�t��9�I\�����f����>�x�X��~�����9���'+VT���=2.���������_Y�fu{C��;L���UAAAj���i|��9�~���
��w�����-�)�l���$z�}_����4������>u��9��l�/5�:�[�|��k������g�j���w�3d���w�~~~����ln7[e�^���twy���Lc;w������>����Mc��G����j���i|��	�
��U�6mLcqqq�3g�[���j���'�|R��������~��={:�#�����0��7N�a8�/5*[��5jd3v��)������WUn�����-���<������_��u�J�������i|���:z��WjI����3e������_|������#���$..����������`s��E�Z��!�Z�n���@�����j`�i����7�I�����6o���{���9>�o~6I�g�}������5����-'��&�3H�2f��W^y�r���G;�+���
�X�b6c���wss��1�$�H�"��H����3�?~\�~����q��5k*44�fl��m���2]��v��N}��M�w���l������c����O?��������r5�|0M�h�j���5i�$/V�:4h�@4��5JW�\q�XW�\��Q������O?�O>���v,P�^��jB�:~w����:�+��Z}�������l�Ik�*�>}Z����i�I�&Y9�L��=Mc�ah��^�%-��#�i����.Y�D���wkNG�;N
���)SL�y���,n�r9r��lv�6m���9���`&g���MmK�,����:��q�,������X}6]�p��]�p�#�&�]�tQ��M�}�Q�����R7w������������c���f��������[~~~n��Z�h��y����y�/V�AAA���'''k����+�;�n6�hdd��_��U�V���N��{������__E�5�O�>]7nt�x�<���jH��wS���[[>oc�������WP*����!C�����;�#F�e�7�x��M�H}�}�Y�V��7o�������d������t0Iz���u��%��L�:t����s������7n���9r�P�N�<Y����9�r�^�zy��N�:*Q��i|���nmTKo�^���u�V��g���h���n�����k�R�J6c;w��{�����h���,�z���Lc���z���9�S���{��4l�0��i9�K��%U�n]�����9�BBBl��u�V����3�(..�m�����0�������_����;��������}��O���m��i��]��9��m�e��.C����m������R��p��U��V&���-�J��}��w��cbb���_�~Q�j�41)�����.~~~z��gL��a����rK������|�r�x����s���
���z��7L�QQQj���bbb�X��=����9�i���>���~��1,X��?�<E9�v<��s����n��}�:���5kV=��s��#G��[�nN����d��A����KJJ���#M���wo{�4��>}�i,88X:t�^1�����i����Z�r��I[l5-�e���3�y��oo�Z�����G�\�������)I.���c�X�t���r��%K�h��E)����Hrk�;R���y���e�Y�fi���n��^������7�	������d��R�A��e�����/������o��~�j��U�n]�*U���y���>k����/�6l�VV��,��#G��{���U�V-����{��T���MC��\mt��Mz��'S4����5h� �m^z�%e��!E�xS�~�T�J����;��uk�?�c5$%%i���v�[o��+��*b�a�G��+FZ�3g�z���J���^x����7��=[���w�	���^�l6X�l�z����&���8�?^����G�2�t�:�����~��?��C���3��i�FY�f�bE�����e|��i^�$���?���-k��W�����1������:E9��W�^


�KO�iZ���[6;�5���RR���3>|�,X��q����`��������O�w�vy�04h� m���t�������sy�^V
r�}���>g,]��rb��B�
�+)'''�]�v��a����t��S���A���_~�rGWAO���o������p��q��{���6�r���#L���������&�2�m�6�o�^��Oq�*U�(g��6cf���
*((����6m��8V��]4��)S�Lv�;'M��!C�����v�Z5m�T��]3��B�
z������K����1c�2f�h�MDD�x��[���c_�pA|���/��}��|��z��T�ti�xBB�z����{Lg��u(��3g��������`�b�RT/���^zI������f�����mB

���SM��V�U������t�VN�8�7�xC����>���O�5�M���C=��}�����+z�O�����W//Ur�2e��z�������^W�^�bEiK�-Lc;w�T����l�N			z���5r�����6Y�dQ�=��O�B����{�"�R�zu���K�q�0��K/�c���r��[���y������E�j��q���uk�������\a����j���6m��t���x���_3g������>Rpp�����Y}6�����G��\�=s�L�m��c�A~�����k�r��7n��S��e�#G�h��!�S��S��;��o�����?�i��U��������BBBl�N�>��^zI����xpp��t����<��g��\�=**J?���|�M�I�������Q=���V����t�s'5n������*�����!��s
�{h@`�_�~vW��4i������7:�3&&F#F�P���u��E��5y�d�V���J�*���?�������W����i��k��<����5c��m�V
�K/������-88Xs����?���k-ZT={�Txx�������%''+::Z{����9s��G-ZT��O�+G�^���aC=�6�����z�-��M�6M�
�a���l���J�������~���K�v�r���:q��&L���M��h��z��7=���M�����VF����\
8g��>m��Z=66V����b5i��,'��?�5j�T���?���+���?�+V�xq��tg��(  �C����1cT�n]�m���{)RD������;��X��o��o��
*�F��>}����]�w/��1�&M�d�b��s�T�~}�3��f�u���v���1c��v�Z�R�����iG��-U�`A���={��8�*��]���ys�������|�������K��M�<����4p�@5i�D�V�rz����:tP���5i�$����� usd�Q�F9�+=���Y��}����O?��4����*{����s4{�l����t���d���*S��&N����ZBB�V�X�g�}V�
R��m�|�rWK7�lc����,XPe��qx�Z�j)S�L.���}]�����O���z��t��)��6o��Z�j�Q�F��������%J(44T���:{��v����K�j�������;�{����Jb��O<��G���>0��0���O����T�L5j�H�5R����+W.���S�2e��k�t��e]�|Yg����m��u�Vm��E��P�ZT�^]'N��,����Sxx������d�����O5|�p�m��6�����~�m����V@@�&N�h����{������������3g����U�R�[�o�R��3gN���S3f���Wo��N��u�n��UG�u�!�H�6mT�@�VY��5��v�������o���k�L��;w���&��u�/�`�*���p�J�*�k���7o��6���*[��Z�n�G}T�k�V���5kVEGG����:v���.]���k���6��l�R�j�����=�p,U�ZU5k�th�=��c^�
w


��?��z��i�����]�rEo���>��#��][�5R���U�P�[�|�n}^\�|Y���3�������k��1z���M��q��F��O?�T={�T��-U�R%���W��������C��h��5v�-Z��f������T&88Xo�����!'N�P�-T�Z5���Su��U��%�={v%$$���s:}��"""���?j���6W�-P��>��u����)M{�����������.""B�7V�����}{��[We��U���)S&%&&***J�.]���y�fm��Y�W�Vtt�[j�;��m��!z���LW���u�-Z�G}�n���������w7}���@5�W�H-Y�DM�4QLL��v����C����O
6T�F�T�V-���G9s�T���u���[�2**J�w���-[�e������	qR���\�r�J�*)k��}o u���<y���q����U�V�������K?~}���,�����{O�a��?����}��o�>M�4���N���u��y����",,LK�,���e&c��n�����+))��Jt�'O�������+�&t???��5K����;w�e>�0�}�vm��]���w�|�
���5f������3��<6m�4�x�^��T�m���S��MMWB]�n������
q����~[�����9Irr�/^����4F�b�4}�t}��W���C�u��E�*\��*�-9s���+��E����r��������=�����=�)S�Xnw��%}��g����n�������s����{n��o���:u�6m�d�����?����1���5o�<�	l�����W�:4�������{���7W��p��^7WA6l��6�G�v�]J���Y�f*X�����w��/��7o���<�F�Z�t���i���/[n�E�i��E�)�I���S���M'Z��&M�XN�gO��M��ru�u��2/��\���-[�|��9u?W~�������&N{��������>S�|]N���K/i���nm/Z������.]Z�,W��=�9r�F�aw��'��'��|�


��9s����/E?�N����������>l��Y�H��W�����gO���&�{Y�b���w�yl��y����~S��y=��]�vU����n�����(��Z�f�Z�j��R`���O'N��!C�����5�
�����r��9=���� -Z�H�
�H���@����A����5J���W`���rxsi�3H��������o��������������W�^]��f�����5kn}��9��xJW%w��=S�L�]�v���>4�pH�j��i�&��S�#�3e����'��O>Iw��O=����_�J�*yu������a�U�R%���w����7���_�U��f���1�z�=Z���������+=��������������e�T�hQ7Uh�������>��q�}��m��^���V���:�m����MC=z�H�1���WHH�i|��Y�pj�I�&
W������b����a�J�,������)�z��m�M�|���M/U+��e�O?��O?�T���^788Xy����xi����&L���?�\����a����i����~��G��?~-]�T��wk����k���j���[���~�iEDD�}�x��N���z���,�=z�S9�������G�O�*V��-[�h�������O0s��my-�,G�S�*y��9��~���l��h@��B�
)22R�~��r������<��v�����-gjS�jUm��E'N������^xA�v����3=6�;T�\Y���f���t#����~�a�Z�J�����+�m���(�������r���;V���������=��3v�k�������w�}W�s�vG�6/^\�F���C�4v�X��s��`��������1c��6����)Y�d���>j?}��~��W/V��t��I7nT��eS�+  @�=����_�"E���:��w�������]�~~~z��gt��
4H3f��X�k���	�������|�I���C��7w[���s��/�TDD����
*��?�T��m����G���[S��w/�W�����/�9�#�U�VMo���[r��A�4d���tgVA�)���r���F�m���b�����2g���'j��Mn=��SPP���k�����S��7��r;��^�P!�����X)]i�{�kN����3�<�h��I�6m�v���t���P�k�N�>���W���JS���
<X�=��-Z��3g���~����]��5j�Y�fz���T�n]��j����W�>}��Om��]K�.��
�w�^�;wN�����!��d��B�
�B�
�S��Z�n������=~��i��~H?�z�-%''��w������>����>����2f���_~Y��
��y�4g�EDD(!!�����U�n�[�o�j���:��3gLc��������jq�.�����,Y��|��^���K/��2e���S�J��]����c���5K����������o�0>l�0�����g7mH��=�+%;��8���K����e�����I���[oi���Z�`��n����9s�T�&M��Y35o�<M��k�����y�7�gK�*�_�U6l�����h�"���8��R�J0`�
�L�2y�R�%��g��E��|�r���;Z�b�S������?�a���Y�fw����M?�������`�5J����)S4{���'�-[V-[�T��=��]��>!!!z�����s��n3z�h���lIo��o����i��������j����������wk��I����u����,V���6mzk�s"��*Z���/����n�����M����>���t u�3��u��f��mZ�p�i�_�~*Z����I�={�(""B�����t��1]�zU���
T����7o^/^\�+WV�
��Q#4$���j�����a�v���c������v���_�.???e��EY�fU�,YT�@�-[V���S�r�T�jUe����#U9x��J�*e3�;wn�;w��!��|��"##�i�&���K����S�����+00PY�d�u*T���{��
�Y�u����u�l����'{�"�u�����i�"""�z�j;vL/^��K�$�3�B�\�T�ti�/_^>��5j���Wn�G��;w��X�f��l�2/WW?~\���6m��}�����c:{��bcc����[���eS���o��U�PA*T�����F����EFFj��:|����=���%&&*S�L��5��)���K�v��j����d"���b�
�Z�J�w���K�t��E��qC�3gV�l�T�D	�-[V���W��������#G�h��U��a������G����K����a


U�,Y�-[6�,YR���S�����A�	<������e��Z�~�6o��C������x��bcc������3���9s�T���U�\9�-[V�*UJS�H�h@�+�f�2]U�q��Z�r��+R�={�X��q�F��Q���STT�
(���8���s��^�
��"��|�������k{� ��Z��r��4����Y�L��s���G}���{
��t���#Z�x�i�Q�F^�H����4c�������X
3'N4����O2d�b5�^B: �x��w���l3�5kV5n������y�t��%����3�W�^^���"""�{�n�1???&�E: ]X�p�&M�do�������X��$''����3�w��]Y�f�bEly���McM�6U��%�X
������������m����o���O>�����d��9��w�i��g��b5lY�z��-[f6l����$�^3n�8=������?��s����W��._�l��C=�5j�mL -�x��^|�E���?��+z�"w����O<a�P��Z�j������t��$''k����_��j���������S.����P��-��G����n�q���Z2�.DEE��G���gM�y��7�X�;]�~]={��_�e��k��&???/V�E��.po��a�6l��a���F��U���T��J�*)O�<��=��d����8]�tI�.]�_��5k�(""B�w�vh�#F�B�
~4@����_~��������n��M��S�������8=zT��/���~���n[�reu������{
��2C7n������C�z�����Hm���1c����aJNNv��3f�G}����k���0`�mKJJr�����g�s�4���v��i���4�������T#��=Z�J�rsE����t���j����+�����N���1b����;e������Z�6m���/���W���?���e�{+���p����9�bbb<��A�7n��U����@z��m[��7O���W�V�k��O?����_��!���5=z���s���7��[�n��?�sf��M={�Tdd�V�^M�9`G���5y�d-Z���V ���#��y�EFF*W�\�.�cX�U�2eR�N���S'I��#G�v�Z���[G����G���+&&F����~������l���P�B*Z���V���5k�n��


���R�2({��*X��j����zHm����R��� e��M���S�����Iu���	"����a�������@�@:@
�����D:�_4�$���
�I4��E:@
�����D:�_4�$���
�I4��E:@
�����D:�!??�[7����w�5��_?_� �)Z������>}���A:��'Vh@H��I���q��.���,������j��Q5j�.\��r\���o��!C����B�
�����M������5j�m9�=z+6}�t�5�z���p���'���b``�BCCU�P!U�^]��u��o����H%%%���T�������{��Q�.�%����|=���+[�l*R��~�a�5Jpj��G�������S����6�����,\�P3f��$���W����mA�����/������{������s���>��A�|]())I111�����S����j������y����6l������J}����=z����&t+�a�����z���?��K�j�����������9s��D��t�"Y�dQ�<yn������z~��
<X'O����	���5�J�(aw�c��)11Q�����OHH���L�>]��Ow�~��@�������+W�(!!��m��=�w�}W_~����}
2�������?����.���9s�h���Z�z��e���1m�t�����n��H�"
����+�$4n�X�a8}?���t�":t��|m�v����>�LS�N���c��Q���U�^����C��-ZT���$��UK.�	 m�3g�7nl3v��Y�_�^+V���3t��I���W5t�P���W����b���������`��9�V3��;���/j��I��F�u���*Z�h���Y��.�O~~~�T��&O���?����;������ny�����>�O?�T'O�����?�������'����}X!�%,,LO<����_��9s����i�t��V���:�g�����[����S
V�����iS��/))I�W���}�t�����_���W���S\��'�s�N9rDW�\Q���+W.����Z����}7������s�N�={V�a(_�|�]��J�,����������������%I+W�T||�2f����s��Qm��I�O�V\\�*T����[�8o\\�~��w9rD���*T���T������8�aZ�v�v����/*o��*U�����w�eR���Z�n���=������G*TP��5�2��+W�j�*�>}ZQQQ��'������� 7T����~[5k�T�����,I6l��7o���K;�+99Y7n��}�t��Y)��j���
,���p�+W�h��5:u��.]��9r�X�bj�����?�R���Wdd����o]�rEaaa*]�����������%Jh���z���%I���Z�l�z�����s��u�Z�J'N����3gNu��M��eKq�-[�h��m:w��r��u������=~����k�L�t�}��Q�F��={�sKRll�"##u��q�?^Y�fU�����qce��%������n�:<xPg��QHH�Z�l��������n-ZT�����l������
����j��
wm�5kV
6L����S�1���_���_���}W�|��z��w��M�j_�~�f�����YG�1�.g��z��g5|�p���������*V��]�1c�f��a�>7�/[���5~�x�?^'O���M�*U���Y�f��{�����4ir�=66V��KU��j���i�&=�������a���\��m
�������������[�u��
�;V�~���]�vW�v��7n�j�����������"E�����v���s���/���6��#����^�G�Q��E�����4f�m���f<��z������������sw��Y=��s������;vt�+�����Q�4b�I�L����o���@I�v���~�mM�2E.\�+����
���?V�j��]�$i��mz����l�2%$$���9����G�6%7n�X�V����fR7j�H�5EDD��7����ko5��������S���M�6���.�3�~j2j�(�=Z��?���]��/����g�����j�R�*U$��/�4ir+���7�l�2=��3��w�]��y�j���z�����w�kd���j���e����'���e���%$$D={��G}��Y����9r�F�e�������^���wW<c�������{�=����2����0}��'��������q�R��#��[�
pO
W��
m6�K���W5f�5j�H���v�����������|.I�w����>�w�}��Z[�n�/�����\�.]���#G�^�z����t��aU�TI/����x��m�C=��^{��59"W�\������>��1��OW�z��f�����QW�^U�
���o�l>�����Q�F�3g����x�	����f����d�SO=�t���X=�������i��$����z�����E���:5��-[T�re��;���s��^y�����������3g�X�g���*]���}�]����?���z�j��YS&Lpk��4v�XU�VM?�����sI������~�J�*���Cn������4t�P5i�D���6�������Z�j������i����;�x@_}����G���w�U���m6�K���g���/�}��JLLt*���+U�re���o6������2e�j�����2�N��r��i��y6����9s���/��7:�?!!A�[���������V@x��]���_�����-��v����+K��o��������+��u���c��Z�t�������������3d��v���n��
		���{5o�<����z��W�������T�vm��YSE��{�_���q�}�%1�	J�Q�1joj�,j�T�}w�mu�zUzf��5jS��M���(bE����G�\w�������|<�x\������9�\�G������
*���h9rD+V���k�$I�V�=�c�98X�'����*V�(I�v�������D������������[M�4����r������*V�(;;;?~\�/6��=Z��{�M��X��'�����wk��Y���W�%��GU�VMNNN:w�\�W�7������EX����^�z�f�������c��x�b]�~]/���^}�U��������?������6m*�?^��-��'��w��p��V�}���m�V;v�0^+V���{�9��YSnnn�p���/_�#G�H�6o�����k������S�=t��U����s��j���<<<���W[��[5b��)�			��e�����n�]�v�M�6���][�>����+���:tH?����������W^yEz��r��w�}W&L0������cG=��3*R��n�����7k�����.�Y�f:x���+f�����*V����o+$$�x=%�����w���f������K��,XP]�t������Y�F;w���|A����g��>	�a������^�z��������:t���M��h���q��6m�$;��=�n��9i�9h�����i��E����+Z�j������+WOe���c���K����W������\�r�����-[�~�z�<yR����p��|���z����};;;�m�VM�6����"##�m�6�Z�J���
S�6m�g�U�R��1�y��[�N����O�c��*S�������~(P��z �0;���7K2K27k�,G}��/�<h� �����3K27n��|���4m�\�bn���E�3f����}��}J2����>��]dd��G�5��d��'�4��W����������|�M�>����L�4h�U����������3�urr2O�:������mdd��w��F[GG�t?�����O���h�T���y7n�����>�����s��]gv���mS~���g����rk��i��Y���I�t����0s����\��������G�����K�6���/M���D�����!������E�#F������KJJ2�7���?��a��?���Z�j���9��9�5f��m�Cm��%G�������a����.""����c����0/_�<��W�^57o��h[�pasHHH�5��3g���a��+WZ���qcsppp�m7m�d���0����;�~�l�bu�~�I�&Y���{w�����m;o�<��������X��7�����nq����3m��9���}�Y���NV~o��\���Y�c�wj���4�,X���/���v���f;;�4YtF�{III�F�Y�3f�9)))M��;w��/�&���3��o���T�jU��#G�m��~������a�����a6���$�����,��x��l	3r ))I���Z�z�J�,��x��%�z�j����}���JHHH���>��X����Yk��U�5��sww��T�^�l��}���������W�m���5q�D
0�x�����z���9s����,X�a����B��������&M�H����5j��R�5&N��������Y���-j�z���M��;W�����_bb��*�>>>Z�zu�������,Y�Z�jY}��5J����${{{�^�Zu��M����N>|��}?~\'N4�_�u}���*X�`��&�I����F�iQ[F���*Q��6m��
*X�x�j��-'''c�����=z����%%?u|��
���[�mK�(�5k��R�J����0}��7�UgBB�^}�Uc��������U�|�t��n�ZK�,1�/^�c���W
��y������t���K��y�z�~������3�'M���7o�jM�:s��EN*I�Z��I-�rqq���U�V�\���o�Qxx��?�|�m�6��C��������7l��;v����?���d2�i��A�\�RvvvV�����9���������z�����]��6l�`�����S����jI�1c����ku{�����S�G����g��===5z�hc����Z�fM�v�.]��M���W_}U��U��_''�4�pV\\\�n�����>z��BBB�5VV�f�&M�d����K=z���{{{���r�J]�v-W����l��#G���/��w��8���o�Y95q��t'����
,��/��R�
��������oU��n����+�����N�:��3z�h�'�O�<Yf�Y�T�L}���Y������x����+W�h���V���g�ex�	`���*U���������XM�>����7��a�L�uss�W_}e��esb����t������g��-gg�L�i���:w�l��~�a������$���j����N.Nm���z���$Iqqq�;wn����7n��~P�
f���E�\��� �����\�r�����h���i�F]�t�����~[���V�hl)R�bQ��4l�P/���U}���K�w�6�����,��^���
f�[�����g��x0�g
.���iI����
.l��7qu��u+Z���KY���aC�������fO�r����%��?����:��������7�:�N�:�����xm��-W�������R�J?>>>����SO=�3f��%�w���>xM�����7�������{���l�R����������;w�����Y�S�pa=��sY�3�����������gy���|N�^���_�5�s���Y�R���o�������-&+���V���s����CR���C����E���Z���I��J��Z�����^x�X�:+���`5��7��X��J�(������W^��7��^^^�5k��#7�v��a�����d�������_���f�6o�l������E���A���*U��g�}���R�[�n��i����	&��L�-����e;GGG5o�����o_�6{��5����U�jU�jh���U�r������|�r���c�c�P�BY���Z�z�����[n�����3g,~��?���h�v
P@@�������������Z�%�_��\\\�<�d2�I�&�����E������f��e�����7��o������_{O>����@~Q�`Ac;***����n���U�L�����W�:u����t���c;����'�d�9�#G��wM"���&�>{���_���]��m�{�n���m+���V/:`�{��&c����3g���5j${{�,�������W�V-�����H�<y2�s�=`kL@���<}<u(z���4�S���~��1c��s���X��<==eoo/��d��:������8�9|���]�re��Y����'�_�t)W��V���b�
}��gV��V�b�\����s���&X�6u�O<�����5}����='Ev�����!����'���:W�N�&�N�{�����9�����t����p��G�Z<=:�5]�vM����RSv���+Z�v���/o������7��O�E�����������s[{���(�5��^� ;������)b��ux\9�����D�V�-^������8�'F�^;u�������H�����9s��f���I�5���7o�{���qh��s�-�
RPP��������/���c�����M�6)::Z:t����5p��\�!�����z��?��<���������$���Y�j�\{�srC��+����s�%K��y�{o���c��s?5���������������[���n�����`-X�@S�NULL����{�?^��-���s������;�������;w��W_}U�������F�
�q���1�:��������68/P���c���Z�GGG[�����J����V�6m4c��4����Q^^^���Q������s��f&����+�d���^���S��q�F�5JR�J�/����l���k�_��f���w�m'''�������;/��������;


5��+����3���~j�W~�)3E�Q�:u4~�x���S������k�j���|���0����^_{d�E��<�RO�N=��Z�N�����o��z�{��f8������?�\{��1��4i�#F�q�������]�5��5k�m��Y]Kv���
(���K�����w?>�����[k��URR��c���P�By^�-yxx���[���e&**���S�v��.�P�bE������d�:u��i�:W�������K�(���������-Q����w�{k������}����	�5j���������K������S'���#O����E��;��������Js���x�9����1��J�$���e����p����[u��k����������K��;�{H�6;�f�����6m���������,��~�����-jl��[W����X��)S�q�F�����������4z�h[����+fL@�x����]�t���S�v���=I����X����7Z�7k�,M���Z�.]���?>��2_�����V�Z�i
������7?T^���K�[�����%I����:w���'u?�Rg���_W\\�Ud7�����*U�XUWV�{zz���^�����/��RC���o@���k<���������+...[��8q�b���j;v��1�=jlW�\9������������X-�d2i���YN>7��:���udW������l����W�6�'N����V��j��al8p����i�����/[�(�5}��?n�o�.`��������ig�L�t��Ox����Yc~�)����c;88X�}��
��{�����D9r�������W�nq/��9�����3b2���O�����tx��_��NLL��={�u���;3�/3[�nU|||������u�Vc���/M���]�|Y���U5��2}zRO�-Q��J�*��9���WDD�U58::�IIIV��z�s��e�)���?��O���K�n���1c�������Ac����:}�t����y������[�V�XaUM���[����*����U}�����J�������U�D�4�Rg��w���;w���j�������^��[�.��������0f�
4P�-�����J���6�(o��WOvv��r��Y�����U��@��,'�kl�	��j������?�h��IIIZ�p��_�hQ��Y��so�����9�v��/WXX����S�4m:t�`r��5+�~w��m����f��m�M�~��U�$YL������???����h���B�
z�����3f<VO������5��W_ey�7�|����,�=�����[s�����ZA���A]�v5�����Z�r��}}�����m������%I���
��-�����^�x�n���k}���%����5��1Cw�������|`l_�zUS�N�a5y�D���L�>=���O�8���W[���}��?��C��o����;w4i�$��N}�m�����E��tx��][
64�������Zu��)St��Ic��a�S�����fFFDDh�������W����-�6m���~�m�OA����[o�eU�e��5�����c��L�o��Qs����oI*_���}��Q���������k�O�81�+t���e����:��s����k�j�V��e��sgc���Z�|y���n��	&X��+��bl���_����\���C�Z�����/��$)y!��>��l6��������G}�n��Y<�{��)�X�b��xzzj��a����#u���l�{�������-I�����A�����+5���%���7�xC
�$]�xQo��F��������m[��S��7n�n��m�������jl��qC����H-::Z�j�uIz����#e�������7u��Y��n����~�iI�����c��)l}��-1S�F�2&�&$$�]�vZ�n]�����5~�x�����k����o�i��vvv:{���t���W��9~��Uu���",����%�t����/�'J�����g�M7����V�~��k�.�'Pg�����������K/���K��]�x��u�&��lU��T�~}c���3�<y�U���/��
H�����:����S|||���>}Z*W��U�=HO=���}�Yc���r��
+�[�|���'%%�w������,>�7nh������������U�Z�����������&MR�=t��a����8-Z�H���Spp��}W�^��w���z��Wu���L��q���M�����k���V�����W�j�*���[*S��F�-��l���4|��L������	����j���/^��d����o��z����{prr�?�`��n�:�j�J�N������8�\�R����W_}�nOOOU�\���t�p����k��q���i���gO]�|9��"##5�|5l�P�-�r��q~
z��]��];c���j���E��������^�z���?���K�.�O>�����������e��������P���5m�4(P ���:u����%I���W��
�w��L�IHH������W/���kV������<�Z�n��?�X_|��$��������j���6m��|��*X�����u��q�_��b��������%JX=�?��}�����m��|�I���[5k����/^�X���F�6m�h��!�W�n]���{F~��9=�������6l�
����Z�`��\�"���>�@�G���NGGG�������O%%?M�Z�j�������#GGG]�pAk�������Z�������'���A��R���$�7�|S}����+'GGG���Q���K���,Y�F�����}��^{�5}���j���j��������;�u���?��{�Z<�>?��������4v�XM�4��U��
*(00P���SRR�4z�h�3F�������]�f����Q#����z���$I�����������Y�f�q��������*T�����u��Uc���E�j��j����Gf��;VG����%I��������}{����x����o�����u�����/�OT�~��Y<m�l6+**J�]S�����_��_~9��*�e���E�
��[���O�9Rm��U��U������o���:z��v������KJ����������g�I�~��w=���j���7n,ooo���(""B�.]����s�N���
6��o�9R������d�����������������3-�{���t��J��-[�U�V�u��j���J�,)���+88X��]���$���m�G�z��'t��iI�OA>|����(�={��4i�3g�HJ���y�����H�"�~����pggg-\�P�j�2��,�~����k�.�Z�J�t��y���SNNN*Q��"##i��������7��]�n]M�:UC�QRR��9�z���^�zj�����//WWWEEE���+:t��v�����0I��A�r���#�	��5j�
*�����$z��!:t(���-��~�I-[���x��W��Y�������pM�6-��
4�������32f����j��9��;w�h��EiV@7�L;v������tI����}�vc�mTT�f���n�:u�h�����g����2w�\u���x�ttt��?n�.��K�)SF{��Q�n�����\����gg9��Oh��4i�g�yF���$i������T�T)W�7���#{{{
6���fs��t��I������=<<2��Z�j���_��o_��)""B�~����b��4�Df�;88h��5z���4}�tIRll�1�=+���@^		���������z+[���YS�v�R�.]�����=k��s+S���OU�T)�����s���f��n���[��W
����6o���~�M������g�Z����L��Y�f�l�����/������x�_�^������������{�=c!���PM�6Mo���m�#�J��o����}�Y�$����HR��%�t�R=����g�E���Oz��W5k�,���w�Z<(���Q�&M��a�dU�R��	E�U������{����={2����J���`3�����=*,X0���J����~�S�Ne{�y��}�j��m�_�~��=<<��'�h��mY�#%O�

���33��\�jU�Z�J���?��3e����#����n��E���>���;U�X1����z������
P���U�xq999Yu�����o���v���������������;w.[5>H~���g<��q��W/�8qB�F�R��uU�H(P@+VT�=�f��Z�J�
2&�K�OL��SO=�h���j���J�,)'''�)SF-Z���3��~U�Z��o��d�d��8::j��i��s��}��,��J�*���_��={��I�,k�����
(�R�J�N�:z������_j���
		�����5�<E���u��a}����\�r�m��iS}��7��kWN�JC���S����/g�3+VL}����U�,��{999i����?��v�*���e��|���9rD�{�����e����!C��o����V���
4H�K�6����+��}����r���?���.\�N�:�L�2rrrR��%��3���o���c���Q#�,Z�:�vvv���3�}�v�����X��
(��������{���c��i������s��:s���{�=/^<��z����`�}��wY�
�*��l6��@�������������y��bbbT�P!+VL�k�V�*U��������?/I�={�����c'N�����u��e����B�
j��U�AsF�����������P�R�T�Z5������QQQ��m�N�>���o���K���W��M���x_}����P���


UXX����U�H=���Q�F�+�������?_�4x�`������35t�PIR�
t���l��;v����y����'����z�������Z��Upp�����k��)<<\���*Z���T��5jd�(znIHH���{u��I��qCw��������)�j���r��VO"�-w�����s�����JLL������/��������o�����y�f�i�FR�����h988�J��o�����$I��m����f�Y���Gu��
����`��*U���V���U��Z��0c:���l:������\�r


�$M�2E���Z����gO-[�L���G-]�4��<��}�]M�0A�T�n]���/��^�f�:w�,I2�L������{��Hfg����s���%�]�v���_���+W������������k����~nf�f�Y_�����3�0�&���#G�(666�v�w���o�m�7m�TO<�D��\�tI!!!Y�}��U=���JHH�$����w��Y�x�������SY����V�>}t��-I�O(<xp�������:>��Cm����2d�U���	�yh����P����}���[w���8~��1���{j���"##%I���7n\�}=zT*T������_���p���/_��)ST�vm9r�x���?gUx@��^��j���g��Z�|��_�nq���


R�:u��o�������P�B��?��sj����M���g�Z�}��~���j�J_}���z���5`���|g��8�������W5n�8�7N*V��u���t��>v�X��_�������9s�h��92�L*Z������fB���������x�%&&j��eZ�l�$�p�����PTT����d6�-���__c�����]�vi��]�$777-ZTw�����7���`��D��7o��
����-��n����k��	V��~o�f�Y7n���7��urr�o���c���������L&�I�aaa
K����N���/WWW���7����QLLL�m5j�9s��b���x��2��]j���$������]&������5j��������^����qE�m��f���K�7o��}�t��Y��yS�o�V��U�H��QC-Z�P���U�`�l���i�_�^�w���S�t��U������QE�Q����iS���Ge��}@�l�l6+**J�K�f����7���K��n�:���:y��BBB-{{{)RD���W�&M��W/U�R%[}GFF��_~��m�t��Q]�xQ���JLL����J�,��
�c��j���z����:�f�#���K�0�u��E�)S��e ���l�;����u�����/"W���e�*>��`���	����$I��� ���K�P��!����U�mg�Q������/&�$1�_�.xX�|��fc��h�����	�IL@������/&�$1�_�.���lV||����l]
�!`gg'GGG�L&[��8 ;��`:R���UDD�������h�r{{{����P�Bruu�u9d��#<���IRTT�.]�$GGGyzz���Mvvv�����lVRR�bbb���p�)SF����.
<���9A@2&�C����t��<<<T�tiw@�����x��
		��K�T�|yV�6A�_d��������EDD�����p_L&�J�.-GGGEDD����"�2p���	��9�����(yxx����d�������d6�m]x���r8�q���\||����f�R�WWW%&&*>>�����8 ���GL@�%%%I��������^�����2p@n#<�H\!I2�L�.���o
�5�
@n�o
�q�t�$&���	�IL@������K&����O�>V��i��4�=�b'NT@@�&N�h�R��B������l]>>��u	y.xlG���b�
����p��Y�
���-'N����U�|y���[�.@"�[���7rO@�1��5"�������g�>,,L+V��8[#�L@�1///��SG�4{��,�/X�@qqq���m��vR�&������%I�������3m(I���S���xmX��x80��^x����H�f���a���k������[���=z�:v�(___������Y�J�R��m5i�$EGGg�Gpp�L&�L&����%I���=z����#OOO����Z�jz���t���t������~���K�������s�N�j���$�L&�?^�t��y���?����c��I�&�������J�(���k��1
�V=i���Q�$��f��;W�Z�R��%����j��i����y����������o�����E����M�j�����u���L�MHH��M����S��5S�R����$777����W�^Z�t����2�'((��?((H�t��)�����\��\]]�����
j��I���W/��;vX���h��8���V��� ���7�wf��@^r�u2W�pau��U�-�������_���)M��p���E}��������{��Q�����=���Pm��I�����?��z��YU������[7]�p���'N�������y��4��0@����bbb4s�L�9��������3gJ�
,�~��YU_nX�n��[�nY�~��u]�~];v��������?��g���q�����Gm�������v�����u���-�S�N�S�N:}��E�C����CZ�v���_o��q��m�j��-i^�������u��y-]�T�<���/_.///����?��a�������k�o���]��k�.-^�X6l�����y#F����K%I��OW�F�2������u�$�i���Z��U�x0����S#�&����������h�"��yS�V�R��=-���{W����$u��]���V�+{{{��WO�5R���������Dk��5��c�BBB��C<xPe������/��g�������G�i�FE�Qpp��O�����[W�^U���u��A9::�zxx�_�~�>}�����q�F�k�.����[�K�.I����+www��w����+66V/����_�����k���i�=���������{�9%$$H�����>}��t���r��-Z�]�v���[z����f��L�Gv<X7nT�����woy{{+$$D��O��'t��Y
0@+V�P���u��%���Sm��U�B�t��1M�2Eaaa��u�F��Q�F�;Vll������ys��[W���rwwWLL�N�8�%K����3���?��[7m��M��Y��a��.]*WWW�����������<��S�*""B;w��������h����T���'Oj��%�4iR��z���
f����!�N�7�7�7�OLf��l�"p"##U�P!EDD�Y19+qqq:w��|}}3\�^>��I�����t��U����u��%%%%���W.\P��n�:��K�,���?/I��y�Z�j��?�X_~��$i������O3���{������KgX��y�4h� %%%i��!���������www��5k��iS�v���j���<(IZ�l��w�n������]�����	�-[�am�;w��5k$I���S��u3l��?^���Wppp�m���U�R%]�zU��O?��b�z�����#���������}�@�������7�?��3X����Q�
t��QIR��uu��1�\�Rm���h{��q��[Wqqq*\��BCC�}�������3����5����[o��������{�����

��/�h������~��y{{[�����������h9::����iV��8q����H�&O���_=�����#ooo��ySE���������n[����m��I�:�F���"�����:y�7����;5���!�~x��l����]�� �����s����|������@I�Ar��-�����/��]�����^xA��p�B���g���I�����T�`A�3��_�~}�6�j�R��
%I�V�Rhhh�c\�x�8�n��9��k���F��������>����(>��s�o�^�t��U�;�_m��I�K����>��c��?�T@@@��]��U��~��I�����{��t�j��u���$988h�������$��3'���|��4���������*I������������7jJo����-���7�s�����;-�oK������-0xH����2�LJLL���s��/_���7JJ�
�sC���%I���:|�p�m�+�dx�E�rpp�$c��{�1BR�
���f�Rbb�$i��a���\�|�rc���������#�=�~d������I����5|���6i���>~�x��qppP�
$I{����l��}�N�T�r���i���N�����T�>}����G����_~��Lk����-��E��?�����<$��/o��>{�l���� %%%�d2���?����f�[�N�V��5U�H9::�d2?���K�.e����������Y������xzz����E�J�f���&�MLL��Y�$I������o�o4��f���G����jx��Q�Frss�$���WIII�]CJ����%K�U�TQ�B��j��� %�t1{�lu��]O<��<<<dgggq},Z�H�����L�OY�?#e������4��W�?y��~��wI�7|d��{���C��>��d���V��<D,I:}������HJ�%�e��*_�|��

U�&M��cG��=[�VXX�2<'��5%\�����$)...��...�{=w��6m�dq|��u�����S���37DFF*66V�T�bE��e�O����*U�$I�}�������������f����}����|�I
<X?������oEEEe����^�����O���O���O?)""��x�P>/��z������G�����J��4?�����={�h���:v���_��7n(>>^����Z��Z�h!���+W�h��iZ�z����u��m�*UJM�4������i���������<==���g+))I��������JHHP���u��!IR�����sg��QC%K�T�doo/I����4e�I���g&�P�Z��
����e6�5}�t�m��86m�4�vy%**��NY�=+�o���R�"E��k?�����;�v��)::Z�T�R%�o�^�+WV�b����"��$I�<y��l�")���#Fh����}��~��G���k��;w�h��9������[�n�2�����w2���k��o��c�=Z�h����t�]�vM��]�����1c����>��~�i+W���/����0����=��g�j��96l����;#�2�����}���~��%K���===��{�l��x�b#|o���~��g����������WxT�XQm���/���U�V�����������a�IR�z�T�V�<�)������J	��=?�=z�Q�����1c����������I�����w�yGaaa�>}��/[�L7o��$����rrr����2p�W����y�� �rg)�GL�%��S'}��G�9s��,Y�h���j�����U�G��Q�Fe���-[�����{��5m�4��7Oo���
*$)y5����J�J����Z�|�$�o��rqq�V?7n4�'N��i8|���Tz�^y�IR||�%I3g�4V����%����X�����JJJ��}RR���9#I*P��<==t��&��(Q�������w�6�G����/I:r��v��)�O0�Lz�����.�����7�w^ ��>&��c��]


�������KC�Q��=��o_}�����}����c�Q_|��BBB��s��
<Xw���$M�2Ek����/��~��i��	��g�J�,)I�:u�~����{�xh=���z���,^{����Ohh��]�R�L������:v���e�JJ�S��
R�>}re;��
�fs��L&����$%��c��L�����XE�����a�r}���f�d�+W�O�k��7�-�>}����/m��MR�S
*V�h���2p�g����y�� ��4(�T�^=���%i�������$)!!!�p200P�������;���{�����w����}T����o������~������
gG�J�����g�n���:v�X���_����*�g����o��K�.I����/WW�\�`����C�����������2m;v��t�{�\g������Q�F)!!!���P�re�l�R���O?����6�����+2p�w�����7@�1=�������N��v�E��o��v��t��U>>>���;w�����W$Y�
��]��k�.-[�,G}��?��#%&&�i�e�#���^zI�����o���x=7V___I���7u���L�������K��v�Z}�������/�n�:I���W�V���������0aB�m&L���S��eYi���+����X��^^^z���lY�C��B�M����d�s(���%K��8����K������I�����S���������r�@��"wwwI��U�T�fM�7N�/���S��[7�j�J111������,Y���u�f�Z��
U�F�\�u���v�n�4c��[�N6l��
,~�,�9s����^�������g���I���O?i���z��g����J�4g���~X���[��{����;j��)����4~�x��WO����J�*��m����.]��t���
<��i�!��������"��>[�0Z�z�~��gI����:v�hq����JJJ�$��]��2���g��|���P1�V�%�x�b���S���:v����}�6����:u�5o�<U*�1B?��������K���������K���O���g�}���c�]�vZ�r����0���S;w�L�o������?�]�v�Zo^�������n�:cE��������5y�dT����AC����.I2�L:t���x���aG��?��i�d�3�m�6��uK�t��]]�xQ7n���%%?S�N�����y'O�4�}}}�'u���Z�t��!}�����i�._��
���[���������O(((��u6n�X
����������>W�wss��]���7�h��u:}�������h���cG�={V?�����]��'O*<<\����\��:v��W^yE����Zk^������iSM�<Y;w���[�����
*�[�n6lX�xm��5��m�Z��.����2��d���#����l6�����A���{w��M&��5k��?�\M�6Ms|���z��7%I��������8�V��5%Iu����}�2m����s�����T��eu��
yxxd��R���������#�l���+V�G����_]'N�mA�W�����/]�T��u�qE���Spp���-��<r��b���<|O�Zdd��+����lg�������f�-��#�#�Ff���'2p�-�:��	�9����6m���'�H�xtt��mM�P�@c;***��c��1V;Nm���ruu����T�dIEGG�����:�+�}�����_?EFF���'111�;w�$�t��j���G>p��]��}[��mSBB���r��z�{��u�xH��������-3����%2p�����w�E�[��L@���]���������Z�j�&L���>�H�|��-Z���[�i]~���~�mc?e��m���	�d�^�K��m�o��&Ij������l\����'+<<\���k��H�"�-����(P@M�6�o9<����������f�-��##�Ff���/2p�-�:�f�����T�fM��YS���W�����;j��}�Q����`���v\\\�}��}��vww��������������(GG�,�O-11Q&�Ivvv��������p��m����JHH��c����_K�L&�����������u���:���o%I^^^z����>�	;;;�L��]��;�&����o������K����D�����!�~x��l���O�	�9�����c�j����{�����K-Z��8���il��q#��n��������������C������^�z6����M����/Z�foo�Y�fY������72C�
�3&��P��p�����T�bl�;w.��R�I}.�����P�*U��o�_�~�.���������O>�D
6�u952p��"�Ff��@~��rww7����,�U�VMvvvJJJ�����({{����w��]�z��/x�����l6���S�������u�2p ��#3�� ?��u���O����8����F�I�����}���IJJ�/��b��^U��@H���:u�������Oc{��	��b�
�;wN���A����^�X���	��L�:U[�l��l��Mbb��������x��W^I�n���*W��$i���������9}��^}�Uc��/����0��r����'�v���#T�lY�i�F5j�P�%������p=zT+W�Tpp�q��~�f�������E�f����>���x���k��a��t�"777���_3g�TDD�$i���j��u^�U�#��L@O����i�B�
i��11bD�mZ�n���k���
��5k�f��4���~�����^d���`z*�'O�s�=�m�����:s��n�����x,XP^^^z�����];���K�
���n���A�����z�j+..N�J�R���5d��tW��~��r�d6���.�'22R�
RDD�<<<�un\\���;'___���<�
����Q���Z��<�������"����������[��vy>" _b:@���t�$&���	�IL@���K2�L2�L��u��� G����a:�����4o���%#��[�f�����R�-�s��)�'N<�Bm�c����tttThh��K��?���3F�
e�.��B�� �D��<�n���:h��}��'�xB�6mR���m\Y��|��~��c?!!As������o����#r�7�7xt0��~���,�+V,*�[
�u��K���m[c��Z�j��_~Q�%l\�����D��	����������<Z���s]�v�u	xN�>�6m���������k��5*T��|���lV``�$���Cm����e�t��)m��]�7�q�4��G�7�7x����x�<xP�76��g�}V7n|d�wI��u���=+Iz���5|�p���Y�lU�>���G��G���������M�6*U�����T�hQ������?VHHH���d2�d2)((H���~
>\�+W�������"""4a��n�Z�K������)��u���?����3;  �{�������}�����2e����E���z��g�l�2IRpp������}����d2���G������� �h�B^^^rqqQ�r�4`�>|8�z���y���v��$�O�>Z�b�
(����W����U�R%������U�������6o���9			*]��L&�<==��8��������dR�2e�����7���!�����eK�)SF��d�EEEe������=K�V�X�����|��rvv�8��5�u�V
0@*T���k����4z�hu��Q���ruu����J�*��m�j��I�����N???�L&�������Y�/����+�d2�@�
K�f�������*U�$777��5j��������u���,�V�������� �8�����{��G�4��[�t��-���O����5e�
<��>����#Gf�.Y�D����[�,^�{�������~M�8QS�N��A��������S�����l6^		QHH���_�>}���/��V�7o�T�=����[�~��E��7O�-���s��o�l��~�z���C�o��$�1B�~����2_��������v����Xpp����5�|���Cs������q���A/������EDDh���z��3o��F >d����g�}�+<<���B�
j���L&��1c�(&&F�/�K/�du�w��U��=�~���oh��)��5j�>���t����*44T�6m��q����?�^�zi��1BC�QRR�f����?�<�17m�d�:~����c�o�V����z���9z��V�Z���`}�����<�����%��������t�t��a�h�B111��j��i�������[��b�
m��Q���2d��f���i�?�����_��j����W��u��q�,Y�h7c�
6Lf�YNNNz�����iSyyy)::Z��o��'999e;�N���K_��$�d2�{��j���
,�S�N)00P�-RRR��}&$$�{��
��G�-[V�n������u�V%$$h��!�W��*V�hU��/��/I9r�����,��x������+W�H�j����]��R�J������'5w�\�={V��-SLL���['��d�1t�P�=Z����>}z���i�$I����
�3��}K���������1c�H��5�[o������|��8p��|�I���i��=rvvN�~��qZ�~��/�A��������������.66V����W��5j���+���S���
��5k�c�����C�:x����-k1V�>}��;�(<<\������O3��!����a��Y�������x����������OE�U\\���;�={�h��-Vv����������7�&s�e��P���T�B�a$Y#%��������u'�A����<.ux��_���$��YSG��$���K�����`����Y�4t�P��f������c����hd�V�\Y�6mR�r������������w��Oh��Uz��'��;q��Z�n������+88XE��h`���e�5o�����S�T�zu������QK�.U�.],�����k����i����A���&�?���������z+M��C�j������_]�'ON�f���j���$�Y�f����^y�%%%�d2i���z�����w/���F�i�������?���C��iw�����k��E��o��7�����V�\))�{�Q�F�c����z���%I�:uJw����[�����/���3g�����8��aC���K�t��qU�Z5�~���5g����p����J}
���v�Z����w�^y{{�t����7o�
���$
2��R{���4i�$I��U���s�t�


U��e����������#����D-ZT�X������a����:s��j���a�y)G[����km6v���6xX�Ov���~�C2p+�aN�M�-��������%2p�m�:����d��d���V�Z���]k��O=���N��&|��!C��M���aafu,Z�(��]J<���+�[�.��]��V�j��QQQ�1cF�c���o�5VS��w�����������3[}80��]����k#L\�~}�}���O��WRR����5k�,��wIZ�z�v��))��M/|�$ggg��3���b��	i����+�����33���s�������$�q�����|CD���@�������?�hu�����%K�d�K���_���$���_/���$i����u���#���>���@%$$HJ�y_�~]�7�t��=��=<<�U����;}���C��5�o���<b�/_nl���;������|`�6����4n�8��/<<�Xa�[�n�T�R���i�F�J��$���/��M��+$Ivvvz��72lW�X1
0 [}g�{zz+��9sFqqq��cl?��������u��v�����{�$'''���W���_������ic|'�����������J���-�:X]kFf��el��S���[������s��f�g���*X���ut��]���V��J���%%��r���4��T���-[JJ�Q����i���fc�xWW�4�������r�8!��D������<xi���������/T����������m�fzn������O����p���\�b���j��I�}���CIII�����<3����r���?�e���^�j�U�VU��%3m��EM�2��������SOe��L�2������L�/[��"##�c���}����a�U���m�$I^^^�����lfl?~�b�~���a������Sxx�/^,��,X���hI�K/������s��,X I*P�@�7.\X]�t��%Kt��5�Y�F��u�������io6��~�z-]�T���.^����(c��{]�tIu��M���#��o�)11Q�f�R@@����7���s��oD��w���C
4��]������K�.z�����ys999Y�~����;-�����N{�o�SL@���]�f���+W$%��Y��T�re�8q�87�>%t�Hpp����� �
�t��-��JRHH��]�b�,�W�P����)b������%e�|�
4n�8�m�V��c���k�
6���=��bbbt��
I���
�SK�3<x�>�����i���i����K����5d��l��������[�n���H���A��d�IR``�U�5��1��CCC��gO������###�}�k��*]��BBB�O>�������[��
�n�}��Z�l����^�Z�W�V�����g�yF-[�T�-����s���i�g��;g������������(I�+�[#�J�)���@���n�x�����V���c���5���~�dgg��Z�Q�^=m��Im��Uxx����#��(����S�������"E��������s�s�N=zT��W�$���O����$u��I����5�$��5��8p`����k��%K*44T�����F�Y]�9i����������C��W�����j����%K�@�F���o�OHLLL�?���K5j�.^������S�N����U�VI�j��������G�:ut��!}����������ok��m��m���+///}��z��7�� 	(�u�6v���<����"�NF��9�op��?��#&eU��!uf�����������'�l6g�';R����Y����x�����i�&.\X��s�N�k�.���S�u�����y���)F�al�^������#88X�������}{�L�t*)9��3g�}���/6��V�Z�����3g��}�]���_=z�P��]��kWU�R��>_~�e#�O�*!!AR��w�����7o������c��S'��z���������@~B������g���/&���������t���,��:u��.]�t��-S���}����c��u�9s&��g��}��X���������~��]j���""�>5�P�BF�z���\��A��]��$��������JJ{��kw����=;�7V����sb�������3�!���sV�����.]�H���[�K�.�l6k����o&����U}9;;�i��z����z�j]�~]��M����$)((H���U}��������;c���~9����~��:q����@q����p�����/IR�r�T�d����I�L&��fm��A����q_Y���R��eu��E�8qB������e��VKv��SG����Z�n�[�ni���j���6n��B�
Y�m�����]�k����?�T��us��#F���_Vxx�~��'���O:t����om���$��������Y�`�N�>���O�?����4ir_udW�*��T�R�L�n����~G����Y����5k�4h���`IR��}�����z]\\���/�����4i�$�?��O�]'����E�m��;}���~1x�����?'L��^xA����������U�{��q_��(QB:t��u�t��-\�P}����>3��s���o�URR�&O����G��������X9Q�vm#��y��������[k��M���4�
4Hk���$}���Z�n�L&�}���/����SDD��O����8I����|��o��I.\�$=��S?~�U�)RDo���$i��Yy���������W��n������cV���uk=��:}��f�����
���������NHH���������wZ���#��������<����Q��$���C1bD��\PP��N�*Iruu5������_���I���K/i������u�����m��9�c���krtt�$�?^�V�J�&66V/����������V�V-����*V��$i��}j�������6={�T���%%�8>p�@c���$&&j��
�������nnn8p�$��?�����%I]�tQ�R���}I��y�A�Y}�/�`|�K�.UTT�}��~~~��G}����4m�l���_~9[��L&
>\�t��E�\�RR���~���;p��>��s]�r%�6111�;w��_�V�l��g���C��>���������G��������g�yF111�1c�v������G�n����+�a�����'�|���=v�Z�4m�4
2�������;��'�P�����[{����m��������T��O?�T�|�������kWu��]�������N�<���g+88X�?��~��'���/j���_�U�Z���7����u����y�
.,���e���a���x�������k��W�^�[���)���8������C��i��_��V�Z���?�t����k��)���j�7o�4f{{{�����s�+�:h��U�����E�4t�����ZC���1c�U�V�f��8p���/���0���/Z�r��������7��������G��KY�
��Q���3���g�Q�*U������p���_Z�p�BBB$I
4P��-s���|������;g����b:�z����e�u��]�.]���G�����i������'k��!�6����J�*���+$$D���3l���l���]��"""4a���f-[�L��-�h��O}��gF����������e���~������V�Zi���*R������o�>���k���
����3��L�2Y�[�Z55k�L����$�B�
j���}���Qw���$�k�N^^^�:��A�j����y��(QB�/V��=�c�����quu���S������H�"�������#)�:|��2=�d2I�����}�vm��=��M�6���K��
&@n �������E�
���xD������S�<y�Z�j%///9::�p���[��F����O�j���]�v:{����gO����`��rppP���U�vm���k���


U���s<��_���]�?��J�.-'''�*UJ������K�p�BEDD��)�o1WU�^][�lQ�%$IP�V�t��MI����u��s�N���k�U���-*{{{����b����������G�*((��q��mkl:�|�G``��=p��l���S'�;��k��?~�5eG�t��!�����������
*�j���������5`������~��T�`�L�7k�LG��7�|�^�z�Z�j���0����+��^��U������x��9��������B���7�&��l�u�?���*T��"""�����s���t��9�������U���)S��oH�~��gu������j���C������/f{�vdO��]�r�JI����U�vmW�����2���l�`���,�@Dd���';E�p��!9u���#��[�S�-��`���y:�GZ||��M�&IrttT�F�l\Q��s�N:tH���{w������Z�f�$�~���|� �����;o��x`:����k�t�������i���:v��$�g��*^�x^��o��f}��'��[o�e�bJLL���
 -���!��{��<l]���������~Z�Z�R�*U������(>|X�-��+W$IE�����m\��9rD�/_VXX�����_�U���cG5h����=z���o���������5k4w�\IR�5������:�
�������7�'&�x����O���������V�\���K�aU���	4g���J�(�����F=������?���5WWW��=[vvv6�
@~G��5���E�
����C�F�Z�p�
�Z�j���[...rqqQ�2e��sgM�>]���j��a�r�{{{���h�����w���+g��i&�I������������u���$��w���-�o/&��l�u�?���*T��"""�����s���t��9�������Ux����2���l�`�l6�"l76�
���"����������[��< �	���b:@���t�$&���	�IL@������/&�$1�_L@Hb:���� _
��d��d���[m]9B�
��
��|(%x���y���.�l��5[�MTT�Z�ha�S�L�8q��j;v4�����BCCm]�����F��1�o�(c:���7��eKc��'�xB;v�P��Um[�p��e���/�~BB����c�������<:l]������Y�)V�XT��`�2�K�.�m���j��j��/���%J���#((H���������QE��������<Z���s]�v�u	xN�>�6m���������k��5*T���+{0�f�%Ij����-[�S�Ni���j����+���?����������������j����?�����q�#�K���[u��YI���?�����f��e�������<���<�n���o��Vm��Q�R������E����O��BBB2=?((H&�I&�IAAA�����k����\�����-���	&�u��*]�����U�H��[W~��._������[�n��������o_�)SF...������>�e��I��������������G&�I>>>����$�E����������+��������U���7��k�$I}����+T�@�,�]�z��J�*���]������U����y��t�IHHP���e2��������,��������L&���)�������t����-[�L�2��%K�(***�>�����188X��b�
u��]�������������[�j���P��\]]���8���G�c������������U�T)�m�V�&MRttt�u����d2���^/^��}��fU�XQ&�I
PXXX�6k��U��}U�R%������QC�=�����K�.e9��"�&�&�&�y���x0����=z�	o���[�ni��}�����)S�h���V�9n�8�92�@v��%>|�n��e����w����k����:u�
��7v����?~��f��ZHH�BBB�~�z���G_|�E���y��z���������/j��yZ�h������}�f������G��}��$i�����oeg��Z /^T����s��4���������G��;w�\]]��z�����_(""B�/��/���x,0�!C����>[��^�����*TP���e2�4`��3F111Z�x�^z�%���{��z��i�k�7�xCS�L����Q���g��{,44T�����i������Y���K�n��2d����4s�L}������i�&���.l�}��z�����WgX���G�j�*��o��t,�aD�M�-��F�
4&������E�����$U�VM����n���+Vh��������!Cd6�5d��L������~�z,XPT�z���������d��F�3fh��a2��rrr�s�=��M����K�����}�,X���8������)�Av���_����%I&�I��wW���U�`A�:uJ���Z�h������3!!��6l�=z�l���u��/^��[�*!!AC�Q�z�T�bE��]�x����xI���#���_fy���U�~}]�rE�T�vmu��U�*U����N�<��s�����Z�l�bbb�n�:�L&���C�j���JLL�������M�&I����V(����[J^�=�6�3F�����z�-�_�^���������O*..N{�����s���������U�xq
4HO=������=<<�v������W�z���Q#U�\Y���JLLTpp���Y�;v($$D:t���U�lY������w�yG���
���~��M)��$
6���G}d����W������*Z�����t��9���G[�l���&���������@^0�S/���Rdd�
*���� �)����\\\P�����ivE���T�fM=zT���K/��~����z�f����Ce6�����c�������MPP�EX[�rem��I���Kw������Ow���O<�U�V��'�L����j���BBB������`)R��M@@��r��-[��ys���N�R���/GGG-]�T]�t�h��]�j��M�k�
RPPP��|||t��yc������z��4����3gJ�^�uM�<9M��[��E���f���o��z��W���$����������Ns���f�5j��;w���^?��������;w����E�IJ�	��0�k��Z�r�����F�����������$u��)�����n�����L&���9#___�X��
�k�.I����U�j�������9s,����3��+�5�2���k-VX����{������Kg�f��y4h����4d��zH������I�$I�V�R�����+44Te��UBB��W��#G��U�hQEDD�b����wo��GFF���3�]�v�u�%���Q���Z�������V@�����~�S����S�?�����������[�o�6l�������d2e�S�V-��k��5����zJS�NM�K��!C���ccc��0�:-Z�a�.%�w��������[�n�.IU�V5B���(��1#�������������i�wIruu���������n�.I_��&�_�>���������+))I����5k�U��$�^�Z;w�������K�������c�@1a��4m^y�c{������j�9q��A���_���qc��]J�!"E``���z{{���:�uss��%K2
�%���/��]������;<�2}��=)$� tB	�HG�� -i+!R\�T@cg)���+ 1t�N�P"��7�	�)$R��G~9&�M��~�+������}f����}�;�j����<�-[f|S�0a�����������xIi��7n(""���d����K�
��������O��Y#������w�}gl�����������7�4V�Oy\z��o�i�n�0����U+���u���+J�����Lk��v�ZI����^~�����)�#Fdk����%K+��?^�����ml��WO�<���}$�v�����k��"E�h��a��3g����K��w���8'�/��{����e��I��T���={Z�kF���ol���
2D����f�g��Qrvv�����������o�^R�%�*TIDAT�+��O��n�������t�Fhhh���l������s���dl'_�����F����������B(T��Y���%J�z���?�^^^�[�Z5��WO�O���K�t��#X�2k���JLL��'��)^���\��S�NeY���k��@�~���P�B������-�X�bj��q�5�+W������g:�*U������/�����l�bQx�s�NIR����}��,����cl�:u*�j�&�I����������p�X�B�����_�t����+I3fL�oX����Z�t�$�h���^|P�T)���W+W������q�F���?����<���l6+00P�V���C����(c���]�|Y-Z�H���	�}�v%$$h������K���~���%%]����������i�}��i��m����^|�Eu��YE������wZ���#���z�o�S��r������r����p;�`Z�������O�f�'��			1�`Y��n��mq�$����5k����F�����j������%e�|�54}�tyyy)""B�w�V����e�/^<�����u��MI��K�,
�SJ�=5j��N����X��;7M?w�\I����F������f���������%���#Gj����$�^kV����_�zU�
����-;222�����U�R%������_S�NMuQC��-I���Kw��������TDD�6l��
6�h��j�����k'OOOyxx���?�(����"���w����@n�X�y+**JR�J��H�y���)Z�h�����[4_z����Uml;99eYo�{!I66y��b�V���%KJ��������g�J�{?%���i�suu����%I{�����'�}����%I�{����[��������>>>�u����X$00���$3Y}sR�=z�{�R�����3fh��EZ�j���Y�5k����^2�KHHHw<;;;�3F����@c���W�~�zIR�&M��u�t�h����;���{����wO;w���i�������+���>3��x\��E����;s�� ��x�$�*�2�����w��)����g�l6g�';R�111Y�[�^���-[*((H�J����g��|?�7o��������M�0��N��%��gGHH��m�f<����L&S�?����z����0{����?'V�X�c��I��t����],�k���g�}V�������U�n]��|����U�S������������]�Z5������[���5m�4������\�vM���?�d�~�0!�N���O��#���
��c�b����Vs�v�Z��g��5�+U���y+W�ll����xK������Y�_�p!?����O>��[�!��}��������4�%J�0���/�Ym��Q�f�$I�-��{��e��IJ
{�w���y����l_X����?����?�`l��g�^�r��E��tssS��}%I�7o����e6�5o�<II���o�h,u��Q�&M��
t��
��3G�������:t����G�wZ��"���7�-;k7 o�n�Z�O���(�1"��K�.���3���U��B�
9��C�2�L2����e��O�����R�|yU�RE���:}���^��i�;v���^��y����m��v����o�������~���(Q"Um�N��i�&]�~]�R�-���	&����Wxx����[����0v�X���nm���D�_}��T+�gd���������o����~R�r�Gv%�B/I�j���v��-�;a��Y�F			�?���i���I��a������~�������S���#I������sX�wZ��������7�������Y�4|�p����[����X�{������\�r����6o��'Nh��e6lX���L�~���_(11Q�g����n���7�h��|�#'�5kf���n�������kW�d��F���#�i�&I��)S�y�f�L�\�?|�p����������s+I�����Q�r=~PP�.]�$Ij���f��i�q���z��W$I���/��X�b���s���a�t�V�X�_~���q�v����k���~����u��c��q�r����^����������;5������G�
r+w��(t�~�i5j�H�t��1M�0!�P.  @_}��$����>s���>R�"E$Ic����e�2��}��>��Sm��5�s��������$��9S���OS����+<<<�����M�j��m*S��$�����������c�4H�[����������R{z�e�}�����]�X1���H�������K������+��uII�y��#GZ|�����s�j�*EEE����h����=y�d%$$����c����l�k2�4~�xIRhh���[')���|���;r���{�=]�r%����h-\��x��i�l�f��"�N�w���@n�
��c���F�/V�v��y��i���1b����u��m�[�N[�l1��={��U�����6m�9s�h���F�=}�t���G�k�V��E�s��i�����s����s�B{��u��;�h�����������=z�x�����_��7�($$D����~k�?�E�&M�m�6u��E7o���C���kWm��U�J���d������m[���j�����i��y��h�B������UXX��;��� ��qC]�t��)S2�{�������S=�����u��mmm������c��)��={j����������5v��\�d���G��O>QTT���_�&M����G��U��;w����k��u������>���[<����&O�l��/e�~GDD���O������k�v���n��rqqQxx���9�e��),,L���Myzz�����7�7�w�����t�1��qc���C����u��IM�4)M����f�����G�������X��F����0=zTG�������X=��L������5Kf�Y�W�����S�:T�����/^<Gs���s����7n���������n�*WWW����������U``������s�f:f������A�����~��GIR�5��[�\��E����������|���:~����j������+WN+V���A��_~�%���������+%$$d+�wuu��!C�`�II�����gz��d�$%&&j��]��kW��;v��U�
�&@^ ���w����"���
���FY��wb�	k��m-[����g���_k��u:y��n��-ggg��QC��w����wU�T)������.\���K�j���:t��n�����X/^\���j���<==��O�,Y2�s��1C}���_|�]�v����*]���4i�1c�h��������zWW�<x�y�a��F��u9r��K�.�r��i�����o��,Y�]�v)44T���rttT�
T�~}�o�^�{��O<a��^^^F?v�X#��
c���'�����[����}������S�N�A����R={���c�4c���?�P��E����=zh����]���=�����>\�����w��I'N�PPP�����_~�E�/_Vtt�����'�|RC�U�>}r�r 2�G�7�wV���"��a2��fk7�����T�%!�l��/�z��rtt���w<j>��s������5k������
M�6��c�doo����l���������u�$I�V�f���Q�����Q���&�����7K�+���
dCn�S�=�d��!t�����`���o�`���m
|F(@qqq�3g�$���^O=���;*����c��I�@���BCC�q�FIR�����@�#�N�w�"�����<��_��S�Ne�?66V�F��/��"I4h���-[P�Zf�YS�N5O�8�z��E���)!!A�7����s�������`g� �.]���-[��'�T�.]T�n]���(**J������u��IR���5s�L+wl='N����;w�h��%��m�$�W�^j�����{��;wN���STT�6n���J�5j���[�;�
������7M����w��A<x0����W��u�T�R���p�5k�,X���r����/��RG��������K�����������X�+��w����7M�Y�5��e�4r�H5m�Tnnnrtt����*W��>}�h���:s��5jd�v[[[���k��Q:p���V�j��k&�Innn4h�8�-ZX�%��w��,�o�ZLf��l�&�;���*Q��"""�����ccccu��EU�^]����h�_/�<1���[�GFN���
�77Ym���V�[~�����d�(r{��-C�#X���o� �����������
		��d��d���o����sgcL
�7���@���]+???���)<<����+  ��������f��%�������cd��d����������M�6���o������/G����>����>��3k�<V������A�
�����
(���]�H�|}}3�Qp~��g�:uJ
4������:B^���������Z�j�8q������������G7�A���2���n#Oyxx���_���b�����T�lY��;��Z{{�,k���/��93����-\�0�q�8"�&�@��t���U������m��������~Z�������5m�4��e����-[&I������[�g}����������
�6j�(I��k��i��Lk���%%�t��g�|�
K�~��"&L��d��d�o���nMPP�Qc2��w��t�8`�����������|}}S������d�����W��jN�����;g�z��Y�^�z���M�T����;wfy,R����*U�$���==7o���
$I>>>�����^���5m�4u��A���W�"ET�\9�o�^�|�����3=�����K��o�����Z�jrttT�����W/�^�����d�=��3rwwW�b������u�j���:x�`��}H�>�����N�:*^�x�}���=�O?�T���W������l�';v��~��7of8����L&�~��wI��������d2���/����|k���Q�����R�,A����g����k��v��������JRR Y�v�45��oO��m����yzz�q�������#�j��T�_�rE�}�����;M�>=�������|||4m�4m��Y��]S�����-Z�Hqqq����{N?��S���y�f�1B�o�N���7t��
���[3g���E����O[4�����O?�4�s��_�����y�fy{{k���rpp�p��'O��g���3g��;{����=����Z/���>��3�.L�>}��~�m%$$dX�p�B�92�}���O?��3fh������W��fG~���_~Y��y��	���od����;=��.��"2�L2����}�����&�~��������C�����/���[�g���;$Is��Q�r�R��)S&�1F��U�V�a��6l�j�����hm��Ak���$M�4Im��U���-���n��Q�6m�����h�"���kij���IR�v�T�n�<
����{���O�������[k����T���\�����k��}�}�������7�{������������S�%4j�(�h�B			��{�,X����k���>|x���9rD�:uRTT�$�C������U����D?~\�v�����=x�@s�����o��V���rvv����Z�j%{{{�:uJ*T0�bbbd2���Iu��Q�������$������u��l����H
8P{��Q���S�5w�\���������7T�lY��;7MO������1}�t�l��9r�7nl��...��D�������� � w��vb�	k���*[���x�	�<yR;v���l��d2�GFF���C���={�h��=��~�������{�nIR��-���lq��7W�����\�������n�K�.�?��O��1C666���F���~��S��l6k�����P�vm�o�^�v��7�|�&�?p��N�H��5jT��}��]�9�{�����;���|��������������x�9R�����/����}��j�������r����>>>z�������7n��������5t��T����h��A��������/_�>}���>|��z�-���_;v����s��3��k����:u�(((HU�V���C�:{��j�����W_}U[�nU�~��7�xC[�nMU���%I�8q�$���I����)���T��m�i�&�*U�x~�����(#�����7�w2�o
'��K$OOOI��7�05���;��� I���$I�����gO����Y�����+H�:u���3S����z�-���I�����1�,X ��d�Oppp��������~���,w�����S�Ni��}�����K��+�!C���k��V��v��$���������*��$�����{O=z��$]�v��)#666���oS���6l�����x<}��45_��.\� )��
���(QB+W�4V1�5kV�}�L&-_�<��]��x����d]�v�?��OI��m���dZo��:�����+S��@N���7�7�7�7��
�@!�20��}{�}��k��-OOO#������
�?���4a`2[[[yxxHJ�x������#��g�1V����o��ccc�|�r�&;��[����3�'M��i��o���q����R��M3���o_��[W�t��#lO�`�I�������\�K�V�^�$I�����~�����W�f�2/;R~���N�D~����E�����K��Vv�n@j�:u�����m�6M�8����w��E�����E�i������)���]��k���m�6��)W��s�N�������_~����
����)[�����kQm�z�,�X�b<x�����������>S��E�z�j���K��{�����!������K����R���y���T�X1EGG���JLLL���������kW����������F�����H=zT�T�bE�_�>���C���X]�x1���C�Y����]��l�2���_.\PTT�������|�r��~X~����n 3��9C�M�M��>�o
7��L��%��Y3:tH;w�TBB�lmmu��-?~\����'����w������Xc��v�������_C�2e2�������<��j������������S��3j�(��?_���Z�j�F�!IR�Z���c�<�/22R111���5kf�&���Q�Z�t��1��wO���ruuM��v��Y���&,,��

Ubb�$��������c�t������H$3w�����>�u��Y<odd����_����
X��;g�������G�
@��t������C����u��
��l��d����Q'Iqqq������gO����X�:yA�*D��k�N�����3g��7��C���c���_�]������b��Yt���s��3
|-/eM�^�W���d��h���1d�m��YRR��z�R�f�T�R%999��.�����'5u�TIRBBB�����a��,E����'!�&����t������3$I��mS����}�vIR�F����U��5j�����}�z��i�%����s�=�I�&)88X�����f�lmm5r��<��x���vtt�E���{7��f�x)kR��2T0`�V�^mQoye���F���Q#����P�B�����y6o~� ��#+�����7�
�4�P���.9PO��.]���M��svvV�V�
�_<����l6k��E�$///�����\...�J�.\Pbbb�����:�����K�,�a��s���?eM�J�����5444�q��?�`l������t���<�7?�������o�o�������B���Y-[��$���G!!!:s��$���3Um���G����K:x�������.�=�������l��8�*TP��=S=��s���\&���<FGGk���������Xq�e���>K

�r��[���[�6���)�'�xB�t��a]�v-������W��Z�jeZ��x��SV�o�y>��F�����K��6�Wx��J^����{����$I������c���>11Q|�����S=�S����vttt��B�x����uk�n�Z�;wV�~��m�������2��6mZ���'((H���p��M���O�7o������?r�HIRBB��y��L��k���K��d�w�^����9K~���|���Y!�&����(L�(�R���VovqqIUW�B��_?U����D�����������K�����}��c�)R$�����U���%%��|�A�u|��6o�,I*_�|���'$$h���
K����S=z����7�HS����]������s�j��I����p���o�����L��D�*����{�)666M����5h� ��E!�w���[�t�R���u>��@�����K��&v�n@���k'��?�U�=<<t��i����UM�6���]�v5��x�
]�~]u������1G�V�r5G^�t����]kQ����z�������pM�2���4h�����y>&&��~��sX�D	������,X�^�z��j��!�X���^�����k����$;;;-X�@���t��j���z��'4z�h5o�\			��g��P{��2dH������~�zu��Q����>}�/^�A��I�&rqqQLL�BCCu��am��U�������0`��V��K�.�����[�����Z�j)&&F?����/_���8�9R,�t��]�j��������k���rss��M�Z1�j�R�Z�$�����w���/��������(���m[�e�{zz��/�4w����r�Q�Fz��g�x�b]�vM���z���:uJ������C;v����D�
�pDD�>��#�����_���7������#G��������{w�[�N#F���;w�w�^#�M�T�RZ�h��w����/������5k�,��5+��~��i��%���Q#<xP������?+,,L�g����d2���-����������N=z����7u��%���;�jlmm5m�4�n�:�~��Q���/u��>|X�?�|������������q>��@��=�����;5�o���%t����(�^�Z/�����k��e����^...�W��|||�e����L�	��d��'e�$K�;88����J����C&�)��rc���7o�<==U�\9c�w�u���K.\�����zJe��������)�v�����>��2]a�a3g����[��3��J�**R����-�=zh���Z�v�3�f����o����{�3F
4P��%ekk�����^�z0`���������z���r�VH�Z�h������W_U��u���(ggg��SG�������5i�$��*V������w�yGO>��J�(���4�q>�����7
�����@J&sV)�_���~���'+666��:h����Z�j����s�Y<��+�fGdd�J�(������d����X]�xQ��W�2������g�;v�P������[�8ss���qL����/�zs�����q�(f��=��
��_[�`�����g,���=k�nnn����Z�h�r��)66V�������u��]���O��������r��e:�K/�����������8 '�=��$///���k����lllR�9r��|�Mu��]����.^��7�|S�������ysy{{�c��F�	��K�:>��#}������[��=Y�j��b�
���+SP-`2p@Npz
����5i�Du���$������s���F�	n@�!c���{V���!$��v��������j��eZ���_�_���BCC����2e��i������F�)''��n

???���Y�
�?2p��o�:�77Ym��i��67���
�9�t�REDDH��7o�
*dZ���9sF����w��BCC�a����rww����m� ��7�g��74i�$���)S2����U��m��C��SG���
��C����������q������%K�h��a�p��}���x)I���S\\\�^O\\��f������cHObb��f����dkkk�v�<�`k���q6�V�[���k�n^
�g�y�'G�Kd�x�Y5'�2e����l������k������$I���Z�fM���������*W������(�;V+V��$9::��_U��U�����O���^���.]*'''K_�$���N*TP�*UT�H�l@z<x���P]�zU����n�����+""B...�n��+x^��8 �������77�[(11Q>>>Z�d�$�f��:p��J�*��1��kWK�^x���������V��R��n����Qll�BCC���.GG+~k�����U�R��-x�4���js�tm����e��
dCdd���)�
�(,x^��8 ����qf����������
|�G��l�������j����uk��wI�����~����K�6n�h�
�rppH����������CBB�L&�llldcc��cH����L&S��.�������O�����������La���2����y��3�f���6 S��!m���l�/��y��I�*W��������=O�o����2��K��'��02p@V�=f�Y�����W_I�����c���Y3����������8<<<�� 8�����������$�R�J��c�j�����$&&���;���%K�����,�
��x8x�X��v�����k��\�����{�$I�+W���S����"d7����_4��
*h���S�N������w�y�x��w�<���F�n@�K/��/��RRR���u�fk��{�j��������&::Z>>>��m�$���A�&M�y�<��]v�n�0�2e����I��d�+�����O�������ysU�Z�x|��5�7N�����u��-Z�J�**V��"""t��a-_�\�n�2���������o�
��B�	n@Oa��]���l�[o�e�q�|��|}}�<��]�Y�Fk�����
*����V�^���/!@��W��sGXon��
���k��Z�n�~��g���_����u���������r���y������,GGGk�@�������S��q�����o_���7O��������{�I�v�����;[�!�C��x��X�i�L�l�N.����:7QQQ���0��\��N�>���ZA�^���ioo��W�Z�%�����F��1�o�8�t���7o���������kk����_��u�������{�q||�,X`��y����<>������Y�&��2e�@'���O~~~�n#_]�|Y^^^�j�M�6����r��Y�������T����k��IV�@A"�~|����7�������[@>������[7���������k���*Q���;�f�Y����$u��M�W����g�k�.�o����o���'�o�o����v�Ws��Q�o����~�i����m�.I����p��$i���?~��o����j��������
��c���{���/��[7U�XQE�Q�����eKM�2Eaaa� ��$�����I����5~�x��SG��O�/�����5K]�vU�J���� WWW�h�Bo�������L����3���v��]6l�*W�,GGG�����������%I!!!�X��������.��$wwwIRbb�����������QU�V��#t���L������;�������C�j���*Z�h��n��A>>>�U���/.'''U�^]�>���n���1����T��L&�J�,����,��{��\\\d2�T�re%$$d�E�#e����#OOOU�\Y��r�JEEEe9����qCBB$Ik����T�Z5988����g(88X#F�P�5���������#������W/U�^]NNNrppP���������?�{�n�}�l�R&�I���


��u��f��YS&�IE���;w��l��I��
S�Z�T�X1��F��_�~�9s�._���\����������;k7 8p@L��}[�o�������[���F�e����O��o��e �r�J�?^�o�N���t��>|X�}�����+�92{/�!o���f��)��l<���0j�������5��[�4p�@������

�����|�r-\�P��
������8p����'I�0a������d�Hhh����{������-Y�D������d������1c��(""B+V��s�=��|K�.5���G���6[��a�����5j�P���e2�4b�}��'�����+4f���|���
d�k��_~Y��y�5�����}��t�]�zUW�^UPP��O��5k��U�Vi�&L����G+11Q_���{��L�

J�:~�R��}�����!C�a���9y����_���}����<�����%�����@~�t�1t��qyxx(::Z���A�1B��W�����v�Z����������e6�5z��L����o(ggg����U�V�����S�T�B�n��y7n��f��)�~���c��*_������]�vi�����������)�� ;��~�3fH�L&��=z���Yg�������/_���D�����7���m�j����R��n���+V(88X���=z�Z�j��5kZ4��+4b����I��~�m}��GY���[���+��f�����[�j�����~��W-\�P.\�������7�d2c�;V��4w��,�9s�H�lmm��g$�|KI��'�����O>�D�������&N����@U�VM>>>�W��bcc��~988���>}�U�lY�9R�7��������Q#[[[�j�JO=�������%K*!!A!!!��q�v�����0���SG�U�*UR�5t�P����
�����y��L/bH~�%i��q��M�<����-�!C���'�P�����/j�����c����(!�&�&�N���9���x$EFF�D����H$Y"9��^����CdW��4������j���N�<)I3f�������.�z������ce6�����_~�E����jR��u��QPP��V������W��-�����][���W�z����>}Z]�vUXX��/�����������3V���c�:w��j���g��aC������^�V�R��}S�������[AAA�s#G�T@@@�������������k���i�������Z���K/i���ij������!I�����
�^xA���2�L�9s�����9�af�YO=�����+[[[������c����_���Z�|���� �����n�:II��Q�F��y��!=�������{���xv�h�B���d����U�zuc_��m�o�>I��S�T�~�������R��e��e�oW��P�\�6mJ����8 777U�T)����k���JLL������CJ'N���I������O�t��z���T����x5l�P'N�0�%$$�t�����P��5u���{���������Y��.H�m�����MV�;�q����_����!7�)
���Cr������["�~����K�m���(��������d2e���i�T��6m2��������J�K�������cbb��0�>�/_�a�.%�<����6o��n�.I���7B���(��7/�����_�����ki�wIrrr���KU�d�l�����n�.I3f�0�����,�:x�������D���j�������a����WR�{�^�.IZ�`�q��Y����������s3�3���s����:|��$�}����w)���d��������E�Y�+VL+W��4|���-[f�K���>�������e���aJ&L0�3{����/)��}��
ED$���d����K�
��������O��Y#������w�}gl�����������7�4V�Oy\z��o�i�n�0����U+���u���+J�����Lk��v�ZI����^~�����)�#Fdk����%K+��?^�����ml��WO�<���}$�v�����k��"E�h��a��3g����K��w���8'�/��{����e��I��T���={Z�kF���ol���
2D����f�g��Qrvv�����������o�^R��+��O��n�������t�Fhhh���l������s���dl'_�����F����������B(T��Y���%J�z���?�^^^�[�Z5��WO�O���K�t��#X�2k���JLL��'��)^���\��S�NeY���k��@�~���P�B������-�X�bj��q�5�+W������g:�*U������/�����l�bQx�s�NIR����}��,����cl�:u*�j�&�I����������p�X�B�����_�t����+I3fL�oX����Z�t�$�h���^|P�T)���W+W������q�F���?����<���l6+00P�V���C����(c���]�|Y-Z�H���	�}�v%$$h������K���~���%%]����������i�}��i��m����^|�Eu��YE������wZ���#���z�o�S��r������r����p;�`Z�������O�f�'��			1�`Y��n��mq�$����5k����F�����j������%e�|�54}�tyyy)""B�w�V����e�/^<�����u��MI��K�,
�SJ�=5j��N����X��;7M?w�\I����F������f���������%���#Gj����$�^kV����_�zU�
����-;222�����U�R%������_S�NMuQC��-I���Kw��������TDD�6l��
6�h��j�����k'OOOyxx���?�(����"���w����@n�X�y+**JR�J��H�y���)Z�h�����[4_z����Uml;99eYo�{!I66y��b�V���%KJ��������g�J�{?%���i�suu����%I{�����'�}����%I�{����[��������>>>�u����X$00���$3Y}sR�=z�{�R�����3fh��EZ�j���Y�5k����^2�KHHHw<;;;�3F����@c���W�~�zIR�&M��u�t�h����;���{����wO;w���i�������+���>3��x\��E����;s�� ��x�$�*�2�����w��)����g�l6g�';R�111Y�[�^���-[*((H�J����g��|?�7o��������M�0��N��%��gGHH��m�f<����L&S�?����z����0{����?'V�X�c��I��t����],�k���g�}V�������U�n]��|����U�S������������]�Z5������[���5m�4������\�vM���?�d�~�0!�N���O��#���
��c�b����Vs�v�Z��g��5�+U���y+W�ll����xK������Y�_�p!?����O>��[�!��}��������4�%J�0���/�Ym��Q�f�$I�-��{��e��IJ
{�w���y����l_X����?����?�`l��g�^�r��E��tssS��}%I�7o����e6�5o�<II���o�h,u��Q�&M��
t��
��3G�������:t����G�wZ��"���7�-;k7 o�n�Z�O���(�1"��K�.���3���U��B�
9��C�2�L2����e��O�����R�|yU�RE���:}���^��i�;v���^��y����m��v����o�������~���(Q"Um�N��i�&]�~]�R�-���	&����Wxx����[����0v�X���nm���D�_}��T+�gd���������o����~R�r�Gv%�B/I�j���v��-�;a��Y�F			�?���i���I��a������~�������S���#I������sX�wZ��������7�������Y�4|�p����[����X�{������\�r����6o��'Nh��e6lX���L�~���_(11Q�g����n���7�h��|�#'�5kf���n�������kW�d��F���#�i�&I��)S�y�f�L�\�?|�p����������s+I�����Q�r=~PP�.]�$Ij���f��i�q���z��W$I���/��X�b���s���a�t�V�X�_~���q�v����k���~����u��c��q�r����^����������;5������G�
r+w��(t�~�i5j�H�t��1M�0!�P.  @_}��$����>s���>R�"E$Ic����e�2��}��>��Sm��5�s��������$��9S���OS����+<<<�����M�j��m*S��$�����������c�4H�[����������R{z�e�}�����]�X1���H�������K������+��uII�y��#GZ|�����s�j�*EEE����h����=y�d%$$����c����l�k2�4~�xIRhh���[')���|���;r���{�=]�r%����h-\��x��i�l�f��"�N�w���@n�
��c���F�/V�v��y��i���1b����u��m�[�N[�l1��={��U�����6m�9s�h���F�=}�t���G�k�V��E�s��i�����s����s�B{��u��;�h�����������=z�x�����_��7�($$D����~k�?�E�&M�m�6u��E7o���C���kWm��U�J���d������m[���j�����i��y��h�B������UXX��;��� ��qC]�t��)S2�{�������S=�����u��mmm������c��)��={j����������5v��\�d���G��O>QTT���_�&M����G��U��;w����k��u������>���[<����&O�l��/e�~GDD���O������k�v���n��rqqQxx���9�e��),,L���Myzz�����7�7�w�����t�1��qc���C����u��IM�4)M����f�����G�������X��F����0=zTG�������X=��L������5Kf�Y�W�����S�:T�����/^<Gs���s����7n���������n�*WWW����������U``������s�f:f������A�����~��GIR�5��[�\��E����������|���:~����j������+WN+V���A��_~�%���������+%$$d+�wuu��!C�`�II�����gz��d�$%&&j��]��kW��;v��U�
�&@^ ���w����"���
������[��W��ik��m-[����g���_k��u:y��n��-ggg��QC��w����wU�T)������.\���K�j���:t��n�����X/^\���j���<==��O�,Y2�s��1C}���_|�]�v����*]���4i�1c�h��������zWW�<x�y�a��F��u9r��K�.�r��i�����o��,Y�]�v)44T���rttT�
T�~}�o�^�{��O<a��^^^F?v�X#��
c���'�����[����}������S�N�A����R={���c�4c���?�P��E����=zh����]���=�����>\�����w��I'N�PPP�����_~�E�/_Vtt�����'�|RC�U�>}r�r 2�G�7�wV���"��a2��fk7�����T�%!�l��/�z��rtt���w<j>��s������5k������
M�6��c�doo����l���������u�$I�V�f���Q�����Q���&�����7K�+���
dCn�S�=�d��!t�����`���o��72p���v�mS�3@�����9s$I���z�����Q��w�^;vL�4`���|��7J�Z�n������w����7
����u��u�:u*�����5j�~��I��A�T�l��j��2���:u��x����k�/���O			�x��E��3������;k79u��%�l�RO>���t���u����EQQQ:~���/_�+W�H�J�.��3gZ�c�9q�������sGK�,��m�$I�z�R�6m�������s:w������q�F-\�P���Q#
<���(l��-G�]����k�t���������^����[�J�*`W���Y��`��T��+WN_~���:z�-^�X���^�������7�����J](����F�]����k"��j����-[��#G�i��rss����U�re���Gs����3g��Q#k�[(������]�F���T�jUk��X3�Lrss��A�t���h���-(�������`���b2��fk7�����T�%!�l��/�z��rtt���������GZ�3���<2r��xT����js�8��������@6�&;E���sHn2p�8gd�@�e���o@H�t���t�$n@�?n@��BBBd2�d2�����'cv���'  �x���N*���Fo!!!�n�c����A�
Pxp:�t�]�V~~~���Sxx�����������_�~�S��J�.-{{{�*UJ5k�T��}��{�����Y��������,kL&��|�M��tww7������+d�7�7����
(���]�HJZ��d���m(���z����|�r%$$�����p]�pA6l�����x�	M�<YC���M���1{�l�����T�R������!����t�/���]f���m����`
<X7n��$����]�v�����U��R�J�����v��~��g�����s��~��
>\�5R��
���{�����Os���������+__��
�o�o�=n@�H;t��z�����XIR��=�����^�z��+Wj���:r�H��R�X1EGG���_��������gco��(,l������w��#|7n�6n��i�.I���>|�<�O?�T���y����%I			�<yr��	x���0�t��0a�L&�L&�~���tk��������{��[w������_O�/$$������j����L&�,X`<W�z�Ts�L&u��9���f����KnnnrppP�J�4p�@���3�c-���_*44T���ys}��������5���P�Z���=������Wk���y2nf�s�n���,66V�g�V��mU�ti-ZT�j���	t��E���w���O���-[�D�*^��4h�7�x�8'��Y�f�k���T������-Z��������q/^T�%d2�T�hQ�8q"�9�f�z��a����~��`���!�&�&��	7��������}��tk~��:OO�<��r���z��g4`�m��Yaaaz����\�����N�:u��3r5��l�g�}f<�2e����s�y�������?6����V�&}/^T�V���+�h��}�}��bccu��y}��Wj������3���j���&M���*22Rw������5c�5m�4��ezV�\�5j���^��m�t��=x�@w������5m�4��U+�E!��W��9s�HJ��
:T���Kw��3g�����$u��IS�L��G�C�m9���!�&�����
�����L&��f��o��q����I/��<yr�u��������=������������c�I��9sT�\�Tue���p���Gk��Uj����
��5k*::Z6l���k%I�&MR��m��}{�{K�����r��$���E}����8y�o��z����{�n���C[�lQ�=���$)22R�z���������>}��|���r��,X���+::ZC�����U�T�4c������S����$�r��5j�������(m��Yk����A���I�,{�7o���'���"E��_�~������/��w�j��]Z�t�bcc����"E�h��a��:t��������S�N��W^���sS������=)]���,Y��o�=���#��>�o�o����V��ik���*[���x�	�<yR;v���l��d2�GFF���C��v��i��=��g����/�...N�w��$�l�R������ys5o���%���K�����t�R������3R���F���~��S��l6k���9�w��el�n�Z���9'?L�6�������R���S�Gk9r������r�J
4(��^xA}����-[t��5}��7��?��f�I�&�{��i�&/^��?v�X�Z�JC��r%������_��lV����~�z��W/U�s�=��^{M]�vUXX����������5U�����g��9sF��������###5l�0���I�������f����x� ���w��������@!���)I�q��N�8�j���;��� I���$I�����gO����Y�����+H�:u���3�]a����2���� ����h���0c�f��9k4��o�^}���$=zT��-�rGz�������dgg���������457n�P@@�$�x�����oS���
���Y��������Q�7oN�'�_��1oTT�������X�bZ�|�q!���c����.H�^|��B�m�����2��9C�M�
�7��L��|�����%?�]��<==U�r�L�������p�s[[[yxxHJ�x����9����[�v��%3�=s��L&S�?�;w�Q�������N�j�>nM666z��W2�_�^=�3u���4�7m��H���
*d8�?���t/�H�u��I�����Z�je�{�n�T�bEI����nM�&M4s�Lc�a��i��9Z�|y�����e��������/n@
�N�:���m�R�K��t�"IF��Q����v���k��i��m���C^I�s�N~�c
6��#$I.\��9s���T�n]���fZ�|n�;/���7��?��X��4h�����w+11Q������k�f������S�27�
�{������%INNN�V��������������
H�d��j���:��;w*!!A����u���?.��U�=<<�h�"8p@w������bcc�o�>IR�v��8�)S&��){������K�6����3��\����Y����'Oj���9��R�����/_������>��������u��du^�?�������3��Z�=�&���%)$$��P@@@��%�}�v�����5i�D�/_6�����U�^=���{���!��>�o�o���t�J�###u��AIRpp��f�L&���{r]\\�~��'II+k'����Z�
���R�J�����3�uvv���w������w��Z��^x�I��������������y�{�������e}�b�2���E�����t����*V�h<vrrR���s<��#���w����G��{���������}���w���+W���g�vI��m�$i�����F�+yW�VM5j�H�?��q��Cc{���JLL�b7�<y�\\\$I3g���7��Q��\�>&&&����h���={��fs�~23e�8p U�#G���8k �����;k���� s���#G��q��j�������fdd���i��^{M�����M���G�q��:r��:�^�doo/)m���K�T��!��u���j��U��k
O<���
|DD�6l�`���W�ti�������(}���V�(������s��eY�YM���������5����[5}�tII��i�F��e�����z���oK�<�o����W�Z��'O����Fp�����u���4���uK������5�������eKI��={�3g�H�<==S�&?>z��.]���JJ
����r������<���M&�&N�h<���o��21q�DU�PA���W_)$$��
�P�:R~�@z�\����Og��C�2�L�����p��u�1Bf�Y666Z�d�V�X��%KJ��~�m>|8O���7@�m	���G�
��Bw��?�,���n���L���(��?_&�IU�V��5kt��Q=�������]�/�F�@�K^����{����$I������c���>11Q|��B?�g�����������	T�jUI�����+����+�w�yG����M�:�����O?�"E�H��.]�k��eX��g�)!!!�����S��=%I'N���e�r���l���#u��UIIku��IU�V��y�$%��C����ws5�����$��Y#�.X���+t7������f�������XI������_?5n�X_}��7n,IZ�vm��
���z@@�$�e��rqqIUW�B��_?U����D�������j�������;9::J����K���W���k��%$$h�����a��1�U���������:^([��|}}%I�����k�����~��x}����3&��������O�u��4�>��Sc%���zJ�����o��A��Z��������g�@^ ���g���`�d���
<�������+�����?��t��j�3�<����������$P��k'��?�U�=<<t��i����UM�6���]�v5��x�
]�~]u������1G�V�r5G^h���6o��!C������q�6o����zJ�:uR�j�T�dI�������:q��f�Q�r�|����^~������D��w/��������e�]�tI���j���F��z��)**J�������T�T)5i�D������iS��3G�G�VLL�������O�>�]���-����;wN������;�E�����Cz���%I�J����Kekk�����>��]�t��)-\�P��w�������H��HB�m���E�
��BwzDD�$��&������W&�)M�.IU�V�$��q#
������m�*��(������_~i<���S��C���Q#=���Z�x��]���_=��N�:e�$:tHo���V�X������O����2=�a��z���4l���s����>}z�]Q�%K�������G�;wN������KU�����+Wj���Y������+j��Q
���Gu����T�L����w5t�P=x�@�4o�<��AJE���+��eK���j��	j���j��a���o 	������7@�r���'''Ii����cu�v���9���Q������'e�������z*�:�L�t���h��y���T�r�����*U�h��%:{��f���>}��f��*U�����T�dI��QC�{��{���C����>|x��.?�L&M�6�@��O5k��������K��7W���U�X1��WO�����=���`���u�����k��A�^�����egg�R�J�Y�f������u��U����8v��	:w��$�������3��a�����O%I���6l����r�.d���������7@�Lf��l�&Rj���N�8���k��e��K�,��#d2�t��15l�0�q_}��^x��)SF��_/���*22R%J�PDD�\\\�ulll�.^�����1��m�����MV�;�q����_����!7�i~ �����Cr
@^�ogd�@�e����}z�d6��~�z;vLR��4}�tIR�J�����t��IIR����Y2@�
x����+����U�Vj���j����'O�d2i�����}�v�L&5n���; -�o��������qc����2�������t��-��f5j�H���z�cN�8�3g�H���o_�-��7�Qdg��3u�T5i�D�����s�T�X1yyy��7�T��E������$������t������)�7�KR��}��o_�j�����s��sGd�7�Qbc��7�$q:���Y���:tH[�l��S�t�����fy��d��m�
�;,C�
xT��CBB�����~�)[���f�L�|�
��!�<j
�
�7n�P���u����fk�@��E6�n�a~�����$I
4��E����X%&&f����`�W�7��T��}���2�L�_��~��g+V��-�m���GQ��������y�w�#���(*t7��.]Z�T�R%+w@��E���
H����+w@��E�����G�l6k����n�#�<�
�
����O?��{���O>�v;��7�QT�n@7�LZ�|�z���)S��w��
��[���#�<����@z����h�"u��U���
��X������|���5���%i��m�Q��>,I2�����������d��dRpp���r���75�����9��}����{��VtwwwW�
���`����a2��U��S'B�B$88X�,;7QQQ����Q������ ��_?�;-x�z�����%Ivvv


U�
��@� ���u��#���Bw���{���d2���W������������7o�g��:x��$�v��


R�j���Y����?���������`�M�4��]��o%������Q�n@��k�L&��w�����[�����Y�eM�2e
������'???k���._�,///�>}Z���iS}���*W���;�JHHH����?<xl���?�����������~��UI��A���	P8x{{[����~�M��u����.Ij���6n��%JX���a6����/IrqqQ�n��z�j�={V�v�R�����!@�#�R#�~<�������xX������V�����G��}{#|�����?<���$�������k����>��<���<�������������ukI��3g��	���w�����u��M+VT�"ET�ti�l�RS�LQXXX���d2�d2)  @�t��a�?^u��Q���S�K)""B�f�R��]U�R%988���U-Z��[o��?��#����������3���k��
���+���Qnnnz����z�jIRHH�1���o�c����d2���]�������yxx�|��rttT��U5b�?~<�~���s���~��$i���Z�v��-���6l����j���������I��W���>��[��{L||�*U�$����%K*&&&�y���+�L&U�\Y			�{��H�������S�+W�$�\�RQQQY����k����I���k5`�U�VM����
��#T�F
999���:r��>��c���K��W����T�bEyyy�?�������a�-[���d����BCC�|]f�Y5k���dR��Eu���45�6m��a�T�V-+V���Q�F����f�����/g9(X��@�!�&�&�&�������/HJ
�bcc��
��:p�������^zI[�n���W���o��������T�vm���[<������U+��3G���[�!���+U�F
���k��m��\�����;:|���M��Z�ji���~�o���:v�������?��������@
4H��
S|||���u��<==��s�)88X��_��������E�Z�lY�{
����"""$I&L��%Kdoo��q���j�������E������{��������-Y�D��u��A���vvv3f����"V�X�e�K�.5���G���6��5���p�b�5j�}�������#$I�������4h� ���_k����K�����L�y��������������w�^����_��7�����y�f������{z����^���� M�8Qu��������g��	��.������|-AAA�V�/U������{����z�������������1�9y����_��_]��M�r.P�����A�M�-��D�
����xX�N�4i�$M�6M�
���K���b���G����������hIR�
4b�U�^]�o����k��?(&&F�G���l����3��o�U``��������V�Z���^�N�R�
��y��i��q2��*R�������;�|���{��v����K�*66V���*R���
������j���$����G�rvv���g�������+11��1���5p�@����j����*U�����Z�b�������G�U�V�Y��E��X�B#F�P\\�$�����G}��q���j����\�"Ij������U�V-�����_���u���^�Z�����y�L&�1���c���+!!As���s�=���s���$����}n$�o)i����|}}��'�H�����5����j�����G���Sll����/�4���OW``���-��#G�q����V{O�7&&&F���j����z�)��SG%K�TBB�BBB�q�F���[aaa�����=�*U���k���z��W.���;�^���~K��q�R��<y�6l� I*[����'�xB�K�Vll�.^�����k���w����G�M�M���7(&��l�v)���S�����W+W�T�r�4b��i�F�K���M�_���c��n�P���T�%�����������1�:Dv�O��+����&M�������1c�������R�71�|�;Vf�YNNN���_�����&   UX[�N�j����}��q�l�R<P����~�z��W/M������kW����x��
		���k�???���{��;v�s�����={V
6T\\�����j�*���7UMLL����d<7r�H�����]����������&N���n������/���f����&88X��.*6l�^x�%&&�d2i�����?�������f=��S��w�lmm����Oc��MSw��}���j�����.�x8������u�$%��F��;��C����OJ�z��m�����E>|X&�I���W����}m����}�$I�N�R���3���7��x{{k��e����3�<��M�R�������M�*U��f���w�aR�w���Y�T*"vM4����W��5j@�G�7F�FM4��hLbCD,��������h�"��!H�2�|LX�e�����<�=|f���f������~��O�=2{���p�	���'?�I���?&I����|�{�[�X�~�i�[o���93[n�e^����Y�f�u���0aB6�h������}���y�������.�����Vd���oe�{T���6wzM(����&;]���oi����������7���N������M�W���E����^{�����;w�uW
�B>��������G�N�:e������c���~	P�
�B�?�l�M�����J��w�������/|O�N8�����)SJaaUu8p��{2'�������q�<�����d�-�(��_}�Un���*�^�?��O����>�����$i��I�UW]u��������$���~W
z��E���K/��SO����S�^��t�M�
��������a���yo�'I�F���o��(���������?,_�������������W^y%I��n�U
��9_���w���w�u�M�~���6m�4w�yg��{����U��Ir���������m��V�����N+W�~���;3g�L2��=f��L�0�f�u�Ve�-Z��U�;0��*�/�������&���Z�=������o>����������Yg��z��-�������v��������nU|���/�0��k�l���U���>�d���N�<��#U�]�{��7IRQQ����m�����?��b�]U@�����vH���2m��*��<yr�x��7���^�:��v��Q�*_c�4l�0�����$o��vF�]��>��S�&������S������m���$Yo��r�T�������J����sy��i��Q���[nY`�� ={�L�f��]G�n�����V������nI�|ye������l��J_{���������X,�v�o���|��&M����~��{��������������eo�m����/,w	P��s�=U�o��e���?�|�x�}���������7�<o��VF��O>�������^�XC�������	���Ui��y>����1b�m���g���-��"m������{��k���Zc7m�4���w�l��m�$s����W9�z����'f��	y��7��������Vx���O'I�Zk����_d�/���t<b��J��
��r�)���~�������o�q�W���2i��$��'�X��7�c���0`@�d�UVY��V[m�|�����;������H��]9��>�K��X,����]w���_~9~�a�����N����Ge�������N;-���3k���t�M���W���>�h���$s����?�-Z���;����{.O<�D>���q��k����a�j��|��P��{~����L{�7��,@�Z�K�.����O>I2'�^T0�$�n�i�z��R���sC��5jT��O�>���O�
N2n��j�M��?��t��F-���nX��[�jU�a��X�d�;�o�����o�}��7&L���C��~����N����o������/�$�G��V(=���={������i�������/������$����	'��X�-�=��S��k��i�������#w�yg��w���z���<.i�O?�4�vX�Z��'N�����t��u�Y'�qz�����?������Ir�)�,p�k��6;v��	r��������*���v�!:tH�����{�~�Z�����I�=?���������X�.�Y_}�U�9;�W��;���� ���J���?�Z�-��3�����K�M�4Yd���IRQQ�-����y�������&I�}�����~
n��{?��������V�Z��#�H�6,o��F��K/��W^y%Ir�Ae�u�]������n*w��}����o���Ez����H��������9sf���R���j��{�����~�~�������=���{��'?���J�f���������O<1I������*����Os�}�%I��z����Nc����k�����?��9�:uj�~��\v�e�w�}��m�\u�U�;0��B�=?���������e:�`��*>oH]�I�&��wI��_}��)����8�
��L�����}/��v�!�=�XV[m�$s��B�y�����n���o��>�i��V:�w���F�8F��'�x��x���O�PX�O�
����&�f���w��_��~{^{��$I�N����o��9���s�����CM�.]��K�l��f����O.��>�{��w���93������_?�{����c��SO���.�AT��|��g9��3kd�~�M�������{������V0k��v�9����g�l��;����Yg�%��m����?�p����y�|����~������j��w�����?��s�w�}3a�����l���~��G5V��;��m��6I��_�L�:5_}�Un���$s�����o��������s���{��_�>�h�������)���~��\w�us��'I|��|��G)�������2�1�S��5j�=��#��sN�����3&�]w]4h�$���O^~��j�u��{~����/��XZ��]P�v�i����[I��?���v���y����$���K�6m�x��w�=�B!�b1?�p~���.�X���Zke�����~���z+�~�i��?���������v���'�H���3n��<����w�}�����e��������������?�</��r��~�����N��'�������;���i�Jw8���RQ�t{���=;}��)=>���*�h�0����������?�������KU����}�l���U�}����=�i���{��'�f��M7���w�9�F�J�|���O�-��������O��#��?�1I�����>'Pn�����+�/��XZ��
��C-��W^ye�>����Wo�m/����.��z�R����k����>��_=��v[����/��U9��C��?�)�g���W_�_���l��_�_�~���%�����B��c���^H�����c�e�UW-����G����%I�;��<���)
K=��G����g�0aB����L�6-IR�~����s�����2z��$�w���\q�����U�����o����nZ�|��MK����n��r���������oV{���;g�M6������t�M��?�Y:w�)�,y���lP:�9s�R�����2�����&����m��:��?�����*I��k����N[`(��O����M�4i��|.�K/�4
6L��x�������l?n���������?��s�q�i��A���+��}��7_�)S���������{�em�m��O<��W_=I��K/�s�����/Km;�����NI��8��{��N�2k��<������K���i�����{���g��+���$9������k/��J���s�������>���5������W_-u-�c�v(������Y��k���O���O^�q�BN=��$��~���'�s7��~������3]tQ>������<yrn�����m��f�j��L��_���/��XZ��+�������?:t����s�
7d��a��~����g��q<xp~��R����:����R���6������	'�P
�����{��^6�d����*�0aB�}�����y���3s��%��}��6�\���??3f�H�.]��[�����i��y������o��Q�r�G��;�(�?���[o�'�x"�:u�_|��_~9�;w���?��V[-�B!�
�.���?�0��������~���~����U�L�6-�q^{��<��c3fL:u����;���O=��\s�5��������[
�����c�9��}W_}�p�����2y��80'�t�R�T]'�pB~��������}������:��w�����/��2�<�H����{�������>�����_����~���{��	���W~��_�C����C6�l��h�"�����o���n�-�q�d��wN�����@-$�������XZ��
�;��N�|��t��-}�Q�x���s�9��k��I�����p�	56�q����^;={����W_}5����B�7j�����:���2a��\y��)�4hP
T��QG�/���7o�|��ZV�^��;f��1y��W��S�<���i��U�]w����K9�����C��/����__��m��]���������{����J�l����g�}������/_�u�d����Zk��X�{��Q���w���5�_s�5s��������)S���o����I�&��_��Y�f-V��U�y�����o�9����>��>�B!I2{��<��3y��g�v�=��]w�U��`5A��_����O�
,-�R+�v�!���N����t��)k��V4h��V[-�o�}�=���������}����/#G�L���s�a�e�
6H�f�R�~����j�v�ms�q���[n���~���������~���z*GqD�Yg�4l�0k��v����u�]����2a��R�V�Z��K�Q[n�e�|������I�������S���dN0���f��a9��3��6��u���W�^�6m��6�(tP.���������O���w�}K�'�tR)�]�{�.w��}��t�A�k��s�e��K]��8����k����O�l��
�e�����������y��W���`�����>�����Y�*�����y�������>�~x���o�E������������}�����z*k�������[��(�������Q(��r���8qbZ�l�	&�E���w��iy������q����B(�k��&?����$��sO�t�R��j�m��&���Z4h�?�p�wkg�t��%�N����+�v�m�\���w+�������=�q�w�\�zMXt��&;�vX�k(�`E'�^0����2����-��d�P{�;�vt`�6c��\w�uI�
d�]w-sE���a���k�%I�u�&|_�>���<��I��v�i����'�^0���%���CY�o��F9�����SOe����,��>����1b���M���={��7�L�v�aYc�5�Wy�V�X����_z�����|��$z���Y�f%�~��J�
,
����/�oX9�/�����~����\u�Ui��U<��r�!�����*���4�=ztv�a�|���M�N���f��E�����2|��80�|�I��u�����+�\q���������/��2��zk�x��$����w�����x�}��������������[nI�l��V9��#�\�,����!��>���%���SY�q�y���3q���;6���K�~���q�t��)�rH>�`;6Uz�����K/-��l���g�u�Y�U�.W^ye���[��5�\3����T���������*=��I��|�����(SU��$�j��{������VNeM�1c�����i���u�Y'�b1S�N������|��Yg�u��n��w��]�����\���j��r�m��G��f�m�����q��i��q��m��}�{�������og���*w��B�z���}����3/��b��kW��Vh�B!���n;�������~���]������!�^|���K�
+�B�X,���y���K<xp�7�x��|�PH�l��f���K9�����N�*�V�8qbZ�l�	&�E���w��iy������q����BV&~��"k�+���]���kB�����4��� �^|K{
��4�[X�����*w�]�;�/�w���\|��>|x�}��\y���c�=RQQ�b����~;�_~y:t��u�Y'��zjz��|���52�W_}�A���3�H���k�A�i��E6�|�t��=?�pg���������g�r�-��e�4k�,�m�YN?������5R7�K���D���uw@_��c���������{,S�LI�����5k����/�rH<�������=����������i��v��wO�����]�*�]����O~��S�.�|�z�r���.X�z�rtj�[X���j�r�_]�#�N�f���6~��"��C�U����r�q	�n�:=z�H�=2m��<��c���{��d��1�]�
����g��wO�.]r�gT{�w�y���������s��~������6mZ�{�����?�&M�?������^y������k.p������SNI�TTT����J�N�R�~�:4}������s���Q�F9��s����V[�w"`���;�/L�X���>�{��7�����[:WQQ��3gV{��N;-#G���g��N�:���b�6|�A��o���_�J�������|�����7�8'NLEEE����|����<��s���S�L�������7��f�mV�z�rtj�[X���j�r���j2�N�f���6~��"��C�U��{�t��)
�u�]����.���N�|��\z���a���k�/���<��#�g�}�'������o������o��)S�kw�Wd���I��O?}��=Iv�y�\|��I��3g���.Z�zaI�5*�B!�B!�w\����^{��_M�������j^�_��M[l�E~��_������������U�j��z��K��O�2����s���y�����NJ��M�$��w_�N��8%�2s����W�^���W��_�r�O�>��q~�t�2�X�~)�}��KT��c,����������o_���;�\�Z����7O�^���u�|\u�U���W����r��K�'2p�K�����,
�7�}+��y�i�f��=������1"|�A�9_�`�
:N�������'I&O����zjT���{��E]��.����+���>#F��V���{/�j�iW]uU.��"<�@�2�Nd��������{�&����~����������;�����~�����z�x�vX�x;��C~��R������*�k��}��b���Q{��w~��W���k����I�Xc�\���j��A�E��_�~f�����{��+�����Y�r�-�T�#�.����y�/�d��	I����n�����������}Am��[[]{���]�rw�_;���]�v���K��(i��I���?��?�������\v�e�_�}?��������$x`\cu�������]���%�(���1cr�9���w�y��?~|�x��W_���[�^`���>}z�O�^z<q��$��32c��E����3R,3{����={���LV��f��������y���9����xy��0�w\����|��g����s�!�,��M7��d�N����_)�_������_���g�X,f���W�^�����^���:��q���bfPP.���R��&����d�����7�o�7��"\'8+28�^���-@__�u=��|���I�.]��k�����4iR��q�E�%��*�������E���o~��.�h��}��4i�d���U�~��i�&�&M��_�X}W&s�������?��7��$y�����F����'�L�n�J�y��������{��W��S�$�g���/��tn����z���$������?��t��?�an���Jc-��]w�5<�@����3K�s��x ��rK�x���;6�Z��;��SN9%���k�D�L�6�t<c����N����={��Uc�k��C�Y{����'���n��{���>c��-]�#�8��/������gy��	���w}�����{?~|Z�l��6�(���oN8���l�r��/���\~��I����?���[�~���|��y���2f���h�"�l�M�=��|����k��Y4hP|�����+;vl
�B�^{�t��!�w\��v���0`@N?��$���^���>:���Z����������2i������}��<��#6lX�z��|��g������e�l��&���c�?��J_���w���|�����|���s�9'���7����z<��3���_���|����:uj�\u|����:uj�~��J7��������r�`�/���onXS�L)w	uJm��k2�Nd���<2p�����O�-��
�w"`�&��������4{�����3���?��	${��]�Z~��_��?�i������z�e�}�M�-k�i����?L�f���E������Kj�}�-�/����������^x!�;w���/�P:���+��f����4hP�\�
�Uk���+��_���4l�0��w��A�*����Os����������_���>�Zs-����o���5�{RQQ�Dc������(���j���{.���<��c�:uj�Zk���������r�)�����Q�FK]��>�=zd��q�����/��_�������^��}����8F�F�J�M�4��~������f��1y�����c���C�m��V��7���9��#���o�w��w������[n�%��~z���?,0������q�\w�u��/�Y�f��n��x�-�����_`Ms��a����k�I���s����n��\�]�eq=�?����O��]�&M����6mZVYe����~������#e���F'�m������
�aym,�"�-xM������G.�^<�o��\����'2pVl2p����[�^
�b1��zjn���$I�v�����g��V[`�yC�yw�^��S����7o����5Z`��A�j��s��5+�B!��VF������S
�B��b���N;m�6O>��|��;����k��A��s�J�a���������M��]s��W���������kV��W_��r�I'e��A�r�-���?m�Q&O�����?��{o��������C���Q���zK3��/�1���N���_��3g��[o]�����d���[l�E�Z:����#�<��]��v��i��r�QGe�u��'�|��������q���k�<���o����P(�������}��i��ez������>�f����C��o�L�>=����;�:���?��=���t���w�=x`�_���=;��O�>}��g���k���3r�u��7����]w���z(��5K������;�A�1bD�Yg�R�i���P(d����{���7�<�Z�J�|��Gy������g���9�������f����4���_�)S����O��1c��k������i��7�T���W\qEz��������G�������UW]�������
�%�����Y�E7ZF�^t���&�o}�
�]�zjS^��w"���������[����kc�=��������C�U���}��b~����nH��m�6�����}���Yu�UK�_|��"�;v����Yc�5��o;o��F�|����J�������/'��>���y��g3}��J_��1cF)x�a�*}!dQ��n�l��v��<��3}U��o0`@~����w��]���g�����Kr����X,�����R�+�M6�$���[�y���|����/��b^��$s���4i����������+\pA���������+����2s�����#������R��w��M6�$�����m�����w��~��t��1c����w�����������)9�����W_�I�&8p`����Ujs��G���E�v��'�|2�_}?���9a��z(�n�i{���k�n��v�}����;�x��x�������?�C9$S�L����<���������I����'I�����K����,����Ce�]v�����J_0��~Pe=@�!gy�S���{.�7�N���B�X���������I�u�]7O>�d6�h�*�m��f��������f����:v��$3fL)L�������Y��$_|q�9;P?�����=����<yr����=��3W\q�w���/~�u�]7I��c������o�
�j�2�F���|P�zz��U�qO8��$��#��s�U:��w�$I��Ms��G��kI��o�9�}�Y����r��V
{�9;�_t�E����$�}�Y�������w�Q)|�k�-���7�Xz����v�67�xcF��d��
�����e��y��i��E���+����B���V�'��������su��9?��O�$O<�D����T��:���h��i���������d�,o��%#������Pn�/����/�K�d�u���O>���%I��j����/�������r�-��ZV$�����+���x�M6I��K����}s����3��/��^�z�{�������{���<K��?����7�|s��i��e����6���u�}����s�9�����{��-�����m��f��>����������������d����>��*�j��u<��$��!C2}�����m������V9����N�����XV��[�n�/�+8� ��*�o�w"����~����>�(#F���q����_�{���t�o�k��v�|��l��&����o}+���������[oe��Qi����N�4)���?�$M�4��{�Y#���k�=�LEEEf���'�x"?��OJ����:uJ��������_�����v���]�����C��W����.�Ty~��������s�������j�]_rYc�5r���W����o^�q�6m�#�8"7�tS����*���J
����'I�?��%)y���b^x��$s���7L^�]w�5M�6�������/f����@2gw�E���s���%I^x��l���I��'��W_M2������o�c�
��M����������������3����n�/���#G������3����>Z���iY^��}���[��w"�|��KF�-��/����Z��w�����+���oWz�����^���z*���^n�������3�(�m����O>�M7�t��8��#����.I����>W_}��]���<yr�9;7i�d)*gE����f�m���/����~:�f�J�z�2v��><�wu�������4iR�5k�i���v����C5j��_����^��yk�6mZ����]�t���F��	M�4Yf����37�tS&N�����+?����w�$��o�=���F��8qb�L��$�h����UQQ��7�8���Z�N������U�Vl[�/5�����?.����={v����^J��]9������s�~I�*�&M������W{��'V����/��Q��
,�r������/���[��`�oX~��W�2�:uj<���t�Iy���S,K?���~7�?�x������zk�����~�?���I��C��f�m����}��i��y���k�]����?�|�?��$I���s��.E��H��'N�K/��$2dH��b
�B��{�J�f��Q�����CK�\�=��-*d�t����s��7��Q�F��'�LR���'�W_}U:n��i��4k�l����:���f����x��������[e�U�5��GY
��������&}����w��{��'��sO�;4��5k��^�������r������S���o�7�6�����w�C=�$i��}������/��_�����g�}��k��/��<�-��b��=�����?�)IR(�����y����o��vi��]���\s�\s�59���2{��t��5GuT��g���W/C�M��}K�__t�E�@
��{����x�����N�����$�j��J;������p�
3r������Pj7wVL�|�9��2$\pA��b����=z��\s�H��t��E�4i��Su�����c�*w��-�
�Vm5e���y�����s�����M�6l��A��wY^���+�Nd���oE�-�N��P����O<�D
�B����:*}��I�
2x�����g�}2`��<��3���~�Ds?��3��b��_����w��7�������=zd��)��O�i��e��0`@�6����/���{��KT3+��w�=
4��3����=��{n)X���S��{��w)�OR�o�f����;.��Yn�w��_����9sf����$�w�}������\-Z�H��M3y���92�g��r����g����K2gG�UW]u�m�}��E�?o�u�Y�t<�k���9NM{��GK������'����_c�.����r�����A��������o�}�/�e��O�$��nX
��c���N�E�����v�i>|x~����[��V�7o��M�f�M6�����_|1]tQ����i��Yv�a�$���>�Q�F����N�t���R���_}���=:/��R�9!~��K�����^�X\�qX6��i�8��s��2��P(�>��'O���C�l?t�����;��C���c�=�������N;�T:^}����o;I��+����>[�X5��O?-o���U��{W���}���mY^�f�h�w"g���Y���;�@mS��~���)
���{��������,�!C��X,.���v~��&�l�+��2o��f&N��I�&��w��_���l���K\/+����;I2u��\z��I��-`�=���nn?{��\|���9sf���T�f�J��'O^��X6�8�����N�i����^{��CYfsz�����/�����]v��-�c�=����/��������O��n�l�������#I2k��\p�U�U��6mZ:�j'�a��U+���g�:����jV9��DN�!�fQ����D�
�I�[�>w��6�l��5n�8I2m���	�a�}��v�a��h��R�6m�d�-���������A�+���Tc�l����y�����s���'�L��
��\�w\�Zk�$sB��/�x��.���<���I���Zk�����5+GqD>������1"'�pB��������~��i��}������9���3f,t����:w�qG����*������'�E]���?���a�V��(��37v���=�����z5K�
s��Y���;�@mR��|S�z�����zq�7.I�����tIP:tH�F�2}��E�����{����*�k��U��f����s��������������f������U�����K5GM=zt����j�m��A<����?~|�;��j���o}+G}�|�O�2���$s�a��-��~yk��Y����<����C=�#�<2k��v>���80��
K���_?}��M������C��A���o;'�pB��n���5+�>�l���S
��u��#�<r��M�4�}���=��#����o�����?�vX��z��h�"S�L��~�W^y%�?�x&N�X)�_R��uK�v�2z�����K�l��r��'f��7��)S��SOe����1cFz����}�V9^���s�}�%I�v��SO=5���n**�����g��7N���P���0��{����-������7���k��VF��w�}w������I���[oY��]�����.�d��!���w��1���K���s�Rh����j�{�����>�����g?�t~�=��T[�=���y��'���e��?~�B�O�0!�^zi��:��C��3&]�v��I���s��4�����~<xp~����/���a�J��V[m����/����"�<��3��}�\y�����+���C������1��j����K9��c�������?��W_����B!����"k[�F����������/��"�G��\P�M�z�r�e�e��vZd��g������o��W^y%'�|r��^xaz��Uz�,�P���0��{����=�we�o���.�[:t��b��X;'O�<9w�yg
�Bv�m�eW,g���5������v{��w
���-��}���nH�����k�vg�u��f�������]w�5���z�����W_=:t���^��#GV���7]q�y���s���g���K��
��kd�����w��{��7�7�r��6�(�=�\y���x�������UW]5���K��������[�n������{/]t���I����>���Yg���6�,�7N�f�������SN�/��s�9�Zc5m�4�=�\.���|���M��-�E�eq=��#����S���+��*��b����<��>8�B!7�pCz���$<xp�v��B��Y�fU���{����?�B!��
��;�X���f���i��e&L��-Z,V�i�������l���k�kO����Y�����	���W�^���'��^{�U���qK����������=���w$]nzM(����&;]���oi���zd�P3��+8+28�^���k��:������)�9��S����&�&MZ`����9��s����P(��X��wj'�7uQ�r� ��~{v�i�|���9���r��g���*��a���G���?O����k�.}��)S�0?�7uM�\���z�������G���{.��M����S(�$���J��b��N;��A�e��W/W�+������%�	���OPYE�X���[/�>�l�n���u��)���f�����w��a��e�u�)w�0�7uI���������{��^�d��)?~|�5k�-Z��2�>�7uA����4i�$���������W�n{��W��(�7@�'�VTuj:���$I�����|���y���2b��|����6m�"�
��t�M��:��7uE�\����_��3���2k����/���5jT6�`�$I�=��O��T��o�>|�A�_��5�������&���M.Z���uCE�����'g�=�H�~�2s������Vl�f��������8;��C��m�UVY%���J�^{�����9���3`��|��WU�5d��
�
����^�lS(��E��3f�u���������[��
@'��"����uw@�������o&I�Zk��q��}����M�4j�������o���W����#x��O?���~�_|17�pC5j�=z��s�����_#5|��W���K��?��F�`�%�F�
@mV���y��I���[//��B�Zk�2W���i�r��'�_�~����i���;g���O�����a��3&#G���O>��^{-��O���_��c�������z������3�L���kl���5j��@���$��\�`����|�A
�B�8��;�$���{��9��7�W\���;.
6\h�w�}7�\sM������i���<yr����������$��I�
@]PQ���E�I�
6�������W_]
�W[m�<���9������d��7�������k�u�]k��<0o�q�d��>|x����I�
�K�
@]Q��o��&I�1c���(�i��e�������:d�5�H�
��y�l��&��~��{l�����+�B!�B!C�I�����9�������q��i��u��{����'�g��V}�?�|�9�����zi��q�]w��������;��e�g�������K�o���l����5�f�m�3�<�F�i��A.���$������_��F�]�����P(�}��<_W���O?��O>9[l�EV]u�4n�8���^=��4(�bq��~���^���[����?R�~�
�����������V�� ���\��9���o�n�u��w��b��������@�|�[�J�.]r�5�d��a���/2s��L�4)���n����}��7]�t��I��=���_��v�)}����������g��q2dH�?��z���9sf�c���+:t����Ge���������#���#�����3f,�[�$�������$��[o�C=�F�]GqD��~�$��>���~�����]�����{��^��s��p�
y���3a��L�>=}�Q����v�a�k��J�{^W\qE��z�$������}�.p�q����c���Y�R(r�-�d�5��V������s���Lm���o`eQ��|S�=r��7��GI�����/���L��UW]5;v���n���_?M�4���3|���~�����O2x������Z;r�p�
0`@�Xc�w�q��w�����<������3}���{����o�s�=w�c���E]Tz��k�p�i��y�z�����;w�uW�w_�G}�t\[�.(
������>�$I�9��6��U�Wm��'N�����#F$�s���?<[l�E6l��#G���n�������O�s��y�����q���5�������g��)9��3��.�d�M7�4W��=���&I~�����@���A�=��{����,�V&�nz��
s�}����q����{.��~z��b�r����7����;�A�<�����c������;��3�<�Lv�m�*�0`@��s�<8-[�,=��G���O�N�2k������g���
V�?r��R`[�^�80�vX�6g�uV:���}��K�����3���;t�P#c����;�s��y�����s���{�I��]�]V��w�O9��R���W��w�y�W�^�6?�������<W^ye^{��\r�%���K*��|��s�5���N��I�r�QG����+���?�)�N����N��(�7����/��v��������,�Zk��g�y&�n�m����d�-�L�-��}�l���U�l��F�.�����=I�4i��}��i��I��}�.r�V�Ze��A�B����s�R���_��_�������L�6-Ir��g��&I�-r����y����gQf����?�����������R(�$���/3k��2W4Gm��������$'�pB.������$����W\�]w��T�����k��g�u�QI����9��s�$���Z�>��Rm��v[���u��+)�7+;���{I���,�V6�r�o���|�;y��W�$�b1�&M����3j��E����E��j���$�=��"�w��=�[�^��}���t��o�w~�n�9��3:��k��c�=v��,��q�*=^u�U�l�QG�P(,�g��!K]����~�~��I���z+}������Tm���~1��?�y�m�9�'��	����/��u�]�
6� I��?�1w�qG�:��R`?�y��@�
�&��L�=Gm���o`eS����������{g��q)�I�
�u��i��Q������/�������~8o��F�����'��\����>Z�x���K����m[i�y}�������$�o�y�Yg�*����S����,�����K.��w���3g�W�^9��c��q���T����O?�$i��qF��#FT9�������#��{���E�8p`v�m���1#Gyd���;�P����U��~���e�������~�o�7��j���.�,c��M�PH�����W����N�W�^�K��f���9��2v��j��8q�"�����U���.��M�t���?.o������:m�U�V��?>k���B��}�������w^�|����ea6�d��x����_���>�(�\sM~���-����6]��w��6mZ�v�������;�k�w�%�\�s�9�����o����z��X��� �N��K�6]g�7���u�}��
����Ny��GR(�],W��
�a���3g&I�����s���x����j��Q�F�?s���g/r����%�i��I��&M�,�}��M�x������5�\3��y������2���w���~�����������E���r�-�d��)��o~��N:)����2�waj�u?~�����_Wy~��6�������@M�����!�^2��:����M�[���G%I�w�.|g�t����k��6?�����K/].55k��t<e��E��<yr������g��AI�|1�C�52nMZ{������$�������_���/�o~��r��Dj�:7k�,���O�V��}7������N8��sW]uU�t���v����XZ�oVv����/_�o����[/#�Z�J�����e���3fd��!I�������=IF����J��:����}��E��N���w�}K������1������i��u����c>���2W�dj�:�m�6������]~i��=;�sL)����[
�Bf���c�9&_~�e��P����������/�7���u���v�$���#�\	,_|�Ei���7����/��b�����QV�\s��o�>I���o/2`~��'jd�c�=6k��F���W_����[#����-[��s�M�L�:5�z�*oAK�����{��dNh��#��H��^zi�z��$I���s�]w�'?�I�d���9���jd�� �fe&��L��|���N�[�~��'�X,���)��.���M�������^�����k��I���������>����Z#s6i�$��~���'��#F���5���OO�v��$�{������2W�dj�:w���t��_�*��M[���y��\t�EI�|Y�_�~)
������v�%I
����n���)�oVf��������`�����rH�=�����9��S2k��r��M�-����&I^~���u�]���5kV�<��<��C���3�8#�7N������=��3_����*Gyd&N�Xc���G?����$;vlv�e��x���1cF�������?���:�Q�F�px��Y���k���5�&���;�X�v���!��1c�,�}�X���Cs��g�w��/��1��Y�f�P(�O�>i��M��a��8p`�5k�$9��3k�5��������{~���K�
������o=zt.���L�>=7�tS�
�SO=5;��sZ�n���E����3�E?��O���0Ir�G��#���{���V[-���nn������[�r�-��Q��������
7�0��������43g�L�n���[�p�i��y�z�����;~�a�u�����������o5j����g���9���r�d�}����o���[�q���8qbF��g�y&���?J_�Ye�U��U��ga�w��+��"o��f&O����[j�:�t�My��w��k���GM���s���f��w�k��3f���>�����������>�Fm�+����8'�xbF��dN�~�T:��&���k�M�=2u��u�Qy��J_&(�7+;��������`�������O�PH2g7�#F��?�q��
���9sY��������^z)�{�N�X���3p��Jm��j�<8��r���3�����s���X,�����/�=���s����h��*��_�~���S~��_�����'�|�[n�%��r�B�5i�$������W��m����Y���������!����Z�j�:7o�<�<�L~������2eJ����~��-��7��_����<�m�]~���,�_���������[o�������:+�^{mu^2�2!�fe'����{��,�Eo�^�b1�b�����@]V(r�M7e��A�o����u�4h� m����{��?��Oy��������.�(�>�l����g�u�M��
���kg������s�w�A��d���;.���N������G?���o�u�Y'�7N�����M�l���9���s�-���O?��7��\���>�������m�e�&�s�f�r�-���7���~������Yc�5R�~�4i�$���~��w����+�?�|�R���o��?�ii���a����/�K6�h�$�����<x��� �fe&�^8���#�X|�b-K�kbG��o��*�;&N���-[f��	i���b��6mZ���l��i���2�����-�������6���G�m��6hW��_��z����Y��tY�/����r
j��-��V�<�&�on��r����������������E�.���t�$��],[���ls������
���HR�;�w��1IR(��O������x�,��X��m��!CR(��|u��%�KB�
���l�����b�������(����g/��P��X�T��j�H��/w�t�-�$I:v���m�V�����<I��{�eRT������-@?���R(r�=�,V��������KEE�~	��r��
���C�]>�
j��)��*�]@M�����b�G`���e����Y����w�d���O@M���2Za�U|n�^(�\I���A���W/�'O.w)� �L��z���A��.�$�����P�d���V��c��I�4k�����-�B!��7������R+��8qb�7o�Kq����KN@M����Z!�O�>=��rK�d�
6(s5uO��-3c��|���x�X�X���3f�e���.�$�����Pd�����s��}��o��<w�y��������X�������og���)
����2�t���I��m�6}�Q�N��-Z�I�&�W���{�R�X��Y�2e��L�813f�H��m��I�r����������d�0GY��5*C��/�-�y��7�=�����i���:�Fk\Y4o�<���~&L�����g����.	�:�^�zi��yZ�l)x`�$��]d�,
8+��.@�kn������P(�Y�f�`�
��s��u�Yi����(q���I�4i�$m����32{��r�@PQQ�
�cD�]���X2p(��/�0^xa��***R(r�=����.Se+�B���
���:C�]{��OE�X�����������w@_���g��Xj�o��Zyt�?�H��/wU�9sf^|��������/3m��j�����qeP}�o��Z�}�����o�?�����/����@�
@]S����~�����{K�G�PXU���P�����rK����$I�z�r�a�e�}�I��m��Q�2W�#��.�u�����$i��q~�����e��������|����S(r��'
������E�n�����$:t(s%�����E�n�:���$�={v�+�%'��.�u���c�$�����\	,9�7uQ�[����(���O����r�KD�
@]T��o��v���K�����K�.���/�],6�7uQ�r�MO?�tv�e�}��0`@6�t�t��=���KV_}�TT,z��{��*���P���{��W
�B��P(d�������r�UWU��P���3�a��h�o��Z�=I��b���.�P����^xa�K��&��.���7uQE��v��$���Y�@��~���z��-U�B���3g�P5�d���E�nz�X,w	�����E�n�{��B�Pe�Y�f��/��;�����g�P(d�m�M����S�P5�7uQ�[�>d��j�7n\���?���/��i�2h��������8�&�7uQE�X�Z���_�d��9��C���_��,X,�oj�:�}��;,���o^��\w�u�.����r[!�'�������0�����PN+����Z+I��;���Xr�o�i�Y���g�%I�N�Z�J`���(�b����s�-�$I�]w�2WKF�
@�������^�u��_|1�B!���O�K��&��6�_���c���j���_�?��OF�]z�i��9��s�UiPm�o��Z�}��!)
�j[,K����z���_Y��&��.�u������4l�0���Z���o��H��=��j�-���z���5�n�����],5�7uQE��v�uw@����$-Z��6�lS�b`	����j����k���������K�%&��.�u�WYe�$���n[�J`�����j��6m���Xj�o��Z��C�I������Xr�o��Z���NH�XL��}3a��r�KD�
@]T�����^9��3����������~Z��`���������oz���s�a������C=�M7�4��u������m�f�UVY�{���R�0k�����[y������/���^�k����S�&Iz���>}�,r�>}��������^xaz����UP���{-a��S�[���^{�P($I
�B&M��~���_�~��_(2s������#���w��Tc�r�P���IR,�|����5���V�Z�u��������c��G?J���l����/���>�o��Z���/,w	�q���[d������o�
6� }�������cn��v���K�	@�&��.�}�=��r�@'��.�(w���������s��b�4k�,M�4I�v�r���/�K�L�R���Z��+6���_|1o��v&O���S���?��������i��}x��r��$�X��/w+�z��e�]v�����M7�4��5�������/��;���q�2f��|�����[�����%�|��+����v�-�F�J��m�;w��'����mN:���~��)����gv�u��k���q�O������O�81I2c����1�f_%���6����e��Q�mn����e���xd�����*�g��eh��7��|���s������>��!C2m��\~�����k������&]t�|�?���i���R����v����`�/����m���,���5S�L)w	+,�7��G������r���b�X�-*��>}�����O����#}��������v�-I��]�|��U�_�����^�����h������-{=R���htB���e���6�����mn���'f��W��	d�U�����ANu�;�v�Z`�]vI���3m���=:S�L�r'�F��Q�F�=��A�4h�`Y�
�R�>�P����V���g��-#�/��K������'����Y�(��$I***��U��������XB�o����Z`������/K�W]u��KH�
P����n�a6�p����?.w)��s�=��S�&I��m�&M���"���[�
P�/w�4z����|���.w)�����s��t�Ae���"���E���k��f��U�Ve�d�6,�_}�M���6�'ON�����O$I5j�s�9gy��2$���E����m�Y>���|��Ge������M7�T���������������t�c�����c��g�}�SN9%g�uV��g�l���Yo����i�L�0!���J��c�&I
�Bn����o�~��0��w�e��Xfj���;,O=�T
�3�<�,5|�����Kz~�����$�_�~�~�I�&��{��=�������i�o�1x��
@�"��.�(w�t�I'����v�
�+�����,���;g���9��s��s�l��fY}��S�~��h�"o�q�8�����7�����`#��.�uw@o��ax��t��-��sN�
���G���C6l�\j�k��R,�j�f�������\CUP�����j��
7�0I2}�����{�����{S�^��n�:���J���B�{���Q*,������-@5jT
�B���[,3s��|��g��?��������-@o����:O�
@]T���5��%�R�PU��j�Hb:�_�r�(/��by���1"�����3��OTj��_����N�����U�2U
'��.����}�����3C�-=W,S(�k����&W]uU�Xc���?�I�z��g��P�o���r� ���J����f���)����9���R,3f��<�����RX8�7uM�[�>u��t��%'NL�z�r����_��W�������x����6�$I{���T),������-@�����G�P(���o�%�\�M6�$
4�������b���^zi9U
'��.�u��B��8 ]�v�v�-��"I����.�������E�n��o��$9���_�V��$������`�����j��/��2I���k.V�b��,��%"��.�u�[�l�$�8q�b������$�[����`q����j�����'I^~������O$I���o�tI�����E�nz�N�R,s���W{�W_}5�<�H
�B:w���+�E�P���'�tR����q���G��9sf��G���;,�b1M�4I��=�S��p�o��Z�}�
7��g��b�����/�l�Mn����9��f��y���������z��3r��
�\x��i��u��9���E��]��\z�����s��������)���$)
I�������X,&Iz�����>{�!����uw@O������_����i�&�bq�?k��F�����p�
�.*�P���;��u�)��������>���~:�F�������Y��m�6{��g8��4i�����B���+j��$i��a:��t�A�.��������P;X�@�������o�p�
��_EEE�7o�V�Ze�����{��<0��������j��Q�F�P(�X,��+
��b�8��o�2dH���?�]�v������>�,�������E�n{�v���]�vYw�uK�z�XL�XL��-�����e�����9������u�Y'�7.����r�����*�K`%$��.�u�G���C��}��)��m��2h���7.�����~X:������n��X,�}��y��2y��><'�tR�d������g��[�W��D�
@]T��O�>=tP�}�����y�����k��������������[�~���������Cs�A������[n����.�\sM�d���������jXY����j�����.���jv�y�\t�E��s��g��w����Z)h?�����6�$I{��eQ.,������-@����R(r�QG-V���:*�b1��v[���t��b����~�&��*����j��w�}7I���k/V������Wz~��7N�|���5PT������-@�<yr����?^�~�|�I�d��)��o��Q��q��5PT������-@_o���$��v�b����m�������/�$�[�����z���E�n�~���b��^x!���/����s����?�B�����������'I�^{��F�
@]T���}��i��i����.�{�����;�����n��q4hPv�}�\~��I�&M����������J�P��;��|^D�
@�T��|S�v�r��7������Y�2t��:4I��E�4i�$S�L���K}��b����>}��]�v���~��|���i��I9����ZXy����j��$9���������O���#K�O�0!'NL�X��~��6��7��=�����{��G&M��\j�o�P����I��^{�_��W�����{��y�����g���i��i�Yg����9��Cr�!��^�z�.�#��.�����^�z���k�v�Z�R`����+*�]���$����~����={.Q����4o�<�Z���[o�]w�5�[�����z���E�nz�>}R(�z�
�����~���i��*���PU���)���o>��������0`@��z��1��/�����GYU�y����DTG�!�h$Qq�8i�cT����!I�5v�1*�j����1Q1q���6��Sp[��J�h�j8@��UW

���:���g-�:��}�~o���}^�]]��7M��O�<9/��r�8��$I��}���~57�xc�~������y���s��7��_�j����R��#�<2�&M���>�K.�$[o�u��r�O��C9$���+��������
��W���>:������>���k�M�~�����w��QG�	&�����5�\�$�7o^���/��k�M�T��~���=��>B��9sf�������oYm��������[�{J�/��6
*����O,�o:�j���/�j�o�Y���?9pZ���i���o�1�_}��n�i���$���_~���e��A����s�M7%Ijkk����<���n����on���B�����
������J��=:=z�h�5={�����S.�������~]]]F��r����z��B�%��U]�3�<�$�l������7����
��v�$�;���
�@���U]�����$y������Y�f5��A�>}Z'0X��tDUW����$�w��\��~����o0s��$I�~�Z!:h�o:��+@�}��S.�����6��zk�����[r��7�T*e��vkt��_L����Z�+,��7Q���3&�R)�r9�vX����d��iM��6mZ�<��~��)��)�J��W�����	R*���O~�=��$��tL�E��]w�5��zj.�����;7����r�d�-��&�l�^�z��?�����I�&e��)��I�SO=5���k�^�&M�O<�R��������@$�
@GTu�I�����Ym��r�y�e����?~���<�����5$��w����:+����������$�6�l�>�@=�o:��,@O�3�<3Gyd~���w��]^��%�80�rH����d��6[��Zk����Z�=��&���Tmz�l������Kr�%�d��iy��7���w��Yo��2`���C�f��QTu�� �@�'�
@5�):��t�$�Eu|���W���c�&�_Q�����7�Ia�#F�H�TJ�T��y��xE-~?hK��t&��'I�\^�����YV�~��g/��P����L��J���3�):�Ca�}i�=��$��o�c�9��h`���U]�9���R����;��P`����������$��'>Qp$��������}���O�|��G+N�����
���o����<���E�+L�����
�O>�����#�^{m������"�
@GTu����'����,,��{��[n����`�������=��$�g>���u�]9��C3x�������`�
��g�f�q�Yg�u��L��tD���=:I���}-�m�]���s�I�TJ��J����L�:5S�Nm�}%�hO��t���7.�R)�zh%�$�r�Q��_/KC����7�E��M���{�V��7Q��>��`�����A:I�PO:I���H�3�<3�����*�*�J�0aB�����7]U�?����r�r��R��*���%�
@GW��r��`����UE�w�������E�+E����*
��������o:����:(@ �t�)@ �t�^�^.��V��7�Am��O�<9I2`��"���"�
@gQh������Z��7�EM�P��D:���D:���D:��7a���y���2n��|��_��;��^�z�T*�T*e��Q�}�W^y%��vZ���}�f�UW���o�1c�����n����,����FGqDn���V����_�����������K/���^�O���u�Y9���Z�O��`y)@o�����^s�5��_������}�k��&_����$5559rd��k���������W_�9s�����N]]]���o��g�o�W������w�=�X��w�q�l������?�O���h��2n��|��_\��L�>=c��I�0������9���+��;��|��_�^{��?�0g�yf=��l���+?�K�[���(�}��)�J�z�R��y����=�8��V����.���3�$c��i�|o��N;���������y��e�������Z������7@gQSt�r���T�n��r�����Kmw��'�w��I��o�9}�Q��@������
�
�{��G��_-^x��L�:5I���[f��6Zj�>}�d��w�����>� ��w_����
��$����7@�Wh����[d�mj�����v����;��Cn��������w�����j���z��+������6�^E���Z���3fT�����l�~��5y-I��k�-:����od���/:�������=z4��g����Y�f-���9s2g�����3g&I�����s�.o��P]�ra}��i>��V�RWX��_,����E��s���6r��O��*��J�)@��_����??W\qE>�����iS����3v��%����;��W�"��}�������;����?����h:K�X�[��=���?9pZ��\q�/@�>}z.���\v�e�={v��T����������GU�����������r�)�T^��93������V[m��%��sGa}?WwBa}�<x`a}?��G
������gwT�����I�����RE�������^�K/���>�(�
��!C��w�&�����\�����*�r������H���z���w�i��������M���K]]��w��=��woq�,�9�K���}Aq��s2�����X���E�{�k�"�
P9��'FK�w�*����zkN;�����������o��_�%g�uVJ������������3f�\.'Y��<��c��o}�]c_��7��r<y��f�/�f�k�8����:�����_d���)���dz�3f��s�����3n����93����3a��$w|���������o~3�
*�#4i�m��?�����_���!C�$&�����m��:��";�6mZ����f��)�����{��n����NYc�5�,L�������	r�!�d��	)�����GN9��L�<9�^ziU%��d�����4i��L�2e�m���<��I�^�ze����"�D�{!�o��������:�f�J�T�a��7�|3O>�d~��L�6-?��SS�0���;.��w_��r���/��W_�E]�u�Y����LGyd���?��R�]~������$|pz������z������
-@�0aB�d��7�u�]�~��U�u��-_���s�I'�\.����J�T�����k����{�o|����O���K/��7��D��{,���w�$���9����5FV����7@gQ[d�/��BJ�R���/�{��M�9�����8�R)��
�����6�k������+�����V��z���y���������s�=�7`����G?��Q��`����?�cF��}��'��u�C=����:�g�N��;6[l�E}*�����7@gQh�{���$�L:/z���k���d���9����z��g�m��O���x>I�?��|���9��S2{��\w�u��������[���o��3�h�@���^H���+���?L�TJ������g����A��GX����O��{���.�,��~{^��,X� ���^��k���?�s�Zt�� �o�o������UWW�.��1"�r�U��������/��_��������Z���*
�K�R���"����@�z����)��-jW*�2o���
���7]U�'�K�����jE���#+��%	uIw���7�A��,(�{h��t5E@uP�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S���F��R���?S�L):dh�8@���$Im�t%�����l��C$�r��:'����C-:hr��SM�P��$�-:��6WoSX���XX������>���f����*���5�X#[o�uN<���s�=E��E�sR���n��������;wnf���^x!?������{f����[o�Ut��"r��Sm�tk��F��g�l���Y����[�����0aBn�������}���y������f�u�):dh�8@����}�����?�����*K�;��S��O����k����S�f���?~�2�9g����3��z���I��s�f��������V.���5=
��.u��-��������v\��z�A�'���o�T�WJ�r���$��I�2t��JR�������;,��9����c�.��u�]�^�z�Y����?������o�j��Vt8]�������Tt�[z�8������<Ir�Yg5�`o����;���Qh��v.��G��H��CW0��;
����
�{��������9sf�����
�4.�
P�����A��o�7Z���wm��H�>���T���&MZf�������-�~�����{�6��������!������_*���f�w��������K�hi\��z�A�'���o�T�Wj
�����Z�r<c�����$�GvIDAT�q)@����N�x��W/.XIr���*q�=�T�7�|�#��#�q)@�/��R~��_V^���-0Xqr���6t�%����^f���z*���_f���$�w�}3l���ZL�k�-:�����������d�M6��{��!C��_�~���[�|��L�0!������$��UW]Up��$9p��Az;x��W����.��~���+��2���^;E�O�sS���.�����?�C{��<��3�6mZ�y����3'}����n��w�9G}t�
Vt��Tr�]��6��&�d�M6�	'�Pt(�R�������:(@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t��M8�oq}o4����B)@��\�Ma}O<~ba}@5�):��t�(@��t�(@��t�(@��t�(@��t�(@��t�(@�^m���lx����=���
�::�t.��-����7�����:(@ IR[t��\z����=��=������[�{J����0�+h���)����O,�o���):��t�(@��t�(@��t�(@��t�(@�^m�����ZX�S.8���:��$
����$
��W[t�����.��1��YX�]U���D�h;��,��$
����$
��W[t����z����x�������7��D:���D:�j���������*�o(�t�����m
�{����3�����u>�����*QStT�$Ij��r�Iw�����,�o�s�����u>������Q�T�B���<��(@����`���)�/sp��t����������b����
��twa}��l����&
���6WoSX���XX�@�S�]�&�RStT�h]��-����7@W&G����@��S�@������o���)����O,���B:T�"�4htm
�������������h
�����[�{J���Z��-�,����7I���KO�����\�ga}���
:����:�
�@�Q��z��:�I[lY\�#.-�o�*��[l�
*��,��$~:����������
O�����\pPa}�1(@(P����Ga]���g�������o@h������G\Z\��A�7>-��.m��o-��)TX�Q�s�$����u���������"��2�t-���9"���CQ��[\�
��k��hFM�P��D:���D:�����o�9�~x6�p����#�.���/�03g�,:<h�o���������?G}tn���F�O�>=��O�#�<���G�����v���(`���:?�ml���9���s���'I�^{��x���j����{������C=��_=x`z��l���G
��t
������J�}�����w����^�r~��1��7���/�8��_��/})��Q�@��������������c�V^����l�|o��� �m�]�����w��^!@�����m�����[o��$>|x>��O5��[�n����Vy}����K|���]��6t�m�U�<��e�=�����&�
�u(@oC'N�����l��:�d���I���~;��Oo��������m��_�o��F��_����@���������f��Q9�������������3gN���Sy����-I��{�e����hV;����~����w�G�����G���/��$���n������_W��m��"����V�]EW��%��"�hO]u|+rlK�o��o����-1�u4�f�J�����#�|����g��0���U������7�SW�<C-����d|k��B�0����:wK�o�/�[������m���.�e���*��RI���;7����>��\w�uI����.GuT���9���;�u��$^��l��E���������~z��o}+��rJ�����{��_�~)�JFFW0s��80���zV[m���h�6��2����
���o@ge|�=�����5+���^���B���w�Y�����tV�7��2������Rt�[zZu�U����5I2{�������l��GU������vuuu���k���������
Xm��|A���
���o@ge|:+��Y�h/}��-:�NI����w�Y�����tV�7��2������Pd�������E�����N���}��&��"�t
�����o^9�<yr��m���P$�o��Cz�f�m*��?��2�����y����$�Zk�����������g������Ch5�6��2����
���o@ge|��A����w�Y�����tV�7��2�������T.��E�Y�}���k���$#F��=�����W]uUF��$5jT����v��#�
�u�
�mh���Yg�u�$��{o�|��&���??�\rI����#�%>h	�o��Cz���[�:������;.��M[��������~:I����f���k��Y��]G�\.���3�7o^<���u�]I�u�Y''�xb��j����{�������&IV_}�<����z���� �
�5(@o�f������������f�
6�
7��]v��#������j��+���On����t�M���>�����.�����a���� �=���{'1��<��s7n\����f��wN�^�R*�R*�2j����+����N;-C�I��}����f��7��1c���O��g���0n��3'?��O���{f�u�M]]]6�`�t�A���k�`����5��Q�FU�7n\��|�������kF���s������j���{���F��l�Y�f�3��L��
6� �&MZ����V����Zc����V>��)S�m�%����&�R)555����������j=Z*���g���1�E�.X� �
jt}K�s@�&���t�9=��:��%�9p������8�4�:n-J(�8tRe�U}�s�+'Y����?~���������g����[�n��c������j�&M�T�j����n��V��_���q��x���W���������[om4N�t�I���������j���s�=����_f�������~�J�M7��<e������u�j�Zk���W�O�<y�m�>��J������W_���t"m�m�s�������o�}�k�����T���)�>v��mI�h�u�&,M��[
������C�T�U��?���5�\3�����/��B����k��/})IRSS��#Gf���Jmmmz��\}���3gN�>����������J�k��q�����~����^{-I���������z���?��O���+��?�)>�`:���w�}����
�
tM�=���~��w�q������o�{��^��t.�<wk�?����w�}+;�o��v���;2`����/P��y�j�5g�\�����\r�%I�=z��n�����:��Z����f��y���+��/���W^ye��`q�<�X�j�����&t4�<wk	9p�z�y���$�T���������O?��?��?�?��O�r�\����Vh��i���W[m�r�rMMM�w���my��r�^�*�E���l��t�<n�9����#�s��mt~��Y����W��y��-��\n�1�%����'?)���T�]x����)���Z�n-�����^j�;�n��V�1cF��:�j����]s6�����s��{l�M�>}���sO�?;����z����?�������w�-������9�����j��,M5�]r�@[�:�j����KS��V�,K:'�Z�g��j�����2s��$��1c��	j��v�y���SO=5������cs�u��Z@�W���/��n�!I�����g?�YjkO]V]u�\{����'>���g��?�aN=������������5���|�������[�\~��=zt��t�:wk��O?����/��MK�x����o~��={����^��[����={v�<���|��I�������n���o�\�:��Z�}�����;2g��\y������������k3g��$���������Mb�c��9=��T��%�9p�����[s������qK(�8tN5E,]� I��_�u��N<�����;Ir��7���>Z�>G��R��R��$Y�`A~��_d����l����W�-j�������s��g�
6H�=��kd�m��)����^zi�}�|���>_~��&��u�]�6�R)�<�H����J��N;m��,�u�]�C=4�N��=��G�������'?��?<?����������,�5��n�!�r9I�����Yu�U�������#�8"I�����"a��q�1d��qI�'�|2'�tR6�l�������E����'��-��2}��M��=3x��q�������c�=V������R�m���v_�����n���N�T��k�]��-��g��W���|���L��}��{����?[l�E��k��q�y��'��CV�i��Vy���*���nh����)S*c��Q��$o��f�:��:4���ktnQo��f�<����������������f�����~����)���Ww�u���v��GWb�|����n��1�v�?�������d����u�]���t��=}���&�l��w�9_���3~��,X�`�?,`	���|��3b��J�}�������Z%�n
k
K�����f��PI�o������[%�n
k
MYs�5s�!�$I������;w�m����$��a���V[�Z�h�hK#��1�K�qt�������h+r�r�P����c����kN9pkXhor��h��_�]�UW]UNRNR>���[t���?_�f�-�l�����_i�m��p���������+�������Y�+��R�z���l������|�y�5��
7�Piw�e�5����Oot��~��M����*m�����;��S�i���g��/�p~z�yT����;T�?��c����~��J�#�<�E�6e��}�UW�����u���q�UWU��7o^��_�r�T*-s\�}�����M[���s�����SNR�i�������c�{}��h��_���J�#�8b����{n�����1p���^� t+2��������81o���	'�Py�w��������b�<yr�X������k�������+�����W�e�,?���M�{�����w�^�5kV�m�]w�F������d�-��������k/qn����1��?��O_�t"�0w���{*��^y�����={V��|���������5��������^s<��f����ry����o�}��M7��<u���?lY�Z�����z����*�~�������o����'�l4�y�������s4s4����9}K�^��
�a���������������nr��Y���U��%n
�H����6@U�8qb�x�vh��;���o��r������1}���������[�����&�l�Y�f������y��7��������N�<8�F��[l���?w�qG~���f��y��w��9s�����k��g>���J�����}��M�u��w/�����u��=���{�s'�xb}��$���3r��l���Yc�5�����_�#�<�x`~Z@k�[�r��p�n�2t��f��T+����un�������9������;�{��y����:�T��5*�\sM��c�1��=��#���J�}��\y���>}zx�����y����*X[[�=��#��zk�x����5+}��i��c�+����_=\j�=������o�9g�uV��G�9�����n�e�������[o�����]w��?5`Q���s��G�7��M��;��?>��
k��^y��|�����Y�r�a�e����k���^{-��/�������?�S��>���C=4�����)S��_�2�?�|^���1"?�p��v�F}��������2w��<��9����4iR�z��F��}��9��c���[o���c��s�E����9��#����'I���:(���N�����;�������	�� ���Xs�p�
9��c+;��q�9���W0��Y�B�����o��F��g�L�4)I2t���~��0`@��_^������g�80���z����|�s�[�M���={��QGU�M=��
�����^����=�h�������j&nMG[s������9*������e����k�>��f�_y����'�p�
����,I�c��)��7o��<��J�<���,�f�������r�rMMM��GY���!C�I�k��Vy������o��\��.����{��Q�={v�v�����{���[��o�]�-j�]v)��GK�L��M+���K=]A�����S+��������W�����/1�����;Iy��6[��|����+m�\s�����%�L�>�<t��J��O>y�6]tQ��-������?�����;�kkk�I����[���'�X��K/����AT�%��8��7����.�<t���������w�����[���s��z�����,�]�����R�O�2���{�T*_q�K��;wny����{2d����x����SO=u�{\z���$��={���n�r���Q��hw���V�s���7:w��V�]r�%��9<������AgW���\^r���.���+�J��/�x9?U�X�Z��1=n���s�������F�w�}���3Z�9��5�5,�Ok��^.��g�yf9I�[�n�7�|�Q���gW~s�1�S.��m���9@�T��~y�^��
���������8t4E���e9�EY�B������a�Z��������J3f�����������k�����O}*�\rI�u�����'f���I�u�]7�_}z���D�8 c��M�,X� ?���h���������E�������������������7j��c���>ht�����`��$w�����R?�Zk��-��r�������������{V[m�$���s+c��(�J���~�A�-��\P9������O}j�6�����7���={&Y�����i-:f-�U�\�����$9���+�.�n���M7����W^y%�����A�n�����.�<�2��~z����$�&�l�|0[o�u�����~7{���R�_r�%����$'�|rF��D�������?�6�l�$y���r�-�4j3t�����I�=���.���������K���5�[Ir�	',�3%��a��9����k�'�x"'�tR,X�n����+��)�������5,tni����}.S�NM�t�A���;��o�f�Y�������/�T*e��������������{�%I����d�@����^���#=�h	���!.�N�::������7�5,M��b(@�*����W�[� �aB�$�f�j�������7�xc����N�,B����|%}��I��?>�g�nt~Y�����n�i��s�l���l�����w����?��K�Xq�9n-�������m��2t�����:uj�|��$��o����Km�������J���3'��zk�����'���k&Yrl�8qb�O��d���0�-��z�������&I>���,C�8������?��n�q��c��Fm��}���3��O���6
��R����[j�����v�iK\����&��O�<��3��6I����[S�N��S
��A�e�M6it��
�V[�9MJm��9���W ��g
�[GZs.z�SO=���m�X��o�#F$I������W^�$�h��*m��9
����k�KP�:������Xr��&��j&nMGZs��[�B5�7G�
����}���y���������l��w����nI�����y����>|x�x��	��5|�5�d�0!_��b�=��.�4:��V[e���O�pb1j��<��C��^�<c�>���R�������_���Gmtn�$���>�w�y�r�al���Ov�q������_��/��D�d��A��8��{�e�=��5�\�������d��������6�s���Yu�U�z~��i�2eJ�d��6�����y�e�[��s�4z���3���w�M�p�����f�UVI�x��:uj&O��d��V�p��.����*P�X�����������(�V�a�j��\����<��}Z�Mi����_�C=�d��������$�F�jv<XY�hT�K@W���2�����+�����N�������h/
��J-��t�L���GU�v?YY
��,�[o�U9�l������m�6IV_}��U������w����>����x�����?^y�3{���B`�]vI]]]��w��-�_~y�����:���[�\s�����;vlz�����f?������^��oE���|<����FI����w�=������E�^�����O?��h���9��c��_�:4_���s�
7d����~�eN9���q��^_|��m�gk�[�$��5n%M�G���Z��~����3;�����{���~�����K����;9������f��7��G�����y�����@��r������;���!=�P��o�V�meKc
�[GZs�p�
�������8 ����YQ��@S;�����a��q��e�������Q��<s4��^���#=�h	���!.�N�::��������j!n�F�S�Uj��W�/����4�����+�g���<������{7{�E6M=ti���9sf�x��$�����r��R�T�2lh7w����Y=�P�������<��<�����?_��t�������r�9�d��v�&�l�k�����,�5������y�*������hLjNQc`������W�4����Gv�y�F���\|���������}��#������z���d���O?�t~���d���Y{�����|%�����<@��?��|�������7��/����k�q+�x�jj��!C�d��I�N�������[����E�6�|O>7n\��v��{�'O�u�]��N:)��A�_|�E��X[�9w�q��u�]��?�p��o�6M�X�B�����={��-������;I�����}���l_+�hJ��=3r��$��������7n\����4�]bXs4��C���tD�yDKx~�,9p9p�fr�����t�5��5,T9ps4��t�R�o�y�x�����_������Ew�����m��C��v�j��K�	&$�xR��6����I���g��7nt~�����Y��!C�?��?y���r�wd����{��+��L�<9�{l�����k�qk������W����s�����{���k���6�t��J����Z{�j�����k'�x|��'3c��$�'�
�
��_~��������{��s������<��3����c�9&���n��;\]z���m��Z����}����w��������~��BbY�q+�x�Z����F��$����7�|��������y����|��u�M7�������K�R�?��<��3�2eJ�����3&[o�u�����?>;��C&N����,�k�v�!w�uW�Xc�$�#�<��	�e�������9{����o�9���O�����c��d
]�����,��z��1����������t�����#�h�#V��@K�����8T9p�X�h:��S����9�K:T�m���r����7�~�6C�i���0�M��_~���/��R��a��E�������{�%����k�Fm��o����f�wl6���{g�}��Yg�����+��O�y��W9����/�K��>���V�T�$V������zj���VZ{L>�^~�������m����v�m�D�i������k���*�J�v�ms��'����e�x���y�����{��\v�e��h�s�=7g�uV������.����X�qk��i��4�6n-���O<QI�-:6lX���w��_|1o����X���������������/�����'Y���g�������s�������J��G����[�N�����u�5gC~���K�|�����g?�h
�^�a���q�+c�/~��$�k����,2�
s4��C���tD�y����h)9p9p�Fr�����t�5�x�v��P9ps4��t�R[m�U
�$�4iR�L�������~x��$I�^�*!���a�*�w�y�2�~���y���$���J��D�UW]5;��C������)S��?�1�����O?�t^{��<��I~����.�g���O�<��r�!I��s���G]��@W�������_9����������+�x���������f��q�M^����X
��1������
K����h��=Z�T*e�}��%�\Ry����:���s�9���[��V�����k��n�$y��3u��e�_�qk���j��|�UV�����D����<��r�����MM��e�q�O{�9?��Oe��	Ys�5�$�=�X!	xkX��:���G�����*�5$�v$n/����-���QGU���h�h]����%��:������<��������[�BG�Q��r���P
����h?
���y�������Kmw�����>H�|����5��a�V9��O~R���)�^zif���$9����������G}���??I��[������5|).X� ��w^��������FU��	�\k�[����?�i����x������N�pg���m[<xp>��O'I^}����7�Yj��S��W��U����.tP����$����+��������g��vK�����[o���'2B[;���s���V^����w���v��a�V.�s��.���y�r�E-q��6�t�l��I�G
;�-��5�x,��������>�����}��_�~Ym��*1��=��C���	��_�$�����e�����3��^+�:����lH�7$�?�����?�C�������c�=6;��S�
�a����O,:�
s4��E���tD�y����X^r�r�Pm���c����kN9pkX(��9������������|��������~���O�r�rMMM�w���m}��r�^��I�����I�&�T����������������ORH �������/5t�E@��j�/*��;x���iB�R�����tBBH����1!3�I()|?k�b��;{�93���g��3��kg��k��DEE��Y�j�����n��?�l�����[�����H2����Y[�b�du���;l��Z��|���&,,�n����3����:|�p*���2����Gk�=�����M�=222��5j�(��jK��=}��T�,X`������;w���x���U��U��O8l�x��)��������S�=���v�<x���g����
v��%���w����Ss����k�I2o��v��z���4���������js����f��!V��+W6���v����o��o'NLQ��/���{�����;f��j�*�}��3�j�?����dc�����
�14i��n��w�6����jk����}Zjx�{XdM�a�2����,Q��Uw��1�5111��!///�z�j�n�
���=,��;�~t��������#N��s��x� ��,�����K��$�,s8����j2�k72p��i��-c��yd>d��FC��C��c��i��i�~�w�^���]�����'�hs5��j��	0`���K���K-[������n��3f(&&F���[o�B�
w�V�7y�d��QC�����+��Ci���*_���^��5k�h��2�H���i��u����Ayzz���������Y38p�����W�j�l��9sF/���F���M��^�z*]��r���K�.i����;w�._�,I������+���d)�y����O���?���S�;w������H�":z���N���G�J��U��W^y%��!=�w��>}�h���
S�z���O5n�X����4m�4�?^�T�B�7�a���5��3��-  @����Y'%_A���TS�N���SU�B�r����/�bbbt��	-X��������#F��`Y����5j�(������^�$�=Z			z��7����J�(����k���JHH���5o�<u��I����_���3g����$������������65k�,Ir���f�������+W�ZQo��
3f�
,���[�Z�jz������3g�h����VLM<�@v��_�9�j��Z�~��7o��/j��j�����[��y��V���=,p�e�y�^��������~����k������Q�N��d��n����v�a��%#��fV�F��-3����	�2��E����FNd5����3��y��Of����yd$2��
�JF��dGIW�s����o:l�����V5�uqss3�G��#�O��,��\�R�Joc�9�^��i����]�n����&������6CBB��?�w�nsu ������}�L�
��A����3�},��r�17WI1b�qqqq8��
���������U�>}l����???�����\�|�n������7����S��������������������h�������.E�5��mK�����'��X�bvk��o�������n}Mh����c������@V�Y_�9��{��~��(P���z�����Ki87������2����N��tf��D��_7;v��===Mhh�S�M�����E�v���f�����5dN��5}j����p��s8�w���IdN���8�c{2�������@F!O�?������,`��j���&N��U�V����JHHP�"E��ys
:T��W����-[V{�������h�"���S/^T��9U�X1�h�B#F���>�T{�����q����b��?��Y��Y3���X+�8Z��_�~�T����[�_~�E����u��5y{{�x���W������&M���H�N�[�*U��]�4m�4-X�@�����?~U�RE�{����?�pe��)G������)S�h����������n��z�����kW���u.�7�����I�&Z�l�$�z����'��v���o�^�Z[�l���{u��1EDD���M
P�*U��S'���W9s�t���-#G���������O���I���o��������m[}��WZ�z��=���H������R�N�4d����%J�t������+{�����N����=��/��u��i�&���S���.^�(c�����
*�E�<x��)��# ��x�Y�rem��A���:��v������k��u��/���V����������C.T�=�d�]�~]�;w���~�Gy���c�adV�F���7�/YQV�<"-��@z�����8�c��&���$�=,��x�����$>����Y&��p:@'���	�I���'�$q:�����	��p:@'���	��	]�|Yo���j��!___������E...=4�c������7f�p�m�����3f�m���i�l��		�n_HHHF�+���/�����N@p_J�l]|||T�X1�n�Z�����s����.\��Z�j��w���]�)c�=���!��^�������]�v*V��|||�����y��r�������}�]m��Y���=�U�^=����i��=�l����w� �v�7��I��d6��������S��f������0a����O���wu��QIR�����o_*TH���!d3g����>���������}��i�����=zh����x����3g�m�6IR���3v0�!�o��;��������C�DQQQ:x�������G�*22R����:t�p���b�
IR�<y�v�Z�����>�u�x'5o�<+�����z��e��F�w||���I�4|�p���~X;v��>(oooEFF��?���m��y�f��qC���6�0`�p�F�1�-[f��N�:e�h�?�ode����w����p:����U�_�u=���Z�h��1z����I��IIR���	�������x��v������^�BV��
g���/�`���W_i��v�###�p�B�����bx����K%IU�TQ�R�2x4��7�2��{��;����o8��������l�2������C:x��*T�pW��q��$������ m���[EGGK������]�r�������eJW�^���/���2�7����������5��Y�����CY?>|�a}DD�>���h�BE��������U�fM����vW�0`�\\\���b�n��M��/7n������5t�PU�XQy�������+�n��Y+��s��q��H�N�>���G�z����/_�mI����������>��%K���G�r�R���5d�m�����
		��		�t�?���z������<y��~�����/�/'8#44T�
R�
�'O����@�j���^{��d+���I�&�}��*V�����������+��g�I���(>>^�&MR�F����/ooo�+WNO<��8������1��u�F���-[�h�����R��9U�hQu��Q���i:��:���~���y��U�z���g�����w�6������7i�������O��y���d��v����jz���Z�qz��s����%IK�,Q��]U�D	yzz&��������gO�,YR������U��5|�p����n�~������km�9r$���;w���������U...z��Gm��X�B�=����-+yzz�p��z�����S'}���:u�����o�o�o��D��iC�M�
����$Y����W���7o���o������'k������			I�o�����x��aC��._�l��o��~�76.\�9�c��Yu���7k���y;����l��~��T�P!���z�)g�����[u��O73g�49s���V���MDD�������2���w�x����lc���&  ���nnn����w8��/���k;|<|�����7��{���m����6k����P��9|����6l����y��ooo��?~�n{M�4q�yz;���1bD��2-n}�'��y���D�6�����x����$S�X�t��tn<t��������;v�������Q�Fo����y��'l��_~���{��Wl�k�����<x���y��Y5_}�U�m����C�N��O>�d��!����
�!�&��u!�N��;m��SG�M�
d59�+..N��~.^����)S�h��a2����C�:uR���U�P!]�zU[�l��9s����C�=����3�<���;K��t�"Iz�������&��r����+W��?������/I*W��}�QU�XQ:z�������{�j���j���~��gyyy�������w����Hu��M-Z�P��yu��	����[�]�v�I�&����$5j�H���S�%�����{�*$$D�����_~�7nh��I���U��p�By{{��'�T���������wk�������O?���^zI�'O�����GU�~}�?^�����^�z�f�����UXX�����+V������2~hh�:u����X����M�6j�������k�������k��&Iz��WS��6m�X+k���+((H��U�����q�F}���8p�Z�l����m������P��
U�n]�-[V����~�����}�����w�<��m�j������u���;4v�X����w��j���r���}��)88Xg�������Y3���K~~~���>���l����3f��g�U��y��Vj
,����Z7�|��7O��'O����s�qqqZ�r�$�c�����$=��s


U�%��_?U�PA111��m�<==%IW�^U������(���j���q��6o����g+66V_}���\��Y�f%�'q��r�����{�c�����&�6j�(-_��g��=��C)_�|�����c��m�6m��!
G	�>�o�o�o��D���#�N�{�o�>��g�@FQ��u�����:???s���5{��1F�)W��9p�������o�)b$���s�K�.9[�&M��W�^V��1cl�do^|�E�n��Q)jn]i�����[��n�QQQ�t��F����6��-�Yn�5kf��v��5IW��dz�!s���u0�r�2�����9{����Z�Z5���;�]��cV�Xa�]���w�O��V/X������l�{��)S�rek%x[������l����O��������O�c�+�o�������m#!!�|��V;�������+�'>>l����/'[���a6�Km�;��K������������9x��IHHHs{�V�w��M����������'��;�\M�u��Y��Y�&�����1:w���y��O<a���Y��_���}���7�U7��5�Y�����<R�`A#�4h��j��_3(W���d��>..����I�L�2�f���v������_�����D��<�������'��/9
������;��O>i\]]��7�x�f[]�t1�����9r���~��Yc�7v�X�cs������

r��1���?���D�l���g�}���/�����5k����/___#��i�&���d�9��C���5r�H�v���)���7��^�zus��u�c���������y���777#�><��7n�B�
Y���hR_~�e���j����d��-ks��������u��)�K�������)jR���s�I�I/~~~�i�����_6K�,��e�[�N��a�/_>�1�r�J�c���jZ=����q�q�F��I����H�����7^^^�l��n�/n����Z��.]�l�o��fm[�j�qww7�Lppp���'OZu}��I����3���_~��C`������E���7������������>����������5k�����$I}����o��b���p-]�T���K�-[�a_-[�T���%I�W�N��g��a]�����T����'I����/��b�.g��<x�S}�w��k����v��I�6n�������m���|�A��[�li]����Sl�5k�u��������������3gJ�����F�9��P�����#)�}�u�V�;wN���EU�R�n;�V�<y�4����aCI���K�.9���'��bw{@@��qI�����|��4�%��{�<���,Y�r��%�}DD�6n���>�H�;wV�B�4p�@���_������0�k�������m�6E��z�:c��e��GyD�����V�A�)W�\v��\�R111���={�D�vk{���2e�H�v���c��%�h]�����mK����G����<`����$������s�N��H+����;B�M��,�o�o�~�#���<��3g&���u��{zzj��%���;wn�9sF���O��6o�,I�������Sm���������_�7�YW�zu���+W�{�nIR�������� /&&F��S�
l���_�a;E���_�|9��~�A��c��u�T�u����[�f��y��/���$I��SLL����$I��m�j�7o��
OOO5l�P�}�]��|'�����o���%K�{�n�>}Z������V�N�R�|�����aC�x���EM�4I��c6h� ���Q�=I����:t���7j�������g��d���k��o��V��������7��kW9rD�������'�LQw7�����k����N�:��
[R�RL�/�j��a����Z�j��������Y�J���W�RE�����K��~��d�&��5�����u�Vm���f��2����U�z����?k��������z�)5m�4�_p�wr�������D���N"��'�����x�b�����u��	-Z�H������=�w�}Wu�����_�}�?n]		QHH�������{�������K�.i��Q�ICn[N�<i����o��}������������U�EFF���+��2e��+�Jz_�\�R+W�L��aaa*R��$������S[��������C���k�����m��+��V���9#��{�\]]h������o��n��o���
_�\�����k��=w�~2d�6m�$��_M���Om����jjW�����c_<�R����9c]w��$l�$�W��7m�T�-��}�t��y,XP			����f����w�����C��|���d��K������_*""B��/�����3gN��][
4P``��5k�9��8���_��7��������o�o�~�������sg���gO����������g�I���z�n�l����~ccc�����{��
��r��y��M�oW���EM;Z���;y��^�j]���Nu_����vDDD(00�
��)�!C���O?��_�E�i���Z�x�z��i���]gnS�����4�;��{�����Z�jz��'�~�z�]��Z?::Z~��m�����j�����j��i���v�7w��������5k&__��GR��OIC�<������1�
�w��e����
4����/^����:q�D��[��QC{�������^�vM�7o���c��U+-ZT������p+�����wr����������������{N�{��$�_�^_|�E�������e�I�%�����Os�c����~%�k��i��i�������!_��;-���^x!���d��6����N�����t��N���/����q;vL�'O���?���{�k���T�+�t�����5�s�N��3����-Zh�����k��������g�W�H}��w�l�Q�����K{���t��M�R���3���s���_�f��������o��7o^U�^]���N��A�d�����[�(QB����t��6m���c��}����w��9=���


J��8B�m�_�����1�o�o��������~8�����U��~�m]�t)���E�Z�O�<y����oxxx������������s���O������z���/��?��#�zgj��5k�H�r���	&����n��c��n7���H�"N�-e�s/-Z�ha]?s�L������4p�@c�������'{���Q���K�J�\\\��c�{��$.\��~���T�>l]����X������z��M�����o��Q��d�������T���5r�H-_�\.\��I����.I
		��;Rm�������C�M�-���D�
�_8(\��F�!�f�=v��d�5j$I��U�����4i"IJHH�����Y�����C=$I��s���;w��NM�F�$I111�:&��U�B�
6�����K�:u��I�8[�_��-[�����u��YIR�|��7o^�u111��q��������u��Y�����t�R�=��"1<��p�vG�;�N�:)&&F����3g�j����~�\]�d�$�V�Zi�R��J�J�b�#IW����K����O�����s��P=���/j����s�b��z�����������C��OX������@R����;����["�&�&��G���x������)I�����YT��m%I�������{O���_?���o�����{��$���_����G��~S����=:����������t3D���O�=�
�P�B�n�|��������`����������#I:���\�b���/�H�	���S�n?s�����kI7W�n����mK��;�|��WC���~8������]�v�p�����"-������������s��w��[�k�N^^^��y�������[�`��/T�^]�J��Y��K���c���qk_�N�K_~����gVw$�����n�-���V���#�&�����5�o�'�@*
.�A�I����S���{����C�4x��T����0}����V�N�:u���G�$���W�:u�B:[�1��u�^z��t����'�T��%%I�'O���#k�������o�������v�[�n����w����>������W�N����^{My���$�����������`����(M�:5�}����g�}V����g��6W����5r�H�n��R�vmI7#�F��Y3w�\���in{�����ys��_�rE=z�Pdd�$i���*P�@������O?�T5k�������v�������������������{w8p@�4|�p=���ij�^?WW�Xa���:uJW�#��


�ts������/����K���~~��W���4@		�t���J�*%���#��W(�n���1���[:s�������4s�L��j����p�wr���"�v�����^"�����@V0r�HM�:U����8q�^~�e)RD��Pd��I


Rtt�z���q���C�*W��r����������m�6o����8��5���4m�4>|X{����5kT�dIu��M���S��s��i���Z�n�N�:�2e����?��~����l�25n�X���7n�f�������j�����Utt�N�<��;wj��u�r����-���Z�`�����.h��e*]��z����5k���W�/_�����+V��?�������%)  @�|��:t����������W_}�.]��R�J��+�"##u��1m��]���bbb��;���K/��E�i�����z�!�Z�j�~��6n�����Z���j���V�XqW��=O=������/��R;w�T����s��i���Z�~�r����;j��EN���}{�]�V��������7o��9sj����6m�N�>-��
�~�a������;w�o�����V�&MT�N/^\~~~�����#G�r�J������e��8p`�����/�~�zIR�"E��ys-Y���>���j��U����s5q|e���C=��6n���c�~�z<xP��oW���*U�������4k�,�/D�����2�-�K�V�%��_Y_.H�*|R��5Shh�U�����M��������1c���o�A�j�����//___��������;w��<�W��m�&����_����� �&����2'��J�(�>}�h�����������/����>`�k����Ok�����{���<==�?��S����e�=���={����5k�,��b��Eo��D?���o���\����N�>������wqqQ@@������K��_~Q�=�}�v�������r8�[�l�R[�lQ�>}t��!9rD���������x���www��U���#���_��K�R�������`:t(���~X�&M��a���Q?��c��|��i��9�����k����}�j����������_��)_��V�Z%__�t��^>���-�\�r�������Vhh�BCC�����j�������������������O�v'*Q���?��w���z��u�^�ZR����(W�\��y��v��-[����)�j�t�v>\&LH��f��9������Z�����m�&�=			��e��l�b����k���i~�C�������m#�&����2'���^}�U��9S����:u�F��b��Y�[�n��G�j��9�
�.\PLL�r����%K�j��
T��'O��S�\�4s�L���+
		��M�t��1]�|Y*P����/�
�m���S��m���L�2�����f�-X�@?���N�>���Hy{{+  @�*UR�&M��C�*U����H�R��m�6-]�T,�O?��s��)66Vy��U�����I���[~~~6��U������o��VK�.�/���s��)**J�r�R�b�����i�������^������~�IS�L�����o�>]�~]j����~�iU�TIc����G$u�
R�j�����j��M:w��r�������C�>|��)�"�OM�=T�jUM�0Ak�����-www�/_^={���O>)OO����z�
<X}������y�fm��]�����?���hy{{���_+VT��
��W/�-[��o�������������26���
��~���~�y��������#G)RDM�6��!CT�V-��t*��^��������/;���&M����~���k��O?i��}:u�������������UK�z�R����N"�N����;5������@Fr1������C�j��)��?���=+77��iF�
7�f��uc�|�rIR��Y�7����n������=+I���S���!���cLF����I���'�$q:�����	��p:@'���	�I���'�$q:�����	��p:@'���	�I���'�$q:�����	��p:@'���	�I���'�$q:����$�����8q��.^�����;���������a��� �b~�]1�����dW���W���3z�
���+^�����dW�o�+�7����(#�oN@�N�8��+*:::��w�������3zpG1�����dW�o�+�7�����8�I�Y�7������+�7������
@v�� ;��������/*::Z�g�V��3z8p��\�Ro����l��
@v�� �b~�]1���8�>}��������E���x
 �b~�]1�����dW�o�����9=�X��j������;������d/�m�+�7������
���������+�7������
@v��w�kF�9p:@'���	�I���'�$q:�����	��p:@'�w��1c���"m��1��@����/N@��:;{i��iFIl��1M�Mdd��5kf�S�hQ8p��4�k�������:{�lF	�]F�����Ggp:�4�x������+��[��b��;���������������4c���N"'GJ92z�~/^�jM�����H��1c�h��1=�����Sj�����{�j��z�j,X0�Gvw���(>>>�����5r���{�<�"'�m���;�s��=�G�Q��-��_I�6l����N~~~<������`I����Z�l�E�������e�6l��#p/��gOd�d���5� ���{�6lh��<����Y�m�wI��q��=*I�����nm�6mZF
p������'� S�v�����K�l�R�����������k���_�����"���($$D��s�N
>\>��r���l[R���O��E)RD������W��5��������v���1c��7n���v��-z���T�hQyyy)  @�<��-Z$I:~�����l�Q�dI����d����������Y�f*T�����T�xq���W{��u8�����iS�?^���W/-Y�D9s�Lu�����_�~*[��r��-ooo�*UJ}����u�l��"E����Ey��Qttt��\�zU���rqqQ��E��iC���_�~
T��E%I,Pddd�m0���?.IZ�d��v��%J���3�6[���7�o��*]�����m>�v�����_���S�R����-OOO.\X�Z��_|��W��g������"777�<y2��e�Q�2e�����9s����)jV�X��{Le������5��~X�:u���S�N������������gE92z@�_�U��uK����),,L��o�g�}�	&h��AN�9n�8���k���,�������7n������s�N}����8q������v�������,c�����O����


U�^���;����K�.�[�n��iS���<yR�g���y�4s�L=��cij744T��u��k�$I#F���_~)WW�k]�<yR={��O?��b����u��q}�������f��)oook{�94x�`���;�������5p�@����3�
����������y���p���K�V��
�����}���>PTT�������;���7��{w�]g<��3�0a�����~[o����mg�����g�v�Z�7N�/V�:uR��1BAAAJHH���S��[o9�s����V���7�����k�����/_nw<�����-[������/�t��U����Kd�I��g���La���j������$I�*UR��}U�T)���i��%Z�f����$c�������7�(44T�r�R�~�T�N���k���z����)S�h��a2����C�:uR���U�P!]�zU[�l��9s����#�!v�w�}W}��$���E]�vU�6m�+W.>|X����7o��n3..�
�����n���X�b
�����q�F���)((Hu��Q�2e�jw�������bcc%I�����{��T�;y������3g�H��W����;�l��ruu��C�4s�L=zT�-RTT�V�\)��!C�����W||�&O��j�>i�$I���[�q{�o�����c0`�>��IRppp��z����%J�_�~�P��bbb�m�6yzz��7n�BCCU�@���_U�T�ts�w___�.::Znnn�S��������T�<y�����������[u��i�m�V�w�V�b�����W/����
Wpp�F�����[��
�l��Q����@�����z�!���O111:v���m��
68}������<92�,� ���c��dv����C�;j����o��6������
@vu��7I�%����M�����lbccS�M�:����I����;v,E��������4��������c<<<�$S�\9s���u���7E�1�L�����K�R�����V�6lH����C����H2���f���)j���L��-�������S�%��}��g6�l�<���6k6l�`�4i��L�8����I����|��'6��UBB��_���d�������m�����^�zY}N�2%EM�N���{�������������;5����Q���G�M��^�zV���w�N�����G�;w6��]�[��1$���_����9�c��m����vX3k�,��

�Y����Z�.[��n[g��19r�0�L����m���3~~~F�)S����GDD��;w:wZ��f}���+>c�]1�����dW�o�+2����o"O�<�e�����;1H/��j��%�_�b�~��wIR�*U4q�D���#E�AAA�J�������/R��y�T�xq�5c����7�����+W�B�
6�*V����IRdd��L���o[���Kk%��^zI;vLQ����9s�(O�<ij�_�~z���ln�������%I


M�����k���JHH�����M��^x��q,_�\?������v��!6�<==5c��,YR���'���y��'���'O�������c�����s�$�a��*U�T�������;�n@@�f��e��������7o^�u�k�V�"E����G�{��$��;�z&5b��������8I)���!I����������z���
dd������<ud�Y'� �}�����_|Qnnnvk_y���������
:�����t�RIR�.]T�lY���l�R��$�^��a�-K�,�$�����g��[�?~���7Mm;
�����Z�jI����O���8l+**��^�B=���N�c���n���n�$yxx����$<xP'N�H��e���}2{�l]�v-E����;w�$�X�bj����c�g��i���A{��={���S�4s�L�A�-�
R�\��G��]�t}j6l(��W����b{���(���4N�<�����S�J��E�[�������/0�2����o"'�JR.�����;�������_~�����U+���(QB*T��t��	�9s�
�o��Q#�mm��U			�n�����#�s���3g���Tk�:w��fV�XQ<����f��i��	N�����*U�8�)Z�����ixx����+�+W�(""B���S�6m�j�*�����7K�
*����>����/[�����l�~
6L/������5�|
0 ��s�����W%I�v��
g\�~]s���$����������;j��:�����;u��%��S{<�N�1F���Z�p�v����'O*22�Z��V�N�R��5S�~�������i��i��1���Y�F���t�K�>�}}}U�^=����Z�~�:v����zJM�6�������L��S"�������g<N@���s�4��9sF��`;�PZ�|�A8p���^��8�s��q�zHH�BBB�����0�k%������2e��Z_�ti������V��'q�rI���^�ti�7N�Z�RDD��n����[k��U��;������t��EI��'�
���uL
�7�xC111�<yr��}����$777��?[/^l��K�.����Y��-X�@���mM������g��{����u��m_�r���;w��"E�����
�o���
��[��
f������
TDD��/_����+g���]��4h���@5k�L9rW k O�<ud���'�\3z@dd�����;#�*�����3gN�����;��-���i������{{{�Z����$W�;���SGk��U�<y$I?���Z�nm7��n�xJ��7R����_=z��$���O�����m��o���;%I���W@@�m�/I��M������n]����/����Z_ q$��cz������M+x��7������>�H�f�����x�b-^�XO?���_||���r�����K�N�<���Pk���g�l�2IR��UU�n]�m��QC{���������k��y�f�;V�Z�R��E����[}�N��S"���12������WOP;r�����G����2����I�����T��=wS����v�Z���W����Q��x��Q#�������1���t�qgV"O����k�����m�������������=+�f�=c����?=����={�H��7o����K3f��K/��>}��[�n����:w�����;����C������`���IJ�x�(QB����t��6m���c��}���c���sz�������@fC������#�<8�p���n��~���T�>l]/R�H��-Z��u�����n�I�����Z����9���UK�������Y�Z�RDDD�Z???+\=u��C�z�T�zuI��Y�t��5EFFj����n��[���~�O���/U$
����c��5���?����Q�;�T�����$i���:u���1�2e���_$y����j���S�7���#�|�r]�pA�&M����$)$$D;v�p�- � O��_d����g�����3�Z]r���=�c����n�����a�-'N����%I���<��~5j$I��U����3
*�b��I�8`�n��
��x��F�Z�~����%I������I�&�������P5q���p}��7�3g��W�"W���>b����/��7�L�R�\9I��#G��?���#���l��k��O<�����6m���Y����K�{�1����}�����4t�P=����2�� c�������<%2����m#�<8dZ������M�f�������t�DFF�Y�f�>E�����@3@�v����������~���6�7���p;�u�f]���Oo���?�V�N�_z,XPm���$���o�j�wK�N�$�z��o������5k�]KZU�^]���W�|�$I��mS�-��������_=�����w������$M�<Y�'O�$���C�
�����]�'NH��T���?�Xc��I���SOYmL�6����V>>>��?���n�����o�>��m������i�������m��a�ir�J�������v{YQ�FFd���6�7���p;���#O��62������.^����@k�r��i����X�b��.�����z�j����8��1#G�nb~c~��y�=�����={�h��6���M�8Q�����g�}���~������!I<xp�|XX�>��S�[�.�}=��Srww�$}���Z�lY����h���;E��T�VM���W���%I��oW�-t��e��{���j��V�R�~��U�m�����U�����:����G����$������s�$�c��*\��m�.)yp�������u�.\�P����=���]��u}��Q6���a�
:4M����h������'Oj����n�%�Z�j��o��]z���t���5QQQ�9s��s�j��46 �##"#�+�7�78��_d�����F�y���8c�����$~��$�(���:uJ�Z��VB�V��V�^��f��������k���4"d4�������
i������g�A������)S��O?�o��*Y������t�R�Z���g���*Q��m�]�Z5M�4IAAAV�=n�8u��A���S��9�?��C��m����������/���G��7�Pll�:w���]��M�6��;�:�����������������dU�V������ys]�xQ;v�P�-�n�:���W...Z�h������'Oj���Z�b�}�Q��YS�����������g��]�V.\P�������;�{����0aB������/]�d��nnnz�����7��j����-[���(��7OC���19+((H|��"##�l�2U�ZU���S�%t��e�^�ZK�.����������g;���4j�(���X�K�xGDDh��1z�����A5h�@����������u��A��;W�O��$��WO������YQ�EFDFt�c~�������6d�d�d��C�yp:�:w���C�]p���l�R���$�a�����������#�;�1
�$����e��Z�h�>�-[��a��<Bd�������
�S�Jm��A]�v��S�����������������;���T�pa
4H�O������{�n�������r�������}��'2�h��EZ�hQ��^�z��7������s����%��
���s�N5o�\��������}�v
0@����|��&O�����E���o�J���Im��I�T�ti�l���o��Y�t��
IR���U�P�4���k%����{�,XP���W����}���x�x{{k������OS������={Z�#w�������}\\\$I			��e��l�b��q��Z�pa��r	��BF�=����-�b~c~C������62����3��q+�����[
6���GyDk������$m��QG��$���C����M�6-���c~c~���]��>�����y��*T������7o^��YS�����9rG��D�[����G�����T�R��+�r����y��z��0`�f����g��M�6�����>��M���G)RD*\����i��j�������������M��*W��
6X�b��]j���.]�$�f(�r�J���Oz���T�Z5���Onnn���Q�2e��}{�;V����BBB���U�V��!C�Xa��H��$���/���o����~��g�������m����={4t�P�*UJ���S�J���/h������o��Nz�{���\�r9�o���~��7}���z��GU�R%���Z���>���{k��e��i�
(��q�
�]1�1���������<%2�L� ���c��dv����C�;j����o��6�����$Y��m&L�`Z�hax����n���M�Z���Q�����p����[��>}�1����a���r���\�r%��Txx�����M���M���������7��Q��y��W��S�����oZ}o���a�?�`z��e����)R��i���Y�p�1��c��Ym����f%J�0�L�%�1����������M���OOOS�X1��O�g�����a��_�&MR��������W/s��
��%Z�l�����)S����+���3�)Y��y������km�k
.l$???�j?���&w��F�	0qqqN��������7o6����h��F����1W�\I�����[m;v�c����M�.]L������G�m�C6l0}��1�J�29s������s�y����#�<bJ�,ir��i<<<�<`Z�li>��siw��j�2�����9q�D��+!!��.]�H2^^^&,,,E�w�}gz��e��)c�����T�\�t���|��G��������o�o�0����f��6���?~��8_�xqF'��Z���d������g3z8�^�N������;3z8�";���dW��]1�������l!#J�����-#b~c~�����-;�o����m#���R���)'�g� ���7�#�6�Uf��m�f�+���[/���f��iv��5�������[�vn
���������o///b�og���_~�������W�^���#i
�.^�h�4ib��9r�9s����pj���V "��1�����m'��'L���OI�[�n6��7�x��	N��I�&Y��G�N�>5�/_6^^^F�)]��IHH0�����Z�L�2%�v��S�2��u�y��SO?���������z+��,�)R����/6�9m��4���W[����K�-::�t����1=�������o�o�0�%�����6����q��y����t3d>�|F)S�����E��=3z8���'��u�����8��4��>�]�@v�� �"#"#���(92"��������-)���������;��62�{+�e����@6�w�^5k�LQQQ��J�*�o��*U������d��Y�F���


�1FAAA����o�\�r�_�~�S�������~=��V��)S4l�0c����N�:�q��*T���^��-[�h��9����������{,]���w��G}$IrqqQ��]��M���K�Vpp������������S�n��i�&��__��uS�b�����k������SPP�����2e�8�������o_���J�^{�5���{��w��I��[Wg���$U�^]�;wV��e����C�i���:z��-Z���(�\�R...VC��������xM�<Yt���I�$Innn<x�S�����[����g�m�����$I���i�����Shh�J�(�~���B�
�����m������~��q


U���U�RE��k�.���Zu���rssS�:u����G>��������x?~\�}���n����O�m����{��+���^�z��_Txx����5z�h�����-��[��
�l��Q��|�rIR���gO=��C��/�bbbt��1m��M6lp��eu�o�o�o�1�!�9��.^��J�*���!C�h��}������@��r���1Fo�����s�=�q��O�3F����8��QrdD����[r�o�j������#O�9�wTF�bw+P����dW�qu���xS�rek�������uS�N�V����V�M*������>h���/�}����xxxI�\�r���6����o�)b$���s�K�.��Imu�C�wwwkU��K������2-[�LvR[9���g���<x�U���O���uu��'WWW#�����O>���~�JHH�VEvss3�'O�Ycz���p��N�:Y����k�����[u���wj���Q��u��=�l[�z�����������#K2�;w6��]�[��1$���_����9�c��m����vX3k�,��

�Y����Z�.[��n[g��19r�0�L����m���3~~~F�)S����GDD��;w:wZ1�%��v�[r�o�oH�_��H2�j�2#G�4���f���f�������7��c���K�q����������9s��v��Y��]�v=�l���#&44�|��7�_�~��~������&��i��} ��58����
@vEF��MdD���%����f�����������;�����xFg����
d��������dW�"�J�R�j�d�.[���V�Jg�����[��=�\��I�)�T?������d�����#G��Y��j{���)��N=�����W_}�n?.\0y��IS8��_?��]�|�xyyI�l��6k��S>>>�u777l��[-]�����w�qX{��uS�dI#�T�P!����W[m=��Sv�2d�U�|�r��j��]���5j�b����?k�K/������T@@����tX��1���cN�:u[�%�>}�X���7Rl?x��S!�{��g�M�0!��3g�X�^~��;6vg1�%��v��������>��{j�R�J9�B����/�H2t�e1���_lJ��o���Cs�i��} ��58����
@vEF��MdD�"#"#����1�o�b~��x�����G~oe�<��SWdC�~��u��_������W^yE...)���a���^�������Z�t�$�K�.*[����Z�l���K�V�^����%K�H�\]]��3�����?�������_x�������Z�jI����O���8l+**��^�B=���N�c���$OOO��Q�<<<��c�I�<�'N$���eK�>�={��]������H��;W�T�X1�m�����3m�4�z���Sl����<==%I3g�Tll�S�4H�r�rz]�vU@@����i���$)::Z{��M��|��
�$�������)j�1�:u�$���;��������s��;6����-9���������<����;w�����j��)  @^^^���R��E��CM�<Y��?�������T�dI
4H�����/��C��\\\������_U��53zH�=2����n"#"#����c~�����
Yx����[d���#�����;�������_~�����U+���(QB*T��t��	�9s�
�n��Q#�mm��U			�n�)���#�s���3g���Tk�:w���a����8�o���&L��T�>>>�R�����E�J�.���;��X�b�r��"""�o�>�i�F�V�r*X��y�$�P�B����S��|��u}����>�uqq��a����/+<<\�������?g�]�zU�4x�`���3�_��9s�H�r��i3���7�:v������������K�T�N��x;�����j�����c�N�<���H�����?u���eG�����^����6m����l��5kt��1I7C�[������W��~��g�_�^;v�SO=��M���������1����f����g~Cf����^�z�W�^=�L/$$D!!!=����1cR�g�;��R"#��������;�o)1����vg������;���"�=������;�����3�n?��6�������������@�����[���AaXX����t��i�z�2eR�/]���m���[+F������TWG.]�����V�Z)""B[�nU����j�*�����~QQQ�x��$���N6I�:��
�o����M�<9E85y�dI7W

JS�,^��G�.]���k����Z�`�$)88������1��g��U����u�V���r����w��YE������7�x#Y��x�%i��a6�������@EDDh���Z�|�r�����k�A�
T�f��#G�����-%���1�����
�Y��DF�:2�����[�o)1����-}��o���5�p7DFFJ����3������-9s�t�Nxx�S�������(����w���Iru����SGk��U�<y$I?���Z�nm7��n�xJ��7R����_=z��$���O�����m��o���;%I���W@@�m�/I��M������n]���� 544�
XI�������8�i��
�����~�����>��Y��p�B-^�X�/��O?m�o��9rh������'O*44��v��Y-[�L�T�jU��[�f5j���={4p�@�q|��5m��Yc��U�V�T�hQ}��������[J�o71�9������R"#����12����-%�����c~�m�����w�8�\�z5����4�?~��1i��E��):::�zg���T�vm�]�Vy���t3rP%=�5j�H���u��D#F���']����z�����Z�~��s�6m���b������g�J����1���O����k��=�����������3��K/�O�>����:w����;�|��N�9t�PkE���888Xqqq�R?�%J�Ppp�.]��M�6i���j����9w�����;��uf���������c~dedD)�����>2����-%��1������8dK��ts��s���Z��a�z�"E��o��E��'O�Lw;�H:�?��3���G����8�V�ZZ�n�P����j���"""R����Y���S����������K�f���k��)22Rs���t3i���m�3}��4������o���X�f�u���?w�;v��6��cGI���+u��)c4e�I7������<==��qc�9R��/��4i�$���K�BBB�c�������Rb~���}�o����(%2���GF��1�����/�7���w[���	c���[o�%I��a��6m��������H��a{��}���8qB�$/^\<�@��m���\\\d���U�4n��t���B�
�X�b:y��8��g�:��
��X��F�Z�~�Z�h���0���/j�����Y#??�d�M�4��+t��y���C5k��#c1b�����p}��7����V�2d�\]oo�������X?�����V{�g��9:r���9�~�A�5��q�U�
��T�lY���V�r��#Fh��������i�T�^=?~\���c����7]�������C��~}����~���=N2#������c~���-�:~��J�*%I�����Wz5m�T�6m��tQ #���QJdD���FF��1�������m�o�8�����dr...v/>>>*V��Z�n�q��9���{���n�^���w���)��o>���?�\c�������C�)G�l]�3��7������T�f��}�-j}���k��������>0R��[7��'�|���x��~����l����`��j���$���~�V��[:u�$�f2~�x�u/^��Y���X��z��Z�~����'I��m�Z�h����du���������w����{[A����5y�dIR�94h���n���:q��$�J�*����5f��T/O=�����i�n{i���c]���?����?_���s��-Z�\�r�n�������a���c��%�6�w��ef�o�1����f�[��d���t�s)�		I��su��9E[�����,Y2]�I�FZ.y����^��%����W���9r$E?c��I��������&2p �#��xm��x�Fn8nQrdD)��FF��1�%�����m�oYx����v�9k�p:��EGG���SZ�f�F��r��i��=,�X�d�._��Tmpp�]M����������E!�l����
���%I������[U�b���]���k�����qqq��E�<��#z���%I{����#l~`��'J���������v�����<<<$I�N5�
���~�u�������zJ������?�X��-KQ���{g���U�����+��������E��^3w��]u���ts5�~��Y���U�V��w�u��������'I����s�NIR��U�p���]R�`)i�����{[����y�cI���k[�G�e3���a����v]\\4|�pI���'�t�RI7W��U����v�����zKg���[��3gZ?W�V-Mc�j�����f��m�oY��%K��[o����������/������;U���Y���(d�@�D~w��@vG��]8���_dD���FF��1�����6�7����62���<{�s���������'�9**J��9st��QEFFj������W�2h����#����t��u}����V<�����Z�dI�}���f�%���$q�����Sj�����{�j��z�j,X0�Gvw�����@488X#G���!�quu������AEEEi��)������o_�,YRaaaZ�t�V�Ze�3~�x�(Q����V��&M���� +7n�:t��r��)g��������m��i������K������������o(66V�;wV��]��M���[�����u��q���C�|��u|2��U�j���j���.^��;v�E�Z�n����+-Z�H������'5{�l�X�B�>��j��)���������g���]�.�y��z����=|�pM�0!����J��.]��777=���N��?~�m�V��-STT�����!C������>�@���Z�l��V��~���D��|��V�^��K����U}�������n{��5j�bbb���v�#""4f�����j���4h�������W���:x��������OK�����������,������-}��2��%K���~�Y4k�L�<��S�w�K1�)P���� R��%G?�����6>>��	�snEdmd��2����iCFDFDF�>dD����[�0�e^d�d�@�a������H2;v�����.�d]����1��u����/G�=�g���[�s3  ���Q�H25j�Hu�/�����S�N�������Aga%J�0�L�%2z(�Mwkns�52�
6X�_�&Ml�>|���$��
����{;�{(!!��.]�H2����^����=<�����m����E�&k�������:u��6�O����c�V�2E�q�w���������h��7��j6l�`���^z�����m�W�^������<���v��z���V{��K����-��~��(P���z�����K��s����m�:u<%�������1�4i����t��&!!��������6y��4��h�"k�z��%���q������V�\i���>gf�����F������DFF:���q���y������������lc~c~c~K����J��#���^I��q�yj��c�����9��h#���I;v�h$�B�
���X��}��w�~I?�|��7o{L�{����d�Y�a����!2pdGY�5�#��M2�{#+�6��!3���C�x����72"2����DF�/�7�������Rb~����3������/Y�s���N3�28����S'N�Vd9t��<���`��A�$I;w����{�K�j�����+���2���w�a������$I�<����Y#??����q�F=zT���G
>��6m�������k����?~��7o�B�
���]y��U��5��k����#


��}�n�ZG�Upp��w��R�J)W�\��#��������k���9s���=�6m�����>�H�6mR�=T�Hyxx�p��j���.\��s�*""������7���\��6l�`�U�]�v�y���t��$�`��Z�r�~��'=��S�V�����'777����L�2j��������]!!!N���U+���!C���r��%���$���/���o����~��g�������m����={4t�P�*UJ���S�J���/h������o��Nz�{���\�r9�o���~��7}���z��GU�R%���Z���>���{k��e��i�
(��qeE�o�o�a~K��
�3?�<w��V�X��6q�(\����m{���������d�d��=dDdD�!#J��(k`~c~K
�[J�o��A��!������Upw)
+�U�V��]�t�����������
*___���e�/n}�Q�h�"������V���������n���v�*U�d$���\}j�����'�4U�T1���&G�&_�|�|��&00�����<������=�����f����Fg�1{��������gF����c;w�4����y��GL��%M��9����y��L��-������cIW�J\���������3��W7~~~����T�X����K���s6�I�z������q2��1c�$��i�t�)G{�J]�|�|���a���`������(P���?�1�����|�r��c��+�%$$�3f���@S�P!�3gNS�bE������/&�7""�|��'�V�Z����x{{��U���>��\�~�a����f��5���_6�76<��qww7����D��{��f��&>>�a;�V�;t��y���L�r�L��9�����W���������{��V;[�lq��5m���g���N��e��C�1&::�L�0��h��z�����Z�j�Q�F��������#;v�0��
3���3�r��;������?��4o��.\�xxx��y��5j�W^y��:u�a�iY���~0�z�2����)R��m��,\��c{.��������������M���OOOS�X1��O�g���q�z�?�`������z�27n�p�^�e����}��2e��\�r��9s��%K����]���>����p��F����3QQQ��ir��m����y������y�fo�n���c�\��j�V�\�x�����)^�����H���ch��
�O�>�T�R&g��6_���o�Z��$���jN�8���J�2����	KQ��w��^�z�2e�oook<�+W6;v4}��9y�d�}�Evy����?�z�/^�8���iT�Z�H2�������=�l/���;w�������-k`~��������������t��a�5k��I�����Y�m�6����^J���{����]n}/ek��o���<��#�H�"����.\�t���l�����r����{LL��W@:v�hw�.www#��9�L�2����~����z/�~�z��������OOOS�`A��#�X�8#..���=�t����(Q�x{{�������_����������C��O>1�;w6e��5>>>�1i���y��w�����������yRd�Y�a���������d���d��#'w�����fp����<���������62�{+;fD�x�o�1��[�q~#O2�������u���)'�g� ��������g���7�fM\\�y��'�����I�Q�F����)�����>X�W���><����e���;{��U��G���~�m�������C�zl�5e�8��cz��e$�|���
&�y�����/;����[N�(*R�����_����7;;v�0����^�B��o����������c$��%K���MRqqqV��+W.�B��n�E��+�����������+�4&[������4�Z���g�������C�\�rvk�6mj�]�f��f��9u|4h���[_���9�z�k�R�~}������[5���K��%���q��N��+3����m3��s����6��M������?������h�����o�I�y���eBBB���l����/;|-��W/s���ds�-I���/&{~�z��#��3g��1��W�\��96b��T�$c�1'N�0���O�9��[7���o�a�����I�����G�Z����/[_V+]�������j�3e��T�I�!��C�L�n�l{���O?m�>���N��;m��4���W��C���M����O>�j_i�]^�eg7n�0=���n�0�����~��G�y��g��N�w��	��A��u3z8Na~����lc~�����6�|�q4q�D�5���J����N�;v�U�r��d��v�~���d'���7.�����)|������9r��<��O?��9x������z��|�����sg�p\�����P�B�����z�������3�z���������f��9kz�����4��>���>�SC��$;}���X%'7�<88xrd����;F��"#�������2��m�o�Vv������<%2p��[2�����f�����l!..N��~.^����h����$www���G�7����������`]�pA?���7n�_�U�r�����#�7n�+Vh������T���������'���?����'U�X1�u�����-[�L�G��$yyy�c��j���
(����9sF�v����k�=D@�1h� ��7O�.]��e���{�d�o������Z���kW�����v�������:u��?���|�A���G���:~�����;m��U�O�V��m�{����[�<yR�<��.\��n���e���������5y�d���:w��z�����w��������W�?��&O�����k��5j�����V�\�S�NI�{��sKj&O����h
:T.\P�4y��u*TH�������S'���I�����^�z�H�":s��������Yaaa�������;��#-
�5k��n������t��iM�<Y���G��o_-Y�D-Z���S���{w�j�J~~~��o�&L����/k���z������o��+::Z>>>j���j���R�J)w��������`����������Km��Y9r8~��j�*-\�P���z��'U�vmyzzj����8q�"""��O?���^Jq_�|��:t��,X�/����c=����
s� �i{��U�f�%I�T������R�J),,LK�,��5k��� c���o��F�����+�����:u����]����<`�M�2E��
�1F����7n�B�
������e�������
0@z����u;�}�]}��G�$u��Um��Q�\�t��ak��yJHHp����8u��M�6mR�����[7+VLaaa�?�6n����8�N�:*S��S���?_}��Ull�$���^�{����~'O�T��uu��IR�����sg�-[V���:t��f����G�j��E������+���b�1d������������5p�@�}N�4I�������;u�I��%�_�~���>�@�����{�9����D�����*T����m��M���)������P(P@���W�*U$I�v�����Uw'������^|�E���+88X�G��������x���s��Q��|�rIR���gO=��C��/�bbbt��1m��M6lp��!k8��.^��J�*���!C�h��}������@��r���1Fo�����s�=�q��O�3F����8�p�[�0��{�u~k���\\\d����o�=������5j��:www5j���1<��3������o���4i�
,��.��v�

���U�re=��c*S������|�r-Y�D�4r�H��__
6tzl��A�i��������Y���K/���>}�$�A�*_��~���;����\o��	���o����A��f��������[5c�]�~]K�,Q����h�"�m���KM�4Qdd�$�Q�Fj���J�(������W!!!:w�����K��q#��<[���%::Z...�Z��7n�
*���_�t��)�[�N�V���+W��[7�����Q�F��2�����7�}��Y�md�d�d����<92pd5dD�CFt�e��w�[�0��{�u~#�#d�d�w����x����;*�W1���$+Y8��g�Yu~~~6WM���o���a�1s��S�zu�n��)j>��ck����Sl��G�$S�vm�#G#��J�C���9|�p�m����V�q�����3[�l��Y[vYa/�q���{||���z��mS�'}��[��c�Z�}��m����v8�Y�fYU!((�fM�U�$���s�M�6�����4��U��-Z��f��]���]�:[��������;�u$�j�����4�
��3fL�U�������B�
�ye��n]��*IW�^5�+W�jj��i�������S�����Z!9o��v�����km���(66�<���V��f��Y�t�)��_�8u�T���\�r�����VK�������-&&�����H7�jBj�kev�q�����d��������uS�N�VM����V�N�����>h���/�}����xxxI�\�r���6����o�)b�K�.]JQ�����2�����r���)j���L��-����VO�|��g6�l�<���6kn]�}����|���b>�����*!!�Z�����L�<�f]LL���H$�+�w�����w�^�}n����k���S�LM�5��~���d��������;l��U";w���/e$}I7��EXX��>�����>�����e���u���5v����m���3~~~F�)S����GDD��;w:wZe��nY����j$�Z�j��#G���`�p�B3}�t�������[��|����������kBCC��9s����L�v�2zh���#GLhh����oL�~������;�M2������<��{�~���/(P ��&�j�
40����u�{�7nX%�A�)�p��{����m���������6��w�y�����C��:r���n�1
64�L�J�R�o�����:u�1��������z��,W��9y�d���~��(P���;wn����(S�ti��{����������k���I�g,������#G�8�Y�v����6�L�����e����yo~+�����0�s��l2pd7��3���98�1d�I����C��<92p2p��������)#�����<��{�~�����G����wtU��wSHH�W���^���AD�t�RD��^�w�H�IT�^�@�|���K�%�d��{�����s������yg��"'��Z���S.@���!B�rv ������]����{�<�'�x��w��S�1o�<��<v���9sfC�`�;w�f�����zh3-66���1b�y��{��	�S�D	C�Q�P����)cHq>�]�G��%>|7��o@���&.[�liH2�-jn�����[�n����;wL�;|�<y���V�\i������2������q���eN�8a��U�Z5i/�?��(������?���N���I���~���Y��=��C�����F�rX�W�^f��7&�mQQQF��E
IF�f���������3���O��
<�,;s����\�bn�� Y�����z^y�����4&5�wW��+���l�2s��>hDGG;\N�����/��R�������2�k���yp��������~'\���?��9��7�p��.��esy������m�xW�\1O�)Y���2��{����	g����.]j�;b��eo��m~���-�`��?�h�5`���X�Pi�����>q�~��	���7��W_}�i]��
(`\�~�iy��Ppp����������a.��I#G�4�}��6���9cN{���<�vwe�m��*>�r�(V���j�w��#���'���H�������9�6���y�����R��������k��w����������]k>_�n�M�M�6���~���H���a��	��x���F��}S{'���������}XO���y8
������y���6���!��c�
�=y\������c���o�����\�r���}��9���-�.^�hd����d�l�2���cI���~���������zb���4�cf|��;w#GF���1�_����
��8�a���#�?2p2p$
����R���!e�����-u�K������������{;;��t�b��<���U�jU}��W����$u��MC�M0�?�����wK��/��;:\N��E��OH�n���~��fz���#GI��u�l����_.\�$5i�DM�4�$�_�����'���K�7n��
��������[W�^u�V �z���e�X����������j�������0Y,�/�^�z��������i�\�r����r8�q������$8p�n�g�yF����'�-3i�$���H������x��E����vZ��7��;_r<������'I���U�����_�������In����j��%I��}��pZ��GQ���N������>��eS�.]�������z��o>�����6!i�?�����|}}�}�������w�^�z�\����W�^���K%I���W��%����C)������iY{�,Y"I����/���������_~���l���Z�j���m"##��u��M�y��e��S'��1m�4IR@@���(I�2e2������8q�f�C=d���3g���[	��~��f��-I*T��Z�j�v[�4i���G�	�w��Y�����+**��z{���������C(P�������-S�����r�J�<y2A�04q�DIRPPP��iPP��<~���
*h�������*U��
(00P���*X��}�Q�?^���*T�����	���*Z��z���;v�p���nR�f�XT�@u��Q;v�P��U��$��o�G������-~;UJx<8��R�J�I�&*X���rw��Z��8����y�:22�<n
�t��I�����)S����9s��e�?���:���ysU�T���6m��L�2���~�MG����_^�@u�����r�����[K�6l����o;,��KbY{��m[��K����}si8�q���"O�����S�-2�8d�d�H_����(u�R�[�����{�#�3d�d��5?o7�g���O��O�	:��������z�e���E3$��m��~�is����6l���k��}�x��r��%��Q����Q��"##5r�H�<yR�V�R�l�I�7��7o���w����j���
�GyD��es����"E��I�&Z�v��L��7�xC�4u�T����b�(,,,�����+Wj����k�N�<����+::�n�S�N9�)�^�����\�r�����r���2�:u���u��%M�8Qo���Mc-���f�������%�������[W����y��v�����X��$o,�����|������)��Y��U��z����s�j��������;�7n�
�����t��k�v8M�����]�<���{3~�x��S�f������YR����~������N�{�Zo'4o����E�Q��eu��!�8qBg��1��Y�b��-[��p����P�9s&�'��;w�3���~���=�7�_|�V����z������>���W�:]~�B��k�����W��-�j�*�Tl��Q��7o�����n<x�����bQ�~���k������;wn���Y�f�������{;=q��o���Y�$I�3g�{�A�����M��?_���������������19�=����3�h��u�o��a�l��^�Z���w����,Y��V�Z��m���]�6m�h��j���2e����A��.]��'����S�j����n�=c��a	�3 1���G�������a�����Qll���]��^z������iSIq�R3f���u�4b������O�H����<):^���=�Lgr��ms��3e��u����`=����4i�����O?�T�3g�������OH��z��5s��f����?��wK���%�O��g�$)��Z�l�������H;v��{��}���7k�����}��=����;<y���S���n)�>��d<d�@�BN.��Kd�)�<!2p���=S�i����R���!e�����-u�K�x����������3p.@����o���'�p�B����:{���{�=��Q�nPr����;��u�y�5i�D�/�aZ�~�y`4~��������Ou��Q@@�n���u������h�����_]?������������������|�A��][
6T�V��%K��H�z����k�������i����o�$7i�DE�IT}g��U���e���	w:=��g�G�u4�q``�z����>�H����5kl��+V�xO>���G�r$<<\��%J��}||T�dI���W�n����W�;a$U��9N�_]��������/��K�.vGv�U�����N��U�����k���7o�>��3�eZ������v��%�|�o}hh��PZ��N8t��9�������=��7�'�@�����.+I�O�6��(Q�e��gw��������|������y���v���l��-Zh��U��z���yS/^�w�wik����={��w�Qdd���� |�������W�^�Z�=�/6���}{��z=z�����%I�'Ov����<&��'��k����O�O�������;�����N���W_�I�&�v���/_����+s���^������&M����p%[�l�\��v����7*&&F����t��yg��c�����;t��
���(22�]:�xqj��1��*\�p���SRPPP���g���4i�����`�=��S��%K�T�
<���<��a8c]��x���'��v������x�����qC��u3���W����?��Gb���Od�d��X������G�<i��"w�<i�������'
88�}=O���RU�v��G�����k�i��m���O$�����c�������������].�:���7�u`?rOLL�9�h����@sd�H����%K�P�B	���5��n���C������$���j��=���o��K���W��k�\� -����yG�)S������#G$�m�&Ftt�Z�li���=��w���>�H3f����x�b-^�X�?��9_LL��z�;�y�~�������L�7��\jIl�(�����7�����cj�����,YR����Y�fi��E���q���|���x��g$I�n���3���}���M�&)n������}��gO2g�����Q�����e���y�|�����������5jh��5���/���-Z8�!N��)Iw��I�9r����?.I��u�8`N��s�v��-Iz��GT�@�d-_�y7I�����r-Z�0OY�r���E�������������S���%��Y�r�9�������+VT��5��Q�J���WO?���9�u��6n��Q�F�y��*X��>��S��
�=��{����s�NI��
d�,�y<!�\TT�6m�$)��_�#\��+5��~��N�:���S�L�������#�K){\�����X������������������h��i�?���j}wW�]I����}y�8822�8d��+�8\!O�<�sd��W���2�8d�d���K/���]�J���]��>�,A��B�>;r��
���+W�����k.S�v��m��XoD�?��;|��Y�<w��a�t��)���W_���u�f�0����J���s�5iM``��x�	I��������K�Q�C���k�����w�$�i�����4m�4��������{�1���2e�x����D������-��s�$��V��4U�T)����~Qr�7�U�������������_|���^O<����oo~>\�4��t�����K�=9c����t�����L�2�z�������.X�h}���2#Q�����������mQ�zu�Y���~l���io�~V�R%����#���?AF���z����7�+%�e���X,v���:{������'����������9���{<y�dEGGKr�~)RD�'O��K����?k��Qz��G����s�4p�@����{��q�������*T�`��^�H�nZ���/�rv<�[|��a�
2D�a���W=z����R���;�Y����z��C���/o���[���-[�h������G����s�����{��������Z�r�d-���t�@�"'G�DN�Z���
xBia����i8\!'�2�qVwp:�A�3���w�5��x���$>|�e}����<~����o(>|X�N�27�r��i���;��8`����h?�E>���y���1C����V�^m���}���.����Q�o���E�I��x�	&����W��?��S�,��KBK���g��7�����%I'N4GJ���%)K�,fw��Q�#���������7�P����A��#O�<9r�9�=��|d���������[�J���,����������o'\�~�<9�w��Q�`A�y��y)�����eg�=���q[�j���O?���m���ys�w���5�����)���V�Z�N��3t��-]�~]�g��wp�E��^��)S}RE��������
P�6m$I+V���S�d�&L� )�D�'�|�����A
<X��/��4n�8���K��N��]�v�U�m���7�#���6mjS6�x���BBBT�F�Ti/R_������'�0���5o��#w
�[J���;�3�e��7X���>�a��>����o�5�O����H}d�d�H�����S8\!O�����#��������K�8�;�� ���o��y��U�5�fz��5��k��qY��?�hw^k����u��~�zIR�F�l���5k��u���p��b�C=d��-I�6mJt=@ZP�Z5=���6�?RRb���+I%K�tZ6~�����uk����'���Y�fU�.]<����W��bQ���%��J�e����l�b�JT�zus9�A���X�b�����9s��8�������?~����m��QR�N|�%���{��o����='N���!I*\���9W���o��������k�A���7���^��*U�h�����#�$��_u�7l�PR�I��U��3����Y�f�}b�>}��'���j������������Q�T)Iq'�zc{0�~�����M�4I�W�����%����%K��7Vqw�����yB��q���?n�-���
+~?��Ilp/���8�N�j����fiAXX�����"�����8�/���������w���{��=:q��v��))n���/�m���H���H9���S�V�l�/)�9�������O~��'���1�\�r���w�\w.p������\��e}g���g�cw������S8\!O���}d�iy���������2p2p)�guG�z5�=��W_U@@�$��������)��U�J��t������4g�Iq#F�n��n��Q|�����7o��pc���_����d�?����'O�^��b��������\�m/���j����5k�C���Jb���"9�h��������������5G�>z��^~�est�n��)((�#�������.�>��c����G;-k}R��|�A������v������z�?-]����1o�<}��G����3����3=v�X����=��%���'Os�|����h�)�m�����^����v��Es����r��Z�v�r��)I��}��5k��W����������������]�*k����N�?~�$������Ir�Y�F'N��$=���3f��
��1`���I�&%���R����53O,�4i����s�'�D���,Y���,��]J+�C��<��k��.�p�h��Ij�u�y8��h��6�j���v[>�`9��
K��B����O5l�0}����n
� =���=zT����m���K+g�����W���U�D	�i�F����={\�e}B��
\��X,z����j�uz/��#���u��F�))�xO�
l�������j����2)bY�?�#�w��o���q�F����)!����Y�F���s8��~0O<�R�����������
2���<��}��[���s�@ZA�Od�d�)�����"O��>2��-=�1d�����?d�������C�"�+d�d�R�>��.@2�����?#""�o����_?���o	��t��:v����IR�^��%K�T���%I���7;��M�&(�a�b�
�?���������8I6!+U���,�����C��m��m��p��$�a����[v������������[�����/����O�����.]2�G����7o^Iq�#F��[n��Z�b����Sj������x����k����c�����f���8""��3@��yStG
q~�aU�PA��w�^=��3v�M�:�����_L��G��L�2I��#\��/_��l3���`�Ac����e�����P��]��A�J�*i�����+�$i���j����\�b�����9���U���{wsD5{bbb�j�*���{N�����K��q�����6m�(���z]�mpn}�+]�v5���t���d�%1R���b�������'Oj������T�V��|������3g�8,s��MM�>���^��^�d�������������_����*������O?����	��Q���=y���u����K��W^��e�t��a]�|Y����z���=����k��a�\����/���g+66�c�����u��i��$�����;T�^=���������������'�u��O���y���q�������)!������������<xP�z�2�4hP�2�=��y�����5x�`EEE9\��;w4o�<}��WN���}����+222A�}���c��n���qVi8�>�����42p�B�d�����G����<�^@�������[�K�GW������}��~�n�<x�&N����(}���z���t�}�I�;��[7��9S�/_V�Z���[75h�@�2e����5i�$3/[��>��C��k����M�f�/P����)c��d;������'j���*[���4i����+g�������'4�|3���=��y��D�K@���W/}���~���-[��+�{��*R���\���QK�.�����xC�|���}{��7�����k���'4k�����o�����@����w�d��*Y������M����[�#2�\�R�;wV���u��Y��3G[�n�7���i�������^zI�W��$���kZ�~�Z�l��y�����7o�v�������B�
f����M�w�}6;7={�4�5���9Su�����75a�m��UO=���-���/k���Z�j�9����"E�${��*U��q���W/3���������T�R��9��]��#G�h�����q�����4:{�2e4d����;���R�v���C�l�R������?5e�?~\�?���W��iA���v�Z5m�T/^��]���Y3���O��=�,�.\���k�����9s�~��u��IU�VU�9���Ok���Z�f�.\���M�����v�������/���?O�<u��%3\�����O>����r�R�V��l�2��ySs��Q�>}��&w���oXX��z�-��%���k��i��az��wU�N��SGe��Q�,Yt��U����={�����U+�@���E�z��iE�����/�U�'���;wn�N���[������hM�<Yc��qZ6&&�<�$~>�����
6�����$�m��SG
4P�"E�={v��qC����������YW�\������]��B�
*_��G�r��-
6���6�����*�B�T�N����.Gto���:d���#G�O�l����|��A:����)cnk���C5j�H�2<���Z�d�[e�����U��^��r�-^�r���k���v{��u��(���=��cZ�p�x����KU�TQLL�~��M�:��G����:w��`��� -[�L
4���W���j�������*V��,Y�(""B'O�������O?)<<�&�O�:�p��:q��v���2e��w��*Y��"""���?k��9���R�=4m�4��q�@ZB������m�����
88x����]-�������iKF�s���ReYH����<e��'D�FH�v��eH2v����� H2�z����y�{�9�iQQQ�3�<cX,���~��W�8���eM�:�f�n���-md���,���c\�r�����Q�pac��n�7H_f���!����k��\�[o�e�3e��eV�Xa9����O7�L����c����{����mE�1$E�q���_���]S�Nuk>w��q�([����a���	���������;�o�g�n|����n_��
�����5l��i9�����3�6l���W�Hc��]F�=��;v�X�z\}~�%��d�1t�Ps��b=z�����������p����t�Y	

2&N�����|F��Z���������0V�\��������.��W_u�-��K���C��/����z����nY�]}�
�0���o������r����K������3Z�j��6���Q�>�x��Fll�[�9��'��u>�����������j�����}����!k������������������a����A�nm�'Fz�vK��#1���b��q�{�������m)Q���~T���MC��7o^#**��|���9_��m]n!mH�~CZ�����(=���a;w�4�e�j��8t���y���c|��wF���
I�������~M��3���___��?�p����U�^%�3�$�k����v�O?�d���l��o��i��C�����m������$e_�����<�f���.��$1��m�&�I�o����M��o&L����7O��{����+.��[�n9m��#G��5k��^[,c��!	�H�~���;�\�r9\����1j�(��'z�8�'��d���0����E�� #c������!'w�<����p72���cd�	���_z�~Ky�}d����-=���A�����2��#O� w��������i�����������7����'�i~~~�����c����Oe��QHH�T�P!u��Q.��M��;wn���{tG������a�����+WV�l������j��������U���9s���O*X��~�a�7N����U�������U�V��w�����b��)S�L��5���+��_~Y{���SO=��f�^�z��9�$)[�lz���=Zpp��m��!C��Z�j��5����[�n��G�����W��u�+W.���)W�\�S��F���G�:�+�:t���[�v��)o�����W���U�fM�5J{��Q�*U��L5o���y�b����{O�����_���?W��M��J���U�jU����:|��GF$�[�-t��QM�<Y;vT�b�"???e��]�+WVXX��O���g��e��I^�G}���Y�?�����>e��I���W��-�`���=[��]3�����/����/����+O�<���~�MM�6��K�$Iy����+�u�V
0@�*UR��9������`�(QB�<��F��h���n-��;��OY,�d����'���w����y�sm��MLv�#%����]�*$$�i��
j���������S'�+WNY�d1�{�����kW-[�L?���[��@j����$���s�������7����V�Z�x��n������������O�����-�t>u��U;w������@�����^�w����z�#u�`}�7  @u���[�q��6������i�4a�5i�Dy����qH��zc���O?��N�:�P�B��)�r����-[j���Z�d����D���m�~��G���[���S�l�������P�-[V:t�g�}����[��O�[!I�Z������W^yEe��Q``�BBBT�ti���O��o����������2p��D�m3����2p2pW��"<������!GZCn�<
��e��(o�b)��2������8Q��_|��|,Z����I�m����n~/^����+V4$������g����zT���w{�9.�������|M����2�W����_~�[n���f�W_}�f���C�G�u�pg��E�?��q�}��2e2���ot���������S���F���4���M��\�p����7$������aW�\1>���^�zF�<y#w��F��u���������h�k��5:u�d.\�0���c<������nWtt�1s�L�c��F�"E��� #88�(]����wo�wF�7z��]��~���J�2BBB��,���c��5��kg�,Y�6�����#F�0.\��p��������K���~�z�[�nF�b����3�Y4�n���&�����eV�R��s��G���������O��0����_������e��uv��-���>3j��e����4J�(a������yEDD�G�6�U�fd���		1���~���^3N�8aF�F�z��1f��i��F����L�2��g7�T�b������S���w��Q#K�,�$#00���o��e���-Z�0�4|�p�^kZ�^�7��<5�?�����u �b<�"�3d�H+���#O]d��1d�	��������>7q�������{x�����;��T��7��������� ��y���O�.I*P��}�Q/�����(�7NR�h��F3��l��U{���$u��Ay���r�2��'O�����$��YS�+W�r�<�q����u���-s���S�S���+22R�:uR��b�
�>}Zw����3g�h�"5l�P}�Q��)����5��b�
�;w�n�3f(**J����O{�+V�P�%��oh���:�����t��m��Eo���J�(�+V�]�+����M�j���:q��n������k��������o���o;����*_���u�����QDD�n������K'NT�������+&&��v}����Q����������	�L�>]e���+���%K����#�y����l��I����J�(�r���H����/�q���9s��;�[�ny��i}������~j����o{}Di����������[c��c�T�F
������m�._����H�������oU�Bm���iG���>���k���
��7t��!}��G�T�����=���W�������j���:s������+W�h���5j�J�,�i��%��X�b�~@dd��t����3f�~��GIqw�y����n# �!�#d�H+���#O]d������1��������C�<���#O2p2p@B~�n�wl��Q�W��$�h�B����[�����?��+W$I�������������*W�����������~��wIR���;w��lb�d��y����^z�{��G6��2����qcY,��u���_�~	����z�-�����U�~}����/�]�v�����~�zI��q��'O�r�r�rXG�^��`��/_^O<��J�(��7oj���Z�d�$i����]������v��u={���Q��3f��W_MPf��)��:u��L�2��i������?�m������w�K�.]t�}����3�3g�.�m�V���Z�h���/��B�-R��Y��gOU�ZU111��e��M����ok��%����.\h���~�M
6����%I���W���U�H���j��}�:u���;�/��Rw��1�#G�����+W*$$D��wW�5�����*_�|f���Y,U�XQ
4P��e�#GI��S���O?i��U
�c�=�_~�EU�T�Y������}������;�����Me��M�����j�����;�z���|�|��d��t���>�}��3g$IY�dQ�6m�T���i�Fu����-[�~�z�Z�J-[��v�$I���j���:������GU��yu��M�6M�w����7��K:tH��gOP���W��I���?����g������u��u�X�BK�,Q��U�bE�m�0a����'�0�)S&�m�V
4P��yu��
m��Y�f�Rdd�����)S&=��6ut��Ek������u��A����	���������9s������c�������#5��'
x�#���^�c�Ed�d�)�>���s!O<2p2p�^��:<j��]�$c��]�n
x���3������c��������Q�F9s�4$�����_��<x��S���+W�-2^|�E�����d�����~�����b���k���$�Z�j�������',0�L�b8���?�!��d���������d���o��r�Jc��YF������u���nZ�t��ac�����y�������w�
���o7�-��o���7$�s�6bccm�]�v��=�S��!�4"##m���s�6�����c�{��G������Y���c.__��
�����_~���1b�Y��GuY�3S�Lq�:�e��)R�kuX+R��Y_TT�a�Q�^=C�Q�\���o�n��8q�a�1a�������\�~���7�Y��a�|>ccc�!C��e���k���'�k���6��R�J'O�LPn���F����r�g�NP����F���
IFPP��l�2���z����qc��5k�$(c�y�d�.]������/0>����5k��� C���iS�����;���\�k�6._���
����}�{���k���z(��8c����_��L�wo��M��U�T)�z4��iRX�S�L�[�z�������OP&**�h���Yn���v�����Y�~��v�����7?��>C{��52e�d���������w�!�

5.]�����7��e����~���]3�eI���K�.'�H���I����h�/d���@F�6x�@g�������}d���<y�-2p[d�d�����C��2�8d�q���{x�����!I@�9w��Z�j�G}T����.]�$I4h�j���������Y�V�Z�C�����#___M�4I!!!�n2��;wj�������:v����~Z�|��9�g�b��~�z�w�}^n���;V�Z�R��]��?H����������-��f���V�Z�������%IAAA�2eJ�M�I�&��.h���6�6n�h�z?b�Iqwe���_l������y��M}��a��3f��u��o�@���~��G�N�i���b�����a�G���?���v{�
�v��z��$<xP��m��6y�dIRpp�:w����"��*��9I��?��C��b����X,>|�9���s��69����y���`��	��/_^'N4������8q��=*)n��G}��r�f������#��;�i�,�������;-���d��N�4k�L/���$i��������wGJ����`��?��(�}�{N�>m>/Q�D��B���g~�������g{�E����o�c��	����O�|������+��p���N�*I


��y���\��5p�@�m6l�������@�X�"�%�����r�_��	&$(�9s�(  @���Os��~������������������]#O]d�q�c#'''O
�\���'
88 �����,Y��z���1c�>��o7iL��y��U+m��I�[��vs��U�PA�g�V�=T�R%(P@���
T������j������?T�Bo77M���U��E��gO����eP���X,*P��:v��;v�j���n��Y7������w�R���I3�tT���R�����|}}��qcIq!�����MK�:u�d�/S�L1�?22Rs��1�x�D�E�������o�iw>{�7o�J�*9���M�)SF���o���N�i��I�
(��]�:]V��9���
6�������WO�+WvZ_b��W�|~�II�R��C�fP{���uO�����-[6�e����'5j�(Imp����7O>x��w��e$����^|�E����-k~�8�`�?��;w�H��v��|��9����_vz2���W�t�RIR���]�4��C)������n��+j��1f�O<����g�YO�����8Rx����.2p��{8�D�I���!O<2p2p�}~�n���-*�0���Qaaa
�v3p�	P�.]��Ko7%��:u�92&R��a�5Bvz��aC���(66Vk���K/�dN�x�6m*Ij���f���u���#[�T�:uR����]�����#}_�r�#�l���^x����/_�#�t&w��?~�[e��kOpp��qM�4Is�����~���3k����z��$����NJ�2C��o�w�� ���u�*88X7o���;�0j�����7k�L���$i���*^��$)<<\{���$���_��-sYW|��c��9|������.k�7o�����}�v=zT��_w��:u*Qu�-%�Gb_wF@��1�/_^O=���M���G�j��q0`�W�T�L����i�����Sv�K��\��g������\�rvC|I��e�bcc%�m�/Y��E��F�?s��<�����f�-[�L[�n���[%��M���H����1$8�!�7����<u�K�\�c�����>2p��s32p2p)�^�C��t�j�e����+k��]��q�bbb����K�.i��}��?�p|�c���qC!!!���4G��S��W|�����t�6EFFzd��V�v�<R�'�X{z���I�&)<<\,�SO=���'K�J�,�
xty�������$�(Q���R���%K����{u��-]�z�aU�T)���.s��i����'�0i���j������]�|��4����7n�[�n����w����Sj}���3�\�����|��#����m����z��w��lw�����3g�n���#F(,,��w�HW�E����w7
����h��e����7�'�Rg}�w'��+��X��_$��2@�F�4d�d�d����;G��2��#'��|��������p���S��a��!������������M�$���?~zjs"y���c�S�L�����~�zI��]��_�n>vk���z���S�u��\����s�����3�UG�����=~d�>�@��M�����x�b-^��f�����d�;%����;���u����3�����N�����]�v6Ww)������g��$�?^�q�/�����7n�����\�w�$��tt'�xY�dQ����������#�$yy���<����!'��\������[�*>����k�J���['I�P��9�l�"ET�xq�����]2���}��
2d������z����e�����o����<�����ws�>�2�uY�:t�a�z4j�������-[�b�
Iq��#G�h���z�����{wu���+W���eYK��q���u�~��������w^Hk�z�-e��E�4f�]�p��-J:�>.���8��������_:���ok��6m���������BN.��{
}�kd����Qq:HU���������O��Mm���=w�		Q�5R��H}��w�������3$I��7W�<��,Y���
=z�e�k��9sfe���a�#G��\�u���_���']��i�W�6�������/�������rSr}���s]{������k��|�r/����9sj��A���t��{�y�EIg��%���[������/��'}������[�V-I��U��>�>2�����b��b�(,,���I��-*����E�z�)6X�y\!'���=�>�52��G$D6�Yd��.@�*$$D��W�$���/:~�����IR�&Ml����g��8qB;w��&���%�
>>�?$��iO�|���U+�����,��y�y���l�����-[����W�n�Y���5k\.���~2���Y�|�+W.=������w���s.����g���K�,�����+]��>�������W���f�X��K/����{����^��x�����a���[?~��
J"��9��2`��3gt��!�����/��").����������a����w�}��s��'�������{�G�����-]�T/����W���*s����9�����5j�o���5k��_����
6������X��X,��%�[w��:u�9��o����
xy\!'���=�>�52��G�.2p ��5
R]���n����#%I���j���M�� (66V#F�0�����
		1���y3Yu!e0@5k�T��5��Q#�m�6����c���G�����Q���g��5k�o�>����3�R���+f3�G����2���<-~v����[�nu+|�����}K��q/��u��g�Q���%I;w���/��&O6��;w���w��r�����V�L�$I�f�rz����~��������c����~��=;Ym3C=z�0OBz�����aC.\X&L���w���<�H��M����K�]�v���/�s�N�������Tdd���=�;vh��	z��'�;wn���O���������X��<�����Kd��B��x�"R8����:� g�����Fn��%�M�|�������)w��Iar2zk���ysm��M��m������&%���)o�����#F�-7b��X�B��7o^�#�����������L;x��z��e�=h��e�{�9-ZT�4~�x
<XQQQ�w����7O_}���v�#~�pI>|�"##���o�:v��V@���t��N�8��lJ��{}�k!!!Z�h�%I_����i�?����|111��ukj4���wo���f�����Su���;wn���I������/������#G���{�v�_�|Y���8�}����(�u�����C�i;vT��}%I��s�=��m��DFF�{��
���G%�����u�'�|����k��9���/4p�@U�TI�E�o�������+�x�=�}������0�t{��?�1p��\"��\���S8�������~�n����SG�}�����7n�C���r���J�*%k���53�4H���W�2e���o.�F��Z�'�8qBK�,q�����Z�n�p���W���o�UW�r���k���v{��u�5kV������M�6M�[�6GZ_�r�:w����������3g�����i��i


uZ�c�=����P�^�T�J�����_~���S�@�C����s������l�25h�@W�^��~��3g�c���X���d�����<yR�w��O?����p�P?�:t���������s���)c~����5g�EEE�G��6m����5k�e��I���o�����@�����d��f��R��^F����U�j������.\�����^+V�P��u��aC)RD��eSTT���?����k���6'�,X0��������{O]�tQll�n�����L	�G���U�t��	m��A���S�^�T�lY]�~]+W���E��={vU�XQ6lpXW�J�4n�8���K����>��C=���*U��2g��k�����#��}�6n����h��1���]�v��7��$e��]�f�����M�O?�T�7o���5}�t�h���o%�m��w����%I���3f�������x��}��7n�����7o�w���{d�1�C����"�X�s�C������Ex��T���k�Hw5i�D_���w��
��.�*T��n��i���:w��^{�5��
6tz�?��_�^���w�l��Yu��U���]���#G�UW��m�
.\P�����C�~���d�w)�E�Z�t��z�)]�rE[�n�;�s���5c��h��e����IDATP��E5v�X�;�n��m�����sXG�
�s�N=������_u��i}����[,(P�e�\	��E���eK]�xQ'N���!Cl����j��Q�Y�����g��������h���������a������������q����k�^�u��;W111��i�6m��t������7��O<�*�|������������-[6�[�N-[���#Gt��I�~@�;1c����>}�������?~���S�O���={�g����+W.��7n�K�.�s��$i��	*\�p��2g���s��z������3�<�Z�j�x����p |���f��={vm��Q���w9_��%��g���g�5���\�[�����u����5K����|�A��
�%�1�C����m��g,���#O=d�@�!�'y[MId��n��v�5n�X���|�1m�4M�0AM�4Q�<y�Q�q�j����=���_u��U�\�����\�r�N�:9r��=�tt���3F?���:u��B�
)S�L��;�Z�l����k��%
tZG�%�m�6����������+�l�����W���*[��:t���>�L�������BR�H�����+���2e�(00P!!!*]���������k���n��m��i��!�V���f��2�M��q/��u_�B���w��������c�����D���=�����-[6/^\�<����]�vi��������{��,�F��*�JI%J���}�4z�hU�RE���
V��e����j��=���h�BG�������cG+VL!!!���S���U�re���i���:{��Z�li���3����#���}����s��������?�$�����'�PTTT�xJdd��.]�^xAu��Q���������P�*UJO=����Y���a���b��b��'���KO?���/���@���S�7���S�V�~��W=���*T��U�@�l�R���K��N����1b����	�
���)SF�H{��X!I���z��7<R�+E���bQ��E�NO/�y����������~e��M���*T��y�!�0���������[�nN��i�&����b�(��:�|��
��=d����3�\����2pxx2�8d�d�^c ���k�!���k���5s�L�7}����
�3t�PC�!�X�~�����Qe���X�b�o��G��m����;�����Q�F����k�����mC�5|||���cG����2����G���o�����b��I��������7l��e�'�|����5�V�j���?�lw�)S��e�z��d��H�"�$�H�"v����|����Gq�yn���q����GFF+V4�M�:��r.]�d*T��dX,c���N_czAv���dTm��������8d����*��od�q����������S?�XDD��e��&M��r��*R������}��i���:s���.]��={�5��	4k�,���[aaaz������_~�E'N�����d�}���z��7����'�����}��j���BCCu��!M�<Y,p{tqWV�^m>w5�wj��c�C=$I<x��n���V�_Z[�����[��<(I*U��:u�����_�2e���G5{�l���O7nT�f��m�6�;
h��9�Z��"""4`���][�K��YV��=u��II��A��u�������'^Z[�d��� ]�2e��5k&��G��'�|RK�,�����y�f��W�i��f�R��
�t�Re������]��S�Nj���bbb��'���W_U�L�l�?z������j��9����M�W^yE�<��-Z����������u���H����Y35k�L?����m�����}���n��������g���
��o�-___�2�
��A�4v�X���W�����{�=�2e���_|�^�z��������m�f���/����K%I5k�L0?�!�C�xim=���o>�n��Z�r�KRPP��M����`I��i�\��#G-\��&����aC3`�x��v������_~���HI������%K��;W���.��Jtt���?o�]�D�d��I�F���b�$���[����r������o�>��3G���W/
:4A�.I>>>3f����k�����	����S]�t�$���o<x�$i���z��W����=[~~�[�d�d�I���3x������d��
*H��m���|����3gN��z�!���L�����GtXO�����[7��q����6g���i�.]��b�8|l��!�m�V�jUu��I�t��!M�:���'UZZ��'�4�iY)���t��5����v��7N���$}��g�7o��t�b�����d��������L��q?��+W�������U�t��]�tI7o��a	��:u�e}�k�v:�`��6��v��y���?���e�����sZW��M��7��lSz��{�i��E�����a����O*00��mJK�y�������@<xPtZ����k>?x��4h��L�,Y4g���WOQQQ����9�ztxix�GN��q:�!��
��a����9K�.U�^�t��%������,�+W.�������6�N�>m>/Y���e�S��9r��}��U����a�W_}5A����o���Ov[)U��z���o��V�N��_|��^{-��������?n.�}��.��v����j�����{O�6��l��������2p���<���z&O������[��cGEGGK�|�A5k�L%K�T��� ��"���rll��z}||���7n�����\�N������)O�<:��$����v�W�VM��U���O?�4��pe��!�>}�"""���O�>��-[�/������^������s���2e�����uk�|�xx2��IK��<��t�[C�1�����J�>����#G�L�6�����#""\��y��G�[�~}-\�PR�I	u���H���?~���Kz���u���=Z|�����$�^�!!!�z��r�����������W�^6������]�v�W���� �����<u���nI�����(m��A�T�jU���$?~<�%����3�9r�eyw���y�����3gz���0h� ���S���g�����^nQ�xz=,XPR�(��#�'Gll��|�I3�����,�bbb���O���+Y��#�E����q7.@@�t��Es���%K:-�c�]�x15��<y��h����?���e��v�Z�,�[�n��;�$i��=Z�d�G����Y���7��$��uK��
�n������a�������#m9r�~��gIR�f��`����K��'N�O�>Y��#�E����q7.@@�l>w5����CS�96��o/).H�����;w�����;�,3((H�����w���u��A���i�=��
.,I�<y����O/�(i<���w�n>��w���m��Y���w���3d�X4j�(U�RE��p�B�7.Y��d����S8�q:��,Y��t����]�vi��	����h���Z�re��m��
�$}���Z�xq�2��_W������>�������$���K�]��&N����(��;vL�������J@@������/�H�e{�'�s�5�u�o�>�m�V.\pX�0m��E���j�iW�\��O>���Y,M�:U����$e��Is��QHH�$i���i�$
�^B�x�"�5?o7H��^zI�>��$���W�����aCe��]G��w�}�C��|��
��]�R�]��������_~Y�������:t��V�Z)44T�����u��Iu��A�-����M������9S����������zHU�VU��9���p=zT�7o��M�#I��9�r�����8��{w�3F����n�����K	�^��&M�_���{�j���*Z��{�1��UK�s�VTT���;�}�����~��S�T�D	�3�����{�������V�Z�L/U�����+���C�n�R�.]�}�v�D�A�x�!�5.@@������S�'O�a�3g����cS�B�
Z�t��~��Tm���u��U�1B�ah��E	��N�:i���
�3g��3f�i��z��wu��1�9sF��O������'�xB��
S��=�G|||�����m��)���������7��g����3�3fh����{]}����r�T��>���|��w������w�i���z��W��W_����2����S8��x�@RY,M�4I.T�-�3gN���+_�|j������Km��]���J���_~�EO<��
(�L�2)��j�������y�����?E�����KK�,���?��U�����S``��/_>U�ZU}������u��YM�81U��xm��Q��uSmy)���9$$D��O����k��F���;�����"E��y��6l�~��Wm�������z����z����L�29\�7�|�%JH����k-]�4�o�d#w�<���C���:t��:8-cR�3l�0
6���5j�H�a�U�V�Z�U����E�u������S��m=2��;�91�K���7'�Y	?~��������+�?�����T�|yEDD�]>44TG�I�2�<2p���J/��<���I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\������Y�b�:��f��l��E�����
@FE� ���Q�����;��&�C�����
 ���Q������dT�o2"o���0����u�V��__111�n
x����bcc���(�6�����
@FE� ������M�T�vmo7I@�
 #c@FE� ���Q������dD����z�����9S������b�
���;�o2�6�����
@FE� �:t���u����o7ID�
 �b@FE� ���Q������dD����=����U�Jo7<���C���d,�m2*�7�����
��� �a@FE� ���Q��������|��@���I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\�����W�������:u���y��][AAA�X,�X,
KR�G��k������+k��
		Q�2e��s�i��=}
�,[�L�:uR��E�<y��N�:�����b�������k��r����;�T�@U�VM�������HM�6Mm��U�"E�L�2)O�<j������'O�l��;w�k�.�?^}��U��U�)S&�7g��az�RSz����9����k��az��G�?~�?�X,icdd���-kS��
<R7�K��cgv������Jaaa�^���-���(o��j�������'�u��uK�&MR�6mT�X1)k��*]��Z�n�1c������g�
��R{�����z��wT�^=���K���
		Q�����C��9SQQQN��t��/^�7�|S-Z�P�r��'O���+K�,*[���|�I-Y�D���.�t��u-\�PP�:u�;wn���w��U�V�0O�
RAj�o���^|�EU�XQ��gW``��)��m�j���n�G�g�M#""�u�V}��
S������g�5u��$�RH��� u��v��a�l���}4j�(A]��OR]�E�����S�Ni��I����*V��l�����_9r�P�j���K/i��}y/�odD�:N�}[�5k�����R��%����.]Z�{�����=�nH/��_���1��S�&��$��������������sgs����_9s�T�Z�4h� ���n��S�����V�F�<�/��Jb�U�h�$�HG�{�v�2$�v��vS��:�>z����:��gd���a��������=�b�4s�L�7$�����6m�8�k*dl������v��fX,���d\�r�a=����Q�T)�u�}���6U�R�iC���{������[�l��y=a��A	�]�~�G��s�oH���?v%88�e$�0��}�������������_tX�ni����nc��5\�Ee��1�������>����R�Q�J����N��V]���7�����p��
I���[tt�1x�`���u��5���_�uyz�4G�N��2eJ2^9���4�c�Od��kl�#9Rs;|���n�~<���	�:v�X��
		1n������{���J���o_#222��\�CR�vF��������0.^�h�j��e�{�6���������!-�F���c�S�LIT_I&�:���T�97�8~��Q�jU�u���������.O����7$�7��6l��m�c�����S�Jb�U�H���p���������
�#G�����]���9s����'I���Q�.]��iS���i��-�6m�n����C�*  @�N�k��*&&F�:u��U�$Iy��U�>}T�\9]�|Y�g���-[t��I=�����e�����d/����j���v��)I*P��:t���+*k���~��>�5k�h��]�9y���4i�+W�H�������0�.]Z:~��f����*22R/��������wo����|��)   Iw��]����?���W�����o�%���v����c�J����u��M��
 exz��]y��Q�5T�bE+VLY�fUTT��?�~�A[�l�������o***JC�qZ��)S��wo����b��y��j���
( ���3g�h��]Z�r��z�v2ol�}���z��W������6m��P�B
������S�������?��qc���_����[����*V��j���t����?�2e��+W�h��]�;w��^����w�~����w����������K������%�5k��U�*O�<�����m�4s�L��qC�6mR�F��m�6�u�>o�o���~+)�o�����4i���P;vL3g����e�5o�\�7oV�l���Zr�M���p���s����=��� =#������]�tQ�J�\����R�n�t��IR��=���'�/^��r���K�]�V���sg%(s�����>��5j����+[�l�x����Y��K�*66V��������l�2Y,�� ��vF�������"""��E3o��-��~�iU�RE>>>��o�&O��.h����u��f�����@:��L���d�=���j����2e����K��{~��u5n�X���$���*,,L<��BCCu��I-Y�D��mSLL�F�%___���{v��R}%����s��������Tx��}`<{�����r�;<��� �F�i����������G��a;�[bFG9���%KC����c,]�4A��[�AAA�$�������?<�R��TH�o����O��+g�={6A�W^y�,S�~}�,�E�f�����q��-�e���_#**���^�z��4o����������o�i���;���h2�X�t�9�����������T����e���O��o�5v��a��}�0�������;F�
IF��mmF�����
I���cw�������a��M3G(���s:����
C�Q�pac����FGG;��m����
I���nFhh�Y��	��;����$�8p��r'N�0�\��t�/^4j��a������-���y����������e�?n�)S������y�oH����V�^m�ll��)A���h�O�>f�g�y�a}��7����1r�Hc��U���0�=z�uqt� ;M�X��8���H*oeD�,Z��\f�2e�U��;w�\�r�����/v�=���F��}�}��9����~2#$��MKV����"�3"o�t�o�>������%]�t��^��Yn����j�C��� ��KO��n+�K��7$Ez��G�a��X��q��E���_�����r��+�9�oH
o��h}�sry:S�oW��
��6x���S.@���!�g$��i��A�|�?���rc��5�=��h1���@bEGG���7�;G����h�R�Jf��1Y�����{��@�f]�����r���F��y�����w{\��]�mH����9�����6d�C��%K����t/������[w=���f;&M�d���;w��%K�������#o�n�G��������5k�z�W������o��Z�j��i�?6-�(T���2�.]r��={��u��
�E����F���U+��O>��a���(�q___���c�Z���M
�������u�q����GRx+#r�#�<b.o�����k��6_:��q�O?���eS�<%%3"o�t�o�s��y��$c����;z�����gH2J�(��v�}�oH�R����1Y.@O����X!�[��Y��~pZ_�j�����/O0=��+$�<%=]���L�cji���SH����k>8p��r}��Qpp�$i��e�u�V����Q#Y,Y,IRll��O���-[�`�����7�Y�����i���M,XP�����=�|�A��������.��g�1�y��a�e��Yc��X,��u��r;v�0����k	����j��Yj����)���3+00P
P����S'}����t��;o�]aaaf�?.IZ�t�}�Q(P@�3gV�R���s�����6���}[&LP�z��7o^e��Ye���;���7n�\��M���gO���


��������r���e��1b��u�e7n��3g$I
6T�*U������/�`�={��d-w��������5*Yu�?�|^�T)��|}}U�xq�ow���a��
f�6l�0I��#G���/�L�2
V�|���ys�^�:�������v��%J(00Py��U�N��w�^��>{�����u�*W�\���W��YU�D	��][�>��V�X���XO�l �e��-%���O|����6�w�}_���S��m�����={��W�^*^��2g����}����}{��W�\��m��H�"
P�����O���c.����k��A�^���g�.���C�J�R�
���/k����~��=��0��={�n�����#���_~Y%J�H��y
�n@��������wOO���;}e�9���b��*S��$)""��_�����f�f�����R����%K���K�����y�d���P�>}T�L)g��j���6l��r����;v�7n��y�*S�L


U��EU�zu���K�����;w���oI��-66���Y,u���aY???u��MR\1g��$-3�c����������oeD��9sF+W���=�l{��&M2�����a9w�3t���|�o���7Ll��7�S������S�����+W����b���a������m��%�m�m��(�d���7C��OW��M�/_>�\�rz��7�������?V����3gN�R�J3f�[��?��'�xB%K�Tpp��?~U�PAm����1ct���y�@J�����V_I�od*���i:�����Q������Q~��w�F����eK����+��V��V._�l4h���� �3
��#G�x�n������1b����;w�Y��o��[���_�������[n��Qf�+V�L�x��Q�V-���|��GIx��X����#�SO=�p99s�4���k�a�9s��Q����<��q��E�����1�����kk��u�_�'1���^s{��3g��e�����en������'�Lr=����~��������<y��������^FJ�Es���6u/Z��		q������������=����e��9\��+���P���.x�5'}�"#�o�8�~tWTT�Q�jUC�Q�^=#66�0��w@�{D����������������O7#n��^�z9���d�bl����r'M�d�����������
��V����cG������Y3�����S�l�yw��0���x��v���Z�jN�._��,��C�$/�0���f]������W7���m[��9v���o�����}h{��}�������3�"d���7�8\���;�|��������#���S���X����?��#O�<.���7�,_�N�D-+����R�������4�cfd�d���s�f�l�#)�q��|�����m�&��S�N����wl���s�n���7��&�.��]��������)�����g<���.�}��g��o��f��f�m��CZ�R�eJ��������_�n4o��aS�xq����a���i�*U�a�F��n��������Guk�����K����7$VF���������;�/�|DI��}�l��f~e��=�o���r���T������?u������[���7�W�^�e����k��U��-[�Lv�|�Im��Q<���x�	�(QB��_��?�l�9}������s��I��)���0�-[V7n���?���*::Z����n���#F�,�q���X,2C���S�~��e��u	�~�������W���m������P�B����J�*��������:|���n��M�6%�����7�����U�\9=��S*^��.^�������_��K���C���_�<��v�������M�6��;��;�/��R�N�������j���	����_j��q����Pu��QU�VU���u���:uJ;w��O?������������S�B�t��I�;wN.\P����L���f����E�i�����{��\���9s�r�������z�)��9�k������+Iq#P-Y�DAAA6e��;��c����gOe��=�mOi�w����������F������
4e�EGG����V��u�{�n����6�7o���y��z�jEEE),,L���r��e����O���7Gl���Z�n�|��)  @/^���v�Z�n�t+#�o)���>��]��	&�������Z�p�r���^�z��TTT�V�X�y��)66V={�T�������k��Iz����[7+VL�/_��i�����*<<\]�v�����L�2�,���~S��}#___�h�B=�����#�?^{����5kt������d���Z�x�$)00P�[�NP&::Z����$)g��*Y����9��>�L��-�?��#???*THM�4��T�t�T}����9��v�W��r����/j����8q�z���������oJ�|||���/'zY�n��������c��I�K����c��/R�H���w��	�k�N��]SXX�6l���@���C�|��n�������v����%�����\�r�g���X�������?h��y��^xA�5R��em��v���w��Z����o�
(88XW�\��C��~�z����#�
Hm���w��!1���Q�o
 �"�ENx�8�;�L�b>wv�rwL�6M111��G}Ty��IV}�����c�����S�)����s�c��}I��}�x)}L��������u��I���*W�\�T��Z�j�=z$8O�z�����W�f������
(���Ok���:t���=���zJK�,Q�f�t��)u��Q��7W��Y������/���+W�a�����z��w,��������%I�s�V�����(g�������c��}�v�_����H
!o����l�")�;[�V-���3A�q��i��]������B�
6��B~Ed,�<��~��7]�pA�������T�Nu��U�7v:oJf*�������C�)<<\��eS�b���aC���;E��d�4���e��(o�b�H��(��7�q�.h�'O6����+�m�iE�������?l�}�����7o&(�b�
s�c���	��/_��d�����)��k��C���cHq#GFF���s��lw�s��>>>�4G��F��Ut8����%={�L�FGG��M�j����b1�N����3g�y��5$�����3g��}?{����������[����'1�X�b�w���c.�[��b��MIZf����:���kt����H*T0�=���.����'Oc�����I��3f������4�w�����'���)�(Z����;m�4�L�������u��FDDD����w7�~���	���G���?��i��m����������s����:x���
�����LK�;�K2�T�b������U�T1,���O��zQQQF�&M�����KP�s�=gNwv'���X���N�kL.�7xJj�����6/^l,^���;w�1f�����������a����,W�R%c���F�9�������Q��F�����f�oH<ol��a,X��f���u��G�6f��e|��������PC�b��3��z��;g��.4&O�l���K6��W�Z��v�Z��n���*U�U������9r;w�LPn�����b1���9s��W7.]�����!C���}������oN��������7��?���!�oH����������-�q��e���{�=����S��^Vr�M��Zw@g��1����u�q�������bI����l���\F�������(Y��Y�?���6Z�I���]a;�5�7xJZ����S�������6y�+��R%K�Lr����C���*����8&{w���;wnc���yw���;�p��
s�<~�400������������@s�����6������Y���%J8}��]�f���;��1����X!�u��Q�vm��,Y��?��1n�8c��Y����m��h��nn����52p����SR���M�41N�>�����T�i��������'�.J
�O]�vv����?D����8
8����/�pY~���f��{,�m����R������}�lB'g'��5�,��]��_x�s���{m�-_����v�Z���u�l�m�������o�L��u�9����r��H2���\�r��;w����y��i����9b������L�?��S�N{)�$V���������]����2�/k��e�Q�LC��)S&�w�����S�����4h���HE���#����F�.]l���h��Y�>�]�y��-[���B{G�'N�0�4i�$��~�����;�+��oCRd����>#1bbb�6�/_>��TJ^��)S&����u�<�����(�e��M{���`z�-).dK���)�yrQ��5�nkY,�Q�FN�Z��,_�@�D�
*~��1w�\��/�4�6mjS���c�F�����
���m�x6l����������[o'N�p���+W:�/w����A��=X�����<y���.Z�(Y�����w�Z��������#$$��d/^<��>������OV�S�����	J�}���r���F��em��p{9I�7�'�.@g��1����u�q�����s/g�l�#)�y�����0s���z����a��q��^�n�'�g��9�'��c;�5�7x��/@��q���m�6�$c��=�;v��\�\�r%�}�A��.�7�U)�_z����)S___�^�z�o�aL�2��?�1a����6�Y,c��Y�~
���=���r�������{��e���q���3g���^{��d�?5��!�2J~��-��g�52g�����U���-sz|0��+kd����������g7�q��?4���;c��9���c��~�<�%���mo�V�H�LE���O�>��_~i��;��1c�1l�0�r��6}Q����}<��S�����@�u��
�y``����3g6�_�~�#mx�������+Y�h�������%���Phh�$i���������I���u�l���]�T)5i�DtZ���$)88�|�k�.��������������5k�L0`��z���o>?x�`����o����s�NR��i���\�b>���?�={vm��M&LP�=��kW�=Z������+'I������o:�3{��=z��y��e��[�>�@{��IR�SC�*UT�N�����k>�������B�
�H�"���oR����c�����������*b�����,(QL�Q�(V�Q���O���DM��j�Q��b�z��XP�
�
��Q������30��0���<�<�>g����3�������� 5��VJ��_3j��4k�,�\sM��������f�UW�t_�6m��&�_y��i��E�e��b�b���&M��w�yg>[
��
+��w�1k��f�e���?�0�}�]9���3&'�tR������>:?�p.���b�SN9%���^���.���tr��W�^������7����S�N�e�]��.�(?���|k��z��U�����)S��{��O>I��������>�m��s���{������6�����c����m����'I�����5v)��(h��v����O;��<���s��1cF�=���7���_�u���X�6�*s����9������Z�by�|�Mn�����C9d��4hPq���J������w�}7{��w
�B������
+�0_u��MW)�)k���m������z�����<W�/��"����2m���{�����J=&��6���w��O<�?���9������{��C�W\�w�y�8�S(r�!��t>��c��r_�9������#������O[l��������LX�5�9�6m������)��Re������y���#FTYOC�_�����������o�9'�tR��w�����9��r�=�����wV^y�$3�������<|���?>W_}u�>�����?�Yg����Gg��!i��u���{���^X��������t`������3�<S��i���Y�]�v����)S2f��
�{��]����G*��=���;$I��n�
��Y�M�6s�X��:�'�
��:(#G�����������[T��E�Yj�������N��L�.]���!f���7n\v�a��q�������l`�3fTx������A�.]���o,�<xp����_��j���K/�������z*�|�M&O��W_}5g�}vZ�j��z(={�����_��*�y���b��l��jTv^�-I~��_�/�K�}���4�D}��Ry���r�g$�ys���o^���S��[�������3�������������d�
�F�J�PH�P���~�^x!������7����N������~����'�Xc�\q���Dt���oR�:uj�������|�w�����>�;�����.���N.������[�2eJ����<��#�e�]���_���k��v�L�4��z���c��i�2a������ov�a��v�m�u�]�����i�i��9��C��O$IV_}�
7g��O~��y��Y��V(���_V���O����%I�:���u�Ys�L���~�����7����^�ze��4hPn�����O��o�+��"�,�L1�/�<�������3M��7�����.��x9�E<����_����g����,|�|����?O�~�������/s�q��W�s�������u�m��{nq�����x�����3l���z�����{F���W_���R�}�m@y��]c�5�1�2�/�xn���l���I���'��.(���+���o��uK�jTv���K���#���?�y|�A�A	�z��nH��]s�Yg�o��y��G���_f��)y���r�E�c��y�����o�\w�u�����W�����r�-��U�*���'?����_L���������.�����Ue���������?����{\�.�������o���=�jC�)��S�N�����@�L�0����ZkU[_�2�?�$K.�d1����/N�O�4)c��M�+���|��g�+�L�<9�F�J�l��V�/���7o���������_�m��&�:u�N;��s�9'#G�,��\*����2�=�:u*v��U.����\P�{=�����/�%�\2[l�EN8���u�]5�w�����?��]�0���n�a�S���?f���s�9��3s�I'e�����������r�-��}��n�:��w�Yg���~8�Z����~�}��'�~�i��_�j�jS���k_��}s�$�9�t�I'e�UV�j������/W]uU����6*M!��J�P�������g��W����z;VU�#�U�w=��C�7�����9��#��K�t��=���_��>�������]�l���9��32f��,����4iR�����^zi��s���>x���GqDq{���nP:
�w������g�><;v�3�<���?>���ZZ�l�:d����=�����>:I���{�O}�L�����K����ny��������I�a����C�U]�B!Gydn���$��+���~8;v�U=�����������{N?��$�w�}����w���{�_~���������������m>,T"�5k�,��zkq1�i����n�������|��;vl�[n��s�=n�)u<Y��6�*s���++��g��0����'d8p��������F����BRem}��W�i����+�$Iv�q�
(��~84=���Kl[v�e��#�����/r�Ee����������;/'N���o�������R�}�m@y
1&��y��{����������$��W�*�Q�\v�e�����;}����K.���{�������Ce��i�m>,4����A�2`�����9��c���+�o�}:t���-[f��V�o���5*;v��i�r�G�3�k��+s��h���{�������H
5vx������/Jv������th��\r��vM[����v~�m�v�������v�v������_���6{r�����s�=�$1bD
�B��������M�:��2���#�7���?�]v�%�=�\��s�b���_��z(g�}v��f�����:th��RS5]�j~W�Zy��3f�������S����g�y&_|qv�m�,���9��3+M���!�b�����_�IG����f{���*�����r���'�����'�Xe=[o�u1q�����r���T��5�1n���<xp6�`��{�����7��#�<2]�vM�~�t�h5��VJW\qE{���v�������[��-s�}����/�pc��q��O+Zn����~��u�*0V]u�b�l��)�.v1���&�l2�:T��+}7(����]~���������k�O���������������I�����x�a���x��B��_��������df����>�UVY��m����o����r�]wUx���	r�m�������k��m����3�1i�9��_<��~{z�����~Yu�U��m��o�>���~�<�������h����
eeeYv�e�|����)�T�7^��Y,qq�q������N2�)�{���|�W�d�����?�|�����;��kQ�R����>�)���Zk����4hPv�e�t��%�Z�J�N���g�\y��s��_��o�Cl��c�[n�e��i�$y�����y��u}��G�����9����c?��C������i�����+���kf��1_�������'O���O>���.�����Zk����S�N�e�]Vi����2����I��k���������*<)���������th��u�V�?~|����)���T~E��������Wj�������|��G������_�,���I��]�f��V�������3���[/��zk>���<��9��s��O�������������s���|6K/�t.���L�8�8���^{'����������.��b��F�!���k�]�������/���_W����f���I�>}����I��N;������x��y����;�d���9�������&�9ix���f�M7��	���k����fO�/��r=zt�=��J�}���g�R|����w���>�l�2�|�|���7.�^{mX��N�6-7�xc~������>j��B����;�G�1���q2�>V.�8�����5D���*���+��]�����3���������'R�?^e�rN�B!G}t����$�
+�������S�&?���2r��|������[s�	'd�M6)^��92={���?��-��k�9�>}�d���y���������o����cs�9��S�N7n\���k��V��e��������75a|�b��na���^{mq{�}��b�-V��^y���w���{������*}��-��l��v�����]L�1���U����Z�l��>8��sO&L���1�&M���?�#�8"��7����6���mm(b4.rL�Y�f���$���/���\��]3h��L�4)�=�X�?���������&N���������4��>>j��bb��[o]��lm��^����C�Yf�e�����r����-�\���th��_��vMn-_f�����6�i���+n��?����o�Q�^~������g��l�2����;��C���'��,��}�
��k�.;��S�<��<��C���O���������|=!�!�h�"�m�Y�?���r�-���Or���/h}���q�
�J������'����O�t���B�66�p���W_}Um��e�D(�1��C�U���������k��o���o��/��W_}5�{�N2��"��zj�j����R*
If��y�gT���;�?3h����O=�T����u��-�rH�������[y��g��6>����w�y
�BhZ����_������p�Z]�\Pq���w�)j��[C^OV/��}S�W\�d��������k�WF�.�l��s�\x��y�����;��7u������m�B�5D|����`��������rm
�7s�����8M����6mZ�R|=�I3�������)a|v���d���{�_���|%�/������k����:Mi�Cl����1i��������
�u�����WN>���}�����Os�UW�������[	�����r>�)������W������rN���5&�O�M:4b���NV^y�$�k��V!�fN�~�m�x��$�b�-V����m�����|p�e����<���I�V�Ze��7��L�������&I�z�����;7n\�d����Pv��^x!���^�{��$3'�[�hQ�sY|��s���g��vK2��<j��Z��0j��y��s��}����f�{����?�iq�����g�{������.����;��sq��^z)S�L�g���(�{���7��|���O�]j��j��EQ���s�m��Y��]_������7��f�m�������V����+g�� 'kF����!�n
y=Y�x��}S�r�-����g�5����7+��rn��������_n�+@�hk��VS�B!�]w]����Z��d&��@��7^*��i*�~�=����'&�ys��<uw���:th�u]���L>���g����&�|^�p����,El����s�=�$I:u���w����hHb4.��5jT~���$��+����um������_������8��>�P��M}��8������+�����T
�B�6�����O+�����{�]������,w��W����K����?_`�{��Gq��+���_]e��.�,�|�M��_�~i��u��f����?��C����s�5{�}������i��Ux��V]u����:���|n,z���.]�$��b����+-7}��\r�%�����O�����+;��}�]���9������v_|�l�����_��_���<cf��p�
�����_,��RYb�%��o4N�=���/��B�P�O�������?�����m
A�
���W^Y��*�
0��}�u��s����������;���M���]C���_O��V���o�Y�9�Y�f��O~R�����{n0�W?��c�)����K�><k��V����l�2+��B��Gc���������3��Nce�kS�����/��|n,�~���^[��������;�|�I�d�
7�&�lR�����s%��{��i���|�����n�k�r~c[Mw�q����$�{l�<a���m�x�rLv��9��3��w�u��n��H��1k�s�������Og�������������+s�P�x��2����>RC��2$o��F��C����g��ZX���	������WqE��.�,w�u�\e�y���q�I�-Z����Z`�[o����_�$��	�����������<P<h��YN>��*�,?y>x��$���nZ�9}�.]��{������9�p����/�����|�In�����
7�����	&��O�[o�Ue�i�����{��Fm�Z���y�
�p@qr��SN9%/��B��7��������������e�m����������_�U,(o����o��������5���[W����/��_����/�P(���N+���m�������5u��sNx����1��2��
+��'��5��F��p�	y����Y���//n�o,�j�������U�>}z�?��
����D^^�����N;%�9���_���>������q�If.�q�QG����}7
�w�w�}���]w]������������������N�:�U��s����^�9&3'�v�e��X�v�mW�����[��]�t��#�����\rIn���y.F2r���;6����^z��<(���65jT���9
�\}��9��c�$����2R7�M��`|ps��1�������}�����Z�jUaa��4hPq�����|�M~�����|��}��j��F?j����>�)�'�%�c�=V�����>Gydn���$3��N=���7���m������O?����:�'O��X�}�]8��<��#I���[���ya4f���s�9�0aB�e����
O��hl������-��2���������O?������*�_}����,p@����+s�P{5�o�\rI��Fc��I��}����v�)�o�y�eK9�r�)���)�Ir�M7��#�(�>�����U�y~fa���vZ4t`Q4~���:��;]��/��O?��������I���;��K/�A�3fd��w�>���w�1��7���#s����t�9�������pVU������G�L�81��sO�]w�|�����[����<������[�	��vZ�_�I��V[�u������]�}����k��V,��S�*��	r�	'���O���n�-��"���Z��o�I�&e���6lXqr���Ys�5��kY�~���\t�E������&��g�����{:v��o��6o��v�
V��_m���Si�>v�a���;��C��W^��n��;,���N>���6,O>�d�d�%���$���r�-s��'��.�_|�-��"x`��f��l�2/��B�������?��O�����U�.��������1cF�������Z��������e��y���s��7h��	��/�|�m3fL�������/n?���s����{d��7���c�>|x�>��t��9}���Fm�.]��Y�f�0aBx��<��C���q���f����y�������cN<���>�����o��_��]�f�w�l�e�Y&��O��~����+#G�L2�;���Nj�C�����&F����:*+��Rv�q��������sZ�j�/��2/��r����
���������{WY��W^����*�q����<��������k�|��g��������_{��sMt�?_}7}7���w�i�����{����g
�B=��2$���[V\q����y���2d���K-�T.������<yr�>���{���v�m��f�e��W�K,�)S���>�O<�x S�NM����
���k*m��������oIfN�w�qy�����k����z��Q\��1=zt����t��!}��M�=��
+�U�V�8qb{���u�]�8�7���6=��s3r�������t�M��
+d��)y���r�����m���?��������������>�h}��
��_����o��o�Ya���+����sm
��9ps��9p%
�/���G1����n�u3�G}����?���������;����~:������^a��*;���|=�iA�gQ�����s�r~c[����/�,�Lv�y�l���Yj�����_g������[��G%��<u��w6����
�jA���tc�'N�G�O<1;��c6�d����Ji��]�����=:7�tS&M��df|���k��*����
������g�����w�j����V[�[�nYb�%���_f��q6lX1�o�������������	��z�*~�[�n�����&��m�����r�w��'�(~�7��Mz��Qi}���Z�gQ���[�>�h�;���������O�[o�,��Ri��y>���<��#���{����v��������J9�r��W�O�S6�l�l������[:v���S������]w����{�X~�]vi��n�Ok�@����������n
54|��B�Z��u�Y�����//�i����7o��p��g����{�.�[S���
����<��E�����w5�o�m�����~��r���?+��}����s���5�{�����������?�<�X�����Y�k���$��]��������ux������;5>���[����o���Ji����u���_v�u�y�[_q�#G��g=�]w]�|����=����Zh���<���o����>�zn���B�������u���_\�s���u�]W��V��w\u�]g�uV������Yv^�=s~'T���]���A��|n�"�1?{|�����Ou��y)7��15Q�wV]�,U_o�UV���i���*�{��u?����R^�$����Y�O�
�_~y�����^*t��}���o��p��7��}����V(�o�����M�<�p�!����X�n�
c������cL5��i��
���N��*T|��8��J��;���jt^-[�,�{��u>�R�������W���u�Y����V�k��}�����5�k��1w���6N��+�1^�Eu\���PsD�B���[��g�����:�?�������g�Z���55�K��^=���X�sD�9N9���P(��kWm[���W����T������X,�xY(�nL��;��q��t�R����5���S�k�����5�>b���g�^�
�|��|�]i�o�Uc��m����W\����5kV�����O�^e]�����9��������m��j|��}�>����G)�T:t�P�v5k�������0y���m^\�V���N=����:*}����W^����?���~f�����_>;��C?��}"�k��_|1C��m�����G���>K��m��J+�O�>9�����Zk������>#F�H2s�������r�m�]����+��k��8 ���N~��<��3y�����G��~�b�-��W^9[l�E���y>�na��k����[y����SOe���y�����7��U�V���K6�x�������Z���@�����������w����y��g��'�d�������_���9��#��C����C����k��6=�P>���L�:5�;w�V[m�8 ;��s�����^�a�2d�����;vl>���L�>=K.�d�w�����.�J+�T�sh�����<���y���2z����������R(���Kf���N�>}r���V��xh,{|�v���<��y��'2f���������/RVV�N�:e�u���;��C9$;vl��B�p�%�d��v���?�1c������g�}��S��}��Yv�e���o���k��jO�[o����<xpn����������O��}����Z�y����_�:�,�L=���O��E�����n�:�^{m�=��<8#G���o�����:�Z�J�����&����E���_�rVYe������1�W_}5|�A�����l�2:t��k���6�,{��w6�l��������+��>�d���y�����o��O?��i���Kd�5����n��6�'JBUt|�����6�,�=�X����'���,�.�l6�d������k���k���@C2n|^����i�9��#G���_O����J�q�����Ok:��C����L?�R���o�9�<�H�z��|���~�r�-���{g�}�it��9�m�x�jL�O�>���;��3�����w���L�4)_~�e[l�t��9=z�H�~�����i�f�ai���;/��Rz��<���y��W������K�6m��
+�'?�I��g���g?k���|i�s��m���7n\�
���_y������f��)���C�Xc����+L�n��Y��0e���^����gy��g���/��O>�g�}��1:t�*���-��2���_6�|��[�9�|0O=�TF��q�����>��I��$;v��k��^�z���N��]�����\��NYa���������&�����O�=�9%s�
7d������m@S%�M��4U��T�;m��
��Jh��7�����J|�*�
h�z���?"%	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,-��������^{���P2#G�L"�M��4U��T�o@S%�M�����	���(����*�
h��7�����J|�����.+
�m�����N��=3}���n
@�5k�,3f�h�f���4U��T�o@S%�MU�����Od�-�l��P����Lh��7�����J|�*�
h�r�������[g���:th�w����(�{��7g�q��4)b�T�o@S%�M��4U���Z���[7tS�#��@S�4U��T�o@S%�M��4E
=�-�	���{z�����(��^{-��4-b�T�o@S%�M�����w����M��4U��T�o@S%��^��n	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:��������/g���9��c���[f��KYYY���r�A���7�|3'�tR�[o�t��!���O�n�r��G��^�U]?��c����l���Yn����u��������_��3f����I}���������^{e�UVI�6m��s�l��V�����������
��5*��{n����UVY%m��M�6m������?�i���'_~�e�um���������g�=����"�}��7����r�1�d����2�,��-[f�%���k��8 ��
�B���<yr�������n���k[l��j�*�;wN�^�r�9��������)S�������W_��?<�l�IZ�j%�A#��c��g�]�����n[m�����M�VYe���]��^'����f{�������g�5�H�����}����Z9��C���O�����!�Mk;���;����R�����>O?�t.���t�AYo����E�b[\��X��4�}u���d�z���Y{��+�5b��:��gA���7n��w�q�p�
��c��i�&]�v�n���a�����Y�����6h|b����0aB�����}���u�]��r�U�C� �A�����.�=>@y
��t�A�j����'����Z4t�����n�����y��W�����?�P��7�x#o��F�����y��9��3��k��q�c�=����Vx��?��~�{��7W]uU���f�e�-�y,L�#^����~����/w�uW��?���|����Qo���l������od�v�|P��	&d��	y������>W]uU��c����j��V�:������E]��N;-�'O�k�7�|��_=���z���={f���Yy���Y�/������?���\�f��'�x"��~.�����7����-��2�G���������Vu��R^�MG)�����o�&M��������o�}�������'�^{m=��\~��i��e�OX K��:��o+��R>����l*@�2�84�~xC�3�u�Yy����
@�,�1�������N������Y�����{������e�]�[n�%�/�|�u�����OC��Jy����;?���KR���o��4����s�0��i��������__��K�	M�t�����Wx��S�,��R�&�����Cs�G$I�5k�}��';��CZ�h��#G������?����:+�[���'�\e]&LH��}��{�%I6�`�x��Y~�����o��k���o��'�|2����c�=�v������R���s��������$Yv�es�a�e�u�����a��e���y�����.�d�������\�|����������v�e�����+����[��7��
7���^{-�&MJ���3l�������v�{�������m������N;-I��Kd�=�����G:�������VX!}���&�l���;g���5jT��o��6O<�D��v��5*�;w�����?�o�}����$I���s�Ae���J�����;�d��ay��W3y��w�qYl��r���VZ����.]��u��y��wK�[����m���O6�h�j�M�:5��)S�$�rH�eKy}?�����s�=w�e[l�j�N��kja�o��}������>I���K���N�=��Y��;6�
���~�k��&?��C�Z����4��[yw�qG�e��.�����9+��r�L���?��g����4Mau�c�=6�o��<�����5jgy�=�\.���$I�v���w���`�Z�c�Ir�1���+�L�4o�<{��w��~�,���?~|���_~9#G��N;��'�|2K.�d����Qyb4N
u�b��9g]-[��z���1c��W���qj��g���2
=>��_]�Q5�#�:��<�������?_HRx����)M�����)��R���[o��v�P(����B�B���X��>����K,QHRh��Y��;�����O?]Xl��
I
-Z�(�7�����g�b;��g����S+����o
�{�.�9���k�VhHC����R������+�����:��?�x�2'�xb�L��=+�����.���J�K.������WZf������>�XW�N�
_|��|��7��M���?|���zbu�����GY�i��
>�`a�����y��w
��u+������������N����n�23f�(�z���r�,��\}��~����<����w�Y����B�p�Yg?{�Yg����/�u�}�������m���[��J}}?���{�.�iP"�uQ���Rk��V���{�b���I�&6�t�b��o���'I��o�EC����o��R��8����������_���O�B�p���{�u��w��=s������c,}p������ok}���L�RX��I
���[��������x�M|�.���>X��]�v�'�xb�2��M+v�a�rGuT�����;'�m� �Q
�w+�1G�Y8���
W^ye��g�-�����B�����w�V|[8�o�Ec�?�Pp���B|�.����?�����J+N8���]�'������N%�7
��hQV�/�����_�s�{l��.���b�_��W��y��W
eee�$���[���7�TZ��>(�i������b��w�",.(����6mZa���+�_���i��6�h�b�x`�2�~�mq�v^f��Q���GI&�����RK-U���g��s]���F)�g|�4iR������6,��b�&�
��
+�P,��+�TY��i�
�.�l��K/�T�6K@oX���0�8�����p�TY�����������Fm��:��t|�2eJq?Ia���U����oZ�hQHRX}��kwb���F�4��R��*#���;m��
�9p�?���RcG���3�<�����K>��CIL
@|��bu��w.�s��WYn����E��7o^?~|���{�Al[8�o�JC��J}��u��8���p�(��rv���E��F�,���#�<R�����k|?t}���o���;m`����������o�,w�a��]�vI����+?��C�u
�$�������WZ�
+�����'I�����y��un����SVV����<8I2z��y��Yk������W�W���?���:*��wO���m�t��5�������^�1�y���1O;��*������rGqD���]w����e�e�-���{��s�1�d�
7L���e�,���Y{����;��SO������%Uc���v�}��I�7�|3�w\�u��v���K�.�i����������z*���oV_}��i�&�.�l��k���������?�9������:K/�tZ�l�:d��W��[n�_������{3c��:�,J��L�0!I��w������r��7�o~����a���U�]�vi��U��,++�^{�U|=v���6����3i��$�z����6���u%�G���8p`V[m��m�6+��bv�}����������w_v�m�t��5�[���+���>8������o��V�����t�M��c��l�2�:u��k��^�z��N���?>_���N�:����n�n��%���|��7+-��'���\s�*�k��yV[m���o���F��o�o���0aB����$I�-r�TY����
A�
�G)�K�!��s�=����:��~��o\e]���jz���df�5jT5gT5�
������s��������6��i���9����$\pA�_~��C?JoA����1##F�H2���y��-Zd��I�������n��\}�1�mb4U����Q�>�9"�
V��};��
������u�]k����?)5��h��wJ��W1X��eE�W^y������W[��?�i��}��7��M7��������t�M��{��w��[�9W&���
��7���]�Xe��i�_����Y�����g��O>���S�N-,����$�-����v�7�B]k��F��>���b�������w��]�Y�f�lg�����[�_`�P>|x��hn���B����<����[(f�:3{���~Z�lY�����<����[�=V��������J�
T�J}�@u�I'������B�0a��b�e�]v��{�e��:��#�\O��}���k�����;���.+�l���8��Y��?���B�0��x�2&-������U��k�-�n������]��>��%�QJ��-
��}�Q�FUZ���_~��*��6mZ�s���$�-Z>�����>����V=��Ri��v�y����n�UY�������_=T��f�7j��������[n)��lnN������O=��j�WE|���Ri,O@���[e��	��[��;m��
�9ps�ue�z���RcG-��	�S�N-l��&�$�m���0c��B�P(�S4���'�Q[z��O>)���s�j����j����_�cb���
����t�M|��j,�g��G|��Z������7�$�N�:>���B�P?�C�4�D|[��[C����@���K��M7�����n�i�����g����
����+If��4�'�y������rK�����o�>p@6�l��l�2���j�t�R,w�Ae���I��-[f�����WZ�j��c�f��A���O��O�W�^y��g+�d��E����+��sO�{��|��7Y|��+���G����7�������VZ��r�o�}�}w�uW�<��$I�6m����<�l�M�Yf���1#&L��1c��C��o����G��.H���s�1�d��6K���3b��\w�u�6mZN?��l���=zt~����k��9������k�����-���|0S�N�A��_=K/�t��|��G����)��{�N�~���K��n�:�}�Y^~��<��#y��7Jv~���&�w��%+��R���L�81�~�i�Yf��>n��]�T����_�g�Z�*��\*��sOn���,��R8p`6�`�L�:5��{on�����1#�rH��r�\r�%���k����f��Yu�U���������3�<����:���o^y���V�3fL?��L�>=��7O��}���;�s��i��Y>�������y����������d��)�U��_��������\A�����b�U(S(r�g��~�!��c�������������+n8��r����������={���^��_�%�\��d�C=4k��VMN�V���t�:�:
�
�<u��J����M�����1c���O?M�v�����g�����������n�����[C����9ps�s2�
M_M��t�����.�����3fd����Fm��w�9x�\sG���?�9�?�|Z�n�����)++��9��~8���C��q�����9� ��m�T�o��V)�����`a��SO�o�[��/�K�]v�z;Vm�O�7���A��)��^�`QV�M�9��Z�B2h��b��V������u������L�R\��e�����j��y')���Z�w�}����W���S��V?�����o\,w�QG�U�/�Kq��w�=������������Z�hQHR<x�\�;��b=o��F�}���+$3��9��S��M+<���U��N����VYe���o�=W�����Xf���+�n����_����?W�8�X�O��\����?�_r�%�l��Q�
?��C���T�@E���
T���j�����W[�W�^��O<�D������:v�X�g���u��w��]������Nu�i���=zT�4����=z�(���;����i�*��:uja���/����[������.���0f��Qx�����$���F)5��-�lC�=�,�����\s�b���;N>�����^[2dH��s�-������p@��#�	��o��(���m�?�x���-��\}��Jy}?[�8S�O�f�
�{l����i�����Fm5�ubu*�=��c�}m�Q�u����X��';���V3��� ��>��������GUYO}��*����.�U��i��o������+c������8j�0w���g�e��4V��W_->��w��]�}��M����o���C�:uj��ieee��?�|���=��
��?���
��k�Al�ia�m���F�,�O@�f�h���������D���~(t�������;T�W���k�"����%�5��i���_~Y��su��,��R�~�.u�l�2K,�D�d���������Lu���r�M7e��W������_����+��G���,���������m�$��A��O����J�s��^(2b��$������Ts�+��J+��5�\���7�|3I���W����7o��������u�
7d�UW���8����_~9:t��7�X�=�w���W���Vy��-�~���7�<m����9����q��N<��|��If����_��u
�<���6���T�V����������������Gg�u����_����W(��E��s�9����o�,�L~���U���������N�T��O?��'�\|}���WYv����3�<�}��'-Z��'�|�.� ������O?=���J����G}4�_�B����i��A��<p��Iy��\e�Ur�a��o�[n���2$g�}v��o3f����^�_����>}z���)}7(���N�NC��M7�4�[�N����y������w�)��UVW]�o�4t��1���������p�
����r��f�]v)^W=����r�-���WZ������,L�����1Th�j3�0[�����6������s�u���[o�����y�����S���N?���3l��y�5�IG?��c�[o��r�)�wB�������[�h�-��2��>��!C�,;}��:��{��g�I����#�A�"���
j�!���3�����3�������m�������c�6�D|�I|�I:,`�~�mq�&���'Y����������b�m�)~�T��w������$���Z��s�*����*���~�$���s�=�T����'���T�������&�9I?{�~�������{y����$�m��\mh��]�����Z`7����#[m�U���O�p��(���J+�k��I�W_}u����-I����6�C)�zM\y�������$K.�d�����u$��#���o'�?v�q�:�3/���k�7%3W�l�I���G�-ZTZv�-�H��-��;�M�4)����|���)S�d�=�(�0��_�"����<?��c�\p�9����,���������/�P�����4M�|�Mn�����C9d����8|���?>W_}u�>�����?�Yg����Gg��!�D�{��'^xa���)}7(�}�X���om������_|��~�U���_�W��U�M�V|�������5!�A�w�y����?��7���N:)���o��{��p�	���{����� ����V���<��7`ab�����B�U�q�df\}��w��O���c:������9��Cs�W��w���{��dfb�!����{�������f��Qi��Y����bvA���h�k��?��}�i���������3r���f��q��s��>�/�M���UC�9��g&�
����>��.�(Ir�9�d��W��c�6�D|cN�����g�y���g��;��cqu�������=j��
��5k���{'I����>���o�d���/��6��8������?���\��������N;%I>������+C���I�-��b���t�R��l��jTv��4��>�$��/����/y��wk�T���s�=9��c�����]w]VYe�:�u����:��4kV�na��[�-��	�+���1#�n�m����L�8�.Mjh���O<�D�d��W�������/�j���K/�4����z��|��7�<yr^}���}��i��Uz�������U��o�4�|��������s���-�n��<�0 �_~y������)S�����n�t5t|;��s���+&I^y�����:9��s��7f��a9��S��{��5���Z��S�7h���r��j����?��Or���'�����<����y
F|�?����1Th��2���k�*������n(��N�<9\pA�e�z���q�I�c�9&�o�y-�`���C���_���/���o��W�0 �
�����?��O�x��s�Wd�e�)>U-)�XeU�6������=>@]M�2%�rH�O��=z��N��c�%�D|cN�ak��}q{�����������5�RWu����&��d��	����Z�����)���fO�
�
+������gZ�h�����x�Y�	����l���SN�����d�������Zj�l��������o��dO_�m��ZUf�Gm�����s����o8��$�g�}��N:)���JV[m����~�������������+e\���~8{��g�M�����\}����/~Q�����W_���oO��������S=����V����C�;��d�SG�<��t��%��w���s���W�a�?�B!Gydn���$��+���~8;v����<���t�I�>}z���?���G��r��o�>�[�N���s�Yg���N�V�����f�}�)>�ga��MS��4Xm�����\����/����#�\Wy�nP:
����m�e��#�<�u�Y'���u�Ee����������;/'N���o����������5%����{�����������Ufa���K|&��������B�U�q��j��y�=��������B!�����W^9��Jv�����h�k�f����[o�����$�6mZn���80�����'���c�f����=������?;�Xe)�/��m�T�o����st��L���s�=7/��r�7o������?K���'s�-�a[r�%��5	F�&M���u�k��i����-[�]�v�~�:m�����o����]��������l�'�gO�O�>=�?�x��m����[nY�\���k��FVZi������C�~���u�YY~����\���^�W\�}��'�.�l�9��|��W��OM�f���]Mu���<xp6�`��{�����7��#�<2]�vM�~�������q`QR��^�G}4?���3y�������+�����a��G��~�����u�k^T|k��e����\|����7n��4(tP�[n����~����\�P�������O2�F�G}����>������I�n����O����[o]�a�����u�]W�����4=�����O?�$Yb�%��^{U����LYYY�UF_{��:�U���NC���,,�m����/��A�e�]vI�.]��U�t��)={���W^9�dT�U�����������]Yia��� �s��f�te+c���3���[n�6m�$I�{��|����_q�y������������P���/�xn���<��C�o�������m��i��}�_��y��y�����F�meeeYv�e���b��M��&���j�1G���$�A��������O8������^�S���9�o��
�X�t����=~��j��/S��I��J+e������>� S�NM��-�����������$k��f���j��Z+���w�}Wm�o��������:�d�e������#�$IF��/��2I������>#F���#R(���oW7/#����k���>;g�uV^z���92O=�Ty��L�0!�'O�e�]��{,�F�*�MJYYY<��x��y��w���O������#��+��P(��{��O<��#GW����[�b�?~|�I�����y��G������0~�e���#��{��\{����R^H4��-[���������_������~;��M��7��#F��g�-�`�\�P��G�+��2I��
+d���.�����f���I�>}�T��i��r�5�$I�y���ly���F���>����[���������Yf�������D������kca�o-[�����>��2���Jq{��6����
Vu}����5v�Ps��f�~C��.����Y�t��)}�Q��������@�r�-���Gg������������'�|2�����4��NS��c�}��I�>}����K/��k��V:t�Pa)��b��M��&���*e��=>u'�Ai
<8S�NM�f���e��{������@������u�V�����R�m�!�����>�l����Yo��*�+++�����g�}6��O��1c�y�=����r�-W����Sm�7�x��]Up�n��r�M7�?��O>������K-�T6�h�
����O>��/����z����$}U�����d�
6�QG�B���~8������_~9W^y�<���0���k�v�����/��g�:��<��c���or�������n�V��o��������df����='N,���s�
�������^���K/�QG5_�}�����s�%I:v���w�}��[u��-��u�!��$�����C=4/��R>����w�y���K�����N>���+����
><k��F�>?�F�$sM�W�����o�\���A��6mZ�R|]�zJy}_[�Wc^��Y�n4E�y�X�1��1����W������o��U�Gj�����o@e����9��*����3���3��__���/
I�	&��3��Q��
*n�o��Q%1��NS����V��q�R��6�
�*�M|��U�>�{|JC|��7��4c�������g�����'Iv�m�y&��G�IU��EG��5��:����W^9����w�y����~�m�x��$�b�-���{�U��?�iq�������������.��R�f����o^�~����-��T����O�?����/�m�������o�yqe�������������;��K.)�7���t��=��v[�5������
�S}��9;���?��c�9f>Z:S�U���o��i�f��\�m��f��?�Q|-�A���|��r�e���Ys�5k\G���������/��R�h��E�
J��{�������4��$v���k�P(T����=�S���`a�kl�m������{�$�:ujr��oP���T�Gj�����o@b�:���1T(���3���Q��OfZq�K����D?��na��
�\w�u���z�\e�1��
h��7��R���S?�7X��W�Ie��E�th{��wq���.����W_����.I���������u]u�U��s���s�-�$I��m��v��Nm���]�f�M6I����[��?�Ye�w�}77�tS��u�����_����^u�����'�L2��z��-��6�$�8������s��u<�d�UW-nO�6���,��Zj�,��I���A}���w�t��d�
��G�������+����>�TY��#*t������7���|�u��):th�u}�J��j����1�SL>���K����Z�Vu�_A�_��W����y�������u5�E�
�_�zj�?*��}M
2����:�g��u�ka��FcW��u����q���1Ir����m��u�ka%�A�y��7*<�q�]w��\C��E��$���b��C����q���1cF�<�������/��B
�B�?���^|����/y�RS��4}�je�����3������K���*����*���J�gt�O���v�������t�Yg?s�Yg������J�������o�	����������.�,w�u�\e�y���q�I�-ZT��(o�u�M����$&L�a�6W`���o��~�e���I�N8!K.�d�N�Z��rJq��#�(��7i�������/��V9A��kW����[��v�a���'�����|��'���a���c���|f'`%�Fm4���s�9'<�@f��Qe�a����/�L���
�����SVV����l�����i��y���8�o�;��S��/$I��z�������{������B�������������g�}�$���G��~�	'�����g��/����T��GM�[23�g���.]�d��uZ�n���.��������W�����B���N;��*^��m�}�E���NMc[y�qq��V�Ze���:f)��O9��y���$7�tS�8�����O>9�Z��U�����R_'6�����������#�<27�|s����z���j��@|���I|���K���5f������8��N;U�t�R��E����9ps�
�*���gx���s��W�ue����p�y��G��\����O��1�"�p���C5jTq�9
�\}��9��c�$���������1����W�������g�����7������2�D|�?���i��
��b���s
(���3fLN?��
���~�J'z;w��K/�4tPf����w�=���Ov�q�4o�<#G����__�|9��s���kW���.�(O=�T>���6,���J:��,���y���s�5�����N23���_��s�0 C�����-��"H�^���U����K���k�k��v���?������.�_}�F�VX��d��+���!a^���\sM���������~����z�e���������{���[o-��;v����:�v��4|���}�����s�����6�(]�tI�f�2a��<��y����������6^��a��;��#=�P^y��l���9�����:����?��a��O�Xr�%s�UWUZ�/�P����o�t������f[z���O���A������o���\|�����kv�q�l��Yf�e2}��|�������2r��$3�r�I'5p��nt|;�������-IRVV���;.���Z^{��y~�G��%gk��e.��������1cF�������Z��������e��y���s��7�����c�_~�J�3f���v�m�{������>��\7�����x���=��������������+v�m�,�����|)��������O�f�m����:��uK��3u�����[������s�����.��_�����T��u�0��$���_�Yf������p�
��RK�������cs������>J2s��;����ML%����{��Gs�q�e��WO�>}�c���7�G}�Gy$��{o1��k�������������G���>Z���	���~{�|��
�Xa�����M�9��3�p0����1��N�81GqDN<�������d�M��J+�]�v����2z���t�M�4iR��sR�\sMVYe������gQ�c���{nF���w�9�n�iVXa�L�2%o��Vn���blm��m���f��W���R�b��������^xa����*�7g];v��'�X�f7����|v����XT4����(u���&�UF:������?��U�;v�\���h���/�<0��}N8��L�<97�xcn���
e�7o��N;��I�VX!<�@��c��7.c���	'�0W����*��v[��o?����u�]��_<W^ye�L��A�UH��m�m������v���������_W�G����C����$I�f�j����q�2n��*�����������
+T[�����,I��'�d��!2dH����k�K/�4�����l�L��uM�h�"��v[��w���_��������s�[q�s��7g�u����^x���x��<����w����W��?,���M��������X��o���n����*�-��R2dH6�p��4(��f�&3W{�����}�����A4��?������}������r�TZG���s���������8/���<O<�D�x��
�����*]��EAC���+�=���/
y��g��3�TY�Y�f9���r�y��E��7������T��u����$y��w*<UqN����UW]������XT4T������[o�5�2}����A��\�l�R���|������;w�}w���������7h����s�
�*���0�������;��w�Qe�.]���k�I�~��t��D?�EAC��~���6lX�
V��u�Y'�����V[U[W��P�:��EEC��J}�K/�4���n���y��]�.�	�����|�l�����EEC������?����6S��Cr�QG�O�>���+s���������3����g�v���^��u�Y'c�����^�[o�5����_|���^:l�A��w����~i��Y=�U�Z�h��/�<������1"~�a�N����;g��7��~�������Q}s~QW����y����;w�uW�d��7��K.Ye��4�|���;6����W_}����g�e��l��v�-�����m[��_H�}��y�����c�e���y��7��g��P(d�%���k��>}���C��=`n�/�x�����y����?��g�}6�|�I_|�������/�#�8":th��
<��$�_����������?�x O<�D�����~;_|�E�����S������y��s�!��c��
�\X����^�a�2d�����;vl>���L�>=K.�d�w�����.�J+����mp�oP�F���_=I��J+e�w�s]�������SOe��Q7n\>����S:v����^;�z�����]����
M��EIC]'.l�-In���<��#�'X~��gi��m�[n����;���Oz��]�v.�7�^xa~�����g���/��O>�$�}�Y~���t��!���J��r����~�|��k\o)�g�:�
�-s���$c�P��w��O�>���;��3�����w���L�4)_~�e[l�t��9=z�H�~�����i��>N���gQ���P���g��6�c�=����g���)++���.�M6�$���{��k�Z�<o����6����~�������`�#��o�)+
��n�g����d�M�����G�
������2`��
hR�6�����J|�*�
h���6~��@S�4U��T�o@S%�M��4E
=w�0�@����@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$I��n�s������^k�f����#��o@�"�M��4U��T�o@S5~���n%�;
hj����J|�*�
h��7����������
�B�A[�|{�����g�L�>���Pr��5��3�%%�M��4U��T�o@S��y�<���r�-�)���o�)��*�
h��7�����J|�������&�u���>}z�����7tsJ��{��g�!�M��4U��T�o@S%�M�k����u��
����7�T��M��4U��T�o@S%�MQC�K@oB�w��=z4t3J���^K"�M��4U��T�o@S%����45��@S%�M��4U��T�o������A:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$�����������8�IBHB%@A�"U��K�+=A��X@EQ~����tQT�N��4�Qz�����������f��&��:'������������3nc:@��1 �	�������t�mL@< >>^{����3�����f����+��������^�z9�W�^���f���b����+_�|�9]�tQll��w�E��c��*Q������Z�j��?�������;vh����\��
*$???-ZT��U�s�=����N�����z�����&M��p�����S�B�T�F
�9R�N�J��HY-&EGG�����DGG;������U�TI���S�9�7o^U�PA���Z�re:}��������e�>��3���K��WW�%�;wn���)44T���>|��=�t�111�6m�Z�n��E����O���z�����o����N�s��Y��3G}��U���,___���O+VT�~�������n�EGG����R�:uT�`A���*w��*Y����k���g;�x��9-[�L�F�R�����v�-{������b\�<yT�L=��S���d�W
 �x�����H���e����1�
�>����]��B�

�����/��5k��W^��?��r�2NV�N��U����m��%J�\��7o�l��Vqs���.� �y���e��1#U��������n����~�M������o�J�*�h�����W``������U+M�8QW�\I� �dD���w�q�y���p�����7j���j���J�(��������{��c�=��������)���d_}��~�����T�����/����M�6�;w��������m����m��y�*pR�v�Ivz���t^={�4��>}���K�,1�����7����v1@:�={6�
w�����w��/nl�����^�t����������lI�����r�J#44���������Z�GlCZd��t�������;wn���k6�t��
�[�nN���E����n�L��
�p������~~~��Q�R���?�0J�.�0������?w���/�l������=��������� �7��m��c�~~~)��2e��w�����]�R����#N�+>>�x��Woo���Q��q��17|H	�
��D��~�����L)>����{�����������o�9���*���������[��w��y]��4�\�U���v��Q�dI�<���\�������N�V�r9?��
��D�;��>}z��c�
f7�-[�8�O����%K�����S�opUF���
��x����w�dy8p�(V��S�(P���������y�����?���3^{���Kk��m���v��������Ns@��sU���`(P@��w����7��G����o���F��n�@v��;��_~�$����o��*_����?��s�***J��S�-�r���������Y�f��u�$�h��j���*U���y����+�����|�rm���n>����c�=���IR������O*,,L�.]�����`��?^�;w��E���y�4�@���1)$$D.t��	&h������;+W�\6�u��M,�$����}���U��BCCu��)EEEi��JHH���K��uk�^�Z������#O�K�q�F��T�����>���W��������%K�[�ni��!�����o�m3����+<<�\�����W��=U�ti��qC�������u��
=�����#����k3�?��Sqqqf>�5R�J�T�`A]�tIk����y������cZ�n������3�6�h�M�0A�
2���UK�?���/���/k����1c��^���A���{�
.l���|||T�lY>|X7n�Hu�^}�U�;�|��ys5j�HE����g�}�v��3G111��y�6l�?���n[��x�����{�������_��)$b��}�EGG�Q�F:|��$�t��z��'T�lY������o�~��?~��2���<���o����+00P��]KS]�n�j���#?����U���?��
:LS�l������U�F
�/_^��7c��}�4�|:tH'O�T�6m�����X&����[�.]�����.66V��u3�~"""��9�����_I����4h���k��{�����<�9s�h��}:w��:u���s��S�N�&���'�O�{�9M�8QRbY�����aC���#�={�������(5m�T���W�|������������*H���{�x��������6�z�8w���_X�.�����*���
T���'���|�����'��4h���n��n)�Y�ff��
2n��a7���g���&���[��%J�����KFBBB�t��/7W�

5._���k�}�6�*+�$g���4�����m�[�n��&((�����-[���s�i��G������
w�;k���6�E�f��i�.�#G�����U��k���[�n%K�c��@��$����8z����Z�hat���n�3����CBB�2���:��7�"��n��_7�����&O�l3������+��^~�e��<h����?~�e�zf����dG�5�&}||�_~��f�C�E�5�?~�S��u�7���7������e��f^��f}�f=���
W��`���[f������1c���8����������opEv����2�����3�qe���3��i�����3�
��D�;��<��}��.]�dw|<Ill���_?���?�\���[J���{��2e��L�a��x���'�|b�?�f���Xc��f^�����l�%�e^�7�"����e����u��%Kg����L��3���L����<=v��l������5?j�(�����1u�T�UHg�������"E��1������8���6�����i*��� -7
���3��\��o7��#��#F�p�L8��Wd��������,�\�rv�
:�L7x�`�y���+V ���.�=�����[���u/�i�&�x�"E������k��Yf����i��;�T�~���4=���#�!�<�v[�|��O����������U�VMU9�<>y�d���;:L;a�3m���SU7��
��U&�����{�����������o 9��H-��6l�y����SU&��
����o��a�)S���<r�H��s�~�mC��'O����c����.����c.�.�8t�P��{7#�!�<�~sF�V�R�O�z���M%����`T�R�mq�����oH-O��������7�n���X�>���'U}hw������c��mdc���!C$I9s���y���|������%///���K�t��q�����\��
(`u��������o�F�*X�����T�H5n�X�~��n��a����8���K�k��[��]��u+S���t0����7���'Oj����]��
,(___���W�J�R��5����j���JHHp�a9�T~xx�$����z���U�jU���_���S������_*66���#G�h��Az���;wn���O
4����b��n���I���ys-ZT�����+����^U�RE��u��3t��U��
���]�'NH�����*U��L����^x�|?w��4�;z�hIR���������+��=z�����f_�����s��q�LI
7��$��Y�f�Q�F*\��r������k��!:w�����/_�G}�����@�
��?�1c�(&&&���,Y�'�|R�������+�M�63f�����4]�)Y=&9k�������H��N�>m�.]���<-���}�z�j3����;�����_T�2e����i��Z�lY����w=��S*U�������;j���)��mS�=������'O&;n����������sg���t���di�����W�V�(I:z��._���y��������'�G��D�l�_�<yRC�U�
�'O,XPu�����~+�0����g�����2e�(W�\*P��Z�l���W�X����5v�X5h�@�����3����T�D	U�^]����?�S������e���~���f��������`������O$I%J��+����e��Gv�6l�8�|��i��	i�k��]z���%%���{�qG���1��o3f��$������T��%�b����'����������?�M�6
�����+���{���#)�}��!�����^�����/___�t���W����k����db���VmK[������O��Rr��	������9r�G�6�*g��)������;��w��������/��[BB���������%%��n��I������7��T���������i�p+O�b�p�
�qqqFdd�����@c���n�����={�4�-[f���wS�N5r���,��O����-[��,7i�___���+6�X�<#����m�+[��!�

Mvl���FPP��z&��9s&u���<���o����(U���rZ�li���h�"#w��v�����v�<|����8um���w������I�vz��'N�im�g�_����k��.�c���E3��K����2>���_.�k����+W��M���3%K�4����0���F�����
7n��a�����[�P��g��._������������>>>f{���Sv�Z����+�8�w��Af�O>�����Z���g��a�����M6r�H�0WEMZ��������h�"��fT���op���z��z��M��g�5����)�W�|y3��e��T�B�
�y�<y��|�m�!�!�<�v����Z�j�.^��L��]�T����;t��0���~j�8p`��f�������!!!vc��O?m$$$�a�&M2r��a7�_|a���[��v*����H�7�KV����e��f��c�Y������?��.��o��C����!I���CSU��h�;�����n��[�l1�����K�0�w@���5�V�jH2���c�[�{�;w8����___�q�����5k�a��xZ������'��y�f��N�:����K1������wat�������P����L��9�7��'�o�x�������i��<?��33�����)/�[�#�!�2:��>}��#$$$���~����V�Z.�����e������������k������$%���t�R=��#�R�����C]�rE���W����?~���?����C���S��O�}�&M��m[(P@��������w�^;vL���������CY���aC���������u���ys�����3W�I�r�Ju����w'N�����%I
4�:v��qu���\}�~��j���
.,???�={V{����+��_���Y�t��Z�n����C�j�������?��S&L�����d��5J-Z�P�v�������{N5j�����V�^�i��)>>^|���4i��
&+�C�f���-��;*,,Ly������u���]�������f��������;L[�pa/^\����S�t��*T(�e�Y��|�����{M�2E��o��T�@U�\Y:tP����b�%����Rc��])�X����-[�L�<��:w���E��������/�o�>>|X��w�?�������5�`��y�w�^}����p��V�^�Q�Fi����:t�/^,I*T��:w��|P
���7u��m��Y�V�J�5���c�3f�����xIR���b7m��m��{�I�&M��'�|����[�n��I�$I���������}�F�-�dm����+..No���j������k��
S�^�T�lY]�vM�~���-[���X���KP�����D�@���k����$�l�2Y�����4i���I�]�r���R������'�nu��Q��u��Ym��US�L���Kr��s�Hooo
80�e�V�-�3gN���h������_��c�%Kw��asW�\�r��g�uK�������m�K�.�W�^�_������e�}���q�����K��YSy��Q�~�T�`AEDD�R�J�����%K����J�^x�����l��V�\�~]m��5W��Z���x�	-ZT����p������U�V9��2�Z�j�;v���3
�=���Z�j����J��'w��qoJ�
@�`���o��q7�����cW			�9s�f���={����+*T��j�����zJ����������
�Ov����UDD����n3f���~�m�����O�'Ovk�g��%Z�`�
(���H=��C������K����*!!A�Y��>��M�:U>���u�����O������3�i�&]�|YO=������l��;v����V||�|||��Y35i�D!!!��������s�N-_�\���O�����?�\�G���c���������V�����gO���+�e��!C����S����+�d��i�W����'�o��>}�������ay�aaa.�C|����oi���kj�|6�-�<2�n��U��X~��	V;��s�=��={�^W��9u{���~��n���hs�w///�;����f�*T0�����l���<>h��dy$�6`<����$�W�^����3��'i��$~���+�l����n����������9Y�}���$#o������o�,Y������M3�k��E��[�l1�w��1��k)::����+P�����>�o����z������[�R�O<�����y��v��9\I�b������m���wo3����������P��\qY�W�����W�
*�i�V�j������k��{��5���
IF�����0����y��5$�J�2��?o�n�.]2�o������
���1�������%KRL���/��}||���;���7���c���F��
ooo3>��������
{��%J����3gZ�i�����-[��_O��G�f������gd���op��\�}��5��������3��cu_�#Gc��6�>|�����^rXNLL�yo'������u6l��Ojw���9�7��'�n�a�}������k�6F�m|���������{�\�7w���7�|��2\���0���?��7��77��k��;��0a���wo#g���������+S]7Kw�_[�nM�n��U����(`T�^�8w�\����&?�������?�<����{��5N�>���	�
���;�;�i���q��q���G���2K����������o���N�68R�>k�+W6�Y�j�Q�N��������gS]7K���C|Cje����~C����2�������;��#�������*U�����r<�J�*������o_#..�*]ll���aC3���~�,����B���`�Y�&����7�KV���O�B����;�o||�96�p�Bc�����a���+Z��c���_��o�!�!�<u����k�2�)��}��������7���kW�����Uet|���5|}}��Gs�0F�i��������L�������c�L@�<��������s��K�*��	@��9?n�8��h���pf���X���?�`u<>>�l�W�\9�����7$�52�x�
������f�:��_?���k�^WZY~������t}���J�a��i�~~~Fll����s�����pO��@�r�J��-�R��j��G5�(S��!���3���Oc����9s�W_}�����`��C9U�T1��{���+���R�
�z��I�&v�%�}'�|��v�Z���k�Z;q��yl���.�;#�����R�z�j3��E�:�<a�#44��`WHH�1i�$�>�����e7m�����p��%�����s�S��
�����;��.9���#���^^^Fxx���[V�\i����{v2�������K�����8��������Als�
����[���W>��������1t�P���q)W'�F�m���;r��m|���6rL�;�/���c7m����t~~~Ftt��t��_7�_K�,������o��w��4_CF ��]2bz����N�:�����9s��|��1v�X�E�f�#�����6�I��2�M3�N�>�
�������o��G������$�]/���1{�l����2`."��V�Z�E�S�6�s�oH��2����F�eu,������:V�P�����:���s��i��}��
s������.K�n�:3]DDD����53��	XY�
���&����u��1�x�
c����������'������^^^��_�T�7n�������7�t��r���7���Z��?��W�^f����[��\����w��[�B|Cjy"�YNb?~��tqqqF��e���S�H/�gg�����So�6�^�j���������t/3  @}��q������$yyy��W_��.G�<xp���x{{�~�����;w�����1�0�z�jIR��
��aCI���Gu��!�|V�\)I���{U�T)�c�����m��9�.w������>k�x�:u����U���>�b�[�n%�nO\��Y�T�����\��R�.\0_8p@������5y�d���SO=��F���{��|������!C����CK��o��W_}U�a$K�j�*�9��w�/_v��wz������m>>>������u��5_����V�r��e���}�+�����R2m�4�u�^������y���3f�
*d�����5z�h��5+�ur�J�*�U�����k�6_���Cy�����x��
��<�I��O*Z���4i���K�MS�~}�)SF�t��q���[��������[/�����\io]�xQm�����7%I/����V���|�!�����[�z��i��	�\�������������G���i*+���m�����d��6�_�zUc��������x�����;�=ny��uk3��)  @��U�$9r���I�o@�y���u��I��7O��SO=���;k���Z�d�6o��{��WR�}iDD��|����{SH?��������7�^�1X�s��D���k�����]��[�n�0a��o��"E�H��n���>��-���';����)""B����T��U����6n�(oooM�2E���i�/5Z�je�����o5������f�G}�����v��9EGG����K�:u�u��i��Q����:t��>}���/�Ptt�9�b�"""��?����
*�q��*X��;.�D�
pO���r����?�|ool(5&N�����K���������9O���y"�=������C�j��
��$$$���������~���y>���L@���+����q���{��+WV����?}���Y���}�3I�f���7nLv�A���LW�Ze�~���:w��$�Q�F�]��r��)�����N�#G�H�9Ho�i����v��i��1:z���:�U�2e�/_>��.l��Q����,�Zv�K�_�I5G���^zI;v�����HHH�z?f������_m��1cF����� }��'VyU�^]c������5e�u��EM�4���7�H��vO��C���L�2��7�Si��my��1�Y�b��q-[�L111�V�m��I�\�|Y�}����6{����y;v�P��e��{w*THs�����'��'Oj���*_��>��o��nk�8�o�k��;�����)p���q���a�z������1BW�\���CU�bE���o6���������l���U�PA�������[��9S}��Q���u���4��n���v�����������]�j��m@�w��Y5j�H
4Ptt����C�)&&F/^��+��E]�xQ����������j�����Wll�&O��c��)&&Fg������U�fM�<yR��
�Zp#��U��p���f�.^�hu�q������$=��36lX��@��Y����oK�j���/����O����?k��-���G�����f���o�32k��cWS�NU�%��+S��&N�h���H��@����������}�|||4e�����q��!���[����{N�<���y��]�-G�*P��$��-!!A����4i�N�:�J������_���{<((Hs��Qxx����lg����������]�pAk��U�>}�}�v���G5k�t�����k��y�v����M�m0��%K���ny{{k���6�7m!�H�'�|�;�z������n��i��i�?������r�����/T�P!�����C��&����ld���V+n8Pc��M�2u2H��'��<�@�������-�Mb9hn9��4�'OU�VM��e:�����5k�=zHJP<x�J�(��%K�k���4i��;��u�FR��=I��6���k������V\\����*U��P�Bj���F��;v�p@�d�p�3�[��n��O
����[7�i+U�d��[�n)***Y��]�j���fl��m�^y�u��I}����y�d�����[����������Q�rWl���>����X�x��5k�|���~��z��7�|�r������@��b�=�|���_�.)q7�;w��e��=�S���=�5jh��-����BCC������Pu��E[�lQ���%IS�L�������#��~�u�V�c�h�w���@U�TIo���v���{��G���S��-�{�n�����k����C�����|�Mu��Y�z����Su��-���W�=��y^j�[111j���y�[�R%-]���$,W���D������[��V�Z����k��Mz���T�dI���*o��j����,Y�H�6o�l����'O��G���;u�}�i��m�����+&___(P@�Z���u�����KJ�1b�[�����r����7��$]�vM#F�P�r�t�=��C�?~����+W���w�n�����l�sg�����?���f�w;��Y^S���m��$�[��=��#)1����/����'��������|��T�Z5��$%.v������{��{���r^�J��f��5""B�5����R���U�pa�+WN����9s���=�����9�|o�?�///���Ou�������x�b���h���j����QZ�~���7G,w����LS^����:t����8yyy��/�T��m]���d=��o����?��x�	IR\\�������Hu��I����v���"E�h��%V�.���C��&����l�������C������>���t+/  ���+W�����3�������U�PA!!!�l���W��rMh�\)>�x)q��3f���2w��}������������eK�=0��h��+q�>}�f�5m������s���������J�*z������?�� ;������
�������
A��S�Td9�u��!�i�������7�P��U�/_>����x������~��w����V��\*-��Yi�mU�T���;��wo�����Z�v�>��5m�T�����lEk ��.1�W:�_�u�Sd��q�.7w��+���H����r$#�o�6������| )q���}Z�j�C�����S���,___)RDm���/���/��R���7�q���:h����d�����,���D����?7w�~��W��>z�h��y������.����#G������B�
�L�����>���E���>s�bb�F��E��V�Z��N�8����^R��eU�Nm��)M��-iYI'�����{S�o2���;��7�;��Y��V�Z�aZ///U�R�|���+{h�������[�n�D�z��w]�O�/��Bk��1_[N~�(�|}}���?k��qV����i���W�^*R���v�js�&�K��5���/I����4��E��������;k�,�����>�h����~m��AR���;vt9��+W������7����/��"��-����S�-((H����/_��]�����S@@�r����+������={�����^^^


u���v���<&�����#��[o��_}�U�=�#u�\����kN��4�n�35<<\R��������k�J�TOz}��)���W����.]ZE�������z����;w*::Z�g������JJ\ut����^���]�2�:u���_���g�h�"����S��r��!I��{�Z�h�3fx�����)S�|}����[��<75��-k�N�
��4�/_���X�b5j��n��.(&&F����f���GyD��8)I5j�p���i�����sZ�f�>���j���.9u��^~�e�v);�$K{��5'����W���O��[�ni������5k�t��V�Z�������z@4+��mS 3k����z����k��!Z�~���;���?~\.T�f�$�����;j����H_�b�
,���d.�6dw�h�Y�,��iS�i�	�			��e�Ke�G��+�r��IJlS�cw����ukEEE�����?���U������T�n]���o�)��X.pq��E�i��_��)�7��oY�f�������c��cW�Ev��@V���{�6n�(Iz��5n�8�92���	�s.]�du�r���]��)������k���:z��y�W_}e�~���.|������^zI����5u�TEFF�d���w�����U�Z5?~�������������)���$5����7dw�h��3u�T�u�.]�N�L���+��uks7��>�L���sK-�������q���={�>�������+��k�����`���_�����x���Y����A|s��lj��z����������{[F*R�������N1����u��%I�=��c3�� ���+�u�V���Q�F��Gy���X�r�8����/Y�����k���0a�����?��S���������!C��'3��?�Z�n�Q�Fi��u:~���{�9���A����U�bE�uJ��N���c�$I!!!vwsKI�J���I���4��L�r��9�Q�;wnU�\���<���O����k��������3�4i�|}}%%�T�m�6�H���,W�{���R�]H�9�SJ\�4i"�=^^^V����PV����@fd�@����W\\���_/)1.��S�a�����-�$�/_^+V�p9�gf�6dG�h�Y>��L[�r��ne������Pu��Ac�����[m����_~��5������FJ�e���~���f�;%�#;�������=-;�n������a��%K�������3v�X3�����%Mr�����v�z���m�3m�4�����{�>�L�L�2�����)St��!m�����q��q�����!G�����'���yO������7[�����W_��]��*i�y�.��~���y����N�7 s�,����+�����y<��:�7���dc���;��c���74j���CHH�J�(!I:p���J���������]F�t�|����
�����3�j���,��y�F�r��`�y{'��u����OfT�P!}���fg�����vx�6�=������v�v�����-Z�\f�����������=[�n5_�e�����|��{�����s9�����_O?���}�Y�w�)v���cRll�f��m�w�3��C�����y����7n���3g����/gu��m
d��������~����%%��b���M{���r��i���
		IS�
b�O��,�HI�]�X��(P��r���������^��3��N��gO�w`�r �����_������ #1���wj0����>k�������ah����{w���I�9v������v5j���Y����7 s��q���F�b�\��8�;��3�o�<�~�e��%:u��$�B�
�Q�F���s������1t7���e��f�a�>}���O�>N����iG|��t �6l�F�a�:t�F���uh�����/�?��n���8�3&�yw*]�������+�r�JIRxxx�V����Y��~�MR�*+
4p�j����c�9����������g��__����r�������x}��'��.]��\f�b�����]�f������;�q�FI�����R������D��9���/��OfGlCV�c��������*UR��U��WPP����$%N��?������3'
T�T)[-�!e��)�I'N4_����W�<x����W_��666V�:u��|�j�*����\~VDlCV�������9s�8L{��Am��I�����j���\����z�js���`����Z�������E����q�����_V;^�j������/����7��o��S�1"de�1X�U���7������������������!��ndYy�����a)�9r�<',,����.����S�%�]J\�/��/�����IfD�
����o����+%��)S����2>�Y�~CV����-S�N5_��������&����z���V�;���/��7[&M��;v��tv�
��v���c:px������z�-����V���?o�l��_h���������g���]�$%�H��C"i��������5J�.i����������5|�p����JHH�[���s���~�a��2�9s�h����v���4���V�X!)q�`Vo���������G�fC������?��CRb�@�f�l�7c�yyy���K���v������W^1o,�:uJ]�v5����
H����#w���w�6l�.HJ��Y��~��>|�N�8a7��k��VH�J�H�b���M�f�Nmg�SO=e�~�����r�y�f�������={��O��mS =8�&N�h>�cO||�>��}������}�Y�iO�>�?���n^���c�=��J����g�nI����]�v>�n���m�x��f�>�>}������'O�S�N��H�V��}b�����{vW�������k��u3W�
>����?���IQQQf�g�b�T�`����)9�>���������c��5kf����iS�;�����{��G�
@Fc���o��o��c�������{�|����d����/=��3���^{-]��n�9vI���7R6p���y,���o����]6l��/����n���]S�=�{-???���7�|S����2/^��'�|R;w��$,XP�;wv�
<����j�Y:y��9��3gNu��-U��f��l��j����v���
Y������u��-�����_~���^�h�����N�-urx������#����������o�iu�a���`�+�*ooo
2D����o+!!A��
s9Og�����O>Q�>}������{��o�Q�6mT�@=zT�f���={$%~9��3���
64w3I����T�ZUy�������K�j�*���;
		Q�f�����p�������'����j���f���3+����5|�p���j����W��{��W:s��6o�����������Z���o_-\�P��/���{U�R%���W�������5w�\�_�^��/_>M�4)�e��YS����F��.��GU��=U�N�����?���)St��yIR�j��}g$��m�:w����k+<<\�K�����N�<�U�Vi���fl���t�gfu��%���;1b�j���Z�j�L�2��'�.^�����k�������>�h��OO��1�������/�HJ���w�k����������:��j�������A�
�����r�J-X���s5j��;�4���mS IF�o��Q�<���/�&M��b��
		Q��9u��E���G?����C�o���������U�^]U�VU���U�lY���sZ�~�.\h\5o�\�������[?��������/��k8R�N�,5�����EF���6m�:�����a�������+�i�F����7�u�V}��W��H�4v�X�yN�:�j�I���4v�X��������'#""4}�ts��e��j���{�1�������������su��
IR��%�������k�����7��5k�*U��h����3�N�:�5k�h��E���
YUF��V�\�_|Q�J�R���U�B(P@>>>:~��V�X��K��[aaa�>}�����_��)�7���o��=��o�-�c����Oj��E���o��zH}��Q�j�d�6n��i������[�viW<O�������������^���SXX��4i��zH�
R||����?-Z�HQQQ�$___
<��5\��{dw�y��)���O�
R�&MT�jU/^\����t���o��o��F������@��)ST�D	���={��{�=U�\Yu��U�r��E�N�>��[���~��K�$%N(�6mZ�/l�n��p��D����Y����6m���Y�?���j�y�f�f>�cO��U�N�d�'����x"��9RQQQj����W���E�*&&F����o����w��T�RN�����!����,o��m�$c��m��
��j�*CR�~�
f3��={�i�O��b�|��S�:r�����={:}��)S�\�r9��b���7oN1���h���/n7m�V�������v����;��hL�6��k�%)����;Lg��%��a���iW�Zeu��w�q������qqqi�>w�={6�
w���dq�V����r��������7�2d�������f�����������S����+�����			��hl�_���wJ�W�^��wi�z����O����������1���Q����t���9w:z��Q�V-���[�ha�={��r���Mv'Gq3#���@|�+�y�Ll���N�'o��������[�lI1�9r4n���0����T��G�m�!��U�v�y�����X�2e�;v8,��o��{��?o�n���<y����#�����_Z~�)��Z~��Y�^�z9u}������#�t}�B|�+2����M��i������9������7���7�N�>�
���������7�
�G��������G����J	mp�����2�m�e3,,��|�X����
%qW������l]s�%��o
0�.]�����
���>Tw��p�B��/\����O?9�,R3���W�N�'��gA��>�\����aF�2e�s~���T�������������'��[��-S��*_�|�������_v�o�;et�.��k�������c���JHH��#�����H5o�\���~��W>|XW�\Qpp�|�A�i�F}��U@@@�y����d��:|��$�A�v�6l�P?���$������u��x�b���oZ�f��o�������2C���S��e��qc���G��sO*?�:t�4h��+Wj���:p��N�8������[%K�T������+{��@��������Y��e��>}ZAAA*U����k�~��%[�=��{�=u��IS�N�������)66V!!!�U��z������;��A��4i�V�Z�]�v���S�|��
,��%K�e�������-���g����k���Z�|�6l���{������k������E��Z�j����Z�n���i��c�%���"""\������u����_~��y��y�f?~\��]S``��+�G}T��us�V���s���O>�Dm�����k�c�:tHg��Ull�r�����P=��Cj���:v��b<-W��f�����Wk��m:y��.\�������{��c�=��������+���m��dt����OS�N���?�3f(**J������3gN����j��j���:u���9s��\g���_�-���k5g�m��Q�����\����)RD��WW�N���uk�;CfV_|���t��U�Vi�������t�����)O�<*]��������K{��@�1v�X�n�Z�6m���;u��i�={V�n�R��yU�D	��YS]�v�#�<�b~��/�����c���o��q7��������N����{k���Z�v��?.I���{T�n]���G�j���z�Kv�������7��m�6����Z�n�v�����������2����7WDD�������w�������M��y�f;vL�������+W.����J�*j���:u�$���_�^��-�����]�v)::Z/^������+�m��z�������W�~��p7�T�-**J�$/^\M�4qk��E|#�!���������F�Z�f��9�S�N���K����Z���x�	u��Q9r�n�/�g;���:^�a���f����Z���m��*U�x�:�6s��Q�n��o�b���� �"����o�+�N�>�
dW��dW�7��
@vE|�]�dG�;�z���������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p�����-��+�Y�t������j��DEEI"��^�m�+����� �"����9��*�M������]�dW�7��
@vE|�yz���0��5@�m��Au��U||���n������OW��� �"����o�+������G���S��5=]���o�mp��
@vE|�]�dW�7��'���=���S||�f���r��y�:�6K�.�[o�E|���dW�7��
@vE|�]���O��u������1�E���IDAT
 ��
 �"����o�+����� ;���7���r���J�*�����}�$�d/�6��
@vE|�]���Q����+����� �"����o�~��� s`:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��={�h��z���U�fM���K^^^���R�^�\�����<x�*T���y�*w��*S���?��#��W�^m�!<<<��W�\Q�
�s�+�}���Tw�
-Z��;�D����WHH�j���?�P�/_v{y���z���T�N,XP�����;�J�,�v��i������u:�'N��w�Q��UU�@���K�J�R�^��v�Z��(Q������y�W��U�z������N���p��>��S5i�D��{�����r���}���0a����?����uK������}�o�^�*UR��E������@����U�V�8q��\�����Ul��E�}��z�������D���;�������p
>\G�������;V�2�Xmy���OF�~���{�$;v�����U�re*TH~~~*Z���U����{N�}�������+-m7Gn����e�Z����W�:���+Z�`��{�9��UK�
���������e��G����_d�[���=���3c&�
���1p�2�
.������sZ�l�F�����+,,����T>w�M��
dm��N�~�U�V������%J��}@����P�z���=@��������]�����n��Q���W�J��/_>���Cy��U�
��+W��� =dt|���^|�EU�TI������������M��;W			N�u��M��9Sm��QXX�r����9s*$$D�������u��1�y$$$h���������SO�r��*^��r�����-ZTM�6��1ct����^>�
Y��m�I��m�<]�l�]�v�$�?={�Lu��&M2�����c>�a�V�2���_�a�3g���U3��.]����Nu���4{�l�\r�����w��/nl���me�;����sX�$�L�2����S���~0����0�~��qqq�	K�N�?H�6�*=���Z�ti���
�����O7
(�bL7n����l��t\+\���d��\8"�!3t*6����F�J���������MU����w�'#c����Wy���0���KF�^�//����R�/�m7G^}��d��Z�*���5�7����c
��)u��5�=��2�
���Q�O���S����}1v���o�12mp��'�����~�]�v����#G��W��=]�?H��iG|�+<5�������]3J�,i�_XX��������oH������{|�����opUV?r��K�2w����k�l����F�n����E��������6�\���-..�x���R�k�k�6�������c�Q�t������1~�x���9s���'Oc���n�<����Ns@��\)88X
����R~�g�V�~�$I�������5j�9r(**J3g���[�4l�0������^KS����_5m��\������������4��Q||�:v��_~�E���}��|��:��������(;vL-Z�PTT���+��2'L��A���k����\�������w�^��1CW�^����A���[�����U���S'���H�Z�l��\�����}��N��K�.i��I����_|�b*�/��2M�	����&u������l``��]����G��a��I�|}}��uk��WO�VBB��;�M�6i��e)�u����F�*_���/n�g��}�?�:��'O�M�6���_��a��_0�,'$$D5j�P�J�t�}�)o�����Utt��,Y���(��uKC�Qll��~�m��!..N���u)VJR�����K�i���^W� �y��T���?�f��i������E��]�v�T������+W����������m���sg��N[�n���c%��������/��ySRb|i����V������yS7n����u��U�[�N�����qc��"�t���~8�t����������0=�
���m�$��g������Ge������u���T���^P��mSLw��Y���WR�w;���'��3����7�������'@��d�>Tw���|�=d�1���-\����&L��+VHJ|v'W�\6�u��M,��x���}{��UK���:u������`�%$$h���j���V�^-oo��~��'��s�=��'JJ�!�;wV��
�#G�h�����g������iS�_�^�������c���aC]�pARb�����x����)::Zs�������7o��_T�\���O��+V��y�U�PA%J�PPP�n������[.��]�t��e���[������G�>dr�����*w���{�x��������6#qg)��m�>}���'�!����6~���di6l�`�����d����������Y���������N�:���,�����'�1�|�����'��4h��J�iq��u#((��o���6��>}��X������_������F�%�t�~�i�40
.l�Y�b���%}�e5e��
�rg�4-�~�is%����;���_m��T������M{��M���S6�]�t)�U�ccc�~��Y}' }������HHHp�f������9r�pj���5j�!�

2F��t����w&�"c�����7M��Y33�A�7n�������3bcc�wW�������M�6F�������'���Z���7�6mj,[�������&::�(S���7��N�������e�)S�aZ�[���i���a�`�x���Z�j��������F�=����QQQ��q�q������G�y7m���y�6�\����������2���
I��q��|\yf�>�������}����������Wd�1�����4�����m�[�n��&((�����-[���s�im�T��
�����l�23���@c��u�����}��5�=��3v������K�����`2�LW�P!�����[��}��?!!�x��w�����o��y��+��<=v��l�����V�vv�����y�?���tc��5�=���6��4��c�#$$�L��E����N��4n�ZqqqF�"E��g��N\\������~��W��\�|��O����������U�V�����?7��n��n^,0���Y�n:&�g>�6�SFO@_�b��0�����a��9=Q����Fpp�!�(Z��q���t�oLL�Q�@���J�2�f�7d%�[�6c���S����}�???CJ\L(5��	���
���{S��n:xrFz���~�mC��'O������I!�!�������7�+W.�����U+����G�MG|�;0v���o�9����68R+3��
#m���9�B�
f����sk����wI�������q��9��}����#G�<\yf�>���������7g�P�y��,���x�7�Vvw�w�}g�W�\9���j�<x��<_y�3��A��]e������D|k������q������5�3}||���-Z��o���v����3BCC���w�v���������H;O��z@��7o�����_���o��
�$-Z�H7n�HU9���Wxx�N�>-I����~���Pkk����������$)!!A�f��c�=�b������<f)>>^3g����?�b�����_����C=�������[�3�<c�����L�|�r3����6l�`3��-[�4�Nv<!!A_����m���0���_E�U�J���cG}���:w��3�M�z�2�-I�����uk-ZT*]���c��Y�{��-M�<Yu��Qhh�T�lY���[�z�j�e�[�N*W������������/_^�=���}�]��@f�v�Z�8qB�T�~}U�R�f:������s��\fR�����K;Lky����7�|c�8p�����m�%JH�6l���G�:S�t�z�j3����;�����_T�2e����i��Z�lY����w=��S*U�������;j���)�}��I
>\�k�V�������y��T�R�Y���}�Y-]�T			��l��p��u���W�a�s��j��U���<y���?/Iz��w������k{O�<�r^�7 {y����i�
wJHHPDD�n��e�}fv�����{SI=z�$)w�������Wz��v�����_Rb�������d��fl�1c�$��?�Pdd�J�,���+VLO<��6o������Ym��QXX����T�X1���[G�I��C���W_U����?~���*88X�K�V�z�4p�@�]����dgcA�J�T�LI���L�j�������%I9r�P�=��%�������c�Cfm�'I�~����y����#I*P����m��������6l�8�|��i��	i�+}�1 ��������f�=�%��2��0���S���###��s���� ��#��[BB�V�^-I���r�.��#��u�&)q,�r��%gc����J�,i�OKL���7m��^�z��
:T*TP�<yT�`A��[W�~����:��=������)�\�r�@�j����9;r��e�;V
4Phh�r����� �(QB��WWdd���������/[���w���W1�[������{�Z)�c�=f������������K������������Y��y��y�^�z�{�K4|�A���~r��a����6��7o��n���6�����V��9�f�>��L�t�R�cg��5}�Q��L����]�����������F�����S�@c����a��'�5j�M���g���Yf||���_?���e��._�;�Rk���N��i�OIiCCC].�r�j��9L�x�b3m�v���|�����mH2������8���������/���&�w@�s��������;��x�����m�����-�[���K��� �b��3g2�����w���_x�C�l�<y�0#U;�����$#g���������e�d�[��o�J:t�`���s��>���u{��1#u��;�s�2�R������7�������$I��[ll�Q�jUC�Q�N#!!�0����X������}�����k3�x{{�f�2#q����H�1)O�<������;u�T���/����kt��S������7nL����}��6m�8LK|�;�c�Y����xb�����>���Gz��6x��������1��_Ls~�9��wI��������e����cH2���K�0�w@��!s�1���2c�������=�����c�)����6����q��)�i-w@��W�;h� 3�'�|�r��o�!�!�2:��>}��#$$$���~����V�Z6�X������-qqqFHH�!%�]�?��kHR�Z5�����ny���gOc���f=m�<�������I��9r�Mko��a���[���;��l��������Ns@���{���z��)��^��~�����{,�s�������+66V�4d����{.�8e]�v���k�����'�T�R�t���Y��Ls��q��][�N��$����W�^*[���^��_�U,P\\��z�-��uK����U9
4��������+��_�duY�re��C������Wu���:��o_m��Q�T�xqu��E�K�V���u��5������a���[���e�o������|������J�,��g�j��Y��i���;�v��i���j����m���M����W�B�t��M�0A���������_~Y�f�JV��	4i�$IRPP�:t���U��P�B���������[����~s��-5q�p��*^���;�S�N���3*T�P���S��
,��g�j����2e�����,��3g4d�I����������Os����+����a���W���%Y_�-���S����{�n]�pAAAA���{U�N�����j]i�}�v�=Z>>>z���T�F
���h����>}�������o�v����}�F�a�q��5}���Z�l�bcc��W/8p@�*���������
W�����eK.\X~~~:{������+V�������\�}��1


M��'N�0Wk�P��r������[����/������O������iS=���i^��0
2�l�V�\�j��� �Y�����p�BI����Z�l��|:�7�|S�����[������~�������`U�PAM�4Qdd�[w�L��)���7���{��G$I����L��������*P��*W��:�{�������@z��>��Cm��M~~~�<y��$�m��%Z�`�
(���H=��C������K����*!!A�Y��>��M�:U>���u�����O������3�i�&]�|YO=�������9sZ��c�=�����������5k�&M�($$D���:}��v��������/�ULL��=JXXX��7}�t����(�o�7��1p��m���X�����5-n��a����W0>dm��o������+<<��3C�A}�;d�>�������YCVw���3/Ij���BBB��m����?9i�$=���6����u��w�����\?K�7�}2:�w�������m�V�}��$���_�?��\�r%+����2wK���P���]������[�JJ�\j���r^�����m�V�.]R�^�T�~}���k��-���/t��
}����Y������~���`�����P�J��%K���o��$���
W��e���~����mk��^�jU=��*Z��u�����O�V����;�rmY�G����<�������6�n��PJ�M�f����Lv����'N�h�����e�;6�W���4%p�Ko�-��-Z�������K��-����
6$KS�BC�Q�P!s��$�.]2W��U��!����7n��i�.&&������S����V�Z��7�^�����?������X��.����H�����76�T�Z����2f���,�'N������'N�H�&i��������v�v���[
;%�@��������gVI���b��u.���w�Y��T�vmc�����_mL�8�x������r��m|��76��9sf��[V�\i�o����4�+�;�����q��%�?�$��M��%J�N���Z+T�`���-[�4�_��,m�=�����������^p����{F ���2b�7ne���k����4��m���5k��nEw��+��$>>�X�p��3{�lc��aF����
*d���#
����7d6k��1c��y��1c�M�65��r��a���			Fxx�!%���-���;�;���;��vn��4e�7��'�M�x�	3�y�����sG*V�h�-c��v���?���#FXK��{$U�T����em�*U///�o����`ll���aC3���~�,�������`�Y�&����7����*U��kYk��5�*R����
����;���7���g<}�GzI�6xz������f�2��^��[�d|�9�7�Kz��W�m�n�����_�e�����cH����oH/�������x�'�7dUY}�������%KRL���/��}||���;���7���c���F���~�R�J;w�t�n�A|s�
����-66����5�<R��|���V����o�4g��1J�.m�			1^{�5c����W_}e�9��K�d����������l���;�5j�Q�fM3���@��_M��`���Y�ll��5Y�U�V^^^f,P��Q�zu���s��&��K2�}��d����o8p�������8}�����;ez6���Dw+W:;-��~�i��-�j��}����������i�R{IN����R��o7��]��:.Mn�����m��Mv��^0���_�x�yl�����+WZ�[�n�y��7��:�a���g�}��G�2������1116��_�������v�|��w�t��K��������#�q����?��wp����[vN,^�8Me�^���a~�����1t�P������������
J���;w���V�j3MXX�Q�pa�G���q���s�_������[�%�q��U�?�H��e7��7:��#����f�a�����������^�
�
���lH��<x�����'N�h�+U����d����������3>��#�z��V1d��)����vc������K���Y������<��#6c������W>��33�;�Cj'�{yyU�V5
dL�2��?�1}�t���_6�-ju-���~����i��oH-O��>���fI���������1c�c��9����j�����l��G�->>��c�
����|x2g��v4�q���`\R�bccm���W���Hv�Y�f���pTVA|Cz8}��b��|����Z^�^���^�u�i�owO|c�4����sg<-�cHmp���n��W?kzL@OZ$T�1q�D�����s�op���N�~�?����80j�(�c���NC�D|Cz��}�������=��
�����S�z�j3��E�:\����	�m�����&Mr�3K	��9�7��'��������Mg�-[��o��=6��?��������w�4n�8��BJ���9r�Z�2v�����l�s��9s���\����������_7r��mH2J�,������o��w��4_Cz�����d��W������SL`��r������]3_�-[V;vt���7`�y{�%���������'����=�����$IK�.���7��7l��|�r�J�cI�K�.��
�X�b����$���m�f���������<��#�X{�����S�n]������x�����[111�V���3���^�z�0a�*W�l�xll�>��3}��G�q���4�Q����J����f����^zI]�t��O>��_]k���/������KJ�}�N�\gU�RE�j��{�v����=z���(^�����$9�oR��o�n�e�}��G������T�R.�s�����C��a��i���z����S'������i�^y�3��O?m��M�
*�q��*X���y�B|���E��I�&*]��[��������K��y���!%e�������u�V�3F�������z����>�H��K/�d�2d�6n���K0q
��'�M-�[P����q�FM�<Y={��SO=���Gk���*_��$����2d�����v�����q�Fy{{k��)vcMzh������>�����U�jU�}����#G�i}�Q���b��s���ZYSLL���o���OK���m�'�x"���r�����o����p���F|�>g������mpK��gM���k��5��\�r��'�t{�Y����qqq���Pll�*U����m�c����S�_�|��e�1��L�6�|��W/���8u^dd����B�
�<~��i�=Z�f�Ju�!��������O����
6$K������^���������m��?~�=Z�<���rW�\���_���K��T�T)5i���p���u�����:u���[�nm��;�Z�j��#G�$�!����l�x����7�$i���z����������-�6m2_7m��a���@�� &&F;v��:^�~}s���V���5j$Ij������L������]�|y-ZTR�MD�^����x��N�G}���9r�@��?���#[
.l����J������_�5���u��uW�
����g��Q#5h�@���7n�:���]�xQ+V�P�-t��E}���
��s�2�nu��u��T�f���w���'O��'N��lG�M��[5j�p*���&I�����1ct����T�
111���P||��T�����WBB���z����w�I����K�G�6���;���g;����_�a�0%$$���Z�v���������O�>�Y��[��o@��q�F3>\�zU���F��+W�h����X��~���4���o_]�rE���|����)�x����9sj��q����$�0����i*���@�ug{k��16H+\�����k���3�
N���v��!���[�'�<��#�]�����f�������k��I:u��+U����EDDh��u��-�I���3'&��[7��/�7��o23�����/������V��M�a�����;\�U������O��o�����L�bwR�3�c�Y�5=�|��r��#�/_6�����R����:o��*[���w��B�
i���:y��bbbt��I��;W�������5`������oM+���=���j�����	����S�n�4m�4��?_����T�re}��*T�����$��B����%K��O?U����������+�y�����O���;��3��/_��u���_~q��'O�4�p�/_6s�����/��*U��eB{�j��9\���f�.^�hu�q�����������a��M���c:��r��m��s�[,w������d��Z�l�9�f���yG����Z��$FG��Js��|���7
k��5���;�]�vI������l�b>�p��Msg�Z�j����*}�����g���:u�(88XM�6���������NW{��l~�9J'���5z�h��k���j�������G}T��E���	df�g��~������U�V)����i�^z�%�,YR�����7�6l�%K�h������7�������cg���%%����
EJ��o�I{���d��5k�=zHJ\`���*Q��J�,��]�j��I:v�Xj���F��={����G�'OvzUO[��Q��������[}��5���0�#^^^��/�������'k���������;��qc�=xH|����@U�TIo���v���{��G���S��-�{�n���6m��-[&I������&K�Q�F���+V��j����{x�������@u���n�J�*���n�RTT��������Pdd��_��{��W���^��f��v���aN:z���������\�r������3u����V��P���5g�I������~�M���O�r-����L1=�-���7�`�1p[�c���������V			�9s�����W0>dm�l����O#F��$�����j����>��JjF�q�|��d�1pG���3���__�J�J��={��N�::z��j���-[��K�.


����BCC��Km��E��W�$M�2E�'Ov�^����D|���������OHJ��1g�EFF�S�Nz����k�.)RDK�,�z~�V����������?�P�f�R��5�;wn����\�r6l�~��7���SW�^U�.]t���T�;((H5j���~����+((H���j����6@L��&%��-W���|�MI��k�4b��+WN��s�:t����������~��t ����|�LG�������S�F
-_��L�����Y�f�Z�)���L1?�/o[$
�_�|Y[�n�$�^�Z�a����tOJk�e6�����E���u�:t���9s�e-_�\��������R�J��gj8����t��{����c�^z�%KJ�|6m��q���M�6


��o�m��
�;�����������+W	=z�Y��y�t��I�������)%��Cj�VZc��34c�=��C���9����Z���WXX�Z�l�����;w���8PU�TIS~wvx$�"g����C�\.�E��������Y�\���
�����>3������ ����5h� IR���������))V�����~I�@G�qK������{;��V���~-{����v���/�f���e�_F�������~��g�7��������;M)RD]�vu�����g�}�|`�X�bZ�r�J�(������_6l�$���G;vL���k�oR�8c�����O�����~VwX�l����_I�����z���K9�Y����I;��uK%J�������z��@��������y������#�]�C�^�us���q��+W.��r���q����?��c����
pO��������k����������>(w���X���~�m���G?��9�������P�|�?n���)S�|�����k��J\�tI��Ow����U����%I�������]��RF��#Fh��E�U����'Nh��z���T�lY��SG�6mJS9�AOW���)S�|�����i,�u�z��Z�|��6m�.h��
j���~��W���'��N#�]�]��l��;%��~��I4h�?�PR�.o�<����H��U�`AIRXX�J�,���k���j����%�-�T�B��?_��]STT�6n��u��i��u�����w��C�4l�0'>���`��7n�>��Cm��]����~��w�X�B�����������***J��/O�2����)c��#G���I�J���O?�d�n���������U���.]���m��E�[��Y������P�B���/�)/O���R��=��gO=zT�����
�z�j���W�ah���Z�n����T�bEOW��f�����Xy{{���W#G���n���V����)S�j��l��V�%�Xd����>H��ys��x���������h���c����*�6��IIj���I�E@@�JP,�
v��"M@A��(�'��I�"�{�����r�
��l�M6	��uq����3'�g��sfH��77_%���s����\�r��������={���r���^�z%��RT����C�Rg���S�e��7-Q����Y#)����e�o9���0U�<y����u�8q�|=c�m��QR�}v�j���?%������5p�@<xP�����i�u��Q������~SPP��o���y����@���~��i��	��|��)00���!k������;�|���-��o�!N��c����}pk�1����=z��������,���s�����{�e�IR���cL(�d���q�F�<��A��>$c�1 mKmc��|~��{��-���m���9����O/��b��y���V�Z%)j��5j�-_�fM������;:p��n����]�]�������R�����qc��������IR�b�b���+W*,,��+�q��M�j��I�������7�'�|"��c����U+�j�J.\��
�y�f�[�N!!!2C����S���.]j��SZ�t Yv��o�gy�2e��q�<U�T������qc]�vM[�lQ��M�b�
�:���'O���K�t��!=��3v�����kk��u����������v�Z}���fR�Q�F1�6h��L�K2��1cF�]}}}��iSsB��[�4j�(}�����/��R}��Q�����+�I�.��U��j��i����������W/��qCk������R��e�j�����b��m.\��S�NI����cL����g������+]Y>p$I�J�����"##���yxx��+���X������]-  @�����������u�����[����h�"�H����z�W_}��g(Ij��M�	��K�V�t�.)*�n�u��
�ub�������]KT]�F|���!:VJ���c�Lhh�9!�|������V�o��"-r��i������})[�����w������3���b�����x)Q���U�xq���C��m�6���K{�����g���_k��1.n%�p�N�?^R�x~``��-�����3����FA|s����'�R0�����}p[RB���+Z�p�$�����93-!?8���m-�CK�,��%K�<����c��������cH�R�jr��[����B�
iQj���b��z��W����g�\���J�2g��dO777������;���OM�-���"�������u��:���,����o�r�R�v���];I���'��{�i���
��o���{��������@2*U��
,()��u��q�eo���
6H�2d��z����\�*U��5k�-[6IQ+�4m�����3Y&�W�\i����w��9��O��+�*�1cFU�ZU��i�&?~\����$�a��1�F���k�N�<�;vH�J��K��72e���>�Hm���$�������vj����n�]��? 5y��g����-�[v�����-Z$�����
{,W$��={��j��%)�����hMdd�V�Xa��\]>!�'�J�Y�+%)Y�����g�hA|��������o���s�����6)�1)zw`I�2����o@����p�������\y55��i�+�M�7on&����k&�m���re�--�V���O�n�'�!5{���<y�(00PO?�t����%�p�����}����4�o���O�c@Z��>�-)a�u����8H������r�	��q[�cHK\�K�jr��?.%�-�
�7��=nMXX�f��i�wt����/_������-��=]�t�|=������{E�04e�����n�9�%��r��`���5k�y]�������]�(b:��^z�%��?�`���?�l�r��uke��!���X����Yc~)l��M�7N��g�z����u��M�e���[�nI�Z�li�����e����/��RRT����\�����������]MO���SO=e���3�H���'C�z�����b�\DD�F�m����c��i����Y���=|���n�*IrwwW�*Ub��l���o�����K���$U�^=Q����[�U�VI�������e��]�3g�D|���?�0�8�6����a�������b���sg����m�;22R�����>11)""B�&M2�G/�������0a��:��a����J�A�n����SZB|�����
4H��AJ��)R3W������|����;1����{�9��r!4K��������Xi�PR``�������
iE����'s�����@+V,��?y�d���E#�%
�r���S��|mxr��n�3�Y�r�����f����s��m�
�~�G��)�����s�1�D�
i���o�CM�{�h<��|i!��E�������v[�\��C���)�$I>���s���3g�������L��oH�\�5q�D����������\�����WH1��8�H�-)al0)yzz*_�|��'9�1Hf��������q��p��Xe�n���?�X��.]�{��B�
Z�f�r��!)je������k	�3>��)��-[J���;�W^yEw���Un�����O$EM�<x��:-��S�N�$U�Z���F��;�J�,�����
#G�����x�����g�/_����)��s��������#6�����x��B�
��2��<<<�X"I]�v5,
2���S�V-5k��j}S�N�������b��d��W^1_O�2%��������C�f��������]�=�UD-Z�q���*s��!����|����[=�_|�}��Y=m��51����g�[��O?��+i���������o�c���:w��R�JI���_�O?�4V�04x�`s�B�
�C���}��G����������z����{�nIR�9b$�R�?&L0��%""B�|��~��'���x�
�e����X�;�>|X�~���A���0����1&�G�����I��{SI�������������t��u���|���o���'V9g�������6m�d�����
������s�VPPP�wO�����������OcB�#�o�G|�r���]�1<)����q���c����G��+W.=��s����@~�?G����m�1�I���P�y���=���R���\b4�|v|���fN�q��m��o�m����[���j�7<	\��l��X=f�~��g
0@����ks�J�Z���'��]��/�l.�x�C�UPP�$����j|��6cZ������7���%K$I^^^VwgO�F���s�����6��c����7sRO�t�n�;v,V��"���>�(���
ZM����k��1����"##��/�c��j���<<<�i��������:m%J�HT���/�5k��Q�F�|��v�����k�����5k��v��?��J�*���Z�d�J�.�W_}U�������r�J��;�L^
:T�<����j��)///=x� ��4h����e�f�c{��9���;<x���������p����1��\��={�h���fr�C�z����cIV<�?��~�A�+WV�:uT�dIe��U�o����G5{�l39_�p�dY�H
�{����j�*���_���W���U�T)]�zU�g����%IY�d����#�6m�v����?��a����f���6m�(���w��v���3f�7���g�������&O��-Z(,,L���������uk���*$$D�&M��7��m��������O}���*[�������%K*[�l2C'O���e���I�T������D�<\!00P�������5k�
*(w��rww��s��b�
s�wI���]�Z ���'uM�6M
4����5|�p�Z�J/���r���3g����~����%E%�f��%OO�Xu��9S_~��*V�h�k���x��v����������������ju��������-[��o_(P@M�4Q��e�������������o����o?~���|c�W�}���O>�D
6T��U��SO)S�L�}������?��C�N�2?���_�f��.lu�q�'Er��JR�54x�`�1B��]S�����[7��][�����k�&M���W�J��T�����}�'����5r�H�I�&*W��r������9sF.Tpp���U�
�����Gi����$777���[:p��8`�s�*U2���5}�ts��M�6�N������]�����1��'�+��I1�:y��;K2s���������/��/��"��ZN������K�B�����oW����1��'AZCu�=>���C���s����=����K��8i9������su��a]�zU5j���/��
([�l�z����]�y���1�Z�j.Y�-1�oxR�"�}��
V���U�jU���O>��#G4�|�����G����)b�OOO�3F/���"##�t�R+VL]�tQ��e�����G�j��9�z)j�k�.[�LC�Q�����A�)SF��g�����\����wk���p����>��?��j�
�BBB4m�4����Y�f�T������������Z�n�.\h.������1�
$�'N��/��y|��=1?���l
vv��Mw���;���������~�o���������� U�\9�a���t��BBB��Q#�^�:�o������7�M�6���t��q����K�N�|�I���y{{�F�1&M��Y7l�0������������nnn��v�[�jU������kc���.��$i���vW�)S�����/e��19�8]�t�4o�<���+Z�x���?ou�����k��9*]�t��9s�Le���Lp�[�N����Z�x������U�hQ��5n�Xs��Q�=t��u-^�X�/�U�w��?~|����w����k�L�N�4n�8s���$:�]�xQ3f���3�������1c��E��l�4����B�*U�d�u��I�O�Vpp��@�����9s��9�244������+���9�L0���0�N�����5~~~������o�dj��<x�e�����[�9sf�9R=z�H��9��xR���T����yxxh��z���~�����Ek���f��-ooo�u9����E��'Nh��I6�e��]3f�H5�J����R�
�|��C��2e��w���6$f7�h���!�i9��!�z�1�I��>�3�Yg��a3.���e)�	�����������q���CxR�"���q[Da�O��2���{|���B�
�]Z��G�6m�"""$I/��B������f�������i������������Z�E��>}�����uW#��I���v��u��=;���R�J��_~�3_��uk���������]���g�j��V�zyy��o������y��A<x�n�<y�h��1z����K�����7����?��Z���S��
K���&'&�.��o_5n�X&L����u��)EFF*o��j���^{�5U�X���,S�����x��BCC�|����z��-ZT�w����35o�<����������Q���qc���W��s���
��w///��U�j�
����\Y��t��]U�T)�^�Z[�n��t��Y��wO2dP��U�zuu��%�
p���#Z�b�6m��={������u����O���s�b��z����C�4�*4�\�2e��E����k�����}�.^��L�2�H�"j������k���������5`�M�:U���:z��n���������_�+W���?�:(}��q���/�z��?~�-Z����������'�j����={��f���
6h��-��o�.]��+W�(""BY�dQ�"ET�vmu��M�J�r���-Z���Wk��u
		����u��e��,Y��D�j���z��eu�.��n�����&M�����C�z�����T�T)�n�Z}���� ����r�J�_s��qs��L�2)  @+V���?�g�}6��TG|�g���j�����_���P9rD�/_VXX�2f��\�r�\�rj�����o������,YR��/���[�u�V?~\�/_��k�����9r�|��j����t����3���	��)�$�}o��/�T�4y�d�Z�Jg��QXX����U�fMu��U��7w�.g���;w���+�a���������v������-[6�.]Z��7W�=�eGN -
6����1&��q�7�A�xrb�H�e�u��yfn�f��6w�L��I�U��`�H�Cu�=>���C��r��b,����
,�
6h����3g��m���g����;���U���U�zuu��Y
4H�9\���'Ir���?�\��U��u�t��1]�pAnnn��+�*W��^xA���wx\�}��j���f������k��=�z��9o�d��j���z���
����?����+�q�F���K����k��L�2)o���P��Z�l���^>>>N�y$�����c��
��;������K
W������O�~�����g���=)��)�Z!!!�\��v���J�*��9�4�f�R����o�b���� �"�H��o�*r����U���U�7i�
@ZE|�V��E����'�)����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x$���Y�t�8��f��K"�H[�m�*����� �"�H��;��&�I������V��U�7i�
@ZE|��:��f��� �6o��:u�(""��M�swwWdd���NEl�V��U�7i�
@Z����
6�F��n
��7���>8���� �"�H��o�*������ov@O�����3g�d���n8���K�����)�6i�
@ZE|�V��UP��������� ��H���H��o�*����� �"�H�\��fzR�dIU�T����9p��$����� �"�H��o�*� ��;
@ZC@ZE|�V��U�7i�
����
�L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0iVDD������S�j���Q��2d� 777����{��	�����4h���)#???e��Q��W�~��k��x�����?^
6T�<y��������e���9s�"##���P�B�5?~<���G������������Q�F�������uK���S���U�fM���S�����9�J�(��]�j���2��������[o�|����5�����6m�h����uK���y����U�D	�;���MAAA��@���Xy��q}����]��r��!OOOe��Q�V��m5s�L������{��i���j����z�)e��A~~~*V��Z�l����N�r��HZ��w��W>|�S�wF�m���1��{�P�~�x��T?��p�B�o�^�
�������U�fM������7������4h�*V���9s���K���S�*U����������[����5m�4�i�F��!���O/��[W�~��N�:���_�^���S�2e�-[6y{{�@��Q���{�=-[�,��
 �%U��������J���-[��_�e��*T��|||�����y���g���Q�t��u����g n9piYr�t���~n�������1TK[�l��������+K�,J�.����T�L���Sk��u��@���}��������j��*T��2f�(///���K������~�'N$K{����###5o�<���K*Z��2f�(OOOe��]��W���������v$E>@����QG%�8��k�4f�5i�D�����e���%K��_���cu���D_�K����O%���sZ�h�����{Ny����YG�#�W<S�\1500�������P�B��7��z;w�4$;w�tuSR��m��l����[���8q����c�N��O?u���J������k����[O@@�Y���cv�6�,�.]:c��i�^:�3g�$�!^���{����nl��S�N���N9oxx�1x�`�����9k��e�9s��:���c�������������j�������������7����P��/6
,g�o��������LK�.��{<l�0�������)S���\C�z��UW�����
	u��-�u��v�(`l������q����{�8��$���k6�	

5�~��8����6F��P���9c�j�*�:�������]�7$DR�^��~��\�������;TG����?��������|���~�?��xl�����G|�"�cW����W_�Z�3�P
�0���gt�����Z�ha\�~=�?��������u�w����������-�w�6<==���>~��Q�r�8�����2d�i�����#q�oH	�5>I5<e�#{��q^���#}
�����H����O.\�gE�(�"�!�\�Lur��;w���Qo@@@��c�-�qu�4��4���{�e�����'x���3g�O�>�$wwwu��Q�5R�t��i�����6l����4x�`�u�;wN��5���'%I���S�n��7o^=zT�'O���G�q�F�l�R������o��-I�ah���=z�$���[s��Q���\'�D�������/I��/�7n���+���_�����-[4s�L��}[6lP����e����'�������	$Iz�����aCe��I�����3�o�>�i����q��d�b�>g~�X�c�}����$___��s'a UrU�;v��}�]�}��5��uk(P@7o�����5u�T��}[T�
�w�^����f�S�LQ�^�)7775m�T�7V�|�����s��i�����	�27o�4�BI�Wqv�-����aC�eJ�(a��_|���/�y���GC��$e��Y�����3�_DD���o����K�r�����{�T�R�z��f�����`�:uJ-Z�Ppp�J�,���^�zU��5��;$E����m�������O�n���C��j�*����f=�N�R��
u��5I�����w��b�����K��������?�����z����!C����f���W�F�t��QI��O?�^xA%J�P�L�t��u8p@��/���g���4��{���Y������Wu��iI����4h�Z�j�`���������5k�,8p@W�\Q�4{�lu���j}���9��G���9��;�B�
q�S������CIR�=��Lb�P%�s���7o�����_|Q5k�T�\�t��k��y������K��U+���=��H~����V����/���zJ~~~
�����d��������O>���mW�=����[���A;vL��)S&u��]�K�V�L�t��)���_��e�"""��7����C_|�����"� �I��h|$�8�g�}�a��I�<==��U+��[W�s�Vdd�N�:��[�j����j;����9"g��>�~OOO�)SF����n9" �p�3��S?��=z4��`2��X\2�N��UR�/���2d�1w�\�����a�\U7>��\�x���9�!�pww7����Xe6o�ld�����VV���m���cG�;v4���b�u�V�U�>��#�u���{XX���K�L�L����+P!�^�u�i�����+����e�?n/^<����r�J�.___c��
������{�6�����f}���y�����e���6m������!y��j���w��52e�d���/�X-w��E3FI2�~�m�un���pww7$4v��a�lxxx��#��op��^{���v~��w�������w�g�2eJ����7�|�<�k���,�|���&L0WK�*eu��w�}7�*����Y3��w�}��w����g���5.�g��f=M�65����Ldd������r��i����<www����3���m�����q\)�����pf��Q��W��y�f�@�������W�Z-f����<_�l��k��%��������������B�}p��+r:��?�y�����,��1�
6����~��o�nd���,k�;�E|CB���7���M�f���������~��Wf\�����[���f�����/_�Z�r�����j�����9�oH	�5>�����b��C��,{��}����i>@|CB�"G�G�O������{&L0�o�n<x��0#�N��F�(��_�K��l>c=r�H���v@g�-eru��	�i����&	
��������,������^~�e�e���o������u���r�O�6���
IF�l>�d/�~��=�u����9r��ow��������+W*�k�.36f�������j���Y���#m�3o<<<<�>0e������O>1$�3g6��9�t ���\+W�Ze�U�jU�e/^l��\���2>4�-jH22f�h>|8�m����k��1��-Zd6��	������[rO@����={v��[�nM�s����7���c�����nT�P�,�b��D��2&�[<����3�����r���F�\���{���Z�2��1"Qm����,�e�����������4*U���~�7� w����0~���G�A�������{�9����9�:t�P��A��-��{��e�}��D�q#�!)�j���}�<y�S�>p�����eH2����u�Z���K�,�[�J�*f�E��:��|:��������I�������l����|��9��E�"��YR�tG�Om�����,9"� �!�R����b��{��g_|�E���cf�qM@g�-eru������3�|���o�,��wo���J�.\�{��Y��0I�k����3Z�+_�|����$�����������[�n�y��Z�p�$)��Z�~��T��z��:u���������S�J�BBB�����X�b��)S�c�v����}��d�����������C��?��9�n�j�s���6�����,��O��J�.-777������ai���������//???yzz*G�*Q��5j�?�P!!!�Hq

2�9|�pI������[o�x�����U�����iS�\�2��7m��W^yEE�����r������k���q��������OU�V-���C������S�"ET�F
���Z�t�"##|}��d����r���W���%E����'�|���


�$����k��6��K�N�;w�$EDD����Z���9���g����kI��#�7o�8?_��#v����={�p�����Q�����/h��m�>�l�2�i�F���R����������cq����#z���U�jUe��U�����-��~�i��[W������_��KR�����t��E���O?m������o[-3o�<�=�����)���9�{��f|;~��$����V�V��/_>�������V�~�t����}���~����][�r�����J�(��?���5Z��a�z����%K*S�L�������J�*�g�}V���������l Y��{W�{��az�����s�9�����%����KW�\�$�)SF��UKT}�����~�z�;wN�T�^=U�T�j9��������g'��#F��$e��Q�|�M��r������������m������GK�
*���{/Qmsco����U����,��������������s������89p %rEN������e�$E���ku&g��Al\�t�������;����H���C<0����1��M�����/I�y�����kU�\YY�fU�,YT�jU����
���c����w�U����1cFe��E
4�������M�8Q��7W�|�����2�`���T��:w���S�&��������^�*I������&F����'I�ah���j���r���2�T�R������h7o��?���U�*{�����U�
��w�����q�{��%z���U�hQ������Ky��Q��e��M}��w:}�t�\7�$r���#��CJK�a��������%�����2����U.���r�*�IBV������%K�Y��g�5�/[�,���U�:������n�}������������c�����O'N���b����#F�0<<<b��},Zxx���o�+���S�N������fd����dT�^�j�����u-Z�j�����e:t���g�}f����m�$�t��	��h�3l�0c���F��m���/�0#j����������4.\h��K�.5�q��t�R���YX�
I�2o��%Au\�x�����?�����Y�f����;�;�RXX�Q�reC�Q�vm#22�0��;�?�1n�8����j�qww7�O�nF�n�={���2g�ll����y'O�l�Jm����o��1��mHM�+
#���U�T�[v��Ef��m�Z-��qc���C��������y���]�t�k�g�n����0�8w��Q�Z5�}���/[=gDD���O��n-[�L���=�7$��o�iH2�e�f�?�0��;�;��f��z�f�������Q��C|C|
4��w�
����3����+����q�YO�N�\O4�����g�\xx����oH2��Kg\�z5V���!I���C�6G0����%������3�����'��o�A�4���a��wr��?^�P���FI�Y9G|�������ic�lR����{��-�����eG���s�C|CRj�������;�����$#}���hBw@_�x������H2������������^�z���"E���5-[�4<x`�a,\��n,2d��s=z�(V��C�m�����>g �!%H�;�-Z���I�S�5�?�[�nM�6�k
.l�<y�0�8x�����O�,[�~}���{V�y��]�U�V��~��%�������;�������Og"G��7$��sFL��}�������
�0�:�o)g�����t`���{��U�V��|��U�|�r���>��y�0���_R��@+V��.k�����3j���8 I�X���/_.�>_����-[��3�k���V��<==��?�(w��f����k����$OOOu��Yu��U����g������t��6l���u�j���1V�O�.�����%K�h���u��2e��-k��������:u��
(`�\��
c[�p�>��I����Z�n���k+g�������s��U�V%��SHH�F�!���_��U�������4e�������>R�Z���>�L����J�(�;w���?����+����������#G���={V:t0W��W��Z�l���s���K�/_��}��f�v�D�������T�ae�GY�����y����?���S^^^���_��=���%K4o�<e��]={�T�r���K���?�0W��Q��F����'�t�������z�)]�zU��M���[u��M���+�����BCC��k�)""Bj����4i"���������{�V�Ze��
 n����T�vm���C�/_��;4i�$���+V�K�.��?�$�����w��U&<<\�6m�$e��]E���s�4j�(-\�P'N�P�t�T�@5l�P���W�b��vk>����;W�J�R�.]T�pa]�|Y��O���[u���m�V{���s�=��;w�i��j���r���c��i���:}��������~[��O�u��c�j�����L�2�]�v�\��r����������c�V�^���\a��M�j��}��r����s8�����~�I#F���S��9r�B�
j����u��2$���t��)�^4}�����B�
p�������[
��S�t��]�tI9s���9��[g�~��g$I�����I��k��){���X����k�.]�(]:�����^������_�+����?��\��G���5k�m�����i�4}�t���O�n�R��9U�Z5���+j���S�Y{����{N����t��|}}�7o^��YS����4h���X����������x����3s:��2e���g��.�c��?�����KI������/�R�J�����������K]�tq�������h�"-X�@RT?�e��N����#����$IC��������yK������+{����M�8Q;w��$5m�Te���U������q��Z�j��G��]�vj���2g����Gc�����W�d�}��Wj�����m+oo�X���_UDD����5i�$V�T���kg��%J�}��
����n����j���Vw��|���r��9sw�2e�(C�:t��F��������3����SO=��M�j����7�S���G�\�R�<��^z�%���Og����?�������������/5n�X�O�6c��������1c����k


�W_}��>�,�y��E�I�r����^zI�K�V���u��};vL��mS``�S�x�%��4��#���K���0���C�_������0����U.���r�*�IBV���Oc���_��,��g��N�8���!���P��#����n��,W_�re��u��1�_���u����Q�Q�X1���[��-[6��V/]�dT�X�,��o�Xe���;���E�bo���!��Z���.]:C�1u��X�z��m�����8��eKC������Txx��q�F���b�B�$�P�B���Gc��6m�Y�L�2������eK������v���,�����:�������e�l�bs����
TH*�q�R�J	�',,�\=�����No��������O��q���9����s���>�,����=��km�'�k�T�����f�����Q.,,�h���Y��?��UW�~����V����4��[��kL,bRg��h����G�d��U�1b���o�&L0���o�$�1cF����Z�����:*T�`�\����-��U�<<<�o��&����]���G�X1+<<<����+W6�����I��;g����l��s�b�)]��!���5�q��q�m�w�^��f�����{F���
IF�F�bs�����F����?9s��z�}��Y_���U����w�����z�������5�S�n]���
t�^x��c��9F��m����e�Z��v���;<����6&O�l��1����/���$�k��6��,�����k�m[������/'����7���,����?
64��=���]�z���5�Y����A��u���~�?�r��A�xr�������=���7��'O�X}L{ms���o�m~����x����Q�F����1j�(�}������!�(R���{��D]/��1�7$��u��,0���c|��w1v�M�.��>PBDFF���7$%K�4w�6�������g��Q�,�9sfc�������~��1bD����53�\�b�>g����2�yyy��-�U�������!����3�-j.\�����}C�-b��}{������m;~��C��I���� ��GmI�����m~����7�O�n�k|||�{���������oe��1�T�\����6V�X�����
oooC�z�����0�������>��gn��a���$���gq����?��2^89"�!�!�$��[bcj�n����1����0{\Jsu��	�i����&		���s��1q���Y~��c��,S�re��o����[�b�L�g���|m+�:������-��J�*���F;v��9����e\�p!��������~;����H#g���$���?7o�v��<E�1$
�u,z�C��U�^Sb=�l������q�j��'Onnn�@�����c�s���]KR�I����������0��D�g9Q`��Q6����%J�����o��e���-""��^����~��a��I9=}��6'4��w�L�E�-,,�j�
6��z���x�f�)�����������2ZPPP��J�����4�j�<y�f��/7��������5��IT�~��1g�c���F�F�b�����'����K�*+�F��qc������6������r�h���8k:���P�
2����q���
��}7����xxx�k�6>��c��)���s�_~��x���c,����f���o	jwdd�Q�pa�����'�k���7��+����YNO�b��}��������z�2�N�j��5�x���c�����<^�z����c�����qcc���v��;w�Xm��)�1p�@c�����3�~��2d0�U�R%��;����c�op�����5kV�C����~k��5����������h�������-�����Y_���T�7�"w����0~��;9���7��H
I����{�����g��C;v�����?����������1�7$�3�<c�������_��S'��7������������g���v'SV�\�X�p�������O������K��z�������m�-Z����}|,b���fK�,q�5$5�R���%!�&L0?S�HsA�Z�j�F�2���c���F��Uc��y��%����D6i��f�����?�6�����Yn���1��;w�<6h��D�=���,�����S[,��3�#r-��Br��%&������������q,��
�������Sw������koo�8������o��������q������1>�Tj����+�<~��	���H�
.�v���,[�P!������h��%1��/_^��e�$�]�6���{����K���
�a��������N�<�#G�H�4h�
�����#G�����6��L�*UR��5m�U����k����9��r
P@@�$����u<��$i���	m.��=|�P/���.^�(Iz�����/$���^{�|=t�Pm��9V���H
0@���o���y�f���������?j��-rww��I����g����s������z���[�+W6�����J�.�����W7�m/�]�rE��Od�$E��V�n]�;�f�1,,L����?��{��Y-s��5���3gt�����C���4h�:t��~��i���=z�Yv��!:y��S����_�O�y������o��:u�������{�����	m.��m��]?���$��O?U�"E��|���IQ������
��W_�{��j���z����������z���$I�a�G�	�EAAA:z����{�&M������w�')���b�G:x���f��-[���_~Q�n���+�h�����J�*%)j���?�Yg��Y5b�����f��k�������]�n[�B��g��9R�:uR���5v�X���(O�<��;v�������}���:������A���W^�K/��w�yGK�,��m�T�`AIQ��G�	>��	4e�IR�,Y4j���C�
@JG�>r��G?HI������[�;w�����wR�����S�}��r��i����5b�M�>=W7b������&M�����vJ}'O���!C$I}����;�ooo
>\C��y��s�N}���


��>g�����Co������k�6_W�RE��W�����>j4��0�9>�l�9�#G�(""B��
������o�C�z����u�V���{f��^{Mw��qJ`��e|�������n���g|2d�`��/��r�\�iKr��%Dxx�z�����0�/_^�
Jt������4�l������[k��
I~N�jk�n�j�n��������o����z��-1�����^�z��={��������d|�L�T�Z53�~��):t(V9IfKM�6�$]�zUu�����3�<	oo@V�r��m��V��Ce-m�E_�$�m�V�}��N�8���Zdd�z��a��"E���_Mt�/����n����u��s�����_5w�\}����X������9s*S�L�g����+v��}�����&@>��3Iz��9+��K�N��g�d?�EFF�~���8q�.\���&O�����t��e5j�H
4����5r�H9rD>�����f��h�B��_��?��������+V�h�h��?~�<<<b�0`�9�����;�Z��7�����kN���2��o����5j�����	m6��<|�P=z�PDD�*U��w�y'�����[��E�?~����)�f������K�����#F����'O6_w��=I��������>�w�}g�!���s���~3�O�:���u.\Xc��Q�.]�i�&��uK����?������+}��Z�j��������;����'�P�B��/^\&L0�[.&����_�5�>}z���T��������K��l�2m��=��Y�d��0�����L�b5^9��89pr�����2�c��9s��@u��qhB���PCCCU�D	u��E9s�����u��y=|�P�������U�T)=zT���S���eF�.�b�t�l�"�0d�n���]�v���>��[�4t�P�-[V�W�N�yz���[�n)�����o]��Y��a���Y�fZ�f��_������#����5kVm��Y��53���Y���(^���d�b�xB��;���U�����g�i���


uZ����M
�����������*����#F�&�\���3g:�
��p�1�x�����s����-s���y��Y���[k���l6$����&rD@���������o"M�4����b�
�c:��3�����gy��%-TOH]q���9s��Q�F���o�����_��y�^�H���;g�.V�X��Y���l����a1Vv�~]�N�K�N5k�4S,�����|2d�����{��Ke��]+V�o��9s��|(7��;��D_G|�>x� ��f���k�����
�B�
�p������&N��S�N���@�`�^�u��5K�T�`A�^�ZY�fMt�����;w�9�1<<\�f�R��=��C
<X{��Q�<y�d��$?�3�s�P��=u��],XP_~�e��/1�"�Y��������;q��^�u���[%K�T��=5m��l�.)c���wU�N*k����u�������S~~~j����,Y�~��I��m�fu�������j7���O���;%��1+[�lv>�������#�������m[e��E��W�;����:|_�D_|�����'���/V�p6g������/���|�x��x}����?����������v����<���s���|}}��sg�e��/o&l<x����Xe>��
4H���������F���1����T�dI
6L�W�V���u��mu������V��~�i�cr�Z�j��y�J�<p�@����'C��%��K�}|�\�W�V�v�.777����z�����oRr���O<��@�J���=������i�::��o�>��]['N�P�j��}�vu��Q�r�����r����;j����Z��$i��I���_��Nb�<|}}U�|y}���


U��yu���l�R{��Mp�����V�\)I7n\��b-������������k���j������������������-[�5kV����O�>������OO���oR���l��i��QrwwWxx�F��J�*)g��j���F�����\����&��c��3<�swwW��������������=�}��Ej����d��z����>��U����!��O��v�j�-�8��>�L����o�J�*����7���a:���Y�*������+<<�L�zzz����ny-Z�H�7�$��sG-Z���u��<WB����=~��-�u\��b>�`��h�	�������!�������Q�F�r��'��-�
�����O�7o��a���]###�k�.�?�������n����8">�Z%v��S�j���*W���w���o����_]j���<���)�az��7�Nm����v���^dM�L�4�|�Z�J�:u�SO=%e��Qe���'�|�}���B�
flsssS�\�b�������������1�krI������e��i���*R��������~��Wu��]y��Q�N��>� �c�O?����W���{��]qt��fL�3g���?����7���b9�r����4�&GcVb�nThh��l��I���}���9r���i�\�r��O>�:@�d�w�6w�x��wT�R�d;���n�Q�F
y{{K�N�<��w�:����g��7l�PO=�T��a}7�y�yo�(�>R��e�.�#��#�={���������k��Z�j�	�7nX����mq�����b|'8������h����:>X�]�V�[������������'�a%�oRr���O<��@�I���5����6o�,)j�����;�~G�P�b����#�]t�!C�9�|���?:���6 �=��S�X��������g�q�����u���j����5x�`IQ��#F�,[�X1��aaa7n\�2���'Dr��^�zi��uj���Y��+W�x�b
2D�*UR�r��l��D�x%t|4)=I��T�TI�w�����j���wO����7�|��M�*�����c� ~���41�i�����+z���P�B����]'�o��Y���
R�������;gy�2����
(C��{��N�>���0yzz�����������;�������h���j���V�Ze&�/^cp!�X�^w���8���}��g��*UJ�r����f�IRHH��_�.)fr�a��


RPP�������H��,|}}5|�p
6L{��Upp�6m��5k����s������u��i��-=T�R����[�n����N�8��7j���


����e��.]�
6(88�\	H��P�~�4a�IR�|��&��7nl>e���{��^�X1s��h��������'�BBBb��'N��g����7J��6m�j���������S���u��A3v����
�o����� m���|�
@��J����6mj�����j����K�*22R��oW�V���%J��Q��X�8�����'9���C#G�����?���h��Mf������y��>��sk��U�P����S&wwwyzz�������f���7�/^<�	��������]��e���g%I��_�98����'��S����A�
i]������c������wo��%J�ce��+{}��+W*,,LRT��kL�i���4i�$i���V���Pb���1��V��9���9���]�V�Z�27n��]xA�����Or�)�p<I�;�m�����cG��7����j�*IQ{D/�aK��5����;w�����u�V�w;NN�6��5o��|��:���k��r��e3/e����={�r�s�V�^��c[�l1_�U�V�1�i������$YCuf>=5�]��V�X�k����m��
��e�����w�^�h�BS�LQ���]�\ �H��hR{���	��������k�����y�6n���� ��}[.\��o����w[]��c���41��#B��������w��l�"I*]�t�	��,��7n��qO<h��;�3����5L@�` �o�gy�2e���q���M�K��������P�����eOt������+t��]=��sZ�hQ��tr��'�����Cq��������:�
4�����C����������gW�
b����/j��}��i�y���������+�r���o��2C�W�V��=u��)���O&L��TJ���u��IR���}����u�t��-}���Z�h��[	$\t������bJ``��-��6Y&������3�s��$�;wN��C����_��3fLU�-/^\��W�=$I��mS�^��w�^�={V_������V)Cr�����$�&Y��d�p�5!;o��f�q��cy<1�G]-]�t�V���U���*""B,P�^�t��
�]�V,��/�������DFF����r�3�����^m��I������Gdd��]�f�wt��}��i����V�����������e�j��������M�p��9Y���?��A�Q�|y��#;��#9����%K�8�m�	co@���u���V���������}�&�
�����9��!�r�GZ���wxx�f��a�O����C�r��>|()j���0qss�����P����S����mx�Y��Z�����KI���c�Lhh�9!�|��1&�;{����Y�fU�V��	��.]�g�}f�?z��w��S'�\��M�K�V�t�.)*�;wn���J����Ku��U��u5x�`��_��OW�����S����q� ���?M(rD�������'�X��.Y��|6�������[��s:�o�����h@J�*��J�
 ���Y������a�$)C��W�^�2�>���z��ev��t�R�u�-��ly{{����2����^1=�<��3����P�Y�b���Z�L��]����P�~�_p�<���2�e���p�����4i���G���;-(Y�����g�����
O��;�y��Q``��~�i���r�J��T4g� J�j�4}�t�=�
�����r@!z��='N�0_g��=�q�����;��=�+%|G�����C���������#���H�->�l�b���?��~��S'y{{'��}7��5�g�y�������{���-��H��������mK�{��e ������Q�F����n�7��Z�Or���p���/Y�D.\��xHR,d���x����u��}����wO�.]2�g�����u-b�4��$tOgs����K�r���1c���^�zU���wq���#>������G���7�?���x{{���^�o�a�}8 a���4������z�-%`���1�����K��~��f����\��u��V(��k���f���9sF������6m�����	�����{���U+����`��v������6��8qB��������Z�li����Q��/���%�N�{zz�v���b&�K�.-�^���SO���W�K+�g����3KJ{��'K���������b����M'N4WF�W���Ag}����K�a����A���@����KM��r�*9c���J�f��[������u�$���]U�T�U�s����)S���`5q�D�u���nsjA|Cj���?:�W6l���a�����_%i���9"22R�|�������s�s>���3��)i���FlCjW�^=s������-EDD�����c��3������;wb������[[�l��<�U�V���}�������v�m���/k��i�^:t�����E����-Z4��"�P��I���������>WPPP���?����|��D���[��z�O8r���p���[>D�T���5��)S&H��{��;�n�s��QXX������wrJ+�mx�L�0�|��X���P^�rq�n����k����)S�|�y�f;v���-����:;������)�T�3>��,���|��q������_��<�����?M(rDQ�mH�\=��*Tp�^���5   ��,Y���������t���������q��p��Xe�n���?�X��.]��[*]��:t� I:w��z��+��}[�:u2Wy��wb����������D��{���uk�\�2A�%��!C��}��1��t���k��|��g��6�E�5W��;w��C�F�b��N�/]�T/^��w����[{���{=��
)�;����O�b�
EFF�,3{�l]�~]R��6�����O?I���%x5��S����Mnnn1V�|��-[��������?��H�|}}c�<���9O�w�yG�6m�[&���D|���������z��)6�������C���s�Y]�^�zj������o�a��3v�X-X�@R��H��}�um�t��9����:r���2���1�o�7<�����y�f����vW��s���v�j��������;t=.����%I�*UJ3�����$������t��]�q)KC�1\�U���5kf�>G��W_}e�~������]�pA�:u2���������Q�V�Z����k����/[�@d����� IQ���=-�����/�4����������_�����2�`�
�?G�������;����Y�ff��i��6w�]�n�Z�lc��[o�����@�-JZ�n�I@<q������$pE�������l�2IR���cL ����P-�M�����m����o���u��p�Sb�&L07I�%""B�|�M�{N��c-���P�B�nn,O=��j��!)*g��C���Y�8q��M�&)j��k����8;��R��5K�'O��`�5N�������v@����	�&V���U�T)I���������*c�l��
*d5��R�����O?��s�l��s�N�]����I����I�Q��r�x��z�-%a���1������@R9v�X��8��jhh�>����6lh51����1c��{������/���;�I�&���Ppp��M�f�����*Q���������i�N�>���gk������������G�j��I:z���� e��N��|�v��h�"��_m���_�e��Vgj���:w���3g�����^��:w���u�*}����w�&O�l&�K�(�o���n�
4��i����|��Y���^)��{��I�&i��I*Q��6l�2e�({�����N�<��s�����f���&1j������W�f�T�B���[���:w��V�Xcg�?�������>���c%E%m�z�-8p@���J�*��$�_|���`5o�\U�VU�|����C9rD���7��������O)R�f]���y��?_#G�T@@��4i�r��)g�������3g�p�BK��d��A.n1�Z���M�6U�v�����0���K3f�P�6m�?~��wO;v���3�����������Y��	T�fM�?^�'O������K�����?�V�^m��<yr�J�?x�@?���~��U�\Yu��Q��%�5kV��}[G������	��N������Y}�.�O�>z��w��IU�\Y
����n����������r�����;i�$�|���_��iied�nxR���[,��U���~�/_^�{�V�R�t��U��=���0K�,vw|pT�54x�`�1B��]S�����[7��][�����k�&M���W�J��T�k|T���3f�^x�EFFj���*V���t���e����SG���9sb����W_)o��V����/k�������u��q�+WN�z�R�*Ud��l��_������U�T�{�����G�]�Vo����)����c�:{����Y��K���������Y��kW�����5S@@����/�m��#����=��������#N\����U�oK��O7�M�6m�#G�?��1���k���:|���^��5j��_T�
�-[6]�zUk����y��6W�V��������'��-[��o_(P@M�4Q��e�������������o�����Y~���W�������G�n��f��x������*W�,�>}Z,��
�������T�R���"��:tH�~���|�M5n�XU�VU������K�.i��m���?�	�o����h��r��h|8s����C��MS�
t��m
>\�V��K/����s���3�����}�vIQ�Jg��%OO�D_Gr�q�����>�L5k�T��5U�xqe��Y��_�������g���������'x�p���=.1������{]�v������5kV����q�K��R/W���:�����oVH�v��iH2v������(�����x�6l��:��'������=<<�O>��������(Q������Y�8w���z�����[���F�����^^^��e�j��)S��uL�2������}��5����^s�����/�Y���Sc|�s��V����~~~f9www���k6�u��J������;t��X�������a������v���W�,�����;tm���������ks��3g�/����c+�Y��z���<o��-�<G�R����`�����9�X����1���wD�n������u�P�B���=��t���_����j������7z������/n����y-{��5J�,i���3s��I����b��c���uv��-�����;���L�2����w�N@|CR�����)��n,p��4w����������O����$�����}lb�ws�
	u��M������o=��q�G�[�?������{�f��W�^�[��ad��5��W///c���q�������v�j��w/���a��1�7$�3s/���6m�8|�f��g����v�����#���[����;M��h9�����OM�p���/W�t,/^����������C=q��Q�fM��l���q���x��q�6��_���q����3~��'��Y�������2N>���u�����y
�������oDDD��+)��qq�;�Y�p���]������_?#<<<q��7��3�G
���`R�?�[�.�������g�����X����n���$5�"�sD�K��i4�qGG�8��$G��rD�7��������e������5����OJsu����x����7n�	&h���:u��"##�7o^5j�H����*V��P]�J�Rhh�&O���s������k��#G�+WN����:u�$www��?}�����?��C���_z�����y��?_-Z�p�y�I�.�~��'���S�������t��������_�<��^~�e�m����_���*.�W��.\(I�X���d�b��3g�h����q�����c��������P��9U�\9�i�F]�t����c�B,Z�H�W���u��������2CY�dQ�%��qc�����nU�����U�Z5�[�N��������\�r�r��z����}{�K�x����9i���;�b�
m��A���:z���]�&777e��M�K�V�����Ge������X^^^�<y���S�*88XG����7�>}z����r��z�����C�O�>�:��)�]�vi����;w����]�tI3fT�b���ys�����3g2\�s���#Z�b�6m��={������u����O���s�b��z����C�x}�O:g��7n����[[�n��m�t��)]�rE��_W�����J�*�e���������n���S�U���mk�>6����'I�L��h�"�����>}��o���/*S�L*R����m�>}����������/��CM�<Y�V��1W�fMu��U��7�������Q�F�1c��/_�={��������P�,YT�dI5h�@={�T������S�'O�����)S�h����Ny��U�:u��W/��Y3�?W`�
H���Z�j��[�j����x��._�����O�
R�5��S'=��3.k'�7�o@jF<�����p i�����d�RI1�Z�`Am��A��/��9s�m�6�={Vw��������������s��j��A�����mx�=Zm�������#G�����
S���+W.�+WN��5S����>��,���7w�]�x�v���K�.�������S��EU�n]���S���[WR��S��C��A�Z�v��m������sz���2f�����V�Z����D����QG��[W�����I��`�:tHW�^����J�*���[�O�>��1���o������{�j�*m��Y�������u��y{{+_�|�R��:v��V�Z���@������D����0�������0\�$NHH�*W���;w�R�J�n8��Y���sg��4�� �"�H��o�*�����i���Ci}pi�
@ZE|�V��U�7i��s��[V��1 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G���$�su�<K�.��\��_{�We��q�
��q��+w*��53���W��lOGeZ�_��,Wi���4sa����+���{ �������������8x_���� �����up�M�6I"��Y�mr*����� �"������\�8	��4���T�79�
@NE|�S��D���v3�pi�n����7o���XW7����]qqq�n8�
@NE|�S��T�79����6n������)H���d���T�79�
@NE|�S��D���f����K����;w��V�������\�R����
@�Bl�S��T�79�
@Nu�����O^^^�n
���o9}p9�
@NE|�S��T�79����I@�A�V���� W7������orb���� �"����o����Qr��r*����� �"����o�|��n k  �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@2Hll������=[�=��7n�<y����Mnnn
v����`�}nnn�������zo\\���-k��V�Z��� #l��M������U�~}*_�|���R�����U+�3F����C�EFFj���7n�{�1X�������[�ni��z���U�\9���G�}�����;k���:|�p��l��UO<���V��
���G������?�+V��M��������ys-ZT�s�V��%��EM�<YW�^M������kZ�d���&M��h�����T�T�J
0@�V��a��9s��k��
P�<y�;wn+VL-Z���1ct��	���2v��k��
v�������s��sg�.]Z^^^*Y����i�i������)��������o��s��y���T��|}}�������^�zz����u�V�|�9�~7Af��
6�*��t=�����c��O��'�xBu��U������=:�m�z���N��x@����������J�*�v��i����p�B�>�RF����j�*U�25���.]�g�}�����l�����V���U�jU=��c�:u�N�:��k�~q��g��S�Ni��z�����ukU�\Y~~~���T�B�t���k���Z�n]�u�����?��'�|�>}��N�:*S�����#����C��8q���?��O����1��7��=;U��i�LNDD��/_���G���R��%����o���i���M�,YR^^^*]��:w���s�*...�:��H������q���������������D�;Ny��M���������5j(W�\f�g���p[���������^/���Z�j�
��2���w�������3�k�~���L������D����R��E��A����:{�l������+��

�+���:u��h������������������~Pll���;�^75�-�����9��93����lo���$c���n
,t����d�k����5p��$�����z��U����e��i�( ���;��v��7��x�����e�7�n]{��I�������_~��([�l�m1b��:n��i�XG�.]��W��������[W�2e�?������!��&M�dx{{;��7on���)�jT�T)������)S���i{�/777#<<�f�F��M��Q�zu���Cv���sg����wo�����<�2�����������-$$$U�-��	

���Q�F��}k��1J�(�b�
*d,\�0�F|CV������-[�*^:z�=k�,���/��&O���k�5�R+#�u������:���mk�;w�f]���w��
�f�J���0w���3�����>������Y�f���<����Y�lY��I���U�[g�f��3g���'����BBB��) 5�o����q��Q�|y���{1�s�).l���9r����������������T�U������g[��_o/^��y
.l,Y�������l�7��+��\�r�6���R�#�.]J�g���&�eD�#�!��O���,H?W�����x���������]o���+�bbb4s�L=��3)��9s��� +*V��4h�Z�j�\�r*X��������p�X�B�6m�������o���;z��w��'q����P�*Ut��1��u+C�a��Y:t��������:�]�v�������"""�c�����6����S��=��/�H����5`�5i�D^^^:t��f������O��/W��]�j�*���;��,X�>}���m�l�R��uS��%u��y-_�\�V���'��sgm��AAAA��p�{�������(I������k��u��X�b�������5w�\]�~]7nT�V��y�f+V,��N�8�6m����K���fpp����>yyy)<<\��������#F(O�<:th��a����[�h����/Ij����-w��uu��I�v��$�/_^C�Q���u��i��3G{����}���cGm��Y���y�<y��~��


R�����'777�9sF7n�O?����-X�@�����5k��#k���uE|���W/����n��e��=���HXI����Ku{v����zH�o��$���*_��$���c�3g��?���/���W����c�T�@��Qc��r�oh�/ki���5j�$���S]�tQ�-T�D	��������e�V�^��6p>g��:��10w���[������J�*�+��?^�7o����u��-�[�N�Z��������c����K�a���Q���?~EEE����Z�t������W�j��Arww����n�
���ed�����S�6m���R�J��!q����T�5���"""��cG?~\�t���k���*U���;�3f���c���?��sg������7o��~��W)~n5j�HS�$�Y�o����;��y����q)N�L/��-���h�9s&�mJ\W���U�L���?�uH=g��+V���m�N�j�B��W/���'U���q�F=������$��SG�?��t���Y�FK�,�����W/-[�L�:u�Y�7�q�������cGm��]R|_�[�n�U��
,�k������Z�f�v���p��{���z��z�����IO�������|�.I{�S�z$��>0^�uc�����c���^�8���?�����={��}_dd����eH2�v�j���0�]���a���F\\��2s��1W���+�q���d�9r�0`�1e�c��M���f������O�����d�-[���}���1116�?}�t��%J�0��������7�v��0aB�u]�p�(P��Y������m��5�����/�Bl�7<��SF����W�����	7*W�l��4�f}C�1�u��!�U�����7�|�,W�hQ���;N�&[j��e������Y���_7��j���v������h�W�^f�~��������������k���V+�/Z�(u�T#��;�y����f��3vz���w�}������~��Q��t��m���N�:��������������k�}�7d����������{��Z�j��Y6**�8{��S���oH-g��:��1����������	3*T�`���G%[��������g���{f]���FTT���E�0w���3�����>�����f�8���t�c��M��a��/�����m�9'���������|_�����{^�v�j�����Y�������G���
�1.�i�&�����'��8s�Hg�S0�����U�V���7�:N�&n��W��/�h��7�8x��g5�E�5�o��������6�)b���_�����o���f]/��B��c�Y����.^����*���|�7��+��
�0:v�h����^2n��e���S�l>S��{]�iY�
���5g���y\=wJz���Dp�3&�.\h���v�������������"����t�b��3f�����mT�X��d����8r�H���Z�����K��,w�������d(P ��	&�uu����yl����o��~8��vo���t���]����<y�$�xi����o���o���bbb�����e������;j���V������4���
I����q���d�]�v�(Y��!�pssK�A��L�4�l_����URF|����~����	��IKzTT����aH2<==���/�,{��%#W�\�9/��"�!��N	�.\0
.lH2����/#c��Z���M����K�,1�o��y���Y��Y��u���B���i���0{ap}�{�����H@�%-�����\�d��6�2O�<i�%�����t�R��H`���o����u���@�c�=f�����8+=3�)�����]��vo��1�~����j����k���f]u����8e�1v�X����c�-C���@|��d�|�e�O?����7�s�R�9pk��g���z��]�����k�����s����;6���9S���aCU�V�imh���������&I������~�x@�K�����y�Rll������~X�K�����|}}u���k������m�����6�y���d��Y��,�������;�r��m3����+I���������#�<���������[����U��z���/��B����|\�
6�.I������K������G�*U���>�'NX�����������Y3/^\>>>�R���y�]�~=�so��Q�V��U�?~yzz�X�b�V��x����{v��T�^�|}������%Kt��I���#U�B�4��H�|}}����,[�@u��M�t��U-_�<I�u���������{��A��y�����I���M�������hM�:UM�4Q��E�/_>��UK}��n��a���g�j����U��
,�����Q�F���od���fF�R�p����U��*W�,I�y��O;w����R�J6����P���������3��}�����w��~��gEEEI�z��%�d����O��
�$�����}�����l����[�m�V%J�P�<yT�Z5����Ib���W��'��~�����S��yU�vmM�8Q���)�{��z���U�bE���W^^^*Y��j����]�j���:y�d��p���\!22R������E��`��6�*THE�5�O��A|����k]�xQ���{�9�_N��|������=���������0�w�����[�Q��
(�"E��y��Z�hQ�1���G��
S����'O����s����aC���z��&M����[�x����;�������@��__C��������s���3���^�7;b���f���'�P�|��-�����={J��<~���LkcJb[�V�$���?��C��[W���*T���������'���^zI��WW�|�T�P!�n�Z?��c���}�����+u��I������V�<yT�lY�_�~�={v�/G����m��Q:t��
*��S������b�2+#��c����!C�U��s������G���F|��	&H��p���.n�k��=��o�g��$���KC�Q���������K��G���[����_U��] ///�.]Z�
RXXX��>z��^}�U��__������T���U�R%�h�B#G�����K2��4�������Y�a�3��=Z�t���1B�+WV��yU�D	u��A�W�N�����K}��Q�
��������G���{w��>s������M��H�"���T��U�B5n�X�<��V�\����4__����w8��W1�������5k�U�V��/Y�$������,���_�v�*K��]�x�h�����O	_��9bT�^=�r	_�r�2�{��d�i�B��_~�l��_�����?�r���7��\������F��mg�����O/������#F���m�������{�a�a4h��f����.\H�������O>���u��9���L�@K��w7��f����kg�}���4��u�V��
�X���>2����'��j�������o��s��Y���7o��:>���#""��[���XS�~}s������jW��_�?����93+v;�
���_��?�y��d�X���?���+&&�(V����|����j�q��-�P�Bf�BCCm�����Yn���v���y�Y�a���j���S�����e���kF�l�������7�0:dT�T�f�V�Z��9����F�.]�o�>�l����o�6g���Y�-���~��-sWsOOO�+��a\�x�,[�H��$G�RF|CV��v@�X��!���;w����[��o�H����GF��_~����;���W��/=;�[��6p�@��?�4���}=��f_����2���}M�6��y�o�n�(Q����m��4_��0w���3�^�g<s�)����7g��-�q��-v�.X��,��W�d��bM��50*T�`7���}�0�X�l��/_>�e_�u��<v��q�}�9�/^�)��=�7$��q�m���$c����a�zf�Sf���o)#���2j����f����4��=���|�A������'�Y���Mr���
H�������?��������-��^��}��z����?�����L6�����~��a�m2�fL*P���u�V���1c�����bl��7o�|)!�!#��9pg��8*���?����>Y�<I\\������,���i,[���yW�\i�����������|}�����\���o�^e����'4s�Ls�K	+���������U������?��C��W���?�
*���k�����2�O�V��Mu��YIR@@����U�J]�~]�����,Y������;�}���{�=���n�Znnn2C�����O>��-���O��[o�e������7onul��a��y�$�L�2����*U�$___��qC������7���J�o�����Z�j������/�.��o���-[�n��i���z����c�u��A?���-���0M�:U'O���}����/��o�Mr��S������$���_��wW��uU�hQEGG������}���]��k�e���Z�t�$���[�;wvq����������$����b�������)S�l�2�����+���)�6m�h����������Ha�o{������bbb��~��[7����;w������;��}{=��#*R���;��?�\'O���m���/h�������n�����`�h�B>>>��m��M��[�ni���j�����\�����DGG[���l�GyD���$��_�O?��<y�X�1C������<x�|}}3����?����/K����T�vm�e���k��_���z���������X���?2#���Rr��a�7���{��������k���j���������5}�t8p@��S�����O?�]�v:y���w��:�`����o�>��3]�tI6l��q�4v��$�y����U�-�^�z�z�����STT�����u�V���8��������d����O:v�����U�pa��QC�����!C2u�ooou��Q+V���;w���/����V�\��ww����##I9rd��dr�oly�������+o��*U���4i�>}��u��v�a��\�F
���G���)S�j�*�:uJ>>>*W��:t����{N�J�rj��o@�r�^7�:w��^�u����O~����}�$�D�j��i��Kp��q=��#�r�������eKy{{[��M�>]�7V����O�H�"<x�j������X�B�-�$=���j����T�bu��7o��G1W��[��}�Q���+o���t��8����V�[�g�9p�k��o���/4a��8qBqqq*R��j���N�:i���I�V]�0���O�����:u��-o9�d9�d�O<�C��������R�����aCu��]?����M\�rE]�t��c��q�
h����:u�.^��+Vh��qz����[7y{{k���j���<<<�a���9S���?~���o�6m�$9W�����U�TQ�=������:t������dw�\-�����;<x�bcc��U+
:4C���)�*���������XIR�.]T�X�t����+U�dU�7��UX��5l�PR�3��|��v���K�.���Ou��Q������$��d�C��y��:p���^��B�
�\�rj����j����X�b��,Y"???
2D��������+Wj��E���������qc}����1c��W��~���\�r�x������-[���������������s[�'44TO<��bcc�����;�}��*V�����u��9���[k������~�@Vr/��;;�%-v���	&���#I�l��Y�����o���M�j���;v�����7�h�"�^�Zw��Qpp�:�"E�X����������_�.Ij���:w��%J���K.\�?���u��Y���Y.I{�S�z8�Y���a�����$����8}��U���(�p���$�_�~�a����[OLL������=������r�Jse$www����NR�F��$�h��Ivw�r���"`�&MI����eU.::���7�Y����g
www�����#~���v���g*�<xp��0&&�jg��u�nnn������a����aDDD$)�������n�m�n����x����=�����t�Rc��������'Z�P�+W�dR�Q;�������v��������������1~��d������r���)�b9t�P����o���y���~�[��*����s�����`�Y���%�[��3g��<<<���k~~~���;��]�n�Y_��������,�6X���,w��y�]�+f���k��3�����x����v�0`���gh���y��?��f���Xs�5���;)�]�lY��'N�-�o�>�o�����/����������m�1l��T__b�����h|��u�������6~���d���F___s5�111F��
IF�
���|���dchf#����z����f�b���|��%��qDZv@7�����v�4�}�]c��������w�y��o���������6& ������*3w@����M�$���~��g��#�<b|���������|||�����~�[R�7dG�u�u������0�~r��%��_m<������$�S�N���a����f}���7��g4n���+o��������2�.\���}{�r!!!���������3���oDFF&)k�*�3�<��������#G����}�����K�:	s��?���9p��0�2����h�������E���/��6[���s���^m�hrs��c�����kL�%&��^///��_MR����xG����+���O����3gZ�
Il��m��=z����D�!��Rj��K����v�u���5N�w@'��F|��e�<L���zW�X���
d������n��'OZ��'�����
H����~��G��.\ht���n�Y��q���T�'�������������s�%�[N���AAA���;f��2nnn��a������s���E�%���g�5���E8..������}��@|CF����������s&����c��Q�����et����y�f��0�~��GI������O?��n�6o��������s�$����O�9s�������C~��U�����_oF�M���Q��g�Y�d����+Wl�?~�� ob�?��y|���V��/_n�LVL��7n4�����V����o���$*g���V�V����N�\�����z�f�����Y.�����z������h��{6l��
������U�4��fT��U��z�����{j��i|��G�����S�m�����I�&%[�e���?�l��W�^M��~��u�2��>���v����/��:uj�?��,?k{	������9,X`����w��q�c����������J2������x����wo3�;��v��%��d���0�/���m\�t�f�+W������s��:u�����w����������j������Ssi6Y����oo�\��x����G�0�b����?��EDD��^y��\CF#����3����-!�n���K/�d|��7�����Y�f/������ou�����Hk�a�����x����}���+�D�� ������*3�}}}��={}��1o�<c����I��|�*N$�b����_��*T�`>���iSc��)����O>���_��U�Y�dI��O|�������{��rF�6m���V��e�?�0U��$$�%���+���C{��IS;-%N@�7o�����}^^^6��n��i�����d�/_>��?���g��}������i���0{a�9�����>8���<k�,����h�����o�f�2/^l|����SO=e5o���f|����n��]GX.�^�n]�����k����kI�8���7��������1w�\c��E�g�}f�������4�������-���>�Y.��{r�$HH<���J�������:�����oH��q�]�v�������:�������	������m1�a��N��9�29:((�n�O�g�^~�e�����o@je��u�F���+W�lH2r��m:��={�1o�<��W_��/Hv1^{R{�k����@c��a���S���}��1z�h��%�;wNw����s��m3����[F�����5j����������������!�/z�]����9pg��8*q��M�l�M�����������Mm��Ir��'�4�In�����s���-�/_^�Z��$��=�����3%I���3�d�g�}V���C��?�h�~���T�@�e�����K�V�\���(��m��1_�_���X���*UR�6mT�ti���'Iy��5_����f;��������g��6lhul���6�i����z���I�'\���{���.��������R�J�n��K�.��O�:�7nh���


�+����={��g����k�����e_�u?~<I}O<���������C������R�~�t��E��z�����
2����K��g�%{
�����3���V�=���c��53_/^\=z��Y�^|sU��+::Z�=����;'Iz��G�����}����&L����~�f������?��]����$f��%�0$I�=��
*d��������������c��v�Z����������A�iz�=��7=��S6���oy��1_���3-�����o�+W����}�vM�8QC�Q����O>�D���/�`���7�y��t��Qe���'�|�^�z�,���?j��q
w���o,}���:s��.\�W^yE}��Q�^�4r�H�X�B[�nU��e%I�����l=���G�Ull�F��?��S�?��z���_|Q[�l��/�l�}��'t��
�\�
�i����<<<��m[5m������*T��������R�X1�}F����K$[���G����$���%��a�
@fb�9���GN��~s�f���7j��q
V���5t�PM�6M���f��0
<8��hW��9�������3������[o�o��������E�i�������%��I���Cqqq���xz��gl�����WO�5J�����u��Q�c���]�6����h����s��j���W^y%C���)�*��y�m%)88X���{��*\������W_}�|��RHH���}�K�� �7���X��:$___m��Y_���>}�h��	��o��U�&)~���7�������(,,L��O���>��={�_�~5j�v������N^^^��+Vh��IN;�C=�r��%{���[u��5�����+W�d�6j����7���g����^�wf>KZ�I�&6�7m��|=`���3e��1����7���#H@����::�M�6I�N�8��k�J��pss��6XN�&g��-��:�-�7o^�=::Z���V�[�li��[�n����I��m�J�Z�nm����y{{'��T�Z5���K��	��M�k���eo�"W�\������$�%�D��k��	������m[-]�T7o�Lk���y�f�!�0t��u���Kc����k���[o�f��f��
tV�XQ��MKv`����3o6����i��%)���/�V�Z����O+((HO?�����[-\�Pc��U�j��l�2U�P����o5z�h����^m���g�}���k��i�������'777��+-����5j�<n����k������b7�qqq<x�6n�()�At�	&[&N��������>S�����_���k�������5z�h���[k��Q����j��k������2������QQQ:z���O��2e���O?U��u�:x+���Y����+�`���M�
(`�g��uz����z�j�D�����d������l��;�&O�����K�h����K�9��#G�Z�jZ�x�F����P��yS7o�Thh�F����8����j���S@�o,5n�X�s��y�^�zZ�j�9i����j��mI�%�wn�����j777M�0��������s�q���d������SO=e�OFGG�����7o�����Y�f�E�z���g:s��Y���W�����5b�9u��z���}@�2f��8[BY�0t��e�c���3���~�i�5JLc� e���?���G���~s���.f�?~��7�\�#**J&LpZ���z��)_�|6�W�XQ�W�V��E%I�����%K�r���+�]�9-}p)i|k��������c��/(444�D2 �HK|�����s�Nyxx��o�����6Zr�8eVE|2���W��?H��5�
rJ������g����_��&M������o�Q�����}{EEEY=w���SB�
@Z%��M�8Qu��IR�D�������g�������Ii��~����/�0�?~�������I��7�q:{coqqqj������+�={6-M��{q���,i���fY�^|��n��i�������R��{
	�@6��c��D&��={�����������oCJ;vDDD���=��\��JR�B����?������={�H���&��m�f��e�Z��I����>}���s��Q�f�T�pau��Ac����M��> ��i�%�=���0���$^9_�&L�`�����Ou��M�
R�F�4r�H-[�,����7o^��UK����BCCU�T)EFF�s����w���'I��	
d���'�|�|��� )~��U�V�"��yS_~�����{k��Q
�}�����[����7I}o�����kv�CBB�U��y��\�R^^^�>}�j��m���JM�r4JI���b7�V�a������y�$Ie�����kS��{��w��+�(66V�����[5n�X��������V��Q�Fi�����;��_����{����N���k��;g�+W��w�b9��h_���[�����///�/_^��
��]���M������_�����'%������$}���f�������
*��-[��7���5k���YJV�o��7����[��*6e�A�i���������j��-����v����������K���;����;m��� ��V�j.�!I���K�2��s�������k��a����;��
�Xi���J<==U�L���G�7oV�~�$I�|���y��T��?~5h�@�����O���_���j��m����JM�JO|�Z���~�mI��74v�XU�ZU�J�R���5e��dW���b�9���I��#���~�����n�����Bf�Y*^��F�a~���#������)S������M�2EAAA*Z���t��	&$Y�p����h�����7T�W�^��3+�SfU�7 s,X��\0�e��Iv��o���������;v���_V��=5l�0-\�P�ah��1�����������ce�o@���)y��5�n�S�V-3i��������6h� U�TIR|�����-��?x�`sq����OO=��J�(��U�j��!�3g�.\�������:��|�����v���$�:v��H�.\��W^yE���*_���������J'N�Hm�s,��l���G�{��$-Z�H��_7w�l�����-�)m����k���y��X�����{$L�_�zU��o�$m��A�a�����tO(w��s��M�6�8�'���j��������Dz��U�Y�F�G�V�f�T�B��j��*/�]
�l��


�/����K��|�l����'�k��*^���}��d���T�\9�?^R��|���[/q'9a�c[,'��=�l�%J�����%K��[7�.]Z^^^*X�������?�X�v��������f��;����������W�5�?~3A��'�Thh�����H�6�WjbVz��+b7��a��g���_-)�!����+00���N�>m����+���^�Y�i���
��+W4k�,�4����}�Nq��|�����_�|�����do%b{|||4s�L�}�G�N�*jZeV�-((H�w���A�����[���h�������J�.����N�6 3e���X���U�bEI���aaaz���������$�o�^��w�Y�G�j���$)<<\?���S�@|��8p ����wN-��q�z���yxx��/�0��&O��dW���W��^y�I���5e�g43S�����e��Y���%K���^P�*U��Y3�� ��g<5�Gv��������[�t��q3���,�xy =&&��������kKJ�i��}��C����W���"##��/����_WPP����~�����:�^i�o	;���}[���z���2��Ya�2�"����y�!C�8���C����#z��7T�n]*T�L:�������/����v����v�7��,�o5k���A��5�onnnV;�g������_�U�'O�Z8�����9s����U�dI����i0Y��>��|���������5{�l�������������SO=���u�����E:��
<X�t��u=���:v��������S7n�H�|�J�����r�a��u�����5k�H�"�����/_����J��v��Q��/^��/���~��1c��];s����0���_c��I�z��"E�h���:{��9���Gs2����z�������,��N�:��7l����X�R��������XOxM�����u��%K������������m�6���������}���
4�{���+k��)��w��^����(=zT_~���V�*I��/+���9�az��g���_J������j��W���;w$I���K1��C��kg?�}��E3�������������W��s��N�:%)��M�4�7  @��U��`�������\%  @3g�Tdd�~��w�?^=�������g���/f��$���R|��h�����$9�rw�k����3���#�X�Q��Y�
�����fu���7Wu��Y6����fju��E�6m��3g�x�b�9Ru��5���6mR����v�Z�@N�8s���8����7���������tD�2e�'OI���'��`[�?���XIR�J�R3�'3�v3J�f���o����Z�l��x�
5k��\�y���z����Z������w�^�>�z���<y����$_S�N5�s���ciYX�^����o�������-X��{��9O���5n�8m��]�.]Rtt��?��s��a��f[$~N��[��������wK\&+���{|����/��#G������1c��b�S�������W�z�t��i�H?���9;�%+rss����{�n���k���z��gU�zuI��V�\����k���.n�k��ds
40����~+)~��G}���2�,Y�|}����[&�*U*��������SR�I��m�Z�M�`O\._�|�q��7�:t��w�}Wk�������V\���t������r���
��^��E�t��9-^����Z�~��.]��V�,��t��[���)b��\�b���qGC��|P�E���k����x�����`g���*99v#�J��6m���>NHH�����A9Gb��j��6:��y�����;�t����f����m���-�s�Nsr�z��������������R�-��k�i���:�����+�o<{�l������R'+�7[,Wu�<F��GF ��_J��z����5R��;��
9]z�u�g�O��{SI*^���w��I�&i���
W�=$�/*���/���r���O���ef�9..��������pss3�yll�BCC����C�Q�F����c����W]�t��q��q�F�>}Z��7����K)&�����f��z��z��w���4i�Y����V�n����6����Y�
�������#��#22�L���/����cu���s���U���:��[�2Y�����[���5x�`}��7:z���l�b>z��i}���.n!�>����3�Y\-  @}�����S��?�h���j���$���kz��7]�B�"��������+��Z��yR��v���yS���$)w��I6������K����/���������6m�X�M�~��]:~���o�.)~�r0�Q�����o���]�J��*���d����F�m����]�  ��X��j>���:�����V�n�����%�?L3p��4�%I3f�0_:4]ue599v#{H<Q�dI����R�J�ay��������������R���YN��f��x�|�����-�r�J��e�M���8=z��>+��H/ooo=��z��g�����&+����:u���zyy)000C���?��B|�����ur��>>>j����}f�;g5�7�$�����9�U�6��l���7o�y]���O���@��8s���8\-����7o62K�.m�\�j��#Ji�";+Z��>��33����V;N-��0N����S��sGs��5�O��6���w�������O�>������������y���{m�|V���a���U��,
40�{C��]�uS�Y����g�j�V��%K���=>��^�o$�9@�����Q#5l�P
6��a�\�$�c�=f��6m��^�j�����k��I�:w�l���U�o���>�@R��q�S&������{�)&&�����\�r���:s��|m�����K�u��M]�k���3_��5���W_}e����S��9f�EDDH����+�4��g�}�������t�;#��*��7#J�(����w�}���r��_~��nJ���<�#;�8j�����k���A��~���v��U��������S���~�����kI��*���+]m���u��yI������U_VD|Cv�U��-�����G���3��M��c�������Y6&&F.4����#��������w�}g~��C%[������8���8�?(���9�"�!'p��nV�m�6���SR|�`BR`Ze��Mg�����$�p���w��|m��2���w�}������+X��|��W�q�F��N�:�E�I�OMX#-��?�)S���g�����op������k�0�������XK����Sf�7�4��/��s�$���[�n]������;v���1�#F$[��[�!��S�tis��7nX-�������E����e�b���;������weo����[�|�6�����3�Y�*???(P@��t (Z�����om��Y�7oV���]�$S�5��sgIRDD������7o&)��o���a���z���l�i9y>{�lIR�������D��Z��U���O����'���K6�}��9-Y���>a5��.""B/���������X
�g��G�����K�����=���������$iIV��e���@�������j:K-[�T�$IG��3�<����$��N���K�J��x�����o���6��bbb4f�M�0AR��Z�|��������L�L��M���CsU��?�<�����c7����{��]%J���
���e��MU�lYI��K�����';�c��z�-3^����g�����H|K�r����������k������?/I���R�~�t��u�21116l�9 ��OU�R%I]k����9sR\���_�ZT����6W��BCC�h�s��
�D��!�qE|;r��>��#����sG����f��e��;����+K�.]�(_�|��:�|��d.���5t�P9rDR|�0�?����={�+-w�����������[Ohh�:v����(IR��v����_?U�VM���h��1I����^{��y(00�f����o�W8�^Wr,9����5e��$���m��U�>��9f��o_,X0I�	&��[ZTT���y�X�B������C���
\��O?�������o��I{����@X�"E2�yr0���O	s�����o����5}�t��;97n����n�:I�}N{�&��������T�)��W�n��GDDh��aI�=�_���}���9r��d�K����U�V�}� ,,L;v4���U�����;�j2��y�4c���^R�r�����;����������H|��)�2��U����esG�[XX����?�u���Om��1�
��c����[����st�h��q���_~Y���I��={V}��5����������&�����xO�`�=������bqB�IDAT���r�����r��#G���������!�b��3�Y��1c����~K6�'����u��eI��\�n�S���i��V������@��o�mu�M�6�^�<+�>}����t��Y�X�B��W��A�T�re]�~]�W������?do�����U%�I�&�������S\��u��:p��Y�p��6DD�F���^{M�Z�R�F�T�|y���O�����g����o����S�*UJ����n���O>�D�|����������j���������u��1��?���/_��z����V�^�y�f=���*S����o��5k�X�b��;�._����G?����M�o�a�h��3fX��,���I��I��t����t]��_~�&M����3�1c��m�����+  @.\��?���k�Z��p�������O���z����������:x��/^l�������_~�Y�$�\�Ro���Z�n�f���|�������S���o�i��5f�=zt���������o���S�J��1b�8��}_PP�������S�}��}�Q���i�����������YS���:v��.\h�P.���*U�)�������>-bo���V�Z�={�h��
�U���
�r�������={��_.[��>���d�9y��
���^:tPPP�����7o^��qCG��o����[���i���^��T����\����Gk���j����4i���+�@��|��<����������F���{	dM���uE|�~��^{�5����j�������r��)���~������E�����{>��5i��f����ViK�-%X�~}�	��{Lu����7???�?^����g���?��o_s@�����;w��'tww���S3|wvg"�i��c������#T�B�k�N5j�����<<<t��i�[�N+W�4'b��H���Cs��Q���u��u�=Zk��Q�^�T�D	�:uJ����m�&)~��y���j�#W#��^��{��pV�t��^x����j������������_�n�Rxx�BBB���^��&N��l�~��W�����\��Z�nm+###�{�n-]�Tg���������vcS;w���9sT�`Au������;���=���]��-3�&����.n1�����c���GV��~���g���O���^R���U�n]�)SFy����+W�s�N-X�@����������:&M�dw�������W/��R�e?�����_:y������}��)88X�J���c���7����c����5��)S��T�R�������~/^\���:w��6n���K���'���j��E���H�G�2���1c�����]�v�_����-+�?^[�n�?�`&8=�����?��[�{������������������2)��4N0d��]"\�|9��e2iXXX���n��9p�Y�
YYF���>}Z�V���P�e��3���C�z�R��M��U+U�TI���:s��BBB�|�r�r��!z��W��G�-u�o�W�bl�q��z���4a�]�tI�5�����Y3yzzj��]���ot��EIR�z�������u���K}��Gj����6m���+���Ww�����G�l�2m���,�����W^I�����?����'+  @���������E�*66V�N���e��i�&I���e�k�O���,YUHH�F��b���c���]��J�(!wwwEDD��6	��9p���;I��;\�X		1$��k��Q��5p�@���5k������u�l�2�fF��-��Rs�j�����\�rc��u��V�ZY�w����������=���6��={��?����7n�p���������-`H2��3�8p�����p���F���#G�|m�4w�\�[g����W���/��"�:-c��_�$��I2BBB��w���F��U��'_�|�����S�z����Ic���)~�q�u���3f�H�.G9#f%6k�,���Y���ef�vb��!-�(����-Zd����X����1y�d��KM|3��������5J��a���SF�F����Z�j��l�aR����0�n��y3�mN��>pB��������6l���u�h��8w�\:��9�o�g��F�����P��\�@��I��K����>�����I������O�})!����������2n��}����������q��)�����7J�.m��b��9�GM	�-e�7����u�G�����z�q���N�<J�,i�������r��Zb��,����FOOO����O�:	s��?���9���g��1�2���g���.]���K�(a���/)���=�~W-�Z�J��y��}F�*U����I#""�f#F�p�=����;������7n���Q�����AF���5����>����t���!#������c���f����]v��V�����WJc)!����v�p�x�q����{�����9�/^�b{���c|���F\\�C���f��d����7�|�����{��;/^�[���u,�������_|����J�S��y�����:t�~~~���+�~qND|Cj1��3�Y��>Yb��}������7�1s��t\�s�z���d��+j����;w��,Y��;w������Q�2e��];=���������M�6��a���U�6m�l���[����\���
ZP�j��v�Zm��E����u��-���Ge��U�F�����/gE:z��~��7���_��g��?�k��)w��*Q�������{L={�T�\�y@����O��kW���


���Gu����sG���S���u����c�����G�����5jh��]�={�/^����������/����>u��I�<���-j��/��B�V����u��q�?^�r�R�%��qcu��]=�����RlS����;wnm��A�����s�t��M+VL�+WV�.]���l��T�����z����m�����3w�x��bccU�P!U�ZU�[���!CT�L��{����������R�Ji��M�;w�����={�������U�*U��gO
2D^^^6������m���������0�.�j���y������Sv�p��-[j���Z�f����o���O'O���7���-��WO�{�V�.]\�\ ]23�U�ZU�V���-[�e��������t�����T�H��UK���W���U�@']����n��i��YZ�n�������/K�_Y�f���������U�H�Lo_z���a��I�����l����w���s�p��n����*00P�7V��}����X�-�o�>}��7Z�t�>��/�`���V��~�a=�����/_^]� �Y_�-�y�f�[�N��m���u��)��yS^^^*T���T��&M����W�j�����?h������?�k�.������K���U���U�T)��][�;w�#�<"�L�R��6m�z�����m��]������?���(P@�*UR�V�4d��l�c.8s���8������?��-[�h���:q��"##u��e���G��SPP�:w���={�����M��Z�j


��3�x�b<xP�.]R�"Et����O�>�������m���+��^�z��e�v���3g�(22R7n�P�T�ti5l�P=z�P�v��S���z�-�n�Z������[u��!EDD(::Z���S�����iS
<Xu��qus�l)'�Sfe�7��f��e�N��6)i������+���h��=:{���^��"E��|������ �����8���>�����S3f���5kt��)��sG��S�&M4`�u��)���z�j���_��y�<�.(22R��g![�h�A�)   ���l;v��o����7*44T����K��������z������,___W7�'9{\rn>KV�|�r�]�V����v���#G����2�����k��C��T�R�n���	3R��v����u�j��


rus�i����~����(�69�
@NE|�S��T��f��T���T�79�
@NE|�S��D��;�����B:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���r��p���	�Taaa��orb���� �"����or*�Z���@NC@NE|�S��T�79�
@N����f��� ��?��U������n
8����bcc]�p*b���� �"����or�<y����*[�����4`�@NF@NE|�S��T�79�
@N���o�s��������n8���������f�S��T�79�
@NE|�S)R���l��o9}p9�
@NE|�S��T�79�+��I@H��]�@�@:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]�?���jJ��IEND�B`�
fk_array_perfomance_figure.pngimage/png; name=fk_array_perfomance_figure.pngDownload
�PNG


IHDR������9tEXtSoftwareMatplotlib version3.3.4, https://matplotlib.org/T��	pHYsaa�?�iIDATx���ex����_��E�;
�����)��-5�x����B!@�/�V<H"��h�)�3+YI��s]����s�����Y����a��<_Hh@H��/��h@��t�$��� �t��h@H��/��h@��t�$��� �t��h@H��/��h@��t�$��� �t��h@H��/��h@��t�$��� �t��h@H��/��h@��t�$���p���G���g�V�hQ_��{@rr����}�������*W��"E�(k������y��={v_�
|����}}]@ll��N��O?�T��u9p��01{�l<x�r���zJaaa^�����w�c����w��K�{
��L�>]����i
[�nU�*U|Z���h��:v���X�F��������~��)11�r��_~Y����GkA���C�*&&�r����k��a�)
H��=�b���8��������)S&���[���W�2eT�bE��WO�*U����*�;�]�V-Z�Ptt��K���c�T�D��	P�����0���W%J�P��eU�fM��QC���n����t�nL�8QO<�����-�{��������KU!�Z�`���sI�6m
�@*������X��������g�V�Xq+�;wnu��Y���W���}X)n�x���v�J�9@�d����R�'))I7n���k�t��9���[+W����1�Z�h�=z�c��
�gt����p�?�PC��l>������N�9���_;���;�e�W���?�/��R5j�P�f��u�V_�t�{��t��I���y�q����x-^�X��uS�b�4y�d��p/��y#F���/�h�M@@��O��'�|�KU!-;p��������6m���	����j������nYi�;w�����k

R������?�������Sbb�����X9 =9y���z�����c�.�T�t�f����{Nc����.C�Z�`���������9�P���xU�S��������U�V����u9���S���wf��I+V����3��uk,XP3f�r��{����U�Z5m������s4������<z�������INN��A���'�Xn�)S&-^�X:t�NaH����5s�L��s��%-^��C�����9�o���G}T���n�V~��w���#T�~}/V�t��E5k�L�u)�
�@*����+11�����+��a"*Z����y;z����nILLT��=5u�T���f��_�U-Z��ReH~��7�:u���9�j:��1��s����;wN�w����35p�@�����1�/_��_~���7����7��������^���9��{���n����g�j��=Z�`���y�,Y��1�����}{%$$x�����^��t������}���7o��vaaaZ�r%���i_��i,O�<���~�M�O��DI���s�\�r����&O�������>P�L�����O>��M��P):�+W����,Y���{����'O�-[V�;w��~�}����T�������]�����P)�
� �����#�<��~��r�
h��Uz���T��K�.i������>�H�s��KJJ��3<U�����^��
��|����_|�K�����;gst�Z�������[k��-������?�����x�2R�@�p��e=��CZ�b��v����5kT�|y/U��$<<\���6cY�fU�N�,�U�O�����T���|�r���Yn�j�*����^���u��e�X��Y�W���9sf��5K��5�����K�7o��� u��z���S�&M�~�z����+�5k��x��^����i�Lc�;wVpp�z��m�������x�4nP�H��5��v���^���v���X���X	�^�9s�(s����}��w^����t���<yR
6��m�,��Z��V�^��z�0�;;v���-[L�7�k���r���ng����Z�l����[n�d�/Us�����u	�{\�<y����[n�f�%%%y�"R�@�u��!5h�@������^�zZ�r�����T������4V�H5l�����VA_�`�bcc�Z�6l�e|����t��w�>��G�xtt������jH=}]��o���Z�j���_������z��bcc���3+o��*^��*W��
�A���)��K����KZ�l�"##�o�>>|XW�\Qtt�2d���9s�X�b5j�m���2C��mSdd�6m��C����c�v��bbb���3+_�|*^���V��
�Q�F��!�q��u�V-]�T�����}�t���[�y��YU�P!U�PAu��Q�6mT�@_�����h���/������;o#qqq��)�r�������F�j���4h ����{��5k�����r������~��{JRR�6n����Hm��E���'���Xe��A�3gV��U�xqU�^]
6T��u��oO�8��S����z�)�4��]�V�����Xpp�^y����.			�3g�i�W�^������������k�k����o�U�>}<RkJ�>}Z��������G����k���VHH�r���%J��O>�\��Y�ah��-�����c����_g��Qtt�n���,Y��`���Y��&N���.\�����g����W{������u��U]�zU7n�PHH�BCCU�@.\X�+WV��5��qc���\�vM}��i�W�^*Y����3�{�n-X��f���O/���BBB<^Gj��I����<��^��v�J���M����������;w���#�������x���(K�,*\��J�,�:u��I�&*_�|������w��_���[�o�>�>}Z����~��BCC�/_>�(QB�-�u�N��������;v����:{��bbb����L�2)k��*Z��J�*�:u��q��*]���K����f.\��%K�(22R�w�����u��U%$$({����'��U������S�N��%K����m�~��gm��U������t��(G�*Q��j����~X
6�����_��
6�������{�g��:uJW�^��k���3*$$D����}���
*�Z�jj��������z�������W��_������~]�|Y111��1�r����E��r��j���Z�l�*��p��"##�a����[�����w�}9k��*V����+�����^�zn=7�����r����#����L�9t��*V������������Wk�����o��9�.(&&F�����9����r���^�zj����������v��6m�!���r�J_�h��k���>���X���c1�����z�26m����F�i:���#m�g���F��m
���i�\����c�K/�d.\���.G������������8r����E�q�xIII��i��J�*9����-[�4V�Ze3��!C���3����=��Z]yM8p�4h����+T�������_w�V_+R���ck���C96o�l����}���oo���{���_�e<���F�<y\:~���g�����S�RT��7�|��������[k���i
��w�J
���w�Y��}���u�&M��n��qc����o_�>���������h�����W�����r����7�4
*����|����?����������������)�6:t�`,[�����y��L�{��'�6��>}���P�N����s����(_����3g�LQ�_��������k�B�
�'�|b������?���#G���}tt�1~�x�t���o����n�jv�����=z�3gvi���+�����~2���Z]������}6m�dt���p����9���SO�.]r�yIHH0&O�l�-[���U�T)#<<���\�~�zc��QF��
�2������3���kL�>�����H�+W�4������K���c�>'

5�y�����y,V�_�nL�2�h���S��;o��w�1p�@c���Frr�GjM��x�/�	���k9�_|��1
#���k��Y~N�0�M����)SLk		1�\�b7�����)>>��:u���aC��I����&M����[�[�5kf:��+R���'��|<aaanyy��5�|<�|�����)���������h��z����k�.��DGGk����Q����i�#G���R�;vL�[�V�f��x�b%''{d�s�����S�%��������.������I�T�lY
4H�.]rs���m�6=������v����}
����K��Q#���C/^�-�������w>�n���#F�|���<y���������'5|�pU�\Y6l�P��Wdd�|�A]�p�r���{��o����o�V�T�bE}��:w��Ky��9�?�P���+��������'((H0�O�2������o�V�^m<x��kp�i����j��is�[��W�Z�������s������;*""��cO�<Y�K�������'O�%grr�V�X�A�)_�|j���>��S����t5kG��������C=����k���)�u�����9s�������/��o�1���������o��9df����V��Z�h�o�������_i��a*Z���O��Rw���T�lY=��3�����p��e���]������R��������S��E5a�����'�s�'�xB5k����~���$����?�\e����?���}��_����k��A��w�S�8p@=z�P����~�k�.���k*^��j���Q�Fi����q���9
����k��_?�)SF���wc���7o���)�7�x��s���h�?^������ZBB����"E�h���Z�r�S��;�8qBS�LQ�f�T�ti}���n���|'W�\����h�����uhh�:t�`�9s�Ky�5c��X����5kV������dM�8Q���c�=���W�t.�����+W�C��R����[���|�A���+R�[�~��w�������N�v����gm�*U������`
�v��I��WO�>��]
�)��O?�b���<y��r:j����Z���,Y��qf����e�����Vbb�[r&''k��)�P��"##���[���k��][��oOq��s��Z�jN7�x��s���Q#�;6������W��������������~S�-t��U���q��1C���?T����?������z���T�J���������������VM��J�R���=:�;�9sFK�.5��5�w��I�2e�3��
�7��7O5k�Lq�������{w
<��MO�W�V��M5e�EEE�5�M���������{/Eyz��a�(c�9�����e��.]�xt���^�Yll�S������_?=�����eKJJ��������n�ZW�\q[^{��������C�^mf���?�\�*U�������������?������3n��O���s��	��SG_}�U�����?��m���&7n�4h��<�$-Y�D
6tyR![���~���������c�����w����	)�����C��{��:�|�r]�rE�����/����l��y�*U������u_�t��A}���n��w�e��9%I�)����}�����]�C��Z�C�9bY�U}�r��!��[WC�������w���W���x�
�'��j@��<n�����o�>���t�Fy���}h@����7�z��Z�~�G����j���z��g��j�/���-Zx�yM������SO�O�>���3z��5w�\��w�>�@�=����������c�_�����O�:���k��8��P����.T�6m�6��������/�����zbbb��cG����[�x����U��V�\��}�)��-[��=9���7,W�4h������3g�6�[�n6c���j���i�3f�|%����+..�����qC�<�������q�-11Q�����q��c�����W/���'�����gO�	����3�3�R���-�Sj��%�U��N�:��1n2C}��������)99Y���O?������W�z��n�h��|��9A��]���/))IC���?�h3>j�(
>�m
������i���o�7o��5k���/{m����k�N'Ntk���_c��uk�����K��W�������A�`o��,Y��x�����4i�����4��U�g��eznV�`A5k����;k����^��6l�����a��7�T�N�\���z���+l��I��]s�6GWPO�J�V����x
����m��7o��g�:u?W�C?��3=��SN��Y[�nU���S�B����D���C_|�����)!!A�{���J�)5}�t���KN���������uk���x��K���ys��xx��
����#����g�V�����,��[o��w��x=���j���WV����V���]Z�n�����o���c�
�-2]�2(((U�Nge��i��V�ZY����wo���c�R��{W���/z���}2v�~�|��=a��	9r����:N###�g��s[��i�elZ�(�.^�h		q(��}���aC���_�(��X�7��9�k�����g{to3Cti�g�kN�:�f��y�5����k�������'��799Y={��+�'�|���G�u,I��q�>����������c��nk��rsB�%K�x$��Q���5j��|�I��Z�	|g�z�;'��={����}���oym3{�l�N�e����W/�����9~���j���W&�����K�WBP�F�l��z�j�krt����W��9���dZc``��c�^���Y����g��U+������O>�D�7o����������x;vL�/���?�l�������_z�	 ..N={�TLL�]�L�2�m���<y�6o�����+..N111:~���.]���^
�;����`����.]ZO?��������w����JHH����u��1�^�Z#F��<`�'))I}�����[������lw���`���K�����}�t��u%''+66V{��Uxx�z��������{��!=����(���}�j���w�=k�������N���[������������g�M�>];vT@@�e�s�����_�T�>5a��������~~~��������z����D�k���dW�ZU/���-Z�}������JLLTtt�>�e����_T�2e,�����C�:~��S��j��t����8��5��|��j�k��������q=a����+cZ5aHR�f��?~��Us��\�pA���SRR�]�����[�n�3g��l��S�N����^��-���?�9r�4��3LW\,[��^|�E-[�L{����K�������(m��E�&MR��-S�\R�D	u��E�����.]�]�v����v�����u��U;vL���������Ce���n��c�j���.�t����n���qO��n��F��R��G�MK��9c��;���N���>���O[n��zHc�����+u��!EEE)99Y�.]��}���7�h���v�=x����a:"""�t��"E���'��O?��]�v����JHH�����k�.��5K�:uR``��>�l���u����9� >v�X����e���\�/��c����$]�rE���>���c��.�U�Vv�S����O=����������{L.����u��E������Z�z�^y�*T�2��k��������������/����������w�}W������Gu��u]�|Y�����3�����}}�����D����s�U�Vz�������j��m:r�������X�:uJ[�n����5p�@��onZ�b�G�����G�|����|�u�����#������Wu��A����2d������d=���n{O{���~^J�,�^xA.��={n�/������������p�B���kj���2e���o�;��!))����+V,Ec��}m5�����]�4����:dOM�-[�L]�v����%Ku��E������u��qEGG+11Qg����;4q�Du��A3f���p�B���Z%��&r[V�\��v��]��M�\c��-�
���WW�,Y\��I��6m�!���r�J_�h�a$''M�4��U�Q�rec��5��v���������hDFF�\���#Msg�����O<��q��E������O�6���Gv��
K�,1���~\K�,1*U�d��t��������_G�1�[�H�r�a\�~�(]����d�����g�y�����6�-Z�t�i�����^SE���o3f4^|�E#**���;v�0j��m�����{��u�~o��|��5j���m��}�����c��^������[S�6m~�3�HJJ2f��m+V�2o�F��zO0�3f�i��+:���:|�����g:�o����1=i�����%G�F\\��/���i������+n��o��N}�o����P�+W�.\��z
��t����%K~l����\�����������w;<��;w�=z�l���/n����4���3M��������3�]�f�����9i�$���V� ���#G�u��/Z��I2V�^m�#..��Q��e�2O?��q��!�k�v��1v�X�}(�1b��������q\�@c���F�;�
����o��.?6[~��w������4^}�U���k�\�f�q���[��d<���)��W��V�������o�3g6����uHtt�1l�0�������k���
�+V�~}c���=���W����G�?gf�<f�z�)#""�HJJr:����������;((�����RT����w>��������Cc����?w���y�;?�-Zd��]��Z|��N����6����G}�4$�����w���s�M�6Y����g\�z���im_[}/��c�9��buMV�F
�ry�{-�0��9r��|����c���������{��1���v��~��w����}�i���+;���q��A���������8����i�W_}����G:�i�}��)vH��O���"""l6L��V�|y���.�n�,|�-g������]��;v�����[��?���&������=zX>��_���������c-�

2���]�={�l�����'���*T���s��c���>��e���z��������_��s�!C�����Z�K�.��'K�,����]�e4m��r�)S�8������`l���[�r�����k�c+V���6_���5�e�f�x��P�;vX���'��vG�n��-�p��#W��������l�k����v�Z����{��&���������_7r��i�w���n{�a�'O6+44��[o�v��7�|c��kob�W^y����J�r�A���;wZ~��<��U�;o-Z���k�[
�qqqF��%-c��9��X�������w������W����Y�{+\���o�>���w~�����o����c=z�f#��[ppp�'��d������s]j:�%**���������k��a��~�-c������]��{fJ'N:{��f��	&�h��:d4�(]����M��x���	�}�Y��\m�5�������+�\��es����_��~���?w*����JJJ2���k�\�l���Im�?�b��D�N}�'''�s�������8���5N�4�f>��$�4i���a=�����|�r�rp���������+�����G��OW������Q#-[�L�2e2�f������/������0�X�B�j�rK>�04p�@%$$��g��QK�.���?/???����1�����!C��n3n�8�?����v��E�����q???����{��.�����f������n�J���u�T�bE���)S&�����/��6���WRRRJJ�9�04l�0������e��I�/V��R����5x�`�x��9�n�:�����1�g���K���G1�f��Q���w8g�����M��������JRR��M�f8p`�9��w����+����{;�����W���M�V����(QB�V�R�R��>����5u�Te����y�+��[�j��%�S�����+WN������+g���q�\���}����y�����{w����u��h�������K+g����;v��?4�W�^]����U��r�+V��
T�pa�����9����h���-Z��_3�|��<h��%�~��w��_�������={��u�f��/����8��;�S���+VL���*]����5j�4h`�g�}v��>���3����)�����4�o�������h�"m��]��u���{~��={v��;W]�v5���o����'�2����-]�T]�tq������~�a���]��s�NW��s�=�.���d��+VX^G;�x���4i���[����� u9s��&M�d����iu_w����{�+W�h�����ii����|���X�\����&L���k�������Yy��qy�.]�h���


�?t���L��p>???5i��f�0�\�����w�7��Y�v���@7n�Pdd��Xpp�����T>���M&L���v�*U4y��5V�^]'N����>p��Y_��e������;m���f���_s��1��������5k������m���/��B111����~Z�:uJ�]�t��O?����1cF}��7*T���9�f�����4~��y�_���������A���O?��.k�����_��E/U��k����6c!!!����T�B���Y�f�X�b6�'O�������9t�P�����u��5���Y�d�N�>m3�����eo�j/Q��S?l����il�����w�S��C``������UO�Q�����+�LHP�HU�R��y�&�����L�n�����{�Uc���+u��!���i����"�4h� �������oZ�f��6V�H�������D���%K���V�,Y\����y���o�1m*���ou����cK���5w�\�&�J-�_���?��r�)S���=���_��M�<G8s��S
c���{�����������s9�G}d����m��v����^py��z���r��.����m�zd���k��Y��$'';}����?�X�7NQ��>����R�����m���sM�������T�n]��[�����3H=��{w]�~�t����'��SZ��9r�P��mM�3g�t�>+V�Z�n��1�	������t��A_~��[>6lh���{�����d��=����1�fr+fM�P�%��{||������X�n��qY�N;���h@R��M�*00����M�:4�a����M�~~~���/���^�^���Q#�����S���.]�X��
��0@;vt�X2d��)SL�:m�4������l��X�<y\Z���1c��h�)w;v�[&4����r��e��4��EFFj��������i���.�D����x�y���kn]i9G��M�����C�����O�Axx�S��X���uk����-�x���G-W|����S�z�������/VA>|��V���q���4e�����m�����>k���]�[�L����ju�V�RE5j�p�8i����:��V���e��,Yb�6m�r���R}���Y�t��0�~��j��	iz�sI�7o���;go�����9�Wpp�]+u����;���{�/����k�(G�5T�|y�������*����,��?�Lq~O	

�l�w���Q�Z�����Q%J��\����w�yG�a���
���!��w�Ctt�z�������^x������1���6[�Z�g"�3g�8]�-g�������R�4a��={�f,,,LS�Nu����a�T�Z5��������~s8�;�w��e��*44T5k�4}�uv�+V����K�������d%%%y���5k�������^�z�u���>���io��n�&???���;n��v�Z����f,[�lz����:�$����M��N�Rdd���t��5kt��)������-[6���-[6�5�-�\�+W.=��Sn����;��Sss�=V�!�T�@�Z�J<���*��w�}������+VL�?����l�����6l��c�����������mh����S���_L�imU�3fX��]�0o��j���i|��Y^m���9��x�
���_��wW�J�|2��X5�Y5D�$����MW�v����-W�Mk������G��77}���~�����&L0�u���#�<����+���?���5l���I4��5k�i,00����6i��������N��_���h5�������m
���y��c����:q�D�����~X����i����=6���#���G��1W�s��=�~��4^�L�\����|�0�����^��,X`�m�r���+��4NZ��-Z�P��ym����4g��j�Sxx���o���S�����Mco����g���1_{�5��3�~�J��}��g3v��A�>����6l���@��pg����i@��tw����-���
s�x����5kf_�b�����:f�F�T�xq���j������V�~���LcV+Iy��J|����������������Q�VHH���5h��4�o�>����������~rhLw�:~�|�I���`s������2d�`3���j���N����_m�@]�pa�l�2E���0�}^�n]���X5�����Z�t��9]��sg��\l��N+�+�r����m�������oo��s����`��������6c�2eR��=S�?������q�T�fM���~~~z���M�����7o�i��HR�����U+���G�j���n/=�/^��U�L�?����)��1�n�����:���}��[7����%W��5-����z����2Vhh�����m��2��<��#6�����;vxd�:u���G�����p��.]��T�(!!�4��/���N|g�]�����������h�"���+*S��y���aaa�����)S&��N��:00���q���N��J�=z(((�-����u�L��r������{d�v��)g��6c���.�ot�mo�|������������u��U��������m��d����#����.��-3��/_�#+[5�%''k���n�o��n�'IK�,1�u��������A�����w��5�V?dm����f�����f����[�5���V�t��J���w�X��az��'t��5������1???u���cc7n��4����;wnu���4��U����5u�T���L��R���9r�4��O���k���}����v)�+<�9���E��a��>��������t��A�rY6���8�w�.]�([�l)��$%%������o�����!C��p��>|�C�?����S��i|�����S�J�R�j�\��w~fX��)�:u���|��b�
%''����?\U�vm�,Y�4�|�r�����\�sg�M�qS�j�T�H��w��Q���	V�f�-����s
(�\�r��������%{��n��,%���=�����@�n9s�T�%��];���{:p����%K�����S4iaz��V�;v�������w��;wZN�����;���O���;z�I���O�5�;}��:�p.w4�'%%i���6c7�s����+�����@��f��IE4h���@��p���K ^q��E����4����o��re)w�(����v���S�l����,�R*G�*[�����;d����r��u�U���m��q}�Q���j�����K���\��7n�u��b���j���W��#""L��x@�
�������*����9t�P�Xxx�bcc��)�31��c�l�,W�K���3f��.]���7$$��i����\����� �~�Xi����U��"��)��G<��1��_uy���{�Z�/
<�������fAAA
S��e��W/M�4���t6l��>��r��C=uns��q��U��U����3�-��X���j���G��Z1v��]�|������{n������x������cIR�%Lc����+��l�R�^=�����9w���yn��a�)�s<�������������$�7g���������7���Jz���*UR�*UL�)]�j�����_U�VMQ~wI�~V
�+V�p(��-[l�������}��f�;9��n�����4����U������q3e�d��V�Ffge��=E+Y��q�F�X�
<��7o^��z��N�>��������r�IO����u�)5j�P@@�[sf��A����qo��.aaavW[�v�Z�j��J��`u��Z�������;wn�����;�4��aC�f�+W�h���N�(Y����eK�6�����W������[�n�9r���j������3����*_��2f���qly��|2�'X����o��-ZT-Z��KNN���S]�;e��X��}6)��x����F�i��%��!��v���0;������]��qlu�P�jU�����j�5���T�j_/^\aaan��������x��5�6�$e���4���=��d&C��n��-�i�������K����qwO<�|g�z����[�n��y��M���k)}�k�U��������T���������o��{Z9�+T��J�*e3v��i�r�5�7i�����Y�����V���x
�@*�r�J���[DD������/��'�{�r���]��j�����
*�}�;Y5�����i���7�e��Qe�����e���z�e�<�7k������8���i*T���sh�]dd�Z�j������Z��7n����N�2d�i������s��x�b�xZ[Uy����+����;E�6l�"E����M�������j��a����O����������]��V�Z*^���g������������m��1�cDEE��F������v�������H4��|�???
6L��-Shh����aX6!y�3�[�{��8v��O>F{��������������?~������W�j���z��w��_?5l�Pe��UXX�2e����@�>����R��dK����N�
w]�X�'KR�Z���i���C��w�A``����3f��=5=��=z�^��9s�rup+��-3�4#  @={�t)�����K���6c�3g���sw�����n�2��+�7j�����v���s�,��t�����9s��������t�9y��i�p����3��������s�t��
����I:p��i����R``�Go�~����g��u��u���Z�J��������@���<%�+���Z	��G�iA��n�5�f�=��#����`u����+?~7m�d:�+�o��}M_;���s��m���JHH�+P��y��k�%��\�r�U�V)�����^�z���o�n������K�c�<yRc��Q�*UT�`Au��Qo���,X��7���#�r�����\^!��R:	H���U�P!���'Oj���N�[�p�.\�`3�����
h��u7n�C
�g���lN�S��G?/�6�y����w���7=&$�N��;wn,X�4~��	����}��s_��^w�g5�;'y���������iS���K=��^}�U��1Ck����}�t��E]�~��U���T�����G���������Pg��A�����_|QU�Vu�9zz��y����?l�9s�S�n��8�E���/�Ky��j_���(((����M�6��;�/�l�/����n���?���f�����Y��z��wmg�V�\i9NDD����m��\i�w���6f+I�l�p�F,��*Z����WY5�����$������_��������<��pS���=����IrK�/u��Ys����2��Z�J�[��h���a���?~��r�f��]]�v5�;�
��)SLc��S�}��i��u��n���e��>}�X�=�
�'>�R��'N���T�hQ�9��J�����h����qg�S��;u������$W�\<x���[���W;�:����$�^X}f��|���!�b�����5V�49�W�*[�l�v<w�c���j���*T���+Vxe���~6����s�&t�����Q����A��{�n5h�@���K�s��}��o_���E�,'������Z�h�K�y�������%���U�U��$�_���w2��w��	 ����5�[��n��;���m���Lc�np������n�
V�������m��k���Rnj��K��=����r�J�i��#������U_s��:t�il��Y7(EDD��������{���|�������kwT���-�Z���u��
��e��}5��i�T�BM�6��d�����*00�fl��%O�s���f�A��T_Z���������Ke��U�&M4d�}��g��e���;��'�v��N��W��|��.V�4�o�E�uM#�n_y��7-�ko��A�+W��#t������	�R�s��%��/����+�!�0r�H�ay�����3g�i�&M�2E]�tQ�L�,�����C�vWi�'���6m�(g����,X�T�o�����>{��j����5zJz��aaa����m�.]��m������Z�����Y����j��<�t��jJ�t���
w�(:$$�-y����3���*F����RzX��^��[7��9�ns��+��m[�7���cWr���U���T�b3v��%}��w��Z����R��E]��7���4k�,�x�2eT�fM��g��~��E-^��mc���s�m��_~Y��k��2�',XP�[��KLL��i��3u�T����e��a��.���8�lvsU���X]�pA{����+4a�=��S�Z����]�/�������S_������V|y]��F���������^�7���}]�=��xJm
���3�W�xRHH���������������u��i=���


2�_\\�:v�����<vz��2dP�n�L�3g�t*��3Lc]�vUpp�S�<)��K�&n��o��q��z��������c�l��������{m�
(��e����sh@p�Y3g��������j�)��VR�=zh���v��/_�v����xK����*��'O�{���(�F�������K-W�����[�����2d�`w��w{��������%W@@������-cX�:N��oJJJ�|-
8���p��������n��uMj����V�X������}������)%�h�GV�M���z�����l����?��?�l9ITT�:w������I���o������H9r��<G�Qdd�K��Bz��f
��yzll�6l�`3f���:u����5���9�:�?Snc�TLL�G��������h�[��McW�^�����������M�f�X������];�+�:*=�={�T�,Yl�"""t������5���y��U��mS\�7�k�1b��v��7�e�����j��"##5b���-^��z���?�P?���6n��c�����K�q���Pbb����qR�y��*^�������-1$i��%:}���X�R]OZ��?3��k���5�����x��z�����aaaj���F����p���:x����?���8%''+))����������x����b%���z4k�LK�,�|�l��Eo���K�����Y���
��a8�
��Y�L'X*]��i�����}��aC��EFF��ta��56�^�lY(P�t,�fw��1��t�t������R,88�4���a��|-$$�4���/�0�������'�?�V���k	�S�>}4u�T�?����_��}{�4�[����W_���m�����-44T={�4�O�2���V������ns_jr��E�������l�r��JRR�����az������l�Mpp��{�9���G����3�����]�v�Q��
.�9r8����]���4x�`���qh/��}{����\�f�3c��=>�����w���s��|M��3Fg�����C������s���?h����������%J(,,L3f����eo|6�%V���/_�^!�;���~������-�y����w�^�s��}m5���Y��au���O�k�4�}�7o^������O��YU�zu�����_�����5�[��.�7��\����i@R'��&{���1O7j\�r�2nU��e���4v��%/V�z����4���S[���_?M�2�n��/����;:������P�����;d������m�d&I�����]�l����4p�@���-�g�N�k��O������K�j��m��%Jh�������MWht��?�n�����
�.��l�N�:�_~��4��A��R�������?3�{�
���I��4p^TT�&M�d

���s��w��Q�Fv�q�/W�\���vM�w���A���U+�xBB���t����{��e:Y��C���X���?���C�l������w���nV�2��[5s�j7k��^�F
e������>}Z{����o���c�l�)^���)b9���m���o;u��G������gY���w�}��������_Pbb�G�MLL��<����M�<�n���%K��S�5)_�|���~�V�RE�j��;w��/^l3f��r�&MT�dI���-��M�u	6���W����ui������e����U�re�����?O�<j������74c������ZIII6c%J�`�@�:����gFzb�����5
�����(..�4>k�,u���m��>s�B�
��N�<��J��;��i��	


5����/Z�l�S9���.T�����V����M�4Q���]��S����7��j��j��������u�������W�&M,�	T��
m��lj�Z���J�<�t���q����=����5��'O��AS��E������o����.]�4��{�zd�={�(>>�#��=�=��&N�h�	��T�.]LW�vDz?~�j��b��k�4�|����U��n�������S��9>�1C��/7����[���+�V����������:u��}��Uvq���[>���3#�VXX�i|��m�������&2@�b����S'�k����y��)-(V��i�����+��Bz��H����>����������N�L���o���1�	9����`����������?�����3���_�^������������Z��r��aw,���;����T�-���B�
�qO6kX��W��Y���e��{�!�|����7��j�����k�5h� }���v�(-Z��]����nu��]�����I��]M�l�2=z������+&&���aaa�����K�����=�|]�~��e�z��3m�

R�=�:�a���?���J���U�lY��}��i�����m��e�MuAAA�����k�?M�e��1����������W�4R����s6o�l�DC��M���3-�:���
6x���� �>|����c��q�~��G����}��}{e���f����Z�x������u��e����Pu���]%������x��:u���%$$h��5��}g��M��Jn�<~gc;
�@�E:�������u��yd����[6kT�T�#��K��5Mcqqq��q��IBBB,�k����Z�h�G��7���?���v?����u����D���:~�=�'N8�35			Q�>}l���ke[�-���Oe�����y��7n�Z�����m��%�5\�zU�}��'~�r��!�X���Z��{���������!C����<.���6m�(o��n������s������'�������^o!�HHH�<Ol��������?��3-�P�����M���}��R���P����5��|�y_g��I�;w6���9���KR���9s���	y��U���M���=�VM��m:7kw�)�R�J
���QQQ�&���k���;g��*T�������6�r�R���M��������-2]qW�4h��q��N�:�?����_�XM�a����~�IW�^u�xW�\�O?������'�x��&����^��ww�	���]���:t�il��iJJJ�$m���r��A���6OZ�h�eq�^��RG����;wn�xj_�=5�t��i�@�no���n�iO��}b3����***J�t��9�I\�����f����>�x�X��~�����9���'+VT���=2.���������_Y�fu{C��;L���UAAAj���i|��9�~���
��w�����-�)�l���$z�}_����4������>u��9��l�/5�:�[�|��k������g�j���w�3d���w�~~~����ln7[e�^���twy���Lc;w������>����Mc��G����j���i|��	�
��U�6mLcqqq�3g�[���j���'�|R��������~��={:�#�����0��7N�a8�/5*[��5jd3v��)������WUn�����-���<������_��u�J�������i|���:z��WjI����3e������_|������#���$..����������`s��E�Z��!�Z�n���@�����j`�i����7�I�����6o���{���9>�o~6I�g�}������5����-'��&�3H�2f��W^y�r���G;�+���
�X�b6c���wss��1�$�H�"��H����3�?~\�~����q��5k*44�fl��m���2]��v��N}��M�w���l������c����O?��������r5�|0M�h�j���5i�$/V�:4h�@4��5JW�\q�XW�\��Q������O?�O>���v,P�^��jB�:~w����:�+��Z}�������l�Ik�*�>}Z����i�I�&Y9�L��=Mc�ah��^�%-��#�i����.Y�D���wkNG�;N
���)SL�y���,n�r9r��lv�6m���9���`&g���MmK�,����:��q�,������X}6]�p��]�p�#�&�]�tQ��M�}�Q�����R7w������������c���f��������[~~~n��Z�h��y����y�/V�AAA���'''k����+�;�n6�hdd��_��U�V���N��{������__E�5�O�>]7nt�x�<���jH��wS���[[>oc�������WP*����!C�����;�#F�e�7�x��M�H}�}�Y�V��7o�������d������t0Iz���u��%��L�:t����s������7n���9r�P�N�<Y����9�r�^�zy��N�:*Q��i|���nmTKo�^���u�V��g���h���n�����k�R�J6c;w��{�����h���,�z���Lc���z���9�S���{��4l�0��i9�K��%U�n]�����9�BBBl��u�V����3�(..�m�����0�������_����;��������}��O���m��i��]��9��m�e��.C����m������R��p��U��V&���-�J��}��w��cbb���_�~Q�j�41)�����.~~~z��gL��a����rK������|�r�x����s���
���z��7L�QQQj���bbb�X��=����9�i���>���~��1,X��?�<E9�v<��s����n��}�:���5kV=��s��#G��[�nN����d��A����KJJ���#M���wo{�4��>}�i,88X:t�^1�����i����Z�r��I[l5-�e���3�y��oo�Z�����G�\�������)I.���c�X�t���r��%K�h��E)����Hrk�;R���y���e�Y�fi���n��^������7�	������d��R�A��e�����/������o��~�j��U�n]�*U���y���>k����/�6l�VV��,��#G��{���U�V-����{��T���MC��\mt��Mz��'S4����5h� �m^z�%e��!E�xS�~�T�J����;��uk�?�c5$%%i���v�[o��+��*b�a�G��+FZ�3g�z���J���^x����7��=[���w�	���^�l6X�l�z����&���8�?^����G�2�t�:�����~��?��C���3��i�FY�f�bE�����e|��i^�$���?���-k��W�����1������:E9��W�^


�KO�iZ���[6;�5���RR���3>|�,X��q����`��������O�w�vy�04h� m���t�������sy�^V
r�}���>g,]��rb��B�
�+)'''�]�v��a����t��S���A���_~�rGWAO���o������p��q��{���6�r���#L���������&�2�m�6�o�^��Oq�*U�(g��6cf���
*((����6m��8V��]4��)S�Lv�;'M��!C�����v�Z5m�T��]3��B�
z������K����1c�2f�h�MDD�x��[���c_�pA|���/��}��|��z��T�ti�xBB�z����{Lg��u(��3g��������`�b�RT/���^zI������f�����mB

���SM��V�U������t�VN�8�7�xC����>���O�5�M���C=��}�����+z�O�����W//Ur�2e��z�������^W�^�bEiK�-Lc;w�T����l�N			z���5r�����6Y�dQ�=��O�B����{�"�R�zu���K�q�0��K/�c���r��[���y������E�j��q���uk�������\a����j���6m��t���x���_3g������>Rpp�����Y}6�����G��\�=s�L�m��c�A~�����k�r��7n��S��e�#G�h��!�S��S��;��o�����?�i��U��������BBBl�N�>��^zI����xpp��t����<��g��\�=**J?���|�M�I�������Q=���V����t�s'5n������*�����!��s
�{h@`�_�~vW��4i������7:�3&&F#F�P���u��E��5y�d�V���J�*���?�������W����i��k��<����5c��m�V
�K/������-88Xs����?���k-ZT={�Txx�������%''+::Z{����9s��G-ZT��O�+G�^���aC=�6�����z�-��M�6M�
�a���l���J�������~���K�v�r���:q��&L���M��h��z��7=���M�����VF����\
8g��>m��Z=66V����b5i��,'��?�5j�T���?���+���?�+V�xq��tg��(  �C����1cT�n]�m���{)RD������;��X��o��o��
*�F��>}����]�w/��1�&M�d�b��s�T�~}�3��f�u���v���1c��v�Z�R�����iG��-U�`A���={��8�*��]���ys�������|�������K��M�<����4p�@5i�D�V�rz����:tP���5i�$����� usd�Q�F9�+=���Y��}����O?��4����*{����s4{�l����t���d���*S��&N����ZBB�V�X�g�}V�
R��m�|�rWK7�lc����,XPe��qx�Z�j)S�L.���}]�����O���z��t��)��6o��Z�j�Q�F��������%J(44T���:{��v����K�j�������;�{����Jb��O<��G���>0��0���O����T�L5j�H�5R����+W.���S�2e��k�t��e]�|Yg����m��u�Vm��E��P�ZT�^]'N��,����Sxx������d�����O5|�p�m��6�����~�m����V@@�&N�h����{������������3g����U�R�[�o�R��3gN���S3f���Wo��N��u�n��UG�u�!�H�6mT�@�VY��5��v�������o���k�L��;w���&��u�/�`�*���p�J�*�k���7o��6���*[��Z�n�G}T�k�V���5kVEGG����:v���.]���k���6��l�R�j�����=�p,U�ZU5k�th�=��c^�
w


��?��z��i�����]�rEo���>��#��][�5R���U�P�[�|�n}^\�|Y���3�������k��1z���M��q��F��O?�T={�T��-U�R%���W��������C��h��5v�-Z��f������T&88Xo�����!'N�P�-T�Z5���Su��U��%�={v%$$���s:}��"""���?j���6W�-P��>��u����)M{�����������.""B�7V�����}{��[We��U���)S&%&&***J�.]���y�fm��Y�W�Vtt�[j�;��m��!z���LW���u�-Z�G}�n���������w7}���@5�W�H-Y�DM�4QLL��v����C����O
6T�F�T�V-���G9s�T���u���[�2**J�w���-[�e������	qR���\�r�J�*)k��}o u���<y���q����U�V�������K?~}���,�����{O�a��?����}��o�>M�4���N���u��y����",,LK�,���e&c��n�����+))��Jt�'O�������+�&t???��5K����;w�e>�0�}�vm��]���w�|�
���5f������3��<6m�4�x�^��T�m���S��MMWB]�n������
q����~[�����9Irr�/^����4F�b�4}�t}��W���C�u��E�*\��*�-9s���+��E����r��������=�����=�)S�Xnw��%}��g����n�������s����{n��o���:u�6m�d�����?����1���5o�<�	l�����W�:4�������{���7W��p��^7WA6l��6�G�v�]J���Y�f*X�����w��/��7o���<�F�Z�t���i���/[n�E�i��E�)�I���S���M'Z��&M�XN�gO��M��ru�u��2/��\���-[�|��9u?W~�������&N{��������>S�|]N���K/i���nm/Z������.]Z�,W��=�9r�F�aw��'��'��|�


��9s����/E?�N����������>l��Y�H��W�����gO���&�{Y�b���w�yl��y����~S��y=��]�vU����n�����(��Z�f�Z�j��R`���O'N��!C�����5�
�����r��9=���� -Z�H�
�H���@����A����5J���W`���rxsi�3H��������o��������������W�^]��f�����5kn}��9��xJW%w��=S�L�]�v���>4�pH�j��i�&��S�#�3e����'��O>Iw��O=����_�J�*yu������a�U�R%���w����7���_�U��f���1�z�=Z���������+=��������������e�T�hQ7Uh�������>��q�}��m��^���V���:�m����MC=z�H�1���WHH�i|��Y�pj�I�&
W������b����a�J�,������)�z��m�M�|���M/U+��e�O?��O?�T���^788Xy����xi����&L���?�\����a����i����~��G��?~-]�T��wk����k���j���[���~�iEDD�}�x��N���z���,�=z�S9�������G�O�*V��-[�h�������O0s��my-�,G�S�*y��9��~���l��h@��B�
)22R�~��r������<��v�����-gjS�jUm��E'N������^xA�v����3=6�;T�\Y���f���t#����~�a�Z�J�����+�m���(�������r���;V���������=��3v�k�������w�}W�s�vG�6/^\�F���C�4v�X��s��`��������1c��6����)Y�d���>j?}��~��W/V��t��I7nT��eS�+  @�=����_�"E���:��w�������]�~~~z��gt��
4H3f��X�k���	�������|�I���C��7w[���s��/�TDD����
*��?�T��m����G���[S��w/�W�����/�9�#�U�VMo���[r��A�4d���tgVA�)���r���F�m���b�����2g���'j��Mn=��SPP���k�����S��7��r;��^�P!�����X)]i�{�kN����3�<�h��I�6m�v���t���P�k�N�>���W���JS���
<X�=��-Z��3g���~����]��5j�Y�fz���T�n]��j����W�>}��Om��]K�.��
�w�^�;wN�����!��d��B�
�B�
�S��Z�n������=~��i��~H?�z�-%''��w������>����>����2f���_~Y��
��y�4g�EDD(!!�����U�n�[�o�j���:��3gLc��������jq�.�����,Y��|��^���K/��2e���S�J��]����c���5K����������o�0>l�0�����g7mH��=�+%;��8���K����e�����I���[oi���Z�`��n����9s�T�&M��Y35o�<M��k�����y�7�gK�*�_�U6l�����h�"���8��R�J0`�
�L�2y�R�%��g��E��|�r���;Z�b�S������?�a���Y�fw����M?�������`�5J����)S4{���'�-[V-[�T��=��]��>!!!z�����s��n3z�h���lIo��o����i��������j����������wk��I����u����,V���6mzk�s"��*Z���/����n�����M����>���t u�3��u��f��mZ�p�i�_�~*Z����I�={�(""B�����t��1]�zU���
T����7o^/^\�+WV�
��Q#4$���j�����a�v���c������v���_�.???e��EY�fU�,YT�@�-[V���S�r�T�jUe����#U9x��J�*e3�;wn�;w��!��|��"##�i�&���K����S�����+00PY�d�u*T���{��
�Y�u����u�l����'{�"�u�����i�"""�z�j;vL/^��K�$�3�B�\�T�ti�/_^>��5j���Wn�G��;w��X�f��l�2/WW?~\���6m��}�����c:{��bcc����[���eS���o��U�PA*T�����F����EFFj��:|����=���%&&*S�L��5��)���K�v��j����d"���b�
�Z�J�w���K�t��E��qC�3gV�l�T�D	�-[V���W��������#G�h��U��a������G����K����a


U�,Y�-[6�,YR���S�����A�	<������e��Z�~�6o��C������x��bcc������3���9s�T���U�\9�-[V�*UJS�H�h@�+�f�2]U�q��Z�r��+R�={�X��q�F��Q���STT�
(���8���s��^�
��"��|�������k{� ��Z��r��4����Y�L��s���G}���{
��t���#Z�x�i�Q�F^�H����4c�������X
3'N4����O2d�b5�^B: �x��w���l3�5kV5n������y�t��%����3�W�^^���"""�{�n�1???&�E: ]X�p�&M�do�������X��$''����3�w��]Y�f�bEly���McM�6U��%�X
������������m����o���O>�����d��9��w�i��g��b5lY�z��-[f6l����$�^3n�8=������?��s����W��._�l��C=�5j�mL -�x��^|�E���?��+z�"w����O<a�P��Z�j������t��$''k����_��j���������S.����P��-��G����n�q���Z2�.DEE��G���gM�y��7�X�;]�~]={��_�e��k��&???/V�E��.po��a�6l��a���F��U���T��J�*)O�<��=��d����8]�tI�.]�_��5k�(""B�w�vh�#F�B�
~4@����_~��������n��M��S�������8=zT��/���~���n[�reu������{
��2C7n������C�z�����Hm���1c����aJNNv��3f�G}����k���0`�mKJJr�����g�s�4���v��i���4�������T#��=Z�J�rsE����t���j����+�����N���1b����;e������Z�6m���/���W���?���e�{+���p����9�bbb<��A�7n��U����@z��m[��7O���W�V�k��O?����_��!���5=z���s���7��[�n��?�sf��M={�Tdd�V�^M�9`G���5y�d-Z���V ���#��y�EFF*W�\�.�cX�U�2eR�N���S'I��#G�v�Z���[G����G���+&&F����~������l���P�B*Z���V���5k�n��


���R�2({��*X��j����zHm����R��� e��M���S�����Iu���	"����a�������@�@:@
�����D:�_4�$���
�I4��E:@
�����D:�_4�$���
�I4��E:@
�����D:�!??�[7����w�5��_?_� �)Z������>}���A:��'Vh@H��I���q��.���,������j��Q5j�.\��r\���o��!C����B�
�����M������5j�m9�=z+6}�t�5�z���p���'���b``�BCCU�P!U�^]��u��o����H%%%���T�������{��Q�.�%����|=���+[�l*R��~�a�5Jpj��G�������S����6�����,\�P3f��$���W����mA�����/������{������s���>��A�|]())I111�����S����j������y����6l������J}����=z����&t+�a�����z���?��K�j�����������9s��D��t�"Y�dQ�<yn������z~��
<X'O����	���5�J�(aw�c��)11Q�����OHH���L�>]��Ow�~��@�������+W�(!!��m��=�w�}W_~����}
2�������?����.���9s�h���Z�z��e���1m�t�����n��H�"
����+�$4n�X�a8}?���t�":t��|m�v����>�LS�N���c��Q���U�^����C��-ZT���$��UK.�	 m�3g�7nl3v��Y�_�^+V���3t��I���W5t�P���W����b���������`��9�V3��;���/j��I��F�u���*Z�h���Y��.�O~~~�T��&O���?����;������ny�����>�O?�T'O�����?�������'����}X!�%,,LO<����_��9s����i�t��V���:�g�����[����S
V�����iS��/))I�W���}�t�����_���W���S\��'�s�N9rDW�\Q���+W.����Z����}7������s�N�={V�a(_�|�]��J�,����������������%I+W�T||�2f����s��Qm��I�O�V\\�*T����[�8o\\�~��w9rD���*T���T������8�aZ�v�v����/*o��*U�����w�eR���Z�n���=������G*TP��5�2��+W�j�*�>}ZQQQ��'������� 7T����~[5k�T�����,I6l��7o���K;�+99Y7n��}�t��Y)��j���
,���p�+W�h��5:u��.]��9r�X�bj�����?�R���Wdd����o]�rEaaa*]�����������%Jh���z���%I���Z�l�z�����s��u�Z�J'N����3gNu��M��eKq�-[�h��m:w��r��u������=~����k�L�t�}��Q�F��={�sKRll�"##u��q�?^Y�fU�����qce��%������n�:<xPg��QHH�Z�l��������n-ZT�����l������
����j��
wm�5kV
6L����S�1���_���_���}W�|��z��w��M�j_�~�f�����YG�1�.g��z��g5|�p���������*V��]�1c�f��a�>7�/[���5~�x�?^'O���M�*U���Y�f��{�����4ir�=66V��KU��j���i�&=�������a���\��m
�������������[�u��
�;V�~���]�vW�v��7n�j�����������"E�����v���s���/���6��#����^�G�Q��E�����4f�m���f<��z������������sw��Y=��s������;vt�+�����Q�4b�I�L����o���@I�v���~�mM�2E.\�+����
���?V�j��]�$i��mz����l�2%$$���9����G�6%7n�X�V����fR7j�H�5EDD��7����ko5��������S���M�6���.�3�~j2j�(�=Z��?���]��/����g�����j�R�*U$��/�4ir+���7�l�2=��3��w�]��y�j���z�����w�kd���j���e����'���e���%$$D={��G}��Y����9r�F�e�������^���wW<c�������{�=����2����0}��'��������q�R��#��[�
pO
W��
m6�K���W5f�5j�H���v�����������|.I�w����>�w�}��Z[�n�/�����\�.]���#G�^�z����t��aU�TI/����x��m�C=��^{��59"W�\������>��1��OW�z��f�����QW�^U�
���o�l>�����Q�F�3g����x�	����f����d�SO=�t���X=�������i��$����z�����E���:5��-[T�re��;���s��^y�����������3g�X�g���*]���}�]����?���z�j��YS&Lpk��4v�XU�VM?�����sI������~�J�*���Cn������4t�P5i�D���6�������Z�j������i����;�x@_}����G���w�U���m6�K���g���/�}��JLLt*���+U�re���o6������2e�j�����2�N��r��i��y6����9s���/��7:�?!!A�[���������V@x��]���_�����-��v����+K��o��������+��u���c��Z�t�������������3d��v���n��
		���{5o�<����z��W�������T�vm��YSE��{�_���q�}�%1�	J�Q�1joj�,j�T�}w�mu�zUzf��5jS��M���(bE����G�\w�������|<�x\������9�\�G������
*���h9rD+V���k�$I�V�=�c�98X�'����*V�(I�v�������D������������[M�4����r������*V�(;;;?~\�/6��=Z��{�M��X��'�����wk��Y���W�%��GU�VMNNN:w�\�W�7������EX����^�z�f�������c��x�b]�~]/���^}�U��������?������6m*�?^��-��'��w��p��V�}���m�V;v�0^+V���{�9��YSnnn�p���/_�#G�H�6o�����k������S�=t��U����s��j���<<<���W[��[5b��)�			��e�����n�]�v�M�6���][�>����+���:tH?����������W^yEz��r��w�}W&L0������cG=��3*R��n�����7k�����.�Y�f:x���+f�����*V����o+$$�x=%�����w���f������K��,XP]�t������Y�F;w���|A����g��>	�a������^�z��������:t���M��h���q��6m�$;��=�n��9i�9h�����i��E����+Z�j������+WOe���c���K����W������\�r�����-[�~�z�<yR����p��|���z����};;;�m�VM�6����"##�m�6�Z�J���
S�6m�g�U�R��1�y��[�N����O�c��*S�������~(P��z �0;���7K2K27k�,G}��/�<h� �����3K27n��|���4m�\�bn���E�3f����}��}J2����>��]dd��G�5��d��'�4��W����������|�M�>����L�4h�U����������3�urr2O�:������mdd��w��F[GG�t?�����O���h�T���y7n�����>�����s��]gv���mS~���g����rk��i��Y���I�t����0s����\��������G�����K�6���/M���D�����!������E�#F������KJJ2�7���?��a��?���Z�j���9��9�5f��m�Cm��%G�������a����.""����c����0/_�<��W�^57o��h[�pasHHH�5��3g���a��+WZ���qcsppp�m7m�d���0����;�~�l�bu�~�I�&Y���{w�����m;o�<��������X��7�����nq����3m��9���}�Y���NV~o��\���Y�c�wj���4�,X���/���v���f;;�4YtF�{III�F�Y�3f�9)))M��;w��/�&���3��o���T�jU��#G�m��~������a�����a6���$�����,��x��l	3r ))I���Z�z�J�,��x��%�z�j����}���JHHH���>��X����Yk��U�5��sww��T�^�l��}���������W�m���5q�D
0�x�����z���9s����,X�a����B��������&M�H����5j��R�5&N��������Y���-j�z���M��;W�����_bb��*�>>>Z�zu�������,Y�Z�jY}��5J����${{{�^�Zu��M����N>|��}?~\'N4�_�u}���*X�`��&�I����F�iQ[F���*Q��6m��
*X�x�j��-'''c�����=z����%%?u|��
���[�mK�(�5k��R�J����0}��7�UgBB�^}�Uc��������U�|�t��n�ZK�,1�/^�c���W
��y������t���K��y�z�~������3�'M���7o�jM�:s��EN*I�Z��I-�rqq���U�V�\���o�Qxx��?�|�m�6��C��������7l��;v����?���d2�i��A�\�RvvvV�����9���������z�����]��6l�`�����S����jI�1c����ku{�����S�G����g��===5z�hc����Z�fM�v�.]��M���W_}U��U��_''�4�pV\\\�n�����>z��BBB�5VV�f�&M�d����K=z���{{{���r�J]�v-W����l��#G���/��w��8���o�Y95q��t'����
,��/��R�
��������oU��n����+�����N�:��3z�h�'�O�<Yf�Y�T�L}���Y������x����+W�h���V���g�ex�	`���*U���������XM�>����7��a�L�uss�W_}e��esb����t������g��-gg�L�i���:w�l��~�a������$���j����N.Nm���z���$Iqqq�;wn����7n��~P�
f���E�\��� �����\�r�����h���i�F]�t�����~[���V�hl)R�bQ��4l�P/���U}���K�w�6�����,��^���
f�[�����g��x0�g
.���iI����
.l��7qu��u+Z���KY���aC�������fO�r����%��?����:��������7�:�N�:�����xm��-W�������R�J?>>>����SO=�3f��%�w���>xM�����7�������{���l�R����������;w�����Y�S�pa=��sY�3�����������gy���|N�^���_�5�s���Y�R���o�������-&+���V���s����CR���C����E���Z���I��J��Z�����^x�X�:+���`5��7��X��J�(������W^��7��^^^�5k��#7�v��a�����d�������_���f�6o�l������E���A���*U��g�}���R�[�n��i����	&��L�-����e;GGG5o�����o_�6{��5����U�jU�jh���U�r������|�r���c�c�P�BY���Z�z�����[n�����3g,~��?���h�v
P@@�������������Z�%�_��\\\�<�d2�I�&�����E������f��e�����7��o������_{O>����@~Q�`Ac;***����n���U�L�����W�:u����t���c;����'�d�9�#G��wM"���&�>{���_���]��m�{�n���m+���V/:`�{��&c����3g���5j${{�,�������W�V-�����H�<y2�s�=`kL@���<}<u(z���4�S���~��1c��s���X��<==eoo/��d��:������8�9|���]�re��Y����'�_�t)W��V���b�
}��gV��V�b�\����s���&X�6u�O<�����5}����='Ev�����!����'���:W�N�&�N�{�����9�����t����p��G�Z<=:�5]�vM����RSv���+Z�v���/o������7��O�E�����������s[{���(�5��^� ;������)b��ux\9�����D�V�-^������8�'F�^;u�������H�����9s��f���I�5���7o�{���qh��s�-�
RPP��������/���c�����M�6)::Z:t����5p��\�!�����z��?��<���������$���Y�j�\{�srC��+����s�%K��y�{o���c��s?5���������������[���n�����`-X�@S�NULL����{�?^��-���s������;�������;w��W_}U�������F�
�q���1�:��������68/P���c���Z�GGG[�����J����V�6m4c��4����Q^^^���Q������s��f&����+�d���^���S��q�F�5JR�J�/����l���k�_��f���w�m'''�������;/��������;


5��+����3���~j�W~�)3E�Q�:u4~�x���S������k�j���|���0����^_{d�E��<�RO�N=��Z�N�����o��z�{��f8������?�\{��1��4i�#F�q�������]�5��5k�m��Y]Kv���
(���K�����w?>�����[k��URR��c���P�By^�-yxx���[���e&**���S�v��.�P�bE������d�:u��i�:W�������K�(���������-Q����w�{k������}����	�5j���������K������S'���#O����E��;��������Js���x�9����1��J�$���e����p����[u��k����������K��;�{H�6;�f�����6m���������,��~�����-jl��[W����X��)S�q�F�����������4z�h[����+fL@�x����]�t���S�v���=I����X����7Z�7k�,M���Z�.]���?>��2_�����V�Z�i
������7?T^���K�[�����%I����:w���'u?�Rg���_W\\�Ud7�����*U�XUWV�{zz���^�����/��RC���o@���k<���������+...[��8q�b���j;v��1�=jlW�\9������������X-�d2i���YN>7��:���udW������l����W�6�'N����V��j��al8p����i�����/[�(�5}��?n�o�.`��������ig�L�t��Ox����Yc~�)����c;88X�}��
��{�����D9r�������W�nq/��9�����3b2���O�����tx��_��NLL��={�u���;3�/3[�nU|||������u�Vc���/M���]�|Y���U5��2}zRO�-Q��J�*��9���WDD�U58::�IIIV��z�s��e�)���?��O���K�n���1c�������Ac����:}�t����y������[�V�XaUM���[����*����U}�����J�������U�D�4�Rg��w���;w���j�������^��[�.��������0f�
4P�-�����J���6�(o��WOvv��r��Y�����U��@��,'�kl�	��j������?�h��IIIZ�p��_�hQ��Y��so�����9�v��/WXX����S�4m:t�`r��5+�~w��m����f��m�M�~��U�$YL������???����h���B�
z�����3f<VO������5��W_ey�7�|����,�=�����[s�����ZA���A]�v5�����Z�r��}}�����m������%I���
��-�����^�x�n���k}���%����5��1Cw�������|`l_�zUS�N�a5y�D���L�>=���O�8���W[���}��?��C��o����;w4i�$��N}�m�����E��tx��][
64�������Zu��)St��Ic��a�S�����fFFDDh�������W����-�6m���~�m�OA����[o�eU�e��5�����c��L�o��Qs����oI*_���}��Q���������k�O�81�+t���e����:��s����k�j�V��e��sgc���Z�|y���n��	&X��+��bl���_����\���C�Z�����/��$)y!��>��l6��������G}�n��Y<�{��)�X�b��xzzj��a����#u���l�{�������-I�����A�����+5���%���7�xC
�$]�xQo��F��������m[��S��7n�n��m�������jl��qC����H-::Z�j�uIz����#e�������7u��Y��n����~�iI�����c��)l}��-1S�F�2&�&$$�]�vZ�n]�����5~�x�����k����o�i��vvv:{���t���W��9~��Uu���",����%�t����/�'J�����g�M7����V�~��k�.�'Pg�����������K/���K��]�x��u�&��lU��T�~}c���3�<y�U���/��
H�����:����S|||���>}Z*W��U�=HO=���}�Yc���r��
+�[�|���'%%�w������,>�7nh������������U�Z�����������&MR�=t��a����8-Z�H���Spp��}W�^��w���z��Wu���L��q���M�����k���V�����W�j�*���[*S��F�-��l���4|��L������	����j���/^��d����o��z����{prr�?�`��n�:�j�J�N������8�\�R����W_}�nOOOU�\���t�p����k��q���i���gO]�|9��"##5�|5l�P�-�r��q~
z��]��];c���j���E��������^�z���?���K�.�O>�����������e��������P���5m�4(P ���:u����%I���W��
�w��L�IHH������W/���kV������<�Z�n��?�X_|��$��������j���6m��|��*X�����u��q�_��b��������%JX=�?��}�����m��|�I���[5k����/^�X���F�6m�h��!�W�n]���{F~��9=�������6l�
����Z�`��\�"���>�@�G���NGGG�������O%%?M�Z�j�������#GGG]�pAk�������Z�������'���A��R���$�7�|S}����+'GGG���Q���K���,Y�F�����}��^{�5}���j���j��������;�u���?��{�Z<�>?��������4v�XM�4��U��
*(00P���SRR�4z�h�3F�������]�f����Q#����z���$I�����������Y�f�q��������*T�����u��Uc���E�j��j����Gf��;VG����%I��������}{����x����o�����u�����/�OT�~��Y<m�l6+**J�]S�����_��_~9��*�e���E�
��[���O�9Rm��U��U������o���:z��v������KJ����������g�I�~��w=���j���7n,ooo���(""B�.]����s�N���
6��o�9R������d�����������������3-�{���t��J��-[�U�V�u��j���J�,)���+88X��]���$���m�G�z��'t��iI�OA>|����(�={��4i�3g�HJ���y�����H�"�~����pggg-\�P�j�2��,�~����k�.�Z�J�t��y���SNNN*Q��"##i��������7��]�n]M�:UC�QRR��9�z���^�zj�����//WWWEEE���+:t��v�����0I��A�r���#�	��5j�
*�����$z��!:t(���-��~�I-[���x��W��Y�������pM�6-��
4�������32f����j��9��;w�h��EiV@7�L;v������tI����}�vc�mTT�f���n�:u�h�����g����2w�\u���x�ttt��?n�.��K�)SF{��Q�n�����\����gg9��Oh��4i�g�yF���$i������T�T)W�7���#{{{
6���fs��t��I������=<<2��Z�j���_��o_��)""B�~����b��4�Df�;88h��5z���4}�tIRll�1�=+���@^		���������z+[���YS�v�R�.]�����=k��s+S���OU�T)�����s���f��n���[��W
����6o���~�M������g�Z����L��Y�f�l�����/������x�_�^������������{�=c!���PM�6Mo���m�#�J��o����}�Y�$����HR��%�t�R=����g�E���Oz��W5k�,���w�Z<(���Q�&M��a�dU�R��	E�U������{����={2����J���`3�����=*,X0���J����~�S�Ne{�y��}�j��m�_�~��=<<��'�h��mY�#%O�

���33��\�jU�Z�J���?��3e����#����n��E���>���;U�X1����z������
P���U�xq999Yu�����o���v���������������;w.[5>H~���g<��q��W/�8qB�F�R��uU�H(P@+VT�=�f��Z�J�
2&�K�OL��SO=�h���j���J�,)'''�)SF-Z���3��~U�Z��o��d�d��8::j��i��s��}��,��J�*���_��={��I�,k�����
(�R�J�N�:z������_j���
		�����5�<E���u��a}����\�r�m��iS}��7��kWN�JC���S����/g�3+VL}����U�,��{999i����?��v�*���e��|���9rD�{�����e����!C��o����V���
4H�K�6����+��}����r���?���.\�N�:�L�2rrrR��%��3���o���c���Q#�,Z�:�vvv���3�}�v�����X��
(��������{���c��i������s��:s���{�=/^<��z����`�}��wY�
�*��l6��@�������������y��bbbT�P!+VL�k�V�*U��������?/I�={�����c'N�����u��e����B�
j��U�AsF�����������P�R�T�Z5������QQQ��m�N�>���o���K���W��M���x_}����P���


UXX����U�H=���Q�F�+�������?_�4x�`������35t�PIR�
t���l��;v����y����'����z�������Z��Upp�����k��)<<\���*Z���T��5jd�(znIHH���{u��I��qCw��������)�j���r��VO"�-w�����s�����JLL������/��������o�����y�f�i�FR�����h988�J��o�����$I��m����f�Y���Gu��
����`��*U���V���U��Z��0c:���l:������\�r


�$M�2E���Z����gO-[�L���G-]�4��<��}�]M�0A�T�n]���/��^�f�:w�,I2�L������{��Hfg����s���%�]�v���_���+W������������k����~nf�f�Y_�����3�0�&���#G�(666�v�w���o�m�7m�TO<�D��\�tI!!!Y�}��U=���JHH�$����w��Y�x�������SY����V�>}t��-I�O(<xp�������:>��Cm����2d�U���	�yh����P����}���[w���8~��1���{j���"##%I���7n\�}=zT*T������_���p���/_��)ST�vm9r�x���?gUx@��^��j���g��Z�|��_�nq���


R�:u��o�������P�B��?��sj����M���g�Z�}��~���j�J_}���z���5`���|g��8�������W5n�8�7N*V��u���t��>v�X��_�������9s�h��92�L*Z������fB���������x�%&&j��eZ�l�$�p�����PTT����d6�-���__c�����]�vi��]�$777-ZTw�����7���`��D��7o��
����-��n����k��	V��~o�f�Y7n���7��urr�o���c���������L&�I�aaa
K����N���/WWW���7����QLLL�m5j�9s��b���x��2��]j���$������]&������5j��������^����qE�m��f���K�7o��}�t��Y��yS�o�V��U�H��QC-Z�P���U�`�l���i�_�^�w���S�t��U������QE�Q����iS���Ge��}@�l�l6+**J�K�f����7���K��n�:���:y��BBB-{{{)RD���W�&M��W/U�R%[}GFF��_~��m�t��Q]�xQ���JLL����J�,��
�c��j���z����:�f�#���K�0�u��E�)S��e ���l�;����u�����/"W���e�*>��`���	����$I��� ���K�P��!����U�mg�Q������/&�$1�_�.xX�|��fc��h�����	�IL@������/&�$1�_�.���lV||����l]
�!`gg'GGG�L&[��8 ;��`:R���UDD�������h�r{{{����P�Bruu�u9d��#<���IRTT�.]�$GGGyzz���Mvvv�����lVRR�bbb���p�)SF����.
<���9A@2&�C����t��<<<T�tiw@�����x��
		��K�T�|yV�6A�_d��������EDD�����p_L&�J�.-GGGEDD����"�2p���	��9�����(yxx����d�������d6�m]x���r8�q���\||����f�R�WWW%&&*>>�����8 ���GL@�%%%I��������^�����2p@n#<�H\!I2�L�.���o
�5�
@n�o
�q�t�$&���	�IL@������K&����O�>V��i��4�=�b'NT@@�&N�h�R��B������l]>>��u	y.xlG���b�
����p��Y�
���-'N����U�|y���[�.@"�[���7rO@�1��5"�������g�>,,L+V��8[#�L@�1///��SG�4{��,�/X�@qqq���m��vR�&������%I�������3m(I���S���xmX��x80��^x����H�f���a���k������[���=z�:v�(___������Y�J�R��m5i�$EGGg�Gpp�L&�L&����%I���=z����#OOO����Z�jz���t���t������~���K�������s�N�j���$�L&�?^�t��y���?����c��I�&�������J�(���k��1
�V=i���Q�$��f��;W�Z�R��%����j��i����y����������o�����E����M�j�����u���L�MHH��M����S��5S�R����$777����W�^Z�t����2�'((��?((H�t��)�����\��\]]�����
j��I���W/��;vX���h��8���V��� ���7�wf��@^r�u2W�pau��U�-�������_���)M��p���E}��������{��Q�����=���Pm��I�����?��z��YU������[7]�p���'N�������y��4��0@����bbb4s�L�9��������3gJ�
,�~��YU_nX�n��[�nY�~��u]�~];v��������?��g���q�����Gm�������v�����u���-�S�N�S�N:}��E�C����CZ�v���_o��q��m�j��-i^�������u��y-]�T�<���/_.///����?��a�������k�o���]��k�.-^�X6l�����y#F����K%I��OW�F�2������u�$�i���Z��U�x0����S#�&����������h�"��yS�V�R��=-���{W����$u��]���V�+{{{��WO�5R���������Dk��5��c�BBB��C<xPe������/��g�������G�i�FE�Qpp��O�����[W�^U���u��A9::�zxx�_�~�>}�����q�F�k�.����[�K�.I����+www��w����+66V/����_�����k���i�=���������{�9%$$H�����>}��t���r��-Z�]�v���[z����f��L�Gv<X7nT�����woy{{+$$D��O��'t��Y
0@+V�P���u��%���Sm��U�B�t��1M�2Eaaa��u�F��Q�F�;Vll������ys��[W���rwwWLL�N�8�%K����3���?��[7m��M��Y��a��.]*WWW�����������<��S�*""B;w��������h����T���'Oj��%�4iR��z���
f����!�N�7�7�7�OLf��l�"p"##U�P!EDD�Y19+qqq:w��|}}3\�^>��I�����t��U����u��%%%%���W.\P��n�:��K�,���?/I��y�Z�j��?�X_~��$i������O3���{������KgX��y�4h� %%%i��!���������www��5k��iS�v���j���<(IZ�l��w�n������]�����	�-[�am�;w��5k$I���S��u3l��?^���Wppp�m���U�R%]�zU��O?��b�z�����#���������}�@�������7�?��3X����Q�
t��QIR��uu��1�\�Rm���h{��q��[Wqqq*\��BCC�}�������3����5����[o��������{�����

��/�h������~��y{{[�����������h9::����iV��8q����H�&O���_=�����#ooo��ySE���������n[����m��I�:�F���"�����:y�7����;5���!�~x��l����]�� �����s����|������@I�Ar��-�����/��]�����^xA��p�B���g���I�����T�`A�3��_�~}�6�j�R��
%I�V�Rhhh�c\�x�8�n��9��k���F��������>����(>��s�o�^�t��U�;�_m��I�K����>��c��?�T@@@��]��U��~��I�����{��t�j��u���$988h�������$��3'���|��4���������*I������������7jJo����-���7�s�����;-�oK������-0xH����2�LJLL���s��/_���7JJ�
�sC���%I���:|�p�m�+�dx�E�rpp�$c��{�1BR�
���f�Rbb�$i��a���\�|�rc���������#�=�~d������I����5|���6i���>~�x��qppP�
$I{����l��}�N�T�r���i���N�����T�>}����G����_~��Lk����-��E��?�����<$��/o��>{�l���� %%%�d2���?����f�[�N�V��5U�H9::�d2?���K�.e����������Y������xzz����E�J�f���&�MLL��Y�$I������o�o4��f���G����jx��Q�Frss�$���WIII�]CJ����%K�U�TQ�B��j��� %�t1{�lu��]O<��<<<dgggq},Z�H�����L�OY�?#e������4��W�?y��~��wI�7|d��{���C��>��d���V��<D,I:}������HJ�%�e��*_�|��

U�&M��cG��=[�VXX�2<'��5%\�����$)...��...�{=w��6m�dq|��u�����S���37DFF*66V�T�bE��e�O����*U�$I�}�������������f����}����|�I
<X?������oEEEe����^�����O���O���O?)""��x�P>/��z������G�����J��4?�����={�h���:v���_��7n(>>^����Z��Z�h!���+W�h��iZ�z����u��m�*UJM�4������i���������<==���g+))I��������JHHP���u��!IR�����sg��QC%K�T�doo/I����4e�I���g&�P�Z��
����e6�5}�t�m��86m�4�vy%**��NY�=+�o���R�"E��k?�����;�v��)::Z�T�R%�o�^�+WV�b����"��$I�<y��l�")���#Fh����}��~��G���k��;w�h��9������[�n�2�����w2���k��o��c�=Z�h����t�]�vM��]�����1c����>��~�i+W���/����0����=��g�j��96l����;#�2�����}���~��%K���===��{�l��x�b#|o���~��g����������WxT�XQm���/���U�V�����������a�IR�z�T�V�<�)������J	��=?�=z�Q�����1c����������I�����w�yGaaa�>}��/[�L7o��$����rrr����2p�W����y�� �rg)�GL�%��S'}��G�9s��,Y�h���j�����U�G��Q�Fe���-[�����{��5m�4��7Oo���
*$)y5����J�J����Z�|�$�o��rqq�V?7n4�'N��i8|���Tz�^y�IR||�%I3g�4V����%����X�����JJJ��}RR���9#I*P��<==t��&��(Q�������w�6�G����/I:r��v��)�O0�Lz�����.�����7�w^ ��>&��c��]


�������KC�Q��=��o_}�����}����c�Q_|��BBB��s��
<Xw���$M�2Ek����/��~��i��	��g�J�,)I�:u�~����{�xh=���z���,^{����Ohh��]�R�L������:v���e�JJ�S��
R�>}re;��
�fs��L&����$%��c��L�����XE�����a�r}���f�d�+W�O�k��7�-�>}����/m��MR�S
*V�h���2p�g����y�� ��4(�T�^=���%i�������$)!!!�p200P�������;���{�����w����}T����o������~������
gG�J�����g�n���:v�X���_����*�g����o��K�.I����/WW�\�`����C�����������2m;v��t�{�\g������Q�F)!!!���P�re�l�R���O?����6�����+2p�w�����7@�1=�������N��v�E��o��v��t��U>>>���;w�����W$Y�
��]��k�.-[�,G}��?��#%&&�i�e�#���^zI�����o���x=7V___I���7u���L�������K��v�Z}�������/�n�:I���W�V���������0aB�m&L���S��eYi���+����X��^^^z���lY�C��B�M����d�s(���%K��8����K������I�����S���������r�@��"wwwI��U�T�fM�7N�/���S��[7�j�J111������,Y���u�f�Z��
U�F�\�u���v�n�4c��[�N6l��
,~�,�9s����^�������g���I���O?i���z��g����J�4g���~X���[��{����;j��)����4~�x��WO����J�*��m����.]��t���
<��i�!��������"��>[�0Z�z�~��gI����:v�hq����JJJ�$��]��2���g��|���P1�V�%�x�b���S���:v����}�6����:u�5o�<U*�1B?��������K���������K���O���g�}���c�]�vZ�r����0���S;w�L�o������?�]�v�Zo^�������n�:cE��������5y�dT����AC����.I2�L:t���x���aG��?��i�d�3�m�6��uK�t��]]�xQ7n���%%?S�N�����y'O�4�}}}�'u���Z�t��!}�����i�._��
���[���������O(((��u6n�X
����������>W�wss��]���7�h��u:}�������h���cG�={V?�����]��'O*<<\����\��:v��W^yE����Zk^������iSM�<Y;w���[�����
*�[�n6lX�xm��5��m�Z��.����2��d���#����l6�����A���{w��M&��5k��?�\M�6Ms|���z��7%I��������8�V��5%Iu����}�2m����s�����T��eu��
yxxd��R���������#�l���+V�G����_]'N�mA�W�����/]�T��u�qE���Spp���-��<r��b���<|O�Zdd��+����lg�������f�-��#�#�Ff���'2p�-�:��	�9����6m���'�H�xtt��mM�P�@c;***��c��1V;Nm���ruu����T�dIEGG�����:�+�}�����_?EFF���'111�;w�$�t��j���G>p��]��}[��mSBB���r��z�{��u�xH��������-3����%2p�����w�E�[��L@���]���������Z�j�&L���>�H�|��-Z���[�i]~���~�mc?e��m���	�d�^�K��m�o��&Ij������l\����'+<<\���k��H�"�-����(P@M�6�o9<����������f�-��##�Ff���/2p�-�:�f�����T�fM��YS���W�����;j��}�Q����`���v\\\�}��}��vww��������������(GG�,�O-11Q&�Ivvv��������p��m����JHH��c����_K�L&�����������u���:���o%I^^^z����>�	;;;�L��]��;�&����o������K����D�����!�~x��l���O�	�9�����c�j����{�����K-Z��8���il��q#��n��������������C������^�z6����M����/Z�foo�Y�fY������72C�
�3&��P��p�����T�bl�;w.��R�I}.�����P�*U��o�_�~�.���������O>�D
6�u952p��"�Ff��@~��rww7����,�U�VMvvvJJJ�����({{����w��]�z��/x�����l6���S�������u�2p ��#3�� ?��u���O����8����F�I�����}���IJJ�/��b��^U��@H���:u�������Oc{��	��b�
�;wN���A����^�X���	��L�:U[�l��l��Mbb��������x��W^I�n���*W��$i���������9}��^}�Uc��/����0��r����'�v���#T�lY�i�F5j�P�%������p=zT+W�Tpp�q��~�f�������E�f����>���x���k��a��t�"777���_3g�TDD�$i���j��u^�U�#��L@O����i�B�
i��11bD�mZ�n���k���
��5k�f��4���~�����^d���`z*�'O�s�=�m�����:s��n�����x,XP^^^z�����];���K�
���n���A�����z�j+..N�J�R���5d��tW��~��r�d6���.�'22R�
RDD�<<<�un\\���;'___���<�
����Q���Z��<�������"����������[��vy>" _b:@���t�$&���	�IL@���K2�L2�L��u��� G����a:�����4o���%#��[�f�����R�-�s��)�'N<�Bm�c����tttThh��K��?���3F�
e�.��B�� �D��<�n���:h��}��'�xB�6mR���m\Y��|��~��c?!!As������o����#r�7�7xt0��~���,�+V,*�[
�u��K���m[c��Z�j��_~Q�%l\�����D��	����������<Z���s]�v�u	xN�>�6m���������k��5*T��|���lV``�$���Cm����e�t��)m��]�7�q�4��G�7�7x����x�<xP�76��g�}V7n|d�wI��u���=+Iz���5|�p���Y�lU�>���G��G���������M�6*U�����T�hQ������?VHHH���d2�d2)((H���~
>\�+W�������"""4a��n�Z�K������)��u���?����3;  �{�������}�����2e����E���z��g�l�2IRpp������}����d2���G������� �h�B^^^rqqQ�r�4`�>|8�z���y���v��$�O�>Z�b�
(����W����U�R%������U�������6o���9			*]��L&�<==��8��������dR�2e�����7���!�����eK�)SF��d�EEEe������=K�V�X�����|��rvv�8��5�u�V
0@*T���k����4z�hu��Q���ruu����J�*��m�j��I�����N???�L&�������Y�/����+�d2�@�
K�f�������*U�$777��5j��������u���,�V�������� �8�����{��G�4��[�t��-���O����5e�
<��>����#Gf�.Y�D����[�,^�{�������~M�8QS�N��A��������S�����l6^		QHH���_�>}���/��V�7o�T�=����[�~��E��7O�-���s��o�l��~�z���C�o��$�1B�~����2_��������v����Xpp����5�|���Cs������q���A/������EDDh���z��3o��F >d����g�}�+<<���B�
j���L&��1c�(&&F�/�K/�du�w��U��=�~���oh��)��5j�>���t����*44T�6m��q����?�^�zi��1BC�QRR�f����?�<�17m�d�:~����c�o�V����z���9z��V�Z���`}�����<�����%��������t�t��a�h�B111��j��i�������[��b�
m��Q���2d��f���i�?�����_��j����W��u��q�,Y�h7c�
6Lf�YNNNz�����iSyyy)::Z��o��'999e;�N���K_��$�d2�{��j���
,�S�N)00P�-RRR��}&$$�{��
��G�-[V�n������u�V%$$h��!�W��*V�hU��/��/I9r�����,��x������+W�H�j����]��R�J������'5w�\�={V��-SLL���['��d�1t�P�=Z����>}z���i�$I����
�3��}K���������1c�H��5�[o������|��8p��|�I���i��=rvvN�~��qZ�~��/�A��������������.66V����W��5j���+���S���
��5k�c�����C�:x����-k1V�>}��;�(<<\������O3��!����a��Y�������x����������OE�U\\���;�={�h��-Vv����������7�&s�e��P���T�B�a$Y#%��������u'�A����<.ux��_���$��YSG��$���K�����`����Y�4t�P��f������c����hd�V�\Y�6mR�r������������w��Oh��Uz��'��;q��Z�n������+88XE��h`���e�5o�����S�T�zu������QK�.U�.],�����k����i����A���&�?���������z+M��C�j������_]�'ON�f���j���$�Y�f����^y�%%%�d2i���z�����w/���F�i�������?���C��iw�����k��E��o��7�����V�\))�{�Q�F�c����z���%I�:uJw����[�����/���3g�����8��aC���K�t��qU�Z5�~���5g����p����J}
���v�Z����w�^y{{�t����7o�
���$
2��R{���4i�$I��U���s�t�


U��e����������#����D-ZT�X������a����:s��j���a�y)G[����km6v���6xX�Ov���~�C2p+�aN�M�-��������%2p�m�:����d��d���V�Z���]k��O=���N��&|��!C��M���aafu,Z�(��]J<���+�[�.��]��V�j��QQQ�1cF�c���o�5VS��w�����������3[}80��]����k#L\�~}�}���O��WRR����5k�,��wIZ�z�v��))��M/|�$ggg��3���b��	i����+�����33���s�������$�q�����|CD���@�������?�hu�����%K�d�K���_���$���_/���$i����u���#���>���@%$$HJ�y_�~]�7�t��=��=<<�U����;}���C��5�o���<b�/_nl���;������|`�6����4n�8��/<<�Xa�[�n�T�R���i�F�J��$���/��M��+$Ivvvz��72lW�X1
0 [}g�{zz+��9sFqqq��cl?��������u��v�����{�$'''���W���_������ic|'�����������J���-�:X]kFf��el��S���[������s��f�g���*X���ut��]���V��J���%%��r���4��T���-[JJ�Q����i���fc�xWW�4�������r�8!��D������<xi���������/T����������m�fzn������O����p���\�b���j��I�}���CIII�����<3����r���?�e���^�j�U�VU��%3m��EM�2��������SOe��L�2������L�/[��"##�c���}����a�U���m�$I^^^�����lfl?~�b�~���a������Sxx�/^,��,X���hI�K/������s��,X I*P�@�7.\X]�t��%Kt��5�Y�F��u�������io6��~�z-]�T���.^����(c��{]�tIu��M���#��o�)11Q�f�R@@����7���s��oD��w���C
4��]������K�.z�����ys999Y�~����;-�����N{�o�SL@���]�f���+W$%��Y��T�re�8q�87�>%t�Hpp����� �
�t��-��JRHH��]�b�,�W�P����)b������%e�|�
4n�8�m�V��c���k�
6���=��bbbt��
I���
�SK�3<x�>�����i���i����K����5d��l��������[�n���H���A��d�IR``�U�5��1��CCC��gO������###�}�k��*]��BBB�O>�������[��
�n�}��Z�l����^�Z�W�V�����g�yF-[�T�-����s���i�g��;g������������(I�+�[#�J�)���@���n�x�����V���c���5���~�dgg��Z�Q�^=m��Im��Uxx����#��(����S�������"E��������s�s�N=zT��W�$���O����$u��I����5�$��5��8p`����k��%K*44T�����F�Y]�9i����������C��W�����j����%K�@�F���o�OHLLL�?���K5j�.^������S�N����U�VI�j��������G�:ut��!}����������ok��m��m���+///}��z��7�� 	(�u�6v���<����"�NF��9�op��?��#&eU��!uf�����������'�l6g�';R����Y����x�����i�&.\X��s�N�k�.���S�u�����y���)F�al�^������#88X�������}{�L�t*)9��3g�}���/6��V�Z�����3g��}�]���_=z�P��]��kWU�R��>_~�e#�O�*!!AR��w�����7o������c��S'��z���������@~B������g���/&���������t���,��:u��.]�t��-S���}����c��u�9s&��g��}��X���������~��]j���""�>5�P�BF�z���\��A��]��$��������JJ{��kw����=;�7V����sb�������3�!���sV�����.]�H���[�K�.�l6k����o&����U}9;;�i��z����z�j]�~]��M����$)((H���U}��������;c���~9����~��:q����@q����p�����/IR�r�T�d����I�L&��fm��A����q_Y���R��eu��E�8qB������e��VKv��SG����Z�n�[�ni���j���6n��B�
Y�m�����]�k����?�T��us��#F���_Vxx�~��'���O:t����om���$��������Y�`�N�>���O�?����4ir_udW�*��T�R�L�n����~G����Y����5k�4h���`IR��}�����z]\\���/�����4i�$�?��O�]'����E�m��;}���~1x�����?'L��^xA����������U�{��q_��(QB:t��u�t��-\�P}����>3��s���o�URR�&O����G��������X9Q�vm#��y��������[k��M���4�
4Hk���$}���Z�n�L&�}���/����SDD��O����8I����|��o��I.\�$=��S?~�U�)RDo���$i��Yy���������W��n������cV���uk=��:}��f�����
���������NHH���������wZ���#��������<����Q��$���C1bD��\PP��N�*Iruu5������_���I���K/i������u�����m��9�c���krtt�$�?^�V�J�&66V/����������V�V-����*V��$i��}j�������6={�T���%%�8>p�@c���$&&j��
�������nnn8p�$��?�����%I]�tQ�R���}I��y�A�Y}�/�`|�K�.UTT�}��~~~��G}����4m�l���_~9[��L&
>\�t��E�\�RR���~���;p��>��s]�r%�6111�;w��_�V�l��g���C��>���������G��������g�yF111�1c�v������G�n����+�a�����'�|���=v�Z�4m�4
2�������;��'�P�����[{����m��������T��O?�T�|�������kWu��]�������N�<���g+88X�?��~��'���/j���_�U�Z���7����u����y�
.,���e���a���x�������k��W�^�[���)���8������C��i��_��V�Z���?�t����k��)���j�7o�4f{{{�����s�+�:h��U�����E�4t�����ZC���1c�U�V�f��8p���/���0���/Z�r��������7��������G��KY�
��Q���3���g�Q�*U������p���_Z�p�BBB$I
4P��-s���|������;g����b:�z����e�u��]�.]���G�����i������'k��!�6����J�*���+$$D���3l���l���]��"""4a���f-[�L��-�h��O}��gF����������e���~������V�Zi���*R������o�>���k���
����3��L�2Y�[�Z55k�L����$�B�
j���}���Qw���$�k�N^^^�:��A�j����y��(QB�/V��=�c�����quu���S������H�"�������#)�:|��2=�d2I�����}�vm��=��M�6���K��
&@n �������E�
���xD������S�<y�Z�j%///9::�p���[��F����O�j���]�v:{����gO����`��rppP���U�vm���k���


U���s<��_���]�?��J�.-'''�*UJ������K�p�BEDD��)�o1WU�^][�lQ�%$IP�V�t��MI����u��s�N���k�U���-*{{{����b����������G�*((��q��mkl:�|�G``��=p��l���S'�;��k��?~�5eG�t��!�����������
*�j���������5`������~��T�`�L�7k�LG��7�|�^�z�Z�j���0����+��^��U������x��9��������B���7�&��l�u�?���*T��"""�����s���t��9�������U���)S��oH�~��gu������j���C������/f{�vdO��]�r�JI����U�vmW�����2���l�`���,�@Dd���';E�p��!9u���#��[�S�-��`���y:�GZ||��M�&IrttT�F�l\Q��s�N:tH���{w������Z�f�$�~���|� �����;o��x`:����k�t�������i���:v��$�g��*^�x^��o��f}��'��[o�e�bJLL���
 -���!��{��<l]���������~Z�Z�R�*U������(>|X�-��+W$IE�����m\��9rD�/_VXX�����_�U���cG5h����=z���o���������5k4w�\IR�5������:�
�������7�'&�x����O���������V�\���K�aU���	4g���J�(�����F=������?���5WWW��=[vvv6�
@~G��5���E�
����C�F�Z�p�
�Z�j���[...rqqQ�2e��sgM�>]���j��a�r�{{{���h�����w���+g��i&�I������������u���$��w���-�o/&��l�u�?���*T��"""�����s���t��9�������Ux����2���l�`�l6�"l76�
���"����������[��< �	���b:@���t�$&���	�IL@������/&�$1�_L@Hb:���� _
��d��d���[m]9B�
��
��|(%x���y���.�l��5[�MTT�Z�ha�S�L�8q��j;v4�����BCCm]�����F��1�o�(c:���7��eKc��'�xB;v�P��Um[�p��e���/�~BB����c�������<:l]������Y�)V�XT��`�2�K�.�m���j��j��/���%J���#((H���������QE��������<Z���s]�v�u	xN�>�6m���������k��5*T���+{0�f�%Ij����-[�S�Ni���j����+���?����������������j����?�����q�#�K���[u��YI���?�����f��e�������<���<�n���o��Vm��Q�R������E����O��BBB2=?((H&�I&�IAAA�����k����\�����-���	&�u��*]�����U�H��[W~��._������[�n��������o_�)SF...������>�e��I��������������G&�I>>>����$�E����������+��������U���7��k�$I}����+T�@�,�]�z��J�*���]������U����y��t�IHHP���e2��������,��������L&���)�������t����-[�L�2��%K�(***�>�����188X��b�
u��]�������������[�j���P��\]]���8���G�c������������U�T)�m�V�&MRttt�u����d2���^/^��}��fU�XQ&�I
PXXX�6k��U��}U�R%������QC�=�����K�.e9��"�&�&�&�y���x0����=z�	o���[�ni��}�����)S�h���V�9n�8�92�@v��%>|�n��e����w����k����:u�
��7v����?~��f��ZHH�BBB�~�z���G_|�E���y��z���������/j��yZ�h������}�f������G��}��$i�����oeg��Z /^T����s��4���������G��;w�\]]��z�����_(""B�/��/���x,0�!C����>[��^�����*TP���e2�4`��3F111Z�x�^z�%���{��z��i�k�7�xCS�L����Q���g��{,44T�����i������Y���K�n��2d����4s�L}������i�&���.l�}��z�����WgX���G�j�*��o��t,�aD�M�-��F�
4&������E�����$U�VM����n���+Vh��������!Cd6�5d��L������~�z,XPT�z���������d��F�3fh��a2��rrr�s�=��M����K�����}�,X���8������)�Av���_����%I&�I��wW���U�`A�:uJ���Z�h������3!!��6l�=z�l���u��/^��[�*!!AC�Q�z�T�bE��]�x����xI���#���_fy���U�~}]�rE�T�vmu��U�*U����N�<��s�����Z�l�bbb�n�:�L&���C�j���JLL�������M�&I����V(����[J^�=�6�3F�����z�-�_�^���������O*..N{�����s���������U�xq
4HO=������=<<�v������W�z���Q#U�\Y���JLLTpp���Y�;v($$D:t���U�lY������w�yG���
���~��M)��$
6���G}d����W������*Z�����t��9���G[�l���&���������@^0�S/���Rdd�
*���� �)����\\\P�����ivE���T�fM=zT���K/��~����z�f����Ce6�����c�������MPP�EX[�rem��I���Kw������Ow���O<�U�V��'�L����j���BBB������`)R��M@@��r��-[��ys���N�R���/GGG-]�T]�t�h��]�j��M�k�
RPPP��|||t��yc������z��4����3gJ�^�uM�<9M��[��E���f���o��z��W���$����������Ns���f�5j��;w���^?��������;w����E�IJ�	��0�k��Z�r�����F�����������$u��)�����n�����L&���9#___�X��
�k�.I����U�j�������9s,����3��+�5�2���k-VX����{������Kg�f��y4h����4d��zH������I�$I�V�R�����+44Te��UBB��W��#G��U�hQEDD�b����wo��GFF���3�]�v�u�%���Q���Z�������V@�����~�S����S�?�����������[�o�6l�������d2e�S�V-��k��5����zJS�NM�K��!C���ccc��0�:-Z�a�.%�w��������[�n�.IU�V5B���(��1#�������������i�wIruu���������n�.I_��&�_�>���������+))I����5k�U��$�^�Z;w�������K�������c�@1a��4m^y�c{������j�9q��A���_���qc��]J�!"E``���z{{���:�uss��%K2
�%���/��]������;<�2}��=)$� tB	�HG�� -i+!R\�T@cg)���+ 1t�N�P"��7�	�)$R��G~9&�M��~�+������}f����}�;�j����<�-[f|S�0a�����������xIi��7n(""���d����K�
��������O��Y#������w�}gl�����������7�4V�Oy\z��o�i�n�0����U+���u���+J�����Lk��v�ZI����^~�����)�#Fdk����%K+��?^�����ml��WO�<���}$�v�����k��"E�h��a��3g����K��w���8'�/��{����e��I��T���={Z�kF���ol���
2D����f�g��Qrvv�����������o�^R�%�*TIDAT�+��O��n�������t�Fhhh���l������s���dl'_�����F����������B(T��Y���%J�z���?�^^^�[�Z5��WO�O���K�t��#X�2k���JLL��'��)^���\��S�NeY���k��@�~���P�B������-�X�bj��q�5�+W������g:�*U������/�����l�bQx�s�NIR����}��,����cl�:u*�j�&�I����������p�X�B�����_�t����+I3fL�oX����Z�t�$�h���^|P�T)���W+W������q�F���?����<���l6+00P�V���C����(c���]�|Y-Z�H���	�}�v%$$h������K���~���%%]����������i�}��i��m����^|�Eu��YE������wZ���#���z�o�S��r������r����p;�`Z�������O�f�'��			1�`Y��n��mq�$����5k����F�����j������%e�|�54}�tyyy)""B�w�V����e�/^<�����u��MI��K�,
�SJ�=5j��N����X��;7M?w�\I����F������f���������%���#Gj����$�^kV����_�zU�
����-;222�����U�R%������_S�NMuQC��-I���Kw��������TDD�6l��
6�h��j�����k'OOOyxx���?�(����"���w����@n�X�y+**JR�J��H�y���)Z�h�����[4_z����Uml;99eYo�{!I66y��b�V���%KJ��������g�J�{?%���i�suu����%I{�����'�}����%I�{����[��������>>>�u����X$00���$3Y}sR�=z�{�R�����3fh��EZ�j���Y�5k����^2�KHHHw<;;;�3F����@c���W�~�zIR�&M��u�t�h����;���{����wO;w���i�������+���>3��x\��E����;s�� ��x�$�*�2�����w��)����g�l6g�';R�111Y�[�^���-[*((H�J����g��|?�7o��������M�0��N��%��gGHH��m�f<����L&S�?����z����0{����?'V�X�c��I��t����],�k���g�}V�������U�n]��|����U�S������������]�Z5������[���5m�4������\�vM���?�d�~�0!�N���O��#���
��c�b����Vs�v�Z��g��5�+U���y+W�ll����xK������Y�_�p!?����O>��[�!��}��������4�%J�0���/�Ym��Q�f�$I�-��{��e��IJ
{�w���y����l_X����?����?�`l��g�^�r��E��tssS��}%I�7o����e6�5o�<II���o�h,u��Q�&M��
t��
��3G�������:t����G�wZ��"���7�-;k7 o�n�Z�O���(�1"��K�.���3���U��B�
9��C�2�L2����e��O�����R�|yU�RE���:}���^��i�;v���^��y����m��v����o�������~���(Q"Um�N��i�&]�~]�R�-���	&����Wxx����[����0v�X���nm���D�_}��T+�gd���������o����~R�r�Gv%�B/I�j���v��-�;a��Y�F			�?���i���I��a������~�������S���#I������sX�wZ��������7�������Y�4|�p����[����X�{������\�r����6o��'Nh��e6lX���L�~���_(11Q�g����n���7�h��|�#'�5kf���n�������kW�d��F���#�i�&I��)S�y�f�L�\�?|�p����������s+I�����Q�r=~PP�.]�$Ij���f��i�q���z��W$I���/��X�b���s���a�t�V�X�_~���q�v����k���~����u��c��q�r����^����������;5������G�
r+w��(t�~�i5j�H�t��1M�0!�P.  @_}��$����>s���>R�"E$Ic����e�2��}��>��Sm��5�s��������$��9S���OS����+<<<�����M�j��m*S��$�����������c�4H�[����������R{z�e�}�����]�X1���H�������K������+��uII�y��#GZ|�����s�j�*EEE����h����=y�d%$$����c����l�k2�4~�xIRhh���[')���|���;r���{�=]�r%����h-\��x��i�l�f��"�N�w���@n�
��c���F�/V�v��y��i���1b����u��m�[�N[�l1��={��U�����6m�9s�h���F�=}�t���G�k�V��E�s��i�����s����s�B{��u��;�h�����������=z�x�����_��7�($$D����~k�?�E�&M�m�6u��E7o���C���kWm��U�J���d������m[���j�����i��y��h�B������UXX��;��� ��qC]�t��)S2�{�������S=�����u��mmm������c��)��={j����������5v��\�d���G��O>QTT���_�&M����G��U��;w����k��u������>���[<����&O�l��/e�~GDD���O������k�v���n��rqqQxx���9�e��),,L���Myzz�����7�7�w�����t�1��qc���C����u��IM�4)M����f�����G�������X��F����0=zTG�������X=��L������5Kf�Y�W�����S�:T�����/^<Gs���s����7n���������n�*WWW����������U``������s�f:f������A�����~��GIR�5��[�\��E����������|���:~����j������+WN+V���A��_~�%���������+%$$d+�wuu��!C�`�II�����gz��d�$%&&j��]��kW��;v��U�
�&@^ ���w����"���
���FY��wb�	k��m-[����g���_k��u:y��n��-ggg��QC��w����wU�T)������.\���K�j���:t��n�����X/^\���j���<==��O�,Y2�s��1C}���_|�]�v����*]���4i�1c�h��������zWW�<x�y�a��F��u9r��K�.�r��i�����o��,Y�]�v)44T���rttT�
T�~}�o�^�{��O<a��^^^F?v�X#��
c���'�����[����}������S�N�A����R={���c�4c���?�P��E����=zh����]���=�����>\�����w��I'N�PPP�����_~�E�/_Vtt�����'�|RC�U�>}r�r 2�G�7�wV���"��a2��fk7�����T�%!�l��/�z��rtt���w<j>��s������5k������
M�6��c�doo����l���������u�$I�V�f���Q�����Q���&�����7K�+���
dCn�S�=�d��!t�����`���o�`���m
|F(@qqq�3g�$���^O=���;*����c��I�@���BCC�q�FIR�����@�#�N�w�"�����<��_��S�Ne�?66V�F��/��"I4h���-[P�Zf�YS�N5O�8�z��E���)!!A�7����s�������`g� �.]���-[��'�T�.]T�n]���(**J������u��IR���5s�L+wl='N����;w�h��%��m�$�W�^j�����{��;wN���STT�6n���J�5j���[�;�
������7M����w��A<x0����W��u�T�R���p�5k�,X���r����/��RG��������K�����������X�+��w����7M�Y�5��e�4r�H5m�Tnnnrtt����*W��>}�h���:s��5jd�v[[[���k��Q:p���V�j��k&�Innn4h�8�-ZX�%��w��,�o�ZLf��l�&�;���*Q��"""�����ccccu��EU�^]����h�_/�<1���[�GFN���
�77Ym���V�[~�����d�(r{��-C�#X���o� �����������
		��d��d���o����sgcL
�7���@���]+???���)<<����+  ��������f��%�������cd��d����������M�6���o������/G����>����>��3k�<V������A�
�����
(���]�H�|}}3�Qp~��g�:uJ
4������:B^���������Z�j�8q������������G7�A���2���n#Oyxx���_���b�����T�lY��;��Z{{�,k���/��93����-\�0�q�8"�&�@��t���U������m��������~Z�������5m�4��e����-[&I������[�g}����������
�6j�(I��k��i��Lk���%%�t��g�|�
K�~��"&L��d��d�o���nMPP�Qc2��w��t�8`�����������|}}S������d�����W��jN�����;g�z��Y�^�z���M�T����;wfy,R����*U�$���==7o���
$I>>>�����^���5m�4u��A���W�"ET�\9�o�^�|�����3=�����K��o�����Z�jrttT�����W/�^�����d�=��3rwwW�b������u�j���:x�`��}H�>�����N�:*^�x�}���=�O?�T���W������l�';v��~��7of8����L&�~��wI��������d2���/����|k���Q�����R�,A����g����k��v��������JRR Y�v�45��oO��m����yzz�q�������#�j��T�_�rE�}�����;M�>=�������|||4m�4m��Y��]S�����-Z�Hqqq����{N?��S���y�f�1B�o�N���7t��
���[3g���E����O[4�����O?�4�s��_�����y�fy{{k���rpp�p��'O��g���3g��;{����=����Z/���>��3�.L�>}��~�m%$$dX�p�B�92�}���O?��3fh������W��fG~���_~Y��y��	���od����;=��.��"2�L2����}�����&�~��������C�����/���[�g���;$Is��Q�r�R��)S&�1F��U�V�a��6l�j�����hm��Ak���$M�4Im��U���-���n��Q�6m�����h�"���kij���IR�v�T�n�<
����{���O�������[k����T���\�����k��}�}�������7�{������������S�%4j�(�h�B			��{�,X����k���>|x���9rD�:uRTT�$�C������U����D?~\�v�����=x�@s�����o��V���rvv����Z�j%{{{�:uJ*T0�bbbd2���Iu��Q�������$������u��l����H
8P{��Q���S�5w�\���������7T�lY��;7MO������1}�t�l��9r�7nl��...��D�������� � w��vb�	k���*[���x�	�<yR;v���l��d2�GFF���C���={�h��=��~�������{�nIR��-���lq��7W�����\�������n�K�.�?��O��1C666���F���~��S��l6k�����P�vm�o�^�v��7�|�&�?p��N�H��5jT��}��]�9�{�����;���|��������������x�9R�����/����}��j�������r����>>>z�������7n��������5t��T����h��A��������/_�>}���>|��z�-���_;v����s��3��k����:u�(((HU�V���C�:{��j�����W_}U[�nU�~��7�xC[�nMU���%I�8q�$���I����)���T��m�i�&�*U�x~�����(#�����7�w2�o
'��K$OOOI��7�05���;��� I���$I�����gO����Y�����+H�:u���3S����z�-���I�����1�,X ��d�Oppp��������~���,w�����S�Ni��}�����K��+�!C���k��V��v��$���������*��$�����{O=z��$]�v��)#666���oS���6l�����x<}��45_��.\� )��
���(QB+W�4V1�5kV�}�L&-_�<��]��x����d]�v�?��OI��m���dZo��:�����+S��@N���7�7�7�7��
�@!�20��}{�}��k��-OOO#������
�?���4a`2[[[yxxHJ�x������#��g�1V����o��ccc�|�r�&;��[����3�'M��i��o���q����R��M3���o_��[W�t��#lO�`�I�������\�K�V�^�$I�����~�����W�f�2/;R~���N�D~����E�����K��Vv�n@j�:u�����m�6M�8����w��E�����E�i������)���]��k���m�6��)W��s�N�������_~����
����)[�����kQm�z�,�X�b<x�����������>S��E�z�j���K��{�����!������K����R���y���T�X1EGG���JLLL���������kW����������F�����H=zT�T�bE�_�>���C���X]�x1���C�Y����]��l�2���_.\PTT�������|�r��~X~����n 3��9C�M�M��>�o
7��L��%��Y3:tH;w�TBB�lmmu��-?~\����'����w������Xc��v�������_C�2e2�������<��j������������S��3j�(��?_���Z�j�F�!IR�Z���c�<�/22R111���5kf�&���Q�Z�t��1��wO���ruuM��v��Y���&,,��

Ubb�$��������c�t������H$3w�����>�u��Y<odd����_����
X��;g�������G�
@��t������C����u��
��l��d����Q'Iqqq������gO����X�:yA�*D��k�N�����3g��7��C���c���_�]������b��Yt���s��3
|-/eM�^�W���d��h���1d�m��YRR��z�R�f�T�R%999��.�����'5u�TIRBBB�����a��,E����'!�&����t������3$I��mS����}�vIR�F����U��5j�����}�z��i�%����s�=�I�&)88X�����f�lmm5r��<��x���vtt�E���{7��f�x)kR��2T0`�V�^mQoye���F���Q#����P�B�����y6o~� ��#+�����7�
�4�P���.9PO��.]���M��svvV�V�
�_<����l6k��E�$///�����\...�J�.\Pbbb�����:�����K�,�a��s���?eM�J�����5444�q��?�`l������t���<�7?�������o�o�������B���Y-[��$���G!!!:s��$���3Um���G����K:x�������.�=�������l��8�*TP��=S=��s���\&���<FGGk���������Xq�e���>K

�r��[���[�6���)�'�xB�t��a]�v-������W��Z�jeZ��x��SV�o�y>��F�����K��6�Wx��J^����{����$I������c���>11Q|�����S=�S����vttt��B�x����uk�n�Z�;wV�~��m�������2��6mZ���'((H���p��M���O�7o������?r�HIRBB��y��L��k���K��d�w�^����9K~���|���Y!�&����(L�(�R���VovqqIUW�B��_?U����D�����������K�����}��c�)R$�����U���%%��|�A�u|��6o�,I*_�|���'$$h���
K����S=z����7�HS����]������s�j��I����p���o�����L��D�*����{�)666M����5h� ��E!�w���[�t�R���u>��@�����K��&v�n@���k'��?�U�=<<t��i����UM�6���]�v5��x�
]�~]u������1G�V�r5G^�t����]kQ����z�������pM�2���4h�����y>&&��~��sX�D	������,X�^�z��j��!�X���^�����k����$;;;-X�@���t��j���z��'4z�h5o�\			��g��P{��2dH������~�zu��Q����>}�/^�A��I�&rqqQLL�BCCu��am��U�������0`��V��K�.�����[�����Z�j)&&F?����/_���8�9R,�t��]�j��������k���rss��M�Z1�j�R�Z�$�����w���/��������(���m[�e�{zz��/�4w����r�Q�Fz��g�x�b]�vM���z���:uJ������C;v����D�
�pDD�>��#�����_���7������#G��������{w�[�N#F���;w�w�^#�M�T�RZ�h��w����/������5k�,��5+��~��i��%���Q#<xP������?+,,L�g����d2���-����������N=z����7u��%���;�jlmm5m�4�n�:�~��Q���/u��>|X�?�|������������q>��@��=�����;5�o���%t����(�^�Z/�����k��e����^...�W��|||�e����L�	��d��'e�$K�;88����J����C&�)��rc���7o�<==U�\9c�w�u���K.\�����zJe��������)�v�����>��2]a�a3g����[��3��J�**R����-�=zh���Z�v�3�f����o����{�3F
4P��%ekk�����^�z0`���������z���r�VH�Z�h������W_U��u���(ggg��SG�������5i�$��*V������w�yGO>��J�(���4�q>�����7
�����@J&sV)�_���~���'+666��:h����Z�j����s�Y<��+�fGdd�J�(������d����X]�xQ��W�2������g�;v�P������[�8ss���qL����/�zs�����q�(f��=��
��_[�`�����g,���=k�nnn����Z�h�r��)66V�������u��]���O��������r��e:�K/�����������8 '�=��$///���k����lllR�9r��|�Mu��]����.^��7�|S�������ysy{{�c��F�	��K�:>��#}������[��=Y�j��b�
���+SP-`2p@Npz
����5i�Du���$������s���F�	n@�!c���{V���!$��v��������j��eZ���_�_���BCC����2e��i������F�)''��n

???���Y�
�?2p��o�:�77Ym��i��67���
�9�t�REDDH��7o�
*dZ���9sF����w��BCC�a����rww����m� ��7�g��74i�$���)S2����U��m��C��SG���
��C����������q������%K�h��a�p��}���x)I���S\\\�^O\\��f������cHObb��f����dkkk�v�<�`k���q6�V�[���k�n^
�g�y�'G�Kd�x�Y5'�2e����l������k������$I���Z�fM���������*W������(�;V+V��$9::��_U��U�����O���^���.]*'''K_�$���N*TP�*UT�H�l@z<x���P]�zU����n�����+""B...�n��+x^��8 �������77�[(11Q>>>Z�d�$�f��:p��J�*��1��kWK�^x���������V��R��n����Qll�BCC���.GG+~k�����U�R��-x�4���js�tm����e��
dCdd���)�
�(,x^��8 ����qf����������
|�G��l�������j����uk��wI�����~����K�6n�h�
�rppH����������CBB�L&�llldcc��cH����L&S��.�������O�����������La���2����y��3�f���6 S��!m���l�/��y��I�*W��������=O�o����2��K��'��02p@V�=f�Y�����W_I�����c���Y3����������8<<<�� 8�����������$�R�J��c�j�����$&&���;���%K�����,�
��x8x�X��v�����k��\�����{�$I�+W���S����"d7����_4��
*h���S�N������w�y�x��w�<���F�n@�K/��/��RRR���u�fk��{�j��������&::Z>>>��m�$���A�&M�y�<��]v�n�0�2e����I��d�+�����O�������ysU�Z�x|��5�7N�����u��-Z�J�**V��"""t��a-_�\�n�2���������o�
��B�	n@Oa��]���l�[o�e�q�|��|}}�<��]�Y�Fk�����
*����V�^���/!@��W��sGXon��
���k��Z�n�~��g���_����u���������r���y������,GGGk�@�������S��q�����o_���7O��������{�I�v�����;[�!�C��x��X�i�L�l�N.����:7QQQ���0��\��N�>���ZA�^���ioo��W�Z�%�����F��1�o�8�t���7o���������kk����_��u�������{�q||�,X`��y����<>������Y�&��2e�@'���O~~~�n#_]�|Y^^^�j�M�6����r��Y�������T����k��IV�@A"�~|����7�������[@>������[7���������k���*Q���;�f�Y����$u��M�W����g�k�.�o����o���'�o�o����v�Ws��Q�o����~�i����m�.I����p��$i���?~��o����j��������
��c���{���/��[7U�XQE�Q�����eKM�2Eaaa� ��$�����I����5~�x��SG��O�/�����5K]�vU�J���� WWW�h�Bo�������L����3���v��]6l�*W�,GGG�����������%I!!!�X��������.��$wwwIRbb�����������QU�V��#t���L������;�������C�j���*Z�h��n��A>>>�U���/.'''U�^]�>���n���1����T��L&�J�,����,��{��\\\d2�T�re%$$d�E�#e����#OOOU�\Y��r�JEEEe9����qCBB$Ik����T�Z5988����g(88X#F�P�5���������#������W/U�^]NNNrppP���������?�{�n�}�l�R&�I���


��u��f��YS&�IE���;w��l��I��
S�Z�T�X1��F��_�~�9s�._���\����������;k7 8p@L��}[�o�������[���F�e����O��o��e �r�J�?^�o�N���t��>|X�}�����+�92{/�!o���f��)��l<���0j�������5��[�4p�@������

�����|�r-\�P��
������8p����'I�0a������d�Hhh����{������-Y�D������d������1c��(""B+V��s�=��|K�.5���G���6[��a�����5j�P���e2�4b�}��'�����+4f���|���
d�k��_~Y��y�5�����}��t�]�zUW�^UPP��O��5k��U�Vi�&L����G+11Q_���{��L�

J�:~�R��}�����!C�a���9y����_���}����<�����%�����@~�t�1t��qyxx(::Z���A�1B��W�����v�Z����������e6�5z��L����o(ggg����U�V�����S�T�B�n��y7n��f��)�~���c��*_������]�vi�����������)�� ;��~�3fH�L&��=z���Yg�������/_���D�����7���m�j����R��n���+V(88X���=z�Z�j��5kZ4��+4b����I��~�m}��GY���[���+��f�����[�j�����~��W-\�P.\�������7�d2c�;V��4w��,�9s�H�lmm��g$�|KI��'�����O>�D�������&N����@U�VM>>>�W��bcc��~988���>}�U�lY�9R�7��������Q#[[[�j�JO=�������%K*!!A!!!��q�v�����0���SG�U�*UR�5t�P����
�����y��L/bH~�%i��q��M�<����-�!C���'�P�����/j�����c����(!�&�&�N���9���x$EFF�D����H$Y"9��^����CdW��4������j���N�<)I3f�������.�z������ce6�����_~�E����jR��u��QPP��V������W��-�����][���W�z����>}Z]�vUXX��/�����������3V���c�:w��j���g��aC������^�V�R��}S�������[AAA�s#G�T@@@�������������k���i�������Z���K/i���ij������!I�����
�^xA���2�L�9s�����9�af�YO=�����+[[[������c����_���Z�|���� �����n�:II��Q�F��y��!=�������{���xv�h�B���d����U�zuc_��m�o�>I��S�T�~�������R��e��e�oW��P�\�6mJ����8 777U�T)����k���JLL������CJ'N���I������O�t��z���T����x5l�P'N�0�%$$�t�����P��5u���{���������Y��.H�m�����MV�;�q����_����!7�)
���Cr������["�~����K�m���(��������d2e���i�T��6m2��������J�K�������cbb��0�>�/_�a�.%�<����6o��n�.I���7B���(��7/�����_�����ki�wIrrr���KU�d�l�����n�.I3f�0�����,�:x�������D���j�������a����WR�{�^�.IZ�`�q��Y����������s3�3���s����:|��$�}����w)���d��������E�Y�+VL+W��4|���-[f�K���>�������e���aJ&L0�3{����/)��}��
ED$���d����K�
��������O��Y#������w�}gl�����������7�4V�Oy\z��o�i�n�0����U+���u���+J�����Lk��v�ZI����^~�����)�#Fdk����%K+��?^�����ml��WO�<���}$�v�����k��"E�h��a��3g����K��w���8'�/��{����e��I��T���={Z�kF���ol���
2D����f�g��Qrvv�����������o�^R��+��O��n�������t�Fhhh���l������s���dl'_�����F����������B(T��Y���%J�z���?�^^^�[�Z5��WO�O���K�t��#X�2k���JLL��'��)^���\��S�NeY���k��@�~���P�B������-�X�bj��q�5�+W������g:�*U������/�����l�bQx�s�NIR����}��,����cl�:u*�j�&�I����������p�X�B�����_�t����+I3fL�oX����Z�t�$�h���^|P�T)���W+W������q�F���?����<���l6+00P�V���C����(c���]�|Y-Z�H���	�}�v%$$h������K���~���%%]����������i�}��i��m����^|�Eu��YE������wZ���#���z�o�S��r������r����p;�`Z�������O�f�'��			1�`Y��n��mq�$����5k����F�����j������%e�|�54}�tyyy)""B�w�V����e�/^<�����u��MI��K�,
�SJ�=5j��N����X��;7M?w�\I����F������f���������%���#Gj����$�^kV����_�zU�
����-;222�����U�R%������_S�NMuQC��-I���Kw��������TDD�6l��
6�h��j�����k'OOOyxx���?�(����"���w����@n�X�y+**JR�J��H�y���)Z�h�����[4_z����Uml;99eYo�{!I66y��b�V���%KJ��������g�J�{?%���i�suu����%I{�����'�}����%I�{����[��������>>>�u����X$00���$3Y}sR�=z�{�R�����3fh��EZ�j���Y�5k����^2�KHHHw<;;;�3F����@c���W�~�zIR�&M��u�t�h����;���{����wO;w���i�������+���>3��x\��E����;s�� ��x�$�*�2�����w��)����g�l6g�';R�111Y�[�^���-[*((H�J����g��|?�7o��������M�0��N��%��gGHH��m�f<����L&S�?����z����0{����?'V�X�c��I��t����],�k���g�}V�������U�n]��|����U�S������������]�Z5������[���5m�4������\�vM���?�d�~�0!�N���O��#���
��c�b����Vs�v�Z��g��5�+U���y+W�ll����xK������Y�_�p!?����O>��[�!��}��������4�%J�0���/�Ym��Q�f�$I�-��{��e��IJ
{�w���y����l_X����?����?�`l��g�^�r��E��tssS��}%I�7o����e6�5o�<II���o�h,u��Q�&M��
t��
��3G�������:t����G�wZ��"���7�-;k7 o�n�Z�O���(�1"��K�.���3���U��B�
9��C�2�L2����e��O�����R�|yU�RE���:}���^��i�;v���^��y����m��v����o�������~���(Q"Um�N��i�&]�~]�R�-���	&����Wxx����[����0v�X���nm���D�_}��T+�gd���������o����~R�r�Gv%�B/I�j���v��-�;a��Y�F			�?���i���I��a������~�������S���#I������sX�wZ��������7�������Y�4|�p����[����X�{������\�r����6o��'Nh��e6lX���L�~���_(11Q�g����n���7�h��|�#'�5kf���n�������kW�d��F���#�i�&I��)S�y�f�L�\�?|�p����������s+I�����Q�r=~PP�.]�$Ij���f��i�q���z��W$I���/��X�b���s���a�t�V�X�_~���q�v����k���~����u��c��q�r����^����������;5������G�
r+w��(t�~�i5j�H�t��1M�0!�P.  @_}��$����>s���>R�"E$Ic����e�2��}��>��Sm��5�s��������$��9S���OS����+<<<�����M�j��m*S��$�����������c�4H�[����������R{z�e�}�����]�X1���H�������K������+��uII�y��#GZ|�����s�j�*EEE����h����=y�d%$$����c����l�k2�4~�xIRhh���[')���|���;r���{�=]�r%����h-\��x��i�l�f��"�N�w���@n�
��c���F�/V�v��y��i���1b����u��m�[�N[�l1��={��U�����6m�9s�h���F�=}�t���G�k�V��E�s��i�����s����s�B{��u��;�h�����������=z�x�����_��7�($$D����~k�?�E�&M�m�6u��E7o���C���kWm��U�J���d������m[���j�����i��y��h�B������UXX��;��� ��qC]�t��)S2�{�������S=�����u��mmm������c��)��={j����������5v��\�d���G��O>QTT���_�&M����G��U��;w����k��u������>���[<����&O�l��/e�~GDD���O������k�v���n��rqqQxx���9�e��),,L���Myzz�����7�7�w�����t�1��qc���C����u��IM�4)M����f�����G�������X��F����0=zTG�������X=��L������5Kf�Y�W�����S�:T�����/^<Gs���s����7n���������n�*WWW����������U``������s�f:f������A�����~��GIR�5��[�\��E����������|���:~����j������+WN+V���A��_~�%���������+%$$d+�wuu��!C�`�II�����gz��d�$%&&j��]��kW��;v��U�
�&@^ ���w����"���
������[��W��ik��m-[����g���_k��u:y��n��-ggg��QC��w����wU�T)������.\���K�j���:t��n�����X/^\���j���<==��O�,Y2�s��1C}���_|�]�v����*]���4i�1c�h��������zWW�<x�y�a��F��u9r��K�.�r��i�����o��,Y�]�v)44T���rttT�
T�~}�o�^�{��O<a��^^^F?v�X#��
c���'�����[����}������S�N�A����R={���c�4c���?�P��E����=zh����]���=�����>\�����w��I'N�PPP�����_~�E�/_Vtt�����'�|RC�U�>}r�r 2�G�7�wV���"��a2��fk7�����T�%!�l��/�z��rtt���w<j>��s������5k������
M�6��c�doo����l���������u�$I�V�f���Q�����Q���&�����7K�+���
dCn�S�=�d��!t�����`���o��72p���v�mS�3@�����9s$I���z�����Q��w�^;vL�4`���|��7J�Z�n������w����7
����u��u�:u*�����5j�~��I��A�T�l��j��2���:u��x����k�/���O			�x��E��3������;k79u��%�l�RO>���t���u����EQQQ:~���/_�+W�H�J�.��3gZ�c�9q�������sGK�,��m�$I�z�R�6m�������s:w������q�F-\�P���Q#
<���(l��-G�]����k�t���������^����[�J�*`W���Y��`��T��+WN_~���:z�-^�X���^�������7�����J](����F�]����k"��j����-[��#G�i��rss����U�re���Gs����3g��Q#k�[(������]�F���T�jUk��X3�Lrss��A�t���h���-(�������`���b2��fk7�����T�%!�l��/�z��rtt���������GZ�3���<2r��xT����js�8��������@6�&;E���sHn2p�8gd�@�e���o@H�t���t�$n@�?n@��BBBd2�d2�����'cv���'  �x���N*���Fo!!!�n�c����A�
Pxp:�t�]�V~~~���Sxx�����������_�~�S��J�.-{{{�*UJ5k�T��}��{�����Y��������,kL&��|�M��tww7������+d�7�7����
(���]�HJZ��d���m(���z����|�r%$$�����p]�pA6l�����x�	M�<YC���M���1{�l�����T�R������!����t�/���]f���m����`
<X7n��$����]�v�����U��R�J�����v��~��g�����s��~��
>\�5R��
���{�����Os���������+__��
�o�o�=n@�H;t��z�����XIR��=�����^�z��+Wj���:r�H��R�X1EGG���_��������gco��(,l������w��#|7n�6n��i�.I���>|�<�O?�T���y����%I			�<yr��	x���0�t��0a�L&�L&�~���tk��������{��[w������_O�/$$������j����L&�,X`<W�z�Ts�L&u��9���f����KnnnrppP�J�4p�@���3�c-���_*44T���ys}��������5���P�Z���=������Wk���y2nf�s�n���,66V�g�V��mU�ti-ZT�j���	t��E���w���O���-[�D�*^��4h�7�x�8'��Y�f�k���T������-Z��������q/^T�%d2�T�hQ�8q"�9�f�z��a����~��`���!�&�&��	7��������}��tk~��:OO�<��r���z��g4`�m��Yaaaz����\�����N�:u��3r5��l�g�}f<�2e����s�y�������?6����V�&}/^T�V���+�h��}�}��bccu��y}��Wj������3���j���&M���*22Rw������5c�5m�4��ezV�\�5j���^��m�t��=x�@w������5m�4��U+�E!��W��9s�HJ��
:T���Kw��3g�����$u��IS�L��G�C�m9���!�&�����
�����L&��f��o��q����I/��<yr�u��������=������������c�I��9sT�\�Tue���p���Gk��Uj����
��5k*::Z6l���k%I�&MR��m��}{�{K�����r��$���E}����8y�o��z����{�n���C[�lQ�=���$)22R�z���������>}��|���r��,X���+::ZC�����U�T�4c������S����$�r��5j�������(m��Yk����A���I�,{�7o���'���"E��_�~������/��w�j��]Z�t�bcc����"E�h��a��:t��������S�N��W^���sS������=)]���,Y��o�=���#��>�o�o����V��ik���*[���x�	�<yR;v���l��d2�GFF���C��v��i��=��g����/�...N�w��$�l�R������ys5o���%���K�����t�R������3R���F���~��S��l6k���9�w��el�n�Z���9'?L�6�������R���S�Gk9r������r�J
4(��^xA}����-[t��5}��7��?��f�I�&�{��i�&/^��?v�X�Z�JC��r%������_��lV����~�z��W/U�s�=��^{M]�vUXX����������5U�����g��9sF��������###5l�0���I�������f����x� ���w��������@!���)I�q��N�8�j���;��� I���$I�����gO����Y�����+H�:u���3�]a����2���� ����h���0c�f��9k4��o�^}���$=zT��-�rGz�������dgg���������457n�P@@�$�x�����oS���
���Y��������Q�7oN�'�_��1oTT�������X�bZ�|�q!���c����.H�^|��B�m�����2��9C�M�
�7��L��|�����%?�]��<==U�r�L�������p�s[[[yxxHJ�x����9����[�v��%3�=s��L&S�?�;w�Q�������N�j�>nM666z��W2�_�^=�3u���4�7m��H���
*d8�?���t/�H�u��I�����Z�je�{�n�T�bEI����nM�&M4s�Lc�a��i��9Z�|y�����e��������/n@
�N�:���m�R�K��t�"IF��Q����v���k��i��m���C^I�s�N~�c
6��#$I.\��9s���T�n]���fZ�|n�;/���7��?��X��4h�����w+11Q������k�f������S�27�
�{������%INNN�V��������������
H�d��j���:��;w*!!A����u���?.��U�=<<�h�"8p@w������bcc�o�>IR�v��8�)S&��){������K�6����3��\����Y����'Oj���9��R�����/_������>��������u��du^�?�������3��Z�=�&���%)$$��P@@@��%�}�v�����5i�D�/_6�����U�^=���{���!��>�o�o���t�J�###u��AIRpp��f�L&���{r]\\�~��'II+k'����Z�
���R�J�����3�uvv���w������w��Z��^x�I��������������y�{�������e}�b�2���E�����t����*V�h<vrrR���s<��#���w����G��{���������}���w���+W���g�vI��m�$i�����F�+yW�VM5j�H�?��q��Cc{���JLL�b7�<y�\\\$I3g���7��Q��\�>&&&����h���={��fs�~23e�8p U�#G���8k �����;k���� s���#G��q��j�������fdd���i��^{M�����M���G�q��:r��:�^�doo/)m���K�T��!��u���j��U��k
O<���
|DD�6l�`���W�ti�������(}���V�(������s��eY�YM���������5����[5}�tII��i�F��e�����z���oK�<�o����W�Z��'O����Fp�����u���4���uK������5�������eKI��={�3g�H�<==S�&?>z��.]���JJ
����r������<���M&�&N�h<���o��21q�DU�PA���W_)$$��
�P�:R~�@z�\����Og��C�2�L�����p��u�1Bf�Y666Z�d�V�X��%KJ��~�m>|8O���7@�m	���G�
��Bw��?�,���n���L���(��?_&�IU�V��5kt��Q=�������]�/�F�@�K^����{����$I������c���>11Q|��B?�g�����������	T�jUI�����+����+�w�yG����M�:�����O?�"E�H��.]�k��eX��g�)!!!�����S��=%I'N���e�r���l���#u��UIIku��IU�V��y�$%��C����ws5�����$��Y#�.X���+t7������f�������XI������_?5n�X_}��7n,IZ�vm��
���z@@�$�e��rqqIUW�B��_?U����D�������j�������;9::J����K���W���k��%$$h�����a��1�U���������:^([��|}}%I�����k�����~��x}����3&��������O�u��4�>��Sc%���zJ�����o��A��Z��������g�@^ ���g���`�d���
<�������+�����?��t��j�3�<����������$P��k'��?�U�=<<t��i����UM�6���]�v5��x�
]�~]u������1G�V�r5G^h���6o��!C������q�6o����zJ�:uR�j�T�dI�������:q��f�Q�r�|����^~������D��w/��������e�]�tI���j���F��z��)**J�������T�T)5i�D������iS��3G�G�VLL�������O�>�]���-����;wN������;�E�����Cz���%I�J����Kekk�����>��]�t��)-\�P��w�������H��HB�m���E�
��BwzDD�$��&������W&�)M�.IU�V�$��q#
������m�*��(������_~i<���S��C���Q#=���Z�x��]���_=��N�:e�$:tHo���V�X������O����2=�a��z���4l���s����>}z�]Q�%K�������G�;wN������KU�����+Wj���Y������+j��Q
���Gu����T�L����w5t�P=x�@�4o�<��AJE���+��eK���j��	j���j��a���o 	������7@�r���'''Ii����cu�v���9���Q������'e�������z*�:�L�t���h��y���T�r�����*U�h��%:{��f���>}��f��*U�����T�dI��QC�{��{���C����>|x��.?�L&M�6�@��O5k��������K��7W���U�X1��WO�����=���`���u�����k��A�^�����egg�R�J�Y�f������u��U����8v��	:w��$�������3��a�����O%I���6l����r�.d���������7@�Lf��l�&Rj���N�8���k��e��K�,��#d2�t��15l�0�q_}��^x��)SF��_/���*22R%J�PDD�\\\�ulll�.^�����1��m�����MV�;�q����_����!7�i~ �����Cr
@^�ogd�@�e����}z�d6��~�z;vLR��4}�tIR�J�����t��IIR����Y2@�
x����+����U�Vj���j����'O�d2i�����}�v�L&5n���; -�o��������qc����2�������t��-��f5j�H���z�cN�8�3g�H���o_�-��7�Qdg��3u�T5i�D�����s�T�X1yyy��7�T��E������$������t������)�7�KR��}��o_�j�����s��sGd�7�Qbc��7�$q:���Y���:tH[�l��S�t�����fy��d��m�
�;,C�
xT��CBB�����~�)[���f�L�|�
��!�<j
�
�7n�P���u����fk�@��E6�n�a~�����$I
4��E����X%&&f����`�W�7��T��}���2�L�_��~��g+V��-�m���GQ��������y�w�#���(*t7��.]Z�T�R%+w@��E���
H����+w@��E�����G�l6k����n�#�<�
�
����O?��{���O>�v;��7�QT�n@7�LZ�|�z���)S��w��
��[���#�<����@z����h�"u��U���
��X������|���5���%i��m�Q��>,I2�����������d��dRpp���r���75�����9��}����{��VtwwwW�
���`����a2��U��S'B�B$88X�,;7QQQ����Q������ ��_?�;-x�z�����%Ivvv


U�
��@� ���u��#���Bw���{���d2���W������������7o�g��:x��$�v��


R�j���Y����?���������`�M�4��]��o%������Q�n@��k�L&��w�����[�����Y�eM�2e
������'???k���._�,///�>}Z���iS}���*W���;�JHHH����?<xl���?�����������~��UI��A���	P8x{{[����~�M��u����.Ij���6n��%JX���a6����/IrqqQ�n��z�j�={V�v�R�����!@�#�R#�~<�������xX������V�����G��}{#|�����?<���$�������k����>��<���<�������������ukI��3g��	���w�����u��M+VT�"ET�ti�l�RS�LQXXX���d2�d2)  @�t��a�?^u��Q���S�K)""B�f�R��]U�R%988���U-Z��[o��?��#����������3���k��
���+���Qnnnz����z�jIRHH�1���o�c����d2���]�������yxx�|��rttT��U5b�?~<�~���s���~��$i���Z�v��-���6l����j���������I��W���>��[��{L||�*U�$����%K*&&&�y���+�L&U�\Y			�{��H�������S�+W�$�\�RQQQY����k����I���k5`�U�VM����
��#T�F
999���:r��>��c���K��W����T�bEyyy�?�������a�-[���d����BCC�|]f�Y5k���dR��Eu���45�6m��a�T�V-+V���Q�F����f�����/g9(X��@�!�&�&�&�������/HJ
�bcc��
��:p�������^zI[�n���W���o��������T�vm���[<������U+��3G���[�!���+U�F
���k��m��\�����;:|���M��Z�ji���~�o���:v�������?��������@
4H��
S|||���u��<==��s�)88X��_��������E�Z�lY�{
����"""$I&L��%Kdoo��q���j�������E������{��������-Y�D��u��A���vvv3f����"V�X�e�K�.5���G���6��5���p�b�5j�}�������#$I�������4h� ���_k����K�����L�y��������������w�^����_��7�����y�f������{z����^���� M�8Qu��������g��	��.������|-AAA�V�/U������{����z�������������1�9y����_��_]��M�r.P�����A�M�-��D�
����xX�N�4i�$M�6M�
���K���b���G����������hIR�
4b�U�^]�o����k��?(&&F�G���l����3��o�U``��������V�Z���^�N�R�
��y��i��q2��*R�������;�|���{��v����K�*66V���*R���
������j���$����G�rvv���g�������+11��1���5p�@����j����*U�����Z�b�������G�U�V�Y��E��X�B#F�P\\�$�����G}��q���j����\�"Ij������U�V-�����_���u���^�Z�����y�L&�1���c���+!!As���s�=���s���$����}n$�o)i����|}}��'�H�����5����j�����G���Sll����/�4���OW``���-��#G�q����V{O�7&&&F���j����z�)��SG%K�TBB�BBB�q�F���[aaa�����=�*U���k���z��W.���;�^���~K��q�R��<y�6l� I*[����'�xB�K�Vll�.^�����k���w����G�M�M���7(&��l�v)���S�����W+W�T�r�4b��i�F�K���M�_���c��n�P���T�%�����������1�:Dv�O��+����&M�������1c�������R�71�|�;Vf�YNNN���_�����&   UX[�N�j����}��q�l�R<P����~�z��W/M������kW����x��
		���k�???���{��;v�s�����={V
6T\\�����j�*���7UMLL����d<7r�H�����]����������&N���n������/���f����&88X��.*6l�^x�%&&�d2i�����?�������f=��S��w�lmm����Oc��MSw��}���j�����.�x8������u�$%��F��;��C����OJ�z��m�����E>|X&�I���W����}m����}�$I�N�R���3���7��x{{k��e����3�<��M�R�������M�*U��f���w�aR�w���Y�T*"vM4����W��5j@�G�7F�FM4��hLbCD,��������h�"��!H�2�|LX�e�����<�=|f���f������~��O�=2{���p�	���'?�I���?&I����|�{�[�X�~�i�[o���93[n�e^����Y�f�u���0aB6�h������}���y�������.�����Vd���oe�{T���6wzM(����&;]���oi����������7���N������M�W���E����^{�����;w�uW
�B>��������G�N�:e������c���~	P�
�B�?�l�M�����J��w�������/|O�N8�����)SJaaUu8p��{2'�������q�<�����d�-�(��_}�Un���*�^�?��O����>�����$i��I�UW]u��������$���~W
z��E���K/��SO����S�^��t�M�
��������a���yo�'I�F���o��(���������?,_�������������W^y%I��n�U
��9_���w���w�u�M�~���6m�4w�yg��{����U��Ir���������m��V�����N+W�~���;3g�L2��=f��L�0�f�u�Ve�-Z��U�;0��*�/�������&���Z�=������o>����������Yg��z��-�������v��������nU|���/�0��k�l���U���>�d���N�<��#U�]�{��7IRQQ����m�����?��b�]U@�����vH���2m��*��<yr�x��7���^�:��v��Q�*_c�4l�0�����$o��vF�]��>��S�&������S������m���$Yo��r�T�������J����sy��i��Q���[nY`�� ={�L�f��]G�n�����V������nI�|ye������l��J_{���������X,�v�o���|��&M����~��{��������������eo�m����/,w	P��s�=U�o��e���?�|�x�}���������7�<o��VF��O>�������^�XC�������	���Ui��y>����1b�m���g���-��"m������{��k���Zc7m�4���w�l��m�$s����W9�z����'f��	y��7��������Vx���O'I�Zk����_d�/���t<b��J��
��r�)���~�������o�q�W���2i��$��'�X��7�c���0`@�d�UVY��V[m�|�����;������H��]9��>�K��X,����]w���_~9~�a�����N����Ge�������N;-���3k���t�M���W���>�h���$s����?�-Z���;����{.O<�D>���q��k����a�j��|��P��{~����L{�7��,@�Z�K�.����O>I2'�^T0�$�n�i�z��R���sC��5jT��O�>���O�
N2n��j�M��?��t��F-���nX��[�jU�a��X�d�;�o�����o�}��7&L���C��~����N����o������/�$�G��V(=���={������i�������/������$����	'��X�-�=��S��k��i�������#w�yg��w���z���<.i�O?�4�vX�Z��'N�����t��u�Y'�qz�����?������Ir�)�,p�k��6;v��	r��������*���v�!:tH�����{�~�Z�����I�=?���������X�.�Y_}�U�9;�W��;���� ���J���?�Z�-��3�����K�M�4Yd���IRQQ�-����y�������&I�}�����~
n��{?��������V�Z��#�H�6,o��F��K/��W^y%Ir�Ae�u�]������n*w��}����o���Ez����H��������9sf���R���j��{�����~�~�������=���{��'?���J�f���������O<1I������*����Os�}�%I��z����Nc����k�����?��9�:uj�~��\v�e�w�}��m�\u�U�;0��B�=?���������e:�`��*>oH]�I�&��wI��_}��)����8�
��L�����}/��v�!�=�XV[m�$s��B�y�����n���o��>�i��V:�w���F�8F��'�x��x���O�PX�O�
����&�f���w��_��~{^{��$I�N����o��9���s�����CM�.]��K�l��f����O.��>�{��w���93������_?�{����c��SO���.�AT��|��g9��3kd�~�M�������{������V0k��v�9����g�l��;����Yg�%��m����?�p����y�|����~������j��w�����?��s�w�}3a�����l���~��G5V��;��m��6I��_�L�:5_}�Un���$s�����o��������s���{��_�>�h�������)���~��\w�us��'I|��|��G)�������2�1�S��5j�=��#��sN�����3&�]w]4h�$���O^~��j�u��{~����/��XZ��]P�v�i����[I��?���v���y����$���K�6m�x��w�=�B!�b1?�p~���.�X���Zke�����~���z+�~�i��?���������v���'�H���3n��<����w�}�����e��������������?�</��r��~�����N��'�������;���i�Jw8���RQ�t{���=;}��)=>���*�h�0����������?�������KU����}�l���U�}����=�i���{��'�f��M7���w�9�F�J�|���O�-��������O��#��?�1I�����>'Pn�����+�/��XZ��
��C-��W^ye�>����Wo�m/����.��z�R����k����>��_=��v[����/��U9��C��?�)�g���W_�_���l��_�_�~���%�����B��c���^H�����c�e�UW-����G����%I�;��<���)
K=��G����g�0aB����L�6-IR�~����s�����2z��$�w���\q�����U�����o����nZ�|��MK����n��r���������oV{���;g�M6������t�M��?�Y:w�)�,y���lP:�9s�R�����2�����&����m��:��?�����*I��k����N[`(��O����M�4i��|.�K/�4
6L��x�������l?n���������?��s�q�i��A���+��}��7_�)S���������{�em�m��O<��W_=I��K/�s�����/Km;�����NI��8��{��N�2k��<������K���i�����{���g��+���$9������k/��J���s�������>���5������W_-u-�c�v(������Y��k���O���O^�q�BN=��$��~���'�s7��~������3]tQ>������<yrn�����m��f�j��L��_���/��XZ��+�������?:t����s�
7d��a��~����g��q<xp~��R����:����R���6������	'�P
�����{��^6�d����*�0aB�}�����y���3s��%��}��6�\���??3f�H�.]��[�����i��y������o��Q�r�G��;�(�?���[o�'�x"�:u�_|��_~9�;w���?��V[-�B!�
�.���?�0��������~���~����U�L�6-�q^{��<��c3fL:u����;���O=��\s�5��������[
�����c�9��}W_}�p�����2y��80'�t�R�T]'�pB~��������}������:��w�����/��2�<�H����{�������>�����_����~���{��	���W~��_�C����C6�l��h�"�����o���n�-�q�d��wN�����@-$�������XZ��
�;��N�|��t��-}�Q�x���s�9��k��I�����p�	56�q����^;={����W_}5����B�7j�����:���2a��\y��)�4hP
T��QG�/���7o�|��ZV�^��;f��1y��W��S�<���i��U�]w����K9�����C��/����__��m��]���������{����J�l����g�}������/_�u�d����Zk��X�{��Q���w���5�_s�5s��������)S���o����I�&��_��Y�f-V��U�y�����o�9����>��>�B!I2{��<��3y��g�v�=��]w�U��`5A��_����O�
,-�R+�v�!���N����t��)k��V4h��V[-�o�}�=���������}����/#G�L���s�a�e�
6H�f�R�~����j�v�ms�q���[n���~���������~���z*GqD�Yg�4l�0k��v����u�]����2a��R�V�Z��K�Q[n�e�|������I�������S���dN0���f��a9��3��6��u���W�^�6m��6�(tP.���������O���w�}K�'�tR)�]�{�.w��}��t�A�k��s�e��K]��8����k����O�l��
�e�����������y��W���`�����>�����Y�*�����y�������>�~x���o�E������������}�����z*k�������[��(�������Q(��r���8qbZ�l�	&�E���w��iy������q����B(�k��&?����$��sO�t�R��j�m��&���Z4h�?�p�wkg�t��%�N����+�v�m�\���w+�������=�q�w�\�zMXt��&;�vX�k(�`E'�^0����2����-��d�P{�;�vt`�6c��\w�uI�
d�]w-sE���a���k�%I�u�&|_�>���<��I��v�i����'�^0���%���CY�o��F9�����SOe����,��>����1b���M���={��7�L�v�aYc�5�Wy�V�X����_z�����|��$z���Y�f%�~��J�
,
����/�oX9�/�����~����\u�Ui��U<��r�!�����*���4�=ztv�a�|���M�N���f��E�����2|��80�|�I��u�����+�\q���������/��2��zk�x��$����w�����x�}��������������[nI�l��V9��#�\�,����!��>���%���SY�q�y���3q���;6���K�~���q�t��)�rH>�`;6Uz�����K/-��l���g�u�Y�U�.W^ye���[��5�\3����T���������*=��I��|�����(SU��$�j��{������VNeM�1c�����i���u�Y'�b1S�N������|��Yg�u��n��w��]�����\���j��r�m��G��f�m�����q��i��q��m��}�{�������og���*w��B�z���}����3/��b��kW��Vh�B!���n;�������~���]������!�^|���K�
+�B�X,���y���K<xp�7�x��|�PH�l��f���K9�����N�*�V�8qbZ�l�	&�E���w��iy������q����BV&~��"k�+���]���kB�����4��� �^|K{
��4�[X�����*w�]�;�/�w���\|��>|x�}��\y���c�=RQQ�b����~;�_~y:t��u�Y'��zjz��|���52�W_}�A���3�H���k�A�i��E6�|�t��=?�pg���������g�r�-��e�4k�,�m�YN?������5R7�K���D���uw@_��c���������{,S�LI�����5k����/�rH<�������=����������i��v��wO�����]�*�]����O~��S�.�|�z�r���.X�z�rtj�[X���j�r�_]�#�N�f���6~��"��C�U����r�q	�n�:=z�H�=2m��<��c���{��d��1�]�
����g��wO�.]r�gT{�w�y���������s��~������6mZ�{�����?�&M�?������^y������k.p������SNI�TTT����J�N�R�~�:4}������s���Q�F9��s����V[�w"`���;�/L�X���>�{��7�����[:WQQ��3gV{��N;-#G���g��N�:���b�6|�A��o���_�J�������|�����7�8'NLEEE����|����<��s���S�L�������7��f�mV�z�rtj�[X���j�r���j2�N�f���6~��"��C�U��{�t��)
�u�]����.���N�|��\z���a���k�/���<��#�g�}�'������o������o��)S�kw�Wd���I��O?}��=Iv�y�\|��I��3g���.Z�zaI�5*�B!�B!�w\����^{��_M�������j^�_��M[l�E~��_������������U�j��z��K��O�2����s���y�����NJ��M�$��w_�N��8%�2s����W�^���W��_�r�O�>��q~�t�2�X�~)�}��KT��c,����������o_���;�\�Z����7O�^���u�|\u�U���W����r��K�'2p�K�����,
�7�}+��y�i�f��=������1"|�A�9_�`�
:N�������'I&O����zjT���{��E]��.����+���>#F��V���{/�j�iW]uU.��"<�@�2�Nd��������{�&����~����������;�����~�����z�x�vX�x;��C~��R������*�k��}��b���Q{��w~��W���k����I�Xc�\���j��A�E��_�~f�����{��+�����Y�r�-�T�#�.����y�/�d��	I����n�����������}Am��[[]{���]�rw�_;���]�v���K��(i��I���?��?�������\v�e�_�}?��������$x`\cu�������]���%�(���1cr�9���w�y��?~|�x��W_���[�^`���>}z�O�^z<q��$��32c��E����3R,3{����={���LV��f��������y���9����xy��0�w\����|��g����s�!�,��M7��d�N����_)�_������_���g�X,f���W�^�����^���:��q���bfPP.���R��&����d�����7�o�7��"\'8+28�^���-@__�u=��|���I�.]��k�����4iR��q�E�%��*�������E���o~��.�h��}��4i�d���U�~��i�&�&M��_�X}W&s�������?��7��$y�����F����'�L�n�J�y��������{��W��S�$�g���/��tn����z���$������?��t��?�an���Jc-��]w�5<�@����3K�s��x ��rK�x���;6�Z��;��SN9%���k�D�L�6�t<c����N����={��Uc�k��C�Y{����'���n��{���>c��-]�#�8��/������gy��	���w}�����{?~|Z�l��6�(���oN8���l�r��/���\~��I����?���[�~���|��y���2f���h�"�l�M�=��|����k��Y4hP|�����+;vl
�B�^{�t��!�w\��v���0`@N?��$���^���>:���Z����������2i������}��<��#6lX�z��|��g������e�l��&���c�?��J_���w���|�����|���s�9'���7����z<��3���_���|����:uj�\u|����:uj�~��J7��������r�`�/���onXS�L)w	uJm��k2�Nd���<2p�����O�-��
�w"`�&��������4{�����3���?��	${��]�Z~��_��?�i������z�e�}�M�-k�i����?L�f���E������Kj�}�-�/����������^x!�;w���/�P:���+��f����4hP�\�
�Uk���+��_���4l�0��w��A�*����Os����������_���>�Zs-����o���5�{RQQ�Dc������(���j���{.���<��c�:uj�Zk���������r�)�����Q�FK]��>�=zd��q�����/��_�������^��}����8F�F�J�M�4��~������f��1y�����c���C�m��V��7���9��#���o�w��w������[n�%��~z���?,0������q�\w�u��/�Y�f��n��x�-�����_`Ms��a����k�I���s����n��\�]�eq=�?����O��]�&M����6mZVYe����~������#e���F'�m������
�aym,�"�-xM������G.�^<�o��\����'2pVl2p����[�^
�b1��zjn���$I�v�����g��V[`�yC�yw�^��S����7o����5Z`��A�j��s��5+�B!��VF������S
�B��b���N;m�6O>��|��;����k��A��s�J�a���������M��]s��W���������kV��W_��r�I'e��A�r�-���?m�Q&O�����?��{o��������C���Q���zK3��/�1���N���_��3g��[o]�����d���[l�E�Z:����#�<��]��v��i��r�QGe�u��'�|��������q���k�<���o����P(�������}��i��ez������>�f����C��o�L�>=����;�:���?��=���t���w�=x`�_���=;��O�>}��g���k���3r�u��7����]w���z(��5K������;�A�1bD�Yg�R�i���P(d����{���7�<�Z�J�|��Gy������g���9�������f����4���_�)S����O��1c��k������i��7�T���W\qEz��������G�������UW]�������
�%�����Y�E7ZF�^t���&�o}�
�]�zjS^��w"���������[����kc�=��������C�U���}��b~����nH��m�6�����}���Yu�UK�_|��"�;v����Yc�5��o;o��F�|����J�������/'��>���y��g3}��J_��1cF)x�a�*}!dQ��n�l��v��<��3}U��o0`@~����w��]���g�����Kr����X,�����R�+�M6�$���[�y���|����/��b^��$s���4i����������+\pA���������+����2s�����#������R��w��M6�$�����m�����w��~��t��1c����w�����������)9�����W_�I�&8p`����Ujs��G���E�v��'�|2�_}?���9a��z(�n�i{���k�n��v�}����;�x��x�������?�C9$S�L����<���������I����'I�����K����,����Ce�]v�����J_0��~Pe=@�!gy�S���{.�7�N���B�X���������I�u�]7O>�d6�h�*�m��f��������f����:v��$3fL)L�������Y��$_|q�9;P?�����=����<yr����=��3W\q�w���/~�u�]7I��c������o�
�j�2�F���|P�zz��U�qO8��$��#��s�U:��w�$I��Ms��G��kI��o�9�}�Y����r��V
{�9;�_t�E����$�}�Y�������w�Q)|�k�-���7�Xz����v�67�xcF��d��
�����e��y��i��E���+����B���V�'��������su��9?��O�$O<�D����T��:���h��i���������d�,o��%#������Pn�/����/�K�d�u���O>���%I��j����/�������r�-��ZV$�����+���x�M6I��K����}s����3��/��^�z�{�������{���<K��?����7�|s��i��e����6���u�}����s�9�����{��-�����m��f��>����������������d����>��*�j��u<��$��!C2}�����m������V9����N�����XV��[�n�/�+8� ��*�o�w"����~����>�(#F���q����_�{���t�o�k��v�|��l��&����o}+���������[oe��Qi����N�4)���?�$M�4��{�Y#���k�=�LEEEf���'�x"?��OJ����:uJ��������_�����v���]�����C��W����.�Ty~��������s�������j�]_rYc�5r���W����o^�q�6m�#�8"7�tS����*���J
����'I�?��%)y���b^x��$s���7L^�]w�5M�6�������/f����@2gw�E���s���%I^x��l���I��'��W_M2������o�c�
��M����������������3����n�/���#G������3����>Z���iY^��}���[��w"�|��KF�-��/����Z��w�����+���oWz�����^���z*���^n�������3�(�m����O>�M7�t��8��#����.I����>W_}��]���<yr�9;7i�d)*gE����f�m���/����~:�f�J�z�2v��><�wu�������4iR�5k�i���v����C5j��_����^��yk�6mZ����]�t���F��	M�4Yf����37�tS&N�����+?����w�$��o�=���F��8qb�L��$�h����UQQ��7�8���Z�N������U�Vl[�/5�����?.����={v����^J��]9������s�~I�*�&M������W{��'V����/��Q��
,�r������/���[��`�oX~��W�2�:uj<���t�Iy���S,K?���~7�?�x������zk�����~�?���I��C��f�m����}��i��y���k�]����?�|�?��$I���s��.E��H��'N�K/��$2dH��b
�B��{�J�f��Q�����CK�\�=��-*d�t����s��7��Q�F��'�LR���'�W_}U:n��i��4k�l����:���f����x��������[e�U�5��GY
��������&}����w��{��'��sO�;4��5k��^�������r������S���o�7�6�����w�C=�$i��}������/��_�����g�}��k��/��<�-��b��=�����?�)IR(�����y����o��vi��]���\s�\s�59���2{��t��5GuT��g���W/C�M��}K�__t�E�@
��{����x�����N�����$�j��J;������p�
3r������Pj7wVL�|�9��2$\pA��b����=z��\s�H��t��E�4i��Su�����c�*w��-�
�Vm5e���y�����s�����M�6l��A��wY^���+�Nd���oE�-�N��P����O<�D
�B����:*}��I�
2x�����g�}2`��<��3���~�Ds?��3��b��_����w��7�������=zd��)��O�i��e��0`@�6����/���{��KT3+��w�=
4��3����=��{n)X���S��{��w)�OR�o�f����;.��Yn�w��_����9sf����$�w�}������\-Z�H��M3y���92�g��r����g����K2gG�UW]u�m�}��E�?o�u�Y�t<�k���9NM{��GK������'����_c�.����r�����A��������o�}�/�e��O�$��nX
��c���N�E�����v�i>|x~����[��V�7o��M�f�M6�����_|1]tQ����i��Yv�a�$���>�Q�F����N�t���R���_}���=:/��R�9!~��K�����^�X\�qX6��i�8��s��2��P(�>��'O���C�l?t�����;��C���c�=�������N;�T:^}����o;I��+����>[�X5��O?-o���U��{W���}���mY^�f�h�w"g���Y���;�@mS��~���)
���{��������,�!C��X,.���v~��&�l�+��2o��f&N��I�&��w��_���l���K\/+����;I2u��\z��I��-`�=���nn?{��\|���9sf���T�f�J��'O^��X6�8�����N�i����^{��CYfsz�����/�����]v��-�c�=����/��������O��n�l�������#I2k��\p�U�U��6mZ:�j'�a��U+���g�:����jV9��DN�!�fQ����D�
�I�[�>w��6�l��5n�8I2m���	�a�}��v�a��h��R�6m�d�-���������A�+���Tc�l����y�����s���'�L��
��\�w\�Zk�$sB��/�x��.���<���I���Zk�����5+GqD>������1"'�pB��������~��i��}������9���3f,t����:w�qG����*������'�E]���?���a�V��(��37v���=�����z5K�
s��Y���;�@mR��|S�z�����zq�7.I�����tIP:tH�F�2}��E�����{����*�k��U��f����s��������������f������U�����K5GM=zt����j�m��A<����?~|�;��j���o}+G}�|�O�2���$s�a��-��~yk��Y����<����C=�#�<2k��v>���80��
K���_?}��M������C��A���o;'�pB��n���5+�>�l���S
��u��#�<r��M�4�}���=��#����o�����?�vX��z��h�"S�L��~�W^y%�?�x&N�X)�_R��uK�v�2z�����K�l��r��'f��7��)S��SOe����1cFz����}�V9^���s�}�%I�v��SO=5���n**�����g��7N���P���0��{����-������7���k��VF��w�}w������I���[oY��]�����.�d��!���w��1���K���s�Rh����j�{�����>�����g?�t~�=��T[�=���y��'���e��?~�B�O�0!�^zi��:��C��3&]�v��I���s��4�����~<xp~����/���a�J��V[m����/����"�<��3��}�\y�����+���C������1��j����K9��c�������?��W_����B!����"k[�F����������/��"�G��\P�M�z�r�e�e��vZd��g������o��W^y%'�|r��^xaz��Uz�,�P���0��{����=�we�o���.�[:t��b��X;'O�<9w�yg
�Bv�m�eW,g���5������v{��w
���-��}���nH�����k�vg�u��f�������]w�5���z�����W_=:t���^��#GV���7]q�y���s���g���K��
��kd�����w��{��7�7�r��6�(�=�\y���x�������UW]5���K��������[�n������{/]t���I����>���Yg���6�,�7N�f�������SN�/��s�9�Zc5m�4�=�\.���|���M��-�E�eq=��#����S���+��*��b����<��>8�B!7�pCz���$<xp�v��B��Y�fU���{����?�B!��
��;�X���f���i��e&L��-Z,V�i�������l���k�kO����Y�����	���W�^���'��^{�U���qK����������=���w$]nzM(����&;]���oi���zd�P3��+8+28�^���k��:������)�9��S����&�&MZ`����9��s����P(��X��wj'�7uQ�r� ��~{v�i�|���9���r��g���*��a���G���?O����k�.}��)S�0?�7uM�\���z�������G���{.��M����S(�$���J��b��N;��A�e��W/W�+������%�	���OPYE�X���[/�>�l�n���u��)���f�����w��a��e�u�)w�0�7uI���������{��^�d��)?~|�5k�-Z��2�>�7uA����4i�$���������W�n{��W��(�7@�'�VTuj:���$I�����|���y���2b��|����6m�"�
��t�M��:��7uE�\����_��3���2k����/���5jT6�`�$I�=��O��T��o�>|�A�_��5�������&���M.Z���uCE�����'g�=�H�~�2s������Vl�f��������8;��C��m�UVY%���J�^{�����9���3`��|��WU�5d��
�
����^�lS(��E��3f�u���������[��
@'��"����uw@�������o&I�Zk��q��}����M�4j�������o���W����#x��O?���~�_|17�pC5j�=z��s�����_#5|��W���K��?��F�`�%�F�
@mV���y��I���[//��B�Zk�2W���i�r��'�_�~����i���;g���O�����a��3&#G���O>��^{-��O���_��c�������z������3�L���kl���5j��@���$��\�`����|�A
�B�8��;�$���{��9��7�W\���;.
6\h�w�}7�\sM������i���<yr����������$��I�
@]PQ���E�I�
6�������W_]
�W[m�<���9������d��7�������k�u�]k��<0o�q�d��>|x����I�
�K�
@]Q��o��&I�1c���(�i��e�������:d�5�H�
��y�l��&��~��{l�����+�B!�B!C�I�����9�������q��i��u��{����'�g��V}�?�|�9�����zi��q�]w��������;��e�g�������K�o���l����5�f�m�3�<�F�i��A.���$������_��F�]�����P(�}��<_W���O?��O>9[l�EV]u�4n�8���^=��4(�bq��~���^���[����?R�~�
�����������V�� ���\��9���o�n�u��w��b��������@�|�[�J�.]r�5�d��a���/2s��L�4)���n����}��7]�t��I��=���_��v�)}����������g��q2dH�?��z���9sf�c���+:t����Ge���������#���#�����3f,�[�$�������$��[o�C=�F�]GqD��~�$��>���~�����]�����{��^��s��p�
y���3a��L�>=}�Q����v�a�k��J�{^W\qE��z�$������}�.p�q����c���Y�R(r�-�d�5��V������s���Lm���o`eQ��|S�=r��7��GI�����/���L��UW]5;v���n���_?M�4���3|���~�����O2x������Z;r�p�
0`@�Xc�w�q��w�����<������3}���{����o�s�=w�c���E]Tz��k�p�i��y�z�����;w�uW�w_�G}�t\[�.(
������>�$I�9��6��U�Wm��'N�����#F$�s���?<[l�E6l��#G���n�������O�s��y�����q���5�������g��)9��3��.�d�M7�4W��=���&I~�����@���A�=��{����,�V&�nz��
s�}����q����{.��~z��b�r����7����;�A�<�����c������;��3�<�Lv�m�*�0`@��s�<8-[�,=��G���O�N�2k������g���
V�?r��R`[�^�80�vX�6g�uV:���}��K�����3���;t�P#c����;�s��y�����s���{�I��]�]V��w�O9��R���W��w�y�W�^�6?�������<W^ye^{��\r�%���K*��|��s�5���N��I�r�QG����+���?�)�N����N��(�7����/��v��������,�Zk��g�y&�n�m����d�-�L�-��}�l���U�l��F�.�����=I�4i��}��i��I��}�.r�V�Ze��A�B����s�R���_��_�������L�6-Ir��g��&I�-r����y����gQf����?�����������R(�$���/3k��2W4Gm��������$'�pB.������$����W\�]w��T�����k��g�u�QI����9��s�$���Z�>��Rm��v[���u��+)�7+;���{I���,�V6�r�o���|�;y��W�$�b1�&M����3j��E����E��j���$�=��"�w��=�[�^��}���t��o�w~�n�9��3:��k��c�=v��,��q�*=^u�U�l�QG�P(,�g��!K]����~�~��I���z+}������Tm���~1��?�y�m�9�'��	����/��u�]�
6� I��?�1w�qG�:��R`?�y��@�
�&��L�=Gm���o`eS����������{g��q)�I�
�u��i��Q������/�������~8o��F�����'��\����>Z�x���K����m[i�y}�������$�o�y�Yg�*����S����,�����K.��w���3g�W�^9��c��q���T����O?�$i��qF��#FT9�������#��{���E�8p`v�m���1#Gyd���;�P����U��~���e�������~�o�7��j���.�,c��M�PH�����W����N�W�^�K��f���9��2v��j��8q�"�����U���.��M�t���?.o������:m�U�V��?>k���B��}�������w^�|����ea6�d��x����_���>�(�\sM~���-����6]��w��6mZ�v�������;�k�w�%�\�s�9�����o����z��X��� �N��K�6]g�7���u�}��
����Ny��GR(�],W��
�a���3g&I�����s���x����j��Q�F�?s���g/r����%�i��I��&M�,�}��M�x������5�\3��y������2���w���~�����������E���r�-�d��)��o~��N:)����2�waj�u?~�����_Wy~��6�������@M�����!�^2��:����M�[���G%I�w�.|g�t����k��6?�����K/].55k��t<e��E��<yr������g��AI�|1�C�52nMZ{������$�������_���/�o~��r��Dj�:7k�,���O�V��}7������N8��sW]uU�t���v����XZ�oVv����/_�o����[/#�Z�J�����e���3fd��!I�������=IF����J��:����}��E��N���w�}K������1������i��u����c>���2W�dj�:�m�6������]~i��=;�sL)����[
�Bf���c�9&_~�e��P����������/�7���u���v�$���#�\	,_|�Ei���7����/��b�����QV�\s��o�>I���o/2`~��'jd�c�=6k��F���W_����[#����-[��s�M�L�:5�z�*oAK�����{��dNh��#��H��^zi�z��$I���s�]w�'?�I�d���9���jd�� �fe&��L��|���N�[�~��'�X,���)��.���M�������^�����k��I���������>����Z#s6i�$��~���'��#F���5���OO�v��$�{������2W�dj�:w���t��_�*��M[���y��\t�EI�|Y�_�~)
������v�%I
����n���)�oVf��������`�����rH�=�����9��S2k��r��M�-����&I^~���u�]���5kV�<��<��C���3�8#�7N������=��3_����*Gyd&N�Xc���G?����$;vlv�e��x���1cF�������?���:�Q�F�px��Y���k���5�&���;�X�v���!��1c�,�}�X���Cs��g�w��/��1��Y�f�P(�O�>i��M��a��8p`�5k�$9��3k�5��������{~���K�
������o=zt.���L�>=7�tS�
�SO=5;��sZ�n���E����3�E?��O���0Ir�G��#���{���V[-���nn������[�r�-��Q��������
7�0��������43g�L�n���[�p�i��y�z�����;~�a�u�����������o5j����g���9���r�d�}����o���[�q���8qbF��g�y&���?J_�Ye�U��U��ga�w��+��"o��f&O����[j�:�t�My��w��k���GM���s���f��w�k��3f���>�����������>�Fm�+����8'�xbF��dN�~�T:��&���k�M�=2u��u�Qy��J_&(�7+;��������`�������O�PH2g7�#F��?�q��
���9sY��������^z)�{�N�X���3p��Jm��j�<8��r���3�����s���X,�����/�=���s����h��*��_�~���S~��_�����'�|�[n�%��r�B�5i�$������W��m����Y���������!����Z�j�:7o�<�<�L~������2eJ����~��-��7��_����<�m�]~���,�_���������[o�������:+�^{mu^2�2!�fe'����{��,�Eo�^�b1�b�����@]V(r�M7e��A�o����u�4h� m����{��?��Oy��������.�(�>�l����g�u�M��
���kg������s�w�A��d���;.���N������G?���o�u�Y'�7N�����M�l���9���s�-���O?��7��\���>�������m�e�&�s�f�r�-���7���~������Yc�5R�~�4i�$���~��w����+�?�|�R���o��?�ii���a����/�K6�h�$�����<x��� �fe&�^8���#�X|�b-K�kbG��o��*�;&N���-[f��	i���b��6mZ���l��i���2�����-�������6���G�m��6hW��_��z����Y��tY�/����r
j��-��V�<�&�on��r����������������E�.���t�$��],[���ls������
���HR�;�w��1IR(��O������x�,��X��m��!CR(��|u��%�KB�
���l�����b�������(����g/��P��X�T��j�H��/w�t�-�$I:v���m�V�����<I��{�eRT������-@?���R(r�=�,V��������KEE�~	��r��
���C�]>�
j��)��*�]@M�����b�G`���e����Y����w�d���O@M���2Za�U|n�^(�\I���A���W/�'O.w)� �L��z���A��.�$�����P�d���V��c��I�4k�����-�B!��7������R+��8qb�7o�Kq����KN@M����Z!�O�>=��rK�d�
6(s5uO��-3c��|���x�X�X���3f�e���.�$�����Pd�����s��}��o��<w�y��������X�������og���)
����2�t���I��m�6}�Q�N��-Z�I�&�W���{�R�X��Y�2e��L�813f�H��m��I�r����������d�0GY��5*C��/�-�y��7�=�����i���:�Fk\Y4o�<���~&L�����g����.	�:�^�zi��yZ�l)x`�$��]d�,
8+��.@�kn������P(�Y�f�`�
��s��u�Yi����(q���I�4i�$m����32{��r�@PQQ�
�cD�]���X2p(��/�0^xa��***R(r�=����.Se+�B���
���:C�]{��OE�X�����������w@_���g��Xj�o��Zyt�?�H��/wU�9sf^|��������/3m��j�����qeP}�o��Z�}�����o�?�����/����@�
@]S����~�����{K�G�PXU���P�����rK����$I�z�r�a�e�}�I��m��Q�2W�#��.�u�����$i��q~�����e��������|����S(r��'
������E�n�����$:t(s%�����E�n�:���$�={v�+�%'��.�u���c�$�����\	,9�7uQ�[����(���O����r�KD�
@]T��o��v���K�����K�.���/�],6�7uQ�r�MO?�tv�e�}��0`@6�t�t��=���KV_}�TT,z��{��*���P���{��W
�B��P(d�������r�UWU��P���3�a��h�o��Z�=I��b���.�P����^xa�K��&��.���7uQE��v��$���Y�@��~���z��-U�B���3g�P5�d���E�nz�X,w	�����E�n�{��B�Pe�Y�f��/��;�����g�P(d�m�M����S�P5�7uQ�[�>d��j�7n\���?���/��i�2h��������8�&�7uQE�X�Z���_�d��9��C���_��,X,�oj�:�}��;,���o^��\w�u�.����r[!�'�������0�����PN+����Z+I��;���Xr�o�i�Y���g�%I�N�Z�J`���(�b����s�-�$I�]w�2WKF�
@�������^�u��_|1�B!���O�K��&��6�_���c���j���_�?��OF�]z�i��9��s�UiPm�o��Z�}��!)
�j[,K����z���_Y��&��.�u������4l�0���Z���o��H��=��j�-���z���5�n�����],5�7uQE��v�uw@����$-Z��6�lS�b`	����j����k���������K�%&��.�u�WYe�$���n[�J`�����j��6m���Xj�o��Z��C�I������Xr�o��Z���NH�XL��}3a��r�KD�
@]T�����^9��3����������~Z��`���������oz���s�a������C=�M7�4��u������m�f�UVY�{���R�0k�����[y������/���^�k����S�&Iz���>}�,r�>}��������^xaz����UP���{-a��S�[���^{�P($I
�B&M��~���_�~��_(2s������#���w��Tc�r�P���IR,�|����5���V�Z�u��������c��G?J���l����/���>�o��Z���/,w	�q���[d������o�
6� }�������cn��v���K�	@�&��.�}�=��r�@'��.�(w���������s��b�4k�,M�4I�v�r���/�K�L�R���Z��+6���_|1o��v&O���S���?��������i��}x��r��$�X��/w+�z��e�]v�����M7�4��5�������/��;���q�2f��|�����[�����%�|��+����v�-�F�J��m�;w��'����mN:���~��)����gv�u��k���q�O������O�81I2c����1�f_%���6����e��Q�mn����e���xd�����*�g��eh��7��|���s������>��!C2m��\~�����k������&]t�|�?���i���R����v����`�/����m���,���5S�L)w	+,�7��G������r���b�X�-*��>}�����O����#}��������v�-I��]�|��U�_�����^�����h������-{=R���htB���e���6�����mn���'f��W��	d�U�����ANu�;�v�Z`�]vI���3m���=:S�L�r'�F��Q�F�=��A�4h�`Y�
�R�>�P����V���g��-#�/��K������'����Y�(��$I***��U��������XB�o����Z`������/K�W]u��KH�
P����n�a6�p����?.w)��s�=��S�&I��m�&M���"���[�
P�/w�4z����|���.w)�����s��t�Ae���"���E���k��f��U�Ve�d�6,�_}�M���6�'ON�����O$I5j�s�9gy��2$���E����m�Y>���|��Ge������M7�T���������������t�c�����c��g�}�SN9%g�uV��g�l���Yo����i�L�0!���J��c�&I
�Bn����o�~��0��w�e��Xfj���;,O=�T
�3�<�,5|�����Kz~�����$�_�~�~�I�&��{��=�������i�o�1x��
@�"��.�(w�t�I'����v�
�+�����,���;g���9��s��s�l��fY}��S�~��h�"o�q�8�����7�����`#��.�uw@o��ax��t��-��sN�
���G���C6l�\j�k��R,�j�f�������\CUP�����j��
7�0I2}�����{�����{S�^��n�:���J���B�{���Q*,������-@5jT
�B���[,3s��|��g��?��������-@o����:O�
@]T���5��%�R�PU��j�Hb:�_�r�(/��by���1"�����3��OTj��_����N�����U�2U
'��.����}�����3C�-=W,S(�k����&W]uU�Xc���?�I�z��g��P�o���r� ���J����f���)����9���R,3f��<�����RX8�7uM�[�>u��t��%'NL�z�r����_��W�������x����6�$I{���T),������-@�����G�P(���o�%�\�M6�$
4�������b���^zi9U
'��.�u��B��8 ]�v�v�-��"I����.�������E�n��o��$9���_�V��$������`�����j��/��2I���k.V�b��,��%"��.�u�[�l�$�8q�b������$�[����`q����j�����'I^~������O$I���o�tI�����E�nz�N�R,s���W{�W_}5�<�H
�B:w���+�E�P���'�tR����q���G��9sf��G���;,�b1M�4I��=�S��p�o��Z�}�
7��g��b�����/�l�Mn����9��f��y���������z��3r��
�\x��i��u��9���E��]��\z�����s��������)���$)
I�������X,&Iz�����>{�!����uw@O������_����i�&�bq�?k��F�����p�
�.*�P���;��u�)��������>���~:�F�������Y��m�6{��g8��4i�����B���+j��$i��a:��t�A�.��������P;X�@�������o�p�
��_EEE�7o�V�Ze�����{��<0��������j��Q�F�P(�X,��+
��b�8��o�2dH���?�]�v������>�,�������E�n{�v���]�vYw�uK�z�XL�XL��-�����e�����9������u�Y'�7.����r�����*�K`%$��.�u�G���C��}��)��m��2h���7.�����~X:������n��X,�}��y��2y��><'�tR�d������g��[�W��D�
@]T��O�>=tP�}�����y�����k��������������[�~���������Cs�A������[n����.�\sM�d���������jXY����j�����.���jv�y�\t�E��s��g��w����Z)h?�����6�$I{��eQ.,������-@����R(r�QG-V���:*�b1��v[���t��b����~�&��*����j��w�}7I���k/V������Wz~��7N�|���5PT������-@�<yr����?^�~�|�I�d��)��o��Q��q��5PT������-@_o���$��v�b����m�������/�$�[�����z���E�n�~���b��^x!���/����s����?�B�����������'I�^{��F�
@]T���}��i��i����.�{�����;�����n��q4hPv�}�\~��I�&M����������J�P��;��|^D�
@�T��|S�v�r��7������Y�2t��:4I��E�4i�$S�L���K}��b����>}��]�v���~��|���i��I9����ZXy����j��$9���������O���#K�O�0!'NL�X��~��6��7��=�����{��G&M��\j�o�P����I��^{�_��W�����{��y�����g���i��i�Yg����9��Cr�!��^�z�.�#��.�����^�z���k�v�Z�R`����+*�]���$����~����={.Q����4o�<�Z���[o�]w�5�[�����z���E�nz�>}R(�z�
�����~���i��*���PU���)���o>��������0`@��z��1��/�����GYU�y����DTG�!�h$Qq�8i�cT����!I�5v�1*�j����1Q1q���6��Sp[��J�h�j8@��UW

���:���g-�:��}�~o���}^�]]��7M��O�<9/��r�8��$I��}���~57�xc�~������y���s��7��_�j����R��#�<2�&M���>�K.�$[o�u��r�O��C9$���+��������
��W���>:������>���k�M�~�����w��QG�	&�����5�\�$�7o^���/��k�M�T��~���=��>B��9sf�������oYm��������[�{J�/��6
*����O,�o:�j���/�j�o�Y���?9pZ���i���o�1�_}��n�i���$���_~���e��A����s�M7%Ijkk����<���n����on���B�����
������J��=:=z�h�5={�����S.�������~]]]F��r����z��B�%��U]�3�<�$�l������7����
��v�$�;���
�@���U]�����$y������Y�f5��A�>}Z'0X��tDUW����$�w��\��~����o0s��$I�~�Z!:h�o:��+@�}��S.�����6��zk�����[r��7�T*e��vkt��_L����Z�+,��7Q���3&�R)�r9�vX����d��iM��6mZ�<��~��)��)�J��W�����	R*���O~�=��$��tL�E��]w�5��zj.�����;7����r�d�-��&�l�^�z��?�����I�&e��)��I�SO=5���k�^�&M�O<�R��������@$�
@GTu�I�����Ym��r�y�e����?~���<�����5$��w����:+����������$�6�l�>�@=�o:��,@O�3�<3Gyd~���w��]^��%�80�rH����d��6[��Zk����Z�=��&���Tmz�l������Kr�%�d��iy��7���w��Yo��2`���C�f��QTu�� �@�'�
@5�):��t�$�Eu|���W���c�&�_Q�����7�Ia�#F�H�TJ�T��y��xE-~?hK��t&��'I�\^�����YV�~��g/��P����L��J���3�):�Ca�}i�=��$��o�c�9��h`���U]�9���R����;��P`����������$��'>Qp$��������}���O�|��G+N�����
���o����<���E�+L�����
�O>�����#�^{m������"�
@GTu����'����,,��{��[n����`�������=��$�g>���u�]9��C3x�������`�
��g�f�q�Yg�u��L��tD���=:I���}-�m�]���s�I�TJ��J����L�:5S�Nm�}%�hO��t���7.�R)�zh%�$�r�Q��_/KC����7�E��M���{�V��7Q��>��`�����A:I�PO:I���H�3�<3�����*�*�J�0aB�����7]U�?����r�r��R��*���%�
@GW��r��`����UE�w�������E�+E����*
��������o:����:(@ �t�)@ �t�^�^.��V��7�Am��O�<9I2`��"���"�
@gQh������Z��7�EM�P��D:���D:���D:��7a���y���2n��|��_��;��^�z�T*�T*e��Q�}�W^y%��vZ���}�f�UW���o�1c�����n����,����FGqDn���V����_�����������K/���^�O���u�Y9���Z�O��`y)@o�����^s�5��_������}�k��&_����$5559rd��k���������W_�9s�����N]]]���o��g�o�W������w�=�X��w�q�l������?�O���h��2n��|��_\��L�>=c��I�0������9���+��;��|��_�^{��?�0g�yf=��l���+?�K�[���(�}��)�J�z�R��y����=�8��V����.���3�$c��i�|o��N;���������y��e�������Z������7@gQSt�r���T�n��r�����Kmw��'�w��I��o�9}�Q��@������
�
�{��G��_-^x��L�:5I���[f��6Zj�>}�d��w�����>� ��w_����
��$����7@�Wh����[d�mj�����v����;��Cn��������w�����j���z��+������6�^E���Z���3fT�����l�~��5y-I��k�-:����od���/:�������=z4��g����Y�f-���9s2g�����3g&I�����s�.o��P]�ra}��i>��V�RWX��_,����E��s���6r��O��*��J�)@��_����??W\qE>�����iS����3v��%����;��W�"��}�������;����?����h:K�X�[��=���?9pZ��\q�/@�>}z.���\v�e�={v��T����������GU�����������r�)�T^��93������V[m��%��sGa}?WwBa}�<x`a}?��G
������gwT�����I�����RE�������^�K/���>�(�
��!C��w�&�����\�����*�r������H���z���w�i��������M���K]]��w��=��woq�,�9�K���}Aq��s2�����X���E�{�k�"�
P9��'FK�w�*����zkN;�����������o��_�%g�uVJ������������3f�\.'Y��<��c��o}�]c_��7��r<y��f�/�f�k�8����:�����_d���)���dz�3f��s�����3n����93����3a��$w|���������o~3�
*�#4i�m��?�����_���!C�$&�����m��:��";�6mZ����f��)�����{��n����NYc�5�,L�������	r�!�d��	)�����GN9��L�<9�^ziU%��d�����4i��L�2e�m���<��I�^�ze����"�D�{!�o��������:�f�J�T�a��7�|3O>�d~��L�6-?��SS�0���;.��w_��r���/��W_�E]�u�Y����LGyd���?��R�]~������$|pz������z������
-@�0aB�d��7�u�]�~��U�u��-_���s�I'�\.����J�T�����k����{�o|����O���K/��7��D��{,���w�$���9����5FV����7@gQ[d�/��BJ�R���/�{��M�9�����8�R)��
�����6�k������+�����V��z���y���������s�=�7`����G?��Q��`����?�cF��}��'��u�C=����:�g�N��;6[l�E}*�����7@gQh�{���$�L:/z���k���d���9����z��g�m��O���x>I�?��|���9��S2{��\w�u��������[���o��3�h�@���^H���+���?L�TJ������g����A��GX����O��{���.�,��~{^��,X� ���^��k���?�s�Zt�� �o�o������UWW�.��1"�r�U��������/��_��������Z���*
�K�R���"����@�z����)��-jW*�2o���
���7]U�'�K�����jE���#+��%	uIw���7�A��,(�{h��t5E@uP�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S�@��S���F��R���?S�L):dh�8@���$Im�t%�����l��C$�r��:'����C-:hr��SM�P��$�-:��6WoSX���XX������>���f����*���5�X#[o�uN<���s�=E��E�sR���n��������;wnf���^x!?������{f����[o�Ut��"r��Sm�tk��F��g�l���Y����[�����0aBn�������}���y������f�u�):dh�8@����}�����?�����*K�;��S��O����k����S�f���?~�2�9g����3��z���I��s�f��������V.���5=
��.u��-��������v\��z�A�'���o�T�WJ�r���$��I�2t��JR�������;,��9����c�.��u�]�^�z�Y����?������o�j��Vt8]�������Tt�[z�8������<Ir�Yg5�`o����;���Qh��v.��G��H��CW0��;
����
�{��������9sf�����
�4.�
P�����A��o�7Z���wm��H�>���T���&MZf�������-�~�����{�6��������!������_*���f�w��������K�hi\��z�A�'���o�T�Wj
�����Z�r<c�����$�GvIDAT�q)@����N�x��W/.XIr���*q�=�T�7�|�#��#�q)@�/��R~��_V^���-0Xqr���6t�%����^f���z*���_f���$�w�}3l���ZL�k�-:�����������d�M6��{��!C��_�~���[�|��L�0!������$��UW]Up��$9p��Az;x��W����.��~���+��2���^;E�O�sS���.�����?�C{��<��3�6mZ�y����3'}����n��w�9G}t�
Vt��Tr�]��6��&�d�M6�	'�Pt(�R�������:(@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t�)@ �t��M8�oq}o4����B)@��\�Ma}O<~ba}@5�):��t�(@��t�(@��t�(@��t�(@��t�(@��t�(@�^m���lx����=���
�::�t.��-����7�����:(@ IR[t��\z����=��=������[�{J����0�+h���)����O,�o���):��t�(@��t�(@��t�(@��t�(@�^m�����ZX�S.8���:��$
����$
��W[t�����.��1��YX�]U���D�h;��,��$
����$
��W[t����z����x�������7��D:���D:�j���������*�o(�t�����m
�{����3�����u>�����*QStT�$Ij��r�Iw�����,�o�s�����u>������Q�T�B���<��(@����`���)�/sp��t����������b����
��twa}��l����&
���6WoSX���XX�@�S�]�&�RStT�h]��-����7@W&G����@��S�@������o���)����O,���B:T�"�4htm
�������������h
�����[�{J���Z��-�,����7I���KO�����\�ga}���
:����:�
�@�Q��z��:�I[lY\�#.-�o�*��[l�
*��,��$~:����������
O�����\pPa}�1(@(P����Ga]���g�������o@h������G\Z\��A�7>-��.m��o-��)TX�Q�s�$����u���������"��2�t-���9"���CQ��[\�
��k��hFM�P��D:���D:�����o�9�~x6�p����#�.���/�03g�,:<h�o���������?G}tn���F�O�>=��O�#�<���G�����v���(`���:?�ml���9���s���'I�^{��x���j����{������C=��_=x`z��l���G
��t
������J�}�����w����^�r~��1��7���/�8��_��/})��Q�@��������������c�V^����l�|o��� �m�]�����w��^!@�����m�����[o��$>|x>��O5��[�n����Vy}����K|���]��6t�m�U�<��e�=�����&�
�u(@oC'N�����l��:�d���I���~;��Oo��������m��_�o��F��_����@���������f��Q9�������������3gN���Sy����-I��{�e����hV;����~����w�G�����G���/��$���n������_W��m��"����V�]EW��%��"�hO]u|+rlK�o��o����-1�u4�f�J�����#�|����g��0���U������7�SW�<C-����d|k��B�0����:wK�o�/�[������m���.�e���*��RI���;7����>��\w�uI����.GuT���9���;�u��$^��l��E���������~z��o}+��rJ�����{��_�~)�JFFW0s��80���zV[m���h�6��2����
���o@ge|�=�����5+���^���B���w�Y�����tV�7��2������Rt�[zZu�U����5I2{�������l��GU������vuuu���k���������
Xm��|A���
���o@ge|:+��Y�h/}��-:�NI����w�Y�����tV�7��2������Pd�������E�����N���}��&��"�t
�����o^9�<yr��m���P$�o��Cz�f�m*��?��2�����y����$�Zk�����������g������Ch5�6��2����
���o@ge|��A����w�Y�����tV�7��2�������T.��E�Y�}���k���$#F��=�����W]uUF��$5jT����v��#�
�u�
�mh���Yg�u�$��{o�|��&���??�\rI����#�%>h	�o��Cz���[�:������;.��M[��������~:I����f���k��Y��]G�\.���3�7o^<���u�]I�u�Y''�xb��j����{�������&IV_}�<����z���� �
�5(@o�f������������f�
6�
7��]v��#������j��+���On����t�M���>�����.�����a���� �=���{'1��<��s7n\����f��wN�^�R*�R*�2j����+����N;-C�I��}����f��7��1c���O��g���0n��3'?��O���{f�u�M]]]6�`�t�A���k�`����5��Q�FU�7n\��|�������kF���s������j���{���F��l�Y�f�3��L��
6� �&MZ����V����Zc����V>��)S�m�%����&�R)555����������j=Z*���g���1�E�.X� �
jt}K�s@�&���t�9=��:��%�9p������8�4�:n-J(�8tRe�U}�s�+'Y����?~���������g����[�n��c������j�&M�T�j����n��V��_���q��x���W���������[om4N�t�I���������j���s�=����_f�������~�J�M7��<e������u�j�Zk���W�O�<y�m�>��J������W_���t"m�m�s�������o�}�k�����T���)�>v��mI�h�u�&,M��[
������C�T�U��?���5�\3�����/��B����k��/})IRSS��#Gf���Jmmmz��\}���3gN�>����������J�k��q�����~����^{-I���������z���?��O���+��?�)>�`:���w�}����
�
tM�=���~��w�q������o�{��^��t.�<wk�?����w�}+;�o��v���;2`����/P��y�j�5g�\�����\r�%I�=z��n�����:��Z����f��y���+��/���W^ye��`q�<�X�j�����&t4�<wk	9p�z�y���$�T���������O?��?��?�?��O�r�\����Vh��i���W[m�r�rMMM�w���my��r�^�*�E���l��t�<n�9����#�s��mt~��Y����W��y��-��\n�1�%����'?)���T�]x����)���Z�n-�����^j�;�n��V�1cF��:�j����]s6�����s��{l�M�>}���sO�?;����z����?�������w�-������9�����j��,M5�]r�@[�:�j����KS��V�,K:'�Z�g��j�����2s��$��1c��	j��v�y���SO=5������cs�u��Z@�W���/��n�!I�����g?�YjkO]V]u�\{����'>���g��?�aN=������������5���|�������[�\~��=zt��t�:wk��O?����/��MK�x����o~��={����^��[����={v�<���|��I�������n���o�\�:��Z�}�����;2g��\y������������k3g��$���������Mb�c��9=��T��%�9p�����[s������qK(�8tN5E,]� I��_�u��N<�����;Ir��7���>Z�>G��R��R��$Y�`A~��_d����l����W�-j�������s��g�
6H�=��kd�m��)����^zi�}�|���>_~��&��u�]�6�R)�<�H����J��N;m��,�u�]�C=4�N��=��G�������'?��?<?����������,�5��n�!�r9I�����Yu�U�������#�8"I�����"a��q�1d��qI�'�|2'�tR6�l�������E����'��-��2}��M��=3x��q�������c�=V������R�m���v_�����n���N�T��k�]��-��g��W���|���L��}��{����?[l�E��k��q�y��'��CV�i��Vy���*���nh����)S*c��Q��$o��f�:��:4���ktnQo��f�<����������������f�����~����)���Ww�u���v��GWb�|����n��1�v�?�������d����u�]���t��=}���&�l��w�9_���3~��,X�`�?,`	���|��3b��J�}�������Z%�n
k
K�����f��PI�o������[%�n
k
MYs�5s�!�$I������;w�m����$��a���V[�Z�h�hK#��1�K�qt�������h+r�r�P����c����kN9pkXhor��h��_�]�UW]UNRNR>���[t���?_�f�-�l�����_i�m��p���������+�������Y�+��R�z���l������|�y�5��
7�Piw�e�5����Oot��~��M����*m�����;��S�i���g��/�p~z�yT����;T�?��c����~��J�#�<�E�6e��}�UW�����u���q�UWU��7o^��_�r�T*-s\�}�����M[���s�����SNR�i�������c�{}��h��_���J�#�8b����{n�����1p���^� t+2��������81o���	'�Py�w��������b�<yr�X������k�������+�����W�e�,?���M�{�����w�^�5kV�m�]w�F������d�-��������k/qn����1��?��O_�t"�0w���{*��^y�����={V��|���������5��������^s<��f����ry����o�}��M7��<u���?lY�Z�����z����*�~�������o����'�l4�y�������s4s4����9}K�^��
�a���������������nr��Y���U��%n
�H����6@U�8qb�x�vh��;���o��r������1}���������[�����&�l�Y�f������y��7��������N�<8�F��[l���?w�qG~���f��y��w��9s�����k��g>���J�����}��M�u��w/�����u��=���{�s'�xb}��$���3r��l���Yc�5�����_�#�<�x`~Z@k�[�r��p�n�2t��f��T+����un�������9������;�{��y����:�T��5*�\sM��c�1��=��#���J�}��\y���>}zx�����y����*X[[�=��#��zk�x����5+}��i��c�+����_=\j�=������o�9g�uV��G�9�����n�e�������[o�����]w��?5`Q���s��G�7��M��;��?>��
k��^y��|�����Y�r�a�e����k���^{-��/�������?�S��>���C=4�����)S��_�2�?�|^���1"?�p��v�F}��������2w��<��9����4iR�z��F��}��9��c���[o���c��s�E����9��#����'I���:(���N�����;�������	�� ���Xs�p�
9��c+;��q�9���W0��Y�B�����o��F��g�L�4)I2t���~��0`@��_^������g�80���z����|�s�[�M���={��QGU�M=��
�����^����=�h�������j&nMG[s������9*������e����k�>��f�_y����'�p�
����,I�c��)��7o��<��J�<���,�f�������r�rMMM��GY���!C�I�k��Vy������o��\��.����{��Q�={v�v�����{���[��o�]�-j�]v)��GK�L��M+���K=]A�����S+��������W�����/1�����;Iy��6[��|����+m�\s�����%�L�>�<t��J��O>y�6]tQ��-������?�����;�kkk�I����[���'�X��K/����AT�%��8��7����.�<t���������w�����[���s��z�����,�]�����R�O�2���{�T*_q�K��;wny����{2d����x����SO=u�{\z���$��={���n�r���Q��hw���V�s���7:w��V�]r�%��9<������AgW���\^r���.���+�J��/�x9?U�X�Z��1=n���s�������F�w�}���3Z�9��5�5,�Ok��^.��g�yf9I�[�n�7�|�Q���gW~s�1�S.��m���9@�T��~y�^��
���������8t4E���e9�EY�B������a�Z��������J3f�����������k�����O}*�\rI�u�����'f���I�u�]7�_}z���D�8 c��M�,X� ?���h���������E�������������������7j��c���>ht�����`��$w�����R?�Zk��-��r�������������{V[m�$���s+c��(�J���~�A�-��\P9������O}j�6�����7���={&Y�����i-:f-�U�\�����$9���+�.�n���M7����W^y%�����A�n�����.�<�2��~z����$�&�l�|0[o�u�����~7{���R�_r�%����$'�|rF��D�������?�6�l�$y���r�-�4j3t�����I�=���.���������K���5�[Ir�	',�3%��a��9����k�'�x"'�tR,X�n����+��)�������5,tni����}.S�NM�t�A���;��o�f�Y�������/�T*e��������������{�%I����d�@����^���#=�h	���!.�N�::������7�5,M��b(@�*����W�[� �aB�$�f�j�������7�xc����N�,B����|%}��I��?>�g�nt~Y�����n�i��s�l���l�����w����?��K�Xq�9n-�������m��2t�����:uj�|��$��o����Km�������J���3'��zk�����'���k&Yrl�8qb�O��d���0�-��z�������&I>���,C�8������?��n�q��c��Fm��}���3��O���6
��R����[j�����v�iK\����&��O�<��3��6I����[S�N��S
��A�e�M6it��
�V[�9MJm��9���W ��g
�[GZs.z�SO=���m�X��o�#F$I������W^�$�h��*m��9
����k�KP�:������Xr��&��j&nMGZs��[�B5�7G�
����}���y���������l��w����nI�����y����>|x�x��	��5|�5�d�0!_��b�=��.�4:��V[e���O�pb1j��<��C��^�<c�>���R�������_���Gmtn�$���>�w�y�r�al���Ov�q������_��/��D�d��A��8��{�e�=��5�\�������d��������6�s���Yu�U�z~��i�2eJ�d��6�����y�e�[��s�4z���3���w�M�p�����f�UVI�x��:uj&O��d��V�p��.����*P�X�����������(�V�a�j��\����<��}Z�Mi����_�C=�d��������$�F�jv<XY�hT�K@W���2�����+�����N�������h/
��J-��t�L���GU�v?YY
��,�[o�U9�l������m�6IV_}��U������w����>����x�����?^y�3{���B`�]vI]]]��w��-�_~y�����:���[�\s�����;vlz�����f?������^��oE���|<����FI����w�=������E�^�����O?��h���9��c��_�:4_���s�
7d����~�eN9���q��^_|��m�gk�[�$��5n%M�G���Z��~����3;�����{���~�����K����;9������f��7��G�����y�����@��r������;���!=�P��o�V�meKc
�[GZs�p�
�������8 ����YQ��@S;�����a��q��e�������Q��<s4��^���#=�h	���!.�N�::��������j!n�F�S�Uj��W�/����4�����+�g���<������{7{�E6M=ti���9sf�x��$�����r��R�T�2lh7w����Y=�P�������<��<�����?_��t�������r�9�d��v�&�l�k�����,�5������y�*������hLjNQc`������W�4����Gv�y�F���\|���������}��#������z���d���O?�t~���d���Y{�����|%�����<@��?��|�������7��/����k�q+�x�jj��!C�d��I�N�������[����E�6�|O>7n\��v��{�'O�u�]��N:)��A�_|�E��X[�9w�q��u�]��?�p��o�6M�X�B�����={��-������;I�����}���l_+�hJ��=3r��$��������7n\����4�]bXs4��C���tD�yDKx~�,9p9p�fr�����t�5��5,T9ps4��t�R�o�y�x�����_������Ew�����m��C��v�j��K�	&$�xR��6����I���g��7nt~�����Y��!C�?��?y���r�wd����{��+��L�<9�{l�����k�qk������W����s�����{���k���6�t��J����Z{�j�����k'�x|��'3c��$�'�
�
��_~��������{��s������<��3����c�9&���n��;\]z���m��Z����}����w��������~��BbY�q+�x�Z����F��$����7�|��������y����|��u�M7�������K�R�?��<��3�2eJ�����3&[o�u�����?>;��C&N����,�k�v�!w�uW�Xc�$�#�<��	�e�������9{����o�9���O�����c��d
]�����,��z��1����������t�����#�h�#V��@K�����8T9p�X�h:��S����9�K:T�m���r����7�~�6C�i���0�M��_~���/��R��a��E�������{�%����k�Fm��o����f�wl6���{g�}��Yg�����+��O�y��W9����/�K��>���V�T�$V������zj���VZ{L>�^~�������m����v�m�D�i������k���*�J�v�ms��'����e�x���y�����{��\v�e��h�s�=7g�uV������.����X�qk��i��4�6n-���O<QI�-:6lX���w��_|1o����X���������������/�����'Y���g�������s�������J��G����[�N�����u�5gC~���K�|�����g?�h
�^�a���q�+c�/~��$�k����,2�
s4��C���tD�y����h)9p9p�Fr�����t�5�x�v��P9ps4��t�R[m�U
�$�4iR�L�������~x��$I�^�*!���a�*�w�y�2�~���y���$���J��D�UW]5;��C������)S��?�1�����O?�t^{��<��I~����.�g���O�<��r�!I��s���G]��@W�������_9����������+�x���������f��q�M^����X
��1������
K����h��=Z�T*e�}��%�\Ry����:���s�9���[��V�����k��n�$y��3u��e�_�qk���j��|�UV�����D����<��r�����MM��e�q�O{�9?��Oe��	Ys�5�$�=�X!	xkX��:���G�����*�5$�v$n/����-���QGU���h�h]����%��:������<��������[�BG�Q��r���P
����h?
���y�������Kmw�����>H�|����5��a�V9��O~R���)�^zif���$9����������G}���??I��[������5|).X� ��w^��������FU��	�\k�[����?�i����x������N�pg���m[<xp>��O'I^}����7�Yj��S��W��U����.tP����$����+��������g��vK�����[o���'2B[;���s���V^����w���v��a�V.�s��.���y�r�E-q��6�t�l��I�G
;�-��5�x,��������>�����}��_�~Ym��*1��=��C���	��_�$�����e�����3��^+�:����lH�7$�?�����?�C�������c�=6;��S�
�a����O,:�
s4��E���tD�y����X^r�r�Pm���c����kN9pkX(��9������������|��������~���O�r�rMMM�w���m}��r�^��I�����I�&�T����������������ORH �������/5t�E@��j�/*��;x���iB�R�����tBBH����1!3�I()|?k�b��;{�93���g��3��kg��k��DEE��Y�j�����n��?�l�����[�����H2����Y[�b�du���;l��Z��|���&,,�n����3����:|�p*���2����Gk�=�����M�=222��5j�(��jK��=}��T�,X`������;w���x���U��U��O8l�x��)��������S�=���v�<x���g����
v��%���w����Ss����k�I2o��v��z���4���������js����f��!V��+W6���v����o��o'NLQ��/���{�����;f��j�*�}��3�j�?����dc�����
�14i��n��w�6����jk����}Zjx�{XdM�a�2����,Q��Uw��1�5111��!///�z�j�n�
���=,��;�~t��������#N��s��x� ��,�����K��$�,s8����j2�k72p��i��-c��yd>d��FC��C��c��i��i�~�w�^���]�����'�hs5��j��	0`���K���K-[������n��3f(&&F���[o�B�
w�V�7y�d��QC�����+��Ci���*_���^��5k�h��2�H���i��u����Ayzz���������Y38p�����W�j�l��9sF/���F���M��^�z*]��r���K�.i����;w�._�,I������+���d)�y����O���?���S�;w������H�":z���N���G�J��U��W^y%��!=�w��>}�h���
S�z���O5n�X����4m�4�?^�T�B�7�a���5��3��-  @����Y'%_A���TS�N���SU�B�r����/�bbbt��	-X��������#F��`Y����5j�(������^�$�=Z			z��7����J�(����k���JHH���5o�<u��I����_���3g����$������������65k�,Ir���f�������+W�ZQo��
3f�
,���[�Z�jz������3g�h����VLM<�@v��_�9�j��Z�~��7o��/j��j�����[��y��V���=,p�e�y�^��������~����k������Q�N��d��n����v�a��%#��fV�F��-3����	�2��E����FNd5����3��y��Of����yd$2��
�JF��dGIW�s����o:l�����V5�uqss3�G��#�O��,��\�R�Joc�9�^��i����]�n����&������6CBB��?�w�nsu ������}�L�
��A����3�},��r�17WI1b�qqqq8��
���������U�>}l����???�����\�|�n������7����S��������������������h�������.E�5��mK�����'��X�bvk��o�������n}Mh����c������@V�Y_�9��{��~��(P���z�����Ki87������2����N��tf��D��_7;v��===Mhh�S�M�����E�v���f�����5dN��5}j����p��s8�w���IdN���8�c{2�������@F!O�?������,`��j���&N��U�V����JHHP�"E��ys
:T��W����-[V{�������h�"���S/^T��9U�X1�h�B#F���>�T{�����q����b��?��Y��Y3���X+�8Z��_�~�T����[�_~�E����u��5y{{�x���W������&M���H�N�[�*U��]�4m�4-X�@�����?~U�RE�{����?�pe��)G������)S�h����������n��z�����kW���u.�7�����I�&Z�l�$�z����'��v���o�^�Z[�l���{u��1EDD���M
P�*U��S'���W9s�t���-#G���������O���I���o��������m[}��WZ�z��=���H������R�N�4d����%J�t������+{�����N����=��/��u��i�&���S���.^�(c�����
*�E�<x��)��# ��x�Y�rem��A���:��v������k��u��/���V����������C.T�=�d�]�~]�;w���~�Gy���c�adV�F���7�/YQV�<"-��@z�����8�c��&���$�=,��x�����$>����Y&��p:@'���	�I���'�$q:�����	��p:@'���	��	]�|Yo���j��!___������E...=4�c������7f�p�m�����3f�m���i�l��		�n_HHHF�+���/�����N@p_J�l]|||T�X1�n�Z�����s����.\��Z�j��w���]�)c�=���!��^�������]�v*V��|||�����y��r�������}�]m��Y���=�U�^=����i��=�l����w� �v�7��I��d6��������S��f������0a����O���wu��QIR�����o_*TH���!d3g����>���������}��i�����=zh����x����3g�m�6IR���3v0�!�o��;��������C�DQQQ:x�������G�*22R����:t�p���b�
IR�<y�v�Z�����>�u�x'5o�<+�����z��e��F�w||���I�4|�p���~X;v��>(oooEFF��?���m��y�f��qC���6�0`�p�F�1�-[f��N�:e�h�?�ode����w����p:����U�_�u=���Z�h��1z����I��IIR���	�������x��v������^�BV��
g���/�`���W_i��v�###�p�B�����bx����K%IU�TQ�R�2x4��7�2��{��;����o8��������l�2������C:x��*T�pW��q��$������ m���[EGGK������]�r�������eJW�^���/���2�7����������5��Y�����CY?>|�a}DD�>���h�BE��������U�fM����vW�0`�\\\���b�n��M��/7n������5t�PU�XQy�������+�n��Y+��s��q��H�N�>���G�z����/_�mI����������>��%K���G�r�R���5d�m�����
		��		�t�?���z������<y��~�����/�/'8#44T�
R�
�'O����@�j���^{��d+���I�&�}��*V�����������+��g�I���(>>^�&MR�F����/ooo�+WNO<��8������1��u�F���-[�h�����R��9U�hQu��Q���i:��:���~���y��U�z���g�����w�6������7i�������O��y���d��v����jz���Z�qz��s����%IK�,Q��]U�D	yzz&��������gO�,YR������U��5|�p����n�~������km�9r$���;w���������U...z��Gm��X�B�=����-+yzz�p��z�����S'}���:u�����o�o�o��D��iC�M�
����$Y����W���7o���o������'k������			I�o�����x��aC��._�l��o��~�76.\�9�c��Yu���7k���y;����l��~��T�P!���z�)g�����[u��O73g�49s���V���MDD�������2���w�x����lc���&  ���nnn����w8��/���k;|<|�����7��{���m����6k����P��9|����6l����y��ooo��?~�n{M�4q�yz;���1bD��2-n}�'��y���D�6�����x����$S�X�t��tn<t��������;v�������Q�Fo����y��'l��_~���{��Wl�k�����<x���y��Y5_}�U�m����C�N��O>�d��!����
�!�&��u!�N��;m��SG�M�
d59�+..N��~.^����)S�h��a2����C�:uR���U�P!]�zU[�l��9s����C�=����3�<���;K��t�"Iz�������&��r����+W��?������/I*W��}�QU�XQ:z�������{�j���j���~��gyyy�������w����Hu��M-Z�P��yu��	����[�]�v�I�&����$5j�H���S�%�����{�*$$D�����_~�7nh��I���U��p�By{{��'�T���������wk�������O?���^zI�'O�����GU�~}�?^�����^�z�f�����UXX�����+V������2~hh�:u����X����M�6j�������k�������k��&Iz��WS��6m�X+k���+((H��U�����q�F}���8p�Z�l����m������P��
U�n]�-[V����~�����}�����w�<��m�j������u���;4v�X����w��j���r���}��)88Xg�������Y3���K~~~���>���l����3f��g�U��y��Vj
,����Z7�|��7O��'O����s�qqqZ�r�$�c�����$=��s


U�%��_?U�PA111��m�<==%IW�^U������(���j���q��6o����g+66V_}���\��Y�f%�'q��r�����{�c�����&�6j�(-_��g��=��C)_�|�����c��m�6m��!
G	�>�o�o�o��D���#�N�{�o�>��g�@FQ��u�����:???s���5{��1F�)W��9p�������o�)b$���s�K�.9[�&M��W�^V��1cl�do^|�E�n��Q)jn]i�����[��n�QQQ�t��F����6��-�Yn�5kf��v��5IW��dz�!s���u0�r�2�����9{����Z�Z5���;�]��cV�Xa�]���w�O��V/X������l�{��)S�rek%x[������l����O��������O�c�+�o�������m#!!�|��V;�������+�'>>l����/'[���a6�Km�;��K������������9x��IHHHs{�V�w��M����������'��;�\M�u��Y��Y�&�����1:w���y��O<a���Y��_���}���7�U7��5�Y�����<R�`A#�4h��j��_3(W���d��>..����I�L�2�f���v������_�����D��<�������'��/9
������;��O>i\]]��7�x�f[]�t1�����9r���~��Yc�7v�X�cs������

r��1���?���D�l���g�}���/�����5k����/___#��i�&���d�9��C���5r�H�v���)���7��^�zus��u�c���������y���777#�><��7n�B�
Y���hR_~�e���j����d��-ks��������u��)�K�������)jR���s�I�I/~~~�i�����_6K�,��e�[�N��a�/_>�1�r�J�c���jZ=����q�q�F��I����H�����7^^^�l��n�/n����Z��.]�l�o��fm[�j�qww7�Lppp���'OZu}��I����3���_~��C`������E���7������������>����������5k�����$I}����o��b���p-]�T���K�-[�a_-[�T���%I�W�N��g��a]�����T����'I����/��b�.g��<x�S}�w��k����v��I�6n�������m���|�A��[�li]����Sl�5k�u��������������3gJ�����F�9��P�����#)�}�u�V�;wN���EU�R�n;�V�<y�4����aCI���K�.9���'��bw{@@��qI�����|��4�%��{�<���,Y�r��%�}DD�6n���>�H�;wV�B�4p�@���_������0�k�������m�6E��z�:c��e��GyD�����V�A�)W�\v��\�R111���={�D�vk{���2e�H�v���c��%�h]�����mK����G����<`����$������s�N��H+����;B�M��,�o�o�~�#���<��3g&���u��{zzj��%���;wn�9sF���O��6o�,I�������Sm���������_�7�YW�zu���+W�{�nIR�������� /&&F��S�
l���_�a;E���_�|9��~�A��c��u�T�u����[�f��y��/���$I��SLL����$I��m�j�7o��
OOO5l�P�}�]��|'�����o���%K�{�n�>}Z������V�N�R�|�����aC�x���EM�4I��c6h� ���Q�=I����:t���7j�������g��d���k��o��V��������7��kW9rD�������'�LQw7�����k����N�:��
[R�RL�/�j��a����Z�j��������Y�J���W�RE�����K��~��d�&��5�����u�Vm���f��2����U�z����?k��������z�)5m�4�_p�wr�������D���N"��'�����x�b�����u��	-Z�H������=�w�}Wu�����_�}�?n]		QHH�������{�������K�.i��Q�ICn[N�<i����o��}������������U�EFF���+��2e��+�Jz_�\�R+W�L��aaa*R��$������S[��������C���k�����m��+��V���9#��{�\]]h������o��n��o���
_�\�����k��=w�~2d�6m�$��_M���Om����jjW�����c_<�R����9c]w��$l�$�W��7m�T�-��}�t��y,XP			����f����w�����C��|���d��K������_*""B��/�����3gN��][
4P``��5k�9��8���_��7��������o�o�~�������sg���gO����������g�I���z�n�l����~ccc�����{��
��r��y��M�oW���EM;Z���;y��^�j]���Nu_����vDDD(00�
��)�!C���O?��_�E�i���Z�x�z��i���]gnS�����4�;��{�����Z�jz��'�~�z�]��Z?::Z~��m�����j�����j��i���v�7w��������5k&__��GR��OIC�<������1�
�w��e����
4����/^����:q�D��[��QC{�������^�vM�7o���c��U+-ZT������p+�����wr����������������{N�{��$�_�^_|�E�������e�I�%�����Os�c����~%�k��i��i�������!_��;-���^x!���d��6����N�����t��N���/����q;vL�'O���?���{�k���T�+�t�����5�s�N��3����-Zh�����k��������g�W�H}��w�l�Q�����K{���t��M�R���3���s���_�f��������o��7o^U�^]���N��A�d�����[�(QB����t��6m���c��}����w��9=���


J��8B�m�_�����1�o�o��������~8�����U��~�m]�t)���E�Z�O�<y����oxxx������������s���O������z���/��?��#�zgj��5k�H�r���	&����n��c��n7���H�"N�-e�s/-Z�ha]?s�L������4p�@c�������'{���Q���K�J�\\\��c�{��$.\��~���T�>l]����X������z��M�����o��Q��d�������T���5r�H-_�\.\��I����.I
		��;Rm�������C�M�-���D�
�_8(\��F�!�f�=v��d�5j$I��U�����4i"IJHH�����Y�����C=$I��s���;w��NM�F�$I111�:&��U�B�
6�����K�:u��I�8[�_��-[�����u��YIR�|��7o^�u111��q��������u��Y�����t�R�=��"1<��p�vG�;�N�:)&&F����3g�j����~�\]�d�$�V�Zi�R��J�J�b�#IW����K����O�����s��P=���/j����s�b��z�����������C��OX������@R����;����["�&�&��G���x������)I�����YT��m%I�������{O���_?���o�����{��$���_����G��~S����=:����������t3D���O�=�
�P�B�n�|��������`����������#I:���\�b���/�H�	���S�n?s�����kI7W�n����mK��;�|��WC���~8������]�v�p�����"-������������s��w��[�k�N^^^��y�������[�`��/T�^]�J��Y��K���c���qk_�N�K_~����gVw$�����n�-���V���#�&�����5�o�'�@*
.�A�I����S���{����C�4x��T����0}����V�N�:u���G�$���W�:u�B:[�1��u�^z��t����'�T��%%I�'O���#k�������o�������v�[�n����w����>������W�N����^{My���$�����������`����(M�:5�}����g�}V����g��6W����5r�H�n��R�vmI7#�F��Y3w�\���in{�����ys��_�rE=z�Pdd�$i���*P�@������O?�T5k�������v�������������������{w8p@�4|�p=���ij�^?WW�Xa���:uJW�#��


�ts������/����K���~~��W���4@		�t���J�*%���#��W(�n���1���[:s�������4s�L��j����p�wr���"�v�����^"�����@V0r�HM�:U����8q�^~�e)RD��Pd��I


Rtt�z���q���C�*W��r����������m�6o����8��5���4m�4>|X{����5kT�dIu��M���S��s��i���Z�n�N�:�2e����?��~����l�25n�X���7n�f�������j�����Utt�N�<��;wj��u�r����-���Z�`�����.h��e*]��z����5k���W�/_�����+V��?�������%)  @�|��:t����������W_}�.]��R�J��+�"##u��1m��]���bbb��;���K/��E�i�����z�!�Z�j�~��6n�����Z���j���V�XqW��=O=������/��R;w�T����s��i���Z�~�r����;j��EN���}{�]�V��������7o��9sj����6m�N�>-��
�~�a������;w�o�����V�&MT�N/^\~~~�����#G�r�J������e��8p`�����/�~�zIR�"E��ys-Y���>���j��U����s5q|e���C=��6n���c�~�z<xP��oW���*U�������4k�,�/D�����2�-�K�V�%��_Y_.H�*|R��5Shh�U�����M��������1c���o�A�j�����//___��������;w��<�W��m�&����_����� �&����2'��J�(�>}�h�����������/����>`�k����Ok�����{���<==�?��S����e�=���={����5k�,��b��Eo��D?���o���\����N�>������wqqQ@@������K��_~Q�=�}�v�������r8�[�l�R[�lQ�>}t��!9rD���������x���www��U���#���_��K�R�������`:t(���~X�&M��a���Q?��c��|��i��9�����k����}�j����������_��)_��V�Z%__�t��^>���-�\�r�������Vhh�BCC�����j�������������������O�v'*Q���?��w���z��u�^�ZR����(W�\��y��v��-[����)�j�t�v>\&LH��f��9������Z�����m�&�=			��e��l�b����k���i~�C�������m#�&����2'���^}�U��9S����:u�F��b��Y�[�n��G�j��9�
�.\PLL�r����%K�j��
T��'O��S�\�4s�L���+
		��M�t��1]�|Y*P����/�
�m���S��m���L�2�����f�-X�@?���N�>���Hy{{+  @�*UR�&M��C�*U����H�R��m�6-]�T,�O?��s��)66Vy��U�����I���[~~~6��U������o��VK�.�/���s��)**J�r�R�b�����i�������^������~�IS�L�����o�>]�~]j����~�iU�TIc����G$u�
R�j�����j��M:w��r�������C�>|��)�"�OM�=T�jUM�0Ak�����-www�/_^={���O>)OO����z�
<X}������y�fm��]�����?���hy{{���_+VT��
��W/�-[��o�������������26���
��~���~�y��������#G)RDM�6��!CT�V-��t*��^��������/;���&M����~���k��O?i��}:u�������������UK�z�R����N"�N����;5������@Fr1������C�j��)��?���=+77��iF�
7�f��uc�|�rIR��Y�7����n������=+I���S���!���cLF����I���'�$q:�����	��p:@'���	�I���'�$q:�����	��p:@'���	�I���'�$q:�����	��p:@'���	�I���'�$q:����$�����8q��.^�����;���������a��� �b~�]1�����dW���W���3z�
���+^�����dW�o�+�7����(#�oN@�N�8��+*:::��w�������3zpG1�����dW�o�+�7�����8�I�Y�7������+�7������
@v�� ;��������/*::Z�g�V��3z8p��\�Ro����l��
@v�� �b~�]1���8�>}��������E���x
 �b~�]1�����dW�o�����9=�X��j������;������d/�m�+�7������
���������+�7������
@v��w�kF�9p:@'���	�I���'�$q:�����	��p:@'�w��1c���"m��1��@����/N@��:;{i��iFIl��1M�Mdd��5kf�S�hQ8p��4�k�������:{�lF	�]F�����Ggp:�4�x������+��[��b��;���������������4c���N"'GJ92z�~/^�jM�����H��1c�h��1=�����Sj�����{�j��z�j,X0�Gvw���(>>>�����5r���{�<�"'�m���;�s��=�G�Q��-��_I�6l����N~~~<������`I����Z�l�E�������e�6l��#p/��gOd�d���5� ���{�6lh��<����Y�m�wI��q��=*I�����nm�6mZF
p������'� S�v�����K�l�R�����������k���_�����"���($$D��s�N
>\>��r���l[R���O��E)RD������W��5��������v���1c��7n���v��-z���T�hQyyy)  @�<��-Z$I:~�����l�Q�dI����d����������Y�f*T�����T�xq���W{��u8�����iS�?^���W/-Y�D9s�Lu�����_�~*[��r��-ooo�*UJ}����u�l��"E����Ey��Qttt��\�zU���rqqQ��E��iC���_�~
T��E%I,Pddd�m0���?.IZ�d��v��%J���3�6[���7�o��*]�����m>�v�����_���S�R����-OOO.\X�Z��_|��W��g������"777�<y2��e�Q�2e�����9s����)jV�X��{Le������5��~X�:u���S�N������������gE92z@�_�U��uK����),,L��o�g�}�	&h��AN�9n�8���k���,�������7n������s�N}����8q������v�������,c�����O����


U�^���;����K�.�[�n��iS���<yR�g���y�4s�L=��cij744T��u��k�$I#F���_~)WW�k]�<yR={��O?��b����u��q}�������f��)oook{�94x�`���;�������5p�@����3�
����������y���p���K�V��
�����}���>PTT�������;���7��{w�]g<��3�0a�����~[o����mg�����g�v�Z�7N�/V�:uR��1BAAAJHH���S��[o9�s����V���7�����k�����/_nw<�����-[������/�t��U����Kd�I��g���La���j������$I�*UR��}U�T)���i��%Z�f����$c�������7�(44T�r�R�~�T�N���k���z����)S�h��a2����C�:uR���U�P!]�zU[�l��9s����#�!v�w�}W}��$���E]�vU�6m�+W.>|X����7o��n3..�
�����n���X�b
�����q�F���)((Hu��Q�2e�jw�������bcc%I�����{��T�;y������3g�H��W����;�l��ruu��C�4s�L=zT�-RTT�V�\)��!C�����W||�&O��j�>i�$I���[�q{�o�����c0`�>��IRppp��z����%J�_�~�P��bbb�m�6yzz��7n�BCCU�@���_U�T�ts�w___�.::Znnn�S��������T�<y�����������[u��i�m�V�w�V�b�����W/����
Wpp�F�����[��
�l��Q����@�����z�!���O111:v���m��
68}������<92�,� ���c��dv����C�;j����o��6������
@vu��7I�%����M�����lbccS�M�:����I����;v,E��������4��������c<<<�$S�\9s���u���7E�1�L�����K�R�����V�6lH����C����H2���f���)j���L��-�������S�%��}��g6�l�<���6k6l�`�4i��L�8����I����|��'6��UBB��_���d�������m�����^�zY}N�2%EM�N���{�������������;5����Q���G�M��^�zV���w�N�����G�;w6��]�[��1$���_����9�c��m����vX3k�,��

�Y����Z�.[��n[g��19r�0�L����m���3~~~F�)S����GDD��;w:wZ��f}���+>c�]1�����dW�o�+2����o"O�<�e�����;1H/��j��%�_�b�~��wIR�*U4q�D���#E�AAA�J�������/R��y�T�xq�5c����7�����+W�B�
6�*V����IRdd��L���o[���Kk%��^zI;vLQ����9s�(O�<ij�_�~z���ln�������%I


M�����k���JHH�����M��^x��q,_�\?������v��!6�<==5c��,YR���'���y��'���'O�������c�����s�$�a��*U�T�������;�n@@�f��e��������7o^�u�k�V�"E����G�{��$��;�z&5b��������8I)���!I����������z���
dd������<ud�Y'� �}�����_|Qnnnvk_y���������
:�����t�RIR�.]T�lY���l�R��$�^��a�-K�,�$�����g��[�?~���7Mm;
�����Z�jI����O���8l+**��^�B=���N�c���n���n�$yxx����$<xP'N�H��e���}2{�l]�v-E����;w�$�X�bj����c�g��i���A{��={���S�4s�L�A�-�
R�\��G��]�t}j6l(��W����b{���(���4N�<�����S�J��E�[�������/0�2����o"'�JR.�����;�������_~�����U+���(QB*T��t��	�9s�
�o��Q#�mm��U			�n�����#�s���3g���Tk�:w��fV�XQ<����f��i��	N�����*U�8�)Z�����ixx����+�+W�(""B���S�6m�j�*�����7K�
*����>����/[�����l�~
6L/������5�|
0 ��s�����W%I�v��
g\�~]s���$����������;j��:�����;u��%��S{<�N�1F���Z�p�v����'O*22�Z��V�N�R��5S�~�������i��i��1���Y�F���t�K�>�}}}U�^=����Z�~�:v����zJM�6�������L��S"�������g<N@���s�4��9sF��`;�PZ�|�A8p���^��8�s��q�zHH�BBB�����0�k%������2e��Z_�ti������V��'q�rI���^�ti�7N�Z�RDD��n����[k��U��;������t��EI��'�
���uL
�7�xC111�<yr��}����$777��?[/^l��K�.����Y��-X�@���mM������g��{����u��m_�r���;w��"E�����
�o���
��[��
f������
TDD��/_����+g���]��4h���@5k�L9rW k O�<ud���'�\3z@dd�����;#�*�����3gN�����;��-���i������{{{�Z����$W�;���SGk��U�<y$I?���Z�nm7��n�xJ��7R����_=z��$���O�����m��o���;%I���W@@�m�/I��M������n]����/����Z_ q$��cz������M+x��7������>�H�f�����x�b-^�XO?���_||���r�����K�N�<���Pk���g�l�2IR��UU�n]�m��QC{���������k��y�f�;V�Z�R��E����[}�N��S"���12������WOP;r�����G����2����I�����T��=wS����v�Z���W����Q��x��Q#�������1���t�qgV"O����k�����m�������������=+�f�=c����?=����={�H��7o����K3f��K/��>}��[�n����:w�����;����C������`���IJ�x�(QB����t��6m���c��}���c���sz�������@fC������#�<8�p���n��~���T�>l]/R�H��-Z��u�����n�I�����Z����9���UK�������Y�Z�RDDD�Z???+\=u��C�z�T�zuI��Y�t��5EFFj����n��[���~�O���/U$
����c��5���?����Q�;�T�����$i���:u���1�2e���_$y����j���S�7���#�|�r]�pA�&M����$)$$D;v�p�- � O��_d����g�����3�Z]r���=�c����n�����a�-'N����%I���<��~5j$I��U����3
*�b��I�8`�n��
��x��F�Z�~����%I������I�&�������P5q���p}��7�3g��W�"W���>b����/��7�L�R�\9I��#G��?���#���l��k��O<�����6m���Y����K�{�1����}�����4t�P=����2�� c�������<%2����m#�<8dZ������M�f�������t�DFF�Y�f�>E�����@3@�v����������~���6�7���p;�u�f]���Oo���?�V�N�_z,XPm���$���o�j�wK�N�$�z��o������5k�]KZU�^]���W�|�$I��mS�-��������_=�����w������$M�<Y�'O�$���C�
�����]�'NH��T���?�Xc��I���SOYmL�6����V>>>��?���n�����o�>��m������i�������m��a�ir�J�������v{YQ�FFd���6�7���p;���#O��62������.^����@k�r��i����X�b��.�����z�j����8��1#G�nb~c~��y�=�����={�h��6���M�8Q�����g�}���~������!I<xp�|XX�>��S�[�.�}=��Srww�$}���Z�lY����h���;E��T�VM���W���%I��oW�-t��e��{���j��V�R�~��U�m�����U�����:����G����$������s�$�c��*\��m�.)yp�������u�.\�P����=���]��u}��Q6���a�
:4M����h������'Oj����n�%�Z�j��o��]z���t���5QQQ�9s��s�j��46 �##"#�+�7�78��_d�����F�y���8c�����$~��$�(���:uJ�Z��VB�V��V�^��f��������k���4"d4�������
i������g�A������)S��O?�o��*Y������t�R�Z���g���*Q��m�]�Z5M�4IAAAV�=n�8u��A���S��9�?��C��m����������/���G��7�Pll�:w���]��M�6��;�:�����������������dU�V������ys]�xQ;v�P�-�n�:���W...Z�h������'Oj���Z�b�}�Q��YS�����������g��]�V.\P�������;�{����0aB������/]�d��nnnz�����7��j����-[���(��7OC���19+((H|��"##�l�2U�ZU���S�%t��e�^�ZK�.����������g;���4j�(���X�K�xGDDh��1z�����A5h�@����������u��A��;W�O��$��WO������YQ�EFDFt�c~�������6d�d�d��C�yp:�:w���C�]p���l�R���$�a�����������#�;�1
�$����e��Z�h�>�-[��a��<Bd�������
�S�Jm��A]�v��S�����������������;���T�pa
4H�O������{�n�������r�������}��'2�h��EZ�hQ��^�z��7������s����%��
���s�N5o�\��������}�v
0@����|��&O�����E���o�J���Im��I�T�ti�l���o��Y�t��
IR���U�P�4���k%����{�,XP���W����}���x�x{{k������OS������={Z�#w�������}\\\$I			��e��l�b��q��Z�pa��r	��BF�=����-�b~c~C������62����3��q+�����[
6���GyDk������$m��QG��$���C����M�6-���c~c~���]��>�����y��*T������7o^��YS�����9rG��D�[����G�����T�R��+�r����y��z��0`�f����g��M�6�����>��M���G)RD*\����i��j�������������M��*W��
6X�b��]j���.]�$�f(�r�J���Oz���T�Z5���Onnn���Q�2e��}{�;V����BBB���U�V��!C�Xa��H��$���/���o����~��g�������m����={4t�P�*UJ���S�J���/h������o��Nz�{���\�r9�o���~��7}���z��GU�R%���Z���>���{k��e��i�
(��q�
�]1�1���������<%2�L� ���c��dv����C�;j����o��6�����$Y��m&L�`Z�hax����n���M�Z���Q�����p����[��>}�1����a���r���\�r%��Txx�����M���M���������7��Q��y��W��S�����oZ}o���a�?�`z��e����)R��i���Y�p�1��c��Ym����f%J�0�L�%�1����������M���OOOS�X1��O�g�����a��_�&MR��������W/s��
��%Z�l�����)S����+���3�)Y��y������km�k
.l$???�j?���&w��F�	0qqqN��������7o6����h��F����1W�\I�����[m;v�c����M�.]L������G�m�C6l0}��1�J�29s������s�y����#�<bJ�,ir��i<<<�<`Z�li>��siw��j�2�����9q�D��+!!��.]�H2^^^&,,,E�w�}gz��e��)c�����T�\�t���|��G��������o�o�0����f��6���?~��8_�xqF'��Z���d������g3z8�^�N������;3z8�";���dW��]1�������l!#J�����-#b~c~�����-;�o����m#���R���)'�g� ���7�#�6�Uf��m�f�+���[/���f��iv��5�������[�vn
���������o///b�og���_~�������W�^���#i
�.^�h�4ib��9r�9s����pj���V "��1�����m'��'L���OI�[�n6��7�x��	N��I�&Y��G�N�>5�/_6^^^F�)]��IHH0�����Z�L�2%�v��S�2��u�y��SO?���������z+��,�)R����/6�9m��4���W[����K�-::�t����1=�������o�o�0�%�����6����q��y����t3d>�|F)S�����E��=3z8���'��u�����8��4��>�]�@v�� �"#"#���(92"��������-)���������;��62�{+�e����@6�w�^5k�LQQQ��J�*�o��*U������d��Y�F���


�1FAAA����o�\�r�_�~�S�������~=��V��)S4l�0c����N�:�q��*T���^��-[�h��9����������{,]���w��G}$IrqqQ��]��M���K�Vpp������������S�n��i�&��__��uS�b�����k������SPP�����2e�8�������o_���J�^{�5���{��w��I��[Wg���$U�^]�;wV��e����C�i���:z��-Z���(�\�R...VC��������xM�<Yt���I�$Innn<x�S�����[����g�m�����$I���i�����Shh�J�(�~���B�
�����m������~��q


U���U�RE��k�.���Zu���rssS�:u����G>��������x?~\�}���n����O�m����{��+���^�z��_Txx����5z�h�����-��[��
�l��Q��|�rIR���gO=��C��/�bbbt��1m��M6lp��eu�o�o�o�1�!�9��.^��J�*���!C�h��}������@��r���1Fo�����s�=�q��O�3F����8��QrdD����[r�o�j������#O�9�wTF�bw+P����dW�qu���xS�rek�������uS�N�V����V�M*������>h���/�}����xxxI�\�r���6����o�)b$���s�K�.��Imu�C�wwwkU��K������2-[�LvR[9���g���<x�U���O���uu��'WWW#�����O>���~�JHH�VEvss3�'O�Ycz���p��N�:Y����k�����[u���wj���Q��u��=�l[�z�����������#K2�;w6��]�[��1$���_����9�c��m����vX3k�,��

�Y����Z�.[��n[g��19r�0�L����m���3~~~F�)S����GDD��;w:wZ1�%��v�[r�o�oH�_��H2�j�2#G�4���f���f�������7��c���K�q����������9s��v��Y��]�v=�l���#&44�|��7�_�~��~������&��i��} ��58����
@vEF��MdD���%����f�����������;�����xFg����
d��������dW�"�J�R�j�d�.[���V�Jg�����[��=�\��I�)�T?������d�����#G��Y��j{���)��N=�����W_}�n?.\0y��IS8��_?��]�|�xyyI�l��6k��S>>>�u777l��[-]�����w�qX{��uS�dI#�T�P!����W[m=��Sv�2d�U�|�r��j��]���5j�b����?k�K/������T@@����tX��1���cN�:u[�%�>}�X���7Rl?x��S!�{��g�M�0!��3g�X�^~��;6vg1�%��v��������>��{j�R�J9�B����/�H2t�e1���_lJ��o���Cs�i��} ��58����
@vEF��MdD�"#"#����1�o�b~��x�����G~oe�<��SWdC�~��u��_������W^yE...)���a���^�������Z�t�$�K�.*[����Z�l���K�V�^����%K�H�\]]��3�����?�������_x�������Z�jI����O���8l+**��^�B=���N�c���$OOO��Q�<<<��c�I�<�'N$���eK�>�={��]������H��;W�T�X1�m�����3m�4�z���Sl����<==%I3g�Tll�S�4H�r�rz]�vU@@����i���$)::Z{��M��|��
�$�������)j�1�:u�$���;��������s��;6����-9���������<����;w�����j��)  @^^^���R��E��CM�<Y��?�������T�dI
4H�����/��C��\\\������_U��53zH�=2����n"#"#����c~�����
Yx����[d���#�����;�������_~�����U+���(QB*T��t��	�9s�
�n��Q#�mm��U			�n�)���#�s���3g���Tk�:w���a����8�o���&L��T�>>>�R�����E�J�.���;��X�b�r��"""�o�>�i�F�V�r*X��y�$�P�B����S��|��u}����>�uqq��a����/+<<\�������?g�]�zU�4x�`���3�_��9s�H�r��i3���7�:v������������K�T�N��x;�����j�����c�N�<���H�����?u���eG�����^����6m����l��5kt��1I7C�[������W��~��g�_�^;v�SO=��M���������1����f����g~Cf����^�z�W�^=�L/$$D!!!=����1cR�g�;��R"#��������;�o)1����vg������;���"�=������;�����3�n?��6�������������@�����[���AaXX����t��i�z�2eR�/]���m���[+F������TWG.]�����V�Z)""B[�nU����j�*�����~QQQ�x��$���N6I�:��
�o����M�<9E85y�dI7W

JS�,^��G�.]���k����Z�`�$)88������1��g��U����u�V���r����w��YE������7�x#Y��x�%i��a6�������@EDDh���Z�|�r�����k�A�
T�f��#G�����-%���1�����
�Y��DF�:2�����[�o)1����-}��o���5�p7DFFJ����3������-9s�t�Nxx�S�������(����w���Iru����SGk��U�<y$I?���Z�nm7��n�xJ��7R����_=z��$���O�����m��o���;%I���W@@�m�/I��M������n]���� 544�
XI�������8�i��
�����~�����>��Y��p�B-^�X�/��O?m�o��9rh������'O*44��v��Y-[�L�T�jU��[�f5j���={4p�@�q|��5m��Yc��U�V�T�hQ}��������[J�o71�9������R"#����12����-%�����c~�m�����w�8�\�z5����4�?~��1i��E��):::�zg���T�vm�]�Vy���t3rP%=�5j�H���u��D#F���']����z�����Z�~��s�6m���b������g�J����1���O����k��=�����������3��K/�O�>����:w����;�|��N�9t�PkE���888Xqqq�R?�%J�Ppp�.]��M�6i���j����9w�����;��uf���������c~dedD)�����>2����-%��1������8dK��ts��s���Z��a�z�"E��o��E��'O�Lw;�H:�?��3���G����8�V�ZZ�n�P����j���"""R����Y���S����������K�f���k��)22Rs���t3i���m�3}��4������o���X�f�u���?w�;v��6��cGI���+u��)c4e�I7������<==��qc�9R��/��4i�$���K�BBB�c�������Rb~���}�o����(%2���GF��1�����/�7���w[���	c���[o�%I��a��6m��������H��a{��}���8qB�$/^\<�@��m���\\\d���U�4n��t���B�
�X�b:y��8��g�:��
��X��F�Z�~�Z�h���0���/j�����Y#??�d�M�4��+t��y���C5k��#c1b�����p}��7����V�2d�\]oo�������X?�����V{�g��9:r���9�~�A�5��q�U�
��T�lY���V�r��#Fh��������i�T�^=?~\���c����7]�������C��~}����~���=N2#������c~���-�:~��J�*%I�����Wz5m�T�6m��tQ #���QJdD���FF��1�������m�o�8�����dr...v/>>>*V��Z�n�q��9���{���n�^���w���)��o>���?�\c�������C�)G�l]�3��7������T�f��}�-j}���k��������>0R��[7��'�|���x��~����l����`��j���$���~�V��[:u�$�f2~�x�u/^��Y���X��z��Z�~����'I��m�Z�h����du���������w����{[A����5y�dIR�94h���n���:q��$�J�*����5f��T/O=�����i�n{i���c]���?����?_���s��-Z�\�r�n�������a���c��%�6�w��ef�o�1����f�[��d���t�s)�		I��su��9E[�����,Y2]�I�FZ.y����^��%����W���9r$E?c��I��������&2p �#��xm��x�Fn8nQrdD)��FF��1�%�����m�oYx����v�9k�p:��EGG���SZ�f�F��r��i��=,�X�d�._��Tmpp�]M����������E!�l����
���%I������[U�b���]���k�����qqq��E�<��#z���%I{����#l~`��'J���������v�����<<<$I�N5�
���~�u�������zJ������?�X��-KQ���{g���U�����+��������E��^3w��]u���ts5�~��Y���U�V��w�u��������'I����s�NIR��U�p���]R�`)i�����{[����y�cI���k[�G�e3���a����v]\\4|�pI���'�t�RI7W��U����v�����zKg���[��3gZ?W�V-Mc�j�����f��m�oY��%K��[o����������/������;U���Y���(d�@�D~w��@vG��]8���_dD���FF��1�����6�7����62���<{�s���������'�9**J��9st��QEFFj������W�2h����#����t��u}����V<�����Z�dI�}���f�%���$q�����Sj�����{�j��z�j,X0�Gvw�����@488X#G���!�quu������AEEEi��)������o_�,YRaaaZ�t�V�Ze�3~�x�(Q����V��&M���� +7n�:t��r��)g��������m��i������K������������o(66V�;wV��]��M���[�����u��q���C�|��u|2��U�j���j���.^��;v�E�Z�n����+-Z�H������'5{�l�X�B�>��j��)���������g���]�.�y��z����=|�pM�0!����J��.]��777=���N��?~�m�V��-STT�����!C������>�@���Z�l��V��~���D��|��V�^��K����U}�������n{��5j�bbb���v�#""4f�����j���4h�������W���:x��������OK�����������,������-}��2��%K���~�Y4k�L�<��S�w�K1�)P���� R��%G?�����6>>��	�snEdmd��2����iCFDFDF�>dD����[�0�e^d�d�@�a������H2;v�����.�d]����1��u����/G�=�g���[�s3  ���Q�H25j�Hu�/�����S�N�������Aga%J�0�L�%2z(�Mwkns�52�
6X�_�&Ml�>|���$��
����{;�{(!!��.]�H2����^����=<�����m����E�&k�������:u��6�O����c�V�2E�q�w���������h��7��j6l�`���^z�����m�W�^������<���v��z���V{��K����-��~��(P���z�����K��s����m�:u<%�������1�4i����t��&!!��������6y��4��h�"k�z��%���q������V�\i���>gf�����F������DFF:���q���y������������lc~c~c~K����J��#���^I��q�yj��c�����9��h#���I;v�h$�B�
���X��}��w�~I?�|��7o{L�{����d�Y�a����!2pdGY�5�#��M2�{#+�6��!3���C�x����72"2����DF�/�7�������Rb~����3������/Y�s���N3�28����S'N�Vd9t��<���`��A�$I;w����{�K�j�����+���2���w�a������$I�<����Y#??����q�F=zT���G
>��6m�������k����?~��7o�B�
���]y��U��5��k����#


��}�n�ZG�Upp��w��R�J)W�\��#��������k���9s���=�6m�����>�H�6mR�=T�Hyxx�p��j���.\��s�*""������7���\��6l�`�U�]�v�y���t��$�`��Z�r�~��'=��S�V�����'777����L�2j��������]!!!N���U+���!C���r��%���$���/���o����~��g�������m����={4t�P�*UJ���S�J���/h������o��Nz�{���\�r9�o���~��7}���z��GU�R%���Z���>���{k��e��i�
(��qeE�o�o�a~K��
�3?�<w��V�X��6q�(\����m{���������d�d��=dDdD�!#J��(k`~c~K
�[J�o��A��!������Upw)
+�U�V��]�t�����������
*___���e�/n}�Q�h�"������V���������n���v�*U�d$���\}j�����'�4U�T1���&G�&_�|�|��&00�����<������=�����f����Fg�1{��������gF����c;w�4����y��GL��%M��9����y��L��-������cIW�J\���������3��W7~~~����T�X����K���s6�I�z������q2��1c�$��i�t�)G{�J]�|�|���a���`������(P���?�1�����|�r��c��+�%$$�3f���@S�P!�3gNS�bE������/&�7""�|��'�V�Z����x{{��U���>��\�~�a����f��5���_6�76<��qww7����D��{��f��&>>�a;�V�;t��y���L�r�L��9�����W���������{��V;[�lq��5m���g���N��e��C�1&::�L�0��h��z�����Z�j�Q�F��������#;v�0��
3���3�r��;������?��4o��.\�xxx��y��5j�W^y��:u�a�iY���~0�z�2����)R��m��,\��c{.��������������M���OOOS�X1��O�g���q�z�?�`������z�27n�p�^�e����}��2e��\�r��9s��%K����]���>����p��F����3QQQ��ir��m����y������y�fo�n���c�\��j�V�\�x�����)^�����H���ch��
�O�>�T�R&g��6_���o�Z��$���jN�8���J�2����	KQ��w��^�z�2e�oook<�+W6;v4}��9y�d�}�Evy����?�z�/^�8���iT�Z�H2�������=�l/���;w�������-k`~��������������t��a�5k��I�����Y�m�6����^J���{����]n}/ek��o���<��#�H�"����.\�t���l�����r����{LL��W@:v�hw�.www#��9�L�2����~����z/�~�z��������OOOS�`A��#�X�8#..���=�t����(Q�x{{�������_����������C��O>1�;w6e��5>>>�1i���y��w�����������yRd�Y�a���������d���d��#'w�����fp����<���������62�{+;fD�x�o�1��[�q~#O2�������u���)'�g� ��������g���7�fM\\�y��'�����I�Q�F����)�����>X�W���><����e���;{��U��G���~�m�������C�zl�5e�8��cz��e$�|���
&�y�����/;����[N�(*R�����_����7;;v�0����^�B��o����������c$��%K���MRqqqV��+W.�B��n�E��+�����������+�4&[������4�Z���g�������C�\�rvk�6mj�]�f��f��9u|4h���[_���9�z�k�R�~}������[5���K��%���q��N��+3����m3��s����6��M������?������h�����o�I�y���eBBB���l����/;|-��W/s���ds�-I���/&{~�z��#��3g��1��W�\��96b��T�$c�1'N�0���O�9��[7���o�a�����I�����G�Z����/[_V+]�������j�3e��T�I�!��C�L�n�l{���O?m�>���N��;m��4���W��C���M����O>�j_i�]^�eg7n�0=���n�0�����~��G�y��g��N�w��	��A��u3z8Na~����lc~�����6�|�q4q�D�5���J����N�;v�U�r��d��v�~���d'���7.�����)|������9r��<��O?��9x������z��|�����sg�p\�����P�B�����z�������3�z���������f��9kz�����4��>���>�SC��$;}���X%'7�<88xrd����;F��"#�������2��m�o�Vv������<%2p��[2�����f�����l!..N��~.^����h����$www���G�7����������`]�pA?���7n�_�U�r�����#�7n�+Vh������T���������'���?����'U�X1�u�����-[�L�G��$yyy�c��j���
(����9sF�v����k�=D@�1h� ��7O�.]��e���{�d�o������Z���kW�����v�������:u��?���|�A���G���:~�����;m��U�O�V��m�{����[�<yR�<��.\��n���e���������5y�d���:w��z�����w��������W�?��&O�����k��5j�����V�\�S�NI�{��sKj&O����h
:T.\P�4y��u*TH�������S'���I�����^�z�H�":s��������Yaaa�������;��#-
�5k��n������t��iM�<Y���G��o_-Y�D-Z���S���{w�j�J~~~��o�&L����/k���z������o��+::Z>>>j���j���R�J)w��������`����������Km��Y9r8~��j�*-\�P���z��'U�vmyzzj����8q�"""��O?���^Jq_�|��:t��,X�/����c=����
s� �i{��U�f�%I�T������R�J),,LK�,��5k��� c���o��F�����+�����:u����]����<`�M�2E��
�1F����7n�B�
������e�������
0@z����u;�}�]}��G�$u��Um��Q�\�t��ak��yJHHp����8u��M�6mR�����[7+VLaaa�?�6n����8�N�:*S��S���?_}��Ull�$���^�{����~'O�T��uu��IR�����sg�-[V���:t��f����G�j��E������+���b�1d������������5p�@�}N�4I�������;u�I��%�_�~���>�@�����{�9����D�����*T����m��M���)������P(P@���W�*U$I�v�����Uw'������^|�E���+88X�G��������x���s��Q��|�rIR���gO=��C��/�bbbt��1m��M6lp��!k8��.^��J�*���!C�h��}������@��r���1Fo�����s�=�q��O�3F����8�p�[�0��{�u~k���\\\d����o�=������5j��:www5j���1<��3������o���4i�
,��.��v�

���U�re=��c*S������|�r-Y�D�4r�H��__
6tzl��A�i��������Y���K/���>}�$�A�*_��~���;����\o��	���o����A��f��������[5c�]�~]K�,Q����h�"�m���KM�4Qdd�$�Q�Fj���J�(������W!!!:w�����K��q#��<[���%::Z...�Z��7n�
*���_�t��)�[�N�V���+W��[7�����Q�F��2�����7�}��Y�md�d�d����<92pd5dD�CFt�e��w�[�0��{�u~#�#d�d�w����x����;*�W1���$+Y8��g�Yu~~~6WM���o���a�1s��S�zu�n��)j>��ck����Sl��G�$S�vm�#G#��J�C���9|�p�m����V�q�����3[�l��Y[vYa/�q���{||���z��mS�'}��[��c�Z�}��m����v8�Y�fYU!((�fM�U�$���s�M�6�����4��U��-Z��f��]���]�:[��������;�u$�j�����4�
��3fL�U�������B�
�ye��n]��*IW�^5�+W�jj��i�������S�����Z!9o��v�����km���(66�<���V��f��Y�t�)��_�8u�T���\�r�����VK�������-&&�����H7�jBj�kev�q�����d��������uS�N�VM����V�N�����>h���/�}����xxxI�\�r���6����o�)b�K�.]JQ�����2�����r���)j���L��-����VO�|��g6�l�<���6kn]�}����|���b>�����*!!�Z�����L�<�f]LL���H$�+�w�����w�^�}n����k���S�LM�5��~���d��������;l��U";w���/e$}I7��EXX��>�����>�����e���u���5v����m���3~~~F�)S����GDD��;w:wZe��nY����j$�Z�j��#G���`�p�B3}�t�������[��|����������kBCC��9s����L�v�2zh���#GLhh����oL�~������;�M2������<��{�~���/(P ��&�j�
40����u�{�7nX%�A�)�p��{����m���������6��w�y�����C��:r���n�1
64�L�J�R�o�����:u�1��������z��,W��9y�d���~��(P���;wn����(S�ti��{����������k���I�g,������#G�8�Y�v����6�L�����e����yo~+�����0�s��l2pd7��3���98�1d�I����C��<92p2p��������)#�����<��{�~�����G����wtU��wSHH�W���^���AD�t�RD��^�w�H�IT�^�@�|���K�%�d��{�����s������yg��"'��Z���S.@���!B�rv ������]����{�<�'�x��w��S�1o�<��<v���9sfC�`�;w�f�����zh3-66���1b�y��{��	�S�D	C�Q�P����)cHq>�]�G��%>|7��o@���&.[�liH2�-jn�����[�n����;wL�;|�<y���V�\i������2������q���eN�8a��U�Z5i/�?��(������?���N���I���~���Y��=��C�����F�rX�W�^f��7&�mQQQF��E
IF�f���������3���O��
<�,;s����\�bn�� Y�����z^y�����4&5�wW��+���l�2s��>hDGG;\N�����/��R�������2�k���yp��������~'\���?��9��7�p��.��esy������m�xW�\1O�)Y���2��{����	g����.]j�;b��eo��m~���-�`��?�h�5`���X�Pi�����>q�~��	���7��W_}�i]��
(`\�~�iy��Ppp����������a.��I#G�4�}��6���9cN{���<�vwe�m��*>�r�(V���j�w��#���'���H�������9�6���y�����R��������k��w����������]k>_�n�M�M�6���~���H���a��	��x���F��}S{'���������}XO���y8
������y���6���!��c�
�=y\������c���o�����\�r���}��9���-�.^�hd����d�l�2���cI���~���������zb���4�cf|��;w#GF���1�_����
��8�a���#�?2p2p$
����R���!e�����-u�K������������{;;��t�b��<���U�jU}��W����$u��MC�M0�?�����wK��/��;:\N��E��OH�n���~��fz���#GI��u�l����_.\�$5i�DM�4�$�_�����'���K�7n��
��������[W�^u�V �z���e�X����������j�������0Y,�/�^�z��������i�\�r����r8�q������$8p�n�g�yF����'�-3i�$���H������x��E����vZ��7��;_r<������'I���U�����_�������In����j��%I��}��pZ��GQ���N������>��eS�.]�������z��o>�����6!i�?�����|}}�}�������w�^�z�\����W�^���K%I���W��%����C)������iY{�,Y"I����/���������_~���l���Z�j���m"##��u��M�y��e��S'��1m�4IR@@���(I�2e2������8q�f�C=d���3g���[	��~��f��-I*T��Z�j�v[�4i���G�	�w��Y�����+**��z{���������C(P�������-S�����r�J�<y2A�04q�DIRPPP��iPP��<~���
*h�������*U��
(00P���*X��}�Q�?^���*T�����	���*Z��z���;v�p���nR�f�XT�@u��Q;v�P��U��$��o�G������-~;UJx<8��R�J�I�&*X���rw��Z��8����y�:22�<n
�t��I�����)S����9s��e�?���:���ysU�T���6m��L�2���~�MG����_^�@u�����r�����[K�6l����o;,��KbY{��m[��K����}si8�q���"O�����S�-2�8d�d�H_����(u�R�[�����{�#�3d�d��5?o7�g���O��O�	:��������z�e���E3$��m��~�is����6l���k��}�x��r��%��Q����Q��"##5r�H�<yR�V�R�l�I�7��7o���w����j���
�GyD��es����"E��I�&Z�v��L��7�xC�4u�T����b�(,,,�����+Wj����k�N�<����+::�n�S�N9�)�^�����\�r�����r���2�:u���u��%M�8Qo���Mc-���f�������%�������[W����y��v�����X��$o,�����|������)��Y��U��z����s�j��������;�7n�
�����t��k�v8M�����]�<���{3~�x��S�f������YR����~������N�{�Zo'4o����E�Q��eu��!�8qBg��1��Y�b��-[��p����P�9s&�'��;w�3���~���=�7�_|�V����z������>���W�:]~�B��k�����W��-�j�*�Tl��Q��7o�����n<x�����bQ�~���k������;wn���Y�f�������{;=q��o���Y�$I�3g�{�A�����M��?_���������������19�=����3�h��u�o��a�l��^�Z���w����,Y��V�Z��m���]�6m�h��j���2e����A��.]��'����S�j����n�=c��a	�3 1���G�������a�����Qll���]��^z������iSIq�R3f���u�4b������O�H����<):^���=�Lgr��ms��3e��u����`=����4i�����O?�T�3g�������OH��z��5s��f����?��wK���%�O��g�$)��Z�l�������H;v��{��}���7k�����}��=����;<y���S���n)�>��d<d�@�BN.��Kd�)�<!2p���=S�i����R���!e�����-u�K�x����������3p.@����o���'�p�B����:{���{�=��Q�nPr����;��u�y�5i�D�/�aZ�~�y`4~��������Ou��Q@@�n���u������h�����_]?������������������|�A��][
6T�V��%K��H�z����k�������i����o�$7i�DE�IT}g��U���e���	w:=��g�G�u4�q``�z����>�H����5kl��+V�xO>���G�r$<<\��%J��}||T�dI���W�n����W�;a$U��9N�_]��������/��K�.vGv�U�����N��U�����k���7o�>��3�eZ������v��%�|�o}hh��PZ��N8t��9�������=��7�'�@�����.+I�O�6��(Q�e��gw��������|������y���v���l��-Zh��U��z���yS/^�w�wik����={��w�Qdd���� |�������W�^�Z�=�/6���}{��z=z�����%I�'Ov����<&��'��k����O�O�������;�����N���W_�I�&�v���/_����+s���^������&M����p%[�l�\��v����7*&&F����t��yg��c�����;t��
���(22�]:�xqj��1��*\�p���SRPPP���g���4i�����`�=��S��%K�T�
<���<��a8c]��x���'��v������x�����qC��u3���W����?��Gb���Od�d��X������G�<i��"w�<i�������'
88�}=O���RU�v��G�����k�i��m���O$�����c�������������].�:���7�u`?rOLL�9�h����@sd�H����%K�P�B	���5��n���C������$���j��=���o��K���W��k�\� -����yG�)S������#G$�m�&Ftt�Z�li���=��w���>�H3f����x�b-^�X�?��9_LL��z�;�y�~�������L�7��\jIl�(�����7�����cj�����,YR����Y�fi��E���q���|���x��g$I�n���3���}���M�&)n������}��gO2g�����Q�����e���y�|�����������5jh��5���/���-Z8�!N��)Iw��I�9r����?.I��u�8`N��s�v��-Iz��GT�@�d-_�y7I�����r-Z�0OY�r���E�������������S���%��Y�r�9�������+VT��5��Q�J���WO?���9�u��6n��Q�F�y��*X��>��S��
�=��{����s�NI��
d�,�y<!�\TT�6m�$)��_�#\��+5��~��N�:���S�L�������#�K){\�����X������������������h��i�?���j}wW�]I����}y�8822�8d��+�8\!O�<�sd��W���2�8d�d���K/���]�J���]��>�,A��B�>;r��
���+W�����k.S�v��m��XoD�?��;|��Y�<w��a�t��)���W_���u�f�0����J���s�5iM``��x�	I��������K�Q�C���k�����w�$�i�����4m�4��������{�1���2e�x����D������-��s�$��V��4U�T)����~Qr�7�U�������������_|���^O<����oo~>\�4��t�����K�=9c����t�����L�2�z�������.X�h}���2#Q�����������mQ�zu�Y���~l���io�~V�R%����#���?AF���z����7�+%�e���X,v���:{������'����������9���{<y�dEGGKr�~)RD�'O��K����?k��Qz��G����s�4p�@����{��q�������*T�`��^�H�nZ���/�rv<�[|��a�
2D�a���W=z����R���;�Y����z��C���/o���[���-[�h������G����s�����{��������Z�r�d-���t�@�"'G�DN�Z���
xBia����i8\!'�2�qVwp:�A�3���w�5��x���$>|�e}����<~����o(>|X�N�27�r��i���;��8`����h?�E>���y���1C����V�^m���}���.����Q�o���E�I��x�	&����W��?��S�,��KBK���g��7�����%I'N4GJ���%)K�,fw��Q�#���������7�P����A��#O�<9r�9�=��|d���������[�J���,����������o'\�~�<9�w��Q�`A�y��y)�����eg�=���q[�j���O?���m���ys�w���5�����)���V�Z�N��3t��-]�~]�g��wp�E��^��)S}RE��������
P�6m$I+V���S�d�&L� )�D�'�|�����A
<X��/��4n�8���K��N��]�v�U�m���7�#���6mjS6�x���BBBT�F�Ti/R_������'�0���5o��#w
�[J���;�3�e��7X���>�a��>����o�5�O����H}d�d�H�����S8\!O�����#��������K�8�;�� ���o��y��U�5�fz��5��k��qY��?�hw^k����u��~�zIR�F�l���5k��u���p��b�C=d��-I�6mJt=@ZP�Z5=���6�?RRb���+I%K�tZ6~�����uk����'���Y�fU�.]<����W��bQ���%��J�e����l�b�JT�zus9�A���X�b�����9s��8�������?~����m��QR�N|�%���{��o����='N���!I*\���9W���o��������k�A���7���^��*U�h�����#�$��_u�7l�PR�I��U��3����Y�f�}b�>}��'���j������������Q�T)Iq'�zc{0�~�����M�4I�W�����%����%K��7Vqw�����yB��q���?n�-���
+~?��Ilp/���8�N�j����fiAXX�����"�����8�/���������w���{��=:q��v��))n���/�m���H���H9���S�V�l�/)�9�������O~��'���1�\�r���w�\w.p������\��e}g���g�cw������S8\!O���}d�iy���������2p2p)�guG�z5�=��W_U@@�$��������)��U�J��t������4g�Iq#F�n��n��Q|�����7o��pc���_����d�?����'O�^��b��������\�m/���j����5k�C���Jb���"9�h��������������5G�>z��^~�est�n��)((�#�������.�>��c����G;-k}R��|�A������v������z�?-]����1o�<}��G����3����3=v�X����=��%���'Os�|����h�)�m�����^����v��Es����r��Z�v�r��)I��}��5k��W����������������]�*k����N�?~�$������Ir�Y�F'N��$=���3f��
��1`���I�&%���R����53O,�4i����s�'�D���,Y���,��]J+�C��<��k��.�p�h��Ij�u�y8��h��6�j���v[>�`9��
K��B����O5l�0}����n
� =���=zT����m���K+g�����W���U�D	�i�F����={\�e}B��
\��X,z����j�uz/��#���u��F�))�xO�
l�������j����2)bY�?�#�w��o���q�F����)!����Y�F���s8��~0O<�R�����������
2���<��}��[���s�@ZA�Od�d�)�����"O��>2��-=�1d�����?d�������C�"�+d�d�R�>��.@2�����?#""�o����_?���o	��t��:v����IR�^��%K�T���%I���7;��M�&(�a�b�
�?���������8I6!+U���,�����C��m��m��p��$�a����[v������������[�����/����O�����.]2�G����7o^Iq�#F��[n��Z�b����Sj������x����k����c�����f���8""��3@��yStG
q~�aU�PA��w�^=��3v�M�:�����_L��G��L�2I��#\��/_��l3���`�Ac����e�����P��]��A�J�*i�����+�$i���j����\�b�����9���U���{wsD5{bbb�j�*���{N�����K��q�����6m�(���z]�mpn}�+]�v5���t���d�%1R���b�������'Oj������T�V��|������3g�8,s��MM�>���^��^�d�������������_����*������O?����	��Q���=y���u����K��W^��e�t��a]�|Y����z���=����k��a�\����/���g+66�c�����u��i��$�����;T�^=���������������'�u��O���y���q�������)!������������<xP�z�2�4hP�2�=��y�����5x�`EEE9\��;w4o�<}��WN���}����+222A�}���c��n���qVi8�>�����42p�B�d�����G����<�^@�������[�K�GW������}��~�n�<x�&N����(}���z���t�}�I�;��[7��9S�/_V�Z���[75h�@�2e����5i�$3/[��>��C��k����M�f�/P����)c��d;������'j���*[���4i����+g�������'4�|3���=��y��D�K@���W/}���~���-[��+�{��*R���\���QK�.�����xC�|���}{��7�����k���'4k�����o�����@����w�d��*Y������M����[�#2�\�R�;wV���u��Y��3G[�n�7���i�������^zI�W��$���kZ�~�Z�l��y�����7o�v�������B�
f����M�w�}6;7={�4�5���9Su�����75a�m��UO=���-���/k���Z�j�9����"E�${��*U��q���W/3���������T�R��9��]��#G�h�����q�����4:{�2e4d����;���R�v���C�l�R������?5e�?~\�?���W��iA���v�Z5m�T/^��]���Y3���O��=�,�.\���k�����9s�~��u��IU�VU�9���Ok���Z�f�.\���M�����v�������/���?O�<u��%3\�����O>����r�R�V��l�2��ySs��Q�>}��&w���oXX��z�-��%���k��i��az��wU�N��SGe��Q�,Yt��U����={�����U+�@���E�z��iE�����/�U�'���;wn�N���[������hM�<Yc��qZ6&&�<�$~>�����
6�����$�m��SG
4P�"E�={v��qC����������YW�\������]��B�
*_��G�r��-
6���6�����*�B�T�N����.Gto���:d���#G�O�l����|��A:����)cnk���C5j�H�2<���Z�d�[e�����U��^��r�-^�r���k���v{��u��(���=��cZ�p�x����KU�TQLL�~��M�:��G����:w��`��� -[�L
4���W���j�������*V��,Y�(""B'O�������O?)<<�&�O�:�p��:q��v���2e��w��*Y��"""���?k��9���R�=4m�4��q�@ZB������m�����
88x����]-�������iKF�s���ReYH����<e��'D�FH�v��eH2v����� H2�z����y�{�9�iQQQ�3�<cX,���~��W�8���eM�:�f�n���-md���,���c\�r�����Q�pac��n�7H_f���!����k��\�[o�e�3e��eV�Xa9����O7�L����c����{����mE�1$E�q���_���]S�Nuk>w��q�([����a���	���������;�o�g�n|����n_��
�����5l��i9�����3�6l���W�Hc��]F�=��;v�X�z\}~�%��d�1t�Ps��b=z�����������p����t�Y	

2&N�����|F��Z���������0V�\��������.��W_u�-��K���C��/����z����nY�]}�
�0���o������r����K������3Z�j��6���Q�>�x��Fll�[�9��'��u>�����������j�����}����!k������������������a����A�nm�'Fz�vK��#1���b��q�{�������m)Q���~T���MC��7o^#**��|���9_��m]n!mH�~CZ�����(=���a;w�4�e�j��8t���y���c|��wF���
I�������~M��3���___��?�p����U�^%�3�$�k����v�O?�d���l��o��i��C�����m������$e_�����<�f���.��$1��m�&�I�o����M��o&L����7O��{����+.��[�n9m��#G��5k��^[,c��!	�H�~���;�\�r9\����1j�(��'z�8�'��d���0����E�� #c������!'w�<����p72���cd�	���_z�~Ky�}d����-=���A�����2��#O� w��������i�����������7����'�i~~~�����c����Oe��QHH�T�P!u��Q.��M��;wn���{tG������a�����+WV�l������j��������U���9s���O*X��~�a�7N����U�������U�V��w�����b��)S�L��5���+��_~Y{���SO=��f�^�z��9�$)[�lz���=Zpp��m��!C��Z�j��5����[�n��G�����W��u�+W.���)W�\�S��F���G�:�+�:t���[�v��)o�����W���U�fM�5J{��Q�*U��L5o���y�b����{O�����_���?W��M��J���U�jU����:|��GF$�[�-t��QM�<Y;vT�b�"???e��]�+WVXX��O���g��e��I^�G}���Y�?�����>e��I���W��-�`���=[��]3�����/����/����+O�<���~�MM�6��K�$Iy����+�u�V
0@�*UR��9������`�(QB�<��F��h���n-��;��OY,�d����'���w����y�sm��MLv�#%����]�*$$�i��
j���������S'�+WNY�d1�{�����kW-[�L?���[��@j����$���s�������7����V�Z�x��n������������O�����-�t>u��U;w������@�����^�w����z�#u�`}�7  @u���[�q��6������i�4a�5i�Dy����qH��zc���O?��N�:�P�B��)�r����-[j���Z�d����D���m�~��G���[���S�l�������P�-[V:t�g�}����[��O�[!I�Z������W^yEe��Q``�BBBT�ti���O��o����������2p��D�m3����2p2pW��"<������!GZCn�<
��e��(o�b)��2������8Q��_|��|,Z����I�m����n~/^����+V4$������g����zT���w{�9.�������|M����2�W����_~�[n���f�W_}�f���C�G�u�pg��E�?��q�}��2e2���ot���������S���F���4���M��\�p����7$������aW�\1>���^�zF�<y#w��F��u���������h�k��5:u�d.\�0���c<������nWtt�1s�L�c��F�"E��� #88�(]����wo�wF�7z��]��~���J�2BBB��,���c��5��kg�,Y�6�����#F�0.\��p��������K���~�z�[�nF�b����3�Y4�n���&�����eV�R��s��G���������O��0����_������e��uv��-���>3j��e����4J�(a������yEDD�G�6�U�fd���		1���~���^3N�8aF�F�z��1f��i��F����L�2��g7�T�b������S���w��Q#K�,�$#00���o��e���-Z�0�4|�p�^kZ�^�7��<5�?�����u �b<�"�3d�H+���#O]d��1d�	��������>7q�������{x�����;��T��7��������� ��y���O�.I*P��}�Q/�����(�7NR�h��F3��l��U{���$u��Ay���r�2��'O�����$��YS�+W�r�<�q����u���-s���S�S���+22R�:uR��b�
�>}Zw����3g�h�"5l�P}�Q��)����5��b�
�;w�n�3f(**J����O{�+V�P�%��oh���:�����t��m��Eo���J�(�+V�]�+����M�j���:q��n������k��������o���o;����*_���u�����QDD�n������K'NT�������+&&��v}����Q����������	�L�>]e���+���%K����#�y����l��I����J�(�r���H����/�q���9s��;�[�ny��i}������~j����o{}Di����������[c��c�T�F
������m�._����H�������oU�Bm���iG���>���k���
��7t��!}��G�T�����=���W�������j���:s������+W�h���5j�J�,�i��%��X�b�~@dd��t����3f�~��GIqw�y����n# �!�#d�H+���#O]d������1��������C�<���#O2p2p@B~�n�wl��Q�W��$�h�B����[�����?��+W$I�������������*W�����������~��wIR���;w��lb�d��y����^z�{��G6��2����qcY,��u���_�~	����z�-�����U�~}����/�]�v�����~�zI��q��'O�r�r�rXG�^��`��/_^O<��J�(��7oj���Z�d�$i����]������v��u={���Q��3f��W_MPf��)��:u��L�2��i������?�m������w�K�.]t�}����3�3g�.�m�V���Z�h���/��B�-R��Y��gOU�ZU111��e��M����ok��%����.\h���~�M
6����%I���W���U�H���j��}�:u���;�/��Rw��1�#G�����+W*$$D��wW�5�����*_�|f���Y,U�XQ
4P��e�#GI��S���O?i��U
�c�=�_~�EU�T�Y������}������;�����Me��M�����j�����;�z���|�|��d��t���>�}��3g$IY�dQ�6m�T���i�Fu����-[�~�z�Z�J-[��v�$I���j���:������GU��yu��M�6M�w����7��K:tH��gOP���W��I���?����g������u��u�X�BK�,Q��U�bE�m�0a����'�0�)S&�m�V
4P��yu��
m��Y�f�Rdd�����)S&=��6ut��Ek������u��A����	���������9s������c�������#5��'
x�#���^�c�Ed�d�)�>���s!O<2p2p�^��:<j��]�$c��]�n
x���3������c��������Q�F9s�4$�����_��<x��S���+W�-2^|�E�����d�����~�����b���k���$�Z�j�������',0�L�b8���?�!��d���������d���o��r�Jc��YF������u���nZ�t��ac�����y�������w�
���o7�-��o���7$�s�6bccm�]�v��=�S��!�4"##m���s�6�����c�{��G������Y���c.__��
�����_~���1b�Y��GuY�3S�Lq�:�e��)R�kuX+R��Y_TT�a�Q�^=C�Q�\���o�n��8q�a�1a�������\�~���7�Y��a�|>ccc�!C��e���k���'�k���6��R�J'O�LPn���F����r�g�NP����F���
IFPP��l�2���z����qc��5k�$(c�y�d�.]������/0>����5k��� C���iS�����;���\�k�6._���
����}�{���k���z(��8c����_��L�wo��M��U�T)�z4��iRX�S�L�[�z�������OP&**�h���Yn���v�����Y�~��v�����7?��>C{��52e�d���������w�!�

5.]�����7��e����~���]3�eI���K�.'�H���I����h�/d���@F�6x�@g�������}d���<y�-2p[d�d�����C��2�8d�q���{x�����!I@�9w��Z�j�G}T����.]�$I4h�j���������Y�V�Z�C�����#___M�4I!!!�n2��;wj�������:v����~Z�|��9�g�b��~�z�w�}^n���;V�Z�R��]��?H����������-��f���V�Z�������%IAAA�2eJ�M�I�&��.h���6�6n�h�z?b�Iqwe���_l������y��M}��a��3f��u��o�@���~��G�N�i���b�����a�G���?���v{�
�v��z��$<xP��m��6y�dIRpp�:w����"��*��9I��?��C��b����X,>|�9���s��69����y���`��	��/_^'N4������8q��=*)n��G}��r�f������#��;�i�,�������;-���d��N�4k�L/���$i��������wGJ����`��?��(�}�{N�>m>/Q�D��B���g~�������g{�E����o�c��	����O�|������+��p���N�*I


��y���\��5p�@�m6l�������@�X�"�%�����r�_��	&$(�9s�(  @���Os��~������������������]#O]d�q�c#'''O
�\���'
88 �����,Y��z���1c�>��o7iL��y��U+m��I�[��vs��U�PA�g�V�=T�R%(P@���
T������j������?T�Bo77M���U��E��gO����eP���X,*P��:v��;v�j���n��Y7������w�R���I3�tT���R�����|}}��qcIq!�����MK�:u�d�/S�L1�?22Rs��1�x�D�E�������o�iw>{�7o�J�*9���M�)SF���o���N�i��I�
(��]�:]V��9���
6�������WO�+WvZ_b��W�|~�II�R��C�fP{���uO�����-[6�e����'5j�(Imp����7O>x��w��e$����^|�E����-k~�8�`�?��;w�H��v��|��9����_vz2���W�t�RIR���]�4��C)������n��+j��1f�O<����g�YO�����8Rx����.2p��{8�D�I���!O<2p2p�}~�n���-*�0���Qaaa
�v3p�	P�.]��Ko7%��:u�92&R��a�5Bvz��aC���(66Vk���K/�dN�x�6m*Ij���f���u���#[�T�:uR����]�����#}_�r�#�l���^x����/_�#�t&w��?~�[e��kOpp��qM�4Is�����~���3k����z��$����NJ�2C��o�w�� ���u�*88X7o���;�0j�����7k�L���$i���*^��$)<<\{���$���_��-sYW|��c��9|������.k�7o�����}�v=zT��_w��:u*Qu�-%�Gb_wF@��1�/_^O=���M���G�j��q0`�W�T�L����i�����Sv�K��\��g������\�rvC|I��e�bcc%�m�/Y��E��F�?s��<�����f�-[�L[�n���[%��M���H����1$8�!�7����<u�K�\�c�����>2p��s32p2p)�^�C��t�j�e����+k��]��q�bbb����K�.i��}��?�p|�c���qC!!!���4G��S��W|�����t�6EFFzd��V�v�<R�'�X{z���I�&)<<\,�SO=���'K�J�,�
xty�������$�(Q���R���%K����{u��-]�z�aU�T)���.s��i����'�0i���j������]�|��4����7n�[�n����w����Sj}���3�\�����|��#����m����z��w��lw�����3g�n���#F(,,��w�HW�E����w7
����h��e����7�'�Rg}�w'��+��X��_$��2@�F�4d�d�d����;G��2��#'��|��������p���S��a��!������������M�$���?~zjs"y���c�S�L�����~�zI��]��_�n>vk���z���S�u��\����s�����3�UG�����=~d�>�@��M�����x�b-^��f�����d�;%����;���u����3�����N�����]�v6Ww)������g��$�?^�q�/�����7n�����\�w�$��tt'�xY�dQ����������#�$yy���<����!'��\������[�*>����k�J���['I�P��9�l�"ET�xq�����]2���}��
2d������z����e�����o����<�����ws�>�2�uY�:t�a�z4j�������-[�b�
Iq��#G�h���z�����{wu���+W���eYK��q���u�~��������w^Hk�z�-e��E�4f�]�p��-J:�>.���8��������_:���ok��6m���������BN.��{
}�kd����Qq:HU���������O��Mm���=w�		Q�5R��H}��w�������3$I��7W�<��,Y���
=z�e�k��9sfe���a�#G��\�u���_���']��i�W�6�������/�������rSr}���s]{������k��|�r/����9sj��A���t��{�y�EIg��%���[������/��'}������[�V-I��U��>�>2�����b��b�(,,���I��-*����E�z�)6X�y\!'���=�>�52��G$D6�Yd��.@�*$$D��W�$���/:~�����IR�&Ml����g��8qB;w��&���%�
>>�?$��iO�|���U+�����,��y�y���l�����-[����W�n�Y���5k\.���~2���Y�|�+W.=������w���s.����g���K�,�����+]��>�������W���f�X��K/����{����^��x�����a���[?~��
J"��9��2`��3gt��!�����/��").����������a����w�}��s��'�������{�G�����-]�T/����W���*s����9�����5j�o���5k��_����
6������X��X,��%�[w��:u�9��o����
xy\!'���=�>�52��G�.2p ��5
R]���n����#%I���j���M�� (66V#F�0�����
		1���y3Yu!e0@5k�T��5��Q#�m�6����c���G�����Q���g��5k�o�>����3�R���+f3�G����2���<-~v����[�nu+|�����}K��q/��u��g�Q���%I;w���/��&O6��;w���w��r�����V�L�$I�f�rz����~��������c����~��=;Ym3C=z�0OBz�����aC.\X&L���w���<�H��M����K�]�v���/�s�N�������Tdd���=�;vh��	z��'�;wn���O���������X��<�����Kd��B��x�"R8����:� g�����Fn��%�M�|�������)w��Iar2zk���ysm��M��m������&%���)o�����#F�-7b��X�B��7o^�#�����������L;x��z��e�=h��e�{�9-ZT�4~�x
<XQQQ�w����7O_}���v�#~�pI>|�"##���o�:v��V@���t��N�8��lJ��{}�k!!!Z�h�%I_����i�?����|111��ukj4���wo���f�����Su���;wn���I������/������#G���{�v�_�|Y���8�}����(�u�����C�i;vT��}%I��s�=��m��DFF�{��
���G%�����u�'�|����k��9���/4p�@U�TI�E�o�������+�x�=�}������0�t{��?�1p��\"��\���S8�������~�n����SG�}�����7n�C���r���J�*%k���53�4H���W�2e���o.�F��Z�'�8qBK�,q�����Z�n�p���W���o�UW�r���k���v{��u�5kV������M�6M�[�6GZ_�r�:w����������3g�����i��i


uZ�c�=����P�^�T�J�����_~���S�@�C����s������l�25h�@W�^��~��3g�c���X���d�����<yR�w��O?����p�P?�:t���������s���)c~����5g�EEE�G��6m����5k�e��I���o�����@�����d��f��R��^F����U�j������.\�����^+V�P��u��aC)RD��eSTT���?����k���6'�,X0��������{O]�tQll�n�����L	�G���U�t��	m��A���S�^�T�lY]�~]+W���E��={vU�XQ6lpXW�J�4n�8���K����>��C=���*U��2g��k�����#��}�6n����h��1���]�v��7��$e��]�f�����M�O?�T�7o���5}�t�h���o%�m��w����%I���3f�������x��}��7n�����7o�w���{d�1�C����"�X�s�C������Ex��T���k�Hw5i�D_���w��
��.�*T��n��i���:w��^{�5��
6tz�?��_�^���w�l��Yu��U���]���#G�UW��m�
.\P�����C�~���d�w)�E�Z�t��z�)]�rE[�n�;�s���5c��h��e����IDATP��E5v�X�;�n��m�����sXG�
�s�N=������_u��i}����[,(P�e�\	��E���eK]�xQ'N���!Cl����j��Q�Y�����g��������h���������a������������q����k�^�u��;W111��i�6m��t������7��O<�*�|������������-[6�[�N-[���#Gt��I�~@�;1c����>}�������?~���S�O���={�g����+W.��7n�K�.�s��$i��	*\�p��2g���s��z������3�<�Z�j�x����p |���f��={vm��Q���w9_��%��g���g�5���\�[�����u����5K����|�A��
�%�1�C����m��g,���#O=d�@�!�'y[MId��n��v�5n�X���|�1m�4M�0AM�4Q�<y�Q�q�j����=���_u��U�\�����\�r�N�:9r��=�tt���3F?���:u��B�
)S�L��;�Z�l����k��%
tZG�%�m�6����������+�l�����W���*[��:t���>�L�������BR�H�����+���2e�(00P!!!*]���������k���n��m��i��!�V���f��2�M��q/��u_�B���w��������c�����D���=�����-[6/^\�<����]�vi��������{��,�F��*�JI%J���}�4z�hU�RE���
V��e����j��=���h�BG�������cG+VL!!!���S���U�re���i���:{��Z�li���3����#���}����s��������?�$�����'�PTTT�xJdd��.]�^xAu��Q���������P�*UJO=����Y���a���b��b��'���KO?���/���@���S�7���S�V�~��W=���*T��U�@�l�R���K��N����1b����	�
���)SF�H{��X!I���z��7<R�+E���bQ��E�NO/�y����������~e��M���*T��y�!�0���������[�nN��i�&����b�(��:�|��
��=d����3�\����2pxx2�8d�d�^c ���k�!���k���5s�L�7}����
�3t�PC�!�X�~�����Qe���X�b�o��G��m����;�����Q�F����k�����mC�5|||���cG����2����G���o�����b��I��������7l��e�'�|����5�V�j���?�lw�)S��e�z��d��H�"�$�H�"v����|����Gq�yn���q����GFF+V4�M�:��r.]�d*T��dX,c���N_czAv���dTm��������8d����*��od�q����������S?�XDD��e��&M��r��*R������}��i���:s���.]��={�5��	4k�,���[aaaz������_~�E'N�����d�}���z��7����'�����}��j���BCCu��!M�<Y,p{tqWV�^m>w5�wj��c�C=$I<x��n���V�_Z[�����[��<(I*U��:u�����_�2e���G5{�l���O7nT�f��m�6�;
h��9�Z��"""4`���][�K��YV��=u��II��A��u�������'^Z[�d��� ]�2e��5k&��G��'�|RK�,�����y�f��W�i��f�R��
�t�Re������]��S�Nj���bbb��'���W_U�L�l�?z������j��9����M�W^yE�<��-Z����������u���H����Y35k�L?����m�����}���n��������g���
��o�-___�2�
��A�4v�X���W�����{�=�2e���_|�^�z��������m�f���/����K%I5k�L0?�!�C�xim=���o>�n��Z�r�KRPP��M����`I��i�\��#G-\��&����aC3`�x��v������_~���HI������%K��;W���.��Jtt���?o�]�D�d��I�F���b�$���[����r������o�>��3G���W/
:4A�.I>>>3f����k�����	����S]�t�$���o<x�$i���z��W����=[~~�[�d�d�I���3x������d��
*H��m���|����3gN��z�!���L�����GtXO�����[7��q����6g���i�.]��b�8|l��!�m�V�jUu��I�t��!M�:���'UZZ��'�4�iY)���t��5����v��7N���$}��g�7o��t�b�����d��������L��q?��+W�������U�t��]�tI7o��a	��:u�e}�k�v:�`��6��v��y���?���e�����sZW��M��7��lSz��{�i��E�����a����O*00��mJK�y�������@<xPtZ����k>?x��4h��L�,Y4g���WOQQQ����9�ztxix�GN��q:�!��
��a����9K�.U�^�t��%������,�+W.�������6�N�>m>/Y���e�S��9r��}��U����a�W_}5A����o���Ov[)U��z���o��V�N��_|��^{-��������?n.�}��.��v����j�����{O�6��l��������2p���<���z&O������[��cGEGGK�|�A5k�L%K�T��� ��"���rll��z}||���7n�����\�N������)O�<:��$����v�W�VM��U���O?�4��pe��!�>}�"""���O�>��-[�/������^������s���2e�����uk�|�xx2��IK��<��t�[C�1�����J�>����#G�L�6�����#""\��y��G�[�~}-\�PR�I	u���H���?~���Kz���u���=Z|�����$�^�!!!�z��r�����������W�^6������]�v�W���� �����<u���nI�����(m��A�T�jU���$?~<�%����3�9r�eyw���y�����3gz���0h� ���S���g�����^nQ�xz=,XPR�(��#�'Gll��|�I3�����,�bbb���O���+Y��#�E����q7.@@�t��Es���%K:-�c�]�x15��<y��h����?���e��v�Z�,�[�n��;�$i��=Z�d�G����Y���7��$��uK��
�n������a�������#m9r�~��gIR�f��`����K��'N�O�>Y��#�E����q7.@@�l>w5����CS�96��o/).H�����;w�����;�,3((H�����w���u��A���i�=��
.,I�<y����O/�(i<���w�n>��w���m��Y���w���3d�X4j�(U�RE��p�B�7.Y��d����S8�q:��,Y��t����]�vi��	����h���Z�re��m��
�$}���Z�xq�2��_W������>�������$���K�]��&N����(��;vL�������J@@������/�H�e{�'�s�5�u�o�>�m�V.\pX�0m��E���j�iW�\��O>���Y,M�:U����$e��Is��QHH�$i���i�$
�^B�x�"�5?o7H��^zI�>��$���W�����aCe��]G��w�}�C��|��
��]�R�]��������_~Y�������:t��V�Z)44T�����u��Iu��A�-����M������9S����������zHU�VU��9���p=zT�7o��M�#I��9�r�����8��{w�3F����n�����K	�^��&M�_���{�j���*Z��{�1��UK�s�VTT���;�}�����~��S�T�D	�3�����{�������V�Z�L/U�����+���C�n�R�.]�}�v�D�A�x�!�5.@@������S�'O�a�3g����cS�B�
Z�t��~��Tm���u��U�1B�ah��E	��N�:i���
�3g��3f�i��z��wu��1�9sF��O������'�xB��
S��=�G|||�����m��)���������7��g����3�3fh����{]}����r�T��>���|��w������w�i���z��W��W_����2����S8��x�@RY,M�4I.T�-�3gN���+_�|j������Km��]���J���_~�EO<��
(�L�2)��j�������y�����?E�����KK�,���?��U�����S``��/_>U�ZU}������u��YM�81U��xm��Q��uSmy)���9$$D��O����k��F���;�����"E��y��6l�~��Wm�������z����z����L�29\�7�|�%JH����k-]�4�o�d#w�<���C���:t��:8-cR�3l�0
6���5j�H�a�U�V�Z�U����E�u������S��m=2��;�91�K���7'�Y	?~��������+�?�����T�|yEDD�]>44TG�I�2�<2p���J/��<���I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\������Y�b�:��f��l��E�����
@FE� ���Q�����;��&�C�����
 ���Q������dT�o2"o���0����u�V��__111�n
x����bcc���(�6�����
@FE� ������M�T�vmo7I@�
 #c@FE� ���Q������dD����z�����9S������b�
���;�o2�6�����
@FE� �:t���u����o7ID�
 �b@FE� ���Q������dD����=����U�Jo7<���C���d,�m2*�7�����
��� �a@FE� ���Q��������|��@���I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\������p:@����I\���$q:�?\�����W�������:u���y��][AAA�X,�X,
KR�G��k������+k��
		Q�2e��s�i��=}
�,[�L�:uR��E�<y��N�:�����b�������k��r����;�T�@U�VM�������HM�6Mm��U�"E�L�2)O�<j������'O�l��;w�k�.�?^}��U��U�)S&�7g��az�RSz����9����k��az��G�?~�?�X,icdd���-kS��
<R7�K��cgv������Jaaa�^���-���(o��j�������'�u��uK�&MR�6mT�X1)k��*]��Z�n�1c������g�
��R{�����z��wT�^=���K���
		Q�����C��9SQQQN��t��/^�7�|S-Z�P�r��'O���+K�,*[���|�I-Y�D���.�t��u-\�PP�:u�;wn���w��U�V�0O�
RAj�o���^|�EU�XQ��gW``��)��m�j���n�G�g�M#""�u�V}��
S������g�5u��$�RH��� u��v��a�l���}4j�(A]��OR]�E�����S�Ni��I����*V��l�����_9r�P�j���K/i��}y/�odD�:N�}[�5k�����R��%����.]Z�{�����=�nH/��_���1��S�&��$��������������sgs����_9s�T�Z�4h� ���n��S�����V�F�<�/��Jb�U�h�$�HG�{�v�2$�v��vS��:�>z����:��gd���a��������=�b�4s�L�7$�����6m�8�k*dl������v��fX,���d\�r�a=����Q�T)�u�}���6U�R�iC���{������[�l��y=a��A	�]�~�G��s�oH���?v%88�e$�0��}�������������_tX�ni����nc��5\�Ee��1�������>����R�Q�J����N��V]���7�����p��
I���[tt�1x�`���u��5���_�uyz�4G�N��2eJ2^9���4�c�Od��kl�#9Rs;|���n�~<���	�:v�X��
		1n������{���J���o_#222��\�CR�vF��������0.^�h�j��e�{�6���������!-�F���c�S�LIT_I&�:���T�97�8~��Q�jU�u���������.O����7$�7��6l��m�c�����S�Jb�U�H���p���������
�#G�����]���9s����'I���Q�.]��iS���i��-�6m�n����C�*  @�N�k��*&&F�:u��U�$Iy��U�>}T�\9]�|Y�g���-[t��I=�����e�����d/����j���v��)I*P��:t���+*k���~��>�5k�h��]�9y���4i�+W�H�������0�.]Z:~��f����*22R/��������wo����|��)   Iw��]����?���W�����o�%���v����c�J����u��M��
 exz��]y��Q�5T�bE+VLY�fUTT��?�~�A[�l�������o***JC�qZ��)S��wo����b��y��j���
( ���3g�h��]Z�r��z�v2ol�}���z��W������6m��P�B
������S�������?��qc���_����[����*V��j���t����?�2e��+W�h��]�;w��^����w�~����w����������K������%�5k��U�*O�<�����m�4s�L��qC�6mR�F��m�6�u�>o�o���~+)�o�����4i���P;vL3g����e�5o�\�7oV�l���Zr�M���p���s����=��� =#������]�tQ�J�\����R�n�t��IR��=���'�/^��r���K�]�V���sg%(s�����>��5j����+[�l�x����Y��K�*66V��������l�2Y,�� ��vF�������"""��E3o��-��~�iU�RE>>>��o�&O��.h����u��f�����@:��L���d�=���j����2e����K��{~��u5n�X���$���*,,L<��BCCu��I-Y�D��mSLL�F�%___���{v��R}%����s��������Tx��}`<{�����r�;<��� �F�i����������G��a;�[bFG9���%KC����c,]�4A��[�AAA�$�������?<�R��TH�o����O��+g�={6A�W^y�,S�~}�,�E�f�����q��-�e���_#**���^�z��4o����������o�i���;���h2�X�t�9�����������T����e���O��o�5v��a��}�0�������;F�
IF��mmF�����
I���cw�������a��M3G(���s:����
C�Q�pac����FGG;��m����
I���nFhh�Y��	��;����$�8p��r'N�0�\��t�/^4j��a������-���y����������e�?n�)S������y�oH����V�^m�ll��)A���h�O�>f�g�y�a}��7����1r�Hc��U���0�=z�uqt� ;M�X��8���H*oeD�,Z��\f�2e�U��;w�\�r�����/v�=���F��}�}��9����~2#$��MKV����"�3"o�t�o�>������%]�t��^��Yn����j�C��� ��KO��n+�K��7$Ez��G�a��X��q��E���_�����r��+�9�oH
o��h}�sry:S�oW��
��6x���S.@���!�g$��i��A�|�?���rc��5�=��h1���@bEGG���7�;G����h�R�Jf��1Y�����{��@�f]�����r���F��y�����w{\��]�mH����9�����6d�C��%K����t/������[w=���f;&M�d���;w��%K�������#o�n�G��������5k�z�W������o��Z�j��i�?6-�(T���2�.]r��={��u��
�E����F���U+��O>��a���(�q___���c�Z���M
�������u�q����GRx+#r�#�<b.o�����k��6_:��q�O?���eS�<%%3"o�t�o�s��y��$c����;z�����gH2J�(��v�}�oH�R����1Y.@O����X!�[��Y��~pZ_�j�����/O0=��+$�<%=]���L�cji���SH����k>8p��r}��Qpp�$i��e�u�V����Q#Y,Y,IRll��O���-[�`�����7�Y�����i���M,XP�����=�|�A��������.��g�1�y��a�e��Yc��X,��u��r;v�0����k	����j��Yj����)���3+00P
P����S'}����t��;o�]aaaf�?.IZ�t�}�Q(P@�3gV�R���s�����6���}[&LP�z��7o^e��Ye���;���7n�\��M���gO���


��������r���e��1b��u�e7n��3g$I
6T�*U������/�`�={��d-w��������5*Yu�?�|^�T)��|}}U�xq�ow���a��
f�6l�0I��#G���/�L�2
V�|���ys�^�:�������v��%J(00Py��U�N��w�^��>{�����u�*W�\���W��YU�D	��][�>��V�X���XO�l �e��-%���O|����6�w�}_���S��m�����={��W�^*^��2g����}����}{��W�\��m��H�"
P�����O���c.����k��A�^���g�.���C�J�R�
���/k����~��=��0��={�n�����#���_~Y%J�H��y
�n@��������wOO���;}e�9���b��*S��$)""��_�����f�f�����R����%K���K�����y�d���P�>}T�L)g��j���6l��r����;v�7n��y�*S�L


U��EU�zu���K�����;w���oI��-66���Y,u���aY???u��MR\1g��$-3�c����������oeD��9sF+W���=�l{��&M2�����a9w�3t���|�o���7Ll��7�S������S�����+W����b���a������m��%�m�m��(�d���7C��OW��M�/_>�\�rz��7�������?V����3gN�R�J3f�[��?��'�xB%K�Tpp��?~U�PAm����1ct���y�@J�����V_I�od*���i:�����Q������Q~��w�F����eK����+��V��V._�l4h���� �3
��#G�x�n������1b����;w�Y��o��[���_�������[n��Qf�+V�L�x��Q�V-���|��GIx��X����#�SO=�p99s�4���k�a�9s��Q����<��q��E�����1�����kk��u�_�'1���^s{��3g��e�����en������'�Lr=����~��������<y��������^FJ�Es���6u/Z��		q������������=����e��9\��+���P���.x�5'}�"#�o�8�~tWTT�Q�jUC�Q�^=#66�0��w@�{D����������������O7#n��^�z9���d�bl����r'M�d�����������
��V����cG������Y3�����S�l�yw��0���x��v���Z�jN�._��,��C�$/�0���f]������W7���m[��9v���o�����}h{��}�������3�"d���7�8\���;�|��������#���S���X����?��#O�<.���7�,_�N�D-+����R�������4�cfd�d���s�f�l�#)�q��|�����m�&��S�N����wl���s�n���7��&�.��]��������)�����g<���.�}��g��o��f��f�m��CZ�R�eJ��������_�n4o��aS�xq����a���i�*U�a�F��n��������Guk�����K����7$VF���������;�/�|DI��}�l��f~e��=�o���r���T������?u������[���7�W�^�e����k��U��-[�Lv�|�Im��Q<���x�	�(QB��_��?�l�9}������s��I��)���0�-[V7n���?���*::Z����n���#F�,�q���X,2C���S�~��e��u	�~�������W���m������P�B����J�*��������:|���n��M�6%�����7�����U�\9=��S*^��.^�������_��K���C���_�<��v�������M�6��;��;�/��R�N�������j���	����_j��q����Pu��QU�VU���u���:uJ;w��O?������������S�B�t��I�;wN.\P����L���f����E�i�����{��\���9s�r�������z�)��9�k������+Iq#P-Y�DAAA6e��;��c����gOe��=�mOi�w����������F������
4e�EGG����V��u�{�n����6�7o���y��z�jEEE),,L���r��e����O���7Gl���Z�n�|��)  @/^���v�Z�n�t+#�o)���>��]��	&�������Z�p�r���^�z��TTT�V�X�y��)66V={�T�������k��Iz����[7+VL�/_��i�����*<<\]�v�����L�2�,���~S��}#___�h�B=�����#�?^{����5kt������d���Z�x�$)00P�[�NP&::Z����$)g��*Y����9��>�L��-�?��#???*THM�4��T�t�T}����9��v�W��r����/j����8q�z���������oJ�|||���/'zY�n��������c��I�K����c��/R�H���w��	�k�N��]SXX�6l���@���C�|��n�������v����%�����\�r�g���X�������?h��y��^xA�5R��em��v���w��Z����o�
(88XW�\��C��~�z����#�
Hm���w��!1���Q�o
 �"�ENx�8�;�L�b>wv�rwL�6M111��G}Ty��IV}�����c�����S�)����s�c��}I��}�x)}L��������u��I���*W�\�T��Z�j�=z$8O�z�����W�f������
(���Ok���:t���=���zJK�,Q�f�t��)u��Q��7W��Y������/���+W�a�����z��w,��������%I�s�V�����(g�������c��}�v�_����H
!o����l�")�;[�V-���3A�q��i��]������B�
6��B~Ed,�<��~��7]�pA�������T�Nu��U�7v:oJf*�������C�)<<\��eS�b���aC���;E��d�4���e��(o�b�H��(��7�q�.h�'O6����+�m�iE�������?l�}�����7o&(�b�
s�c���	��/_��d�����)��k��C���cHq#GFF���s��lw�s��>>>�4G��F��Ut8����%={�L�FGG��M�j����b1�N����3g�y��5$�����3g��}?{����������[����'1�X�b�w���c.�[��b��MIZf����:���kt����H*T0�=���.����'Oc�����I��3f������4�w�����'���)�(Z����;m�4�L�������u��FDDD����w7�~���	���G���?��i��m����������s����:x���
�����LK�;�K2�T�b������U�T1,���O��zQQQF�&M�����KP�s�=gNwv'���X���N�kL.�7xJj�����6/^l,^���;w�1f�����������a����,W�R%c���F�9�������Q��F�����f�oH<ol��a,X��f���u��G�6f��e|��������PC�b��3��z��;g��.4&O�l���K6��W�Z��v�Z��n���*U�U������9r;w�LPn�����b1���9s��W7.]�����!C���}������oN��������7��?���!�oH����������-�q��e���{�=����S��^Vr�M��Zw@g��1����u�q�������bI����l���\F�������(Y��Y�?���6Z�I���]a;�5�7xJZ����S�������6y�+��R%K�Lr����C���*����8&{w���;wnc���yw���;�p��
s�<~�400������������@s�����6������Y���%J8}��]�f���;��1����X!�u��Q�vm��,Y��?��1n�8c��Y����m��h��nn����52p����SR���M�41N�>�����T�i��������'�.J
�O]�vv����?D����8
8����/�pY~���f��{,�m����R������}�lB'g'��5�,��]��_x�s���{m�-_����v�Z���u�l�m�������o�L��u�9����r��H2���\�r��;w����y��i����9b������L�?��S�N{)�$V���������]����2�/k��e�Q�LC��)S&�w�����S�����4h���HE���#����F�.]l���h��Y�>�]�y��-[���B{G�'N�0�4i�$��~�����;�+��oCRd����>#1bbb�6�/_>��TJ^��)S&����u�<�����(�e��M{���`z�-).dK���)�yrQ��5�nkY,�Q�FN�Z��,_�@�D�
*~��1w�\��/�4�6mjS���c�F�����
���m�x6l����������[o'N�p���+W:�/w����A��=X�����<y���.Z�(Y�����w�Z��������#$$��d/^<��>������OV�S�����	J�}���r���F��em��p{9I�7�'�.@g��1����u�q�����s/g�l�#)�y�����0s���z����a��q��^�n�'�g��9�'��c;�5�7x��/@��q���m�6�$c��=�;v��\�\�r%�}�A��.�7�U)�_z����)S___�^�z�o�aL�2��?�1a����6�Y,c��Y�~
���=���r�������{��e���q���3g���^{��d�?5��!�2J~��-��g�52g�����U���-sz|0��+kd����������g7�q��?4���;c��9���c��~�<�%���mo�V�H�LE���O�>��_~i��;��1c�1l�0�r��6}Q����}<��S�����@�u��
�y``����3g6�_�~�#mx�������+Y�h�������%���Phh�$i���������I���u�l���]�T)5i�DtZ���$)88�|�k�.��������������5k�L0`��z���o>?x�`����o����s�NR��i���\�b>���?�={vm��M&LP�=��kW�=Z������+'I������o:�3{��=z��y��e��[�>�@{��IR�SC�*UT�N�����k>�������B�
�H�"���oR����c�����������*b�����,(QL�Q�(V�Q���O���DM��j�Q��b�z��XP�
�
��Q������30��0���<�<�>g����3�������� 5��VJ��_3j��4k�,�\sM��������f�UW�t_�6m��&�_y��i��E�e��b�b���&M��w�yg>[
��
+��w�1k��f�e���?�0�}�]9���3&'�tR������>:?�p.���b�SN9%���^���.���tr��W�^������7����S�N�e�]��.�(?���|k��z��U�����)S��{��O>I��������>�m��s���{������6�����c����m����'I�����5v)��(h��v����O;��<���s��1cF�=���7���_�u���X�6�*s����9������Z�by�|�Mn�����C9d��4hPq���J������w�}7{��w
�B������
+�0_u��MW)�)k���m������z�����<W�/��"����2m���{�����J=&��6���w��O<�?���9������{��C�W\�w�y�8�S(r�!��t>��c��r_�9������#������O[l��������LX�5�9�6m������)��Re������y���#FTYOC�_�����������o�9'�tR��w�����9��r�=�����wV^y�$3�������<|���?>W_}u�>�����?�Yg����Gg��!i��u���{���^X��������t`������3�<S��i���Y�]�v����)S2f��
�{��]����G*��=���;$I��n�
��Y�M�6s�X��:�'�
��:(#G�����������[T��E�Yj�������N��L�.]���!f���7n\v�a��q�������l`�3fTx������A�.]���o,�<xp����_��j���K/�������z*�|�M&O��W_}5g�}vZ�j��z(={�����_��*�y���b��l��jTv^�-I~��_�/�K�}���4�D}��Ry���r�g$�ys���o^���S��[�������3�������������d�
�F�J�PH�P���~�^x!������7����N������~����'�Xc�\q���Dt���oR�:uj�������|�w�����>�;�����.���N.������[�2eJ����<��#�e�]���_���k��v�L�4��z���c��i�2a������ov�a��v�m�u�]�����i�i��9��C��O$IV_}�
7g��O~��y��Y��V(���_V���O����%I�:���u�Ys�L���~�����7����^�ze��4hPn�����O��o�+��"�,�L1�/�<�������3M��7�����.��x9�E<����_����g����,|�|����?O�~�������/s�q��W�s�������u�m��{nq�����x�����3l���z�����{F���W_���R�}�m@y��]c�5�1�2�/�xn���l���I���'��.(���+���o��uK�jTv���K���#���?�y|�A�A	�z��nH��]s�Yg�o��y��G���_f��)y���r�E�c��y�����o�\w�u�����W�����r�-��U�*���'?����_L���������.�����Ue���������?����{\�.�������o���=�jC�)��S�N�����@�L�0����ZkU[_�2�?�$K.�d1����/N�O�4)c��M�+���|��g�+�L�<9�F�J�l��V�/���7o���������_�m��&�:u�N;��s�9'#G�,��\*����2�=�:u*v��U.����\P�{=�����/�%�\2[l�EN8���u�]5�w�����?��]�0���n�a�S���?f���s�9��3s�I'e�����������r�-��}��n�:��w�Yg���~8�Z����~�}��'�~�i��_�j�jS���k_��}s�$�9�t�I'e�UV�j������/W]uU����6*M!��J�P�������g��W����z;VU�#�U�w=��C�7�����9��#��K�t��=���_��>�������]�l���9��32f��,����4iR�����^zi��s���>x���GqDq{���nP:
�w������g�><;v�3�<���?>���ZZ�l�:d����=�����>:I���{�O}�L�����K����ny��������I�a����C�U]�B!Gydn���$��+���~8;v�U=�����������{N?��$�w�}����w���{�_~���������������m>,T"�5k�,��zkq1�i����n�������|��;vl�[n��s�=n�)u<Y��6�*s���++��g��0����'d8p��������F����BRem}��W�i����+�$Iv�q�
(��~84=���Kl[v�e��#�����/r�Ee����������;/'N���o�������R�}�m@y
1&��y��{����������$��W�*�Q�\v�e�����;}����K.���{�������Ce��i�m>,4����A�2`�����9��c���+�o�}:t���-[f��V�o���5*;v��i�r�G�3�k��+s��h���{�������H
5vx������/Jv������th��\r��vM[����v~�m�v�������v�v������_���6{r�����s�=�$1bD
�B��������M�:��2���#�7���?�]v�%�=�\��s�b���_��z(g�}v��f�����:th��RS5]�j~W�Zy��3f�������S����g�y&_|qv�m�,���9��3+M���!�b�����_�IG����f{���*�����r���'�����'�Xe=[o�u1q�����r���T��5�1n���<xp6�`��{�����7��#�<2]�vM�~�t�h5��VJW\qE{���v�������[��-s�}����/�pc��q��O+Zn����~��u�*0V]u�b�l��)�.v1���&�l2�:T��+}7(����]~���������k�O���������������I�����x�a���x��B��_��������df����>�UVY��m����o����r�]wUx���	r�m�������k��m����3�1i�9��_<��~{z�����~Yu�U��m��o�>���~�<�������h����
eeeYv�e�|����)�T�7^��Y,qq�q������N2�)�{���|�W�d�����?�|�����;��kQ�R����>�)���Zk����4hPv�e�t��%�Z�J�N���g�\y��s��_��o�Cl��c�[n�e��i�$y�����y��u}��G�����9����c?��C������i�����+���kf��1_�������'O���O>���.�����Zk����S�N�e�]Vi����2����I��k���������*<)���������th��u�V�?~|����)���T~E��������Wj�������|��G������_�,���I��]�f��V�������3���[/��zk>���<��9��s��O�������������s���|6K/�t.���L�8�8���^{'����������.��b��F�!���k�]�������/���_W����f���I�>}����I��N;������x��y����;�d���9�������&�9ix���f�M7��	���k����fO�/��r=zt�=��J�}���g�R|����w���>�l�2�|�|���7.�^{mX��N�6-7�xc~������>j��B����;�G�1���q2�>V.�8�����5D���*���+��]�����3���������'R�?^e�rN�B!G}t����$�
+�������S�&?���2r��|������[s�	'd�M6)^��92={���?��-��k�9�>}�d���y���������o����cs�9��S�N7n\���k��V��e��������75a|�b��na���^{mq{�}��b�-V��^y���w���{������*}��-��l��v�����]L�1���U����Z�l��>8��sO&L���1�&M���?�#�8"��7����6���mm(b4.rL�Y�f���$���/���\��]3h��L�4)�=�X�?���������&N���������4��>>j��bb��[o]��lm��^����C�Yf�e�����r����-�\���th��_��vMn-_f�����6�i���+n��?����o�Q�^~������g��l�2����;��C���'��,��}�
��k�.;��S�<��<��C���O���������|=!�!�h�"�m�Y�?���r�-���Or���/h}���q�
�J������'����O�t���B�66�p���W_}Um��e�D(�1��C�U���������k��o���o��/��W_}5�{�N2��"��zj�j����R*
If��y�gT���;�?3h����O=�T����u��-�rH�������[y��g��6>����w�y
�BhZ����_������p�Z]�\Pq���w�)j��[C^OV/��}S�W\�d��������k�WF�.�l��s�\x��y�����;��7u������m�B�5D|����`��������rm
�7s�����8M����6mZ�R|=�I3�������)a|v���d���{�_���|%�/������k����:Mi�Cl����1i��������
�u�����WN>���}�����Os�UW�������[	�����r>�)������W������rN���5&�O�M:4b���NV^y�$�k��V!�fN�~�m�x��$�b�-V����m�����|p�e����<���I�V�Ze��7��L�������&I�z�����;7n\�d����Pv��^x!���^�{��$3'�[�hQ�sY|��s���g��vK2��<j��Z��0j��y��s��}����f�{����?�iq�����g�{������.����;��sq��^z)S�L�g���(�{���7��|���O�]j��j��EQ���s�m��Y��]_������7��f�m�������V����+g�� 'kF����!�n
y=Y�x��}S�r�-����g�5����7+��rn��������_n�+@�hk��VS�B!�]w]����Z��d&��@��7^*��i*�~�=����'&�ys��<uw���:th�u]���L>���g����&�|^�p����,El����s�=�$I:u���w����hHb4.��5jT~���$��+����um������_������8��>�P��M}��8������+�����T
�B�6�����O+�����{�]������,w��W����K����?_`�{��Gq��+���_]e��.�,�|�M��_�~i��u��f����?��C����s�5{�}������i��Ux��V]u����:���|n,z���.]�$��b����+-7}��\r�%�����O�����+;��}�]���9������v_|�l�����_��_���<cf��p�
�����_,��RYb�%��o4N�=���/��B�P�O�������?�����m
A�
���W^Y��*�
0��}�u��s����������;���M���]C���_O��V���o�Y�9�Y�f��O~R�����{n0�W?��c�)����K�><k��V����l�2+��B��Gc���������3��Nce�kS�����/��|n,�~���^[��������;�|�I�d�
7�&�lR�����s%��{��i���|�����n�k�r~c[Mw�q����$�{l�<a���m�x�rLv��9��3��w�u��n��H��1k�s�������Og�������������+s�P�x��2����>RC��2$o��F��C����g��ZX���	������WqE��.�,w�u�\e�y���q�I�-Z����Z`�[o����_�$��	�����������<P<h��YN>��*�,?y>x��$���nZ�9}�.]��{������9�p����/�����|�In�����
7�����	&��O�[o�Ue�i�����{��Fm�Z���y�
�p@qr��SN9%/��B��7��������������e�m����������_�U,(o����o��������5���[W����/��_����/�P(���N+���m�������5u��sNx����1��2��
+��'��5��F��p�	y����Y���//n�o,�j�������U�>}z�?��
����D^^�����N;%�9���_���>������q�If.�q�QG����}7
�w�w�}���]w]������������������N�:�U��s����^�9&3'�v�e��X�v�mW�����[��]�t��#�����\rIn���y.F2r���;6����^z��<(���65jT���9
�\}��9��c�$����2R7�M��`|ps��1�������}�����Z�jUaa��4hPq�����|�M~�����|��}��j��F?j����>�)�'�%�c�=V�����>Gydn���$3��N=���7���m������O?����:�'O��X�}�]8��<��#I���[���ya4f���s�9�0aB�e����
O��hl������-��2���������O?������*�_}����,p@����+s�P{5�o�\rI��Fc��I��}����v�)�o�y�eK9�r�)���)�Ir�M7��#�(�>�����U�y~fa���vZ4t`Q4~���:��;]��/��O?��������I���;��K/�A�3fd��w�>���w�1��7���#s����t�9�������pVU������G�L�81��sO�]w�|�����[����<������[�	��vZ�_�I��V[�u������]�}����k��V,��S�*��	r�	'���O���n�-��"���Z��o�I�&e���6lXqr���Ys�5��kY�~���\t�E������&��g�����{:v��o��6o��v�
V��_m���Si�>v�a���;��C��W^��n��;,���N>���6,O>�d�d�%���$���r�-s��'��.�_|�-��"x`��f��l�2/��B�������?��O�����U�.��������1cF�������Z��������e��y���s��7h��	��/�|�m3fL�������/n?���s����{d��7���c�>|x�>��t��9}���Fm�.]��Y�f�0aBx��<��C���q���f����y�������cN<���>�����o��_��]�f�w�l�e�Y&��O��~����+#G�L2�;���Nj�C�����&F����:*+��Rv�q��������sZ�j�/��2/��r����
���������{WY��W^����*�q����<��������k�|��g��������_{��sMt�?_}7}7���w�i�����{����g
�B=��2$���[V\q����y���2d���K-�T.������<yr�>���{���v�m��f�e��W�K,�)S���>�O<�x S�NM����
���k*m��������oIfN�w�qy�����k����z��Q\��1=zt����t��!}��M�=��
+�U�V�8qb{���u�]�8�7���6=��s3r�������t�M��
+d��)y���r�����m���?��������������>�h}��
��_����o��o�Ya���+����sm
��9ps��9p%
�/���G1����n�u3�G}����?���������;����~:������^a��*;���|=�iA�gQ�����s�r~c[����/�,�Lv�y�l���Yj�����_g������[��G%��<u��w6����
�jA���tc�'N�G�O<1;��c6�d����Ji��]�����=:7�tS&M��df|���k��*����
������g�����w�j����V[�[�nYb�%���_f��q6lX1�o�������������	��z�*~�[�n�����&��m�����r�w��'�(~�7��Mz��Qi}���Z�gQ���[�>�h�;���������O�[o�,��Ri��y>���<��#���{����v��������J9�r��W�O�S6�l�l������[:v���S������]w����{�X~�]vi��n�Ok�@����������n
54|��B�Z��u�Y�����//�i����7o��p��g����{�.�[S���
����<��E�����w5�o�m�����~��r���?+��}����s���5�{�����������?�<�X�����Y�k���$��]��������ux������;5>���[����o���Ji����u���_v�u�y�[_q�#G��g=�]w]�|����=����Zh���<���o����>�zn���B�������u���_\�s���u�]W��V��w\u�]g�uV������Yv^�=s~'T���]���A��|n�"�1?{|�����Ou��y)7��15Q�wV]�,U_o�UV���i���*�{��u?����R^�$����Y�O�
�_~y�����^*t��}���o��p��7��}����V(�o�����M�<�p�!����X�n�
c������cL5��i��
���N��*T|��8��J��;���jt^-[�,�{��u>�R�������W���u�Y����V�k��}�����5�k��1w���6N��+�1^�Eu\���PsD�B���[��g�����:�?�������g�Z���55�K��^=���X�sD�9N9���P(��kWm[���W����T������X,�xY(�nL��;��q��t�R����5���S�k�����5�>b���g�^�
�|��|�]i�o�Uc��m����W\����5kV�����O�^e]�����9��������m��j|��}�>����G)�T:t�P�v5k�������0y���m^\�V���N=����:*}����W^����?���~f�����_>;��C?��}"�k��_|1C��m�����G���>K��m��J+�O�>9�����Zk������>#F�H2s�������r�m�]����+��k��8 ���N~��<��3y�����G��~�b�-��W^9[l�E���y>�na��k����[y����SOe���y�����7��U�V���K6�x�������Z���@�����������w����y��g��'�d�������_���9��#��C����C����k��6=�P>���L�:5�;w�V[m�8 ;��s�����^�a�2d�����;vl>���L�>=K.�d�w�����.�J+�T�sh�����<���y���2z����������R(���Kf���N�>}r���V��xh,{|�v���<��y��'2f���������/RVV�N�:e�u���;��C9$;vl��B�p�%�d��v���?�1c������g�}��S��}��Yv�e���o���k��jO�[o����<xpn����������O��}����Z�y����_�:�,�L=���O��E�����n�:�^{m�=��<8#G���o�����:�Z�J�����&����E���_�rVYe������1�W_}5|�A�����l�2:t��k���6�,{��w6�l��������+��>�d���y�����o��O?��i���Kd�5����n��6�'JBUt|�����6�,�=�X����'���,�.�l6�d������k���k���@C2n|^����i�9��#G���_O����J�q�����Ok:��C����L?�R���o�9�<�H�z��|���~�r�-���{g�}�it��9�m�x�jL�O�>���;��3�����w���L�4)_~�e[l�t��9=z�H�~�����i�f�ai���;/��Rz��<���y��W������K�6m��
+�'?�I��g���g?k���|i�s��m���7n\�
���_y������f��)���C�Xc����+L�n��Y��0e���^����gy��g���/��O>�g�}��1:t�*���-��2���_6�|��[�9�|0O=�TF��q�����>��I��$;v��k��^�z���N��]�����\��NYa���������&�����O�=�9%s�
7d������m@S%�M��4U��T�;m��
��Jh��7�����J|�*�
h�z���?"%	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,-��������^{���P2#G�L"�M��4U��T�o@S%�M�����	���(����*�
h��7�����J|�����.+
�m�����N��=3}���n
@�5k�,3f�h�f���4U��T�o@S%�MU�����Od�-�l��P����Lh��7�����J|�*�
h�r�������[g���:th�w����(�{��7g�q��4)b�T�o@S%�M��4U���Z���[7tS�#��@S�4U��T�o@S%�M��4E
=�-�	���{z�����(��^{-��4-b�T�o@S%�M�����w����M��4U��T�o@S%��^��n	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:��������/g���9��c���[f��KYYY���r�A���7�|3'�tR�[o�t��!���O�n�r��G��^�U]?��c����l���Yn����u��������_��3f����I}���������^{e�UVI�6m��s�l��V�����������
��5*��{n����UVY%m��M�6m������?�i���'_~�e�um���������g�=����"�}��7����r�1�d����2�,��-[f�%���k��8 ��
�B���<yr�������n���k[l��j�*�;wN�^�r�9��������)S�������W_��?<�l�IZ�j%�A#��c��g�]�����n[m�����M�VYe���]��^'����f{�������g�5�H�����}����Z9��C���O�����!�Mk;���;����R�����>O?�t.���t�AYo����E�b[\��X��4�}u���d�z���Y{��+�5b��:��gA���7n��w�q�p�
��c��i�&]�v�n���a�����Y�����6h|b����0aB�����}���u�]��r�U�C� �A�����.�=>@y
��t�A�j����'����Z4t�����n�����y��W�����?�P��7�x#o��F�����y��9��3��k��q�c�=����Vx��?��~�{��7W]uU���f�e�-�y,L�#^����~����/w�uW��?���|����Qo���l������od�v�|P��	&d��	y������>W]uU��c����j��V�:������E]��N;-�'O�k�7�|��_=���z���={f���Yy���Y�/������?���\�f��'�x"��~.�����7����-��2�G���������Vu��R^�MG)�����o�&M��������o�}�������'�^{m=��\~��i��e�OX K��:��o+��R>����l*@�2�84�~xC�3�u�Yy����
@�,�1�������N������Y�����{������e�]�[n�%�/�|�u�����OC��Jy����;?���KR���o��4����s�0��i��������__��K�	M�t�����Wx��S�,��R�&�����Cs�G$I�5k�}��';��CZ�h��#G������?����:+�[���'�\e]&LH��}��{�%I6�`�x��Y~�����o��k���o��'�|2����c�=�v������R���s��������$Yv�es�a�e�u�����a��e���y�����.�d�������\�|����������v�e�����+����[��7��
7���^{-�&MJ���3l�������v�{�������m������N;-I��Kd�=�����G:�������VX!}���&�l���;g���5jT��o��6O<�D��v��5*�;w�����?�o�}����$I���s�Ae���J�����;�d��ay��W3y��w�qYl��r���VZ����.]��u��y��wK�[����m���O6�h�j�M�:5��)S�$�rH�eKy}?�����s�=w�e[l�j�N��kja�o��}������>I���K���N�=��Y��;6�
���~�k��&?��C�Z����4��[yw�qG�e��.�����9+��r�L���?��g����4Mau�c�=6�o��<�����5jgy�=�\.���$I�v���w���`�Z�c�Ir�1���+�L�4o�<{��w��~�,���?~|���_~9#G��N;��'�|2K.�d����Qyb4N
u�b��9g]-[��z���1c��W���qj��g���2
=>��_]�Q5�#�:��<�������?_HRx����)M�����)��R���[o��v�P(����B�B���X��>����K,QHRh��Y��;�����O?]Xl��
I
-Z�(�7�����g�b;��g����S+����o
�{�.�9���k�VhHC����R������+�����:��?�x�2'�xb�L��=+�����.���J�K.������WZf������>�XW�N�
_|��|��7��M���?|���zbu�����GY�i��
>�`a�����y��w
��u+������������N����n�23f�(�z���r�,��\}��~����<����w�Y����B�p�Yg?{�Yg����/�u�}�������m���[��J}}?���{�.�iP"�uQ���Rk��V���{�b���I�&6�t�b��o���'I��o�EC����o��R��8����������_���O�B�p���{�u��w��=s������c,}p������ok}���L�RX��I
���[��������x�M|�.���>X��]�v�'�xb�2��M+v�a�rGuT�����;'�m� �Q
�w+�1G�Y8���
W^ye��g�-�����B�����w�V|[8�o�Ec�?�Pp���B|�.����?�����J+N8���]�'������N%�7
��hQV�/�����_�s�{l��.���b�_��W��y��W
eee�$���[���7�TZ��>(�i������b��w�",.(����6mZa���+�_���i��6�h�b�x`�2�~�mq�v^f��Q���GI&�����RK-U���g��s]���F)�g|�4iR������6,��b�&�
��
+�P,��+�TY��i�
�.�l��K/�T�6K@oX���0�8�����p�TY�����������Fm��:��t|�2eJq?Ia���U����oZ�hQHRX}��kwb���F�4��R��*#���;m��
�9p�?���RcG���3�<�����K>��CIL
@|��bu��w.�s��WYn����E��7o^?~|���{�Al[8�o�JC��J}��u��8���p�(��rv���E��F�,���#�<R�����k|?t}���o���;m`����������o�,w�a��]�vI����+?��C�u
�$�������WZ�
+�����'I�����y��un����SVV����<8I2z��y��Yk������W�W���?���:*��wO���m�t��5�������^�1�y���1O;��*������rGqD���]w����e�e�-���{��s�1�d�
7L���e�,���Y{����;��SO������%Uc���v�}��I�7�|3�w\�u��v���K�.�i����������z*���oV_}��i�&�.�l��k���������?�9������:K/�tZ�l�:d��W��[n�_������{3c��:�,J��L�0!I��w������r��7�o~����a���U�]�vi��U��,++�^{�U|=v���6����3i��$�z����6���u%�G���8p`V[m��m�6+��bv�}����������w_v�m�t��5�[���+���>8������o��V�����t�M��c��l�2�:u��k��^�z��N���?>_���N�:����n�n��%���|��7+-��'���\s�*�k��yV[m���o���F��o�o���0aB����$I�-r�TY����
A�
�G)�K�!��s�=����:��~��o\e]���jz���df�5jT5gT5�
������s��������6��i���9����$\pA�_~��C?JoA����1##F�H2���y��-Zd��I�������n��\}�1�mb4U����Q�>�9"�
V��};��
������u�]k����?)5��h��wJ��W1X��eE�W^y������W[��?�i��}��7��M7��������t�M��{��w��[�9W&���
��7���]�Xe��i�_����Y�����g��O>���S�N-,����$�-����v�7�B]k��F��>���b�������w��]�Y�f�lg�����[�_`�P>|x��hn���B����<����[(f�:3{���~Z�lY�����<����[�=V��������J�
T�J}�@u�I'������B�0a��b�e�]v��{�e��:��#�\O��}���k�����;���.+�l���8��Y��?���B�0��x�2&-������U��k�-�n������]��>��%�QJ��-
��}�Q�FUZ���_~��*��6mZ�s���$�-Z>�����>����V=��Ri��v�y����n�UY�������_=T��f�7j��������[n)��lnN������O=��j�WE|���Ri,O@���[e��	��[��;m��
�9ps�ue�z���RcG-��	�S�N-l��&�$�m���0c��B�P(�S4���'�Q[z��O>)���s�j����j����_�cb���
����t�M|��j,�g��G|��Z������7�$�N�:>���B�P?�C�4�D|[��[C����@���K��M7�����n�i�����g����
����+If��4�'�y������rK�����o�>p@6�l��l�2���j�t�R,w�Ae���I��-[f�����WZ�j��c�f��A���O��O�W�^y��g+�d��E����+��sO�{��|��7Y|��+���G����7�������VZ��r�o�}�}w�uW�<��$I�6m����<�l�M�Yf���1#&L��1c��C��o����G��.H���s�1�d��6K���3b��\w�u�6mZN?��l���=zt~����k��9������k�����-���|0S�N�A��_=K/�t��|��G����)��{�N�~���K��n�:�}�Y^~��<��#y��7Jv~���&�w��%+��R���L�81�~�i�Yf��>n��]�T����_�g�Z�*��\*��sOn���,��R8p`6�`�L�:5��{on�����1#�rH��r�\r�%���k����f��Yu�U���������3�<����:���o^y���V�3fL?��L�>=��7O��}���;�s��i��Y>�������y����������d��)�U��_��������\A�����b�U(S(r�g��~�!��c�������������+n8��r����������={���^��_�%�\��d�C=4k��VMN�V���t�:�:
�
�<u��J����M�����1c���O?M�v�����g�����������n�����[C����9ps�s2�
M_M��t�����.�����3fd����Fm��w�9x�\sG���?�9�?�|Z�n�����)++��9��~8���C��q�����9� ��m�T�o��V)�����`a��SO�o�[��/�K�]v�z;Vm�O�7���A��)��^�`QV�M�9��Z�B2h��b��V������u������L�R\��e�����j��y')���Z�w�}����W���S��V?�����o\,w�QG�U�/�Kq��w�=������������Z�hQHR<x�\�;��b=o��F�}���+$3��9��S��M+<���U��N����VYe���o�=W�����Xf���+�n����_����?W�8�X�O��\����?�_r�%�l��Q�
?��C���T�@E���
T���j�����W[�W�^��O<�D������:v�X�g���u��w��]������Nu�i���=zT�4����=z�(���;����i�*��:uja���/����[������.���0f��Qx�����$���F)5��-�lC�=�,�����\s�b���;N>�����^[2dH��s�-������p@��#�	��o��(���m�?�x���-��\}��Jy}?[�8S�O�f�
�{l����i�����Fm5�ubu*�=��c�}m�Q�u����X��';���V3��� ��>��������GUYO}��*����.�U��i��o������+c������8j�0w���g�e��4V��W_->��w��]�}��M����o���C�:uj��ieee��?�|���=��
��?���
��k�Al�ia�m���F�,�O@�f�h���������D���~(t�������;T�W���k�"����%�5��i���_~Y��su��,��R�~�.u�l�2K,�D�d���������Lu���r�M7e��W������_����+��G���,���������m�$��A��O����J�s��^(2b��$������Ts�+��J+��5�\���7�|3I���W����7o��������u�
7d�UW���8����_~9:t��7�X�=�w���W���Vy��-�~���7�<m����9����q��N<��|��If����_��u
�<���6���T�V����������������Gg�u����_����W(��E��s�9����o�,�L~���U���������N�T��O?��'�\|}���WYv����3�<�}��'-Z��'�|�.� ������O?=���J����G}4�_�B����i��A��<p��Iy��\e�Ur�a��o�[n���2$g�}v��o3f����^�_����>}z���)}7(���N�NC��M7�4�[�N����y������w�)��UVW]�o�4t��1���������p�
����r��f�]v)^W=����r�-���WZ������,L�����1Th�j3�0[�����6������s�u���[o�����y�����S���N?���3l��y�5�IG?��c�[o��r�)�wB�������[�h�-��2��>��!C�,;}��:��{��g�I����#�A�"���
j�!���3�����3�������m�������c�6�D|�I|�I:,`�~�mq�&���'Y����������b�m�)~�T��w������$���Z��s�*����*���~�$���s�=�T����'���T�������&�9I?{�~�������{y����$�m��\mh��]�����Z`7����#[m�U���O�p��(���J+�k��I�W_}u����-I����6�C)�zM\y�������$K.�d�����u$��#���o'�?v�q�:�3/���k�7%3W�l�I���G�-ZTZv�-�H��-��;�M�4)����|���)S�d�=�(�0��_�"����<?��c�\p�9����,���������/�P�����4M�|�Mn�����C9d����8|���?>W_}u�>�����?�Yg����Gg��!�D�{��'^xa���)}7(�}�X���om������_|��~�U���_�W��U�M�V|�������5!�A�w�y����?��7���N:)���o��{��p�	���{����� ����V���<��7`ab�����B�U�q�df\}��w��O���c:������9��Cs�W��w���{��dfb�!����{�������f��Qi��Y����bvA���h�k��?��}�i���������3r���f��q��s��>�/�M���UC�9��g&�
����>��.�(Ir�9�d��W��c�6�D|cN�����g�y���g��;��cqu�������=j��
��5k���{'I����>���o�d���/��6��8������?���\��������N;%I>������+C���I�-��b���t�R��l��jTv��4��>�$��/����/y��wk�T���s�=9��c�����]w]VYe�:�u����:��4kV�na��[�-��	�+���1#�n�m����L�8�.Mjh���O<�D�d��W�������/�j���K/�4����z��|��7�<yr^}���}��i��Uz�������U��o�4�|��������s���-�n��<�0 �_~y������)S�����n�t5t|;��s���+&I^y�����:9��s��7f��a9��S��{��5���Z��S�7h���r��j����?��Or���'�����<����y
F|�?����1Th��2���k�*������n(��N�<9\pA�e�z���q�I�c�9&�o�y-�`���C���_���/���o��W�0 �
�����?��O�x��s�Wd�e�)>U-)�XeU�6������=>@]M�2%�rH�O��=z��N��c�%�D|cN�ak��}q{�����������5�RWu����&��d��	����Z�����)���fO�
�
+������gZ�h�����x�Y�	����l���SN�����d�������Zj�l��������o��dO_�m��ZUf�Gm�����s����o8��$�g�}��N:)���JV[m����~�������������+e\���~8{��g�M�����\}����/~Q�����W_���oO��������S=����V����C�;��d�SG�<��t��%��w���s���W�a�?�B!Gydn���$��+���~8;v����<���t�I�>}z���?���G��r��o�>�[�N���s�Yg���N�V�����f�}�)>�ga��MS��4Xm�����\����/����#�\Wy�nP:
����m�e��#�<�u�Y'���u�Ee����������;/'N���o����������5%����{�����������Ufa���K|&��������B�U�q��j��y�=��������B!�����W^9��Jv�����h�k�f����[o�����$�6mZn���80�����'���c�f����=������?;�Xe)�/��m�T�o����st��L���s�=7/��r�7o������?K���'s�-�a[r�%��5	F�&M���u�k��i����-[�]�v�~�:m�����o����]��������l�'�gO�O�>=�?�x��m����[nY�\���k��FVZi������C�~���u�YY~����\���^�W\�}��'�.�l�9��|��W��OM�f���]Mu���<xp6�`��{�����7��#�<2]�vM�~�������q`QR��^�G}4?���3y�������+�����a��G��~�����u�k^T|k��e����\|����7n��4(tP�[n����~����\�P�������O2�F�G}����>������I�n����O����[o]�a�����u�]W�����4=�����O?�$Yb�%��^{U����LYYY�UF_{��:�U���NC���,,�m����/��A�e�]vI�.]��U�t��)={���W^9�dT�U�����������]Yia��� �s��f�te+c���3���[n�6m�$I�{��|����_q�y������������P���/�xn���<��C�o�������m��i��}�_��y��y�����F�meeeYv�e���b��M��&���j�1G���$�A��������O8������^�S���9�o��
�X�t����=~��j��/S��I��J+e������>� S�NM��-�����������$k��f���j��Z+���w�}Wm�o��������:�d�e������#�$IF��/��2I������>#F���#R(���oW7/#����k���>;g�uV^z���92O=�Ty��L�0!�'O�e�]��{,�F�*�MJYYY<��x��y��w���O������#��+��P(��{��O<��#GW����[�b�?~|�I�����y��G������0~�e���#��{��\{����R^H4��-[���������_������~;��M��7��#F��g�-�`�\�P��G�+��2I��
+d���.�����f���I�>}�T��i��r�5�$I�y���ly���F���>����[���������Yf�������D������kca�o-[�����>��2���Jq{��6����
Vu}����5v�Ps��f�~C��.����Y�t��)}�Q��������@�r�-���Gg������������'�|2�����4��NS��c�}��I�>}����K/��k��V:t�Pa)��b��M��&���*e��=>u'�Ai
<8S�NM�f���e��{������@������u�V�����R�m�!�����>�l����Yo��*�+++�����g�}6��O��1c�y�=����r�-W����Sm�7�x��]Up�n��r�M7�?��O>������K-�T6�h�
����O>��/����z����$}U�����d�
6�QG�B���~8������_~9W^y�<���0���k�v�����/��g�:��<��c���or�������n�V��o��������df����='N,���s�
�������^���K/�QG5_�}�����s�%I:v���w�}��[u��-��u�!��$�����C=4/��R>����w�y���K�����N>���+����
><k��F�>?�F�$sM�W�����o�\���A��6mZ�R|]�zJy}_[�Wc^��Y�n4E�y�X�1��1����W������o��U�Gj�����o@e����9��*����3���3��__���/
I�	&��3��Q��
*n�o��Q%1��NS����V��q�R��6�
�*�M|��U�>�{|JC|��7��4c�������g�����'Iv�m�y&��G�IU��EG��5��:����W^9����w�y����~�m�x��$�b�-���{�U��?�iq�������������.��R�f����o^�~����-��T����O�?����/�m�������o�yqe�������������;��K.)�7���t��=��v[�5������
�S}��9;���?��c�9f>Z:S�U���o��i�f��\�m��f��?�Q|-�A���|��r�e���Ys�5k\G���������/��R�h��E�
J��{�������4��$v���k�P(T����=�S���`a�kl�m������{�$�:ujr��oP���T�Gj�����o@b�:���1T(���3���Q��OfZq�K����D?��na��
�\w�u���z�\e�1��
h��7��R���S?�7X��W�Ie��E�th{��wq���.����W_����.I���������u]u�U��s���s�-�$I��m��v��Nm���]�f�M6I����[��?�Ye�w�}77�tS��u�����_����^u�����'�L2��z��-��6�$�8������s��u<�d�UW-nO�6���,��Zj�,��I���A}���w�t��d�
��G�������+����>�TY��#*t������7���|�u��):th�u}�J��j����1�SL>���K����Z�Vu�_A�_��W����y�������u5�E�
�_�zj�?*��}M
2����:�g��u�ka��FcW��u����q���1Ir����m��u�ka%�A�y��7*<�q�]w��\C��E��$���b��C����q���1cF�<�������/��B
�B�?���^|����/y�RS��4}�je�����3������K���*����*���J�gt�O���v�������t�Yg?s�Yg������J�������o�	����������.�,w�u�\e�y���q�I�-ZT��(o�u�M����$&L�a�6W`���o��~�e���I�N8!K.�d�N�Z��rJq��#�(��7i�������/��V9A��kW����[��v�a���'�����|��'���a���c���|f'`%�Fm4���s�9'<�@f��Qe�a����/�L���
�����SVV����l�����i��y���8�o�;��S��/$I��z�������{������B�������������g�}�$���G��~�	'�����g��/����T��GM�[23�g���.]�d��uZ�n���.��������W�����B���N;��*^��m�}�E���NMc[y�qq��V�Ze���:f)��O9��y���$7�tS�8�����O>9�Z��U�����R_'6�����������#�<27�|s����z���j��@|���I|���K���5f������8��N;U�t�R��E����9ps�
�*���gx���s��W�ue����p�y��G��\����O��1�"�p���C5jTq�9
�\}��9��c�$���������1����W�������g�����7������2�D|�?���i��
��b���s
(���3fLN?��
���~�J'z;w��K/�4tPf����w�=���Ov�q�4o�<#G����__�|9��s���kW���.�(O=�T>���6,���J:��,���y���s�5�����N23���_��s�0 C�����-��"H�^���U����K���k�k��v���?������.�_}�F�VX��d��+���!a^���\sM���������~����z�e���������{���[o-��;v����:�v��4|���}�����s�����6�(]�tI�f�2a��<��y����������6^��a��;��#=�P^y��l���9�����:����?��a��O�Xr�%s�UWUZ�/�P����o�t������f[z���O���A������o���\|�����kv�q�l��Yf�e2}��|�������2r��$3�r�I'5p��nt|;�������-IRVV���;.���Z^{��y~�G��%gk��e.��������1cF�������Z��������e��y���s��7�����c�_~�J�3f���v�m�{������>��\7�����x���=��������������+v�m�,�����|)��������O�f�m����:��uK��3u�����[������s�����.��_�����T��u�0��$���_�Yf������p�
��RK�������cs������>J2s��;����ML%����{��Gs�q�e��WO�>}�c���7�G}�Gy$��{o1��k�������������G���>Z���	���~{�|��
�Xa�����M�9��3�p0����1��N�81GqDN<�������d�M��J+�]�v����2z���t�M�4iR��sR�\sMVYe������gQ�c���{nF���w�9�n�iVXa�L�2%o��Vn���blm��m���f��W���R�b��������^xa����*�7g];v��'�X�f7����|v����XT4����(u���&�UF:������?��U�;v�\���h���/�<0��}N8��L�<97�xcn���
e�7o��N;��I�VX!<�@��c��7.c���	'�0W����*��v[��o?����u�]��_<W^ye�L��A�UH��m�m������v���������_W�G����C����$I�f�j����q�2n��*�����������
+T[�����,I��'�d��!2dH����k�K/�4�����l�L��uM�h�"��v[��w���_��������s�[q�s��7g�u����^x���x��<����w����W��?,���M��������X��o���n����*�-��R2dH6�p��4(��f�&3W{�����}�����A4��?������}������r�TZG���s���������8/���<O<�D�x��
�����*]��EAC���+�=���/
y��g��3�TY�Y�f9���r�y��E��7������T��u����$y��w*<UqN����UW]������XT4T������[o�5�2}����A��\�l�R���|������;w�}w���������7h����s�
�*���0�������;��w�Qe�.]���k�I�~��t��D?�EAC��~���6lX�
V��u�Y'�����V[U[W��P�:��EEC��J}�K/�4���n���y��]�.�	�����|�l�����EEC������?����6S��Cr�QG�O�>���+s���������3����g�v���^��u�Y'c�����^�[o�5����_|���^:l�A��w����~i��Y=�U�Z�h��/�<������1"~�a�N����;g��7��~�������Q}s~QW����y����;w�uW�d��7��K.Ye��4�|���;6����W_}����g�e��l��v�-�����m[��_H�}��y�����c�e���y��7��g��P(d�%���k��>}���C��=`n�/�x�����y����?��g�}6�|�I_|�������/�#�8":th��
<��$�_����������?�x O<�D�����~;_|�E�����S������y��s�!��c��
�\X����^�a�2d�����;vl>���L�>=K.�d�w�����.�J+����mp�oP�F���_=I��J+e�w�s]�������SOe��Q7n\>����S:v����^;�z�����]����
M��EIC]'.l�-In���<��#�'X~��gi��m�[n����;���Oz��]�v.�7�^xa~�����g���/��O>�$�}�Y~���t��!���J��r����~�|��k\o)�g�:�
�-s���$c�P��w��O�>���;��3�����w���L�4)_~�e[l�t��9=z�H�~�����i��>N���gQ���P���g��6�c�=����g���)++���.�M6�$���{��k�Z�<o����6����~�������`�#��o�)+
��n�g����d�M�����G�
������2`��
hR�6�����J|�*�
h���6~��@S�4U��T�o@S%�M��4E
=w�0�@����@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$I��n�s������^k�f����#��o@�"�M��4U��T�o@S5~���n%�;
hj����J|�*�
h��7����������
�B�A[�|{�����g�L�>���Pr��5��3�%%�M��4U��T�o@S��y�<���r�-�)���o�)��*�
h��7�����J|�������&�u���>}z�����7tsJ��{��g�!�M��4U��T�o@S%�M�k����u��
����7�T��M��4U��T�o@S%�MQC�K@oB�w��=z4t3J���^K"�M��4U��T�o@S%����45��@S%�M��4U��T�o������A:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$���,�H"�Y$��D:�H@ �tf��@	��"�$��E:I$�0�t�H@`	�$�����������8�IBHB%@A�"U��K�+=A��X@EQ~����tQT�N��4�Qz�����������f��&��:'������������3nc:@��1 �	�������t�mL@< >>^{����3�����f����+��������^�z9�W�^���f���b����+_�|�9]�tQll��w�E��c��*Q������Z�j��?�������;vh����\��
*$???-ZT��U�s�=����N�����z�����&M��p�����S�B�T�F
�9R�N�J��HY-&EGG�����DGG;������U�TI���S�9�7o^U�PA���Z�re:}��������e�>��3���K��WW�%�;wn���)44T���>|��=�t�111�6m�Z�n��E����O���z�����o����N�s��Y��3G}��U���,___���O+VT�~�������n�EGG����R�:uT�`A���*w��*Y����k���g;�x��9-[�L�F�R�����v�-{������b\�<yT�L=��S���d�W
 �x�����H���e����1�
�>����]��B�

�����/��5k��W^��?��r�2NV�N��U����m��%J�\��7o�l��Vqs���.� �y���e��1#U��������n����~�M������o�J�*�h�����W``������U+M�8QW�\I� �dD���w�q�y���p�����7j���j���J�(��������{��c�=��������)���d_}��~�����T�����/����M�6�;w��������m����m��y�*pR�v�Ivz���t^={�4��>}���K�,1�����7����v1@:�={6�
w�����w��/nl�����^�t����������lI�����r�J#44���������Z�GlCZd��t�������;wn���k6�t��
�[�nN���E����n�L��
�p������~~~��Q�R���?�0J�.�0������?w���/�l������=��������� �7��m��c�~~~)��2e��w�����]�R����#N�+>>�x��Woo���Q��q��17|H	�
��D��~�����L)>����{�����������o�9���*���������[��w��y]��4�\�U���v��Q�dI�<���\�������N�V�r9?��
��D�;��>}z��c�
f7�-[�8�O����%K�����S�opUF���
��x����w�dy8p�(V��S�(P���������y�����?���3^{���Kk��m���v��������Ns@��sU���`(P@��w����7��G����o���F��n�@v��;��_~�$����o��*_����?��s�***J��S�-�r���������Y�f��u�$�h��j���*U���y����+�����|�rm���n>����c�=���IR������O*,,L�.]�����`��?^�;w��E���y�4�@���1)$$D.t��	&h������;+W�\6�u��M,�$����}���U��BCCu��)EEEi��JHH���K��uk�^�Z������#O�K�q�F��T�����>���W��������%K�[�ni��!�����o�m3����+<<�\�����W��=U�ti��qC�������u��
=�����#����k3�?��Sqqqf>�5R�J�T�`A]�tIk����y������cZ�n������3�6�h�M�0A�
2���UK�?���/���/k����1c��^���A���{�
.l���|||T�lY>|X7n�Hu�^}�U�;�|��ys5j�HE����g�}�v��3G111��y�6l�?���n[��x�����{�������_��)$b��}�EGG�Q�F:|��$�t��z��'T�lY������o�~��?~��2���<���o����+00P��]KS]�n�j���#?����U���?��
:LS�l������U�F
�/_^��7c��}�4�|:tH'O�T�6m�����X&����[�.]�����.66V��u3�~"""��9�����_I����4h���k��{�����<�9s�h��}:w��:u���s��S�N�&���'�O�{�9M�8QRbY�����aC���#�={�������(5m�T���W�|������������*H���{�x��������6�z�8w���_X�.�����*���
T���'���|�����'��4h���n��n)�Y�ff��
2n��a7���g���&���[��%J�����KFBBB�t��/7W�

5._���k�}�6�*+�$g���4�����m�[�n��&((�����-[���s�i��G������
w�;k���6�E�f��i�.�#G�����U��k���[�n%K�c��@��$����8z����Z�hat���n�3����CBB�2���:��7�"��n��_7�����&O�l3������+��^~�e��<h����?~�e�zf����dG�5�&}||�_~��f�C�E�5�?~�S��u�7���7������e��f^��f}�f=���
W��`���[f������1c���8����������opEv����2�����3�qe���3��i�����3�
��D�;��<��}��.]�dw|<Ill���_?���?�\���[J���{��2e��L�a��x���'�|b�?�f���Xc��f^�����l�%�e^�7�"����e����u��%Kg����L��3���L����<=v��l������5?j�(�����1u�T�UHg�������"E��1������8���6�����i*��� -7
���3��\��o7��#��#F�p�L8��Wd��������,�\�rv�
:�L7x�`�y���+V ���.�=�����[���u/�i�&�x�"E������k��Yf����i��;�T�~���4=���#�!�<�v[�|��O����������U�VMU9�<>y�d���;:L;a�3m���SU7��
��U&�����{�����������o 9��H-��6l�y����SU&��
����o��a�)S���<r�H��s�~�mC��'O����c����.����c.�.�8t�P��{7#�!�<�~sF�V�R�O�z���M%����`T�R�mq�����oH-O��������7�n���X�>���'U}hw������c��mdc���!C$I9s���y���|������%///���K�t��q�����\��
(`u��������o�F�*X�����T�H5n�X�~��n��a����8���K�k��[��]��u+S���t0����7���'Oj����]��
,(___���W�J�R��5����j���JHHp�a9�T~xx�$����z���U�jU���_���S������_*66���#G�h��Az���;wn���O
4����b��n���I���ys-ZT�����+����^U�RE��u��3t��U��
���]�'NH�����*U��L����^x�|?w��4�;z�hIR���������+��=z�����f_�����s��q�LI
7��$��Y�f�Q�F*\��r������k��!:w�����/_�G}�����@�
��?�1c�(&&&���,Y�'�|R�������+�M�63f�����4]�)Y=&9k�������H��N�>m�.]���<-���}�z�j3����;�����_T�2e����i��Z�lY����w=��S*U�������;j���)��mS�=������'O&;n����������sg���t���di�����W�V�(I:z��._���y��������'�G��D�l�_�<yRC�U�
�'O,XPu�����~+�0����g�����2e�(W�\*P��Z�l���W�X����5v�X5h�@�����3����T�D	U�^]����?�S������e���~���f��������`������O$I%J��+����e��Gv�6l�8�|��i��	i�k��]z���%%���{�qG���1��o3f��$������T��%�b����'����������?�M�6
�����+���{���#)�}��!�����^�����/___�t���W����k����db���VmK[������O��Rr��	������9r�G�6�*g��)������;��w��������/��[BB���������%%��n��I������7��T���������i�p+O�b�p�
�qqqFdd�����@c���n�����={�4�-[f���wS�N5r���,��O����-[��,7i�___���+6�X�<#����m�+[��!�

Mvl���FPP��z&��9s&u���<���o����(U���rZ�li���h�"#w��v�����v�<|����8um���w������I�vz��'N�im�g�_����k��.�c���E3��K����2>���_.�k����+W��M���3%K�4����0���F�����
7n��a�����[�P��g��._������������>>>f{���Sv�Z����+�8�w��Af�O>�����Z���g��a�����M6r�H�0WEMZ��������h�"��fT���op���z��z��M��g�5����)�W�|y3��e��T�B�
�y�<y��|�m�!�!�<�v����Z�j�.^��L��]�T����;t��0���~j�8p`��f�������!!!vc��O?m$$$�a�&M2r��a7�_|a���[��v*����H�7�KV����e��f��c�Y������?��.��o��C����!I���CSU��h�;�����n��[�l1�����K�0�w@���5�V�jH2���c�[�{�;w8����___�q�����5k�a��xZ������'��y�f��N�:����K1������wat�������P����L��9�7��'�o�x�������i��<?��33�����)/�[�#�!�2:��>}��#$$$���~����V�Z.�����e������������k������$%���t�R=��#�R�����C]�rE���W����?~���?����C���S��O�}�&M��m[(P@��������w�^;vL���������CY���aC���������u���ys�����3W�I�r�Ju����w'N�����%I
4�:v��qu���\}�~��j���
.,???�={V{����+��_���Y�t��Z�n����C�j�������?��S&L�����d��5J-Z�P�v�������{N5j�����V�^�i��)>>^|���4i��
&+�C�f���-��;*,,Ly������u���]�������f��������;L[�pa/^\����S�t��*T(�e�Y��|�����{M�2E��o��T�@U�\Y:tP����b�%����Rc��])�X����-[�L�<��:w���E��������/�o�>>|X��w�?�������5�`��y�w�^}����p��V�^�Q�Fi����:t�/^,I*T��:w��|P
���7u��m��Y�V�J�5���c�3f�����xIR���b7m��m��{�I�&M��'�|����[�n��I�$I���������}�F�-�dm����+..No���j������k��
S�^�T�lY]�vM�~���-[���X���KP�����D�@���k����$�l�2Y�����4i���I�]�r���R������'�nu��Q��u��Ym��US�L���Kr��s�Hooo
80�e�V�-�3gN���h������_��c�%Kw��asW�\�r��g�uK�������m�K�.�W�^�_������e�}���q�����K��YSy��Q�~�T�`AEDD�R�J�����%K����J�^x�����l��V�\�~]m��5W��Z���x�	-ZT����p������U�V9��2�Z�j�;v���3
�=���Z�j����J��'w��qoJ�
@�`���o��q7�����cW			�9s�f���={����+*T��j�����zJ����������
�Ov����UDD����n3f���~�m�����O�'Ovk�g��%Z�`�
(���H=��C������K����*!!A�Y��>��M�:U>���u�����O������3�i�&]�|YO=������l��;v����V||�|||��Y35i�D!!!��������s�N-_�\���O�����?�\�G���c���������V�����gO���+�e��!C����S����+�d��i�W����'�o��>}�������ay�aaa.�C|����oi���kj�|6�-�<2�n��U��X~��	V;��s�=��={�^W��9u{���~��n���hs�w///�;����f�*T0�����l���<>h��dy$�6`<����$�W�^����3��'i��$~���+�l����n����������9Y�}���$#o������o�,Y������M3�k��E��[�l1�w��1��k)::����+P�����>�o����z������[�R�O<�����y��v��9\I�b������m���wo3����������P��\qY�W�����W�
*�i�V�j������k��{��5���
IF�����0����y��5$�J�2��?o�n�.]2�o������
���1�������%KRL���/��}||���;���7���c���F��
ooo3>��������
{��%J����3gZ�i�����-[��_O��G�f������gd���op��\�}��5��������3��cu_�#Gc��6�>|�����^rXNLL�yo'������u6l��Ojw���9�7��'�n�a�}������k�6F�m|���������{�\�7w���7�|��2\���0���?��7��77��k��;��0a���wo#g���������+S]7Kw�_[�nM�n��U����(`T�^�8w�\����&?�������?�<����{��5N�>���	�
���;�;�i���q��q���G���2K����������o���N�68R�>k�+W6�Y�j�Q�N��������gS]7K���C|Cje����~C����2�������;��#�������*U�����r<�J�*������o_#..�*]ll���aC3���~�,����B���`�Y�&����7�KV���O�B����;�o||�96�p�Bc�����a���+Z��c���_��o�!�!�<u����k�2�)��}��������7���kW�����Uet|���5|}}��Gs�0F�i��������L�������c�L@�<��������s��K�*��	@��9?n�8��h���pf���X���?�`u<>>�l�W�\9�����7$�52�x�
������f�:��_?���k�^WZY~������t}���J�a��i�~~~Fll����s�����pO��@�r�J��-�R��j��G5�(S��!���3���Oc����9s�W_}�����`��C9U�T1��{���+���R�
�z��I�&v�%�}'�|��v�Z���k�Z;q��yl���.�;#�����R�z�j3��E�:�<a�#44��`WHH�1i�$�>�����e7m�����p��%�����s�S��
�����;��.9���#���^^^Fxx���[V�\i����{v2�������K�����8��������Als�
����[���W>��������1t�P���q)W'�F�m���;r��m|���6rL�;�/���c7m����t~~~Ftt��t��_7�_K�,������o��w��4_CF ��]2bz����N�:�����9s��|��1v�X�E�f�#�����6�I��2�M3�N�>�
�������o��G������$�]/���1{�l����2`."��V�Z�E�S�6�s�oH��2����F�eu,������:V�P�����:���s��i��}��
s������.K�n�:3]DDD����53��	XY�
���&����u��1�x�
c����������'������^^^��_�T�7n�������7�t��r���7���Z��?��W�^f����[��\����w��[�B|Cjy"�YNb?~��tqqqF��e���S�H/�gg�����So�6�^�j���������t/3  @}��q������$yyy��W_��.G�<xp���x{{�~�����;w�����1�0�z�jIR��
��aCI���Gu��!�|V�\)I���{U�T)�c�����m��9�.w������>k�x�:u����U���>�b�[�n%�nO\��Y�T�����\��R�.\0_8p@������5y�d���SO=��F���{��|������!C����CK��o��W_}U�a$K�j�*�9��w�/_v��wz������m>>>������u��5_����V�r��e���}�+�����R2m�4�u�^������y���3f�
*d�����5z�h��5+�ur�J�*�U�����k�6_���Cy�����x��
��<�I��O*Z���4i���K�MS�~}�)SF�t��q���[��������[/�����\io]�xQm�����7%I/����V���|�!�����[�z��i��	�\�������������G���i*+���m�����d��6�_�zUc��������x�����;�=ny��uk3��)  @��U�$9r���I�o@�y���u��I��7O��SO=���;k���Z�d�6o��{��WR�}iDD��|����{SH?��������7�^�1X�s��D���k�����]��[�n�0a��o��"E�H��n���>��-���';����)""B����T��U����6n�(oooM�2E���i�/5Z�je�����o5������f�G}�����v��9EGG����K�:u�u��i��Q����:t��>}���/�Ptt�9�b�"""��?����
*�q��*X��;.�D�
pO���r����?�|ool(5&N�����K���������9O���y"�=������C�j��
��$$$���������~���y>���L@���+����q���{��+WV����?}���Y���}�3I�f���7nLv�A���LW�Ze�~���:w��$�Q�F�]��r��)�����N�#G�H�9Ho�i����v��i��1:z���:�U�2e�/_>��.l��Q����,�Zv�K�_�I5G���^zI;v�����HHH�z?f������_m��1cF����� }��'VyU�^]c������5e�u��EM�4���7�H��vO��C���L�2��7�Si��my��1�Y�b��q-[�L111�V�m��I�\�|Y�}����6{����y;v�P��e��{w*THs�����'��'Oj���*_��>��o��nk�8�o�k��;�����)p���q���a�z������1BW�\���CU�bE���o6���������l���U�PA�������[��9S}��Q���u���4��n���v�����������]�j��m@�w��Y5j�H
4Ptt����C�)&&F/^��+��E]�xQ����������j�����Wll�&O��c��)&&Fg������U�fM�<yR��
�Zp#��U��p���f�.^�hu�q������$=��36lX��@��Y����oK�j���/����O����?k��-���G�����f���o�32k��cWS�NU�%��+S��&N�h���H��@����������}�|||4e�����q��!���[����{N�<���y��]�-G�*P��$��-!!A����4i�N�:�J������_���{<((Hs��Qxx����lg����������]�pAk��U�>}�}�v���G5k�t�����k��y�v����M�m0��%K���ny{{k���6�7m!�H�'�|�;�z������n��i��i�?������r�����/T�P!�����C��&����ld���V+n8Pc��M�2u2H��'��<�@�������-�Mb9hn9��4�'OU�VM��e:�����5k�=zHJP<x�J�(��%K�k���4i��;��u�FR��=I��6���k������V\\����*U��P�Bj���F��;v�p@�d�p�3�[��n��O
����[7�i+U�d��[�n)***Y��]�j���fl��m�^y�u��I}����y�d�����[����������Q�rWl���>����X�x��5k�|���~��z��7�|�r������@��b�=�|���_�.)q7�;w��e��=�S���=�5jh��-����BCC������Pu��E[�lQ���%IS�L�������#��~�u�V�c�h�w���@U�TIo���v���{��G���S��-�{�n�����k����C�����|�Mu��Y�z����Su��-���W�=��y^j�[111j���y�[�R%-]���$,W���D������[��V�Z����k��Mz���T�dI���*o��j����,Y�H�6o�l����'O��G���;u�}�i��m�����+&___(P@�Z���u�����KJ�1b�[�����r����7��$]�vM#F�P�r�t�=��C�?~����+W���w�n�����l�sg�����?���f�w;��Y^S���m��$�[��=��#)1����/����'��������|��T�Z5��$%.v������{��{���r^�J��f��5""B�5����R���U�pa�+WN����9s���=�����9�|o�?�///���Ou�������x�b���h���j����QZ�~���7G,w����LS^����:t����8yyy��/�T��m]���d=��o����?��x�	IR\\�������Hu��I����v���"E�h��%V�.���C��&����l�������C������>���t+/  ���+W�����3�������U�PA!!!�l���W��rMh�\)>�x)q��3f���2w��}������������eK�=0��h��+q�>}�f�5m������s���������J�*z������?�� ;������
�������
A��S�Td9�u��!�i�������7�P��U�/_>����x������~��w����V��\*-��Yi�mU�T���;��wo�����Z�v�>��5m�T�����lEk ��.1�W:�_�u�Sd��q�.7w��+���H����r$#�o�6������| )q���}Z�j�C�����S���,___)RDm���/���/��R���7�q���:h����d�����,���D����?7w�~��W��>z�h��y������.����#G������B�
�L�����>���E���>s�bb�F��E��V�Z��N�8����^R��eU�Nm��)M��-iYI'�����{S�o2���;��7�;��Y��V�Z�aZ///U�R�|���+{h�������[�n�D�z��w]�O�/��Bk��1_[N~�(�|}}���?k��qV����i���W�^*R���v�js�&�K��5���/I����4��E��������;k�,�����>�h����~m��AR���;vt9��+W������7����/��"��-����S�-((H����/_��]�����S@@�r����+������={�����^^^


u���v���<&�����#��[o��_}�U�=�#u�\����kN��4�n�35<<\R��������k�J�TOz}��)���W����.]ZE�������z����;w*::Z�g������JJ\ut����^���]�2�:u���_���g�h�"����S��r��!I��{�Z�h�3fx�����)S�|}����[��<75��-k�N�
��4�/_���X�b5j��n��.(&&F����f���GyD��8)I5j�p���i�����sZ�f�>���j���.9u��^~�e�v);�$K{��5'����W���O��[�ni������5k�t��V�Z�������z@4+��mS 3k����z����k��!Z�~���;���?~\.T�f�$�����;j����H_�b�
,���d.�6dw�h�Y�,��iS�i�	�			��e�Ke�G��+�r��IJlS�cw����ukEEE�����?���U������T�n]���o�)��X.pq��E�i��_��)�7��oY�f�������c��cW�Ev��@V���{�6n�(Iz��5n�8�92���	�s.]�du�r���]��)������k���:z��y�W_}e�~���.|������^zI����5u�TEFF�d���w�����U�Z5?~�������������)���$5����7dw�h��3u�T�u�.]�N�L���+��uks7��>�L���sK-�������q���={�>�������+��k�����`���_�����x���Y����A|s��lj��z����������{[F*R�������N1����u��%I�=��c3�� ���+�u�V���Q�F��Gy���X�r�8����/Y�����k���0a�����?��S���������!C��'3��?�Z�n�Q�Fi��u:~���{�9���A����U�bE�uJ��N���c�$I!!!vwsKI�J���I���4��L�r��9�Q�;wnU�\���<���O����k��������3�4i�|}}%%�T�m�6�H���,W�{���R�]H�9�SJ\�4i"�=^^^V����PV����@fd�@����W\\���_/)1.��S�a�����-�$�/_^+V�p9�gf�6dG�h�Y>��L[�r��ne������Pu��Ac�����[m����_~��5������FJ�e���~���f�;%�#;�������=-;�n������a��%K�������3v�X3�����%Mr�����v�z���m�3m�4�����{�>�L�L�2�����)St��!m�����q��q�����!G�����'���yO������7[�����W_��]��*i�y�.��~���y����N�7 s�,����+�����y<��:�7���dc���;��c���74j���CHH�J�(!I:p���J���������]F�t�|����
�����3�j���,��y�F�r��`�y{'��u����OfT�P!}���fg�����vx�6�=������v�v�����-Z�\f�����������=[�n5_�e�����|��{�����s9�����_O?���}�Y�w�)v���cRll�f��m�w�3��C�����y����7n���3g����/gu��m
d��������~����%%��b���M{���r��i���
		IS�
b�O��,�HI�]�X��(P��r���������^��3��N��gO�w`�r �����_������ #1���wj0����>k�������ah����{w���I�9v������v5j���Y����7 s��q���F�b�\��8�;��3�o�<�~�e��%:u��$�B�
�Q�F���s������1t7���e��f�a�>}���O�>N����iG|��t �6l�F�a�:t�F���uh�����/�?��n���8�3&�yw*]�������+�r�JIRxxx�V����Y��~�MR�*+
4p�j����c�9����������g��__����r�������x}��'��.]��\f�b�����]�f������;�q�FI�����R������D��9���/��OfGlCV�c��������*UR��U��WPP����$%N��?������3'
T�T)[-�!e��)�I'N4_����W�<x����W_��666V�:u��|�j�*����\~VDlCV�������9s�8L{��Am��I�����j���\����z�js���`����Z�������E����q�����_V;^�j������/����7��o��S�1"de�1X�U���7������������������!��ndYy�����a)�9r�<',,����.����S�%�]J\�/��/�����IfD�
����o����+%��)S����2>�Y�~CV����-S�N5_��������&����z���V�;���/��7[&M��;v��tv�
��v���c:px������z�-����V���?o�l��_h���������g���]�$%�H��C"i��������5J�.i����������5|�p����JHH�[���s���~�a��2�9s�h����v���4���V�X!)q�`Vo���������G�fC������?��CRb�@�f�l�7c�yyy���K���v������W^1o,�:uJ]�v5����
H����#w���w�6l�.HJ��Y��~��>|�N�8a7��k��VH�J�H�b���M�f�Nmg�SO=e�~�����r�y�f�������={��O��mS =8�&N�h>�cO||�>��}������}�Y�iO�>�?���n^���c�=��J����g�nI����]�v>�n���m�x��f�>�>}������'O�S�N��H�V��}b�����{vW�������k��u3W�
>����?���IQQQf�g�b�T�`����)9�>���������c��5kf����iS�;�����{��G�
@Fc���o��o��c�������{�|����d����/=��3���^{-]��n�9vI���7R6p���y,���o����]6l��/����n���]S�=�{-???���7�|S����2/^��'�|R;w��$,XP�;wv�
<����j�Y:y��9��3gNu��-U��f��l��j����v���
Y������u��-�����_~���^�h�����N�-urx������#����������o�iu�a���`�+�*ooo
2D����o+!!A��
s9Og�����O>Q�>}������{��o�Q�6mT�@=zT�f���={$%~9��3���
64w3I����T�ZUy�������K�j�*���;
		Q�f�����p�������'����j���f���3+����5|�p���j����W��{��W:s��6o�����������Z���o_-\�P��/���{U�R%���W�������5w�\�_�^��/_>M�4)�e��YS����F��.��GU��=U�N�����?���)St��yIR�j��}g$��m�:w����k+<<\�K�����N�<�U�Vi���fl���t�gfu��%���;1b�j���Z�j�L�2��'�.^�����k�������>�h��OO��1�������/�HJ���w�k����������:��j�������A�
�����r�J-X���s5j��;�4���mS IF�o��Q�<���/�&M��b��
		Q��9u��E���G?����C�o���������U�^]U�VU���U�lY���sZ�~�.\h\5o�\�������[?��������/��k8R�N�,5�����EF���6m�:�����a�������+�i�F����7�u�V}��W��H�4v�X�yN�:�j�I���4v�X��������'#""4}�ts��e��j���{�1�������������su��
IR��%�������k�����7��5k�*U��h����3�N�:�5k�h��E���
YUF��V�\�_|Q�J�R���U�B(P@>>>:~��V�X��K��[aaa�>}�����_��)�7���o��=��o�-�c����Oj��E���o��zH}��Q�j�d�6n��i������[�viW<O�������������^���SXX��4i��zH�
R||����?-Z�HQQQ�$___
<��5\��{dw�y��)���O�
R�&MT�jU/^\����t���o��o��F������@��)ST�D	���={��{�=U�\Yu��U�r��E�N�>��[���~��K�$%N(�6mZ�/l�n��p��D����Y����6m���Y�?���j�y�f�f>�cO��U�N�d�'����x"��9RQQQj����W���E�*&&F����o����w��T�RN�����!����,o��m�$c��m��
��j�*CR�~�
f3��={�i�O��b�|��S�:r�����={:}��)S�\�r9��b���7oN1���h���/n7m�V�������v����;��hL�6��k�%)����;Lg��%��a���iW�Zeu��w�q������qqqi�>w�={6�
w���dq�V����r��������7�2d�������f�����������S����+�����			��hl�_���wJ�W�^��wi�z����O����������1���Q����t���9w:z��Q�V-���[�ha�={��r���Mv'Gq3#���@|�+�y�Ll���N�'o��������[�lI1�9r4n���0����T��G�m�!��U�v�y�����X�2e�;v8,��o��{��?o�n���<y����#�����_Z~�)��Z~��Y�^�z9u}������#�t}�B|�+2����M��i������9������7���7�N�>�
���������7�
�G��������G����J	mp�����2�m�e3,,��|�X����
%qW������l]s�%��o
0�.]�����
���>Tw��p�B��/\����O?9�,R3���W�N�'��gA��>�\����aF�2e�s~���T�������������'��[��-S��*_�|�������_v�o�;et�.��k�������c���JHH��#�����H5o�\���~��W>|XW�\Qpp�|�A�i�F}��U@@@�y����d��:|��$�A�v�6l�P?���$������u��x�b���oZ�f��o�������2C���S��e��qc���G��sO*?�:t�4h��+Wj���:p��N�8������[%K�T������+{��@��������Y��e��>}ZAAA*U����k�~��%[�=��{�=u��IS�N�������)66V!!!�U��z������;��A��4i�V�Z�]�v���S�|��
,��%K�e�������-���g����k���Z�|�6l���{������k������E��Z�j����Z�n���i��c�%���"""\������u����_~��y��y�f?~\��]S``��+�G}T��us�V���s���O>�Dm�����k�c�:tHg��Ull�r�����P=��Cj���:v��b<-W��f�����Wk��m:y��.\�������{��c�=��������+���m��dt����OS�N���?�3f(**J������3gN����j��j���:u���9s��\g���_�-���k5g�m��Q�����\����)RD��WW�N���uk�;CfV_|���t��U�Vi�������t�����)O�<*]��������K{��@�1v�X�n�Z�6m���;u��i�={V�n�R��yU�D	��YS]�v�#�<�b~��/�����c���o��q7��������N����{k���Z�v��?.I���{T�n]���G�j���z�Kv�������7��m�6����Z�n�v�����������2����7WDD�������w�������M��y�f;vL�������+W.����J�*j���:u�$���_�^��-�����]�v)::Z/^������+�m��z�������W�~��p7�T�-**J�$/^\M�4qk��E|#�!���������F�Z�f��9�S�N���K����Z���x�	u��Q9r�n�/�g;���:^�a���f����Z���m��*U�x�:�6s��Q�n��o�b���� �"����o�+�N�>�
dW��dW�7��
@vE|�]�dG�;�z���������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p�����-��+�Y�t������j��DEEI"��^�m�+����� �"����9��*�M������]�dW�7��
@vE|�yz���0��5@�m��Au��U||���n������OW��� �"����o�+������G���S��5=]���o�mp��
@vE|�]�dW�7��'���=���S||�f���r��y�:�6K�.�[o�E|���dW�7��
@vE|�]���O��u������1�E���IDAT
 ��
 �"����o�+����� ;���7���r���J�*�����}�$�d/�6��
@vE|�]���Q����+����� �"����o�~��� s`:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��t�$&�nc:@��1 �	�������t�mL@Hb:�6&�$1p������	�IL@��={�h��z���U�fM���K^^^���R�^�\�����<x�*T���y�*w��*S���?��#��W�^m�!<<<��W�\Q�
�s�+�}���Tw�
-Z��;�D����WHH�j���?�P�/_v{y���z���T�N,XP�����;�J�,�v��i������u:�'N��w�Q��UU�@���K�J�R�^��v�Z��(Q������y�W��U�z������N���p��>��S5i�D��{�����r���}���0a����?����uK������}�o�^�*UR��E������@����U�V�8q��\�����Ul��E�}��z�������D���;�������p
>\G�������;V�2�Xmy���OF�~���{�$;v�����U�re*TH~~~*Z���U����{N�}�������+-m7Gn����e�Z����W�:���+Z�`��{�9��UK�
���������e��G����_d�[���=���3c&�
���1p�2�
.������sZ�l�F�����+,,����T>w�M��
dm��N�~�U�V������%J��}@����P�z���=@��������]�����n��Q���W�J��/_>���Cy��U�
��+W��� =dt|���^|�EU�TI������������M��;W			N�u��M��9Sm��QXX�r����9s*$$D�������u��1�y$$$h���������SO�r��*^��r�����-ZTM�6��1ct����^>�
Y��m�I��m�<]�l�]�v�$�?={�Lu��&M2�����c>�a�V�2���_�a�3g���U3��.]����Nu���4{�l�\r�����w��/nl���me�;����sX�$�L�2����S���~0����0�~��qqq�	K�N�?H�6�*=���Z�ti���
�����O7
(�bL7n����l��t\+\���d��\8"�!3t*6����F�J���������MU����w�'#c����Wy���0���KF�^�//����R�/�m7G^}��d��Z�*���5�7����c
��)u��5�=��2�
���Q�O���S����}1v���o�12mp��'�����~�]�v����#G��W��=]�?H��iG|�+<5�������]3J�,i�_XX��������oH������{|�����opUV?r��K�2w����k�l����F�n����E��������6�\���-..�x���R�k�k�6�������c�Q�t������1~�x���9s���'Oc���n�<����Ns@��\)88X
����R~�g�V�~�$I�������5j�9r(**J3g���[�4l�0������^KS����_5m��\������������4��Q||�:v��_~�E���}��|��:��������(;vL-Z�PTT���+��2'L��A���k����\�������w�^��1CW�^����A���[�����U���S'���H�Z�l��\�����}��N��K�.i��I����_|�b*�/��2M�	����&u������l``��]����G��a��I�|}}��uk��WO�VBB��;�M�6i��e)�u����F�*_���/n�g��}�?�:��'O�M�6���_��a��_0�,'$$D5j�P�J�t�}�)o�����Utt��,Y���(��uKC�Qll��~�m��!..N���u)VJR�����K�i���^W� �y��T���?�f��i������E��]�v�T������+W����������m���sg��N[�n���c%��������/��ySRb|i����V������yS7n����u��U�[�N�����qc��"�t���~8�t����������0=�
���m�$��g������Ge������u���T���^P��mSLw��Y���WR�w;���'��3����7�������'@��d�>Tw���|�=d�1���-\����&L��+VHJ|v'W�\6�u��M,��x���}{��UK���:u������`�%$$h���j���V�^-oo��~��'��s�=��'JJ�!�;wV��
�#G�h�����g������iS�_�^�������c���aC]�pARb�����x����)::Zs�������7o��_T�\���O��+V��y�U�PA%J�PPP�n������[.��]�t��e���[������G�>dr�����*w���{�x��������6#qg)��m�>}���'�!����6~���di6l�`�����d����������Y���������N�:���,�����'�1�|�����'��4h��J�iq��u#((��o���6��>}��X������_������F�%�t�~�i�40
.l�Y�b���%}�e5e��
�rg�4-�~�is%����;���_m��T������M{��M���S6�]�t)�U�ccc�~��Y}' }������HHHp�f������9r�pj���5j�!�

2F��t����w&�"c�����7M��Y33�A�7n�������3bcc�wW�������M�6F�������'���Z���7�6mj,[�������&::�(S���7��N�������e�)S�aZ�[���i���a�`�x���Z�j��������F�=����QQQ��q�q������G�y7m���y�6�\����������2���
I��q��|\yf�>�������}����������Wd�1�����4�����m�[�n��&((�����-[���s�im�T��
�����l�23���@c��u�����}��5�=��3v������K�����`2�LW�P!�����[��}��?!!�x��w�����o��y��+��<=v��l�����V�vv�����y�?���tc��5�=���6��4��c�#$$�L��E����N��4n�ZqqqF�"E��g��N\\������~��W��\�|��O����������U�V�����?7��n��n^,0���Y�n:&�g>�6�SFO@_�b��0�����a��9=Q����Fpp�!�(Z��q���t�oLL�Q�@���J�2�f�7d%�[�6c���S����}�???CJ\L(5��	���
���{S��n:xrFz���~�mC��'O������I!�!�������7�+W.�����U+����G�MG|�;0v���o�9����68R+3��
#m���9�B�
f����sk����wI�������q��9��}����#G�<\yf�>���������7g�P�y��,���x�7�Vvw�w�}g�W�\9���j�<x��<_y�3��A��]e������D|k������q������5�3}||���-Z��o���v����3BCC���w�v���������H;O��z@��7o�����_���o��
�$-Z�H7n�HU9���Wxx�N�>-I����~���Pkk����������$)!!A�f��c�=�b������<f)>>^3g����?�b�����_����C=�������[�3�<c�����L�|�r3����6l�`3��-[�4�Nv<!!A_����m���0���_E�U�J���cG}���:w��3�M�z�2�-I�����uk-ZT*]���c��Y�{��-M�<Yu��Qhh�T�lY���[�z�j�e�[�N*W������������/_^�=���}�]��@f�v�Z�8qB�T�~}U�R�f:������s��\fR�����K;Lky����7�|c�8p�����m�%JH�6l���G�:S�t�z�j3����;�����_T�2e����i��Z�lY����w=��S*U�������;j���)�}��I
>\�k�V�������y��T�R�Y���}�Y-]�T			��l��p��u���W�a�s��j��U���<y���?/Iz��w������k{O�<�r^�7 {y����i�
wJHHPDD�n��e�}fv�����{SI=z�$)w�������Wz��v�����_Rb�������d��fl�1c�$��?�Pdd�J�,���+VLO<��6o������Ym��QXX����T�X1���[G�I��C���W_U����?~���*88X�K�V�z�4p�@�]����dgcA�J�T�LI���L�j�������%I9r�P�=��%�������c�Cfm�'I�~����y����#I*P����m��������6l�8�|��i��	i�+}�1 ��������f�=�%��2��0���S���###��s���� ��#��[BB�V�^-I���r�.��#��u�&)q,�r��%gc����J�,i�OKL���7m��^�z��
:T*TP�<yT�`A��[W�~����:��=������)�\�r�@�j����9;r��e�;V
4Phh�r����� �(QB��WWdd���������/[���w���W1�[������{�Z)�c�=f������������K������������Y��y��y�^�z�{�K4|�A���~r��a����6��7o��n���6�����V��9�f�>��L�t�R�cg��5}�Q��L����]�����������F�����S�@c����a��'�5j�M���g���Yf||���_?���e��._�;�Rk���N��i�OIiCCC].�r�j��9L�x�b3m�v���|�����mH2������8���������/���&�w@�s��������;��x�����m�����-�[���K��� �b��3g2�����w���_x�C�l�<y�0#U;�����$#g���������e�d�[��o�J:t�`���s��>���u{��1#u��;�s�2�R������7�������$I��[ll�Q�jUC�Q�N#!!�0����X������}�����k3�x{{�f�2#q����H�1)O�<������;u�T���/����kt��S������7nL����}��6m�8LK|�;�c�Y����xb�����>���Gz��6x��������1��_Ls~�9��wI��������e����cH2���K�0�w@��!s�1���2c�������=�����c�)����6����q��)�i-w@��W�;h� 3�'�|�r��o�!�!�2:��>}��#$$$���~����V�Z6�X������-qqqFHH�!%�]�?��kHR�Z5�����ny���gOc���f=m�<�������I��9r�Mko��a���[���;��l��������Ns@���{���z��)��^��~�����{,�s�������+66V�4d����{.�8e]�v���k�����'�T�R�t���Y��Ls��q��][�N��$����W�^*[���^��_�U,P\\��z�-��uK����U9
4��������+��_�duY�re��C������Wu���:��o_m��Q�T�xqu��E�K�V���u��5������a���[���e�o������|������J�,��g�j��Y��i���;�v��i���j����m���M����W�B�t��M�0A���������_~Y�f�JV��	4i�$IRPP�:t���U��P�B���������[����~s��-5q�p��*^���;�S�N���3*T�P���S��
,��g�j����2e�����,��3g4d�I����������Os����+����a���W���%Y_�-���S����{�n]�pAAAA���{U�N�����j]i�}�v�=Z>>>z���T�F
���h����>}�������o�v����}�F�a�q��5}���Z�l�bcc��W/8p@�*���������
W�����eK.\X~~~:{������+V�������\�}��1


M��'N�0Wk�P��r������[����/������O������iS=���i^��0
2�l�V�\�j��� �Y�����p�BI����Z�l��|:�7�|S�����[������~�������`U�PAM�4Qdd�[w�L��)���7���{��G$I����L��������*P��*W��:�{�������@z��>��Cm��M~~~�<y��$�m��%Z�`�
(���H=��C������K����*!!A�Y��>��M�:U>���u�����O������3�i�&]�|YO=�������9sZ��c�=�����������5k�&M�($$D���:}��v��������/�ULL��=JXXX��7}�t����(�o�7��1p��m���X�����5-n��a����W0>dm��o������+<<��3C�A}�;d�>�������YCVw���3/Ij���BBB��m����?9i�$=���6����u��w�����\?K�7�}2:�w�������m�V�}��$���_�?��\�r%+����2wK���P���]������[�JJ�\j���r^�����m�V�.]R�^�T�~}���k��-���/t��
}����Y������~���`�����P�J��%K���o��$���
W��e���~����mk��^�jU=��*Z��u�����O�V����;�rmY�G����<�������6�n��PJ�M�f����Lv����'N�h�����e�;6�W���4%p�Ko�-��-Z�������K��-����
6$KS�BC�Q�P!s��$�.]2W��U��!����7n��i�.&&������S����V�Z��7�^�����?������X��.����H�����76�T�Z����2f���,�'N������'N�H�&i��������v�v���[
;%�@��������gVI���b��u.���w�Y��T�vmc�����_mL�8�x������r��m|��76��9sf��[V�\i�o����4�+�;�����q��%�?�$��M��%J�N���Z+T�`���-[�4�_��,m�=�����������^p����{F ���2b�7ne���k����4��m���5k��nEw��+��$>>�X�p��3{�lc��aF����
*d���#
����7d6k��1c��y��1c�M�65��r��a���			Fxx�!%���-���;�;���;��vn��4e�7��'�M�x�	3�y�����sG*V�h�-c��v���?���#FXK��{$U�T����em�*U///�o����`ll���aC3���~�,�������`�Y�&����7����*U��kYk��5�*R����
����;���7���g<}�GzI�6xz������f�2��^��[�d|�9�7�Kz��W�m�n�����_�e�����cH����oH/�������x�'�7dUY}�������%KRL���/��}||���;���7���c���F���~�R�J;w�t�n�A|s�
����-66����5�<R��|���V����o�4g��1J�.m�			1^{�5c����W_}e�9��K�d����������l���;�5j�Q�fM3���@��_M��`���Y�ll��5Y�U�V^^^f,P��Q�zu���s��&��K2�}��d����o8p�������8}�����;ez6���Dw+W:;-��~�i��-�j��}����������i�R{IN����R��o7��]��:.Mn�����m��Mv��^0���_�x�yl�����+WZ�[�n�y��7��:�a���g�}��G�2������1116��_�������v�|��w�t��K��������#�q����?��wp����[vN,^�8Me�^���a~�����1t�P������������
J���;w���V�j3MXX�Q�pa�G���q���s�_������[�%�q��U�?�H��e7��7:��#����f�a�����������^�
�
���lH��<x�����'N�h�+U����d����������3>��#�z��V1d��)����vc������K���Y������<��#6c������W>��33�;�Cj'�{yyU�V5
dL�2��?�1}�t���_6�-ju-���~����i��oH-O��>���fI���������1c�c��9����j�����l��G�->>��c�
����|x2g��v4�q���`\R�bccm���W���Hv�Y�f���pTVA|Cz8}��b��|����Z^�^���^�u�i�owO|c�4����sg<-�cHmp���n��W?kzL@OZ$T�1q�D�����s�op���N�~�?����80j�(�c���NC�D|Cz��}�������=��
�����S�z�j3��E�:\����	�m�����&Mr�3K	��9�7��'��������Mg�-[��o��=6��?��������w�4n�8��BJ���9r�Z�2v�����l�s��9s���\����������_7r��mH2J�,������o��w��4_Cz�����d��W������SL`��r������]3_�-[V;vt���7`�y{�%���������'����=�����$IK�.���7��7l��|�r�J�cI�K�.��
�X�b����$���m�f���������<��#�X{�����S�n]������x�����[111�V���3���^�z�0a�*W�l�xll�>��3}��G�q���4�Q����J����f����^zI]�t��O>��_]k���/������KJ�}�N�\gU�RE�j��{�v����=z���(^�����$9�oR��o�n�e�}��G������T�R.�s�����C��a��i���z����S'������i�^y�3��O?m��M�
*�q��*X���y�B|���E��I�&*]��[��������K��y���!%e�������u�V�3F�������z����>�H��K/�d�2d�6n���K0q
��'�M-�[P����q�FM�<Y={��SO=���Gk���*_��$����2d�����v�����q�Fy{{k��)vcMzh������>�����U�jU�}����#G�i}�Q���b��s���ZYSLL���o���OK���m�'�x"���r�����o����p���F|�>g������mpK��gM���k��5��\�r��'�t{�Y����qqq���Pll�*U����m�c����S�_�|��e�1��L�6�|��W/���8u^dd����B�
�<~��i�=Z�f�Ju�!��������O����
6$K������^���������m��?~�=Z�<���rW�\���_���K��T�T)5i���p���u�����:u���[�nm��;�Z�j��#G�$�!����l�x����7�$i���z����������-�6m2_7m��a���@�� &&F;v��:^�~}s���V���5j$Ij������L������]�|y-ZTR�MD�^����x��N�G}���9r�@��?���#[
.l����J������_�5���u��uW�
����g��Q#5h�@���7n�:���]�xQ+V�P�-t��E}���
��s�2�nu��u��T�f���w���'O��'N��lG�M��[5j�p*���&I�����1ct����T�
111���P||��T�����WBB���z����w�I����K�G�6���;���g;����_�a�0%$$���Z�v���������O�>�Y��[��o@��q�F3>\�zU���F��+W�h����X��~���4���o_]�rE���|����)�x����9sj��q����$�0����i*���@�ug{k��16H+\�����k���3�
N���v��!���[�'�<��#�]�����f�������k��I:u��+U����EDDh��u��-�I���3'&��[7��/�7��o23�����/������V��M�a�����;\�U������O��o�����L�bwR�3�c�Y�5=�|��r��#�/_6�����R����:o��*[���w��B�
i���:y��bbbt��I��;W�������5`������oM+���=���j�����	����S�n�4m�4��?_����T�re}��*T�����$��B����%K��O?U����������+�y�����O���;��3��/_��u���_~q��'O�4�p�/_6s�����/��*U��eB{�j��9\���f�.^�hu�q�����������a��M���c:��r��m��s�[,w������d��Z�l�9�f���yG����Z��$FG��Js��|���7
k��5���;�]�vI������l�b>�p��Msg�Z�j����*}�����g���:u�(88XM�6���������NW{��l~�9J'���5z�h��k���j�������G}T��E���	df�g��~������U�V)����i�^z�%�,YR�����7�6l�%K�h������7�������cg���%%����
EJ��o�I{���d��5k�=zHJ\`���*Q��J�,��]�j��I:v�Xj���F��={����G�'OvzUO[��Q��������[}��5���0�#^^^��/�������'k���������;��qc�=xH|����@U�TIo���v���{��G���S��-�{�n���6m��-[&I������&K�Q�F���+V��j����{x�������@u���n�J�*���n�RTT��������Pdd��_��{��W���^��f��v���aN:z���������\�r������3u����V��P���5g�I������~�M���O�r-����L1=�-���7�`�1p[�c���������V			�9s�����W0>dm�l����O#F��$�����j����>��JjF�q�|��d�1pG���3���__�J�J��={��N�::z��j���-[��K�.


����BCC��Km��E��W�$M�2E�'Ov�^����D|���������OHJ��1g�EFF�S�Nz����k�.)RDK�,�z~�V����������?�P�f�R��5�;wn����\�r6l�~��7���SW�^U�.]t���T�;((H5j���~����+((H���j����6@L��&%��-W���|�MI��k�4b��+WN��s�:t����������~��t ����|�LG�������S�F
-_��L�����Y�f�Z�)���L1?�/o[$
�_�|Y[�n�$�^�Z�a����tOJk�e6�����E���u�:t���9s�e-_�\��������R�J��gj8����t��{����c�^z�%KJ�|6m��q���M�6


��o�m��
�;�����������+W	=z�Y��y�t��I�������)%��Cj�VZc��34c�=��C���9����Z���WXX�Z�l�����;w���8PU�TIS~wvx$�"g����C�\.�E��������Y�\���
�����>3������ ����5h� IR���������))V�����~I�@G�qK������{;��V���~-{����v���/�f���e�_F�������~��g�7��������;M)RD]�vu�����g�}�|`�X�bZ�r�J�(������_6l�$���G;vL���k�oR�8c�����O�����~VwX�l����_I�����z���K9�Y����I;��uK%J�������z��@��������y������#�]�C�^�us���q��+W.��r���q����?��c����
pO��������k����������>(w���X���~�m���G?��9�������P�|�?n���)S�|�����k��J\�tI��Ow����U����%I�������]��RF��#Fh��E�U����'Nh��z���T�lY��SG�6mJS9�AOW���)S�|�����i,�u�z��Z�|��6m�.h��
j���~��W���'��N#�]�]��l��;%��~��I4h�?�PR�.o�<����H��U�`AIRXX�J�,���k���j����%�-�T�B��?_��]STT�6n��u��i��u�����w��C�4l�0'>���`��7n�>��Cm��]����~��w�X�B�����������***J��/O�2����)c��#G���I�J���O?�d�n���������U���.]���m��E�[��Y������P�B���/�)/O���R��=��gO=zT�����
�z�j���W�ah���Z�n����T�bEOW��f�����Xy{{���W#G���n���V����)S�j��l��V�%�Xd����>H��ys��x���������h���c����*�6��IIj���I�E@@�JP,�
v��"M@A��(�'��I�"�{�����r�
��l�M6	��uq����3'�g��sfH��77_%���s����\�r��������={���r���^�z%��RT����C�Rg���S�e��7-Q����Y#)����e�o9���0U�<y����u�8q�|=c�m��QR�}v�j���?%������5p�@<xP�����i�u��Q������~SPP��o���y����@���~��i��	��|��)00���!k������;�|���-��o�!N��c����}pk�1����=z��������,���s�����{�e�IR���cL(�d���q�F�<��A��>$c�1 mKmc��|~��{��-���m���9����O/��b��y���V�Z%)j��5j�-_�fM������;:p��n����]�]�������R�����qc��������IR�b�b���+W*,,��+�q��M�j��I�������7�'�|"��c����U+�j�J.\��
�y�f�[�N!!!2C����S���.]j��SZ�t Yv��o�gy�2e��q�<U�T������qc]�vM[�lQ��M�b�
�:���'O���K�t��!=��3v�����kk��u����������v�Z}���fR�Q�F1�6h��L�K2��1cF�]}}}��iSsB��[�4j�(}�����/��R}��Q�����+�I�.��U��j��i����������W/��qCk������R��e�j�����b��m.\��S�NI����cL����g������+]Y>p$I�J�����"##���yxx��+���X������]-  @�����������u�����[����h�"�H����z�W_}��g(Ij��M�	��K�V�t�.)*�n�u��
�ub�������]KT]�F|���!:VJ���c�Lhh�9!�|������V�o��"-r��i������})[�����w������3���b�����x)Q���U�xq���C��m�6���K{�����g���_k��1.n%�p�N�?^R�x~``��-�����3����FA|s����'�R0�����}p[RB���+Z�p�$�����93-!?8���m-�CK�,��%K�<����c��������cH�R�jr��[����B�
iQj���b��z��W����g�\���J�2g��dO777������;���OM�-���"�������u��:���,����o�r�R�v���];I���'��{�i���
��o���{��������@2*U��
,()��u��q�eo���
6H�2d��z����\�*U��5k�-[6IQ+�4m�����3Y&�W�\i����w��9��O��+�*�1cFU�ZU��i�&?~\����$�a��1�F���k�N�<�;vH�J��K��72e���>�Hm���$�������vj����n�]��? 5y��g����-�[v�����-Z$�����
{,W$��={��j��%)�����hMdd�V�Xa��\]>!�'�J�Y�+%)Y�����g�hA|��������o���s�����6)�1)zw`I�2����o@����p�������\y55��i�+�M�7on&����k&�m���re�--�V���O�n�'�!5{���<y�(00PO?�t����%�p�����}����4�o���O�c@Z��>�-)a�u����8H������r�	��q[�cHK\�K�jr��?.%�-�
�7��=nMXX�f��i�wt����/_������-��=]�t�|=������{E�04e�����n�9�%��r��`���5k�y]�������]�(b:��^z�%��?�`���?�l�r��uke��!���X����Yc~)l��M�7N��g�z����u��M�e���[�nI�Z�li�����e����/��RRT����\�����������]MO���SO=e���3�H���'C�z�����b�\DD�F�m����c��i����Y���=|���n�*IrwwW�*Ub��l���o�����K���$U�^=Q����[�U�VI�������e��]�3g�D|���?�0�8�6����a�������b���sg����m�;22R�����>11)""B�&M2�G/�������0a��:��a����J�A�n����SZB|�����
4H��AJ��)R3W������|����;1����{�9��r!4K��������Xi�PR``�������
iE����'s�����@+V,��?y�d���E#�%
�r���S��|mxr��n�3�Y�r�����f����s��m�
�~�G��)�����s�1�D�
i���o�CM�{�h<��|i!��E�������v[�\��C���)�$I>���s���3g�������L��oH�\�5q�D����������\�����WH1��8�H�-)al0)yzz*_�|��'9�1Hf��������q��p��Xe�n���?�X��.]�{��B�
Z�f�r��!)je������k	�3>��)��-[J���;�W^yEw���Un�����O$EM�<x��:-��S�N�$U�Z���F��;�J�,�����
#G�����x�����g�/_����)��s��������#6�����x��B�
��2��<<<�X"I]�v5,
2���S�V-5k��j}S�N�������b��d��W^1_O�2%��������C�f��������]�=�UD-Z�q���*s��!����|����[=�_|�}��Y=m��51����g�[��O?��+i���������o�c���:w��R�JI���_�O?�4V�04x�`s�B�
�C���}��G����������z����{�nIR�9b$�R�?&L0��%""B�|��~��'���x�
�e����X�;�>|X�~���A���0����1&�G�����I��{SI�������������t��u���|���o���'V9g�������6m�d�����
������s�VPPP�wO�����������OcB�#�o�G|�r���]�1<)����q���c����G��+W.=��s����@~�?G����m�1�I���P�y���=���R���\b4�|v|���fN�q��m��o�m����[���j�7<	\��l��X=f�~��g
0@����ks�J�Z���'��]��/�l.�x�C�UPP�$����j|��6cZ������7���%K$I^^^VwgO�F���s�����6��c����7sRO�t�n�;v,V��"���>�(���
ZM����k��1����"##��/�c��j���<<<�i��������:m%J�HT���/�5k��Q�F�|��v�����k�����5k��v��?��J�*���Z�d�J�.�W_}U�������r�J��;�L^
:T�<����j��)///=x� ��4h����e�f�c{��9���;<x���������p����1��\��={�h���fr�C�z����cIV<�?��~�A�+WV�:uT�dIe��U�o����G5{�l39_�p�dY�H
�{����j�*���_���W���U�T)]�zU�g����%IY�d����#�6m�v����?��a����f���6m�(���w��v���3f�7���g�������&O��-Z(,,L���������uk���*$$D�&M��7��m��������O}���*[�������%K*[�l2C'O���e���I�T������D�<\!00P�������5k�
*(w��rww��s��b�
s�wI���]�Z ���'uM�6M
4����5|�p�Z�J/���r���3g����~����%E%�f��%OO�Xu��9S_~��*V�h�k���x��v����������������ju��������-[��o_(P@M�4Q��e�������������o����o?~���|c�W�}���O>�D
6T��U��SO)S�L�}������?��C�N�2?���_�f��.lu�q�'Er��JR�54x�`�1B��]S�����[7��][�����k�&M���W�J��T�����}�'����5r�H�I�&*W��r������9sF.Tpp���U�
�����Gi����$777���[:p��8`�s�*U2���5}�ts��M�6�N������]�����1��'�+��I1�:y��;K2s���������/��/��"��ZN������K�B�����oW����1��'AZCu�=>���C���s����=����K��8i9������su��a]�zU5j���/��
([�l�z����]�y���1�Z�j.Y�-1�oxR�"�}��
V���U�jU���O>��#G4�|�����G����)b�OOO�3F/���"##�t�R+VL]�tQ��e�����G�j��9�z)j�k�.[�LC�Q�����A�)SF��g�����\����wk���p����>��?��j�
�BBB4m�4����Y�f�T������������Z�n�.\h.������1�
$�'N��/��y|��=1?���l
vv��Mw���;���������~�o���������� U�\9�a���t��BBB��Q#�^�:�o������7�M�6���t��q����K�N�|�I���y{{�F�1&M��Y7l�0������������nnn��v�[�jU������kc���.��$i���vW�)S�����/e��19�8]�t�4o�<���+Z�x���?ou�����k��9*]�t��9s�Le���Lp�[�N����Z�x������U�hQ��5n�Xs��Q�=t��u-^�X�/�U�w��?~|����w����k�L�N�4n�8s���$:�]�xQ3f���3�������1c��E��l�4����B�*U�d�u��I�O�Vpp��@�����9s��9�244������+���9�L0���0�N�����5~~~������o�dj��<x�e�����[�9sf�9R=z�H��9��xR���T����yxxh��z���~�����Ek���f��-ooo�u9����E��'Nh��I6�e��]3f�H5�J����R�
�|��C��2e��w���6$f7�h���!�i9��!�z�1�I��>�3�Yg��a3.���e)�	�����������q���CxR�"���q[Da�O��2���{|���B�
�]Z��G�6m�"""$I/��B������f�������i������������Z�E��>}�����uW#��I���v��u��=;���R�J��_~�3_��uk���������]���g�j��V�zyy��o������y��A<x�n�<y�h��1z����K�����7����?��Z���S��
K���&'&�.��o_5n�X&L����u��)EFF*o��j���^{�5U�X���,S�����x��BCC�|����z��-ZT�w����35o�<����������Q���qc���W��s���
��w///��U�j�
����\Y��t��]U�T)�^�Z[�n��t��Y��wO2dP��U�zuu��%�
p���#Z�b�6m��={������u����O���s�b��z����C�4�*4�\�2e��E����k�����}�.^��L�2�H�"j������k���������5`�M�:U���:z��n���������_�+W���?�:(}��q���/�z��?~�-Z����������'�j����={��f���
6h��-��o�.]��+W�(""BY�dQ�"ET�vmu��M�J�r���-Z���Wk��u
		����u��e��,Y��D�j���z��eu�.��n�����&M�����C�z�����T�T)�n�Z}���� ����r�J�_s��qs��L�2)  @+V���?�g�}6��TG|�g���j�����_���P9rD�/_VXX�2f��\�r�\�rj�����o������,YR��/���[�u�V?~\�/_��k�����9r�|��j����t����3���	��)�$�}o��/�T�4y�d�Z�Jg��QXX����U�fMu��U��7w�.g���;w���+�a���������v������-[6�.]Z��7W�=�eGN -
6����1&��q�7�A�xrb�H�e�u��yfn�f��6w�L��I�U��`�H�Cu�=>���C��r��b,����
,�
6h����3g��m���g����;���U���U�zuu��Y
4H�9\���'Ir���?�\��U��u�t��1]�pAnnn��+�*W��^xA���wx\�}��j���f������k��=�z��9o�d��j���z���
����?����+�q�F���K����k��L�2)o���P��Z�l���^>>>N�y$�����c��
��;������K
W������O�~�����g���=)��)�Z!!!�\��v���J�*��9�4�f�R����o�b���� �"�H��o�*r����U���U�7i�
@ZE|�V��E����'�)����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x$���Y�t�8��f��K"�H[�m�*����� �"�H��;��&�I������V��U�7i�
@ZE|��:��f��� �6o��:u�(""��M�swwWdd���NEl�V��U�7i�
@Z����
6�F��n
��7���>8���� �"�H��o�*������ov@O�����3g�d���n8���K�����)�6i�
@ZE|�V��UP��������� ��H���H��o�*����� �"�H�\��fzR�dIU�T����9p��$����� �"�H��o�*� ��;
@ZC@ZE|�V��U�7i�
����
�L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0iVDD������S�j���Q��2d� 777����{��	�����4h���)#???e��Q��W�~��k��x�����?^
6T�<y��������e���9s�"##���P�B�5?~<���G������������Q�F�������uK���S���U�fM���S�����9�J�(��]�j���2��������[o�|����5�����6m�h����uK���y����U�D	�;���MAAA��@���Xy��q}����]��r��!OOOe��Q�V��m5s�L������{��i���j����z�)e��A~~~*V��Z�l����N�r��HZ��w��W>|�S�wF�m���1��{�P�~�x��T?��p�B�o�^�
�������U�fM������7������4h�*V���9s���K���S�*U����������[����5m�4�i�F��!���O/��[W�~��N�:���_�^���S�2e�-[6y{{�@��Q���{�=-[�,��
 �%U��������J���-[��_�e��*T��|||�����y���g���Q�t��u����g n9piYr�t���~n�������1TK[�l��������+K�,J�.����T�L���Sk��u��@���}��������j��*T��2f�(///���K������~�'N$K{����###5o�<���K*Z��2f�(OOOe��]��W���������v$E>@����QG%�8��k�4f�5i�D�����e���%K��_���cu���D_�K����O%���sZ�h�����{Ny����YG�#�W<S�\1500�������P�B��7��z;w�4$;w�tuSR��m��l����[���8q����c�N��O?u���J������k����[O@@�Y���cv�6�,�.]:c��i�^:�3g�$�!^���{����nl��S�N���N9oxx�1x�`�����9k��e�9s��:���c�������������j�������������7����P��/6
,g�o��������LK�.��{<l�0�������)S���\C�z��UW�����
	u��-�u��v�(`l������q����{�8��$���k6�	

5�~��8����6F��P���9c�j�*�:�������]�7$DR�^��~��\�������;TG����?��������|���~�?��xl�����G|�"�cW����W_�Z�3�P
�0���gt�����Z�ha\�~=�?��������u�w����������-�w�6<==���>~��Q�r�8�����2d�i�����#q�oH	�5>I5<e�#{��q^���#}
�����H����O.\�gE�(�"�!�\�Lur��;w���Qo@@@��c�-�qu�4��4���{�e�����'x���3g�O�>�$wwwu��Q�5R�t��i�����6l����4x�`�u�;wN��5���'%I���S�n��7o^=zT�'O���G�q�F�l�R������o��-I�ah���=z�$���[s��Q���\'�D�������/I��/�7n���+���_�����-[4s�L��}[6lP����e����'�������	$Iz�����aCe��I�����3�o�>�i����q��d�b�>g~�X�c�}����$___��s'a UrU�;v��}�]�}��5��uk(P@7o�����5u�T��}[T�
�w�^����f�S�LQ�^�)7775m�T�7V�|�����s��i�����	�27o�4�BI�Wqv�-����aC�eJ�(a��_|���/�y���GC��$e��Y�����3�_DD���o����K�r�����{�T�R�z��f�����`�:uJ-Z�Ppp�J�,���^�zU��5��;$E����m�������O�n���C��j�*����f=�N�R��
u��5I�����w��b�����K��������?�����z����!C����f���W�F�t��QI��O?�^xA%J�P�L�t��u8p@��/���g���4��{���Y������Wu��iI����4h�Z�j�`���������5k�,8p@W�\Q�4{�lu���j}���9��G���9��;�B�
q�S������CIR�=��Lb�P%�s���7o�����_|Q5k�T�\�t��k��y������K��U+���=��H~����V����/���zJ~~~
�����d��������O>���mW�=����[���A;vL��)S&u��]�K�V�L�t��)���_��e�"""��7����C_|�����"� �I��h|$�8�g�}�a��I�<==��U+��[W�s�Vdd�N�:��[�j����j;����9"g��>�~OOO�)SF����n9" �p�3��S?��=z4��`2��X\2�N��UR�/���2d�1w�\�����a�\U7>��\�x���9�!�pww7����Xe6o�ld�����VV���m���cG�;v4���b�u�V�U�>��#�u���{XX���K�L�L����+P!�^�u�i�����+����e�?n/^<����r�J�.___c��
������{�6�����f}���y�����e���6m������!y��j���w��52e�d���/�X-w��E3FI2�~�m�un���pww7$4v��a�lxxx��#��op��^{���v~��w�������w�g�2eJ����7�|�<�k���,�|���&L0WK�*eu��w�}7�*����Y3��w�}��w����g���5.�g��f=M�65����Ldd������r��i����<www����3���m�����q\)�����pf��Q��W��y�f�@�������W�Z-f����<_�l��k��%��������������B�}p��+r:��?�y�����,��1�
6����~��o�nd���,k�;�E|CB���7���M�f���������~��Wf\�����[���f�����/_�Z�r�����j�����9�oH	�5>�����b��C��,{��}����i>@|CB�"G�G�O������{&L0�o�n<x��0#�N��F�(��_�K��l>c=r�H���v@g�-eru��	�i����&	
��������,������^~�e�e���o������u���r�O�6���
IF�l>�d/�~��=�u����9r��ow��������+W*�k�.36f�������j���Y���#m�3o<<<<�>0e������O>1$�3g6��9�t ���\+W�Ze�U�jU�e/^l��\���2>4�-jH22f�h>|8�m����k��1��-Zd6��	������[rO@����={v��[�nM�s����7���c�����nT�P�,�b��D��2&�[<����3�����r���F�\���{���Z�2��1"Qm����,�e�����������4*U���~�7� w����0~���G�A�������{�9����9�:t�P��A��-��{��e�}��D�q#�!)�j���}�<y�S�>p�����eH2����u�Z���K�,�[�J�*f�E��:��|:��������I�������l����|��9��E�"��YR�tG�Om�����,9"� �!�R����b��{��g_|�E���cf�qM@g�-eru������3�|���o�,��wo���J�.\�{��Y��0I�k����3Z�+_�|����$�����������[�n�y��Z�p�$)��Z�~��T��z��:u���������S�J�BBB�����X�b��)S�c�v����}��d�����������C��?��9�n�j�s���6�����,��O��J�.-777������ai���������//???yzz*G�*Q��5j�?�P!!!�Hq

2�9|�pI������[o�x�����U�����iS�\�2��7m��W^yEE�����r������k���q��������OU�V-���C������S�"ET�F
���Z�t�"##|}��d����r���W���%E����'�|���


�$����k��6��K�N�;w�$EDD����Z���9���g����kI��#�7o�8?_��#v����={�p�����Q�����/h��m�>�l�2�i�F���R����������cq����#z���U�jUe��U�����-��~�i��[W������_��KR�����t��E���O?m������o[-3o�<�=�����)���9�{��f|;~��$����V�V��/_>�������V�~�t����}���~����][�r�����J�(��?���5Z��a�z����%K*S�L�������J�*�g�}V���������l Y��{W�{��az�����s�9�����%����KW�\�$�)SF��UKT}�����~�z�;wN�T�^=U�T�j9��������g'��#F��$e��Q�|�M��r������������m������GK�
*���{/Qmsco����U����,��������������s������89p %rEN������e�$E���ku&g��Al\�t�������;����H���C<0����1��M�����/I�y�����kU�\YY�fU�,YT�jU����
���c����w�U����1cFe��E
4�������M�8Q��7W�|�����2�`���T��:w���S�&��������^�*I������&F����'I�ah���j���r���2�T�R������h7o��?���U�*{�����U�
��w�����q�{��%z���U�hQ������Ky��Q��e��M}��w:}�t�\7�$r���#��CJK�a��������%�����2����U.���r�*�IBV������%K�Y��g�5�/[�,���U�:������n�}������������c�����O'N���b����#F�0<<<b��},Zxx���o�+���S�N������fd����dT�^�j�����u-Z�j�����e:t���g�}f����m�$�t��	��h�3l�0c���F��m���/�0#j����������4.\h��K�.5�q��t�R���YX�
I�2o��%Au\�x�����?�����Y�f����;�;�RXX�Q�reC�Q�vm#22�0��;�?�1n�8����j�qww7�O�nF�n�={���2g�ll����y'O�l�Jm����o��1��mHM�+
#���U�T�[v��Ef��m�Z-��qc���C��������y���]�t�k�g�n����0�8w��Q�Z5�}���/[=gDD���O��n-[�L���=�7$��o�iH2�e�f�?�0��;�;��f��z�f�������Q��C|C|
4��w�
����3����+����q�YO�N�\O4�����g�\xx����oH2��Kg\�z5V���!I���C�6G0����%������3�����'��o�A�4���a��wr��?^�P���FI�Y9G|�������ic�lR����{��-�����eG���s�C|CRj�������;�����$#}���hBw@_�x������H2������������^�z���"E���5-[�4<x`�a,\��n,2d��s=z�(V��C�m�����>g �!%H�;�-Z���I�S�5�?�[�nM�6�k
.l�<y�0�8x�����O�,[�~}���{V�y��]�U�V��~��%�������;�������Og"G��7$��sFL��}�������
�0�:�o)g�����t`���{��U�V��|��U�|�r���>��y�0���_R��@+V��.k�����3j���8 I�X���/_.�>_����-[��3�k���V��<==��?�(w��f����k����$OOOu��Yu��U����g������t��6l���u�j���1V�O�.�����%K�h���u��2e��-k��������:u��
(`�\��
c[�p�>��I����Z�n���k+g�������s��U�V%��SHH�F�!���_��U�������4e�������>R�Z���>�L����J�(�;w���?����+����������#G���={V:t0W��W��Z�l���s���K�/_��}��f�v�D�������T�ae�GY�����y����?���S^^^���_��=���%K4o�<e��]={�T�r���K���?�0W��Q��F����'�t�������z�)]�zU��M���[u��M���+�����BCC��k�)""Bj����4i"���������{�V�Ze��
 n����T�vm���C�/_��;4i�$���+V�K�.��?�$�����w��U&<<\�6m�$e��]E���s�4j�(-\�P'N�P�t�T�@5l�P���W�b��vk>����;W�J�R�.]T�pa]�|Y��O���[u���m�V{���s�=��;w�i��j���r���c��i���:}��������~[��O�u��c�j�����L�2�]�v�\��r����������c�V�^���\a��M�j��}��r����s8�����~�I#F���S��9r�B�
j����u��2$���t��)�^4}�����B�
p�������[
��S�t��]�tI9s���9��[g�~��g$I�����I��k��){���X����k�.]�(]:�����^������_�+����?��\��G���5k�m�����i�4}�t���O�n�R��9U�Z5���+j���S�Y{����{N����t��|}}�7o^��YS����4h���X����������x����3s:��2e���g��.�c��?�����KI������/�R�J�����������K]�tq�������h�"-X�@RT?�e��N����#����$IC��������yK������+{����M�8Q;w��$5m�Te���U������q��Z�j��G��]�vj���2g����Gc�����W�d�}��Wj�����m+oo�X���_UDD����5i�$V�T���kg��%J�}��
����n����j���Vw��|���r��9sw�2e�(C�:t��F��������3����SO=��M�j����7�S���G�\�R�<��^z�%���Og����?�������������/5n�X�O�6c��������1c����k


�W_}��>�,�y��E�I�r����^zI�K�V���u��};vL��mS``�S�x�%��4��#���K���0���C�_������0����U.���r�*�IBV���Oc���_��,��g��N�8���!���P��#����n��,W_�re��u��1�_���u����Q�Q�X1���[��-[6��V/]�dT�X�,��o�Xe���;���E�bo���!��Z���.]:C�1u��X�z��m�����8��eKC������Txx��q�F���b�B�$�P�B���Gc��6m�Y�L�2������eK������v���,�����:�������e�l�bs����
TH*�q�R�J	�',,�\=�����No��������O��q���9����s���>�,����=��km�'�k�T�����f�����Q.,,�h���Y��?��UW�~����V����4��[��kL,bRg��h����G�d��U�1b���o�&L0���o�$�1cF����Z�����:*T�`�\����-��U�<<<�o��&����]���G�X1+<<<����+W6�����I��;g����l��s�b�)]��!���5�q��q�m�w�^��f�����{F���
IF�F�bs�����F����?9s��z�}��Y_���U����w�����z�������5�S�n]���
t�^x��c��9F��m����e�Z��v���;<����6&O�l��1����/���$�k��6��,�����k�m[������/'����7���,����?
64��=���]�z���5�Y����A��u���~�?�r��A�xr�������=���7��'O�X}L{ms���o�m~����x����Q�F����1j�(�}������!�(R���{��D]/��1�7$��u��,0���c|��w1v�M�.��>PBDFF���7$%K�4w�6�������g��Q�,�9sfc�������~��1bD����53�\�b�>g����2�yyy��-�U�������!����3�-j.\�����}C�-b��}{������m;~��C��I���� ��GmI�����m~����7�O�n�k|||�{���������oe��1�T�\����6V�X�����
oooC�z�����0�������>��gn��a���$���gq����?��2^89"�!�!�$��[bcj�n����1����0{\Jsu��	�i����&		���s��1q���Y~��c��,S�re��o����[�b�L�g���|m+�:������-��J�*���F;v��9����e\�p!��������~;����H#g���$���?7o�v��<E�1$
�u,z�C��U�^Sb=�l������q�j��'Onnn�@�����c�s���]KR�I����������0��D�g9Q`��Q6����%J�����o��e���-""��^����~��a��I9=}��6'4��w�L�E�-,,�j�
6��z���x�f�)�����������2ZPPP��J�����4�j�<y�f��/7��������5��IT�~��1g�c���F�F�b�����'����K�*+�F��qc������6������r�h���8k:���P�
2����q���
��}7����xxx�k�6>��c��)���s�_~��x���c,����f���o	jwdd�Q�pa�����'�k���7��+����YNO�b��}��������z�2�N�j��5�x���c�����<^�z����c�����qcc���v��;w�Xm��)�1p�@c�����3�~��2d0�U�R%��;����c�op�����5kV�C����~k��5����������h�������-�����Y_���T�7�"w����0~��;9���7��H
I����{�����g��C;v�����?����������1�7$�3�<c�������_��S'��7������������g���v'SV�\�X�p�������O������K��z�������m�-Z����}|,b���fK�,q�5$5�R���%!�&L0?S�HsA�Z�j�F�2���c���F��Uc��y��%����D6i��f�����?�6�����Yn���1��;w�<6h��D�=���,�����S[,��3�#r-��Br��%&������������q,��
�������Sw������koo�8������o��������q������1>�Tj����+�<~��	���H�
.�v���,[�P!������h��%1��/_^��e�$�]�6���{����K���
�a��������N�<�#G�H�4h�
�����#G�����6��L�*UR��5m�U����k����9��r
P@@�$����u<��$i���	m.��=|�P/���.^�(Iz�����/$���^{�|=t�Pm��9V���H
0@���o���y�f���������?j��-rww��I����g����s������z���[�+W6�����J�.�����W7�m/�]�rE��Od�$E��V�n]�;�f�1,,L����?��{��Y-s��5���3gt�����C���4h�:t��~��i���=z�Yv��!:y��S����_�O�y������o��:u�������{�����	m.��m��]?���$��O?U�"E��|���IQ������
��W_�{��j���z����������z���$I�a�G�	�EAAA:z����{�&M������w�')���b�G:x���f��-[���_~Q�n���+�h�����J�*%)j���?�Yg��Y5b�����f��k�������]�n[�B��g��9R�:uR���5v�X���(O�<��;v�������}���:������A���W^�K/��w�yGK�,��m�T�`AIQ��G�	>��	4e�IR�,Y4j���C�
@JG�>r��G?HI������[�;w�����wR�����S�}��r��i����5b�M�>=W7b������&M�����vJ}'O���!C$I}����;�ooo
>\C��y��s�N}���


��>g�����Co������k�6_W�RE��W�����>j4��0�9>�l�9�#G�(""B��
������o�C�z����u�V���{f��^{Mw��qJ`��e|�������n���g|2d�`��/��r�\�iKr��%Dxx�z�����0�/_^�
Jt������4�l������[k��
I~N�jk�n�j�n��������o����z��-1�����^�z��={��������d|�L�T�Z53�~��):t(V9IfKM�6�$]�zUu�����3�<	oo@V�r��m��V��Ce-m�E_�$�m�V�}��N�8���Zdd�z��a��"E���_Mt�/����n����u��s�����_5w�\}����X������9s*S�L�g����+v��}�����&@>��3Iz��9+��K�N��g�d?�EFF�~���8q�.\���&O�����t��e5j�H
4����5r�H9rD>�����f��h�B��_��?��������+V�h�h��?~�<<<b�0`�9�����;�Z��7�����kN���2��o����5j�����	m6��<|�P=z�PDD�*U��w�y'�����[��E�?~����)�f������K�����#F����'O6_w��=I��������>�w�}g�!���s���~3�O�:���u.\Xc��Q�.]�i�&��uK����?������+}��Z�j��������;����'�P�B��/^\&L0�[.&����_�5�>}z���T��������K��l�2m��=��Y�d��0�����L�b5^9��89pr�����2�c��9s��@u��qhB���PCCCU�D	u��E9s�����u��y=|�P�������U�T)=zT���S���eF�.�b�t�l�"�0d�n���]�v���>��[�4t�P�-[V�W�N�yz���[�n)�����o]��Y��a���Y�fZ�f��_������#����5kVm��Y��53���Y���(^���d�b�xB��;���U�����g�i���


uZ����M
�����������*����#F�&�\���3g:�
��p�1�x�����s����-s���y��Y���[k���l6$����&rD@���������o"M�4����b�
�c:��3�����gy��%-TOH]q���9s��Q�F���o�����_��y�^�H���;g�.V�X��Y���l����a1Vv�~]�N�K�N5k�4S,�����|2d�����{��Ke��]+V�o��9s��|(7��;��D_G|�>x� ��f���k�����
�B�
�p������&N��S�N���@�`�^�u��5K�T�`A�^�ZY�fMt�����;w�9�1<<\�f�R��=��C
<X{��Q�<y�d��$?�3�s�P��=u��],XP_~�e��/1�"�Y��������;q��^�u���[%K�T��=5m��l�.)c���wU�N*k����u�������S~~~j����,Y�~��I��m�fu�������j7���O���;%��1+[�lv>�������#�������m[e��E��W�;����:|_�D_|�����'���/V�p6g������/���|�x��x}����?����������v����<���s���|}}��sg�e��/o&l<x����Xe>��
4H���������F���1����T�dI
6L�W�V���u��mu������V��~�i�cr�Z�j��y�J�<p�@����'C��%��K�}|�\�W�V�v�.777����z�����oRr���O<��@�J���=������i�::��o�>��]['N�P�j��}�vu��Q�r�����r����;j����Z��$i��I���_��Nb�<|}}U�|y}���


U��yu���l�R{��Mp�����V�\)I7n\��b-������������k���j������������������-[�5kV����O�>������OO���oR���l��i��QrwwWxx�F��J�*)g��j���F�����\����&��c��3<�swwW��������������=�}��Ej����d��z����>��U����!��O��v�j�-�8��>�L����o�J�*����7���a:���Y�*������+<<�L�zzz����ny-Z�H�7�$��sG-Z���u��<WB����=~��-�u\��b>�`��h�	�������!�������Q�F�r��'��-�
�����O�7o��a���]###�k�.�?�������n����8">�Z%v��S�j���*W���w���o����_]j���<���)�az��7�Nm����v���^dM�L�4�|�Z�J�:u�SO=%e��Qe���'�|�}���B�
flsssS�\�b�������������1�krI������e��i���*R��������~��Wu��]y��Q�N��>� �c�O?����W���{��]qt��fL�3g���?����7���b9�r����4�&GcVb�nThh��l��I���}���9r���i�\�r��O>�:@�d�w�6w�x��wT�R�d;���n�Q�F
y{{K�N�<��w�:����g��7l�PO=�T��a}7�y�yo�(�>R��e�.�#��#�={���������k��Z�j�	�7nX����mq�����b|'8������h����:>X�]�V�[������������'�a%�oRr���O<��@�I���5����6o�,)j�����;�~G�P�b����#�]t�!C�9�|���?:���6 �=��S�X��������g�q�����u���j����5x�`IQ��#F�,[�X1��aaa7n\�2���'Dr��^�zi��uj���Y��+W�x�b
2D�*UR�r��l��D�x%t|4)=I��T�TI�w�����j���wO����7�|��M�*�����c� ~���41�i�����+z���P�B����]'�o��Y���
R�������;gy�2����
(C��{��N�>���0yzz�����������;�������h���j���V�Ze&�/^cp!�X�^w���8���}��g��*UJ�r����f�IRHH��_�.)fr�a��


RPP�������H��,|}}5|�p
6L{��Upp�6m��5k����s������u��i��-=T�R����[�n����N�8��7j���


����e��.]�
6(88�\	H��P�~�4a�IR�|��&��7nl>e���{��^�X1s��h��������'�BBBb��'N��g����7J��6m�j���������S���u��A3v����
�o����� m���|�
@��J����6mj�����j����K�*22R��oW�V���%J��Q��X�8�����'9���C#G�����?���h��Mf������y��>��sk��U�P����S&wwwyzz�������f���7�/^<�	��������]��e���g%I��_�98����'��S����A�
i]������c������wo��%J�ce��+{}��+W*,,LRT��kL�i���4i�$i���V���Pb���1��V��9���9���]�V�Z�27n��]xA�����Or�)�p<I�;�m�����cG��7����j�*IQ{D/�aK��5����;w�����u�V�w;NN�6��5o��|��:���k��r��e3/e����={�r�s�V�^��c[�l1_�U�V�1�i������$YCuf>=5�]��V�X�k����m��
��e�����w�^�h�BS�LQ���]�\ �H��hR{���	��������k�����y�6n���� ��}[.\��o����w[]��c���41��#B��������w��l�"I*]�t�	��,��7n��qO<h��;�3����5L@�` �o�gy�2e���q���M�K��������P�����eOt������+t��]=��sZ�hQ��tr��'�����Cq��������:�
4�����C����������gW�
b����/j��}��i�y���������+�r���o��2C�W�V��=u��)���O&L��TJ���u��IR���}����u�t��-}���Z�h��[	$\t������bJ``��-��6Y&������3�s��$�;wN��C����_��3fLU�-/^\��W�=$I��mS�^��w�^�={V_������V)Cr�����$�&Y��d�p�5!;o��f�q��cy<1�G]-]�t�V���U���*""B,P�^�t��
�]�V,��/�������DFF����r�3�����^m��I������Gdd��]�f�wt��}��i����V�����������e�j��������M�p��9Y���?��A�Q�|y��#;��#9����%K�8�m�	co@���u���V���������}�&�
�����9��!�r�GZ���wxx�f��a�O����C�r��>|()j���0qss�����P����S����mx�Y��Z�����KI���c�Lhh�9!�|��1&�;{����Y�fU�V��	��.]�g�}f�?z��w��S'�\��M�K�V�t�.)*�;wn���J����Ku��U��u5x�`��_��OW�����S����q� ���?M(rD�������'�X��.Y��|6�������[��s:�o�����h@J�*��J�
 ���Y������a�$)C��W�^�2�>���z��ev��t�R�u�-��ly{{����2����^1=�<��3����P�Y�b���Z�L��]����P�~�_p�<���2�e���p�����4i���G���;-(Y�����g�����
O��;�y��Q``��~�i���r�J��T4g� J�j�4}�t�=�
�����r@!z��='N�0_g��=�q�����;��=�+%|G�����C���������#���H�->�l�b���?��~��S'y{{'��}7��5�g�y�������{���-��H��������mK�{��e ������Q�F����n�7��Z�Or���p���/Y�D.\��xHR,d���x����u��}����wO�.]2�g�����u-b�4��$tOgs����K�r���1c���^�zU���wq���#>������G���7�?���x{{���^�o�a�}8 a���4������z�-%`���1�����K��~��f����\��u��V(��k���f���9sF������6m�����	�����{���U+����`��v������6��8qB��������Z�li����Q��/���%�N�{zz�v���b&�K�.-�^���SO���W�K+�g����3KJ{��'K���������b����M'N4WF�W���Ag}����K�a����A���@����KM��r�*9c���J�f��[������u�$���]U�T�U�s����)S���`5q�D�u���nsjA|Cj���?:�W6l���a�����_%i���9"22R�|�������s�s>���3��)i���FlCjW�^=s������-EDD�����c��3������;wb������[[�l��<�U�V���}�������v�m���/k��i�^:t�����E����-Z4��"�P��I���������>WPPP���?����|��D���[��z�O8r���p���[>D�T���5��)S&H��{��;�n�s��QXX������wrJ+�mx�L�0�|��X���P^�rq�n����k����)S�|�y�f;v���-����:;������)�T�3>��,���|��q������_��<�����?M(rDQ�mH�\=��*Tp�^���5   ��,Y���������t���������q��p��Xe�n���?�X��.]��[*]��:t� I:w��z��+��}[�:u2Wy��wb����������D��{���uk�\�2A�%��!C��}��1��t���k��|��g��6�E�5W��;w��C�F�b��N�/]�T/^��w����[{���{=��
)�;����O�b�
EFF�,3{�l]�~]R��6�����O?I���%x5��S����Mnnn1V�|��-[��������?��H�|}}c�<���9O�w�yG�6m�[&���D|���������z��)6�������C���s�Y]�^�zj������o�a��3v�X-X�@R��H��}�um�t��9����:r���2���1�o�7<�����y�f����vW��s���v�j��������;t=.����%I�*UJ3�����$������t��]�q)KC�1\�U���5kf�>G��W_}e�~������]�pA�:u2���������Q�V�Z����k����/[�@d����� IQ���=-�����/�4����������_�����2�`�
�?G�������;����Y�ff��i��6w�]�n�Z�lc��[o�����@�-JZ�n�I@<q������$pE�������l�2IR���cL ����P-�M�����m����o���u��p�Sb�&L07I�%""B�|�M�{N��c-���P�B�nn,O=��j��!)*g��C���Y�8q��M�&)j��k����8;��R��5K�'O��`�5N�������v@����	�&V���U�T)I���������*c�l��
*d5��R�����O?��s�l��s�N�]����I����I�Q��r�x��z�-%a���1������@R9v�X��8��jhh�>����6lh51����1c��{������/���;�I�&���Ppp��M�f�����*Q���������i�N�>���gk������������G�j��I:z���� e��N��|�v��h�"��_m���_�e��Vgj���:w���3g�����^��:w���u�*}����w�&O�l&�K�(�o���n�
4��i����|��Y���^)��{��I�&i��I*Q��6l�2e�({�����N�<��s�����f���&1j������W�f�T�B���[���:w��V�Xcg�?�������>���c%E%m�z�-8p@���J�*��$�_|���`5o�\U�VU�|����C9rD���7��������O)R�f]���y��?_#G�T@@��4i�r��)g�������3g�p�BK��d��A.n1�Z���M�6U�v�����0���K3f�P�6m�?~��wO;v���3�����������Y��	T�fM�?^�'O������K�����?�V�^m��<yr�J�?x�@?���~��U�\Yu��Q��%�5kV��}[G������	��N������Y}�.�O�>z��w��IU�\Y
����n����������r�����;i�$�|���_��iied�nxR���[,��U���~�/_^�{�V�R�t��U��=���0K�,vw|pT�54x�`�1B��]S�����[7��][�����k�&M���W�J��T�k|T���3f�^x�EFFj���*V���t���e����SG���9sb����W_)o��V����/k�������u��q�+WN�z�R�*Ud��l��_������U�T�{�����G�]�Vo����)����c�:{����Y��K���������Y��kW�����5S@@����/�m��#����=��������#N\����U�oK��O7�M�6m�#G�?��1���k���:|���^��5j��_T�
�-[6]�zUk����y��6W�V��������'��-[��o_(P@M�4Q��e�������������o�����Y~���W�������G�n��f��x������*W�,�>}Z,��
�������T�R���"��:tH�~���|�M5n�XU�VU������K�.i��m���?�	�o����h��r��h|8s����C��MS�
t��m
>\�V��K/����s���3�����}�vIQ�Jg��%OO�D_Gr�q�����>�L5k�T��5U�xqe��Y��_�������g���������'x�p���=.1������{]�v������5kV����q�K��R/W���:�����oVH�v��iH2v������(�����x�6l��:��'������=<<�O>��������(Q������Y�8w���z�����[���F�����^^^��e�j��)S��uL�2������}��5����^s�����/�Y���Sc|�s��V����~~~f9www���k6�u��J������;t��X�������a������v���W�,�����;tm���������ks��3g�/����c+�Y��z���<o��-�<G�R����`�����9�X����1���wD�n������u�P�B���=��t���_����j������7z������/n����y-{��5J�,i���3s��I����b��c���uv��-�����;���L�2����w�N@|CR�����)��n,p��4w����������O����$�����}lb�ws�
	u��M������o=��q�G�[�?������{�f��W�^�[��ad��5��W///c���q�������v�j��w/���a��1�7$�3s/���6m�8|�f��g����v�����#���[����;M��h9�����OM�p���/W�t,/^����������C=q��Q�fM��l���q���x��q�6��_���q����3~��'��Y�������2N>���u�����y
�������oDDD��+)��qq�;�Y�p���]������_?#<<<q��7��3�G
���`R�?�[�.�������g�����X����n���$5�"�sD�K��i4�qGG�8��$G��rD�7��������e������5����OJsu����x����7n�	&h���:u��"##�7o^5j�H����*V��P]�J�Rhh�&O���s������k��#G�+WN����:u�$www��?}�����?��C���_z�����y��?_-Z�p�y�I�.�~��'���S�������t��������_�<��^~�e�m����_���*.�W��.\(I�X���d�b��3g�h����q�����c��������P��9U�\9�i�F]�t����c�B,Z�H�W���u��������2CY�dQ�%��qc�����nU�����U�Z5�[�N��������\�r�r��z����}{�K�x����9i���;�b�
m��A���:z���]�&777e��M�K�V�����Ge������X^^^�<y���S�*88XG����7�>}z����r��z�����C�O�>�:��)�]�vi����;w����]�tI3fT�b���ys�����3g2\�s���#Z�b�6m��={������u����O���s�b��z����C�x}�O:g��7n����[[�n��m�t��)]�rE��_W�����J�*�e���������n���S�U���mk�>6����'I�L��h�"�����>}��o���/*S�L*R����m�>}����������/��CM�<Y�V��1W�fMu��U��7�������Q�F�1c��/_�={��������P�,YT�dI5h�@={�T������S�'O�����)S�h����Ny��U�:u��W/��Y3�?W`�
H���Z�j��[�j����x��._�����O�
R�5��S'=��3.k'�7�o@jF<�����p i�����d�RI1�Z�`Am��A��/��9s�m�6�={Vw��������������s��j��A�����mx�=Zm�������#G�����
S���+W.�+WN��5S����>��,���7w�]�x�v���K�.�������S��EU�n]���S���[WR��S��C��A�Z�v��m������sz���2f�����V�Z����D����QG��[W�����I��`�:tHW�^����J�*���[�O�>��1���o������{�j�*m��Y�������u��y{{+_�|�R��:v��V�Z���@������D����0�������0\�$NHH�*W���;w�R�J�n8��Y���sg��4�� �"�H��o�*�����i���Ci}pi�
@ZE|�V��U�7i��s��[V��1 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G����t�#L@Hb:�&�$1�����x�	�IL@<�t�$&�a:@��0 �	��G���$�su�<K�.��\��_{�We��q�
��q��+w*��53���W��lOGeZ�_��,Wi���4sa����+���{ �������������8x_���� �����up�M�6I"��Y�mr*����� �"������\�8	��4���T�79�
@NE|�S��D���v3�pi�n����7o���XW7����]qqq�n8�
@NE|�S��T�79����6n������)H���d���T�79�
@NE|�S��D���f����K����;w��V�������\�R����
@�Bl�S��T�79�
@Nu�����O^^^�n
���o9}p9�
@NE|�S��T�79����I@�A�V���� W7������orb���� �"����o����Qr��r*����� �"����o�|��n k  �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@2Hll������=[�=��7n�<y����Mnnn
v����`�}nnn�������zo\\���-k��V�Z��� #l��M������U�~}*_�|���R�����U+�3F����C�EFFj���7n�{�1X�������[�ni��z���U�\9���G�}�����;k���:|�p��l��UO<���V��
���G������?�+V��M��������ys-ZT�s�V��%��EM�<YW�^M������kZ�d���&M��h�����T�T�J
0@�V��a��9s��k��
P�<y�;wn+VL-Z���1ct��	���2v��k��
v�������s��sg�.]Z^^^*Y����i�i������)��������o��s��y���T��|}}�������^�zz����u�V�|�9�~7Af��
6�*��t=�����c��O��'�xBu��U������=:�m�z���N��x@����������J�*�v��i����p�B�>�RF����j�*U�25���.]�g�}�����l�����V���U�jU=��c�:u�N�:��k�~q��g��S�Ni��z�����ukU�\Y~~~���T�B�t���k���Z�n]�u�����?��'�|�>}��N�:*S�����#����C��8q���?��O����1��7��=;U��i�LNDD��/_���G���R��%����o���i���M�,YR^^^*]��:w���s�*...�:��H������q���������������D�;Ny��M���������5j(W�\f�g���p[���������^/���Z�j�
��2���w�������3�k�~���L������D����R��E��A����:{�l������+��

�+���:u��h������������������~Pll���;�^75�-�����9��93����lo���$c���n
,t����d�k����5p��$�����z��U����e��i�( ���;��v��7��x�����e�7�n]{��I�������_~��([�l�m1b��:n��i�XG�.]��W��������[W�2e�?������!��&M�dx{{;��7on���)�jT�T)������)S���i{�/777#<<�f�F��M��Q�zu���Cv���sg����wo�����<�2�����������-$$$U�-��	

���Q�F��}k��1J�(�b�
*d,\�0�F|CV������-[�*^:z�=k�,���/��&O���k�5�R+#�u������:���mk�;w�f]���w��
�f�J���0w���3�����>������Y�f���<����Y�lY��I���U�[g�f��3g���'����BBB��) 5�o����q��Q�|y���{1�s�).l���9r����������������T�U������g[��_o/^��y
.l,Y�������l�7��+��\�r�6���R�#�.]J�g���&�eD�#�!��O���,H?W�����x���������]o���+�bbb4s�L=��3)��9s��� +*V��4h�Z�j�\�r*X��������p�X�B�6m�������o���;z��w��'q����P�*Ut��1��u+C�a��Y:t��������:�]�v�������"""�c�����6����S��=��/�H����5`�5i�D^^^:t��f������O��/W��]�j�*���;��,X�>}���m�l�R��uS��%u��y-_�\�V���'��sgm��AAAA��p�{�������(I������k��u��X�b�������5w�\]�~]7nT�V��y�f+V,��N�8�6m����K���fpp����>yyy)<<\��������#F(O�<:th��a����[�h����/Ij����-w��uu��I�v��$�/_^C�Q���u��i��3G{����}���cGm��Y���y�<y��~��


R�����'777�9sF7n�O?����-X�@�����5k��#k���uE|���W/����n��e��=���HXI����Ku{v����zH�o��$���*_��$���c�3g��?���/���W����c�T�@��Qc��r�oh�/ki���5j�$���S]�tQ�-T�D	��������e�V�^��6p>g��:��10w���[������J�*�+��?^�7o����u��-�[�N�Z��������c����K�a���Q���?~EEE����Z�t������W�j��Arww����n�
���ed�����S�6m���R�J��!q����T�5���"""��cG?~\�t���k���*U���;�3f���c���?��sg������7o��~��W)~n5j�HS�$�Y�o����;��y����q)N�L/��-���h�9s&�mJ\W���U�L���?�uH=g��+V���m�N�j�B��W/���'U���q�F=������$��SG�?��t���Y�FK�,�����W/-[�L�:u�Y�7�q�������cGm��]R|_�[�n�U��
,�k������Z�f�v���p��{���z��z�����IO�������|�.I{�S�z$��>0^�uc�����c���^�8���?�����={��}_dd����eH2�v�j���0�]���a���F\\��2s��1W���+�q���d�9r�0`�1e�c��M���f������O�����d�-[���}���1116�?}�t��%J�0��������7�v��0aB�u]�p�(P��Y������m��5�����/�Bl�7<��SF����W�����	7*W�l��4�f}C�1�u��!�U�����7�|�,W�hQ���;N�&[j��e������Y���_7��j���v������h�W�^f�~��������������k���V+�/Z�(u�T#��;�y����f��3vz���w�}������~��Q��t��m���N�:��������������k�}�7d����������{��Z�j��Y6**�8{��S���oH-g��:��1����������	3*T�`���G%[��������g���{f]���FTT���E�0w���3�����>�����f�8���t�c��M��a��/�����m�9'���������|_�����{^�v�j�����Y�������G���
�1.�i�&�����'��8s�Hg�S0�����U�V���7�:N�&n��W��/�h��7�8x��g5�E�5�o��������6�)b���_�����o���f]/��B��c�Y����.^����*���|�7��+��
�0:v�h����^2n��e���S�l>S��{]�iY�
���5g���y\=wJz���Dp�3&�.\h���v�������������"����t�b��3f�����mT�X��d����8r�H���Z�����K��,w�������d(P ��	&�uu����yl����o��~8��vo���t���]����<y�$�xi����o���o���bbb�����e������;j���V������4���
I����q���d�]�v�(Y��!�pssK�A��L�4�l_����URF|����~����	��IKzTT����aH2<==���/�,{��%#W�\�9/��"�!��N	�.\0
.lH2����/#c��Z���M����K�,1�o��y���Y��Y��u���B���i���0{ap}�{�����H@�%-�����\�d��6�2O�<i�%�����t�R��H`���o����u���@�c�=f�����8+=3�)�����]��vo��1�~����j����k���f]u����8e�1v�X����c�-C���@|��d�|�e�O?����7�s�R�9pk��g���z��]�����k�����s����;6���9S���aCU�V�imh���������&I������~�x@�K�����y�Rll������~X�K�����|}}u���k������m�����6�y���d��Y��,�������;�r��m3����+I���������#�<���������[����U��z���/��B����|\�
6�.I������K������G�*U���>�'NX�����������Y3/^\>>>�R���y�]�~=�so��Q�V��U�?~yzz�X�b�V��x����{v��T�^�|}������%Kt��I���#U�B�4��H�|}}����,[�@u��M�t��U-_�<I�u���������{��A��y�����I���M�������hM�:UM�4Q��E�/_>��UK}��n��a���g�j����U��
,�����Q�F���od���fF�R�p����U��*W�,I�y��O;w����R�J6����P���������3��}�����w��~��gEEEI�z��%�d����O��
�$�����}�����l����[�m�V%J�P�<yT�Z5����Ib���W��'��~�����S��yU�vmM�8Q���)�{��z���U�bE���W^^^*Y��j����]�j���:y�d��p���\!22R������E��`��6�*THE�5�O��A|����k]�xQ���{�9�_N��|������=���������0�w�����[�Q��
(�"E��y��Z�hQ�1���G��
S����'O����s����aC���z��&M����[�x����;�������@��__C��������s���3���^�7;b���f���'�P�|��-�����={J��<~���LkcJb[�V�$���?��C��[W���*T���������'���^zI��WW�|�T�P!�n�Z?��c���}�����+u��I������V�<yT�lY�_�~�={v�/G����m��Q:t��
*��S������b�2+#��c����!C�U��s������G���F|��	&H��p���.n�k��=��o�g��$���KC�Q���������K��G���[����_U��] ///�.]Z�
RXXX��>z��^}�U��__������T���U�R%�h�B#G�����K2��4�������Y�a�3��=Z�t���1B�+WV��yU�D	u��A�W�N�����K}��Q�
��������G���{w��>s������M��H�"���T��U�B5n�X�<��V�\����4__����w8��W1�������5k�U�V��/Y�$������,���_�v�*K��]�x�h�����O	_��9bT�^=�r	_�r�2�{��d�i�B��_~�l��_�����?�r���7��\������F��mg�����O/������#F���m�������{�a�a4h��f����.\H�������O>���u��9���L�@K��w7��f����kg�}���4��u�V��
�X���>2����'��j�������o��s��Y���7o��:>���#""��[���XS�~}s������jW��_�?����93+v;�
���_��?�y��d�X���?���+&&�(V����|����j�q��-�P�Bf�BCCm�����Yn���v���y�Y�a���j���S�����e���kF�l�������7�0:dT�T�f�V�Z��9����F�.]�o�>�l����o�6g���Y�-���~��-sWsOOO�+��a\�x�,[�H��$G�RF|CV��v@�X��!���;w����[��o�H����GF��_~����;���W��/=;�[��6p�@��?�4���}=��f_����2���}M�6��y�o�n�(Q����m��4_��0w���3�^�g<s�)����7g��-�q��-v�.X��,��W�d��bM��50*T�`7���}�0�X�l��/_>�e_�u��<v��q�}�9�/^�)��=�7$��q�m���$c����a�zf�Sf���o)#���2j����f����4��=���|�A������'�Y���Mr���
H�������?��������-��^��}��z����?�����L6�����~��a�m2�fL*P���u�V���1c�����bl��7o�|)!�!#��9pg��8*���?����>Y�<I\\������,���i,[���yW�\i�����������|}�����\���o�^e����'4s�Ls�K	+���������U������?��C��W���?�
*���k�����2�O�V��Mu��YIR@@����U�J]�~]�����,Y������;�}���{�=���n�Znnn2C�����O>��-���O��[o�e������7onul��a��y�$�L�2����*U�$___��qC������7���J�o�����Z�j������/�.��o���-[�n��i���z����c�u��A?���-���0M�:U'O���}����/��o�Mr��S������$���_��wW��uU�hQEGG������}���]��k�e���Z�t�$���[�;wvq����������$����b�������)S�l�2�����+���)�6m�h����������Ha�o{������bbb��~��[7����;w������;��}{=��#*R���;��?�\'O���m���/h�������n�����`�h�B>>>��m��M��[�ni���j�����\�����DGG[���l�GyD���$��_�O?��<y�X�1C������<x�|}}3����?����/K����T�vm�e���k��_���z���������X���?2#���Rr��a�7���{��������k���j���������5}�t8p@��S�����O?�]�v:y���w��:�`����o�>��3]�tI6l��q�4v��$�y����U�-�^�z�z�����STT�����u�V���8��������d����O:v�����U�pa��QC�����!C2u�ooou��Q+V���;w���/����V�\��ww����##I9rd��dr�oly�������+o��*U���4i�>}��u��v�a��\�F
���G���)S�j�*�:uJ>>>*W��:t����{N�J�rj��o@�r�^7�:w��^�u����O~����}�$�D�j��i��Kp��q=��#�r�������eKy{{[��M�>]�7V����O�H�"<x�j������X�B�-�$=���j����T�bu��7o��G1W��[��}�Q���+o���t��8����V�[�g�9p�k��o���/4a��8qBqqq*R��j���N�:i���I�V]�0���O�����:u��-o9�d9�d�O<�C��������R�����aCu��]?����M\�rE]�t��c��q�
h����:u�.^��+Vh��qz����[7y{{k���j���<<<�a���9S���?~���o�6m�$9W�����U�TQ�=������:t������dw�\-�����;<x�bcc��U+
:4C���)�*���������XIR�.]T�X�t����+U�dU�7��UX��5l�PR�3��|��v���K�.���Ou��Q������$��d�C��y��:p���^��B�
�\�rj����j����X�b��,Y"???
2D��������+Wj��E���������qc}����1c��W��~���\�r�x������-[���������������s[�'44TO<��bcc�����;�}��*V�����u��9���[k������~�@Vr/��;;�%-v���	&���#I�l��Y�����o���M�j���;v�����7�h�"�^�Zw��Qpp�:�"E�X����������_�.Ij���:w��%J���K.\�?���u��Y���Y.I{�S�z8�Y���a�����$����8}��U���(�p���$�_�~�a����[OLL������=������r�Jse$www����NR�F��$�h��Ivw�r���"`�&MI����eU.::���7�Y����g
www�����#~���v���g*�<xp��0&&�jg��u�nnn������a����aDDD$)�������n�m�n����x����=�����t�Rc��������'Z�P�+W�dR�Q;�������v��������������1~��d������r���)�b9t�P����o���y���~�[��*����s�����`�Y���%�[��3g��<<<���k~~~���;��]�n�Y_��������,�6X���,w��y�]�+f���k��3�����x����v�0`���gh���y��?��f���Xs�5���;)�]�lY��'N�-�o�>�o�����/����������m�1l��T__b�����h|��u�������6~���d���F___s5�111F��
IF�
���|���dchf#����z����f�b���|��%��qDZv@7�����v�4�}�]c��������w�y��o���������6& ������*3w@����M�$���~��g��#�<b|���������|||�����~�[R�7dG�u�u������0�~r��%��_m<������$�S�N���a����f}���7��g4n���+o��������2�.\���}{�r!!!���������3���oDFF&)k�*�3�<��������#G����}�����K�:	s��?���9p��0�2����h�������E���/��6[���s���^m�hrs��c�����kL�%&��^///��_MR����xG����+���O����3gZ�
Il��m��=z����D�!��Rj��K����v�u���5N�w@'��F|��e�<L���zW�X���
d������n��'OZ��'�����
H����~��G��.\ht���n�Y��q���T�'�������������s�%�[N���AAA���;f��2nnn��a������s���E�%���g�5���E8..������}��@|CF����������s&����c��Q�����et����y�f��0�~��GI������O?��n�6o��������s�$����O�9s�������C~��U�����_oF�M���Q��g�Y�d����+Wl�?~�� ob�?��y|���V��/_n�LVL��7n4�����V����o���$*g���V�V����N�\�����z�f�����Y.�����z������h��{6l��
������U�4��fT��U��z�����{j��i|��G�����S�m�����I�&%[�e���?�l��W�^M��~��u�2��>���v����/��:uj�?��,?k{	������9,X`����w��q�c����������J2������x����wo3�;��v��%��d���0�/���m\�t�f�+W������s��:u�����w����������j������Ssi6Y����oo�\��x����G�0�b����?��EDD��^y��\CF#����3����-!�n���K/�d|��7�����Y�f/������ou�����Hk�a�����x����}���+�D�� ������*3�}}}��={}��1o�<c����I��|�*N$�b����_��*T�`>���iSc��)����O>���_��U�Y�dI��O|�������{��rF�6m���V��e�?�0U��$$�%���+���C{��IS;-%N@�7o�����}^^^6��n��i�����d�/_>��?���g��}������i���0{a�9�����>8���<k�,����h�����o�f�2/^l|����SO=e5o���f|����n��]GX.�^�n]�����k����kI�8���7��������1w�\c��E�g�}f�������4�������-���>�Y.��{r�$HH<���J�������:�����oH��q�]�v�������:�������	������m1�a��N��9�29:((�n�O�g�^~�e�����o@je��u�F���+W�lH2r��m:��={�1o�<��W_��/Hv1^{R{�k����@c��a���S���}��1z�h��%�;wNw����s��m3����[F�����5j����������������!�/z�]����9pg��8*q��M�l�M�����������Mm��Ir��'�4�In�����s���-�/_^�Z��$��=�����3%I���3�d�g�}V���C��?�h�~���T�@�e�����K�V�\���(��m��1_�_���X���*UR�6mT�ti���'Iy��5_����f;��������g��6lhul���6�i����z���I�'\���{���.��������R�J�n��K�.��O�:�7nh���


�+����={��g����k�����e_�u?~<I}O<���������C������R�~�t��E��z�����
2����K��g�%{
�����3���V�=���c��53_/^\=z��Y�^|sU��+::Z�=����;'Iz��G�����}����&L����~�f������?��]����$f��%�0$I�=��
*d��������������c��v�Z����������A�iz�=��7=��S6���oy��1_���3-�����o�+W����}�vM�8QC�Q����O>�D���/�`���7�y��t��Qe���'�|�^�z�,���?j��q
w���o,}���:s��.\�W^yE}��Q�^�4r�H�X�B[�nU��e%I�����l=���G�Ull�F��?��S�?��z���_|Q[�l��/�l�}��'t��
�\�
�i����<<<��m[5m������*T��������R�X1�}F����K$[���G����$���%��a�
@fb�9���GN��~s�f���7j��q
V���5t�PM�6M���f��0
<8��hW��9�������3������[o�o��������E�i�������%��I���Cqqq���xz��gl�����WO�5J�����u��Q�c���]�6����h����s��j���W^y%C���)�*��y�m%)88X���{��*\������W_}�|��RHH���}�K�� �7���X��:$___m��Y_���>}�h��	��o��U�&)~���7�������(,,L��O���>��={�_�~5j�v������N^^^��+Vh��IN;�C=�r��%{���[u��5�����+W�d�6j����7���g����^�wf>KZ�I�&6�7m��|=`���3e��1����7���#H@����::�M�6I�N�8��k�J��pss��6XN�&g��-��:�-�7o^�=::Z���V�[�li��[�n����I��m�J�Z�nm����y{{'��T�Z5���K��	��M�k���eo�"W�\������$�%�D��k��	������m[-]�T7o�Lk���y�f�!�0t��u���Kc����k���[o�f��f��
tV�XQ��MKv`����3o6����i��%)���/�V�Z����O+((HO?�����[-\�Pc��U�j��l�2U�P����o5z�h����^m���g�}���k��i�������'777��+-����5j�<n����k������b7�qqq<x�6n�()�At�	&[&N��������>S�����_���k�������5z�h���[k��Q����j��k������2������QQQ:z���O��2e���O?U��u�:x+���Y����+�`���M�
(`�g��uz����z�j�D�����d������l��;�&O�����K�h����K�9��#G�Z�jZ�x�F����P��yS7o�Thh�F����8����j���S@�o,5n�X�s��y�^�zZ�j�9i����j��mI�%�wn�����j777M�0��������s�q���d������SO=e�OFGG�����7o�����Y�f�E�z���g:s��Y���W�����5b�9u��z���}@�2f��8[BY�0t��e�c���3���~�i�5JLc� e���?���G���~s���.f�?~��7�\�#**J&LpZ���z��)_�|6�W�XQ�W�V��E%I�����%K�r���+�]�9-}p)i|k��������c��/(444�D2 �HK|�����s�Nyxx��o�����6Zr�8eVE|2���W��?H��5�
rJ������g����_��&M������o�Q�����}{EEEY=w���SB�
@Z%��M�8Qu��IR�D�������g�������Ii��~����/�0�?~�������I��7�q:{coqqqj������+�={6-M��{q���,i���fY�^|��n��i�������R��{
	�@6��c��D&��={�����������oCJ;vDDD���=��\��JR�B����?������={�H���&��m�f��e�Z��I����>}���s��Q�f�T�pau��Ac����M��> ��i�%�=���0���$^9_�&L�`�����Ou��M�
R�F�4r�H-[�,����7o^��UK����BCCU�T)EFF�s����w���'I��	
d���'�|�|��� )~��U�V�"��yS_~�����{k��Q
�}�����[����7I}o�����kv�CBB�U��y��\�R^^^�>}�j��m���JM�r4JI���b7�V�a������y�$Ie�����kS��{��w��+�(66V�����[5n�X��������V��Q�Fi�����;��_����{����N���k��;g�+W��w�b9��h_���[�����///�/_^��
��]���M������_�����'%������$}���f�������
*��-[��7���5k���YJV�o��7����[��*6e�A�i���������j��-����v����������K���;����;m��� ��V�j.�!I���K�2��s�������k��a����;��
�Xi���J<==U�L���G�7oV�~�$I�|���y��T��?~5h�@�����O���_���j��m����JM�JO|�Z���~�mI��74v�XU�ZU�J�R���5e��dW���b�9���I��#���~�����n�����Bf�Y*^��F�a~���#������)S������M�2EAAA*Z���t��	&$Y�p����h�����7T�W�^��3+�SfU�7 s,X��\0�e��Iv��o���������;v���_V��=5l�0-\�P�ah��1�����������ce�o@���)y��5�n�S�V-3i��������6h� U�TIR|�����-��?x�`sq����OO=��J�(��U�j��!�3g�.\�������:��|�����v���$�:v��H�.\��W^yE���*_���������J'N�Hm�s,��l���G�{��$-Z�H��_7w�l�����-�)m����k���y��X�����{$L�_�zU��o�$m��A�a�����tO(w��s��M�6�8�'���j��������Dz��U�Y�F�G�V�f�T�B��j��*/�]
�l��


�/����K��|�l����'�k��*^���}��d���T�\9�?^R��|���[/q'9a�c[,'��=�l�%J�����%K��[7�.]Z^^^*X�������?�X�v��������f��;����������W�5�?~3A��'�Thh�����H�6�WjbVz��+b7��a��g���_-)�!����+00���N�>m����+���^�Y�i���
��+W4k�,�4����}�Nq��|�����_�|�����do%b{|||4s�L�}�G�N�*jZeV�-((H�w���A�����[���h�������J�.����N�6 3e���X���U�bEI���aaaz���������$�o�^��w�Y�G�j���$)<<\?���S�@|��8p ����wN-��q�z���yxx��/�0��&O��dW���W��^y�I���5e�g43S�����e��Y���%K���^P�*U��Y3�� ��g<5�Gv��������[�t��q3���,�xy =&&��������kKJ�i��}��C����W���"##��/����_WPP����~�����:�^i�o	;���}[���z���2��Ya�2�"����y�!C�8���C����#z��7T�n]*T�L:�������/����v����v�7��,�o5k���A��5�onnnV;�g������_�U�'O�Z8�����9s����U�dI����i0Y��>��|���������5{�l�������������SO=���u�����E:��
<X�t��u=���:v��������S7n�H�|�J�����r�a��u�����5k�H�"�����/_����J��v��Q��/^��/���~��1c��];s����0���_c��I�z��"E�h���:{��9���Gs2����z�������,��N�:��7l����X�R��������XOxM�����u��%K������������m�6���������}���
4�{���+k��)��w��^����(=zT_~���V�*I��/+���9�az��g���_J������j��W���;w$I���K1��C��kg?�}��E3�������������W��s��N�:%)��M�4�7  @��U��`�������\%  @3g�Tdd�~��w�?^=�������g���/f��$���R|��h�����$9�rw�k����3���#�X�Q��Y�
�����fu���7Wu��Y6����fju��E�6m��3g�x�b�9Ru��5���6mR����v�Z�@N�8s���8����7���������tD�2e�'OI���'��`[�?���XIR�J�R3�'3�v3J�f���o����Z�l��x�
5k��\�y���z����Z������w�^�>�z���<y����$_S�N5�s���ciYX�^����o�������-X��{��9O���5n�8m��]�.]Rtt��?��s��a��f[$~N��[��������wK\&+���{|����/��#G������1c��b�S�������W�z�t��i�H?���9;�%+rss����{�n���k���z��gU�zuI��V�\����k���.n�k��ds
40����~+)~��G}���2�,Y�|}����[&�*U*��������SR�I��m�Z�M�`O\._�|�q��7�:t��w�}Wk�������V\���t������r���
��^��E�t��9-^����Z�~��.]��V�,��t��[���)b��\�b���qGC��|P�E���k����x�����`g���*99v#�J��6m���>NHH�����A9Gb��j��6:��y�����;�t����f����m���-�s�Nsr�z��������������R�-��k�i���:�����+�o<{�l������R'+�7[,Wu�<F��GF ��_J��z����5R��;��
9]z�u�g�O��{SI*^���w��I�&i���
W�=$�/*���/���r���O���ef�9..��������pss3�yll�BCC����C�Q�F����c����W]�t��q��q�F�>}Z��7����K)&�����f��z��z��w���4i�Y����V�n����6����Y�
�������#��#22�L���/����cu���s���U���:��[�2Y�����[���5x�`}��7:z���l�b>z��i}���.n!�>����3�Y\-  @}�����S��?�h���j���$���kz��7]�B�"��������+��Z��yR��v���yS���$)w��I6������K����/���������6m�X�M�~��]:~���o�.)~�r0�Q�����o���]�J��*���d����F�m����]�  ��X��j>���:�����V�n�����%�?L3p��4�%I3f�0_:4]ue599v#{H<Q�dI����R�J�ay��������������R���YN��f��x�|�����-�r�J��e�M���8=z��>+��H/ooo=��z��g�����&+����:u���zyy)000C���?��B|�����ur��>>>j����}f�;g5�7�$�����9�U�6��l���7o�y]���O���@��8s���8\-����7o62K�.m�\�j��#Ji�";+Z��>��33����V;N-��0N����S��sGs��5�O��6���w�������O�>������������y���{m�|V���a���U��,
40�{C��]�uS�Y����g�j�V��%K���=>��^�o$�9@�����Q#5l�P
6��a�\�$�c�=f��6m��^�j�����k��I�:w�l���U�o���>�@R��q�S&������{�)&&�����\�r���:s��|m�����K�u��M]�k���3_��5���W_}e����S��9f�EDDH����+�4��g�}�������t�;#��*��7#J�(����w�}���r��_~��nJ���<�#;�8j�����k���A��~���v��U��������S���~�����kI��*���+]m���u��yI������U_VD|Cv�U��-�����G���3��M��c�������Y6&&F.4����#��������w�}g~��C%[������8���8�?(���9�"�!'p��nV�m�6���SR|�`BR`Ze��Mg�����$�p���w��|m��2���w�}������+X��|��W�q�F��N�:�E�I�OMX#-��?�)S���g�����op������k�0�������XK����Sf�7�4��/��s�$���[�n]������;v���1�#F$[��[�!��S�tis��7nX-�������E����e�b���;������weo����[�|�6�����3�Y�*???(P@��t (Z�����om��Y�7oV���]�$S�5��sgIRDD������7o&)��o���a���z���l�i9y>{�lIR�������D��Z��U���O����'���K6�}��9-Y���>a5��.""B/���������X
�g��G�����K�����=���������$iIV��e���@�������j:K-[�T�$IG��3�<����$��N���K�J��x�����o���6��bbb4f�M�0AR��Z�|��������L�L��M���CsU��?�<�����c7����{��]%J���
���e��MU�lYI��K�����';�c��z�-3^����g�����H|K�r����������k������?/I���R�~�t��u�21116l�9 ��OU�R%I]k����9sR\���_�ZT����6W��BCC�h�s��
�D��!�qE|;r��>��#����sG����f��e��;����+K�.]�(_�|��:�|��d.���5t�P9rDR|�0�?����={�+-w�����������[Ohh�:v����(IR��v����_?U�VM���h��1I����^{��y(00�f����o�W8�^Wr,9����5e��$���m��U�>��9f��o_,X0I�	&��[ZTT���y�X�B������C���
\��O?�������o��I{����@X�"E2�yr0���O	s�����o����5}�t��;97n����n�:I�}N{�&��������T�)��W�n��GDDh��aI�=�_���}���9r��d�K����U�V�}� ,,L;v4���U�����;�j2��y�4c���^R�r�����;����������H|��)�2��U����esG�[XX����?�u���Om��1�
��c����[����st�h��q���_~Y���I��={V}��5����������&�����xO�`�=������bqB�IDAT���r�����r��#G���������!�b��3�Y��1c����~K6�'����u��eI��\�n�S���i��V������@��o�mu�M�6�^�<+�>}����t��Y�X�B��W��A�T�re]�~]�W������?do�����U%�I�&�������S\��u��:p��Y�p��6DD�F���^{M�Z�R�F�T�|y���O�����g����o����S�*UJ����n���O>�D�|����������j���������u��1��?���/_��z����V�^�y�f=���*S����o��5k�X�b��;�._����G?����M�o�a�h��3fX��,���I��I��t����t]��_~�&M����3�1c��m�����+  @.\��?���k�Z��p�������O���z����������:x��/^l�������_~�Y�$�\�Ro���Z�n�f���|�������S���o�i��5f�=zt���������o���S�J��1b�8��}_PP�������S�}��}�Q���i�����������YS���:v��.\h�P.���*U�)�������>-bo���V�Z�={�h��
�U���
�r�������={��_.[��>���d�9y��
���^:tPPP�����7o^��qCG��o����[���i���^��T����\����Gk���j����4i���+�@��|��<����������F���{	dM���uE|�~��^{�5����j�������r��)���~������E�����{>��5i��f����ViK�-%X�~}�	��{Lu����7???�?^����g���?��o_s@�����;w��'tww���S3|wvg"�i��c������#T�B�k�N5j�����<<<t��i�[�N+W�4'b��H���Cs��Q���u��u�=Zk��Q�^�T�D	�:uJ����m�&)~��y���j�#W#��^��{��pV�t��^x����j������������_�n�Rxx�BBB���^��&N��l�~��W�����\��Z�nm+###�{�n-]�Tg���������vcS;w���9sT�`Au������;���=���]��-3�&����.n1�����c���GV��~���g���O���^R���U�n]�)SFy����+W�s�N-X�@����������:&M�dw�������W/��R�e?�����_:y������}��)88X�J���c���7����c����5��)S��T�R�������~/^\���:w��6n���K���'���j��E���H�G�2���1c�����]�v�_����-+�?^[�n�?�`&8=�����?��[�{������������������2)��4N0d��]"\�|9��e2iXXX���n��9p�Y�
YYF���>}Z�V���P�e��3���C�z�R��M��U+U�TI���:s��BBB�|�r�r��!z��W��G�-u�o�W�bl�q��z���4a�]�tI�5�����Y3yzzj��]���ot��EIR�z�������u���K}��Gj����6m���+���Ww�����G�l�2m���,�����W^I�����?����'+  @���������E�*66V�N���e��i�&I���e�k�O���,YUHH�F��b���c���]��J�(!wwwEDD��6	��9p���;I��;\�X		1$��k��Q��5p�@���5k������u�l�2�fF��-��Rs�j�����\�rc��u��V�ZY�w����������=���6��={��?����7n�p���������-`H2��3�8p�����p���F���#G�|m�4w�\�[g����W���/��"�:-c��_�$��I2BBB��w���F��U��'_�|�����S�z����Ic���)~�q�u���3f�H�.G9#f%6k�,���Y���ef�vb��!-�(����-Zd����X����1y�d��KM|3��������5J��a���SF�F����Z�j��l�aR����0�n��y3�mN��>pB��������6l���u�h��8w�\:��9�o�g��F�����P��\�@��I��K����>�����I������O�})!����������2n��}����������q��)�����7J�.m��b��9�GM	�-e�7����u�G�����z�q���N�<J�,i�������r��Zb��,����FOOO����O�:	s��?���9���g��1�2���g���.]���K�(a���/)���=�~W-�Z�J��y��}F�*U����I#""�f#F�p�=����;������7n���Q�����AF���5����>����t���!#������c���f����]v��V�����WJc)!����v�p�x�q����{�����9�/^�b{���c|���F\\�C���f��d����7�|�����{��;/^�[���u,�������_|����J�S��y�����:t�~~~���+�~qND|Cj1��3�Y��>Yb��}������7�1s��t\�s�z���d��+j����;w��,Y��;w������Q�2e��];=���������M�6��a���U�6m�l���[����\���
ZP�j��v�Zm��E����u��-���Ge��U�F�����/gE:z��~��7���_��g��?�k��)w��*Q�������{L={�T�\�y@����O��kW���


���Gu����sG���S���u����c�����G�����5jh��]�={�/^����������/����>u��I�<���-j��/��B�V����u��q�?^�r�R�%��qcu��]=�����RlS����;wnm��A�����s�t��M+VL�+WV�.]���l��T�����z����m�����3w�x��bccU�P!U�ZU�[���!CT�L��{����������R�Ji��M�;w�����={�������U�*U��gO
2D^^^6������m���������0�.�j���y������Sv�p��-[j���Z�f����o���O'O���7���-��WO�{�V�.]\�\ ]23�U�ZU�V���-[�e��������t�����T�H��UK���W���U�@']����n��i��YZ�n�������/K�_Y�f���������U�H�Lo_z���a��I�����l����w���s�p��n����*00P�7V��}����X�-�o�>}��7Z�t�>��/�`���V��~�a=�����/_^]� �Y_�-�y�f�[�N��m���u��)��yS^^^*T���T��&M����W�j�����?h������?�k�.������K���U���U�T)��][�;w�#�<"�L�R��6m�z�����m��]������?���(P@�*UR�V�4d��l�c.8s���8������?��-[�h���:q��"##u��e���G��SPP�:w���={�����M��Z�j


��3�x�b<xP�.]R�"Et����O�>�������m���+��^�z��e�v���3g�(22R7n�P�T�ti5l�P=z�P�v��S���z�-�n�Z������[u��!EDD(::Z���S�����iS
<Xu��qus�l)'�Sfe�7��f��e�N��6)i������+���h��=:{���^��"E��|������ �����8���>�����S3f���5kt��)��sG��S�&M4`�u��)���z�j���_��y�<�.(22R��g![�h�A�)   ���l;v��o����7*44T����K��������z������,___W7�'9{\rn>KV�|�r�]�V����v���#G����2�����k��C��T�R�n���	3R��v����u�j��


rus�i����~����(�69�
@NE|�S��T��f��T���T�79�
@NE|�S��D��;�����B:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���r��p���	�Taaa��orb���� �"����or*�Z���@NC@NE|�S��T�79�
@N����f��� ��?��U������n
8����bcc]�p*b���� �"����or�<y����*[�����4`�@NF@NE|�S��T�79�
@N���o�s��������n8���������f�S��T�79�
@NE|�S)R���l��o9}p9�
@NE|�S��T�79�+��I@H��]�@�@:@	���H@H"p	�I$��" �t�]$�$����t�$�w���D:�.��H@�E:@	���H@H"p	�I$��" �t�]�?���jJ��IEND�B`�
Array-containselem-gin-v3.patchtext/x-patch; charset=US-ASCII; name=Array-containselem-gin-v3.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..9b91582021 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,14 +95,31 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/*
+		* since this function returns a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return it
+		* as is and configure the searchmode
+		*/
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nelems = 1;
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +144,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +211,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +301,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..6099f92544 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,133 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair; treat NULL as false
+			*/
+		locfcinfo->args[0].value = elt1;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	Datum elem = PG_GETARG_DATUM(0);
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 885ed6080b..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11472,12 +11472,11 @@ generate_operator_clause(StringInfo buf,
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
-	Oid			lefttypeoid;
 	Oid			oproid;
 
 	/* Override operator with <<@ in case of FK array */
 	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
-		oproid = OID_ARRAY_CONTAINED_OP;
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
 	else
 		oproid = opoid;
 
@@ -11490,26 +11489,8 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT) 
-	{
-		/* 
-		 * Cast lefttype to array type since we construct it into an array
-		 * using ARRAY[] below
-		 */ 
-		lefttypeoid = get_array_type(leftoptype);
-		if (!OidIsValid(lefttypeoid))
-			ereport(ERROR,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-						errmsg("could not find array type for data type %s",
-							format_type_be(leftoptype))));
-		appendStringInfo(buf, "ARRAY [%s]", leftop);
-	}
-	else
-	{
-		lefttypeoid = leftoptype;
-		appendStringInfoString(buf, leftop);
-	}
-	if (lefttypeoid != operform->oprleft)
+	appendStringInfoString(buf, leftop);
+	if (leftoptype != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
 	appendStringInfoString(buf, oprname);
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index f8174061ef..73eea56214 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8172,6 +8172,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
index e0e38bc82f..cdfbf25598 100644
--- a/src/test/regress/expected/element_fk.out
+++ b/src/test/regress/expected/element_fk.out
@@ -493,6 +493,7 @@ INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
 INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
 INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
 INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
 -- Define FKTABLEFORARRAYGIN
 CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
     ftest2 int PRIMARY KEY,
@@ -500,6 +501,7 @@ CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
     ON DELETE NO ACTION ON UPDATE NO ACTION);
 -- -- Create index on FKTABLEFORARRAYGIN
 CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
@@ -510,8 +512,10 @@ INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
 -- Try using the indexable operator
-SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
    ftest1    | ftest2 
 -------------+--------
  {5}         |      1
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
index d1d0a9e119..963708b406 100644
--- a/src/test/regress/sql/element_fk.sql
+++ b/src/test/regress/sql/element_fk.sql
@@ -375,6 +375,7 @@ INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
 INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
 INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
 INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
 
 -- Define FKTABLEFORARRAYGIN
 CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
@@ -385,6 +386,7 @@ CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
 -- -- Create index on FKTABLEFORARRAYGIN
 CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
 
+-- Populate Table
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
@@ -396,8 +398,11 @@ INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
 INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
 
+-- Try UPDATE 
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
 -- Try using the indexable operator
-SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
 
 -- Cleanup
 DROP TABLE FKTABLEFORARRAYGIN;
Array-ELEMENT-foreign-key-v17.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v17.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 865e826fb0..d24ba6a2a2 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2645,6 +2645,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2700,6 +2710,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b8cd35e995..8885c4ee7a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2049,6 +2049,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..f2dbc76328 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,68 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+				/* 
+				 * Assert all referencing columns is of an array type
+				 * 
+				 * we have disallow vector types for operator compatibility for
+				 * now function can determine vector types have to do it
+				 * explicitly, luckily only two vector types exist
+				 */
+				if (!type_is_array(fktypoid[i]) ||
+					fktypoid[i] == INT2VECTOROID ||
+					fktypoid[i] == OIDVECTOROID)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("(%s) is not an array type, cannot be used as a referencing column",
+									format_type_be(fktypoid[i]))));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8774,65 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8932,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +8998,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9011,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9055,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9125,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9211,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9260,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9394,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9430,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9539,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9572,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9616,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9687,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9722,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9802,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9841,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 21e09c667a..6c6d1ad2f2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -2977,6 +2977,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 5a5237c6c3..97829a67f2 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8392be6d44..38d80f228e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3602,6 +3602,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index b2f447bf9a..d2f520d78f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ * 
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -641,7 +657,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3620,8 +3636,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3823,14 +3841,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3864,6 +3883,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15275,6 +15318,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15809,6 +15853,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16828,6 +16873,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9599485ba7 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1822,21 +1916,22 @@ quoteRelationName(char *buffer, Relation rel)
 /*
  * ri_GenerateQual --- generate a WHERE clause equating two variables
  *
- * This basically appends " sep leftop op rightop" to buf, adding casts
- * and schema qualification as needed to ensure that the parser will select
- * the operator we specify.  leftop and rightop should be parenthesized
- * if they aren't variables or parameters.
+ * This basically appends " sep leftop op rightop" to buf, adding casts and
+ * schema qualification as needed to ensure that the parser will select the
+ * operator we specify.  leftop and rightop should be parenthesized if they
+ * aren't variables or parameters.
  */
 static void
 ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2019,6 +2114,7 @@ ri_LoadConstraintInfo(Oid constraintOid)
 	bool		found;
 	HeapTuple	tup;
 	Form_pg_constraint conForm;
+	int 		i;
 
 	/*
 	 * On the first call initialize the hashtable
@@ -2066,7 +2162,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 1a844bc461..a719796fac 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11344,24 +11418,51 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			lefttypeoid;
+	Oid			oproid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_CONTAINED_OP;
+	else
+		oproid = opoid;
+
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT) 
+	{
+		/* 
+		 * Cast lefttype to array type since we construct it into an array
+		 * using ARRAY[] below
+		 */ 
+		lefttypeoid = get_array_type(leftoptype);
+		if (!OidIsValid(lefttypeoid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+						errmsg("could not find array type for data type %s",
+							format_type_be(leftoptype))));
+		appendStringInfo(buf, "ARRAY [%s]", leftop);
+	}
+	else
+	{
+		lefttypeoid = leftoptype;
+		appendStringInfoString(buf, leftop);
+	}
+	if (lefttypeoid != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
 	appendStringInfoString(buf, oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 6449937b35..a9fd30d932 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -115,9 +115,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1];
 
@@ -210,6 +220,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -250,7 +261,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 068c6ec440..c2e07d759c 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2163,6 +2163,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2203,6 +2207,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8c554e1f69..365d3ab437 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -140,6 +140,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..e0e38bc82f
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,539 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  (integer) is not an array type, cannot be used as a referencing column
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  (int2vector) is not an array type, cannot be used as a referencing column
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+DROP TABLE IF EXISTS PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd..d6bb09136d 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e7..c13d5172aa 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..d1d0a9e119
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,417 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+DROP TABLE IF EXISTS PKTABLEVIOLATING;
test_data.zipapplication/zip; name=test_data.zipDownload
PK�R?R
 test_data/UT
�h`�h`�h`ux��PK�R?R test_data/1_10^1_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& test_data/1_10^1_rows/1_referenced.sqlUT
�h`�h`�h`ux��������q@�\OqC��v����"zE�d����8pb��?�;
Err�0\29 9�Mw�������������?�>������^���~�O?�����__?}����?~���~����������~�������o��_������_����__�����~=�����w_�������/��������/�����������
�����������G��k��������W������G���6��i��&�-6�d�6O�a��'����n�r�I7l�����x�
�o<�-O���)���l�x
�-O���)�`<���`���[0��a�����Sp���)8�����i�����Sp���)8m�����|
N[p>�-����\O�e�����Sp������\O�e�����Sp���)�l��\��~
n[p?�-�����O�m�������
�-�����O�m�����Sp���)xl��<��y
[�<�-x���<O�����P[�<�-x���<O�c�S0m�|
�-�O���)��`>���`���L}�� a�S0m�|
�-XO���)X�`=���`���,[���e�S�l�z
�>r��)X�`?���`���l[���m�S�m�~
�-�O���)��`?[��9���=��3��C�[������\��`��'�7G��>��9�����������o�o}�s��3��C�[W�P�Rs�FW�X���r���6^l.�x��h�����w�7^n.�h����z3����f�%8]��p�3��gh�@���3���-g�9Ck��s����-:��t�3���yiUWv����m;�Zw�3���gh����3@���g�<C;�z����m=c]2�U����g>C���|�6���>��}�3���gh�����3����g@C���G!�*4�
hh@��4���-h�ACk������
-B��(4�

Xhh���KW�����
�C��@4�
�hh# ��J4`���hECK������
�E#��.uU�hh1���f4@���h�FC������
mG<Z�|4�
ihA���4��HZW���v�$
-IJ���4�&
8ihO����4 ��Mi�JC�����v�,
-K��U��^6��
�����Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[�q/����Rh[
l)�-���[
mK�-�����B�R`K�m)������� 3�^
���A�r��z���A����!t��;B����%t�	�{B����)t�
i[
l)�-���[
mK1��/][
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK�-���X�2���-�����B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R�{ISW��B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)��|��bK�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)����y/U���Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[
l)�-E����*���[
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK���q�A�w����4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi���EW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK3��%][���&�4�-Mlij[�����4���mibKS������v���h�)��v���k��MW������$��I�������,��K������4M��������-MmK[���&�4�-�u�������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi��|TW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK��g��*�4�-Mlij[�����4���mibKS��������-MmK[���&�4�-Mlij[�y�{������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi�}���bKS��������-MmK[���&�4�-Mlij[�����4���mibKS��������w<���p4�	
��������miaKK��������--mK[Z�����--lii[Z��������mi�;xCW������--mK[Z�����--lii[Z��������miaKK��������--mK+�@][Z�����--lii[Z��������miaKK��������--mK[Z�����-�y�����������miaKK��������--mK[Z~��|�'��G~��~����G?0��@�U�$?�A�S��$?�B����($mK[Z�����--lii[Z��������mi�;�JW������--mK[Z�����--lii[Z��������miaKK��������--mK���e�*���--lii[Z��������miaKK��������--mK[Z�����--lii[Zy�����������miaKK��������--mK[Z�����--lii[Z��������mi�0��bKK��������--mK[Z�����--lii[Z��������miaKK��������wp��yGG�����������micK[��������-mmK[���6���-mlik[���������mi�;TW������-mmK[���6���-mlik[���������micK[��������-mmK;��W][���6���-mlik[���������micK[��������-mmK[���6���-�yG�����������micK[��������-mmK[���6���-mlik[���������mi�;�YW������-mmK[���6���-mli�9�w����}Gm�Y�w����}�m�y�w��L��#�u�;t�O��c����;x�O�����-mlik[���������micK[��������-mmK��Q��*���-mlik[���������micK[��������-mmK[���6���-mlik[�yG�����������micK[��������-mmK[���6���-mlik[���������mi�]}��bK[��������-mmK[���6���-mlik[���������micK[��������w���iq�Z������t���m�`KG��������-mK[:���t�-l�h[:����t���m����DW������-mK[:���t�-l�h[:����t���m�`KG��������-mK'�][:���t�-l�h[:����t���m�`KG��������-mK[:���t�-�y�������t���m�`KG��������-mK[:���t�-l�h[:����t���m���4JW������-mK[:���t�-l�h[:����t���m�`KG��������-mKg�e`�*�t�-l�h[:����t�������n~��]��w���n~��]�����o~��]��;���7]��y�{���7����z��t���m�`KG��������-mK[:���t�-l�h[:y��������t���m�`KG��������-mK[:���t�-l�h[:����t���m��]���bKG��������-mK[:���t�-l�h[:����t���m�`KG��������w����y�m�}��Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-��kTuUl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����2�z\][JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-����w����-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�R���ZW��R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)�]S��bK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)���������U������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�����4���>���PK�R?R1���%6' test_data/1_10^1_rows/2_referencing.sqlUT
�h`�h`�h`ux����=O�0������H��[�Lr��i9.�B� ���
��9�NEH}w�s������C�4�q���+�|����}���Mvo������,a8�p���z���/�~������:h�i��S��o��8�OI;����G�����+�c��������b�@����G?���q�/a.��rz(����M2�hk�)��j��:k)���A�d�C&�2��K]L�D9Y:�����.E��M�E��$���GN�����n�y�K���<���:��-��������nmRX���.K~PK�R?R9���0O+ test_data/1_10^1_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux����?o�0�w>�m)N�br��rL�����Xh,U���s�T����tw������V�}�`���C�b�4�7���lTy4/s��0~;�����3��]��n3�y�?=Of#��74L]C��>xc]��_��h�.��M���i�k.����GWa����q���]����}�l���x�}�||�(�u=�@t���G���q�2��V���K�:y�D����d��+�*5E�*��	�L�e��:O�QC*�U3�%W�%�2�\Q&�]U��t��&_J�����d
6���PK�R?R����G
% test_data/1_10^1_rows/4_many2many.sqlUT
�h`�h`�h`ux����Mo�0���
A�@BB�z�� �~*�i�'*��jj��5�UU�
	��C��~�b[,�n�yY[�+�u�6P���j��s�[D��nm������^�5���h���re�u�����:X�.�����$q
��n��������=��C�O������!J���!���N"Wo1����)����l1K�W�2��&7y�TN�dV��)9�"�����e$N0��II�)Y��Y�<Aq�I��b�4���O�W��'��\.
'3B7yWDh�����O�� 8�����L��,�LcN)>R��1�	����	��s%��yS&���
;?���H(Iyi����~jSh\G�S ����p<������S ������ ���JMX+,4��<(H?��(U��PK�R?R test_data/2_10^2_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& test_data/2_10^2_rows/1_referenced.sqlUT
�h`�h`�h`ux��������q@�\OqC��v����"zE�d����8pb��?�;
Err�0\29 9�Mw�������������?�>������^���~�O?�����__?}����?~���~����������~�������o��_������_����__�����~=�����w_�������/��������/�����������
�����������G��k��������W������G���6��i��&�-6�d�6O�a��'����n�r�I7l�����x�
�o<�-O���)���l�x
�-O���)�`<���`���[0��a�����Sp���)8�����i�����Sp���)8m�����|
N[p>�-����\O�e�����Sp������\O�e�����Sp���)�l��\��~
n[p?�-�����O�m�������
�-�����O�m�����Sp���)xl��<��y
[�<�-x���<O�����P[�<�-x���<O�c�S0m�|
�-�O���)��`>���`���L}�� a�S0m�|
�-XO���)X�`=���`���,[���e�S�l�z
�>r��)X�`?���`���l[���m�S�m�~
�-�O���)��`?[��9���=��3��C�[������\��`��'�7G��>��9�����������o�o}�s��3��C�[W�P�Rs�FW�X���r���6^l.�x��h�����w�7^n.�h����z3����f�%8]��p�3��gh�@���3���-g�9Ck��s����-:��t�3���yiUWv����m;�Zw�3���gh����3@���g�<C;�z����m=c]2�U����g>C���|�6���>��}�3���gh�����3����g@C���G!�*4�
hh@��4���-h�ACk������
-B��(4�

Xhh���KW�����
�C��@4�
�hh# ��J4`���hECK������
�E#��.uU�hh1���f4@���h�FC������
mG<Z�|4�
ihA���4��HZW���v�$
-IJ���4�&
8ihO����4 ��Mi�JC�����v�,
-K��U��^6��
�����Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[�q/����Rh[
l)�-���[
mK�-�����B�R`K�m)������� 3�^
���A�r��z���A����!t��;B����%t�	�{B����)t�
i[
l)�-���[
mK1��/][
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK�-���X�2���-�����B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R�{ISW��B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)��|��bK�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)����y/U���Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[
l)�-E����*���[
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK���q�A�w����4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi���EW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK3��%][���&�4�-Mlij[�����4���mibKS������v���h�)��v���k��MW������$��I�������,��K������4M��������-MmK[���&�4�-�u�������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi��|TW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK��g��*�4�-Mlij[�����4���mibKS��������-MmK[���&�4�-Mlij[�y�{������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi�}���bKS��������-MmK[���&�4�-Mlij[�����4���mibKS��������w<���p4�	
��������miaKK��������--mK[Z�����--lii[Z��������mi�;xCW������--mK[Z�����--lii[Z��������miaKK��������--mK+�@][Z�����--lii[Z��������miaKK��������--mK[Z�����-�y�����������miaKK��������--mK[Z~��|�'��G~��~����G?0��@�U�$?�A�S��$?�B����($mK[Z�����--lii[Z��������mi�;�JW������--mK[Z�����--lii[Z��������miaKK��������--mK���e�*���--lii[Z��������miaKK��������--mK[Z�����--lii[Zy�����������miaKK��������--mK[Z�����--lii[Z��������mi�0��bKK��������--mK[Z�����--lii[Z��������miaKK��������wp��yGG�����������micK[��������-mmK[���6���-mlik[���������mi�;TW������-mmK[���6���-mlik[���������micK[��������-mmK;��W][���6���-mlik[���������micK[��������-mmK[���6���-�yG�����������micK[��������-mmK[���6���-mlik[���������mi�;�YW������-mmK[���6���-mli�9�w����}Gm�Y�w����}�m�y�w��L��#�u�;t�O��c����;x�O�����-mlik[���������micK[��������-mmK��Q��*���-mlik[���������micK[��������-mmK[���6���-mlik[�yG�����������micK[��������-mmK[���6���-mlik[���������mi�]}��bK[��������-mmK[���6���-mlik[���������micK[��������w���iq�Z������t���m�`KG��������-mK[:���t�-l�h[:����t���m����DW������-mK[:���t�-l�h[:����t���m�`KG��������-mK'�][:���t�-l�h[:����t���m�`KG��������-mK[:���t�-�y�������t���m�`KG��������-mK[:���t�-l�h[:����t���m���4JW������-mK[:���t�-l�h[:����t���m�`KG��������-mKg�e`�*�t�-l�h[:����t�������n~��]��w���n~��]�����o~��]��;���7]��y�{���7����z��t���m�`KG��������-mK[:���t�-l�h[:y��������t���m�`KG��������-mK[:���t�-l�h[:����t���m��]���bKG��������-mK[:���t�-l�h[:����t���m�`KG��������w����y�m�}��Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-��kTuUl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����2�z\][JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-����w����-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�R���ZW��R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)�]S��bK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)���������U������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�����4���>���PK�R?RT�����' test_data/2_10^2_rows/2_referencing.sqlUT
�h`�h`�h`ux���X=o#G��Wlw6�b�83�U��J��I�J�R&@�4q����Tl��d�V��|||�����\��=�����?/��r��o�m�m��O�u]o��������_�|����.����~{Y>�/�E������O�O�u��5������t�n���*?�k�}=~�r����aY��/���|�-�l�a����zY��u�x���u�5�������W������_�h���w7��������dy�TwK�	�m_u�:`5�V
V�e�����`UINX���/Y�b����Sv4��k��e�j&=!<���gq������4��E���8LV���L12��)��$�~TeHir�6��,P��:+8�D����S ��8)$P
�T���l�X�!���TV�4TU��K2�+h@�(U^L����*
����2������/���b�G����*�8a��4K9�����x!����L�QP�GG�J��lwn�UoE��\:��(
<O�N�W%�@�x�0"�.��zC@���a�!,��W�VDh`@n�.f��#(����������H/'	� tEch��54
c6:+Y_
�[�)/��"�]op>�>g���/�����O��"�S�L>1H��9n��j�M�A��5SL%��u@�������0���j�E�$�:ac0"L$�?��(��8��w�P�d]/���5l�AQ�X����:�#JL]R3I0�]U�4�uE�I�X��P��"��@���V5�~Hl���P��O`�^%�@���MB�J@.t��
�����uG����x&@)�dW�dTe-s�C�+d�7j�����ZZ���*0�t6�m�d��s�@���d�����*����0���a2�{�TD�*��4l�(���DX|4�1~��}t+Z9Z�~.����4'�r��\�V��X�����
h]'N4��
������.F��1X����������G�t�i��W1:r����o��#�:��e
�u�u�����S!�Y'�\����"F���q�� A`����7:h�"�Fh�v�(k@���@�b���O�\�"�U}�"�����;�F���n	�G������B����M����
����\���ef'��'�C`������o��0���V�w��PK�R?R���X��+ test_data/2_10^2_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux���X��TG���c�fQO�J�������=��D�P�H"6$��DQ�=u�HAH�f=s��8���v=���������=�/��%��O�n]w�������l���������������~=������p������������eYp���6������;/������rxy�q�j�������2������e����f9��~8�.o�����o���������9�����������i��x^��D_N�!����7^����*�:���s�����}�J�?'�fht0_����������r5�	��\i��0��)�o}�k�AH�'��a8Oh�1a3��q^^��:���l�x��+~���l�~��qB��fT��q��S��#P���S������Ll��������rq�[�idK�0\,H��'�]B�{F��P����>��j/�$|cP�F���3J��_��	!�.�h�faTv�?{r�����Y�2h+W��Z�_�n�I�)����2��Pi���(����Y���P1�-���]����dG��U!tcH���}u�kZ��F{����R��.Q�MvD��sc�5Zy����<�(EK�p4�Rud�C<�L�D�v���8,%�x������>������a	����fp�r�L��*s��P�jgw
1,/ `IA����k��T�*��.Gy
����B+��iC�2�1j<1n�`�Q7����L�1�w'��>���UBx&���:	R��C���CU�������a�����h#Mh�(�Q�:!)��%����3�Uu��P�
����N�a���
������:�q�d�V\NP&��_��6��6d��&��o��C�I��eHI#�N��b2i��.
�a�=��s�������q�A�����O&��������y�h#9{X���tD���Y��#B�"�,d//��Bx�q#��C��PIa�X����S�%z3C��p�/Y��Dv���{�n8^)����@��wH��L8+�0"��,����Y%B���}�'� b;l�T@l���5/��`G�#��!c^��u{����:l�f`F��@�,�s��:9����f��x�����v�il�����>�8��'l#r��g�v�K�B�8��u2�W�
�W�ZV��SZ����-tC�!�?v����N���c�v(���T��~!��pN�T�����,��=cD�8�-m��?�7P��k\o)2�`������_]��q{n�m�,�y���PK�R?Ro�V�))T% test_data/2_10^2_rows/4_many2many.sqlUT
�h`�h`�h`ux����KoG�����%/���^b5	F� �'�����E��W�\#���;_X�����u���k^����N�����_Mw�x�0�zmy��|:�O�/�^}�������^\�z�;=�}��=]�����2������|����8��{����A��}�����?=�?���Oo~�_M���_2}y������_O_��?�p��}��1������7WM�����a����[��7��}����i�}t������7?�r���pq�%��i�QEC��
�^N�����R����+r��=�H[[��
BA�<��m��
6\�l}i��F*���]N�PuWIlP}�-��������/�h��x����/�h�%�+�p��p�
��~�F�(�����R��
������T�a�mQ�S4��o�u�k�R����S�������+���/A	��2�?�cg����[����B�7,��������1a���i���"������E��Jv@�:�#�A�  ;��/r� �.Dr�D��U�2��K0\W�H�#\E'?I<r����q'0E�f��R8DX��P�����t��wn����a#�Y�Alqn�jE	�{�Z����t�w�>�:B �V|C�M��6�8%��F���,�,*"�*����^�2t`W���������4�)����;��2���VHd�6�s���������jf^`&�X�?�$����C�d�X�br+��&�i���yB�S�^'������:#)M?���Cs���4\F&�#:�*nt�'�D�i\gDPl�z/����J*��uf�	���5��k��6 ��J���z��'}�U�Oq�_<������<\���;�Z}��.�br�m�tD��T��y���W���5�dR%	�4\�x����C��]b�"�{YE�@RP�O��n���N����A��aQ*����;��R>pCVJ����R��p����$���`\Q7W����uC�
�M1��������E�F��w�T�w��Z�+�5�@�	$��p�+��� �=kk�Q	U6��PPT���Cg�]v9T��
KT:C���+J
�S��(�C���!d��U����'$�BJ"��^fYy�UxCNE��V�h%)I�L$��5v]��&��X�AQu8+%t \�z'Cyb�"�[�-0tcC�4�n�p���
C����.�e��@\����
)�qj�q�_�yT����}�,�$J��}����;�h~6Z��<j��;&�u�H�[���Ik@�%�'&��%����P:u
���tG+l��l���P��l�:h]��d�EM����;�H3��.�k��b@2g$`$%��5�5���
X��2+)	X����iV"��n�x��HA@R�.�V�����*E,�&����%���!��-���5������H,���D4�1?*\�*%C}(�#�8�!S�jW}p������C�0d]��&��(;K��#F��H����V���R����K�(&U}���;'������$��g�� �P��6��T�
E�����y>h;X����T���N�B��+�����X�k�fQ\�6��i�!���zP�zv��	�$|��1'�/�5��9��n:��.$�5 �����1���
3��Y2�'`@g����-��!r:��zXTKsG�j[���vD{6E6:�&��>�P!z:����c��B�%�M\�!�`�SLTw4T��Q:�p�VbQ�@�X�[�����VR�pq��(A#���i��b�d��7�y���WQ���K���Yl@���w/j�,6�X�b��L����JT�T��PCM&�.U��67d��Wb+���;+��J>��.K�?���K�L��En���
���.S��Ybc.zn[m�r�P����0�_�Vk���38����I
l<R�@����z&i7�6\����e�/M\��]v��p]�n	��FW�H��������p�����`1����YuU�bn��Z��j�M	�$
��O�T{�
X
|d"�����P<s��������|��sC>���PK�R?R test_data/3_10^3_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& test_data/3_10^3_rows/1_referenced.sqlUT
�h`�h`�h`ux��������q@�\OqC��v����"zE�d����8pb��?�;
Err�0\29 9�Mw�������������?�>������^���~�O?�����__?}����?~���~����������~�������o��_������_����__�����~=�����w_�������/��������/�����������
�����������G��k��������W������G���6��i��&�-6�d�6O�a��'����n�r�I7l�����x�
�o<�-O���)���l�x
�-O���)�`<���`���[0��a�����Sp���)8�����i�����Sp���)8m�����|
N[p>�-����\O�e�����Sp������\O�e�����Sp���)�l��\��~
n[p?�-�����O�m�������
�-�����O�m�����Sp���)xl��<��y
[�<�-x���<O�����P[�<�-x���<O�c�S0m�|
�-�O���)��`>���`���L}�� a�S0m�|
�-XO���)X�`=���`���,[���e�S�l�z
�>r��)X�`?���`���l[���m�S�m�~
�-�O���)��`?[��9���=��3��C�[������\��`��'�7G��>��9�����������o�o}�s��3��C�[W�P�Rs�FW�X���r���6^l.�x��h�����w�7^n.�h����z3����f�%8]��p�3��gh�@���3���-g�9Ck��s����-:��t�3���yiUWv����m;�Zw�3���gh����3@���g�<C;�z����m=c]2�U����g>C���|�6���>��}�3���gh�����3����g@C���G!�*4�
hh@��4���-h�ACk������
-B��(4�

Xhh���KW�����
�C��@4�
�hh# ��J4`���hECK������
�E#��.uU�hh1���f4@���h�FC������
mG<Z�|4�
ihA���4��HZW���v�$
-IJ���4�&
8ihO����4 ��Mi�JC�����v�,
-K��U��^6��
�����Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[�q/����Rh[
l)�-���[
mK�-�����B�R`K�m)������� 3�^
���A�r��z���A����!t��;B����%t�	�{B����)t�
i[
l)�-���[
mK1��/][
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK�-���X�2���-�����B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R�{ISW��B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)��|��bK�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)����y/U���Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[
l)�-E����*���[
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK���q�A�w����4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi���EW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK3��%][���&�4�-Mlij[�����4���mibKS������v���h�)��v���k��MW������$��I�������,��K������4M��������-MmK[���&�4�-�u�������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi��|TW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK��g��*�4�-Mlij[�����4���mibKS��������-MmK[���&�4�-Mlij[�y�{������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi�}���bKS��������-MmK[���&�4�-Mlij[�����4���mibKS��������w<���p4�	
��������miaKK��������--mK[Z�����--lii[Z��������mi�;xCW������--mK[Z�����--lii[Z��������miaKK��������--mK+�@][Z�����--lii[Z��������miaKK��������--mK[Z�����-�y�����������miaKK��������--mK[Z~��|�'��G~��~����G?0��@�U�$?�A�S��$?�B����($mK[Z�����--lii[Z��������mi�;�JW������--mK[Z�����--lii[Z��������miaKK��������--mK���e�*���--lii[Z��������miaKK��������--mK[Z�����--lii[Zy�����������miaKK��������--mK[Z�����--lii[Z��������mi�0��bKK��������--mK[Z�����--lii[Z��������miaKK��������wp��yGG�����������micK[��������-mmK[���6���-mlik[���������mi�;TW������-mmK[���6���-mlik[���������micK[��������-mmK;��W][���6���-mlik[���������micK[��������-mmK[���6���-�yG�����������micK[��������-mmK[���6���-mlik[���������mi�;�YW������-mmK[���6���-mli�9�w����}Gm�Y�w����}�m�y�w��L��#�u�;t�O��c����;x�O�����-mlik[���������micK[��������-mmK��Q��*���-mlik[���������micK[��������-mmK[���6���-mlik[�yG�����������micK[��������-mmK[���6���-mlik[���������mi�]}��bK[��������-mmK[���6���-mlik[���������micK[��������w���iq�Z������t���m�`KG��������-mK[:���t�-l�h[:����t���m����DW������-mK[:���t�-l�h[:����t���m�`KG��������-mK'�][:���t�-l�h[:����t���m�`KG��������-mK[:���t�-�y�������t���m�`KG��������-mK[:���t�-l�h[:����t���m���4JW������-mK[:���t�-l�h[:����t���m�`KG��������-mKg�e`�*�t�-l�h[:����t�������n~��]��w���n~��]�����o~��]��;���7]��y�{���7����z��t���m�`KG��������-mK[:���t�-l�h[:y��������t���m�`KG��������-mK[:���t�-l�h[:����t���m��]���bKG��������-mK[:���t�-l�h[:����t���m�`KG��������w����y�m�}��Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-��kTuUl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����2�z\][JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-����w����-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�R���ZW��R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)�]S��bK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)���������U������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�����4���>���PK�R?Ru�Hs&s�' test_data/3_10^3_rows/2_referencing.sqlUT
�h`�h`�h`ux����M�&�Q������-���;S^5�;0�=c���
�C�w�xN��##�:,h5=�z��"##N�8���?����/������{{��������~��|���/_�~��o�����_~~���_���_��_��?�R���?����������?���������5�����7���/�����q�/�����?����_�|������~�������������|��o�x������wy���}}������������~�������o�{���~����^���|�����}�����Y�7oc��m���~��&5n2W\��7o����6.���=.X����������g�W|���}�.=�?�U��w~��MF��_�������<���[�k�������*�xq~t�+\���^���M�d	^�R���/�^�X���'���x���&Ek/P����~;����OXk��M�`s;Vk�
��[��{��6���N�H�����_V�2�2������.2��*s���mY���x>����e����_!����Z�f^���+����cU��������2�0���/�ZJ+��F��0���[-��b-e�5vv�dVX�����%��=y�����G�����^����]���r^K��q����0�w��s�����|��T��S'N�pg'\a��-�um��������������}=��
����k�n�6F���X,���.�ac5Lm��aC;Z��I�e�=�S�����tk��]��XW)��cIk��b�l��;���
[n�wN��Z|���E�\?u�>d
s���1Vx}��#���������pW�t<��q�9��p��G�����T�8���q��8;�s�W|���}`a���Z�Q6��x���y�x�f�CG^���8�<������*����A����~���]'�	�\�Xj����<���mU#{Icz�zSTD�3����+:1 '������mr��y���u��&fD������
^v���L�8�x�~b�F��
g73�sGP�	�c�a�Eg�	o[�e���9r�Kp�}�����A�l����gK�]d�'��#�s����r~��
Nx���k�0�K\���2���W}n�K�)���3���W=Y[QI�a�1cu;���`����Mv���<��_����'}��/*U�/�n����qh����[^+�eD�[n*�e7R�-*,����r+��[�W�-o���N���sh��8mj��4���gYh�2����,�~7"��r;��?K����kk\���
����|Z<��}�h�m#�>X�Y���l}����Q�[�H���("C������z����cgo��#Lo��.��$��4`�K�)T�k����}��8��9��%�|:�(��L��K��xVH���������������u>b=2�a�fE��	�:������Z�O*�E��"�-��+����\��-L�"�&t�~s)��[���n��Ex5�x����E�w	@l�PKk����,!��)3v�sr��-����f��������)F@Q�G 8�S�Gm%��y�
t��I���������Q6,��GYXYyj���!�A�����@�����
�qN���.�-�O���E"9)��;��T6�W�,��w��$;`P�Q�l>���x�p~��V��_{��D�x8x�<*�|�1��z���:�����"����S�����g��L7r)�F4]z��oS,��S��)v��j��X!Wxa0�cT���u+��^�9K�g�Hj�y����Pu����:���zD_�@%� �����#��n�A��"�����G���~���KN>����wi���e�y[�����J���GB���xbX���M HN|j�t�:�hd]�p$�|����,~���VJ�I"��H���r�;N��A��~��0��2���P8���U�	4������T�������(#:;db�b���C�s���������#�}�l��jBV.���k��-5%�LS������A�6��"(����N�b�F�|k7|�
+�>���t��rn��(AE��<Mh=��u����'����]���0L����a��ap��nb9�p~<���n�Lg���^M�v�w���tb��`|�2�`����������������+<���>FP|C���	����P�|X��/^��������D`H:a�E�����
�?}��Ra�u���qJ
���9�����c��^�a�����T�4u(D�Y2�U
�'�!����W��r^���<'�EZ�pLZs.��L(�N5|v�O�`�����R�|P�Wf����L��q����%!��P���9�O���LD�Y�'P��<�M8/�-��Ad_
����PKf
�e��I��9Vl,w�����Z�w
}\�y��3O�4�uJ6#�\��w�~�da��#��kRs�C��S[��X�Yu�O�����T84f�,�9��R��D�\l/N���U��j�^U��g4%��:d}U�.�t��+�F*$]�@�w6Y��G8���j�����j�T���@�R9�#�&��&#�pK,�z�����F��4��	��d��y���e<�J����d�w*�����/�LU�r��U(c�6��k�3e�FTi8m�R�	���
���z�+�m+3�3���l{���a��>�b%�sJfc?Xk���a��P:8�;�e|mU
6)jlS�{��*(��i��>��T��8A��0�"O��Q�4895�������r����������}�,�4V]�0��@��`���T�@K�6#z�16}NK����>��<�����������|@E��C}���i���&���|p"�k����0�c��U%�����lf�c�@�j��,:g�*��_��t������$��l��X��@��
+����'D�� gWU��UA��C��i0u�*T��p�Y�*�����:��:��7�ee:���Hp>CUA`s$C��D8i���� G8�+�@z",�u��� �U<:a���WU���z��:1��*S0rM
��%�o�&���36���f �ZSk��/����I��'��n1���O�eaYB��{�����c����J��":y�-������
xD��R��f~@��1�}�����>c�Op�I]�!p"<����F��2�t<�I�6���YU����*I�NR)��b������Q�Ga���e�g���[����g����X��I.t�G89����o����eX=�l�k�@F>��D�	������n����*RK���7Q8�n5�f��-�J�NG�� X�N����#�C�]�Q��D��[��x-FM��3��<���J�b��M`�t%����pnZI""�N���v~�r���,��J����3�0���#��&����9�8��0~Ba�F���rC��Y(��H�����g�B}��@����l@MX��}���g-������$���0+����Wj5;��$;�8�sh��nT�����nGdF��	�?�H���	�Z���B��T�yy��:��'�~�V�@�#�#��_��6���FAH���T�YiI���8GR*���!K"����AxhI�'�����0FK���	V�Q+i=��j�xN}����A�n���w6��|z�-9�������c*�R����:G�?�!�:��&`~��j\��P�1��#�%���y��#KXN�"�N��c8�D�{��o�,��L��&�};�[I��z����Tc�T��D�k��6�[�(�=m��xl' Lh��5�1M�:�6��nY�%w?<9u3`�6�4-��omPm��i�S��Oxr{k	��~�~�dK���	\�����V��7�]P��0�W:l	��lM8l����)9`��(M�����������a��q�$h�G[*��
f�V�^�Ml��	���R�q� ��	����T��F�jK��cXP������S5��\�TO�P�Bg|sv�&��Hbo�����6�
N�mKp���a����'%k;%)�r��8g��np��������z�Xy>��s �#'(=�_�t~�}���+lht]��K7��_��1d�� �=������W��&���qv�@w��*����]�;-s�Nq(�Mt��z��i������T�2�
��E{'c���x�cS��+�����.L~Z������H�
�1�[m'�d�N.������+O���qBw�4i�]J���.X������7�gO���b�G2����t����A��V��%�)�S<
����w��y�����a���O���{*����aQ�u#?���;j�������w���b�wzJ��U�5��.L����F��G�L;��!^��q��7��j��[���@�{�+)�w<��Q�������4��A/�	�o����
q�����n�7]h���&�:�$$i��sq*,��gx�����=q���R�FT�[va>M����'�������#��|O�����[�>������,G�����YOiz����s�'��������&s�2�N$RUXR=�g����G�.SF�v2��c��J�������,�pw�*&�Md����vA��=������>>��<�Zq�6�����>�r�8/���y8{��eOp�\^kP��Z?J�A$p}}�u��;m6��w�FA%>��7
7�#���1����b5.�	-'����g���;;zI�>?mk��~������B�[K��yM�!��W����<��85�T(�2���zj��2>x����@Af��.�^]%h��.�(���1��z�ulv�Kp�9V�a��X��jD"��ps�>"���2�Y��j�%}�_�s�������A�a�D�t�����~�|1�1�N�s������\n����m�t9����	���#j�
��'��SPgl���
�z�7�����������$�B���[�)�qg��IC�5��/�w��<G��-V�4�g�����7Zn�KS�$�N"#D���i�ef\��Ja����l8�����J�u���p�#�y�j&BX���a[�Jyi�"!�G�h#a�@�$J0�U�!x�J��$�Lkp��R�����j��!,~DZA��rJ���������VBQ
�:R�~A��TbCj��pF�~c��o�j$�.@:��C�� �D����gq��$���8��~��g	�;���\�*��[g��#%�q���R��p�>
�.����Y��J	_����;Gr����>��F�2n7xl#��-'|��s��#�+1i�9���5�j#�d\�M��2<��H�{`=P5��`������C�P��C����i�����X-�5g8�.�H+������G��o}�-�'�YUy������ ����S����#R0�qC8=\�u����Gj��A�,���=
�r�f��F/Z:�8�3z������&Z�=�"hr~8
��+�
��cz�a-��G�
�y�sF��R4��!���5:rv�J.����c����������4�6FB�ud{���?rr����i���������83G��t�{&�$bwA%V���V��a��U�;z0#��N����"j5��!l~:�L�<t�(;���b6��G��h�)t��X�eVH����x29�4��D}���������d�D��>U��������c�������Y4C0�s�W�q�#b�<�p@���t��E]�Z��AU���;��`g�y�4C�������v'����Df6�������5��krN3	X#���$r���s:R]�����C�u����!�K��S��D�J�9u�
!�6�������������B�!o��/E���7��D@���q�k7�?��vF��u�F*�\��#u��F�� �(y���$	z/�'�3���������$u���R�0���z3jb#�;�����Q'���.N�[^?�������OS�w
n?�g
d�[��f6'`��@��<�c��d��Q���>K�8��Xf����)���u"X!lN������-c���o�����)�����b4���UK��!�
���A���1�+g"��&"� `������
�f
�w��35�K�S.j8s�l\�hM7�g��z���x����%V8 �:*��h��>����HO���S���.������
nl�x��)\�%���c���J�L���5��>D��,o��3�����e
���Y)D��x`�L<����gK�_I���A���x�[��1��+?R=���B��
TR��i^:����������Fc����Y�x��jg���k
���5P����!SQ�dBE�x3��7��=����e�T���#*��s��sB�9�9*��-;��k^-��.JW���#���!5S���<�C9���B���bp����n��3�v�{�1?�5��l����#��d�j>�1������"��dS��	��qtf�A10���6C��)e���SX==���������q�fkeNc��3������$�kg�[u29O-�W�y�u����Y�F�`
�o�w&S
��=	�G5���eD���h�)!7PL6�tw��++�N��#���D����R����(�=�3%� ���Y~��R��n��5Uq�������l�Q<�+uP��S��;���
L�������.�!�M=�3�:��0����A�_��a(_}|���Ixcv&�L� 3��R�
�!FW���1�<�����6U�8�}<��������h�K�O>)S6�TG�B��,���I���Z^d���o�Epz�����f����tV��Y������V�#��@1/q�NE����:1S�9����������]`�B���A�P	�E�g`CK�?�.6N�f	�gb;�*�;����R�C�8��"���S��%�o��RE�����IR�N)���e�#���@e��=��ALh.��:8��[���B��1��*�HTQ���>s���Z9=��[[����=���Q�]%��p%�Z������PK[*
�gonK��u�#�^*h>0#�������0M�NN��R]��BWM�tOB�e��7��%���K0��Cc�5������
����� �T�����(�.�4��@������@����_��5�� e��6��B�1h&����$�8���O��AV[9@ve�������s��,��LW��Dxv�Z_)K����7rW��!�T��=����:*P�E�������q8��88���)7=������2��
�G�1Mc��juoe�i���-:a�J��U'~������S�_�N�$�P?:����s������((�J�fO�%����]���t9���kg-��L{�rl�&��$09��k%��26R�f��ue
�O^a	�G?���J���	�5�c�Z�7�
;M���(n����n�Jt�o�*v��"-a��	v����(�	�Q�[��
��JH����T����r�pF�wGY3�!�ZaNa|%�Odo����!�2���=!������)�c�VV���*H��C�B�Eo�q�S�����\�'�������[��s�'|/@��0[\��C���r�<:9/�a��CK�a��}4�wH��9dwr|[��cG5��k
A;Cgc%����{ �y� !��@�������A�s�����df	���������%�8�raB�7�v���X��!B�w�cR�~�T���I�\R<�t���@�VoC>p%��4��9����nO�t����I�t�����t���S��u�gLi��J�d�&d<�d'��i/����Q_�I��s��}�$��q����P�= �&�`_���q�"�z��!��L��B��!\�S�����B����1�(T��S�u�3�q���n�X]����hl���zL��� )|H�b��	Z��;��l}#�����7={q��u� yMp3`�]��nl�7���i�|v���eM�*�]rv�J����Q�&��R^���j�n���.��
���C�DV#��(1�*h�4��[�>���������[D��U�$��U\oQ������y~AR�I����w�^����}K� ��-
9�'l7��;�t k"(�[vt��
�oz�����+"\��Ziz7��-����8o�	F;�u>������S�~�/M�G#f��/�Q��f�?(��6.U�E��I�5�
�u�,�1�������{
�,���
�	h�����N�|#������0���	��Fy~�������Z�c�����]��#�Ju��������.3
��]�c�07�����h�D�8�.o&�N!�Cl�?F&�S�E"����636sH	���s�PKd_�(���J��)IN5�X��5HcI����X^I4��d�zNU!����zm��C�:����R��n���xqhu;��:��`�B�l��������L�vO"<B0�W�)'x��0���T`�{j�6h�[>�C��9*<[�0���R���B|��x�}!
�I�$|:("N:P�c�~�d_��"�v��|:b�[>����ab�_�f�[�);��|8���Cg��$��lc�����`�H;����@��&�@d��v�- �Q��i��N����+K�q�T����(m������S�q����n��`|��Ck�O���86.��M/�2'�8�(��]OG���a��o1��$:�\�y�;�v��N�r�����vp���x�TOB���@�8<�@�m�|��J�0*6.c#�:���Y-ij8���V��&��znF�7��c�����Hg�CJ9�����J���b�����7�>"k1��GGH>*��z����|j�0�'^��)�i�o4���92fGH���[+3B��R��;���;���������|�#����ID�l��{jf��
��]����24��R������!Hs�S����qr����$)Sj����w��H�u�x��pj����#��oC'1��{��8JG0=�U��(9��I>
��S7�8��H�v������ ��?R���2����#����i`'E�5lZ�e���~U�|q�M���`�F��$}��0�O�����F��2R�_[���H�N��8�W<y&1�{�1����<���r���+L���(��_;��������6���o0�0���+�du{a������xdt��a �P���c+�������8h���9����W���_��8{'��%�g���vd�dJ����������Qd�����N�ubA����\��k��~R���'�vf�W�%2�B�%BJ�������S��|&qO����6HCg���rv���T��"a��[�Np����*�7���G$|-�T
�cu���9#�eM70��>c-gH]|#�Z�3�'r�F��#�����8I��zj
�1�plL%>��%�����D�G�:	�_I�*j&4�O�C��������&99��kFI1�����0�N	�Y��e�	i��2�F���@E��L���O��vUs��=z�I9|�������hg�W�����>���Nq0�KT��3Q���14����4��7[�)g��O�:1�0���pm����OZ�+����
k������PK�R?RD����&��+ test_data/3_10^3_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux����M�%�q����N0���Lh�&{����gd�0CI�F2$n���7�u��ul{�u�#22�������>~��_~�����?���?�������|���/��}��_��o�}����������7�����?����?}������?�������k���������|���\���~����~���o_~������_����������o�~����������������_||����o_����?�����?����}���������������_�)����������������u�?����o��V���X�����o_���������}��>�l�����������,����f�d�����o����Z�k�j����X?�3����U��UKw}�1�����67O�_7��;��<^zbi=%V�~���_�\�����u�}���R��h��{=_���xS����X�	�1�^o�����t���|������������X+Z�K��kY-^����z�W
�4��F���^G�a�����J<hiq���w[���.v��e�n�_I�d�~��k���+���7�����S�����p�r>q3����>����	���������vLh������eG��z�s��P������wy�_4��j�0�[�o��]����i��xR����f��n����k��u�?����[��f8y~�u'^�\���aN�z�F���6�t��,�za���y�+���	��OYR��8����T�[.���Mn�P�C���������P�cV'.�������|T�����
�z�z/{*�c�u�(61�c:���[;�#��FL05��\���2��v*���=�@x���g����+����b������C��6�$
�yt10�y���j
��s{r_�K>�����6^0����r[q��_w=�y��������	��
9�b��58'��O��S��ISv�;��'x�Cy6m��jvEt��\���<��!h]�!-n�x^,k���m��u �+���5�����_@q����|W��W��<+�d�aT����pe��z$75��S��:/����c:F�����8&">�;/�M�y,��F�����T�X�
w�C��^h�n��|�Q�����Y��D��#�1��]����(�fD��*�����@:^��4�-+���(�1���X=<p8���3|���ma��yd���%��0����zl��9�/�]�q�Go
�+�?�m��si�����pqwp0�2���#����Q��W�=�����9�OAO#S=�+`}�"�������G�A��{���"A��[�w�Q,���g��Z�+F@D^iF��+"�p�#�j��\�)B����8���%�s�F�����]#�-�"���b[�c���,��(~��"���`�\X_1�2��8i�|�����6�3��u&��nF�������t�%�(����MY�<�
��!��=���1,#�+��KC1����q�e�j��@?����_7��"���"���0������F���
��^�z{�j8�W0|�������~��`�j�3����m�A
���
:R�Hk���k�����a��^�p���#�k�e������q#��g��E��\�m	``r@��F*[�����m-����g\���_BJ8�8Q�������q����8��[��'���u[U>�b��8F�hj1�!*��F(z�T���������r��=��f�A��Z�!�N�(v�y��%l�b���H�?p��9zzX�vN^!�m�4�X5`�"��@�� M`N�u��k���1-!�%'�)���T�����F_���|-h��y�?^�yG~��a����ZU#r9.3���F�ao@;N��m|��b�yYPQrd�S����X�xvk�	�����A,������pPB�����D�=w&,�EA1`��l� !�������k�ld�2�j&��)���NM�P�O����kP���#�0��
�o�~�@����dL�]Nr��4
t�����N�2��)L`VcS��>]d��	���g(����W%�a8	��)�80�PM�~'�:YO�[VR��w�9�C��y�Q?Ag3
%����C7�+E���e����5���q�<.��GV8����
��rT��%�6'v���v�uHl����	$;|��Q���4�����Uj�@��h����&�N^���vB�������SD);����KU�Ot����� %��0aZ8�E%���2�T��~��O�����8��<��~���-�������H���SO�f���Z��1�4��l�*ui��U2 ����V�����q\V�:�Z���bLUU�!�f ^R#�PU��M�*8���q~��]�J��qa�e�D����8�J�p�6�������LQ�a
_I��X��5�Y�+��T���,����&���r�����@����p��D����8;�c����
j�.���SQi4��8r��7��$���U��+�I#�Iu�TU.C��u"������)z���jV�	V��K�OI��&��
���R�+�4�(0��*���t�����l�������H����Yk2{�0�e�V��2��q�������/�>��J��a(I��-N���F����	�GpJ`��S������*x��*P��������V���m�R�,(~��v%tX�}F�$��i�����r.�y���	��yP�$�5>���C)nC�#��^��
�o��HHw����eI�7�����ic��@�&�1����W���q�I�W�d����
����(mq�W��*��+
s��uW�.�����`�~�W��c�k��2���k���
�D"^�s��3�P�`b�����j
�h�7UX>��0��*7+B��@�*,_�cV��������xCq��q���:��h�rR��$&9m���Q���"m�������|��
�!��^�!E���V��8�� ���:���Si����xY3NA�KT]2v��z""�����#:�VD���U���@����?����(��yU�7_WFaJ�9-�n���}��<F)�q���c2���Va�����9��Y|�vg�p��WH(C��h�1��z��S�#c������xW�<4���:1�z�+���BGdI86��-�����s\���������O������??�8�����1��������2�N����t������B��IQ�������x����m�_��t	�_|E'�*
���]�0S/���g��&��B�O9��3��0`�&��������T6��ad-M0���n���w�!�:���d\���<�	��
JC�>���T�:.�y�%O��O��&���_K�~���Q�t_�T}��Z��9k�7#���A_h��V�)�60=���	���Uq
I�qu�������hy��������:�R5����Qgi5q��?�NOR�����n#!��c��@{�[�
�:gl��QF\AqC��^����C��2���`����Iw���4��4A��'G�
u�F!�	�/��	�_F��	�w���e�����_��Z�������M������0��;<�&�7���8���.�R�f���=oY�������U~�����(�:1��~��b��-UvbG�(evT������	f|�d�����Vr3J)M@>�0�H�[r��
B[��\�	����5�1\C��*#{kB��"it�(I6A�}��y6\�w)d9E�$v���H��aRM���3��'H�6$A�0�e��4��d^x�������#���#��B�~��r�j����fb��������q��S"����{�i3=S��5�����S���:���pD��%nt9�pj�N�����u3��"{���CVk�9(<�*�NZ��+����"��m�����)���y���\`?�E4�M'��OB���8�N(,x,�����0~z�����&�?@���������
��Z����TK��!u�?�{�h�Pm�y|�����$�f�w�S��L���dA�N����yp�)�y"���c:�ZJ� �a7Sw�%���uN��q����{��E[�*x~a�� [K�=���2Hx?c������c=Y3b��|�mtm5�p�fB���R��J��/O&�	�G��D�&0�:���{G+�	��N�5��z|"��fd�](����=��*�Vr$&���)���B/�y�Y��p��~}
���T�R�yn�d������K�:�k6�U���KO����B������;I��WLC����%�
�tI�>vtq��o��j{�����|@Q,>B(��a���O����v%sL�����8���~XF�����F_������Hp{��� �;�����yW��.�c���F9������%��������4Cl��9bc���N���3����jv�����<e#��i�vN�~���W�~����Cp.!��A��I�g!����P{��NX�SX��%0T8N�'VO��;��-���p���6��K)�C�Qg��9�n��;��b�'�li����8K��F1�_7��W���{}G<��T������P��F�#�X������c���0�T]@>�|��*IB�F��}
�H ���xz=I�F
��r>?��%H���� 	������i��J�B�i���T�G�B�����W�VRb�M�Y���su�v�Q�\&�Q��#1�T�/5E�	�vA��-B,c�8v���t��.�8�r���!���C��@��
���~|NX#�hN���!�������gw!���<�l�6�t�N��$���;)�\����P�5^�4@�.X���f�X]�>z�e��`H[����J��o��B�)yU'��?+����!���Q��B��.�
�v�����O)�w�D��
E�.D>��r�Oz���r�v���CNa$�.�>���Yd�.h^�rH�
�^>f#�	����9�'>�xb�� 5�	��G�r�����������������N�
�O3BL��W����|R���_X�Og�Vb����pC�I������g�	���~RR.<�q���s:$������������<W@��a:��|G
����:�R�����]I�u�?��I��x���asWQx���J"}�W�-]a�~��~�<����<Z���i#�y���&\%!�0��Vq1Nz\Li��L�������Q�(w.h,I]L�8����&y�o�X�3����,�(I�)Y���&�<��X�8�C<��[����q!��'��G�{�w���&G��
ZTaB���7���x��77���Z��O/X^�Y�>R����W�J�%�������q�����D�V_�f{���:3\���bD�C�=*�'@B��`$|o���T�����:`�M����"��
�9����Un��q[�l��qu��J:F�>�r�#��������#�������	�v�$5r9�VG��&����H\�lG������^��=�6��Z
�8��!8_L��p������F�h��f<�4E�~K:>����Q�aBB�)�p�M8����Ol��t�FAc��rX�c|���!�C�2��|�����B��P�.��pd|�[p��<�F>�MK�d��7����u��=����+)^+K��PF����7��|gr�������0�������	������a��w���uk��c������Q�	�;�%{�	��a&���)�ND�
M��)�wy�X"�=���������T����O��j��(��}�*�q���b(N*��}�(�_���cN�}��������8��
`'_�o�h�����|O)������W}�Q��#�v�9�e�;�lp�N�)�H����������*~�I8I���a��O�Km{lh.�.?�/W����u
2n�\o�i���!���ru������4B:���3�d1h��m��^�Q�I�w�'�Q�q~I�w .������dO�`g���x��{j^��X����d���c?�s��)d*1���d>�(S0==a�Ih`3�o�����Vq��g�=��>5I��O���T���;2��)4~,�;���a����EP9B���c3��#�������K��L��$��������39��;��(����������7�o�a�F*J5������C�mx�YSR���|fL���=5���h��e��z�W�1�D������=�����i�LF::p�0�A�JN�g7�������T�o7�}��E�1m��PL��Vw����3g�"���$�@�Y�A3��)��6�����C=�'8S��?�n����)0^m�j)*��=��<U���&��h&�!
XZ���Lb}$(L����r�pN!����)�@�8�-g�<���7�1�gZ�T�I��������'�I��7g�C>{
�C�iHLA��$V�ux�,�,/��9�V����T��Z"���m�����Hj����N�U>�(�����ufr��|9�R���T�����1�en���$���2x�R?
~���v���q�����)~C������u���X�C
]��E%;c2Z���r`I����$f�}f��Nb9?�x�h�Iw
gW��!H1S��x�����Y�L(���)�B��3������8���i|�d�������IhV��;��e4M��R�3����xn6�6
A�9���CC���_G�n���3���e[W���uO�-�t
)t�b��
�����2�?(E�������N��#�<P�I$"�e�j%������U*��f9��F�8�;��s�,G#=��n��% �,�������9���a�;{�|����!�"����~g��r>��z����	���Z���z����\i�z^^�z��H�@�A��=���b������<�Z5B����w|����H~��0G����4M.��8J�@|��y��;�x��}8W�u#�^����,+�o*R@��p	��}�J������������8�u)w�s������3�MZ	������U>A�n�+i��`�[Q�X"xb�[�H�HR��{4����}��3�#���Gr�	��X+C��c����9�G�_��
���V*�D�=I�U�U�0z��Nd�r|,`�P����`X���7����y:��\T�2vVj��'���q#��N�;�|��,��T-���
-�P�7�I��������F�D�W��f	�Xl�WK����������Op���Y-Gl������=�&��f����Z4�^yb	��f���66�R�>B��J�9=����T���D��^`|a���h�F��s'�GuB���
Ht�Cf��QO����X�W�`?������bl6�������1@��*�������_DX�A=�r�g�����u+�r"cg%	��S�6��V��Q�X��aS�����:�+Qzg�	�g"��1'h�Tv�B�J@>�*<,��iTfV��8v���8#��;�(�k����Se�3��y��F���Rr [/�l��
{K�<g�P�(H_
n���O�^7�,O?��@X3�|���g�oj��{���j��mG�,��i��yO-���D�rtF����{��P��e��s�o�55�
����_������r�=��)69a_T�?��JEn\�nr�F���y��m�zA����C�q����,?�ii���2E����ig"��W��Gb���2�g�o���*��|���:h�Y�����G��t�%^7�p��[QH���	��e�O�1i6W�������N���,#���,�;�iYB�q,C9���JO���T�A�-��$3UD��A��^g��J"����S���  �����K8�����#T��N���g�b;%nh	Z9�C��;q��
Ms%���:�Q��W��7�T>7�}���<�df���Y����d�P�J���a/�f��vn�WJ�����2�����{�1�d�1�N��\����m����ZxbG[i�w�-h~�.�wZR,��b�V[�<H9��qvV�rbW!�iP&�zBd�	�
�j���S�1�$�C2�������}�e��<�YF���S��uI��4���p�������#@f�t�Z�N�<GD�_)��6R���7?N{�S��7���Y�$w����������c��+y��vo��>7u�����zFE���6�����������;QHj�@[6�-D�%�� zc��N��	_:G�����R����Zc��;Ayg��g��������h���t�|�f:p�D
����H[�����G=��~[.�nZ��� ��q=��)��G�h��2������}.BG�%��k[����9����=R�$��f�G*
^fX9R��d�����B������swCC�~���&�V�H�����-��R<�+g���9��2O�T�x���d�2��;����1N�N
B�����=^{�7
����������h�C����l{C�b'���9��0���|�9��3��Jl���������������^LE��6���l�}s��7�u�GE=���p���)�0�m��v��8�*��6�l�]�����g:�S��L.��n/��$���������R�����Y�&�Bo��d����s�[7�?73��S���B�#R
��sF���Db�Y�ff����j��Le���P������'�b����D���O�~�)&X�h8>#y�W6m3X�,a0�U��_C���3-��Z�a�Ll�"V��mr��3�Q�at/�����+�KJ��:S�N���1lD�GH���r�k��s�y�g�Q ���9)����=WV�JQ�2�rG�|�24R7�9����NI�����X��%����X:�@j�8|D=�9�$�bd�'�y��Y2���w=FG�<���^��+�o��K*<;�+��Z��������<s�G{���5��������LL��g����U�$�^sr� ���S�?�U��+���9��Si'�H��R��w5�)-����Y�����KrK�g�eM)��)��[R�X�C&��A���p��|������`��rC���#�F����Wv� i�|iA�`N3�i��\ �T�z���tFq��#�/��Q������)�p8��%Oh"��5����:�c���z���'�s"I��D?IIu&��hWhR3 O������l���uz�
�QQ��}�e'��9�&���xM�'�:B@i�O����a�)#�y��4Wk�����?�
0=��c�zO���swQ��G�8*��I���������^����i#�����Q0q�n�����h����o����3>�x@b8oX�?���u�&����SU,�0�$��h�l�s�B���c�.P"S1��3����~��;e&��jsR�d�;��e�:���5��;ac���lSffu�?X��*��.���VC�%��,�����i|�
��z<��bY8R����9)f�.O@���=J�N�?�\#�1�;'�:���F�h�%���
N�h�d%�|��~s�����b��"��Jp�jte��`\EH���/���?�L�E��;�����q���f\c/��9{x�wrj#�Ic�a*�4��q���z�T3���U���eM��J��3�����o�_6���&��0M�#��I�@�W
�8q��(��A	��'��Z���\��9�^�q�PK�R?R�~FmMI�\% test_data/3_10^3_rows/4_many2many.sqlUT
�h`�h`�h`ux������e�qe�z�J���$<*�K@��$��Fkl�@l4l�?�����<�.���\<�����������o�������~���������o��G��o~��?���������������9�������?���������������_�����������~���������?���_}�O��?������?���O?������������������_��_������?������W��)�3���k����{p?��m�O�~���~<����������2��[���~���_���������{{���_&�T1�������w{�7_>7���\�#��h�jph������oj��V�k�\����m|n�M��B\y��N�������I����m�{l��xS�����������6�F>7��*��[
L��+���D���~na�������z?��&��h��.��/&�|������E_��}�l�o�����6�;e�&���`���/6����  ����DF���	�q+���_X�&M��]����6]�����M�~����.H^�773�����`���
v��p��CM����'�m���!2X�o�������G�����|����G���},fr�XjA��q}��\g���$����|��W+o�&�(=�EA���s��|�zAp�����CE�Fs%z��o��|��:9D����� �U?b�C���\gR���H	��78�3dld�8���uB
�M���(:So�::�F`?�����o0X
4X��.pE}���o21�@
�z&�E\�b&��m1�~tm����C��8G�#6w}.�E�I�H���)\�q�
s�eQnY|b"��Td��S���7X�t�u>�N��zsry�R[4�W^r�A�A���$�>�sG��Lz�=����7EN��j[�7Er;���(�D2OEk5p�#0p�v~bEQr���n.�<�D-��������"n�(��u�J���N�t�������w�X�N�~�s��i<���C}���{v�6�)��`�b.���~����^3�/��7'�r`������I�^=q��'��<��cW�[*�k��$�g���V$%|������)�uX	��������>�*VH������NJ<��h�������2>`���@��
$�<$���_'R%����A^,yE�Nq��/d�����K53�H"X����������������P�"/'��x	,����^J+}nE�Y]��]��BR��$
�q�+} ��/�G��M��)�[��h�RH���/�8@ �Q�2�yT�,j���,��c�b�J��iV�
���f'zdk*$%��
P/��J������i\$[&������P�q��������E`E%�� M[�\\G�6p�Y\�d�G���Z�t������5��,��_�*��%::���E�:�������Ir� �;	\��Z���O��"���H��)I�	���XW����%W\%yu�|0J0�R�:R�y��,���	2�2x��I@��l�� �����K>��
<>��c
��$��2%���7���d!��>2���Ec���K$G!p���AT���!W<�p4,Si`�I�C=B#�	Q5*X�e�]��B���~��Q����N@�����7E��" C}A���C"�.���������N��5���������p��XqA���
������+*
$N�A��,p�&�����]
XQ��T��kvv���"�Hq�d�TIXg��c;�Z�{�8��L���H���Jj�����+��I�T`&}T�"�	���<�r�3Y�+f�&�����D��Y��
��#�S =W}ZS����;y��mA:�fc���D��6Hr�K8p;�vZ`�����\J�K,$i3;�lGp�:���
�+��M�9� 8(����g����?�WL���k�P/p����Hvn;��3�TQ
y.����Uo��%�[WH�
��$,���z#.��@�m�#B��7�=L�`����+*� �=�^���
���H������+F�a����&p�CM�zo���hdx���3&��	��u����S%�$�,����I�J`
w�.9q�J��{gX�k��Xqv
���J	�$b�������-�,�*�=
��VTzC�b	E���U����.�&�Q�%���ER�#���^�����j�(I�-g�%.���iZ�%���^�?�v��!{<a	��6K$2&r���K{	I����\�dc?�BIH�������"P�F1y�t�� �&;��P���N$3�rP��%5�M�_o������,�3�t1E�#U|��DN�d%!�m�m�*Df��}h�\Or�w�Z��HVWd%mf&'	��,aG2mM^$�k�44-	v���H3�Z��Hg��/������^E"�*���*�W�Jd�]R�l�0��~89ShQI:
$bi����G��.R�M
��<�~�6I���dm����O��"OEdf��<����>��$�2dA��)�z�H�Ude/����&:�z�$��g��g�O�\"�,�gM�HI1�N'��&��[�y�"��;l���^h�g(\;��:��4�/�S��#5s��%=!C�OH����
J�=��B�
�R�vP���O�I�Z)�0�HA����-����_��	���669I��&�"�I���T�lm��D�&�3������T|
�;�"L"���P,Z�	79�"PI������!{�����!;��?��&��b�#��$��H���y8��h���*��E��>�!���O��(���b�{t�P���&s��I�&Vy�D���L�XM�:�B/@4Y��o2|�]�B+�1�b�d;-��51J�U��g��J�dA.�H��dr�:�m3\��
�z3��LRkEux&)1y�?���}�T�n2�t�/�J�IRaer�O���h#���k�����Pd�$��wPY���6K��h����v�v������e�}�Z��B��^K�)
��*"Q���I�>��TS2����*SB7x��E�nH�tew�V{'hV92Y�~�a���
^�DyN��N�m��Rl��s��oQ5�5l�r+��
LdC�m3���#
�&3:��D�G��Q>�Z�
����|Ay��-g���<�Y�j�^t����|}7$�[bbmzY��Kt��cK�}V����Rd�gk�7����I��m��d�"n�� �tn�
i���"n�'��H��m]�e2~�hj��]����d&m�&;������L6C�5"����(m�bvA�;���S�/J����>�r���"�t�d�I/v�O���Zsb��
���_�=����
C�R�9p��*,h�B������@#yE����%J��y�a����sD��No|0���R�_�'��d����>��6������G�D������)r���G��OR�>u�B�
S0XP[/���m�8H�gEN5:�u;�qCr����������*S�$K�����$�vf�'�,9o=i�fv8��C�?he�e��.�k���0��4�i�4.iM�#�{7$���R�d��&�,.x=����*I����mW5V�$S1�G>*����i�Fmx&��8,sD>����N>z�E�N���"��t�6�qV#w[�D�R&�Mt�������&Ib;���a�M��+k�:�=�����p�'.�5���/���?]&�)��(�|�8�Iv�y�w�n��u�Q��I�B<j�G�?���72$o
U�Z�%.,��N�iN�/���yB=I��|�53�
�D����G����2�(`dvg�N1�?��%
�ORQ�e*-q���&��m3^�c�s����y�oa���E��� �(Z���>�o2��R����	C����F�����g��n���#����u"��&�X����SVG�e����}Z�����7��oh�Ev>U�G��*-M~��,��k����Ly��HY�DV��X%<|H�6��4y�@�����b��n"���&Y���

���MV<�p��!��&��i�[�W����Mf<�S��>-���he�����lO����M�	j�0�3�8���?�X�S�,dHE=l%��1��H����-�C���>��m=�_�M%�g�RfFc&������ &g8?�����+or�Y���nMv�6yV<G�I�r�H/x��f��rR,
&��3��|�������R��$)gr��d?���!vx�g���y�H���b=�M1�\R�^]����9�(��G���$Q�$����g��.�b�������O����-���E��U���ws�
k4����|*E��sDb�&��{����]��Yrz7����&I��$�7�*�L����i)��c���AR�n��vY�3|9T��2��6�r�&�kV�C�oB�M���.�>7�Bb���F�VWF��kS)9���������O�_!CJ��,D�d%��M�Zq��e�.s&IS�3\�����l�Dr�&�����tL��&'	�����s��0����B����+"�C�<� �i��B�MV��a����m�e����3)��I�6��m�6�r�YJ���l����
�zu�7�ViiI}����l%�O�/.G?�v|���["}����6s��'K:���EE&+���I�S�Zq&��&;�{��A�No:����>-rlHk�I������H�S�*�M�nF�ig	:g�o����e�2g�@ir�E��������A�YL����$�M���Q2�?���L��M�kPL"is�tE�xT\���������&���d�+gt"YQ��X�'�rYKRn����k�gI$g�*��2��!m��	��b?�HRpbr����[P4�d;"�WC�+&}�&�e�(N���!x���IIP��$�[5�"g��79P�i�O8^-��N.
5V�LE�?UU��D���y�x�,����x��D�3�V6�V�G�>Bm�D���&��#��p��*��k��g��@yz�h����@�,�������!C��E����n?[��P-V��2J�c)0_A�7{�_�����r���m�P��?��!��+�"�`��`�4_QG���"0��E���^jk���?�}B�K6�-�����������7��n	���D���5�������i#D����o���4E)��C*�&��6�������VnE')���"W<X+E�L4_7�F����(���+[�|)U����j&��&;:��DA����Uf��?�RQ�D��$���[���<������B�>�h-�I���Bw��|}V�M��ItL�*;��3f)�f��1����NH�3�1K@5�E�6���'����*E�c%���x*��3����xj��Qn�&7��SL���V�<hF�8�g�j�d�_��(aM����������Z���Y���2�<[���D�S��w��������l�3�\E�t^E��x���>)�v�X>5�V�����h)S6�����D3O�����$Mq7�H>�uE������/���Y�,Q��Ht!�&�2����|�9��
��$r�&'�����'U��(8��3��-��h&:��D�"�&��?]A�D���H�9PRg���s���R�d�X"�����m���Q��8������de��g+������>
���j�mf���d�|"�]-&Y+�HtC�~�By�D�t�(@7�3��'�^q�(b`eQT�o2k��6�L(�g5S�@tx��I$�m�������H��x��nh���I�'��c��|�~��pr��T�&�����5�C�n&R
6�QG������D6L����O��0��er
��-���B�_X�7K�3�����`�n-�a��K��E3J�/;�*T@�6������3�$�[�����}�vO���ZZT	�+��C�{���"��DN�+�(��x��"/%ENT�m�V��xW����XL?�}B��Z��@i�\(�"������N����'b����&G8�P$�Z�,�D'�m���V�k�I�Zl2���	M��3�z>M�$��I�-L�_����A��2���le[�jgx����:��pr��>�&I����N�)��1���sek���K�=dg7�H�It����������"vQ�d|
&R�g����&������eZ�$�v��:N�����$��M��1�4���L���(���p�Z��0�\3���&�����&k8HU,�K�QL.��Y��D�M�KbM����iIO�!C	�m�I�Y��<����Y
{�P�~��l���qo_"�mV"�]3y*�G�E�w&�������l9��lD�&����+����l���m+��<���%"=&QC�Itu�-�:m���y�I�	u� ����M��&��h���l���"y���i"���nH~�4���$��o2��g_Mh�����D����������#Z�&kX(�Ho�����P�D�1�(2"r
��i)�Zr�HK�$�!��%��@��g���~�"U�B��M�#D%{�T-���b�"��`����#W�z�(D����I��2y��F����H���*�/�������Lr�&O������@�lQ4�I#�[���D�&�]!EJ�EE~���R1*�19��*�l��q=�R\oE�G�*��@�D�f��b�D �l�������6���g-gR��m���VGF��U��,�����"Om�(��W��*���\��l�h�STx��Jt��h��x�bYHdH����y��i9H���y�X��E�*b�+������>D�����w���|<����8�*�C�&
�</�
���E�v]������/V�F��-wMf��h������.�
��`���3�&Q����H�l2�VJB���A�����Y��B��MN���I��h���w8�DU�d'��&�C19H���Sw�>-r�k)r�����M�Y��`N�,�#������z�?����@���;a�R}8�8&�e3��7��H#�M��������J���H����H���y�� �������^6��5��_49�����ex������bJ��6���D�C��>-�Q��$�ZE���-�B�����prH$�7�d'�-&G�����.*����J���"�
6&������L��}Z����!C������u#�G=����K4���(1J�}|Qr��'�>K�B��u�&�@�Aa���~2�����di�5���������G��#^5)�eV���e�����c��SS2L�_\��v�����l�5�[^M�R&d[��xC��d���3��-&���"��M�4�'r~���xR
�}�ao��W����gFAe�I�Ww�z�4��$w�<�yy\��N��v�"�����"���M�X�M�G^C��\P�E�B������F�P�I�d�����\P����e�B��Y�iEe^����-z��\y���~�P��d�N$Pr�l�u��vb�����Vt�nvA������&��&p�������|���*�U����i���	��cb���g������Ce1�GE<[�Dox���<S���������^���%�/��p�S������e�P$R��(]nZ���"V�!��mr�P�U�Q�6Q���V�+�.Dp�$���$��Y�tM���tg{�=�����F����F���l�����s��(�7+m��R���3�b@-�=�su�]A��Ln�@�m"g����J��K��������O���[7;����@9�%Q�~�$�le��[������|�)Bn�ty����`�]/xy��x�����8|+Q��y�"�=Zj��C�����EJ�m�V�Fy�	�����K�X�����!"+�"6�B�&Q�N��by�Py6(N�\����S�C��"L�r?�B���5�Q|�$�2I6�����dh<������&q�;�L6$�dE/���s����&�Ia
����I0`�$90n���M�(��x�o����O0�H��$*�1�ZxM���h��W�����I$�ar��B�/���D���e���X����Dg�H��d#��=Zr`��
�w��3QhA��
���&�������cb�����I;�l���Ozr�i�
j���4�����d:�h�������N��5���g�b�Z����(��u�D�l������4�+Z����
�)A����9H��$�	�$��w�P�}��0���D��l�D�M�nc������E^QX6��2kUg��d�l��?��7��l����@�%�J+����EN9��-w��S�%|�d�b�J��\��Ljm�H��������LG��>����P�&��^$I�}���E�����\�����<;C�����d�H���)1{�������E�tL��6I��L�p��Z��h$��l��pC�bAA���-��J"�&���&)*1��h�c�] ��t����
�w;r�H���q|wC�kH��L��M�V�=�pR�~0���LaY�j-_�<l�\��i���������M�Cv/�7��������S -�&Q�I$sau���D�j�D=�\Q4��������N�V&�}&��}���Q�����c�EnQVN�D��%��e���[u���U���l��8����F�LDZ��fxo+����(�!��d��R���|���nH{!�]Df����h��MM��p�D g�����D���j��'U��D��Qr��juL��g�����!�J(�a5U�D�&ZC�����U�dQ6�YT��(z-�ua�	o2,]S���>n�(�m�Y�oW���9��W�����k|����{��B���\�S�R�����2�M�U
�g4dH%({`����b�Z��HA��E�
r'�7KAt���ud,��f7�v����_O����F/�19P��Y?��4�'H^��r�*7���
��
{y�o�l��)[~7�7�$]�Y���E!F�(f(2��[�oX&N��fIo���R�"�AD����5x��&���>���J�������h�q<���n<�-�)8�����}Xd���*
�J�L��e��nO�y�"SX/�J����^��wD���u�t_+�Xk�|6���&��T��V�S1�</k��S�R~����g�dep��'��+�`�����+�W�~e2#��2����B��C(=�I�?���"3{�|�`�w���b&�>P�:q0D2�$���S�F�d�2���p�b�wX�8��o�x%�Zh����'���t\��)��!	���~���n��F%pU����2���dX!�|f"�;H�$��E������o�\s���E&�����X$[�����*ED��*J�k%J�&*�y^ub�
1��7�X����T������U
�u=l��G��>D����+2��`���G���<Z�Y9?X"�q�t�H�R`�Pt�������$�Y��-r����6Q�� �����q��*IJ������0������O��_�-f�B	"��m�~�&�`[��Hxm���}�Pm����r����
=���Y����}�.kD��l��BiYVT'�����Un�Wy�p�
ieK�w|��;���W��]q>V*��E�6�4��}y��(Ia1�x���Q�H$:qY�����D����D�`��%��t�M&��&*�9P����C�>-�}�N(��KE��Z��$%�)���Z�����3����|��r�o��@dGi
�`���N��D��0Q��e2~�\�$%�i6����2������4zC&�6X@M�Z���������Q���f�v��Y!�$�7v&��I���J	^-�%�������Z��Bzq6I��h���M���&��FbF&�&��!5�����E�&�]�MZ�gex��vP6��=&'&)�3y�!�'����P��	&�>��U�O<H���i���P�ll�������,�����?��Mo�$�
����&���33x���}aC";Zf��H*&��'2����Q���{q6���Y��( �D��M96���Q��i�0��E����f���l����7yz�Qr��S�gS�&z�|�j� ���^EW��!j�G/e�����y�w��m�4��S-J"��=Z����.���N��l2��?����� 1�Mg����'"�&���z�� J���M�����H���IT��I"w�����}1=�Z-
H���f�m��y���,dH'�F^��K��KQM��6y���M�i52���&����&���L�}Z��d���)��m
D��fH��.�����c|B;,�19��v�5IrQ3�TM�B�����B��*��WF�he�q>��!CJ� �=Ox��-�b�D���,Gd�>���Hm��A:����D�����YBq�I=����!��hb�r���!"Q��������D�?'�D���N+�"N�������n	���JU�����f8�lyIRmr�u��D"���L*+M��9�!��@G�%Rl%�M������eCw���$�B��N��`���Z�D��$�d6��F�$�	���k��T4������$��&Q��I�,��-EM���w�\���e)Qj[$K9���P-r���-�ag�j�%��&���(��n�d)r&-�yT����AK����m�(4l2^�d�H�W������"�h� ��M�����l��B��||gwC��jr���������n�D�Lh��M�m���L�-Q��6��T��c�I��l���s��,�����&L�m7o�d���%ZN�������X�6���$.��5�� ����V����	����Q[(��4��^"YI��B��6����7/����p�������	��M����<�C��S�<J�xY��%���I��6�s��xPS"�g]��z���!)66���Q=����9��g��>-�� ��)��Z�n�	4�:����*���&��V�����Z�2dAZ���l�'��WC)�z���s�A
��������@wF�E�D��I���2���������Y|4-����Al��i�FT�d��#]}�����,��|��5\����L��ItV���������6y��h�:7��]�p�%2��1J�X�-�mX��IY�!�Q�BV&Q��u�����j��;��wn�����=�O�B�<�X���9[�=\����&��FTM��M���}��:wc�Vs���"���6� ��QK���'K�6��nEJ���<_P���)�v7���(�m�xE�������1�P�Zqe'D����w����O�XD��
�f�}M"������'I��!�d��#r�B;����T�*��=��9����$�?���D��$FI�e�\DN���m�g���Wk>��
i;C��V$D�f���\�(EBt��������'2#��e�����!�P$�Qp|�O�wl�l(cD�A#r!���Y�i�����$�<���r���dm5y|swC���2��:K����7�?�-�I����,�s9;������%����C�O	��!��I�u�6�~�����k��&�`������o��?���l�&o0����E������x���3�H��I4��%��m8h��J���`���o0Z���f��R�4"��*�2I��'�W1y��������R�T8��_��&�j�(9I$�� �t��t�}Z�09��5`��$a�=�pg�&a'e�&Q+��D\�M��m�5	���Vj��d�0��IH��&�EC�&	6�<5{��-����D��$9b\am�.y�N�wL&R��e3��KX�����B
sL���M�����u?g���'_����@�s�����IH�k6IjNM������e�!C�A�ng<}-!;�_������y%m�<������y�P�#�:������o�>�(��e3��f�Y��K� �s&O]�(yVt�N�6i�2���M��a�a5��3��7�s�o=94��B�.�6�4�H�w�Dg"���m�U�P��$���L��}��3��d��WQG��0�>D���f�2��.��6s�Q�[���_�<����,��V��(3Y��|K���W�w<�"5�Nt�L�9��!mK����@�c���5��%]�Z�hz����w�du��e���"Q�&��V���������$�X&�f�(y�	D��{�������P=�M"���
��u����,�#������-F��6I���-�E��&:YZ���di����n90|��Q3��m"?8�J�%+��(��J���$��r�DL�����m����� C��I4B96����=������(�����0R�f�
\wCj��D&
IZj
�a�>�$E�O~��kB��������L�����V�$
�T3����X�;N�	P�$��D�����
���`X��\G�7�,�e��r�P�Ou�Zr��."���\0dh=-EQ2!�}�D?��?j�_�uB��w��"��s&�(�T�:���[���9�&����4����x�P�����x�d��H�2���!	��V"�����m�(�w�$������6�z�����(9����{����O��0�$tx-�I��u�D����^���M����|���H��d\��K8���i�����-����>[�����i�iY�\��-���*g�L�m�����/�	0/��> ��E���MT+�?�c�[��y�,(.i2,��-�2a&QRXdE������hQ��m���-��9�GIV�%r��5^��]�Jv���+V��`�wI/v�����r�W<�`�G�X��$W<@�'��Xx�=�a(Va�I�P��3�R�J�wKS(�)2���H��P�l8}*eJ$4o�4%�����zE��p��D�&�o.�`����b�av"�am��D�����G�1�%{���b���N�����fx���Y�`��|&����������,qWJ��e�L��#�h��2���{�����.�p����/m>
�����R��l����\(�c�Q��������;;��o��$:������B��!�h���v�K���x���c�����P��O�@!CrOP���Sf�>�B�<�	U"���`�����I�%������>�Ux������"����W�HP�)2�dr�Eo,9����+��$���De���Z�D��P���Q���c�Qi��
=����?�N+���\N{������Y���Yt<,:B����"�����o���j�U\������O��$j`�R����
�7=!C����"r����X�r�T=�"d�����-$d��`?x�]���-�%���B?��q��z��}��Q�������t��}��j	,�����IrL�O��REEe"�A9P�\d
������3-w7�����S}5J��$���VS
OJ��Fc���U����C���*O��q2�?4^���d%�P���z�$^�IR�e�(?�O���Hn��w7�a��dcC��ns����2S"�`���L����"a�=����O��z6-� c�h[��F��=Z���^�h�i��ee&���&s���|Y�E����!a�ATXM��g�>D_~M&�b�G����vm�0�H��b����S��t��+|�'$om2������Bf���RQIco�$�f�M�,a9��:<H������$1{�l!�Mh[l6���'"�&�F�h�������p�O���I�$m]Pe��s�&��?K$�1���9-pV�%
&Q;4���o=o,�H�fH�u��D�l*d�dL6R����~���t�V����H&2���6Q�z�GD�>-rlH��$*5YI�{l%_
�;hF��
z+����~	�$��GK�ML�a�����;��Io��i���=��e�n���
�nH^��	sU&��=�d""/{�����O�>�%���������5~��@�$��r"�	�R��x&mx�����tLV�1�5��<�W�:
L����
��A����<�$��&�m=&W<6Z*�6����"���*�@�K?�_v�:�~9�$�*&�
���z�h�S�9��?��F�F�����,D��d����OD��M"5�M����� ����6� -u�~	��Z�+���$�<�dA�WF������+F��</y��eM���=�x����M.dH�.q����A��H�`f2���6I����,��F2Q�2y��w7��6��!G$������,����su��b�c����������|��T_������>C��,LmM]T)��M6�j3�R��H�oVrOPlH�D'O�q��!a�A$uM��;�r�j�GK�������*~,Q��-��i��Y���&��9/8m�(�$���HTkj��xa�4X��y���
iE�I"�t�b,*s�$pL�x�]���<�gP3J�xJ���D3��D
�oE>^���j��K�E�_��Ku��h�P�4������h�@e����`.2
A[(ME~$��%�=��$_2T`��`�UlX@�M�v3"6a2�Y�OI���i;C�U�H�p����&:n�O��������#&Q����� Ld�W6HAs�_\��,iD6P���V�$�Hc�`R�}����;����d��m���^���(�o5K��'
�(������,�D^.�
E�I������'$�8�����"�Y�z�m3�Z��A5�"'��1�QN^d���aeI�Ii���rX�g}����p�����I���3!JTo�����Q"d��;v6w$�t7�z�D�jiQ�m��<���b9K4�I�u�D��"��T��~HZ��6RC){��S��:D�<�&)�Y�����JvE�K�h�7�
�R�:i�
��E�����*%+��oH�q����$��,�!�$:��\(Ch%�#`y�P�6D�r�(�a=KT�cU�xg�tu"Y\���R��	��:S<��'�VT�:w�9��gZ$��8����ASqs<U/G���uC*�������Y"?�$����7)K����!�Y��E�
��L([&��S�����,�A~9����&��DN3Z���s6�*�H��D���I�t�}�r�P�
{���D�g�\�8��,��XCms&Q9�?�3����G���`
0���l�
�$�)���_wX+�����(/����?����x��IO������o7��2"3�C1��[�),���D2�9K��"�LwKd:�*���r�Qmr�7�)9Ut�4YH��It��It������>-�q>��Ej�Vk��Ib@&�oK�E�&Qjd�$������?�R}$i]�a��6����b�D�����%Q��&���m��j�IC_��~�R��"���$Yl����m2��0�s;����Db�����Q�i�6yf�$)�1��&;���d=�R��t���-�������x=9�WC��$68�t,��M����Jj�M�-(�i�OD�"6I�>&k�f�G���!����������D��$��3��g#������GhJ�v���M�A��r�}���A��@��E�����+)�7��v�k���a��Yr%[���)!��.+dH�(i��[�6�Zj�%�j��T�\$�d���d�cE�h��$�k����%�:I��IR7k0����t\'Q�5�k4�<s�K��\����D*�MV���$���38t���lM�&5�-�:=s��e�lh��,��=��A �t�lP�)E�-�����.&�7��"/���$Qm���l�),j8��J�IM.��
���x�K���M���M��M��<��QY�0��<�p�66>��*��E�q�(�.�7y4��-A	J��ZJz���D���e��Z:6\�2K���e\�-J�P���?���m�X���&�
���X����y�Oh�R9&��?&�
�����F��bK�H��;�CG{
+�����c���9J�x��Xg���������3�u?�l6\�>�dHq��M��[t6����BG,���[��I�:DK�!W������<R�l�,��������?���D$:D�_&�_h-���Bil�H��d��dJ��g�D���M�ag��u�Z�s@�(��hV}�
Z����a2������^�b2�o����7��u�����)�<�Q�C�����B%�����pEG3����Au�X|+wKqk�#=L(���j�Q��z*��2I:�L��qsT*�!Xr$D��M���M"����r����a$m$&�V�0��"3r������xu��x��l�/�d!}�&�
�&�.���5x;�^��9�r&QA���E�h��F�)�Zt����6�(��s@-�my*���t"
��mB�<��m!nQ�Bn�A����	��o��s=Z��i������7�.�	�u%><���p���6�)XA�-w��jJx�M"K$��o�c�����S�����+T�0�PKdEi(��������U�Q�W�
k�����r������;=��5h��(��G��4L"��?��'t>5�9x_��m)`�5^�1^4�cY^�(�&�E�),�0-�K$VL�D�\��D.��uy�Y�P�����p7T�!L�B��rQ��J����B����$�j��E���X�N[!�5��
M����2yV@�
isA],��E�-������uR�2���p�c�:dhQM�=����d��,*���������d��z��cub�D�<����J�)��L�laUGL\�!2�__a���)-��:�Ev���D�R"K�z�)-V�rl��LzO��z�����'��p�@,h��Q6�6�Qq�b4��gXYQ��cQ����l&{�mZ��&��a����xs>���n������H]�$�z�H��t����sa7�Q��j���D��d���,����Y�AE6T�d2�t�0�D��H$(m��7�Q�	Z!Wa�deSV�E�=X4��QPq�O�o��R�
����������-[ �G��j4�'�lZ�������EE�"K|���)j��Q(���G��}���/[��Pi|�l�������(J������D?�br�O���l.��MT��DLr^5I���`�i�e�Q�6�HD�$�N_�>����MuIctET��l�&��|KJ���,�D�&I��`=����&/������B,�v�6z����D���l����4Q��&���db��HR�f�?j?gt;^V�$�&�����7�m��>�D�t�H��d'�&���KJ���^M&�]�D����a���^�tk2�U��T;�{�C��*!�����7I��L�{8M����G��}Z� ;��SU<J��5�.�1Y�"Kz��$pM"qj���O���E����>-�@�B�-
&���+� �QO(i����~�U�L��<�I����N�5�]�	%e�&O��(��e�Kj���gn�[�,$�`����ITI���aB���r"�f���}��OH��dB'b���,+���������#�&����Br��Y�4J�������O�{'��-�����T�rb%U�Wm��k�O�|�'�D�T�a��eiRR�j2�FY��tD���`���r��{�L�#�%X����-��.t9P #O����%ib�5\ ���J��L&�	`�P�u9�c���[C]���d#��_$yY,���$�5�jJ�I3��xk��p�~I�tA:�,�l	Vt��k<-!�P$�d��t�nH~
)iZ[�����8�pm�P��+���a���#�T����p���U:M�,�D�d���$����%��k�<���6�����2����T82����Z�m�e>�!����;��|%Z��W�$���OB~��[�=sK:�g�D�P}Q7XdF~Xu�L��\���Ks�o��PQ���[��c-t���!�
�A�$��$z��KT��9Io�7��5(8i����B�a��e�O^�����,�B�=�,To�h��w��
iE���,��?a��������i%�&;*�9��'�y��9�/�-)t7y�XG���5�LO>4����%��6gZ��$z�����C�'����!f���m�<��7�
�KR���|���}��7/O������pK"��X��}DV�BoK�(�����!C���[�(%��Et
Lv��m���>���2$?�L,?�Y���D�&��&Q�1��lV��,iD.��.Q2���&�h����K�P�P$YY�cI�Lh��&*���g|��	jW�<W��!��=�[��\��%����W�@�F��<�b�h����Vig�%?QK��7Ql�"��l�m��T�&|����&��=���(d&r�/oX��Dyl�#���B�h�g�n�+���@�'
�D��&�}�_6������dK���D�}=�9%?h���(KZ�5�����|,3j�����B�dY2��r����{���tgi�P��&����h
������&�e
W��X�i	W��l,
�
�5���W�a�����;���!9E�t ]��It��T-�3�d8�4:��1yj�D�F��L�|�G�z�<�xz{�%#��o�Y��]�����(�>B7Nd��Sr���&Q��%n����_��D&��l�H����Db2��6���YMMh��^&kXzI�u�#�����v��G��yM"*
�h,*��?x8m�h��P]�_���O�P��j������T�@��pEE���������^�Jc�Y�x����%(���V�cZa�P��H�rmV
����b�uH���MT�k�W�	������"��E$!M~P3/���a����m"�hk�B����R�����2�"��e�D���iy9U�,��u���wE�[x���+
������"���D��}e�8�[���]0������7���Qr �����������A�D�ZXQ��}Ud�G�/�E���|l���.��I+)<X����k���iW
�p����J/���H����m��md��J�PK�R?R test_data/4_10^4_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& test_data/4_10^4_rows/1_referenced.sqlUT
�h`�h`�h`ux��������q@�\OqC��v����"zE�d����8pb��?�;
Err�0\29 9�Mw�������������?�>������^���~�O?�����__?}����?~���~����������~�������o��_������_����__�����~=�����w_�������/��������/�����������
�����������G��k��������W������G���6��i��&�-6�d�6O�a��'����n�r�I7l�����x�
�o<�-O���)���l�x
�-O���)�`<���`���[0��a�����Sp���)8�����i�����Sp���)8m�����|
N[p>�-����\O�e�����Sp������\O�e�����Sp���)�l��\��~
n[p?�-�����O�m�������
�-�����O�m�����Sp���)xl��<��y
[�<�-x���<O�����P[�<�-x���<O�c�S0m�|
�-�O���)��`>���`���L}�� a�S0m�|
�-XO���)X�`=���`���,[���e�S�l�z
�>r��)X�`?���`���l[���m�S�m�~
�-�O���)��`?[��9���=��3��C�[������\��`��'�7G��>��9�����������o�o}�s��3��C�[W�P�Rs�FW�X���r���6^l.�x��h�����w�7^n.�h����z3����f�%8]��p�3��gh�@���3���-g�9Ck��s����-:��t�3���yiUWv����m;�Zw�3���gh����3@���g�<C;�z����m=c]2�U����g>C���|�6���>��}�3���gh�����3����g@C���G!�*4�
hh@��4���-h�ACk������
-B��(4�

Xhh���KW�����
�C��@4�
�hh# ��J4`���hECK������
�E#��.uU�hh1���f4@���h�FC������
mG<Z�|4�
ihA���4��HZW���v�$
-IJ���4�&
8ihO����4 ��Mi�JC�����v�,
-K��U��^6��
�����Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[�q/����Rh[
l)�-���[
mK�-�����B�R`K�m)������� 3�^
���A�r��z���A����!t��;B����%t�	�{B����)t�
i[
l)�-���[
mK1��/][
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK�-���X�2���-�����B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R�{ISW��B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)��|��bK�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)����y/U���Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[
l)�-E����*���[
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK���q�A�w����4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi���EW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK3��%][���&�4�-Mlij[�����4���mibKS������v���h�)��v���k��MW������$��I�������,��K������4M��������-MmK[���&�4�-�u�������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi��|TW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK��g��*�4�-Mlij[�����4���mibKS��������-MmK[���&�4�-Mlij[�y�{������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi�}���bKS��������-MmK[���&�4�-Mlij[�����4���mibKS��������w<���p4�	
��������miaKK��������--mK[Z�����--lii[Z��������mi�;xCW������--mK[Z�����--lii[Z��������miaKK��������--mK+�@][Z�����--lii[Z��������miaKK��������--mK[Z�����-�y�����������miaKK��������--mK[Z~��|�'��G~��~����G?0��@�U�$?�A�S��$?�B����($mK[Z�����--lii[Z��������mi�;�JW������--mK[Z�����--lii[Z��������miaKK��������--mK���e�*���--lii[Z��������miaKK��������--mK[Z�����--lii[Zy�����������miaKK��������--mK[Z�����--lii[Z��������mi�0��bKK��������--mK[Z�����--lii[Z��������miaKK��������wp��yGG�����������micK[��������-mmK[���6���-mlik[���������mi�;TW������-mmK[���6���-mlik[���������micK[��������-mmK;��W][���6���-mlik[���������micK[��������-mmK[���6���-�yG�����������micK[��������-mmK[���6���-mlik[���������mi�;�YW������-mmK[���6���-mli�9�w����}Gm�Y�w����}�m�y�w��L��#�u�;t�O��c����;x�O�����-mlik[���������micK[��������-mmK��Q��*���-mlik[���������micK[��������-mmK[���6���-mlik[�yG�����������micK[��������-mmK[���6���-mlik[���������mi�]}��bK[��������-mmK[���6���-mlik[���������micK[��������w���iq�Z������t���m�`KG��������-mK[:���t�-l�h[:����t���m����DW������-mK[:���t�-l�h[:����t���m�`KG��������-mK'�][:���t�-l�h[:����t���m�`KG��������-mK[:���t�-�y�������t���m�`KG��������-mK[:���t�-l�h[:����t���m���4JW������-mK[:���t�-l�h[:����t���m�`KG��������-mKg�e`�*�t�-l�h[:����t�������n~��]��w���n~��]�����o~��]��;���7]��y�{���7����z��t���m�`KG��������-mK[:���t�-l�h[:y��������t���m�`KG��������-mK[:���t�-l�h[:����t���m��]���bKG��������-mK[:���t�-l�h[:����t���m�`KG��������w����y�m�}��Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-��kTuUl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����2�z\][JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-����w����-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�R���ZW��R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)�]S��bK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)���������U������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�����4���>���PK�R?R"�e�p�f	' test_data/4_10^4_rows/2_referencing.sqlUT
�h`�h`�h`ux����K�u[����W��T�5�s������M��U ,D$:tp�����X�=!��F~���9�^�y#"F�������_�����?����������/�����{�����o���������o������_���������?����.������?�������?�����������������o����������������������/��?���|�g�����?���x/�����_����_��_���~���������o��������o����������?��_��/|��O����������U����������u���Q���������]�3j���Q����z@����a������������_d���|�����y�z|.2���E��H�7Q���Q�����������������������zTy��������_�9��_{���1k�6���P�N��Z���Ja��y�}������������:w����w^K��������{g}��.�_5ei�|.�������#�����}?u���F���]��G��V}���L���F���|��������Op
&���������l�i��&Z��O���wg��M��E���z�����)���K0����D�L�Gw�������}����~�v�h����M��~;����?�`26�Ve�����?xcJ�{@��]���dgn]�F��>�>�h�}�����~<3j�7�`������1�������nj�5�����%E0�_���N�������
�N���	��^���A�v��~��fF�;�������1���"����������-7�)=�<���>w��~�6���M�{S�[���������t�*$��L:D������iw��e�mT��c{���G<�C0��v����X`�������/�_��Y�Np�>�>�6�=:>���S%���R����=�P���lF���sa>�>w���!B��Vp�Ov���^���O�L��"��m�ng�#�=�~�'H�����T���o���������tJ����8���)1�F���	���n�n����������.�`���T*�N�{����T�=7W��x�-�~���K0����~�U���Y5.NP����4����z���&Q������YSG���n����#�e>��hi�J~v+��1
/��~�_������v�������r;8�v�Q�����7�n�H��NK����:���Y��������wM���������� e���y�oV:N���7`�����u'��A�"N����d9�������x����:������xn
r���5�I������D��c�Q'�:YnN
tw'��7�����o�F�3����_���]~7��A�~t8����u�����|4K?��D>CF�
�V^y�K����[x7�7�A����������0����G x�J��~v�������iN8|�=���C�!5�[O~�������D�M��\��������M&�ZXy#2�R�s��`>��`���I���R�������v
9�"�|�}����BD���P�9����7�7I��q���h�zd>.�8I���8�xW��w��C����o$t��t��F�z�f���^y�Z|4��{$�x�^��VH��e�f��'�B�w�%;�������'�VO�i����'��9H��110^��
v����!s��	J�wM$�E��w2d���H�����B;����p)�1�lty����*�|��+8/��wG�s�&�C�9	S0c���{��S�M+�k��He�}w-��������h���6�n9���e��=G�1��z��RdQ�T�>�c��O����PE(�=F���G�x�"�}_T��Y�_/^h;��?p��\)�c���N1��w?C]�6/��������#����Y���OX�">���(z���Wt,�,�}%�����D���g"����i]tt���f<�����;������2�'���t�y�}X�6$;�4����b��p���H�b�b3,��$q����s�[�o����=����`�
!w��{<Sb9U|���dk����TT�o47F����l+��)�0�Z���C�}'6�D�+
i?�����L�7�s1�^�I��]c�JX���0d����t{�z2�����=v������l;���
�h������}��l��%��7��{&��P1r_�y���H�_A�%�{������;�2�t?d��l�~�1�_���=��)��R�k��	bM�_Ag�jA!�}�$"�:���V������'Xu��q��=�����
S�����Z$�
U(<�f���
�D���!�E�0�j���"�8������eU��T�������(��`����B}���:�cYqp�B��]M`�f
�H1��j1Zz!����}x0�]Fy�}od���X8}���p1Q����y��W�NV���Wp�Ta����J�`I���h9!�o>t��
�'{����x����������]��\�6��O��"w��<����F+h�2%���.(�,���)tz��K^��y��I�]����6= ��aI#�+I��vP�MU��@$�Z�
��*T>�bV�^6�)����!��>��/h!�	���6�k=���Oc/Q��E�o�|��%PcTk��x0N��b�*$�-� ���:��T��I���xNj�"�i%� v�3��E�%�&�e�����>�W!��|e�@��z�|!����[vc;��}_Z�2��v���d�~�T�s
�����Z`�H/��*��'� �"������S@{�� '�J���xp��o��r��}��$��;�H+��)6m���_:���
{�R��\������� 6$�H�ZU�|G������6DE�����>��Z<�)��I�d�{y������9��S��|��e�w�+�6���kBT��YU��;H�p��FU��b���R�*�������u��~���<�r�D�D?�U��*n���qa�E�K����Q��W����`j	A��P��9B�72��h8��0����H�j��Xb��D]F
��*D� z�jl,�
�~�ff�S����1`��&{����]�h�P�J��q�~"��
g��0���1�{~|\�$?��F��U��'�(U�I8)����u��P��X����B���������	M��Q��e����
H�CY?�w���"M���"a���7xs)���~�5a���5X�1�p����WR.�`w�k���	�w51���Z���E*���6���q5��I�c>;j�C|�Y3���O&VoB�����M0<��q��0�kB��$���kP����#�������D���\t0�������Jj��^S��F^U��Z2H��u�WN�a5a����U��T�v7�eL0�|��E��(��?
.�9�����6�������PSD�B�:n������&�"���d���o`�tp�ST������*�v��h��P�s7��k��e�w�v6K��,}�f<����+�Xf��jrY�4��*���|a�N����4���&�5�����e�����-p�����_�����Y'/�Tw���M������a�
o���n�����m2,`�OD��0��f���j�������B
6��e,�.:�Z����o�c5A���V�.��.y�B����!�hP'h�@!^#��	�G��������_������{p�u������4�c���i���& �HT��l��S�y�R����%8���[0����O�&5!���CJ�{��i8]��3\3`~v����c6�h�I� �^�qc
�Oj.�P{��(���e��}���!�J��,�`z�;�N������N���/j�Bv6�w��T�Q)
F��e�s�d��M�=`:��msa�7�C����]��U��y*;��I�h���,~�2reN�M�~�&h�_<cX�4�LH?�9�+��$p����"�A$�a�*���:)6�T��wN�P�m�dqZ�)2~���0���K��T#��y��8���h�&��d���}��F�k�i��y.P_���
�k�i�#aH�Z��	�)4�����I��w@M6���>)*H�2W�!
���\�F o��#�K��x�eb���kbi�S�)���&�C�����R���;��M��$�[<h�q��7�i[W�<t��$�h�`M������'���%o^��J���%W(?���|2K��
�/�P{6�����.�>�u��T�b�+����B�t�V�s���<����/�;����,�KYK�R�|*B��]��������o��<������_rb�l��7��@�-����N�'����.x�U���&T���:�+b�<I�o�(t��#��t!�-�'����������bj�3vK�5_������)q{�6-p����)5Lv}���F?g�`�KN��y�8e+M|��!����m��-�HB���V��Z�����������]���<�����du�S�O~X��d2��[s�#�2
J�|�~wCL������H����8��{�����mYCm^`���+�a|��ho����^3�q�+��6=��t;�3�?�.9A����9��/�l$�W��$V�d���;�1z��������YG�C�
}Gi��2��X���������
�mo�����eA���m�F��?����A�K�I]~�����7w��Z��~��+]�v�/���];�K����J�C,w��L��|�L������9oU�x��'^���#�XY0\�U�O��&k9��Z7�e0��Z�x�_��������exw9�Qv2��OY�����7��5+A���S����	����p��^6����������/�{�dK0O\1jr��E���k@��������)] 0�B�'�m������S	Zt[�<�0�x\�4��D����z��m�������`��`��\���k���!�������O���M���UQ����)@��(�V������e�������|�����O�����D[�����[�6��{�%w-��>�p+Y��H�<��#�Z�[���`j��J���Cq@ZW	��r7�k��;,?�	8<�������+���0�D.2��#�Lb�Q�6����f���Q�5�z������I8���&���m�1�L_�
� b��2�(�}�W,�f�l<����RCJ/��v���5�Dt�zf�>�����=TK��S��v��Aw��]0XG���C���_���4���j�������7�����N�i������������a#�@J6��#s�3Tr�L�^R��������i`���P�TR�f[��������I�@�}��\Ad=�����J=�'F�dQh���F�t�OZIv��.w�F���n�Nem}P�9���,��'�C��P7��G-��sK�"��&X����s������8t��"k8������o�������1/�<��S7L-h{+f�o�)3q����C~Pf�?�;�����`7������pNdm�5���i�E�XYON6�l9��h������\@��F5# u�M�������7�����oV����B�K��9��5p?����P(�����4��	Nn	��l����*4i]���������b������������!�q�zPQ0lK�����!G[S����+���D��_?����X_�MI��e��)�Dn��0n�`!�,r��l�%��A5���4;��A4�d����G)FX0�I@�6��nX<��%��,�O���~��(
fX���~����e��)Ub�:�'�������uH��O�9R=�Bfr�m��#4���em=u�?<}�=��;��0�X"(�B����<x��3�(�S#��$z;��6
��\ZI%$�%G��������II�8��JW&ZT�>v��]�;uE�����5��]X��|�]z�S>�[T@�O��L��Ub�|4�)C'��7�) �o
#QP���U�p%��8Ad0�mS��I~�f��	���|o[��' f�SX���,�K���ab�8+i�1�86��n�%%��b�����X����?U,�=��zn�������4�����-�����d����������;�U=�����b�&:���d��������g��La�P�]E=�ha��"Z�����hk�b���3�@f� |3�Y��]��f)���	��)\��u����~��VA����3�p���P}
�xd���h��-�U��nb�����x���52�F����4�:G�p}
�&��k2����[vu��$�����Ei�y���}���^��~��N������@������	����y{�$���B�m����1��
#���S�d��[��w�-@�eM�$����fu�}h��SLz;�U���O~�~�B�lh�Y��iE?���V��GC ����1�k�P	@QS@�5s
�?L�{*%�Gs�\�i0���H�`��`���)3�%�v�Q?�`RX�/��c!u�<���-b��]��Q�}r��)�I��,��j����#�
��S��Ro��p)
�������J������i
~����2����#`0�����cn��g��@�ER�7M
�^��\F5�K��o�*?9����{L0Nj�;cg<Y�O���}
��~c���B&���:7�J0�i�|;|X����"��#.yfg��
L��%��m�(�	3m��8���2������"/�mrp��]A�p����%�z����C��At�>���v������m����(_��"3T-���K���1�(�i3��$g:��$���&8��|RvV�w����X�qh������B_+�O�����3�r,����� ���.���2��a	����D<S�>K
�F���oA=�O`����SZK����:3.��2�@��5{���L������s��x���`�}}�7
6#$F	�������9Y��*�AQ0uo7���%6����������z�e���d�����6�s������%?��t@�����"i	����i�n9�k��[�����
Q6%?��$&A�2�/��{2
��`�W3��U��`�{�3���j6��.�DH��V��"�c��h����%���n'H[�!zz���>��O�p���������iXC#qKOV������mz5�\hY�K�}K��`x��a�B�Yz���wJp�2���g�DLK�]���k����-��-��3@k�qx��z�>b����j��w��������>Ik������F��tN���;j.!���H\p<5S3$��Te�l�Et�5K�<�N�������5�aHW/����B%/!�X�)GJ>��zx2L������A�Md���� 2��g�g�H�a��"�����c����%��,_*i��,�/��U��-A�L1z��z��.X�q����i�>�WP�<l��,��*S"����Jr���hl���>Y��5��{t���@�=�#��,�h�	������$�nO_�@��]������-��d�z%>p�~��0q�������Nk$��"����x�G�6U�$�y�������Idb�?�����yJ'����%�A�uNZy�m���X��=jVw�������w��P�3�'H��|{P�%��k[���O����}&eH��B����v�<&�>���P*��qd	j��{��|��e�r����E����� ��qO�u������<w��[y	���a�������@�����S���z�@^��b���<A�`!n��|��|?.����'����J��������5���=uh���Y��������������&����`P�����1vX�B>��"���,��!Hw�#bF�����������GO����y�B�+���,���=�_�bp�l
!����6��Gf�6�N�a��~p��-���H����q��T���J������Q~?��*�D�����!��-6amM��{0�"�-�@�C�'[�X����ir0�k���l.����Q'Y�
f�I�_Pe�no���os
4���-7xH`d�]�����W7��;�V����6'������l$K�\��D*p�'���U���&�GI����U���vL
v��~`��zkS�`��.:@�hh��Z9y5���`���L�����@d���f���z�^��m�
5���z��ow�%�ko%]�m2�����N��l'��G����~xio�	t��������@������ r��0 S��������5�fm1*�+`��Dw��X��3�����n �P���-8���O:��@��I�93���VWl���u����zH��-���cbS7�f��r���m���t��bp� ��$Fo���#�aE��@�TJ��Z��*�$�o�u�����L*>u�U~����Gr��6@����3��������m���C��wV/�m���a����D�
hE`D���j��s��B��BLs��D_�E��J���n@��������@��������$�����;'����o��	���F����
�����;#s O�A��_nw�j���-�K:�Qp����$(/�����d�
��A�������~�0@}��pe����q�T,'^�Yjw��(<���
C��*T�����-
�P,��;�$#�26�
'{����v����zF��G�=�`��~����z$g�|x6�M�������]�V��e�{3������n����$�<��K{��(YT�S����+P8��E@u�WRQ|��OU�/�R�E_$&[2�Z���~�y�������q�C�w}�������W���JA�S~����O��c����A����O���+�y��K^#E=� J�h;/�H����3�8�H\<ZUz�T`�?���W�,�X�����ES�R��#�Id��r�c��/�2�c���y��%zp�
���n�\�����9n�q8���.�� p4�	�d���A���&����l���ql������k
5mC�����v#���O�j�������\�v���d>
vgZ`����Iw����������A���H��i x�<�u�t�������}$���2P�{��e�8g��.��2��c�}�!��#���V[�er��dw����GJ��[���?�`Y	z'+�^���z��-�M��`�u���5�0��<������$cs�h������?����a�P����In��E���A�"wCot�9�Esx%O���
�0�#�H���{�2'mt�9���{7�+��4�%�����>��x��i��?���L>���$	z��R�c�~�r=���HG��������&�]�=v�����`�E���K71(��Y��1��!�kRC	�'E@X�����wK���W���;|\<��Z	�1G`~��c�	����>O���X^��#H_�{O#+�Y0?���>zX{������	f�0��~����/����o����>���H�^��aZ���#�j���@���
[N����d�y[����.�#��;����=k�|D���$�Cn�h�����"8�^�Rhjl�\E��
D�X�&���4�Yz\'|cnx�H�q�P/�.��,Z�*�xZ^v���?������u$^��������p����:�~��\G,�B�����`tA������?�wkl 6@S��
>�Q	H�=Y����`U��g�}�F�@���K����g�������(���?�7Pj���h�����?��xl�W'n��K���;��8k����+H
?��!Pt�J�����"��
�
�f�+��g���:�\EJre��=�mT=�fI(�]PD�-�������]Dh��u����D-��� ��e���	�����+,�vs��,)�.5��85��ac^QAm��2.0y\��:���:~��7������&W���Xy��d�����`\�v|��"���5e��@q��j��1���������A��_�~^�B@,|����J�0���������/A���B�:��7uJ�Y���:"�(WK��m�1�<��3��D6$��g��-�b;�}?W�V_��GAE����	h�h�d�@����}�}����.N�L�*4��9,��o�)
N��)P��`/�dO��~*������e]Bz!�	�*������#���yL����x�{��jJE�i�����'�"��_���}����n�U
�\�u)��3/v�)���}�s~�\:�R�$Z�
.�J��%�}�f5
��#�#�RF��*��
L��R9"��2W�����$����s	�L��t�����z��������oJ��2*���&�@y�O*��Ja���&���������2�K��&��=y��)���_��*�E#�
W�����U����$3+C�\�;�kt����r���3X�E�?���z��*	���zg|�� �����m�sRzc�c��xn}.����D��h����F�����g�����d��(����u���h�tD>N����_U����.+nyH�@V��
�W����,"*�
��w��������t�)�N�"��,���Q��1�m������;�)�H@����$�.���8��R���r���
KqxwUD/�|wl:��
���%�t
0p&Ax|����W^G�d���	q�X�<������������K8�b ��K��*����c35J;A�����GH���g����n1��Jy
��z%T`�~�s	�%��j7�d�U{2&���������i���h��$�a�l)�$��
�@�9T�����B��@I�����"#��R�5E��~��b@��N��R��-�''^��������~��$oN(?�=!�dcg}5>�1���h��~c���Q��N"n�;q�Csw�dck,�L��"F���f��k$u����&�L���@+Y�KL�f	sVD��@�[������#"U�.��O��z��I(�-nFW�_�n}vqt�-����X�H��R��H��"R�FG����k�G2��f�3F���G�mJ�T��d�$`Ty-�1]Q������oG��0�K�d�r�Z�������H�b��
N��2���n�A��g���d���B���9@/<MG�.c��(ZK0����@|�h�$*�"���*�p�"�`G���0E2L,�#J��t�}t����q�R����������[���S2�E���r�P�a�N)��w��n�f������!"���I��H1E�Q�c������m�fo�����`M�?g���}.�����J)�;��]��F����]Q+��Fv��r4�����pOD���*�;[��LL� �����HX��N�����\\���P!=������@�a�����ji�H.#���9`���({vW`&}PPS�y�>��2k�R��0(�o�������u4$g�q�:'B2�eO��'^`GK�l��&c�����Vi���)�j��'������5�J�����$����2��������>���Yh_��B#���x+�i�aA�q�zw �3�	��U���Mu�'s�*U�@W����@���"����(w��1�@�����F�U��I�Rm4t�mV���y_�f	��M��v�a�A5/��'OL��Z�dDc�[���i_��l�\GZp�
�G������4q�J�'M5���Z��L��j���>�Z�8�J6������*:�'d}}���.k��J�R��K>s�VKgS�G1�rc��f��J/@]�T	�W�DEN�y�j��3�I�L��������$�5����#���2��&��A��R���d��L�(��F��}Z��H@���/��s���p���Tk�_��A�v����|������'�����	�P����Qu&u���k��L������F�fB�UA�#�}l'MIa���c���E�a,�9f�����k�&=(���}.S�����6��N�K}������y{(>5��h����+?Y���%|^^J4����FV`YV�M�08�B�a)�MA�>a?U�?e�x�E�K��7\��M�O�VA�TC���� ��ec�7����%�$Z�j:�+����[,�;mB&��5(�@/-p���d������(�u�~V,�t&�aL'�%���:�wZ���$�� �w������Vw�����#��DK���3o@���}t�H$���R���R�F5a2z}q���9�e�6z<��h�w����W�MBIo�#��W��j'�P�U��P�d��ej}���c��x�
����"��6��l���!���v����TQ'
���S��@�T��n`�7�O�!��)x����'O.��u�}<k�D[�X�!3�!W�HbP�T �E,���SG_K�YD�������~�\��V��hI�����$pk3�����h���_�	�Gl������H�Y���}z�t��������6\"z��<#�5����,5p.�����+U2���D��h"{������Ts�_��dGm��6H*������J|!�.(�2I��(���}2D���z/�k���9�'��6��Y�����"A�r�&��S��	Q���~v�x{���s��=t�i�	�U��&@_���K
��E��6���]3j��|���Y"�Y��������.z��OM�������j?������g�����h���}�e$X_���7i��`}���1Him|�E����^C���'v�H�^�?P��v���
b���&�?�Pm����l�p�����	��:������Ee����~mxU �k��	���&�{D��$wo���fQ"`��
�Lx���h�l�N���:@����v��[]Gi@-�K?����}Iw������M�[�#�D��C@��Nz�������9���D��;�R�Fq�����m��6�������eLi�0� ��m2��$iobV",i�JtP�
@@�z#�W��e��=��]�Y�5
8{�+�h��`���'�zm�xg6Ai��4��w������l��@��������b���'�n�Zon�X���.���e6������������4�����pl�nB(�����~T��w��0-���TK���Qe�tv��$`��(D������4|�~��V�&��X�����0�M��&�`&���2�J=fuIMT���[@w���%k�����-�o�V8���m>��u��&j`C�@����v�+!���{��E��|q?u��_���%������(�p����6E�[=�.�!���������q�7��>o��?����=X��k7���A�Z�M���Z�7�gQAdp���H5����U���La���]y� P�gb��.4iC6>�_~7���}U��O!~.��RY�D�w9-KBet��/�(���vU)G�oo�������7�;���C>�����M�Y}+A���;tV�"%���/���/�k�;�Bk�<����}��E�Jb��EGD�e/v�x�jr>2���$��~����H2�.J��3�������-��~l�	^�]KJRw����EPDr]��q��l���'aF)AE�q��$�X��27k��(X���#!���	bJ�U$�+Z^�cLPK��� $�����������#�@{sX��i�-���o�y�v�I�SE\o��0����%.�E�������hn�t��vt$�M���Dz��Jr�wIPMaQ�v�-4���'6�P��[[n@���@a��n�~���o��}�u��<�?��F/���I:��b��%�����M�1c�1.^�	��E#,��K�Y�L�B9a���Zz�-�r����.Q�tw+FG�*�/[0�[��-�h�Ax��2\V�8I������~�A�4.��ZQ��r�E���*	����	��� �`��n���n�?=T����.�����V��FO��2�z�%!-tO�f�
���V�z�< ������u7m�h��xrf���q�(�m�&��B�`�'CZ�F�&@
L������ ���B
����]�����-k������
��w�@��Q�($�9�g:d��9iX������QJwc����g���D�X)�����v�;�]��3�Cv1GT�zIp���c#����Zb����p��\4��{\��J��	Cw���H��x�8�D����B��;����~�]�Ay��D�B�x�������uGm�o�)�[r�����=p�f���6�Dj��7(���_T����i���0A@����
��W��4���i�
bah�����&���2���u;���xl����{���=V���d�!�c�O���0�	���Q�:��4� ���B�G��>���h8��6r�����q�l�C,m���=�	x��,i�]B��$�l��Iz>Dl<N����=������4e�1(	�4L�h��xDo��@������,-�L���=��������ak	�3������|��8�i�t$�I89D������
�&C6��B�y2\�v��>\�p����B����er��4K�q�X�$���r�;S�?�2P>�D�0����-uRY�]p(�&q�]��0�oqB	���\}�L<qT]���DG��=�|91j�\��G=��������at������;�VE���i�����g%�Hh�!~`$�
I����d�~�tw��'���.#G�`���n�oRq/��:B��g��Q :��"Pf���/W������_;|r�h���?:=I����""p��l3���(0p����0�c�;�Zq��	TI��!na'e@�%	�E��x��T���S�<iP�������7L�R72F�L��Jg��H�33	����a�')x����J�0_C��~0�k�Zx�a��@g���,��h����?�t�5�08D;�5a���<�
�'�v��/�m����kR�0�?D���~�{ ��^�Q���
a�Ni#Q��+��_p�M�7$u�cY.��	�i� "v����]b`(����@���0S�}	p����8�E��,��)���r�&��k|7����w�oP/_��w��!*�.J����b�]�T�����H=�oR�7���h�B\<!�J�q~
���B�I������������p�B��dP�^���9��i��p�]%�D>����l�my�&�U�]!k���#�<�Z�{C\�;�Ln����X���0r%�� ��AQ}�aq
d������+ApJ��LJ8���Cj|�6{E���Q*��h�������_p�d��t�N��)Fv��7���6K�LV�,�R���'d5�{!_�jH��B`���I�6]��TS������%h���#I^�x���^��I�kZ_Lf�l��G�$��v1�exS�h��"���pJ�+����i��v�e�tW��h���I�.d�!���ux��M2��4��FU��ew�;4l	��)���d6�%{���m���w��9���I��B��31��"$"g�.8	�$n��� w��b�N�H��}W�C���bp_��
�l�Xa�c@dE��I�����������w��Uthn�Gq�!���2�H�H���_�t��x�������Gj��q��a�2��X;��:����YGs�{�Kf��3�'��MS��%!L�k�t�����$���������w���A���=�Ty$a�!��`�s���. �Q��f����S`2��$t8a���y��*
u�E�%e�J�i��E��G4=��O������Bw�����a��N
+�t�|j�<�>Da������k�s7��U�����!B.��� �CfG�#<�F����m�����x������O��)�!�6��(����D��(�R�(�U����Vs��:��JXG=]�A��pq�����;�5��3��s���wF������Z�vL��
�$�3h�K��s��(6�pOZv'B�i�!Bv�<�GM�7��)�����/p��(�������uB;��m�u��5^���I��b�69Q�+�l2�@�n��=������1��&��Dv�W�|Y������K-${��4�'����x����Dp'�gy[pQ7�(���%{����XL�
QDj�#���{V
MI����������K��\,���3�r5(\��FJ�U�cI�}��������o�`�%����/�K�
��H��c����#�^���"�����U�@I��������G��:,���4h�#s���BP+9�#4I� �Z�D�\������W�K�������D���o���9��K6����DB~�5���W����R�������:�1����F49)UJ@�evo�G^�� D�M}	�����z��j��g�r�~.�G�Z��}�<Cq/�d��p���J����������)�o��p�m�y��hK���ab;���%C;�2FBI���{���%c�F���%�������|�FJ��%�A�`�I��D:�TBWJ�*�~r1�&1��`���[�7R���NP}��������z�4��Ia���T�@e�tUUnr�!�q�$�Qq�r�Cy���
uj�1�+I�N�[��LbWA�\��9����.3`�X�%��������&�5��=&��P&XtM��@���u��64vwCI�Y�8��9���	�}D���-.�	��LB�=o��H�wg�����4+��$pX��l��i/5qA(�`=��%g�������Lr���Lr���
��2���d�5XJS������(�W�(�-��m��E����m��:�e"a+��
����nGv��k,7=l�9f�%��hV�"�%��\�U�2��������-���6)������W
��c���1�7s��o�.L���j��D��-G��r���n�������.�I'��<�����e{"(^�1�+���E������7�^=���/�d�-=�����%�st�e���u�7p��$KL�
K\�4�����H/��LV$�
�m�@MBM����J�K$��� [.E1��	�G����u|,A�
���*�u^�{L��;�?���������o�y�wHDP�x
���kJ'_Z����f&6�K�EPX�|w��r���='Q���[=��g����M:� �n��IU����=���i�^'Mt�wR�?ad���!	a�[�l��e)��T�r���i�\����SM��mZ��$E���MY�4������p��0��or	�tA��EG$�v�
s#X�IV�H��Y��� �������=��#�~�z���`#u�7����p�y�V��80�}�)������CL�D���9@ QMJ����[1���[J�l����������D�EN@e���{��?[2���y4;A"��6dJ����E'���v��_�&>�@Q��-2b��o�����nJaBb����M4��~�e��KN���
Q��d�}$6K���7b�KUy�
/��	p�1|�!�=����jf�EF��J����^��
�m���I���f��C�r��_	t��1D��[��O��E��;<G�����b=�)�Q���~J�Q��(\��Em8���Ld�[�E/-���5��K�����%KR�������f���3ZKb
��@��t����)m�x������RE^m�J��@C�&��wPjpJGm������-��dcdo�8�n3����	D��N^'��fU��h �t:i����y'�����%k����J_���"4��h��M����*��[�P��2[�m�q49`	�vf�P����wd	���B�`�l,�A:������q0O����[�q�3�:({wF��6W��(����FK�D���@�cM�9��"S�n�h�{�$w�-
y\oH��G�A{��Y2�������Jt� ~W���U��:�<��y�*�I��CL@�XC�'[����"0K�nY�#b���8�'��9U�-#�u�������@��Wfa,�q����c��.�Z�wQNFf9���������Jg0k���zd�[,B�*je��R�mi,U���Pl	��_>!��G�gm[$�W���E�r���!�x���A����]s�F����E�6�M�<�y��'l�q� ������+��v��07zC*t��kR���-�_��r���R(�����������e�6�C�s�g�c� 	�Nq��1W@r��[_�����8.FU�%:����5q_=����P�����#�����j������3�[�_m=��2�$�9b��$�����]#!&�aY�D�u���=�
"�$d��,G��6���O�q3Gy�q���9]�gD ���c�m����.����>I��I�i@���I8�<�-�O�(s�w����?���f~�x���
������
���$�/,]F8�E����(�] �����[0 ��@RC�@Y/��0.S�t$�R��2$��g@�($ht����8 ��5����Y4}A��#��:���h�J�u��������X��o r���2]���=e���o��P�s��$/�^HQ��6x�'"������&:�^`T�s��=���V�O>b��10j�z�;"
�?���MOr	�>'7-��y����x>�����E�I@���y������ o��${�0w|[�J��|D*��,��X�����������]Xp��=���UG\��f�8����m���i4���S$�R�C�=�������G��\pg}���U�����1��TC���:���0k/)�}^��R�$�xE��W���8:���#E*�#"j4pL=�Ws��J�$�f��{���%^B��8���e��;�O��	
����#
B��'��'�����$��} Nk�U��|
���|29u�%��&���A��aU��>�����c�.x��`��J�G�
6qQk���
��Q�?/!��� ��Kh��+�s��n7���'���H�x�]����L�0�@v����o.���m�qF�����{Dy%`l>�5���?�&�3�,��)iQ(O>�u�.c,U��'����3�g������g��;�1V���U1�_C�1����9i�����4�o�Xp��GB��O��]X�3�K3T�:9<�GrO�{2���3�9�A������`��(����&�IX�mf���j��t'�B?��j���EGOf��{�v}��D�d���L��G��[>�N]�
���%����pF�'A�x�s���2�3�{q%c������u�hA���������R�0��(k W��t�`�m�5���S���>���[2 �=����0N��7A���hEf�3����3�F5w�%�>�m���_���,'.,Y��d���t�#�Jk��g�����K���4���]���3���mMD�L�
h}�<PJ�+�'y
vM��^
�t����N5���u������g`!2f~�������T��w%�M����I� E��[`���� B/�7A6�}�$����9��}��������DE����8�s	��@M�#�y��,(�������y���$6	e�2�I!{N;F'+W�BU�6%{��zD������ae���?!�l0�=���m8z[��@����_�t��?�P�U�}���j5��~��rf���bL!0����	�V�3��%�R�x�v�/��Q9T�Y�~�@�f��=j�M1������'1y�\�����X&�]n<���:����JC��G��X��%�g�m�&�)
���sEeT�R�,���4�~�h��s�V�`�m�0��O�:*�������Zs2�T�"�fZ5r��<>�Q��=mG{�vRpCbv��-#{��Q��g��P�v�z���m�����a?� J�~ ��b���[�@�b�c'��wT�L�TyQ�r������S�����G��/���f�
\�bA|eJ�s%�T�f�l�)�S��b��"v_�f(F;%	/u�������@���h� �����	�UD������-������d����\a|�N�����Q��2���z���$�"��R�C}-����)���"Dg�#��t��2A�H�
�j� O�$3-�@��C�f�9ar���:|Z�3.z��CZ�_�Z\�0E���RD�EE4	_��9A%�����r{����s������}P�����M$�����	]Z�|���2y�j�C7�d`���-!.��<Mh|��J�ZD6�q���� 3�0D6D�i�@��t���m�)$)gI%|��"6�J�ik����M>Z��h��A5��Y�l�s��=�t��`�%�y1��^�^Y��7��v4��V�4�]���o���i�"�tIQR�_K���c����nW[������"����(D�P������x/��]�H�0?���`;��tkg�U��N (��j+QG.�#�F>L�n����T������&T�G{�������|k ��m���o����b�xW��#�Z���h�U�z��+b�h��wV(h���n_$�}��T��X��t���#��2����p�����f;�$F8������>=�n�D�Z��m���`����C��}@�F���n�S%�&T�ylC�/h�����m��lwOu@�������v����<u�U9���M��i��h��������d��� �����yv�
�%�G�\�}���
��l���'��U�aIX{�E�-��%�WlDK@�"��$:�b�� 4���k1��@�E$Cb_]�[������@���e�z�?��G7`g7����A2Zp�j���'�-��.�\�n[��%S���3	��x��y$J.�I�,�&��!�p]��'�c18(��dG!���hi��&H�ti��\Age}��)��a��"Y����!*��u��-�50it]�y�S�1;���*�6J�UR�\��(��g�.�wDhG�p�	0�D�\�.P�Q��J8�*NAz<r�d������cf:0� �IYMD/���x�-��|(z
��RkH����g����)'^������1T� �cDB4�E#`�)S&���b�VQ ��������.��{��z�fTQ8�Wt.T�#������R���G+��,N���9�c�x��W���aVA��:����
����Oo%���^������{Z�Qm�D��,B�d�����q�9�/9Dj�Y��PU�Bq���8���BG����	�n�V{���^=�J���c$��8�t��UTB2��H�[���
��y�U�lvAB������9��6�\��/7A�g��M��h��,��
��������	D����k��GN���S����X���;Q�U�N@?��U�Ab��������iE�����PV���mNY�nGs��o��=��
pc������������6��k8���1��P�X�g����kQ�k<8[:��
�c�M!c�t��
�G�����l�62wN�Q�����Hr���g(���<Y�n�P��f�Y�#TQ�^
����]�FD9a�i��(�����dHlAO��*��S�%)���~[Kd&�Mr��Y��p���u����{���r�h�������1e�	6[��y���n�b}D���mx�2����0��> ��F0y)�0���v6���e(
g�Kd����~��fBUUq	�=X�G�����a���'���7_8���q�h����5�s��!J�l��Y�
�v�p�����GR�R���-"9��.$������NR�^��
��	��f�j��+J�1���bD�����q�)?�4����@n)�1��������X ��Fn��F��H���V���P -�K�y�2	o]��F��w<K������`A��-�]�����T������T��j��r
�s����Bm�d4�>?�?�X����6�'�PWm�q���]g(v9�/�
��@��dk�����

����hb	NB�6�%	��(�d��.��������4�t.:��o��|O���s4�'�!���T4���X,���!�j��5�E����o�+(�I���,z#�b��fu��p����QMLxZW���h��������"eO���3Y��,��q�	q�	L��!:vQ;�$��0?Q��4�����&�����o:Q�H�V_%n0��?��hc	@n���'k�T��z|�'i��EP���������	����H�C1�����O�\v����8R�B��]<A,�����u�6W�Gu���t��Q%��Q��ck�����{:N��n��p�M�/sM��	M��:2������Y��2J�rH
0�
9v���UY��8m�����'qi��8���(%,kj"����
w�Jf�(������'�h������=�+����I��J�����g/��4
�9�XI��C�n���<C�Q�`����7�h��Xip+F���Eo@��H0��vD��3�U�_�$&�&��@k2���c,Z\"��@EoW�����#�*��1YyU�:��~���8$�O��4J�\B����{?�q,
 �7�=n�e^s�=C�	��vt\�+�>6�
���%r��b�A��.���%���~,��5���k���kpR�8�6�'��\P���hmS��	���I��6<������C������]MQ�BV�q.4�-�;�*�FL85|���D�\�u������	�����v�.�����i�n_��`�kc�o��0����}������E������%y����P��}U��7��4�`�(�r�A{�n��
1���?�=P���z��%�c
�{�6H0t��w��?�7(?�,������?�����A���������9L��&uX�MK��D�]��<�>�Qg������>s�I���%��"-�<���wr	mu�������1�t�F�;v�]F������M.\.*=�bN^t;�6��Y�����Q�(6�$�����hx"zw�nK"P��f����I�����M�o�B �]���Q%����:*	O�����8�� �l������2pQ=�)K{5�/�~�����Cx\����%H��
��~���Q6�C%BU��f	>�����*5�3W*��o��a�,��xE�Xs��IHz��#�)��w���g��d�������"�d����P�&[��Q
>3
O�'��F]C��"B/h�1�������c�u�Q���&t�7�*�������1����;4%��B�'V����<��&������Kj#6���n��n,#zs�*�J�+��
�������G�(�gE�b	�]
�Q�w��CAv������m0%����Cs�s<��0.�������}8����g�d���=��_p�N�11�=���.�@����X��y=��0E$��}E��`���+�K�,H�T{�����Li��\3��L� c���|s�����9]�Fh����f$4D7��k4�s�F�]�����g������\%�����
�8�"TA��W��-	�����`~�J.�(��:����p�@��JX.��i���6�}$(r7�@fFw���bHM����u1�!c���F�[v	�q��������3�yI�����f���tKE��m�N�&��������&��
���h!9��u��7
��u���ew�b��?������Go�D��Fm�b��������+�1O�d{��i9���J��w+'{mU��
ng�'����J0�aOD-(���N�0�D@��{2���k�|�����Y��x\�!H��������C?�dw�Th�����Cl��mS�M��H��.��h�]������h��a��V�d-�?��f����Wh�h�w��XM����`��6�O�y�P��N��%a�p?�$�b�P������5l������u�h ���h�,�J>N��V3P�*	���m1���h]�Z�~���e2;9l��0*Y���>%Q�9L�-4�R�!�F���v���B3�Q�7�T��v�<)��X!�:Sd��B9L��$��x����Mf\
Q+��������9�[hPfBL
�o���Ha:������0�K~4wC�L���4��	�2��.��)\�x��v&{�m�'
��x�"v�DE8��d_�X�U&a����G����	\�+�oJY��x���s6q ��et��~\����T8Rp�C	zB��a:A�7t�����F���	�GhA�\�g���q��'rIOQ���0��lZ��O�
��%i/��I��[���s�7w�.QeqO�E�nmp�T��\�B	�1\�@YQ��3���>e���%!@�H,���a���0�s��}��/c���D���v��;���NH��+$^OC\��!g��2���B��Q0xY�v7�V_|������6�4�=��;A��v��i�X�D\CM>�/o"�-b`&�I��=j�5D6L���Y���=�^��n����c���P�������M
&�*���b�����D��"�I
J";& be�k6q:|�d����}]��Q[�!������(�)����&%*C��H�F
1
a@��Lc2D8L�!��b�$�Lh�q\e:,:��{��sh$��%:�!��&�])��{�8L���f�s&"~<���X�t������b(���d����1�1K?�����r��
�p(R1��N��_�+:��H��������7������!L��=p��O���	�6����+�I�~Uu.	20�F�X�(��<�-�o����e�[�;J��i����}��gq���pE���'��k���(g�m��oK�
�&k"��e�w�������@���=Z��6�������"�������^�2y�j�������I��J�iK#)yn�P�����Um���Qba�S4�P+�i��G3F���:"[�)r��6����)��"���v�b@������������S\\��i�!:�����������~�P�Cv��!G��D��Y"����)���OI����+��|b�{��N�����q����a����m��dvog������Z�Dv�Sd�#�ZTT"�IN4�OF0�����S�dt��R�W�N1w^F\���D&.��c&y���~o�Y,'�	�8E@,R�$S�" ��'}Y�l�_b��� H��`���xa�8{d�M�� ����^�t������q��N�8�fB�N���PJG8����^�)��
��������I���3�}�J��N1
I����o��w�5����T���.T�N*�@�sM}��#��KJ���%F�.~WH�I��@b�rJ%���&&>(�N����[�_��6s��h�wc�c+o���f
. G��lg�$��!�@���~�
��S�=.oN��}U�k���n�������]�Q��F`x��Z��a���.��E.%������Bvd�"@`��QX���K�i3z��D�1����0D=(u�7 �oQf'��]HwXb1E�(G[@�<�GVNv��-I�@�SO���!S���Q3�i�"z�b6{��@�t����v�"��00�|���c���{'��L�����}5K��:[�m�te_�u��E�^��WX/0�<b���L��%��=d��nQ���nw�!�/i�x�a��h��6`�Q�-a�#����:�Df(�����	G��+�����a<�������1ouBA���6�9����N���t�=`�M&�Ht���/���~�$n�D���i
��$���u��kEs�
tXD��3���^�
�0a�,��X-Q[��/q'	������pU�u`�5";�����d�Pd�|�s�'y�'�6YRUn��K��M~��$	-�l_��.�����L �6d�]�u7�'c�Rz6��'�����r�p����d"�����&�p�����f^������v�X�(Z��
-wJVQH	��i���=��U����V���z�A>��''�,��]�V��`��
�j��z�E�ou�����%���������r�d�o������$��v$�^��|�:�]�:������%D$�Bo��4GB�Hg�(_[b
j��U�_SF@��:E}L����.{��@]�[��$7[�����D���&��'��\��4=\"�s���=d�=�&���ld.6Hp��:��Q���*,������/)��������57���5��L��Q��Lq����~Mo�`0��L��(����1,�n\�\;\���$4��NZ���m����{ ��rs���Xn�,o��
����%���F`i�HU���;Yh��8��u��N�-����
}�n-O�d��3B4����
-���$��.��� �����CJwY�g��E�����&P�eRg��
�%��v��IaV�4�20�KZ�.]60���Zr�gG���
���Y������E�b
��@�����\�	LX��^�55NXnp����������hl�%�s<��	��
��E���^Ab^3�r�%H�~�:h��P���-2��t���$L���7�T��H���X���p���q�J4�LT�<��W@�e�	�����d��.��Z����^�������]~����y��4q��MGi�6�O��v����i���[����pz�-�7�%����K�4jN��D�����f>����Cv;I;������2���`EK�J����P�x���-������a���`�]Y@���$�"
@>��Qb��E��3�~�$v���
�g�p�
n�tN�q���]�L�����!K�e��&$��@Q���4,�+������mQ��<����4#��.���p�B�z��%�^�d�t��6+
���?��EU����$4�f�f��"�=�	��M$i��_�O�W�]�Q��-��
�I4�[��$mW��l#ny���d>w�l���������6AT! {���1��%
���N���ZH�;�'G9�	@
�E b�&�&:\�
-���*�f�,F�%P�'�4�y��-���;�"R�������I��������|�*#������zS<r_@0^4go���=��X�n4<[K���-��`;����"�v�-@�D <r�<�������,��\_d�:8;(�,`�h0[j��r�-���r�C��-q%d���YG���P��
��$A�rgq��y�4(Q����w�1Q���2�������v�������$��l{�����dws������@�q�u������m�cq��%���~]Y���[<%%Q%�3���h��ScdVT��_�!<�n��Y��!���h�7h����b}�4d���������"E�v��-;�yE�P2�����q����* �������R �Ri�J�h�x���lW;������du���"���0)b?.��>0S%�W3,�#�4�:N���?�K0�����(�W�)��$86#J�E�yN��9"p�R��ak�$:� �8l��B;��t���=�j��(��M6yS
��xQ��`��>D�eQ��SkB'q����\�P�7��`�%G����8e]F���["�jlW0�$B=��(�@�dC���XI���<a������N	��1Zr�k�Av��	����#�����H s�K�'c������#�����Uu2��m�E4� �����
���:)��x�v�Tw�m��!�>g�v�Do�$�?���+����60��1[�����q������f�q�Zr3�(5M8����BT9|����G���d[���K"�8&�D�����d6�0H�,��������<���>�a��m���"~N�h�v3�����$}g�i��v~-�G�U���j3�;���prZI�w��rX&�q|����v��E1�;/�
�u�#I���d��(~	[�w(�}t� q��7�:o�WLJ	���V�{�:q��2ZC��#�q���t�2��~:�Ek����k�����};�KB��i/����tE_����c����.����lP�V��f�s��f@H���R�$E��:����#��'`�P�d7$��*��Qo�$>Argy�������K~Tp<^�t��TMjn��y�;��7�c�a����!X�.f���5)�=��W"�;��'��#L�^�v�=�h�4�Q���g��2��B8���.~��?��b��iq�6_���c�����h��H�"������K�^�-S��#.L��c�~���&��,jb@t��P�Q���B�%��y�'[�����&�����{�����F�!��lp�������P��'90>�0��l:�0
|�?��^�T�/����>��2�DVA�]m�3���~������������\G6{��8�#T�j�"�`��\B�'8��x�A7����r��C��E��g�
��.4��~.aN�1����>�E'������g����Vu��/���b��!�k68����,C�G���B5����PHR%�������@���j����U�|F������`��K���\Gzl:$��Q#�;��m���j�����g-^d�.����e$�I���u�w��*�����\���M��B0&���V��^x4b{�
�i�h�� P�}��L�Z)�����3�M�ak��&* i_�#�L5�JZ���u��-cn����.��(��?�\E�=��[z����M�����s{�pz3�Z@'~F+������xHZ(H0-L���
�h�cc`���h�KvS�5�+�����P%G�~^���������\F����k��t��\B9.��7�Xn~��#��.�Y�}L�����XE��Mt��U@QT�����
�(�V$c�����1�q��nW8D�����:�U��#�A����'��_�s����M�ar�t�&��	��L�����s���vm�n����{F���/�d��H�5mcH���wO��:z�&!$h&������.��,>3~U-�&�@U�+�!%}�e}�8�w�IA�r���;��	*��?��<P���)����A2(	�I[c{LD���C*#�c<�����C3b}:G2��������e��@�`-[�%��h������q�18�w�A9�Z����Id��^�Ty���AT.�w�:�������t��{	���xh�s;
N���->o "	jJ~J��
�\;
u2@��x2@L�{K�hE^s���1>�V��}uw8�u�1����[s���'&Az/]�wS���[���l=Z�;���iho3���X�&�`���0Q/��]AI��;z������aW��2��1�!C��0�O+O�9����B���9��W>AT���k��g1w�o!+�?����[t�b6L�|A��'�F�'h���;&'�[!R����Ve��dc�������n$'=+�$:=���;+�
:s���ZL	��V��W����+T��"{R1@�[)������TJ%J��2��o��V�O�C���
!�4�n���J��f-j'Z��JZ1��^�v����:&�1�!�L5�����������V�Ky�e7�v����L���7���1}��tR$���c����	�Q����U#�2����9�'R�{23�O�V����(-��:�����%���)q #
�B��bt��-(����-�2X��{SG��i�.��+����W�-Q����!�zX��j����d��hu�97�:�I<��e�l-5���\�� {o��g��S��A��&S����m@P����s����L^���H����(��5���$q�P�	P�����<�X����K��~t\��[���I���-eT��Q����K/KO��7@=��g�U`A������'���]AB&~�`f�� _�zu4(7���
;���9IyN>��g�t����L7����$n�������(@�|c�-�D�� !?���M������u�,R����[V���������?����������F�c�8r/h�
6flYt�"�����{Y�HK7�je���Uk�6t�7�?@�N+����LO�������?�B%��;����&Mw����$���������+���1F�=��X��+��Q]+�2#w�&t%��:@�����N���L�c��C���z��-��d�������A���'���R��J,MjQ�6����	��OK\:���"�S�X��F��;����'��[/����		o5p��Q�T��� �j^�X�vU�14�DzR
������Y��~q�L9����A�S
���9Tc����J"T���A�o��9�&A�L����At��DHF^P\~�7�t

�Tz����@���3�F��J�	�u���T�P5��jP�~1EH��g��V�~c#9tq������������
���s'y@	n���8�V��R����@�<�1��M:<�L����47�j��������;(��z��?�T���
kB���f�T�5�}����QUy�*�A�h���Ln)��j�(�k,��V���cW�Tj�:��ly1��Z��h�'��N��nn5�C�W2��R�HQ]{����j��	j���0��-�Y�����wG���U�'.c��@��Q��%��P���E��T��:���w�K)�n�6�m������j��_"���������`�Y5���E�j���~x��f�������d���I�7��������Q��+�#�S�t�
��=��e��I�2�q�#pw5�_�T���d��t��,��.��<���\T����<�h2#g:�������*p$n����q��8����4�?���z\=�����k�`@������(D�RM�`�
�&PR������)o"���$����,"�������
�����g�������h�����TU����8_�X�����_D�W��'�V�_��� �dD��V���FKBK��A��@��~�d��.wI��>NAb�n���2���L��"���Y��@��S�+kM�,�/G��n>TT%�We�-��4�?�6yc+n�V,$)�U#�����	F�0������-�&.��3+�����A��������O��h���|�>�J��b%"�O#z�%	x)?�������
>Ut�m����q}d ���������!��L���#�>k9�
��B�|_}*���}N�� UsQ�{)r��c����n��cJ�����%�i+f,�#���������f����^���j���0I-�W�}����t0l�&�A+?�C��F���i����3��{B
jKF��d�����	D������w�������~�����BT�^2��|��~T��F�4L�vRd����
W�X���H6Qkq�&X%��	D\�/����<���W'��[
�+����p��h��S#�B������;#*!�[��g�����7S����Y�-.Q4�
C�?��
9\�tz l����R�o��O���E��ffA�:#H��;�����%5����X[��u�i�K}����bP��oh��p�T!���@���C5���f�Y�htH���������H����?F���3��!wi���F�*���l=������A�,�&����#������q�����A��h������������<�
�kMg=j�G�[�-�"��"���Hn��Dz�t-�)t���{���2��Pp4gE2�1�f���h3��/	
t������9ZjR�E�<��ma�+���v�����z����(����tA[�fnA�������
���J.�����kif�_p��H�\���Ab��9��%�\�5�������\b��HK-	{$�����f�AX��*ew����s��a��,4�<�����t3���$7%��f>B����5�c�g�WJ-:hp��F�[%t�8��KK����Im��G��na�S�}�r��������c���I3-�!��?ny���_r1l����V�6�Yki���x�[ �m'�gp~�{p��%��MV��|���G�(�8����\�U���:�)�z���Y�G� =k��E��=��o���=l���1�q;���mt$'��uL<��2Q#�!&
=]�����L��_n���������E�^�����D�}��H��u!���P���r���%z������L^��z�c"�&\�cj9!R�n2��;����,F�l��[u��M��^2�����gO��TR���L(���_LV����T�����������.���{���(rE�@�.��,.��a��H�v��(dG�+H���0l��D
K��D�[�dEA/=�R��y<
.�G�����4��Dr��f��������H��� �3�.l�<��t(5#ZZ���D����i%�8m!sMb�;�4�-�/���I���x=
�|�� ���O^B����c�&O���O����gFt����z�"wmA1S����KO��|��^����tw�mH�����(<�[,{qn>6~k�'Mf�8�u	����/����"I���o�c�Gd�<��v�[rh3��XvK^\������1v�����1����a���U��!:�nhm��������S���	�kh�3��R��H����44�z�$@�x]SW�U�)Z�<��3����w�����D�;E�������`�z��T\��=}
r�P�������h�7����V;�}�l��[P�5J��+F�wm�z��U]�-R�[��Hk��[�g08~Oy���
#�I0�����Q{�H�����p@Up7��Y�7�P�<��!MS�f�U��	 3+��a�'��K��N�(c�CT2����
YN�&��1l������B�+Rg��+'f����cUm�w9��
��'���=��������]�0�I�1���dl�"{�#$��h;q����=��<���n2W�~�m�Rq�d��0D#ZN-E"�:\b=D:����s�1�g�:���W��0o�H�2�8/����t�������=�(��gi��%r}�Ja<q���nIt���dE�����V����e���{V�9���0�0�~��u�sR�Z�`Zo�1�	5����'_w%��G"�~~��:�HA0�'�Z��/�t�(ilVy�&C�M�(�E��Q� �r;3����9	�=�� H�H�[ �;���>��Ch��&i��-�;@_L�[H�B	��`���'�c'�����e|��
�g"w����,���rEj@���CMS�$;d�1P��'o$)�j�d�T���z�fR{�n�4���i#	����D�)����*�?9�
��b�r�NKhf!]`�����u��	#Q����'kI���a��D;4z�
4�=b�����&K�jz�
&��������:"����"����[��
�����d��N�QE��'\~-���{��E���~��@
��,y��Hd�=m��:��#q�H8�G�G���oy���<�;G��������>���2z��H���af��Hm�2��+m�����;�T���^����3���H���,o%�:c�?b.�!����-���6��:�P��u�<�,/�d`Z��=`�X1����`���*��MY�h�6���G|������E((L��#a�����A�R
�����.����
L�|T,��=�����aI��bTP`t_m����2����.^d13�FD����3�v����������	�����i���d
�/�?QPn�*�{�%ljj#�I��t�?����_��B��4%@(�ap_*�L=������$A ������I��8?]�����@����`���k ��^�u�:�E��D�#��w�@���I]����f~��L�����M���4�O����<�pMn1�uf>q!�0�{�?Fs���������V���;Q���I G���� �A{u�*qY��B��f���.�Z/}��2��Ed�����j=��K/1	�=���������?� O$�&<�($�{����2Xr����Q$�#�I,s�
�YfMw��@�R��&���Y�5����i�^u��Lv��?������G��o��j�e��>�^[�Rh���!Q12��V�Y?�[2����*���/�#�g
���|e/���e���)M��q����]x�C�:�w���GYH��:
�O���@�	{'��a��3���#�>zQvJ�C��4����E���q9\����n����xD���)0��k����=��0�l�G�:3���
�)d���&fu�-�4���	f�&yR��}�G��9�3�5G�"��}Io�0����\�n�iP��6}�^�o�ds�#�Z��;���lY�Z`&���F����9��~�%tF��9����]�U7������'r�9��2gL��P���W�����&*�w/4v��NC���m�3��5���oH�1
�g�A��$:�}�Z&����������������
�fPk�~o�S%&�(?g���S����#�!}��{lO)I���i�B�fU���[��VjH�qb��By������	�|�P�	����8����ml_��N�9����@��gY����TA��~��i�G�
sg+p7�x�U))�d��_��c5�L��������r�4s�s�<9F��
j%C��3>@��;D�5?9��0�6��O���UC����Xdc%j1A��tA�����Lj�nYU:���$���3/��	�~���vV"�e���6B,�'���SYF�-G+m��Cu�,G6�k�8���q��t�_B���'G�e�_���4�'��G�hA��+qzh-.��7x/uR��0�>��/������{R��8`r��`\�V"�%��������%�
��,���$ ��U9��`�j&"��+`�l3��{2:Le����8� ��e�Rw��rT�2���i�V|~��$��Iv@~�F����>���-��.��%W���?�.P��q���h����A�+�~�H+�Hj��?�Y�����h�6����%�2�B���n���R��2�/����-A�;8�������A��G)x����^�.���M@QM�����@���}F�/Iq
�[�����B���27��d	�-��*{u�B\�2��~����B���rP��?���>�iB���Q~�
���n0B9r}k��A�����=_uU�?�'|��	��������Z ����I�${�&���4��xS���F��b�S�ua��.�G��!�-g
c�m�G^n�|����e@���X	!�+z��{t�"����Va�m����<4��lG@��<i������T� C�e�@���SE���R!u���������
=�?+�I���������+,�����itdW���(�o�M@��e���
���7:�Q_��!��Z�����02��L|��C����u�I� gAVU�41����9<�Uc���#�9�������f��ow
@����;�� AY�+�J�H^{���l��0�=@Q�k������+�S_;����h�>H����=|��=�i�iQ�����)���W�3�XML��^8^��
<��P�;�����+��`}A��_�D^n\%W�IC����j����gD>�#�CW�����6���a��Q�8��_+���P�c$l�T��|B���6}��d��?��f��>9���0Ts.E�3M�6�����~g`���C��6��N"����N�����JN�:6�M�C"(��>��:��(������2���x�U��u��@KX���t��&"��]�����h��~��t�m���a����_;���Q��.}�H+�����O�@���-�����%Lf	��
�����$oS-6�n���s'���fL�mP�$��v,��'g����=��;�i��f���&s|��t�nSH��M-���i�� ��nh5�XRgT4�L6$O���l���+Q����5�
*�Q��6�����g��st�6E$�;��C���h�	d���;oc���A��r��e�����`9�����Z�-�N���c"����G�	.!���0�g��F��6%���hW%
;m]��j:2��PHY��������6�j��c(��}�+���'�G�-�:%F����Ih=K�8��5T���V���)u����$�0d�%���Ar�'��Paz
t��'P��N�{�>�:8ZnEJr��>\AI9����%�f������$�/Or��������6�$E?�+��#�iH^��k2��k��Qr'[U
������dV�`�����f��������r�|���L%f
��f�~������[n�u��~��������M/gxR9F���$�<�n�B�wH%[#��$�D�Ek0�?�w�>���b�t����*�tU0��4�����<������R��}���lS2��Ra~����i��������C"�E�v��jsG���;Eu����\!�^�:=(���@���E}
�Mn���.�o�l�#j�	ND��M4=�?I8:�d��M��U'�r���+��.'V}wa��*pMS(d�]��Yv�(G��bp
*9��'Zq���'�/d�3,D]�fE]0��<_���'���	�|&Y)O������Tj:��BC<�������/,��^N(E��c�1q�lM"���)��=��:A��NT����"D�I��&TII1)�39k3�>%-}O��)0�����'6�rSG�_���Pkr�=I"Fs$!�J�]�����	tv�3T�gKz\��m*��58-�����������(N������!����1 ?�vw�&i��<�Z=f������D�Z�Jl�PW�13�D���hn5���W�t:�Cx(Zw�- ��+�}}�N����V��!��_����'�I�Uy �Z�cAE��
T��s�
��!���8a�M������|����n(2�a���DQyzN�321�g�p"�	����>�`��w��1��Z�(u��+�g.����}�e=uc�(m�$-��H�g�D����t'1D\|��:�Du>_�t2���/�C�`da2^/��T���@X�In�$��8`���o|s/E���P��4P������Q���ODdg��e��Dc�b�BG��c$����B`�1���������v���?D��7���'=��#A=y�{�gc!��c|_��Z�����-H?���,YoE�cT��~U>�H��
��R�������:�����sI��}f.t�Z�}����"��|����;�������H��d`�
�Pf�Q��m1� ������5��6+��(���&��&'
������G���������m���hw����\�����oGv�v�F�&���@}���LT���l�=��)����~2i���Cd�1����������2�D���X��q��s���n��'�"���h��_�N����U<��}G�p)�@�:�iYg��:������i?�Eh�����{�KDd&c�����=����2��>���Di��I�X@�^b��}���h�B
�����;�����v��2�S���g6M��x���U�Q������L�_�aq)�%,���'������.���w��a�N�\����0�!���|��)
�4`��@W��@���3��%1��;�K������%u�x
�����������$��1���D�y��	Hn���`���G�A��m����������f�lx���|J�&
��{�*���-�"�����:�����=�<w���%���;8�P�z��8nI����{/3�{�19y�1.��o���NRw#�m�o��T�����6���
8�.��	0�wLX��$���6�	m3��wt�]�r����s��7�ia-���G��h8��%#���� W��zqh4���jr�w�
��f\c~��h��
�$�m����p� ��'�����j��w`���c1-��=��-������1X-��Ji�;��D���$a�b�a����_n�`��B�W��%�����������@Y�fp0�@��k���K�C������N�vgo�����e]������*K��I���H��c��0���I1������hNjp0��QU:��{���H�t�U�e����{ ��v� �w`x�O�NL^�Jw/ze;t��#�?�3H��LLE���p��s?��e���w��br�:����������{�����0��[� ���qbH5������d<��� ���tRg��oQ��:!5��5����M��r�m�dqI2��k��x��A�a}���;�K�q�11�|���W��=�������%b�����_���x/�e�}*
�}����/��?%�g/�b��m
���&A1
�M�RZ�b�H�R�@��]����i���h6����$��w�O3D:"�qn�����^���A��������Y���4����#C��r/�"�D1��Ju����It��$�� %:������fczV�o��K��;-���~��hO�^��{:��6sR�S�ISK?1���,�����f!OI����CI��-��V�������W
��7	��%���>��j���w�O��mvD����~�U��PN��X.�����������]����^���c�^�;�/���l�VIz�@9���,���iFJ���PC���/-����v;���cj^�bb�!:p�Y��V4�/��L�������d3�O�A�D��6��KKc�,6�42T%?�#w�T�=-|���������/D�Q��`X+�R����@�����m����n�9��;@/O/=S�:1RSG1����p[{��B�����.�FUN���G���;��~�Iv|C���l�"���jp��B���?�����X��u)]�u�q��P.�}H�C/�
::B�"F�lB���v����M�0�lJ�����b150��F��I~ex=D19 W�9�(6��&n���)@�������d�$E8�-���5tn�h����~���i��1JG������,���I[�8�@�%t�(���JV����y)�T���cW������tQ����f/��1����-G�8��ni���,�MQ��c0C�^L
��sb'���c�����(����V��>'j����M�[��@����@v��2:rX����#�4��w��g��@	S���Vr�T��)t�$)P��O������?A�r�T�[��P��@�����jv�u� �^�����w������$��<�����v�{����V{150�Y&Q�d��@gR���WQ)j�����|����z������;
�r�9������>�.�&��W����	���e�D����*��������}�I#��+�C'��jx�a
Y��<������.zt���������`=����������+����SO�9>�������'�#���Q/�Hu����c�_��-���������:'6)H5��� o=b�����7� ��j�k'9C�`�����x��!��l�2�5�"�������R��V���W��^c�#w�;Ge��r��E�����3��%������y�id����<:��U�!:�����{m��X��"�3����>A����A����`�(ON<���H���?j[���H��9��S@~jl|R����Hd?_�A��{5������i�,�9P�U{ �b���=����=�3���;��8�Od�W"Y��L(MBE.��B"��#EU	�$|l�H����(�&X���B��3�����k_�u:�����&de5?�yD�$�����>cT���#�����5�������PS5B}2f��[�
��l$o�X<�=�q��J#�Y�w���^�!UUg�jj4�J����_��lYJ6�^��cEGa�����;���Nw�f0O5��V!sX��+�uw������x�I0�����~��V���4>o����r�F�>C���e(�~��U��/T������D�����7�����~�������������n���(�A:D�;��
����������wV��Df#��~h��~u��5��J;��v�`w� ��z��zI
/����'c��P����
a�/wP��{G�p������}���_S���1��I.�����/_c�~9Z���-�&LO�B��y}Xz�~W�d���;�-�K�^3j/�HZ7���'��IK/��}�r*t�L,�l����+<����N�������e�I8���,=Ue������+�J�����"�gp��&��l�d>���u�����K2�{�]���/���g�1lW(�b8�������%{r3���M�}n���"���o���"���>	����O�����!3��~W_����
������-�}5�yP_h���]/(�j�����P��:- �^�_��I����l�6 ���K�����w�|W~�d���K��W�h=5��N
�n!����C{Y�gz�F�����N�����N��#���Gd{or����������c3�/��R�����C*�[AT���>��g��"c�7$�`�_x��I�(
[D�h�|N���5��M|���+�#�	T=��m 97�Mq�u3C���t�$��fXT��N��=�x�U�$��xlR�.sr0�<�D_V��bMM�d�����3�+*G�t�����=����_/��F�\��m/"C�)�,������(�B�-�?�Au��E����)�O��5�
�����/�f~AY����Z�`��L:q�5Q<���K[�������C�������s�V��~��B���m�����_�*]e)�_a�"���[�&c��f�	��D�/;V���9���FM,H���$I�UH���fbA}�����z\!����B^��x���uB�43
��aaXe>a�3X����o���9���ga�<R{����e3��g/w�q��"t�Y�B'����[	�]tua���w@�mg
-���U���g��zt5����<��Nj�A����t���f�A����1J�}������Px�X,���}~��Q��H���=������Z��1�����n�E\=�9	��*�7a4��y�%��b��N��{���
������[0!W9�ww���|�<��4�q��|��$�2�� ��g/Vr.��T��Y�M;����3�����l��ars
]%K���tn��T�����:Q��d�u��b���D7�'�[Z�'��^���c��:�{��T�#�}e�n���)����/{�� �lO.Q"t�	H/��"(���
=�?'
�
�?G�^��������c$W6���"M��"�N�q�x����'�P1��i��Tk%a�dg��P5���qZZ7�-��]L�����������SP����{�'y�-T+LE�!���P�@�6�=�c�~D���R�m
�x�nVA���muv����K��ky�����@f$�j�~���u=qV�<q���'�,�<��F/���.)��#VU�D�B����[AlrO�A�)_���>F���_����qR���p��H
��@,��<*`OT����Y�C������ ���=	���j��+�Jz��	
EV���A>N�q�Fs� �#����;d���NH�z<E%���q"lJ!;b������bb�
h|���
���� u�#�!�B:��6�n&B��V���}�H�qc���&�D7!![Q3���b�655a�4���(�a	�|�rG.��Ze1���L�.U7�v�v�)j�lEE����U(2��%<���E������O�.�(}����U����^��Z9�o�J���"��`��y���!�+{��bw�V@J
�(��'����=����E�������lTN��������-r�4=����Xv��@�PG�u���g�f�~����v�7��=|+�6R1������6����<S��C�t���D-�����<����+sO���gh���^���*W�
�?��;}���Q���lf0������%7jA��,�K
�@��$+�A�(9tSj?qj�
O����U���]=���T����I��=hWF{��~j1���l5�T���C$�#=
R���:����&���Fn==�!p��h;�B]a26�n�WX��Q��pU���M`)X�'�R\'[�0�Pz��s���t����u�r��!�����KV�b�(��u��+d#
����&s�G)���$��w�pX�v�4�zl��nS����H��0���i�l��=����H@�,��4BD8��;�,�e���L��s�M�%��w��J��Q������t>h�z>������'�/�^���q����$m����N�]'�\��p���F,����b�J�M�#$E	�^F�
����
�GK��<t4��j��Iz!u�x
�:�X�03K$FQ�H��!=#�{]���������+X���>����:�j#���@cf0��I�Q&J>�^~���6n�h��������s�����E���
8r�� 7�ab�jc�8���?���J@���
r��w����>�a�A���g����`�t$��dL/���6Z��Y���(9%K��H��0� ����d5%�+JN!�>�/�sD�np�:��)dr��Q��F����)��LT3rP����:�k����<S�0���"1�#���oO��}9t���/�`'BD)$
�L+��aA���UH�������i�"����+��w8a2����(:	�%>��[��jO���t
��#y�3�S|K�
�4���d�-jP��D��I#j��
�g��	�%�Q6�]��`�s��B,oiy��!���J�1t`k�� )�*�;5l�M<�F��H��H^���z����J�:����j6��L?�;���P��0!�R+��/*��f$�a�3�&>�#�Kw�[z��\B�����!� C=��$/FE��W�N��%�8w��c�t�6U�r��}rG��X3a1?��I��>C��r?�n1E�������-H��
khN����!2LbH���M�M��8����h)C������+bC���d�s�sa>Q4��h��mf��[1�"��|������E#����RU�/x������j�V���[�	�|b��~�g�Ugy��~��\v{�}��Qb�N�,��� t��� ��2I�1��0K,��r�-���,�d��5�E�fI+�;qR�P�1c���QYp��4�p����9��7���Z��{&5Ma3�H��%iG'�����$g��������_�4����C�X��{���|t��"��#6���B%��4�`��HIMn���&�	�����aA
�L��)�}]�	����%B"	�!���0�����#3j���m��$4GO8�F��|�T�B�EO)��J�I�/{�1p�-'m���=������
�X�����AB���.ar@�j}AY��zZ�6���NC����pI��k���L�1*b�
��6�I��i~��v&C�gC2�,�N!������>�	����Q�
����6C(HV,9�����8q��	2Fwmp�����#�(�Gm�3A	��B�/~Co�(4K�>14�F����f$����	[�]N�:�~�w����A��G�d�@�\"��	�4�����
��we��yA����l�yU
hW�,�8 U2������-K�N*<��n1D��i(���~��1n%�{iD�^�`�4\�@�Ya7���dX���+��d�3�f��/����q�B*?MQ	���:o�19bOTk������o�<��kb�22�V�;*�
��_��>�i�^�r��>Z�qc��.�6�������:���)QZ���'�j�[
!��L��eSM^�Q|�G.���7K&�1�J��f"�	�<�Y�N���.-�T��t�i\^o������e0��Pq��F���dUkp.,#�����������T9S���#����@s����-)`���t]���@�D���QPf����2p/�����sB����w�@'������-��(�;Lc_�Q��*�X�O�oWT'�u�D�}�B,�9#��w��������2�ea������d����7m0��$F����L��������N�.�)���.���le^�P��>qp�D/����YaEU
��
�;3!�YRl/���z��*�Z5��hyn'�=3�XT '��n�e�J��c�D��{�!Kz�A]	I�_/�!mF�H�&�OeD���:�f��YF�793���n�$�Z��.V#��bo[��� �E��������C��lcK�1�Oz���5B]��z�����+�?�8bB��5V�d����l�	L�����sSA�@�"��e�_�=��t��_E�!�2o��_#.X3�-����TC)+��d��`a�����V������������5��#PO_�.v��33��JX�e��k��c�b�KH'-���&IYq~�IZ�����*�Pq8��k�@�&,�2O�	9��	���������+������J������r�"��a��k
�����3��Y�T.�h31�����Q�V-������ ���}�aJ6��xH�A�W��%8��������6#���uFGQ�1�mGv7"0���@������#o<��;���'.y�F�Y�v"��I-{��-#�����-b����<�_@�+vA���:o��C����q�����%;{�&!2�FMJ� �"�d����?9H�1�Mrn�	��R"�}�qj��[�<0�c���-�~��)����-c�v��x��	�\!f/>�C��e@��b\f���	*@o��N�(1y�SHf�6O{'���n�9b�d�rzd�����-�����7Rt� ��$��6����(�s������`����;R�=rN��	R6��G^�gt�E�.?uk#��]�YI����<x(�#�fD��(>����%�!3�����c�v�����Te��#P�6lo��2�����k�u��������*�!��@���I�$� #n�I���49��@���3�����F���ft��4�J��m�^����>�Y�hw�/
�V������������.�������
v����G@p�m�^�����`��R/D���mq�0{2���)[�������wVH�A���y�6	�A����0K���yj�����{��,��^>
E&��#�NH���(<���q��d w��Bu�d�obz���=`�q�,g6ZG"S����i��Gd(~�� ��z|����
�x�y�HT��_3l��
��C���H���a9��y�������uf�/2�!���?�����X�����0g�X��:3��s�0U#h'7F��3e�Z����/9@��mla�;����{���D>J����+%��A(%a��Zal��M`�:����.�4;�t��s��r	��c�� P������m�����^��lK�(���:a����3����[�j���������[?���8%2&������l#�E��dn�v6���6�����~���5�'�����-�g������Z|����}�G!���B'yc��pM�n���O���������I����d$_Q �'T��?�X���)/����<q�(��ED�>Y��'x��i4�
�FQ9*��
�Pn����mL_�
��<���$��w�D�m(��+J��3'D{lw$�#��6����9���BbDq>_����:F�EfW%<�=U,!"��u���Y���Sb!�_'8���S�S�#<F�+���Q�mr]Q��h�!$�� f��A�_�$�����Z�R��6����L�Ay���xA;���(���!�?&"_�J��\N�RzB������L�>�;	0���� na!$���9�!V�c.AFp�V{7�{�1W~_��Iew�0 ��jA���~P�
��O���u�����1�`e9���.#�A&��~j42���dD�2�7{���,x�
�l	%�G?7&_���.4�B"���I<`�[���N��{ZDB�Llj�V��B������<
y|�@s�TB�Q��o��?_h�Q�S2Ob�%%�51���)����I@�M%HE� !29M),�qL%((��*2�@`���N�j�%�E@N�'�~r�<=m������G��������bD
9��w����ze�>������D��q^2�b�O��3b�X�N��xd�yL$�g>��G��3�����4�x�a@�|�$��9���"==#&L~=��;b�|��K*���y.�y#o���{��J���g�����i�=�#����R��������`��K\�������R�[0�??g�;o�A8"�P�g�YJ)�R���=:#fHe���ct	3X�Jm�H�F�?iA��%�����A&&P�1��R��Q��"����U�QU\��]�Eq����6��wD�
A	gg�<y�~^���VZNv�>������N8;�����c��U�����EKa���7h�qL6�<��<���cO���nA���gE��y�����14%
w�2]�e������P�/��	O��G]�z����{��h�B������
0s�8�mn�dwNd�d�_<��d�����C�����
]�2TBq���I���I)|H��1�p��=P�9N��!L�1�����h��������;0�b�L-8��m�}�
�TW����������z�xV�g{d�����;���Q����~�t��w�q��z�T�eC���D�z�&��	��%~��	(��
Ae��3���	;+n}�n��{`�z����dL�	wJ�79���e�t��c��n�m���Jc��{�N��NH�@/X`;O���!|�@�	��������p�F�g���XbdgE�x��F}��W��_ApC&�[�"�������|�G? ,zg&�1���m=����u5�{��.�h�+PP��SU��f'wj�K����m@&ym������B��@��^��#�2�c���;vA��������$�������z��.��z��h<���$g���3&�N���b�_[��{��
�z��q�l�Q�^���[�[���`���e>�2&
������*C�+l�i��VO��;�����$���:���_�Y:��.��������t/�R�����4���?�[Z������!LD�����\V�<����	=�cY����6^!m ��~G��YC��$�����_0$@
j���9�����-Y���\��vv'1I��E�:��'X]*�E�rPib�@����h�w�'*�f�[�/&��\�������yG'k"�_�pW$�L�W�!��@�
Us&D�Ja.`o<���������c�q��
ZUM(�N!%�zG�t�Qz�bI� ���NT�O�%=c����$��W�tY����F�_���6{&�����R�	���}&
���.�K|i���w��E@�wt4gw�H�)	d���\���3;�+:����6%����Me(��pt�����#�%`��A,P2�;��h"��x���a����c����ao�������[V��-�.-�����Y�1����@�	Z��8O2^g����f+4&��-C.�-����^b������\[�V�K��_��O��z��)wD`��^'�X��S����~��1R��'pm��T�;�g���$���1rI���;f�u&c"&��$�s�������������G �g���P�R�<��r<*%]S��L��!my�5��!uAK����)�Kx���7)R�g7$����A��	b����	T����%?Ni�%�[���)�R��B�G~�����PM���f��?�X��%����%!����8�M���^��
Qd��"�l�~�*������N��/��#:tc%
�`���]\�F1� G@�9�����A�eH�Z���,&J���������0��X'H-D>��	�����3']����B�AK�l��������h["o������O#a�w����7���������#�V��)���r�N�Kb��"
SI!��	T�����]>A�%#���H��F ����)�#�(&����_5%�N����r���%=^��X��bn@�>��+i"��;.�����EUQ3����D������0��QFded%6!pP��,`�<����b_���z���D}d���~�Hw�O��GIpp^�&�&��
|aG��B���{TO�_H��(IF����x��pP['2K�
��"�|1-@Bd�1�	�g#���(�B?�x�,��}���R��!V��L�`m����Q���2�@��~�*	d�ufmB��F]���F���9OB�pkz�Y5J���z�
4Jr�-_�����>5�4�aQ������{�����1�?��U��:���*!Z����9C�M�*�����-F�%u�,�e�1��������@k�Q|����H��;�K�r��>������e�J��b������{	C�6�"��d���$��R��|�Q��"�~hth#=rj�n��
�UB@��V�AW�]P�3�{���Wt�,���?q�5���w�"
������P�j����I}���nDZWC��F'��V���e�2K�,&FMO��K����!�/5�;���#����z��-���J��5�E��*�j��+��>�����x���)�7U�k�E�&�wp���Rg�����s����+Q����HmE�|5�?������
����}���<�$;����t��u�
r���5���v����	�g����PU��$�rT��t��`����5��R�����*�V ��Re�c�OI�������X~�{���)��;��e(�B����H��=����W����hm��G�����X��y�[�+CT2*&@�Y��Q�&�W�sSyL2_E�0G)�_5���s�@-��s&[O�T[10�~��0�U�_�M���w�'�}P1�3Z�I�����BEt��Y
�O�����/��P�\'����A�~A%�bv��6+3B�\X
�O%h��DRl�\XG�?'5h�3�?��=�1B��:b��@-�����W�K����ev�^YG�M8d���D6_����������=�o���/����~gk��l���j��O�D�TC��~:�����\���0�~��Y�FCE��}y��k��������I~o�~��/�(�h
�F�h%������^�9lT��NQ9'�o>�����SfA�U��P�z2^�$�P�	���P6���Wu-T7��N�I:��gt�lJa�_+[
��3���EsA�I5������������sH�N<hF���,o��m��MI��?��|Q�:]�����|K��Y�����)�">��6��@Dj�T��R[�`�:dk>��$�&�<���~��`�1��o&�
j�"�c)��X�S���*�1��������j�4�N��h?�����c~�?b��-OM��q��Y��4*e�CG\G{��I<��?iUmOP��c�r�2�b�%I@��������
�=��Tr��;��Dp����X��Ab:��i��-�$�.-��>H2MF+i�����{�@�_Z2%��SL� ��Vp��;�����w�%lH�5�����9�OY���m
�+���
��Yq�����e}�+6�?��{gvW���@�{�#P����C�%K�0i��#eWKZ0�m���Kb�F��[�!�w;��m��7�_���"lF���fd�����b4.�S���}���)�_:~���aC}<�f��}�hh7��g4�[�&[�R�k?3�{��\��%z����h�z�	6@i�����C��,���z0[��m2ZRW�c���i�m����7�z������y[�^d�����W���C��h�����e�L��\��O�#�����-�X����`�� g�N�����;��hF��jq��%�-�}�d�F:�dpZ2�5G�2��F���[�|E������'�Q����Z2������A|�oyL���^��}$�c���a�%�`��A:�6s`|6��Z��m���_�0�9,��jfkF>��u���K*�nZ�>Z|�_t9����F���Bb�8e4���/��/l���Z2�Zh��W���'%QQFB����'�D�i�#�I6j�B_���3R�����K����e(x���h��@r��0Zz7��Q=�-��
mG�Z� ��T_dH�;+3�-8���9!�����sw��aj��I�nK��:�fqr��i����8`9���='�
t���� ���_���!�V;!�{N��[i�w����nF����U��OZ��a?�3�i�K������G�d�������u�Y)$��yY������z��ps�=z��
cw`y�?��������~ld;j,|V���c��kDZ(�������
��=h���U�mrB����Df�K���� ���{�s�}jiG/�BG����{�<�;{z�	"Q
i�����������l���Y�o��I��d\,���:�^��0���W�]��~hr�l�+#���:d*�V�=]�l/��>:�u��B��{�>����dZ5�"tz7�/���m��W7�/�.5����EE����c�����-�I�oMU���D"������R��?~D;z�}�7X����u+nF��%�{7_ ]�$0ha�ds��h�+�b����@rSE�I}Ha.�m��R�5B����:!�s�_�]�K����*=����9��Cn��P���=�������{DCER:��r{@��n�@H�,K�T�D�������zb���rx�f
����W��=�O /V��P�����;�n���x���#J���*���$C��1h�%%!Xx=a�{���ra�h/d�.S=��!7E8_�<�,Ib�EE�N�V�g���F�i�t8z<�g��������p�T?��g(�S�����5i��_���I��^��c�@�
S��K�Ed`=��CPm�.���*�����#pT�k>,����_
:��K2�uR���Kc���RNv�	:g+�W^��i���_w�i!9 =���$�L�73J��O�8d�rZ|���c����t��u!i��'@mz:�	���L�1)^��`5��"��CW�*�v��e����<�{z�F'�B�h�~Y�E����u���ts����;z����������M�<��L��>�
Rb(�v8�o�f�h7�����	���e@����_���},l�B��pO�����#���
 ��A�C����i_@�Di]^9�AS�	ZD6��KD�$���S{�NKd.��-����"g�a���rq<�Z��y{�(�um��N�[Yi��5Hq5L���iK\�G���������Ype���2@nY��<J�v����=���F����o9�����@8�0y0��`��G�6��Gin�D���#���w����fL>kSr�i�`8jp�]�G�:�T�+����P!:����^�a�������BI5���4��e�0	�.Am���*�0�a�����������mF�C���I�Px;�K�����3����s�t����U1��7���5W�_:��=#���}�1�d6	�8�
0��'����A,�oO������F����]�g�#�d��6� ���"�}��x	�C���OwW��2����t�'���f��J��m��"]�H���D}T��4�	���'kE���������B����V?C�IxhN����h
����~fw-�q�!H�0�o�*"�'��O���_r����Wj(T����j����a��X��8��"!3������y-��q�#C�����
R��"6kc����%3�p%2C��5V�3~t"V�����a���0r�����B������_�<�,XYO�d:^5��d�[GU���#����e�A&s�y���US��R
t���'����`��H�I�\�5�HSH����^a�����nZ��l�3� ��c����rc��y�@�D�K�^��q�Q����)y��O�}�>2FYQ���TY>>?~���WLU�A^��xt�>��t<tp%��q���P�R�����q���T��8[u@*iF^���d�~���S�Od�?+��f�{i��W\w���'�[S=�����f�x$A��[V������0�s��*�&5�Q��
o>ag�:2��1�ao���B��f���-y�)�Y�`r���'v���$fr�45���Za��j�W��RT��j��~m��3�s�L�r���B�����h�����
�=�q���(�0g�+��'�w�T�
abg�o���y:�_W��+�w6D=��Z��V�����v��mU�G4<R��#��v#���)��~/�j������~|'���l����	�9)f���������Z���`��l����G�Yr��-�%3���N	J���A��O��3#
&�m�P�I��0���zC����_���9�P�:y��(�;�f���?��U	�F[|(����3I��-�&���s8�������hw��?�;�KD#1
��bf9Y�Bw���&�&�tF�O�3N�w����~E*������#_��';]���.�G��r�	�f�|$��[�\��n�����T����y�I�u���^�lj���O��r���G�+�/'`���e���I~Ql�4��D4{�K���_����W�����Z��N���r$��k�\&�'��^T�D�1���^��HV����."k�q|U�H(9c�C��a|	��:r��!��)�C�����{#���3�_!<�����W�J��>n?�	�Y������4�/n��_�����W�_V����8� �!Q��A��Q(�0(n4?���{�d�r�}�G.�(��3^@�����4�/�A%Ns��=��{VV^I�^uJ}Q��I'%���@��I�����N_'j�'�_�Qm�����P�#�T��zv�-[;7�X���
}_<�����I}g.@�����5� �5�'��dY��v�E5��d����c=�����{(r�����6��WLT)"g���{~��]Of�:W��d�_1�w�g�Kp����+^��x/c=r���V��2�/;/$�Z�������8�p�_������Pz<�����pc�����V���L�K|���f�G��+�|���u�%KEH)�Y=��:q������l���9�X�E*�e�~�Z&�x����������V�W��d������1���*h�8r@~�og����n�����������+�=���xS�"�e_>������~yz�\��ei�zgV��������XQ1�
��g}F��I��BEO�+Z��p?72s�����Y���������Y�z""N 2�.#��4�)�97��}}���Z�e�DD��'$iF����W���Nc���0�PQ���=Z���RW���H�8td%���A�����Zn���A��A~c���.��`�W��M[��(E�,y*�c�#���_�����y�U%�k�2z�D)W�{�W��A��#�g�KR�v�B��k��n�~i������5��Rd�2	�����A��J��y	�f^�Y�=��>�{2�
��,���R%���V|{�p�$dV�������\����qD0E:-Y�f���	�_���!�#~4�V@1}�������T���GR�����sO��J�	Ip��2���������N��d�Do�x��86;JMR`�=�����4^��:hF�Wo�z�K����"��Ea�~I
.�NB8�d�|]:�d%��E�_���Q���"���9������Qb@���C59e���>Y623X���=����[�{Oa-��~t�d��pJ�{}I��P���G��3���H�����ZMy��9���ru�'�2p���`�����f�3+�^k>��4����/��Hf�IF�63�S����	\Zd������~b�4�K���x����!�I���\�~�<�f:os�:��;����Oz}����F�����f�5�s^�fi����?����y[��dk�m��7�����	�C#��������a��g{�&�Y��t�����Q������U�,ZL�>��ip��t��;���7������{|��e�)@y�
�J����9`%��1��Sp�p
�Q��g9�:Z��Q0�6��������QrW�M�xv��,���c,��.H~�:d5�M.(cFM[�a���b��FX�mz�]��A��z��S%����_��������||`x�2J���4��P���p?0�w�L/��|��j#�������TK$Xf�D���_U�8w�v	"��<iK�6� �Al�w� R�S4�����t�h�N�@����#�q�H���T�i�d�@Ph�,`���4��3�N*�=Ej#'�mrA;����!		���3���D�!�!��=��M�8��0��j�#?�k u�;����YOzz�)r���<R���~���:h����:!�@��!�6;��J:a��y%��{�%����
�W=������E,�����Niq��ed�>x�t���?��v�MP����f�v�>j�_P�d�EyC�� �L��(Eh����;�=�&�T�����?x4��K���<S�L[s
�Mv�x�G�6���R�����A'fB���y{���f�i�����R`���{�[n�:�!`r�S�K��uC5�N?T�a2m���J��d��s�o�R$�!�#�r���|��*Z�Q�
������#&B��Xj��2}�����}��E�����<it?�E��8�T��M����
�M Z�m6a����A'��m�@�*�������5��������2qP��yb�����b�=���F�E�+�[s�����h�J�\����d�q�����Q�DB��������k�nP�p�X�����8��O�<��o8j�6��c�@A�'�S�K#!�)��'��QaS�)1���r����"U�)��7}DkvL#hn��vl�e#���?��s*I�y�3$9�<�/($��I��cVA�+N�C��?���a��1� �]=a��6y���_)
zZ[	nt�F�LE��94\�E�����J2���|q�n�3C�����,���?R����S��.w�����f�c������ehZ��e�`�c����d�%s}rf�2�����Y����h��T�K�4����t�W�[���1� �>�O	P�����7�����<Xj�~�������L\����kP���m-q���:��~
���;��]h��N�c��(�T+��F�'Ez�G�(�>������
=hO<9P\��J� ��vZ�
E]�����N���"!��^;��$����� m��\�����8�E�Z�v/P��v��e�l���������K���!��js2�M0�O�x��QP�H�%J"��n� ����-nj$��U�c��L�Q�y����X���	�0�v��9��2��_�0�5iY`��g�����D������t�J8�[+@�ir����`y�J���y��B������+��5����F�t,����|C6*\�Ip�g��
�h���P6�]rVv�
��N�yXD����7G�F��W�I)-Cv5FtX3�0����QAf���R��
�]9;����/�;��^�1�!qN�}�,����P�t$�M�=`s���;f��=_�A���[ �Q�'����}���9��v�lbt����K����
5 U�jltR7I�@��j�����f�G������/������<�_a���8y�*|/a��#Z�������:���l-���i�������-*�����J�f�=�;� �y�c��"��r�������2�����l��>*��|�-���
��wt,p�0�P/\uE-I�;��B�#����=}x
���h{�vy8�Gl^����w����w��VE[����"�����@������@�!wI��-���'���x�xo�IL��7)L	�^�J�g�pG�@����qG~q9|���B��AF�;�S4���.CsS����]����~�����;6�>�'o���A�u�T�c<_Z|a�D>��2!��v��p�'��1��c��{G7�x�c�AV	f$����T����;���;0���K���\f������	� ���vH�b���$`T����m��D_��������+x�D[r���Z�����h�P�w��/9���*��$j9jU�;Zs{|�����1����n�]���#���)��F�������h�;�nB3��U�J�+H���g�.�H	���>Sn��dc7�/�Fgf�g����.�F�BNh�J��:�����8>Q'�'�����B@
�/���{����ltNF�P������>�CJ7sB������*C�����)Z��������1d�{�C���%�q���E�;�KX�6�U����x�4W����~C�cn�&O��������	��j�S.�������Z�EY���L����z���T��q>���������\���"��w�'���E`����!=�q�w��h2��_�4h7{������d���BwyM����;�Ib��'`�{K������)9���(����9�Nv���X��S���;�}/�e���j�����K�H
4��s�@���r�	d���T�����&��f]�=�����^5�n>�a���uL9��E��
y�5X���Y�u��! 0���6T(fP6�h�'�@�l��k�~��0�����6%-��%<����x��	�X�f ��-��-%4��2�f�����zR�0��%�gnPM�>ML�%�Dwb�G��zw�(i:���Y=�F�QA�����!
x��(-]v��`Y.�
;|������U\����`W.�&+_C����o�^�����E����Rs�4b������L���%0�y��xp�{���%i��A��M��0i0>��m?���Rr�b����P�d&�O�C���=C��TR��0����//hB�%��������
i(�n���A��,���-���u+P=���hnXP3�=mL��^�h������h!r��;'���Y�b0�.�$����P2�����.-��{�WD/����E�1����\�������2����~��h��!W����vH����X���J5���7��dn�gIF1�*Mh	����	�=z���3����`�v0m-3���7a~K����c��������PT5;��yB:�p	�L�|xs	�Iv$�G��
o�]�n�+V����m�d��~#�B���&�]S����V�$�X&iOV	���k	 ��|�L�
��@E���@ae~�t�m�j+/����@��	�{��Rw6���	Pd����
�i��-�qR^�s2����e���%��u4���j0���Q�!PRI����������Qr������P�}���0����J�xK@@�b�@kD5��U�<5��.�y���!����Q|��nt�����j�2�>����R��e���A����X��#��s%+bEO�%:�Dn��)�
Q��:�v��o����S����e�������-�
��e�i�	�)O�� �4����O�x0���a��K
~�?=�#	x/���g�����f��Xs!����T>��H0�;��XOK�kSbI�r�bnA�}}0\q�r\���[����$>�TF�8?�):�Y��"M��d������O���CV�)�Q�::�L���5]w�UH%�t}b���i�%���|��L��
X�j2���@�����]����V.V<���=p����J��hP8�yE�U)G&�,%oV�:�>�%��
�V���1���Qy�H�Y�������b4�v�0����`�4'���>w�T�'�~K�=����[��#Er�j�A�,q��H"�{	#��cm���wt���|u�>���H����:R�U����q	�u�y��%/���s�DX��d���.����1� �����M5��8�����Wr�#9/����T��������8Q�m�{�h�g��B��R��_�y-d���b�y|�����|�nV~��6�0	���Y�"�;^��~*�����,R+-�m`�J���[��&�Kw�i�{�6"R[�e���Y�<�C�s��%�-���2v�����R����^c�APV3Ua�N^��6��>�!2k�4t����#�q�������{x�{������\lW�:�j�?�b�,�;O��5������1�B��	�\�5n������t[)������K
/���p���mVQ����F"���b����1���4��w">Q�f7��kq����%c��&/��
�8�Uc��
�������>2�F��N;�O���+Y�DOo�p�&�t�z�*B5J�8^������O}S�$�i�����nWn	�X�Q��p5z@Ew(�b*V���� ���B�&����+I�@+�F
���t��L����YED4e�u���"I����U���}�������*FG�����p$��8fm��8��	����Td�)d+��	�����ft`/��v0V�dl f�|~��"f�Dg�T�B������o�l��94���&��-��>�&��Tj��:��������������3�4��h��.�b{�]#�E�V/�D�&��z�L+���YEJ��h*�^i@��u�&��X��44`�D������BD�0�/��~,�� ����A���1St	;�D������
�z�=��X�D>,|5Y{��O�V�	t��?gz�f�(��SI+VwJ�@����s��� ^�Hz��y+��y0�O��J{Q��:Cs�����m��v��-�is�B�Zi[12�-�N�����E��h���*�Sh�DUt�.������7�-��	��|����&�O��,A����I�@VP[�^l�	0��U$�!
��,�HD�M�BOLo�y������)4��5�4����`����UL82> �/�V�C(�G4�D3���j�^8�
�@-_�����>F|~���$�s8v���i�Q.�~'��	�D�������ST��b��s���i	�����Jx���d�������~6�h����#qs�A�.���
�x!x)9�6� ��p����Huo�kfh>�D��M�gE/����/��%�D9,m�w��3Q�5G*��L��*�q%��&�a��������z��[UNm�^�[��:(������G��M��L�+���QIR�������t��C+���6��c��;������h���0��51�"�/r�k�"�wk�Q
��%vb���@y��������������J�iOkG�y;-:��K��_���q&Z�}4���|�Z�j�5�eI��6��	v�qK�����j2��{V�1�P���7���U�	I���B��z�-Lh&L�6�;p���E_����r���J����eV�h���#"�Y�I#$��I�����/�$��{��{N�c9:�}|�V�q�I�RG���*�y$������h��"��"nS&��!r����e�$���;p�S��'��/���Z��x�MV7:����p��O��S��m��8P�[���Y���x�yo0A���^�x��$��&hq�M�q3���������X�b��'Da3����u��KQ�d���I��:��o����EL���D!?B7���?���b������.���V�����-�59�w�$�����,2���h����q��������h�r7Y�`����O�������"(8���p�M���5\�;Ks�li�
��;8�E�'s:��O�8�E\(����l��qDZ�|__+��6����n� �����W��kw������^Zv�(�����iJ�]�WK��.z%� 'i��_|37r��l0���D�5]�z
>}�*�����h�;��JIH�h>��))����r���tCp���0����:8���'��98$���@�\�m�DhP��t[3��i�L�~��O\G��mR���)id��O�	p����c�R�%�H���
5�;)�d���-�
����Q�7��W��i���cvw���d�����IH+tTT���<VO_'��/<��b8�n��-zq:A�F�1G����6�A1�\w"e����������m��^��O�fg7_ta%��n�<�������c�e��".h���d��A����	��EUD��>���������&�Cj���$j?��(�(' ����V������I����M���}�2��L���	���E���	�	pu~#�KuQQ[aw���@���s��V%�%:�ns��I�����7G#����G��hf-���?1�U_�g$4�")���s�~"6��)�[���*F�[�����|,�����	������~��|)�_��v�V�jFcKL��h	���r[n�wO�������
�
M�!��EQH[�}`T����g��|�m��;�CyKMq�;6�6���>�[c\�1fA��\GD��V:����;�&��1���l�T�h���*�"��FK���X�kT|�g8�L.JJ�]A���~���b�sd?f��Wv�CeU�H�X�`�y�O]N���,~��������D����>�{@�x+8����������}M ���\� ��d��	�F��ha/�� wm����:��O��.���T)�/�+���d:L4$�ACD�p�7�����������<S��!�� �L���a�I�C�C�W4�1��4X�(�q�w�+Q�S�|8�Y�(=���
�	���z;���M�c4����AA"�"����\�QmL����z2�j�[G�4���Q�p��������L�x��.��B����m�z
����l�ZBC��b��5)-G��:�Y�F:��x�!�N������;2F��p��-�	���a��h^� _�9NL�I,�F�!
����������#���&�_`L��0�-��g��.'�UY�$��!�����.�3K��aN��0��CF��>���Ue�.���'�M��#�n��>��S�aT�
�GC��qI���({���pX�2��1���?-���g8-��nM3����]f���@_
<�����%������
����r��U�9�:	>a�����5�+�i���{r��L<QF�K�f&Yl�D��9��0yo�(��lf ���'zL���I��Y�/���g�9��,�H�1(	�4���hTMf���}D�Zb�3� ��0>��5�p 5���=D��pn3_A��G������m�c���7���;�{B��37��P�qT������j��1�v{�L�����X�H���������VX�$�!,Z���|��1[�O�����V�X�%���6H�l�KMZi��p�s���,K�x�VB
?!�:�YU:&��)L�~�h���Q��8�9����)!��t����B����E����F����HFkUc���UO@���f�������-�N��������$T����#j6�2G�uL-�:����Y������������xzh"���8���;����y
��4��(�n��K���-vb/5����4u��i��d���yN���|�K�"�KT��X'��,�4�I�r��=���m�OiS8?.��-����8��T�R��M����k�}l����#�G�GF���oE���Lm��y�c���F���0M$��SD@K���g������d�Eh4�#�HnW$�H�hIp�BB�Lw�1�8�%����>�MSV
o8yfF��3�~���)�>?C$D��\�M��-gp��7�&�m��%%��R4�D4���?&
��8mG�"p���M,��;p)�V�����Nk�6���s-�d�%�)F���)3�^���
;)+9��H+�'�J�{���8�����>l��8��8���8e!���q&�3QO�=i/��m&;���FpU5�����P��6�(Z��j��n��6[#Z���7Q��)���_�����_�c rg�&�H�i��q�)�Y�&�Nt@��
���y��
�7	�;�^D�@D��^kN7A��$�|����{ZM��P��bO�a��F���^�y���A���N�3�OQMQ�w�&�0�6MG6oN.���t�Y�O�!@!F�����z#O%a��7�}c������(�j����>�0?�
I�-�5)�LHK���� 0�N��P�1�6�z�����(��:8m���}�����pC�e���(��v�Og\���}aV�e|�1�'{�7�VX�V,^������>s�@V��	�GN�����S4�z��Dv�\%���������n�������|B�!�X�@FA���q�x3��z�mN'ozZb	���<Q�w���DD��2-����L�'@���O*��0������F7��.�d�P�������E�`P.?���r3XI��,�1c�l�KT@M<W���Gn�'��8f���{��1f3�u�3�Frb]����r
��t���AEw)�)��,���R���_Rh-��������^�h0����r?�H��>����h�|���K�y,�$�?1}�z~H�J�v2���?'���p|l��'��4]�����<��q���>^4f=���^DS�O����#�?*�V�Zt���M���O�>jvI���]�!9�/���xu	����*��d�3��g����>���e� m������jF2��I
��+�����Q����r�2�{	�,��a��]��7.�&����������|	��i]v�jXBJ8�P��]|+�uTnm�]��d������|)�R$d;�M���>"=�r�r��-_tghM�%���|0������N��C�S����\RaY���k�F����	�X��?wyeZ����=*0�����s�����~$�/6��hO�jT*��
*���pm��!����;�I�����@W����-��g���K�>���r4�$�K�>����0��6?���T���n@�>����0o9�8!P�	`�0<�>k���=��>H?Y�������2��n��\E�Mf�)L�����g��!����jJ'n\G����	���?��� ��1`	�?�d���b�bV�������vq��E3���2������z�dy�?�!=@�+I��EA��Y��
	P<z	��~�U��!DH����G	m�{H���c��R�����(.�5���S�o��\`�D?a�p�{�L�!�5i�\������0�!�1����
dy=)������t��2ccu�\���]�k>��T�-:�A�~l{\q�o;���o�GR�n��0�qsM���X�����;�H�M$��~�G���9mo7$��.�cJ&oq�E���-
������J���'@�K�w���#��xM�����Elh�;�g��m��������?���L�he�Z���� H=���)�.��'�v2U��V��;�~N��]}Zpg�-���i���Bt%Q�l��l�����"��O��"�b�1�����{��U�e�"�Ty�z�E�����{���"1y�n���-�BM��v3�������}�m�Tqri�g�$��<�������0_>��IB���h!o^����Q�{MR��H��������Lg�������{�J(�-� �K���h���i+�\����|��l�|��LS�������s�U��n�a"}�F�#���HD��Q�8�Q�#6�Q}���
�.�'�}�W�*���-�~��F�$���z/dwH�k�Q�$�[���[�Ezrap��o3��N�3��)���-.�r&jv�����+��������3��tboQ�2�h�^���-��*v�XR�h�V3&C�W��0:��8X,��;#&l����!�+�|��uP��]����|�N	 
��}��D�Q[L�E�+�d��[���^H�����F������|��2>C9�v�@b����%zhb�s���9/�D0��T&cv��}z����%Y��)��X�D������G> ��H�&��C|Rg�"�rY�+�b����b���y�w�_�(�f/\���_y�`����`�n��t����W�2s�1J�{1���Q+:��d(	�����!Z����������e�����~���YW��i�[�����+t�b�0DyM�����9J���/�6Q���
~�y�K�j6�}���N��#��^��
T�M���;I�v�&���E
�c� ���m� �F�N��*������{�]���sv�#j`&{�15��u���{��%�����K��������9-�$F���	��+y���F4���[�^����l���~L
��Zq+\b8)�Oq����"���)>.s~���=��Z�:�`�p��������'�K����a����T=���SmMU?7]j,����q��=��(���H���&y��.�����G�rc�Y��N�����_#��#��-��g,3�;��4S����Q�;B�fh�s����,�o���PpD����������*@3����	�����8z��W�8�C)4����a�iu�����������r��H�}D���|��?�4�`���wM 9gg�n�pr�>;k+��%�����1�X�& ���7�t=��F/`N�����l[Q����=fk"d(y��&����X�b���'g�T���A5��rE��������a���Ev���k����fT���v��8��D�{�%$6��K����a�\��_.Z���R�$������������}v��8nP@��
�1������W&�������@��6��OC��sj��J;"�C8@�Y�1(��%f��m8��v8d�\��
[����8^� �>�8F�|�M���mc�+�:��������'-���,R�N4$��VCI��O]�WP�;E��w�J���Y"�>��`-��sm�A6�<�A���4G�
��I�=7� 
fHV/����ac��q�	�'M�-���x4�Qz�9��-_v�EA��O��s�	���$G	K��~~��Uj&x��U�1m����8i�tF��(��G�{3'�4f	(H�OQoE(�	������;K�����<��2��;�=�
{z��LP�4u��}Jr{��3�@-bA9���%�C�9�p��&`�{�gug����;�b~���'�e�z��'�L��"�o���x���h�+������z�"1�S��c�B���~�0�hn�#�#�{�/�����B��F��
&7���:l��!i���.Y4>�d�t�@i��"�cS�{����#?i��������G�W��
l�1j�#p��� ��=?|���3v���I�L=A�;�F�1�W�QB����+����,Irx���K��S��������h��� bo�����gu<�[	O�uTf��gU/`w��������$�w� �/{�H���X���+��F|�om0�_,H[:X �`��D�M����mc�=D�p|�u�`/��=���c��s(�	���H������MB�������O�@R�tO1�@w�hg
)��:��~$�$�����G�������JB��+���J���4����������=*�bH���b]�2�EM��w�6��L�EG�U0A�����.:������������i��c�?*����n�q9�,�����Ym t�LD�A$gP���c�����D�����`��;P���^�*�T�����e�Lt�^Gl���c�Wr����2#����ws���@���kr2��j��:�@G4�$��3������;z���$4�h����Zl����%W`"���vZ��?W���+���p�������H�y����gx�{m��|C��d��Y_(&������:.��S�1v*d�ES�FC�����f��8 G�c���A6�'F���0x�;�]s��/�$#���sz�'"����qU��ntIg��{	��D�d{��,?FDl����l��aie�!r��h�O��������
�S�8�����r�����������B&m�8#����	�?��[�����~�����lD�'!�W�O��9(��n�U����TEL@����p^(�B�pP�I��*v
b}'=,����W�s��Ak�*_vpuv��M$��w��1?v���h�/C�����Vq��*	�P�w��'��b+H{���E�`�2[�s��S�3E����f����_���V��D0rq�@��<Yk?!���{����To�E'�����D=@;i$P�OD7�va�Z�
�������N9��e@�K����'���Mks���Fo���-�*�F`��J�;3����<$bq�@��	�W�����n��O�z��r�En�'�K��Ax����+����DxGT��;���f������	P��~4��Q3�uJw+���9	|G���J��s��w_�	�T��c��;��46��U�T�p���`VG0�z����KH�\�2��L^�D���n�Qu-:G��XZD����b�h�"��Kwf����J/��L�1�����r{��BjO~{T�[���A����b����!�����S���g���^c8kh)q�x/a�[���=�<{���2��,t�6##��H�V����;G~t	��["W*�x��-���N�s�
�����Z��ut�����L'\X����%'3[D�0&Y����������tBYGC���i��HsT�������=�)k�N�Z��H��w���.�>�,��_|~��Z5�f�UE }�01��Z���;��
�m������Msn'����^�h%�[;I�$��l�f&������q��P�ZL�)���i�L=qDZA����$�H>;������4�9^�J�'�-|�UOP�b����=:��%_�����Dl[���o%D�}���#�z�#�M��*X@9,e�H��	V����6�H�R����V�������$��K��v�UE��.�s|jiyO ��8\%��l��@=	vT���U��N�����~�(��T�����<!��P���G����$�[4�W�Vw��P���6mtUh���y���X������
��+��vkt'����P}�����M��M �N�H���c����
�e�IP��uTA�_c2�-�~�@f�W��703|�#����c�l�4f��k^X�����D@�{]�r��������1	�X�T��c����K6E�MmZ��/Y �[f>��\�UP�����LP�*���L,� �U@K���)�.,��X�7E{l�#hq�u�{Ua������D�V
�?������&�@���lWn�e$��'�*�@��'������%�L���$O�����i�jw��d�up=,�<�_-��������L�/\� �'�|/�#�����]�U4�[������i�)��"m�+8�"����J��/��gr��v��[2�X�d��o$����X�5ZC���~�y���h�������FK�u�$������&?HHI;���"6����� 8�$<q�nNvA��?����������\�+K��j��[��� �3*�������h�W����	"�ES�Z�Q�����&K�L-��]�� L	���d�?�RX��
.��������	>�-��;��y���Aj\<�V���1����m���5xU���/���U��GJ�����.h��H�����U�>��������jH_����a�"���x���l��y�
}@P��;���".x>\�����GKDPs}F6�VCYt�Zt.wQ�w'�L]G�&i����^'��\U �l����>q�`K�����y���L��*D�d�N�����E�=����)	�J5��H�y�7
���<�f��\l��������|�Q����`B��P�����(3����91�����~��,�d�vJ���Y��$��(��l��8��%�csppm_�m2������V��-	����I@�&<���@Rb4� �E�N0��Gr�m���k�0
LLW����l%FR}4C�m9y�F���@P���C��=�84q�	���'�����B����e� ),Z5[B�}����>����G������X�X&�Y���!��m����G�����Y��K� 2��[���s6d�%Uhs�����dGG�w��D,3��51����B5��I��{����|�-j��_m��S���,V!�!�<4Q�Yh����V%0.0F:d�����{<
 ����>�&O�M��g��3\�j�(�YI�;�n%��b|M��6��g��
��"��4w`�y�L�:�Js:��cf���}9�8$O��]P�m"ok�������	�]�����F�:�&/`�Y��+��i���DD�]i#�k�H�v���m��X}/�@�h}���&��H����K�����`kM�����U�y���%�	;�*��Y{7��%Es�-�
���o�
.��������Y p%����h{+���S���v����M��+$�$&�t[��u�Mj�D�D�(V���q�-�?7�
e	P������0M��x��,�P�es��U��M���%�.�m�S���q��)��ND9�M�<VM���*� R�5���b����-:�Q(�>�t�b�E����.B�d]0����������yT?��t�F<u��
�N�@:�3Z��"��9�@�[LF.$�����9�p�M�+3�vE�S��&&b�NQT�;�=<e��qtN@����hkM�	MP����N�>�	���C/-��'���������Hu��/�,���B�Dr�J��x{�F:��.�aAjhm��+������DW�E-��>�c�dl�����T����#i^l����C��LX�.���hU�D�Di��5x���y0I{/!��&i��&�op�?����+��������X��P���I(z�r��[��!��*$����_����"��.b�|$5��@����v�2�NIl���&�w��i�����hL���K�����5��n��G�4������?/�4��{�kZ���&�vw���w���M `��B�����Vg1	x�@����t�������z�.�Ptj$R&���@b���m(;��#�&�]��������9si^��?q=+<�vQ
��0iD�@��N0����[AB ),y����'`&Up7��v���S]<���NN^��(�m���{�3�DZO�uk"���M��Y��{7 <EG����7pk�lb:o@�fO�'��_�
j�Z��@��L�1����[wS�f�XXb���V���,E�v�����U������������I��%�����F�`��Z�^����A��>&W��0��C���;;8�.�5��&���$����<��������o�E9z���������$Xh>9q$c���!w7:��"H$�}��.���]�@�R�ns��)�/sN���P&�����5�B$�%�����Q���	>����>�%E��.@���6>P��E�	S�|��yO��k���-3)tQ�Y��[!<�o-Z������"�$�b�E��=���@�xi��y1���!��k,t��49p7/,'(u�ww$=�]�@�6K�r"�k;�S����A���~=��t<�TQ�A�O����x~�+��Z���VTM*��b�8=f���5�>���	��� ����*�{�L��!�����q"�x8_�p�x������cU���B~��-X3c�,��&C
�� ��`;	��K�Z`��G�O��_tH�����/�/~�h2�
2yn���].��D(��h}G��c~|s�[���=�/%rvb�$Q5^��v�:��^Hc0�)��?B����q����?�	�3��r?����V�������?�?G���C��1]���3Q��G���&e�����C�
5��N'V#u�9jm#|�=E^HCT�-�F��f
�6�d`QUYC������H���i�l�L���]M�!C��I��!��*b��nH��m� P��((e��{9R���&�&��$B0����%���&
�v��B��V����m�������y�M��Q/�pJ���8(����m�:���W M#Z��=����]K�F�_I��0&�j��AJ�(�w�?�i&���NCt�����G���������*�|��q��1<y#� �6-'_|d�ic��_�	��f4�O����HE�C�?:��q�K��c&����z����c���������7}�� iLn  �h�x�l[�"HP�a��[p���D#1�.\���d�������fd�	�"��H�"�Z��3��]G���2d�e�������@�m���l?Q
�����v�0�4+t�%��9����]D�Pe� u��u������c��
-:��"��_�[t�p�p"���j�����>�dvZ��?���`}HK��b�:CD'�
F���9�6^�
$b�!6���Ecv2���C	�`W�;��1���6w�_\�I�)������3�{F�U��o��E[�N���{2�D
��C\��G
8����Y����bh��v���xD�-ix����b�)2��`��8oM\��6�'�h+��v�_��s��������l�^h��3�M�e�=<�d���!��	7`��,;-��$��tf����Y������AN'O��7����d	���R~�3TN�
!"��h<nk^�4?!,=��������-��oS?���T'S�>.M]V�� 99��O��Y�]�Mo������4��|0D�F/������rN���H��{$C�V����,������mk��pf
��f�����������P�H�<?qEb+��D�9��By���i�h���J�0}�9$��l��
��Uv�����6��T>���/wN�!�"��t�@4����&���_:��*�V���+\2l(���w�/(����"�fM��������<���66�����v��N�v����H��(,��������.�HS7�?���B=��wUT�
�x����p*�;����[`?`u���a�F2�������8+	�2�����Cf)�_�e���HM!�X��P��
�'RA�	,W/�������@&�-LJ�����	�O�GS �Ip���������BNa�Pc}��#l�i�<����h"z7zBM����=-]M��L�(	l:G��YM��%o�Ik*Q�c�Vmg�,�b.GV�b����` �11������E�K���}�(I"�p���������������i�N�(�s�@o,��=z��L�"��w�V�P�D:0�Q��SM�4S��0L�H�2�@��&���D�{�h�����h�}�i�o�t�oG��x�uo�h�~B��t�0.���F��x���G��Ns�0�����-����450>�:��(�{���&z�����]o�$����-�{�
�$&��yLA���O+7�*OsH@B,����4j���X����!9y-1���"_��/�	���6@����(���V�w��0��N�����	�����r���X+i�\�	"��U,)k���r~o�6��S{J������
Oe',��cr���6�Rc��~�Qf�v�N� {���7�h3�����qyY�O������v9^ 9����1�;i���UM2��W�N�����%&�^������m�=�%B��l�d���6�U���*��l�n�^CnDbC�����] }��E%�j���;u����!��$����?� ����F�"�D��)���N�����������<Q
H���z���n���t� !�������Ww6���/�<�(`	�O��e-?�����U"��%t*���[D�FW�[�d�������NT�KX���	����G+�����'���rr�Y�����d��'�:�p,{�%a���N,����h
������]OX�%����A��A�{��������y\&������1�SxDk��{9|L����p���
����9�'\F�i�F�����=Q�����C`M�b����lJv�i
��_�>9a��I��vu��E�����������d��z�Y��N��
���~B�`	�����8�j��{Pzh�����9������w�[=�B��g�Q!��`J#Q��b�|�RDy-���r�D��J&��zZ9���s���J��%��$��r\0a�0�=�e�< ��&�h94z�[.I��iF�{�YO�D����<c����k���r���%���{ ��7[����4A�� {@��(���{<��'\�fB��Q����-��/mR����]���N4�-uF����Q�mT���)�3x�������^;�����x�
n�/�����%?!�����CD�[�}�p���/3��.��o����cQB�b��g"W'|%X����>r��}��Z���-�:����|�hSa&L[}�.���D�$d�.D�V�&���uT�#�B��`��`�Zqhlv�wx{0&��xK\�pt8�eGI�����*��B�17���wu�H�}nA���QN���&��K����j����/�����on�$�"�e	to��E�C�	���`��4���	R��{op%:�pF������D�'�E0&��V��29�l[�DOI=}���K����R�:W`��o���&v|y��uGKP�����1Z��mC�l[��D�1��I2�l�s��@�D$����9��QK�������N�~B��n������y&�Fp�^�r�=x��71Qa�����P�'!t���'5|�����K���}����y�F�'�W�+�������$V�>y��-Jr����]�JG�%�{�J����������`������sJ��lA�X� F���@�F_��}`o�~A�hV�R_���}��P� 3��>9�P�g|M�Q}i�4�I����\��m��iF'K���h�=�1I$�^��%���)1 l�����h���~�'�$M�[����/;������$d�����=��Y?v���o���{����b���x+�!2�������%%��9'z��[�M����'��X>�l����$-�[���r�6�8����D����p}bQ�F�A[�>�P��h�����|��"p��|`1��{���m����;���� (����E���N����� ������~uY�������t'�
��*���`��'��������<���ND��x�SK�>A��
����1���-���-��`��O#g�.A�k�#���P�������2�~��&������J�H��#N�pg������=���.$���3��Wrj8��|�/%�i:���4�E_[��h�-�8��q+/1N����������;���#� ����~�>���)Yv��Y�%��c��}`����A(�����&E�)^R��=?�2:3����h�>#����Yz�����Xv��Z���
'�a����Y�I�I��gQ�R����6b��2��|Y�P���r�L����>�
<?��9�G$�Jt��N�w��D�r���$�fil2�
`�����it�/�_2X���h�e����~��o>����	�q���vlG@��,��G����GV��Fq����������`���BpuB5������dJ��>����)c�d~���I�P~L	fT�O��c�>���f�����#�����Hp?�d���O4FE�Q�s���k_p�]��me���W�}\gF��k���rFR�������^�7K�KV]�doy�|m�k����C����.��j��>�Q�c�����C#��?V��
��gJ]���#� �)�����&���^�8���!@�N�nI�/�\�meoR�l�r�����������@���������SI�G<A�G�M��S�&�������)%st>�
hym���MGG'1�GS ���?�J�'l�k�����$�Kh�����q���'6���O�>�j����UK��8�4�P�#��@�|v�_s�$�����d� ����
)��6�~�c�����VB-%��H�H�t�{��t��a��9��L���{jh1t���s�#D�|j��N%z�'�����1�q���Y�;�������h����u%
�G�gc
�P��O3���7�hWb3;x�5�Hbm}���%���������
���������
���2���{����;f���F����&����ut��P{��������Kh�K�	/�����B#��'����<����D��)�������Z������������������w��}�X�����)������^B�������w�����y���]$����iu)�b(X8�i���SY)Y��;Z�
�*��*�@������\����_����������;�&��*9\#f��RRW
c�c4���
�w����\C`�_~7�'_���3w���To9]�j7�4�|��������N��&��9�$"�BFl�w�A� @�16��a�5�����hb�%y$�N���{�q�+�W1�{�}�����D���� �8�mz���X"`j�����f~r�}�� ���1��X�w���~���+�tL���O'�Q�����
�#�����"H�h#�
���M�,v�{��?�����
�H���h}
BE�1�G�DG����mA=��?���6��i#��d�w����o����� jFa��:���;���������@3�TE5��K�����>`�3A^�z������J���������sBO�����}Fp�E�[�d����F>A��;F=�-������2y��
�F���	Q�;�:�'��w��!0x�$"����F����(�y����bQ9h	?�������zp��[��d	�N�C�<5my�e�s�m��h ���$�W�~���m_���>{��b��_����V���^GXX��
��UHg�lE��q�� '���\h(X���r~�%n����Y�=Q@G��'�y/Q��KO��� �Hf��� h�x�9�@��t��`�����-z���r��ab�������NdO���h���I)�oq�.Q�����@ ���<& �!���GU~���7(o������d�+���z��t$��<NP%p�{�������Q
�fy��_?�o����1y+v�G�B�+_}G��J?R�]���[Y��a�������S�L�;Z�2�K�	q�,&�	��@�K�$���*��f�w���{������{r�J��R-�.���!��	�\���q��D4I�#�9	�R�����	r�T���]�h]���"���WT����@9�7��Ol�wi�W�t*��.�������S��5��`\-@���]�7��1��`�9����m�
��nY�(�P�4c���A�iFu� ����#8��/L�HN ��]O%C��2�]��X���FP�fH��"�V�����y�"��1�"�������r&.v.��hP��wq.��S/�}�B���"bs~��
"����!�{��n������&tY���oQP=

����h�e�i�(w�_	�T���a������Q���7v��.�&#��T�~�{�Ij�.�e1Z�}����1�
��eB�A��O������T��Ep>���������ThN�������M;��@���0�$%h�e������z�:`,P�$3t�co��u��,��}}=UA�I��;X��}�%�X�e�1���i����U�bE��DK���|��p��'D/��!�F��M�@W��!��cvn`���g��s#����U����M5����jz����.�G���.��D�����	Y�����c�U���oF�������er��wH�T�n���b_r�Xe������^���L��0y�g�`���w�Z��!�F�p,���3fR�Y~?>����-��Nwy��/v��|��`'c���E�X��_���i�,��&yoUP=	L%�V��D����-h�/�
����Y���U[��od%��"%w�T��g|��)W�I�M�M���w �C��{��V
��PrP��/�+6�*I#��B���R�����]�cYL�|������==�3�g���5��QO����Q��_H��n��S�H-��D��Q'��U�������H?+�������I�Tm��p{U��;���g���FD�9EbR�TA��l�
��t^`�:N����Z���\��s(�s���]���L�?�}$�'��j~��b��������mM6�����3�#�M��u_L���k�f�f�5���w��ml�����?q�	$Vm�xGCv����'J�jG��Q���A���/�"����~;�O�yg	���
��8�$�#�(TJ
�O�w����� �0.�}�]B��*t?��q��S��H�������#fh+gr��6���������/��x�g���=�*'�|�s���\��Fw"i$�D�����#"���k�A)��k��=����t�[��'����uF�D"�/R W���8d�B���3Z����4���������:7x�Qub�>���������*�?���}u�I5����(!�W����Y�������:�����KQ�7V�a��-��n���%�_���3�#g'�z���:�#�V�(�v�yh�?QU[�$C�cU�n56�O��*Tq������0~0&�z��C?Nf��h����.���S��G3K@?��Y�ET�~����K��+�6�U��<��;~]��[ ���������MM^H���'�!��.�1��$Z��i�z�LH�*���}x�����U���:����*[_�����~�@�����aFpv�It(������`t4���8	����G$y�����'�S~���m�.b45���	�g���E%h�_gh���?
$&$^�+4����\�=)"�%�L�f�>�a���a�&|�IK$�JR�������Gs`�,Mp�Nv�&l_��w�G�u7��H�9y�
y`��7����~�E�wD�g���u���8w�O�&�?��hV�#nL6�&�?�[�� "�(��������q�&b�$I���X2Bh��W0`C���b4��
�}���vu�I��fo�������[2
���m��JI��n���]��gM�
�F;�a16��������y��0�@��l����}�|�'�]}/��hwo.��5����h��(����}dd��6[���|�t;!������P��������e�G'9�4!����I��w������.2�JJ'C�e�E��������[��*/��6����h�{
��M�?NG������m�I3��hEW��a�
����h��b=�L�a[���[\�W"�o���aw~���r!���_d��f���N ��!*����'��MA]��[�
�� N 1������U�hR,��*����h����������-�?�4��w9:Q�=-�AQ�F�*�t��|����	�N�;=���/F�����G�-�) 3��&P_�d~���~7c�Gi'�@�����6�4!�n+b��nz����Xi4#�g�4)w����eb�)	��-����:!��4�gN�[	u5�F<��oQt�w�.�-4�}��!�*�
�V�L�}J>�/W�8�
��E��!�}���e�Zi���d�����--i�m���@�|��T���'������P��	���>����-���'�/B����������9y�V�����a�7_������!���	x?�d�C�I�?&�{���%m��`���Q%96����������hH����fy��?>�2����m����D�D<�������={�?�'�Dx%'��q}�L%�x�[���E[�$���48X��%��������'5w/f�pbvR����z�����I��m�C�����h����0�L�B�}��uA�	���g7���0'�b����D���;��>�����k�^��9���]�������+�6u����_S���<��:�_��N�/}�Qwh^�-���i�~u���]�D}s��h|'!Z�(,�yf���s�q�qK�������?�vu�m����4+0���iE�*���&+���w�]�e��
�?�?�O����wE������gg����3�H>h��j�Gm>�.����!����O�bG�e�
xNr��*�!";�n���D�e���ri$�K���jHcu[��s-^���9Tw��Q����/�K��+���B�G������p�����d'�����.�P�V�c���8�1��;|��Fy,t���e����7�
����N�.4����C�#��
*��������s�����&�H�_��Wz�+����i��a}�Yd��q��x�F��L<��:O��j}�B�������t<��%��.�?����!�������O������/�5a������b`��GX�Z��z��&B����0,Z��'��D�����a8>��W���6��4��9B����%���B�5e���T!z
����h�[������h�[�?����ln6����J�{��r��D�;]p?�2�2D�e������FP��~R����"ts
��YZ�X���[�#�a�n�}��������5"���r[:3�g��p4��?��p��w�[�'Kb���?���P[�?l��J�r���>�����
`�D90����Y�va�J������Ya���[����a&�0����-|����!��bz�����O�#�_i��G7,�gy�n������|z��(_a����G����S+L��J��!"�+�=�Q3�G�k��P�!�����1c�^8�P�E
������&���������&���z�����|���K�q������Cd��J��Q���l���]�G��UF������^t�b(c��f�2�?��y
�L�O2B�T�W>���&z~�a��r����o�wX	U2�}�����>���d��GP�'y��8���"���&
���Y���C�<��0�y-d���kHMNSC\��4�.���b��?�N&�GAT�n����������!��������/���U�������:���5C��0�L^���V���y�l��(�T��h���%���}�� �!��xK��P��*�a���	�A\T��B�����p4����9;�O	5<�oB�W1|ZHvP�
|0�j�� bZt���4��P�z�c {B��w=������.�X��CwIJ^�G9l�4*%9�&P��P���B	�8�}6�|a���1�MwG���<_�Kl\��E^5C���5,[Q��L��
��e�5��d�N��'{���%Q�
1
�Pb �N�����n'Q� �Y�N���,_���Y�X��$��Q�S���i�%#�-:�/�iFO��W��M�i�BEKDc�L:������=���g@�I�s����#�U���bm��D�4D0sQGE��c��������D��g� �^��W�R��;�����9�n`D��(�}����C:��&����S��0�a��������1����|C�F(�~���j���p/�����x�j�#<*��<��	i�;��(8�������zj�La��W1gx��<�K>Y�!MQ+9����8?����Og�&��O����Dq8��o$f�~
�G-��!b���{(=��=i5O���������D�8E2��4IL]���S�������}���;�C�tto��2���J:�����)�_�l�t�%l��1��W$	����)�S}5��0fVM�g�M�x�i�<_�L&!���5�5�_�A2�l����
��rg�mzE�0�Y-������L�_<J�������4��J����4��n��C�����4'�2S\@R&O���i&d�g6������~�]6��O�;9I�J���#P3��/4���M���4�����$%��v���$o=��4�qg)=*��+U��d�<���&|� oh��6�LA��p������ot;��n�O��^��1�Kjz:�-����C&����^��9K
I:�~/�g��l�aZ)y�vBo��`��?x���?���(�F���d&���l���`����r�%J����":������E��N6�h�G$H�����}Z��f�"0��D�=�u=�%K�����,���
J>y�
�g���G�X��
-��R\���L�,H������u*	q5���7�#��|���
z����3P2��(�,Y�����
@�t�MA����'=�/�2�?(�l3�B�|$������Vi�����M_2NE����~N��	�<������9,<�[�<a	^���	Pt���O�`<����'��I��i��l$���~�
�����\G�?E!�~-�����	vUb��<���$.��X?G���(��%�^�Q!������	~�����\�)��`W�^#��:��?��h�;n���l���v����[����FW1�t�;�^��Os/9hI����?��7#�j�'�+��Z�-�'^"�"-�����P����w�yo��*zR:	�#3[�����I��~�M�������
M��g	t!�`?Yv�c7)n������{�}T�?�*���eI�vX���=cF(�2��Y|s4�����o�X��a�rN/~I��];�"�]��f���������s�o��p9�%�W�z�x�l�_�����ED!����InI����e%�=��rY����Z$)'���I��2������>j!�d���)�o�w?F�qg���ep�O��%r�!����_�J*�����&D����@������g��8����N��v�s��`JMt#K���L&.�����]����HO��&������t%���D�����.#��f�iZ_�o���,@� "�P��\��L�$�C�h?G��[��B�UOZ�������K�?�;H�q�N�e��;�����b$o���'�����'l�����j�~���@�2���^�a��������.3������vE��%����T��
��,m��?*�>����>�o+*���O��k��>8��T���
z&W�u|���	q��#�XB��H��%d%���_ ���N�m�|��%d��*�C'�R2�l����[Y��"�w	��gixs;>:+��Y�i���7e���iv��������<�VE�~�m�����W��D�-��Q����qV��.!�
y��e�^Y����������&:�����
����D��lt{	��������D����S�.��d��g�*[��2Z��Sv�MG�7K�?��""�����3�_2&���K�%�/�d�p�L����$g��2�������Fs����&���}�����*��������n9Y��{�O�[�>�V%��v��n��	2�����Q���'ip>.������9z1��� ��7���6��<���1-j4��|N��rR�l���Y�P9�����p*zB�u�GVZ�0���i��'���}�r���ue7l��3������S��GCI2��_g�-�"Vz�Gu�Uvg=�Pz���P�&y����KbBc��5�&c�������j�/�;�������8�m!��o��F=ZM�goN=���#a<��}�!�m�cnf��!�'u��J2����P�=I���@d��X���	�
��PY?0R��gt�b�n����,1)6�� ����}�1Q���C�N5��[XM����^���w��F}�r�(��C��_H����w�%G�-T�%&�[Pq�l��,9�nA�\����Q��v��$����$���iO;�aa"f4o�0�b�'}���&����Q������}��N�j��}�/lh�]�=e��P[P?Q����L	�	������O���9U�����k�������h�?e.�C
���Nq�&R��y��A3-PU	� � ������sb�FI^�4�:�M�Wtt��c�-��$H��_����V����o���w���(6��2�_T�	���_k�\&����t�M>��2#����\��H^�q��J�C�/���!l�@zl4svo����[NU���}���Z��]@VTn�9zL(����Z�����`��G��.w��D���Rya+�amt��_�,w�F3�cV���o�QWf9���X�����9�I��Ev\{�HV�c�lL"7�i2����Sr�o�_TDT���YL4P�T�	���h:���t������a����/P
�0\����G���[�9�x��$��g�~=�X���F��G\�[�`�����<��NI)������>�H���X0[����@-�=1�w��;Gd�H	�vDT����r������u�&�o������������-���������"���g?�_-�F���)(����=����B�+z�	��BP�:�1-9I��`����m~��i'�q�&�7�0�|~?��D���<�b���ax�e��8������#��������c�����$�B�?:����v7�b]K�~uRe��?��b�jI*�#����eu9�Y@����yQZ{��^uJ�\���y�%c���V)�:+��8�T�+�4%D6��B�0|F	���������a��r~��������wW<��sA��O���a����o}�O�WP��\�r��)������T�XQ'��(��l��?�g��w��D_t�'�V����i#���13��%p?9�q�	1�c6���{�Op�#F�`�3��G�H��P	GT�V��,��
���r��%��q�@��m@s�������W��9��M���?$ �@ML���6�����Q}hzs��/�]��h�V��<��z�v�V�{Z/I����I�B���������r�������EO�^�:p�-����@o^��tD/�I�U-���B&�i?�
�^a����.K�:�������e��dq��CaI_���q�Piw�)�B�GLCC#�88�m�4y���z�t�d�}�f
mo�t�$S�����E+�8�%������D�{�D6&��1���C�z���.87��8���>���^gh�zLTl���#����SY���*���V2|x����l{����a�����`n�c}4�����9�T$�@���ub�F�I3�qB�[��������-�;w�$��@��^�H��_j�����Z�*�T���o������������c�������u,�����PM5��"�G�I�C������!���Q��O�v����3G�1�c��e�1
�.����%lx���|nA%�4�i���z��������_Y��5���������w�8�1x�,!����]�a{��������v�E�kC2�1�h��E��A�4��������y!"�w�e��2��4��i����O�[���1��)���R/P��s *�����:���<h?J�-�����w��	8_'�������k����B'��D���CH���5���@��
7�+�M*���z*�1���k��*`�{��V$iuf��e�FC��[���2������U�XPw�p��:��.M��)��������7������L�D+��}^A%�9P ����a�Z����z��������u�v/13�Y~��
���c �1���F���-\�%fH���;�
�`��b(������?i}G�y��C!qZX������,9�J����X�d��W�
:��3�9M���@A��;��u�=2������:�Q������i�a�FH��1���W�Y�Tq�!��VIW�)�elL��}� ��b8�j�
^�� ���)QA��_���EQ"`|��IWl�\��w���:�I��������X�� �0�{��CM����~�� �cQm!���Sx?�`��h�gZ�6G+���J���j3�}x�������������r�����w��Q=mf�.�k����\�A�__Y;�{	�t{�lu�F?A�:r���I������'�z�ut�T[�E,�������#J������w\z?�W"��V�#���`�����
�H��i|%�����@�Qp%J��:�F���9��;�v���v�x|GK����u�3��c���K����/L������_�f���xZ<��m����w�M��zR�Q�:�d�4�|D�����Sz(���q]����*������[�t��Z���nEA�k�eEv�w$KFq�*:!@�Z��=�(T�>�+y^"��m�mw`xr�S��qG �6�`�,b�{�V�������ca�w�T�S��@tzJ�#�v������"s�8������Bl��������L�A�Un���vw�hZ����
���w�?8vM�G	9��sB��9\�.!l(3��j�z7�@�j�R`;��'�Qaf,y�=�xw�b�g�T��S�
�7�}��h��3�Gz[�A�����[b��^G���qZ���`=��<��(�f�!�?�Z��fk��N�g���q��c�V���I��{��������n�S��EV��)�[���9t��Q�3����=���w���,����JN��W#`��L��z$�"F���3���.�/0�����L����i6_������S�>�g���}r�����d��d@��&�����G�d��rhti�oy�Q��)�(X.TD��Q;{vn����@���SH�Yr �>E���I��$�6��p����mqq4?�0D����Z2����
�~'�?%�S����]�YJ�����6��@c���}�8����ElCO��"~��a���
C�����;�����2J&�����������u4P�Q���])�.�#,��:'�3���(��+>k� �xM�	N����":����)msU+Tm�����f��?1X���J-&�3B _Gh;v����[�c��:�2E�;z�'�d?�A����s���X���u7L3QB`������)�Y�"i:���E�u���`�X�cBT
;F��K����1~�V�8~ [
��wO�p]G��n��7�h���4~&/�� �������&�	�9����{D����D��}��d����������L}���O+�����A�X)���(#�
��:�&�{�K�p��Et���0_�:PS�D����|W.�:��|�'�zY?�������4���	|"�J�%Udy���I�*��T��Cq?�4�*���k��C�$Lb-!�qg>	�XEX]C�_��������H���*�`J��<�j���hk�$'�flS�L�*�� ��&1�cY��b�bw�5:��O\�L��t��4%����r��J�������t��f3����-������Wl�3��f+"�t2N��D�P��_��:h��J�*��tE+�����Uh?&���\�S??!N"�8�d���/��'K*:��A���m�$�E�=cn�>E�H�.b[>��h��\�|'R�*x����Y�g�rt��	]�
?��=u|�=����Ux�
��P��@��O�bN��kE�!�Wc�$w&���6�����
j0�xN5��)��]��SV��=Xtd)��)R�U!�I�;F��95w��Q)&���H�^��c�O�}��{���|���N��1�Y/�?�H~���.AC��~�Ip]������=mU��	&"����U�� �����>�6���]�YD�`Jw>�lw�Oe���N����.���!�Yt�&/�k.�M�8m�?�
���X<��H��U|)����.{�b3���Bo+��x��P�]�f�����i�����"l/�&H���
R�k'x��D2�*j�cbyq�8��V�T�a����	��g9�!I�~�C�K���<��b
�3E
X�������:Z�"�]�*`:Kz��n�8��FN�`�|t�8�Q��OJ����h���D[�PA'& ��|����U��$�T'���vI� ��L������9@�P��O��������������&^{���\��Q�%/�9� 3${��fS�Q����lr	��<��LN����P���-�5������=��)�5�8�����T^�|�����H�O;p=h�'�Hk����A3E�����#��61"��0���������7��iN-�����j��/���.���@Z6+���*V�,�=����E�.gL���j�)H����v�V�F
	>���O.��E; %%���9���I[��;tP����kCh�	��D8M��f���4m�@N$^��O���X��m�M�>��j�g����4����	�'� �����T��_���
N�l�{R�
�\a��+0�S�n�f����C���%�J�?pj�un"V���*�tM��b�d���n��d�5d3<5��I��iB������	�g��x��Az��i'�$^�4A��_��P��d��r���6���.�������<aOi3�O�2? ��r����`7�F����C�)W����5�r��7N��P{���O�E����
��l����I��6?�d���i^`K$Z�h>*��d�:d�4���� ~���\E/O]���F����*�����;Q�6#�	b���#���]=3�?���l�]�wb-��#����N����DO�������P��V�1o�������c�"W���Z����%�P�%7�qDJ�&��f�1����v_o��	��A[��FW���W�T'N�}KX��m�XH�T2�
�8�m�OT(}��������h)p����������,�P��(D���f���P��W�X�u
ST�Q!��xl7���~?Qb1?~
d.����&{����b]�&B�a�{��B��6a��'�?-�^h�2�`�R'�U��
�*�,��tk�q����=)9�u�����/�&��H��nE��&|���B��������JDHpp�Z���d��6��5�9�q�&e���rI"!Ow�:��*�*Fc��a��s���9I���F�k=����)9��y�.l����:Z����b0p�������3�.+p>���
���q���`�N��n��~GV��wT����%�,���cw��xp��<{�"�����*D?�vR���R"�����/a4���3#<���O.�j�P5���[���;H�����'/����~\���v�\ r��7�;��d`�qrI��?3�d�������a.��%au���.E~6�����:�PZ�|�Gj�.�'Z��L}���|����5�I��u�e;�{�f�AukF��w���,�O����^���� �W"g�@�j���5��N��V���;��8C74�D�W����=���y���D�U
(�w3��&y71��n@��h�����_���w{��=W�xc�3*�����:�qyI���6@�~vZ�)3$\=D�-@�H@�c�M��'X����P7 e���%���
�
h��G����G�q"w�,�"���_d46�gJ]8aJ�~_&^�nF���n�_��C����������'}7��H�������iDB�[����L������<*c���k�u)�����A)�*O������K4�[�6$�����x���h��yfE�1�����=p�#���]�Im�DF�������*�f�W��d��YW��r�~r���S����_�-,�"�w������6M�6�$B�'�w������Fe�R��do�_MuC��"?��� �$D�k%e��sO�h���������q�m��+F��kV�C�{����i��W'��V��N�=x>�x����@}2���#h[�n�F��\�'|�����v��� �qtR�g��Jh|>
�&�����4q��&
��D�6)yb��q<uK���%"���s�"_�|-j��[v������0��0f1&tI����h�T�~Y���1����m��->	�6�����]����O��Tr��
�F����T'��i6�A|Ka�5���bEf�����:I��T�0�_���5,0�J�i�?��g���2�F�|��9���}Nd��v4V8��o�QD�/g'G�'���z���������w���I
�a��10%^�4o���2p���;������*�a����)�������}P'6����Dt<�KV�1�s�$&�X���#���=�"�Z.�1��w}��������G(Y�Q��aql(�?�p1�uz���Y#�jCE(��qB���X������������L���� �<��kz����{�����m�c��l��7Ek�lo��=0��M��g��lZ�b�(G�NT�#y��j���W�`�j\Y��-(^;;
�f
�s���b�M�'C�� ���b73��oYv�~�\���Y<r��������`��d/Zu����~;���%�iD�;������OT/�[��s0(�����R�A>*�Z���r��R�,��0�j}_��:p�&�*e���8-�F6y�qx�KH�[���� ���D��!��L��A���#v9W��bY|���$*1v�9NcD������2��������eA���;�����-�(��dOp(L��~��4'��p�z��K�6R����xh��
�Q��,N&��FrPMol��.�
�����9����LF�0�2���_D>~*aQ
�|~�j�f���@��QFt�u1��K�u~�&��S��eG� ����^���OT�X�
�4���9�
���K����
�q���@1���ELc���T�Kik���,���|r����b�`��4���nj��y�)[��]��9N���F32�-]�y�?m����1�����o����	m*��k���f��7M��������i����ePd1c�i��F��7p�����z��������D��%�<�p��%��i"�lg��Z�V&�?vS8	���9$V����t�d���Sg�����3���`lc�&��7�;pa�Dc��V���r�w���id�������f�*9��Q�d~if,��'���y�(��
))�d�x^	��o���B�����bx�hF��O��5Eta3
~��
�p����hh��_Q�ZD��n0V`��)�� �{9��1�i�@�j��!^��������MF��A���7_��q�_Q�
:c��9*)4��6K xH�KlCk�b&�@V��-FI�e�1H7�h����+ ��u lv<������b��_��ty�5�l9�����NH�	���@�8[�1 �ija[2�]6��d���f����0� M�a���$2S��L��J�
�����DV���Lj%�
���r?j��;'������fb|e����P��P�g�A�a�u�&f8������>:����e�G����I��7j�LDH�#AaG�D����(����1i��%�]�1��7��u���KC��� ������������$�
��3��Q�� '�����`B����R�9�F���#�=�����p�t�&-���4iaO7%�����=���y�[9BL_�s����"&`^�B�=��9�s�h�*h�����;���14�2���S�wMn����j���1T+N�&��?Y�f*lG��I
��>+>-�s��R������(������'Nz�`o�2�0�2]1���E��u�~�m\�1-�dYa^:��.g +����r����{"^����P^�z3�I�Y,}��'��PN�O���y*����;j\��_�Nt�K��6Q���N��S�'��C��eR@����������NH_+�M*� ���os+�e=�[fP2�j����M������meL ���L�����������I�K���kh��+T"�V�{	����C����^�n�15t�}Ym��I{Y1�?_Z9F����$�:�<i��e���SE�2s����KU�2�����2�?'&r��������@5��7
�l��z&P�D�Kt*�����\&
��a��2�kIne�����;���8���Apv"Y�!�'p���T���9�<����W��\'I'�������o^��n��nr�H)�	T���[�
�H�#8���m���k�,��\t����'��I���p�b��1j�@��iC�G�!k�L�2MM^z�l����~8�=��3D��)���=�M�' ��e�?�m�G����a��k�A�e�_L��7����k�Y�6�B��}�H�:�,W2��I�'V�{e��
�����D>4�ie��~q�n�W��J+��q�^�w��Zk]��\�
M��>���������C��q�-.P	+^��^�����P�b�^��~Q���:5j���z?�o.��(�q�w��M��,��T��W�)�����������D��vV�
��8cp������S��u^hD4���/BL����E��[�qtl�W��j�=Nbw�*���Yc��^��%�r�9��^�br�3i��W���-����Z+��`�vG��#b����i����B0��|��$�H��3Z�}�g����|��^����`�fm�uV��P������H�
�F���mI����}����N�EIL�m"@x�x�����0�����k���`��������9�q�P]yNP�.�~�/G�I���B�����f�����Rc?�5�!��6/�t~p(w��0V?<�k��O�j����o6��4�`��l��e��M���gM���4� ��������E�b�K������m_pr�nqQ�{��$}�����MH���S�m�E}�,a��j������~!���"���M&T�i���~�:�����k���N��m�@�y��f�)P�[�����
�����-�
I�f����'��_�bb)��H���j��h�}�;n)_V�d�kwNunH��/��5(G.���H}�^�={�t�d���Bbh<���4��G#[����|A,�9��_<�Y���_w3�&�dI����� _�����_��h���r��?����O�����:�{�2��_���$�=��
��IM��E�o��/)���m'�R��@�S��C�]H�{���sF�'%�4�;��}�_�Q����G���c$X�J�'It^ :�b�O�Ew��4�*���������59�*��P���t@��;p�����,�
��[�������6��j������?A�v<���E������^�8����Rg�9�m�_!����E]���\���-/�D���9�=�iK��n���;�u=g��$)�2��ohKaD���L���d�1��N����c$jK�I^��5�9��[�<��@W�l]B�	xz���B����h9K���-RvE�M��]As���e��$;�E0�TJ��zN �9?��DY�m��$?@��!��:�X�t� @>y���42�OP\������Ei�7��.��b��<�

s����y�.��/����'G`5N�w�L+h����%U[�a�����e�yK�h��b����Lz����k�A������W�J@mT�@(�*V<�zA �2w�7�Z�O#�����e�@!��Q������Z�
�T�dK��������B�\j`<i$0oi��+���W��RsI�S�Dhj�U^�*`6��+.C����D�\�
��#��&Y3��������#�m�lH�F�T��b�J��,'�mM��C[fZ�J8�J��4t�����m�W��9��_�++
�D�
P�)y�L,�4�2��eS}I��g�@�)?*���%D1�0��&/����k�l�fM��)E�;�B"IE4�n�@a��
/�
�
��Q���	P^!��?��>��s�W���&�d�`d�uTe*�=�/�O���&Q�M�0c���#p�7H&�:�����z�H�X�'��d8#������@|5~��,4����"mi�a`�n|G�V�P6�*�0���F��aR�`�ZA;��Iz�2��*�S��noLH+���������<������{k�V"��v�h��<����u���������K�-r�$3�u���z�E��5���d���B��u��	f]n<�T�=1kk/����!�����	/�����	��b#�����^#��H�������V�����Q�8���:�����7Q:4��67��X�������*�����k��g�@#�R��A�LPXT��vFmy
P1j��k�\��	-]0�� /�2W0
;��5�s����
up~��QTn����Z���2 >|�O����9�4�.X

�Y�����E��U���1�B��e��R�*3-�D.aG��B�~�ML�U$��#\le�A7�@�e��@�A[��[��N:��-V{��� x�'����fB�_PK�R?R�9sr�q�g	+ test_data/4_10^4_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux����K�u������G"Ec��]��' D�:�H!�hT��P��P��Z����n
!�Fg�o��\���1�l��7�������?���������7������������?��/��_��������/��W������?����?�?���P����������?�W�����������?��z���������?�����������7����O���������?����_��������r�����_������������O���'����������_����q���������������������?����?�O~�������/����������s����������g�����i���/�������*���������Q���Q���?���������_����v�r���S�����
��_�������i���s���_�w�����y��������s��������O�g������������z����;t�[m����s���g������������s��7���Wan����z��j�[Y�?����J��Fh����L�6?OY���?������L��~�

���������0��z��y>Wi����3S����[0��U��YO�M0�Z�|���Z���OT�L���q?p�k�����~�x���O�`Z������=��)�<�XF����������~'h��E����o�|^�����s3%�~K�D���~���G)��������������}sd�����~��M��|^�|~���f��/������������q�#�bs|~}��RN����,����~*5f��kh�5?ow&���k��`�~�i��V�2�6��^rbufK���O��d!8X��{P��Z{	��l��Fw�\���������>��k�&�������
M�y����5~TwmK��[�8j�=:x�����}���;k�����k����g\�����T�G+���p0����y�\�{�������*�O�� e��qw�:~��sp����t2N�{��-�~x�
;������G�}7���=S�
�][��J�|��H��~�s�����~�3}�X�����C�b��K��C�����I{���k��Quq>1�3a��xVG0����w�{������O��O:5�X@�.�}c�����~S�L�q��~�uk��s)^�aNp�N�Q��hf�T0�mAF�����QY�_i�����d�<X����2n�N��Sjw���7��@����:G�~\�!��]2�R_�����?�������������2�H���y���d�:o������P��o7�:�2�0k��L����4�~:��e��#���C����`h�	��gG���8�s �����P����yC�`o!Zu����:��f�am�{����<:���Ett��~��u~�����I��4�hZ��h�v<:�����9�G�O�B8������wr�`�8���6�'��FC72����������yu~<�!��{�$0g��4��m�{[5J��tZ�����u���My�����n��;Qz��=]��>,�p/3n�{�g�$����~]�z{7�K��)�u�����x���0�Z������Hw�S�t����
t?��}7�4*���b.����	PmA�Ag���������G�WC��'�n�'E���9�f��y2��%�}� ��D����ig������UE�;������"n�/��uo"���`&
u�M~[��N��t�>F�Nt���n
�W�a��o2��!�����f]o�_|h�N���'�W����Z�w_b��;�K�L��;�����Y�O�MG�P�������* ��d�>�U(���
����J���q/Tf0I��/��M�n�����7�iZ��{�v�$F��.w��g���k��a�%�q���i@ ��>���yw�q����~��H�-_7�����v����t��7�x'�	ndxS�����P�E�9������bh�� �{8�&�5y
Q�A>]��Z�@��y#�("�N+��{9�w�o(�m����!.U��;7�v$A��=��-�J����f����6�7v#�_'�� �������f�*�3� /����y�9�w�dB�����\�
�f��OC���y���eQ����Ut�%��U}�7��*��g����
�P�M ����=�/�H�+��b�=�A��~�z����U����������V�
r��J�^!������lX���YUb�$��������.�������l3��m�?z��q	�$u"�d���$�M�����&��x4Fk=������L��/��w��E�� �;�K��
�?�1�����
�R��7�8���BZ�$�}��8�E��Hp>����"Z_��A��L^�����~�~�	a���v�
�rW�HV�P�}�@���-����U�<������������U���:bU���N��q��������}�#X��=���U��
���XU�J���������e�q<��
�o�����f�|�8D�������h�A���p�*�~�!����5n�����3?������y!��V�[7Tc��:+��4;\\����
�_������>�(�F��VC�R���
v3����w��D�.	��r�3n�
����}~�-�n3^x>�X	h�Z-�4����1��D�
�����_�����i�,����yH���`v?!�����1O"@[rs'Yp�
��7xaf�{���s5q�0�RyP�;�:b���E�	B�,U��.�#LW!��������VO@d�U@]U��o���&�O�Ws�5A�Fp�����]#Dp3�2��H�v����Q�����=9\E0��]Y����@)x�#:Q���%�����D�4�U\@I�[������t6� D���yH_�nKJ�?)��4������������9��7�
X�j�|2B����T����FX?9<1���Q�TA��n�T�4X�@Q-�o
<�a����h��H�x_����:
�u�dC���w�R���d=���^�"	z�F�&��Q4��(]rB��8Z������u�Q�
��p�\uZ�so�&w�~g�)I6-�J��Ti�c�8�s�:�����NT4I���Dt>��P����6�Q.���%��U�@/U�����g���J��ft�/&WQz���Sm9p�,�An���
$��������������}/���$a(���C|�D9��^w?*`�������W����
���&I��U���fcx^�4PNV�-������EYj��U4�,��u~I�-*`��"Q�&��$��*�<9-�OPh������l�V��#��NT(�/9�\E'>+��;HRP�Q���S.��=���L���w��v�Dp�l���`l���S��D
!��5a�+)�����PR�2�Y���yX�����
��&B�3UCR��D�`�h������8
7�|���^+��n.zw��q�knQp�0�!�X�Y�/K^���Y�C�x�T�!�	�&&��D�
��d�W%)M�JGU,
�E�����3�&b�������$;���w�Sg������b��F��5�������	��|F���S���A�����]���ER%i���}�$�m�V�<����5��iu}9����4
2�f�����
,EnY�b���}�KfMwN���O����:�e�e�*����{h��Q�{��{I���p��%�l"x����	g��4��d��xM\X�	���R�J����. �Y5�FcG9Ok����x�����&Fbh_�?�#�>���O\���AvT�KK0��dD0D��������L�����k%�����K�t�`�E���<q h""%H��1[/%�/��������)i�K �R��&��z����1L�����h�#)]Mj���PT`UP�%7�r���W����� nv�R��,��[��`���[�.�%M��M�U��`�����76\IL9���S�j�lCpH�l���`�,4���lB�O����3��8�\W9����)�8,HV2D.Dy�xJ�vd5{�4�`�H*���6�AF�!~e�D��~���8�����/8������\���o��=N���6HB�mo�����������@`b'���{";��e�+���S��G�Ir��T ��71��L�ml#y���oF�n<)J(�fw��{��~�)�R\~);�T�X��Q�	��O���"���O�m�84lD|5	�����x�����8�Q�
H6�����#�@�
����0I*��p�W��	��]�>r��C!�H�m7�"������.,�P>l����S2D��'3�����oRt��SwH�Cvd��]'@D���C�%�S`u���'��� }��u;��q��R�s�)mN���!������x
���������j���^-[0U���1vs�_p�wA�)����d�L�E�r���
���t��$�f��( ��]u�2�nC����nc�����d���3��<?�
�h��n�����#�L��n'�`��7�����`�afcyz���^��F�X����5���'38�B�!��Q�'��~��I����A���������g��O�a,����5n�#`����d�u�".!�;��.����f=�c7:�*�8��lb��'�X�������Z{P��_`<bEDu��D���8��45�����C]�x����F�r�x�	>��p���
��Ut�0�H�)?T=��M��X�T�}��`����u� M��@�(�z�oA��D��/��[��7����j���n?�ig[$G�r0���}���[�]va����7���C4�@(��M��w!��p(, ��_#�y7�
;����8�g��O�T�������1��wa��uuC��=v7f>����%\>gY���lHB��Z�/����*�W���Pr���a�}��-�Q���
$�%�����Qh����L=��; ��v�G�Y��B���B�����%U�������|6P��=�������c�`Zt��IB�]���j=��{`"������'#�H�~uA��P�@%���WA��5d��	��nQ~�s�
����y����2'_��w8������(��
�����^.�
�N�-|�
&z$CH5�0��i�>�F\{??�4����)@I}N�����������,A$��G
p�����>�m��`���82QI
���Ef�tJ~��8�%/VeF�����`mt�z\i��x���sB������'�5�����x0�UJz��/=U;C�������w��/{{����-�+�5s	$c���w�{I�0+P����(���JLF�m���zX���}���uE3�"A<����+KH��
��(~�H�E�FwO/���.�`A�O@y��-�w$I�rG�t1�N������'���Fi�-P�!j���!B�r^�s%�Q��X<��$T������+.39k=�f=�"���YI��,�hk>�R�a����5�h�C���0]CL�������p�3|�W���Uf��B���M�e��P�z7��L���]�I��
�Gm��m�=*Y�;D��%6�C�?Ac"o�j��k����[��vXG=���Bf�����V�:�py��l����$�������H�
1���n��+p0w�b�f��
r�a}|y�^���S�$c�(2���J��npBqz���5�c�7ffd5���c��%���j�tg�X�?tr�p�Q��J�I$j��&L��I�m	�����%V�%���T^���h��]d�!������&�c75���!���U�P��������b�b��c���2�V�7D����l�'�c2���"��S�\(9�_���)�?��=yhSa,"��t�]&�:?38�nQ��$py��`�H�@�8�C,Q�xe�w�|��k�),��7�{p��Kb0��T���h�<c�?���I8�;-���SE�[�I�{7��t�\�=�+����S�Q�?��v�`��M��W?�9v��@=����`?;���A1�8�Ky��z6����~���q��O���{j��'���B}7�����~�'�u	�>�0��`iS �	6����B��V�`�����cZ��Q�s�^������X�����&��6�`S<�2N|���|����,3� ���q�a���X�j{�N�Cc��������MKGTM���,���a���D�CL������T����n��kKL���<��h�������:`cXs�Y?��7�����'H#f��u�����9��l��U=]@�L.%�����i����}L��!�4��r��7�YB���������Ep�i=RUN�����r�HNw���_��w����%\PW/\��f���1�F	��)��LB{��
���?�������x�8?h�]��j�u�S�P�i����!�ul"���|���v��8rdr ���St���I�q��	��in@�H�">���$vA@Yo��Y��?��YD=YY��C��%��'�+���	�7D�/��8tC�a%�nDI���2�m��S���0�
,$�k8%W(x���INs�����J��(0���Z��]+��N���D���b���M�F����,��R�)@������ A����b
�GH�v�+`��;��dJy�����t�]D����f��GO��P����=y���>n
���]w�L�����h���zp)iQp�	�/�������^��bilP|iA�+ I��z���aBW�m��<����[��\=a���1;
�W��i���q��m��������'��v���I��|�NOrC��tHH��m�������Q���}�	=�%��b���4���'�:���5��8
�����?��12��N��(N�$	�fI20K���,��&�hek��2����
�D�;��'a���p��3���1��i��3J?
>������M��1����O��,��q�G���i������?{yQ�@}����`o]�]��mx�_A�������
h%�	��h�.��>�A���H�yJf~������������Aw[e��0w�s'�!-�T��0� Q�I18��@y�����,��%�D����
#[�����`�-���1�X�-��`��E������*��P��;-��Q-,k��^�����.���DW+u��+S�U��{b�?$p����'K�}��e��b��j��������0a~�p������E���Y������9���|�Ks���������b���"���7�����-���#uo����W�������vbYmQ�@�����~�3�Y��*�����[B�o����v~����|%k��=�J�X/+��k1�JOo Y�&�[H|��Gp~�B���8>�G�<%�i4����I��^�7Z`Q%J�%��>&����@���V�n�H1P#l�W�����B�p��\�K��kX�xw�����-t�0ad�^��pL�d6����(uY�(=����/JFy,A�^�G�#��Xv�Q]�����%@l�R3xA��r$�D�@��v���������g�G`vv���z����0�[���L?"q>a�\���*��F����P[��Z�����b|-����~4�~Y�%����e��C��|o��>{w-ZR���-�����	�����s�H"%_J�X��On����BS��/r�����1�r
Kqx���	���G��)$������0)@Y�@	��o�-vo��$�4��a��Q��e�o,�{�W��6��t����>�=<��Z���������`!�@ag7�'K�����29�A�1.#������	
�����M������D��m�����]����c���_����=R@�jY�?�=�Q�@��v��q������}&!����_
��A��U��l��%�w)�o���{�����6���2y��^�`Poj�W@Cm�t?��A���E@g����;��uc~�z�&����h���������'H>���=���
OE2Y�X7���E��~d��S����]\��kZ��N��mZ`��af�d�F��:Y��oDMA����Wv�h��A��m}~;>������R�
�����|�����*�`��/N�x[����P���_$j�md?����n�Y��6���d�&�
. 1O����u����[�'���W�G�@l�m���3>��D�[�>�F�����O�p�pj%��z�wo;�� �����`=�um����2���<aB�������,��e4?Y�V���
vkY�vs�ge��6��;t�5�V#�Q�F����� f@|����"7��@�����Z{�mN*�`�]��\+0���q8_���`A��.LI�����r6�����j�r���H>�Mu��M>�~�G���?
��m'��V-����KN�8
��r�(v��`�m����5w���^u�*'���`k����6���Y��Q�?������~$��Pw�p<O*�����>��T�����p��������M{�^��s�($��l�����%��^,��q��@�E�b��~��6zO�N����m�������H)q�2����0�;������moi�8��������'��������8����a�n��I*/���xlG���	E7�O��/�|��<
4;�|��XJ��H��a^�}��D��Ir'��a��;���S!�����O�G2���r:�{0H���f�
����0�K�������dv���{��{��>H:F���
N�����Z�{B8����R���9���|�J��5)�<��	~�Y�_`7R�h���WP<0�8�W��S"�>����|�T���|��z�"�=��Iu�)�iTE��|�Z��9��)33%=���MJ�JN��
qeC�|�d�Z����dp��;��A?u=�=��s��;%�����Jw?n*(��qr����AW�;�h����}0� �<v���M��'��s����y��58QO���N�3;t�x����,�c8Yxn�KUI��K�HVM7��s �:6�/oN����
?��Gwp7AL$��-v���������<"WV�W���f����8��)&��0|�~��s�S<B��3��x�b�H���z���w��;�_�qA��V��M�g��W*d�{��73��}�q��n!�Jr��<'��f8s����:����I6::%��r�}E���U��A&�����V'/p��p�CY*��-�3�����-k�{�B���~�#U
�������"����3���*���R�?��5�3�SAY�V��.:�Qk��.��cO���P={����&�IH2mo���GS��,�eN��s����=���Xa�AF��ScMgMX W�M�&���H��=R���Ji���o�=g����B��9��C�8�c�fb<y,�
m�r�m�h�
�(�&�O~����-���`���D��:�����fG�RG�'�~Yi�������[=��%�o�����y���{�$��/�?JK�y%`n����wg�p���f�gY�U�
�cw[}JUH���#�kq+Z{ZwE^��~�<��"�9��Xb�����u�ix����L�c[���:
��sl����)�~��@�{�p���m!(b<��r,N��)!��
��k�}�R�#"��k%'���0��m8E��R��o�����.{�
��Z�#�\G��c���3Ps��&v�����%�7	��b[��:
���3�
hZ��Ir�8�s����7'-+��\G�`���(
{N�fP�Uq��Z����S&b��u���E�+�i>���&#�X��.i����s���������h��H&q����t4F	e��}�h>��q~�����!���Y���3X�/���������6H��k����3F�?�A�LI��(}h�GQ#Z���\Gj|���m<�K.~.cxk���|����\2��i�)\�m���b�sL"b\�x5v�����sWo����@����n�FMh�f�Q~�)E�
C�������:��2�#��P����10���Q�D���xS:���~�#lC�&'�����_z��>\+K ��\B���N�@�Pw�u�^2P��*)�)�������g��M>:%5�?�����!?�w���F/L�9G�J���\F'*B��u�g���*Ek��� �(�h���Q�$v��K(t��1��dd���&���%\�����T5�B��JVo�B#�{B%
`?���C1� Lz6.�=.Y��G[�;�^d��=k2�e��1��w����vz�>���e.n�����:���\F���R�I���hp����N2�2�4hF'�ti�1MHg�P�K�k�������%D�!�X�b�3FS.{����u����c��!$g���FC���A�4��������.������o
�d�O:E�l��h�-��E'���>?��4�V��2��\,I�Q�����dn�u�[�Omk�./{��f��/ �?�q������bN��/�7�+�X��&{��nt��B^�_(-:�D���g����E���P�$_Z�������
��^��$�����@l�g`{!������Ix�	�(
\����:��>���O ���������v�Q6a�?~�Q�&����R����&�8�q��Z(c|���
x�Z�f���Jf��b}?���f�N��5���d%xZ1�?x�^f� H��B�������!��E�~"�-������'����\A!T_{{��#��l�R�K��[�G_���?���t��~0��T�&�1���t��U��R�v��{�N��6�����;	0J�;�66H�����bY�Y3��J�!�^ �N8j$�@�6v��3��+��-��P2%In�1O������!zgf21f�v&��K�������h����x���C���t_��mDoMG��x�
��f����4��38��-����.i_t2��K��X�;�����~��=#(�F��<i���mR����z������?�G�xn��Jv)���']QJ��~�����C���v�~\���VP�G���k2D�V�A�d�pY�koa��R�"�n�?C�6
��H�}�I$M(6��D0�qI��R��,&�G{����n��M�����?��*�K^�x+L�12�G�;z�A�IO�R�����U�7���i��:�_�K��~���I+����7���;J�s�U����H�?��0�Q�]�A�
m2�=�12���
�!���%����3C#��h{Ew�R�l���:Bf1�'�K��2-��$�.LRW��.���5TA	@T�K�����8����~���'�cB�[���3P�X������}�xe�I�J��m^H���Z�������Sft�-W�E�Rx,��]L<<"�H�R�M�J�;���GA��~Q{���H'���U$
l/E��!Y%��|�>�5�EWF��K��>y���z�)�H����@<?�+8�1���� 5{b�)"N%3��|B���$�(����#H��\��������>����Z�?��;P�������o?���c^�?�NXREl\�2�O���= G�o'���*�"M���OS��vP�B�CR�������28���z{ ���b%�^uW����T����K��>W��MU���h`�;i��^�9�(��I���F�x%|p}\pr���U�Z�[P�?���\��0H��*�����=�u��0��dMY������UlE��*�*D��Z�n"��^�}
���6�U�j8������n3R�^&�������k�s_i�I���y�j�}�QF��������n�&}�,t�-�
+U�>e�����^���T[�p(.ZS$����y"��R
�'��j�}��������f��������f�g�UA���lK�U����R"({�4�����$;�{O�F0�Pm��=A}g���!(��!|t����H�����u�lb��]��������6g���T{������v��+ ������s	�����nL��j���q`b������;	IO�����R��@��Mn�*�_�����g���/,m��J�Q����:�'{��Jf���UU0��*��3���":������X����W�����%9`�G��$�s�?�;���(��5��Lzg��l~���Sb�R�@PN�}��O4k����c�G�����pJ�����p����[]p�xM��������j\�JG��M�\�h����`?�(
���0�`���J�$�,��J�b���� '�ku�������0�@����[B�W���r�
����B����Ru+���$ �n*��]�0�U	J]��C�5�n���B�)9QrfD?�$��u�"�JZb|�
��k��QynG��\G���s���/{����9� ��~�Va��)��;���z�j�������Z�id������'w���_������&��dx���*�>��������=�K��(Q��`|F4���5rB�5��$4nI ����H`��x3�dtt����!�%Q�&�Z3�^�-�A0�����s9�9�^I,����[���MH<�$Bs��#oF��������`��|=�U��*Z����&�Y�B$pO+��m.�z�f,���A�%��A�V?��qs8�$Ik����LgT���������K|��Xy�^����XnOd�4��r�h���h��������g�����&nMp=��Z.E3Up=�>�I������3j�Z��{,����\�Kn_���5[R�N �K�iEXm
�����:�P�@v����.��Ro����$T{k�;/�%=mKX�<T�;z���������+qAp��K��;	F4{l�s7m:������[��O�n�J9z�%�@��?�a�Mo����]E�.e�����/��{�`c�w�>�U�FL���r's�/M�<
�D����j4!��:Z��I6�����(������j4��#H�Tv{$�DM�<Gz6�-��Qp�}s�A�����n���Fp�5�;�Vk����?y��#39	��w=.�G-�x��&��v��O;X$K�
|<���Htt��[�9~�Q$�^�p��U�r�+�@�T�h1�@��(_��L�+D�P[VU ��}4fYs����3�}���N���WiUi����=aP�]A-
���/2s�c��(��#<�>i>�	�����Z^Cz�j�%��;�$B�f�~�~i.G��(C�A}���"j����U�����{Ki����2Gm�eh{u����+:Z���i���n��t�h'T�5w��)��3zn��-�O���)�I��&`��*#ZO�q��X(���7Z{^+*P��[@?�$�x=D��Mp��j���	����� [�Q� ���F�0+�wY����~�T���-�?.t�;��m�s��
N�nw�
��^$x�]l�h���\@Y�x����&}LKqP�%��`�P��	V\^���a����?�d�IRTi�-��C�
G�N���D��:�9�����9D{7��\�b
K7������P���%�,��?h�*I��E"`�0[(����O2d}�OL�e����W�����.L��Q��\�N�
+_:�$������5���"��^�[�g��TAR��Y�����z�}Fi�J��^b�
b��*���N���hwo�7�k��'8�T{`�������	"������%���&����8���r�h2�I
���ZX�����A����J���v�Yo^�_�\d9�E+nQ��T�X�������(]��6�"B�('cZ��*$���b��y�M��(z�>����(V��O�6��-�u��EX4��~QK7��O�z	���w����n6-ZR��O��.�aF�����cI'��m�C@�
���]X������G�@w/�d�cC��0M�D�0�KY7{���F�����a��H��~r7'���Yiz�����E_\������F�lF���)����|��d�\?�^�X��%������=8���z�W�.��5J�]p���6�&z��L(B���"^T��L����:�g����6��]��

�55�=BnL+�cr���}��,��V�'n���wnQ�"�����X�D�}�i^��&_�	Kw����G�7tW�&p�I<��h���Nv[�����X����{,G]Dv;<���HL�D����*����Y�*"�:�.�
��%�7���S���$��M6;Q�F�h��&:�!�����k�g9.�<f��Y���|p�F2��N�:�#KH
��JI�CP�E����b�.b��^�����P�H�t`�&	�0�p�����9�m(�B�����\����d�HTC�Bd&0D$��!n6�".>H��!���&,�����Q�p��� k��D/�8�L���o�}�b\��E���h;�Q����!V��E�z"�h�{4��&�:�b&e$�,�O��|��A%�a�&����<��w����Nj�d��O1��:�'+X-B����N���������t9��U�-L�����bd�4J?�{���d�W[�Fc�q=��(*���W���6��\;V�y]X��~y�25jO8D" �?���������FC:��'W��� ���ut���n��78�����XY�@%q�p�AR�=���$��.���W�w�xt�^�A[d�>\X0����b�n������
B��[r���kE�������	��L%���D'�m�i,@��J�(B#pVH��u�E�pB��n���~��6Y�Wi���`���.�l����d���@4���
�@)Z��w�!����;)���&��C+��j\�8'*�!z����`[\��;�$����'��m5��������
	Y���	���g�A�������7Lt���7��$;�Sq51�&*���/�S�\_~gFQ���Cg|� ��rL�I��:�{d��;�@y,W�5�b�J�U�q_���1fBWq��d�9�-���P(��:V�`c��x�$$��p
����%L
��b���c�UH�D��r��}����u���m���@j�~:��(}��d�,��g�n��%����n��c�/rM�J�KEPTJ4� 8B'��&!(NFR=������i��L�����W�$��x?�*�}�em�W��h�
���&{S�6K�}E����r)�um��er��a���x����B�0��3�8�c�����N�;a~�m�p(�B��|��
��V��(�X5�"��:Qa�$l�E�����`�OQ�	7�O0���"y���'��4%�p��8��!/������O���}���D��]��
���u��D6y�L�pdHJ����d��H*g����>�x���0���X�����k�XI����P��N�LR����U�LQ �C�@[�LPn�C?�i��������	�2�6������%9���
�I��Ymj�NZ����Nn��C�K����	Z��YNq���i�| +���I�0E
�`W��C,��TaYu�x��N�)N`G�RT��c:����
*K�9�v�����vC *=y��B��qA�$�2���c+~>S��~��_o���X���������e�dJh�p����n���B���L�J��I$8S$@W��D7w��d;��$7>^aY2FAY���o(:�m5���aQP-�%d���t�&�K�
L����&?�z��\����m�.�,oU��2���)T�$G����i��x��v�_�A'��j�D�9�k�����^��a�a������n�������)?��`z,���|�Oc���f<�4D�����n'��\&��:�$�%&�P<�3�����K��`�~}3*[��m����~���R��p�b�^(�	�M#���.�'��$9�\P�{a��ENS~��{
�_�V�d���AU����O�O!�-�6B�)4�@�J��-h������e���-������g���f-\���������H���}<�#{�i���v�����l����U���N(�)d?������-2q���g
����q
�?���|%�T���i	���5$SM���u	�_�yB����y�2��pQf��������vf7g��Px���A��O�,���!R��c,�&x�&a�r_Z1&.\����`�w�IW���/��Cd����c\��O�Z*���%��K��L��KP�L�������1a@W��"����0iG���V��X�$����?8��A{|�Vw1�K,���{��!6B<���x��r���l���\B��~��Jr�/��M��U�Ll����.$I&G_��RW^�BO��Ah�	�a���e���v�)F����ZN^���F�-7��E�^���x�z	�GF1�:�%`�[�?���B���e��	O��=��$��^+�L��%��F���A�l����ZI �e�y�M�������&X8m)��t��EC�����z�����E��_p���	��?��,�Euh"WX�"�%Z *9^�����G�h�(��k��C!���q[<�wh����z���	9��`�	��aW��m
���!x|�F'��G{�e�I&�������^f�
�[P�����@��qY�O+���h.�(���P)
��GF�Wk����Bx�.>�gw��D������K�/s��,��3�D��]���l�N�2����K$�����-��
�T=�����h��kE^w�>?x3�7e���U-M�m������R���������?VeQ��.�`���6%a��ZE�����@(?��:EZ�%���n�(��M}dlIrIo�������t�ol���Em�����R��4Fh��^�?�Ki�o����#Kx����tL{���a	�_�6*����������n�;����x~���H�&�K�:�1$����~����:?��0�'!��1GT17��������g?V��
��Ka�Al�h�=+#
�6|//�`zl�����I�R/%I�~~�U��C-~.����J|<4�x��()���b����#E�������w��j��+Z��d	[>F���� j���"P(����,_���8qEO�IMK0�m�~�7�����/�����@y%�������<a�����v�P�H=�����6����W�7��X���
|��`b[�O�LIx�}��z������^�����]�#.
�v�}����.8�}u�\���_P���3�R�h��%�h����'_M�=wL
bM<���=�,j�����{��Ix���G���y_KN
���l��_t��=:��\��hu���O��aQ��4W��d0���l���n���4>��&<�[B���k� ����u��he���~��iX�FaG7@qA���
�(�RO�;�#TA��M.�3�M����WC��D$_����.�q�:�R$��m@?���p�n4F>��SL�@6[�=����JiD����O�gX��z��v�Y	Z���7���P�.oa�fV%`�`�w�QdR����O�:J����~�����~{�T��'E��[�>�#;�9��`��X����*��<�b&�Yx+Vi�L1��2��o_O��E����r���P��%��[4�@�{��j�z^R`��.�n���h�����c�B����)< �u���])[bbd�8u&��R{���r�Y��^�s�,ol�m���Cu�!�e����	�hy����Pw��VM.�{�a���������d�B"Bd���ja�8��-f�2 QI!�-������w�)V�I��v�`$�$�lJT%��}\�{?����6�:a��>�I+�a�@�3�?T|������q1Yn�o-�nQ/������)0��d���E�"��-Nr��e���R�h8��3��wr�G���vZ�B���vD.PL��f�����������;�o����`���'!EhA�F;���J�g���������nFT��y� ��5��
pBG����K�$o���r�GmaN1�{���Y��D����Ny���!����U�i��a�:[�T����5h%=���.�Z�#� ��=�����}��@�[��Y��� 5Y4�����O[���*Ig����$�
�v=�����T���\�c���jrf-���������@�1��J��F?���4T�I�z���]4P[VMK����r�������P�O{����������^=7�����,�>��(�������,�����GV}�@_����Hw�]�3�@cjG&j9m�N��Z����������(Nw����l�,D����\7�j��;��mj�*������~>-r�`���l-�����W�����n&��Pe��������8��!u��e�q�D.,g����4N��#�b*����������WX�������LG��)6�e����'J���XQ��uI!�[]��"/�3��r��1�5��]�����k�4��}:��~V��9_���Q�%�&\�Y?UH����k���e*����T���(����=[x�4$%y�IU�Y���s����F��.s��\GP�Ih�#
��4��E�G��?�zh�S������F���x49�Nh��$o�}1p�����v2����hD��M����%�����/f��dWxED/�q�����|���oen��~�x�D�~LD������v+�f������L���&h$��d�����o�{G@�������*.;xD�BmuOz��(�o0�����������5>.?�~�f��G�h2iy~���#Q��y]�.�����>�������\@
]|5����<(&�\��D���?��b�C<������7�+�|F(���j��?��S���g�����P+��.I�>�0[0m�IC�(�>�0�[__� ���(����1v
��N��0m�|�Zu�� �\F�j��|����u�<Am�g�������.&�������'��]\�\�]5s��\Bbm���n0�T=����`	zz@�|F+X������X1��sgeL��hfiJ&���x5��JL>Wx��w~�$�;����iw�R��@g������~��A�BPk��*�a%��[��g1?_eFS��S�D��<����{G��h$J���X�%�K�B������\m�by�W�����Ds�AZ}���_�C�R��]D|#��8�[��xc.s�a���hks���m�V�BK��b���b^��p�������4�3��� ��LP%0pg������B[��hi�Z4��N1	����@�m����{�>��q.-�|Jw�
�1rl�JL���8Bs�td��C���[�Xr}.����y����+�|�3�$g�i�3p9`��:IzD|.�Iv���'�3���|59���7�}�h�I$A��a��$���*�?c�-�2��g���������V�����"����>��Z_$��`.�����`�<&����V��^"u�\K�ty��A5&���Yo
�}���(!C�P���eG�����n�����|��Sm|3�������w}yFO�3�(��������s�"G_\�iV$���@r	��������X ����=c�V�p��6>�����E���{���V�Ez�����`�,�m��!��F
��k����1���\F(Z���`��<X���U���%�ec*z�����-��$�D�1��j��X~�@B12���%oY�-$��k*�
)��6L{����r3s��\G�=�.�3����#���d}s?��`C�43����f`�	�!��$�)����@z_�[�"������B��<v����J(� ��Oy�����\�1!�3��@���X�\t�����s	!T�%�|yl�=t���O	h�����DU��������6wVL���$�]-�*����dc/����{KqA�}}�u�v��d���w_-�����#��JF��D)����'�2ky+�' uI��Z�8	���p_z�r-�u����KI��h<eTU�S��/~���t��+Z�*N�D<���`2;:�\�p'\Hpw���R��g�($.IPX\���-PyR�Z^*����	BY�'4Y-S�������s� -��h9�\���$���jv<N�S�Z\�@/$(�$�*�0D��k������n6@3�hp?�j���������p4D�(#����G5��Kwe�qWq�%m2���hR��7�wf���{2�H���7�I��T-"P0��hrM��9�H���@?����@'�9��p2��Z�(��cGKP��g|2FT����[]����s���	��	)V�!`E�)9�XR�Q��	��w{O�H�V�u��&S���]d�%�B1� ��d���}�
�T�\�&�>*��7p�E�����\��e�����D�8����gGjq�{�bqI[$�)"�"'k~�#^[2�1�]�">�������jR���'��1�B-��e��jL45���eY}��S��j���[�K*UV���H&��D��:�����8��5�3�VCp=*&kh� M>��#Y0��F2�E��$v�(������T��nE��&
����r��18�U�VY)G7��,Z�f�����(�3k@�_��H[������E��x#�n����@���L��8��($�����z��+�P���5ob)H�IU,��Q�`�����hm�k���D�Y�,ts���,VO���)��O�����-Ym��1�U�`S�V�%����CP���W����:��N����TJI��07��/zk��'^���>������C�K~k^��A��<����4��?��o��t.���nI��q����tB^T�%��L2��Dk�m[�����P�NI��:�������[L��U%%�#8�y$	�T�����t��DY��D~

��*�@��"�+�/A�j��G2I�c1�����0��������MO�*�?I���	7�2o�Z��S�_�B���7fO��*T������v
�s+��W�!H���L�KE��K�6a{�"�J8�*P>��|%�dm�����GUT����WX	%U�S������.E5�!�[��,
��kt���(p������1?!?��	�"h�O����2���(�j�M�ju�@�>�"}�M�G5�1Lro'��|%[��j���������������o�/��������oBYW���4�!-V�3E�=.a��b�j���kI�Z�O�E����:�P�\����D9��9U�%���d���0����mI�M��"���������?�{'n�����~�E���V���l��&�?14���~�:�'�3�{|D���&L�
���0~l���*����z�*]3@|�c�������6���U0?F3rv�v�e�"Yv��<�6�>2�G8Q���XKG�\����<8����mb6[��
�e����VA��5&�+3���m�3�
s��(O���U8�N�jU���3�N}I< 8��M$��a�KU��4�����0D�'��;n�����e���%
���cl�'�}�[{\J��CYX?�����+�v�Y��c"�"�X��T/���c����V!�����qijQ(,�Y;��L��5�������H0a�P��(����'c~�m���D�z���sOR�f���?��������I{������� e(�*g���mnbxO�DD�����o�Q��\p��;�j�Q��}����`Y6�P	��e�E���/~���W����6���e��+���H���|�����g%z���������)����(7hF����&��(�<�X���28����w�Q���U�4q����[6f;
,+�Eu����s�J"�&B`��7zpe��P�
�����7�Z��<���	'����_mG�B!We�������|����LG��L>
��m�B���T$�O����E�:_`����A��g�����B��Dj�pg��Wr��\�k0M\/�U�����X�[G{2��@�p�������Xd�l��G��[d��44�)���h�&����V{�D�IE�^Bj�T���[s�qk����J��Dlzv���^"i�Z�M�����d7����Y���[Y�&�;K��v�"�F������0��U��MO����e18��(lQ!Ss��=���R�����o���J���
�!v��G��3d_�5w:��;@Z����(:��J��Av���'2a���g�$>A��4W�2O���&D{���l�*���P�m��4���s��D.@���8�q��}�����
^���@�>�S�z_
�.���#Q4�
�xTe����{�������9Y2P'kB�e5wrnO��Ag�I��
�"H�C����.��8���6rml.��X3��0Sp7H�����M��L��l[�����t/{�a���fv
�Q���#�C.�m�s8k�F�	]���.J�@1�g:�I�~f|�R�*$mP��\G^��}@R���>�U`6� j��*�J��%�7T/����`�|c"H��c���R��������}����.>��]a�oJ���_��D�2�>��%P��,��l�DARI����G�H��v���hn�
��Gr�����PC7��
��G-~��w����
�A������	��#�%,\I�E�=��&�\r�w���'.����9���2z�:()�JZts�����Y&Z��w����^�R�O�\G���1�~�v��=���4u�j�\�|7*������IF�Vsl�d� ����X{�])���y�$�k�#h��"�IaTy��	`��<��H���(V��7o�)��"�7�'��0�L���b��~�n)��$j�������_�����Mo?�i���U������v����������C~��(��w�6����j��*�O�o������Qk�@�)�z7;z6q�����)F]��*'��]{w^t�������L��]$@PT��_#�h�6����(���Ew�bk�6d�(������,��xaUd��E��Ht���PDg�0&k����|I����	���O�����)�����Y����d����yO��T���[>�m!q.}zj%oH@?%Y��OR ��S���':����4G��I� t��'q��nW��4D�?��#a�p}��h\[�P��K9��D�|6���H��]9���=���&/@`?>�Q^�r@�/�����}��1��+�}��Cmp�u������/����.+�=��';����M��a�������v*K���[�{1,�<G���K���f�5���b��)f �0��x��5�^�Zd���Y6m�
������&����"��W ��['0�)������p��w1�������G�����7�.�mw��'�w��w+�<���lE���9���:��z9O����<����}R��&�"�}��#�d��p�����w�{^�0��0{�r��[��� ��C*��D���A^o���Bu��]��6����W4����!r������-����l�\��{�fd����%I%��kT�_���=q	T#���=��%����
p��qc�3\O��N�W"�����s�h�OH������%���1��2�L��o��$��p�:��)J;��.�o�������es?��3�4r��6O��
N_�L�v��v@����`i�,��p�nS�~
'��F��M%a���n�vr1�3��R�����-��*��*�$�/=�Q"-a��NQ}���{%Lf�f�R;
%�a�@�T�b���Y�&��!|S�D��Ry�x���x� �{��������D�� ����y���%����k�8h�E���O����wR0������I4t��h��i�N"�v��p����>���3�K��	��z��J�;�����9�"*g�P2���nB|��S=A��'��p�a�Dy1��Q���]h�<��di?����_T�F���55Za���v��,u�������N��f�EF��=Q6�|q�i��Rc�1�Z�1>o����F�����V`��������s�S@b
0DX^�69L �! r���7Y
��f�$�a'!	���@��E���l3#$�n�l������2Q�
�%��X�Z9�M����������;@�R�'�����l�a�K��B���8$��R%�$-d��#��H�J��T!�����~��h�����G�F2���@R �Q�v���� Jr�������Ht��-�[z��a���H�(�=��x�L��g�t����Q����/�p�6�0.���b�}�De��
�0T�e��,����3(�Q�#V!�.�,n-�����).���%B#�T��:���q�L@3���*�L2�)
�.A�n�Nr��X~S�`�������\�n{�`�Nq	���������,���\S$C��M�
H�H&�����Y,Z�����/�}�)�/��O�H�J���9�,.�c}n���~�9|��b�D�	G�M�.��=l�4����SO�	�J<�e[�6&�
Q��)B��e7(����	=;E-�`��W��� ����'mq���b81��)�����S|B�L�XeEr�ij!�0�hH��`L1	�D�;9�����G�!@=,�B�"5C�K0�O����XT�v����Yh4C���~��3A��[?i�=m<D��$���PeaG��� ���p���db[��MeM2����'����u(�d~�91���.�Zj�����%���n������m[iu�tw�|��u���z��s�%qR�9�O��a�;+��<����5�+�IyJ�m�m(	^=G�nC-�S���,�J���C&|-1��"z��N�$n�x����/AR3�!t�Au���������N.���':h�w���M,��|�������������m3�O�!(o�����3=�&4���H�'k��P�Q��TaL1�ED8��(�	����N��9���)qw���3�W�X�M�B�EJ�@nvb�d �j�������H��o�|rd�gx���%���Q/���$SGL�����F��N�
�z7�4��4GI��|�qP�=�mp�c'UD�,CM�cw,�j�A�"v�m�v>!�9� ,z�Eg��"���!�\M1(m"7�i���C�|�/��&�@�����I!Vzjsv_C���&F�p�>�)���-��O�*}/�QX$��y����vf�@`k'��������k���;�R{m�EOU5%�N�glQX�����:����}U�:��hz��3)y���������N2����i����xw5��.a�ns5��(��2fSg���5�K��AxGM�����b:�H��,��2Rb�������4b&Uq�����u�2�D���K��T@D��eJ����3A��)�
4�m�v���}k��>�$Y�}�6B`��\��JN��Z/����D�������`�t���a,�
2�A�Zy�d�3��Tk/�7�g?fC
`��J��h$0�(�~��T����u^�� b*(l��V�<�"�J�\BQ_w��>2�&#6�i%f��T����81	|Y*1��G�.�l�I��D#`#Fm<}+�_��8p�D�9��8%��X�5���AB�vLW�����Z�%"+T�L��p�h	#��&����������$�����$-����$���?�7�`�J����(�YP���9]�%E`���P��C��������$���*��]�WF&+=�]�@�W��e� �clE&���(���g���sF������h���!� ^vJ��%�����#2�_��y'��]f.x��1��]�
d���Z�EEK��
�]��\M��?!�I|4��Un�c��p��;��n8�������ie�rc������Z�����A��/���K*��X8[L.(K]R�%����~�+�X���,\�(q�^b"(n-������(+����B��k�A��OTM�34��\����-�t�V��\���AP��|�6K�2b6��\9�+����Z�
���"��9!,n&�D����e�r�xN�
L���O�
�w���:�/�H����v��Lj�%(��6�$���o�E�i�+X��Y�	��9Iy�@����jTf�P��lG����W�sf��;�-`1A��nXF=���OFk/K��
��!��[!��d��'���[$��~\�R���m0D�Qr���`D��cX5"Av�����v������L6t�7&�vK�dj��c��4�'"�s�91mZ��h�f���� ����.�V�"�9%&N���pw������6��n=@
��
[�|��o��#�awy�K�$���`��0�r�J.c!O
{�l��`~$�����OH�m-?W%�J��oZ��Z�&W����-���K�<E���������nG�*2
?���{�4�K� �;1�������F��#������'��o���w�D��-D~%��&�*��$��m���~����:�^\EH���U����DF��|}�Dnd�>B�:MI��
�'/��~j
�`�8�	Uy*���(������^�'Y�����_�����}[�=������UG�F��!�.�:�I�����$}�GS���r:��N.#��L���U�����F�@|�W�y�n����[�"\0�}�j��@*��*�et�02[(����lx���c�};��ke�n���ft����?�{��?����������\GI�DM�{���r��{������b�FMg���;�7�)4B���� I{x�d�6.06��D��E���M�����hO�@z�%���0������\�yZM��c~�)�j�������k����2a�l��%UQ��mD�0����
�7�}�����w9L#�p��CoA��0g[�O
5Y���'�v�������=���g���_.J����`��k��>6�I�m��l�4N��}��G5{�o �[x��^0����m���E�|��p)����������B\��g�#���OY@BTm�����1����������j�3�F@e�fIFcQ>#x�}bv��{����N��#�Q��Q��#�- U�	7|��z^��)�h�����Oa�Z9�P�s��r��a�����g��w��@I��#����h�'��c�@-(1+�"��G��c� ���<"
*���e��������$
;��7��Y3�]�	'Yn�p������ �;�d��2��RK��%�F�b�Qw#R���78�_=�`#�#����G����B-���FpR����8U"�=n9��8�/�|�$�:��aNMG�h�	�paQt��ND��"n�h	'�H�v�'@(�5Ob�c��hk���}�h��m�67&��GF��3��x;�j��n;��W��R��c�?�����Vq58��N��#j���D�z,�����}��y����=b�p�&hG4=�H������$$�	�w�%���+aT�*I�������[ t-7u�pv$�����Z��]��*��Z�;�#����>��F�`�X��n����$�>�GL�	���*�	�r��m9�q�F��g~;��E
��t]�`#Q���S�3H�P�'��3j���P���)@0��8�^��8��V���f�	t���n���V&�s�����J`3/�q���W4$���F���J�x��a
VI� ��@�/Hm"@���%�$�4B���>
�]i��B���8&cw���<�i�h�%2���f	���,��^]�?�6x��dH�"�Kn0&������,�OhZ|D����$F�X�����1K�}�J4o�`���a����#.���'fGg�)�������)!Z��ei��
c�����hd��j"X��6Z�"	h��j���)A2��k�����V���������>��V��I�����0,+�Jv�����B��T;�o^U�C�#h���|m�������9��AH|7n��D{D	O���ItvG��J���<V�����3�E���?c�7F�?�:�~=}���q�3�~0��~��>�p��Z�����m)d1Wa��"����s�w���:�pJH����3pI�vWM����s@5�y9����S
�|���������'�L��mR������1u�JmV��hA�����3�vz��o1y2Fs) a?c�"M'mI1W{����:s��`��\Gf*:��uW��v������;P<*<&o���`~�hz��0|����V%k�����z��
����6�Q����~F+<S��c��
M�����t%�o���o�E��%S�d�������e'�?�1������9��W��}����u��f���s�\GTSP��B�m����d�+x�Ug�,sF%"�1�j�|��j�Ak�d`�F�4�0 �?W�V�3I\�+����\D����b���>��Z@7�wX.�:�?f��h�o]�`��u��f�/����*o���\E�����k�x�;��FOA�������K�A���Bq��OC�#�3V������3�t��c���K�{�� �u���^7A$�N�����P���������U�,��xED��G�F�\��dc����:��[�� S�4Q4&&�2Bte����j�����p�b�C~���`;E��~{-0�\�H���Qv.���X�����'�fK����FeU�Z�:lIG"�/��++��P|�q��i,,�uv�Gt}nL4���E%���s���&#�-gG��Q�6�g�O\.�K��!E�'�t����+8~'�������0����R����JT�=*9��p(�������4sg��$$�������S�����.���'���
����.����t�I�������!���N��r�����f(��Q��I���v�N��
X����'���%�_��(p}��n#���7���??r8Z�O��O&3�pyzm��X2Y�{�=D�$6���'�7�~����yj~B�u��6�M3:��`5�d�����8k���~���iA���=Ch`fX����[��l��I��;F��������I}���SXdI�I�pq�B�g�����;A������w)9Y��q+�&zr�,����r����&������-u>p+����
$lp�-9a1T�	#V��F�����
L�(���R�
L����+V��w����4E�E������� �<����/R������}s�^�V��Z0����X�QE��R��w���T��8�'O�������Q�t��T��[1&�^k1���d��Lxf^��t~�A��*�^l��Gw�7Bfn
���8����{x���g��t�qRi'(V}�g�G[�H
TX�N�������hESA�������)�%��V,IB+�+W�D`�I.�MT���d�'@X1u�2���+O�o�]e����N&E�-��,�3w3�#�a��QI�a+�%0y�=^�I`�Ny����DuGq2�A�V5���?�\�;e���&bqo�H�
���(�*���E��
���P6����wDl�aS7j-d��������e��&���=�{��,6���Xy���.�E�%����y�������������<m6���mv�G�eL�~�(8���.���nX�����VQ����#�aH��L1
o��������C�f�����)��������#E�kD��@������`��ke����N82�*���O����cr*i�ne�=Kv:��#���Nh�Df�q�9�"�V8-�p��]�I�3z�nx�9�ek�	.�E �M��x��� ����������-�C���c'$�P��d��,
H6Xfh%���I?�H�v�c�n��kY�;Z�.1���d�]�!b�`O�q���g��u����A�D+�
V4����D�XD�Q�J�l;�@6� ���tw$��k���p$Z?lL,*l�rTlS���U��]� Z�I�(V���}}�����L':;U[!�S"xs�y9��Po�u|����}���	")��s��*��V�	Zd\���T���k��So%_^u0������"Q�N�����e�V:�U�@����% [-��%�C��8Ffh2�n���+�0AD�[hw=��G%�kU��_z4E~1	N.POk�r�*�`\��bq��>.Q��+��B~5�zLnE��Zh�VP�{]��	������)
�.��:q��!�|G��b	�f��������G�Z8���� ��_���������4E�]u�1aI}X[��#C��<i�%�7�v�f%��nU$I�86�����S���a����"z��/mT�	 ������Q(�;�gj�� }hB�U�	�T�����,�{�`����U�~2Q�!7�E��h#���'�F,	�y\�-++�_~/�����P�%`g������,3Z��-��P����d?�M����59x�����d��������g��
^Y�N������RHE����M[�
	`P�
*A�2O�*�
)z�b��k�V�yL(�Y*�g)A(�{y��X��)��D"���>������D�s�%�O���c�����-l��������7*"I���D�H�Y�@*����~�j6X	Ui����(���Ff�:��l$�ZF��
���2���)U��	R]�1Bx��p�'�dbg�z�pb?��n&("�	!��&�>�d�H�/�
I�)�����),���8)��:8�/���&�k�>8��F!?{q	��J�H	��U��z,R�JS�0����5q�}/�D��Np�Q���0�U<��L�8��X�,��5�1�:�7*�.:>�W)�U�b����u�6M~����>y���-'�:Ui��C#�V����'����P���d����g1�RDB�[a,�$���%tj����������5�#������c+�>1�4s
��_<�������?IW�L�mh"���l"g�Wk"�2���#k��nvS�Bo�<��OZc���I���ZO��&�jpr���#����\kna�5��j�}��b=/�@��t�Z����[aV���3��_[J��-��i	�ERU�b�ot�:���{�!IOk�[�~�z�����1H.#<$9�4�',����b��6�
	F�X�W
��2:,�j��$��U� De�%�L�[�_ m�~�)�{J��2�
��o��;k`Wx�i� � 
�M����T�J�y� ��4o�!d*��d�LJ���{D���&�����t��[����9�s��Hm_(�$�Q�����K���~L	�EeF�>���u��l8A��;�M4�{�#2��3.���@�mB��nN��	p)Y	��DMp~���Ii���iP[�-Tz�=4��w����6�	�"���9otb�� "����Z�UK�m�8Dr��g����E��������T�1Ek������z[�I�{	����*!�������\"v���qn�}�T!I4gk�'fB�a����V�J��x�'����6�d�q�C����>G$�i�����V�egNq<���l�T�X|�z���DJ��5��~3~��'��>�!Y�l����S4)�-��_+\����d�
��!�L$$?��4%qF���~�T���L[w,�{�@�#��9��~Mt|�;�.Ot��P�
�� y��v�n��3��/�H��'o�=:�>=���}tWe[��nOH0�����!m���kOx�p�:MW��&���)��S��ir�6c�~��G[��?���/�Eu4}D�$&�6D�H�K�������H
�R3�;=;"����ts|�XFP
�:��&I��)0����l�z�+��4������_��l���/�}�1I�]k�";�&Va(=���M"�[s�s����i�};n�������4����_�EI5�O�[�'`\��Z$�w������X��D��k���
�U��v�$Zw;�-�[���8�0�n����,���aL�<�eXr��"";�^��������������;-�c��C������Bt��x�W����B2B���eX��9�#-i����%���M\ES�Z2�9�c|�
,����Q!Y����*B��;�9�X{u�r��ww#���}KR�wg.���x�-��>�������Q�j?�W[�����1��>=�S��z����O�n��K����v�7���yE�Y�e[:���#O$�^����,��'XM�?V��+��$���f���f�H������P�����]�=��z/?�rb�L����]�S<�2��1sI$]��6BA�$P�T.\�zI&A��s2DR�9q�~�����,��-���dW��pt�E_��|���h�J$�]h�R�<:�dp����](N�b�?����:"2Vb�������%��'���t�_�A���4��]X~���!�9I��Q%UP�����(`��K�H��%i���9�
v��A�3�o�������I6��R[�O��7����/��Tn}���|!$
�K��op��>��	`�m@�?3���������LN�,����l~��.�� ���|��	���[6����	]��������/��'�[�Z������q��,�XHH��#`�(��������=6j7���C���2�82p���N"Lk�)f~Sn'�l��}��*;�����cF0B��G.����$
���@�����$S	nw��H���?�~�� O���`����"�Z�sjI�\�_�V�t2����Q�@�9�7�d�����N���P�=�����JaIH�[�b|����GV���p��m��%�e<6�)��iLY���|�UO�'���%��H���{���:�I$�,�KK��1b�*��9a:������7��A��������Sf4��JK|���8'V����m�K"��[�vZ"�Z�D�k�MJ��.G���b����r��|���J�N/���J3�F�0~zd���vj	>���)0:s��v����F�e)���q_��wI� �!�_t18
D�O�I��C�?������6g4�����q��ae��lC����$��T�?��ee%�t.(����T�k�/`���:���2w��_M^���u1a�GXT
]%���z4#��g�q��B�`t��5��|'�h�7�IqA9��n?~��FU���W�D�G��i]������&{��Nh�4�{�.�0�KT�c�@�.bU�c�6��ilY��<��1m|�C�M���s�d�O��d`5.���f�q�����`~��F��a"2���h���3�q��<��XD9KV����C�<nd�1���n
�Lr���p����EOP��>�?�&��'��w2���Z�M8�$�����s,�%d�������������QN����g�?�+��F��D����2�����V�K���T�{���
H��I "����
:�&�C������	
>D�U9[1hH��gh�=��?���]^a�v�#1����r�������F��m/���;Y�]�����#��!
� Z
Z!�o=R�.hId�`y8��!Z�C�Ht�G/V�@���6`�}g���s����DS�B ��WA��[��8��aa�S�*v{U�08#����4�dyP>5�
 'k��u|��9���M��f��y�'��t�1�0n�j��&�Y����2�?�M����GD�4W����Cs���i������O&Z��}�dPy7�@o!yLN�4PA��8�m�Ih�N��)��:8�O�
�{���k@!��c�!#f��-�r��Hn���*��l��wI��)�����i���L�����Sg$��,_�p�����}R�������2�\�Fv!��t�&G����9�Y�����&;����	����D�7�k@)�<r'"7Q�w�s�Y��\�9��AZMp�)fa�2b��O���1|n�|����E�4��g�C���oA6���yHr�t;D�j&����6/b�">�&�S	�x��#������a�T$�l�G�-�����m�� >a���FK�v�Y�D�Zk�M�!$^@��eml���I��H���>���x:^9�LN'"��%�O��^kt>�w�,�"&(����ypO�Q�c�!L��qyF;�
2VX�����)W�
��x� D��)vB�8bL��M���
��-/��yh���`.b;Q�L�0��@0����y.g��Vfx�&X�5��.f:29SJst���0������Q�����a�Ay�������_���)&�[M����	�;��B��'1���'���!wtr���=���~�=q���g�c�-��������}~�K�LC���#d<	�>�m���u�
��*���,K1��$_�N('F��3�A���G?^�t��-P}|��v��!y��j ��������l�$DG"q�=�b'�X\����\�)��r%��S�tz�I�q��%a�A���@���\2%����)@4H^�d�l�M��ck�Lw9�&�{�8
"V��/ht������5�I��<�^C���V�)�"�L1���x ��R�����LI��X:L�����U^PYI��<��������Z=�[�z����;�BmK�D�aGq0.Q�gM�6(�KL�?�[��zwhK4���g�?]�,�6'�5�W������[W(�Z")|�
f�?�����	,�DM���@��	v��;���,V�� 1���q`�����9h��!�������u�JL."�RrbZb8�g�M����%���b[b �9���Ye��xt��+qm]�ObI�}�^����P5!���X�l�{1Gd��dq]�0���Lz3��`�l@��d��G�7���\�%���D��Z�n������&�&���z�6�'$r�]�O��g�b/1����D6��*�k��I�8���l9� ��X����8���]�
*����� ����2]�s������e)$K�Y�D��tk0�Bt�5 ����s��K.!P�}M��.p9�����������nD-����pg&�"�@Q,�p���LBqA6G7��e���1���'�����h6��,E�
X�q���,�2B��M�Fs�O���H;��t��/A
BrA��Y�2x(�"�!q���/*�!q&(�.�q�����]�D�������<Io��$���21	��
k�l�\@U_��/Q
�0f�0M��i����y�D�.�
�����W�}��$�����N�MS�,f��G��h��}�Z��^x�]������[���G���/��IDu�v�.�	�5E~��
��8��jD��\8����M'�������+3�Zt��ain���F��NFOZ�����"�G���S�'��p���{6>��� a���f��^nyZ�<7:0Y�����uK����:�\��T��U"H���9G(�-�D�[�A��8"��^"2�k�	,���
h�J�Q,��PQ9{��(�����
P�$��;��a�K�h��,����?��	�_d�����P�����%��,
�F��13������*�x������)r#ZnnPd����3��u���a�L��)��!q�nE��-9��i�@P�[�joS����f�:��"�(�b����X�-�@�������w�_��'�Fz�������RrN�v@"'A�T�~���!��#J�>,��+�]*<|���GP�t�E�B��J����C����G8���{��O��1%��]�G�`GX���h*�@?����*l1,�E��S� G�{+���:��F�W��(!��E>`�������m�!i@��I&�17�B�:��$��������"#J"h�����	y���S<���F���=?����'8�������2�C{r���]�w��.'8�����o]�<:v��2�>�|0�M�iBE�}�%/Nm�1�%�2m�
�M���]��}���6��5)����Gr���
��O |����8�X
�paO��m$�d�X�u�_�=j�LF{%��(lH��y����"N�~A���9����K�&�w��>�����q0K���b`a�	����7q�wkO;������'����k���?;#*N����-���p}v�c��e���&���~�YvL!��0��D_�P}Z>Q=F���}9?c��+c��n����}OH�=�'������Mh/�dd�T����c�C�@���x�`�{�-U������B�if���8���}��c���
UQ��v�������6NQ�-8�|�����*���e����w��6�����~Jn|�m>���}���1����m;���������,��oc�?�@ cE��@\K��=v3�.��P�r�g(6������������v��o�z*g��
�E�?��(7>�b�
P��(&�j��|vG��Wv�0v��P���
�o����ft���I,���N(��nX��*2�����(������I���u$c$S+?kc@���:nh�>s�T�}�P���$Y�������
Hp�#���5������<F�7��^��	z�z� a�T���I�����zcN'�#:�����U�\yJ�!��cKL/�}��1+bv'�Z�"D����%;�q�1���Ej������l���p�.Ex^� �2?v0�?��MF�c�he�f8�1�^�*�K�{t�<NC�����X���'a��Z�v��������V��R4��?�oTA�����P,��5�B��4��� "����h��O��������������'��q���q�����XIc��b����l�h�R/��|���A����*��.�����d��	�>�{IIx�c* Z�Et�D.��+HR��nF�b��s����-n#�*��������J�j:�����C�>J�D���J7<��uW�N�8�O`�q?�[����(���?��\n��=y�%��:_&���\��/��l��d�� ���JBO�X�y���^#z����q�1v��NL�jB'&����
M��;F��g���%��<�m*��yKU�h�"�LWmw}Ol���2S���v�"�h/s@�'a%3���2�P��,��������/�4,�]F��������c.���r��lV��{,�$�3W�29����W|;�4�L��hxZ��U�=�$%����������N�n�#r���x����E������I?tx�7����V�7���J��#vAl^0��D���!���s�@"Gat��l.`v�L5��~Mnq������)���L|B�� ����Y��C?�>qg��:�(�Y���D2rD.D�Q�LB4QO�[w�� �?�������/K9�����������@�E�W,�c�#��;N�+(���j�L��1�n�#Mwvo.���������
���j����&M1w�`*d�I�����YQ�`�i���]����w�(aX�	[������{(���1�Q8�L��%��7��(���T����������4�aO�T���1��FT����tr	Yw��w�6Ar +���_�����Z���A�n�H���.���%���$��L���}����4�����	�>�wJ����e������/�����Z�Ul�]p�����_����a�.�1�"�?�iW.?+�$��������8�<��$��u����%g����
��+@S��l���K�.���%�<~�6]�m�	�%��4�	�%���������d�1��,�TM�"���qE0���8��Cn���g�hc'b����:��E�@���s���T�Y$�$���������2�v�1�����l&���h��w�k����#�:��"=I�@}��{������a�P�lq���e��h�N����H?��7@%���M��B��d�|md�L����'�B
�
�h+1�}��5�u4���q�I�KS{e\�@�t����X�����?@���&�,\�W���}��{
�����i� ��(�Y'�{�?o!|X�%��{������VN��A��{�?���/H�U�X�mv
��k}�nJ���M%:�C �*uFg���8E���h+����B��6�0���{�j�q�;��M�"�O�m��e��p��|�X
�hG_^�R�*XF'��u$G�?�%���L��vy��X�J�����4�����8�,11}�S-�-��q���N�w�@;����]���a���QZ<C	���1Z�����DQ�-J
5*A���s�r�LU�aw}��nY�F���M@��Q�T|]Z��L����������:~	+���8��Q�A/%-��d��h�Q�zR*;}���:q�G���%�Z�P��%��}k�S�l��x	�"�^&9P��d�-����a���
)�p�x�������U��<���&p�����.���>�n��j�<H!�l���>d=�L17Ag�Fq����~�X
�
D������^~�FY��;Pf2d���nE�MM�c��d&�C��#4$i�]��=-A_b/���zS����~m�TE$�=��I1?��8	gT�J�S
��w�������� jnQ�B����U+�`����hm_�t��br��H`v�T����J�	���
�r�DD�Af/L��(���+[�rBB����q��M��b�!�����("'��vv�����������XsQ'����*D��K�uL{�����l���IV},������9S}B��6�@p��`�"���;�T�3�^D8��D���0	`UD=,+�\"�������9nr��A�|�D��G{B	��\#!u����G�#�������1�.����E������>�`�b��{,�@�[��������W��������"�3\Z�F�O��m��U�P��;J������S<
@�Q���^��yeC����c��(����| �sM.���O�|rB��J��w�s����4!��.Vmt	Z_D_��8hx�E�_2d�u���|�O�'W���p�+H|o�'X�>��4�)cq:�C�Uq��8��E�P������%
�����w�W�J�w�O�ya>��o��`9[�I�'$n1qQ�I�"/����T��_�-����KI���u4�����C'��fK�����������M�MV�/����i��GZh�u��N��&�0&��"�vK�����ql���_sD�3������&�b�~V�H�X)��1�,{�d����������w���I��"^�B~�4���<������$���<����Mn�v+s�F����s����������*2��@�}��H#��$/p�	���^�M����,�����E]�����4��?�sT�-�Dt�O��%L&�Chg�*�Kn�Yr��6�E/4=7�w�Q�`u��5����H�Cz��Yn���]��p����Wqx�aL�����WL�T����;F�c���'���f�����DQ�]��t�rXD��-a4��'h��AM6}EL��T�+��?w�$��(S���q$��Z�����w��U�E�Z4E�&���/��|�d�
.{�GQ�&�z�U,N$7Lt{RM��JE��*&�^MJ�*:�E������S�*�� �D\Z�!ot�|�;�rz����.v�uY==l���"��8�+����!��A!�M	�����^�����6�5�W`-��[%���\43`�����Z�/UQD&%�)�@+������*F��=�?���!�q�jG���%9�T���6�?�.���f��^EB@�dP`�]3��H��3Ou�2��wSNH���,�P^M5$��*Za�O�*�&������&=���p'4���*l����&["���x���i���@�2�����<���:^���wL�$������`2W���Y�It��i�[�M�
��K�:h!*��}��O���'����V�����W��lW���nq�03��vP��?��Ye[-,k�d�L���!B���
���2���`~�v��<��lyn%��	�	T�%�WJ�x�l�E�+��^,!l���A4[���?��4�|��+��������(::�'l$�Lu�=�.6������5$/�G���g��2�d�^
����MJ�A���+#�n�Y���?�y��#�d�l���VC����{V�������T�P�GZ�����4���(���z�N&�Np��c$�*���	�	�]�s��#����s���M=����!B8���#�})!��i���
���{L��v
��zL��-�9����A
3�������09�4wLz��M�9��2�9*�L>�����\��5�XW �d��	:������%#Tw��;n�!�����cyN��C<�	��2�%;H�e��V!�DI@C&���}�}�������x��tf���'Q���������o�����"�9��Z���������� ���`)�>��no����8��h�Gf���#��Z����d��0�q�����O�j����v�	��~�s}�;�w�UK�<nMH�^5��p�|�gm��De���|B]|��n���#w��Da�������>��dk�2Mo*>�	H��||�4��d&�`-�a�B��F��[���&���8�mu�E��*���?�pd
]9g�g ��@����u8�a��1z��&�4�%����z��#���&��&x�%��e��^e�~�����P�&�4V��]<&����V�|�F�����[�)N�p����5�bo����A	T�3�[k"���kY�5[m��%iGo��W�47	���f��4|���Y����L��V,�@Ul��&_�`#���}	���OH��
0#���(:�~`?+�
��t�I
%��k `���H����ZG����.�����N�G���q��c)���������h%�?`QTr�6)��n�IFXoV�/����I��`m�*0y����3Q������v�[�&��Z�������+3	���$�����ih���z�p�$Pb�?�w�]�C����g�d���8�=����7;�Ek���m������g�*K���3����	��$���w�����G�5{����o�@a���+�G�������f9~T*7��R1�l6�&�1�x�6��[���.3�&���^�� �w���f~�	��G����_D�������Z�"|�v�
��D����#��wJfWw�q���k,�W�����+�8x[]�>�z�?P�I���GLe�b��1�������S�S�v�i�I�]�MX��9Ao���;g���.���;�Q�D�-Zi�S5h��Q����Gb�n� 6�����Q|������@w��Q�Z/?�o y����"��{�S��,�h=��w��;�{����/�t'+�p|��	{���w�-h��z����T�a����`������	�Q�+�^����[��3�J�%`}�`N�h�}��?����,�wa��������.	���+�
�w�9y������ �r��;&3Zd�t@FJ���k=|��M���+tL��i��6�&���D��E��7�y���������4N�$5p=@{������2T��\�@GaB�BQC^w@riF�y*-e�{�')�]�%�T���'���dg/����>J�[9�E�O������Yhv&�d����,�@����]���&3�/9y$^�O�����
{�YF$�������|'�B2p�q��I|��0��]�]Q�?u���(��:��@t���.:���P�������Xt�.�7���$���5r�Q�Fv�aTB-�q��"k��3��\�}���^�hU���{� �n2�xT���Cp���]L��w�@���W�}#[�p�t8�����o9j�_(A�C������h������2��.f`���9�YL��.��(HR�G�?v����������H�tF~��ktG�%r��t:Ud�,#"�K9���-,������?���]��$��g��[m��;6Y���v�����t�
#;���7zB��n����8v�������������������%�����o�i���sa9��`}N4"�@���r�=cy|�t0���!�i�IF:�U�Y2Z���\�2��"�!6�a$)q�Nv�a?��E��=�+�H�����
���Dw��q�n������"�.)��g���B:���O�@:'�<�n��.��qk��Vfh�����=������F�����"�����BH�Cl;������D0�_
�Y1'�N��(���b�*7UI������DF1�"J#�$?�����`������`eE������5�D�>�E4�bvS����m�C?c���#�t�9���=l������9������*�i�~�&7��	�v	�<��pWFd��@���
CdFM�����h5i6TJ��5*�]��Y���
1�
�wIS���������F4ZL����@Q&SB��;�TWY=4�)��q��-�&(����$��CTEI�%����`�Yj���	d8DA�(��0������<ZC�N���;zdO�L�����>{1�B����[���p��=m��$��vN���+vARcJ/�J���1,�Eb0h9
�lc|����k����Y�������{r��:���C���+������>�t�g*���_RT��s(������������
�f�M�F���;�q++�D�{�Hf�����0�<��6�&G�8~,p�;0�<�;y�H�����_�4����)%c��Q���)���qB8'$�Jc�:��bD?Q�nU�n�Mdc�`4"�[�f,W��JH��$#����*:Q�-I��������\�A�vY��6��D��;
B��J��hJ��k���~�����,���=N`�!��)��d�0�D���lW�r��h�	���;Z����Av�r[�>+���	v�����G���	];�q�����������G�>����?Vj3~���/F��f":t:�x�0g
�Wo,2��{��	z@��sQ�|lElS��L�������m>��:�h�@���$(�X��~$X��=��UO��YN���C@������p(�4$yt��f��v���$�H���<�����,�S�|I�����5F����@�,�������4��~�u����$��8Z���%��z�a��K���5`�28{ex�t.�&���`��B���"~��q$a^�zo�CL�8�;����	 �/%K���$�u
f�
K�HQ��Yk����0�D��x�f��]r����v��j����d�1�}4���pyj8|5�9IK�ln�� &���pF���8�=�,���X=�j������$�Xa��>�	|g��L7�YN�H�G��zOa�I��fF��qXl���u�?q����jH>+���,������'�S��	XX%*�1���S�~�(L���nMJH�L�'�~�����49S@?����4Q|��y���w�vCH�g3a��������;*d�*���U����g����`xS�I�P�M����EE���s����#���9�������KDh��r�OSSf*j���?��C����B�19x�K���h�����iF�t$����-[�����G�)"�����`"�^���Gf2�?_4��l.�>���H��
�e���Y1�!,�:����7�Pts�w��rnU@���4�$O�T'|d���Y��)�Lp&���)�	'��$�W��nO��S��Hx�i����sOo���DL?mKD"5����G�a�9�f��(���3���_�������vh�2Z�u�g��b� $�g/=�������hi�L(Z�E#�k�$�����V�rUb�����.B������2� �$�7g;����JDW*&u�q%�,�D��LWq�98������!�
C� 6��""@	�-&�~���6�IKp����	P��p6�Gw�Y��IY��o�0K��-�1EVc���g&���o�g����������O,���0��$(�Sq�]�	��TD)YK$��}�3��W��DT�]���CI��4�t��V�l��`�]b,���wE)�K��g~�C��O�d,Q�w��%3�M�=�q��&��*n�������*�U�����o�5��&�D*�L[���}K��#�@�anG��m��h��Pw"�^�I���Nv�n�,�
��
�g(m0ycb0�W�\�"�i�/�8y�v?bw%��Yf�K��������b�Sk�%&&��_n"���5t{X�-�:�CO$!���j��A��h�����n�<���j���K
�bK����c9Vg{���!�2��k#"{�	{y�~N�k��fK��gM�KdoB2�nL�N�J!0C#��D�������50v��7�r��o��2)-��4��T�R�B��U�k�v�/�B�O��l�[rY>��~Dd�D��?P��Y�,w$(����1��,s�]�X�@�G����G-���6N�/�%-{^����Q�����V��� ���.��-!��-��v�Sq|�Q>xbE�Fb
p�Kn�s<��gGQ�s����W8	�rB�����L8z�b�z��=t�������M��X���EagK,C�[�i�m3�h��@6�����OB�.st�\����}F[��w�N��{��a}�\��;�[��#��D/�{�4��v�/�&$Yk�4�K~���K��������m��,�i9{�������`-QDe��\�"�w�R�D5t9���CcmK���"F���/~�--��f�d��b(���9Q���6m�@u����n�!���r2���\�3kOZ"d"��b�(I�3�^$B���D"Y,Ck':�������Q��
Q���6���u��KJ�;i(�� ��:h�j��o734$c<<��M����`��>���tR�o#�������a������q�Xw�zMF���n[�4��e)�����q0F��I �]l�Ac�}���,��������S[,��X�0F��.��(�ut�4�#�.n��P�����3��"��������F.�����\�'��\#��A�,�Bw)s����[�-��dUQ�NDS�������H��0;����6DL�k�y����K<p�E!�%���SXo����n���>����mz�F��	o���r���n��o ��@M# E��d�Z'>����[�>*�#��d�O��J�`[?"���B�Y������/��������^��c��/����G�>�}����(��>:P�U,����\��	r��(��-Z*m&=�/�*#����C�;uG��	����w$����d��g%�#�����2��ANB���m���9UN!�@{9F��=|�.M�{���!,��P1����j��|v�W	����E]B�@3��2f/�j�,����kt�n���vX1�~�N�/��|�}R��/(E-�|.lvY%d������J ���A�s�3@��Y_!7���#�G��.[�h-�����O��tL0�����%SP=�3���'�
x�d��F������n��zr����|N���l�(������8�F��c��j`��$z'*��v6[��G������p�$������'������},�w��Q~���d��G(���e�*�����|x�}�#�����a����51�����r��d�ZG��c!�N���}jH����>O��@�w�����q@�(|����V�������,��k��G�L�������Jer	{��22	8F���<�t��h��x��������=Il9��o<��7#��c�!�Nj�S�OJ���)i��?a~�)��[�$�g������	����4
���C��
�������<;�b8��9F^�x�K��`�
+�.G8|��s��ka�o�'`��@�����������F��G@|I��c����H��#H��~��@�"����{����" �tP�h��6��=�|�q������u���������N���������Y��qq�(����t�D���y��hi��P6a���9w��>>�;�f/����n�D��.�A4XtD�]�yH��=�4�����O��2v��=kjrZ=N#���`��$���������*��.��6�-���M>������$�Y<�$)Io�LG`>���e�����-��a}N2/>��Dp��_���������FY��������vg��Z���$ ��8�EP�ZB�����fA�����&�XM���u���z�SC0^ V�������@� �-t���q$������w/H>��	^x,�'~���_z��9�#����P=~���"�
��1B��H:�Gt,��{��>�D��GT%Y�_�G;��BBn��
���D�w,�hA�l���V�~��!<��1�L������G��[&��D�t�<Y���s������2��# �nE�i0%L��5��q%(�A��4`�z��(S�X��2�@�G������3����U=b>�kv�U^N���F�^sg{��,����[��@�����$���Eh�0V���'6"�����0��?�9
f�g"��=y��-q��Z����q�R�"g�� �;"$���+Q��"i����[����A������������<�v�a�A��PGI.c��d�W�@'�e#�t��������[�@c|�����8����q����,�����w���`ax�������w��[Oy~_�H	<��.�6�Q����.:�B	Q�{	Yi�!��� ������
�d��n-_�FE�)WF�^G�����(�:�������|����9&y�#�{��2�+�2���x��w��P@&oR��5������>���@�cE�;�$���S`�}w��Y��Tgqeg3O��:6�Ei�m1�Kg@K�����k����;��N�%v/=�/�
����E���
��j��$�����!�S]�`��;Z����!��$�����Y�k��y�g��)�O�?\���h�]R�F�����5�,#��0�b't<�����\����w�V���\�c��o��H9Gh-M�3������)���o)-�dAy������O�m%�PE@e�C��+���@w�����D��������#at�:�"�������~�X0�)!��|��n'�@Y���"|�Z����m����{=8��
�T�yQ���py/��������"�=Q����t�V�����x����Nnn�P�V@���`�CS{2������������8&,g-4yk'����
t�O/yZ�1�
	�dY��T�U7,�
	�\�
��]�����U.s���p�@����?8�$��=1�����d2Z=�����ChO6K���s,��b/Z�hr��Y���O� �	����f��vE[�3�u����V�W/%D��W�q�^�T�J���?��Y�_�KF�)@B�F'/��;H�|��q�1�m�-����hC�� �I�L������;��Y��O�V���������U����Wa����2~��/�������&�bI��<��o�8���5(�2���������)����_���rb���n�j�D������)<
���}F�}�G���d����8��f���8�����d�.���"#<��������5�8"Yv_�wW>z��6���4��hr�yy���EMP���c0��;���(H��ELi5��H6`�Qj&���%� ����dB�b�/��Dt*��O�I#:M�VB�|��A��I\����Z��w��g`-�!��4��o-��;�)����D'�R���4to"��E$Co�6S sIv�{��;�� ,����������u���C7GO��"��(�2���4(�����{�%�I��(v�e$������5�A*��X��_VS���S�
&C�uC��h)lMY#����D����o��
?q4}G�{/�\���n����
tk	�\��\��5�����HzG�v[��2&�����E����?�HY�"�E�����!g�d��d|��$�D�P�u*C|tr�?/���4R.@��&��2n;}�s��;�,�������h]��� 9	�3��c��ViQ]��G���=9$?xx�����Z���M�2#�����F	��s��E���"	8r<Y>�(��QG[�|�Ftt�%��d�s�h�@@k�a���)�Z���g�����+��V�(nX�]�~c}TV3�����VM��6��.���7p~��\+��9�r0x����$'��[sa����]��}r�p�Z ��~<����G��Y;��]f����:��Ek�T)J�>����H��@���j���o���A�u����v`�7� ~y�G�{�E��NUI����d�K�a��
������@���/���t����[@�F��+�.���������f������)r�IG��js���������|�b</����82�efB��2*� :��W����xu+�i>['�j���D��;�(���%j�b�+�'ob��}�������o�.�&<u��	S��X�*���v8W��n0�~'��*��8&�;���n��%�v5
�d�+
�Q[0���C�d������7i��>=��5��d���C8Xlq�KKv;h\,��xc�K���hr�
��*rP-Z��	dP�=�\���= \�Z>�n�
RS�����	3�QE`�;+�����j�*6��9l�))�������:�i�s��8�'�z��S���s�"�b��W�����f�Q�`p���?��4\kuBJ��j������i'�����Wr����u�)����P���g~F����w�pR�TS����M����V2�
\LzG��������I:�������@ax8���D`�lawQ��V�a�l�����L��S�`���|" �N�U;�<�]�
p��v�gL+�;z��C�9
�7#ZT�p����9���1����BQ��p-U��}!q������A*�%)
DD�D!�j8a���F���	pE}HQ5_o@�g��d��}5$g7	7�,�������J�O@�����N���\0*�c�I�.=�(U\����-A������M��4��	(3�w������p�����yB�PNN��>��	1_�q3jI�G�>Yh4Z�_E���U�M�]���������aS[�}��mR"���QM
�>��P)���������($Fo��?u���k�� ��
������~��r]��x�)��O�x~�:X?�"�����'����I[iT���(@|K�����w�S���a��D�Wk��3y�R��~��Dm���bJB
U[%��j{!f<8����Y"��Q����
�8��[���1%st~5�O&Q������%h6����$Y�j��Jx+���$��|aL��$H�+�i)����G�!(z��3f���S��M�"FsO�l7������C��������&�Us�@�A���vP6)F���K� &�.���g������$��&�`%"���a����1��E��H��MD�I0�&�?��K�}�td|��O�F�r�4����W�����~���s��E}>��C�����&��	�����iO��V\��M�����n4q�}�Q���:!���,����@�D�J��V�o�I��|�
C�'�k��P�1��vh��*5#�r�����)�Z�?��4�*������ "qZ��8Z4P�����D`@���SHf�gm*t�\d��D
����{4
�����\�w����� �6�_m����5��i"
;;�w�F�^��!�_{Y4X�'�g��O�W���<8��1�vGpK����|ku�SC$?F,����^���I�J=�H����dM��o�n�j�j��(�
[@m�h����|�/�����p��O�A���G-P��T"Ans��4>����_a� zgv�>LQ�&���J����9>������(�[�N�)�	��0\M$�h�1���s��?�$��dbB�O\R� �����49@ 5�D�}����u>1��Q�/�_g��o�}(��
Y1������D"���������J�|�������\���jHQ���k$8����_�Y<5C��s��f�����6��Q7FrN5��li���GD��rG'�&�����Kh.^�!H1M�(���|�������bh{��	>�D ��3)t�b�Ob��-��#�����>
�`e9Y��h�n�{=�,r4S�`o���F+��L��1�7��U�j�����Rs���?�Wjt[���/�.c�o8��(`uB��v�O�N$�MD.�[&�~�����Hd���D�������_�����/*G?b�x��t�51
,:C�U��'$U�%$�7��~�`��"
8������;bv�[�-%*�������\���G�
v��
�D�����������9�2f'TwW��p�L��0v�W�@�����	�����k����%������|h��$����B���<!&AL��6@�EM��t��e�kT��e]m��
�������w�}J��l�)�Jp$���N��`���?�\�,��p��vM>
[A��
��$"+����K������`�}�����,��M�V�i���M`��BK�.�@ug��U�R���7�;��ib��������
�������xn��#ZK�{��������P���$D~�0e�1���ur	C(�oK��hvQ
�:�7�cT7��/M������6!��Y11@�T$w���E������
�};(9)��(�����
�����`O��u[s�V������������$]��]�#��>���~�s�+�"�Y	h����
G/�a�����{���H�l�x�{�=w}�)R���Z���U2V�)�7�Q���V!���;���*I����y�2���\G�
�d����Y����.<�]�x�
��zt��$�JL�����"}'Y�@��yb�@A�:;�O�H����<�����!��������%��}��w3dswOQi1���i�QW)����|f�`/4�t	�eU��G����(g\�.$+��py���J�a��e�NTC����~���E��?&��SXR�����,�S%z^�T|#��u�t�!�����ED?p��yBv'lz1p��7mTU�����'�8�%����1�;� �5��R�0�
��*E�(!:�6L�-2E���$�����"�)BFt�1
���p�]�A�8�$O�x�K��������9����'!�����1����"$��c}e4������#�]�As��	��o�	�a<���:�p�`;��H>�aKU�h�E��=�[T�P��>�~���2������U)����M�h
�����'������]�/Z���lr4�H��J����gn;���JV�Q�oiA��2�
a$Mv��0�?���������`�NI�8E���
{8������t�S����n_� L���QQ�`
�
�� �"q�p[Br����S5� OWj�h�=K��(>sT���1"�jF�����(����4G7����'k=�G�L�`�Nb���z�N��C����Z����0�W���:/�C���v%~�3U��j1�@�~�6���%��k0+
����#�����a{�p�={�������F3Y��/y@b�2h�e�K���[-������	�4lVDe����"_�a�}��[5�
"_�!�`$��?DN/���'ytK��JN�(g�b���q-q�"���>��M����|(~��*�p�������K`��b&>m�!aCt�]�w�0�E<Z��5���r��!�H5*q���.uI��>����D9
�d���Wl<��g/&}	�	�?J�l{�#Qt��%������S��af�`Z�57Up��03p��*`��t��u����3��}l�{�9���DD3�K�R2����
O��TrSB$P�p�
�P�iI.#}�=�E8�x���Y��
4Y!�O��3:�8����A��q��W���\���DpE�!���37Y�8!E�F��V6S��7m���2���aL8�(��QdEA��������:"�b����B��#�a����
�����-�E�D�MbsTT�'z��RQ���]G�Y���G����K�I��se��:�X��S�h�O���:#1�8F0�!#�B�(��4"�_I�u�Ee{�T����bFrd�6"z��-g��M�(���i"�D�;�AD��P���k>#�m������k���_��?O��*Z�4k
��������-���!�E�R5��i��~���$��)(�-
���D�2�A�Y*�R��P]<���Od�?z,�s�,`Q�v����$]��S"L��H����-8����C���][LL�
���.�w�m��a:��������$�qV��&OJ����=��o��(a�?�C�w���oRIO��E_�o�brX�n%�X%���_���Y����=����y.���/i�������K�! �)��+���Yr��	����*�M�fV����R�df9���<��g����
��i]^n�b �`&��4Y�7�Uz����&B����3��(�n:�������R���;�q���:$g�)��X��tq��o��V�XT����d�H�;����d������Y�P�e���!��9Bg���hs�����W�5r�(��}�tAB�Mg����Sx�aNTTS?�vlTh���R�`��N�����3r:i@[����b��Kr7�G@��O��t1(�=$��s~hF2F�nPxF5�>�����c����rP�t�0f4��_�X-��(����N�D�7����DZf��}��>�pd��N!�h�0#��i����"F�u�L��87��$�!�6�We�}tN�Q��\�G�BfMQ+W'�@�s2�����Gw�X�3�X������_�7*��>��~�����3+���C �����Dt5��4j���/�8:z��(����w�q���(�gn/z�a)�|e����z
��S�y�5����'m>����Nj!z������9�[�mR�Uh&�]�@QJ�]/�6��^-y��-�#���N*������D���{��oH�kd.�;��O )q�pN
�f=^��MhV��uYO�a�����"O�%�&&:K�?�9�J��%w�#���b�2M�YY�MS��E�~�1uN�-91����/l=�h>��� �G��.�}��*v�K�hI����9����|�(H����yV�a�599�/��������h�/�;�T�C������lY)W��� ��$'�eW!��	��C������w5x�{XC��Um�wB��rJ1l�������2G�I�b��7Piu��V��X�,[&
5��D�hupC�}�k[
6�+1�X����5�O�8��B�Z�)]��1�G�7)q#�$b|��e	��_�y������C
��A�d=P�B}�p��_p���-��-������
���0�mU����%|��Jt�o#:�,A�0Q�������oq1h�;D����Wm��m	����O��
(J�^F���%��$,����)'�"1e��Q�*�?2TX���v�K�p�ha�%
@�(��q$j�5L ��������x��a_�OiB����F�=��Y�������~���?����s��k��S���5=��Y��I8���a	����c��g>aK������t�D��Hu�	n4)�u�?=#4V������];sF�KH���n����w$��/���1�����,���e���-z�R�')�K�>w��qV?�jb	�'����n'��k�A����MF�]��3\=Nl�	����>�.5[5���-
�'�;�.!�w���4-%��i�������Uvro�=�x�cr��o	���E4��9g[4f��dbY�Olly�v�eo\����EWi�c�/�C�uZ��Gg��[
"bd�X�x;����J��vHl-��-�h���!%:�9D C��7�/��,Ww�&��p(��I���_6��w�����#�K���~?�N�Y)���U��o��p�E��R{�e�~�Ph4]	��E
�����JP��y��
���8D?�Nf�k%}$Q���_����E���:N-N�[�LI:w��
��b�f������-~��}[��mS���k@K��]�2v�;�;?����LC�6":�[�
�_����M��.�C�gTC��MP0��j.������}G_,j�-����+8G
�h�w���)�wu'&��M�xsFJ�]m��\��&A��`	,��Q��n�"�������p��BQfA�B�D~�[��Y,��2�h��L��S��\��G'� �W��
�*������
*�!XH��s%�������}F�k%Mw��dr ��
*
���Z3��2�o�6���^���N?�n��cK������N��8�$��6�zv�ZK*��8cIF�G�Q�n)��]�G���N���`���������I���h�nWr��_�q����Gz�{��qY����(1����B������:=Z6��V����M�E���(D1iE��x�O���\���EF@�Q#Fcu�`��sv[�����=� ����I�MMBd����x�d�HxY����nB �SO���w��,��+��(bn��M���$7�{�H���M�q����]T1���4����2]���Zxo�aEzk��=���B��������^��jBl�KI���W�l���m� �������dY[��9�Jx��<���J6`Q���������L�b����-��S�{�y�����#�1-�Z�����*s�o(���%P�G9{[��X�A�Z��;�����h��������O����|�w�@���?��tB�h��y� 7��"s4�V�b �od�O/a21E>��nJ��������=4��|��->������H	��D��I�����*�0�@T����+������]q�xJt�G�����P`|DCD��q�1_�C�B��\Bt+�d����#��c��h�4n�T��_,o'��y�3
���+ab��Su?��>��/8bh����6���=��k�'!->������{�B�C�h����%Y���-$C�r���q�1}��Tv��u	`S�\n2X�������T�����#��"'�����ok���;�����n���#��g$i��VC��	9{L
���$���h�^?O0j���T����������|��w�\by>���&*�������l������	'K*�#��,XS�i��|�8�qs�>O�����-H����������O��j��8ba��0q�	q�.�o�0B|Q��-:n+�e����3��J�����0���?2f�����co�[2����5��i;�5�3�BB1[
M���?;�\�@�(�tT>���K'�N�����O����~�_bG��p����XaK�sJ��?ZS����>]�����b�r���!��C��
��"e
�}���?���he��z\6RuG����b��	u���v���#���%��"Y�����E<���f����,b��2P�����2g
@��D�����7(<��.%��9��'�R4P�E%��.������;�z����O������W-(6Y��@g�[������i��%�O�c�a�����~%�(����j���.A��� �����G92s;n)X������������nl2�M����[�E�v�nA�����>5�����9��F�Q~���v"a�%:	;6XfT3D����fK�����=;UL�����|�E�Z
�_�:��n�d��I(�)�������c�3�#�l�������mrt�T��g'����Z�V���9����"���c�:����}�c��* ���.v<��e>��e����jp�/����_*L�� P>N<_����O���3����WWR(�'?jK�@��u��y��'Q��%�
��%C��	��:�C#���/b�@)S��;P X��X���1����R*��|8�&����%zw2�LX���N���� F������+j�
��o(�e(�;�9�3"Of�0|r>1�N���h�j�~G��z>���U"��5���@��^F�&�����)\\����0��}/cV�fZ;P6���<C�}�����3(����N�"�_�%������o?�P�fF��B�����0"
h��:����'b�k4I��&<���p�@*0�nI��n&o�}�n!~eJ��H����Q�X�{�����af��^Bu_���c��9k�Dr�]����J��%tp�;�Xe��p$�����gj��`~��m�f�c��=Q���H��Ltw���g=��h�����(����2Of�9�h��?0�x��8��/�t:l���������&=&'o���E\�`��qWq������E�3z�;c��m��|�����.�������%����P����f���$������L!0h�T/���������	g����)ytB��������;��D����q�4
��;P�m�,�����\��G�!����Z��p�(����Z ��8Z�-
����df�x*���oH�21�g��O2S��"��j|;���h]g@2[�Qi���:�k��z�6
p��:�CW1GR�h�+�`���!9O��������F�y���c?�
�?��8�L��������J4�i����y,yMn���{����C�xq��?p�� ���
�-�:w�m�'�{��@���9?:6��9y&qY��E��Y��U7B�Y����,�:����wq
�,�X'��<]��P���g����Oek�-=���(��qF���M0Z�6��`
�}�m��v���[��2������s�+�9����$�_����0���e����5`9�VM��1��Y�@O�������W�p���4Hx�Y�.���Z������z������,��P2F4��z�i!CT�:`�F�2.;+�0���J���o��njR���'/$���!A�v�w$tXq��L���I��4bO!t�A�^��}�	�U�.Te/���$����F������P$D��9���eh)��KJ�"nAn�I�VD&0KdM�P����%��4SZ@g����I�������B�8:��)��~w�
���
��J.a� ������W�;P����S��&+����:�}��I�H(gO���(���)"�H�Y�=@S4���[M �"v�ejf� U{���N_��'�ld�(�k�����v��x1w�����i���k/��O_���,5�s/�>����S9�����L�1��H��"��%������%�2�
�%:re��k6��\hh(��|�B�\�$�@�7�4�{O��VEHf��^Fs��h�P+���w��o�N �2��%��#��g�;���A}���[���6�(6:�9����wg)��%�v�d��"Y�f��'�]T-�>���;yfN0Q��i���=ljN��5v�`��i�i�*?zY��HGu�����1b�>O���EDc���"��mUO���em�����E���|�t����SnSQ�j�?��������\��8����db�Y�}�����{v�@��9����	ZLZ�f9�|?�&��� �c��I�n�<�f��O�])��Q��.�%Z��%@�OR�W��s��k�Q����?^� �DGW�P��!B�2����i���h��ZR�����@v��`�h���Y������Z��w�����	�f�`�d��~�;-��l2F�Dia�_�Gp�	��U�9Dr�*��%D\��#���}>�����Hj��	�
��F�����Z��)�Np2���erV�������/j�UVw
$�C`_�*��/<�i0p%�U�=X�L��*�~����c�C"q�=����������8S�c���[������2�ssx�8��cL%C��I��y�I>6���cb��S �	��gm-%-��>����cs�
��H`ks�N��AMGSS�D]��[*��
��dNy���F���������%9
��(;�,�Q,�N����XI����;�Y�_�A��b�/��]����{����T����J�~�>��vO>
Y���G��c�"s����3����1�V+���j�G���C��u����k��wF��[�j$��b�(Jnc�~Q�?"�1�.�H������XG�������YG����:�[�_"se>������o�[
�/"o�������u�"���t��v�"�3�n�}��]l�9�B�Ap�-��_�*�����W;k� �P�q��N�me�H}jL��Z�a������`������O����mr��
�����P��b+,c"1�=���>�(��
��a���C���D�"��������=l���:?PNOh�~'�l��W7�B
�E�i[=S%vPSNh�2
/�������"�R��?�y���j�]|�\���l��P)j<�|l��,�I�t5Ol�g5�.���LW��������u�=�����{A���@q�-���G����M
U7�N�2�F����h���^�z����H�)C�#����d���G����%.���4��d#hF��M��W����w���p
��%�KM6O����J������m��+{[�4�3ri�^�����X���S������P��{����?(-b6�����d���n�2�}����j��Fw��Nmd
�#����)L���_)�Dr����D��^=7liQ��BC�������}��w.�i��-�1�s���tkV����\�X�.��B_j��W�;s��
�C"k����/�}�����b�[|���P�?y�����3 ���^�#�%����N��H���;+B�/�����PP�\J��Ij���A�O���D��x����>Z;��~\�+����G�94������ih�6������="{*2Q-6��1/4�#���A
[�|eQ�@��������k]H��{�3�����1]��Z����QH�M������5���"��J������g��|��2�����xDyO��� ~�b�
K�BbZh����"&=2Sm�J^��M��6b����R��F��4EX�`=���b�`��9mWC��h���H��s_��l��?Fu��lw��$����@�&s���D�EjO8�fN@MV������'��i���H���d0�6h$�K=HU���W��R�	:T�	@�f&@��9�<������w��?j��j���2T�jSk��6�K�@V?m}�d�yK����C�me�NW�������4��c@;���)��E��bB�0���� �-��;S�.��kU�
Zc
�+�������=�oWMj!cF����Z?h�0������hR��_��������.�K�+k*��j��'�^3�/�M��!y:��r��,9f6���������F��v��gg��]������[�H;�����rn�w��,2	f����/��%�0I�j�
�Kyakb�>�5{�{��d��Ox����I~M'C����O����4�t���W��^�n�i[7��+�N�>�Ed���>���d�����7�J��n�~��{(R?B#�rvO,{�u�����4)�O�g�#���AF�n�~����H��pgr�,n�����������CQ����D<�|v	��Ie���W��sq�Y�&�^��/'-�q
mD��?�^A���SqG�T�x�4*jx.���W
��R����$�iv��Z7`�v"c�r��������c�/�NR��fl4�9U��H�B78/�"��.�������4�|�� ���}�a���I��!5ioi��,x�x�6��'pW���Fc\��ro���nT��rM�B�^Ct���&u��%c��v!�e�=2�:��m7
����8N���������4�����d�66/������6�u�����z������n�^����~���J�LF�s�5���-���D���{#��BXt`@�������S�N��
�O8�+Bv�@�uF^�Wi�������$1R/W�����������[�%>P�7�R#�M2?#�^~w\��yf�^{]3�	y�n��X�{�N�3��\'q 3R<Eb�$U�R$zW@8�����r��
�/R�	�)���?R7�Di���bNqq�!�����y����M/ZD��H:��;�2�kEs+Q��S���r��O6�/�8�:.e,U�����l���w���_g^dA�������{��IP���}L����;����9���L��������uO�����3�B3�^?��MGD��w�X��J����� Ow�����)��n���j5#}��T������cy,������qu��7��2Y�M����$'�,�N��r��!��5���G�v�6���P�_S��I�Q�0 �H�B��P/� g|�������"#��G�~��^�����0%�z�,@�,���q��
q���rpD�S
9�S`4&S���HE2B���<h��nL�V<��@���z�0I����%T��_=/������P��N��-�Q������\4���h�L�<+���]��&�����)���m��X����-�!-FMy��3���i�nfq�lV���|���k����Q3��3�;-�l����^)��OC�Q�Q���������Tb��H��Z�������%j�Qs�S
�VrL���m�����v��������a.@t{q�	���m����#�#�<�Z`@�du`��d�$M��>]�����v%����!C����T�9B���-b�3�0�\'�V#�@?�*%�'�����}�W���B��D��S��p_T�E���7��>�k�����%m��H>�1~��l
#T�pB�������i�`B�������U���?�\��g�5b�#He�:d�;�A5�n_�������Ul1�Ak4�%9����c���Gs�Q�@���q�'�w�Vd�I'��V0�f�_
RB[��~��J�I��CR^��~��6�+S@~S��������{�cMu��&�>
���V�`\T�E�����Le]�"<�[��P�;�K�� ���Y#�b��F����42�� J$�h��o�_�
��������Nt��P:h!����d)8v���f��A)�H�0BH���N��t�z�.�dAKo����A:��?9���V#�����s����rMhm���N�&
D��i�J"�a�����)t�{�iY
��;�s".�����5�4n����
M&�i9�Ig�d�I����^a+�o�U���>V	4=�x����]�6�6�	��^�!G�ina�X�A�x0�ENs��^;�FJ��;R��'�-`��Ov�����X�N��46�*�oV���.|r&�q"m3��j;U��}�c��}�����I���N�3����<f�$f�������`�b	�f(rH�����;�/����$��/�"���[���D�0K����a ��Pi:�$��������� �|+������x�����M��O�'�T����b���"��4��.P�vy�	�&�0�jv�������A�E�EX:�/��'�y.����������u��8S�h2LH�h�TU<%!Vf�2s�)h�Hk��:��.\�B����*��dZ�D��y�f(����1�������WI p�
AJ
�jx&3��1��H���#����E��=AU-Hf�	��u��+ �o��7�<�e O�Z���}�d�;�6�d��0����UxX����Wg�[2� �"*hM/i!��4� �%
�B�r�b�q�y����#�wyZ�n*a��H1&��#���ed��l����}�S�D9*Q�a�~&�W|�����FW�����iG%�l?RI���>v�6bL<�5���~���4����J�E��T�d���;�����*Q]��;�
���=��
����K3���d�o�N<�&N��9��A��4�`����e>M@,����=�����[,E��]%9�w����H�3�9���#P')��n���^~�^���(Jw�[�(��0|s���#�4�3�6l�q���T�y�;b���I|�4� Vh8K�������
{W������ ��I�Ag"s	���;����h�;�(�#�Ii6P�E�z�H��|���D�Y�$*k�bEm�w�&W	�V�
��I�z'��i>At�R�����&Z�M*��~X�K���W����c�R��$�=�!zhUIH��4�0?o���H0������6��N��j}[���_����L��k�q �)���f����XZ�����Z9��Qu}�E5�zk&���+�Ed[O��,S
S�E�J�("��J4pqRF������'oD�*RV.�	2���-n}};�J��B
����0�c�'2���p���VB�/B�����Kv�U��L�
���!�����p�����E#"y�2�@��U��\uTm��lY&��Y	�����&���'��
+���P�uDk���_�<7����0@��e�@�s�x���ZIc�
g �Prv^f	�N���	��V�e� ��LA#��2? ����U����L��-�*���M�%�&r�i�^�	Q���~���[f�BLTz�8B$^�����}�Z:�XU���&��-����}4�El��+m���dz��W�����P��M���0c+�@{7dBx���uQ�6�{�C�1D|���R�j�A~�+����s�&���u��-j%����)���CW�$�Bg���`����swi�)��Aq�c%�����>"����I���|�e"B�2�Z#�d�8�k�6���*��S�
�P!���Q,�!B�.s
���k��,KaF"��_5O�����%��>���g%~��/�i&�����I�W����:��_�@�}3���"vt�3C`U��N�0.��9����@ C��!8Rq@�4�R��?��.�xE�u�����j��L���z�K39�����H6���������9��o"ID��?p��{���K�`�����d��^��\d���
�~�J|���������qP��!���fN�w�I��b�W���U"z��#�����<�����*0���#l�"(��C���
�$WX�#�F��i�"A�[C
�W�t��aG�B��5{�o�K�O
*�_G��[����E4f�Md����^��u
���j��������?JH�����I.�L�t_=�2�"u?�7Z��`�%n�+`;rq��%[�N����lU��`z��_�=�����(�^.0k|�����g�������<�!�*MU��c���b��� �.J_�F��Wv�z�b�o�T:���2V����-��v��k��:�z
���i�BgvM����e|���]���m0_I%�^�����u�d0�/M�"��6�//�'Gt�-�H������5�r�?y���aJwB���u7Bd��|G��Y�@������*
e-%���8�m#��k>�Dj�#��6�O�m���G0yh�@&������x���Q��5�E���?�7�P�h�:i�&"�mx_���Re�m���$�?���v����|�.�C�m�_���D������6���G�6s��rUQyk�^BB�s���>79R���M����F��T6�yr'��h�v�}5����=����1~�f��������0b��c���/p^hRH�?RS�P���mH�@�;`�C8���3yK���lD_1P��!=�6�?mt_�������{�����u���P�;_P�g��y?�+��o��!������7�j��
��4���e&}X�]����#����������n:����d�D��[�8������EnH���y2Z�~#^';�*��x`��6W`;�
��v��I���1,����~a���+�g
�������"Q�-\`����n]B$���7X��#�B����a��5w}��Gk�����b��C[�	Z����gT�R���u�n�	b��*V�����b��t�A:�u���tH�&egm�h�H��-��r!pY�%���??�f5�DuB���gUh���K �����E`����2zr�`C;&�*����r��N�
��Q��RLe�K��N��6�	�v�����o��?���'�?f���l���V�<9��U���%���Q@��'fD�r:f���~�S|�4"J3���,����Q������<��]������.��f�E��?�SI�z�����{��,������,�$��i�bp�'Z����q�%s)C�J�(�H��Q����0�'d�@��v�{Iw���?&���u���C�v��ah�1{�^i�z��S�����dcbsj�����y����E�D�{L�[�4����7�E�PS�>���< 0�1]��*)���h]|L
���Hs���o��
��������$��:f	*����gz�DF��p�����������t����71��S���J~N���~Q�����Es���^��$Z��$?Q��p {A���AW�9�������&	4sE���uz������+ikLt���V*(�IM�-�h�63'�Z0�(	t��c��*z��+):�
t|S�����"F8�Q�D
B'����d�@}���$�	�k�Y;����5����'}�uR��o���-��G�b�&y	4�"�1]�nk%m���LC����z�`o�=����X���_*�s";�/�E�#����ZhC�<9��-��V�����$Y������fdqL2�`����A��6���N�e[�0��M.4���8��U>�X����@��r,�o%j�u~��!��1� �
��}�8���zD���/�yw�������	MZ��8�E�1��*\3	���6�x��Z>
	��YX)��l�W0YAT���-��vY���F|}i9'�U	���v��j��"������,����R�+,5"���d�|��,�k���&.��	�|��
6i�:�D���R�����T|=O:�~�������z��?���q9zG�5Q5�������u@��(4�K���������>�n�����%����w������R�G�;:;��J��_�~2�h�vB
�����;..�������r�L�_������dW��/�!����}����I����R�<=�^g���n*�K:����;����G�h��� ��w���d�qz�>D�^��O�
���L�6� �w�7?����hC���-(������D�1F��>�RQ��^���=���M
8u�'�A�y��� �}�S*>����W�KmB����r��R��X��:.��qJ���*�Y{/c�S��*����Lr�=��:h�k����e������D�B�`?�_��8����!GR2�P�t��������R�,������&z)�[�����|�;�k��!��W
b�+X
	��w�_�������V���i��L��>W9#�b�t��c���Y���l}��T���N��{����#�
�m��m���@}6�?��[��v|Z�!�CBs�0��	P��u\��D[�@7�����}"�Y����B��)�E��u���0����i6���C?��l��^��&��5�{��H����G��L�{�J$m��
&�{/�~��:������n�&�W(�:e
h8}��5���	Pm+|Kas��E+����pSe��w���S���h��10�����k:_�iv{/���[��F����I�
��o�_<?��<�{��["v[O�A��u|�@����D�����y��ZZ�����b�F��q�P�[[D��b2���S,��B�DS&]63}���e���@�R����.��!'0�N�F�M��\.�K��}1��w`Z�$�#�b)����`Z�Z#%�Y�B���i�%
�.e�QMtt
6��M���b1���Rv������>�$�@�2s�X��P�(�UL��H H��V1��l�H��D�����g����*znF��%� ���+�T�.�
��W	@���F��]���B�3�+���)5�9�Ax��%@?9AG0����d3*�#��y�%b{�J��V�L�~���%��P�LM�"J���[q�k�`�SiI�� �n��{����l�Oz���l���;�O��I��*5�����D�}���,�1��zR���{	��Zf����^�F��bz����I�2���		J�������w��..[:�L����3J�d�����s��%�����,�$��Zb�*��E�x�]���zkUr�-��b�@��;.~��K������~��
�#�J33�!�U���[:Ag���)����S�|��5Pz�!�U1u�����]����n	�-'����d�@z9)-�
���8��5X$�N�5����	�X!���E*�����BU�Y�LG�^��#�	Zy�T����LZa�K
$L:��Xe��F���3���mz�B���6Bsh1�:q�V?�D���Z^�ckJ�@_��c����$�x�;WS������:c�y{K�U�Bp�HS�<'S2���:h�0}Po}��K��i ������#%y����D[�M���JW�=P����Bo�<��u2QQpwb�����4@����r����KO�D��{��1�AR�b�`��@����*�
�O�*Wk����u,�n������:���m��d��^G���>RhV1��6S�;��K�$~�nh���bs:]��w�G��5{����9�c��B�����)�|���Uv��+@���7�W���g��ee}��S��[~���J(�-�q�!�5��m�f$�c���i���-���v����N����*��|��*���B����v^��.'�W�����}/��������g'hUB5t�]�������O�������
bx���y���|��&Hz��I+(��_*�zx�R��#��U��_�
s�&����d�.&��&}-����BW�H4&���d)t��S����<R���ns��u����I��+�2�s���@�f��3��x��u�Dy��W�
�d�T�nWs*��f�'Pc�AV*s�W�/s�>&��!Rk��'�$�g�3����ZgW
�K���9�F{�H�B���N�����wm�Nzg]��(�ZM�UC�/��.�w��z2DTT��?:b��D#��S�_\��8��<I�j�1������A"�W5 +�u+�g����
�U����7��RjV��Dk�EO r��y*�D_�����N	�$�F�@Mg�6{���
�#a�q~�;�t�dY5G �����V�H@*�j.@�	[A{0��-o@5���� G��#���2�ZY
�+1�WC�M��������"�yMSy���~Y���2�W�?Hw�V�:����D?X�T�C���G�(+��2�>f�8���!�i�4vac�H��PW�#O-2{Ll��`#?`fU���dA1�r��X	��vI��E��Vg�id�7@��:����Q5�4�5^A�������F��m��	e!������*n9�o����1���>�^��^u��Y�
�j��������Ab{=���"��%�,��,
0d���j�����@���C�)�x�F���<�t���&�QH��dUC���hUc�2;��IZ��_u�z1��3U=�����s��w(cQ9DJ^�g���{S�zT0���p��4% �f'��;.�ze6��e�
����
�B��E�|�Q��� �<��5M:R������~������������^r���jJ�iwM���U�
."	�tqB_I��u�?����������	�a����y�=�A6����7m-w����e���z{��U$G�(����t����v05P@�g���AN�-�3���S�RK��D��%l�1��D�m���|�=��=a�-�J��[@�R&�4	,�<���m��$3�KS�r��y����]
��8.���i�Y���pK��9'�
�����h���D�0��Z��U��'��
3���@��f�@p�3��[
�&msM����fN\�$o�2\F��wd���6���O����7�k�|��$�%�E��'��P*H%c��}���-��|q"�z3%p��a6`�O��-.B�Fl	(�����i����i���Y��D3���ky���T����x�{G��Ve8��/$��h&t(��D���j�����+��M��	#@��Y��/V(����3iK�h7A0�<��5��q���H������s�R]G��9a7��;���Q4&t��nt��h�����9�/���$����[�	S�b�Ag�>C�k��,9IP��p"��h�!V���P�iG��p��C��1��N�c��xf�E�h��a��w'���������XO�\v����s�}!�h��}7��zG�?�CN�������moCS��	�0���Ja����&�����V��
��)�jr�'��f@�u�x���F�w�.q�B<-Q��"~G-Tq�ka����nL�m%���b�n��!����)P�������|[��#�@r��D�e3��a��Z6l����]��"`t�m�b�����{����K�%X���c���o��2��&��������62�l�e���6�V�G���[7Bo6��R��!����QOR���hyBK�)2T��mF�� XD�B�Q$�0���D��B��m�f�����63�����~?���O��e�9��)�� ��XI�����-�D�*�����8�N
�U���]�y����7lbW��7x�=����&_I75��2?��mn��*���I��=����?H2C��=:�u�N��[}�U^Jd��%�30Bz��`�p7����6���6�fK��?��zi����25���X������Hq���R:��Lr	w�&PP���n�����!�w����C��^��q����fR����8����> I�[��rc��
�������[�������J�}���g��oA��������?�{����T�H��?A(�8���xo1��������`�/�`�-I?OVh��w�����]IhoY$�=���O�FR%)�I���5:w5�.����B�I���B����=U!�	=���*'� �����ME �����J��Ff<�,I��q���z�4X�&%�[i7)�}}
�=5����e����>{��zZ�����h�d�9�w�����B�N�?"2��g\J����(S��e^��(h��d"�R"�	 �c7toU���x�Q����S��U���n<���0�B�,{���5!]�l�����E�������Y�^y�R��N��R�Z	�G��G.o}�y��7Y%�kt�U�MEL3�w��<�*
)!j6���I3��6A�"F�����Y�
=�P�4/t���/P������rW=yf)��Q=dr�}4*�	%�Wl����-� +
������p$�l{<���!4Q�crB��V�M�cz�$(�biH���r��qq_[qLU����+�'���bdL��u"��U��c�4�z+����l@s����E�����Z�{jE$��I:>QF8��Y���_�Y�MJ���>Bd�-m������X�m��'��t��������Y�Od���E;�z�W,J������	B'�T��[I��!�>����#p���x�����6-%��;LCt�W�?k��c��<����G����Pd��hT�M�H��)�9���^+���=�0Q�Y-��& ��).��k�!�����sSySfcQ�-�3L�9g	�G?���Y����������	=L�h��>\��l����Ra���V�$fA����,�C���Z��3z�
�c���CcL2�'����5�6y�H�OL�V(�p��@m5���z�f;���E
��uy������`���"C����6P�� u��@������|��YQN�s"�]���\��F�.f�@��I���I4L7�8���"��h�]�yn�@M������{���W�?a�#�er�,���,u#V"�q)=Ml����[�:n�h�6��T����z@�8��������<z*���V������o��F8����R?��%�
_ 2�*LH�����}�d��3�T���%jF7�W���@�B��x�>��G�d���#D�|�l6~]��2���^�{c���r����pGtd$
y�h`�j�d���d�@�"N�����p���D�����	B34���n�Q������:���D�z��������xH�1V:d�@�re���\�����bR�L���-�7_M{���`d_zf/�D54|���x������*2�C-?�3"B���V%�rh��koA&>�����%��uE �������o}��u���%���DV�����{���8�I�5G����ED#2�������� �a������J����>����h6c��gL(�ax_zj�T9����n�?SSE�A��kQ��0�/�����������~��O�H�����/Y�#�0H~�B� ����4�%n>)������<l����������EP��%8H��@i����g#_�|����M#Zw��
,A�D�}�ne����4BL��V���de�Mc�����xl�������N�~K>	! W����@�f����K�5���r^��xe���^������t��J�
�����dC���P@t!p�L���k�w>�t������zk���������>c��J��)n��P��9�oNa^����1|��r����<�6�d\�B�5���h�v�c��l~�v��Ce�Q���y~�~��%K`P_��G7�@�\��Q�}>���5+��1�9�L�����^�Q#���b�~~
H���\��g�Y�K��T"F��������|a%u��yJ�K��ih^M}�zT�h�����a�v:c�&o�%��Z��/H j��4@���G��^
w2��2@�E��A�;�����,�~���.Q��
a��V�/<+�mU��C��/O>5{���.W����Jt�20��_�S.�q_f������Lf9����4��E))s���X�7�3��K���U�4F�'�X7�[��*�$uK�7�^��2���'���R��O�b���fw����V���y��-�PHyFh����+"��b�&PM,�4{��H�0i^��������
��i������eBz���I����*�#���AN��:�>�a��SH'R"������mZA��<�3���B�VR�;��������W*��kv?�kc��������Q����45�N�����!'�U��VQ=TK�T"�����;g��a5�[e�Wv�}r�N��}�'����J��,�T� 8��b��|I����kv��<6\?�K�)a���lk�	�z14��j%"����&��n��Z���<��LET���,9����#fB�mD��L�����-����}���������w�b5$jM�P�u�(�P���X���s�->��[O�n���K+dB�:��
����2� �QA�r�B1����|��x,j�Z�.w��*�L7��^��C=X���0h�1rbY�������PG!U�tW����X"�^���� �A6�U�o�
��F��"�����V���]	�"��g���IZ&����_����tE�O����`��M#��#��!s<���r���5��`�e
A�-�d"X���)]FvdY2��Uv>�+tnX-�����&�Ls_fC�_����Y������tIn�(fE��Y�7"8��l%�@��������,W�A�[����vkJA�k���$��@O{���2��n)T��M��n|c�IP'G%2�U?�9,���{E����QLd��?2i��H��H�2u�#������gE����Hg6�DNp��B��U�2� �����}��pX��2m �|���n��)�l����+��P�+��h�MA�����	�?�d.+ u2L������@z�V���ph���L���U1�:��������=)YI�Y�D�� b�O���u����H�@�2M rRi���3U "���	�(��)�u�5�K!X��x����k�}|����hk����XI�����zL�7��_��]V�<Kn]���2I �+��
��WT��D95���X�ikA����b9��11�q�a��a�B����D���p��Vo������y^;e�
%���N��\��
��v�n����/q�v��q%�@\��L�����@K�G��qA�e���%�s�*���['��s�[��N�$�/���K�	�"���&�/��~���h;u���*-�j�-����~�m@�N��v��-w�������Ts�9�I���D��>7�
ns��+��T���)t�4�w*��m~@RY�M(��9�I�Ch1��
�s�c?q�.�	�n�i��������k�m3Z����
��wL�H�6 u������@.�H�!$A��8r��iB`c���YZ����W�)��I�O�8�t5E���(�}�&��mB����G-�F���6������k�����V(���
 �������4�n(n3���w����j �:q��Q��m>�L;
Nm&/�����J��;��.�GM$7�����:=I��Nk��6���5R��w\Q/<zf�6���H���d��9L9�:����X��:9v��h����
�����YE������
>(�:�j���#�&,��_�����Q<����
����/Q
��m��n���N����3��xM]
��m���U{�������Ped��-O�P~�P���4�d��%�u����5�S-���,�����
�;6S�*�	:b7���c�I3[��w��@��2�JN��	����6�3�x=6�����^o'��t���{���Pty�3vx'�`2f�P��v�H��--����+�On\�c���	80Qj�a@�|E�[�d����J��
�$��m^�vo��	C��,@8�m�_J������BGh�-��^�<����N���LF����tH3��`��/��V�(�v��D-�w�5��������VKY/>K2�w������ �A����w�8��%6?>V��=m�*�7�(m����rn�|��k��C�wW%8�>�g��}ZA����_&
�����K�p������u�������*iI%�;�1	��B��^ZOD���W�%d�>O�
���g���9�������}����,�c"<tf;�!A�kN���P��:� ����X:�x��+���N�.	rX"���Xa���`���x�Sbhf�N��Qep����?K�0gTB�]t>�bO�b~>7!A�����S�O8��R����V��D���:�
����Q@��P�&�\����s����_sU6}���K���E%u4�%9���;�j8����gt���W��{?��$���=}�]x�#<���_<
q�=_X�R���G�?��O����l�F�XI&�OGJ��J���R�4a�^���59t�EZ
NB$�>k���e"�'��������!{q�U���Xw���E��$����y)�@���	����/]��~B�"C�������W59��_O��=���0H��������i%�r�@�y�d�}��i���"��������_�4� �<r�?t�����.�%#ji����>�8������I7����/+��2:f
F�!�7��#�",���;L,�����F�>U����
MA#O������,��HG�B��1���ST�����������1�z�G��c����
B���� V��z��W)�Zsf�������<���j�F' �b���������q��Z�Y�u�	�/��&�ZF�E?�����%S8<�EVt��V��b� �	��	y��i��b=����N�O�Q\��:r��MhL \�}G�����gp�	[Q�������6� �y���R�4��9I�=�����<0(�D���n;3���"��_LUF��uT�~�������IV�����}P
��'����J��z�|n�FB�v���s�\�N��Q������w�(�Y�`�9f��"�L��}UO��]E�M����<u�#�~��-��K�����{KEAI��-��O���<�
St
���pw0X�1!����L�bnGSM��>u��X�
&�;�}Ljr������)+���
`x/a�V��*�$�����'�m[�~&�/���KX�Hy	�Q"]�@����T�~���s�p @����0���#�e���D�7��%��$��H��^��}�d�y�_�}�,��������`�f[H�����5h����w`IqI�9�J����6�%s�L@�[Q�#�y@]������m������B����NW	Y=�4�>��wn�7�.�^'b��"H����3��L���g�^��:�W����@���������m�!���w��5��������i^�{6���	)�e�D���K���|%&H�}����Rb�[1���t�����@}�xJ��}���RP**#��`�|�%�C��������r�8�	$ �;�"�[�1#�w����e)��9��/��Y#����?�Q�=��sU'�<�%�t��O�,�T�O�����4�o|$�d6m�@[�V
�7N�c�����������6�������[��{?�������N�]���}!�	�����V����H��8c��X2�;�\�e���gXLg�{
90*������YL����a���1c�wp�~���C	y�����	�wY��~0���������|2J#+~L��cG;�ye��~����
�m�1>9����H��v��:�3��V>������I��!�Z*�AW�����/>i�Q�f�������w)�#�N'�����NF�e^�264:�R2�B�*��3��_t����>k�_��(����jNj�E���w�f'f������7Tk�-���s��>u���=���+l�zGg�li�6��?�~#^�	�B�L�{�z�3������{+*:0�x�����P�c�_���>oF���W4�
�K�~$8R�4�P��������3B�������X#�T1������E4j���$<X69�K$kbI���
�B��A~Q<R�m���K�}HAZ��d[:���Z��N�%H������v�b�_}7��z�'�BI���������C���k�bl��A�<L�.Z�Ha2�� aYy��+&�$Rq�GH�����-����.�E����[hP�k�G,�
���2�v��~���|�-��'�)��19�)��P��?i7�%��m���3��j����b}Z�.������S����3!�����������P��P�j�2�[���6vI�$ �vD+@����I�u���d��>���oA(1�=���o�\B��!����D
�L�2!��)i�������5B�����g�_��E��a�K�c���U%�I�K�����"m������F2f��O���LP��{���$Ov�wYY�z~�SUU�����BN,e��}��.���_`a�K4�o������!%��21�_�$���_��v=�����T-NT������y�2���Q���=�[f��b�%�>��o���;�]�����D���<tt��U��

�Ov�jY�.4sf���4'��
QJD�h�|��L4������������\�t�DG��%��11����A=8�)n���v�#+wW�D����[�7*���Y*�U���_��������*��������w�"6�	�%�}������t1r-D�� _��\�����'��i����@�;f���I����	hDq%n�k�U]}��lT�\�n��bp��#�A��$.	��2����j��7o�?Ax�z�xM���v�����v"e.���j���U�zS�aK�{�vW_%z������X��^��Tc���}�
N&+_}�d���Hw5B8�j_	��t+^�tB����?�fP���;��(ZDcw5�O0�_GD��k��o32�����6P���/�['C~s���.4���&E�?g�[�H�N�����Q���F�7Y�k�|�Z-XV��U���S���������~q��L���e_�C�P�W
��Sq8
{�����q���wM[��+��(QZ��[!.��Z�IA\k�.���F��Z���5�g�]�D_y�{C���\g�/��>ap�a|���A��������ub��!�j�~$�U�O�L���c����R�!��~[4d
�kk����E�g(����6���+x�
�����N�M������UI��!|���40l_hi��M�� �F��X	_R����tT>��VX|�D�X{�1h����!'�j��
J5t��nE�W�o��$��j�������v5�/����Q���mjO ]b5H�����n����Zf6C>����x��|�� ������G>�29 3_�?v������
���_�Dg�[�V�:"kiS#�#���g*�k�[��_k���U�������{�~����+�Po�P��{��j�F�����|.	u��o�u�
PJ��X��ch�o8�QC](���
��-i4��Xe��u*:�6'��\��O���QL-�K�'c$���l}<��?��*��E��jJ@��zv�xt2D?�SCC	=C
%p�o�j�^���yLR_
D!d�g*�c�#
i��;�e�c"]����Aj��Wm�<#5��U���j}���V���c�1�M�1�V�&����~r).Zp������'�A���jd��������b��.��k����c�� ( f�p2��?v(�b���&t�%����c�C�`v
K �DE�3_0�V��p[��m�|��J���$b���^��j��!�����
�����jgWY�A��nO�Y����!+�M^Q{�f`3�O� w3����M`�G�9���n���Y�~*G�����d2�Wi)�\#�a3���L�%�,��|���+���L��8�����S�=`�h%�R�AQ���TA���[���$OX��%�*��A������1w��R���`^��e�q`�d��6��f����vV����z����K�+Q�j��p��O�E����Q��fjchF�UuO�
U}-,������`�=��j�b���U�J#�����g�q�Uq�^���f�W��}�0����"�k1��\�����@��f�@=���~+���`���`3]�c9~5�nW���>!���'�����+m�]m�NL3g�d�-����Wwr�}�F���xq}�$�2rP���4�����d��na��/��e��E��1aj&
���������s���2��t�2�vh����K���$�(_?�z9�c4�e\�5�3�x9�u}��<�����
�������*���?�F�]���,q����$9��x���c��"'���ZG��������<u9�~�+W�[�^����0��{��(V����!7fTm�c�z+|zw�(
�M���7�����[2����~~���z�%��u�+Y�g"m�#�=4u��>�MG*�f�`x��)@�ez�V�Y�~�jay�f6[��+%���Y�j��jEC��
m���W?"�y��/���4S����@�R�7�����������H�����n��#���#� -~>c}R�/�s����C=�:�U�2���]�������s�W����;��A��f��dA���d��Il�_������1���M&��0�f����-����+���$����w�J�U;���9U�'�2�t�'�]2�z��!i]�<|T���vi{/���tX>���9�u���
E����JM�#)9!w��=���[v7�X��"a��)$����w������>����f*)d�G�_�-��w���/��p9@vS��������I�@���]����P�M���{|��E+Y�Z��F:^�	�>f����h�|�>�<xd6|����x�.���
9��'[i��k��]�8&B�~��w�_�]��N��,��e������V�J�<�����E����m��H�UHJ�
��t�G�
�+Sh��"��nh_y�W\qd�(Y%z�,������c�'�W&���C���-��,Q����H����(�z����Q�������H�V���b�����OU����vor�)3
�,���_�������9)����d=^?����jL=TO��#M��\���Bsrd��	X����U�l����2%�%M
���n2`<�n#�����i�-t36���7��'Hn���P���	���V��?�3�`4/f
52� ����{�~�;��.���}�F-�7���G�n,��4h����Qh��H~*4"�����x��� ��P�x''z�������&2���D��W���[t6u����������yXGL����{�'.G=V�U�����hia+�j
��V��F��_7�/�LY]vH#M=}G*;��t10�h�"���9%xlz�~L���YUs�h�J���N���R��	�������Y��M����)�V���-$����zK:�����8�nS!�����y5P��@�b�|�i.�D���4���+m2��Vk�?��j����Q*=��!�!��n~���W�t��^}
��ntr�K#��.�|	��x�9�����."�z�2���$���h3�iY�
�����H!�?-������f�Y�F���>�,�x�(��\��g+{;j���'��xbv g���B��(���J��K���
�ie2L�F�h����aj@�kD�&�.��	��[=��t�)H�.�o1�w'�\V�oOw&�����1�^��
��O����H��u��cO�$|��M|/9q��n&�H��1�\���,+����B�A���^�H����%��t���<�����x�saG"!�W��]�k�M�g������-fJ�S����h�aN_�9���7��c��?��Et"�����)-n*�,���D�G�|c��nki�F	!#��Du<�y�H�3���0�X���w
�������:�2_YUO��Be�Q�s����i�KF��]�_�F�U���$�{�L�t�=�4�c�Cl6��m��:��`�W�.!������pl�����-+yCH������L-������G��B�W�G�+����FT!#�������
�1 ��P#���[�-M_��\��?���	E=>�����S6���y
u�r���uq�H��T]z�d����2�Xz ��=�������_���E>#�t��S��FP��00
��?�U�3���GA�A�}��jE�������~��W_PD9V2p.�J��x��G������������6b�c2����Q/���$��g�I]�W#B��
��l���<F����q>y���a��L#0��X5�I�������U)0�#�6K�	�Ep��}{��
�h�e��u���:
�����(�^��f�������|���6Z�����Y�� g�����(@@b2}g�|�!�~�nJ}!���/o8Be� ��A^f>)����uc~��-��+�3��ok���$��!�c���|bGpy���Q�n�4���
r5;���� 0�,a�k?�eR{�W )�g�9���:�NfI�Q�O6�:�u30���c�O����5Sf>�����l@~��Z��2*��*m�xS�����m��L���,uT_�F�}������4%<��u��R������6��qW0q�X�4
�/g����6����{9MM�	5r���%���� H�4�/Y��k��E~#�4n�O��,��oU��������X��o�\�/����
�O�$��-��H�6H�����_�3���[�$���i��4
����I����gBz��h����d�D=7
��;����D�����TE%D	U	�i)8��s�~ C��"�i8`���MP���E�f��+��dY����a��3c~I�]Md`6���c�g��I���l���B`�i��UG~��#�Z�
�����b��d��>[T[L45$��#��)Uj�V��TM3�?Q�LC�N�lO�;������Tz�j>��
�8?	gp~�8gX�'q)^S��|���-h�8?������Q�Q��5T.K���������g�$�&�R\�uTi5'�)!R��)��X?�����'P�L��h�J�Q�pt<i�o��6����#M�hkb�8��KI+�CL��L��M��n�7���h�.`�'X��4/lAJ���K���s����U�����"�I��<�N��J��#�H>��[D�#y1��O2��'�|bVPo�L���d)4���~�P�����B����i�@��J ����b$*��N�[������	;�a[�4i0Q�u�"K>����-�[�JV���=�D%��x���x�~�OtMP0Q���0�V���P�e�����e.@�>�fZOYM_�e�0�
3�]Rl����#��T� ����5|�
HX�����Pl�fV��{������<��]f
����[V�;���
��_��A+����1���G�]r�Ii�C���BZ���2��
��-3	���x�IPJ�"��L����sulu��eRa�}����r���k�}�k��������_YK���aR=�(�����eRA��
��V���X����!��2����I����������N2�j��{ a�}1��D}�+��C�K��8���������e�@�x$�_-
�CQ�I RzR��0$ZDw���~��`Z-zE��}�l��a��W���A�����{W\b����'������zC��d��G�	h:� d5Q���"�f��hF�?E6�t�z�=���KF�_a+����2���T��[��	���A���W�yn*�2�]���e|(C����B),�7�������D�|@}6��1���rKm���������>�VH������2k���p ��
�O������|h������A����6�9}�jH;�f(��v����d�-a���J�c�N�c���yYw��
�������+3Zr����=32����	���#�e�_�|rG�`������q�0]Q���Y>���2q2�%��v��\�q�+���mX����I[W������_���b��q��
3�~m�z����v|���a;�W�|����i�..�@�������ce�g�C���3��I���J�X���@'fb��>y���n��V�x���|E���������Y|v����`u�x,?����!�����!��&W����m?G ���G~#|1��jI}$���T���I ��6���&t��*�A����|A���y%X����#y����`	2�S����>rT������M-��:.�d�i�S�7U����*,G��'	�����Z+�2:�m��:���S����������j�Y0'q#���E���-��������f��+��C6���_�i�c��}v���.b�))��g�/����Dx�6�s��l���o���5.]���z���O H��Z�����m�_���,U������d����44Y������e����w���|������������0����kK�IZ(�	��+k&�Tm��.E!8��@����$C��`�#j4t���#��T��p���IP�rd����;�?����0��w��_��>�y`{������T���a�@�E�"��;U��z�G�s7S ��� Tx�.��9hM�>�yi}�F\����)zV�W�h���;��
�&��__�
��s����<����y��+�����'���@~�)t��&*Ae����\��G��t������":�m�@t������'	*���!U�z����^��v���v�Q�c�@�U=����n������\���=?�O2&����p�=*!�L�Iq��l($HX$[x�S`=1�T��s��P<������$���i;_4
:��7��/5��DY�El���UH2������Gv�d1� ��V#2Y����huAS����������������I3��V�<d��T��d����dVAuw�l���d2�p+�#	<j�A{s!���_�
���d��N��(>t@IF0y�I,��Xz�fX���`E
��6���Y�L#���3 �v���G"���_Y��4�y��D*��
(�p������Nu7j�?O���cfC����PR[+
���%C9O�3�SK��J�Z�Ox�-�&�T����Z�$��>�*I�#�U�T�q ��<���JYI�zb$����g-�HxL��Z
�R'������s�U��W���)�QOB2c��D���c��4j�qJ���qJ��-'0��yJ�{U�5���;A���!����9��e�Z��A~)|Q�	��(���v���ut�;F��V��~���:���������e��z�N<���M�z�	8~j�����eP��������
Qx�
����BG�
S�O�����+�A
)�R:��%S��vdh����� ������ �"Y�Z��I�xw4�?F-�?�HN�����C��U��lAP���_�����+[��f���1�/l��Fh1���*�\V�
c#���y�)�Y�r:�	"&�'��hU��G�}E���|q8���N���J��Vp����?F��BI��������{��y����i�?('�����P��1��[P<���B�'��<�u�B?�>�����Y���-E+�g���[�+,�����I����=����}�����N<~D�j��)`l_�(b�O�����Ia���9��`g�e�!�>�?1��7����p�AL�$ Ol2�+��Ot�:�������=����P`��N<���+����
"�<q�� .�9����8��R���^��2��R��?�b�{���vV��?�]V;�|>����aW��P��	P��cc���Dr���w�i{v�J�!�|�TS���������@W��i��2c'7���X�K^M���?yF���	�s��#������M�d�3xo,��tG��O'���r�&����D{B���8���D7����[���YG�y��������x������������
�rJ�w�����:n6Q��l����(�%�����Z���\�s�~2��M�d'�<��N�r�L\�|�����DW6���,p}/Y�_��1����Vs{{��'$�C�����Pw�H�oQ���G�}dt�?��p�
��I[�����:f5�k�X���6�+d��@��Gm�����pEP�����o��F��B�^f��T��wP����J��&F2�%���@���<I�U�pAyf?&s5F@B�L�h�~��7�0"��Qhn��U|-�������[|H�����v��,�����u�~�����L��&��;�
� w�S��TP���_���<���m�������&����1��m���1���)��(��^'������(p�Ln��~�m�-�K_W�Fo6�"�!����7����L����
�����0���h�_��y���������M��Q'��wp��>)�	�^��x<�i�GI�PA��;:V���	��)��������������Rvd*��"�Jj"�I�H���Z����6F�u���7��3�����jKq���	G(�Z�I���15��5��<�t����-�92"��/��?�P{��U��;����.���d�1T�:��H6�������]�0 3D�
�/@��^�J]��UT&���1^������W��f�3p�H	6�^���{�����V���^���-�d�E4E����K	���x��r��:��AJ�?��X���'m�yE����&H�%��N\T����,�LF�����D 
t�q���72��%�R�c��V#��y�o��G+f�tq�W���I��ws������K��z3��S��2-�hk�p!,����&Z�
�N������0��^�X�*�c���2F�r ���%�o?����A_����K9'_�P�L69����
&@E1�_��M��Ny�+~O��/���,��g������LP�`a����z��UEHC�������g�N�k:7�|�%"���[
-���L'p�~�c�����<
�9����}m�2*@�(�6D���O1��l4���n���-����hZ4���`��}�a~���u5���P��H�M�:�V��[i���6d�������g�)��3#c���&/r(���Qm#�b$�Sb�0y]_g��V���
@��)5�zQ���&A�J����A�����A�/����|4gF��f�
4��u�q�s6���9��4���3{�ny�;���� ?;���&��%��sn1�d8 �^[�:�A��{o�,I��D���NIL0K�������d���z_ik�r��q�QG��#_	��T9�S�S"��&xd�� G���=/L����nr�*���E�$mi�{D�S��3���du��2�/|���i���,B"����������y����cz������B���w+���>`1#�S��>V�n:<:�|3qX���_!��|���3�������3��(��!��$�)����&pf�1�k	@#���*v���n?������.��pZ��wE�pF�Hv-��m|?���F����RN1�����o���S��G�zd#t��d%�������H�Jh4����c\��w��^�`�����-����c��,�����?���|F1&�W�����%�=K���kEiI��	 CL	YjHE������?/+�m��4���
>E����f�l����	O������+��4���%�l�T��aT���h�I����n�_~/yP��� :���g%>���lw�!����3p��JE9>��L��i��.�
���%.P1K%�����V��|	t�(��kp�v�#�S���$�W���,���������S~���C����X=`�"�G5G�I-^�HQ��n���SC�"�i�����d��������]���O��n@���d����K����,9��K���G���/GV)�2��;l-��0R��vz�]����%&R;��!�t��+Cw�U���5h�|�4s{G�_� �����~%�Q
����11���.�5Nw�N�Jk:��3d����B��j\_�&�Z�;����� ��� ?�S
��t��Y����j
{Q5����m����fC�v5��bD9!
X#�L
�/����������_e�H#-B)���0�����j���$�h*�?�N�$�4��>�c����vw����T�����~�z�M�d	7�/�.�)D!Wc�Su�"�:��e��N�zZ�_5�v*���,r���j���*��P|��j|��Q�;������<�H�`�_K��XZ�.`	����<�x�+�H�B����"�2x��#9�H�����Lg�wL��)l�.��E����b�Q�V�������s�v�+)W$�%!+�������RCl{��7M�_6��1�-�����c�#��.Z2�4����8@y��g��Rf�B+������9���s�~�3 �[�����~O�P7��1a����?	=������AU�������d�U�Wzk4��L������B��y��k�+pj6 �u���Uo�#�F'#���������o����J��Tb_�:a!Pk��T>�^A��4�?�+D�L�q�i��
� 5h����'g�BC����D�����3��Q-b���
}y��
%6�~2hY���3
�X�kI�����O���z�u���XE+�{(VE$W�V��G�2�*8���B���;$(&�Gj�����*��{z7���s�MHB�������&&��&�	/�*��u����'�b$9���H��B���%���@�-����*���%J���T��H����������
����k�d�4�	|]���=q��;9��OND��N+9EH��&�[�i$�b-)a��A4���q��?�]��$���d	��%4*7p5h��J0��!hA���%����s@2d������o���)�f!6�%/��j�jS2Y�%���
j����@�*�[���<�C�J��Q�W�=������5=-�����E�\��DUg��9\,��bd������!f&9���;S(�N�L�0��\��������fAn�������|��d6�A�Z�$�$pe3���u`)n��Z��epG�V-i��	� 21�}/����[�P#k��P�M��p����dAs#�`���U������)��_�	R������������;nkC�����R�K0�f~A�,I>Z�:��}U���v�4hC9���m����/{���iD>(S�ei���=���� ��h���3P;�vj�o&��}�F�c�0b(��k�J ��f2BU��}��$�J3-!}����=��8v8
MA:�Z�������M�������O��\de��STt�+��QU.��6S��
��8v�!����a������DB���	m?"i�(3��UT�|dv*1G!�J�(��R,%�B6�����/��,����c6��?���l������"G��A~z��hb�J �&���HT_~Id��}�*�%��iY �4!��v���v-�������^��
�zny�v��LS�!��'���d�/x��S)R)�� ���MS�D�"�UJ��o�B7��V%�^�/���'��`Y�	r'`R~�Q�Y�E��`u���K4t�0�@4[�|�6�M�y�I�n	��� ��ffA-T�i���2� ��D�&��C���������p�i�����Z�Z��?�up#����\Yt��>���M9t��{��h�o����T7���2�x|& ��`�D�	B��Zu��}28}������0���[���$.\=DC��a�����Y�j��	��k	����12��PZ�������� ��� 8e7Y��K�^��M/Y�n�+�!%t2!�qu�\���vi�g�K&�	�:Q���l�.��t�Y��JO���%6J}:��C-�V�����Bb-t�y��HG�i�B1�� ��d���=7�:r����/ '�n"A��>�9�@V=��wts
B4d�#m���$@��nbA��=i:��p�!J�g�&eX�9������.X�,C�����@���+;�$�q�n�Q������w����7�o�-K$��S�]�:��ub�����S��
��I�a�,�-�C	ptIF?����$w��&}����U"���`�>$L�f��
`MOq�$��t~��Qy�H����H�8>�(]��4,�D��iy2j2�D��p1�6����1����E91���%�8�2TC8>M�}��5���e�$�Eg�?t�3�������OHT-��I����� �#�����e��7A@����+`�,, ���>@��L!�2M^���$�zc���IP�4Oh��E���D����5�����9�8�~�K}��6g�Qx���Nx,O&Kqz>������Mo�<nG����Z�x �O��e�0;��=v�|��	�'R����q[�1��_��"3���-H��Vm�:rGO@�>�(��'�G[��H<v���wt�~a�r�/[�h�x��i��+u�0-D�w�o��N���e�f��O�>rG��*:Y��g�h1�hq�P�dMn���s�Y@I��~$Xd���4�����W��������%{�t�8�'>B������P;��n�H�@�7���{��Y��]����d	�����������`E[�meU�%|����I)�����VS;�c,���u����yD&�Mbk�NU��#-FR��m4V�F�az]9g89�J�?���a�Q� ��q�
���7)��6D��D��U:�P\Bp*���Lj9��s������m��,����`��k����O:���q�k���]��%L`	����U�
\~��)G0^�������<=T��M��N��2�3x��3�Z-��������"[p�>6�$���?����J�
Im9|8Z���D�]���ps�y�����
�����c����~dmYo��G�V�Z�^�y���e��3Z��"���n2Q��p�����d���#.�4��F
Il>�r��0\�0���h���v-�{��V@?��x���PX���a�d�
�������W��������0��j���~=��F�����/��F�]�hN�����?}W�;Z���gT�	�G�"9}�Z_��'-j��0B����F|�t��\��>j��# �,����2��O��F���~T2��W9���4�>���?�-�����1���E������	����
��31�%��(e�Gw�V�
��v*�+����Z�u8MEe��Yr�z��~/�C�M�7S=X�$��r��YZ��v	�o
D��Y��sk�D�;�����`b�u~�i�
��������FC��H4%��u��&��@'�Q��qq�����V��,�a��ee�FY���J�\Z�>���JxPW%����I3���3��
�c^B�n��Dx�����WJ��%���E����`n��DY�*�M�R���	Mp����f���AXD��5��G�D�'�-~}��B$'��#���5���t�@�kL���=��0����}Ld��2*|����Q�8�-��pJk
�?���=N���k���`=�.Q8M����mZ��!��T�S�=���#2�1�n
�G�*P0�������i���������|�2�D��Be>/�8��r{
�_������S�>G�b�FH��	���{,5�	�6���8��cF��B��8���m�=�L@�i��;dn�.�����x4�1��Z�]I�7��7����k��	��6_/c]�XgN����e
��3AO��HF[�� �PO�����
<NW��t�0}���tC�D�����lFj�G��1�?�V��{:8�����M�����TR�N��8 >|�Xv&�������a�����iA>n�~ y�G}�|"���p��c��h�`:���|��5�W0?���c���V�����j���9e��h<Q�3:9�<�["����(�b:<���i��I�|���P�@6����=v��g��]
���~��o�S
���'� �F��`
���/VI�A��r�/#y�������o���N�,7��
�������b���Tg���+\� ~��UBB�1j�������tu����i:T��@���8�q�C;3�*�{k��e��e�t��$/_$�t���Dn9�"����rK����9�@��L���/�������[�����d�f�H��|F���������zna^G�E�����J���6/��%��;D�����������:�D
���G-��xx��`
�|Q�%�Da���Z�OD��57���HX�i{l)�q��{?sL5�YQ�6���	�m�(�v���L'����^���2���he�x�edJ �8�(0�]�{9vr�pQ��Vv�����fhE;ETR�/�������P:��z���D�B���M���p����Lz��	�h��}*����Ze7�N���tA�)]��a���>�0l�#�����1U6���F�����;�\N ���\`�N=����~?G���'%C�/G �D�bh]'<D��]�(���?5�"D"�9�j���w}[���Tt� ��#�Sze��_[��S��G>
4=�X��?I���G��^��Oc���R2�p>�-G��j��X�l��L67�#P����,�M��(����1>�\�6z���K���4���D��K�C)�=�P���:~@�~���jx�o=a	�������������	2��>��E?Z���T�e�4~���l��K3<�m�l$��q��0�qH}%���O��}__d1D���>
U[b(n�}���������;���L;*<�X�'��&���	u��i��>F��~A�ba5��^k]%�X�����#!�t���!�I��DK,�VYB�]%cQS�1��r��X"&� �e� T�;R�r�E.[E������=QKf� �Q	c�L>�[���e� �����+��w�L�"�BwL�����?�(� �
�N�	�zP8H���"#@������]����3��]<�Zf(G\�"�9+U)k�`��3�g�)���!�B/s	i�<t�g,z"�N���#��I�M�.�����n�L-�
A�E�������>uE'���3�D2N�����Kd[<��C��Ct������7���a'���E��������	e��p�3��F88fb��D>(,��\�<
���������Y"0a�WV{�:K)Ym#Z��s�'���i�S]�W�4�7�w ^a|E;�L1���,r�>7vX�����,� W��dc���N�H�����<�?�i;��C�@�����������S�d�������D1:�� ��]Z����\���X�CC�Lt��T��M�J>�����/�j�����]H;7��x��	���I}E�%�w�����]M ��~���q0(��}�<��Q�m����iQ����e�����]�zx�2��3(����{*rkk�.4�z��h��������?��{����L�A&��9e@tsK'���Y��P$��{-<������g���|����M2�!uD��6�3
D�&�h�d8��a	*ypjH8��P�dJ�a��X_��M��}��N��7.�V��������T<�a*����_���)SDwr���|V6���'����N��>�=�L�?��o��mI���Q�R�_���v�}�#�i��w3��	
��]e�Csh�� �.�5����!#�����l��Q�F���w�
F�o���s+Z�_�q����:���-i��f�<r���o1�R���&����N��6�0=,��^�]f8����:�m�Q���r����N.>�R�'�kO@�k��$:����`�������{?�o��(���y���d]���Y�7��si�z�����SY�$��0����<�QE���I�"���]��\=-��
20�����p�#�RA��o�����(T�=��F�J�@�=�a |6
�i�
Q�h�W���:���'�<��i���=�0!/�i��orO;$�J��%|��fk�G�%?����mh���?��b��{�w�B��f9�%���_���jz-��?����j$�%[�C����>�J,G�sD�c��E1y���Ik���mG��D�FL�6GQC�~�+���6���nk@�KDZ]eb�A�6��q��9���:�:�o��c]E$Vh��U��	��Gh>�����������N���=�����L��$�����E_�x�2<���&����.�N�*�!(��������G	�=2���N�&��D����z��z��3�����z�op!X#[d�=,6 ���������%�<�����w)�4C����2q���*H��[t�{��B�X����5��|:���n#��>uS��=����3���*�`����I���_i������B��i��AhJ�����e�g��lO�����,:��J��-v�hu�#7��O���7'W���y�"��`0c�h{w����qslc��$��O@�[I)����P��5j��k���OD
�,PohVYI��~-O�	�J^Jv��"�#~&noyBE�69r��S�*���VZ�w_�����}�I �6��r9j��h��B:����q�'��O�Ew� �[t@�o[�?B�b�`�O>fS	��=qp
����UE�[���>:����Hv�g��5*�o�r�=q��wy�����-��<�����%��E0���Q�u����>�<{1Df��d;���g%���Q���H�DD'�3X�0I�fG��S�Dm�@~����������@��he������h�{����%�O�V���:�~F���a��3g�rl8UrZ	V��a��,`�'l��g��k�%Ob�����M��L�
�;'���e�u@���Bq10N�9	Fo���p�7U^�	�������!�>N�=O�
�Lu�0���(�m��#�SXI�&�����c�4N��-Ah))"���g������fG����5c�xT%J�md�����<��k��xE5�g�L�[�~G?\P>���="�\!|����M8��t��Noa��<1��u��;!��P����r�c|���,?�D��=��}df��O���c(+`o������PK�R?R:fi
�7t"% test_data/4_10^4_rows/4_many2many.sqlUT
�h`�h`�h`ux����O�>9r^����-%�73����vhX��V�`���Y�������1�b������E��
&�L2�x�?��������������������_��/���?�_������?��������?�����?����������������
��o�����������o����������?��������/�����w��_����������?����������_������?�����_�����������_�����o�_�/��2�o����g��7����?~����?����iz��������_~����_�o�������g���R��)��[qh��~��M�������{�7���(X��O��+�/����������7��b�[&�:k��9����ZC����:���9�����&��=_������|z��w���&�|<U����7q�o'��$w�������U����}o��:.�A����w�q[��^�;�2�D�mZ���q����3�3>�dvX3!�c���o����"��2\yX�l5���I�`��>��MZ|�����;��������U�����E���������~�=!�y���{|���p�u�����V�{�C���������M�K�l��}�m��q�'N�F<��'p:<>��\X���f&$�+���o^�g����|��5\�F����
���NQ���_M�7�b=x�������P�����a5���f�������w�
�����������8��S�������r�8�o�#J����g|���
���+�^9��?��s=�A�L�q��>���V�eC�>�G+���qz��_Q<�k��m7�_f{��Yu�Q������0��-w�`�>�t����_� ��f�c��*G����d3����A?�!>�p{yU��6�n������5\S�x�PM�����Z<a����_������4?A<���|����	+	3��+���E��C���It����k�M�qtG�Ya�xs^��73����g�4�\����d�6mF�r�i���a���/�}����`%�9�c��z�m��XX�����-�����n*��p���	xM��c��	+���:p����k��	���g�y��`����~��gu�m���b��K�����&>��/	���������7+����AY;��#�.����	�\.���D8-��3�-\x)�V��M/�������\L�GEp�=f�|�l�p�.������
8_l?>W����������������������I��F|_�)��8�������P��8��������X���eon�
w��8��\��K��BB�X�j���D����k0�g���{y��GB��J�bspQ�����)�Q�Q�/s�b>��^��OLd:�?���$���g:<��&����f���G+K����pf�
x�&���Y������ac��n�XI���\��>F*�:��c��0���y�����]y�������|c%�)���f9<���n24���_IB�y?����8�l�����nv\G�8�y#��o+��t_s���}����q"Ow]���.�V����n�����l�b��M�e�mz���%�],)�N��M�����~�u:�?Ny��
�fx�������x|��]���&�/�jN��T}18��)��8���7���u��5�	�8���q6r"6�psYFt��K"sl��G4��}��ka%W(�u ����=L7!�VN�fn3�&�z������"�@�u�)����4�&K>����J�����E�X����h��U����&-���8���:��H�zL�o2R&�����!"��pK9#����5�n�r�r�����F�����G+9�����5>\7��I���i�����T���3o�.����A\�}W�z�y84�q�:�'���3���yw�T�Z62R�u�P���	1[q�C��)/TWJ4��pY����I2��55`+�7^�����B^A�}�G��E��r[�h%b�g���5����������H���W2�G��8�E����'�����M���������:T��O�?�8�e�+�i^d1
+�!5���0�u�h#�T��8!g���J)uq���K�������ar���Z���d&}�!��;��y�~H��r5$dS�=!g)��	���$MB��<U�+Y'l��>Hu4f�\I�|�P���;���u�Y.��3F[�X����(-�j��!w���h�x��*J+.�]����l|�>�������@����vY_�Mth������iI��XrvA��1�<?\��L���gC��='���)7�xS���Y]Q�8�8i
�!�iy�
Q@^J�MFo��!���-���]T�T&cBR�g9�hA
Rm�!�Vdy
GHR)I.�����4�&�9"X%OS���G��J4�LSD?l����J�2�nn	 ����!�P/W�P����L���o_�M4��&�/^���n���k�M W�%��6��T��!��FK�4���&=r5T��~�����V.�?�R�j/#�����%!�2v�mXW�NR��CnS������{z�Y��J�S���iJa>n�2_|���p%����C�R��9��_.�����SL�yB����a����)nQDEU�:�6E���qP���np�:cQ�kYal���bj/ ��h�T
������!�j������O�����zw��L�ds��%��!��l��|����\�0$c��������r��-��,�q]L"��vj�c��3"����!w���<U?F��	F�ZG`��#� ��|DVU�"���l����������r C���*��+yTS��q����x�F�p��YA��T9���/(V
R������$HS���C��mU�i��
 �k4� ��j��]�Pg�&	��\����h�b�� O4
y���I
���j�
��?���r��U�Y��JM��,y�\4����ZK�y��e%W��n��XC��d!�zK�F�:e(�j��oY/w���bs!S~
��9=H�
[�9����q'�\2�%X�P�_uXi�3�\d�����Nf�J�e��WS��*6dW���.1��Tx
����l��C�K
aBv���t-7��:���� ok�n 7u��������P������R���Sm�*�s!]VX�;B��l<uRB�VE�B�4���J�Yo��D)W�*C����l��"5�Nk�J��cc�*�0F[�<��.��d(~��rn���d]�`��
0��os�F�m��t���[_�����ANa�gC����!����������E�n�H�z�i���I���(
�_�G��~��*�Z"C��g$|����G;����oA94C�W���M7��f�6������yN%\�C�&���!7�y����:�"���f���F.wQ'����pT[x��m����bC�W��!��!�����6�����WPU��������*�)=+>�.���~j��l��~�z|��/�BR9���d�{�r�nF�������D�:�`�Y���DRwQ���9�����st|�������Fa���
���������[�t��Ee1"[�������rw��%C���d���"B��t���,O�\����`������\w�%CV�v�TQp�krS���.��U��!w5���N7�C��Q�]���d�������h�.Fe���]�mUI"�U"�T�r��>ZK�m�����'x��N~b�Um��m]�%WuBu��E�T���7���r��x�P$d�Z|�6���sF��O�%7o�������C�VMK|u�h�-,����e�P�A�]�����D4lU����D��Iu	�O�����-_]�B�,	�lU�c�M}	������"�4�<��$m��� ������tU���Kp]�q��R��]�|�������k��r���[�4����P��m#��N��j�od�G��S�[U�*��/V	��,7y]���\C�|��>�_����K�xP��rI�r���A�Y��[Q�5W9���~�&���� 7��
�\��~�����m��l�Z�rA��V������r�]������(�B��������!&�x6��jr3uS��	7������6��I�	7@^��R�!��~����$v�V�bX�?���!w�l&Gr3^�m���F,W�n��K��d�k[��5����Q	�T�!/s�3l�������&�R�8�l��R��@n&[l��d�yB��ru?�NI�E���T��Y��F�w��/��e_7���&�\`�l(����:,H��w����j��BI��IX���d���C�����a}rH�MB����r��z���C`�Nt��j����d�liE	�D�~����*�Q��t{.6���-����j,k�U��d3�+��}��~�����<-���U2�k��lo����*}h�9d^&��?:�&-f:��w���dB��>��������5W#���H���WR������j��@^&�w��S����z�d��_.u�y�y�l��U@�����\u
���"Vj�@ �r-����-��&��T����������H�'4�����TH���g���#�9��,��6�~��'���V��	�<+qlLQ5�a$( �x���x�rS�u�C������H�F�l9��������������'����<d��^����t_�i��C6T}8!���!q/�����|�OX���T��lFA��`�����D�s���
y(_��V��)�����������������h������\�}2
�*�����]E �Riy}n���T�P�.L.����j}�d}3iHk���5)����![==���a����� ���k$N�F�fr��M�`S�������u���!z�!��^Kr2������.��l�\��"<���\b������!w��&VOlBxV��C��]��������(����{�<�*"+����T>;cU�x�]!��F+��D���:Y��3�\���jQ������!q�^�\���X���g
�j7�f�[����:��T���:�<��r@��������?/���(��p�}��g���p�P���M�p�p�]R���w�����n��Q�iv���foJ����y�|��z��"9!�iUrU�b!7����DGwV�@*�HW�R����!u�n�C�&rS�@�j��9��g�H���E%C�7���0��?
�����X����kT�������F%w5�������t6|b���!/�b��r�u���6��Wp�(:f�	�����s���i9dk�A��<���IC�/tdp�g3D`%�����U�������Pw����\6��\U��h����]�cr���E<v5����5o��e��5����>��YD���)�;��b����g�,3���J�8�������]�[1Z�q���'�'�[7�e��k49 �F����Oz6�����.�dM_K�nVv)����}���'�\�.�]�l�O(�T�k�I��=�i����6�J�:l��1��(�yB�e�c�M�m!��_J�l���z�����8����6
�T�	6��P5'!�~d����2dH�������#��G��3l��s��.����zYqT�Wu���i���M����5��vR��UO��U'��j�]uv��e
��q���v���l�
�Q��_�*9�Mb<Fu'��<�gCq��"4dso��*�{^6I;��v���+9F��=H%Ar^w1�zi'#�S�
�����!f�U��Ex���n�BA�'��fa��g�D�y/*J���9�T.>*�*D�n�C�S@�yB�)������:���{�*�<�1� >OK\"�#rW�W��UA�U9;!��;}��8p*���$�m���D �YnG�F�z5���,k#���`�C�S��T�-��~_�C�7��~*���u�)�z����P�dHp/��oC�X���)�d@��8LNW2��b�'��w�����-_�m_�T�T���J�d�&/�4IH�9�'�-��*{RelC�Z�,	��#`���PS��a����S�����UT�-2,y��#��&4�I�e���;���������C� �;�gCQj4r)�4���8B���V&�����%��!�r�n��f�:_krzY����v!�JWro��lY�|�����%���l����T.	��|"Gf���v�~�&s  OST��/!�i/[��U�gH��j��x�������T�W��I�����;�*Y�tm���$3G��AOy��C<��� �!l9���b��!�r	��\2^�
�i���T���W�mY	G�_.d3�5���'
�&��R?b��\n�E�zS1��e��m�"J��Z���Mp���f*k �zPgm��-�������)f�������E!������O~xb|#A
�~7:EY�\��xv��U��A����tV����Z�4w�c��D�-���Q��t/HR9��RC�;��
m��9d3	p�f�mFD�H~@��9��)�6�Ky��7u����{9�qCZm!u�B	Z�=0Zu�
y�m�s�?�&o�!w# �L���!��0:����T��p�z�~�!�<��
}��85���6��N�C<�:'�2�r�^���B��l���m�i�6['��!��� ��9(�<�4�V�9n�b�GLadw.�uC~���Oo*���d��A��K��b��6W�yZ��R5��r����&��M�V�������J���6_�KJy�l������H���_���v�<�"�[��7��

i5���o������RH�i����#�Q�Z���TK����T�������f�:<2������b!��P�S�i�j(�Ry
���=�^%"����A��0H�) ��b!g��i���v��M�tVoK�Cy��V�]�������
R�#"�r�V	����*E�X���l*��������:x������8�����
��V��,�"o����r0���t!�D��!��1����k9d_��'��f��!�
�����)�]Y����5���]��i�H!������1��T�b�a5����LD�X]�":<����B�y+C*]%�C�}��.��.����@:X%���n��	�U�&���U%�>e�����d���cR�i V�~�f���,�l�"V��BB������6d=*�T�V��TKH��d=t�s��v�C�_	����K�����p����M- ��L�T���J�n<g��o�S��e3�B�B
����5��}�M��!���@�;�1Z3��e��-������T��?6��tp��~��M7�-:���M��V�E!��r)���� ��;��]UzcS�cS�r![�����{-��Tn�����>n�a��9�4���K�m<���f��$����<Tp�j\9p���wU���b;wA^�[=�R���x�e���wu�U�Ef*��F�
R��l�*�����bR]��\��r/k�nCQ���(�bl���5�,�Y&U.�>}���F�C*]^�z&�PV?���`�%$0��pB�]����W�E9xn�W2��}��))��)>?\�j���}�,�Q%[�����C���IO��*_��Re2���6#%dW�����I�K5��m��R
�r�SR���D�W����#>���J�!�ug�����w7X��[����f�����!9���x��)�7����KH�cR�6���������5}���:'
�`�nS~�&46��KW�K�*����im���'��6�o�n��B*�~
A��(C.*����*�FsX����%����g���w+7g*�8d����}C������^���(6�7D���(��(�����7s-��B~H�X�
%h�������Z������Tu>��p	~[=%�h7S�y���`����dr����s��������%C4m������|�����!.L��E���Q�}w�k����ju��>1����\Lru�r���uE�U�fD@ U��a����r��=^��j���: �\/@�mYd�� M:6dW�hH����/b�*[oC�n��&�^V����m9�E_y�K�6W�4���P[���������-���T�@v��<��.�!w�6���KmHU�y�XNHVCi*� w���/�������u���+�'����>BWM����y��0������pme�WCd���v_�-i�����r	a����&�3�P'uLN����d5�Z�T��*�)^F-R�a���$��3��� �<���
=^��������
��6���z��y[y���[_H�!�0�1���qd�X�|p3�1��:?�\�
�-Z��X�|_�����_�
��B�*4���y)h^JH�'2A�j����.IB�@�F�jy	��p3�5�Tg�������i�l�����
�%2���]�
�3�4�aS�I��$YNIl�;nF�e�*����Z}�����xp���e�V;l����G�D�E����}���x6DB�Z���[��J����qr6������R'����0�j9_LTI?��q+
��h�A��A��j�F�rU�I�-h��J��P�zF;e�<O�";A�TH��
y�����Z��u.;��������G��xSF=R�,@�F�R�V���@Z#%WJ8�--��Ik�<�V	Y+�T
�`rM�9d7�*�kY�E���bvH���� �:�6����#D�MV;�5�-����Q��y���l(����C�����
��?[��y�;V����<�!�O>t����:��>O�";�A��"H��r<�"��!�z�XD��I���UrQyRH,�U6��/�����3��I�SoB*�r�.�V��������l��/����~A������Q)n��N�1K�L����^�jB=G�*�+��b8��<'��2@��q��Q��� ��m����x�����=UwJ
}�Y)����0����}�!wu.�^���*���k�a�a����n��G��,_�f�c�F�rW����D>Og�L������!����!�+M������_Hm<he�R]�&^O���tSaE�����kL���7{@�L�x�����lC�v8���@��3G��6:��4� ������V�tuY��!m��!��f[�TSGa�4x4�`������5	���h�t��!��#����J��Xn��J�Au�|,����c���<f=%`u�G�Xem����WIW�Y/��\�j{4H�Z�D�����[����������#�������f��U��;������:�����
!��>��b]%Ou�
���,�9%�>O(].��������
���P?"����_J����V�r��2�u�r�{���2��/C�*�*�Y/�9����G	ZU)`S-�hH���/;�[2Q�n�� �D�*)��[	��i��|9!W7����xn���M��U^%���[���J�A�ZE�B:�R��m=[%hu�u�V�K��A;��(C���@�I����N
�/��z�I/{5�CJQC��m����J��r9�'��w'jOj�%�^�������p�
^���A!������w��`�R��]_wJ��C\���������\^L�j�oC�qo�>�nK��xr�F�rU1�k������v��Y� $�U�Z������S��:�A.�����YI����~�6�$�Zw���v�6������v\����Gr��B�*}/�\��B�,�o�m�y��9�pO��p7����&73����������%����r5	
�����T
��g����*�!Uy����!n�1)����J��,���l<�X7�b����}��B/������e���.���+��W��Pw������9�*�<�9��J���z����"�\���$@���*y���{����m�TM�!U����C���Ur-�8�(tw#5HS�y��������Y���h^�R��\�N�����\�T_k��R�yB����� M�
�A^��r1=O���T����9�B�F�i<��=OK���(J�H���
�
mw�����#fr� � ���V����,�[a��i��g� �����>"��������!U"�i�8�h��}�c�ZP�8�\���P�����\EHsK����I��\�'��q�8��"��WAr]yV!��#��NP!�r%AG8]�>C��8!��i2��]��B�����6�����gC���%CM��@�* ��|����V��P���'1;�����{W���@��W��L���
�B�-)���j���2����}�'f3�T/ss��y����e�3��^�K�z@�u����������vho&1�a�!���}[m�9�������C�Y��&�a���A*�J6��5���Ub#����t��R�~B�j�G	��~�o����r�=�.h2b!U6����y��
/n�]�[�\�w���~�l���r.�|����&��R���Jgy�e����n�v��H�������r��m�
9_�=O(R�j��
$ ������)I>?\v|uu�V�M�\��!����Tr/��!�yB���@Hu+���0��U���{��I�,s7����T`�lH�"��{�V���CA�ra����$�U�[H:��59$Fbq<�[7##=�G=Oh�?���(3WC$����J�!����N����������C.nmI�J����C��?n���
Y*E��+��KiH5+��k�_RZrn��<������o�l�
�S�,*�*�,��|"l��c�9��yZ���h��*�5��a��B�<��g=	��9���(��(lN�8�C�����\��e�{rU
���kC�����f���PV���n=��]�#��U�%`�	YW�H�*�+��NV���8J��}<g�4A�n��!�r���/R�v�j�C�W����U!���BC�>q}H���<����U�!�#��_A�3��T
yM�����E�[mC�We��������j���S�R?���h�`�R��YAk�lr!����*��M#W
y�<I�)��yB����9n�:o���J�Q���a������UHuj	���a�?�Ur��Q��+D��+'�����"�
 ���s���O��z�L4}������N���P6nu���p[~8M��Q�U�!�*~*����Fh�u!��bS����E�����\����C*�m�SU�"\��P�5Z�}�[P�"�����	�j���eD� ]�����f��Z����pQ�Ua_T�U�@������n�����F��T�SU�!#lf%����~G]���� ������\u�8oK���W���B�*�rS'\H5��4�	R�SU��|�S]��*�!����C�u��[UZrSq�A����	??u�j�w{�Y���]��d��gDg�y$�Yn��#���Cz������.��J.����*��zt���F�=)!]tY��;}|����F!��Z���UA��G��Q��lW �4���.�s�6����1j��h�B�*���\�]�P���<O� �-n�����j��9�M??� ���R�/���W�Jf.�{����u�{���.��d(�;nZ0QQRrU�����.���^Hww�%C����lS-�Y�l�-��9�W�_�q����
h��U����ch����w���T���
/H�|���t�� �W}�v������X� ��rn-[�9���%iHF,r���������I���Y�5����g��*��A�7�=Z������9;Z���	�0�P��,�*��>�,l�<���j�$��r������(�4J.�G����+T�9c���q���d(����r5>�a��g9�,�n?�sz����n�%C�L>�4�_�*Jy������DC�$/C��6��r>VT�z�����C^�s����X�r!�zYeu�U�b�����r�Wtnw���������I3�J��ZY������V�j�cS�m�~w���p��M���GCs��4�����n2?��$v�V�S���Mu�y��6�����n�2a�fS!U� �aR?9-��~�����5���rH�6/(�5wb�����|�91����:���"
�,G4"�;oY%;!�Y��~)�]� M�(�Y�p���5Wu��:��:D�Z�a��[q������:u�\MT|����=���;�T�m�����b��A�UM�(��&b��PR�n�n�;�����%��r2�5����n���x
!g}�:Y�l�l�_+�i�� /S���}�M��6��-�	�]}r�j?����C�u�.;��p M�d3e��z�*Q`��"��c�*��\e��>���B�!]�T�-+��.u[!g=�gC�Tw�l�\<"�������&��.~r1���R~"��F	r
;=��jj� �L�*y�����|~�UfOC.j��4�`Y�xo���A�P�y�zr5u1c�*��M��B�So����P��[�l�X�� �+9^DW]�5J~������z�v�g8l�����v���R��ys�F~��V�����mJ� 7����]�y�T��E9���c�P(5��:W�TM!U�}�����e�0B���h�TU����h���
Wu�	Y��w�^�fmI�.���I�j���O�T��5��vI{�G��_��DU
�!/S 9�@?Er��!���x!Urb�*��T������z�Z5���<g�V�R��TM� �:'�KV���������D���B��r�I��Tu���Jg�T.!��S-/a�'�U)H��]U�t.�����E-��,7��#�*nK���r���_�
-r���QdXw�=6�_���d��R?�GMuW��N�gC��TJ.��6��!�Wp�~���������Y�
���x���D�w��m(���S��us���M�CNR`�����Qa���y�����������r5�����z�<-�]�K��z���lH�3�T�S@��9]P=?[6B�6A��|�����M6%��%�/V�O��j:9g��HSSq��	���K��T���/�#������Kf�\6;	M�x��[=NK"w��	���!��#���iP���^Oj:�����8+�)��z7������l�LkT0�-g��>U$)�����oyH�R�=[���<�0��
?��v����<D��C������TKB��	�Q0����Rc=�����s��_?E�o�����s�*�������W�W�hb=82�n�F����q�� �$��Y�!��"�����9�U��"��r�B��74U*��S��yV�)�{��*��}�tNW����{�f��DFy��+y/�����LE�+3����U94���%���X�YV��Q�S:T���E������GA����W ���
.���E�����f�������T���]bX47l�)��$G$�S8H�Y9g�>1�a&��>!�fV�1Z=X�������|��27f���w�|�`r����s���!v�gR�j�MS(2��L��pI�3[�\�X%��.6_�\I�3:y�J�p�T/�5���;�*	��aS%�'d�F��p����pH�0����$cA�5������Aa��r-��fy�;�A��G�����XV�*�<M��2:;c����#�u*[Re�C.&L0l��t�L!��~��t/4q����,��OD�S�y��<JC��g�����R�s�)�V�C���Bn�0����`R�!U	��:/�����rZ�1������|Yu� �fq��e5���@���������r�5�iH�m#�f�!�f�����,�"e�5�K�r���%��@N����-�H�A�.������������>��{�� U�1dW�$jn���������i_��xr)'�������w���wr�G���@�U/��.B�&%c�o���;L>���N!�)t�<�Evu�\����neY�8'���N%����k�|���\��,��*;���jmy���rx����������Y,�����vGT���HP��K�F���\oW�d;���T�J���
r&M�}���������h�
R���<M.���I�r.ry�P�%*C	*�PHu��I����Q�lr���T�P����%�i�9��yV��8Hu�7H�p���DDPi,A�T�cH�_��R�N	�T�!U%�U]���+3�t{��:�J.�\�A@#A97}6���z����gC��M�8���4��	�y�����+R��|��Ae�}g��S9k{?O�u�wU2�����zr@n�i��
���U�z�&�RIcB��V�V�w� ��AP2��u�)��v���	R�jO�Si���N�@���Bvu9�M�l1i��Yw�;�:f1�o�Q=T]S!/-��Qd�g��^�{�C�����t��<D�����Q���c�7�v�K��\���8d�����������OS����^H%��3A��TU���KvZ��e��o�F��q���#���'�L���	�*��n�O�D�)�������������!���{����^b�����x��m:���fR�;B�*�}��\���]j�@.*`�S��~���V�<����Y��C�bC��n�����\�����u���C��	�!^����>Rv��zx�������n���%B�*�9�<q����`��\��X�J��U��h4���=t�!W�Sl2a���o�v��S2t'WQ����\�-�A����4<�g���q�����_Y%�����H���$��YHW��eK$���������D�!�9�^jeOZ�Z���f��#D�Y�
�M������x��)��*��Dm���!��� ����i�K��O�W��,7
/�`��uI5']���H`J^�\���`��%�7M��3�`'d�W� ��nPC�	�UrQ�H!Ou�r�����N��ICI����9M��!b����Z�gC�
B�wY �v��P+G�n�;m^�o;]��y��XUI�B&�B���d�XrNJ���*�e����.P&Uo�EFF�����d�����,7f;"�9���o:�Hv��B$;�����C���'B��l!g��*9
�d=~i�Y:�d(�_U���%��Iw����!L�V�7!-�����T���*g9�����.��yZ.{c�(��l
iI�pItPa�7Ux�� �4�g�U^)����\�!
r5�����d�,g��_������a��@�z<�&�fDM �u�Y]7��K�Fxr5eD���%�R�tzF�r���5�\R����4;�eR#z��.+f ��F�q����Avs�1l�g�U�rs�HV���'���.
���r���v�Kf�B����C\h�a+��U+����J�V��sZP���0�(D��v�z���G�	��P�
x@�����yR6Yg��;����-u����{�U�r-����Q����
�
eK2Z��s�y��uW��H���N4qZ��\�
�/�"�j!�9���F��T�~�Y����JB�^�_2�n�4%��M-!��*Y�I9Q\4Z����
�T����:b���;A�i��]�� g	�gC�	U�#d���\�`W/q��.!U^��>9�P����,��	�wEh%C�����2�r5�l�+�y�'���T����TM~����D��4�N����@���A���s(a��%���mIU�9��}6���RB��J[,�%�`rt������	������Ki2m ��%I4"�� ���g9������%(Z��9������a�K���;1����f�7!�)��T���u
�shh��2�T���D�����H�-<��hS%���<)�l���bA����'r��P���n-?�
j����j�g�(�b�l���l'.�^�\����������\��8� ��B!���E��T!����A����~��Ze
�9������l�{M��{���s�����Mt������}�9��(����\s�������<��d7Z��:�#g��^y�)t�<��kL��j>5Hu�EBS�Z!�>�X����t�s��I��.n����lF5b�t��i/�B�F�g����W��mC������w�U�>>\�!�^^C�`�%,d�n���H�13!W�VB��/����sl�yZ�T���,wFu�4�X��Iz�T�y!�a�������y���B�5/���ZT4U�@G��CvZ�?1Lu����%r�VV�<Q�TA��/b���tI�!UA�6������V��N���*L���d�������_.n��������D�j?E��~���JB�%��V����,�Dv�Z����
�l*�4���g�e��3"��:K�K��-;�����]�lS�rC���#i��*w]"������r8���C�R��[��
��p~�jeI��J
y�m�]�h���r;�NO6�p���C6u���f���M����d(�B�}��Z�}FB�����7u��I#�����qV"�y����v���?��af1��B<p�:�C'�U��������J�����*����M�9PY2�������H_!��
����#�����C&�� ���@N���Cv��!��vp�����l����Y��S��)��!�r�C�
D��>��>OK�m�rUua!�� �y~�y"C����
���4�%�9���6c�dg�K������G
�,�xF>�t�+�X%������O��^n������)���!�h��]�	�K*���7-���=�*���MFy-���j��R�O������".�R�B�<ZL�����T����Q5��M�a�D�Z�����&��h'��*�rR�\v��yT���z�����P2D�����M����������T��jo�����U/1d��&�i�,!/���4�����.}?3F[�.-��j���f�H!�K�uZ����j���]}����_������$��<+�\�����z�s�Qd?/D��[rU�(dM��*�j�
�Tu�kJ0{��xa*�,����$����K�y.�],�b����Z�.����e�]���G���4�D�J�}�4�-�n\��������P�d(�5F�f�F�R�_A���^^���Uj8@��VRE!��6?OK?��ow�	����6�<�)�`9����j&����
�<��W�[/#W
9+�T����.�V�hM�`�,K�]_����/��dw��~'���p�z�rn W%��_W4j/�u
u[���w���*6'w�yZ���w�����!�m����zq���vB��o{��H
��'A�F�r+K�_�B�M
������;l�"�k(��n�T�+���Q��T=! �#�)RG��d�B������b*H���:SUrn��hq2�W���?�����D�!�����N�!�6�:PyR��%nW?�,��@B������������������'B��|���j.�!Sv���I/�U��d�A��MH�laSm7<�t��<�q1����T�A��d��M
��;�l([�
^!�FHR9�=���z��A����rfy����}���>��.�y���A.��v�`��#���SE�O��!� #�������^*����q�6��C�_c��������7Z���+����lg�
B!�l�*��K���z�7j����sN	����j�}�6��^��(���5d+��]�I�S�����K���������kg�d=�������h��Xs�-�Z��~h
���2{r�-{��S�R���>rq?E�B���wjb����P�W@���Fb�Y�P�5� ����Ej�R�!�I����m9f���J�	�U82�*��T�}�9��W����\�l��N!�s����lh&r��^%��p�&��-
�FLR�Q�
k�lu�����l(���"��.��
a��`u�kjTX!����)����o(���M���9��}[���MC��L4cU"���8-�R�Trd'��|�!g=��!�A1���,7t��5U����
G��[�=q�Ku/�RPv���4�����w����Hh^*[�(g@n�Z���s��xH��d������Y^��!�6A�b�a�,2zE*�2������C��C�l���j�\���n;�CvM����}�j��)�T���f��	M�-
uR5�d��<lHu�R��K�a^��+ag�-���D����dY�����j���#(h�,��������J��Twl�o���e�����>OK�P�q@N������wO��i��B�Y�U����w��}�y���*�*�^nsE��2r��s�*9�'�C��������j���U��N�A���5��O&��HBS}r!�r��+r���P2�%T�~�M
^��h�BB��oB��

��&����[���.���P�_�!��~�Cm���J,a�T%!�I�a#%���!�a49��kZ,����L��������.���P"/�[@����]��!�I����[3��������������B��%��7����Ur&W�K��!U��1�)}�yB����dh�kdT%���2��P�T������v�8jmI�Z�S�u�x�zt������l�*��F@���^�q3����NpEHS�C�T����/�J��1�U2��JF����2&C�S�,T��i��c!���i!^��������mS�������K=��S����kf=	9��WI�d�����*��Z�V��	]�*K��1+&Uq�E�����3���.�r��.�*�
eT��2�c��y�0uO���`S��\�3���G�����;��lJ\	�Su���k���uQ�������������Aru�
�	=l9)����5���dgU���/|���F�rU�J$`��-���b�,d/w��GUE�!W��^��(����nSz���+"���{S�]��;��x�?V�7����Rh��|�����*V��*-���R��Ib�)��*���Qs*d/����~cn��?XE�!M�a�fC����3K�����G����$����[�U�ZN��������0�@����0�H��>X%�<�f������A�&Kh�����iXn�k�0:�^~��0�l����\4�a��t��%o��Z �07e?������rj�Z��Iv�sy�[xQ��e��)~�j������@[9}�������`U)�@7��0�z;����37�����e��$����4�gC�������x&F=X��g��%�@�foe�0"$?V�W���K#��8��@��{������]�,��*����	H,xFu�M�jIt�<����0J�����������
��&�4�������&�`�s���y��p{:�n-]�<S�����7d�s�sa4+ABJj�G[���A{�~���qK�0�`7�l1�&_�M*mTn�<k�������\l �anf���jnc��}#�N_����1��B�.��,'~�=�_��Q�2�~���@-+}}�=���`ls���fr��_�WF��1��E����)�~�N+����M5���m��
�Z�
�x��p�M��`Mu� ������BB��]����^RX99��t�����N��������I`�jrOy������1>�
��"�9��}�����<����d��@U/����|�=��;Lm]��~_5����G����\����n.� h7��]����6��0�8~�"*��=�[�Su�q�V�arp�L~�`#����5��57�HB��5�fY�����]����|q���@��������S�:�������~��IF�����6��6�>������~�[�����?����������!���'m%��������������Y�/������������k:]*���7A���~�<\S!9��,
�����r���8��?��usy�aU����e�����2����[�|��c����r2/�uy@<���:g=<O+��_n��K�����g�.�;�T��anpL!�`��9�?D>�Z���)��1��OP�X����uu��0�������s���yA��]�������,��]���8��'d�w��n��]�h������Z�����>���0�j?�������:��s@aM�Z�����x%.E
�pw��]��t>l�����x����}�T��S���������(���3�\o�arp-\z����eg�6��^DpQ��ri�aw�����������q�����i������Z�
��{�=W0X�����uw�L�`��.�������=���������-�m���������`7w�u���V��n�E��F��0�����-6j��"���;��h�A����x�E�~���X���`4���Z�����x�r��N��g�V�����@ww�
z�l���s�N_��i�'qY3���%*�x�y(C�xI�I�2	��N/�r��g�.2���R����>c��KnZ����u��%��?�"FJ�nrN)W<��h�T���cy������G��_����Bn�>��E��3�rw ���%h{Z9qJ\�r�.C���p�a��Fc|���?��"_���p���`��M
����?x�Cr��;5��jo�����d��*x�;I��������7mF����V>z���'��~}Th�Kz��v�y'����D����qG��sO�O����L�v^l���A7w�E��E0��Cp�awY
���F�b������\�4.��/qO����C����0`'/��zY������\�b�n�Kz�RCF��+4��qv��i�gt�pa������g��X���p�S[��t$���8~N�
	nwr���#~q�9�����JjP��T���yX�9:-9�W�i_�i�J��N�-�7��;�!��\U�_��N��g��V�etw���X~Qx�2�'gA:�]V��1�2�rL@�	�B(yA�zQ��:1���mA�zQGb�Y����
[�w�U���u����T���	Q�Q2���bvO��i��5���YUL�,w(�������I�M���U#eTu�����^?',(V/� ��	�����a��t�vR���T5�Z��[��^�i��`��k�(�gXw���.tUa�aU����c�����<gXW�	���wPU]:�N{����Rz�������&J?�?��9#�fk���.>z��*���PG�+�����b��g��������)lSU�#�.�4���/��#:=�T|��W���au7��c�����^������Y���jd@�z���^����]����h�rsA��e�V���ML���-�U/��v��>����AX�m���+=���gy�2z�E]��%[���u���@gw����B����PV���{=�hA�xq�|�9�]G��&��&4�Uj"�Z��\�Dv�a��"�u�E)���>tW�u���o~��N�r/A��w2�.�vS���P���nV����T��<�h��1��*�T����V��s�����r���?�*'A����eq���d��^M��[qP'v�8j�.�Zo�� l�D�`��;��|L��/r�W^�8��jD�wK�r@w�z�W��E?L>����=���Y%*���-������U57so~<U�n��Ez����A���'a����*�����Yd�]Oe����}AxW�/a�������\���zK�n��t��?<!�����lQ0�������S����Cp����m�EiS�v�l?P�&tU����*�V�bl��N�5=�������@�vq7aO��*W�l�/������vX��
��=��sl� p��I����/�\nC���������u��.r� F�8������V#G�(9Z�k��?�b�Vg�sQlm���aX��;'*��k�|&[�;M!���M$Z��:��R��=\`����S7�v#�a������NSa�Hd�t��a�}�djh�s���ye�vGDe����-v\���%>�I�]4P��vZL�2�w\��	;���)�a%*�������P�4{�����A�����Z�*�!Gk���E�s-�9�����JZJ�����|��I@D�wqkbX���t)�A�K�a�/r���h[m�C'��^"�;�e�l�wo)�nQ��;�w��^ua����;�6�:������|xB�/w�0T���qX�{P'��x=e�����y���O��^���qse�*��
CQy��P�V.�I�yQi����R3���C��e��u^b�7�D�]onX�D��`��yB����=^�#��n`_��^��]\�s��>���[��2S���+z���{��J���p(��]�c�������^u)<�|o�W������:�X�I���"����A_tw\�u9��T�l��Y��dk���a��*�]��En4���Kp�{�M�	���R��=]��\��t{fFx�5�u�A�� ���	q\�h��E@�������.�s�-Q?#��+���\�x1J\QC�����\A?��/�a�]\�������pF�r"��|�N$�u4V��y���?�B������/��kh���	mWW����lV�RWP��&��lt�G���8���}�"Z������	P����"ua/�o
�T�	!|�b6��\�'��nU	*ox.���z����:���$C����MN���������E��>s�����'9�n�?L���E���M����t��{|���UE�`���	��^S���'\xB�!��*tU�4����j9���x:5[��~��a�l��5_!�\�]F{��qE����>���V��\Uf��Nic���������u���@]�������aW�f����<�[yo#�e�^4����xlSW����AgM����Q���U�����e��$��^�����)��Q�<�*�+J���v�=���r�T2��	�T�vSN:hw�#v>V�z�+r��J����s�[xJ��5u
0@�$��N�����O���p�a}�E�sUB������9�+j���I���B^��\�.&�;�-����:������[�:��UO���A�/)h=&�"��*1N���]t<�eH+:�����=����+�[=p�����a������	@����;� �9�W}�W<w{��;�Kf�[��<�arp����D]��B���W�n����>�.c�������"T�������dL���L��+�t>`7�������"�*��uh��X��h�(�)wm4���4:�Y�M[��� ��*)O�Y����������l@]�:�G����4
ae�2��"	�����'��RJ����=���y�X�����i��R����|���(qK�M�P�/���{\]$�G��%��bKC+�U����2et���.h���|&��JZI]�o��.����@�i��0L|�e���#3>�J�vsoI���������'d�T�x�����/~�>�A�U�-����������	)�H���
��Y��f���h�M�
����A]
���z���R���"aO��Y�V]�?p�cU���O�:p�Cd�
3�W��ts>^�Y���������G�_��B��*aO������/�a���J��)���*N��/+2�2!+�������N���<��F)+�������_���>*.��V��b����,����.�0�����/��f�}��Y�:7=hsM�7���x�.�O���=��n�����rQ����>�
��d��C�����08�����O���JGae}��^��"P��I��k����
I����.�L���!��|�CgrUb�s�}]�!���
tw!�TNA���[��w��I6�>����v��]\�b���ZV��:l�Yn��������N�&]�C��Ee�x�WE|����3�n���.����+��3����:9EP�TvX��X��t��`�	�/�rJ�?��+���Y+B�s����tNuY9A]�;��*&�;1�n���F��IB6�>��������I[����l��(�I�����u7�7G/�4�!��r���'eE�rU2��Nj�u{�+GW�E-���������|q3�N�S����[I�:����U���0��E�4�������	G�K�C�T����:�R��yT����[�\�P%l�?��XX�Ujx�h�����)�'	-��
zL>��a����������2�q��? ���XJ�j]���'	:���_��hNB4n��Ma��Q�
��g�<|Pws�r+)��/
��]����50�6�Uw���/&L3u���+r������BS�J��V^����=]�G�7�n�1W9��U��u�U���.m5������^��]^ir���/��.�������9��v����:58PY�ts�
A������Y;� �}�<]��90VF]C�a�K�Q��sI��ye�t��a�i�"T��s=�$?�
�����^*C��/�U�]��(��.��m�������B}��Q�������c��������[uozB��L���R.�=�ak���Lo��n���U��\��a�\�(PXW��g���u�m��s�17n��M,uU{c��"tW9t���~�����
��O��= ���L���V�����v��
3�,�X
�P����_�8h������#�z�.�~���>�)�S����aV�p�=#��*�:��}���yu��uw5�l��M��:q*�M	���r��F�����]��;^�^*��)��Y�������FXW:�.|&��:��6��:�:�$�K7=���2�����u�0R�J=t��������vS���j�
�� ����arpKT5�`U
�,�\FgI�O�3��a]��0��_�q�d����9ohA�����4��?m�D�K��<M��y���uW�[FO�Y]7^��-9��l���"���BN����H�NQ���gt�_�l���Y�l��8&��t�@��\�a^��\�t���~�[g�U�{�.��^M��++���G]�oCvS�����
��Y��fk�?\��<:��|xB�Us��m0��nA/%4����;�������.V�����W��`Ow���������cG�vs���n�R�j^�n*�����x�z�Q��E�6J����Q���u��]Q&������������U��F��AVF�a�K����M�f��@���@��IR�N&
���u��uQ;��F��������-6Tt7w�
���W���n����
�^��0�������o��SX����%�>���Ma�gx��p���O����)`�;8�:�8����.}��|q����,KS��r��F8J�"A�f�@_ds!����	��.��nCe���������7�F���s>�,�����o����*YP���Ae&C�
)���s��6���U>���m��sx����6ZB�����U^����r<��t!�aV���sV.�Q-p��CBZ�/9��\2nXW	z�6�7w����G�^�etyq�����U�������	������?L��Rr��\<s�n^3b�C��4�Zol�!����8���a�nPn^o}�2���gC����a�������hs�6A�)��arp��28���m�����������0�"��0��T�`�\#�i�b���u����x�J�v~�`�O	��:��a�[]\%s�+���~���4��A�=a��O#��K|���[[t�7�����pss���?V�Gi��7�	{���!��6����8��n*�>�
���,AR�����%w���[�x�z�
���E����oP��:7<-���_�Z� Q���?5����?����!���������u�;��y1�+����b�or��N���-�>�4��8��c��/���.Ae�V���x�i�������=�[�BJ@�t�6�r����{K�W(�
��+�
{�[^Pw	:����S��3l
Aq������@Q|s��aw�
��!��
����G}Q��������:@_��"(��k���+���S�A�\.4�[W'�P1����r���K"��{�s	��:��
|�V�����K����sX�lP��pX}�g��,O�&	�������g[(����%[�.x����LB����A_�e!c>�&��B�����W��a��hw�OA���(�����F-��&U'!�}wP��<����nH�o.��O����@��r�����m
<~&����B��0���RTd�7�k��E=qo@O��[�<������A�����&���{G.��t�x�0Lv/t�|6q�������(�|K��h��!E.K������^��BC���S�32R��h����w��]�S�����
>s��M�K�������������:�e��($B���k�V�\�K�W�&��������c[A�T8�X��-"���?$��KYC��)�hX�rt���0��a�W�]��6�=��`Cy��r����!P'����������K��]�
]
5��|Y��^��l�:�}XWf*�n�0�xU�����c��6v�����T�	����
5�����2�A����Q�`#_�9�-]Xr+`6[U8z�3���.Y�����=��a
U��T�aO�����E��f�D�a]�%�|�,�/b0
�`��]��R�sbPEV�c�*[h�SD������i���rC����J4������D{a�9`!����Mj=�J������Z�)����2�������?�u�"�u�b�xn�	�/���u=��i���Mi7/�J���W_����J�s^C�V�ur�?��R��s��[x4��t��Fb����EN[Cy�)�]�SU����C�a�8*������p���\U��S���Me��-A�W����<���
d<�����M	���>w���z����zM���o���`�!f����"	���Iz�M���*�HU�:��'dw�R����b��sc>�@]Y�����mSb�m���_.��[e�����l5Z�;��S�:Wd�����m��Gv����S���a���
�
��Uw�	��$�<�/���U�'�2��YY�j]T�!(����t8�`�M���a]�M�S~	[���]'���Be��!(�Q�i#[~@Ta���]����.����u%��*lS�������A����'��ri���L@�Q���n����O:7J�0L<0�w
{���@�������R3�_au�?D�;�aX���n�6��
{���*������?�
��J�]�����������8]3:Xy��r�zPM��m�����\H<�Q�nHT:�:��]��
��d�TY���Ohs���q��=V��������1�K�B��}�j��a��a��e���/"�q6U���/t��+u��EH$�E&6��M�j��a���-\�����b�b�vE�Y���.���.��_t*����:���XF9���4���0�8C�\��Lq�a�2]0�J�U]��4�&�w��4���.lU���d�tk?������^dS�������O�������t���2Mk_�R�`���e�^dT�5������K�
z�yKq���Z��4fow
[?�Fi7��a(���n�=���Y�����5-!������>��nr� S�}�q�\����xB�7w8�Qt���0L|!w�;4����!�Z�<��.��O�J'+����R5�7:�k�07�3J�r�.�8��_-79	��HgBTS&(����4Z�Miy���I9]9+V�(
���3�bQEU������s��v�,�s>b�+�?L������R�:��}�����[s�N���y-���2K���yjT���v�dV���pU�:#�Lua��N�t���09x��{��uH�Zt����	q��r)��"�����z������/���DDaW���?�������2��	�o��Q	���9l���(?����������=�.7���4TD�<!>�K�A
�����}���!?��Wz����Q�=��y���hS�������jsa�/���=m��v�7�h��6%{
{�O��=h�U�C\	�k���"���|��f��3�P�Q�7��/��m.j�L������Ak��������[l�N6�SWutwA/������f��[
�V���]��;�������\�BX�����$#v�FP�c^�U���6�\aU�����>/n�I�dJ����8R.�u������eH����j����ms��!�k���Y@_�� �++���3bH�D��E��t
�87���T�`O5��N-���T�s�Y�)������a�)XG��	:�Y���C��
3J�[��poW�!l=�����J�w�u)��n�KN�u�y�����Uw�*�����$KIUV�����h����T��������A�WE�a�l��Nl��z��_�r/����������"�����@U� �9��&��O>!��e��#��U����	z�D1�z������o�}|���+�;r�]�����l�k��*��R��^�nu�@7���w����i��7X��cVW@W�������^o��Q��r�Ii�����\/����<k=��#��U��>CNb�c�J�a]p��q�'�|���C����:��C1��%��@�%�����wa_t��CW�����,���n�^h����* 
�B�U����^A�Q���3�*d ��.��t�bEe���0���,��zg���pW9k����u�U���������?H���*
�U�����=�>98BJ�M�����
`�z�2���3�7�?t{�R��}q���������n�IXu�����(���6�u���`�mGaWw���A�$�@�2����F�f+Y���z�U�����=\�f�-8�0��%����_79qiT����
Ch��n�N��y��Ru&�NtN��0���������������t�
�H�v��+����wjdp������k_V��w��h�v�e�J'A/�����w�l��W@���	q����y�A{���7<wO��B:�7������pJ�v�p���*i�]�B���N��}qW�nwDe��������bUae�CP�b�a��������aZ��Ea;�\���T�i�"��]i>�nu��~nw_|G%_�iA�.��2�p��
���rSaO�����z�p~�
��\�t�'��/Q�uu��t��`��Z�����3qW���~�@���%�����6��?�Q��(lWZ���v����\J��.��m��nj�<x�����h��g��R����vw�vsb�.O~g���U;uzB����~�5�8���v��%G;�m��.����Pg�J�������������a�0�MnCn.�����<_�W�c{wS���eTF�����:��
��s+����C�E�2��% �������~&�;��]�q����N�����Q:�������w�������s8��-�����M)��"F��gwwa�|�;����]y
��Uc���������q����+�����a���Q� ��.�PDu�(C�T-�G�+q�09x�"*�!����q�Qw�7�[�������������^/a<�n�5[a��C\�Mk����j���t�+�]�n��\86���z*��������]�-����}�{���
y�5`��u��DjW��N�
TV����jT��'������8'Y,��A!�%^���><!���@���j_�����������vW��u���K��7g{���|�}B��t'2�k]�P��S�05�������Mg������s�[m�2:��>��(�v���]��-�cwC���"
�]i���D
�k_�J�^;��l]wA�2z�]&�Kf����1��NDaW�
�^\_���>�E�l��u�P����������;|�����JI]]4{��3�� ~�;����tP�@
:��*�����k\�����	z�.`��9�H�v�C�:���%�[�w?����&��]��~��S"����v.�N)t����������
�a��pcQ!��\7q���Qe�U���}���#r��/�5u)�c��*;"�s9x����RUA�����du���|���{/�k������'t���B^��@g��sC���;��)�k�M��8���Da/����0��UK���f��1���4d=�#!���R�C�h�X+������J4����g[���o%[���K��Uet�8X�Z��������i�����t�����$J���8=T�tU.�@�A���]i6���"v�Ua�����^��
:���W\!�v�:?8��9�����;Y�Y�����F�U���p��/$?a:�<M=���!�4Ea���@��~�Xi�����&oH	����oPu9+ ��E�R�G}�@�w��.�X���V] z<l���>�z����k������+O�����.w��2z�b�1O/�zh��*���
�����VXe���S9%bG�xW���/��v��w�]�ma7��v�=_Dk��;�}��VR�nn����|(�07xo�z�)x���O��s����t���]�:lS8��m�XuU�z��+�Q�]����+����^��C���m�����-D�w�+����aV%����BE�^����<gb�l-�J�v�w���;�����������a7����{@O�cu
�}�|!���>y�����g������~��(�g;W�~��W�n���u3�`��2������� ����
tnk�a�l���vnhUF�*����#v�<��~�W����s�������>����'v�"�%�v�J-0����s#Oew�
����$�GU���c�����h7W���(Wl���p��`��_����Yb��(I��V�f,,�%��-���ZM�9�-�N���F��"�$��&�����,��D�Y~��$�tX%�&-$1���a�}�d��M�xsU�.�U����%}������T� E2zM���v��|���o�����`���n����l� ��Q�����(Fl���
�6�`�^��B= ��HQ����UT�W�Jn����i���g2��>..��nP(FW�
��;w�l�����b�)q�v�Bk�*5B����^tu�`G^���5]��4�+o���[�U����}�m.E�����3�W��UW%T]�f��ZQ���p�I<�K�`�y����������m����tAZ��� m]n�F!��%��PdT��t��lcHIz��R�i��V�.~[3�� ��6�V%�1Q=�#���
k�]�+��|ZB�k���X��i����g*��%�����]�5�|�"�-S�}T%7h9��#�]�47l��Z�1�'����ag����\�����7O�-$_�a[8������D_�)��J�#��"P'�;G=8=�����(IC|�`��Jw�]�Q���k�	��&^����V��u��ZE���P8��J�o�L�@eE����(���*��v�G�.i.Hw>1�AZ/2�v��w�C!��O����0P�J�:-���u���~���|$hsQ�@����yJJp>M]n���V����ts)�z�������-��7Q�#K�v��a>�E!�,������@�/�����y@�>�y�l�#}p*�Y��>yT��B#hsoZ�&��M�vs�I��R�f,l7g���������j��5vJF��v�@�U�[�y���QN3�W��h���"�[����e�8C���p����
?&�������?KOw�m	�n���pq�`]3;P��r-���a��mAK��+PpV!��m��Z�'�!�������L�hs�P(N��-�5��F��wE��:[����>y}����<e��_�Qp^�����:�s��T[t�����:E�@���ZR�vgu��y�����k�{�l�@�A�:���K���V��h�������+���e4��|���r?I��@�+�d�|'������v��I�k%`m.�t���1��t�\��o������]S���K�M�i������f,����m�����'���g�y��'4����N�p����m��6�[����N����\P�H9���pC���Y�6�@���+���A��&w��KYn���eu?adF��
�m�����A��En�n��*����]��6�����}�*��Y.��Y�[�����NA��jU!h�����A|m��+����l���Qv�d�Z���
���g��%P�ZTm�D�����`C�"<J�����`F��)44��&���"�iy��XJ����A�*���S��n>��Ns�u�]/��ir����"��`W��V�����h��&�_�a�
���>��?�U~����4l��L^C��� a�e����1����"<g�
M��tn2����+���;?��ih7�]����m�l�>x�|$�!0��3������0s��
�~����q�5"7V���A���49�U��)��:�PW�5�����nS*�E�����f���cVlc�����iN�]�������+���L���iS�����|���&zp%D�����U�U���~-*n����*���Md�	��=�����ib��"�r����|��Sq��RJcV��@g�*7�>=�UK{���QJ���+T�k��<*7�j����A���b��8S�����sS�)��E������F��!B��]�&z`3`�9�:��.�$��2DA_U�Z�b���JF��W�f,�7�\��;t���,-�4��z�(@��Q��y�V�����7s���t��2[�f�oN~.�(��.q���t5V6����n}(@�+�|�"K�ExX�1����M�]�gp������2��t^O���\�|_����F��6"��<M�zpi@�����a.��P��~C�������u��@�>��+z��y��}��5����x�7�<!V�R��}����XXR.�r�������n��XC�@7�
[\� �.��/���'��q>	���M��Bp�&�A=��������C�9�}sIC/�on]#�y�2���*��+a�.�f,�!��5������;����������{�*qI��1k���B���k�d-�n��YrN�O}b�����lJ@���	�X����YW�
��P9��Q2���6'��jP�y
*7���r
v(MH�5/8����e��YD���h�W�e���vg3K�Z�Ut�� ������$7Vx�p�Enr'V��W'���Ys��[�Q.�1;�qX����[*���G�D�]_b��]x�9]�"���W����n�WD)���.�����H<��5c���)�>
�]���.���������Y�6s�����']�K�|�n��O����h���(�]�}PB�N�����&,n+��^���J����
���b��6��������B"���X�:6��M������jC�����~���n��Du�X���k.Z�.7wy]���+z�������f,�Ew�	�v��@��G�:}P|��tS������}��F9Z�@+m�@��M�j�-�,v�fq����I��K��E���/8��%ct�8�P����{B�(��E��3P=�A_�)	;XQ��K9+���N�g�7j�R
�l��D�W��-��F�|�p~Y1����,AWW�f��n�M��BWr��������)�l��7%��m��s���+C`���]�%h�1dC�z_���/'����;�A����	t,5��u��t�a��]�}����1ag�u��(�7��9>������}\�:Y��`Y1q�����02lq/�Lv��z%�,6��-[�OX�����J^F��� �f]g��[������X����uI��;�:�Z��7�C[�J$�ywX�����v(�c��;��]�B�����C_�W���_�U%G��=tm\�F/]�A6�����T�]�`7c�r�K���������	��m���Aa�2�@]�����Q-�f�l������6D�n���J}�h>�����*�v(�3�W�����;��]�$`���4��S���U������6�Ja�k��iP�Cz������P���I�"wu�U�������3�;��.��Ot�5z+�=�3<�t�s�%f�������mK�9����QU�4hY��6������aU�
��U(��O�W�Z�Qc����z����p�&���e����`��3�W~�W/��b�*�-��y*�V����\�zR��_�D���u��Y��|t�_����e��*A]<���z�kjP�w4jAT�)�kt
��l?!��Nv�H�k��f�Xn�*v��m���q���u��A���U%#�.1���b)�P��JV@]��9j^��#����u������A����J:����[;J�N
vM~���U�D��+�R���yH�;G�|X=����h�wf����������x�u?D�4�����gz/"��u�R�����"�{,����}��$h����H��2|���/q3v�s^���\	S$�����#@��z��B����CX�z�u�AF=H@�u&�u%<����:���w%�+��W(q3K�jU��:D������zO�c)��,�������[;j,��i���>�w4��]��&G�3�P?W����7����QzwV�s&��Qz��:lWj&�����K'w�����/p.!~��7X�:�p�R��!R��,)�%��
�>8���^%�rc����gA����!w����	1��r�`���EpW�{������`��&;-q�
~U���5���%���#`�CqT;3��P�^������tW�F�����y�Q�^.X�'��S"����F���f��.��uwi��%}�/=��49��Z��w]��h��������O\'�wd���R��l���DvwWt�]x7�����v�P=h_�Z�e�:P"����	^
���A��um��Y%�
+�������	�����w
���"���}\b���j�7O��
m��������4��.C �r2�KE`�m���v��N�F���U�u��J�/������	�h\�a�C>!a��'�����������QY$���)���u�r�e��R5�Ja��%�:���Q��4��B��PQ������;C
���`���|
�u�}\�j�4�6O�]�l /�������re�����������z�����*���F��Y�C���1����-J��@{�#������i�����=�Q��>�@�;+}�=z;��]�s�:�s���hD�����.�����zs���.a�m��
����P��pY^���b�)�����k�r�#�`(l'/�|��W��f��.�qR�73Njg:7j��>����������b�R�) �~�C��3��i�� Ez���7X���j��z������V�j����v�NI��E(��o9}�����IJ9���� [�?����D���Pc��/�_-���
*c�:
���
�h'��*Jl��<pn��lg*��Q�~vt�O���D�;n��k���4�Z8��������)��aw�:\�\����	���w]v�	7Cqz)�a��^�=H@���g��Z��:��LI�R���� 8�������]�m���D|w1�6��Y�b��>�taX�A�A���B$���E|W���q�AA��b�8Km4�Q��h9l�������<��C����R�����Gi�)��v&�W�%�*|
��&�AG���@�w����u�{P�]�3V�bP�\_r��u�YWs��:M$P� �;��'|xB����6�SE*cj����������8�	�U~P���Nx��d��R���(��K��f��U�����+�T�U4XwO����	P�=z�K5���% ��djl��	�2�a]�%��.��WD7��H�e[�:=B����������<�5t=PB���.@��w�m:0h�{��C	���h�V��*��WgtO]u���C�'_����^�8��J��X�����J@R���C%U����hU�E��n�F�J����
�!?�p\�Zk�5C`3M����4�\�O5P�����m���V�.����7WrK�AP�_��������Ka��.����x�����C�8`���B��'���
��ol��9In.�n��aUq�D���|i���|�P������
�k��Z����*����[E�K���l�����k-
�8SE�E�s3M���	�~AitU�{�����2�[�@�J�u����R]��6��	&�����a�����>v=�7ca!(1PXWs���=��p��U��zn����T9a]��z�"�9Ta�/��Y�<i�%����/Y��d9Y����XR27���U���2t�.��]���y2�y����mjx,��30�w^�r�.��?���]3�6O�Q��D��*�
�y����4���V��1Q���j��[8�QgY��bT��o_;
��K_	�q[��|����G�T����.e�QU��8�nA�$o�!{:�d*��Lm��
�8��|%���d��j��:F���%_����q���%[��C	����$^����X!��U�u!��u�s���}#\Y�c�l����I>������,�������}��:}ZX��
����������A ���>+�{5������%������Vuf���0-�:���S������&����f]1��:�/�^�@���>!���{���[l����I�W����`Y�L<�������8P*.���/j�G�8��E��Gv&��$�,+6�3�a�K���e�hsF�����E���<�G^�-rc�=���P�p��;l���d� T<�q��T@]���:p�O^c��<��
ydl
T	/A:����K�g�6oJ��u�u��-� | �������Xe1��Q�ibG�4�`�+b
���t/N��L�aw�
�^b������N1�����3��N�`�w�.������	�|���rE���+��g�}��H*q^�F�[� ��=�{����6%<�[����;�������T#ao��<��N�$�p��`]+��n.��=7O������my�����pN��y�A]�����@�.h�wm�d�iV��
����J�,v.�@��G���*�u�`Fu�d��$�
w�Dl�����e��&���+?�t�tT��-��L�r��{Y�r��s��2d�E��d�'| ��`�p�M�t*|�k^�f��Q������'����l���r1�bp�6���pgKG�%?��R���H���^������bY8��y��~e��Q���a������a��9<�)>p�����`�+��q�%��M-�<O�
����-�A�[7����
�CIO���V�[���*?Hu	�o���]a����F���u�Gl��������q��c����< ��j�p| �J�p��`�+�
�v�@f��EL8��:�J���C��{�CV��6���t�6o�$!�{��l���oZx-\4Py���?�"^R�(��������*Q���5�Dr�CD��)y������������~���	��9�j������	�b��&��]�e�YV�6��3���6O���D�bo��ai�4�(�>�(�2��d���4�*��Q��j����������T����6c�L�,���4+�ti$���)�B�?�;cs��5m���cq�X����i20�;�)�����Y��o�\�&�D�'����w�i����,���3�������QM��DW�����b4��6�5Q��3���Iz��n�D���1���d���E������`����D�r5��+f�I����A2��'&�;��m�CzZ�9�I����1T�N�dU�����=�����L���5N��>�\�0��US����"���c����/�N����>�'9�b��]m�ib��_��`�O{���"�>�UEL/�����o������g�7����n��$�*����T��^�<����V�d{:������$��������k��&���'�\6��Y�lD��#a�\�_�
'����_�yy�rvx�%&c�5]�����&���uP���}QTN�<��?��>�l3�]������<!��3'�v��@��1��&'���M�uW�]*��&b����	]dM�3�HuM������s��Q.��!������V[�&�;�t����c��}�}�������?��>25�M'y���=t�y0��(�--=�6�}�,��;�����LT�)N��E����hL�u�Se��D/Sz����9�B���P?��f�s;�8�l����D{��������`�/�L�@���4���N���>�X�&���N}n�E�U��5Uy�E��<@B��`�,��F�f�����"7���������4Z��U]c&��v5e����������`o:�n�J��wX��4�����x��,X�nW
�����a�u�e
�'��l^��DnT�'����A�4���J�z��.h��n�h��5U}�����v���S�b��\"�O���7UE��3�����<������L]���Bkb���Co���\�q�����[��?���6���c=��[���P�����>�_����f��p�x�^c�	v��M�rW�3��j3�5�t������l��K�dXgl�HB�}4�[������F�~�����F52|���Ul�����E
�L��B��wT1a���/O�fY�4�6�d�3�^lc��0j�1R���E��m��-��2��wlT#$>�U�*�^����OV�D�J�%q���A�����L�`���Z��
,�j����bk:C����Q��f�	eDV&���'�����������/�E
�������bB�����M�� ��b����`���/�,~&|�<^1��y�����C��\����au���>�W���J���
���cA��W%���a����O�u�������_�������?��������\�A���\�0Z���U	��-��1�r�}���;Q���
�l�C�]]��7`��Lw�
v����9�R��U]��u�C����b�n��#������k�=B��2��\������;��+DD-�%��:[Q������cm�����u�A���n>���.v�fY1�\��rGmg�
���e+�V�U�+�;�����	�������V�2�{s��~:����'�XQ����}�=�����1���	�s�lAj����>nkD�Y*��to�����s��w�����0:u ��L��t��`��rDV�d��}��lu�x(�;��Q�x	��x&|��~��@B?�f���1��t�3����[���1�.����`H�7-X��E|L~��w��"����F�~���{�����8D����!������?J
�
6���~<tZ��x��^����"3�W�2h��v:���#�~��GC?�m������|����9h�/�n���9�JG�D�~������P�w^-�u��@�M�~����4�>Ke�f,�!g*�W�C������4l�z��Yq����_D�)���U�x��P
�9��~.�:d���Q]�0���lC�%o2LFW�8��67|o��
��@�d`��v�m��:d��I^N�,���]�X(g��f�K�����'�3Y��6e���]�7Ox���{�m�Z:���(��D��7�5��{�j`5�sc����~@�V�i4��{��@�����������h>}�i�m��MUMt���L�nB�����q_�_�jv�	l���e2X��������|������*%a�J5}�$������KB�UwP�G�G�v�6SB_}��ri���J��TO`����X������m���S~U����@{�4�=w���k���X�#J�VZ���3����i?	h�'�\���n��Xq�)y<�W��A][���K��fq8��c�]6��X�*�*�D�@N[gU�����j��F|�N�u�P{Z�5_�q!!�d~`_�1M�q=j=0�.w�(�O^U�B��r�f��Y���K8���t�
�Y�j��[�5��/����Tn<lQ���W���B	��c���
YA/��b�J4�Hz�3��= �0�Tz�]���?��U�47Tdi��l����S^%��6U:���kjr���k*��s	q��A��6��>pw��&d��8��tlwW��>j�r!�-��V�Z�M����2���]_���b��:��X�FWM��41T�lY�Q6cq��"���z=1E����=���Jk����N��������{�Y���f]9�U�1�%�y���������������\H\K#��������}���_�YM��a5�,� K�>�B0�R�S�U������t�e���}���j���Q*3f�1��1�"t�A��E��r!�`_�8�U�}����\����#�������m��va�x�DU�!�p�5�����|����%���,���XJ�v}7�����l.�k����6��y�R����@�����������Wo��W�]�|�}�mit������{���T�.�*�F��m3M�wNV���w�
��ST�,�\����������g-J�`�*?�UI@��V�z/w!	�>!�g��.T��Q��\��{)�]�K��.�hqyYLxq�nW��>7����>
���/z����-j���C���-�Ju�fts]�w�k��4��u!����Znp(���0���$���=���J2�����	�8b�j)�Y�>��[�-h��n��UU�����	t�<!v����]�6ca[(%Z���P?���>@�����+������#��zu�>������:������=��@<WFu��.l���{]��r�U��>�Yl!g������r�ozm��V�fm0��+�u!E�
w��`+��DM�#���Bbx����������/A��Q��Vb�.t4�/%X[�g�(7R�f�2'$���	=	��|���`]�>��|��,^�?��<���w
�Z�kHy������l���	�]�����ow!;}9S-��xb��c��{I_]$���:���2��Kn��hTz��n�
���2�e?��+F�;�'�g���ibo*���0h��j�_U��'���?z�\�o8lGO����PT�������~ld�/'����6Ca (�`���>����.�~��'����F�{��v.�@���D0��������=-P)�* �yB��[������4QK�
V�R6�-.���TU����P�����.�6�&w�pe9�T��RB�yB���}��nP���l�v+m��4.Z
+O�a/BA������G��WL��eE��R���=�	�u���� ����]��4����������LAv�m#��y@]�������b�u��uN�`�s)z��c1:�8�����Q�k�Z�g�8�.o1��Ld��f��}�v=G�����6>��|�|�AQ�[���5F��m�)D��'�\�%�v��F(�RB��m�s���[I�����sX%x�
x@W5���\,��Aa��'�Zt����4�&1Ye���Pa��,/Pw�����F�w5�sc�q����U������A]`g�y/��V��z076���M��9��7���J=�}�}}�*ma�X~Va�)w(�Ao�q�[��`U�U	v�V���G��%h��q���3�2!]����;?��������n��=��y�}+?���u{�w����*���CQ�}�H@+�h��E��8�J1�,������T�-�<e-���
h�4�&�m�����5������
hy���PU�1U>P�.Z��7�������^|��3������rR�
oX%���oA{^5�F<�V���M�h3�g�!w�nEB���kin$�o�)��5��hQ
����|��@������o���v�u����U
4�oUG���7���g�u��������4C��W������3���P�������p;)�*�;���LX~��KLh��X}*M	v,��f,L!��uJ��U���oP'`5G=��#
~�#
y�%��c�����9�����8�:�����+����J�x�5.���i�������7'��r�&�"���{����Lv8lj���*PW����c7���J8�u���N����u�����
6��l�u��@W�-��.�7���`3����czH�;�h>�F�]���}��$��b���d��A��q����Sa>}@a�VU-�C2���{>����U�	�g)���;)�������i�a.����b����,�v��l}T�]"NA9*o:����W�l�6�.�.�*X�R����n�7���;��ue�sXg�����}�-Rnd�]�EXW�0Q��B����U��
��s��\�?�gqo����T�a����B���Q����T�-�>~�l���;P'J
ZRQO��#1��B�y~���.)%��������0�������*J�N��/��f]1i�4o[��RFP�U����0�>J��9P�k��fq0���&l������v�m��*=h�x#-���v;z):��A�O����Z����c^�v��
���t�"��yF�/i?����v��5�[w#>-�`]`�j�������'�BP:����/��6���A�0���KaD��
m.?(�U�7?�A���2WV��J|�2.�5'q�8S��M3<.E�RG�?������5������K����h2�J�y�t2����Um�[��L��N�|����V�4_�#�|���<e��q��*���	8�����`,L���r��R	��l�@�����n�	�90����e����Q)v��D�R�w�i�����;c����A�R��>��|���*I��sBZ��B�MJ��>����lqG�.��f��Q��V���8��&���~�yq���[�jX�G�V^|���=�F/���f�M��4-.���S���C������{]Q)�]rO����A� �f��`J"v��I���G}�gEfw]����rPs���3�TMA��Y~�
��9���D�`�\�G� "}���Q�JlqN�@�^���l����;�V��e;��7����eG����.W'���{t�]����jM�1�E�e��Xo.v��R�PGvfF�N!u���)S�"�y���>o�Q���������`��	T�gu�/��>E���������F�{o%T��h���o�
�@�3�Q���������u�4@kqO��u�~��,�ud�=�Nq�s�����	�=HA1�v�/���/�+Tl�.?&�~4:��t��oNt.���"q�RUF;�||#6|+�a�"��t���%�v�
��o�L	+�Jy�A���u����?������-�7|���7���c���V�����6�yB$���	l��Q����%�����U�v����Wq`��\.�N���~���Q���G���:�%�S~�*��a��:��w�'�k���5P�1N�_�	OhL0�K�"@�������:���AD��V�0������m�u�����e���<��8v?��W�9j�]��<���u��A��I�J�t]���`�)e���������+��GU^����g���z�s~T�k��%}l��DU�,��n}�k��f]�T���-�5z`3��(�jXi��r�������Gi�:�PiRM���'�|��K��D�L��`����?D�`�$�����)7�U��F��}�a�,�P?!���v��llt�.6��BP�|�o>��A��q���/uoZ�%��Apx�c���X�L��RMA]�zP�]�9�-P9~T=0�P���n�gPD�����di[���#�T:��A��q������r�#o����r>a����z�������h�)O4B|�8~�Lr��S��~�U�L�}���A��:��>C�����|���LSH�N��'��d�_���_,7��
+5��NhsN�@����w	vUNK������o���T�a��H�/\�=�@W�4�^�7�����%��U]�J	���(���i�A�6�`��G-*�e����w��{}J
�X���N.h���>�U�������Q��<&���DsT�x�0��H2�U�����Nr�%�q3Ml(%��=���P����9 �h���_n{�%���o9��r2]}R���s�a�yA���{�
������:�,�-�4lS:.uoP�	z)5D���x�����`������@WQ���.z�:�h4����8,�W~�Mg�Z\��g=�TEi�q7h���C+�Wan���4�%���+4���<h^?nv�����_�V�������n�������'�u�A��q��`_w2�y�^��������a��lH����l��&���[)�0���|5_�v�wP���_6k�1���a���UG�����ZA�r-A�{�����������
��&��3��O�R7g��yF��3�A]L�nww{�h���A�u���L�lqI��vM
�r�eD��g�	dl�G�(i����H���z�.R��y}�)��9'*a=����rbP��Wr��>0�5��@�|mR����������%6��&�:�i��%3���#
l�\�,��A�}��������O_g�������mA��(�v��Fy�qY$���=�x@@�q�!�g!����_w7&���k�j_�YWLU�0
;R��A\�n��9�D��:g�~�@�K�
t���+��K>A����Z��P\����%�b�B�@O\���K�p�kLJ�t���<!����r��'���/8&����i3n��Uj"���n��rfIC.����,q�%�)�$!\�Z���#r��
lw~�@evd�i\��D�Q�t�k���c!
.����W��4*�"��J��'��W���u�*���Q�����u������o<7�������f�Yq�^S�e?���u���������:qK:�������~�Z6lq�Y�Zd��Ejw����d�uwN�����S��~~"����t�6��Q���P�v�:�nm��V"��������YV�%%
���=��H��&b���luq�O���O?.�=h����@��hq&��i�zK�>�QAh�qm�'D{����$�� 8���L�D�� �����i����AE�����N���^����g2�4����4o���lF�>�`����~�[�i�t7�uoi���Z�@���g=�F{Z��� ���m.g`���I�lcH��a��	���*�E9�a/�z���i@�J3�*^���u���j�7���P�*U
G�#_�[��.���u�_��[��\�4���o����$�W���P��B�d>�P�/���]��4��=���D��*$�uWSPW�
Z��(h��]��v���2���*������;��������3Vg,c�������5��������P�8�g�$�A��jAU����jA���L�9M�3�=Y���jn,�]-Y�ShNXE�'���������*�����U���5�A.h"����X�K7�:ulP'+�R&�O�.HGg������C �������u�Yn�kF�U�6w���W�]Uq/��/-H])�JjT����toz;R.�z��
��IA�7��7���mKS��Q1�oiW��.�KlQ	'eJs��{Hs�k	;���D��&����F�;RY�|�� %^T��e��a�	�V�����fm�5�]���3���9hu&<
����r��`����M=��^PwE6���Z���$�����*���XP�.r3���+���4�_r�����^�7z��Y�SK�=aXB*��;c�8����fq���L��2��!C�%og���~��E����<��u��=�NW� /J����n�{PP�\����A�|����6�����8��]WA��l�@����ib9g-
�J�i�Kj3M� wT+}��*�tM2O�����o[/����}���K�3g�X
:�EI�LV����ze��k�Vs��U����h�P�����A
��B�6���S������*y�9h>�� _.�f��W���X�A��v��:�*�}��Q��W_>�.^���bCu��*����MF��B����h>_��$^�^���A��a��A��.��|�w7�����S��_�kK�@�j�|XU�Z\6e*(�iV��F�<��[��.�58u������v��T�4�4�U�'/6�s���Y[��*�-P��D�����{Y�.J7V�u�����]]�6����T�aWw�f,,!%>�/������:9����V����h_���`E9wR����C���dA�F�Y��>��+g3g�s#���R��Z�Q�����.j\��R��R��uB���;��\�vS��`]���������q3K�!B��24����-��D
�(	,��A�f,Ny��Bm:��UP�.n���9�(0��Ht��w�"$��.I�Q�{�fq8�]x�|����rq�h�V��D�������Po>�ONe�o	������`-�(g�"����@/� A������K����~}�[��E�Yn4���k�d��R@���Z�]��C�t@���z�3"�,Kx������/���;�gw�n4N���(FW�lw%W������mH\;�`�W^�� q]���P�� ���#��q�QY)��K�b��X�J�v�PG�2�8�����|%EnK��~a�vU����/ ��16��i�j5��v���v���_��'�>v�M�����
�=���`T�������FoW�h=���"^�4C��E� w������7O�i�T�a]�NP)��8(
D�\� W�j�����?+8���D�\���GN���w�bzq�!l�	jA1����.�r��D1�U41a��t��+��KT
V�
S��}����A�P[/�TD�I�t��]���>�RCZ���"��"5��������j�#>��B��8��+*T�����_	}��7L?���de����3����Hx���L���+kA[���Z�uN���}���_?��B�����w�MP��{��2j�@����{`n�������;5��w����,�q�����D
�qb��v�������d����V*Q�����@_�Y}�,l������FD���e�q)s�����4��\,l�q��S���%��L��hw5�<����J�dn�[�)4���H������!�����"h���`�KE�A]9��b��h��Q�Ux�U�E��M/��*D�uw=�U{3��i��+�4��~Q>�
��,P
�K^����_S�(Xs�����r�����}6�qO��{i�\.��Y6f��]��v��X�$�}��������
y��|f��P��Jla��(��J��)W��V�Q��#��G�Y�i%��N�u��*G0�u�i#|���:���+�N���R��y7��R��j�����I�����|��^����^4�_�����C^��]w3��V����=8G�>���/�>�je�A/g
���lT�O�Rl!���]o>����T���21^/%:�������-��J`W3=���	���dT�����*#
v-�N����g�2��;�g�G�^����pj��u
��0�3vx��
���7��_g���U�^��~Z����z�A�W�da��O�T���z���
[�����u���a��N^��_w��i&OT�(��'=0�?��M�%O`3&���u�A���!�&:���_$�]q)�<y�.�Y�h����_��_��	+�=P`�K�s���%J�����a����w�E�{�h�
�[��2�����x�+*���5������a�$��X�AJ�q��@/�3��m?��N'�3E�4_���r�@��7�����"��~�?�6��r�0������H����z�~UF�dO6�/�����y@��=�6�Ldx��=�F_���"��
#,'_��b��P�~]
L��*�UB�2��=p( '���X��
:��4���b��Y�hs�n��:�U����a����4���&!�Z��Be+��V�V%g���H��v!��.\�]��I^���3�s	�����q?ID������b���Si����x�F������UO��S�gA�����dU�=h�K��(e���v8���|F��f��Dha�}��v#�5�J�E��uP�rc
t�}H�N�tq�o����S�=`�\N1�:�p���m{1��{���K�
v��H��/ E���@������n��)Cb�n��������@�F����dT�`��esx�9���]{Mn���`��%�����`>����\�:��]�@]�t�����0�(��h���a�KZ��s�J/�����z�!��������\�&P�T�*��y����y��e�W'���"1�������~�;~�FF����yB�\������{���H!1�*m+��������-��	���j�V_�u�_���<!&�R��]E����l
��N6O�����u=�Aj���~C�(g���Ae
��.�]���u�����+��+�y����_oj(t��Z�/��24��v�u���{����m�8������	�	v��AO�uQ�`��dB��@�u��h-7V���n3G���u�/@/w�Bc�������mV���<yw���=Ie��I����]�4�u��P���u�f��9z��.1����fq�J���d]f�k��<�������Y,9��1�@�	���m�	/��9������(]����.�%r=�}����������hF�
#��-�v���_��	�Eix���}�8�n��G���"a�v� ��
Z�M__��_��lu�@e&'3^l��b���S�������zp�DK�U���]nQ�V�"�.�~�����e�����]����KCJ</��"�����N ���L�M���:,��%�t4�'���d����-�p�J�.�h_^��bF9�|��)�!��<)�.�1�������::��]97caG�\Xg���LG���q��&����FB��ee����^���u^$���/
�������(�]�p��\d�e�>�#�h��=U��F�O�=a�z�4�J��>0-Q�~���|�rEt��m�&my����sU���k2[U�FUE��a���87���B_�-�l�aQ�	5Q�����B+"�U9�a��n�*��V$�j��3���L�e����u�LsXu�*F
z-����T��Um_:P'�6g��]����4�M3�hT�i�*Y����uIi�,Ngq�F�\�����:?l�p����_ITi��AT������)��v?T������u�
���E-���[V
���j�k���X�W�l]K4���Wd��l��>rc=�vt(��5_(]Q��*�v(��9�3h��^�16O�!�t����Vf�����6"�iq�m�k�Y^S{�������&v��d�}��9���,����r���r�����41T@��~�u�~�b����������e��������������IW[;�U�'���7K�q��v��3�u��Uq��� ������]�<HX��:�F(_PPQ���Y��u�����@��l�o^��"�]�r�����=���]�$h��ym��f��*�U�l�w|�BWsT��������*q�=�4W����T�V�N�]+��UU��6U��U"����(�yBL0gZ���-��$%n��I�n�
K��?���\�'n1��|+g0g�v�@�R�Y,�N
������H�[��U?�A��pu��`�Y\`%��c�Gn��+�\�;r�����6U�7QU*Z�A�����-'�v���?MG�}\("�5��yB�!%�=Y�F�MU"��`���������b��dfX'OV�8����&_��QK��^vu��`]�6h_2L7��fTY����O���C1����z�9�J�u��$����ka��y�r������F]�6hww�@W=���`�lm����_�F�s0���*g�b�U)���Z����Jnl�y���"yu4��FG�����.��*����D_7���+���T�e	uw|����y@l\�����M��9��F�W����y]����������b4���n��E�qs4���l�u���}�:�L���%��4lP�������/���`��KT��
��R�QW���� N�Lwu)��6g��8��hj����/
F����/Q�4������
���+���������7
���W�m�8�B.i�����0�vK�v3M,U�
[�1��w���vu~LD���2PY��~v�����k��w~�F���L�`]��u��41��G1X�<TzA�����m�����@��it��������.�hm�;I������|V�gy�q���5��^����U�t�R���se�S��}V�W�Y��i�z^@�"I^]���HL]q�����<����f��"B���N��q���w���R3����4�q�c�8��&��@dz(��������C��������|W�g�����4zx�����8x^��"�]]9S�2�>��6���������7|"���U�.q�5����I�����g���b\�<24��*����z�i�v�L�5/�SQQ��.6/ZQ�.$�����:���J�FFW���:��Y�F�7c�R?�\tDs?	R�	��"��a��~�5��^]]]���C��i�������'��Qb�������S��>����hvu����T�~�������5{���Y�i��8�K�t�}�LC��;�vJ�!�@����8��	/n���b�)�����P��F�����`�+1�r�nFunst��d����.���sCv
-y����`{�z�g02�nY���[N�EYs�����t��(��X�wo��j ���^�����:���^�l���}�6���{�V��A^.����}����a��z�E���`G�k:t�]5]����:
��N�c�'Fu�F���@������%+o����z?�]�ds�T�%�����^�]���@_��������Q�Pp���.�u4����u
�X��M���( 4������u�N��	�Un�C��u}�@�>�r��Y�[CS�)u�6������m=��35/�d���f������b����lH�������=�h��7����@�:�@�N3GU�
��/�n��7%��Tfh�7�lS�]���uS�S�U�l3��4�^���F����4;�4G�dUf$�Pi��=o6���(lQ��9�r��Q5���@G^��]�m��"�>�@��0���p7$�]j�*��U�����yB����U�Z���ikz��]�ygjO6�h���zX�?����>�H�����`Y�fT�'�����DE�a���i���a�X_��	�f�s��/�vM��3��U������dR&��u��U
�����q�Y7������w}�|Oy����k��f,L[��Z�����>�5����ls�t��d���]�u�+�]>�s����b��cv�i��s�Tlw/)Ms��=��M���^J�r��'	�&/5��]o�Q�s�y ���o��t�\���e����(�	�h��+nCv�������FU�8��A��]�6k�Q"���8{T8��'�I������5�}��f,L!(�u+� Y�^R&�|��w��Q�nd�]B��Y��:�1�iz�wk�����7|��-��o
��E�P�W9
����f�Ss��-aD��]P���
Y���4S��C�YW�>%�{9{
�ywW�����/w�@���
m����`]C�6e�����<�E�/SH�7y�����K�)���-��J��w�����7"��E�Q�w~�@/�1��zsA���(���W??������n������=(�h���]rcQ�����M��%v������Q��:��������D�`]���U6d������-�����xSUH���?w�N���QC�\�i��C��� ]�/���@��n�SHeM���;i�Z���4�,\�R�%����!_�2Sc�C��@��?PWQ�:�N8HD8�)�t�u���xsQ�������%�FW���bZ��z�k�#��v����'3��N���)KC��m0X'
���J�d�w�#��
f��|�&���W�
�kH ��|�zCM�)5qX���:y�1�=$XUv�8�sUA6G]~���`����w��u����������7���\�AW����A��4�����Hn,��n]���B����P�kDq�8������k���h��UCp�ub������u�6W�������5Z���An�Hs�RT��1��}���m�X���W��f,lMg�����f,L7���pWP�DR��:x�1��d�t��_A��H��vSjh��]MV��a1�[3�4����ZXw�A3���r*��8N�N	�ra<FufT��.p���-�|�(��Q�Mi
�W�������`F9�iy��t�Q��1a������H�7%�+���?HWB2��PRC�������{���Z�Q�U�u��o�<�!k�����\}��xoJ��r�������H�?��=�*}sy8���<����lw��^����
}����_�Z�@���3"��Y�h�[�:�U�]��K�u�������%
w�r�����+"�u'p��u��%�&��m��h�7<i(�;�T��	A:���
����r�����u�o�j=o�A4�=�}��u`� ��\%��-���3B����t���+����9lq9{��V�u~$&�
-��wZoHr�,�`_�����|�0I���	�,�7w�O�2��Q�'!���A��
"���r��hq	��^'{f����=o!�-k��]���hq9U�k��M���s~����!d���r�����6q>���/���Q�����b��z��P�[�0�\
���k��jf��n����*��D��s�
$;��.��Qj����
���fD!�U����t,aW1��Xc���U��$�8�f�7�4v����������r�`����A]Bh]�@7KSXsd�����/}��\�r8��^?M$�G�*�*�tM���+�B�4#�\�f����m3��4�����"��������*�����:y2�����.�O!�tBs���*��U7�K��@�|�\G�����]�om���P���,�@/���3���;��]�d`_%�6Q�}6D���1lU�p�5Oh3M���oi��{s��n����D���1��l��|��C&9M�����J�iqY%K����@gc\����X?�7���d^`��,����W�����k�8�n������t)A/��2���|�hz�%�������c��W�z�`�G���:�������w�6������,�)!�U��d��S{p���t~�]����b��8��]��>w���hN�������YVlT����)A���MGt:��k~gn���AWy��4��T:�K�-r��R�x��xuG3�eU�>�,`����Kt�����+h��n�tC�<�U�� ��������d�#D��gOVe���]7���Q5��k��XX3�]��>
��X�U����UYF�Kv�fY1f��7�S:u:����:��]U�^�
F��m��*����P�F����b�(qe��y#u1D=��0���Aow�}H?8*�I\�	�i��*-����6�@4�]�	�GU��a�z�����sn,����[������?�d�RYW}JF����7���fg�������R�y�����_5U`n��Q��^�J��kS*�'6�3_���Q���RuW�i��� hu��\���X%*�������wT���2�UU����u���*+������Z��:P��:�o���6������`��V���|�MwU��D�A�R��h��cG��e9���H��j���������T���+l������~n����6�.	��Yr����[lC��n���l:\�����M��w^�`�K���� W
��b�J#����@]�����!7�2>u�&l��F~�(U�����Q�A���_0wy�,tgV�u�o�<!V�u����d���)*��xx�z`��s��aeyj���\Q��9HN��+��.�����zG����a�2��b��Q���
T������fY16]!��������f�|��.5
fMG���*�
��3u����+���z��6}��&!U�]fY�_-�6ca�9/O�n�����@�.��9C���y��B��.#�+�_�4���h���v4���(���.Q,�r��<vW������?�d����t�m���)��zv�����em�C	�qU���?|��X�.��Q���@]r�z��6V)�[��!�����^�%-k3F���
�qNP���P�'����i�8X�����4��vk�s�4:
�q��L��XU�1�?����rw�h;�5-oy�6})��lNF��*�����-.	�a]�M��Vy�����%f�YWlj�*�#��a��O�UB��?�osh�w�����B�����.����z���^S}��f��	�o����k�pn���T�>�;���%��Fe�9B�y������A��I������w�@�R	�Y,r�e+e���3�8���q�����_����s�1c�W�h���
�����K�w����!*����Vw�B@_Q��=�!f�]�b��>�a���/��1�dU�k���B��+XW9���13��&���m���R���ZW���1h��OG��;?(r��bw���}j�<!�K	V�������{wF�(�Bp`Y�Ae� �}�Ca���!|gN�3����@�J��Kwv��n���p��`_g�!�.�|g��u�|��;�'��24���0��3
�s��lu�v��3A�!����@f}(�Q��v��.sTu������+k�����0�(�U��C���YU��5h���rc����N�����Td�5�]�f�',<�{_�h�4?�=����"������y�����P�/��_mw�Z
�����[�����w���nw!���0�7���V�}�z4_\7��w��a��C�a��*&y-&�fi(�P�5����^�
�WL���������[�,*�1�����
��
����<dUR�Ch@�%+h�6X_��[�	/���L�`��4���s�*�
4���;�d�q:Q=���=�������YW�6��Ys�Jcb���[���]����b�����p3�����u}�@��vi���nS�����R1DP�ab����@<�[i���Sw�-N���sQE"A���6����V�it��:���&�������G�6C����Z��zl��?�*lq����L�k
��	�5��w�sS�F��|�Um@�r����do�;UEy&�������n�[���=;*��>X��� h��K��L��>��]��p�@�l)���7o������u�CA�r�l���
�a]�+�5�+��q�������t��%���}AyQ�G.+�<�l�F]/����!������W�7����a*�&�L���s��Y��"�+l�|��@�8�	�}�F|_���u��X%���e��J6��r�����1��"���b�)�~�7�\b�G?��>�Z��F��;�������+*�-yq��
�p�QT������B��|!V�~sP�6R>�*n������v9�K�Q��o�\_b��	��o
��]��u�|�+F��Q������u�q`��H���������m�!��p8�'P�����s�3a�������YW\��u�`�-�} f���`g4ZT�"h;p�*��T'���~�u�=v���"=�Y��@l[|�����
��z�mW?D�2)���4�7�m=��.����6��]��D���R���
���b��,�`��2�F����u?BS�����������v2�>C������'_>��^��9�(���R��������;���;���=��R�a-�d�@�{�+K�#���A���
���]���G��a~9�l���z�YW,7W���R���w!�@�%���'D@8;}u��(M
����l���i���[��l�E�\�0R]*]���|��8?���Ob�I!����2 ���K�e����J���r��%�K��	��KJ;G��i]W�n���@�_���Y��N~���sI���\�����p�������H�ra�9c�UU��0G]~���b��Da����=x�.`(����AeA"�\6O�G}b��|�a�@��L3������u9�A>���/)g���t����(eP�Om��41���C��r?��e������.t�������	|�.X�o:��Jt�I��6��z��FX���V��C�}��]mb%����0�����a�����~�F'"��q��%F�#"��l'T�=*
�@]�N�u��T�]�gn��d.���|>�������;�!�N!n�G������@��%"}~p#E�|8�-���S�\�����>��}��������w�A���`_�G��lO=����D���}]]��?�!0.��������;��t����H��%�������}�i��"�=\YPG��m3��;��7.=(
���{���{����@��1/h��I��K1�`�*�A����BH<N��-�w�����=�S�/��.��AN;*��e��:�Y�R�o<��������	�5)��l1X^�1��Yl��#e>
z��iV�q0���Zua�z�LBk}
R��j��`���6��+w���5�u�ns�JS0�=!}�-)��F��X��z&C~��1�'�k��_H�����&���&����L�b�����e5�$�tb����<���&{����vSX=���������������#��&���:�;��������p������I����)������}�t��������#������e,��V��0�������4�XM����	v���m_���=8�:����.�$������y�������V�������w.\X&87�5(��4/�(E������R\����LT�����T�m�������j;��k1O=]���o������4�)�]�37ca�I��*��D�Y�ib�O�|��m��*1q���%+f3V�3�Q�6!��^���I�����,��)�������l�ib[�8�d�q^�k��-v:�����1.��5��|�O���w?��VA���9�������Z���5�}M��/j�}&�O����>�=���fM����Q�����Yk�1����tO�l�7��Q:�lq��[v���n�w�<~�t���c�5��6���+��+�/�*]����d�u�|s�0��&�c�����I����+���l���c�M�����I��_T�t�f2,~G=p�����7���eZ��C~�{��(M�6��_�����xTiZ���{�=X��m����@��a�`X������r�E�;�\�xV�6��y��������5w��+��?���GV�M�r�F�F���t�j��?N�jS�2Yg�M�}Ev����d�6���hn��(x5�,-r]���*?��y�����(:�&�w�y������4���]��7ca|9L�J�t��Y������l��C�P�G���
����ls�6d���R�}5��<!��3������\���w�E�g���$r�aX��0Bdn{�3���oK�y�a���y`�Y��hW��A�V��7�����>�{N/���%���	�����t�`���U�����\�������Fpw��+�DU��D����YNyg����'j�����xX��)�N/��Ac��'��
&��]y4]����4.�����8������F�����7���-.�3����,�)�~�=`���4����@_Zy?{�m������Uj��W�����Vj��L!���=p9#"��%��D`�5d�c��7�6�%����u~��Q�"k�WZ�����IL�d�<)�r��p=+&��A�*��*2��L9�d�Q1���=���?�"��p��=��WL���T���DQ�`��.�
�i�%���L�@�����HM���&��d��EZ�����l��u�������kC���0��n�����Y��	G����cT�?�A}B��\��T�Vv����b��pf�y!����&q	^��\h]������?��k���@�<�D�+��n����$�z���HX��0���-��4P�TCg���74���a��q�3���Z�?��a��pH>����F�m����D���D��x����Z�d�Wm3���^"���c[�~�F�����8��5�LZ	�-2&�irRe����'���'��e��
��H(OV>��E*�a�2!���5���`����!o��Y�$��$�v��BT�% ����6��b�
c:���uvW��R���&����#���|�@���S�s����`/�����l��y�*�`��?��A�����\:@o��r�X�2�t���+��3��}
6;������|��58�\
P����D�]�A]�o��h�N��o?8��f���M=���������v�������@��Z�u�@pw�`_�{@8�������V~��|L��Fg�&�}L�<�'����`!����`�V��>��i���"m�� ����?�:�D�����BC�\�<��ns��k���H���,Y����q�I��`��|s��`W��<������F�5�~���*��j�:�����P&^krcEc��
�����
����Y���qc���l�Ub��ey�6O����7|"���4�E�n����',<������H����������B��y?������,7�g��4����9c��]�o��8��o6]��2��Kg�n{�����A/U�:��2~���n�g��������mJ��G\������t���dzP������.��fY1TN'l[��<���J,y�r�9h���Bt�R��]�@����L�B~�K�y3��*���o�4���rs�,)�,V������N���
��}�D�����De��v�����f�X%�}�_*Ji�I�6��L�J[U�%�<�|GU��|������<��k2au�����$?����,��Y��	#[V%NN4��{!M|��%lUY������8�vb��U.N�4�PtU�H�W^��B��R�����8����@o��T�7���
���s
�������R�A��S������;��;����WHf3�
��v���(E��]1u�6���I���M8�(U�
:�]��9Y��v=����m���u�K)?��AO�9t5������h�(�dUhT~��mE�&��8������d��dU)c�-_�p�
{�iF��s���!��C`�����I���27A��}�Y�U��Z�$�^h�^���<����h�/x�*w�vx�`H�h��B��,��d�7��u�`��hA-xPEr!F����
�]��uno��
-Z��u��)��'�;.��[Q���/�}��JW�(q�a��,���)��\{�.s'�7/�b{��j����4H�Q�b�I��b��b.�Ura3��������@o��U{�K������5�������ya�	��,��i�H����������9���,\��OUX�U�*���&,����|}����������[��l��U�Y��lU�J��|����	���Q�[(�^.X��N�t)4�7�?s!�z�K6�s�"
���AK���B�u��scU�iy���=�K�����T�����B��6w����@�-j�����JF+UnL�K�%�6UR5�ek�	������5��d@B�������}�����vW�)���x�7��!��J��[�(�v�b%#Xm�U7�]u�6������H���O��Y����u��F�C)���57VD���r*��|e����Y�s��e�`T��c�6ca���~)b���*�������_a�3c3V������E�*��7�:��=��@x�r������@��i�������:���.�~/��Az�����D���A����K)��������Zt��f���|)���[�t'N�u��QBO(�2����;J�N���>����Q�u?\TV�`�.:_����n�a�8����2������~a��{3�A
z�k�Tn��d���	c�r��Y;���,Fd�/��?�RZ�^���z���Z�Z�+�����8������R�v�@e��K��Y
���b�(u/X�9a�����-��u|����Y�K�2C.��a��g���5�5���l!����G�49���vkL��eU�.Y��e�sa�`]��oNx!�|�)B�r�
�B=huw�9�u����|�R�`��R�{m��se]�zFv��������{,d�/g��5�i��1��^�����'����)��-n�;�E��u�%��B�(1�nE��	d��3��X�0_J��-W��XX$����F���j��+o�����_���ir����^���8��OZ�I��m�,��K�	��,y���B��u�����@eIh��Q	^��3c���!����=���F��VR��%���(���D���P�'p�X�`@�a���[U��Ss���������0��[��@�:)h��7o�so�h�m�&Z���Vy3�U�O4����u�:��%]�EP[����
�h��1
�&�l���Y~JaY�-��l�9��;I�p�G����[	��vUhz��o�~��������u�U�l�@o4ao�	�z���������Z�%�[�ka]I!����}�W��'�kZ�f]1�]v����'���+������%�[���:�HP�N}���L�.������U�����w��#s�|c���[�Qa�3..<�!�5��H���%E�V�����tU�K�mQ��,&������7"�����[�����!���./L��8D��V1:��v�s������G�[���d�����}n,���q�r�a��������ib!�C%�Wn�f����9�|��A�[��a]�PW 6Gu��@�n�,&�J��u������*����A��V��r��uJ*������:��p].&�t�3l^�F�V:���a�a�[e(�6��%p3M�y��� ;�F�U^���������EK:S%�|��&����`�s���$���9�[��a�
8��I�E�I�N�`O�r��]?��P�����./�fq����,lUp���d�73��LQT��vU�*��F��d����h���^/���7a�]o�3������'��6O�=��j`��d��0J��;�N�F	r�Nt���t�!��j�q�*A��v�`�JVu-���So��XJ'�e���tLP'6�n0�#�L��gu0���
��7v�"w���O2J0�
B�#�]]':X�|:S�������q�_���
!�~YiT� �H��w
�h�~������z�@��3!�[��su*7�@�K�+����Y��}<,y���F�V�<��"�����&,���4�����V1�����~�g��f]1���Tl���a�������bE/���2m������*A�_� ��b�����\*Q���,�d���z3L�U����_�J��M��eP!����@]�)�u���	�u2q��A&������uN�)��P���z#��-
�}���Jn�d��
�+h���
iW�a�E�f�8�Qr�a�,g�f,�x���*��*�����uP�kk�<����.#"��Q��g���+lu{��s��f+���/�fq0h\]E��9a ���h6Lg���W��Y��]�|r��3u��Vi��������u9PA�.��u��o[H���W���J�`�z���R����`�P6,��*c��v�@W���bG9�^��Q��h�W�v����cH	��:)��W�����A�#	-�s*������y���	�8[7��9�.�(����@]��5�|���3�E:c/����(�:�W�����&���@]���a���������`D)!������Cd�����?����m������V�m &�G�%����]W'�����.5�6WQ���A�
��%,�T
��.O0P�
���S�V���6�(��5&���X��r����K�iN=��4��	�u��@o�F�� ��������"�W��4z��`2�H^�2�0�W�a�$
NYX�c;��n��6w'Bx���}��
��;g��]J�6caG�
tl��0>�����)����so%���� ������uM/@O������S4^�d
tU>�Ls
���t���5-r� 5J8��r���+���2�un�Q�����j���}�vm��FeB-���(�ar��6���1�L�G�X����<8R��\�@�H����|�%#��|PE~�W�I/M4�y�6~T�*�j)���^��0���a�bW�Qe��	+����K��fY��|�����l���Ri��o� ��|Q�N5��u��v"]S��),��fXnn��S��U����?<j>|� ����LVY��C�5Ui���u7����Y����g6���25 �l�F���hS:���k�?�U?�����A���X����:�kP�!��[�<�\?���U�������D+@��vc�8X�n_�U^��<}��"�5�G����,��jh�����$�w-A�������9�����7�4�m*��J�m����|�����\���^zTW�
z-���u��Q�XUl;G�k��J����w����|PT@�������XQ� 
V���gK�<�
���*G�|�����uEF�q_0��������^�N��9Z�������7���d�'��\�6��M���--p��*�a��
���
���F���B�y@]+16��R%b�k p3�����m*��u��@��DIU�����8��3�&;I���t�]�{��bc���5�S���.�����G	k�V��xh���~�m����Q��
���a�������'�m����*��������V��%�G�y�^��������3vw�@_�1�N�3
���Y���%����-���8�T"��.Dn,����s^%������X��J�������g?�J[OT�%�����~P~^�5��`U>�D]���g���Q]���5*T��T�%��a]n�{��H���$�@�k*[T�6�{��x9���
l^)�A�Z>���|�j�wu��������T�~��%�F���@��V�jkD��4
v�����} W�}�1��-��*���r��6�t���^b����m�q�n���#��B�<�A�+���6�4�@�������6'|�84����]�a��du�B��Ks�yA����g��FI^g�A�����v%�������j�����|�~��6luWYP���v���A�y�o��V��R��}1�R\�.����V�ki�Z<S���7�s7�`����6]3�����%�FI��l��7��v���*=�{,��%��\&a���� 8���}�~\��V�Z��KYF����3��pTT���$�����'���u	�K�|�����E��u�5AW��49��5�h�[�|�>��K����t����<�U/{�f����������-�Q����7�������R��~~\%\E��}��Jl�VU�?G=(B��q/)���\j�U/i�����U��?(N�x\�"y*������\�1�#��y�`]�(���:(8��v�N���Y^5L:jt�p_�k���6w
�������$�a��b���K\t���$�����.�vw�5o�4���&0J���E�����s�����l���.]����&
�r�`]?Pj�,�y�'�����F��%����@�����o��B�?S�Wm�H��{W���XNq9��K/3v~\FuN�@���dw�4�l��Q-�������Q�twaW'\��Yu�!���g�f� ��P��<H��:�j��IbY��>X����k��uR�s�i����cD��]��GS�����/��*L�`F��Q����+R��T��,�����l����a�um�'zpCG#X�/����F$���&>��"���g��z�D������<����hK��`�s�
%�+$X�V5F=�OCq�q�3S#�M�|b?�KO�D���G���7o!~�Z����������/������)�@�+�
���������I;^ds_e9���^�o_�}�N���L�e9�7H�����]]it�wt���	��M���Z��*��$�a��Wla�����
c��V�5_��"t�$B`]�6���x�5�#��-�7��X�S��fx�a�jU��������;u[Z�������+a���/�/j��[���M�z��i�Z}�Ym�>!@���]A�r����)�";�*���*<��v��z�����_��L�������tGa�g�z�)q��:����#����@_��D���������@TU��6�Y ��o�G�
l�Z;��*����5EK����Y�GW���X!g��R�-�W���^�����ly���W�`�<��	|�01��@w�U!b����x��|ULy��v}��pO�����������-P�\��XO�h���aUE�U��@K>1�Ext�@������Y�t�@���Ku�8~��m���
�P>$����*�TX�/7�Ui���~�V��b��.�=Qg����A@������R1i�K�A�� q3M�!�$�K�6��'L0�j	��i�/����E�u�7@�Q7��r����U[��iH��W%3�	�=����5�)�*��G��2}�~��Y�1�:�����r���U�YTl(U�=Y���_Q�4zP�������M.�f��A��
��1Q�;�
���jU��)�B�vN����lhYD�6��R�B��`����P��~��y�,�������n/R���b���$��L�=�W��gVNTm��K���	���[�������I���k����t&��)^l(=�4e'��A�|,�*!�/n��4�J\P	�|Q��"�+���#9����S���x�|��	���^���4�>
���������8�%.%���������F��s	O�_ee0j^��E���c�� w���(��
��|��;�U�
-lq�u�Udh��^a_%+S�
5?��	t��)a�?��uu��~��i������������z���
����\$a_�ls�������9c��A��]+U?�&�\�`��TYy9�������.uZ���"l^�E�u&~����z�UD^$a_��	���*���w��=��8�
����uu~sX
��@���o�+�]H����_/��
��B��L�5����}+���.J����4����2X��8;���:xBl7w��jU���%�����/j��R��-��y3F���m��d3����u)B��7P�)E���g]���N���/oP-r�
[��g�%��~���N[�l����a�W��R�^����A��uO�p�����u����b�y��������u��@���a���(D�_w#
�=y��i\��^W���\�����b��r���O$l_%a�z�����iT�_��;t����f]��\I@����k]�����zs�|XoJ"�r�t~����%2��	�>P{@��Uz��2��a��Q~�8)lw�b�R����fo/����
�n�
z-���4�-\MO������8�]y��~��X�����]�����0c������p���=��.~��:�g�i!3���$�>�@�q��ou�#�-re�H��9o]���-q����6�T�u����\�(�������]������t��`e�MX�1
��t>�3��J��{]���A�6Wm6>�i�^"@�'��wn�`{�#�������I���W-{�5�H�.����`�()ZX��?��=����
1Z�F�,���A��9�.�g������r������/���K�
��j�-4yPA��������
K�d_� l?��F�u�b�+��2�va�A�i�+h�����s�|� ���a]��9l~�7�4�t����������@�|�PA�(OlQ�T�C]a@��l�V��������u�F�����M325�;�)��G��l�6��1)lS�	�k�|l�I9�
��^*����&���@���,Ncq�g����������i��1��U������%op���UW%���}s���G�����6�����E�X��n�����$PW�0'|�~�N\T��:+n���WO��C]�A�|rgA��(ac�Ke��6���������
��k���Xa�*6h=��Q6.��m��bYA��0X��=�P�6.�����xIA)xn��E�J���,��	]��h���TpQ�����#�$/�S�
.*�n��#X�����d����\T��d��y�Q�ib�8�2�%z���Z)���VA]6��,9�������z9;
�����Ue��(�%�P�t�{�8���$hu'6�����\��:Y��
��`��-�g����`��:Xy�E%X�&L�l7��Y�J���m���ENs��7�d1nC��Y�m�hu�3>�S1���0�kF���!U�qNw���4��C�b��k��f�_��Fr��
�3����;��JN� z���z;�
u��l��\t�	��'/56����QGTw�y�������o���%'�$h@�3N��u�D�K��fm0�����u�CA�"��b�d������f�{��%:�F������Z�
}
���)��H���d|���K����HpQ%b��������[�����`��1��\��#q��X�����XJ��uB��Ihu��@��xz��j�JJ���/��%�{�$r���L=zI1-�UlW�����z�G��8��T	v�a������ q�k�g�8C.��\whZko3M�%������|�^A:�(�\���4�k�67V���h b[��-lwIS�:��9�R�=Xyw/v�JP�/1a4�u_P�-.��Lc��C�U�Y�� G����Vn���D��8��sd��Zr�'���CZ��NV
(��
�@e�-�Uv+����EA�������n�i���E�]j&�������p������.�P\�7��Y��D�Q�]���P�JgN��J
t�/!�[����m��HAHv�o��������7-�U� ���O7����`]2��y�m�i��B���Uj<���Q�=��"_�����^�b��A�;������nQz�����f,�(�;�raDs��4U~�i�lo
����f]1�\�M%E�����L
�vOv7�(�O��A�9
���ls1�@o�
�im��@{�8X4J{vml�Fex��
�����h����sC�q���}�'�f�+�E���H][��Q�f���=��.ys�u�xs[i�k�=���}�iN+JY`�|5�M��������xmq�ds������}��G�� ���DD�ze�B�����,5��c���mX��\!s�s�5�`��ZC�QR��-���VJF��e���������W%�,"Tf�2�%�yB?g��:��_Vh����D��s��\Jz���`��AhuQ����e�fT��e�([����g{nedt�)�p�b�f-�|�nJB����9�{����m���9�����r����N�@�s����g=ys��\�X�';0���|���%a3�lH�6O<J���a]�	���;���d��������(���y� ����k#�4�X	�Yb�(e�� G=��RI�u
Q��#V�K�R)+����qq.�AoHK��0y3K[W�8�3��k�
z�J� G\\���.��J2�^8�Ht[��Sh�����3l�B-P)w4h��~M:h�o9�iq�o���y��(�4cX��������3h>���@���"R�ri���9'����)4��&��	�����oi�4�j<@�|�YE�9>`/�m���=�In'���r�[���5��[��������,��K��T�7��rg��/��>��JN���,����n�)#%�
��WU����ye���vUIu�����tU���.l5��u�"�\���P:�&��Hp���T�������0~���J�
v�]�g��7Q��]��
��r����
2�u&*�*�4_�^Q�JDV�x�:��DUhfNX���n�KHy&`���������+��U�~���3��(��R��p�����r�U��<Q�<�E����������J�r�-u�E+�3��X'�����]"����@]�P'�
����'|���_�
�KO���<+��U�	���������z�nR������]+��U�s����	�Y�A����U�j���o�;�����]U
-��<�{��`��ls�P���uJ>+�h��4/��.���8"lu��y,��.�~�*�z9�>P'@Z���	���+Z��9nzI�i�OH����n@���<?���b�8�eguM���'
��~�`]��v���L���"(0�����k3MNy���u6�C�FO\%�(W��	���7cq��}��y�s��b��������`]f6��\�H�W�r.u
����W��������4���u�����X�C�R�A]�"hUi�s�K�v�8X�z�����WcL�9�5V�WsT����>�Hb���V�����������zu�Z]�%���KPR����r��@�cc3M�gQ�T�C��a��3��'k�E�Rn�.��}=��d2'��.=ps�������u
�@��
��!��n/]��/���DmE��5������J��3^��6O�e�2�%v�D�:I�9j>%�����Z`�;!e?���0�����.��/+��U���^qI��Wy��X���u}�AW��bY(�XwTy�8*�3�Q�>x�0,T��d]R ������~suVZy���~��!��Bi��<���S�9�a������aao�*a��d$������|�W�I�����yB��������Gy0K,����A�1>t�����������F�i�. h_�{6���P���k��X����-�FgYT���
�)Lt�vm���V���'hw�$�]4�Q����G�u��q�r���C1�:�Y�~�8��ifS
�6�����)�;z���-�.7��]au]�~�5��X`��F������:\�ggm"��x�6����.U��^�V����b3���Kv��t����v�`�����>��C�Y�3�LY�-5��tm����@�������[�u��v�����x���.�lw!��W���G������@�����b��$�`ZoW�����+��b;F�:U�U��6���a����{����R�y����ru��`����\���M�e����B�l�`/�������I��?��=H�D`��2Qd��[�������C9Py�a���e��X4����������Q����;��`�f]1i\�:���R]�K�����pv�������\��l_n���0h��r����e�h"�d�`����X���y��t���A&��y��]0��Z?��&����M�a�j�jFh�]~��P6������6caZ(�`��e>�W�f���N�l�@Jm�����<g�����u%��+'���#P�6_��1'��W���P��x�e�z"����h�+�y���pu�R��,�pM���tE*8oc��[�cd��}���i����A.����m��f�:5�9l��T�2����kqz9��`yV���)3
2���������d�B.N���6�OuR����y��7Oh^4X�!MP%����3GU��hz�n��6��{+����oS����L���O��V�����-l�*�ev4XWl�bp��Wy<��#��~�/��4�bL��u�A����o�C�Q���B ��MU}��9�|�TC���]��,wd���HC]x���������X�7�k���A�[���U��`�yE�6u~UV���J���6�:�U%|�3v���%H�Y,!g�{2��J"�=1��m��[���V�WPW�5GU�t�RB�.�V��!_w	��P�DU��D����rnS�_�����pnsV�����j�MI��CZ���
q��.��?�V	�O�i��6gD���6P����MTU�_���r�*�1��������;J�U�n�Y�K�f]�,����� �*M&�;_���mJJ������{���b��
7���dwa_%2Z�����L��:�nZ1��
����8����T��D��T�����U�
-�H��U��Um_i��	/a���`2*qb��O�o(�6�{{+��9���}����_4h>��������K`�*������I��fU1�U���"P��4��{�P������A_��z��DJ��C1X'�?Q���� A�����`�:���<���������l�+U��� �}1���3M�>��>Y�;D,0���`n*��:9��I��1��Ni36�3,�����������zq(�i"��V��\��l����`�����G�irh:�W��������:�������t�����������&&���j��6���������]]rc����E����rOa�,�4��I�
��Q^r-�j���v�@��������tf����p3�����&�*{��r��5 �u�A���Ku��y�u;S�=@�"���` ��+X���TuCs��=��s�)\�����P��,+F����]��Q��
�vgw�c���
6��.A����^]��%_Z�M	�M�e)����}������'����n��^����A�.��]V���H7��D��K��up�.�?Pa���n�����~W���f��N�r.����C�4������������u��T.N�����@�rnl����T�7����"���S��A~=Z�26��"M���FUcw�O����-���A�����L\����^~T�K�v&�5�@�)Ad���j�;�XU�Y]��	;�.��+�[��?n��_�'it=I��4P��sM0��wCJ���j$���os7�Fb�F��7��������^�
ib�9lw�!"�\D��N�pc�����>J�B�WVn�:O4h�WdC��)���J�������xCsW�u��=H�B��)�Xw�h��)�����1J�Ov����!��������5:i��6�.G����z�Y;�d�-�pO��U?D���j��lsWHX�`5%l�F��Y����Yn���`_w��[�;���1#���;������la��>���Z���vWQhu�PW��)���
��3���.)bJ�|����(X��q��b�Nt�R��msWdX����Xz�c1J����z�vc	9]�z]��a���
�\�Bv=�����{���6�=��j��g{��h� ���X/�����Ji�A���I")�m��D�Q�m�7���;��-�f��$��Bp�m4����z��2lq�@'�f��'���)�%��F]��v�M�d~a�5{P�'<%.�����o#i|���Dps��`���5��+���Gp����As���Xos1�)�����a���Uv���H��+�dU��Im��j{uI�k��f]����������*m�y3M����%�~3���6YeYNT��@�:B�.om�����We+��i��
��r��\�+Le��. �k\r���'4&�d�oH���6��q���*Oc�*�e���HG���+!l9k0��`�
�V��MT��*������eE��+�_V�
:�n?t9�6���>�`]�o����V���E����+���v���]�77ca��8X'R3�%�h3M��?Y��6Qw�<�����������+��a���!��������
m�[HI��:G��/N����e��,f��!�����}���L3Je-��������,1�Tf-���1�������~a]M�V�@]�t8+�g�7���.�N+��t�9�����=x_�����p�/�����v�>�F�7������J=�O	\�����0C�t���nw�b�.��E,��rgD�7o(����\���g>H4e�JC�u7� �|�NG�U^�o:����jf�������b�8C
IYg��];*i�K�_��it�9h�vU�[��2��\u���k^�fq0��4�u_�s}|��[�OtY���`���*�A�QG��+�K�k�g7ca[����T�[���@,�^���#�[�����:"�]�>�V��y>�Ni4����h����@��#��]�@�k�1��$�ib�(}WX�v���6���p1�`�%o���Z�*Gv�J�%p}���`]�/��0�<�}_:���m������� ����s>�`����OI��J'��[��v��U��s�|�eGj���@���GP��E�� 	�Vy�	�v�*�!P�4����fi8�T>�d��<�W�D�w��[TH[����r��jlI��>u���i@�e#�{YQ�u
�a��E
 ��A?7/����������\���~3M���#���Z��>6]���b���;��bS�w��7\���vw��]
�6ca�M��%�g3����r�Qu�K�X�q��51���r��B�_7MdO�>��CD��%�3�A����%�����:���)��LQX��Y��%����a���]�6���s_+��3��.����4H����������h1������B��.�=��2��c��Iq:��]O����!�9j�`B���?|��Q1,��h^���������W�4:�+�f�J�����a���������D��}P'|C�[�� P�\���k�LQ/r�.����������07�
n���?TO�GPm��-�����+X��Z]A@��rPo���O	�>��L��K�EN�Y��nw�����2�&�	z�n@hr� rc�����&�?���t}\`e���}�����4��y�����a�x
��?!������j��Fn�W
�J��v�0I�������Nn����\[�"��;��m��HM��3���$�����y�v�`_���:�":����6v���p����u�i4�����Cx���s��������*������j:���	�N\Fh��=�.����`8W#�|I�	�������XT*�������
R��Q�*���3�YL�������Q�L,���`�y�Yrh��*X�A���/�\�@e�P�� �pc������:����<��\
De�w�����V������%[j3��|F���sP$tFu�v<�Ab
:�RBDgP���J�+�'�&:l���Zi>����@e�n�k���O8n\���Xcj(�i��&.�k�k��Oh�m�[���e�/�L�f�f��um����T�b�y��1�>������Uf���4��\�@gr(��_�}��s������f�fmeR��%��uL�G��V�V
z�[w �8�����a�Z���������y0�d�&���Jq�jT>(AF��o�H��������Wad&�[�`U����@k>/| Q9T� �+��~�����?!���������X4*�[��b���U.����x���+F������������4�-�	�����uj@�������	��Jh��Z�5Wn3M�(w'	�e�����LI�����fq�����3h���;�1��;��|��@�r��a���sX�i��
<���[��	�:����	r]KG
���]��u�M����u��<�{J�v�����6��h>�~�9��{���
�un!FU9��kK���`E)�IX�U=I��1aUw�fm�K��J7=D�!��.��X.������/�(jgD[�&���w����@���L
��I������f���x3�����
z�Z��Z�J�v��^�����{Y����`_��!�$�m�����`]�	�������5���4FRs(IM����@�J~����3����@t������L������5UK���DV�������`�K^�U�^r@/.�Ayt�4@���9+#���z��$�������@����C	�/x
*oq�.7��b�)�0X��>
��4���T*���PH�:!Q������w~��M�]��������.9�!�K�Pn���������o�6^�w;V���^�������a��)�����S��M��V�����_J�i���Ev��]���\M�2���]jE�W�U�@�	G��/��>�U2����.W���b��r�1�]�4�6��\�2�y�����=7V������ '�"C����^�de�n�mI�������]a_��z��{f��@��z�@NV�j���u)���v��	�����=�������?PW+��sm�u�������	iR����M��5B�Y�Tg0{�e-~��UG�L\4w�+�>��
���H�� �|l�3����uiyE#�:����L�FO"�S]X��������D���(
��D8�UaZ����?�8�s3�C���*����P��J_��l�@���i����~��m�k���-{�BV�>n�����v��
������2:][����s�S���@sz����w���hU�m 2�6b������m�L�y��<��T���wX�U�S�%��|?��
p�u�dty�HG���@��r��iz2G9����v6-����
�@�6�.���.�{P0�6�pw�`�x�f,LF����:��i�L�p�d������
�>�2P��}�|/���2:����.�qnM�����([]b\�����.��Q�S�����u�^������<!f��4���V
�^����w�d�W��_S�Z)l���o��k���	z���@������P�^���8n�N���R�y�JDzzP<�`��c���9��G����@��bR��R���+��"F���<�fi�����4��4w�\F�z��O�_"��81�}����_nfF��9;5�c��i����@_�=�Unn����n��^N����D��J���p�8X��hu%����������Q�eT��+y�=�FA�{�L�q�X!��Nij���#�;/�?�a���`3����#����h]��*�iFM�S3D'�]�������1��-���%���/K4��L���>P���'9e�NK�`�H��(o���E���s�J�p�)u���8�{IcTyV�� ��/�����X����LT��������t������d�O��
�_�^����5��D�8�������0<4��7Q��9QUp3Q�D?��������uuo�s�"���Qa2'�/k,��*Q���t������}L$��
�'��an��f����n5a����O8�7�h^����g7�0���e��V��R���e��~GM��������O#KLV�DU��D���y����0�J��0�b��U��_�`q���^�`�������A;���O�� ~�s������\����DU�z���b�6����p���c��)���j������h�6�}F�a���w��3�(�m��6�nR7~Q;�h6G����M��dW��4ZMk�Js{�Jjp�y{��X45V����U����zo�C���'�����*�f�n�N3���o(#����D����n3��Ua��a�����	4�������?S�2�5qd3v��n����m������$1�������#��`�^F�g�'w�)�m���}���������G�����F�w��$UU�UJ�����a��?G�Q���c�W���tf���.6��Nyg�����9�3�)6������Q�}n��X%r����~c ��%�$��in��W��������:���M9X��?�g)3�Ls�F���-UiC��3��&}�5�~����B��w�JAz�W:)��������j7�'���4����N�_L>S82�����kJH~Gu]����x�8����~����7��.����'��3%��-�L�����2�m���!�W��f��$Foz�k�f,Lw�x���K����m��d�g�����x���`��z�[~��?��������(z������_����nQ�6	xm���a�9�?��M�����{�0�I����.k>k�;��.q�.A�(LT��M�����u.$���g?��I��Hz[p���L����(z}��^������@���
�/��f]g���r;N�F�n��hZLt�*�,v�Kj�����+���?���}i��3/=�vw����8)Y~�LF��������#�.����M����@��LF�@����Hd�~���"�w�Z\�^���{�`F����*M���M��h^����1h���/�����Vi�J>�Mw��������`�^�V~�T�%mZ\9���X�f]�����dUw��V����MA�D�'Y�g��|���.m��Q>������J�jJ�YW,Fw#*:v	)�8�T�q��������&�6g�1��-z-!��b�E��vmE���N��Fi�n-#�|y��$1]e'���g��T�C��3p5������4���d��h���c��|rXw����V��?���Q�lu��)�����&�j�o��7OvM�L�kqF]�����1��=�<9��*�dO����5�����Ay�.lM�a��?g����b1A��Qb��� ��81��6�5�7�d�6�.g��\c�������:�3��r/����������u���%<.��!�������U�� ���/]�4���m����<M��Xv��w�A���������Q;���yA�=������j���6H���s����Rl�6.n�����E�X�8�A������/ZB\,3�����*%��Q]�a>k����$FCy���f,lwN�\���Bv?\���;���{+s�{�0b��jn4�����n^>���b���N���s�x�_v�v����N#%������:F�����Th7�jH���g=(�E�����������O(Fu�7���S	���=Y��*�/����50�\�l�k�%���>��\���&��]�J�'�?P2��$c�^v���]�s�nquY�.���b�8�$����Pv���]|6O�]�����]�[����5��EB>�s�������N�9/��G�fq0���"�*Ol_��K,��'�PA��P$l�}��M���Ln����w������<���a�2�'���/��/ejM6��\��*��_����������-���Ia��
��ysX��z/I�'�<�1-`��,�Um�4�]�K����r�����z�����KI2�V�������t��D��
��5��c�=���a���@��B@�R�%��ba�C�'����U��
[U6�D�(b������%D�G��#����@�mn~����C0XW6ZTz�+���/F���u�l�K��A�
4��m#"?J!tmb�YV,%@�6FI�N��;<���K�:��.do/%{{�|��"��kr��	�����b�F������U!
����@/��
Z����E���Q���uE1�R.����6ca����[u@���������<��;Fod4��\����}_' =Y�
��n�����_��[�)�J��R����oY���3M���n����\�����{�6cM?�{.t0����S�R�a{>�z�qz)�S�qpGl�R�s�N�U���dU�U����D��R!X��k���hs�P��v�����r~9�]�N}����:�)���T��*��(�P����uE��������	��K������I.���Yr�+q6���)r�������{[���#?��������6�9�|���h����W���c!��cI����@�s����'Z����������K��C��r>�`o%�Z����`���5���WZ����f�y��k�a�+q����m�8�_��%U�Y�[��	{;_Q��j/)�O�Y�j�.��	:�63V9�u�Z���7��]"�jN�P�y���)����KiB��|o���5�37��m@������	�����Kip��M��j@�f"2���M���A���Pm��n��K�R���r�[������(��_��������t�a�J\�'��FP�o �z��a0���`�IhU:u�2uT�%�g=8�G������-N��{���T(������R���&��YcQ��
T�
=��DSf0�&@l��Se>�2�4����@��.��	��\;���
�q��)��],5P���\�7�����$�����?��W(x���@[^��B���;�.��f(L0�[0�45�4` �K,	T~�O��S�����6�3z��y�j�`/w�*��@�TC/�������Ka1�:�>����Z��7����2������T|����?3�Y�����A�-.3���6��
�>� F��r�����K��3��=|"{)9�����/4]/�����RuyC��?��rN�+�]���S1X��9HKDJ�r�W�� �=��e�'���[z�����R��Y0��F�V�/>)����8W��=XW�>�`���&dh/��5����J�C������<������<!�s�;\�X���@�4l�!lw~�._�������`+��`=Z�Vhs�vg<:��a���|��K���I��_+��uB���+>��4�!&�������u�o��^N���Z$a];������,���G���2
<��9=I@��R���.>��.mmV���"���N	���bX8#m��81��K0A����u{<��GJ����k���b���%���A�2I��11u]��hs9����z������Y��u�"Qb�����f,�
qvU}:@��_�Cy�����Q���r.l��>
����y�As�8��������[����5�&�B��R���uwJ�o]h5��%�N�Y��'���)������F����p6�)����TG�nDl��"�P��9�R{�������[�4�C�sX�o@>�A����
�Fu���C�g�)zP/w#���qaW�Gu~/���5����YzO�]�����;�@K�1q#�{���l�U*$�3PA�:���l�_����O�"=��D~��b�6e��Q�.�q�[e���k_�<���@��v�����T�aU`�i!����7����-�}�"�6_�{��|+=d��}H�>�&��`'��A�Q����:e�����9l>��F���cE;%4����T� ��������R�C�l&�2T@�r���&;s�K�f]�Q�h4lUQP�k���
v��Y���i�	
��<n��o�����s�|������$�a����F���g��rW�`Uj"����TO���L��{i���m��7��*��X��J�vmU�FU#?g��v&�lP���^(7���SJ�����4�<xB�/�Y;T�0hS�tsT�]�:m�K���rS����~�f��3�(�Y��X����������|1Hy�����5����YV��@4�Y��g�4��o'�W����^������'9�HU��=���u�iA]WD�q�0C[�vQ�`o�m+g	��#
���I����`��"������e��)�Q/�U0�y�AoW�4�|��������`�.�i�=�n���U��Z�����G���q��;?Q~�K��(?�2=����S	��M~A�
��|��V����`oUMZ]��Q�"�7Z�������[=��U}����*e��8�{�HU�^�����_T����J-Tn��e����W�<��!�ow=��t�\�
�����������[o�u	�o��s��4�u�<��\��%���>�i���m��o�*��Y��������.	&����y@�Ol�?�g������@Pb)�Ui���?��k���X�0k���Qp^�
Sc��,���Ht���F]��p^��F8Z�����Fgx!�Z&�R<��A�����m������_$�����%Sd�8�`J���F��s[�t}��X`��V&BM����������E2q�&� ��u���2��� x���4�j:�0P��-��;?j^��F��v&
2��:�t%�:�t��d�%��YW�7���l�j��=Mt��l$�p�$�]M��!P���H���?�=xsc�#��� �|+�P��������x��pvRp��hCN9_�����4�'{PM�&��L�`���$�|[��q�h�%',��%�U�.7VX4.�%f�c������2���p^<�F(���g[�4�U����A�3j��R��u�	=�,����wls����^� ��fm8��� ��.���p�F�d�����*�F���'�d���+��A���3Q=���x��J�v����a�*������������*<�����J�a����`�����:{"���C��U�e�oN�����+V��1A�7�F��v���>.Jh���8�e������*X��B���o�Q���fm�,�,�d���^�G���	1J�nI����4Z�u��zG�(��J���_���M��KO@��������6��A����]�ci�i���*7O�������3��!�D�]�,��.�+�� ��$��J`��FCr��7��������"��*��5v���o�}��66�E�<�A�J�k���X�+O$�������$���?{�5��]}Q���(PqV?��>XL�(W{��T���$���}�5�?7��U��F�0S}��QE������cH.N��A�\���`��U���-q���f�4J��9gu����RQ�]�����`���p��`]���M��b�����F?��r��{+�_��
���4�,!u�����`�5��k�D�
������G�ALV���k�+������0�Je�����1O@��T6�D5�v��,�����	6�Rx�&~�61lW���U��!�B��a�G�����Y�����v�eE���M�xI��<!�o�+�Mn�?�-���Gi��V�Kz)��k�:'�B�s���0B����m*���A�r��G���~Uz���'z0�k�W&r�*s�e�OT�����it-���+��*�uE��8�6��zS����|��u	Q�N/t�C*�!"���Lw��o���*�V���
�B%LO����������;��L���|���5��������#���)�DOv�U�[�����3�����y0a���f]�KT
������]m]{���8h�>*p�Bs������W��7��-����-�6�����mn�pH�(�D��k�C��Z��^'4k��&���{U�[�����R��]�)n��@p�E�.�t�bj�u��<!���r��**]7����X��"��������	+��hn�vA��$�������s*������
t�L���N�^N�g�^nq���>�@������8l���<��>JW�����f]�on��CS�a��Jf�\��it��Y�x�
�8�t����F��q���K^�):�h�7�"�� ��yf%�[��U|��@���vy���������	��}�
.���
�jd@Ww��	�I�s#��N�U���=����������3�����6���S��E�I/�*�����*PW�1Q�1��mR]SXW	0Q�YG-�9W��$���#��Gi���si��?S������9����sq[4���\m����bg���]b7����i��14�����:��GUE	�h��� ��u�u��A]kL���-�G�8��G�����+�|��V|�3�^�/7����J `���l���t!�`����Q}���r���� ��WzP�}�r/��2����.����0�U~��W��fY1�TilQ�Y�?I�.L�4�A�������Qe��H����&�|����%��v)���0J��I]|N�������Z��W���X�Z"�E�G
��Z�9�|[��c�5�������sL����|�
v��'���������uZ����h��+�����Uh]��4����1lw~�)n�7�Q(~\�n%Fm���D�Q�uZ���]������	�J\�a����6L�.����AV����u�}@/=	�*),���a�8o��t���,�(z=|R����	Q�G�*�v��fX��F���:����`���!��.��t*��LFun����+&�R����"����)P�yB�!9�'�$��<_��4���$�d�m	�u�6�� �	���4� �u�����2���V����U���-v�� 
�Z��6��AspsF��q�jh9�i"3dI���w��	�������R�h�����,�F��p����@��Z�=?�W#������m��Vw�:\�o���������|s����[]�g�k�3�:4� �� ��k32��	���=��G}9���lw��@]|�i6��e�)<}V��W4|g�s���+#t��Q�^��sc�Kn8�w� =�(�iX�
	T��vtwv(�/��l=��BR�q��`e�l�L#?KL�Sl9(�B�q>g�����k-4g|P8����L������)����"���A�*j��15�{U�����5�.g�fm�+\�X���I��Y��������kT����C>�yd�i�.��T:���r��U��F�����bZ��0y�������4�\a��M�;�#����������*�*�[�Z��t�s��W��*�*j4YUi�4� [^��Eh�U�o�k���Xc�mv���EF)�M6o�����j��Jg���i���z��~�}U�lSY��%���"f�������:�o���j����S������`m�4?#it(?�U������_Te_w0�����@/��8g���@])�D�2_�w�"7R?i��{M�:p'�~������6^��h��e���������3d���>/��k�_n��6}m�<t�,r�~p��4�*�aX�{�t�MP�!s���;����YV�(�����B���W)�v�i��}�d���
���C�M&a/w]<��ibH�?��+����(`]B�DUH�����w@|W%���D�u�,Q)����|���i�bn�U%�LT������R��*}�u�o��D|3ML����*���30�vp������`��J�@���4Z�Jk/����l��7�(�� !lq^��}�i�ZrA7�q�ta�����^h��k�����*J��o�N��@^�E��I�L��{@��u�&�b�n���qu.�:����z3MN>���e���@�Jn-J�e����}pT����2MXO:/�S��<�����z���*_�^�"7cqP;c>�KUm�w��1<�sS�3��{~~�X0�-�)���&�����u~�@k���E�wM���5l+qPg�C:�	�_g8��y����5j���E�i3F�*<���TT�%c.!���z�����0���bL��|p|��\�&�;�Q��b������bQv}�1��ow��l	��?G�w:}�g}�<+��1�������)�tRa���o��";��+��r[���@[�5��t���z�6g�����9�Zs�H�:��w*����h����	�r��������~��P���:\BU�.2��Au�u{u��.�t��@��g������!����.�_��?�����"X��7m,:TA	h=�kDuTz�Pu����-��.�0P���R����TW�j&&���yX}�V�/�V�������p�(������H�t� ��	u:��uY���l@_��I����������	�h����$l���p�B��
t�Nm��Y���\���X�.�0��\����9]N6O�����`]��9�;��h�F�*��T1a�|��w�G����yB�>��W�Qc����yN��*��{,�_w��r�WHE:t��l�����vw=j��<���t$���	>HKCxq=gsc�<w�rl��i��D!&�L�@���6��y/��lt� �������F�A���W�^�:s����O��9<l~m0.��$lu�����X��lw��@�K|�<����y����W)T�:�2�v�t@+rm��+,�E��xF�I�sTwVQ���Y�P��s���s��LX�"W���Xa�8[8�k)B�L���b���$����6��RZ>����G�sb�U�� �
4X��T�
��K:
���m|�n#lq"����X��9���k����&�sX'h�����t����Yl0����F�/�����CD���"���s����;]�n|�t�d�� �Z,�F/w��D~��|]i��gS���=(K�t� ���fQ���$�����[��85*��lug[���0��[��K�6�}�^���N����f��n�wx��w�����������6���1a]���<��7R�1�����"W�dS��qfW�k���X��w/X�&��_=g��p�T*O^k�%5	[��x���6	���H&����C����J�fN8��$�:�a����pcQzG�M.H�Y�7��of[�O�Q������@[>����]��I=Yei�^�'$����@G>"S��,*^��A��ML4_aRP�,J�{t�[�L�1M���0�^�P����)c:�v(kT��]���.Y4���������%?Q�V	�T����� QY�4� g��\�,�G����������eA���#-�����\��Uy�AWE��Q��-:�EU�NV%]���@�irT;c�Gg=1�RG�*�Z��k���B���vUw<Qu���+�&�J���~�l](hQ~j��no�8X4*�	�e����ib\(���:�$�;�q��SHJ}���O���n3M,��+?���*7H�E�t�V��j!o��D�Y�:%r����wF��K��fq���6&��J�����1�*�/SS�N�x��}��7�4`*qvm��F���Y��L�`/w�u&F��9����m�8XB�
����D����R�7O�9#W���8a��i�w�,����������i�q��)���Un��KT��u���^v���
�E��NV��A���
tUM��s9�A�e�r������F�!
�v�V�s�eM��+���v�u�sXg���Ev��k�Sn,Z�h����-]{�����-M�%�V��Z�c�Q�����9c�Ag5/5V-�>lW���y����h��K�:.��
T�Po�+Z�Ei��^�,����*��F����ib�8/�u57cq�;�*��r��Y����t��`]�lP�|��^�@���A����2�a��7���%���_Pw!a��gB�E	��:e	P��|��\=�U��Z�F+��j(��w�{&s�F��(��:�n�]����i��u��Q5����^�tbs?I���@���fq�g��3�����Hkq?z�g�@]�N�����������/(�g:<4�	�/�N~Fu��^(��:%i�+��YP�]�+����r��������y���8lqq.�a��_
i�9�!�
[��,������J�.�^���c,*f�p�vOM�k[��4���4,l?(�@hu�!����*�����} wy���n8�����{�����k��kq~�JkY���v��L��%X��~�@e�y��]���������l��6�`o9M8�.
�g��H(S�%�+��m7�s�5��<���U+��@������{UJ���)�����.�{�����o=+�A����"�|?��z�L��#�"
�����49���lue��7=��|��"�[����b��Jo'3V���'�	���R
����A]U����\�F���u��4�n7�G	G����@��nMA���+	"�nkT�3c�]�Cc���|�
/K>@�xnq�}��%���l3Il��+����U"����
�nQj��2#�}�J��A7�����L�+rY����S��`O��[/�{���r�@�����"c[������N���A�
���}������1����P�� ;��/�����s�*���u���m%��`Y����>��b$�5Kh�����n5�/����:�'��r"S'�}����o�^���'�s��`e�J��/
������	y
"�E)����*���������B�u�&I
��.��.[�f��������7�]�}��y]��Pjqn�Y]���������2�u-���N4K��{�*���&����W���	9��T*lu����O�|�\�Q���Z���>(�q�E�Z�}��u*��Io��V������z87���vE���%���s�y���\������q��1��2�\�����:������ks�4����:�W�@�������n�rOE`B�.C�����h�8�c�%XZ���}1%�U@:7��5V���UDa���`������ �@������~�m��:
!���ogU���Jd����T�UU��Q�j������`W��f��X�K"��>�)�o�[�P���u%�5�#&[�S��3�����"&�Z������X�nS�q.�*�]�fF�[����Vk�U�H��*�����*Q�3�N���;�*��G�k�fq����.�P)ZU����W����Y,0�]���[���m��[�
�>Kdd��3e��.�5����8.P�u
��T�/���b�9WF��6q��l��^oUZ��.����A�4�<�/��(�F����4�*��F�G��h_�6����v���J��TnW��\�7O����:`/U��z3��0GU�����,+�R��u����9y���[�p.����`[;3'X��z���9c�A��J?����YW�r����tW�@�1wc��#=�Uxx�6X�r;�V#�N����-����a]78�G�V������Vd�]��:e�5:��9��lVP�����m��Z����p����@�m�xI�{i���g���FW4����U�D��J��v��@�]��|�dE��:�*J�nm�/���,1��2�s#D��*qb��m���K��*@��������;B�UI{�*mdH��*mS���-T*Z��-��� ��O���)�Q������E�jf@]_��j4A�����`�)�i��|w�r7�����.�k���
K�ED]�~B��]:�d5��|^Pw�������y�=����A_R���\63��F=8�Q����
'������*a]k)�[%�O��7����f�*��u�d��K}B[[~R�W�W��i�YW�L��
+�um	�(d�M�scU+���]�~�b��7/(Y����/�%�s3&��"��6(������{a�w��]Uz�<[Pi$������vu�2���f�����@�U�Z��Y�)����i��c�;43vGr�K<r�8_.��%]*Sf�7�R���_�A�u��t]����T�T�:]�9�3�qW76YwS=p�!"�6w��������;��E����`]cOPy��C���y���Pt��
1l��[8�\2Ji_-'����@��B�>.)��K�.�W�%�Ru?�8���A^�o0�5�,���H�ibI)
rX��V�(���{�
�Ae�o�-��RQ��.�;�����D	��:�0P'+0GU
����b����E��g�4�*�m��E�4v`W�m3f�K��;������J�z�.����i8��]T?�U�"�Vw��S�^'{)f����l��iE�����u&{���zU���i\h�W�h	+_5�=�vM
rW����:cXw�h$c����n�[o�h���3v��L�`F���E�my��������Ub��9�A�I��<���.���33�������C4}���<!6��>��7����*b�U���G(��|��`JT��}]�>6��rF[�����}�B�(����Wd��z"`��c�g����aZ�7�����_
�6ca
9_K'M��k�4��#�s��y���z�����������������o^�/�J��5W��}S��b0'�l������47V�.r�����Q>�J5��?D�hs�nm������Wd�}��s_p��@�F��~��&���{-���XXQ.]0X�t,���ib
��^��YQ������J��]�����!�J�n�SHI7��1��XXND X�����\_��wm6)2���
u�e�������:k��u�\�Y�2'��=p��./��S��-N�o�W�k�.���V��/Yi�ir�)�t��"h�;�@�'�����Y��;��@��I���:"����8�uO8l�����\�Q��gC���������m*";G����k� 7M��������������<d��>�f������m�-�V��!�/U���<��K`W�f3Va,�GLVY#�O>�����[�u�&��ng�{u��zCO��raX'��z\����t���b�*;Q�q�U	(h�������z`��*������A���jCt����[���6U�z���	���6U��{F����3JVY��� pNX�����L��"~S�fX��Y���A�rC^��X�����.����MT������R�M���Q�/���f���*��Q�����A�r��b�������koJ�
��D���m]E�6O��(?�n��@���5_��P\w���E�.�����i�}�B���Y
S�\�(�;#c
��C���@�W���M�{�v���.�,����]����K}�����X�Z,����on����]uQ6��BP�����!�m'��3
T������QC���/��*z3�������g��E�����Mkl��Wscu�7	���4/�
���Oxq�n�KJnR����,/J��v���kJ`��\���
��� ��C*�@'{uD��
�����d������F`�*
�N�Rlg������m������@��7����6�-K�f�i��C-�5x���X���(6�����������'�7d��F���:��W�h(7�n����=Z�M���^*�T�F�W	:M4/2�Pv���k
�f����^/�w���/�G�'O�����%������}.b(�6Uf{���D�j�/��<�B�o��n����e�{9w��L��OnH4"8��8�\;X�W��%��n��@�
!Z�2&������@lsn>�Z]����md&��r���!����+���XS�5o�N�Rw��:� ��l��irj��=�;/���t�,ae�1��6�@��TP������:-
X%�)������q����Ge(
A���������;�6�5]����K�G��5�
y�����:s"��yvP��R4�5��C�u?a��3pQ]��'��UU(�.�%H�_
�^�L7�9��.����nC�S��(U���9JF���bfX�Nh�y	���es��`/�M�E����x��7������r�����t?&���S	aMY���A�6]����z�|�����b�8gS�]��$���
���b��������<����t�c��%�1�����&��+	�r!�vYAV��B�yB,��	;�
&��������
��t-�`�+t�2�F"�F{^���R�T�8��^Dj���Q�&5_����YV,!���:pM")�T�E���F���%��v�K�E��s4��:
�����`W}�<�L�@���]������\�$+���i�98=�l�t
V���.�Q�<(76�U+K"�n\��7��@P���=��AW�������k�B��W��f,� �	�:HF1��7��2���)�F�}�S�'|p�C�9�r'?+@#������V��l�N�T�1��]9D�M���Mi�:=g����f�}�7��y�D��$lJ��uo]_��49��[lqn)t�9?G�����5g���6��E~\�z	�.A�` >8��l�����m���wi>��@R��p^��k�^.Y�@EABy�^5hp3v/N$�9W� ��`q�J�"��/]�n_�ei���F���uhD�"�)���l��.�s��y�AG���u�����QU����Y���q�CXnf�t-�@/�FZ�sr�6x,T���A�|������;�Z}
�5�{3M��R$��5 �J�������w&�:�a�������f��i���t�h��*Ec��2_@G^��O�U�;��lb3�`,����P*�5d#��U���N�]���������$�g��f]�M�6�=h���tJ �m�"z�G=p�u�����X!��t@��#����*�
��vm�L�=��
�U�)�wc�*5a�zp�D�q������J�tm&�F���it���5����\��������u�&�w�w*�<���0��
�E������z�8�����k�z+�/��&=�|��q:]X�x�d.'z��c���1�c�:�U/�]U��^*Q�@������(��x
Q��*���U;8B���]��t1a]��5	���}>l>G�#��U+����F]Sj��/����}�=z:������.�|h>����:��U���D�:`I���`w�v����.��Z�YW�0%
���AW��<�,��}���Ua���o�cp��`���Rj���Y���A���X\�/��]E����f,LwA@��h��Af��`�����
d<�{��]��6ca�=-X��3���L�����u��]e���z����_�}`�����0����(��.��Xt�s��M��}�|��`���D��,=��Z	f��F�sX����y��������a/��0�%���4�z��x"���,�_�Zu8V��|���N�z��u	���e:�����.o�!
��W�u�n������u>� ����,1J����*j��=���%*�D���hY�R6��<p�X���RS���/��jw>�`������(�&��n<o;��1J�
qVU�<�u����~��k���`�(9YX'��>��z�k���EX�
v�����}������������Q�]�Z��n������@��f�t�t946��Q���`����]n3�.6��	1h���Z�I��
qG�v5�rC����nmb��%��C<7�7��.=e���k�gC�s����"���5�,.B�;a�^K��fm��TE7��.����e���������:����j��QW
:��N����Q�.�w������#5�����n�tU�O�At���/��$��yM����S���ku���Z
��D{3V���5vy[��.�������6p}j;�!��5}��rY�=���H�v�V������\�����������eX�>�b�>�H=Hl�
�:q	���>n�kg-p:�����u����	�v����g���rv���`e�3R��#�>�s7O���R���u�!��1c�T�@R��5v�/��e.7z����X����j
o��e,6j���N�q��<�{��p�fY1��n\��'�������������d�C`3����V&��+�� ������}\V/�A)��2f�?;��Q����4��_dPR�N��_��<��@�\��Q^;d���T�L��s���c��j���[�fY1]�n��������5����4��l��jo\��b_=1i���.��<�+�g� ���ss[������@8��������P�v����I�:�l�P��I�q�C�i�~��.�>��*�]��7�����k��^��]�	��*�6��{qP�.^�����
�w%����^�	����4Y\��tpj�\��������7���r�)��K�f,L!'E3R�/��*6��j8�yB�x�u�^S�\���J��Q�r!���P�u�YB������X��h�K_]H��(�R�I�2SwP]�~C��z�uq`n���yh��%��yw�Zf����{�@�{(]X��\�-�Y^��l/����R�G���*�N���`���
AK�%�@�z(Q�'�1���#��-���.nz��|�=T��u�������n]�G��d���jpJ�_���NT�w:8,Q'����A���s����PF������b::-����*F3R#��	$����LVIU���P6�E765�>SNlS�M��u�et��f�S	���8e��*8`G����Z�;�����[���A��j)��f��WL���pZ�z���c����DvOf��6��C�.�����������8�����0�pU��P%����&�����"!�:?���
��\���
����$Q�2�_��,&'�8u��W�^*��V�K7l#��������;T�$Yw����DU��Y�H�����i�Ow���8�u��\��?a�Z�k���
���jma����
�A�[T�;v1O���@%x�K�fu;���/]�2�������C�3��.S�Y�v1L�>�����G��[R������2��X'�:��H����h�cJ�����`5�qi�@ x�xle�Fj�:�q9��j1����Z����f��:�ur�C�9�N����%Q����K��6�2�����`�
��-�i��{��|�9��&[�[n�����������^����	��z�d��+=u�1�6�	Q�Z�]��GV�A�F����r���Y�+��d�}���U��s���O���P�����r��j�`;��-�+t��@��6�V7~B�yA�v�+����D�M���-�j��H�7&�d�;H��k����,�W�N���p!�`7gb���G 	;9�[l}���p�����_��D�������m�:�v(����A�S����\��)�9���M���>n@u��G)vZ�P��t�,�
t���R�C���n\&0R������=
Tu@����x���T���U��Esc�Bb������T�m�s��b�lA�:v�r������&[���f�Fo��znf�������k����t�,���V�������7��]��&��>�{�f��f�ph�N����{_C�����w�|;�b^qK�@e��5
t�4
m�9hZ��ud��������S���fT��f����-�}�q"C�R��$�Ae	*VU�&��/&�F��v��A�A�Y�����m���sn'[
Y���<ae��e=1��n5��8� :�x(�;,Cn[�nky��5:��et�n,����$��J4Yw
��w!����a��l���`�~����������N�hL�U���*=6���lJ�v����
��#l�
���j]+L��������������r.?�U79��X_�P�����.�=�6��0�2��r�U� ����2�j�r��9��*��PB�����@C�E���*b�Pt5b�NQ�����+�EX�"�89@�a���6������>u����pY������>.��*�}\�A�����y��p}/i��D�����xj�\<!.���"g�N��r�~���h��J��Z�/��;��A��e�<��D�O���8\� Xw�������%E*�s����"a7jCQA�����x�Y�q��@Bq(	E����vW@1H�����qA�6�En�& 9\�H���6*��m��'��~�����UW����F����� ���v������Nz��������+~FhRi)�Y��<�F�OQ����j�'|���I�������t&������U8}SR��a�,N�X����3��-l��|��G�U����!��c����L�x�Y�M�,����Q
?��5Ni�JU�-�����	�[���aL��:��L�����[���D���b��F�1YUP��c�U�V���?��:��|L��X{��9$:/�e��9X��"������e������F�����������j����S�����j�VI�0m��fMv�sJ�>�r�����W'��U�'���6�b���F{1�wc�?�5M�7YU���Y���vMs�K�5%O����It�D[<a��tu[��V�>��vMGMVu%%z����s��/���l������L 5�f�=U��#6�3��R�_����d�5��dMQW�s��b�l�&�����_�b�s��`wV������%��5�y����~��=���%k��I��	�D�~�u��Z�
�;i�����g�uY&����o��z���	C�Y��:��2��w`*��Uj����L�Q=\��F��F�Cb���U���n�SN|#����QN�t1���H'��y�g-�K\���;� )h����4G��N,����r�(�����������D��c����b^�M�6����$�L���0q5��b���!QUW��[��|���?���j���������8}.p�Vd=^�d�?	�~g�������d�r��F� Q�/zL'������
�dwM�G���f���C#��14����\>�Gu������vb��[�Ot;`�2;�����`1�x$�:*�f�UM��*��D�����?n�)TJvVn\��70����.����/Q���.Kk��?��i�H�1�q�����Q�p����i+t�\�	O�F���)��R�$7����fd5�U�O���'F\�������� ����-k���?~����:��^V��q*�8n��(��U�t"Qn^��s%���%�{r.�>�����Q���/�f3���Q�*=�D�r������8o=�������w�����s�@7N���K� %��^(���V]�c���a�'��^~���MV��%:�I�&.���MV�[%��{�����a7>
)
�����^7������	q��ln�u�����rn�E�[�"5-o�a��8�)���u~�E������%�Y��5���*y�_T�7��+~�7�������������j��������?��}�@�n����)%h�/�XS�}1�xQ������0���6���sO�o�Y�+^�FKv��raW�h:$��{���������u��M}��m����pp���&�Z��pa������4h�j�?��W"�(�qE"h�:�$P����+�L�T@
��;����)P�����e��o=����F�J�8�s��&��uO�v
Z�G-D]�-�d��f�+q���e�/E�����`�Z����WFe%$V��^����bZq����\_��,l�
�R��n
��H�&�8w�]�z�<_|���@�����'dt~�Uzz��su��:y����us��g��-��d��+���R]Xmm��N��m3()o���BF���u��@�k�|)~Vo�Ks=h���?��G�������xQ���_Wj�X�;}���N_��W�/&g�5!;7��Qw�y���5*�5��������9�+��H*&�S���G���N�pA3����s�����x~.��-��G���/�#�����?��������
���.��,��p7���brp�����b�[����Js�����`_#H�`��`���A]�R��kV~���U��n��NV�������A����>�"������w����E���!b4��\�`��������u�#,����3,�m#���.�����
=6�0���D#[?�\W����������-��Kt{8�` I�V�h��k��:*�w��X�:�ev�d�W���:hS"�9���@��P� �39[
[��}U}.�[A����R�S���@t���K�����Z�u�J��������^L��-`g���-��������@�����(	z�V��Zt<�>�����@]{Z�+�(����}T�$���[3�z�*�"�oV(��J�:}�
��U�C�M����et�j,�.s	��_����>�R>����YR�*7&�w�#/�t�C8~j��Tr��mJ�/oS�g�v���TU:�,��xB�>)�=���������e�'�����,A�*���f���<�]/h?��v	�G���@���ra[������Ru�����f�~=�������`oU�*�cl���]������!������:l�h�W�(GK�)����@_w���dO�f���a�h�������-_,���l�.��|Q���R�N����H�_0�z��������*��s�@��ph��Q5I��@�Sv�u��JL��.���s1���J*��Rl���������*v@���_���<"���Ab�Pj��2:�3��=PB����$�����+�`�Y����tld5��=�����m��].5��t����2�?V�����bW�{���D����}���h�x�qK\��=�aFY�$�N�j�O�_��aoU!�f=���@�*c�p��C��p��`5��$U�9�z�������8���������/��=B��pe7�v1���so�FL��
I����@��M_< �����m�+�u1t�]���uh�9�@�xn����l}�YW�:�=��p��@��/1���	r��+�v.y,���b�8%J�	��=>P�;D����������
�3�n�U�_I�x�v������P|(�b��MN�N��H]d�c���EEJ}�A���<�8��.t����"���
�N^����P�U�7*��'l_L��s���{Q�>�m?G\��:��������*���g\��[?��jp��nlnD.��=��/���I�.u{�����O|�a�p���g��0�3�;���f�<K+W�@������,����E���U��}X�D�������@�:�������X�K�]79��r��@���XLN��{;O��Wz��;�J�lE�eg�a�WR ��/���J/���<��V[��������=\d-�����#e�!�rJ'nN�f�����C.���qa��.���7�l�

����@��v�s��t�}cJP�=\�����@e�R�������,���]Y��v���=�
��W�xB�x��F�V���v�CwW�k�8������8��A���t]w��*!'�y�[LN�\8"�#�V6Vp�(����?�`�K�*���������u��ax4��na���s>x4�&����}]h�6?���^��F1/��R����]����+[y�EQv���A���Fc#��,���Q�u!����u���0CL�U���������/&�������s�K+g=T�V��#��]��;u]���ZP�?`sc@<T��/�7L���F��S���f��huZ���tZ���{����z7�\�X�!w*��,u�#�C]�]���`��Z���Kya_w���e#���tXu:<�F�%����������ct:�������9�����,h��vKW��|st��;o
t��������u1V7���X=���@�^mm��3s��s�����fC�I���h��p�������>�����AWY��59ms���dha�+����za�z��D���Y�.B	����MU�������L���a��@��+@�*�J��s��0���3`���uI�sZ-O�yB�������]�2��Pm����
�Vm;��R-H�^�s�%{��	���U���O],�D��T�n��8�I��������'r��Jg��w�,l
l��)
C��������Hqh�A�a�S	������Lu��(������r��u%����-��U�~��5���h��U?�z��yd����-~�
[xJ��Q�s��T���!������sXW}6<|�?��+�-&���A�*�}�E�':�����uw��n(��H���tv�E��t�X�q����]��;�9u�U����(@g���f�����nAU/��	q.T�)��K3��>��F
V%�@7��'���[��t��~�[J�p��}�Q�9X�q;_���K�N��6��Z��?�eu�|��f���'����I����e���d����x"���
��*���rXU��iU�5�����'��s��fk|	$�Q��V���D��t��`������&������'u=������l�mi��R��S6t17�n9���"P�zNI������E�s�aa�-^u���.��<��%�������JD�m�����5[����q�FF<��'�7P5���3�����0�j]b"������*
P�S.��I�o�g]��������0�9VF�����H�����*��6WU�Y���L���'��q�����QG�
<g��P�4�����Z�T-����g�����W�U��$hA�KP"A��'��������`e�T��9�T]'9���\L>�*����9����nA���/�����"{����v�2�zxr��t(� ����w�${*%Y�W���>r���tNU�=9���J�vy�Y��IZ����)���q��g�q����Y����\����,�_���z�����2)��]?[�%.��D�����<���6�YO���.����������{�.
��N�I�y��Q
��"�D7>
|!����d<�W=��	�������
�(e�d]RQWW�xT�uI�)����dQW���!~�{�&T���@����F�\�����.���[G�����'�1�.���y����:�b^Fe�^Zu_dX�7��h�����l!|�~�n{�A������`��)w�
�)��n�	t�t�� ���:(�zO����F�4������u�E��&���B��n���oJ���u]���)p��H�������#vnq���� �{���`��.��\���vk?�G$�e~���J-o��+(���~���7�t�E��Z�6-����et�m��6�����{�O)|!�|*F�z�/c���QJ��uM��%%�!��`��p�)?��+��g\_T�N8����@�P��	q,\7X�R�Tw+��=���.H���!��
EtsO�z7{���=]�.�������wO��Dr�T����*H��59*{����}'t1�x�}$Xww!��2��F�I�9T���*D����F
���'��<�
vV�[��9p)fd��b�'j��R����B~���,���R��J�@�
A�oOW8���g�������dao����>Ag
�������`e�b�����[rT��1O7���Z�5[H���4a��;��q��l�1�o��FD]O�Q�]j�[�������mi��A�Vj�R0k����	v.{]��?p���>�3���I=].
�T��Y=Y=�	�9����bA_��EY�Kg��oiCQ���y�*�z�nP���U�t��XL+��*X�}T���f�H�����U�WZ����M����]�Q��h���!�����)������0;�tSB��-9������|"m��6U��guJY��J�����brn&�}���rK-Z�	'�&���O��$tL����������;)��F[������T�l=����m*I;�n�����TS�u~b��\�V�?�6�^�l���u7��*�:_l�xBvy���A�z�2z�4������������(�\X��|U}GK�\7�T��4�w�s��6��-��y��
�&�b���W��mS:���[
���&��%�����������;)�R�M�^]���m��`�E�-Z��,�<���%O�����������=
���zZ`oU:�H��YRv���������:���Q'u��,A����,�,oV3u�Q^V�8�n?��u2��s�����{O�����K5r��%��E��'})?����uS�~���������(�9��B��vU}�Z@���E��-�������-����m-E��+��c��#��	�#'�\0��Z���n9g�P�u�����1h���#F�\����4��MK����>tN,�'J	��>�����mSR����w�Yma1L<!�����U}U9���rXuI-�n�^��m��
����D�/�kh���y5[�8��YZ���7q�����D`�Zi���UMw9^(
t�~���mS����yC���(�e=�L�br���0#��v�@�*~}'t��8R.M��(�C{H�69%�JJ��e#bQn���K���o�l��6���<A�|qFiTF�;7.����6U��Z~Q�wnU�xs�U�<�\SZFW&���v�c��~�z�'��N�
���w��M�/��)u�4�:l��|�H��g�7�4D{�����x���f�N��r�Sm�bnp]|!Xw�+��8#����
�|�I}�y1PY��h=��VpsuMW��%nh7�{��|��u"^<!.���v�H��>.n���_F��4���O@���'���+�n�/:;(�'�s�`�����k�.|���n\(�7�;k��bR�N��	��M9�������No���P7v7��:��_���uc'8�R��n
����7~��n�u�Q7.M��B+��~��;��D���V��:v��c���X��rh���O��brp���k. XX��p��>�+z�MI��f���)�d�Tj���Pi��\yc�u�����������3���Xt+������\a�^:bJ�o����"�z��v>B��\�|/�br�J�.�|���n��M�bn�	���.��7JTQ�mJ�}��.l�[�C��.n�P�������+*��C�x=���ns��`��j�����n�`��W�5t{��
}m���0��s3��u��������������C	T6z�[�c��!%t]����=iV�=�����"��\q9�{�@���_�s��3��2��;j1[$^���;~!���������R
5Sx3��ZT���>F\�W���\w^��[E��.��J0�
���q�\M:�����YWL�����<��T�Z�N($��{�2��Iv;6���
�;xk�^��
��%��P=���pS2��2��RpM�N'$%������%[�� ��FH��T�u��q|#���b�"�x��������Bqs����Y���>�4���n^#�����	$�k�B��~�kC���]���s�����O�G�J��v��@����(�J�XR����^|��Q����.;��+�7���;�4��;�k��+T�kO�����������Q�v����v��~��[F��m_�U{�����iTF�3������:���kGv��%��=��h������]it���R:IV�@�����N����t�6k1�'���g���dL��W-�iU�C�W�u1��y5�����iV����e�� iu�6���W�m�r�~~���nYGc{n���
�j�\�R���jRUq�4Z������U������}j�Y�a��'|���.�]~���U�7�.�};��]���U����T%����s�<*}��7A��������r�����Y�Xcu��H!r%���C�p�
��*!��DA�����������_��Q6~}<F���U��P���O]d��a�U�5�Yo��h�;�
����A��8�9�x@\!����b�s=~�j��������X�!�W�B���-�WHe�`�;��p-�v#�P%��-Qe�)��u���yW�����tC)�����:�k��)�&'���������wUm����u������	�T�v����rz��{�Z|��a��i(�G����.W����[�yw��`_wb:�n
�H���{`]K��Y���������Z���a>�"j�"����>�\tviO�_�T�a��u����R�zV=��L��$����a�@e:��� 
�NP�UE��f�����{[�^���+��u�h�C�7��u�et�Y�
^�R���F�#b�]V%X��#E>��-��?���a_��_�l��]T���L���g���<�`��Bv]	#�(��W�w������[���N[�O����a�����
��s���������Xi�w���r�����OM�NF�����&�U���h���]g*�Q.����]���vD����j���R/��kO����4}`_�+�8�?���u��i�~�oG_���Q��NFt}Vi��
V��VN�7,��w����K�����S�h�w%'���iD�\�g]��#&���.Xw��]���#����>e���?��������zw��(]��}K{o$.����	�u?�EC��
��<K����� D>�@�L!���9�k�������D��}�)�^��a���~Y���Z�u��@�"�2�N��b^��������A�}���� "�ra���+.�+�C�����H����y���FJ���o���&���,�b�x��j�zd'n���c��w�}��E��5	�N���l��;�>M��=J4�e�W��6Q]@p}r�O����W�uw$��4���.+�����ZwQywi��Qu�����W���yW������|�+�)n�x�R������8����0�l�&)����@o�C�������Ec19l�J�V���uu���������{�D	���N��v����t���g$�\w���!��]�����d��4P����H�J�tl��(�ww�Gq�V`�5<�7������@���	����B���3@���B|}�G��+U6�g*�^���rA�`o�"��!��x�_|4���?��:34���<��"h�;?
����W�s17�B.4�����>.��U��`uJ�/&7J����,~
�o|�8`.��P�SwJRF�y���mt�Eow�+����@OW��,��xBv[W��;��[�|n�F�ea=�dC�C����O
����
-q�xT���"�ucn������:������[��)
�yiA������K�����qu�]/�3��0��#������u�>���e?�y6���l*�
I
����_��2z�c��g�Lu��@��bZ�#����1G��� ���AD��{�����C�ZV�+�����~yiG"�������������a��P@�>�[��OM�2:_���W��I�k����fH8;�q��U:�j�&��k3@�x���u�k�"��*l
�T(�,�QFg��:Z����5v����j�I������K)'�D�@�6��>���>~�V���R�W���U����k.����!��QD@]]��������B%�R%��Ns��uc��������PUK���0�U���\�^�Z	��*�+,�~n��O��zg#�[
�U�
P��_
 �'<���#���<�.�z��1��F,�����y=�Y�������K��6U��[_���Ty3�
XB��	j1J�>%����k�u�q��sSm*�
:�����K����*S�����T���1�������/x�*�/��|�b�_����&�?!�����
W��J1	��+�\�c�;��Y���M��
�
i�K)���2Ie�p~x��,���+WLV�^�nD�/��/%S	�����k�-�C	,���} ��R���M{��������u���Cu�����(�h����y������5�k����Y<!��b����:Z���C����t�u�"�7W\�0_��V��@��h���O�N��"{�&���z�viBR����P&������������;�s�.�v~�UZG7�f"_�vvN�-l����(��f��E�������P���� ������F�z�L\���B�wV����APKo�G�R����y��Zz=6�H�^��q�4w��\_w�.�M^u4��.e�t
���W�����{��hj�a>V2tn�\<!N����m.��p�{F�bX�8���{�WmX!k�W�m�������
����+%w]z�.�v��{���`��5����7^����5[�Wchu^��;?�j��=\p-���A]9���^q��{�0��.��m���}`t�:Y�M*���!rN��
��5�U������
�3�M��F�J������)��*F}�e�2��:/�&�@Us���
�,=Zd���7d����s!0�n���'�����e��u%�H�nT^"	+�����t8���bJ��z����=m1�x%J��p�����u�����n�_�����a���l������)=��Rx�D�~��F���������-����u���u:_��xBWf��n�QytB���|�.�x��~A�.pS��P_�K����A�V������/�I�\��:�b)"��{E����D{9G4�9�^Fw���^.��,TFZ
��M��N�������
Z������9�u^	��}Dw���lqE���u��@�����X	b�����R��=]�^�-��J��U�����z��'�*�~��fdw/���Pj���Q.�����:Q!�V��BaX����"vd�7<04l/�"�;=���s�mJ�uu���.��nT��D�n����e�q���+���U��"^O���O���i���|1PN��u�2�q=�������k����������\!+�$N���3�$i`]�k���$��U ����9KuW��Ki�����@�R*M��p]��B�W�y�=�����k���b��
���f�a#DA����aw��
�����n�Mq�qb� �19�[�B��C&���A]E�k���t_�����V����N%_[�.�	�f����PT��	v�$���@���F���s��f�F%�)��@$���)�_.�"��~�G+���
	2�
Wm��.�WK}�\��Q�t�Ct��%���U� ��
�;[ ��Q�������JQc�C��+�����r]��y=�{����hs�
��n'�h�AK�r	�`����s�=7DPp���3����@�K;z�rP����7P�U_��$�yG]��u�?��e}w��������u���Ve�}���w�����a������y}��
V����e�X��������[�#�7'�MLt�o19�o.��8t�9F<��>�����d�ao�|HT�2��;���
,��J��y=�W7��+����^�R=�}���[=�7z���e�Y��������/@�9
�.�HTE�AO�5�:��;��[��J����=U�T�s����x��4{�SW����U�V���TUc��G��D�i�Oj
];K�����n��]u"l����.)�!?������� �|��V%f@�*9�hD�Q��U�
�������A��w9`���u]W��StZi]�>�h��5�#V]���i���'��kw�;���@�2�l�t.U+�cJJ,�_S~��V�Y��z���D��k198��7��
���[��`�\���W���U�����P����vp����f�����7
��$����~H,F��('�0���)�r?��:����(l�J)7YU{�U�p��|����-mE��Qi���z����^�#�}�a�/��}�UB*��U�z������������m*��z�!��,�����g���/��9������F�-�[>!;7����������xc��aT�!�W5�����e�e��a�$�brpSU��]�kv���SU��F�=p�+�u��N�0�� 8��"�?�=�Z����A�zm�����������x#~��X� ��)~�>�@]i�;���i��r�K�o���F��]�{8��^l~�C~+EY�9}XFo�n�W<��N{�br���{��G4*�7~C6MGD�[���h�����@�K���#p��}�n
X�,
t�n��������(9�d]���@=��sw�s�V[���U��}��);����\G����aV�(�>��-����
s��+}�@g����@d]���8C.��<�z�fV�._W�J��	�[T��.����
��~@��t�NX<!~����uR	�2�V��5s���ysnT��\��ysn�rt�o9�HU��(��J�v�-�����V�Y�����D�
��%:���af�K-i����ut����P�,���
:���d�w�G��������VkE����A���7�����5[]�(^T�ht�%r��8%�yv�/8"4�������^L���!�����FJ�i.��aF��|���'�?p=�]~r��q���\�����6�"x}GC_�vI����L����KR�hJ�M�Q�P�M��F����w1�@���,����%���v PwjU���O]�F�V"���FM!�����H�&��u�jO������F�.�l�[�u�p��$��xB�%�k_�0��n���O���}��}���i�B}*4�QrF��k����(��(ym��e~0+������{|�P�=9�z���&�Y=�?[�pi�@�������)�d]\%q�������{\�
n���}�Ox~]G�&^�A�������a���"�.���t���-��F�q��5�+��1�j������UWi�|�b^q7�P ����@���b������������&���
u�Q�b��j8���c��E��v���>����\���s�������� ~����
X�vW��UW'�����B�|#��������%�����~_�������S7�������4���G��e[�73zn�m�7��S����9�/w�ZR�>��^�M��>�-���L�u��@w�c�>1���+�A���}h�oh ������Ki���O�u/E����P�F�	r����e�����&��;\z���!��E��{u����oW�3��gS8C�g)���{��[RuE��E��
	T4�ow
�WC��^���������J\!����*��F�!��|I.��h]	�F�z����
����������n���et�$�|]��������W�[�]�u��@]}K�m:h/��Z�U�r�F+�.w��������t��`�=U�
���~�j��+���]������@�a�����+n��$U4t���I�j%�
�n�I�rZ#3W�Yy�����k�"l1M��	%Z������6�W.o��]z�����u�1��j*H�*��!(�����?��N����5J�TMr>�����������\������+{������v����@_UJ����m� ���J���Q~I���>��nr�R
��]��j���Av�Q����sa+1�oV��Tc������Nk�brp�T�'��
xAO����+����"x17�o���j�~��_��������rx�v���7�A�������mW��<�d?�R�I�i��z�f�������?|�~TF&Y���~o��x��EzM�`A�������BDHl�w����(Q�~��v�u9���GU@��K�AO��3b���M
���`>h]�8&�[n/�����'�aT�IO�G�"P�D�U� �����Z�"w��3_�����N�{_�����-�(��\�����s�&�������.�=v~t|��{������M�����W�-1��=�2�N���O�Esn�_��e�Q�V��l����d���M������K'yL!��(�-\�gU�
��%�����1�����-�6^�jU��T���Jr���i_%�����p�}�:X��_�4���l�]����Fm�+n�[���vq,/v���E�������Y�q�T���O�%����;�'��sNt{��/����l����t�r��M1�����9�
�k9�a���z(��G	����0HOd�����zL�����j:�������%��m�z��[�S}!G����%�n�	t��|1L�T�����.����6@��9��W\rW���7l���Q�s�������a�1*mnX�T�Q����������� ��(Yo�y�(�����6����m�jz
8)_��):��-���!1���M����n�T�4�N�b^�oU;/�|	��{�����p�Q�~\����J���H8"��(}8X��Dr��H�+t�!��Gi]���Q-l��*Mf�Y���:9���
c����LW}�2�n]"/�>��+$\�*��+���W6y��Dl�����v�U�u��l'�.�m�u���D]�������.�x7��z@P7���/�S-�bnp�����z�QeA7}��,����"��	����/���K$���
��r�@��h���C�(r��Q+������O[xQry!�>��^N*3�Xu!�T@�X���\;�����z��h]$�A�q�`{]��I�jW�pS���ph,��3��Rf�~\�����!���F�z���M��?o��~\�V�����a{P��0��5���R��u!�$7�j6[%����AOW-�r�|q��7<�u
!.������tYA'��z���SJ�����W�(��E���n�W��l���;���
g19xBJ%v��B8�Q"��].9����pg����5 �N��������8�: ���2���Xun��U{��V�(��{���	��g������H��45��g��]�	�g����n�SS�Y����J�T��^4�U�hY���;�#�������o���^������,��R�u��}��Ue��3�R������� M��#�+>
��-����e�?�z'����LX�����*�@��-��Q*�����U��"KHw�Pu�k<�������"���n��5Ih?o�Nh?��Y���j�����jm��������:��
t�V�������e�M=!�'�qs�����[�PN�j\����1�Iz���'����Y����p�\�,�����GWZ�wf��)��]�O�k���
�~�D$[v������i�G���t��`aUlr�u_t�_�A�����������i��'Ohv�d���P�����y���t��������K���nt��HN����5�$���Z���FT���~��~�����!�{�����u�[��px4J����F�����l����`�R�z�%���=-��'L�����G�l��r�T�A�*8m����0��r��s�m�T��!����%������*��Y~ka�M�3&�Z�A��������'�{s�K��|����/���
_�:IOPw�S�X����z
��j����a�
!h�?��6\����_�����$���v����������KT�+YU�z�k�_��_�"{�=P���q.{�r�A�gcK��PYq������J���z������`�/dS
=���U,�D)k&��� ��T���_T�_��{��BP�z�;b�z���~�������E�S%��r��tr/N�!P��2MS��bZ������X�r�_���'��rn"��7�j�����8��U�	)��dUm���mroT��(do�-8n�U8��c|awFul���\wH�C~�2�Kn&�� ��t��}�~�������(���-�s�j1L6xrFGY��A����/
�N�V&=�O#�V�z�����
��(�x[
��/(X�h��\�<Q4v2����d=�������C�k4�����v� ���u7#�]�#r���@����V7dD^�z����$����=LDse�S`�>���2�V��������Y7B������v� Y�����n�$�����^�{;�������[l�.��9����Ttu�+��.��-�KW�a����g9�b^�,\(�n�e��Q$�����|�S�k1�8%�=��?js5�n=T���"r�i�SR���7���[��da�G�|����Dm�i�%��(��K��n���.�������D~�u^I�2-��yB��|;�|�pK����&]�<����
��U K,OiW�+���^o�\�
��?��Z���P��yN��bZ��\�Ac�M�}T�W�t=6�$��.����/*��\-�/���-�����F�*�s�A�V��]tl���}U+)�,WF�Lz�x��3]������[u����,�y��������
t�B����KP���o��8@��U������
��v�����������u��N]�����0q.�1�����!Q�Z0u]��s7�brp.�X/��/x4�L���0�K�8�������_���������y�s�>�z��lx�c��	�	~�L0��TA���b�x~.~�����a�$uY�D����&"�����U��[r��]< ~�����fa_�E�a]4}a�����v�����/�^���R��m��oU����"e4w]�����I4w_��:����q���������M1��u����W�'�^�aETAgU��}�W)��.9���6:� ��NK�bn�����j�2*4uD�n��o��(��_�f���	��-QJ��s�zu5W�n��}���Z�A���
m���3r��3n�	�.��V�W��)��\!������s��U�����=�N��-�w�y�/�������(BD��u��`]���j�)�eQ��h�p�Q�}]�S����"��\�	�����Jt�vk0�����Q����t��<�����}��%����.E�����	T�YzL5�y��qA�`���lDw_�Y.�T��t79z����a�Z��f������u�9�.�'�����P�^��A^���������l#�T����O������?����n�P�M�]�%@��==UB
����Q�?P�J����/�\�b��{����z�fc���HV	�%��@g!��v���F�sOqU�o�s���	�<����^@U��T��/�>a2N�H�@L�yO��~�@�v(!Z�[��@����0_�����XU���w=I1�IJ�v�Y���#�Iu���st��]���c�U�y�MU=��uI������e7����m��n��
DG������$Q%��Li����9����z�����������Z
�J����~�8��6MPPMTe�@�3�bZ��Up���&�S�=T8t��o19�*���A���%:�$,��B1�v���/)������P��dU���
�U�zN{�br�K�lsg�@]�$��������P�{���q��@��D&e���s�L����PX(���5[���
z��b��|�F}�@�t��Q����@�W3�N�j��=�RJ�����`]"$����uM����P�U�;k���,���p��O���P	�^�h����5[���\�@��gZu�P{t��{��!�0�.�����U7��!RO�
�G��J�w�a�����(���hPl��&���]\��V6j�
�u7���"�C�4��,upDT�������K�.17�gJ
��M$D��%�]���k�"h�q.G�t���lE��������CuM$[�Hq��9\^.��U; ��*AUQU�w#���_e��b����f��7o����Jzv���QU�	:��-�������a����L��KR�.��+l����:a��Y�l�tGzZ72
�:5���h�N1��0��]��
u7��>.R�Uw���\/\B�t>K�l�Vu�������g��`������F����$�:��Q�h�|�i������(�D�t��{��}��>��"���9����c�w:\0(��;<u��@wb�h�����J���VN�����E�w]�w =�nZ�m�S��
"UK-��
�h]�{ Z��~)Z�>%npsp�����	�,��T�;���WP��	��:�}����%�u������"(;\z#Ua��s���1L��l{������o	Y����f�-�A�]�1�9V�xB\�/@e�1�w��?�.�������W����.h����R��fP���Y7�����5[�n�4�QJ/�t���n�$ w:���|/WuW������v�~$��1�8CJ��T������@�2������"����0tAg��+�D���2x���@�u(}�d](��~���>�P����-�9��r����G�it��C�t(�R��}��xZ��Q-J���
w�G������hsE���R�R�K�ujQ���M��C)��_�T��l5:�������Glh�L�VY��!��0��#��.&���I���94�^�/u��@�F�>���{���n}��b���U��
]^���
=���/�}\�����
���x	���$�Y�f1�x���
��C�{|�-����"!�v��D��E�ua� O�?:�N,�/�e#�=\ij����Q��Z[��k��.��U�!�n=����.��,�H�]�2^��zP).�^5�i��vU./�'��tp�M����b��ABw�2E�l���}sO��EZT���+�:�C.4C������W@��W�����;\Um��E�e��X-���B5[��uq�q�c�����0�s���B���:-��3��wa�Z�p���@��������@�B�����)�]XY��r!�#����&���
���MRB����un/�m
-��9�����@]�g��!���1Mu���\�p����-���eN-w�t!�@o�S���V��_�(r�����?-�����g�������l����5��D��d���"�V���n%7��^���h3�D����|�y��������U�.$z�����r5���#[`�dM�<�n���S�-�n!�^]���bV�����EU>"Q&L������sVL�d~��m;?��0J7#��[�#�9m�
���yB�|�RC��/)Ez����[?�O��t������D�9,$:���=7�Q�I��i=���qn#��;`�M��9���8�&��l3��Dge��0qSM:��u�L����'���K�������k���d�#�c"��#�s�|��|MwJ�5��DO�@���zHT�$:w�.���$j�-7���;��s��7���>�,��x��������-����`����7����*(Nt�\-����-�L3\�r���w��865���k���{������/q~7���<;��U�?��_bb��*I�DUA��[�?U�s�[bD�����2�R_����_�~��d�b^�hL�D�W�b�������v��|0����%:�d�Qu����r�������4�L�q���"����$:�,������#��5���._����Q��'Y����s�pY��������P��(�S�C'?@��r����)�I�ra>��M����]�m������}���N��a�8O<u���_-=����4J[���
�.
�U�pM��z���m�HV�����E�Z!?���f4�����iZA�+���?.�����n��������)�����6��T{wxj��M��������Y��n�Q��v�+���7#�8~5)�����H�.�~���4.��<8��CLt����Sb�������xC.��*�{s����@����nD�P��7���L�b`��;?*��V�r��������d�)�N������y{�����q'��y�\�����M6��S�x1�x`FO?��|!T�]�=�9��xB|!w����"����Q�se9�����|�`����-<�V���������q���C�Q�y��[��KCzl�7^�3F�-Y��ux�4�E��Z�@7^V<!��!NoZ�U��A�2�6��O�����.�Y�������}�E���d�7{!���>��O�?��s��������<��.�����ZJ���v���F�'t��t�z@��e�/�UW&��	Kt�o���nr����A��]�Wi�D��v�7U>a��g5dgr��E^��`���=97��k5����P�����$��9��ue]�;P�w���q�����cu�)��<V]�y���������de����D�������*�����Yw������L6�����U�����h��i��
\�^)�?�\v���8&��
o.������\YF�Jo-�>57.���f$o�U�-��ug�������{���FZG]���\m^�����O+����M�G�v����s;�C����A]�j����9��2�7A����@��CcD��Ur`��k�~Q�����"�|:o�y��2���n#-����?n������D���/��\������\�[�������-�
n�	tl�O>���>��+����G��4����UW�$�����.3�ii\�+��K~���J@�V:�Z^|��ls���W�+"����\!?V���b^�����e�
�=t��w<a�.��<m�*��~�1B��j���sGg��]8:��<�@�������1�g��,��O�/]�����V7J.���r����<V���6.����7����n��;=�q������@������N�\r"�Z������7�!���~i���6�{O���
m���H��l������.8u5���F�r�F����r�>���zNo�b��%.r6����~��P�/_0���l�.�1>�4�����&��+��u��@�;;���/,����28�������?��1
�Nq ���A���"C��w>>6!#+�ls�8d�����9E8�}�@��P���]����r�A/�=me����g�S�$XWH:����S�&�~�o��r �>�N�l��7Jz���y�a6�i��d�gw��������x����%�a�!��������w�=��vR��u�5[��������Cim��7e,l��r�u�R+��������s"���B-Hc��z����O+��.���xA�a��G�l9`@�X��>�N.l�0�OJ�V})>����O+�#e����0���*�@]k%�\��r�~�]�z��5��HG2����2���A����w19��(��K���������UBA�g=�z >��E`G����C���mU�B��P�s�s�����4T��������V�xi�����/*�s)g�V�����k1=6>4��`����RU}�]Uc���������B ��|���5�k�DX<!�����=�[�+����[)��~�������76��v���o��U;�I�h���������F�
��Cn�P����|���P��i�^3|��{�a���]�C�d�>����N���RA����,��}�h#�7��F��H��7�~��]{0�|7�������w��:z��&n�>�}���R����'���"�sCi�Vx%��<���7�o���;�����uA�@��}����+���<�����t��8R������[8R��o�+�XFoW�6r}2�7>��1��|��U�=���`������!�����}t��lXU�F��$���<��<�`O��t.�r�Cd��t����
��`�D�\QFo�I�j�J�}%��.�������
��mQ��K�U%�������(��;���Q�R�unq�spy198��7��%*�C���S���	���B���SF��h��<��Y8p��~�,l�4���BXP��:�-��""-�R���r�(�;�^���,_<!������{����AG�������g���]��*�}�RBJ���-��zAU����`G yNv�l�/q��-������K]�6UK���at#X���ka��\0�S���UWm�b�����y�rY�`�$F���k�N���n��!�{����uQD�|T7�,;R������{������z]nD�����p;����]H�J����~PYo�,Z�xB�����<��-�i�����z�:yDi]yV596
��L)�$XY��&���b��I��:>�G~��.�L9[����&����6	Dt����F�&���B�Zj���6�����,P	�x��\��o�Q�=\op�jf��TS�����y����B���m
��_�v�+�.��mu�]Y�������b�w��`7�K?L=�`*�3eP�����lw��@�F�%��U��]��C�\��+��'����h�J��t���u��������mO���^.F������������v�h�"���C�������ge=A��P�Y���������`�(C�����:O;�
���R'�;\n���!79�p��@/�nzN!����F�|��'!�����MXu�`��b�y�eT��s���.��)�u��@e]�KE��:��-��E��u������$���{��d��Fd�����f���%��6���~
���Xo�n��V�W�4W9�Ymu�����U�{9����^�r��MvV�X���q��`e�np��� ��o�V]{� �S_J�v=��+��oT6D�(�ND��z���)�O��G��E�*6��mYL�F/���m�C��[���'{��_�M��������<��[����v�`��?�b.P�1:}�|����On7��9�;��'|��V�2����j�0�J�A��f�������r��-XW����@/U+Z��8�	v������4k~�_�fH��v�H��J��T����~��R?�����H��Zr`�zG������~a��
������~����91�z���6����a��A_��o�[<���aF�L��@�z���"��U>S��/�F��

A�HE���-&�er�����}���� �]�#�*?��.�������@���	�p-���UL�r�^�M�&�:%�Y�B�'���
)��
e�V2�����.��Bi3���I[8*�;�\FUY���8'����������s���t�
�Ae�}���7'������u��iV�Ty�3��7��=^E�`_�\I���~�N|����@�S���L�a���N���{����u7���U_������O��O�����rr��V�u�Y@r1��.����;�z��D�)����u���}eJ��+$'��f4s�8K�C�k�������u'��s\�f�����z��3���t�����5���.T��g�@�;}��vPWB�kucZ�S�>��<[�
z��3�>u-�G��q���FSF�GU�U4��m!:}*�j����@�;*��eT�������r��gTJ����������9}�����S<���
�U�[�s��	��T�����@������}��'B���"�u�� �Q�Qw�Q��h��������a7T������[�D��*���6�"�j=N�p�,3_3�Z]>���?@])&��E-�F��&+pl���V}�|@�����U�M��P�.:y�U}�sl�Jq7����<�8�"8}��Y'?��n�����j�Z��l��������p������J���'O��O���:�@OW+�U77���>�����a1��|.��|>4�UW(�S��8~>]F	f�{A3Z.�hF��?�Lp��|��u>���pU+��Q�b���������F��O��v7#qU�t��{��>�WD�l!��z�@��~qU�6����O��]�%�,�QF]���=1����:i	-�����]�^H��S�
�>.hW�J����V5:�������S�[�j���i��= ��EP@�2j'r��[��mn��>��0��\�&z�r�����������,���U�k����T_G����.�y�_�Z���O���ZB��I�D�>:�N2��h�b��+���R��}���|qNu�Z�}�E�Y��f���a�ne��/M����93XY`���w��.���e�u�!����
��e3Xy6��K����.�H���}��<�u������n}Y�U��;` �����������F��`g��2��A:����|/�����w�@�-���~���
�)_�����-d�O��	;�V�,��f��+���1��`��K��"����'!xV��P.�=��������k���`e�<���j�E�O�W�
����+Aj]	���FpPW���N%��y��q��`��9hs���e��>S�^[���y�ys��`gA��-\W���4%[���������z~��j����>C�����p|����a��iE�]>`��%�U�-
�YK�O�y]8���;��R� g�������:�����u��*_����!�i���ws>���$@��e�k��^�(,G@�t.��)8PF/�����{��/����7�t.���j��'���m��A�����	���T=W���)�PF_������|�N/���u�����n����3:"����V��r�L����t��.?]M*����h����`�F$z��+�F������� �K� "�6m��7�\�}�+)G����9�����}7�����V�r���6�2�zn��U*V7���������ru8����:��u:�/�'��S��u��������u�84�]C�M.s�W&o19xB�%
�\��P�n����:�oH�J����T���M�L�%{]v�������;��-l5l�uV������A���K�*Q��LkgZ�-�/���/��:Z��mhc��u������[�U���K.�[���0��S�RN15D����k�horS��
W��X�VyM�Qo�o�T��
�5��������X���D��4h����u�����/�6��\H��hC��)�f���u�:q�G�s@/����K��~��vX�������\tS'jXwGhWI����Ag��2����*�N�v#D���nn7
���4�%g���F<}�5g1���*v>-/l���p��Z0@�z��!6�T3�\����^���`�=)��� ���0�rH��R��:lSe��nJ��F�����_s�S�h1�xB��vC�����D�[�6o�b�W�c���R�}FaSm�<�G�z�MC��e��o
tn(+�����	�*T=���u@��a��{d��M3J��D�_5����W�6t�g������TY�W�������O��qs���{�}7N(7��
��*q���l1L�
�d�:Y�T���}*�Z< [��#�uw��:!cU5��X�bnpI�0#��JwA��G�O���'�r���Y�������`�t��)����D�Th�������]3�|]�XF�����b�
9�&_��J����!=v�����}Tu���q]u���\|+XW(�\0Pwy'�Q/mH�u�5[�u�������	���~�&����������Ug>��*OA����a'�����3���`�
������?���p�T�[K�]��J>t(�0�k
�.&��a;��Z ��>�(��JL�-�1���f1��o��V�i��m�u�
��"��*7���}��n�P�-<�.5[C��C���;���f-e��g����+@���r]C�!��n��u=��N�tn�Z<!�[J��l���[��}U��UWnj��6%�������ls^a��mG�!���O�>�'�Cp�n�6���f]/:���~��K�`1�8�2$X6��Xu�A���i�s0z1�8�y��/I��-%~{�d2��(Z��-4)����@e�=��<�@�
-��"�����@e]�}�K��j��6��(��8[������[�a�{�����Q��lS=���u�[�3.|_z�O)Y�B�$���@��2
4]�KR���6���4����<s�����������:��	DR������aX������Oi��
A�:�
�qA#��B	��N�Y�k(�6W��_W�.l���Do��F���������\�@58�c��c�sA�`���-�����aF�^���{���@gq����eW���+���A�(�Q����(�?�t���d�S����%����@"���e���VTC�K�����i���1����P
mJL�r���u1�@���� ���j(�K|��9�R���p'�`�&[�Uk��~�}C�S6�;�#��|�L��F�8����.�j�Zt�!��,4�xB�(����p��m��A�+<��q��lN�$X}����Q���U�n.f��g��������6�n=��T����
\FeA/���G�����`g���m��RkT�����R�U
T�������-XL�����!jQ
tVIX?J�
	��}2
���J����
����c������K�6DR�z`�nw�-����a-:_I��W<?�\\��rqr�N'Gn��x~������������a��)�P��*�Rvtc��4�6�Yv������6��5�V��ix���������&�sZ;2�.������u��s=����-�����oZ�k�u$@��U���\���2�c�����BeW
�����������^:��]%wa]�W�*���A��C,&�ar��|����b�}�qc�*�I�=��3A��1��LZG����*���U]����[F��T�{r��/�-�
�Omo[l�n5�U^�=�(��As�����]���Y���U6v$Kg����8��U)Nw�(�J�@u.=�����I�(����A��$�3I�,��Dna7��:R�N�P'9�S.L�bn|8���R!C�C�`@��LTe@��W.��B����B���#a_����|�o#P�
��'�Y�M�����jX�Y����;��]5������-�j%�	�����-�j���Z�
t��*��w����9��jvU���*�uWL�v�z���::��������UP'�
j���K�s19xC�P���{q>��/��Z.Q��<;14@���;�V�Q'Lz�>�DU;h]X�#�����V��^$��;�J��r�
r��7a����RjW)>��������Na/��4�%���t
&H���h] �#��]��}fo��JI&���@�
����a�f<�|S�b��|J*��*�^�~	�TM.����\���U�
�'�r��^o#�H���(��<MG(��,�vU^
��YA� ��	qg��SUfz��P�B�y6�S_��X��V����uNT�s�|��8Q.��Nj�����fw��`]�0H��9T)'h�����#���`]R&�s��������lu}���20Pw�:�+��������Va��\_��e�U��S���jw�4G���K�q�Ar��z�u�����<Mt�E����IXY��S�c6PK��i��R�����4������ �+�	tC��#��]*�"�W_��Hu=��)Jt*X���=\�%h�.��F�����jR����i�JD u�'���[Z	���h����\�.|���=vDN��:���%eD7�U��c���@��H�u
���mU�����H�S%�b^q����&\$������9�[w�t��]C�Ui���z=��6�nl�{r��uz���s�tU�q
��s�H�v>F���+Qe���BZUV���v�����K�V�����D7<7dd����V(�`]�H��|�����\�K�s%ruR��W]���"���-X�Q��;*o�����<M�=���n��8�FU9���(���`��������)���`7f�D����`�������Sir�]C����K�g]��
A�>���������]�,�Fl�[�s+S���k�b�����9�g:4/l�����C����2F���o< ����lu:%�R1���(���[w.C0�= %nZ�j<��{�N����U ��]�S�cC��^'��n�.l�.����*7�������ew�kgm���`O�K���|���m�\��`n�tw��>n�tL�����PB��*,��<�@e9V�Z}���dza��z|s������z�dS��wX<!�����(DB�V�V&�Fu]��#��]L
YM����{o��<{o���=:��k>:��s�u�r�����Ae���������]�T�������|�m�����Y8��3���U��;�0���74d����N=&�k���C�~�p-6��P���V���Z���� �����	qh��lOEV�~���"���+�j��W�~���lw^72�����Mk��/�xB0W]���O��\$o�����t���'a1�x��g�u��uE
����^��d<_�����:g,X��P����{!��8����I�=����K%{a�5������1�G������b^���o���W��*i`X�V�U���[��U�K��$��V���Nmj���-
����\� �i�l!�d6a�W��*9�;}���A{YI�%��S�o���B��R�b�*���<�F���V��VwUJhT�.�k���g���	_��
3�}�����!�t���]�����/D�/�
;��-l�\���d������6I�n����r��j�
���A^��h����T�W����p�l���=�����%��N�������u���*��V�s��.-q!�|)�f�K����4$��".�V�^7J��� �=T
��|��|s�Y����0���J�Gus]����D���o?��U)����@])��������)8�Y�~��)yk�N��]����������}_J�e�Q������z��B�������<Py�t�y\<!������Y��-�7����%�#=>EO�����a��
Mm�<�����������u^n���k�CaU�����%]���(_�(�`k��|[���x��8o�?A���Ra��m�L�K`:������l��{���4��u;��b����*�`g��2�����6�2}��o��IT�/�;��|�=U�\>��j���.�/%���;���<f���ZS��nB��ry����J�~]������m��P�}�CUM&Zwq�-�?��)-u*��p�U�h>��Y�gI�bZq��{�;���
��h*����m��[x�.������WJ&C>;>�����7-��.[�������	��/�����v���N���mwet�n*��y`���S�������Fu��+������y�h��Xz���������[X��3�h���Bj�RR�W���O9�(�b��ItC��B/�R=��sD��:���g�Y��?e���R�����=�;w�]���b�9�z������u�0����XZu��Xue��n�!*I�����)/���Kv�����ac��������a��;i������4Z]����������R��uN� _U8Q�cbV�/UH�?���T&I�����D�^�&�t����&��H{��� *���+X��;__�N�]r�6����DB`�vy�����_2�7O���.DS�^�PsX�	3���=�����h���`]�,PW�8G��?���6P�u1�@�O�36������
�|�?S��Aq������,{����
�2+��/
���:%���BI���}��0�N�d��4�U�e3Ml�B��3K=�&��R2�}�E;�~@��qN�`��q����h��z���A��q��`_g6J/��I����i�%��3��F����b�K�{�8��U��g�G{��$9�]�YCk�=�����k�Q=x��[��:�Z:���������%Hw��r�O��'�U�~���$��lqQ�>�+P'6�v�,������\_�%������������o����q^���a�8���]��)-���=�����������h���w�k��)��Q�Px����Yl�3�e�0�������:q7�~��A��q9�H��/#��p��~��Kd����Z���4����ZxP��1��I
���:���K�>���xa�|�0h�I���j
��m!����$X���%�0h�F��q^�`O�J����l9��i:;\�P���L����#�*�T�kP��jv�"��;"�����`�*K:%`
���o��X�]��+����<vms�F�B��49����e
r�Z���o~�����j��)�����f]9o]�P��;�ufz�.��}���z��A�+"?�c�<�������72|���I=���h�[R������v�xm'_�z���,��d�'���7cqd�L�Aoz��s�v��N��Y�1�����e�u�@]�/��HTCZ{U���E;���v�����fPB�\�N�U�XU�a��x�D���m�c�:J�5��b����Ub��k
P���n�����k����>,��f���I�rC}>��7+CwU�
�B��E%�NT]�A_�)��*��o�D1&���i�r�]tfi,(�5�Fj=z�M�q������:���[�
����`/��ZT��+.���X:���=m��7e���m3������sFE]aW���X�3J�����Z�M�a'�Lt�U���Y��������Wz�E>ax;�y9
����paW�`3g����N�M0��	;��<
e���-D~����BvO��]�6����*�a�J�u�����4��W�Mn,���qu��!��e7��]W]�Ul9�^��u��@��r��C
�)�GX'M
���!�
�L4,h�(7�M�����
A��Dt`�Xh���N��/'�f,�jU���j.�����`����e�4�`K����#�o�:��v�=����
'���F�!�"��&�����O�u�r�a���4:��v���&��R��]c�i�%��x��t]Usc�B�}���;�6$G�$7�p�v�.E{������fuC$u�����>����p�;u�/h^A�!���5�F|*[B^���&X�2�9@��O>�����
'��jS����t1���H�:���b�S�U}K��j���kS���Nbq������h�v�����n���Jj�E�GU��k�Ue����k��`.k%�K�)���'����Y�v�d�����A���&���K9|3��e���J]@�b&n��e��/a]�h]dW6��(q�'��r��F	���8�5��T�����Z��6l�X�7/T��l�&�v/���B�2�?��N��f�*��S^IL�>rI�/=�4z���s���C���K�!�l�`��`����UQ�yBNyU$+�0�*))�U�v���J��uVz����A�ru��
�3'u���5/��kl�G���A]�
�p�pF��e6�)��KN���PX%���kd5d"�K�A��O�qO���z�����4\yK���Tr`��	�I�}I������.������MIS������=i��b`��-�����@S�3�9��#0�\�AC��m$��Qow7�a�t���p�+�A���U�"�^.R���r��,�����2w�\ji���~<�K�Q���P�<,�M�\A���b�a�/��2Y�I�$fXW'�8�+uyg�aj��MI�^.��R���IV�i�%�����O�u�����a������������U�(7V�p�/\�p6W9������������6���D�&�*!^�$nY?��6O�	�D8aeaC��+�G����Q�<��B����(�������|u]u@]���Q�������P�t��)��G=(MB��\�`�s�O)M=��K?GuI�� ����,�`�3�<����$4����fq�5�{=��yi�u�UtC�#�	�%���M����������` ��-���.S����"�H����@��u���s�������8��DR���XD�o�B��5�[dNx)��,�|_�����G���R��w$��rlk�~;\�pG���1c�����ESs�`]����Z����u��4��]*��
�)E�Jy,P�]1�|X���6�`�+nu��sT=�u�NG���R�_6?6�+�������-�o���
['w
�:��+E
�,�E�'�s[��.�,��d��x���O������p�u-��<!��SA	v8oQ��
}���	/:����oi�("���6WBs�U�����6������/z��2a��Z��4�tc�Ly�Q�E������
���Xc\�eY��|��E;w����u�)����e)�h����(��J����cP�������eI��M|�}Up��=�/"��J��-�o_)%�i�L���]]�A_�z��q_�h]�RX�xZU)�s~�Q�M<^Tp_��;Y��k ������d�*���W�Qwu=�`#o3G�R���*����%����7O�)���`]]-hQ�=���"d���<�.�j�����\���1��W=W���*hW����~
�V��%���W��N��7��P���k��4��XA�����?����z���q�p����<!����u���k�����d�m�U?5V�������Ag�:����.��f]���wx���rv73^jf7O��d�a��;���#�[�<A]��������a�s���'����]3����r�YWN�8$+��*lU%zz-n��b5�]�����Qg�*�V�{q�o��Oi@��e�i�i��������T��^�(,?��
[��^��_��[�4�������s=�(Z�����g��@���z��C�u�~��|�P>�'
�h*K�n���L�yc%�WESa�2�/����T�u�����&G�*���������P.��u�����K�Y�����'��&�JE�}UN'��b����"?��%���"���0�3�����%V��dP=t�D�����	�������6H"��ni���i���7�����m�?�.���e�^����&��\L�	�M��5@����e��������`��?*����%it��,6�K��i���������H����o�yu��i'�[���l�\�|����W�p����;L7U����Q�`�y���m��b�.W�~�"�����:\�#����YW�T�w�:����	�ry��w~wC��U5�������^yi�u�U�-7V��\Rr��m=Q�E2���
9��%�+�pSN\�q����:����	�*X��)��~E������c���?i�v��@O�����������Y����7����n�h���	"��J\
����}u���*��V�]vl��K��Uj����U��YWL\�����F�*c]���.��~R��"��*�!�W�rZ�q.�@��mQ�W	�L�]��}�i�h_2�6��Y�j0��WFC�K:R����Q&����������`�k#��;�F�E�p����.j�����������MjK�8�Q\w���|5u����1
����yu�e��U4 /�����0J���;���#Nj�	�:�9PwB�]�M�A�$�_�ND��9�u��sTg;�Qm���}�����	W�G1c��Z9���d�u�@�?���J���~�XO�r�%t����;���'�D�)�V��8���d�_���?��w���k��XX4NN�m_��i���)%��a��um_��f]�h�P<lu��S������gZ��aI��^z��.�������}������\�h{�J�@�syL��j�(���k�������ePg���!6k�I��aW���X�N�#X�=L�`E84�Wmk�wJV�O��Z�Z�v�At�l��
���~F=H�Db�uF!:�ND ���to� ��,�@��;��+V�3-:�����.!��4�J\x�kW(��t�{����kN
{ >�"-����N�'�����>'�\�$���(q���}���@O�g�S^��sc]�������������2sgw3u������z��;�:	�A��v�j��r]#I)���E������u�,����1k��j��%���E��U2����`T�hu��x����8��VF�Q�v�Hd]�e�_��e�z�2M{`�h��sq|5��sq:��]y�`W�-�hLuD�]Vl��vT��J��5g6��|I�I�L��E����qx�7�����87V8<��>�U�=���kw$���D��*�	��� o�/
z��������sW=�k]�f������~�/��E[W�=���JP"�\��y�����.�{_�qOYc'���|���"rW��O^��#���"��;��DvVD!!�W#����Y��j��j��5��\V���)0��j����6q�_�gY�f,U��4�@���DU�?�ArxG�����dNt4w��w���4KGt�+l~KA����>*L
�U�	�r����K�<�t��H���\�����TA�Y ���4���v�[��bl���S�*��hq��@��,�K�r�8�n�
v�p�F�rDO���u�D.U(�v�$���}�Bl��y�����*�\��;����Q�:J�N)��L�{f�L�D�����?�����n]��=�h>]�#�����"��������Q�u)r#?k���J\�R�9�J�][
�G=��#������=�U"��Ut����KV�h��sG����!X��Z��*����|�iG��+�Q���]�����,���b���M�������a%�����G=��!l�U��p^|4��m����-N;�@#�����:��"I�p?�����yBN��w+�
�������d�`]gw�U1��i�������P^|��i�j
����'��:��g���bU7�u���+v���Ug��c���]G���UXw�
���V�|tu�l�D�����4��c)P��u�z+����{��WN]u��A�J��_�fq0-�f/�*g��C^	���3������r�3�*rA���c�.��Z�����$�`�m]�|�vG�����:w���,��,9�]n���gZ���S~���r�8X%J�6�Z�#x����;���l3M�j9V����:"��2��g�w�1���P�ti���:@��6�<!���4���^P�EA�AR2r�����s�z�b���s�����bw�)��l���u��A�
�;j��
�p�izy��Y����fq0�)�.+������;=�.����`�/#b)���*I�'���#��]������,T�r����!�����]
�4�v,�L���`��T���y��"ao�&dXWf������:n�8����8��C!�]��j���b�/=O��6���G�d�A�);z��]3Qtad�u�g����^_�/����se(�/>��E�@�~���_�L������s�������_�ys��U�=7Vx��+���fG�Q�+��)v�w������R�p��XG��;��K�����lcW�#���0�������L�@]�<��M�YW��4�R��'�,�@��J��a��/"�[�eI���ug��{_��t�Fu.�@����YW?��9YM�Su���-a��Ku��n��.n�gm2���g������vx���t�Xa�suw$��c���!R)����tn�@e������wd�P��-aLW�������$*a���z[O���T�0@�"�M��45aer@���N
Fu?I<���%���<a�3O;}���7"��8H����R%��&�K��u�8PwB!����Q��Z7����E`�m6��\o�+c5M�-���D��o{�k��R	T*)�D��n���w	w=�I�����`�����W�2��?�AG��h���&7V�R��������`����=x�0��������eI'����y�$����#7����]F0h�K?P]�&��`�t�/j�BP���NR���4Ka]�c�j'���t������P� X��r�*�:���U��e��������RF?���;g�\�s�*g���l�T�U���k#�4��Ob�C��'����w����0�|��@Rv(IYX��}T}���Q�)�
\W�{��;��u��K����l��i��6*�U�?�k8Z��>���{q����.�G�]��Dpao�]���hQU��O^Ku����a�*������4�K�����i�]�N�@�\�0.T�m��o�;�
^
��XQ}���A��hQb�Nt��m��B9�`����B�p��d-��$P�����=
4������d�Q�������-��`��f>�
o��-��f��s��q�C2P������ ��x�@�x�*B����T�ka��AUE;��N�@ow���3�"��[�����T�0��F7��C�`/u��N�p�~�v�EaY�j$X�QE*�s��5�k���"-{�fQ1���������<�/��]^���`D�0lu~�@]��9c���/J%��y�����P���kuu��+�^�>wG���G�w(acX���d���D���FS9o�!N<\�*��������LKSe��w�!���@W��	1������T���5����������+����V�o���Rb���1%��V
����;�	���.�k<�.L3��4�<n��o7'�bz��J��`Z��!�'/F0�5���k�F|����K���0�T��d�i]byU��������L����a�9��q^n} L<��]�&itMMH���7O�M��8a]�D��e3M�x�����6!k,��	���P���E���dq��@��b�yB�x�;����4z�LX��]*AU���:�-R�����[���i��R���*�y�*"[����	�ga<D��J��]�k��5A��i"�<T�9�������jTF����63����YW�!����=��.�7������~�|w��n�p�+��]��C�S�Z<��,�����U�9
�8�7ca���7����'�>��F�
F�s}L�l�>�c���	����u������K������{b�][1l�u���#��b"�]�a;���Z���t�(�����t%(z��c��4<�M�{��0�	w�@�|
�@M|������������B����K���e�~CU����I&�^.���������$�a/�=���O(t�W���X�+="�:Q6����z�6��R�E
3��.��on4\J����@���0�Av�N��r�4��������yB0W�}�pP�����h���@��zJd�q�>���/�;�4��L/���-J�u{�=C"�������������&���d[�V(����@�K�u�^���D}��n	S�]����m��Y�R����n�F�3�������:��'?�����]b
��\��}e>�'�v�P���Q{�6�W�c~T��*�����a��o����>��	�{�nh���o�'��h�wh��$S��]�>�5��y��W���)���C��w�H�g�tl������p�H��o�a]	��y)�����:�a������
��_������u�yJ���������-&��.`�z�	s���X'u�_���d�����e���+���@�-�R���]���h_��7��a�T�a�]5�����Wd���I7ca����(Zk��Af�� ���p��h��leP��f���^��p;p$#������uI�l��|���.q���a����������;a�)(�'|b�!(>�3)��)�0��FD��%:�0�.,T��3��]�+n��.q
��~7��d:��R�]w<�A���U
����k���?�M$v��O�D/#��;��(N������8bW���N�������6����&����L�f��G!�������0��dM��$�Z�?��0I��L�-��f��X����Z������ �����kBG5���]o=�u��&{��}���h�%�H����'t?�u���6=�����B����NT�ZLTn�<�;45]�����&�s����N�����j�M�?��o�eY��h>)���9��?f�n#E����e���~���@O�v�*�&mu���x�����;�{�`���d���wX�3QU�8���G������?v�<o"�dj&j�<�8����w�T�X6Y9��KO2���,?���hT�&���i4������_&\4�������F�Y��1�"��������`/��8Q���d3y��]��6k��h�
~Y����7����yB�>g2�D�.���L7�g��u����@W���b�9�!�iG���c�����-o7cq����dU���>i5�����5	��]��6cq�������������}	������N�L��?G��(�lK�r��n�>�yV�AMt����&��	�N�,�p��8Lk�Jx}��m�����k����?��f��'{���>��w�t����s���*����������c������@���>��&g��^:���RLw��4�t���75&_���T����� �^r���-���2�s���MV�jO������?��)����.�v���h�'-[���XC���P�������f�XC�3V������1awOC��N�^L���b�Ue�����vS<0�k�76O��ft'�&-o���2���\4aeg�����S���	���7a3����"��nH��/Z\/�"����c��X%.r�p�g���9���������w�YW�!SL7������g���?f�I��<f��[��YN�`�#��2	Gv�!�������`E� !*����^�{����1#��.�9�CH��3����@UM�De������Y0#R<�� ��s)W��nsCiX�D��}�������r��|d��aM��D�sJ�Q���Y������)y/������]n��Py3�.m.������E(~�k�9��5
�ou�������g��3
����N���	�r>FMr��?F��^���'Z]-3vq|&���L!S�6��y{}�����
��TMt{���e�{'���6������0�3�R����.]�0���w��M*s�{�md�~QSA?Q�T�]��7��
�nz�}m�i��{N��O��rQG^��7���i��'[�/�b#��;�e/�<!����V5`��%����:U��AZc�@v5��V#�6Q�&�wT����� ��]����m4�&*~f���m�3���!q�b���h����S��*O���r�.�:P#�2I=����7������]n-���
=f�� [���Y������}�gB����yym���J=*��K7-����������+�
�r�8���c�Klq�6��tC�� o��t�oZ�.�'����6���r�/���&P�+z1����I�����
;���}���B���e1���������H9���z���a����_���-�K_L]��Q�n:f����������;���&���i������rW�`�S:�2���T���UC����3�D��-o+����]�B7ca���6��.�T�i!�Q�v�Rz�E���KB���&��5l����yB�WIlZ���7�g\�Z���u�[����p`���|Q=����B���-V���/V�;<�%[�L���(
�y����C�9�<
�>��%z�6�@e>63v�w���930g��<Y��g�%�m���3.������vQ������[�h;02���t����!;�n�����BFvz���BR����\W���|����o��UM���:���N�P�*�gN7��d�W���P�MR�5��!Y�W{��h��2��C��������2��`�:t'�NN�+�*�Uu�����qA��(l_��7c���>��*#LT]=@���4��������������v�}z-���'DPU��UnZ��yA����h��yy���j������P��Q�"�i+�0�W���b}�Z����a�����d�W}��XQ���%A��,V5A�U�����p��+���a�*A�y���qQ�����A}�z6���L�����]��m��)/�^j���d�KN�)��|=f�U	v�<�{��-�B	h]\?!�Ee�vUP
:�=>��|�s�y�HA'��TX�5`TX�T�p����Q{^�� l\����������O�(S������)�S����< v�J���*jz�d����9���|�8C*��r^����@WM��bG9c���H�BJ��RU
��yh�Wf�M��v@~?,7w�
���	3J��?��[E$�������]��U"'h�����Wgjn�rv1@n�U����sUb�s�KU��	9��V�~��|%H���L���_�@�<�>.��|��irJ����e�~�8�]k�>���������`��]��&������g�������w`.rO�_�%��8��� ���%�hu�2���@������ah�g�����P��9��~�Q��pq?z��s�Z�����Z9�U�2����:C-P'68Gu^U�)�3Z�Q�N�J��%��w.�`�*uu�s�%��yB�j���U���`u3D��l����YT,��Tw����M�@��4w��X*���<��)R�F�Ya���mN�d]g����a
�;!�����
v�����j|P���a�g��y!��(qq��;G4v�p����G����s��G�������jY���S��]2C���s�Q�~�(%��,�Vw�e��2���A�0����3���0]k�6��x�bR����J�T~�Q�"7����E%e��~����!Kk(X���,� o��E��`i���+e�huNdf�n���*|A�����uE��8gT�2���zX�(w����js���Ed���H�]U16ca��� XU�z+�@����@���"i�WC+���|BXw_��,�@�+�A
9�[B�����-y������������4�m��W�����I\�8j���e'�8�w�������yao�$*��n�A���n �[��%���`X%��,�9_�������wH����r(n���q���;��6�}�z#��8pd ���=a�|����lqA�`�����Na���'l��*��^�h�����/����(�J�?l^!���Z�B*��O�����}���Uao�W�5T��.�+�'��tQF�U���Z��G���	$�#UZ��3���_�ZP:�@.<}�wiU��1j�9AAZ��b�U�5�*�F���yB�i���;Y��_~�c)�< ������)���&�����G�+
t��BF���gj�fq0,�v�	���;�.;iUgcZ]=c���������HF�E�eu�3����6���2���_��]�<v!�@/�$
z���lq��,�����jq��`����Io��)�6�Q�JQ������;����\uA�UV��O]��X�Q.L�����upAg�1h��Y������`w�G[�������< ���nzs��&�=�&V��V�u��AW���4�J���%��A�J�k�-7V�g��8��th3M�[����mD��c��K>g�y-�����g�@���Vu�v�T�^��6�C4De����g��QC]������X�T�lW�u��<g3��i�W-�%�y3Ve,����8&���MR)������B��R���59��u��)
��)�ve��Q�
�ms���p��/�����5 U�rP��Y����E�5lU
.���F���]e�7O8xB������A]�
�r�NRn ��W����V��j�`O�(Ds/��1Yg��bk�A]��G���	��I/�z/9���s�1��T�����Ub;7�-=�sT���W���1�l'lu�TA�.�jy!�{��6�Ge����>�$Ue�����f]�R��]��Q��|���<�'�^T���.3�e���zT�����Xb�u�`TQK������0��,1��R�A����������_gC���*�@��;�<!�3,a�+z�y;��K�+`�������\h�^�,�)O4���s��������G"R"��J��u��T�u?DX*�tM��,g�"���n���T�)���P�=��^���:�.���O�{_�Yn����N4l/U5{+��q�[#E{��[O6�V������wx�i��W#_h�:]5��hw3�J_�uM�@��
uU���y���g�\����K���g��u�~����@�R_��&����u����]�}T��a��&C����rk�p��g.�h���&�%�C��Is��&��M�9�>.�����E��NV��/���k���\��T�+�p^2�Bv�r	0��Q��z9�X�����yB��[P���2����Vw)`�e��L��Z�r�h��`N�9��	�s]�4�[~Lq���>G�
.Tle8�6�n�(�P
c�n'��8��0-��W�d�������z�����P�|�k�h���QJ	v�����y�.k�"5��7��}!�{���`�����B�v5�Rc���v� �b*���6���`l�/3��Hq�S�~��5�u��)������\ &X�h_��7��`tw�`e�0���������u��@��$�YW,\U3{����a-�j�'*���9p��0�:��6U*� 'v�?�V
t��o������'N����<R�=:\�>YW�r����L\=����U��u}���6��M.�
���q��3�q�'�lb�{qsm��\	�V���Jjt�6����8_��)fg�5�����vt���B��R*����;@�o"��q���'��?����|9�9e�o
Tf�z���@�3�:}p.����X����k��������}��`v����,���0h�����j���
VnL��>�6����`��T^�9�G�;4�g3�����������N�w'	T����yD���	�
J�>��6�]m��Z���&��+Y}/+e*���6V�KvT�D�r5}�:9���i�5�2s�������"�����~ep�Q�]d��W�/Wb�k�����b��]l�O�t$�%X���@GQ���\A�M)��a]P
���5
��5
�*��'g�������J�o�<�����K�
� ���5g75���Z����������<!��+a��v<]3�7��r�k4�b�9�����n���s������8�]����������s���.��,�@��M������L�D�%z;?%��c`���.�����s3������;`3����m.��a�{�����O���tL�^�np�6������\��!����,C^���9/��������fi�F
����v�%������u����+���!��/-rq���j��6RXg�N�`=j��C�����87��U�b)�>�XT���+�y��%�!������7�������4�L�p~�(��v�NO������(]�y�\�I�[�"OV�A]:"hWI	��2�61��ka]�N3Y�;���@�����|��?q�����0�U��M?���������g��	;T]/�A����[�G�6���;�[��0������U�*lU���M���yM����q�5!���H,Qj?�*��QV�TU�����[����n�|soZ�:���CN7���Q�r������,S:G�U�	�
���.T�:d�6g!�Q�/����aD�o���<����.	�����E�h���%J���$@owSu�^�yM�qdWJ6�|���[��a�|I������{���V�N�
���������H
��n�+O&�kn���0���s�|+���/����Uq��v]s�����AU���S�n�oU�����w��o�R�V�Q'�5g�\�s����q�[�#�v��]_i��Yb��/X��)o3�>��t���*;�QY1��s����4�}�-/3��%��SH�*�V����F�Q]P ��3�fq0h����kk3��;��rV�l��).�A6����+�v������=u�U�)lW9#U�������s��j��{Go�u�$l���������a�����v�@����| �F��eM��T:P�,8Q�6a���z�{�o�u�a��I"}+	hX��
T����s��o9�H�uP4�U:���&�}�n��o%�<Y�t	�o�t#�z'�>r��*'�ib���j�k/�4����=M��o%��,���X��J��q�j�����?:Z��g����tW�K���zB�a�K�Q��8���i��
���*rq�	�-��3v�O(8���	D	�]x�gw��W��49�����'��=a���
�-�,���[]�K��A!����}n��:�������J���B�\U��h�')
)y�q�[������s3��x�\�����;������u�y@�3|���+Z\&`�k6�f]����#��-�t,��b�(�^��.����Q����`���U�[�������h��4!o�?SWL���w�{>[$o��Y-W3JZ�E�|��(uM}Aj�o�CoW]�p��@�����9��O����{���	t�66��0q��`]��d��Z*��P-u��6���Zz+�R��R�h> ��ky�t�A�t���yBkg�����-�0����%;���.��"��B�
�x�] Jv��c]�V�:�������1L����=(�B��vy���p��C�#7�n�Z��o�f]��\�>��.�Sq/�����;�'|p�(�����~��XR.�	�R��.hs��@W����`G�\�]�8�D��DN�K�	��}�F+�����3��������K/��\$e]h
� M]��I��sIY��r��\W
�vF�M��l�{��G��v&X�N�s�yy�aX'��$v����$Pg��]{w_�,+�|���uk��f����MC����}���v!�zP �H��{���t\�eW������}�z���b\��
Te�T��X.�<�u�4z���F�umE��9+��3o�=WDT�~�H������m`�j
���_���49�\��r'����e}\j3���Y���{�aog[�)��d�����f�+���`3���v5#6c��:G�������K
�qU>��J�O���L}�5(7����ude���7*�����=��C��v�$Qt��?�0�Rw��,_�fq8��N�r�O�A��q����{,7���&4���b,��1�>j�^F�UF�iu�D�6,J��!�����US����i���N��HZEf�e%�)[j�	�F�7�,L��B���eUC��W��h�V���}T"w�*����3V���}	4m�fq�41��CU�2�=lU��V]�A],T���=/%Y-�*Uv�8���L��G�Um���-u��);)�W�����E��LTI6���6�G��YV�R��J��'G-t���X*���Q'R�:������4�T��+�GM���T�2�����5�>WQ�\%8sc�_�%����������=0���t������~�6���Uj&�=/wU�,����>~�=/�\���J��]�����������8�N~C�/����5�S�]�������9�����n�7�������u�K�#��[|t!��������:��T��ncU���]��O4�����������S������H"���
�T_T_�E]���rl*�F�.��X':���E/�*�H����f,N\%���W wM�8p5z�{����W�&�*x����p���=a�p�*�|Xg>���u��i�i�:T�	 �������IT��	:�Ox����o����'��t'?��Pt����p�:�s0+����i^�
L�=�6g;#��D��6fues�!4.�3����~�z2K0U
v=�7ca
9��������R������D�b��c�D�����*7�P���6��n�
�B���fU����*7�(�t�o�u�_MO=�%a���A��*���Z����U=�s)T4����5]SxX'��;����]{�l���Ga��*��������<!�����UJ�cY��,1���p�����QN��<������kVU�{���PM\}����+�r��YUeE�����)���~!F������2�9���BD���@��*�
X�({��*z��@vH�]�:�>�2��:fu���x.[n5G�oN�%��G�4_JQ����c���.�)��y�yB,��r�e�<��9���sE	�������{�(�q��YH�yB�U�c�>�%�����*����y�����[����c#�t'�f�XC.h�����L[H~JX%��1��,f9]zr���#Z��������&��������x�G]8.������nD�G���
���r����Q�{��	���\*���o��*Q�s��7G����a
����=���~��,+�����uIA^��G,�}S1]g�0�A:
�UU"���E�������h��"����u�L��V�v��n�O�z��jC�r#�)��p'�c��$��s�NB�:�P��}����^qET�[��a��7�C��:
��U���[���������`T�9��t�~cA9�@��A�9���Y$hq����k�20�,]j+6O�1�u`�%���#��0��8�����'������n{yue=���&z�#G��
��mi�qP���eU���E��K���OiK�E��JiK��v-��.�h=Y�����N�2�����v3M�/��
���L� i	����-'�������&�����������:2�jk���
h_�7��Y�TB��tvd���� z��ETJ���>����]��iT��@.vh���vn�8�rX���c�s^n�$��_5�<��M������N��Z��p�0Az�:s{�'��k�R0�L��m�(y��0FU�c:k�A����QYZ������t	������i����U���6���xh^����)���{����?z��{�T$@�� �y�[�.�:��XQ��*Z��t^�A_
K8�P��J��v5�OD�3�6�����MV�|�����6OXxB��OV�����V�M���>���Ok9���T[������{3�S%����S�<�	����Y��kU~�|��
�G9��)�6��8�>����/�juH����Z��F������R�U��I*� �����������_{e�_�k�8&��@'������i%n�����M���NR�����yOtY������9����hQ����F��������7,5V�]U��^*9t	�<!��J��-*���Z��_����f�6���,U����a!�����	1o�_t�Q�L���U�'�F��a������)X�O�e��sa�|K#oGe���*�'�J��E�}�A�C����K��fq0T�$-�=g^�:G�_����w�8X�J%�����\��N�rN�V��#�,+��s�;��?�����/	���*�4�R� ������.�2�����D�������D�q����
��
?a����X�Q����r��������R�F��.oM��t���0���a���>��6���q[����6��:q�81��QavW�@����u�rw�`����Su�a�!?�X�%Cn���Q*��i��v���I#�p��e�d�]�&����Ed�E� ���gR����������5�7�zP	~�J0��X��lf�q��H���N��*<=�}������U:����������iX��]mb��;Yw�� �����T�a��������N�`]�=��\4"��AH?.F�H���UE�s��B�x	Ao��ZN3
�]�$����&*z2��Q�����S��}�
���VY�}e�l�K�y;��*=�v�Fu_��5����e=h)������t�����	T���?�b�9�$X'�]��Q��j���n�������D���3n��-�J�`/��T+�����r����sn��b�J��D������z�7�����g`oU��Z��w�E:�dq0U�c�Yc�:�NP�H�\�����l�+Wi]���*���V��|�br�:��?AP�~�"�k����t��@�Z���r�m��Z)�O�����tz�<!V����S���1�N�
���ur>��*�u����_t�����2���.�i�z[R-����zp�BL|�'��n#n�aZ������R���E|P�^�K���Ho^��A��q��`�������Yo���Z�IVh�/n��b3��0�\*C������W�����8�����K0=��L�@�.>it,�����|sv+V�tm���&6�s�7<��7���4h9���\�z�N�
t��-�\�P"���`�;��z~��%.�9�[iJO�@/���y$�]5�7ca!��z��������)x��;�������!+�s� x�T�@e:U�>%T�� Q�~\r�zE��v�e�2��X����pP���`��r����|��@ld(9?��%Xib�Vo�����:/Wc�������o����)�tBw�a|�n�j�NP��i>��[��+'����
r�Qac�|_��hY���zd��o��V�����Y����Q�5�/
�4Z�����|��v*�;5/�����(uo����N�I=!3v�I&��|�#\fF�����:i��Q�K��y�q�����4����&�*���&������\zd�k�S�iy�`������n����,����^u�9��������(��Z�@�����&��A����mY��0x^��A��q�jHt/��f,�y�|�����A��\$���6����������~�m���+���]�ir������*X�>��h�k���X��N�1��U������O!?-��v�����r�A�}��]@X������J��@e�`��Sv��_�l!��J9��e�C�[eht?J�V*����l��y����CS�.�kl;��P7���*�UNHW�zP����n�Z5YUo:��t�
�V��=��7��]g�������au��w>l��n*Ub�*�0��	���nJ��R{*hS�9���.����P2�$�a]:��&z���'t������_0&��
���|�6b��[����������~)x�����,��	�W6�f��XnI���~�������3����&���j�H�\eX��������8�O�_��i.}Ii(A;MX8��C�Z]p��*a�9j��A��)�?�������2�a�}v��M�uG.��"Z�r�����|e����6d���lW�T�[�)����T��!�E�d�����_��J�%]m���3�$W���C_
A���+�{����yH@�-�	���-�6��B���l���V�6Xdu��@���Z��-��fY�BH�5
�T���d�����{@:a������7�S�]�Qm��]���`W]��X�����=Z�>U��">mJ��g��Ra���,b����V�U
%�|O���:��T�(hq�i�-�*��#o.0�0x^��]3a��j���5d�����-�D��
tSqOX�?QU|4g�����.��������k<����������`������Kg3MMw�G�Z% ���{U�����:��(B�N����e�k�tu���V_0����6d���	��<�w�)[���`�Y�k���Xv�`F-�9'j���T�g��=�}5|�,��;��=���[��>'��r"�m���c�*��I.�fM���Z�t����\�k�Z}�*D
�k?��Z���Q��<�p~����&�YVl>��
+�A��v���Ja��.TC�������u�\L8���*&�K=	���0����h�l7g@O���)q��@�s�T���*�A�U����`o��@�[�9��R��Q�o.5Qp��5��	z��l�2����oJ^s�.�
Mp������K�I�LMd��������~�D���������n.)�A[(����T�`����D�]hqi��^�)�M	9NV�$�AU��]����.hN���T��p��@�R��Yl>W��p���u��@K^U�!���a��@z��"�{��n���Y��:�qP�@E9�%�MT?����YW0%�[]$���]�Gu�x�N~t�e��+��������@e�������L��v�}�84�n�_�Wih?7���f4o��RBo��]����������:�$>c �f�����31'����0t��n�����`o�M*#f����s��K�Y�(Wl=�.0h�W(��rC[��L������{_�������7�A�r�%��T���KA�������������|�F;A���Y��sswOXrt�R9PWhW�_��A�:j��ik[\r�K[������������ /�w��]l�������N��X�{��;�534����@��8����Yj���R�mu��z��+y��:�fY1,�����l���wA�`�3b}�v����B�N��)i�^���Q]�'��\��v!������a�9���E�l���R�tA��H4�]�!�K����[%�U@!7V����f����I���`/��������ZeAPu]Jv7��1�j|�-p��� �+�~~����t)����B�U�:�����u}�*�6��q!��c�M�kg\���{s��v�F������q��`e��y��k��$�Xr��J���y��5XgY���!��n]�*���n�7u�%qy3���G��Y{���`��8R��i�Nn�U���h��2Qon��u��@Ww=P�EE���d�]���#z����Q.ammW�hq�gP�1�,A
����#��q�����ICG��dIt�]��_�N�E��U����
S�"���3
�*Kj����/���J���Mg��s�J�����n51����w�\����n��C�/1�:JA�����T�l��nd��&��&�v*i���x�t7�lL��/�+-$�:�;P��f���o�eq�����qP�4�!�.�\��������|�+|Jr�Q=��2g�W�zQ�~U����u����@��?!:���������v����*���3Y�z�n�U�%Ex�Rv^(��
G@o��6g��bP�}��<_�_U7���~��W&�V��
�U4i��u�	�/���r��vwjz�cs/"����{��o�3����Dia�|��X�*�VU�@��6��>�c����i��������E��&�T	o��A��'&��8�����&g�;����sD�uM�$�V�������3H�����i��-]E`�R���M����l9�gu-J`]�V�"�QU�t���Y� �.+wMFu��dX6����O'�b������DM�u�^����6�*�"D+���ui�uD�k���	9���%�~2��
���n5��%W3��*�b���A����r���)����uAs�U�}�������U;��K�f���qluA�[�|�^���s`�"
�n����Bp��������-7����f]1.�e���U&*���6��n��G	v/���J@�u��S�?��*Q}�r��Jj�eE��u�`o%�ZT*)��,�s��&�No����uY��� 2�,�����������x*�jt�3�YL\�LlwW�@o%����@k���E=�Uih����klz�u�gN|�s_g<��c����?RQ�}]�S��E��U�j�3�~A���`����/������&�����}�[8����F]�.�[/���t��"�*E�+�M�@�����
��g~��}]���������?c��B}�I��:)�9����U=�D����� �f]1��.�����^���-�sc��ra��.�5���r���xSu����r=�.��e+����[U�W)������m���a���a�(qW����-�C��G�}/2��;;�]%��������.Y��'�$��9�hq�iu/����{q�hu��`�u
�u�u�A��v�/z��sF������
PAa�1�6������G��D������i�i�����������X!u/]��;j��Avu$��
�9g�*��uA&|Pm���}���*�@��p:\y��dt����:0�A#����}[?�A#��:?���hC7/��f��<<�l�9?�p���B�<!&����f��Y6cq��B{X�u������s�e���
�R��u�g��{��E9N����������Xl����j��^
�7��9�'{`��+�7����`����JT�R�jsX�E�~�	_�A�"*�27���#�#_��Lx)��,6���	�/���c!*+�:����^.�8P'\��u[_Tpeep�&q�,�0<�U�k��XB.j��L�@�A"�����]�!��|��������?�C|�50��r]ue%S��+)��k
��o�u��u�F�1t����$
B��u5��:7����&��R��][�ngC�%_��+�T$�~~,w����j�RR�Lsf1��&t�����%����G=)
E,�u���F=�X���:�	���#�?���S��KI�fm��\�����hw��@��f�����Q)~������\�������a�e��.�hq��h��1L���|��_�lwg����=���d�ok��K``�����i���	tU�N��2����<�r�o��X7���=���v�~��e����%M�����\�Q��fY���+,������::��33lW����.�l�'DaA�h`]�=��1��")�'�xB7���O���1���0`]����u3��4�i��k!U�Z��x�W�����E�sXU2�T�-h���v��]�y�����UEt�����yB�������0"�ye�����~t}���y}Gb��E�>�M��Npz��w%[�/�uz�y)��+�����y����['�
�v���y�Tla�|���E�U&(�4��
������v�[�O��/	�6��< ��/��;3��_�:"���kn����N�YvH��@<�u��rf� �dU�D�M;��]�M�]WA�7cdw����um��������mw&y�5/>���]�C��.[��J���'_�������v=3�hW���kw��rR+i�>{�4���>�@/�������N�[��]�$a��;��=6�4�A��{��}3���'�a���v�O��;
/z��>��hl���y{a�;���w��[��?���&��]E�`�b�m��BP���n��"�z=���A�st0j>����:Y�V��?Q�8��[��;�k�Xn,�4���S8mJ��O���LI�����4�4�@W7W~�.�7�5o�"���&Np06�� �����0i�n�Z�&�.�C��y�
aci��N�.��>J�p�.�����B�����doW����[�F�q���i"QV���j����"m,�B����U�b3M,?9�!����&�U�`���`����*W�!����:��T,)%�{+�I�UGy3Ml%�{��:P��	�Z��Q'�fq0L�wVU���l@*��\=������)���-K<o3M�0���-��sH	���Ej3&��$�-�����������8(�JKM��+3Z��]^�h��^utV��Y�nktuDm����.��:L��NvG�T^�
f��,��]��������.������q��Ra��6Jzm�.����!�Y���]@������/KVnB��9�@�*������:��Q�A�4�����&���DU�i%�>J�
��B��m��~B�a�;��u�1�����d�l�������n����r��oE���`F9�cC4�M3�(%_Z��,Y��dea�]8�>.R����@i����8N������lw�M�C�"�^���'�wD��`Y1T]�V�8�,y���@���=����`��{*��U%'KA������[��3���o����_H�����r��������Q����_Y#�����K����r��<!��(
����@�~�L��ya�F��<�2����`���c3������\	U���.^D���T�,���`D����6��D��+IR��l�����!/?���e�U8]����9���v��{9/P�)�b��5���:���B���|��������+�U�3�^.�l������~~&|`����Y���SG����`�f��z3c��`TW���������.(Tp�j���.�
���hq6~'�$��F�+1D���C�������<���e~��}��+���y�:�U�
c�[|7��~s��}�Q>��UO���e�u����A�.*��it�e-)��l�[�q�"G+���Y�7�]������`~(��p
v8�� ���� *7V��Dj��,z9m�|�8j����Q.��T�(�vWX���R������/��r��YR�|��s)aM���k�����|�$9���2�c.7��X�{���;u���h�����Ci���(h�g��1����^*�f�/�\U�{�W
�9����u�QU��%���r%�;���1�*�!W�C~����,+J��M
{�M��������wj��?_
��i6�i�yX%x9�����H���*��C�eQ�e�vI�-��w��9T�t�*�zq6�L�����j������J�]��/"�N[v(��1�G��0c�k����,V����.�5������(lU�g�N��q�p�l����y���^�4g`�Q�u��"���7��E�K:����y@���]���QW�z��m��:��*lUI��W���@k���Q2t�"�J��)'1����Q�f���J�
�V�BsXU/8Qg�N�������P���:�VU��L� �F����7�YUl%
�Van��(q;/"�n��0J,��, ��i���p��`��*AU���S�	,���<�]�#��0,TU��=����a��5;�>K��fq�I����u����*��&6��w��J��P`T�a�^m��G{p���J�v���F���u3M�(%�
���@��*hU��E�QH��N��w���FV?���48M���
\W�>Y�kY�E���Z������6���q��`���T��{�J$�UU?����yt��m��]&<u�3���A����X�(������@��s�L�Fn���	T�B-��
3*/�6�J."�;��2�J�
�r1
TK���������`���;�
�R�*f�u�J@GUOhS�����\}�}��4�F��e�LUX=��\���l-G*����	v�����%_��6bu	��2���(s�������ha]��9���P�"��G�e��t���|�GI�U5���<��y{3/`=P�J�v��?h]���4�R]j*��_���=A���bi:������X���VF,��rls�r�
������o����Zj������LU_p����3a����Ka�f]�5�21�+��n�	����)��G��q����rq.�F��%|O��)����e.7V���Jf'R��~Fun�@����1�\.����-?I���R���������CO�����e��rn��.�u}������q�Yl7��+O����4Z�k:�G���
������_���L�=��ov�`e��A�"�������g�Eix�	��;H�,��<�U��R��c�(k�v&�A<��Un07�-5���}�o��(�6V��O�Wu.� /%��vs�,+�����m�V����B��Y|h�/�����m�`�����b��,������z�>�a��A�K1����}���$5R���{������n�8�T/�s��y���P�k������Y���`����X��.����@�e\(������"��U����,����Z��� x�J��;7V8���
�C~��x�2����A�����TA��Gq��<]�>K<e3'�|7#�$��0�	�_��~���5�|c��<�p1��� �� �+E,��� �6gYtB!��	�,�)����wvh���2��|����'e�gm{/��4�\(&���=���v���@ow�	���y��.�����4��7��O��b��9�P�uM���LPo�a���/g�f]1��b!lu��s�2V&�'|;�Db�����n�������V��!�8�!N�$�A�ia����m��A-M��������)����a�K�$���(d���'�j�m���r�{���eeiXo}\y>0��Qv
&a���N`�A�yh;��0���� 
�������
���Ro������4�hq��A����3�������a���R�{����Y�i��������K/	�$����p��>.�0>�vM�����{>�d�\�4�z�MT���^6������T�r�����5����}�Mw�����i�ws��q�L����D�t{������&���wXcwO��=C?�������l1W��>���?������9����D�4�����~�k��fYIf1>���������{�^�z�w�D���;��^Z{��1)�[;�{	�m���S��h��qNt�$�=��A�^�`/���_�)��j6������i~?��-dj�'[��_�W�j5������c�3�?�u�/Z��x4_
���X}r��3Eu]
�4j'�������fY15���d�r�o���3���6����g�U=t~��3K��_�&�`�J��J�w�i���c��<��6y*��f<�U*l-&�h�y-����`4���]��7ca���dM"�$�L��gya��4����/�N
�����DU������YV,7�1��0�D=YM��D��6���c����<���'�_Ox��L���D������-_�[�Q���-k�z�k�6���h�6~�t	���c/�������u����g�����L6�d���zn�W������^~~�������`4���UJ����j�����I�K{�6}Fj}�'?6�	O��+���%W�����F�|��]L��vv�ib~�3Xy	
TU4MtM��<�r���{_U�y���e����7��I��lu��@��^0�s���6���Fq?��)d��&�V��Q�o����k?��f�'�:,OT`��Y�L�Y6��]A6����r	��MN�De�Yy=h1�i������a������mS�����fM��;V������|b���I���D��E��<�f]1q�"	�~��k�<&�|�*��L��d_g�L-{=�)P���n������.�ex����|����'��?vuU�F�l�6?����`��[E�k��4����t�cXg�Z����b/��������Y��yB,7w�C�|�
7ca��w34,\����?�.yT��]v���-����/����'�>&oY ������$?��ia��'���n���6���5F��ZPU�Nt�6+���-��;_�A���!o�+'�8;�!���r�yB���=�sx8�] 6X�i�.�	[����q�3
�����B���s�8pY�}}���~p����������q�Q���k�M�5c���3�
e� o���=V�|w Xw���[|����bUe��*���a�p�f��r5C���]Z"�h>�3�y��aJd��M"�U>`��������hw�d����]�|S���"=�������EO��"L�62?����*K�Y�
�w�*q��c��5Q�vwx�(B���H�d�r��{��#��M��]�?��1^�����N��i�r�?����3EUb&�����rP�Z���^K>F\h�-������.K��L��_�[�u�46��u�������Q��}6�H��<�fq�,\'���@���*�}�#_��A����]'�C�h_N���`��'|��,m���q��`���_��<�n4���XC�������]2*�nw�c�4o�t�>#�=��4v3f�;��]���0h\Q:��vhM7b������jTP�>P���;��`���W������>��'
������t��t��+O�
��M�c�,�N�����m���_am�v�o��_s���.�����0-\�_�_��i�rKFM����Lw�vzd�
���������p���u�j����a�)���B���y�������@��P���f�Gls�z�=�$#���O�����>68n�}��i���W8�o���������������� �|� 38m�O��|�np�:d����SA�<���U�,�����EI����k��.���4�4��d������W���.Y������pQE���{�l*+|�|F��V
t���Y��eu�s����U��E���6u�Q�&lA��EP`�)���s�=W\�-����L�e�n,���W@L���6Wt�M�,����.lQ!%P� <'���((��q�U-?'�*�!��x��ZP�U��'�wT`W���P�.�f,�i%�[�������t�ts�%=|����*6���\����}sp3�������2��Fr?��I�4`��?�����TJ'����[�-�+���a�=(�,���*7���(P�VP�F1Mwb���5[25V��M!�������r���?��L��+'�r����q?������(a�Cx����C`��(*o*(a���QUT4��[��,J1�Q)�sX�W)nY�N�7����-�����nmbT�e��`�;j~Y1I�?���	�D�-aW�DtP��Z�
T���	��<
����Q���C���Vg�N������"�p|I��=��E�o���-
�r��
��U��y.���
�Zl���R�)�.�t��GU	hs�5/LVP�,�le����?����v�Y�($���:�|fRAV���~�z�"YT��+1U���tK!����Y�Uo��_ _��
Z����K�{qn�s���x<x�1��*X�S���t��oA�bQ��5*�+���CA���f�X*�
v��"
�����u�Z����US�^�b�R9�]vD�mg��:b�����	1,�d"�+��@����/����s��2��PcQ	����qW��*���N�+/�R��\��rcQ,�?J��,��{�A���c�V�Et[��*(�rrlc�81��e�ZU�D��1�Z���8h<g��\F����`��;�|��-_�R��\���X�*�4+HK����������@?����N�R�J9YUW	�����!�s�;T��42�Q�,��@���}N>\�.	+�/���M���i���n����q��d�4����9�>� �@
� �X�E�P������e�Q����*P�\�sc+�����F��Q���0�..Pi��v��<!6�������+hiwl7�=��FK�(-M���������Vf�z9GZ�.�8����0q�L�A�Z�%	�5�}��
yJ
�-����`!����z([�A�^l���s������6�+���
��M��R��m.�a�SZ�r_<j�uHHbg�#N�f��dd-�� ��|U��cb�Z:��Q]J�KYJ��E��T�`�A����]����yD�R\�}�e�_�HY�r.2&O>C����6}����rnVu�>�R"0Y��$�L.A��%�j����\�@��'b�kVn�.�B�.����KO������������[y�����Z0P��k�����gq�����hx�������j�V�2��o�G��fY1T]s�����gMTm9�0Y~�@$�8�U���������Q���/�5�s������uZ��L;�8��M�fq�	���`]�X���r(�:���W��.��\�,����zrY��b�;a�`e�<P�d�$V��tntj������{q�s��\[*����M�*�8R���"���{<��6��05]�T��������4�8�v��fq0�_$������f��n��V��*5b��Kmg��mq�8`�
���!�u8���A~���/�f���n.��p�w�M��1c�=�i�������-�1{�����!�Nz�Q��6!}��� �*������%5b�K�yc/��n����bc�]"���������'��S����]�A���\}P;{�to��%c�����]5>���YP35�'�w�x���e��=�|
iA��U2��j�*��L�^�M�����W�.���u�[�Y���r1@G����J\�*1l��S�����R1A����������|�fA��(�0�*��E)���.W��'<����Cv��(u�1Q��0Qm��K��*���+��C@�������H��nX�y}�W79T���$PU�:��t
�����3~c7J�LV����<�9bmU�l �v
z�E%�N6�����\����N��CE�A�
a�v��8��[ArZ������5��"��f{������h��[���s�}�����f��BJKv�t���?P5����i}�M%h��lt���m����g��f��r�e������yB�=u��.�A�W��/�.(N���
�'�nA�;+�2T��|�yA\�(qm�{����b�T��]����zP�\Pp..�l�?D�u~���G��-����XQ�.J������@Y�k��q-��%X'������ r�.�4�K�
�2����Jj-�������}��wL�U�vU�j77�U��>D��;N�i�O�9��"/�N�bk9[�J�M�E��oX�{��F@��O���P7��h��EiN�:Y��>C�|�BA����4�����T��hsK)V���|mAA`�(�mXW�6���.��Y��T�`�O�6���A���fT~F���(9b�rr"G��,�&��A,Hl%B
�Z0��z�i�.[��	���/�<�f�.�h;�C@����p��6�nr-����q@��,=����a��_�]ss]��m
"����U:��<P���8��Jw��j>v^q7U�8lq�:�������*�`U.��+Nu	�<k�sLA���l�`������2��'�&�R���p:���D�!��84.Md�������um(���+
����H�g�����^��+��u����v�9�m&@�a���"t��5��cU�:���5
un'=�\\+:�hqw-��b.������3X�����n��[�� �wq�@������[���B������W1o~��$h=���D^\��d�w��.%r�\��<���L?�=a�r����y?M����v�F�����;��t:�n��WY�������r��m�e�d��T�����7��'��P��b��z/Y��a������/��}a�w��`���-6k�tj���+��N�V�Z���^���7����������`�KR���2-����	�6��>���0�Y�u�)"j��H<Zr��H���A.9P_�s��t_p������Ar�E����eU[�GMI������z���&���fn����=��Fc�%�Z��Y����������g��'�6�Y�<N�;C:p��)Q��e�z�-<w=1�W�����<�+����(���KE���%����S�������W�������+??o��uB;��#�@�&m
9e���B���
Y�a��;�'X'S*sI�*'�=>?7l�JRk�N��e������D���m����a]�����@o%�Z]�t�����W����k
����r�g����Z��W0�J:���0�bv_d��-+��	����(�r�p�5RH���9S���t9T�].x��z��	����1��r|�";�Q�	��;n&��5�����=L�����
���]�h�Q�L� ���qqh���@������Wm�4ZtP'.J��u	�)���@]�KQ��;����b�Tbv?��%qv�M�c�P�L������O�S�W���m4��8@��i%��fn��\��K�����'v�F\T�_A?��	����4��,�ZY��G��������]�r�R`f�?ktM��L���@NYN�{T�v#�|���u���BOi��3%��b ����DUjh�E��b^,�,������B��uM{7���J��u�w�������-����mlc�c�������U�b�C�?���B6�����Z�+�U�U�d�������A�0%��[�Z=X_&�
�n��j2=XhP��U��+�m*z1�|�����-E�����%
R%���|Q���|I�r�m�F<�V���x��JPVEq ��nF�&�2�&�����u���u;�E�wKV�BD2��j��L�fZqT^���U�M�+/lv���6�����uz/���a�Q��\����@����*�+�2�Ft�v{Q�N�k�u��*O��'P�h��n���"���Q���SM��#A�8�iy#1,�Rl�T��@�*���_M��;�)X��	:�V5��$���h>�F�V�A�M~aV�
:'���=h-��|���=%���J���W���Jgt���[i�������W��N��b|���8�W.t����XT6s�w�h��'���-�"������9b���J��=9��.(�z�F�A\u�[�c����^��< n�s�P'V�����o�������;����@�J����6P���;Oo��J���/7������n_BbX���:xKq�\|�]��Z���q^g�F�W��~Y��]�����A�����f^qK��0�!��|���m�GJ�j�W���m���j��l��{b��}}���s,o�h�m�V$���mW�8�������qe�s����O H��J������8�y�q��]?�f5hA]k������������ ��F���s`�u��`��X��(��N�����i��KZXu?=U��}=��F���(����.��8��/QX�C�������c6��F��da_w�tm���z���IU��|s"����&E�;��Q����mz��m%k@���u���cn�O��[N[�:����:<��'�����.�������Pgu��@�;|�n{?��]�����)��\�"�z����X�&-��V�"�7����A
����&����##���CK�VZ��N�t���&�����uy���yE�U��%�v�C�����8&{�r{�=6j�=�]�m�k�)��|������L+��:M���vunD�Y�2�6�:l�� ����>O��|�h����������/����h������zo���9XSg����`��hu1���C
�~���Fn���]i[]�I�NF�`qC��v�}���i�9�}C!�5R���2�u��@�A�,:��;���;�A�"mu�
J�='n$�o%��� �����i�'�����:�^�~"��|�@�_��X�L������S��}������v�1���*�F_�u�(/e(�y�r!���%���D�9(��
�zp���-m�}@�N�qZu����,OR���T�}���p���^L��s���!��D�.W��1�%O_�!�J�y����!�J�^�G7��g��6�z��Ym���j�=�MA��v��H���C��������)��"x�Io���]T��R������'��Al378���#X�
�0�R]�%��+��u)J;��@�)�9L�E�v�A��sPRvX�� 7%e�������@��0���MVV�Oe���F����Wz.�3���j����[�~o����k���4����@eo�'e����z}�x���'��z&�����T�a]�9��.����������:��W�7w
�E^�&�]�}���~V�m���e�^����K��o%M�\�����	^��9[�9=P��j>�Y�v�+��S�F�u�����\L�Y�a_U7
��	@�
*��V�R����GtoN9��H"�ic9[�W8bc�b����*ot�1�fc�f��uN)����t-�@]K�i��MCJF�~a���4����U�hW�a��>`T��]�lS�_�C����G��><�{I�R�{�r�~�
���*,�F���u
8+�i�k�-����U��V��<Q���8��o�W�@��'����'��V���v�%����pk1V�X�f^q���`U��)M�*�
��������f^q5������iVU����2FE��EX�1���0�U]���.�V�i�!W���]�����.�7���N�s�=h�^�w8����Y�v��]�FqoNX��V�]c{X�m�����9�5{~�}&r�T�p�nn"P��w��8
���^�����!w�
����&������/(�����Fr�.[n
�n��Tk���(�W���v����s{��*_T��@*%�is9�m��M�u�vV����|�����<~���(���}���<!n��+�v�(�s���F�d������7-�(�UD��s���W5l�8k#��s��w�KN�|��i��xX�Tz���8���-q���n^��:�~@�����-J�t�{w���^A�����������"Z��f��n!g������yu�B����w�����0q5U�l]��6����W{�d�����]U���2�A�6ds����L��9���F���1�)���)���*Z��|7��	�
�AW�v3L\!�#�.�|��r��M���
��Q���k�����
)!q���o[�W�\������]�0b%�6��}�s�w�rw��,�_T������z}��n��fIz��B����/qp�'W-��W%K
+��@��?Qm���Z\D��j�Q�|;��h����}�o�@����W����]�\���1-n�Gi������a����%��&���v[\�T��)��E�})P�{rz��:t��Q����+��[pM6��=��=�����s���A2
�U���V���X�Uu�I��d�#AnG��A5����`��}���='�����s+`�' ;���.����i��/2�j^E�"^^�O�r�
���-.���|UxE���l�`e>k���y���r�'���@�v���5|����yu5I��~���6�u�k�'�^:��cA��W�e����4���`eD �*�xX��
�	��������a-�W��{)]��W�����
�r����E,�j?��!`^][�T
M���n����'�,h�WW7����z9��.G-����<?%�����N�����'}��K�o39x~��}������=L���P`N���WwB�� 5��]�r���pwe����Ij�k��fZqi��9�k�zR�����UgM���?���	r�����&����'��p�3����u��@�3���K��w��(���l���)����7��?p����
�$Bm��N�����B^�����x�.cQo��z�R��]]L�%���Ml��g!g��B���:rA`�:W$���@���|E��*mnXw��4��nF�F�D�a������j�G�[����\E���k�`����n[v����i�8��g=1C$��j�`�-s��7���{��vu�!�c�&� 	t��<!��;�+��:�����uuc��]��Kt>T��tu�E��%��Fe�#vsP=z��E�y��qGIT�.�Q��N]�hw�����'��C����~uuL�2.3E���3�������h�����h\<��ojs{4�?�"W-�$^�������(G�+~�Vd��\�@�x@}����Q�)�(����u�uZE���{I���������q��@[�yVC��)�X���U��AG��o6�5K0����T�.�PU��%�����v
haU�,�P��w9�o�������2���QVF�~rJw�/X���7�l���:(:�{B���%*�����g��v-�H�����jt�+���U��b���&��	����t����}��A!�(�g]�������{I�UJg��P(N;�����[8J������`'��6(N�N_����)����a��W�*�{��!~��	�U���c���mOi��6U�:�������K�m�������U�
Q�U�&g��*�L�C]�M���8� ��JB�-*�T�r�*h����2u4�����{quUb��G�?2���R��C�~AU}dS��i4�3���]��r�����5�\�1�]u=:�;�������7��2u@W9��0q���%�+/�N^5�(uq{9�	[�$0G���(�q���)���V�>%����'�^� ��!
�����`��?�� ��M���:�PU	Y����������0.o\�2���������z�F�v�iI���YE3���1�:5
�W]���)F�y��t�W�������i��6w2AKV>a������0q���Ve0�w\�5��V�����3�����M{�6!%�^��l���J}�l����	q��Y&X��t�7�5���_-7S����`������V��>���U�;�Z������Bg��?!�ttH������L�Z���z��v��z�<!���!�}��������
=(1l�6w1��Rf'���AO�����.w�-�������
��&m�&�K�����*�q�}���0��e�������Kd��av}-�R�K���y����m��lQy��2�0����FOD(�:��6�����Cb��e��Dx�%n��g��
�������>\���d��e�4�6���X4���Q�]�����y��%���I@���f^���ls!�@G��vCJyMi���e%6���1`%�z�t�@���J�����>`�(�v�q����RR��.�u�|G8� Uu����a���i�qw�X����8����6���*�a��'�5M���a��Cf`37�P.��H�r?!����rz�k����rs���:Py��f�R<�yB<7��{�'�;�]�����l��Tml�����`�t�G�&�����u��@�e#VkF]�/����Y��d�'�B���,�@]|(��^x���wCF��"����O�W�nH!7���������f��S�'�s�N���H�w��V~�(%+[��&Pjt�����M�����#P�I
���@�j�������APH������SC�Y� h�5������k��rsi�����������M{j!k����.
�G=���nn�����	������}X�n����
�h�n�uG�@/wo���GBS�i��|%$�����uB@e|?���)����YW�����4*�kX����n���'���sa�@���TC�����`�K�B����`��VHk��#r-���:�p��	��.�'��s�����)�0��jd��Kw�rY��.���O����@��w�y��U:��'J��7�{-E[�C.�l��*W�H�r;>��(�8��E]����`]��3���7���p���^.9*�����D�F���+�����?��-�*����D�K���6���++~��������XM+��2�r7�{�����\��-:��Y'��U�FZ�Eu39�Q�Vx4N�(��E��*��t=�|!��lq1�@/W�������*Z����+~���v�k��1�@
����`�7���{�p5y�[�4���|#�n�=��P�����rF���ds���+�����k�+ki&����a].�����yW�5�c�7��P�2�'{`�`��_�Ua!�Wx��q�4���@�%j3�7�j�4�W��@]�RPU	y+�t�N7�Z�V�~�*
�@��#A�U�0����j���"��.�:b�]�`]�u�U���*
9�%7k37��1N�d���]�36����[G�X,4����{t~���v8_
�������Ti���]3�~B������u�Uj`�v��@�|ZWG���3"������D�����D��8���R��u�
A�R;u��UYWs��8xG�]_�^*��>&�����Kuc�Q.�`����9`U��Z�h6��R�d�5/6��vx��*4u%�G������U��@_� ���~:����*%�O=��)���Z�2}>I�#���T�4�J�-��&���:���,V�k������#��UI
��h�����N�S�\�F����f��|�V�K���K"wQ(v���L[���]�=�*��^�B.��W�f��a��4��fqG��;[�N�x�MC1�3 ���^��G�zC���!���7�5��yBv>uc;����jVGP��)�=(����,���U�h�w��8ww��*���������J��fw3H�U�;T'���&����wi+�#1"��]>���\;�m����/aW���-Vtwk�~�J*u}��Uw~E?����u���Q��.�Z����d���-�*}o�����������W���v�N��R��mW�7��[�u�����y=���nW��kP;�.���0�n���p�6p�F��9��^'�!;�R���]BL}�z��Q��:\����/c�u���M[B��55���%"���@��e���
���d]]�r��1�f���`�;��*�j�!	dR�����*�~�������f3��~�f^�I�o�E^<�#	�U�lw	e�K��f�l�n�
��|���.�7�N-�EM����fiW���� 0���S
�SQ3xGQ���
X'��E���9X��v�s���)��n��]��itU�N��T���Hr~Zq�F 9_!��k5:�.�q�=�v>%���ml���������P��!��|:��hjvw}���s�0��@��Oub��Y�R�%���<'+������z�t�PT���f^qi�w��!Oy��S8��������C\0�<��S�C����T��$s&�$#m&?���y������
��pS��c�AP��-:Z��A0g��n��������P�<�p�h��%����0�A������4�-��{�S�1�A����6X�1t�>�&;��{��+{A��y��=��DD&�N=E&�(����7�z��Rdw)���[=�F<q����*_:�i�viC�:���t+@O*����:�H[
tm#�F=���l�O���<��xB��
VV/Z]T�9LD���XI�E��N��E���m	�%]*��HL�B����P$�SN]��m��W"t�D�@��O=A��
�j-{���4�q���c���l��+����T���f2���[�V�.C����_4��������W|W��~f>�Q�_T��w�"����u@=������K���s3������!���F7�����KP2��w�%.�w������|Z�{�(��>����=k����P���0��.�;�!�'����0��C)��:x[$>�H�X6����-�����r���,��UM)�+������6�PA@�5�=��E�aV��l��L�4Z�f=��_z-��
U7[U1	��.�@UJ�P1k���l��7����p��5���d��#�����������P����#!����,�H�@�n��	X��t�D�{�(���X�:��;P�oZ�UV����W`o�ozP<8Ps�����Uy���������Gbn�r��d��J�t8
��
�����~)fm��?�B�.Q�U��5��F����GtryC��V�t,W��a��R9Xwu���.��|���r�����[����@~�u��u{���-*5�f�\/���V����?��kT��=a�{�/��
u�{���\_�a�+3�W���-�)�q�������`�����j3L�u�{���iV%P������Z�x�|m�@ho(i@Xy�GUP��O����G�>:DmfW���}���r�N�vm��F�;9��p��~<!�.t4p%��G\(�(2�mt�P�r�~������
�����"�f�)[>����|#�������n^A��:���9>w
lu�Z��~�E�0���'�W(T�W�9[�>p�d�@��=}��{I���n`�c��N�J��uI����
$5��!���7*_�-�^��,��/�Hy�t+���w�
t���<���r�|�%*}y�u�7y��4���S�
��Q�~�����-.z�|�ur�o>Eo ���z�l]V�����nv=�ml����>X���v���V�����<����]op6��4]�C���4��i@K�To�����l+���ht3Jv/�l�zQ�F���C�2/q3���M{m��+������0��C����n���z������}��{�e�!6�d�Sj���TZ�r�W�!��n&����e"���ol��*�JX������^z�j�a��{$9�RP���&-J0�.���'��q�E�t-��S<.P
�ow1���d������a���N���k5������FI���b4��K{��K@�Uz.=p2Pi.���z-��aN�R��LqXK:)�i��8�.�H���s;J�.�4?H!U���L���0bj�=H�G,u�\�`W}�4����@]? ����frp�\�*�����v}l�r{����@�Zdl��*�uz����O����.;���?�!c;\2i���F�2�&�������a(�����6���n�G����u��@��U�=L�he������������=�b�Y:��w�
tm��F�=�"������:�rj�jT^�z���
+���w�=%.�;Q"������2�@�r?�yB�������v�~��zp��@�p	,������V��{�=�[�����4��6��~��������x���4�&�������i)[����Dfu�C]���e��E�/���	q\r2��w�$
��h��"j���+�"�:��t���%����iT�^�(+_��hrrQwr��*��6w+�Q��A�j��luY�����f�8C.��7�j����q9�����^�;�����K����mN�)��/g�U�+�6�N���h��{�B�)��v�@e�|ZU��)���W�7��{�2�l�`]�.6�x���������i^�V���F��2����P���WX=p��.,���;�����u��@�g�L��K2}���{i���5��45Q�]or�"���t=�CGxw����7G�i��s�u���rZ�V/EvW��\��_M��������{(D%xU���Bz�=�s&q���P����W��JlL�K��� M��4oX�Nm�K��f��4���j�'���K��@]���.)��y�o�r�a�$h��}�Cv=�`��Mi���U�44��-�������E���U���{��=�A���m��n=H�$���<P�mjg}��yQye���G'��%����`���!���~5~��1l��n�������=d���T�������tP�A��Q���k��4��%�.9���;PI�����F���da��
i�Q�6��Se��3	Y���:��i����:�g����ux5~T��+�u]��UM��Q�%�^�A��I����,i�Q�RPW��J�o&�D))?S��`�-�kT����j�r������=���XA����0��UR=l[NI�J�vm�G�i^������=��z�
��-��*��R����u*�Zr���L+����]�O���l1�|S�Z'�1Y�v��0�������NIH���w�������	��TNlQr���������2��%n�ye�W���'�1�hwVeL�n�F��}�7"���[y6v
n�QU�3I%�5�u�`��
�����uJ��[S]�2�^�������%*�"�@������I����l���\�{��TXu�0���P�}�Z/�}pe����2�`�*Yu:=Uy���Z�����z%g
{p�C��Q����;�N�^�;<_y}i����<(�>Jq��u��o�|V.D�{:����}�p��������R+���%Oe�u��`�V�[�A��v����b;p�l%r��Hv�|TA��*�������@�k	��	Y��SV��Vkt�M~BD^5��0�����	�dS_Ue]���X��7*�s���AK�q_|�N=�v1QPmD���q@O����-Q�*a���h��50���AoWFq�uw����F]X
T����7��R�#_���p���=�bm���r��Ro��B�V:��.6�%mG�1�k�4>�j+����7���q��`��~
����J�	�=H�@���+S��d�~��M4"���~����zW]}�����#��1�^�w$R�=F�i������;�`��J���Yg�;xB� Uj�U����CQ:u��@k^7��j��o��,��,��5�~K$��+���f��c��g�4������#s���f����tm`�L�4*��J��Hj>E����g�t��0�w�~~�#�����o�Y��+_��#�`3J!%'	�����J��;[���H�������y���1���b3��}.�Vi�^����u=����f^�S��)��=I������
Z��������l�u
u�V��it����}pA�p���u������sW��r�A2/��Kt�
T��V�o�G�eM�[7�����h����x���AG���G.��G��'�s~���P�`(����)�kI�����������^Yjl_.�6���\���im.��D���]������E"��O�A&7����J��UJ��kc��Uw'���A&�����M1Y7����]��}����vGm�?���k��y��UWc3�x`�V$D	P�]��l�m������/��uxX=�:Fs��+M��9���!K��g�%���u7�|���GI���.�T�U�7��)���>J��]nL6���q�T%z:��"�s���W"���A*�YA�%$v&���n3�84��u������[u
�sm�=p��]������������f�84Nf-���!
������q�R�t�
YW'��R�X=PN@b�q�����@��A��ke�����r��iW���|���<�����������&�djO�-Kxvc�`����k��4�6(��f��/��:����j�.���V��x�5��"���&�7��q��w�r��:@]���*��x��\����+�����ac�����`]
)�r�!���#y��Ez�U���E��q)�J������~Tdtmh���"x��p3lW!����A]���?Z����a]1��jH@���4zp���������F�JN�*/2�������I��<hQ�$�h:��"����a_%C9��p	hW'6�|�E��U;�����Q��]U
���CL4�s�E���.:y��_�����)�>���Z��\#"WC���vu�
z�u�����,{X���r��B_=��dml&�F������6�p�.?5e��DU������J{��}UlQ��NdZ=8��	��'�RA�����B|���[��U�)���~U����h_~������"0��yB5�����F�v��|��[fv�{o�Pw��.^�-/0�����`]�y���mQ=����@��7�����`/��0��;2��N5�6��[~����h��^#�U�$�N���u���L^�*��]���hW���-�I�E�W^y��0tOf�o/��2�+$�fU)�;r)������T^�s�.���L�[U�.��+��kw����s1�/�~Q
^�r��-@��*�����yB�F����'���f��l�U��2��U��������*u���A^.thq���U�#�*G����1,���.�~*-n�9���glux�J�/���;�[�������\�+q_|��JbuO����]���h�+x��8�J��r�l�	�����}]$-��W�~Q�^[�l5��:\��R��v�@���:����L�j�����<��_��u����UmF���a]7��6�jk� �:��������`G��Ev�uH1��P�����F�;tau	dn&gH�L�^�e����&=��%-s37x`�h��P[�Q.E-Xw���Z���|:�O35xB.��8�����q�����}{�q~���-���r]�!fs�.��+����2���3��]��������Y����X�i������m7%��B	�v���^�f���u���"��W�]�v�������@��Xy��YO������`�����@���K���Tm�p�e��.����WFT�_�
+�f��Z~��/v}��~��Q����������$/����M�n��:\�m�{����@O�G��~���������\�����t37��r���G���K��;$��/)Y��z�������O&z���A��"�S�����l���R1y��������ke�(�����|����eZM�]7�AX�+�a�{)�^X���]�#v'�@��������n����4*P(^\������{����D]<(����/���R��m��5�H���|6�������,Xy��pw����<�VYru�7����$a/���z�n��X�F�~����h�����zoKV�(0���a'Q
;�1�#P|���T���TaW��4zr�T���������mC�^�m������j�=p���]��r��m:\����������Ex3��B�V�BK�����;+7���qN7��j�h��A�u�$/Q���������K��Z���0���h/���^�����0��]YZ����@]0*��Q��A��W	���e���b�v�{�6�=�6F��]����(��3������i
��7^��E�/?�8%��)��&'/B������h}]!�K�k����jrA�z��_H�����&���0Qb��*~�5�]E��bj��2Y%��k6�����0��2Y�y=���L��c�D���/��+���7�*����{R5�E�FM��D������|��i�L�X'��'���~��1H7!�e�NrU�J�J�m���������+Y8�>�#�������&CK��-��LV����c��$�4Z�M39/��~t�0������H�t+p�;��#�\������hOv�����
2��]�[�d�P���xA��:�����p
�p�d������82���%��.!��{6x#_;�+}-�������CJ�\}���
t�����p�Z]"d�ye�7����t�����Q;�%Y�V��%]?�/���Dy����2�����"B\"�
� ���$��g�d��!P�59�z�%6Ms�2��v�@�;}��	&���l&������07���� �d���U���W�|-&���jZJ�����Mps�����Y�UE� �������Nv����b�5u\�m��k����D�������c�N.��TN6�������}��d�e*��F�h��N��?d-��}a��S�������*}��>&�|�}A7O��g�'�\� �G/�~5����{vj�X2�a��'���&Z��������>�����g���a��U�����?�^-��v�� �WS��0��M��dU���VS��;b9�1�������WI��*����{;�j*�~QSb:���Pm����N���o�������v�9�t��{|0w��v�)���s�������:����"������S�}cw���*�_�3�8~�*6�����8R.��e�&�L^�D�r�'��19q�n���o@�e/?�Kc�-'+���}	;��|I����
�Xe��"��?��pyN�vnM���=[�����%s���p�|.�#�zp^F���Q{������a�Qw

zp%���\�W��-���Fm�zQ{4����tpc�����%���&����@�K�h~�m��wEe�DA����0q���d��%5���keL�����|w��:�Fi���������wh�vw�M7���{�S�7�5��FWU�<�D7O�Gc�-���6����hE�s����/a������:����}D&��&���%�M�E�Ct:r��&����	�\4���(�������(�~����5]�>����1���@�@������5�Z�\��6�d�4���.�)�*A�,��\��
{��������.�A���a�����^!X��@Z���u��=�����<[���L4����7��],&����`�5"����{hq�V��:��i��%�ye�w�5�������s>�-n�=��PN���7�V�U�R��=����+�M�1��������d"O�|��8Yw��0����G���7
���8����@���D�^��g=pg��KJvM����p��}&&z��8��.�$Py���2������^&]D<��t
q�S���� �����������8Cw�]
c�����@OjM�!#�5������{<��{�TUt]����5���@����?��Da��F��|���
�P�t.��N:���=.���VuC�����6������>����,���u���i�=8R�����A1��#���S��}��l��k���*��]�����G��b��.AMw���T}������W��fZ�����d���qG�����11X�9�t�S�B:4�G���q����T��h�?�}�����q����do�����q�8�C�8~."��K+������Dv��s9�o���&�.4�a�����K_t���������qw���%bi�v��(���G�����Zo3�xoF��?�=!M^-����������m*Z�k���#�t!z��-X'M:���D��������$XWuM�P79�+��F��������*�����U/���j���,�fj*S��}�����5�<�!V�N�W^��B�R�%��rN�Y�{1���^����fr����.+�	�R���r��y��'tKZ����u��[^��By�R���UN�(����j��P�-���-��]�d��hQ1�i5�
���q�Tr����F���URe��W^h�^*��/������x�U=T'ZT���	U�+=�������d��J���J������G�D�&�����<u�
�M�@����.|��8�����cP'��U5:���L���\�W���m!�z�C}�����[�Rg����ZU@������w����,�K�o	��;�;?d5/u[�i7����������t?\�5i�5�s!py��G]cOTe���|���$��$9a/�����G��O����&���@�y�p��~����C��rA��~	����(:���{_n���[�YwL�?;������@o��0Q��2��h/�r�����\���}{��--PW��2����K��"\��:�Z�����UW���-��^*�4_`q!�z)AP���������l����`����HxZM�%��{�(UR[]=��dy�����n�q�w���%����L
�����]��'^45]�M�5[fc�D���{^hj^�Mv���F�����yB\Uw	�Z��������Z)���*o�;/T�q���H!*��*��u��&�>�f;B�gu��|�����{a���������~���B,u
T�l�/[i��w���������������`��9O�y�i��`*���W�2we^_��
t���F�|�������w`��It�K��[����7����yXWK��n����Taaw����	UU�����m�W��l�lC�9��\��'{)�3���jc�O���������[��nDa]�XUo
Y�W8.e��.��fnp�\�Q_����\��~�3uu��t�|�	�X�[}�.A��(����-l�_F8QKE���D�v�������9��{��da]�%P��&�/��P�]��9[��u�f�]3V�a�.�9����\WqyM�\�>�0��^���6�%������z���wq���]uKr���r>i�������MR2���6�N���C�f9�l��&����7j���_��'� ow?h_N$���p��VwDua��$_�	�uM�`W��4��[+�~]�h����.h���F4{]5���T�=�l�B��ri�r�T���84�zV�3A��"L.������XW���{Z����sfA�
x39�3�V�$��kZ�����."�b��g���"PY=�����N�VV0�\��{�L�A����#T�bly;������6���$�a�=Z���]�|�����}����w���)q9��n�
t��N���n��B���J��iV�H���/{/���x��;�\���mXr�"��e���BPX=X���\�$*��%m�&�i�������q�a�k8/�6������ki�:��.q�������`�L�5�s-)�9x�'���7�V�v��<_�V5�����a��/��������@$����[v~/~���Z6�g!dl/��[����.)���3�����a�
�p^�2�+Py��q�	����O��|3��27my��
�U�7g��|$������������F�D$l]47���q�\~o��[�Q�=Hq@��r��`��i�9(�G����7d��T~U8n=�b�-���$l/'��{���F���~5C��7�gZ�-*~[�}c����`�z�@��\��uY��rP����}�C�<���a��6�|uAP�(AY��?�����{�"���!����eJ��w��o����p�WY�rA����3}T�|Z]���>����c�T�P�z�,A�ri�<�k���E]R�)��Q�u�|������}����]�vu�
a�r�&��R��/s/���V��k�4�(�����&{��� d[��-�P�f�y'��naW��4����D���DU��|�|w���mQQ����A���4��N.��%���8PUqy��69��Kb3�x�*P[T�� �� N��n��"KI�}�O7���t�`=�������A������.:�/X���r�AWy�������l�()�T�Sxm�v�\����Qii�N$��B��,��.��frp����bm��vC�]�u���h^#��7��\9[�rF!�����y@\(%r
�7��+��t�:	���Lv���ASZ�`��
RB�����YU����[�n..,_�H������;�bt��(-��dR���W���B� h!�(�B!���l+?
���'�W��n�)�R�����~v3	J��������Q�.Jm�Q�?�C�O��G���X8�e��!�,_R-D9Q�k��^S�y��q������@��2b�62��iE�2�#T]�K�����6��4l�7J	U�vwO2���;V��P���c:ls����m&���P��EuN���Fozm:��U��*9Py��I��k��T�itM�O�MNNXU�E�����V�7�A���u��G�0p��� �Z�F���}��z���\^N��]�V�7K�J�����R�2�M%	�vw:A
� ��<�z������{�)m��[�B�hF+�$��x��a�[(�5Xyp��\�'|�������O+�Km	�qLP7��qoA����Ruq�hF�[<4���ZC)QBo��RX��9����i�}�����������E�c�V%9Q����3W�z��drp�@6���\�imwF	t��K�J5U��T�a]�K��r�.���	q�[�����f�����,=�v���yQ
�e���y
����@�/�.�c��#���S��^������U���V�]#w,�@����0���I:���`���,aA
��[�N�M
��<B��t�nj=���}7�kc����Jt�S$��f�)�s�a�������l>g�����Q��l���3Xu������JA�[3{pC�g�7���G�B������-��\�O:?*����^��^EUr���K���~�����
��H����s��u�����E�\�"�E�(�w���G���=R�,�r��f�V�k%a�]l1��dl���������}Q�V�F�� �a����aow��0������	�l'����r2@���.��rT]I��i"�J'cJ��g}���/.�z�/���-\9������@��rw	h9H�@�[����"ml��(�KX��v���@)I�:�tP�������#Z��u�4w���4wq0��
T�Q���#��U�
z�E>!]J���\��$�k8�zu�H!%^��X��6�p��'�p��@���������t��m.��k@��e�<���a6��;u��{�3{w��k����RT��R���w���OqR�.� ��9X=���K�vt�R��	R�E�$N�9�����@�%g��l�J�q�V��%�a�Ef�z{B��8a�`���	T�����+�A����	-+5=AB�h]�>��u��B��V[
��h~�@���N���\�(rq���6w�TVHb��u��6S�F-���m]Lm
1��>R{=��<�@�A�B�k�'g+��r���`�8��f����FN�VK/�P����7��w�V���;O����7�C������ ��F:���Y�H9h������KA����]{M��[m�����fr*����)j��U�������������a�1�^%�-��y������nT�Wy����%R�F��I���R�
���E��S���<����f���(������bvu*���������m��U	�s�����'\��*�}���Z.'7�d�W���*�
y�[����X]\����MSm�hk����D�
-n��]���-
yb��#�_F�����p�yB��V��Nui����M��������+n�;����V�(RW�4��{Y�Z����RJ��������;�D�a]���+�����������Z��u���V]55������_tl~�@���l���e�������	�W��fr����������r�P�r�����uD�o���A��1QU�:�
m39�3J��V�@�kE[U�h��Fd�V���
�15+m������g�[#���}s07S(�}�\��a�}�J��T��\i��U��W�����Nl���7���pKa�����=X)�DvR������9���
��=l?p����a������]O0��0��r��}<��X����2�`]�u��V�)��?[!�{�b+����@�e��}�nZw�5�6����n��	�m�4��J��Yw>�i����������Av�V������N��|�	%�[�e����[��Kp*g�[���[���a%XW�:�%V��6oeo��R�m�	��������������`�WZ��NBt���[=�	CO�vQ�`/�S�8��������w.�����s]�7�G)����	dw�Rdwo%��4�&�Zdw](������{��u�;@��^���2
�.Ez����|k�=��������������O�������%]���mm�K�e�Y�_tNe]�
���1�����*��vQ�]��*�F]����w39x}�#��EiW�hua�@���4z��9neo�0"(��]��v]3ys�"���%nl�
9�-X�T�x��d|�hO\�!wHDeU���SJ�T�Vr�t�=����<���~�mJ�p�na��X�uW���u�L+�������/@�x�����\TmV�|�*y�Qwm����b7�����U��#��������eIH����{j����(���m��K�._9��$\@���R��\������n�KS����&^�����R������]��6���\�����p�.�t	��W��y����X���������p�
�^Jj��d�U��2��<2������w���A����yB6\����#�F/�m��6�Aa�Vt�2>2��c���<6�O�����!(5Q�~(A�UF�[��3�Y���=�Y�/��+qTR]0��yh����G%�����S�?�"��a�s���^R�U]�J���
�q5�SLV-����{<�U�N=�p�1O���A�[��n�����.�,���dT]�#^�V�1�@�1����3���iG�2o�Yow�kD�rDPf]��s���X��2���%g����H�}�
7���P���k��o[h��nB�� ������S�TM	���]�r7O�&��JaeR������{/h��z�`��`�Y�	6�d#q��`/�vhu�N��b?���ar2[�J�<�!�B�
�x�(��� >���mc�����h��0:�&e,8��������mE��v"�.$���~Pfu�e�d]b���n3��$N$&�.?}z���lc��VG�f�}��`����5g+���e�����`{�����V�)V�n���A/�����v��|��
gU���.����l����na������@]�hW�ls���AEq���I��?@VD8]7x�U�0��G�4��W2����ar���*�V�=���(��j9[�D�"��}��XiU�G�C���U��������hUsX'��W����VU5��F�{����B�C��Z
P��fZU���j>�V+u��C�J@�zh�
�"�YU&;�u�<��\����w��]�*�l�x������4P�6Qu\������)e��n�����j|)g��&��qTZ�+�J������W�N����-rKE�D�����O�����������F�%�o��x`��x�*l:�+��0q��`)��������0q��N���4A/7A���L�`iUu3�u�:����QY�M�fxCnU����-r�hG�r�Rw
;<���_�:�TtG����l���"<��ma�*`�����0���c�������2�@K�nE��%(�u�zP1RQ��*��q��@�U�1]&-lu��@�:�z��<!��������)!�~����>�>�j��j��V����!�I���5
���%���������i'���f��d�t��=t����_����Y�4X�Jz��l4O=�T�����+]�J����
�G���q~QC@T�����WD��t
�@���Z��_�V��UM�k�
����ke�w��>*U
����h>�liu�!hy��%��R����OD����r��6!�8����@��������[49��7��F-�U!gk���m��+UMX����A�~������T�o��=������{�����ED[�.���J����u�}����<�N��^ym���gUH�M)N����z��yB<0�����Q�<�����6HrVo�<�~��J�'I^��������:8���Y����#��pq6����}�_��
n���7�������}q�WO�����*������}�@[^U�"?j������h��Nfj�l3xo.V���qs�8rn".tP���hu���:X��=a��%�|XW����|3��`��k�Z��*QY2Y�C|*M���~��n���o���-Q���2�%��$������A21���,�t)��������7�7��@a�6�.�5X�;|����A.����;�V�9���d��)PY��U�C�o�2���m�*���-��Z��&���/��]�����H�k7�����(+�K:E���1M���W��Z����L&;���t�Sk�W�u�}�2��iZ��7��������2���c��9[@p����.��e�b6O�{�����N~t6y�8Y C[S�K��D����VE���J(d9��j�EO�FQ������o}^���.u*�����'d���=X���.����X�T*<3~�>C�*����od9>~2����\�f]�1P��h[��6����@hk.�P[�%����n
����1�w.P�\nb6��Cpg�`�A�8
������C�1�E�E�A�������twh���]N���rnl�	�m6����F!���zd.\k�*���}������r�V�WA���P��.`�\��z&����V�\�)�����}i���:7+���h�.e~T���<B�2>��<�@�������A�� J���W6k���� ��|U����;��O�9�iE��*�K���^���<P�l(]��J��*���t��a�J��f�Q�x�^*}tQU��jaV����^�Qw��@eCG���qXw��V'���	�Qum3����%�{��.*�M�����y��tl��_�}��uNTi�L4�$4�@�|��m�0Q����������hS�%��8$[$.(Y/X��z���p�Te�ST*�z���������Q	ju�g��B�i���r��y�)qkZ�N�tUoH�o�V�Q��viS���m���b�W**�E]eL�T�K��Z�fjpJ��g���j�����<������fr��T��t�]��it���<!��JN�-��uM�=�m�P�\��r�������K��u�����k���O�<fS�������r��Xu{p���H��>��V<0���I�l����<0��5
%���q&�B����2n��C#������"s�y9�Vf��r���T.�4{2L\UD���'�|�����m���9����Ni�/*o�a�\�pP�N������7O�s�n�aow�	�/V7��/QU�����^}��U���*���AD�9[7��jr@�r#
Q�vxy(�6������u���M%��^r6��A�u���1a/����@{>�!����&��}T��q�b��������6�@�K�m������a�W��E�#M����!�6�{|)�l&A�
�vw�Ui0�������j��\uOHT�����8X�u�����qsK�wxit����
����e[c�:�F�5Wk���Qn�	�8CgHNI8C*�t��
�J�h>����>X�Q.mJk�qnQ����f��`.~\i&��RnT�K�t��Tw�Bvq�6�����Va/�:���0����*�K]��Z���������x��[d��'�2�|�yCm��
?\��_Y�it-\��QLm��v���R�3b�6���z��#]��b*��B����+m�������`� �DU���w�h(�������
���������7z���`�k��]G�2Q�U��t���4^��1�p�����F�O�k�������,J�V�h
��b���.��L�@v�57����$^a]�
�;���!����`]��i���a4������S.c���-�Tn��K�����=Y}���6�et���^� �
������7������z���D<J�W����`�����)����i��6w	�	��:%o�����b'�K�\#H�u�al��Z7���5�.m$��E�=�9@}�pVO��x�X6Y��������< [�+�@��]Z*�iu>I����������1$��Qy��UwZ���#�����i��B������p�
�����|P��&����frp�����O������F�����������^��D@7�V����=������?��U�&���������M�O~T�C���4�l]o��y��wm��g��xQ�8'�5gacg��}��*��pK\�#^��?!j���6������Z��a��+�����=��������k��kS�c��;�Z]���7'$p����������`]�"�.����_C���#l�����������k$
�����G~�\,���	q.��5i������$���ms7�"���x����#7�H�q'WP�AAW~����o�P�m���!��>���'��&�|$�"�+���������B��`'EhXnj�zK
�-2s��>2���]C��)�bX��{�a�r��!��\��[uZB�=/����u
#`�� nl�������*LP���v���U��Z-����]�T�`eE�;l������;��Jn��4]�	�a�]���`�\K�1q�Y��e�����F���?��#��U	!��&M�J$�us��E�`w���Z:Td�IY�VW�p�c�(�By9[$��������u�U�
�+xG����
�����V�������A��A�S:��#���j0l���#i��'��B�-�����q�(��u���yu���nW:��k��4�Jr&��c?!��h�Ql�+���#�����u�
����,�Q[����	��chQ�Ms�;
��.��I���B/�a��)I[X����m�����Na�:��-v/U�[�k�Y��#�z���i:7X'�
���+�k�������b&X��t�#d�%�(�Q�u�?'�O���vUL����O�����*�h�y9�������}�t��-�x��
��L�Y��V�>15^�"���}TG1���-l>��Q=���
�Zny7����u7�}[�8����T;L|7��~8�a���Kv��v��O�����itI�������6���jIw��o��QK��={�T�����iw!:�K]\8P'�*?���F��z��
�=S�^:�hw�����z�-�Ay39�$�������_$H75���H�vUq�nZ!e!��Rz��x3�b�q���%<�U��?�����V7�0��z�{q��b�f�x_�v-]K�C���:_*�'�������La��-��?<�s��=�N�����S����x
�.I�a���T	��O��(��Y\)[����/f]T���iZ�k�w$e��0�.�%�DM
��j�������(���*E}K�>�;�yB\!�u���ic��-e��H�����U��Q)�]��7�d�w�?�N�o�m��iTe���J���i�O+�\?#�"|�?��(���D���wv�v�4���68+9�2��.����~�C����Ta���������V�`/�h�>]�4����.�����(iW��h�1�k!g$������b�Uw���m-'?!����uQ� ��]7��6C4V]&R�����Wa�h���9[q�u�� Y��d)�����B%�)�w�C���e�b��s"��m���&7��v6�V�g��h9HVE�����M�@������d��g:e�Q�	w"4���yQ��W-�fnpJ\������HC������A]k��������u��@]��iu�F�<!��K�
V�O��������@����JN������Q�
���`�AB/��]���.�S8�������.w�/�����H[H�u)�*������9���b$�N�����`����:����{��� �7CD:T.����@��;���<![�;�$8�K���]n<�����z�_�Njw7��$i��]A��ct��"�G�������f^q-���\KA]����A'�����}��J�g=Y��|�[���r�B����f���j$XY1;����F.�Z�u}-yu����S!�u�~�2_'P����t�S(���"w�� ��.�P�{���W���`�'�)��>��o}���Ir�k
S�=Z��f���H�tI���G�a��k��RW��(|��v��*\�L;��e���[#b�s��Xu�0�k��ye�v��SP����S�[������A��5G��I��u�4���2������6y�O�Z����.�@Y7LtG���?P�u������g�.��\o&g*�������:z�U�thwy���7�iT~�QP�m>K�fj��\4&X�����9#v�e�\��3��
30��Q�����Z�<!>������v%����[���q���J�>�@K�����R
PwL�U�����?����P����R��f���@sH[qO�|gP�L���o��@�p���`�Yi@]�d����������P���U	3�w>?�J8��oz�C],�^�H�
P����qP���'���*C�%��*�������|S�������B��=�cE/@W��4Z�2Nm�������;�����.r��&��RO�5]!���U�z���#�L	�NV��r0�{��?��O���u��U���t^J�n{�5R���*�Z�#Vi]MR���n��8}*�����e3L�>���/Glc����W�����s5A������<l��t��Y�T���w����]��M~�Q����P�:�E����r���d/Z��O��������A�����jdx9�m&/JS��:�P�������d���P���#/;��.x�p^7f��~I>7i��;�ls��Bg>79���X�6E���D���k��Rb���7$?�n�/�Yu��
FA����@ax�u�����	��y^����6�p.��)��e�8���?�����=#���?:��@����[���tl����}��Aa����`��i�"�^��U�6h�y�G;�X��\ll����P���Aium���w8ngT�U-�c��+h[��W�M��
�t�@o�
����&	��$1�|7�����8V����u�Z�������5#���b6P�]kMr�"}G�$�4�/�=*�uf����@m��:=6��%z�������pY#�j��w�-�^.n�Y�
t=�o�'���][�ml�����Z����U����;�=��C0U&yUN�n����t���<!�����u
�@����f���>r�
�-�x�S��#lU��N^��3���R��t�poZ�*m�q~w�aC�V���{��-.�������F���r'��W��+;Y��z�/te��]����7aoU�4��7DO���n��it9imF�c�.��]�7�p,\f&R��g�_Ey��N4?5x$.�v*�,��r{�@.����,J��X�|X��ko�����(�U��Eq�����F_�'��������b�)[��*
/PD��x'���x]��r��/u�4�������1��_d37�3n�	��Ro�U�z3L|��
�R�;�m�v��%-�������DZa�����q�H��6#�r�e�����`�z��-\7����!�����0�E�e�.uf�`���s�M��I��t���7�M+���U\w�l������s3L�E%xk��@�R������PZ����1h;�A��u`�]�[�$�#
�Z|��-��+���.4��-�������6�a�s�wu����JT-�A�g5Oe�&��u)e��H�T�=Xfp�\�H����AQ��C���Vw�h�;��j��G���1Z���r��@]T~�r�7b~�>>�R��u��@���4�,9�?!
����uap|X�h���`��N	\�z��K�.'����)�2���w}�y;���T�R�<��
.i �G)_�vw�
��� O,3��j}��������i�}#���f3�8��ll��q�J6��N)���|��PT���@Oy���3�f��5"�z�@�<!�E�m��Qdo��oiX=HNC��~��G�?�)��������2��6�]�n�FX7���pW�/���/}���l�`������k]�u6O������|�{_"��NxXu'�@e��������r����6}�
�nr�.a��V��W�yW���K`�u����p�rUd��At���-w�V\���"A/���P|27xC�:*XYhh9p�7����_�Ti�����'���:Mt
9�����Gi��K=����-�C�vU(��W��bwv���*�BC��X�drnL�a����'ll�L��N`���[��lD��Td��|����G�@�v�
3Qu��L�]7�41�d��}�]��s�b�Wy�Ey��W>��Az�Q�a�'���)7#��R@�>���3s�����{^Q�]�+)[��	mJ�t�&�yBu���
��u�0��D?�{q-7��&�tao�x]�Wd~�8J����_T-��6���j�5�+� ����570��|+���8n�i_�����|_B�FE&���{��}��I��[|��v�1��8�6��_"�H/�;�c�A/�f�n�AWWq3�8arr^����U�M%�G����*"��O�n}CW%������y��R��U�D�]%����+����������G>��.�1�{~~�0��	+������<!������d�ol���F��; ��D����?���X�&'��%m�.���	q�\4)X'�z/���0q����/���i��W>�A�U������pu?{9��&O7�����t�`[^��A��Q�R��u�.���0����)��UO]Y���D�@��5�G�A�vwb�v�'���,P��8���-�{�B[N��>��B���N�4_�����y@�[uqk_o�3[��]	����
��\f��W�����i4���A���O����p{�{$'� F�t&a���/�>��E�Z3�=8z"F��b�*Gw����=SP��)�L
w��������Sl*�����{*��s��]��7�p�\R�����	���-H���Z�.� HW}Z�
^�w^�A��q��R�%���u*k���s���m��K�(�h�9'�����Sg��
S4���L�����*�X?������I�$�o�����{��;l��|S��t��y��yB�(%O[���dw%������8���+�u��A��h�
�3ewU}0ls'�@]^C�e9�m�K	�*M	��6�@��2���O��0�V�����~$���N���[�����������YV���a>_�L�a��;v����4dw%�������;�����������>���)�i%E��@��J�+���e�h���S�h����*��Taae�	�V����sI��������b3Jj����^e`���R��/�3�:j��
j�u�������p{~��?��h���,j�=�d��i������d�%���$����
2��L�C��{g�K�PF��L��T%��������m�d�ot>�����fWw�.l�J��q��������=Q
�����v�����*B��a��M�;$6p����F��Mk]!OW2��Q���au�����}dn{��;�t>��~�=��d���kcq���<_�2e����B��������H���DO9��_������.�d��+&���R��RM/�y�
g���@7{��v�oHv�]]�E8�&�dWN��im��p\p��~�9�7=Q�z�z����h�j���m�\	��t�����%z��fWW�5nV�Ft��$����2z���j6��
B
���9%>Y��IT�`}6v���v�x�����]�'9��7H�������&6$�nj���^� ������}�D/�U�����C�>%��=�����]9la�J�pE���J�������nw5�����D�*I)��vv��`���D�%z��_�����p�?����
3��Ml�.U�|��>�!����B�8$������$����%*���.0����������dO���u��D����)���u�aV�y?��-��~�N����q�t1t���M�qK>F��U���_<W"FW���*a�u�w��o��
����t��J@/����*�w���q���13��6��u�5�+V_�1j=a��C�VE��u�y�%���u�
Pw�	��*h}6<���C�Mi��j�z��x����00���Q���P� ���+^�r�h4���\��
��!?�T��@T�0�W)I�8�&00�20�����fa�n�U�'q�'C������Mu���d�U{����`A/�W���Z<fx���Z@�t>y����C����>.��j]8P�Uz���y�/�O��?��Z��n8��q��3l��f%q��X��^�~C~a�)�yseq���J�;X
��K����A���;��������1PWh��@_�c����#TT���/�4�E�-7�-w�*���
��-7�<��+m����)a��C��,�}\h���n�2�6��o�S�kc�_�Q����3�d��|���[<W�e�um��nt~�����=��]k�\��\b-Yg�}U���3����j��[:%jt�����CBFU�
���Fe��:��X]e��N�q��N�x��C���-P.��b��:9�@�����,��a�v�}����Lb0�����I�^+�Y���?"0�F������*���_�;$S��s,�������������M�������c^�9L�n[�aU���R�'�`n��$nOr��o�u9�k�;JL�
n`�B/�K~�h�s�����S!��Pm=��jA���^v)�D[��=�?Y^fns�%b�O��������j����YF���+���%�q�A\�P�v�h�r��_X���(QS���G�w��hW;w�.�"Rm1,��k�����.`}\R��4�,�+Q����m.��8�B�NS���
�|9\1)����nO^=�Z�@H��+������1h�����y��*o�B��$�*��@]�n���N��C,�>47���L�|Y.�a�r�n�nz������Z�s���iO��Ir��..�f��'\_a���������g�e
��Un��7~sDo��_����6��d��6���vW�U�[�S��@��
��
�d7|:��y�n��"�S�^�nv�
�������ss�������U�=���!��~$��sV�.	��NY��s%�P��uo���B�+v?��o��F��v���������t�b������&�5=E1�d�u�����M���aT�`O�M����a�v!S�M���=������q�������f�F��{?n�n
f������?�;$�pU"�����@=o���B�����j�Ag���	i\6�u�&�����K���`�w�u�e�k��u�a���-]�!��[�'{�:�D�F��U[��K��X��8_*��+u}���x2%nc��-y��MT�������6�c���0�A������Sl�x�3.��m�e��+�h��(������������J�5F��4BT�����
�p�jG����$���?�N�{�L�����C)<���$���=�T;E����D7V�����$+W������j���A�x6�^��p��d'�r/a|nWu�F���P�f���d1���FJ��A��E|��4SH�����X�����~���h�2:�Tw�D���>.�I�r9$�X�SD��X����]��
������|��
|��j��o/*d��mQ^�!����>�� �����w�E[w�o1s�[B��Uo|�.E��wcUo��/������Fk8�]���3�	�mu-l��
��O�m��P��S>2�z�-k�]��O2hf�>����i��?��?��LJ��*q��=���PK�R?R test_data/5_10^5_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& test_data/5_10^5_rows/1_referenced.sqlUT
�h`�h`�h`ux��������q@�\OqC��v����"zE�d����8pb��?�;
Err�0\29 9�Mw�������������?�>������^���~�O?�����__?}����?~���~����������~�������o��_������_����__�����~=�����w_�������/��������/�����������
�����������G��k��������W������G���6��i��&�-6�d�6O�a��'����n�r�I7l�����x�
�o<�-O���)���l�x
�-O���)�`<���`���[0��a�����Sp���)8�����i�����Sp���)8m�����|
N[p>�-����\O�e�����Sp������\O�e�����Sp���)�l��\��~
n[p?�-�����O�m�������
�-�����O�m�����Sp���)xl��<��y
[�<�-x���<O�����P[�<�-x���<O�c�S0m�|
�-�O���)��`>���`���L}�� a�S0m�|
�-XO���)X�`=���`���,[���e�S�l�z
�>r��)X�`?���`���l[���m�S�m�~
�-�O���)��`?[��9���=��3��C�[������\��`��'�7G��>��9�����������o�o}�s��3��C�[W�P�Rs�FW�X���r���6^l.�x��h�����w�7^n.�h����z3����f�%8]��p�3��gh�@���3���-g�9Ck��s����-:��t�3���yiUWv����m;�Zw�3���gh����3@���g�<C;�z����m=c]2�U����g>C���|�6���>��}�3���gh�����3����g@C���G!�*4�
hh@��4���-h�ACk������
-B��(4�

Xhh���KW�����
�C��@4�
�hh# ��J4`���hECK������
�E#��.uU�hh1���f4@���h�FC������
mG<Z�|4�
ihA���4��HZW���v�$
-IJ���4�&
8ihO����4 ��Mi�JC�����v�,
-K��U��^6��
�����Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[�q/����Rh[
l)�-���[
mK�-�����B�R`K�m)������� 3�^
���A�r��z���A����!t��;B����%t�	�{B����)t�
i[
l)�-���[
mK1��/][
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK�-���X�2���-�����B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R�{ISW��B�R`K�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)��|��bK�m)�����Rh[
l)�-���[
mK�-�����B�R`K�m)����y/U���Rh[
l)�-���[
mK�-�����B�R`K�m)�����Rh[
l)�-E����*���[
mK�-�����B�R`K�m)�����Rh[
l)�-���[
mK���q�A�w����4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi���EW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK3��%][���&�4�-Mlij[�����4���mibKS������v���h�)��v���k��MW������$��I�������,��K������4M��������-MmK[���&�4�-�u�������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi��|TW������-MmK[���&�4�-Mlij[�����4���mibKS��������-MmK��g��*�4�-Mlij[�����4���mibKS��������-MmK[���&�4�-Mlij[�y�{������4���mibKS��������-MmK[���&�4�-Mlij[�����4���mi�}���bKS��������-MmK[���&�4�-Mlij[�����4���mibKS��������w<���p4�	
��������miaKK��������--mK[Z�����--lii[Z��������mi�;xCW������--mK[Z�����--lii[Z��������miaKK��������--mK+�@][Z�����--lii[Z��������miaKK��������--mK[Z�����-�y�����������miaKK��������--mK[Z~��|�'��G~��~����G?0��@�U�$?�A�S��$?�B����($mK[Z�����--lii[Z��������mi�;�JW������--mK[Z�����--lii[Z��������miaKK��������--mK���e�*���--lii[Z��������miaKK��������--mK[Z�����--lii[Zy�����������miaKK��������--mK[Z�����--lii[Z��������mi�0��bKK��������--mK[Z�����--lii[Z��������miaKK��������wp��yGG�����������micK[��������-mmK[���6���-mlik[���������mi�;TW������-mmK[���6���-mlik[���������micK[��������-mmK;��W][���6���-mlik[���������micK[��������-mmK[���6���-�yG�����������micK[��������-mmK[���6���-mlik[���������mi�;�YW������-mmK[���6���-mli�9�w����}Gm�Y�w����}�m�y�w��L��#�u�;t�O��c����;x�O�����-mlik[���������micK[��������-mmK��Q��*���-mlik[���������micK[��������-mmK[���6���-mlik[�yG�����������micK[��������-mmK[���6���-mlik[���������mi�]}��bK[��������-mmK[���6���-mlik[���������micK[��������w���iq�Z������t���m�`KG��������-mK[:���t�-l�h[:����t���m����DW������-mK[:���t�-l�h[:����t���m�`KG��������-mK'�][:���t�-l�h[:����t���m�`KG��������-mK[:���t�-�y�������t���m�`KG��������-mK[:���t�-l�h[:����t���m���4JW������-mK[:���t�-l�h[:����t���m�`KG��������-mKg�e`�*�t�-l�h[:����t�������n~��]��w���n~��]�����o~��]��;���7]��y�{���7����z��t���m�`KG��������-mK[:���t�-l�h[:y��������t���m�`KG��������-mK[:���t�-l�h[:����t���m��]���bKG��������-mK[:���t�-l�h[:����t���m�`KG��������w����y�m�}��Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-��kTuUl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����2�z\][JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-����w����-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�R���ZW��R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)�]S��bK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)���������U������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)������Rj[Jl)�-%����[JmK�-�����R�RbK�m)����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����J�RaK�m�����T�Ri[*l��-�T��
[*mK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�������Rk[jl��-5����[jmK�-�����Z�RcK�m�����4���>���PK�R?R�?]U�z_' test_data/5_10^5_rows/2_referencing.sqlUT
�h`�h`�h`ux����O�5���5�S������3����
-�n�v��C��0�3�w��Q�92Bz�u���=Y{����kE������O���������?�����������������?��/��_�������������������_�o���?�s���?����o�����o�������w�����������_��?��_���q�������������_�������������o��^����������������}���{_�_������_�������?�����������?�k����3�������Y������_�_�3�������_�����w�.wUy�}�����.�s�zA�N}��h�������,~���<^���E��Hm�/�e??�?�[s�z���GyV�Y~�j���g����,���~��O�<�k���������+��\������&������:3��E[i�]T����,���h|�?�/1��F��{��{������~�����
�U_�n���e����[�����N���;��Q�]s�����M������t��/�n���G
��i�U��3�s���o	b�v���X�+���}����s���������^T�U)��L��T��Qm��:��}�>�7�� 7d�{����te��v��x����{��'�����P�����l�s�������?����~�������������C���u�+����VA9I��g�p����������~^�/g���zPw���x��	���.k�����<vrc3��"�{B�|?6S;�g}�o�*��1������&���F��1{���n���/��t�����KyGg+��X88fz��G���1������pX7\��}�o�����
_������y��cog������~�Rt�7o��t:����uR�S�C���G���.���k�����th��}xe�h0��������6����~o��7	Z��p�[^����`�����
~ �j�'�o����:�g���}�m���~�1�����f!���9�-(A]��*����a��G������'7{����'�l�?��3�!9��uVr7���4���wep���
�F�i���	>C�����"��\�m7���v����gO�J�{��������^N������~�n�W���f�G�R�U�oU��r��]��\9��=��
b-H�WW��|�s�qS�������~���-�]�� ����n~:n�iA9��[����{�j��m�o��#�@�v�M|n���N�
T�,��;w���������|����b+�Z$~��e_�{��~_�fA��]=������>���[�d�����J������&=�o!�+�������v���-�(���p�=��~������+��>Y�|�_58��v���%8ZNWL�����W�6�}��q��$V�) �����}x��*�gpK�:�j�|~*������M��E�	��������=�R�X���6�}��}R5H�9��*H��)���_*����u��}O�}���}�,����a"�O�G������P�$��,�V�����Q>�P��[>�N���P�����p?��3���?�x����V��\F���w�i���w�6�J~�N��F������d�(n�je��+Y�\�f�w�>xZ����*���Si7�
J�"D��zn���-h�����G��cw�vzp����K%8~\��@��#�Nn� ���'��Z�'&��A���?wr�����T�Y�t��)�������O����e�V
��@@�N^�f�a��\�"����O3�p���������������~�`K	���u��X��K~��S��Y=����D|w����{��LV_�;��s�:g��$7�L��������(���
>��0��n��5��B�Th��e�E�����^d'�@����n~\��o��E�|���2o����F$�Z�|��	��>�o��,�n*�?'���M��.
�[2���`��4^__4u���v�6�#�c���)����sNt���<�3H)��������<��-�f����ZA���g��N�?\�:���Z�W�`j*�W����{���Xrswr�A?(�L2!��T�
W7�'�&1�h|�$QS�|��;����E�J0}�6,A�L�M��ku�x�������7$�&����}s�	�|������I�{t��1��To]�{���-�>)������)��#H����o�z���
�O��������i=����	�#9�F(r������p�~oX�/�H���C/������$��<���vG���!�/��~!�q�}~�F�����
WK*,�H��,��I=!P~B��\�)�&��i�~�*9	�+�2�7Q\�� x��Q"#B�^���5��2��MO��c
�B���(HX����A��T����`z�����@/�)_<�~ ��.�N�%�mA��/x�|��rE�xJK�u��T�&�8W��������l�Wa�-��UX='_�%�s�����GP�U���u���JV���.D�����0���4���9���B~FL�$��2z]w�&Z�*���{<��Z>��<Q����%���t���dY�{V!�+H��`���:@���x@�D+Y���<�j��v��\1aY������WP��^�q%B����.(���n��7�N��-�nM:�7���&ET�~�=WU���/LBiWA���7�����B��KO>S���t���s�$Um>���t�zA�]C�Kme}P�^���6����� U��};�^����f���^�~����	������n�p������ 

��u�(�t�T��%�����p�V�����I���Jr�������cusOB�����BP��wJ]��u��G����Y�$��N���?�C\�.����$5�u�� O0�h����{�)z�o8t�
Z��b���2s2�*�,r����%����q�����0������,X��*y�����2>x2F���AA
4�c�O�>t��[r�X���7����O����Tx:�r�d�E��[�
��*|�c�����XU����JW�a���9���
��7_0{�*�`W�.�jE<%����t�����*�}�|�&�����t�VM�������g!��r=x���!'�+���O��qyn{q�k	���P������c'��P=M/7��F
����*�^�$2��T��4KP=-����
��<�$�,O�F���R0@g�@y��C_�'TPT���2��z���[D�'?���?9M��'�~:�M���V��V�;9*��s.^���SI^+��>A�"�v�z~`.���[����z(���I$�I�X2�&nn:[�>w���.������y�hP+�QQq�Yb =M}��OB}�M��l����}L^��F|��`�7������g��7��*���	������f��@a1 �~�X�}���(h�������V�&�~XbA�U��u��Rh��u�C	��&�~�c+n��d�D`O��S��,���'��k����F��|�9�M��Y{���&�~�x�����}	�Q��&4�B����ul0T�38�[}��1��	����&�j"�
d���7���u���Z�%E����@�M(~�r���|��=�)�6�Kra����>���2$P�d�����X��t9����j��u	��=m����1MJ����#�EM������64hN7�$�\�O�1�8���?i�����/����� �l���W1nD����I�����54��j��fD����$%�KZ�v��$$�������D��T �(j,�j�� ��:���&d��v���(�����%����_�C�:��k������-��t�	�����l�����b?��:��4'��c9��i*0�-M��&_�Z�����GXz?~0J��hVj�x�1����{�uCl��7�R� |Lw�(���LVG�:���0jI\���p(���ml
-U��K��A}��`U�B���=4��)��j���I��}T$���O$b�vi���[����f/���j{DN���[���������t�����������Mm������������4 X"���p�	��+1z��H�l������lv�IN:��#@����]��P� JB�/(�4:6��t���<+����MQTgfo�,�Ob�`��?��:n	�p�u�S���Z���������?Q/7�������b�4��Z
�^r����j����y�����CO&�����)C�X��2eF����%�N��]�8}@l7�?��?�?~UO!�M��p�2"�(NB7p���'Kd�y,�8�v������� s���22%y�n���^`NL
�N���5(���hW
'O�����1^1�J���'��]�8��A��T��tKl�u����>��SNp��-t�n��aJ��t��`�/���T"�Z�^���8Rp�&�S��}��������"z��C,�����9	�iW��%u2��Z��.x�/��M�V��?����fn�U�d�Z��FDUw��'P�w#��_?66+A.�w��*�C���`P�����o�Y�Uq�b
�����:��N����'�S]���3�����R�
��
�����H�_b1{�u��@@�9+'Puk�!���>~v�����B�WP}w��+�� ���J��Q:|#{~K��}�0K� ���b��-)����P^7�)_O�X1t[����mo��t��^��&��t�G�u�Y����R��L���0�J���/��<<;��=������g��nG�$�|-b(���hc��O�=����.���0]��LG��'.T}����[
�NR��2n[�<��"?4
U��tW}Y�r����������0o��<A��U]�W��8�ua���g��z4_�Ru��@w�|3\��|N���R������,�*���[p
�L,�lltK$?�%��YU�o���L|�B�A1�$��_��T���)���,����f/4Lg��:�XGoa�+�vk��p
�������O��/xq����T\�8�L���;���LcR�.l�"���yS��7:?����� �@\�H?K����d����IhO�DI��/�=�������Ko|����9qXMD��$����l������
-��3�%�}�a$�
�`�z�h:������tI�~Y�y����Md���C�����i�I	F�k
�H����	bhTid����C�f�������*}��+�����+(p�Sj�0����UW'�����*6>���,{���#���f�G.�N�����C�|��Q���|�������0~������X���)N�����m�����v����V
���^B���c��o*m��6O7_d���������#3��"���k4[d-��L�:����|%r[x� U��?H�]Y4c�Yq�kE0���*�������@�lK��13�6�a+s�`d�x�
�a�;�������v�=�}��v����udx�k{�^�i��[�Y�}k��.t�hpt��P4�������$E����u�"���#�A�9������p(�*�A}����&
 
8��O�]�
��1!���h�Ep�m;�C�G�X�B1��DJC|; ����$������j�\A5h��<�}&��W�
����!���i��c����*fJ�������=n��9��>H��t��+��/��,Qm�X�'�W���@_cb�4�=����!��&I�DpXQ��=
���Rx�wn�����>�
��B�#Ih��	h�e���d��t�B����a�xl\p$��k�����t��_Ir������O)��K�M$�`;���P,	+�gH^qK��A��_Gf��`�e��b���`	�����N)�d,5x�k�,�L���{t���z��t��kNo�O�k^y���%9��6^"���l����M0b��i+Y7���G���e�I7v��8?J�y��yE?�?^����h�B�X	s�
�0U-�����������5lN�����|G�CH�X���@����c�%��iky
�F�[�����>��YFe��5�'k�e3!(��������M��-�P�V�)�3�%��,�KN�p��1�.�)@�AL�H�P��mFpq�4�0�E`�}�f1F�2bd�����-v�\�������-��J��M��]�#d7Tr���:�����{#K��b��/�Yx�.5����A����L�>����NO|]�ww��8E�-I��=k����rV����4�rN�:����?I�	r�d��l�n��P'������,��Y��%�?���c�Fq|��mt_�h�G-<��O���a��M
��E�RS(>�����Kz,�G�vI<A2>��0�����e&��X%��?����M��(���� ���l���]�n6I����{�
f�_p�"��@�?m_���a�<����	}����+�d@Sb��T@~O������E����`�
��*ed��j��z,I��k�}i�����lkS2���A�0X?B����;�kg���o��T��#�"��a3)�27@��t~<u����5��Fz�q�H�)K����)�)�d$(P�%~���>��2��r}������S@?��������@~��$�*�����o��	���/�_0iBtQ��.�_p�d���/,OA�b�S�t�����n���S?xw���?����4��NR��_zY~���7w���fH/O!��2�	`8_c ���o||���(,�j���H�P��V��mS"��\���e��4�����N�C"��(YK�4����t���%�,��9w��\�<�$��;?v���������>�YL��r�����vbT����8�nr�{��f1���d�����g��vE�^����5t����9%P�Nb������	�bg���Q��?�8�>&�$>O���!}��2���3]���Ch��G�%l���-a��m�2��{��.��N_45I����f4L��/q�t`.a�#���X36�&%j��h_��I���hKB�*1+��C)$*�%M~�������qy �&G��A{��d��nA$�;y]�So��
d��������mY��$�v+�-k�8-��������ur��3X�Z@����e���}�3���3����D'�����{�o��hj
�d�+�v)H���8{	�J���d�<c���OM��0z4��=���J��p{
d���`�z�=)�7�*��fI��2���'`��`|Nm�Z��$&���/����ju������6�#(�����K���O�����mk��~���2�r^���gV�3K�=g2eNM��H�2��9�@W�W�h>.�43��T�/:I� L_��u�V��������
��J.A�[
N�������}����Z&6F��W�g�h���/Yr�=�2����I[�F'��$����Q�o���Z����o�
��e���U��cOM�v[����z.8�������7�v�"��}���<�@5�D��,�?�-��[�P��
�>�>��r���G�{R��G��x�.����-fO���~<�N�,,[��>��g��LV-��r�D��I��)�2�7�)rk�%	�ty*F�����C����+jhL����1HG����O���������/��M�'��E,o3��v�
�e{��M�^LkJ�m4��}ND2K�>fQj�`�(���8l�~��,��;�����ZF���CTV��7z�~���s�}i����-X'�>Y!��a�	h�y�Gn�>fr�
�W|�x�,��@���{���x(�)*,�M��=�L�>f���&m��_
�}[n!�J�`b�#(Je��}�;�����I����Ld2���c2b��'�����~l����W�Bj��G����b�whl1��HM�U�TMx3�\���@�.k���0���^<9���z�\���<���g��$p
������v-���[p�����8������^�-��������|�������J�-l6��n�������vV�4A���oZ��[-D�`O��iP#���(4�Xo����=Fv��	P�����lV��e{��H��/ �4��0�6�������,X��sv{F�O��N^i��L?���S&�o$�7q���,�	^�������:�F�z'��K���4m�5	8���;��H2��������ZC��F��(��F��@}��0���>���=��J���}^���"� ���������{JSh��o���$*���v�Or�a��v�<N�I=�����c�X?�b��������`����a�$=�"_=V/�`���J�1��5���q���a�{K�<�?ao������e�I�j���=R��yb,���|���
����o@���_����^�*Q.o;� �;�����z��^�B{�
	�/T��sHk$~�Ozz�@x�st��|�l�����4Z�Wj_��r�*[�����;�Y��1�*�)��3WYT0cV�[�(�C{9v5�H��fjJ��x
�m��&���Ee
�aA��FJ����������>���.�?IK����E��&8���h���h����:�����V�j5����%���+���<'
�-p�D����f�X`'�W�u���	 ���Y&x>q����(����y�T���A[@�H�=a�\�a���h���H ��Q�*<OO�fw�,�=�E��<~W�%Se���� r����R������N�'�X%���y�g������G�=�����p+D�����1|uL6&�#������	�s����G<
up>�b"���;��B���c�P�l)���B�<�� �>��Q�E�D%��1�!��.`������#���	��#�}����
&���cI��r$h�����m�gp�a�+�N�	XYh�Xa�F{�77��*��R �86����/
��R��2?H-�P��&����.��^�=X��g9��s����
D���2�61
��c��y���K�������;Sbt�~��MK���;����u�A#����y�@�1K�~2���{��,���5��
^�h/E�|_��*=��������W	'yT�p[�@��G���q4�/��v���G`=w�k�`������u�;D�{2w�z��f�X]� y)l�C�+��������/S&$�Q�0��,����e�K"��]�����S��s�w����e��G����|�D��ul#�9B�K�,sR;c
����0��5���t��3<v��E�s����6_�Ofx�����V7���GX>�^��M�No	^�
(c�<I`��
G�ZGg�}��'+�a�F�#�@;����T5�K��_����4;6��ME9���G}"S;��q}j�GIv�D��?/k��-(��-'��H���:��}���]� O��j��B�/��x������P<�Y��)�d�H���64�����G �\��r�M�����rEI{���}m��Y���.���'�S����D��,+�1�wX��
�IO���L�kb�w�5��s_ ���x�����0�q����
"=�Wu<���{�)�������{��#�r,�����~[q��}�BXP?=������������K{��s��:�����z�(����J����|��-x�c���E���S4�����(�	q��I7QB��g�%����q�?ktV�#0UK��O��y
\e'7(��>���#6 �g�@/
MI������z�m��<kd�U�������B����P����Y���5�"OE7�|����|����;nm|�$J��2B�@0���Y(�2����i�kz��X���4��j&��+�Z�\a|q���,J�������b�dI(��j�7lWN��=���C����{$%�����\��]S��OV��`}��Q2D�y�����	$5�,���A��p���!��1�s�����"m����Ci����P2��������n��
��6b�i�� zt�zt-S�1(�N���~ �"<���}�#�����dVy��&��Y�Uhtc
i�5�\G�3
]��%��7v��}�\f~K"�J:����<��Mpc�3��s�L���������(6���V����Y����	N�#N����i~�}���GXrk�3�3]��B@������W��<�E��3�%T���A�����\(t�g$t�����>���7��s������Z|C��"Z�
��U��kx]s�����^�O��,tY�<;��X������%=�P���<Y'�#I9D��{�H@����h`��fE[��p���F��6��Y�s4�@��������W=�{<��fM_��	���}6���,�%�7�Y��,b��>����l�8U��"����U�"�g�e�����i��*�wf������z���%��L��b�h��V���f�������$*� v'�^�B�=4Oz�5�=��M�������}T��R���G/)���a���E(��%���
�5��.=��5g~3p��+�j��<��qt�u]L&A_ >��@��z[����l$Xm�s}�&5Y�4�6'�x��Qx�w��R���Gmss�J�}�{�nV�5g������.I�T��'�������~��a���������Jl!�
��nltx7NF�U����@iU�`~P���P^���/��>p#*����k��cK1	t��b���%j���.!8�g������e��4��HzJ�>��
��x^�%�p�f3w�`����N8�b
��G�`
�t$��/��@ �(�>9��ufF��j������>�SN��W�;��[��N���Dw���Spa�-�������c#a�� ���{����C��
��A?u)������U�Y��39�m��y�����:����)E�>z�~>>����"0�4�J�7d)���tt��*���=�c[J7��1�R��%�h�_�5����d�}/4U�z��s�[�'6����T"`��{�I0���+h�T[�=��4�.�	�V��[���O��t���h����Awt)�}1������L�e�O��bC{��T����
E�|$I)�v�������A�|�O�E���%V��w?	qY<����'���"����*�8�F���zv�F&���k$
z�rj��E�{�N��mr^�>�EV�0x��d�Sx��Kh�����\]#��
ta���f)�9;����)��E{��?o)��-X���b[z���\h$�KX^�q���N�?���N9��X��H�eY������{���MZ|�K�+Ds��@�<�%�'�Oz ����`j18Lu�kM��"|~�eCUY���2������:�G��<>��B�1�	�]���F�3�g�6X���4IrC��]�8Y�����{�|�vHV���n;F@�4B�����(�%�^�R��3+1�R���F�=�-I#���A�B�����1�L�`J���1���5��/U(>�����T;�����4�	�V���K���$�	��=m���L�`���#J����� �6�R?��dn��
��o04	�V������xV��c\��@<�"M�*�>��V�0��(��t�i-v�n��&z������Y8�"(�n9�ub�=K[�hW���:�0����E�O�W[�M����=%*R����t�j�Ww�J��A�r"���R���9$�Uh���c#�R_���d�	�?I�U-�^J���~���V�f��8���9���g�!s�B�u������Y!�=[���i'=��\��E��L�d>��jK�a����Z�O��?���~2�G&��Z���G���R+���P��P@�B{��n�'�]���
3cf���j��4��B��+�Fk�A&��"[�Q�'�{avg�]@}W�Du�[T�v��K�x�k�X�}M��:�c�|I{�����gA�3U�P{�#��J����<��cS�-J��Z��$�
cc�]��Wh�\@$d��R����j?8��t�U���`�Zp�U���G�N+P���W���Q�a?&\��j��%����P�t�iv�CtO^������]�j�Nk���czD�"�� \��$-z!���[t������d���\b�R�}v��ZR��/����}�����O/-�d���wj��%��d��%,�9�-Y���[`���Tq�=�[BdWa��X���(��
��3�=���*�JF,h+z^��a�
�:��QR-x� :$"P�����f=%zO�G�Z[,A��@�.�U�Ni�~�U�����M�����D��L��*m��tMRE�P���G"l���Y�l��#vKFJ�j�{���Bm�Q�}rC�����n�j"�n��^1�~Fa����Q>x��X<�[F�Q�m����
�%���l�f�>�E���mvj�}�6�>�B��+t+��ho��l��Cy^�O �l~2��F��m���p���TNfW��w��B����g�6o�����F�Pm����W��P������!�]�j�4�E��&�Ug76�3�R�������)��
h��.kh���"��i�Wr�-�Y��+�*��Ilm�
����jC�E,���"�G����I��Hb��'u5i�����*F�Dtfa�?���)����0��O�����������1�����D��<�)�4�#��Z��������B F�� 1Qh�x^����6'�t���b�6G"�m�sDB��&�@j��N7m?PV���}i�����M�A2F�43�K'�GSpKQ����������&��7���n&}�����M���ob��_�H�9�|5�8k�c+��\G��(;]��&��GL�1��do������MRb��l�/&����{3p�f#s���b�q\�^p���~����7���B��o5ih& �it�9�&��-������$��D�n
{�d�0Bs��UW��	�Gj�����n��e�n����04}�� ���o)!�����il�|������Aw�vP_����<t�%}�084�������u��� {]��i�^3�p�.����b��+�����g�E*����`�����t	�t�.�'A���4����=�r�]����l�Qi�'����{Ot��gTl�	��L6�2J�s�n� ����'�5Qx���u�D���=0/����fiU�������t�r��|���Q�'��yK�4��&c>�������$6i,���d��1;��=Kj0��j�4�������+�m<(V?Pe'�yJKq����x#���x��f"�5z�����"��?JkDL��8j"!�w�:��cFu���)��"-S
�?o6+*,����q�A�o�Ov�q7��uQ����B������2���%[_��+� ��o�O0x]\��L����s�a��"%Z��������"-�C`�"'��q]���^���w�/�1��������G��.�����ME$�d�,_�"0� '�n=H�b���8yg�8`zC ���T���8�	n��$�����:����b
y�hu�
�Qw"xr��0do�{���F�Eu��t1]6LI�uK�=sJB9���b�d�������s%�['F�0J/���C��Z����&l�D�abL	N��)7�Q�h��t��|qO�/Y��������sC�+		��$��%����x��G�k�4]�D��.*��nTz&�`���@~���i3�c������s{o��@��Bm],�������F��f.�>��h� �Ygv\)�K�1a;����]BU�����#y nQ���g3|L�$-=����)�b4H��
�����$��{X��(�a���BX\����8#t��:5���}������#�<���5o�c��l��Z��!����-
H��tp�bx��s���l@f�nX�F���S�+�oMz����6o��,�+������h����N��y���Z�$b�.va�2|G��S�IU�>g�j^�������!
�����l�vD��E%���(yp�n[���'(j��$b����Y��\#�a�B�w��B)��bJ������k�fg����Hm�,��8er�=��:�l
o8���i�?��N�����}��u�_���ND�J��sa��,�]��]G{K3
?�=�&o��`MER}�d���Az�5N�*
e�H�?$���9�{0v�d�=y������{v�dT4�'����#0a�o<��c�nD����;����!�����<V�y�6�3�miA��f���YV�[����l��H����E�sz���=y_l��o�L,��i�����nI��A0ex�����O.a�H\��E���|�7� D��#.���������!��`�: ���Rk%��}�a`���LO��:j�jH
{8�q|l-9UZ����C��H����q�)���2��m"v��;fn����x�
(��A��D����������'`������V�^	��������R��wL��S$L����:��5$���\b4{/��K��=��%4�F��pWC��bb��8G��<�K�}�|l�ar;��
���P�u��+$��.&���g��ct���0�0�2�Ph��Du���Qb14<p�F�=�Kf%�����D;4��p���T��OC_-�3��%�F���
�B�;��I-3�D��C�)����}�C���3����aq��������	y��&�P:2h	��Hf����!z *�H�I�)�*� mr{�&�[��8g�fQ`���H�4�5�2��6����k�L$��n����/t{"vM��1������[3�*J>��v��Y"�An������Wp���n+B�X�F������!Z���1?��A���uc�������������i�m���
��@
��L��!4��(#��g��cQ-�9D	��V�d��N�e����2O���q��Q 6#��1�+df�!�6<�
f��H�o<���!��gw|��'k�����t��H�7�y#�H����o����M.�Nn�I�
�&KY0�5*p<�����[K�IEp|!�W��}�u�� ��::o~�U���E�8�s��b��=y���G}�C@O����%>6)bt�}�h��?�Q�������0���q�@���G�O%�h������Q�(��[������I~���~�Uf$d�������B�B��'��o���� ;A�����g�O!����d�MA�x�q�@�n���r���19�� }�����������V���/���t1�K�����9=F$�Q&0���=����^'����{(�M��g�S^�;R��}�|����a��xR�M�����V����B���b�@�������gN&�Q'�i��8U�:��#����l�3�T�`~�����C��x�Z�v����`
�'�`$=\�3Q�cl&�����bS����9���. I�RxV3�W<p��:�&�)�@aDLQ�$�������p6����+:���L4Fm�V��� �S<�����������
(v u�`���G�?�,#1z����3?OJN�_���U[�������s��Z�$X�I��Q�$� *����ptL
`���,:O�Y����K�+��L:�f��	��z�t?=���Cxu�
`,���305���	��P~s��C%P��~�^�����l��&���HM��
"{��9�$oI���}��a:�h���2�[>A�����R�v=���or��kD0���-������:��%�>E
����Kl��(�K�e�I�:���H2:=��c�<�\a�������,9��i�>��*� ����� �Mp�f���%�<�8�E
 v��""���e0s���%,����8��_n�s�tLO?�*�������n��^}�����1�D��[	h�����J�����4���{���^&p����(�c�D���������h'��B���%"��~�"�{Z���	%;�4B1�C ��Oh8?����m�D�4=�*/�3iS�|e�7%�	,?�D�����,#�����W8my4��46Y��r��-��d�B��~h���n���A�_����@�{8z`yq�h� �h��2����-�I�Z�9\��F��r��'�r�x>�S7����eY���hF�W�`� $,A�Lm�U��M��h���qV���C��%aut7�Y�.^�aH[�K����2�}��<��� �*D�!�S��Lo	�/T���"pF�\=�]��/A��UF�PK�|���^4>�P��]�	�S�����u�2@8��`	�O��%�}i�:]��o��m8�>�l+�A�0�����L��:��VY��G��/��(����	���:��gb����'s0�pv,��iX���[>�Fj���oT #�6�0�h������'v�]B����!^�'&����1����5�3J��o�a������*�m�$�l��9i�!`py8�u������rX'��<^�B�������k�|��P��:>��<"��RF0�|��O^�w��q_�Q�7BU�V&�Dh��$~SK :���.���KLCn.��`�0�BY�G'����:Sh�%��w$����G�N������+�x��>j�1��t7E��5=�d�a�%<���	��r[��[��Ou�
�%���$?��Y��������%�����fY�����D���WM����8��;HF�d'�#\��|�v��K�Z�����K�;�|D��u�������u�E���-XbI>�m�����Q��t71Q!g���zZ������K���v4�uZT&	q���1A�&�V0Z�:��G���#��X�D�������
/��d�H,8	Z���7� '9�m��<�N��K���;y�V������(7}GW,�I;Z���,�q82
_��L�s�5~5f�I��f�s[�1A$���
���P�I������K|����CTI^�-�b��T��4�����Z��
���������
7��Q'��))��G���$i�6��:)9���}��H?op!��R�-��
KW�F�GWi����-��OIF�������o�t�V�GRhmQ��`Ir�-��_��N6�
x��6��75�}t��Wt��J~��M��D��O������`����T_������JV{���T��i*�o�&(�dR�m{�\����B�����mR�������pE�t�L��P��[,z(J��@g�����~<<�Z{d���G����dW������&�/F����"��ZJ��'�`D'�'z�-�.�f@��EZ�mu~R�lk���}�&Hl���"��6%�����)[~Ab���)��i'F3��>��\f;�3���������I���H!���ZW�'��3�w�D{Bfr����/*��w7�{A8��1�T��c|Rl:��HS���v�l�pjM�^5�S�Rk�L���0&Sb��E0���'am�xGJ$kt&�����?�BW��9X�bv�4h�1�9��a��q���J�G���3�����d;����\���M����Q�`%��W�
��}<|��~�g�]�J�����N ��~�9?���%
������B������B�����-� *'�;�f�Ax�p�+�=6X�?K���g��Z����-�,_r������Q��%��'�Q��-�� �1��%������D&��w�g�����eo05�������$:�B��#��F-l�	#!-�����j��=7E���A�*
X����\E�'a��I$����i(��d���B=�d���{�o�oz����l81�D���Q�:�fS�]�<g	�q�����w�)����C�Y`�"�4���������\��Z��>��H�4N��bFRv��O��$[%gBj����*n,2:��X��-��9LyO9��P)v<+�p��p�1�S		{�����������W��{�/�Q���t�hS�KW���9�hTN�s�i�a���&������uvL�����{�n�h�-����x��}u���"���)V%O�3������/?�k%���@\�C�T�H��x������#��&��q��	�p��_���xr0�E��&�������q �����q�D�h����.���������4�������>:YyN�:���HO3��i.�*
�;��<fr�I
*��Xhn	�=
��#v������������fZ���1Yj�(�5�jv��E����*'����f�bN�>��:?^�+��+D��#^6��h�������g��O�m���!c�s"�:�LR�`�c�Qh�"%��>�B�V����y�0V[yD>w�}8W��xs��x�x��h!HMa���A����%������3�����Gt�Oc�����(���PBG�B������F�|��j@U��+��L�8L�o�}�c��9���xX��������
���'���ByIIW�����?��11'2�'$��pv\BNgw��ja�^T��o�Q���.:����������^.�+ ����_4���Y�K=Q���+�A�=������1���2��?��iw;P�J��������%��^����W��u(��_��K�D��Hb���g���-�N�	�q�����eB����{/hg�ju�1���(�����c�����A{ST��������x����$m��V��oO���M���j&����e5{��h�����'���������q#�vDFD
�#
��A��h8��p�j��%Z(6�f�L�
qP�6%B�B�0J�]r��&<4�� ���-`p��B���%��i@��L���N?k$�mY���NU*��
u������u��dh���
|G�����^A��,t�2�b��f}.�S��Ys��f�����`��S>/,��&�g�JSj�.����x.Q�l�������.��Te�����)G	���:&�EF
������(|u��QY��s���]���;%]��u$���NO�6/`m������&L��uBut�70vj7�<���C���z���~��:��Q���>k��|K�N�F�U�����5�F8��N�����e���
����g�j����T��#B:��1� ���X�������g����!����Ym�f!A���P�1����\r��	*�%�3�dF�D2��Y����c��'�~�J�ut������3h������8$����~��K���i*�1������8Q���
A��<*�|��A���H5]1�"�[�\B�m�Y���h���B�?��D7}��d���PM3�[����%�4���
���t�7���dG���`S$�-Y���~i$�:�ic�����hS�S�{+\�,�>��5�>�t�Gb�[]��2><C�g�O2��������~D'0T�U����*��J�-L�N�g�J�'k�z��4~�h[���A'�a�3�}�#�#�g���j��C���v��2&���_hwf9%x�s��@�Q��0��I�j1	���^���"��a����Y(�J�U�_D����a{��\A;.U<k�Ff��s�_�0���|V�xG�F�z
7���Q����5���if�l��%}��Q������<�����W���!hQ{�(�"��%AAB�I�%D�v�As�s�=��N�8
��w/���K� {���/@?%X'p�@
Qw�=����$NA�#r`�����c��-0��g��Qb�����7+�<�NH��B��.��*}����(�W�G;���g������fe?E"�e�������O�L�fS����:W����Y��V�L�����hg#rk� w����E���vm��D��q� S��c�f�e�\G���;I�����R����-Z0�`tL�f[�	�&��3$�h��m�J�6-?>������
�����@U�����'�Ce�,�)�7&6��%,�@Tw�{�mE`��O��������c ��PZ���'(z 8&�G ��������Y#����T[^V���(�z���(��Z�c/�����%{K���"IJ�r�02�&��wzV�V�6�4����3S�Z<8�;�hD3��b�����:�����������[<���#�i�G�y�-�b:s�d��-HZ��5���HZ���}}�3T�R[9ZyM�`7�����;-�!:S������X�N-�^�~bY��m��<�n���Y+���I\ln����=�����C%��S�g�_$�J��a&���<�[�,���53�"V�zv��k�����3���/���+���}�Q�)�>�J���mr�O����������_��
�������v�r8��j-"h���h	#@I���'GTIx��q�����8��i.��m�j�� ;e��|�}f�I��%@��NN�����8Z��������h����M����yaJ�j���s!�}�E���C�E��G�K��4`�Ig��=�!k�x���������:`<m���K���^F@&�������d�w-b����@d?^G,]#	�^<����xT�����4H�H��uf�*#���)�j�#"���,���%������I�X��^���%-QB�R�E�d�.�����?����n����&;�$��	�\��/P����r/���QMTC�R9�m�LLb�V�����$��- �`Z��������+��U-%�
A���F�(����e�F��*��Z�@b�����=�S��\
�j9f��I2�E�	W=���^hrlXMF��.zG�G��UdfKd��!{"9��9�Hnd5��b0����D3WE&����NTo�cH���'���q�UQ����j�d9'k����h�j� y�h`��� ���b	@"��6U>T���WC�����H-�����R2I�nK��*n@�o�Ebk�U���AC���ja�K��������z��K���
!�U�)�D������#�
B�%�O��}8e���<�'�o��YC�-��~�Z=5�'�)���p�|�jm��b��=#"���<�;[7����h?"q��&�(�����0>�G�_<����s5���g��V�D1�OS����gn�K�o���r��/`L��'Dn���|�on��W;�N���[
>�����~$V5��<k�7>6@Z���.j��q��R	�M@G!_����
?���C5���
��w�b�l��3��H�ej���j�HSW�j���������N%)�(�������T<p���_�i���Z��l
�#�\�a���s��EI�t��x��u�Ut�*�0m����tA�����qUtwKBL�6o�H\�k}-��H��������mf�"m�"��r�#� �,���1"����d�;�S2s�Z=��	s���qH@u�@,z�e^r�������JL�j%������IH�n1`�"�@�\���zlr������|;��i����c���OYT�mlo���[�;U��O�n�;.�P��Y��7It%@k�}P�ycm2���K���)H�����~���0����X	"i��!�X�E�]�� �M��e��F�����#����&?���J$��]���)��ZKt�������l��$hQ���p�w��%[�^Due��B�O�����x�F�?Qz�F��!��?����
4����1U��i���K����Z���&��M,�B��!M,�0�>�o��d6q3�j&v8_�Y��c�q��S4A]�'�Wp�(��2�Z�X���l�E��&z���>�s;��6��?�f�k��5�6����A����`������&��	��hb��+f���<�����"�M�EH�-F����p���^39�����p�f�&" *������&���#�PStH��y�A��m'E4�q_iz���&N�����3;��6�h��9��(`�^3�?��45���?�|���/�5�7����j���~CF$�Q�x�z��7������5�}�De�X&;�3
.����q"����E��6�p�q�V��mSpQ�mg����[�PY�<�g�5�i^��f��M�AEM��K���	�Qx�P�x6[[��/�d�g�N��040�&MP<�0���R�a5@�����6,��O�3O�e�FrL�J�����JT�,t�D�D���^b�o�E�B5k��'S[S��<�X� 
U�mxG��:���/��������I�J
;�G���b�M�����+J�����D�����%���<�+4;+Q�5������*��	���y�n�9��:����3��r.�m��6�{$E�.mC�Hhv)n���@������|�;�PG
��Wt��_������l���C���&���+4�`�K+BDj�mg�����mb��&����r�S���!��������rI���Y���ge8:�t=�3��j��{B�����R��2A����� ��i�B�lor�H����O3�1�oz%���������������Qy3v��<g�x�����y(�|yhF�3�-����FcI��7c��j��Hb���/w�&�	���bZ<B9^�#�����m:>>-V88�vO@�p���M�q��O�9db�=G9�y��&!��=d �R�g�8�r��P�q�'�^������]�=l����w��@�U�v�f�\B�+�yu���n�?�[�f5��R���=;�|^�.��j��(��9,D�p�=F����L�,	���n�E�lm����6y���fA'����,����z
�j2�*&�_�Tj�O-�����l���3���o"�Hc]?a�_��.������e%	$�������?���(�Q��Z6��	<�_$�M���������<����"4���xQ�[���G�6�m����n�S��sA��MK6
�Y�IP���4z��)��H]���o�~�$@}7?P�;<3����T�-
��$�P]<���T%B�n� z�G��dc���H����	���S/���_������h�.F���6�w�1����9�%i��H����U���6�pO:�����JD6]�CI,���K�E�������tI��]L���>����'����>^���7�F�R}���f�����H6��AsRB��nN"X1��]���8��$���!]a!�LD��V����L[�.*�!�`�M�N�u&����=�#���|*Y��������#���l�I��q���b��	��}��@3F�pg:�����C�D!��>4/������D�F;J�|�jGwh�	�L�������]]�@��D(v���.
�������$���1���%�m���f;�`mD���j��YI����f�;���D��0n�z���A>}��E;^��XM���j��P7��fM~�/P��o@����
�CYz+y�F;V,�f]i0�q�Qx�����e������[=�c*�P@s���wQ0]f�M=X	��(������9\���wyE��gc�Sk��7DA�{��"f����:6�g0�hi��!��������6 ��^���g���;�������0���b.Zr����Z�3>���'�.��9���!
��/j������Q�\!)��	�8�H�26�E?���������'���){��	2�C�"DF�����b)�y��C����!�b�b�6�%�����[0J�M:�O���j����Q(h�|��<,���j�Z������%rN+B������n������F��_.�N��9�����'P��7<� 
�"$4HzXb�G��`����E�����Fu���je�������X�c�H�+h����������D���S5C��	,;De`	�<�6��,��~��;lYM/���0��?��,��YF<�bPGG�;h�������D�0�TP�=~g������+���l�#������6D�,�Zv�]e�C��-�:����mto��k���b���	���=�Zs�l���
�����}������
u�;{�`��H�a^B> ���d��@�����Kf��a�:dN�P�@�[��Dl4DJ������"�Z�j[���8���G��1���ak��&%#�aZ�T	E
q���1�9�A{�$��?|�Q�5��yC���[{��7<�`*�%����)&���%����%�����1�<I{�x9	�{z��9�2!��-c%ir��2�t��G$��!&B-�����"#�!N��������b'V��/'�Z��h��P7�e��VZVgV��,j7���Q$'/����|��,�_(�(6��EQH��DB��6�g;LE`EBm68���!�k����$o�{97S����/	?�Q��f9J�N�h��a��;�GN��������j���PO1�nB���f�o�+�s�������Y���������D���n8������SL�Y)Y}�isO�=���D���"�x	,3�(��A� z�������T��
�J�\�M
�uSZN�{��N�>���?����V@�%0�l\����/$�'�X��/5A(�B�)���������F���A��~.�:���|l��0�'3;�C���Ul����S��P�M�,<����&;���h�*�Y\����aS�����|FH�OsIl�nn@���MS� Ilw<i��������u�L<���O���h!$m{�����PX�����'@nF����$��5�Ni mI���;���&)8'��Wp�5/V��q���{��?�H/?ETM"=������p�LA����M@��u� ��Z���@��k�q:S�?z���Q.���E���4�/�=������>�4��<R�L�00�
n����Q��.x���H"�&����4%1�[�[�2�8�� ��{
>�xB�c��A����mE����t��*`���`��P�)�X!;�l�$���{
43�9E����c7:GD0����1f8���IC�t�5rb�2�a�!�1��i)*9i����|O,As�+��'$��(Fr���b�M�N�������c�Q^3�����X�G���K.��rc�!�S=��kt���
a�h���f�e��(e�o,�_!Y����+����YhZ,��r�����Bl.�Rt�'DqN/��9��V������(��jf�3����Hb9E`�2��o{��t����XY�����~n�+�P�4
�Ge����&����"��5$J�����C�������N�����B�*N��o�A�F	����>�>Z�(�ft�Ej�)��y���@GF��o!j��=��Z~w�'\?��9�zBd������6����o�&�d�r|Hq�}^��;7�G�>gA\68J(��9�U�0/ze�P�?x������dZ9�a!?�������aK�>��#c�����Q3^�J���M�u��|��$i�2��%�E���4�uW1�t<SoH/�<i���3��a��������0�o.��L�&�
�e,���=r���$5����}Ui����y���o	���.�}���}��/+��Q[��ZB�KR�/��+����Uh�+�D-{V��
��l�.O.h��E�-X�,:�D �����K�������,jZB�1�f�X"a	�?	w�lU��������������|���<}�jn�Z�#����'0�-����|�d-�B�����X��G��~q����m~�/0�� !K?��E
��f�Y�|y5[�9f��<�8��B��������A2a�Wo_�N���eu��N���0+����l�h,��}��lb(�^��i�w���v��;u�$�w��6SITK@��/��X���I�kJn�h/�i�� ������M�~I�3�D�|�"o�N,+���g�������f%���C����#��%���_�f�5����(�C��5:��J�5_����|������33�m]�@z�{[�-�RoK�	�q�|��5J�(Ph��T]�fj��;c�P��G-1��P�
�+���h�����SD���-$��|�.\M��Y�B:@{:�)p�����lq��3i�_�	���\��SyG��l���Y���1��~���J;�xD���."��N��$�P[o��g��*Qo��YX���s��Z'������	^*Q�h�����E�5U��	�&�H���"��%�������{�%}��_�qG:���z��XB���)r�%w�S��%�@��I��Y�U:]��R�2�����_�~�d�~aZ �����R�;sO�����-�@�����f���Wf�[�}=Es�����Q��+�$A�����l��7�&.[�X���n��7;)3����M�?>*�5�JKj����O���i`-b�NBYxm���[*/�T����/KAJ4lq|]&�b�~	����]��73)������1*�8�=hST)����,�&$��<��;[m�R��g��I���	`�����m�i�D�����f��HV���� ?��e�f&��m�������,�h��~��K���%���&<e�r����|�=F�9��JVk;�zq%�nv;(������H\��D����@R���Q�B��~;��3���q�����8�����[�A4Vq� ����GR�-��L\ag�.��������D�;'��)�t�G������%�i������\a~qw�'/�g%�W8D������m�o������Mt����J�Q�:~Z�1z�]I��E�3�y��f��_� �(0�9�o8�T���O�_E"dKf^��4�:���n��l�a<���}R���� �
n�		B����e����(p�`t�?���j<Q�n���	>�z�]m[��QS�'���S#$��%��@��c�o��X��^��K��r�9�}��_%�Z���n���l[�`N�)O�����=/<�q[��iF|h��Z��+"�{�G�+c�D���+�0+���+:=
���$_�PU�=�!
����P�%e{�P��=9Kn!��[�8g�!}&���MQ1#(k<I�a6�/�I���ny�z1�"2<����x��������&�8j/S�'���(p��8h�Q�Xh��]��#�U�~��M�D����sc�i\��-1�����h�C����X�O��`[����#Pc'���_3	�G��L(���1`�I�z��#�=I����LT���2;�aB�u��Oe�$��}�YA��:Z�,}>F��o+��si�sr!\x�'�UX>��y���'�����I��(P�����/��M�"���2�G�>_��E���D9�Gw�V��t�����|fO�$�9B���`�����n\�~��$�`����QhnO�d�)�?�6���1`�x�T�d8�h=}@�����o���������F�6�j����&l�����V6.Qn�f!"cJ�u*�fq?�gJh|s�'I`<�3-�4��d�X��d���|C��lN[�Dw�zL����*^--����c�VI�����N��,V1H/*��Q\�Ay��'1D���LX�Er����4��I-�^���}�Fc�8b�N??��}98����T���|t\����V�������8��\��	�3">����:���<����'X����r��O=+/���DfD��3��j��u6Prk�0I��zj�� ��~9�$_�>�Q, ��wr	�x�-`�����u��;�9�n�(�����������9��L��<�E���a'�Im�2Be	N��A�t��D�x�#l�
��,�#����["�Ba%���z����>��e���/���Vw��DD{���N*A�!A^^�4)/����`�n����2�q�$�v :��kO��v!J���#����h�t��D��v�;������T�?l���-� ����FO��m;�������=1Q����?�yu����x�0V������&Z�s,(K�{u�	�|���d��d���f,Y'mE��My�'o����e"��Koc{�aS��'����p����\��u��'pt#TL�s��������Yg�����g���=KIk�4}.���`E5�����^um���K,S������*����_V�9('o=P����!���j�N��?N��0Q�u����5o�b��k0�%Y-H�|���z���;{f����w
����:�[z�\�Hu��
v�i�����~���9mp��*?����E�bP ?��������)�\t��x�EI�F���'Ps��	��'�wE$`��pH����ah�L�o����8P� �x.��O9$�g�-<K~��<�6�@���L6�������TtX����SU$A��\��}E�
��g����e�2�
����d��VM��>HI��vccz�R��\����i�!��g�T���l��M��;���*�J��+i�z.�=u�`��;AK�s��d.a��1Y������*Z5��M.#B���[��.I~jR��(�P�������=� !��Y�N��:a����7�ovD�\�tC06~�������L����<�oP{@EqR�W7[�Wy���scdG��--H��s[j��i�Y�~N�(�����w����0��2*���K����}2�7MK������N��]�ft��W�}�H��fVrE	�	���/��SaX�x|�zy9��Z,�-��F$�]��X��(~M������y6�N7�pw��l�6Zt
/���L��,t!���d�b;�,7-T�	'�1���!*{|$��=#���s_\��D�����'����O��3K�/)��b�{O���lO���R�
��?<m��-��?�+D�D��?m8�	
��) N��:�G��%������X�D[����5�t��"03bgF�%���&�z����
����5��}�f�u�T����1,$-��-�@�F�����X7�@��^�:�[��E����t�����P����.���'�8a_�8���6��T4����c��o�n�I�U�(
k�d�*�f����yX������(bM�����W�� Y�c��`p��?���Q��X����SXI�o����=���%Zq��'}�p���E������m�#o�mE�?q�����&KO6�"����L�}"�i�qo�$��{��+ Q��@���v��Q�=F���{����
�V�����B��G�{�����-���tf�G�h4!��*����R�w.u����G�����M������+������H��(b���w��%�@"�k�����R�1[���%a�[��~6Z�d�7�����)~D��f���Etm�I<�L�/	`[���SR`������}�h2�i����p��)"���VD
�?B�Zd����X+B���Ok���x��8�*���"F�T�2�Jw��I?b���}�V�M���|^���[\%sRD@���^�&&8�����r��=��	�=����81�^��B�ge�??��oe��0F�I	��}	�e}V���X+N��
4C��}%�Q�,7��?���Ht*t{�S&RRE�X�Oq�,�MB������V	#����������m�������)%,_�i��jr�����L���`��uE���D����S}'<`����$�wY��N\!��yT��|U�_���
����b�\���XC��b�@�M��-[vz�����lS���#4N�w���H ����\q�O����K�s����iA��������"�_A�t�Q)=y�%�&��F|�����;�����F{���9VE�}���l����Z1#��������~�d���V��!�e%Khl�z��j:Y�����7�o$�.N�Ek�]����<���g851R]��>t"���HH~�����}��&i'����
R�'���8�]K��UC��l��n�$�`��H�[u��'�yu��]�KB���C]3�l��!�c,�X!FZ�O����vZ�
�W�=S�*/��B�Z5������P^�27<����:b+�'��(as��|�������V�;���E�8�J�O�����F�)3*\�wB�U��	��kq��Q��Jt^��~v��g��Y��M��tzr����;M�t��oobD����z������U�
��@9�6v���'����oD�U�W���
���^�.������{j;GhW��.H
]	�[�'�q\���V��?)NV
��T#��6�4�TA�J�����2�kU=(��4<��O��j��JB�g��<_���^|xu��6h�������Bk4�RDW#�s��o�cT�c����R��0:����U#e�Y�G]
���v&6)�
��]E*�����
�
���!��Sg���j���l�]�T>p�{�cTQ"����'�cl���x�F���}Z��U���Y��b�*�����|���G�������y��K
J�@�����K��7�p}��;&B�|�cP�����D5����w����Ns�A�O�U���>��Gk�4�����V��&�H�mG$��!����J���h-v/S��7u�3��}Ok\��$#�����������hsC����i��{�p�8+�6H�}M��p�l%���C�|N�e[��^��OH;U��C\��3�;a8�0����x3�LX�*����7gSP|G81F�%���#:�X���u�������Yt`�v[a�-EFt�Z<���P��r�n��a��ITp�I���m?�M��G~0Z����^������'P���Df��^��$���;'�-��z/a���HO���+w�B_=���c�?�[U��9�G�Cr	f,�������
n�����=����
<���m��G�~��=}z��O��f���2Ny$���(M�?Q�=Y���w��v'_`��w��hL����	����`�Dj�e��M�����\h-!��x6����8���QM����aV�n������:xm�C>��oM`O0�f���1�����0{��G�J��f�?)����$~�5���/[�����y�f�i���%���|������i����j��'�D�A����=ih��q��Y��b:*��<�
�R�[�_b��1n-$H�o$�o��gvT}2Z�W������AqVkb��m>���$R�&�Pk_�e��>��#���i�Bk6V�f���R9���a,�)�Mt lb	��h���W����D�NM,�����eI�u�d����$0���8���0���oI��f�~��h�CQ��~6�OdW����'y�������*'[��v�O~������Vg��DgN|�;��=�9w�s����@��{G��N���&�Jx�������J�M�?�!Y.�e�N�qMH�/Bl'*�&���^�c2���MD:Y����qi���P��>����87E�*��jT�9v7�*i��|�����������]��{�0����%p���&��Ze�FW��h��:"K��d���I0�L��G|u[��a#�C�4��9�G�h5�������Z��)�q���
Z��QV.(�4��u�34m6�I��M�=�I}Z�|mB��)r���N2����v����7���[���p�_�$\�qn
IK���	�_���`,�=�*��|�
���'7����GG��8���}�=_�SS�t2���s�$���cOl��#zV��	��T�p��E?�s0y���I$���%=�#��#\�S|G������u����;�7��]�~K0��Xh}O�B�+�G	�����F������"Q:wA��DRv;�Tt�������#��.H$�N�'�Th)��V/��k2F%b����������[�?wf��
�+��"W���
n�M^�e���P�F��S?���Q~)����I$-]`=���4�v�_�W�PI{�_F�c�����.u���>�(���G�q'�@]��H*�.��
� '�+�������6g�@��I�G����0|J�.9k
��z�K������B���r�)�D\�n�^T�F���Ec4������Z�7*��E���y�� ���Za�<P^�]J��[�e�P,'(�[������T���~��d`���/M��]���HH��y,}@c(���#�T��?ij�B��f���.�o����`bK�)�e���os�t��i����#b�v�H�Mu�i�~�tb��j_��5��{b�y�{�����@�}��b|��]>������v�{�&�h.�5�]@CD1�w��,��q}}��P�O3H�d��tB)�Id���p�G��:B�gA�����{��5�'�V#�;o����N����2-�������;�;���' "&�5�t3I��	#r�I@�.F�<?�-p�����)�s,9����$����bb\'����>���b��C�eT�����	g�|�@4F'$�a�������N	�3���d����p��^����@�}W����OSq
����E��e��.�

K&���Ys��(��"
�������N�o�E�-��m2������N�����g?����pE����+`]��'��n ����ww�����"
�f�m�	�%]PQ��\��:�"�1i:�v��*R�,:h�������|l5�Sn ��gpy�&,P%5�Qsr5,#�C@'�T��p�����	O(�����q�`�d�f87*�.zl�	�4�5@�5-���m���U��0D%`,6���g�A��6�r6����&� ����������4\'�[��L�8C����0N�T�'l��p�zO��a���	x�_�r����f�.�����"�N���CRL��e$y��&�(0�L0�a���,����	����1*?�h�S��M�r����=��@O7�~d�{�I���%��U�3���������Q��%�e�,.
(������T�N���pb|q���������'����������/�B�#V�������I�d���E��C��:�!�'�u�h���p�@�Z����/FS��&�\��n���K�.o�$	�x5�kT��$k�8	N�QX���C�NYs�n;�d�7�m�hW��i7�:[E��������a:�jbV<���}�W��M�fr	S�6��l�Q�Ar�d�Yo�}���
�Y�����Ye�{��*I�Jf":�;���iF�a�A�x�K��u���i+����<j��O�.
@	w0D<`x��7Q�4�.�Q��]����6Z�?'����V@/9��������#���A\��e�"��AT�w���7Ws4qF'�i4�oF>^�B�aD�XVrw7����gQ&����L�u4����Sd��.�	�5l����n�:D�\�������Z��
h.#�w���:���	d��4m� ����B�����dN3���"�� @���&�����\��b���'���,�]){Ro�!�(����*�0���!" ��"����H�(j~�K��Q��po�@�\�����U
�M
���<�'�
�$a���h����7�h�p�����a#������b��td�<E	�gA�o)�e�|��V��G�d�q[T4�mQ��dvI��T�S ���s<n��|;��{�f����G�����oc��>{9Z��0K��YlNK�o���#�Rc&����z��U(���0��Q��,��[H�H��N��X����������>���M<$g��kH����%�Sh?��x� �^�`�AsJjD1�	DhM�<L�U���!,6������S�fmI�������D����lH�����	����y��g�F�e��Ua�X;at�Mr��_�A�5��aC�mgI��h��uP2��sT_���d��7�,�9L����i���-�mL��%�
���C�����$���������;�O�CF�D?�c�1���F9�M7"��A��)�D-`T=hG
 R)���O�32k��d�G:����b�Ib��[-b���/�bBOG
����
a�)�`&�NS$�Q��>7�����(c��y]r��"��[�-��9���hp��Fs�9��$-����o�.�_�uY#�������{�L��d��B�h!�=�6�"�A���p0�H���L`i���fFrc�2���a����v�����Gj��������D�����b�w�G��sZ34��&���"��<k�"������`b�I@���wO�:���H��>;w#��.��O��33�,�yT�-��4�Ob��Hg�I���p�:�H�"�
�� �3�}l��i�A(I���A�u"'��d����0�B)qr��������$�������j.�i��S��j���"K��J���g%��a$����m~��`'��
�O"y�b6���|��������o�x�I��YI���6(�bE@���4�,��Gu���_�{���t�D��.�����=+vg�Bc��H�v��O��q���]p�]L��h��P�GI6���H��5(j�,h5��s~8q��G��	_�5@�'>�	���,@���:�'vK��SC���kX�*�=1�.�
�+_��K%Cw��"��{
by=^�.+?�KKoT�.�j"�L��6�Kl�zS���Mf�vP�k"�X��������k���=-|����=||$���^� �Fn-�+���s����y4=GH���S|�����@{r/�Lls
�XDc$����� @O��b�r@���N�#��\"xc�����:��$��~.��
w�&3�
���_��s�.D;P5�K�<|��L�����������{h�Ib�����,Q��7Z�qBE�W[%7H>q
��z5�}GctD`@�h/P�L���lHs_��68�-%�=�Vi|V����ln����$�e�t���X0������V/Qp��H����l��B��6fE��s
�_A�7a-�D?^Z7��wy�j��9"A&���H�x&�ww��}����*z�	�V�5Z�D. r(P�W,�!2v]n=8i���"�����x��l��`��	�����79/�
��Dj�5�xy�a����FK��J������nm�(zC����5�H ��3��rd��suqB{0�=�� m^��w�N�����������C��V���dB")\�+>[R�=M��'�'�C;f�
��B�;YI�F����=S�/�	j������+�y[&h�Z�4�-��:�v���2��!YldD�0��P�0J��D1��#R����kv!���e�g^����p���M�	fC�x!����;��
R����8�
�D�&��t&Na��A~�}��E�	����)��C�Z\�N�a.���Y�;V�������I/9��(Z��^dL�\\"���\/�@]�VY���e�,�0��bl�����Q���'��V�����+n�j0j"R!��:���yy/�P���'��%.��+�V2��8������-F��V�@7[��~�3�>���ks(IoQ���@�\~��
��QT>�x qH.����n�-^5:�-��[�������v�1|`\"9�l�5�E�q:=D�X����QDw�7��f&$�.�������(iu��V~��������+��$�(�X	`����p���o�,�5u|;��<2�Dq'@��m��He�&X��/��U�D3�=
��'� )������i�)��\L&UR���� �Z�l�Fc���T�
�=5�S�q���w���vr�bPB��<7$8� N�Z6e��*�w����}�Q*�n>Y&K������0Vb����}f}�	t�G�����r���k����v+�d����(�k�	����K� ��*s�G��T���>��_(E4�?�?�G�>bL''Cm�U������	�>9/o@�M��d	���-��l���!���AT��gAY']W	3 �0`� Tf
$��9N���	O�{Xy�NGC��������D�p����{����kt[D��J�dm��OL2��Yr_���ix�V��s��>'�#&u�
���?n��':&��<�����5��w�@"��H��{Y�x!h���S�0{2j�zZ��Y��Dv��U�;�q��z�F�&���m#����q(g�b/6.��&Ut�j�P�������J���b�Q����/y���I��b_�y��	m����������F���z����d�5��v|�>w�����������Gg
�f-�y�
c����q���k�'r�m��C�	
�g���5��G��<z������$N[�|�z�������!I�x_%�����lk���O+�Y��/���R8�B��u�cIb�M��i�����5�X�A����e�\����0��r�d�<�
b%3�0���p���}��yls|�9�qCF�������D}&%�y����
�{�H��# -Fd�u��+��Y4���:"�"bM�)��,�P��
w�,��5����e%1�Q��v����n���=���Or�XG�]���	�y����r86J��#�:�#�+�?���iR�M�4��u��Diu���|�?���f���W��r���u�����Dx���$����T�c����"=nAGj���$?�����Y�vR{g 
���Z�������3~�b�"-L��9'ik9��Y2]-���J����g
���1�@	w�T�Eq��~�	�8������#-�V�#�����}�{(�~' ��ID���{�N��}��L��#<$����d��������.����m���a���#l?;��c.�S��������/��7
�dt��'��s��S����4���0��l�;O8�G
�3�L���JB�n��������x��D��;��)�9/����n������r��6m��\��������)l6y%��N�>��'���{�� ���S2��{�.*��#,h�	
������1�m��|��/*����%C�Gu�
���=A��BX�>[&�"+�#�_f�#�a�����R�)8����x�
[�WK�|Sd}�hE����s��*6��[����V}Qh>]�-Z������at2�����.*�m�s����s���������I��ZS*���v��x?�I/�F���I��T�(���{?v��s���0w�8X�q�mI����%C�%���08�}����c���w\$��VN?a�/0���6�~�;��?��9T�3�p�,V�{1tBj#�m"8����;QH�
�K�����~��m�tY�yJ�s�?I��{�d/�W�_����st����:���K����+�yf��{	P���V~�/�T�
�J
�����FIx+�y/����5m�G�����q�H$N�%tR��e��}�5O��:"C��{Q+�*Z���`C���w���=KX�`My/��H����=b������d�y*$i��?$���T 	n�O��1y@��)�~��J9�&��u���!�<
����a��d��L0EC�,j��j�<�m�{����3Z2p�N;����6cI��l���� �S�$�S�^1����1����-��XA��{��"��Q�X[��;�����r��O�KH��K_r@u<v"8G�H����n�_��0�^�Jd�����p'Ub!����Do
��}U;�h/�3�d�-J}�  �$`����4��/(��/Z�-��w���8|�����%�:�����N��g������`�gq�=�e,R��tW���+��	��^A�Yf �@�A���H>l���
E��m=��I��{	��A��[��s�k�^g{�^���d]'P+���$� B��T�/LG��UyM�
��;ys�^��yE["���F{�'��P���K����f��z�UeYF�s���W���Lt7&�v�u��|������O��(�~���kfa��XQ&6e�@���s_8��'�*�Vd��;^?���'��fZ������4�&���5�4��Dx?�nEGmG%�c�e�9�������<��{�s�R�}Z���(������h�ji�x�%�=�����2{�%�tg�%l\\��Lw$1�=����hS�U��MF�]�e�A���4��&������6�L�9��p�{��-��u�����H����Be����a(Rm|�e���M�c.�N���M����KH�v��4���Qr�w���a��R\��Y"��Er((���r�R�m�
����7���`/���7'�V��6���UE�?��RO�A�RT��*ec2p�8��T�w����w�A�d����!�Ij���
�b��m=Xb�`�m](����+�3���Abl�K���n&��b��(��"5:��T3���6/��Hq���:��+h�C
��^�b�,[��HG��*Yn�h<���	[D�����DY��vgg�wy
��z1@V��#�D�^����!�O2��
�<���@���������������A��XY��K@�:n�w#-4�'�qiVS���Y� ��v'���N�����S�N���^�G��6$�������j#�K��Y�K�
'o�T}�k1�@7e+V��U����T�����r���K'�	���#[��43�����'�d��m��d����\A�� �����x�����;�<�R��O����7���V\0n�6���& �h��\t���D:X,J�+Qk�">B�����(����@���������?���UL�< &���,�|iY��;P�y���!�G�o���/�ur�"��r���'��X	�|�*�.L�\�8���&6�,t
��2���B�l��3�(�����_�g�,�$���K]����E��>�}�=+�1��h	V�����h]L8����k��,������wG�m����=\�{�*���S;Y�-�EDU	s���v��"+N��U~�7�Y������,�&��T��]�F��;�[�X	( ��H$Q�E>�+c���
���<���J$N��|M����M)"%�`�^��^���m����w�v����-����EJP7Z�+6Ilf�e��\I��
���/�e>��[�%�KD��({�����*1��E�Da_����)=���;2�qDF(�9:4����h&�G���)�FKv�*��n��9Z�EAt�X$�G�K�Y��w�G?R�!��@�`;���E�S&G"��"��`tB[KDk�EI�ZE:�����I(���&��=Yw�{	anHb�����������W�n�g�~�cr�{"!3�����U���`-Y���c�����S�b���@��j���C�������h@:Q��;��*�!J���^`�]b������H�S�@�t����ZMA���H/����*��������:�j�;���B�d���Y{X0�/@�C;a{�;P$���Q��l.UL�����r�[w���-"[�D4�%��s�-�~{�(Nv��9-��H�[�'P����nG�:V7*�R�$"�**b��D�q�U����%0QL�p�
P"
���}f�V��|%�����`�U$����7�)_<�z�u�|R�W7-$�Su��]��M��m��F����9���D�R�$$������O!��:[88����'cf\�W���X�������3mB�?m^���46s���H�2��W�����t��rM��uX&N/���;aGZB�)!�1��h��W��hes�@�VG	����7�I�/�������2����C�tK�l�{���c�t�)��b(����m(�WfQ�������@�>�c��������W��T������������^�L��R�)>;����^Eg�2>�'���El��E�H�����2����${�Ww*$�V��+��h&�S��������40���I�B]���Gn<�Vd}�k�X��XJ�&����a�����K�*�����d��%h$T%��h�wL�1]�h�F�s��a���������v�B[N���{��S�YD�D�>�A����������*��F����Q������x?��h{7K�	�^`"p��u�s��QqF[��`��c�(�#�Mv4JD&U�AT��&8Q=q��l7�,zN���c���$��;�^	w�>� �Z�M4A���'��}���W���&B �����2��{�����
���8iN-����_���=vQ��&���F���n6R�����{3��e�2C�+r�L+����E�Ps�,���O�ttv0{_�����@o{��@}�h�Hw'�p+�[���c@_2N������"�{F�4!�U�PwoL6�f!NOw{
G��B��M~�d�o��s�v�V������I�Z���#ppp���N���!-�_�p{QG�"�Cs�0V.}���&�>RZ5#�wNDuEs��l�i�N����`����M��������Pgu�+��gOZ3�"24PD����E!r����W2S�#PO��{s���0�/�B�����c���G�&��"��;{j2���SQ�s�����	 ��2�{����&t�|�d�,w0�C�w���>Y��g��PE����/w�Ld#����+��^����>��4!Q�	����SC������P����_��Pc��kz�Y�3	E$9$�&���\��F�C��(v���h�!.��b���<q���y���vH0��ah���s2V�e��c���bH~������5�"`�v�YD2N����8t+?XKm���n���k��1��J)T������ �my*&��p}��~'�Od���G�M���!���aS�>phOb����������J8��N
�|.bD3k"�hN"���
Mt�$
�����c�5#T_�����AA�F��Q~V�d��������6���
�0�/f��
���{'���nqxw����<�����-X�h�����+|�����@�j9�1�~Q�-��S�5��lr��H���	&�������zM4�#�j����}���f;nMo���Q�1��RA�h�1
�`�_���g������C�n�t��q�B�$��������B���$@��I_d�������c��?6�{�����K��n�������?>�n��t�5�j�E�����`��j�U4��]��K<����v�������9�5���M;��H'��0��9���$o����"���|�9w_Z���;��)v�M���V/��L��<�\g�dk����� ��T�\�������kt�N�n��.~�8�s{����/�
�!R����&�_�j#Y<��d�&��/yS>V/���]�B��=Q	Ifq��p���7��]GE������5"��N��F�7��=���&-�Z�bd�����,��k���j����?I�L��]���3���_x1�H�}`4>�g��h�	 jM��|F�Kh�E��HZ
O�a�T�Sm	��Z�����e���u�3i��������|��-�#]�IP��v������w�f���c�I<Y�E$�f&<�(��b��h}P�0J�[���`{���c����*�f��kY�l��PS%�c"� �����G�c�v�H�5���w��K.��u
76������}��e%r��� ���O��� l7'hhp2��E��!�U���v���D�}�	��DbJ��=?D��N�}�� ��Z����6��������?�H��M�m�;��:C�|_�+�?�~�d��O�E-���(/�`gu1\j��$}����&D�;�&��@b��_8����,��7$�i�23�bJ�?Nf�����*��]�����N*��/�Q�4��J���C�A�d�#���+��Y.��!�.X�+�\��x�-g�������	��3�$����g�N��^�]�M$��.���r��*a��3�"������a<��JP�����:l`�&^G���I�5K"�;�?�j��'>�e�L�U���4*�l���0gp?;���1��n5/r�	����ah��@�"���F��������@2�[0��RL���4��I�f��Q������pJ����
��9l�( �a��d9�N{�N(3)�G�7���Q�&$�03��n��J�Y�5_���h�H�����]�3't����N:��P�H�6�K�|���F��P��;����!�����3���>���Kr	Mt��b���3���������$�ySm�-tE��-��Q���O'�;�t��
u4g����������Q���}k"�%H��aR�b�m�����#(�in5HD��D@[���	$;�d�*��8�'P�>0��!C����9�e��p��������:D��03�����������:]�c���tV �>�'�(p���A��!_�y��y������lk����4o
tS�u�D���Fu&��0��$��Q�8�\�!��R����l�q2��Bf�/6���M	v8�J0?�!ZP�F��x^aT��-��I����&p�
�(�!v�N��m�5>(8�z0*��(z�	��������|��
�{x��������*6B�X��`�D%D�w�
g�G������:���S������%n*C|(�bv�YdB��r��LFk�-r��gE��	�����6z��s'<���P�i���{�Vm��B_�ubV2�-[�^t�)]�1�]i�1�~�r�2&QD,Fq�<M����������G����rq�d��?��AU"F���]���G���X���q:w�e��%
�akt�iE������q>[��U����q2�E(hS!���.�a#��^s{S��u,�������[���>��P�:E,�t��P�y��"ZB�O�M=��U�L��1p�[�)�n�x�O,YI4E��-�����Q��%�?��F�4L'����jy�����"�j:�8i%�%�=��0���'��to@R�Ma��"��|�����\��}��oD?"����H�=�?M!A�4���=�c���`$�~fy�m������r%L~�������,��'-�_&��6�]K�Ut����H����{r>��Tf	�����F�)��<�Cs������\V�B8&������i{$6��H|9��5m�����Il�o<R�L���C���q�6Cw=��O&o�Cw_�Xr�����d=u�0Tu�|0.L���%�i�����'��EH@t�n���EOq(h/L�
�G�)j@Z�M��m�I���dQ��tp@>Lw����:
fJ�h�t���e��������:;^g����P�NC��\�����-���9>�Z2����4G0�w��H}��Q@�wK���C�������%G����;�p��k��V8E�b���f�
��l�.�1>���8F���H�4����>�{�'�M'�[�gR����^���mN���g� ��6�3
�6�L��QP����L?�������1�%��t�@BIN�D�k=�����D+�x�a_��I=*;m%��P�4�[���O^����H�����cw�����:�"�Y*���q\!92��_0����w�]�?M7�����9��1��E��@�d�5�.,5�������C2��wT�
�R���e��LW���?�G��I4��e��l{���Y�3�+�������hB���A�"��b:[���+�~�34y��
���'D��)�f�T&��H�������#����b��I�N�A���M8�g�@����7QW����K""����D�t<_�PO
�e���P�bC�)x��c�*Xp���[��d�[n&p�P2�M-�A��D�l�lK�����9.g����T�$�K(.������ZN&���.%K\��5K�^r���\��4�.�(����?�'j�_b��H`���oi���T|��d�X��p�K��-��Zv�]H#�L*����L�jO>��jE��O���.t5����V�1�Eh��Zy�,q
=�"]�# l���U����s�Q*���	�L�N1��i'���W_����y ��8%+���y�w���\�����M,���Mf����^��zs������	%��N��	��c����I${�5��Wq��Fs�H�%��N����aHpFk�H�����{FMw�E�L�]��i�4l��_�<@.�^���^vl�*D�_��'��/���'�� �O��%��.
����r2A��X�g�h�{	��:�Ch��X�,{
��D��/GU�]������=��u�}3*�Edk��>g�������r1�MT��!@�����q���$W��Mp�J�L��]��8-�H�������m��BIh�r�@BH.��`��J����Yd��l �	����xF/A�X���{��	������M��)�R���,B�QX}�����<�AI��+1kX���$����2.q�6��w� ��%��+��!���N!�y-Rk:���v����J�m��
�����
����uQeP�<�	-b���]�2�?H����IW�q�(wm��u%��KL�Y�S� @�^T��@F���&�e?!B���1`�-5s��,��%�(�6�3�=~5
�0*p�eh�g.���Pd���
2B�8	���^N�k������������d���XI�K�[	���m!>��Z�m���A��$��P
T��C����c���p_I�-�m��d�_b����w��T�������W|��h���MRK6���������������O�-'��q��s"Q�Bcn�����;�'��-��}����`S���u*-)�������3<-m�� ���x�\F� j�f�3�>"j����y�Q��n��[,��������IT���t�&�����F�����hn��Q�	���H�"��x;J�kRVl1;�d��&�V_��-AS��������9{;�_�N6Ctf@�zB��-
`'�����#F���~�������@��\��AB��A����'q%���6�[�;K���p�t���&���E��i����J���I�	�l?����vh=64F�
�.��D%c�S���N2�6j"����BQ����-�}�kU����^��(�i�\����5?�`~�o��nBx�(�j;�x�w�8QAE�r{���6���v���m�nR�lY����������q�"*�I�6#��>iU��l�����8�%��6���r���O5;�@�%6���������Lu��;4#z<Q��/b b�O�����}D�����W�������Uu�}�"���� ��c����D����Jc���S������5
$�Q�F!��>D���>l;kx�3T���-�������rB������-��S��8�E�@�O�v8�l��%�K�3t�X|��d#�cD(k**�E��.�H�]��K����a,�e{pO��2De���(���+E'V���cno��Y�!!n���:{��I���Pb���E��z)��U�Y�������t?�(�l;��~O�>��Y�!(�]����;g@O�Yxc���;�x�f[�2�����*��"�U����������u�uw%����������<?(+�-?-�l���>�*SLa%N�8��~q�B�D2���b������Fv�����H��8�[�_�1s ���]�u�4�X��?����:
�w�Up
�
������W?���`�;��*����D ���$(�q�@��D����4���
dzz��)�vC��x�.�
F��.����Q�U��H|�S
��0��_?mf���q�����$��#�C��4G\6�����c�!v��W9b���������`����@Il�v;q�T0�a�QewT��}T��L>�d�+���G^t�_c^_UK�l�`u��D��������d����ia���W��	����t{�%��1�@}h�B-����C����1B�r�B�Y��f_�,��7�Fkr�v	]_��	c�{ �];<��Mx����n���4[�����9�U	���q�'�np��LP�#�BS2�����9�"�'3O�p������6�Mf�	�A���C���(��ve�m'�Nl���*� "���s�VX$���_Q�#%���s��B>��|��5D���*6��\���{����z��d�D�[��,�#b�:��'������}� -����:�[i��DG`�b_`4��p���(��V����Jo�;�s<�����R�,D�'|lF$9d�2M4`7�J�=���YC�g�n��~����Ucs�h�T���/+��E.4�n�$E}r����VG���|^v�K��	����#�R�&�������Hv�I K	�B�d_G�9���g@?
$�����Ep���p28'
���oY��HO7y���$H4�G�����]�c&��x���6�x�-�����*(B���rTF$f'G�����:���a���~:�w�i��~ ��G��X�fE&�^�3<�l��f?-q��^��=	13h�|G��z\~%���h��@����{���3��h�h3����>����}��#?(����b���Q{A'�cT��m�}	�9�!�"�%?(��K����!������-�O�q�y�c����e��$h���=��H��w��y���XK���?PL@�;P���}�P�.&'�$�1�����?Y�B��>-�
�2�;���;��cTh��x��O�^�^B��h�V	%3��A�����7��_��{Z�y$5@���>�w��.4�,%��~� �����~�&N u~��x�V�8.�%.�6����y�xO��h�t�V����������X�hIZ�x���=��hJ
|'�&	�l@��By/�S k��o��OEoAx|��*w��_��~E�x�V �P����
~�t��S�kB��1�u��h;����;�����������+�Q���H#v"wy����\�hY�����6�������Q��i����1�Xh&��XD����.6<����w����`~.r���c-����m�Q����6��.�
t�%��D����>��g�R�(ib����"�5:�|��K��t�i��KhBq��G1�_xG-p��0�m6�P@r	��\lW�O��.��t�������h&��h.�'-���@}u���~S���^g��A�=�.{t�j����g����FDF^H�
�'�ulw�m�1���!����
����SU�5E�{���G�'	}~/�'�);�!}G�)������������utB�\�������u���)��S����~��-������`!#�H�"��Rf��2���m�{�#��x�����$%(&C�����[�L'A������Uf��c#��u;�����>},�
�������C��r��T��w�;�`G��d}��cl������,9E ?�$���)�(n��F��P`r5���]M�A�~�$a���Y	��uPPTG�W}���T��l�
��V�9�p��`J��
���=�a�8\���m�>vS��S������l��tb���3�Q� �j���/p��}�*��i-�����
)��e��a���:�y�5T��y ��l���(�����l��]�{5j�=��!��j�nr�`W��������-�_kVMNP����U���x�A���`��8?�'���d��xx�����k�Z,��������;�<R�+�?jVz�n�4;�o��{B_��Q�qHV7R������V7*8��{\�	�R��O��
�w��o�dB�(!
�m^��������y��A��(6
�++Zy�x�'D��z������",���h�XJ,�Q�G7( -9)���WE�����$��b���&�j��3Ld�����O"��16<���h�x�{�Is�;P�]��(�������"�1-�����h�����������?	4[>��
�����������(�1�L������:���M��"`�E��}��+5`t�>6G�u���X?2���r��	�'�e6pvvwp�|��[-��}6z�=D��[A��(b+��%W�&b����2�N���a��@���
���f���-)��
~"h��(p!�T�4((�VB��Q��RE\Kv�s�pB^��v��WX`f����\M�@Q��*�6�����N�I��(�-z����`��o��i�z}_%�KX?�m���{�.���z����}q������h���^��&1���O�D�1B3�TV�d��A�;�r \[���n`x������2b?&�zt�tdp������6�KG��������ubb�-����3�����}����GW��I��H���������������.t5�*E���$�{�"�
��2v���;N&�U���
��V�Wi�2��w�x!���Y&�S���R#H��}��������W��HW�@�,1����4�T�����+3�>]��8�K��N���dU��R�/�<��{im���[w0���� ���,���R G2�-�/bT������D��
�1���U]��h�I�D��	I^�|��H�^�����<�;�
v?����hc�B��?��1B��
�'HG���d�iF��{o�9��K��GbO��{X�������r�B�d2P��}�8����?��������11O���^����[Sm>o|��Ik��4��QY5�_� ��x��������M�U�>x��T�5l��F���-�ax��cS��u���&�@�i4���!��_���vKx�!����87��tt��� ���M�SQu%}�����>������O��l��%���2����9T�?���p�����1�t��c�����	@K�H����;�����Q9(>`����?FBK����Dv4u���������rz��7��rAE��� ����s��#�������v������yOx�Z��J��X���{QR�������5������aZ��>�c7$_�����cl36�.�]�5.����$�S�{�����H�&F]���9�����0�����P��Q
�:��[w�q� _�!T�(8�4"���j�?���B��9pB!>75U��h�I�M��!��>�o.�[�]�dd�]G�����n� >���{����`%��
�����,��
��k��HT!����N��0~T��C�)�[$�����[}�3���=k��Q?���������q�R2�F7����e�hB�iP�q��rl���
��dzda�Nt�Wl�Iy����?�3��D��l��E����
���
S���{4A�X�F�_�_�N�&d)4)��%1��%,�^,�f�f���br4�����R=i�iv��y�~�+3���N
����w:���M��Y����Ok���MH>�.d?}�4G�^+.��2���6b������S�P�{#D�	��jC;1��Y���^[��?��
��W�?e���'9�����X����|6�Y�����`w�E�Q��!��d���J�p2P;i"�i�����J~��z��?*t)Q����@_~�����h�6����^��}�7��i�����|2������������������� N���ZJX�&�_���?((��	�O���1�s�Uh�g7;��>�8�*��p~����H�j��K.34	Hf�����!��9���O�`X������f���
g�I���m]e�^B+�����m��6?�73�����>�h������M�?^���8���M�Q�&�PFZ�e�o;��l��G��He�P~%Y�M#Fz�&�Yyd���
��
��[�%�����RT��P�>�73���J���DaQ����1�N];�G���bp�L<��#��L��Q��9�>qt��&�	���S�������FA����'�-6*-�����l���o�����	��t�nGZ*2/����N/;i�m�g��7+��r�g1��6O��&��M<�����������Of�vDM�A�_�
p����Z��pzwq�'�Fx���' �
��%��l}��r�F���
V�N������������c+=���=c�n��68���������$���y7�T��,Tp4��&�������������&�� j�k6�G&���_�z����hV�@�}\�a�8M�Ei���
]��/��u�
���xzq~
����\n��W���L�n��#���
\r��W�V ���M��`]���$�a�E�P���4d{�h����6c�S$O�XZ����^<�x��8�g�����/�75�O���)��(�9���L�M�g�OFjD���>�:'FB$4�N��_+��+�z�s��J-�s���C�L4��p'm�����}7�O{���^�6[<�K������v���1$�~����>z���"��#����H\N%�F������."K���b��Sq'0��]�wdHL�]��"�(�;��%@��������n������M .��s�~�m���6Fp�\A�dK�t���XX��K�
URrN O;���v���	�� �CVc�1��["����;k���E��1���� H>)��Y'���N���yd��Et�o�b������X'�.�b�oG]@����H=�yFdemt���a��<r7@s�w���-[O�t��l%b,�|��!���#R��! �3����7�����	���������� `��::��hR��;�3]�@��P�y�����\|���I�D��H�y�{�����C���%�6���/Q�{��wF���.+�����-��?�������;7�H2;?@���>C!�4sP�/Z���@����ua��?#M%��f��h���DR��ST�����0������o��n5�m��Yfr�k��w7P�����*��������M�
P	���.�������1��_�.'�'T��m@���`�^�"L<���-��t��9Z����8��@�S�}�M�jCVw�4�M
`[�J�[���1�L���?�<��Z�Y]������O�]~�D=�<I�B]p���N���c�)|>w(�����P�<�����x��q�L�)�B�du�o�4-�|��I3�[G� 0�#�Gg&���,1�}�pS�D y���x9D��
&9q@'�Q������?�#0_R
1w�GvpC����G�k���%�6����7h����Q����Crd�%[A�Q���iP���da6�W�'b�����t*{a��p���UC��H�<�{fZ�c�j��!�`J,��Ar�n���@����#��
S�g���I��[��y��)9
3!��8��U�-�3������	�H��aB������/�[�����MX��pk����OP�a'�{`Cz�HA����0��h�Gs]uy0�@=�^��C:41���_�9�&�p�v��T�F���Do��rf j��@��� ���b�\�[�����-�����n����
��������a�*$����:K���tu���������:�P)���w�!@��w���x��!���d+�S���l�3t���:��Nc�`����18��5�#����������6�Z>����c�"k��h��j4����1�
I^�����,�6f��.��uxe5!f�����T�?��M<�&����@��
C0��):�� 8�t����G�md�:�	���hOf���M1Tu�-���K�Ly�!:"��V8�O)
W�Z��D����6[��A{�
m����7��lk�"���^�����.�e�w��v��B�_	wMQQt�"��E��=��v�;m�[{�����m�/]EP�o�/�cE������e\p��(��S��T��k�i
�f�X��T��#�q��&��{��(y_CAr�"3#�������s���3!����4DQ��0M@���tY�"a�8�yL>,�N����_9��4E
0�������"������q��MV0�����eFR�M'�t��'$XjF���,9�O�Ty[������lJ��!7������@�s�tJ0f�h��'�,F��I&B`���)�w
q�4�b�Z���D���@�9.LQ�c
�G�8�tS�<���vwB��,�HT2+�Qs
����u"��IQ,�4�g��P�Z�hnMj�Kv�)\����l����l�O2
���Q	GVS�>Kp�&�����s�o�����j�h�q}x��x�]�K �o����(�b
��7-��m�@���d��;{Eq;�Yb��	��8�_.	
����x1�$�HnT?��]�S!�=��Ie�0}v�?�)�V��N�D����Uj���lL������4��������Y�E�� �?����~��@-�K�������Mc�
�<�M��~F����
[cp�R�����.�����au�SP�V��Hw/���>���������I�����&�S������_���3]|	/4�����N�;��JZ�>*�Z��9�9qu-��U����>�)��D���8�dRNg�@�M�&���'�#��S��������%����Ox����L[�h�|q�d�����ma����������
�mAB�i�����V��ha�J7�������BB��������0�)�]`0�Ej	6��G��S`?6s'�:��	�a�
�aHH�����	8?�Y���S��!��)a���_������m���]8�gU��-�[���X�>��G��waK�s��}w�M��i�?������L'�1� >������������}�����%��JA���Y
�J�[;��48a�36��he+)*g@����b	�����h�H.���j�b��������e@%%b$�4���{N�02H��e��m�Fd ��
pO)����g&��~���2.�Cc�%����'�4?R[/A�I�������,�A�^����P;2"]���r����h����Wqd��zI�2�'��+u	�����'��rj���~F�	���'��r:���aO�����YI�����V��U�'T��������Q#D��K��FY��	n��{�^� ���=���paa����&C��������WS	 �T����s�[_k��L&��D�������Y%T�,G'#Dr��D�"�����j�$�07|�`��z���<V�����R]n8�����I�N�6@�+��ED5���gd����KU�,QC�l��5-@���D����`x	�	�����G.x�$&2�e�4�:�%/�a���4��/�����p��lc	���z�K��
6�#.���D�b������r/,���]���V<��[V��A������Zv7�j��]q�sq|���D&�?�7/��U�����;����M+�C=O�u�vN�6C�����?�����;Zl��y�r��N0�5��T����.��$��k��,�oV��0Ys	�����4B���q9�w����������e����t�oT�X����-C�������
��LF{� ����� �+����J�����j�+r�{t2[R����M3�I:�����ym����������9�F����nD���>�������B���reO�c�T����EUcH#��J�z>����H��I�,Vx�'�u�u�k�zZ�-0���6���)"��}v��D���>������: �F%��}6hW)<#PX ?��V��@��~:V�-��O<���r�����cl��������&�;�H�����I��(�3�z�|��[��G��6N)A�V���
�g�/�j�E$(�6A�/a������tJo����k�NZ�c��F�nQqw��mT�Z>��]tv%�[,�J��]��9��p���,E���gy���e�s�6#@�����d������$�[�v v��]����P�1r�HM���Cj�d�?�HI�Z��T5��*n@�@e��Gnw����I������oY@�,��%��D#���W�_���ug(�I<�����K@�-F�F_�h��~^���/���J�o�m'�n�"�nl'��
��(0|;H���B���i)�����$��|aV�}���IOI*������a
�*b#�
������E�B"��4��)�Y�����|����@m��	���(y�$���=�8na��0p�6��q�k	\�����,"���jo��g�M��&�������Ge���3>����E1`	������jlg��;E���P�������QN��P*�/�-�'��������l����"�K�ZGw`_ |�v����3�?bT(�W����������������$K�Xl�)��F�na����h�����Z*1���)�[�2�����n��~�_���6S7���qM��n{�&���I���Y���wm�Q@yL��?��?wG�����Cs�i)�f������F���J&������6J��(�|;E�BG$}#I�cs&*�-�k*���Q&���2�h_wW��� ���H�n��������m����E�F���B�j�E�PK�HQ2���X�{�o�MTDu��	D��L��L��}\�%����w�������}|����*�D�m$2t������r��o���DT��`��,�2lq+ZLE$�D�~D���D�`��E�O�q��y'����(�<V�&C�d��_���=����h��

,�8�Q���}&��c��q�^��r�p��������9���n�_������}y�tU9�&wm�dk<6J��#�#Vy�*��
)����60i������L~*]���������?��g@l%�\�]&-1+9"����:�� �
#a� ����W�����������q5�:�
d"��B��,�$X8r�<�x(���D83G��S�Vq�����$���.ni=�{9�	�T��y�0,��r�Fi�P��h��Jvs�T4F�/@��v
��g��u�M^N���F��sN�aW�q�E�={"���<*'����t�0�SC��q���9�BvE�����l�o��X�8J��Y���2��� !����e����������q����(z�J.l��EQ���\���q����@s��hX�)�_�v=&�V���D�z���	��Q5b,���X�����f�����|������@��$<��J���I<3����v��hL����pJB�}��d���_�5��Q�'�`
X;�U�q_B���7j���������a�v�/E�|.tQ�����#���d&%���C����x��U��������*b�/ ,���K����v�*Fat�s��������sc�LE����(�e/n5-&%�P&j����UP�mTR�U�I�1�@�eG��s���+���D|�G�OI�o�rD((H��e :��P���l�W9��
*�����Dr�����[
q���F����&�s�S�UBr�?�[���]�F��*��g�� �5��������hC?@i�`�@�0��KF���	���q���	;%�aGTR��JG�}^b
pZG�����T;VT��&�����
�^�NN���(�#w����6�!YcP�G$h:���2�{��PS��I��s�k���}2��ub���2��"y�%���V�i��5#��H<����w�������kfJ���:��J�W���[
:tA��U����q��7�0*�l���2�����;P�_��x���_�����`�/�.�������P��B��%4������gPu��1b���|`�+�����Bl����q1�B4l%\���x $���UoK����K�l��9O���p���;F�H�@��hQ���fJ����e�.D@�3n�������,�z>��A�X����y/�U����/JTB�p��q�r�R�K���^]���.��:�y���;F,B�t�ct������^6{8���p��A��x�������,��I=E�u�&�Pt��S�%�=�%4���r8�c�r+�h{�v��n���b�{�i�(���T���^��;a~����l���p ���s��������`����-���*�[$"8�<Q%� z�H�;���S�u*��D#�"�=U��Y"�I|��K��5�
������{�#��Ze���R1���{������A���z�J�;4$��4T�-�j���:y�u}&����w���=��^�S3y��=20'3�yGkF>4K�LE���?��cD�>���$r��������s��Cv>U]�s��HI��6����/��c$��s�����&w�vpTr��{�R%O��r��]p�B�2�����kx���5T��:"�!)������n��K|�KXH����w�P�����O6�x�	Fh�[�c�:�K�N��$-J������w���Y~���w�
Cd8������������
i����e���c�� �����t��ebq�33z�A�^�
���Z�->"h(}�Hw��RzT��S��1�.,2+zp�%p
_��tg`��;�����L�1C�F��q������"#��j
�g�SK�3���.��1n��P���b�$:5����(��oq����,�V��u|:���~�E����L��"��$�W���W[�}���_��� ^�������.E��;k%����D�1����������@����)�y�����	�R�d�+b�#Pw��"���;��|2�������d%�N1���E����_(�Q��{*�P�����[��@�tCsN#��C��1�x���.���$ ����u�9)�Y�����*a
��������V.f �'��`B������y�,�"�����w�������,�f�'�gB�\��6-��q��'�X�
��&��
7��:	�]�� �n-��������I�,������5mF�O�
�������+b,�����(�.���V.���UF,�TG�V�PAFA�ZDS�u+�>�$Y���{�\��}5�}�M�^�9Ew0<a��y�~>K���[I����hJ��g����/]�DX�~��Z�|^I#<�3(����$��T��?(��w(6�*�'���=�^���dI�������oMh��,e�x��p��f�;���'a���on	�S��@�^��8��!V��s�z0���W�e��2��Y�'i���Ytq
�~��X�g�B�/���e:��s>Oj��� !6���z�/��&}=�h�k{d�":��/�,���Z��>�9I�a��G����"D���E���N�I��;P�ZBqT�5����hOqvB�$�����[�5�����v���w�k}���8	�D�4�wt�4���'���Fha��krFM�#B
��NWD������~y	�c�0�w"��4 !{a �N���[_��F��]�5���Q`}Ft�V���aO�8#�8�Z� ����v���c�����7@Op���yK�"�VV�J����(A�Z�;�r����7)'�����/�v���G���~4��9���b�$����#�c'�gu�B��V���Bq��pN,�g}La5����i}����LfV����=�h{����@�4i���V���:^gr�T�?,Ig��q���~�
T�������_3����������	Y��D�5����lBh
���'#������ZU\5���#���1�ew�`�,���`�Y���.r@�n�����Q(��+�ahH\�_��$g�D^��p�FG������g�H��Z�?Gu�@IT��Y�w$t.��b�hk��$�S��fs�F��N�>�$W�4���{����%4W�qt
��fz+���z�]tK��*^!�y��9�cY�C*	�����{�v1���DmVE��]�t
?k�!���R<�ZUg4����;�tT�	�N�FH�$�k��<bq�/����"������C�`�v�h�I�WT��b\Ir�g���>VtD�����[���CEP���Y��m��3�%qI��F��Z���gg��=9&���Xg%������O�U\������
;,%���kQ�6��&#v��^��]E��H��K-W�/$�F5�@��@��� ��&�:�K��:=�08������
�$�n�C�	
ZM" ��d�6+b_�����*P�
A��X�Y��L�
\��3�5N6D[����{�`�D��I,��XnJ7j�V����������6[H|X�����$�;���uY#2m|J���&��X���M,'����Lp?G���������	p�l����?�����:4�W+���9;�l�Ql�v�����g$y�[����9o�B���;A@�:�CAb����3�>��C�k:�n��!ypIvvF�=�M5�5(��Q��"Z�b��~��~�/J���@pd��%� 20����=�"6��Sp��j>�b�<��T��Aa}���r���E�'�����&H�	�Cb���]GJ��������
�8=����Q-*�8����B�6H��������=)���T^r3C���W��apwc������m�����DD�O
��pf��		$���$Cof������E(Hz�&m�G�S���r��THK��:����-�L3��#�\��@
�-=����6�.P����Z�����N|��������/o�`�	v���K"#��D,Dg3��*��_v�'��C7��&��,�A���cC$2��K������>2jA;c3�/������� &W�y����m	]&�@k�S���&��- ��-�y�:7�s����h�z�-�  GK�b����:���Pl�[��>������P���H)<n\ 3��������n#�����9g��5�"G����������t���w��`:9���$EFh'�+-�G��Q�X3��G�M�.n�����c�c�,�����K���Y�[-K
-���Ez��B��mD�F>4���p�m�����D7�C
�+�A�;��@������.�Z��2h�D�����*hF�*b���� M-��x��]N���� #g��'u�����$������{p�nc��6���#���lA���U����nm&���F��)��*%��+�{���I�����i�v����[�[�l�?P���E@�b���T���K�i�����fHc���Dg���,�q����������"������h���d��������CD��t�����1�����~$�+N����<�]�&��k��:(�B3=�����f�����ua�-hk����i�l;u�v���N
���[���c�!������i�2�L��]��h�y��@^�a~u1&��C7�f�_��R��k���	����EG���_]#U��u�NZ���5s�M��QJ;�������>5���<������������t��Ns�1r��$vk�/��(��.��=�����tq����q,�GB�#$gj�$!�����*���q(��D��J�Ta>�n�`���T�H%��|�� �C7q �ZB#t����_����d7�V?�#����������eR��h!�[/�G��8k������1�!��zs�J�Uc$=�c vO���`�����L���'GTE7g�.b?��@@�n�@�!����? �Q�����=S.���c6do�,�
��h7C �u�|���`�|���=y���;d������?��BE
�����L"c����YBu�R��INPGl��u�o�s��a�b�2����x��g��l�Syo1���I!�{�p/�Tpydr�����fJ�@�:�$R��t���M��;�6���\A2�{Yi��sO7]���3
����.�b�N 2iBTu�����FP�nf�rR<��v���( "�n�`I���N�e�<��g�l��fa$I7W������n���XD��H7$_H%]���|�vr�K�e2�B>�t����$4��K;�9	�Y�8#��3��/i�%f�(��������Y�y��h.�SP{$��{(�Zh"�zf~-w
I#
���jZd���	T~dopO�]���
��tB?�$��+�-Z}F����q	V�gX��J�@�7� ��Xvv+;y���'������~�" ���-K	����IU�C��aw��`6^��d�a�����'J(�_���3�������X�PM��F���	����D}�j^�.���>����y��������#7����%�S��w��{�&���u�/ck~�4����\���]g��v����v
C���*�1#M5�
qw�D���J�����*
5����5��r�|��L'tf?��jtG�%���>������ne=��;��p��5��E��0�A���6�C� ������3�[����
�nP�/���$ZJ�!�H����.�y��?�@s���,�&���gn��PC��a��-�G/��4���H&JV-��|}�lCe�����W���hjA������A�F�DG��Ie��>��l� :�a�A��f;3�I�r0����J�	�0� .J��ij���
��a�A������f�A�`�Q��'��������5�:��r�j8}�L�QC��!��#�#m2����BY�L�0�%9���g�(���%�X�odv�|p���qR��Z��{��� ��T� y�d�*(�n����tE�Ezy�M�c��!����%B?�3N}�����\����R���B1=J��t0�e����dZ�����M��b�A�cc,��r�]�Y�����?��{��[
�VB6�	���#�D�������]W~�$���4J���74�k@l����|����*��:F�jK�9�KF����CM�0���H�qM��\��������{	�2	0��a�����>��*�����%�BU���B�fo��H[�D�����#.DU������9��D)�
��#*^����LA��R��<a!�}�+]J��@(�a��B0�����3B�O3��z/��!8�H��a��;��{�O�K����A ?�d;:���=q��x_�����4����&N���x9h=K����
a'qbc|�|���	�6��?
�Zz:��ue<'�;��;q# ���~nR!�*���i)p~5���(������7������X�(�����|Da"����8�}7�%��W����_�
2^ 7n��M��Y��"�<�S�&k_��g|�d��;e8��%�bH�<�OV������
�����F!���:�����j�L<zC����T�d�>��������3!���}d��[�4���O���'�n��Q��
a�W$n�������oR�Nc�j����L�	����m3�J$�_�������g:n �=�
�TF��,�VK����q��a�f��Z�=|�52���iO��0Bw�H��dcU�����C�f�b�g��B����Ncj����b����q0c;$
�n�� ��i������M�B=�Qr���Wf�Wp�����|�����U;Y�0���ix_V��T����"|�c�[��{�|G�<%8���%��}�`�����?�)����2`&��V
�����N��G��<�Ij����,�d+%_����)����v�����5�[�lQ�	�&�M�$��]1,Z���KP����P!��i���<�/Sw$8��{l�����H^���k:{&�@aX�4) ���R0�ae��Uej���nq6�����������N(��xhP��C3���a�z,��}&��J�
��s��42��Ro�5MH�(/����?��H��"l�1��rF&��v���������E��a�g|�V���H����NH����������HBt���N�HR��}9��o�����2�o��ke��
}��q��Z)C����!z&D�~|�S)�':~%�@��������n�&��FK��4����.3Jz������v���O$='3Gr4%]>s�?��?0�k�qh���k��lI����%dE=���.)��w� c��\�@mwQ��@h�~X��[�5S��j�y��__��Dr5w���o���PT�4�MY
�s?�����M&J��D���Wn
E�����������4�i�B�2���p��[���4� |4���ARn�}w��d�A.OE�4	Q�_�,��Q��Q`����1>'���|�����Ja�u��S���7k�����?�����M����n=9	�!���\[i
p�?�E}�LJP���z�N
+���]�YQ
�2k Q�"K�2u�j��_�T�,��=%;�*�RU�*�r�^����x�Y������'������}E��@_�2�OzPV���H���a���+!�e�,2�/@�?���2����#�N���:�K���$�DV�������6�_��l���TI����S�i"��"�!��������H��)�$�(�8|�TCV��6R���2��R6
�D�!��=]��(>y!-�~	'�l�L!���[�"qY&����k����]��2���*�N���6t�J;Gwc�@_����*|�0��S[AKk	��"����c����r�
E�L �=����g�%�u����`,�����)��\@ }�Q��uG�>aj�F�K�Pf�`��Y���f�m�A�����n?���EW���^n�@nu�,$�3�
Q����,������,!�����7��c��Ti�a4�2q��������q��e����4�1��W��h�G������@��������M=0�}p%�x�|-}$�T�q�2_ >l��2A`{T��D��G���A��s�Df��D��t�\_/�]0&4�\31SbZ��a`�)�"(�$���%�8=��9Q��ZQ����yb�b�P6+��D���g �E����&h�����&�D�4����;h_dL<����U�8�v�CE�����a;�*;gI$�?��z
e����(i2���$�eq�]�w�~���-
9����z��V�L��t9�BS�e�_�������v�t���{�E�/&I
b��f�P��:���F^�rf��
�4W2�L�W(��Z�-�$t�v���H���{�`o?�j#Q�v6���1��@e�N�Y*���Ad�����{����}�V=��:�T��L��DTb��:s�����%:����m?Y��3�2" R���	?��������|����H�m�#�UWUKgG.a-��%�6��DJ��!!�6�p��&U���w�g�]Hu�KrX.te��s�������~�)Pb�M�������ptR+��
�y>Y�����.$$���0���B�S��R�����L��m����m�@��CdG;�ArC�����cD4V��@�� �:�����'���G��Y���sd�2��2�H����5����W7s�!����F������]�:��U�*$���|Y�O��oC��
2�v�k<d�W���Z����WrVY��b+-��hS�����`�@��2�	=��t�1�����6�_��|��(��i�g�M��]���e��������<�&�l/��:R$6�n���+��t��1(�P�4���S$W�A���{n�b��!�22�)w�(�������3)���v�y�?1�Z+��%�6���K����; ���GM��=�?K���H�����N
>��|	F��F��`�Z���%��i���.rG����*��}����:9����O�C�������6�/���]ez�	����$i��G"������V(#	��z��6���_f�y![wD��$Hc���_��M��k4��;����<�x
-�����h�]�o���)�6���U�	�H�������������k�dx�\
������t�����}a����������"�W��q�]���q�T��6��*KR����������gP9o���� �+��)�k�P9��zZh�7�/����X>l(@����{���'���})��N�G��"�1�o��~'FC���+j���Ig����'��h�8��"��s�k����;OV;4�G�x�6[�Ojt���������'GM�����[�H���~�S��CFP�����{������lJ��+m������Nz
�K?��B��'���C7z��j"�d���Lf^��Z,���Q"�>a�\]Bo������/4""cj�	O����xT,a�aIB/�EV�S#�&O�����p��#����b����	���T��G������}'A�r�^Q�#��c��'U�����){��"�y������^�k!Y��	��]�s����IC�����������(�����XyL(��meO�u29a�m�S��]�`��(�B:�����$���NK����l
�J��P�r?���m�g#/�M����*��x�>������~c�A�����l��Ly[���<&�{<I/g�J��`���>+Nwa1��:�HWL��c�L^�Y�#{E��#G��	�kj�{��B�/�
��&�����>�BZ�����K�>L�)�+)�+��A���47�����HcJ�j�q�-x�$���B�\��nE����:Ai�;���|����G�����������Y1����I�����5�]�����h�Avun(���N\�L�jO~R�t��
�a����4�+zb��M����m*|CW�'��,�
�����xrL?�����E��i���i���
�']j:Ce��*�q�p6�;�6myh��
�����P��L��:u2��>�R��|�%�G���������[�	�$��?B�M��9�D��g����2� �O (��N|�u1=I.��[u*��R��#h�q�6��Ix?����p<���T��Kn"l����#�N6�����TPW>Q����L����^�(y/Q~��R�u���6x/TW������b�vA��w�8��#�{+?�A���v\�����&�@�%���3�����;:�BO�_�{�h	@���9����t
������P���&�%��m�d`z���p�gCF[�~��p�^�������x��2��q����YL���C8��^d�	Z��K��I�o:#J�X��{��l��H�|hmI��9�p���q8�������3���fg�[����<�D�	�@'���?���(i1&n��%��&+P��/2f�<H�X�-���1�f�dl=�}��#���������G�0!�n������_$%R�"I/��-�F�4�{dj�/V�,idy��Me2.j���)���^����
�h�����^s��16a�|�7P����i����'�|�����[�H�B�j�K��[r��@���6�t�1����d7��q&;c�'���#�g��^�������+������������5y��g���)(�z�+����{���"����	B��T�N��8k7�^d������K��.��v��Z�����S�BqgB�*+����n �-������0���@��q��;��K�h����z8�+��d����U�*$[},y/�s$�s�\F/.{)���"�� �q�1�3��
�S�����iq���!A�0l��wL$�$�x�!�Z�����B�W"/��P�
h�~/a\�>�{�-����D���Iw���~��v�`>�� r�_��fY�����x���;���^����!�U�l��s�*��U��A��f����]6I��;��8:c��%E���w�����c;�!�s�zg4������ <*A? �b����LjNe2�w�W,%�"����<bu�@��a|���8��W��^��	8��cB�h���jD���Z�`>���{�/���m{_|P��b�~��;��H�_d�(F��L.a���8{c��A�y�H(�@��+���n,�����z��t3���G�}���^�X��=1	^�$���jr���qEu�lW���J�����a�'�_C�]���+U�{�[2�#+e1Z/;8����?9�
?A������P���y��H�I�Q�K�E�1��<*hJ\{@+�*���Z�M�*��`M��R���F[�1x�n���?#�t��}G�
�B��� ��T2������2 �����g��1��Oh���,��>y�-�!=��V�v�RK�*u8:�[��K#_%4s��^�	�[�Vr�,���iPH\���a������C��5��g��h*!M��X�#z��H�p�_�e,Pe�������=K��0�y�����J�?��^%X>*-�k���H�:X�K�Hc}&��m���|��q�v�d�<�48!�����H�V1���Ge��U�{$:L���1}���s)����W�G�e�R��+�{��.�m�_<y�#�Yj
�wgs(�5���=�wu���!6��W����N�������=�J�{��+��.��
����gb5�Z�$XU����d�q_$C���b�eCh�2�I>����Uf Wt��T�z��8zKF�m�\��������,�R���V�G� _��oyB5��=j��f��|u~/"�)��6.�	yD��u����F*}M}�o
��W������O�����F�#� O;�����m(_�;�8DwjU+��v��$�������#��b���D��s�+��
<�V������
��WS_�7t��H�X^��)��I<�;&"|����7h�wB���"=�nu#����L���i�^%~?������`����St�X�5x�)D�VXI���%�>����F�i5f�����WK��_���@���V���9�����As�;��i�����,��c?��J��t���v���Le�pE%�'s���iF� IR
��X'����j����69��("u��tVn�c�1�/���Ng$	���7N`?���/v���~�M
5�}�`Z��\gYW�e��'j�Z�{��~�e'{i�o�z�y�a#e\��OiiF�i
PU���nF@�5��� a�!�6$!�	%0��}5>�-�2�Eg�jv��)����!��Z�
@N5�}r���&��a/D�z5��2�Q���j������
P�&)�k�2�Bai���}��x{`����E��� �D�j�P[?�� �{���d�v?�������
��}"�Gn�d��:��z�h�3�_�C��p ?]?��L-���m[[��'���1�����&��}-���j����������������������Q��}������1��81N��$s�I�� _g��;

Y��H��#�Cm�d��J}R��2�%����k��kNRG<cWNBB���1��_���`s5�/W/ymt�TH�����BV��]u�7TO����]*��n�S^��2�wf:���=���/f�v
���Sy�u��\�U ����3R�'y������IYk�Dw���K�K����,Y�I��j�U{�~{s�e��)�Rn"
����`&}�-�I�X]�l�4�,��T����X)NB���O�R�.���l�����PM�i���5?��LI�T�4�����Ve������Wp��Jk�������m.�#
G��������b���1�Q;��-$���p��C\�~v>+�ZZ����z�8��jO�
B8d��$H�l���F�����l�>���
��~�{�t�������Ey�:�IN���&jZ�,����;�����Ml5,��{i��M���x��]5�]�Zm�l�{�@��jO�7��U��L"���9�4�
s��kg�CW� ����/�����-��G�/�y�UK��XU�d���3>x��B�;�?D��F(��{�;�,li0 �B�'�
�z���7�z��(�{�A����4�*�%%`iN�{�| �HU3�`%+Ak[:	�������$-�rF}�1/A�
-Y����4F��<�����-��H�H��������-F0]]�\CS��JcY��t�_�$"���-N@K5�rl�	�`#r#^Q���#MobU%�g��`�I�]DZ�Z�7���to�>PA�b���V�O�Ft�H�6��l-��$�7&B�r <�-,�%\��$�	D���L�
v�9������6[��z��	�xG��swI�xRW��
�:����w��������.�6i�*DC�nL�E�Z��V������_��:�KZ��c��fW��#��F.I����B������~b���%����4��uN	�Ri)]�h"Z���a�+�}�iGW�\��
f$�A86Y��Hl�{�LA(�r��n��n!���V$�k�s�"c<!b����6�+�q�50��U8|�8P���bTfBP���Khr��k�=��wX3���C��~��d�JP`�\T����u�[0���!>q�t��%c�K
z���M5����=S0���8$�HMX[A8�/�����{��dkM�������`�'r�T������9c7������%�:�O���\3� ~W=->T|�D(�>}��db}1��;|�(�%���9PKK�����Q!K{����(Q�����|0��H����k58_��O	Y���Qu�*
���(x�������!��$��N�=j�V�}'4oK��<t�N�;�0X�D��MM3��(��j���:hoe�dY������"IyG��
Ydz�>k
�PW�����S7{��E�Q������������P�|�?�I�?��O��N��nRA���E}��9�u�{�k)��9)0��9��?Wd���'�#���f,����������$���v�	j��A���'�����)��������.��`��L=�
E���Tt0L���x�h�;�s��%z�7��]��e��&�Z7/1tt{I����5�����v�$�$�G���5i.�_P��nl�j���������Cd��.��������T��07�LSL�G������B������1[��ck0{��\��u�������z h}�`�������4���9);���E,���<Z�dA�H��)(DUZ_A��� $~��Az�9��f��,��F�8=,����aA���=VG��-i�{"Z,�)(�-7=�A��0	�<I��epG��]M�*J4��!Q������� ���lu��pWw��aB7����N�v���g@v��g�����YL�{	�)���E��xr��_KD��=��oK�'�tS}������$�!"�m�|�8��h��-B����?��i����]�{��x]����p�E\��J^	���U�kA:~��dx�@��b�8����7Z.��*-�I�|G������Ml~���k�V������I>�r!���y��!)��>tw�~�Kxi|�}�����n�C���(��_��t��V}=�y��#�n�Ch��r���9.m������,��!R�0,}���@�c7�A�~��
�q����0m��xs��j����g�����q������`��A��
����������� ��"�����Z�G�p_�,��e�!����>��w�WL$L}�_�>+��]}����	f1B�v���d��1��E�{~��`i�P�qO���4�c�)7y�'2���6I�A��)�yO:��`����Y��v�MD��c����J�Z!z�~�����y�����PB: `���tn*W�I
	�Gd�"8L_��^o��3���f3����DO3L]H#��@6�t~|�
S������c��P��8��6�������d����~2LT�V�D��'��L^� $��r�_,��D�[���A���1zr6��,h��'�h������V,���o���P	��eGI������N	���(h�����O4�6�)�*K���	��L"\�HV'����&���l�a��{�U5��c�4�J#��x�v�FaK�i�-�W���
�V�p�9$	e ���)������j;Y�l�H
i��d��q���>LE(e���n�|���`�2��9}���s�4�|�C��3�C���O��sl'��0#!{n������0�H\���R�'tB�N`#�KrO�%��)�;�_��q�y|a#�r�E%7������N��o������5��(���F�I|�B��a&��a�aXOB���f@�a����/�W���U$/���������}�}�O�T�� 3F,���d�A�q��@�c��k	0Gf�cD��*LV��`r�4?H,dI(g�X����Y�II��g<���tm��IM���,�{ 0h��	L*�gu��q���!�?�%�ux�
3=�������E����6D�-!��0��o�J�G�=���X �[JT
�DX�!����$uN�7b�;��$H*SN~?Z>�"R�0�0@��*�����0�kk;�y�Id�\e��yI��n�e�Dhu2g �<�bS�����3��0��Lp�pb���~Dr���A����O��P�/��)M�����m�@ v'��a����(Ye�$im�0��`���Mp3x~�����-	%�����t��EP�R���F�SL��S�!�F���4>4���vw��N<�td�P8�)q��va'�q���p�s>��':�/��A�����OV�����h�P��$�F�2�����
��K_Y2�G<��W��a��7�G���\�r]t�2��c������J*�i@,J��%�Z`��%-��)���G�����r��\��qQE���^�e���2had�*����3�d'���U�)>I��
��:K�j�O1�.Z�O���:OC�Z����L��L��*MQ��������JCq3
��C��I�F�s�U����:!N#��pp��X�^���q����
��p�XhI1�_���l%��#4���S��V_�h��I��l�,fd������E�{���x�� ��L~[x�])��.�E�Wu�,Y��{f���3���|���cx��dP%VO�(s&5�Z`z�/��"���C����gU3����@�V���`�#�P���%;���O{&���."�3��\���xS�8���#R
�G�"�c.���D���%&IA�0�-E3�+����'e��{�]P�:���1�LpK/�fA��,���$FR�/K�Q��
m�I=F�nPwIC�.�����Qw��'Zk�Ks�Z��w�u�@_�{#��4�.��H[~�d*|���z��	o�D�=U��Z*3Y�������w�`N�����L ����Q@6�]������ps'i|�rh�O��e�����V������ ")�ssg�uH9�k�G��4�.�'%!���D�7��-_��w;$���NVN��):�8K��"6~\���[z�mB�M�"!��u��t��y��d��gA�K!4�4�R��,{/�w���Y���U�D�3Z��>o��Kr��n*�e����W�iK&�D������h�03"�Y1��FY��a}��R_���]��lyw�Q-1�G��e ^��/����(7�M��2'`�2/��H9<)�u�/C�K�����`Vd�����
M���)���+Z�% w@)�2V_�9f��qK*_�|!D�
z?��r�B��+y��O��-���4��g4�P������b���b�S>����w�W*G9�H�����D���X5���g�c��8�e_����{���n+����"��2x�������9n���O-8�5��K��>�^�d��a�r�3i��D����e���,R�,����1!�q;r�_�Z��$ �A�}�x����� �0%�@�r,S�=��_�E]X�P��lE����������v�J������>���szg ��� ����N���d�{{\�z�4��O�������18�f�w���G�����t���4+KLT�!��2�
H��dr�Y�S���D6����f�����2f
���S\���P���@�^��p���B��i��flB���
��!�;k|
k2&�,�������p�5���������������*������@�)�;#��*d��,���L�F��M�����@�QL�$u!N�+y>�O��B�j��5����1](_}�l��#Hz���y�}> SXq!}Sk�e"?/����F����b������@V������H��(zjd=�N��HC�Tu(�^2�t�������W��4�!g��H:�� �!���L��Dq%��8��}�:g�g"�����HR������U�8��\f�.MT��JIb(�i�*�R'��@r��+���{];��p����cQ��.TH�|D�N��iu6��e�-�	r�@��q���:eE�o���]�����@/:�}����A�zV���E$
���j�>�*�M(D���K �sC+gw�|�\������#�7�����EM.�d�m�(;j�SP��	�I���W���=�B�al�`���R��\��D��,���+�d��t��t��s�i }*��w�Tx���P0;��BN�N�K�����K���xS"�.?<m_�dbf'H@&��0�K�u��ts�
u_��@c�8�h������5���L�wh���1Q�t ;�6A ��S�6IF�n�H5�k\��;�I�%�&��z�����v���gu��Ie<���A?��<;��-P�X��V���;H��4���AQL��n�z��j��zo���&��yT~/�x���A���~�q��G
�he6}P}8}���<f���9�mA���D�&����G�� �q�����"�gk���-�3�|u���n�)/r��W�l�w����]S��"����T���w���#��6� ��;�J@8Y�?p$�����hM��	.��4!Y��q�G�F���;��<��aG�#�9�:�|dN��	�H3W�GT��3�6"Yp���rL�ctOQU=��k'5��&�v��U�z��wmN�=�oO*N��O��oS�"P��iF��N�]��g	�����yZ�'��2�C�zm�!�!���!l���X��!m�Y�[�5�D��c���Y�6t@
�@h�mA��-g�D���b�T8��$
��:�|�J`goS	���Q8%�b�$��Au��+d�Z���z�d�wIb�����I�x1B����|
e��
�/���~���U�N��J��e	�T��Tl�4�y��N,rox����*.Zv��G��d�K�R#,���?�����faf@��Rm8�G>o1GPt��
X\M�K�D���b+�|_���v��Z�u�n��6M �,m�(Lw�'@��6O �~U���$d�~I�h���W5���,��dL#����/�� �'f>]�U�"��1!�y�j���AVv���=�tT�=��OHq��Q���G���l�����4Ct�]Q��|��#E�Bsu�����=�;f�]��O.���c��F�9�����Tcd����~�
W����V��pJ�A��Y�K�����t�
���CeN	�Y��e_�D�����'�	7��upm�>>I��>�����y�
TRR��c�!��E�9pj@����@����Z�J�\&���&#/.��
4�,KGk{Q4�:����$y�sN��d��V��v�h��E�$����4��+:�}��I����_M����ZfU6O���tT
��(uN��;z
d�{J��@���nb�~�	Lr0;f����F^���[�dTy�th39�E����8~I��:��������v��*���f$�h�u�iA�r�:_��[����iCe@�;A�D'���Z+O��L���[�1
�������UR�:>�Jb2U�hO���|I#r��4R+�q9f�\��?�d���#�`����A�4 ���
��Y�`��8R�����iE���D#���`
���]�i8;!H��	�GsKW���3�bLk��>��B+�j��3y����MN�����"�&��\�p��f�18�Y������j���[U)���5w'I����������b��Vh%��]�+��%G���t@�b���@���y�����O��	������1���8�����a#C�Y�CQ�3=�i��,�z��6�	]q�:H)$rfh���O.�fR9��=K����me����61:_w���I%�G?������&U�I������}�5G������^�:��d
�4���Q!\��+�������{,+{q�I
�]���T�\��
�r-'���$���
6<��g2�bu�w����m�B�d���"i?!!�B
`�@�$��I������W�?*�D�hV�.
�Y��9�G�{��kwevg��A��w��	�64�H����-�x����;�����n�-*<���(��oX�;0��d6�X`[y��������)�3�c�3�	����+�{�������
���.���Zv7���Kx]"�I��'����W�G��x��b�=��&�#��o���W0���/!/;�DOZ���+�,����ztdw�^���S>�E��S�{	#�:H���K�������S�z1��	�P��	� ��������D���o�r}/a�H�1^��{*Wp�~G��Y
��w`���I
P�����r�TmyG���I�T�[�0|��q_���1d������.���g��Gg������+Q��
�e����y/V��l�Gj�����������dkIYT/Pw	����O�y�`�����N
���7*],,+���5�x�O�M���l�sw4B)��o�
k���o��qG�\��*��v6�������'����)���QK�����[����g������`?��X������D,]6'�7�vt���
,��$5��%}.��6 ���w��0��~�{�|�4"����:^����������;�;��J�L�~�<�6�@�*�{/a��b�D{��;�����5�_�1���\�}�w)� N��4���}�����7	�go�1��?xU.�mQk8�]z��Rn�0F�*!4*����c��n��d���E������k"��'�+��]b�0�w�9iS����F��e� �a�R�T�.iXD�����KC�:�Ut�2���g$��D�a:�����Wxa=,T��h2���1{�w�yM��5�:L��^����'6x�c���t9��z�����8'��|@��Z��_��|��I;��	�v1�����l���s��NE��5_�%���l����� H����qC���hdS,Oj`�(�%���>	�i�^�#�3��.����e�1c���y@IV�	��K�F����_b	��/AH9]��%lA%�BX�E7zT.���~�]�aF��?�"[qR�����O�K��A
]&�X�/�l��
w�s�2 �[_>zc��DK�Z.�R�R�
�$N��h�R	��t�fL������>�;�{�������o�HQ_L4�����#�Q��v~������e	������A�ri��DF�@�Sz�������4�=��D�Ob��
�5
m�	#�y�H6�I_��[��#�MFY�)~+�]�z��$�~i���F����
��w1 ��D��K�^*�,5=�����+����#��X���������$��X��� U8����yI����sD=��*{���l
��_�����L �x���p�}B�4>�G�YY����B��iGp�����������	2����K��e$��B�say��$���%��3To�K��%��4��E�$��2��N�>�gL$����2�P�VQD��q��)��,V0�hDmP���p9*��L�	�:c��p�2�fwR�O�@�)g&@�����}��.�&P��T���l@,�{	7@M�����!N�|�Bd���yD��B����d�XA4T`���|�����d�Z�����m����[�}�[�(����X�r������`���FV;�����4������\���=y�	6�.���Nt	��j:�n�Qw�Dd�'���25��nH��p�5��<�:�m���1M 1>C�3
@��19v>a�����81��T�D��������tp`���������������x�|Oh=m���a������@"�]i_2��K�Q�U�$�hW3jTC�����Z�v5E����p�wk+����<��~���iR?�����UM(bD-q�h�&
���,�>����r��V�$`�����M�j������YK�*�Q~�fj�@�3��D���N�m'��j��t{�c��4[�������j��}��D�!���_>)*9����?h�@0c�,�a���iE~&��j��WhQ5S�9������$M�gG�0���
�s_�]5����YTs��Z��JE��s
S�t�����_����=8�}*����K�e���?i��UZN�;[�Ll���&�@~$�=����;��C��=�� ���&��0g5}n��QM����d}P�"esM;���Ne�`9��v/zRdL���nr %?�d�*O����)�����$�����$�=XP�{�<���	h�k�����;��4q����gj*A(�2?�|d8IfM��Y��@�pr�j���I�q�5!�R���_p9a�g,a��������j�a�������R2����VM�
�s=�K�C�&������
�i�WI|�����lzQ�Nfb�~�e)��Lk:�2��I�^!���y�B�Y��#R("�����jP�0d:�h�.�Ad��D_?�v�vO���K�D�|�dL��>�u~�+d��T�?�����j�^C�!oMD�/�]}�����}��wL�����z��o���	CE���	�WC+��������Bx�� ������J���n�s���3Pda���N�T!��j6Ak�c��f�V�a�����l�||�����-5�,}fh�N[��+�c)�j$S���?��W6T�t�!$\U+�b��&���JJ�%�Q������e��U
jj#)�HS�?�-����~�o�R����h���Y�L/�?UFd:�,�
�go~�N��~�-
�����c���1)D�����'W�z�H��a ��vfdS�8����7��I�L>������r��j�;��nf��jO& xS�t���$�UE��f��|�H`��{��[���]��������=h�R��*�wD��$�T�r���o���������Z������HD��
���U8��Z�w��S��w�?�0�j[x
��b9�_ 3���f��� 9*��r�kk3ai���%9�H���q��v3Q������t�������d���P��Z��Lkm�~�g��i�"����|R�.��FG�t��g�D��a���r�2I/C�	���O��Q,y�-��zo��*2:�
���v�&�2�&�� RM�I��c�{���c����o��kK�����25�n��<�n&�/�x����-lB�d �N��B�vf)1Q�P�5[�":*fp����IH��LX���?DU����1�0�@3��X����_�L!��f����+�� ���!����v����$O�T��4�H+�B�]�=���$�v31�����lN ��d��)�|I�*�g�P�;J{��6����@�O[��l@'a�HU��9��Y��?�����x�~A�w�����m3�_f����DpA�OFX[�I^Q��8��2� N��{�L�'3iK���!9I�������F{mC��Q�7��!l+M,a�����kr!jK8���"I��E��[�	�������O�EdKm�����-��a��0#*���Va;V���74�h��QOOH��S��K�):����o�1n;V.2'"+��|�H���P������6P6b�����f�#�.2:fA
��A����q�W�-��u�n�d
�/e���\z�[{N��������	�������h��u${Qkmuc�NQ�R��b�������u5l�������.v�����PH>q`?��0��|�7�~��
��C
��|Wjj�I�_����@�[�Ox=�����z[�^�?�F�7bH��{	/xD����=��ocXwu��!W9*�]-�����p���"]���S9b����&���Da/����*��E
�n�aD��-'�0��0p���>H��/E�6��ERv�0�i.�����^���e'J&l�����h�
;�{�~����/DW��nP_���o�5�nI	��M�����]�����wUTA
�'�X~��|�����(��2�/sKR��� ��h���%�y��Q_w�:���?�~��]c	_����;�1s<������=[%�,H��c&:����'���:�:��C�-�)���x�� �hO���j�=��C�HL�U
XAE{7�/
[	����>���|7��A��n$_{����p������@7�ONU��_)n/FT��?GnqG�b A���_HQ�w�w*uF���������	�����G���|����@��=P�]D*{FlF4f��{�T��eO4�����:=�~%��,h���*�0������>�SD����QP�D�g�8D���/�I�B�P-��u�r������B�T7��.��P��4�t?U'��
���T�����)�m������J,��S����L��I�W���$���Y��>���7K��������#J�]�s�IV���s�\b�����,&���IaCw:? 7�.t�\�,� Z����?"�����#� <b7K�	@����TM��G��Z����G��5�u��8,�W�Z����	@(������Y�E���w�o��E�����\�'z�������kX`O��R������ �x	u3",�yEQ$=�]��[��U�\��������j{��%kSl����������yA!p<��!C���L�a6����P=5w��6L	��f�CH�wS��j��xC��@%"�	?)�����h7Q��K#��H�p�o=����K����=����3�����7z�=v��F���V����VCwk���T�R�%�u�������I�����2���
����sx=�^G����MDv��H
:��?+�z!�����l��O���8�������a�_��j3BI�����9f��R=j��M��\Q	�u�WY����u�J�F�42�[��#R����q
��U�w�z�pk�*H�ZR���G�c�����]R�y�t
�i>Z$]����+P�q!e��9�Z��l���d
+�����!�\"�
�As�?�Ps����z#y��n�>_���N���8p�#B_���B$�w+\]�&N�������!��y=0�������"�eN*K������C6�2�,f	�$��@���d��?k��0E�����U�=�d���!���'�z�6F���
	$�V�iL�b�?(��5updI����(�?�	tF:t=]J���)�ZF��(�����������p
�J�.�w�V#�
G��}��#��0� y�%���Y#a�b��b�p�R������ ]��S��=�gb���Y�@��d��Mo�2�%�9_$eq����!>%������>72���8�F���K@��[,}�&����t�Y��1�`:Y�+��y��&�P�Qj�X�#��H����[��w��2���(i�f
Q������#�,&Y�v�������3M�H��h�P�&w���6_S�
�vH?���	&L���m����x����l�����m��&p��fe��`X�M�����	�2Nt�U��d���{>4_$T4����O�m?��Ld��Ffh��OS��_���O�;��f>��T���Q�8C�r&^@z�#"���ag����Y�S�\�BZb�7�H������#B�/���z������/��vl�X����gh���-�4C���{��}�%PD����l9��|"C|��	{S��Z�P&�4C0T�L�:E�S�.$Z�I)V����G�9�
6����3�&����	��b���g����������4)�I%6@\$����$kE�U3���{��F3��<6�Hm��3���nF�/ ��Qfe��I���O����-xR���l[���D�S�|�_g
k��$���d��	a��9Q�#����0) X�����f,���LA'l���'F2$�z������H:�LH�P��+��|�	������ ^��u�%����O����f�nu.s�F�39�5��(�g&��.Y��%2�����$�j� ��V���e���N�DfL����e��r����&B��$����h(�q&������L/*QG�?:��Rs�����dt�"�pTD�]������	��"6�?TB�i����EYdp�w��4�/�6d�:�4<:L�����=�ub�7g��nFsw��*���M}�f�����2��i������~��ju�������I:T<���g`��.NR�(j^F��m��/{�h�!L�������JM����>i�
��>���L��dX��i�BQ����X_����mg���|�;=�w�����;�XM����3NBb�{B��r�ft&��k�P�H{=���P���������H�N��Es�R��9�+�adM����@�<��#��4�I#W��FE���������
)��	�Tb�2?B�|Z��3k����v��Q:�I�Q�m��w�x��q�����Jh��-��AH���2##�y��W:d�d5�R��W����Wlr�.a��,V��!3H-���[�$�����o�.��F�����_������a
t=1��1��<u@����!orE+�D���j�'��[ei-��Sb<b���+H�$���l�?q��+9���
�Z��(��fz:.P%u��*���z�>�!�i.�
J3!�����M����3�Q|�.��o�H�����_e��&��9��Ee��������^Zf��%��B6�e:�6�JP��{��u��l��6V�h�Yc�]PQ�=�|Wa�2(�)�������N��?�s���o�wP���"G�+����p���JzW��BG��e�������0f2MZ:�$'�E����2� ����P���4���|�<�8L+rY-R�iy9(iLWx�)T�<4	j
��������	k�Dg�w�(�^������:D���J����E��"%h "�e
A��L�69G.3� �+�.����H'%!w���/uXa==�����0c�(R�������ur������e*AGiB��$��������]��`#�!��h�ADd-�J@?���h����?t���5�
���g�N��(�����n�/l�'��_P~��1+%���)��[�PS���^�V;��E�2P��8�����2���jb�P��2	Qd"��P.���6�A`�e�A/zh�:r����!��Z�MD1�>/"B�-����d]���P��b>��3-�f���w����JO��G���%�$� ~����&D�29�t�kG�&�R��
+��%2%�%��$^���fZ��������i��v�C�3ruu2g_&��NL��������r7�J���U�n��<��\'�{+�i����a��KE�s���H��Z}'k�;#�
(�d�%`I�$A���s���w��"*cJ��T���������,�<9*��+
��.��2��B\�qAo������G������������������``���`��:�K1j�����e}��/���dBd���r��D����._t����%#��	�z���OwzT�'s�F��md_@���!��6���pBa�oQ2S�+�9�a}��#����n-��Q^m^;���d�zU`	��wB�v���W����
�#����!���O�����@�?�~�����|n/3s��+HI�r�q� ���z�:xp�g@u�`��
�q@�%���q
R�M���0B�ZB�a�J��;~��}����Cr������IZ+��{��J������tc��0$������n`�UYx������)]��l'8@:")T��E�y;Y�v�WyE�����G�kv���������F>!U)����y����g��F�]�g�/�vw�bqs��
�9�H�����CV��W�B4�� 0�/��j�p�ge��~B��C@$�}�X������B�����E
�m@�L�A�d$��Q�A����T���%>bS������F>c��	���	o[2���w�����#��p��~������]�s�����6�_%D ��������6���;��:g�W���e�E��cM{���^�I:���e���
� ���|]��!�������f�Y������0'6�+�N���UDlE���V�
���+$���y��5���T�G!�������W�-�q6i����_/�~�U�,����P��q�-n�I��t��}�5&5����|A#L;6B������j�"�)M~��
EX�L&2����A�������9kw#J�48�M+�PX�Mf�R:t{�e8���	+�bA��R(�[�A&����=��b3tk�so���H�J�|�ip�{[�u�o��4'!�qn�M���D��y �q�c�v��:�d3%?�F��	�@��IC���� �M/�������!nv'i�
���D����dw���r��|&D���)Y�Y����c��}���S�#�-���@�c�����+3-o�]���"�\,�p|�9��.��Cc��C5�)��UO� �O_���[��L2���#���B�4!#t�L�$�
��I�qbI$�*����x��C���t�4Rz/�NB��'�@�%y��&�9�e��>��gNp�a5r�(&1;� �zt�B���CU���*��l�C�:.�D��T��tB��JUA�/��8�Xd�_���lU�!��1!�L�X�����H���y�W@9��_��I`����P��D�*t.:a'���������$�x����Z���(�Nh
�Uh� ��	9A��c6B�0	��qBD|���C�'l�%2&B�c6BP2�;}��%M�;M�$ND�r�H���E�g��u�I-�� w�&bIw@>S
0��I��Y����$�������}��{�ZV����.��l~��M���������I�u*�s�2��zog���YTOO���A|R��Mt��.2S�����uS�t�Z�uf�w��jQw�dB�};t=&��ce?�=���I��]������4;362�"O��t���2A�`w���	�@��=� @(IB�	�yV��c��y�YI"[�\6�����GO��������:PMn�@V*R"�t���[V�N��@�����l8��Z��
���+����~��p��/.Ch�F�7��X��]R�^a`��qK���3��d:e�HS�P����'�J�	��C���������-u������W��6�8''@��	e<_>�JHA�^��Nx~��s�����:d�R��1>:O�}q���~���/���y�[`���jGPp�_����vW@�L �	�m*|'�����/W"��z��+���JK�@xG��d41e�&��K{�	��*j�$W�*��H�)�����������H�<%�,�����"��.yG���O�0;����n$X�oJ��&&�4������������`���;DNu��M���j���y����@��R���SIV�q����v/$��	��
����n�d�}i�	���a0�&$��Op"}��x��<��[���&������6�W'�3���	���?vC��J��:F\�����w:t+����6N�c���+T��k�E��ob	�j�^����zF����&�+h�;r�h����Z��Q����tK:J�o������R�K�����)����1�����9�dp���N�Mp�S�%.[�h�f4����;�{��Q��R�\��,�I%��i��O.����_�F������TPuk�^�}l�K�p���|euc�������F�+��,�i��6��-��������2���4@FX`+&�J�[�I��������u�xD��E��K�v�:����`�h��Q��g5S�)�����Gnf@2��Q��F��w��2��t�U���l<��r��#�����XE[ky<9b0\�u��}�LW����I&�1�
{������!��6��R���
�s�I�h0�^f�e�F������L�AJ2LlR���n|�8C�c�G�3�~����pc�w��������+�l��cL��=�K�g.�<��	K�&FCZ���g��AI�'�k���ti?���}�����bH��;0�;d:��R��� �0���Jk����������VJs�
�U���v^����.!���V<�l�d�~�����>���@*����A����kV@����J�
��
i����\Q����2��IYev���Wja?���7u6$��B`�W\���:�@�:^�@l�)O��;NV?���@��{��Y��]	%0��K��;�?�X9v$��s�P�k��*�.Q�B|�]+{/VP����xvK�M�)��M��<"�;�T�,=9G�-)��0�@���_���V3Hz?D.���qG��b�_�E�������|��#�Z�~;-\}�%��*t�awux��v��	.��S �^�C�'Yt��Kg�S���������h����."�9�������3���� �����zw�@�}F��S�@���d��$�������DD�.���e�
L�R��9����cRz�@�����p9=��;���N��e}��h���L?�S"��7�>'R��d��K���2���dbRk��j��yv@i,*����@���4�H���z$Ew1C ����6��`�b�@bpq#��=��Q"�'�v1+ �������h����"�C2.8��<��6A �j0�����)BX���)�����`D_L�dE"_�'�*���"�������;��9����Jn]FV?���;I�?��z����}�G���j�o690A��)&�_ ���%��=�y����1f����WvW�����-��}sKXbA60�8e����-�����q�<����3m�+LA�B��A��;���R�,]����,��X4��O�B���v����/$�'�����<����+�{8�\��������X�e<����r.��GHAG��y�f7_t����7�v��/�Q_�g������dL��m����������0�0���)��*��*���o����c����LZL��$�2�~^;Isw3���B/��R��p�9%�Y67Q�@��YU�.&B?%y��^��3z2�,��%�����]3�����06.ALjxD?�K�!c���P�ubc��b��^��n�Y�*�r������Ap�Y�>1+X_\���TX��������o�����r������%lA}~�{�a�ja"�e}��+�u@R��@�T}�������$�;��=J�u�%lJMv�����{m���~b(,W�E4�5���>r���p���jZ@������}m5I�n�� �i-	��YV��l�@m�����Q��+?��*�a5�A��&PuSK�����L��.�uW"�����w-x��h���L�������J�T�
�T��}D�BZDV�;	�X���u@^~��d�T�
��	/�J�����9���X���}x�;�����-p���H�������\
��9�@�(Q��@�RJ;C{WK�����v����O�(��P@�����rzxR����b���q��
-����{d�A6�����!h���6�~�w�@���@!���[�����2�`~j�C�*�ci!w�\���"%�)qme�J:�-C�w]z~'\9���zA�"O57��M��fvE	�G�
-�������	�5���1���[�3?�2T3�/���n�`H�pW��s��)�H*����}X��1��Dl�N�^S:.(-��ZMw��_K�85��R-��l��:5������7���f�O�	(V?�@�+���*�9�u%AO�R��/pg:��4������`@��Y�A��jJ@Q�S�6[h�[]9�>>D�8P�+ZS�(�@����v���x�}��u����4��:���5D����@~�D��!�BAjD/������[�&��m���<	Q_�L���0:�5�WSge�#�$Z��P�v�b���C���v2I�|�����D(fy���m�I.�R���N�������z�,h��
m�����U?���RA�mb����Y�����Q�@������6I��V���p ��5}"S��D"5�D�M�3O
�@�S5,�������=��'�:N�R���P6RO������=<�f�a?����y��|z[2�+��Zr��o�������I����
B5S	��%m-,�p'-��� �;��T�Rf���bK��`�i�����V0�1n����/�[�$�q���{��g�����H^T�g�i&�s��B���?�'n	..N�!a�?�q�I�` �����5����i"�w3kPIWC3W c�6�Cl��n���(��.�f��
QwiU=��B��X�4�^q������v���QVe�[���%����������~�T2�K�B�����,y������-pvh��bK��N�%mf�6�&0�s�"h�����+�L�y�-�
�r:Y��i����O��2PD��f�@-��0��.�1O`�c�Q�'0�,[	)��%�b@~p��V�G������F�?�A2��V��A �S:
�U.�?��F@�������I!�Y3��v������`�9�jA�Ka2������2q�5�vI������L�@M�[_�K^��:���?�q�R%`pK��rM�T7	 �Jd��\�3����t	k3��=wKRR�}��6�T�����I+g3 �;-�������b��T�)g=�8����f��bW��ka��|��.�&�e��������<-���n�|�"��
P�{�]+Y��7D���_��z���lj�' Z3��{��l#��f���r��wP�*��6�
}Of�	+��.���h��@6 �����Rp�y^3	���r_��E2"c���m%�&����LT�%�X�@����XE,jSjI$�Q�e�d2G��3Zb�bD �f:����������v�������X��?���_X�k�_� 3��|���������V=�dv��cZM���������f��7���d�8I
�H�O�����A3
���i=f��%|�_s����7{�r����O��j��+�@{<�.0dv�hz��_���>r`�ihO��;�e">��&R9����'�v)�
��Fa�d���%_ST�*y2���FIy*�tA���Kh��H��Nt��L��I���(��b��C��"o=��Rv��!$U7�/�'�������_U[��I&!�2�"��!~i���*'#5�M�d����{�R�����3cd�����7C�!s�n�_�]h�����%sJ�N�������f~Q����a~kN������B}=)v�;�O
_%���u��5DK��2$�"iO���qv-6���+�-Q���T��Ek��!�P��px�n�(��@��n�Bz0�m�Bs��D>�'f@��"v��E��n"@����=���&\?��E����3+��I�������Et�����%��"ItJ���O,7�]:�3��Y�,++t�%Ax���s��`Kw���(�|��{0��e)�w%[�3:z;(m��`��[�a�B�vfk
�Q�3Yw�pBy�B	8I����AA���`�y��%ITXdi����_�M�TD��� �pE�B��3����:����G���f��O�t��������=�.�G~����T�M�f{T���c$_�P9*:����k��818['��nd�/6-QY?����	TItB#7�>��.cX�=;��K���J�G��-���������)�ut��1�����A�����d��
M;�[����,��G3��p����p������;�qI����'�������r�(d�x&��O^�I�I��[S@7�~��@���6�;���o/��8��v�;��`+O�0	
�o�)�w��a�r����=�^)Y�0�?������z�_��\"����<S�uq�%����\�q�������(��o�&aut���d���T#&jJa�����O��*d���7����LR�	�#���\@��q_A�L�%��q��x|�(V�1	#��!|ql�5���� �-i<����Q�&���8���a.��i9����<�]�a
hup�%�nB'�d�Q�-�{2�����5������6�`��"��(v�}^����itR�o���}�a�"l���6���M~��d�}y�p����#��!�L	���n}Z�N�*!�
VM��9lW������7#���`N�iZ�*H_�SB�g���6J��H����b����*/�<�j(|�N@�	1�)K��l�ND��E��d�M.�u��} _%��,�$���2F�|m��hK`3u��)�S�4�c0�$����5(�5�������+��G�i$g��B;-�S�3rK
�
���bXDoe'D������#N$�r&��aE"������a����N�Q��bJ��C@��{�x�D����1��O����M�d��&��c���
� 	�<L(9!Yc���7���!	&�bT`���u��DTUt�u���I�C�l}tM�(�g�A[Y!QF�0��`b�H��.�p��JV[c�|����l�5&����r���!tBw����A_��$�;��?x��������Lv!T�Q�n�"�?Uv������n��_�O1�I
 a��^��F��!(�t9N��a���;,�7����t��!v��
����q;ziV<N��I pQ��(����5��-�
�r�]��d�,�L�c�HI���%D5�kx�+�9��LJME-�5Q�����N>��A��G
',O���M��DJ������{�^#���8rjBTnw�G��7l{��T������8���9lp�D���%Z]
G��B"�����h�@!C�����&�����nsg`)���(j4lg�o������L�#d?�Z
g+���UI��*D�
�<!�����$=�YP���g?#�F(N|��q�C���2�
t
�8	v>�9h>^�=a�M��n�?H��)��&Id976���0����1{��B���m|
Y�\�����vp!FP�,��B�I�%���D����P<
,�n�S�t��:���p���������9����6&"�Y�W�7Y?R�F7���G���J�U�'}�)�`����������t$rS�C2P������"Z�� \��\#j�Pp��R�WEpHd����������9?����8��N�7��=_���C��hk8�'�O[���xE�d�-�)�`G��%�)�p���Z��1�l�8�e�
�~$o��[v�Z�F������
���9�f�#n�h�t�x!���x}:plE�S/��B
@� k���v/j��X^�A"XtZ��ybb�2�^'���79YKmc&B�>Y��W�e7gy� r��3�������� #Y	
�F:��&������H������a�\3����:y�)D��T��,���A#G���?L#����D������*Wl:�	�B�Y�SM~��n P�g�Kw��k4�0����3$����<�m��V���7:�B��d��i< :�
�����
�o����:v'{2A���G�p�����By�����K<�j�e�2�)��L������|����+2a��4Z��e�I��S�~����O��#F�T{?*���}�i��D2�]L
|��M��&�-�/�F�Lcu��������O����)���.���Dr�8|EO^�|�`�����Zr��4�Q?f�F�m
Cj�F��|� ����l���i��tk����6���d������Nj��EaZ�m��N��6"8j�����'�L����.;<��a#K�y��h�EP�<��|2��R�w��O`��?f��o`�a�R��s]��������Hf�:y���d�]��pZ$H�������;�D�����a����Q�D�GK�h��+�w����<q'w�������|�OjW�p��;[l%�E���u' !�z='��,���]D|���?V��G	��5�D����m�;�_w3NX|�%��\/���j�r����F�O���{��/-eb�����	3��c��eN���,K.�bmy��$c����W��[�$3�Zs����3��jZ�z��M�"��I���N��K��yao����L�������ZN*�'e��0����6@���c�h�/��9�N9F~E�E�U��V��o�n���d��������N&Z����mB�t�!\����md^�����x�,@|w�P��[������.p�`Bx[v����� qe	q����?���;&�����?�d����L�;�{�KnU���D����\,a������a�q�0���=����N���~Dwn �(�["�nG��h^�9�{�+���AK�$�kXO7�����	���t��Y7L�U��yL�B��r;�?�~������������M;K���0xv����J������>��Z,��X%M���c����K9K��a��n��l��Qxa��	���'4�%<��SkV(a^���d��w�J������=O�c�p������)L����
L�	��x�f��y�����L�p�����Yw�
5�/	��c��������w � ��]��F��g���3n�t�T��]������UHj�d�5�?�x���LD5OB�^���;0r�\���������������xho�&c��r$3L�~��]m��sR��"�����X�-u��.!�x��:7&WY�>��?�6�����_orA�m��F��3�n�����"�&��yA��	[
���D[\��c��/'�d�o��o��Xg��,��q����2���~��_�?"!��J����IQ�'��6P8x��@�����Pr���g�����.����O���<��j�YH&�H^��1-���cI�7[��Yb��0MV��:	����l�F��v�A��������T<���f��d��L ��r�K^����9i�?�ZFP0qJ:�[�@O��m@����-X
�q�����35��>QN�E�6�+	.���LMA�Vt���0����o!]v�=�/������$*��F?"�D��m� ����{"(��e ��Z�P#�R���(ZlP�P�`���l��fH��8� �Vl��u�+�]��'"�`*��q�^*���d�8� ���v�����O��[��$a~�(��l5�O�l3��JB���
��g������;T^f<�dE/����@_����M��W����|��Q�aX��l=yej�����M��2����X�m��5����X�v���W'�hn��O��{&�^�O���������L~�r��}����}D���,�>�6���`������^?Vn����ta#O��^?���h}�~��(E�J�4���~���������
���C��%?���M8�tv����%����q��>"�[B�D���z��>���|j���^V�PJ�Pp������v��pW�v�1�LwReG��d;��Z��ou��E���S�3D\
�swwfA^;��__���dXF
���?=k;�@-`����ao���/>�3���������;Y���;�����>���K��'r���St���1����%K�1�8W1r��H`�}����Sa�_ReD}��G�����Qg���3=�{^,2��$>��#����I�Y��S���)#��8�T��I�}l��4��z�tk����$-�cKl�;�q�9�\E���X��x����m�6�"��y����H��=~���Q?ag���0�����Fh��;�5�'�g��`�
{d�2ey�,
e:�vc�����Wt��"��d���P�xBQ:�������/�� ]L�"jb���M��m���j�����q����=v�HFK���Z�2��>.W�5�wO$��A��23yU�l�;�+]��:��o8qw�o9�e4�En��������0���|����8�����V��h�t�(����������\����H��=�i���.�>��=��Xc���(nGM��,��u���^	��t�&QM|�i@���<~�������UC����~�y��=K�����z�������
H`��v��Vj�����L��z��)�V���7������Q��G��5U"�1�����*pvt��+�s	������������F��.c�/����;\_�&�)�a���K�N�;�A��^������`���_��dQyo3����]���7��[��)f�QR����\Z	
��H���,1f����'gL����-q�:6�Wn��w�$3M�*����|}�L��J����h�����v���U��$����������G�~%�D������Z�V<��GU���)��x��?&�5�v�3������}}�9l������m���Q_�F�zu����
EiA(DI���v>
Y	��{p��G~g(�>����q��/��d��V�i�6�R�n���A�]��OX�=�%?�����5L�(QI$�y'�"����Q��u��e�����DE_'��#0 RgC�9����h���~��4�����~���,����~�xP�}@y������Qw�v��|y����D
��4	�5��A���"�#C�l����*������`�5���G��������u���49H#�!�2�rmF��������jf���:�Khc��OA��h��y/T?h�'�`���P_7�u�����������Hd-w��x������xt���K�
���<����������6�g��;�@�C�h
:�w�)|�O$����P�/B�8Va._�d�{
;P]�����N�%�Raw��w�XBr���a0����r5��;H� �������v
��w���w�ApGj;
��;H��<+1E�F�����O�<��g(��	$|���Np^4�W]p�\�gN���BB��3L�;R�w����-��U�X����Bp>��tD��z7�l��3�D�{
�6�&�<f;��~�^�Hr�$�^��Z�1A�^C���T?��N�
4?�B�v,B�?Y
����8�+>�����]��B�(��H�8�����t'u�K�������"��:�6q@����d����'E�e��'pDPxvt����q�w����n�1����}/��������E�o�J�	 F���!`M����H�  ������d��B��'$���46���3��������bYG�0�y��kh�(xw��[�d3`G�:����N(}��.������b#�3���� M8�������o�p�+Y�=o3�>����^h}�����k�g�����*�l���x��H�|4�(�7A|W�R��%�������C�N�o�6Efg������((���6��'�zd�#y;|
6�[B�Rk8|�:�f����%��,�jf�p/�N�j�f�^�xF��m���W�;HY9YN�9�v1IN�&����F�qje`�`�^^f���zy|�����"�(N')6����uG��E=������`�����=���������J�
���Y��Khf�<����+����(�
C��V�'��'�J��6O�,�e�=u����du?������O6��Dc=���A���-�����g3Z�@!k	������������I2������ �,��^�8@� ����������E�7/d�3���+<"��H���`J�m��I�
�b|�y��%�$�@��!K�w&���l���&[=F�il�@Q�4P.a����������e���B�A��H���o��~�#X�	m�d�Ms7c�����qo��Xcp?�-��u'����)��:���87`�1���cg�Dp'�htH+�}
��I��`,#�jY*������[I�<�����P�p��g�i��Xf����&��?�v���A8�->�����H�F���Ta����k~aPV`��3_��|_��d}�"���joRQ`�)z��(���]��}H��7gnZ�/��fu��Fr�)��'���= �u��jem���e����\��f\"q�o��0+�
�	�"�>�S�G��D��WiO�6����Op�v4��&~I�c=��1��B��P�%����M�C����`k�N�B�^C�X�N|�s�,���&������bEk���p�
V��
��x�M0��|Y��V��(���|��l���kB����=B��U�����)��I=#6_�>	G������M`�n�|Gn���h����&������Al��I8����Y�m�f���cN�q
U�I�d+�3�%��$V�g��q���]�~���l�{m���z��C"������^M�'���cUJ�=c1'�������QD+��_�7�O D��3������O���
�*H�q�d4w�V7�m��7"�[uh1�l�E���K��&��`	��j���UA��N��.�5����Q�0&�O/�\����y���b-�����.�{�|�1�"�MNQq������m��X-�%R�;��������U���`�����"�����lP���k��R�`,���E\*n����-�
4&�j���A3�D���$c(������^CG�[�&����t3�K�A���sQ�����A�,,��T���i�������!&+|m:>tLq6(rW6��]��tTO��	�@A/2��\�:��C�O��������`�n1�/V	'����5�R�G3_����U�v�@��$����dW�<2���;���'��PZ�%��@jo�O9��L��m���E�k��f���sT����"d�
�X�����-�{��2+ {���?�����
� ���(���x3v�1f�����$+0���3.��������`�����n���A��i�������}*?�B$��;H3k�s����!�����������D���s��
wh �Q��:�8zC����N<�K=��n�= �'�"��W��Q�l���V�����S��0�]e�#����Cy��S�����4�SwVu��f0d����!=���U�� ���z����+0G���9~�w����	'��]\��E�_{>�������bf���r~�A����u};&q|�'E}����'��U���t�!�+��`,��DK(Bb�z��q��6Yw��zAG1r�".aN1����`�{
��������uU�����U���2��5����=	V�C9��S�!��2=��������L�;�)V�G'aa(z�����xd=Q-h�T8���Dd]\A����}lO	�4�#�%E�^�M���!Z��8�W�GX��'?�=�+���}o+�B�1`���0��!�Gm��	H37��N�I"���,����p?i^�m�D��f���&�U3^��|�hFpy&,���c��� ?gU���MX�44�pc21k+��$Zs����Y�j}���|@v&�<����!D�i�R�Y	!��s�����������rT,����D�[���}���JLb�hQ�p�����p����f�w��)x���9��N�N������Qt|l�^��`+<�jbT���
�����|�i�����5��C7ZK�����f������i���_Q��|i�����;���D���6\��[��]$�w,�� }���x���!�F5������}���NF������oT��:�>���bV@�&�E�\�l�
���i

�zH���[>��=+��������-��fS���Y)%�������!�px�d�s�2����	n���������i����s�m���s� 0d�|I&�V[a4����Xo��|G
�6�
�7\��qv��W��C�:�/7
0n2/�&��h�q�B=��i����I�BX�	[  �(�-z``x��3�20�	`�~��AV�VZ+�x���x��+�)���T�5����I�q�FZ�;��!��S��+W`O�#�4�!�Xj�q8:����
D,��"���i� ���5;"R��<~�E�%��e#_�h��!���.>8n�@�kc�������+	��K�A�
JP�N5n�`4����'�����,��^��[�fFl�g���@G���Q�=$	�w��+���#M+�rN���\��N_��5-��S�9��:��i
{��l�8r��l,�![������4AP���ZT2��Va�9[&��B��&�MX���&��������@���$�H*���P�LS�����$���4_�*F#}4���cD|�S���'���}k+ZL�U��G��2h�3|�n��	���xO���.����Z'u
��2���/��r����6���`��"&C/�{���fa��U]���$����-G���X%:wA���"��[���a8�����Qw�4`�W[; ]����;$�j���S����i��I�d?V�����W�"�[�K��]�S��d��(R�ucD��Uw��z($�	���xP���y�R��zP�$�������x�Dg~��9^2�n�C����ffxv��R��z���NU#NH��"�^oV�2���F��`D�I:��V/�5�-��O{���n��l���3<v�C����mc�����HdA��(z1�Q���
�4[������"�� �E�I�pC���6���Zv�vQ���?�����J���Zv1�~b��1V�
�����+d����o��=�r<r��l�������x]�����9K�]�F��.���oE<�z�
X��?��}>����fM����R�2Y@���k���^#"v�2g�X!l�I��i
%��;��E�M�A��ZM���Q��>��G�uOk����F��V8YMg��y>�6�D��G��������T�/�>��h�����c ��\��:��{� �3����[w���	�{�l}��:��H�ag]��2Y�R�@�R�!>Z0�*$A�wP������$��G�->K1w�
��7&0��(���������E5@y�z����\�i��n{�E�m�������*��*Y#MPRDt��{���/V���?CUN���2_"�k�@����R0��&�@ySPKvlx�7sl�O�$��/�����o�Y����<nD��yK&z�B�����O��P�[�d�g_�$z��e?�@A�K�@��<����<������D����9hFg<�M�r����Bf:,_��0j�����J;�xp=�.,���
[�ZdX������K��{a�(����z�*^�cs�q����y���
Fq/��%�:a=���8�E������b�x��W����^�����F�c��^�V�OL^t���0dOK��h������,��8�K�P�{�+y���BT�[Zc���\!Ii<��P���x+�cVCDU��f)ml�����N�G���}\�����|4��w���A2P�{B ���H1�!md��y��F��<�HGE�0���@�����5=*�������-~M{�d��1�F��!$�wF���M����Q�lt+��KU�;�@�����V4�����E
�at��l{!���C��������F�n�z���1G��)d�����8A(l��f��j\���o$[��x`�����Fc�<��Q������:9��oX�o`O
�h�nH���Z�D��%��U��c4�9��w���u���
&"�U�pbC6��l`��U5���@���S����k�C��:��X���
a��l|%)��#��j�O,�(�79O��{c����*�"k�a�b�T
=,��Y���z,����3��kc���]v��C�V�ot#�+)��S��Eu>�\v!�����3"��Jj�@$���?B�=�DD�!���/���dB�!���2�f@OK2g��Y��x����� ��+L�+��d'���1�6�0��K����xd��W�0dW��&D��ve��*�9�@9rKl0��]^V��`��}/%����q��1��D����J\�Gg���L��F��"2m���3p�G�?�d����p���yR��!$����a8�G��!\y�:�aAK���@
j��JDW�N�� R�C4�{o#��~��E4�)<c��&��+h�j���N��	7���c
���	�?"
����X�H8D���������j(�As��#J�|��uA��Q�9rd��)@����K`�������wfs���9|G��i�&�:��?���/Gx��;��&v���B6$�����M�;i� ���4��:�w������iA���G�M�P�Ad��!�{�/>f�0��Y��p���u�fD
3_1T��.i`������/�GF5���J���'e������V.�;D9�ac�B#�b����r-�W���"*��
�*���m�������>#��L��h��W<jd�ESx��gQ8��g���������!���AD/T���;��cWT�O3E]�).�������dq���#�!:Q�n��n��t�p���-��#jN��!���=m�lY�kPC�/�-��'@/�c':bd��'M)�B-`y���9�i�����O�Z����\'�YW�7t��)�T�-e���}�xZ]�0�L�����.��[4H�:�E��B���0i�kw�|.�d
� �dO��E/&e��i��3f����G?T�$������z$�[������	{�f��R�VA�lx����p.K`��C�
�L�,�h1Sb�L-3VU��`y���>�Y���7�dSXy�_`��������2|8�h�g�F {
�=�a���$�!#�MGMKk;��#�i����M"������ ����|d�U�p2a?	�hC��z1���zd����gjs������4	,��iw�l�m��7hDvy�L6����JT�wP"G�)�C�����t��x2�*�qd
8a���=���3QF�+%+��'�]*��Z�N�`tY_�I��Y�E���=Ccnf��q�SV�<V�=1����}�e��6��dYgY{A3�����D�N��z�	���������fOn~��,AAA{2��#$*^,����6�ef	�t�^{[�U��u	�~d7�����R����J��/P/fc�V��&c�-eQ.����XaRH��YV/U�}���G��U�_({V��.q=����v��Cc�%@��o��6���
�~o-�G����j��!qEz���jO0��|�V� -���l�b���"w������`YWJp������C��8KXF�����A���#�%=b)���&��
�E��mR�~�STZ5B�Vs'y���%���\���Nv�:J�o(3X(��#^}UX'C7��ut	QQ�+ $G��%���rq����=C!D���l�N���@�x��D�HZ��������m���T#z8��R��r@u�H9��d���qyuKo��R�E�]f�Z��}h4J�wY�e��?�����![�GQ�D�_�w�Nc�<40Q��*#,_3)x��0#+��������)���S���.�p��e�H=*
��[V�
���t�\h��>{t��������/� w���m����e9�:;A�b
o�����q#�^����h�����.�� q���

~�F)�}��>�:�1kG���k(j�oY�1{U����p�	�]tg��=�"��Z���R�d �Z��cx���������c�����'�[/�Y.�r�5
�����7��)��4�v{2����Em���F�Ur��;��\6�k��F��%t���<Qlu�}�evq�������<�*S�%xCjF|��������4��Orv�X.;L��e+��=y��H��b�����i���������/�5 ���B3�]G$*�@Cw����z
r������c�w0�X%V�52�Y�`�����e��&�I4R"��L_���E�P��@6�]
o��B��Pvs����%?}��5��>86��?�~��8�����_�c]H�����M�v|6?���&-�@��B�M�<y�`�rM�`'������PH�`���������o��E*��g��C���B/���ff���q��5��Y^pd�F����d��`�e-j2dw,yd�S�Wk\zOV�-@#R�l!�
��,�c{%7�un2n��i�`��
,_��y�l[K�e�Qf�|5�U�����\E�V�_a8#���U��v�5�w�u>����h��� \�Z�����.�~N
-{����h_�E�~����]B"2�G���v�la,<�A��}g�%��.Zt������[J1�@�5��`\�3��v`������z����~�SM���5|�:j�9��W3Z��� P�L���L(������h"	�@a���)k;&����y
���5N����������nm�u���G��h��#��3<am%+��m��2�-/o�9�na���9�I=jgo]��j��E����!l�iC`�PLS4�Ot�c�4�v;%[�VT4\�����0���w��o#�F�~��n��1l�@�`:��$q`��ty�����L�lQ�&g�T\��9�5�Y�;��`�)IL>��%�"�,�m��
(���H!3�l�b�G2�m��[t���$x����\�]�
��������v��P�F���|������Z��l�� �AEGr���2��1�������t��� ��`�t� ���$�a����gxZ����	�������Mz�@��n����n���j
szZY����5��	g��E�3�H~(����8R����>�2�m\�{`E<�"�[��2�����p�[}�.Y�c���HQ�
)�	g�	�
��"|pN����n�c�ll�X���B�<�E�����(s�B��"�w{��8��<V�%��q&6\��F@���)��*�1v��^��v�H���|�H�����D��	9Z�?��$�����f���+�y�i�8���B���E�]B�;�������^�.�z��Y�\
8�QAu<>��h=B
(C� ��(+f�>q `w�/
��F��cA�ew#���T�F��Z�*-'t'=F�J�(G�BVY�G���y�M����
�;��#5	�=a�����_,�R�E���'t���>B��#pA�B*n�#&���n�h/g�\��z��E#5�$z�O-�<���a�{�+�x���
���S�>`���i�����r+��r5�f�D
���[
q'
W������w�V(��h�V�����T�z*�j���M���b�
��*c�I
; $PT���6�O~�����A���
�G?�1�������T�Wi������j�aA�Y��1zp��V���g�\:���9��=B���(����z|g����f��T�G��|�P(+;|��y���F���7+��,��Qo���N�^������*���0v�Rsf�
[���k�o
}`�2*����}V#�7�
h9��f�����A�F����is��������XA�S"A�u"BTG5���!��P�����V)K$���^Q���������Wu����p���xe0�YV}�����O�w���ii��q@�ST����8����#��.c�,*]��S=�q��}�D���
b��w�-VI5�EY!������%��m7Y�&��G����I~W�N��G(�����>��.
:�i��sO�(���e=�Q�l�F����1���Px�E_|��_��}�8r����k�����y�B�7I��ZZ#��41#��9��r
H�O�,��^I[!�6!����
2�JL�eD����k��-`��]H���j�
�_cfsDF�
����bt��?
����tNv�� w��R���lX�kh������(~>�<�!�Z��Y�\��oI���C��kh��.N']�?���K��0��p�����
�
�,��A�(gI�E��
����>ar�f+�2������3P�����H{��N����o��
�q�o���I��7�����x�zo0��7�Z�h����1��Eu��_w��4����L��X|�D�����jB���`�=qa�����4~�U���q�	�#�	�]������8��	�w�%��o���6+�����&��g�l1mP���o�J3Y�stb���CT�����:A���7F��-&�n������H���[��wI��	����"��UD�[�w�=�F���5�x�6L+�d��^���X�"�S���U��s��,��R�DP���3�^�H��y��}�vYR���a������BW�����
�U��C����*dt�[��{bvs�6u|B�����!f��4��{�������E��%���Q����e�9[�l��WDM��$���g�U��K[n��j�'�������A/�
r�ur����k����d�qX���:C�,��22
��5�05	���5��%a%�������p��;����i���px�5�2�v���R����C�?j�_�#}�w�D��=I�78���qL[,a�\��Y��-��w�~|Q��:�i�6����=C�A��RW#�G�x���������*� �}%��s������=�G��BM��k�K}	��
Q��U>V2a
s���9sYZR�W��%������<�F4�nk%�sT�:�m�h�`�`B��t4\p���}=6)��z���g`2����'�?��&]�h��������z���CJHt&�\)�&���W"��NH`��$��<���R5�Z��as�j�f�;8Fq�8���J ���'>n�g.@��)���fTa�+���9��������������J�n���V����wT��b/��f?���������k��D�L)�1�'7��])3��tV�����H=_�0�"���%T���r&����^y�w��n�y<Rh�X/qW���#�dvB����"�8$��{�����\J����H�<��Qy�������K������E�CB	����5:0��R	;z���\F���f��r.NggS�����s?��b���:�u;���C""+E �\
���"�x���Nz�����4G/�h�K��	_�Z�����k�=��-�3�-U��/�������n��h����n����,'�~*�
����!�� t������L���u6\ }��K��Ya�oDV��?}
Ur��d�ki��e���=�N>����i4H$�j��"fg�K��qa��F8ZdM�"�!����m!�+��y�-�����r&z���l���~�I��_)����jk��kX=H��}w-Q�m��������,�W��Q������eF)/�
�����t������������������o4��>rw�pG���,]��Ba��ff���2����t��<<x
n�d����U;k`V��Rt���&�p,�����;��*J�v���H��5h*C$�v4)�.d�s{"=�j����J��!���������{#��/��nc�!�cc_X���FKCx�r�}���!�xW}!�iiM�@�b��&�@���h�J����(������x�Lc?�~v��c���e,��z�[�@��mw�?���Yx{���(�������>�%�_wO���v���Y�5���������&�
~��zY/MR[��.�9Q��
w`�����JOD}���L��;�0"\�^]�A8�w@���f�����sk��OUQ��+�������C�sX�:f�* ��4�*0�r�g�"�6�S��"���
E��v�C
;i�'�� ��]�K����E(�I��Zl��
-Vl�W�,}On��h�U�G�5x�O�}���#L�(U���?��/V=��v�b�
[�(eP3���U�����"\��4(
8{�B"o�R�4TeH�xWmV�cR
������l���$.�|��MVD��7`�G5em�z���8�N��HLV��aY�h�\*��1����-�o��	����TG;p\��"�%�&�J�]�`�
��j��y)������c������4j�'�5�V-r���~WX��N��f���/���g�O�)m��Xu�=}�$p��;�3P���`�I�t��N<%K6��og��y��F2�pn��
��G+�4}%%v`��������EfxGE�p���F�i�N���AO�I�T��)M��<��}��d��G-�j���Z�H)�^�V�G��j|�^)�H��X���~�"��
z��({��b����h{"2L}��0��7�2���r2%�Tk����z�%�-�5j�W�
X�a�����;�,���`�a�"��T���?�=��07yf5���x������_V1`�����LB\w�������ox�v��4�
�ta�V����N�9l��(
��H�]NV�%OV��)��	����j$��B�:����+�v���bmJ��
�.vc���,�����a[����&��vFD��6eE0nI@���	
"�_��.��)eG�a�����&\����,k�5ATMh��23B���`V����%2(z��.H�qI��z�M���p��H��/sxx��(�0�>Dg7p��s-����}/��z�('k5��	�Y�@���Mti��"�$F�����N7	��0�	wa�,��t�$�"���2���@|��+[�r���H��An:�x��)��z�T����X&_�l�
H�[�I�����������kB)a����\d�]�����-������Z�K��H:o��2�'h����Oh�\Z3>�'5dcT��	��J4��T@�s�6��=Q��w�����z��h>>�	fi�E������sA�-L��_�9F��<'���9��w�����w��l����SF�KP�J���������������M4da_3��B;�r6+�?�U��l2��C#�Nf����kt�l�"+ROV)G?��8#\#�D�����}�hV-D��L�H�j~b�c��
��"-���Fy���0��2i9nf����v���J|�`�!��7���������ytZ���������")z6F���H�SZ��t;o6)	��*��4��H3:@�����]�M3,�Z��\�+��]F�`��9|H��}2��r�����Cgw��4�7X� 7��u#�1[����fg�l�8�4��BX�`�d�m����z����1(���������mg��	=M���=�
�X�� ��mYV����������" !i4���+�b:��BF��m�0�{���=���*[�_%�-R�u��v���h���$�<�h����#���E Os��-OJD�l�
���x?���G���
��z��`�A�G���%a�	@P��l0R�d�'$k����\�F �&���P6����?�]�i���$���FFg���H�a��Z���fbcy|�)/����� `=*����P����)�����H����5���������/��+�!L�"�}�n!:xw�
Q&b�������1�����%	X@���Ty_;��:�t\g��;	���x//��A!�vy3��;��:?�V�,�g;�������]@gVN>s���������PHE�����(�OC������Jd��.P��^a�6
;!�$G�V_]@CF���@R���~���������1�X�m�9������b��M�ue*�sw&��:�����l`Y����������)�����.�a���4h�2���J�Q�2�����/ |�������
2��Y4��4L�V	����������ldE��P����]���'�0���$�@g��.��JU}���B�0�.����D]�n����qCk������rB��]�0#�����{����#<6h���d����a7�@bp�y���l��$���:�YV����^nyJ�B��'v=�B$�����,�R]_�����(�o��NeV�
s@	���y�U��'�'A��9zwA�g9e��Cd�m���������N�"
~w6C�)B������m�N_���^��K���}�k}t,BI��@�d ����l:��_w�)���:�������]`��_S�>F�:�_��Z�B�!�����6��	_ ����R/W�N�M�}�`��#��nY�����9�2�	;[�<L{�e��0���m��������P� ����E�E����y��A^�+T�E�vqH�������~���f#���"(��!_������.������|������R�y����J�8���1����u
b���fP�aqK�gU�2p�����:���?�����9[: 3x`D�e��@���&��G�@E4Df"��1���tp��2B�y�5����%y��u�NU��t���Rd�R�f$'oPCI��Q�!RSW��Hg�xZDV�����"���WR#��ri�?�<KOz��#P�l<>�Ro8����Yl��S��6��fe���&0;ug�F�_8��Z�C8�����Q�wE{��4Cp�D{��4r�o����}K3x,
����N�0D�n(Gt�5T���:�YD���N��{#������A���]!����;R�Q���#�{��F�u"���$\���
l
�>�������57�?�v��"B�C��C8�p���,�w �&a�m�x{V��;
���Hd��q��(�C����N�+Gm���E�BOfB��tO=X�u���j��z��f�3��F�oeOzTT�T�{D�����	�o��3|���.���}��?��=(["\o��@���k�z�"Y/5P�0�.z��*��G��<hRX�RZX�8)q��`��������n��H��Ux��n������ b�����h�PA	<N��?��^��#GO���FF�<����q�����%�+ks�i�~�������|��h��
���\�2	�����p\T\RV7��)9�A4F���/j���T	 �������?�5�gq�?VY�Eg3��a�D���`���~i�T){J����H���^�@���vkv��	�(,���h��\���z�����E��_"��!�b��L�5Z��E����}���������LA:��(��������M_���Z��C�[�g�B���(5���l	�su��;_��v�g9;z�e�N�.�(�g6
a����
i�p��-0E�?�6��Y�I�:5�f�����g��3����C��/f��'-�=R�5��D�;S4y��)R��%
D��&�e>��%���P�H��D�F��)xbAv	���d�&�|��A�+�#���R��j�v)��O�Y��1�m��x:�A/
z{v��Q�a�r���}@VI���C�$CAg1����)������8������h:�e1�p���^���>8��GNG:\��y?��};s��`�8m��C�$�V�DA�o���=|�;"�MK%0s����2���f?��9�Mhn�(o(����������j�6��;dD���L�8yiG��t~t6F4�O�)&x�Q��	�"O�h���:�9����7'��e���.t�����=a,t����x���,�O$��r�#`u:��dG��
W�������:4Laid��t�C���,�^0�m]m�h�20��p�����@t�e�i��$$D\��f�42��	���<�T��A���M�7,��f��
�]b�r����F��	���pBD�LF�p[];�����E����;dM�Z��=I6\[-,h	����-����D������g��������;Hv!3���9��/��/=�:�E�ncUaY[��9��t��e�.+�
������M���$����vMYA3M��E��z����z�N��8�k��(&l
���GtNz��X�xW��e�0�2����8���[���'Aa�(���)�pJ�*�M������Z�
���o��a��	��i�"��q��m54��%M�$Y0����e��[G��`�]wD���v�.�rs�eak4f���i6��0��F[������4X>���`;����FLKL�*�D��>�{��Y�������Z��;�g^��X8=����N���-&+
"�:���������,�N�+�\�u7w�[�u{�S\�
�L��8�
�;Y���>�6��/���!6yQ����J���@��&^pG�Q������p	1PN��5��)����"@�A'\��a	R����f[��u�E����9�f/��X��;t��[x�#s9��2ryY�����g}�U�]n�dc���k�K�@�lv�P):9�jNy�o�X��u�������6�Pj��?5�h\�kcb5���%�`CS�,��p���F"�2@� "�.5��y?�����S�Jm�����pT?Q���u��S�=n!���p��<����{0��3�Y@+��v2���*�2����?���T�!1�=QOz	���oJV�������,�'�K��{��^�J��,��Q�����3��%� ��[�}^f��j}	)�"��Z��qK�A�K����h��<2|��hDj�e}A8O���P�
���2�+�_�1�?��h�]����(
r
���A��a	@���D=�%T�E���X�g���u<�&�pI7S�eO�l��6a����	`���$�.�St����h�V���
`ve]�e�$/�,6s�?���)���g�gj	������d�d�0/{n���VJ�?`=�!��a
�6s����T��8�Jd ���@�A����p���^��	�N+LV�����p�[w�T>w�����|�������c�Y��v����C�s0��zQ�{�t�e�=���2Z�@3���L:2^oV����Fx���E[..k��������V���F��;Q#w	�����E�m���/�������p�n�.���@�"ieu�����(�d����c�Y{���m��.�B����gR���W�{(�HhK�@��.��������V�u1�
�!�e���b��i�
Pl U��("�ok��b`�����:����>�)hSptv�������O�]Ema�F��L���f��X<:�����Tae���I����-�c�,f;���*�p���S������Svv��d$���� ��������-t��,G����mw#,����-d���4zLX��(<�4�}#P�]�Y]Z����8[�@Fb��
��y;�ZOC����/F��vx3�������R��
j�"��*o�����P������\f��U�}!��m�[e����J����*������RW��/��-���7�9������)�o.P%�����u���:��L�)�� ��#����FUEX:s.�����)(�j��iZ.�i�4}f��F0��wo�I����Ys|������5�E�v�B�D9c��vf@�����>f�6��~E���^�I�_<�<dF�6m��I�&�#\p�$/9���7c!z��W 
�V4)3�z[�a�9�I�~���@Ueg�F�MB`1l�\���i�����J�Y�O��5�F�����#f��7����h��vvm�����H��Y�Qn��(����J���Z���"��V�g`Q�S�P�������d��{Yb�mnA���?.~��Uv,Zvd�z�m_D�������`�Lx���P�C�h4PK]�N6����"p'�����/>0��D��M����!��n��pe��q��kU�*P�e���R_#����!�_���5�o�.(S������N��n���:%�f�Y�{e��i������f_������8c�lq(��D��u.���qvV1�?����jvh9���^�E\��`�z����,�Fu^�pq�Z��6�
Y�dG"��w�<��y��R��������� �\���|(V@,�+n����P��~�.D`���E�IF�=o�sl��5�B��@GB���,���������QTtn;�pA���R��3!"G����"�����<G`�8���C����R�N�9���n{�d��#��f4�+�9�7�����F��H����g}�e%2w6���������a�M�����#DBB^��������=Ol���u�����jC���)����*�N�+j��,��t�Jdn�����v��M��A^����A�H�p�c��Jl8���-r<��J������j�#X�d��p��	x(���,h7��1�3���[��thf�}�T4X����3������l����B&���;!5�D��G@E=��Do�Q��d����h�w����0	l����#L�	L��-���t���n�U>��%�?:�
�&�p�|��H�-��M#�+�2:o�
\Xf�c;T@=5'RCQ�~�vGxE��� #"�Yq ��'��.�E��?N����F��c�D.��8.$MI��G���������5S����gv�`����v�t��=�F�^o�h�}(og(2;��c�C\w$��P�������{��YEeqA��O���?�\I��h~q1C��l��_`����F��IfY-'�,J����v���0�b�GO^pE�������]�3e1�2�Lh)�X�@"/��ND]8�,�7f�����2������(7)���)g�����]����3�_�]���zK������$��������k��u��w����P ��[S1�2m���sL@�ve�P\��E�����j�����uFF��}��|�����g����/�RL #��YP�9���n �����*�c�I�|���Qk;�c�L]B�V��s;HSB��]�v���f�HN��k�pC�
�F������e�n:����D-��5��M���BF���%��YA��R�KT�A0��$������|���[{%�K}�Ip���!+�8���8�%���5D��=�t�~#���>��1C��02��
_[����M"J#�����U�P+~��>���I4-�!I����MP�[V�g��%����!����#��o�0���8����c&����wxB\��&�	�w!c�����.�M�
6�s�o�&Y��|8����N��DF��k���}�Nq�'��h�m���H�l��!\���'[��@zyx�����
zl�������+�&�S�i�b��(�~�_�����]B���}�&�����G���U�9?�����XK�&��B>�v�{�[��p�8
�]�����j��u��^&�G�]F���q�\���������7{3��y��o��:���F�Fk>R��{O_��^P�T�d����p�����H1r<����QP��B:���h�z$������U�up"F
������u��F�`!�v�������n��=�KpM8��A�r;0q�F8��|�;�Y0(�����=�^G!W��t������KV�C���;�*�j!�V6������2w%����q~�����+�����R� YL�$"���,s7�gC {��
��E�d����o���{$�!��(��H�z���b�F��7"�W�F
�^�ML��QmF����Y����<�/	=�w`�V5@H��Z�����5n$m�������m����H'[��?���Zf���]Ck]���	s�d.+o�G��(���
WQ��$��������>�@~����!y0x|�&��������K�	w�7\��Y�6��C���d�]�
H��f�
�-e������4�������	@���N[����V�k>A�{@�F�������F��ZF��0���<�e>F���#3�]�~!}�H���>(#���5���|�J�|y�
��h�Z���x�QuG�P�A�
��qa���bB<�ExC��j�PQA�o����D	�..�O(��nJ���S1F6<�8�!��C�P�_w�2�������V��yV�]:���n$��Z4�2&BT��j�/D��"d��ZPxbu]����H����F��:e-z���aD��"`�f����F��S�fS��=g�-	g���z��&�i�]��r��n�H�CrK�q�o�s6W��T�����;-�pv��������4�Q�T�7���fg�B��Y��D�p<�(����y�qX���f�S��l0�@�2�r�[�R��t&��Z�0�[.Bd��A'��lz:R!�F�
�p� 	��&_��%1O����m��W(��y-o��-���p-!V�������b���iw',N��n�7\�$/��7j�?gbYS����'tD��N�CjV���8!��F�� )R��WP��\��O�	�������dL����a����';�4��3r*���
w5#@�D�wV��>k�H�0I��g&���1��]�Q���#�7�QW�����2}zw�T�������Mt��71q��E�����1��p���?��h��������t���vO������HVB	�8�h���M�ee�f97!;������;�QK
�@��|$��E�~vR���?�������<��Xu�_-����?P��wET�Z����jdf_���d�������p�6EV2\Y:�0P	�mj����N	�-����]�D>M�1�?�%��w'H�
��8��B��Z��@��5�Rq�]��qo3;��0��/���4oe��cPj���Zd�D9��.��7�2���BA���h�"3�Zm���
��p�'�KT8Tc	�_�J�u�D��]��&�-�5�/���I�o�N��l��"��
��A�'���T���X���~��lL�
k��������T�+�JN�9�A��"�]u�����hj
���E^���U�k#=I��*����]�����y����L��%U�@�p�T!
�n�2����2����h������o��������Va
�b��.��o��Z�����N��5ay��q��: h���UXC��4���s���D#m����N<JP������G�l�uW����J���w	Z0�e=:�U��{_����g���z+�_�=������M������H�}d�������i5��]��Fjm�V��,�Q��
���y���V��8�D��*pbD�emf�t2�������R�a�l���!����& ���[�V���*����v��g���P
R�z��~�sV�n)�o5����1�7�[��	J,������"
��]G��t��@��pEyM��:7��C��Z�5lq��J�ZU�@�I�Rv����>���e���]�V�n�E:�j�~/���O�>SHN�p��M�Z�;�<%W0LqF��k(6dn�������*���*��W6���*�M��{W�g����f�>*[��h
��5R4����l���]��(�����9�m���� ���1�d���:G�4�`�`'0R��M`��~� �Q��
�X�Ie�� 
jPRFa�%�KhK}h�W��dD�*X���Xo�~�����.��A��P�#��,+ku�CWG%id��FU�F��m�}v�:@��>U8�"J�+1;�]C&���t���K8Q��d�����<~N�V�Ys�,vdt6F&��bC�W�;4�m�L�j��g��M�(�"ef��3���^R��Y)�N���S�K��g�����"����aG�Hu��=Yt����h�
O����FS��������(����rd������]��w��"���,t�|DP�=�9B����e��d�l��a�l�O�u���
��aV��j��p���M�zl�.��DNj1�JIM8����`�,��������nQ0um�^��_�����f�d�k����y�������f���qo�;o1G'�3eE���!��Z���Ek{TK6�@3���8e�.c��&S��v�:2��9��P�����N5- �>�fH�&,��z�Y%,��IK,�/���QB�Wj4�m�.�������m�.hUL�/�"�����v��j�U�,���������i�R@���.�;��5(����{�T��V�������:D�Q��]p����3#2@3v!����&�bE=������;f7�[����T�����q))#����H�pb�qc^��qq���M��.q������Z������&�b��p����M��'�h�����MXF����{���=���9:��Q��	��YQ>LO~�P��6����7S�&4C���a��m�4�����M�)4CJ���4����jY�
�.Y�8k|C�#����8�m��D��n����n�����?+>$���x8�%�%5g���4���q�4,��i�3���d��M��@-��Z���	�,������=B�~B���:��^�
3�LB��J�F����r}��l&}F%�	��k<��6�=���L�8m�V����(�d����q����k���a�KDWX+=9���Deo_K����H�Xi��I�/%��Q��o�[�}�qRv���>aK;pf��){B=8���F����ln8�����,m�5t����G.���_������C�y����^O�mW�Ip��eu����e��ajs�5��2#�����k9q�{�F,�TsN��v�6;�)��6��&�7#*��e�e���$�O�v��P?���\�h�R���B�F��Th~���4	��d�)���?�^��qF�B�;�K������PV�P����1������-
=��Yv�+h������?�(���yl��]�2��E�X����.1���S!G��q@l���[���h)�������=�*�l*��}�r����EK����M�pX��wh�G6}��R<�[���Q���g�>�~��K��w�+R����U!�i�����J6Q�bx�KM���������������r
(�GL����J���8 �����6��:s����on��
�������H��0]���{�|��tQ_T�H���PPd>�����&�$s��BF:9��v��<5u�]HI�N���tv��qD����� ��Y�c�)�-����73h�����
�9��������@��e�����!.l�e]�~�x�	
neG���"$yH]@���:z��@�p��
�!������sY.G�V�!z]����B5�`E�P�F�_�XFt�����QpgaD<�o�5G�F�
��S�r�c=O
}v��ZU�}fF�oph���uK��\��:/�G����.�$O.��!�l����<iHB�b#"�t�,�h�3�>�_��9LDV�]@���H\d���MK}���������NZ����Y�������<4��Ch=�����@��sU
@��
i�HOE��vS��-a���d����lcp���������+ ea�G�]H��x*�������;{|�w�A�����(�"����*�N���Z#���{��_����V(��M�UX������nn������S�i�hG�.�"\n�}�p
t�-��
������=���]H������T�Kh����GS���z���z�%hq6���Vv���y:b���]����.bf��0�,"�e�b���z��4�*
�a�	�[��-`�������UcC0��$d�1�
�����i�qF+�j0�2�.Zb[�!�`�w�nI�}
���#j����Y>�]�P��h9
���W�'@&n����V�Q�L�n��&Q�p1�6��Y�5��-����glX~Q����g� }�-q�>�bd��a)�s55��
�Z�l��i�0_#"�(j����=����=L>z���C���Q���|���u����vN���DmB(�p����#�u�Vc�dx�=��	�����H�2�%��>��1�p�=��81,�h�P��`C��J��������C�B��j�d;*d��@a�2R��=|OM��2����i�����j�m���k2����a��sC`������OK	������D����>9�DPz&)KQ�kXn�V�t�f����U��f��.n�&B��@���l�������A#[�l�c$�g���v�-�,)n8;r?�%n���n��Q��P��#�5w������%r��*jV%�;*�H,��6G���������nQh��U�(D�r9^�a�S�,�)��
&Y;�e� fDC�P��-���/�Og��p#x��A��3�����@�t���,��-���n�gd���:����t��[����N�;����D� p"�q��7MZ�)o��|�
�0(�����0�G���P��!�,GbG��4��|��e�����.���ajs
����"V�p6���2b�`�C��T���m��2�6I�(����f���	��gG���8��w���-�Y)�*'�5��
:���{��Gr��w��d'�'z-xH�'�v@�����Yj�fm?�>?�7�PeGEaQ%v����-.���P
�I�.z�Yu�6��j���$��b	�-���d�����
@��WB�}�N��~��������:�s�2��)�B����5�Q������||��<����T.m����Cvu����b��� ����Bg����v�L�)��Jp�
2��SFm�-��;���S8F��F������?��A��l�b�3�B���}��o����;�����gP2�)$�6�o�W��g���P��w &J�N&���D������q��8S�L��KYT]X4�u���^Ii-����S_4	a@���Y�sM�*�i�"BI��	�3���K��	���l�����6���s+��X��i;�����K�O��L�4�O���B+8g����^���!�kM�Z��}��V�l�������WT�N�P/���)�m�9
d��j�(������X���x�fj���'����/%J��U�	e�v<�V�ZA��.����ofj�is(���k��?��$�v�
�S5�b����������JBp8Q��|�:d��S�������:�� ��4`��^�p�����3�����1
b0~�����C�Ef,���r��������s�4�
�M���J��\���'j{��r����9n50��@��icYR���Q��
rr���&W$V�&�����.����m����J�����&1���Qx�A���C��GtG�	w��o�Gk�WUUt�=���7��Dj��D�Fe��K����h�@�=�X���\��Gt��k;L�e<W���6�DU�I����3���
K�w��a+hFa������������`�,��s�]stN<��#tc��l>��`�?����2�S��4Oc
��h�a�1]><����|�%�+�o�.��
Ah�1� ��-����kn(����'NLj-�<�:���3��#q(3��r~w>$[�#��X�W$�������WO&#c8Nc	����%X��`=jc	�m7���r
y�$g�,�F��(T�V6�4���4��!���G��e���`�Ab��|
t�^O\kn[c���e�@;�QE���tZF>��coG�SR�!����@��r���'xF8���b���+��r���/�0gx�%aA(�je-�_�<�7%�DP��K~7����������U���R��*���x��m%*[�B�51���28��+A��*!cp�
�?���A�[�$Db+H�$DW���<
WB$�4���
Fe��ZC�c��}$�������c�<�F���`�b��g�T��~E�p�
fQ�1E�����5��bnPg��]h�G����c�������
.2t�A�K	�b�ep�9[���S��2L��R}����G������L2(�L|V�}W��oL�M��}:���Y�vVX�x~��O)o���-�)Vb!���~	+�"U�����>/���Ma6�����;��6��53�[���b�&��qE��vQ��F��f�]�.>�I��W��FS�W����D]�����wD��G��2�;ky�1Vp��D��.�����
2, w��`j�"f�?�GN���?����L���!��
Jp����b��Z�>�����(�e0hp���`�"�����
E2X���	���������>�$������7�Gc���P�'
����bW���:Q�4�=$���X���{���|��Y+(���{D#Z�O�R��l{�q���N���2�p������[�U^;hUU�N���(H�Q��$��AD��$�G��%�Z,�%_?4m���W�J&r�Z�tL��v��g|)���8��A��&���������"9��i�|*P+c��PX��ND�z�������=��WO�2��a��'g$}p�>��o�M�N�+����J���$E�F��,���]���H���g��m4A���J�	�0,R:�'�q�������&%�m2��nk8S��M|��F��Pa�/��(wL��F��*�x������y�,Lm�X��1� �kb����� W��!��6� �&�/|.6�&��E�� w��Db�t��E��(�I�-����'��$���#A}�mBg.�q����q��~�
������GH{W���l���-�5�����mD�Hm���c��N&�,/O��7��'�3I��z��f��G�@�Pw����`aE;Q
������"Pk�dx�/q���M���-o���W^BE��6�Q�@�e�}r��2�R��5c�����C$
��F���UA���R�_��j	��}A��m`�YU��$�-&�*���s�F�6j��S��t���������Fg7y�]�t����]��eL/���vLC
5��aA�*�
j ��D����()�A`'���t�3m5���B��Q���%'�{rd��=Q��T��I���~�����^�q��Z2;��KAb���/jrP���f����8�W:+��e@�m��!�j��Rc�� d��1@QZ�A���n��w��j�D��E]�m�BF���v�����/s~V�h��w5�����6 ���[xZ��GP2�n��)�U�X�C`��&��LX1�r���P��z��GD�C]�.E�5���QP ����Gt���`��!���:���*St���z����84�~)�j �5q�y��!H<���Qfv��<��wG�j�oC
�w��lo6~!cw.���A-$����}����I >��*j�d�Q@�=5��p�y��)4Z�� ��J��`�����j
6�O�����x�;���
O�xeA4Y���<�%f�fo���b���k��$����{1���j |v'a�um����cHBMA��%��*�	
]#�@�1�B����XZ�IJ����c�a;,�N�J��Nt��S��'�N��<�8���BOPU
R���.�RA=�}C�32�x���fGX6�SLS{���]��X%���_��_�mK��*����9B���u���N���,��X�\�Y��|�����1� #��������'�Hw�V�m�^���p���B"n��w��[� ���a�l�:V$<5�&����&�!Qa���!�X[�<M��lo�,���������	l�4b�k��=�F��N���-���r0EkY��L1=��2M��'R�:����1��1G�?I<�[p���1� ����}��Dw��Hv>�q�eK�v��8�������GEK ������}4�����p��c����c�_��MR����S)��������`1�e�~8�r��rua������"�\��%^�'��<6t���H��wS9&�����/�F��a[t�+��,L�H��O����XP���Ug �]���zqU��w��	;C�c����[�:���
s c�������'"�o�}����w��;_P�b�l4]��I��yF��3����U3Zr%�
��=2��wZ�E������zj�m�A��S�C�9&^8�H�ezg���1b`"`=�i{�H� }�(����0�C_��3Y�!7��i���`�Au���Y�����Q�������0�|8���+qE<Zl�2|���1n���O��������0�c�@�E9Fv�6P��"m��U#��1�aw�55>W���y�����������+��\������	6�E6�'��>�TJ,��B�w8��(��<�F� 
���Y@�9�����rnJF(`T�.��]����s���*o`1f���{��n����;�:B�e�e�����R��#&� 6��p/inK�����l����������~G����V��v�kx9�_�1���.�����HF�z����;�����Ac�����V?R���=��
����nq�(_DK��4��>#�B"|��}nhl�^�����I���c�N�O/�MAS�����d��'n�����2�7{
�
t��C��|5�'N)���� ������bX���2�5����������O�+�~G��6�ux����jxB�xGzs��
�#c����w��[�G4��@?��������;����t4�g�F���S=�Bo�n�� �i-��L�T����}B��{
��lZ�x��[�u=��A>�>M{������?2�c����LP�������k����N��H������Ho��{��(N������*4�e!����"��w�K�R���3/��>	�Z{���|OA�l�7���A�>JA�>q���ij�-��.�0zIA�O�Y}����/n�>#�o�����`�J{����V��,%5;eO\��!zQ�����G������[y�u�l��+�R�������2P���{ZR
4����Hu�n�gJe+�A�"^�&�Yk���.�XyhP`����eO�_�g��/Y1�mqE����;�}YV|P3_f�*	�nx/��-*�g����9[����[���g��)�����LD3���5��;
����H��O�{
�A���j5>WU�y������j�����!��{	km����:�������^�e[�������(
Q������[u�r��9O$u�q�_�Z��pO�O�kd8#�����t���d������~�Z������	�y�����B�����BxG��/E�-_E�V����8�����"s�|�6�\����<����e��(����#m�����b�H�?����&�O�>��,�����F�e��8��N�hC��XL����w�0�V�����(�~����Z1B�$��w�g������
���.�w���.�eS[�V���n%��X2���|��B���e���2�po%`�=�w�p2�G�V��E4�w�	�z����R+	S����*��H��MJ2�ec�n����������c4n�dzV�a�{MM+6�(V���� �d`�.a���k�nG����~I2��e�StHf��n���E�|��-T0�\������t6��QZ~D�j��"�2p>�$AWD9
lk��,-T��C��R�i���{����761� JMy�zzP��a 9�$����[1� 3���v~��4�����&G��uq�x+����������QY��a��VzzvSk���"vo�~�l��pAX��C"�����r���WOV����|�	��
#�Z����b|�0����e�T�t
��x��d�h%��w���a����%�F�� ��� �bB�'�}���m��~���}�����p��@�D+�6�`�b|B&Lu:K�
�lD=��#�X(F���������Un�jK����y@N���P�PP����S NSf��g����Yc]�r&:��@�Hm6CDG|�b�a�W�5�K��R�>v#b�w����'NE�@A�;2�lb���
���(��8%8�\�d�r8����������Fj:������1�pW���Z�����SY�Xs�>��.@_�A	u�V�~����K2���;���wV�F$$��vC�g:��3-F)`����p�j��6��%��P0.Q�K(?m��Qa�l3.�,����~��O�5�|$�g
��2Q$DXF��{N�4�
f���������(��3�M�34_
T�qZ�36s�
���_�p�-J�q7���b�k�3�,������2�%�Ky������Z���:(����'f�J��s5���!N$|A���5���S��q���5�GGwf�,O�����E0�]u����{	{�
��EA�`5����(��lr�����P��o�#�5��s�z�F.��]K\S��$~�O(/��F)�� �R��>����jZ�I:t,OY��T,���5��
%��7 �i5F��rW#x�����
�i�x����g>�F()$Fr&:N������������W�;p5 ���5�CT4q
:h���MS
6h��q�����C��~��u7���������M
D3'��K6�#���H��C+� ��~��/g/'�6�R�{�1K��h���j��pG��Z��A;l�1�h*���;g"�y���FC�n��8FIH�S{D�;���Pd�����+cP?�wxp���;;M����/����VG��WD�2A�� 1��Fa�*�QVV�A"��[���
�{��~��YC
;H�P�M;��:�4�%��;�u��
�Y�A)��aM���6&b��(&d�������,m���:��� �J�8S��AAX�mn��%V��l��"���U��[�^"�I����s'�Q���$�����l�.�����(�#���4F���vS�J�:��
q����3C(��T�fYbq�i�r�1Mb+sb��e�b"����5����:>!���\�������	��F�m���+���o��;���V#S������Q�c4!N
;E
�n���{�d*�WT�"����8�R)a���>���H#��l�AM\�@�1ARF����Wp�������.�����Bz�sAM����CE��j�A�m�>`�;���a�����K���%be�����n�>�I{�H��Z������SkD���)�'���a���-��=K\�����>���G���c"����� ��"�P5�� ��r�P�}���I���6���%�j�p��h�y��z���f�A�C���]�gK�����2��:a�	�,hZ���xRp�jll
k[� g�Q�l���h�AE�r�e��Y���N:�(CW*�X���F���A�o��hJ�R%��?�P��]�!��4����h��cP����,�����
����EqK^L��E
M��gT��8��B���EM����w���1�@X�%,-��Hz��O�-P���wK\2�`�R�|zE}UP���,�����@��Q����i;�4��i-��-���\�����#�������|5��$lFz��OJ3�k� R2��=%�C��@����>���)��v��{w���+4���r%��������g����	���r�M��{P(4Z�{�J���$H�)��C���gB��C0���j�����9��1�[����]�<�}[$�bZj���O1��p��N�����=����V��e�+B6a��lyO�S�D]�fTA�y����+�k�/9�
m%�x������f�a�d ����I�8������G�F������*D�a����v�Q3�Q	E�v��E*��S�b��c�%6�J�}&�A~-:5���@������lj��WH���R�TH����$D�'#��=�l�����[ox�f=��9����������`������������%-�NG��O��v���G��j�u��u����%��]��g�B���}�2dY�D�y;��5��6�b4�W�2r��]���c1
���������d<H����_>�;I�i��3�i�w���e�H)�/v����t�ib�(�.��iE�D;�
���(��[;Q"�����R�w����x��#%��:CZ^�[;����g
dcbm3���8���������tL�:�a[���P7V���:�����R7�X�2��DuAO~����2���9�3*t7
��A%QO|C�b���#v	���T�.�'<�&�N�B6*o{b���'���1u<:t���$�	����':h�\�Qi��z0$C�8��w��2�F�
E��X
!�*��7�vv���h>�4��EO���3�������-�n\��L!3�l���I��:xC�V�-�?i�O��StJ��*��DuRO��]j�+RQ�{�
i��g))N}g��I�Y0JO�����;��08&�-�)������v�"(��8e�W�[<_�jep��"��O������-���e�����v��"��s;�>|�.���!�=�K�3q`:��t����9N�#���vR���f#B|7@��R����	�F�=��ao�����D�y�#�n���G�������thV>�P��3]Z��^e�a�����7��[aYm�`�����we��~zv�����n�n��y@��ndAM��J`��(�'[��%�\�Tf=F��K��������f ����L������1��T��#�C��\���Qv(2v��OY?v�2��"�}I��H0}�'W�F(X)���sC�B��M�\����_<O����A%`=��\��W�52-e4���a��se�f���H}���~�l`�9����[+�Y�
��@��aO
�-�[0�����$�!������?v�GZ�G���5�B��x;��KA������K��z|�nM�4<$B���=��Xk������,voi�x�LX���D%�Vf���h�������`���.��3�'�7�����
��D����>���F$V��-0����#W����>�<|���� �	b�v#,>����{�@FDJP�kU�xGh���T�y'��	h>��O�|L�"�r@�{e<��1h�~ �!40!I�*���d2r�k��z��@Mm�NnE����a�@���p���/l�u�%^v+����1t	�is�EqI+��fF��i>p���+��l��4�������r~g}[S��#9�H���o���h=L71jj4�d��$�"5#�-��Hb��a`:��4OrX��FzT����/8�x$������J%������������a��G���<A�;I+J��|�[����$����`$�Y����b��Y�)��J������w[��?��04p�Rh`��GlO��{Q99��$)��.�^��I�f�6z���E�g����!1��5�/pPF���y%p�x��:B��o�����l���7�h)aI�y�
�)�G���bSw<p�zi#�"t#�
9���R�T��t	��D}���(��;�q�gF�%@�g#)���r�\�@�>Bt�1b'�^�q��
�����z�#�G[�
����P�2��f�5�%��E�����#����|zhSd��Js#�=Y{d����'�w9���$6�)7�{7[H6G�v����`�~9��Ab7����
QF��jbm��b�ub�RY���z�[<�-�m�l�9�����p�A�'�^�b*��RB�*�P��0f��*�������Q�����a��'>����3Y-�A
"��=v��q�,()v�v��PE'������T:�?2Hd���-�"4��k�C�O��Do��a0�'}>Q��q�Y}	����F��%��<�����S�S����))!��]o�����4���t���b��qh*���sNC���V��|�X��
43���57�'����	zz����#��M�d�@�B�OD*�*�6 D=�i�A�.�s�)?
1��u� ���xm8�H��3�%��D�lz��1LBm�P�pM�	��%���>#Ew�i�iZ����W"����.:�������j�C;�.�B�\��1V%�g5�,�a��$�����@��Y?�KD�m���c�������q��g��G.��4{�5b��E�2c�1g�i�A����7���o3V����`{��S7��|���`������9L4M%�#��i�A��"3�����Q�&�k��D������gq��k�A�Hg7�0,94W��G���i��;�%�-�Q�t��>6��eu�����B0'�������
��Vv�	�~���� |^@N����{�3t��	^���D����\�Wj���;#G�.6�������=�"��m�C���L����jMM�)^����r�Bwa|A�%�ve�s������S���������5
�������#���2���hI��FPt=�D?���O$�#R�l�Z5s��R3����;PV����=��mY��yZ��g��Hs��*#����t�3�V�u������+�.�
d�������X��4� �h�0����F�ipa F�L���o�����CX+�#D�A�������;
=l�<.�KV�`�K�{���[���k$��+�]-�-���>�h�h�d`
���Fd�UV�%<�^�#�t�EvLh&cXK'd�V���*�h�p	��gg��]'L�9��zW�AO`Q�J`pA����H�~�s��;e�w
5O�6z
�����1���?yx,�hm��q[)�W!���8�K/Q����~}�At�U��e���Y#gT���q���bM��-,mn�:��h9[�&�_�z�o�w�Y\ON�K�#��
���o��Fy'����W��������~rL*'-V�~��B]
��X�D��c�{�TY�YQ�[��j��#�_������-��E��,��i�-Y*��m��K��rr�c����C*I�e��e�A+����a-��^�HR[�~L����&w��� d����`����}�h�]qER����/��`�U��)�� K�eTB}�2?�'�2��U�X�����	9�0��24!���Tt
�7��*�GU4"l-CbK)lP�utYR��]��������������x%���l�1�8��1�a��v�^l���k����u�?��W"d���������D�+�����Z4����lC����v�`���-�%�K��'
�A�9F�D�[�3tzk��������Y� #8��E#A��q$D+�Q�	�c#���9	}��+����zE�p?I���U�V�JJ����fQ���df���kD@8���2�����{�
��Z�@�RC��Z�X�k����R�/���)��x���>v��1�K�P4<�"�����kb�+A��m*��3���[#�}������L`��X0���h	P������{����-0��2��G��T ���-tJU]���H�
`�a��������B��eT�H��8~)T��uY�bC��N���������R�v�.�<Z�i�����i�ZIj_�Iwu@��e�B�l�m�Y�a���!A
��?Sa��q���V��3za`�=����>��Z,m:�I�P���k�>p��"�@b��|����DW�[��*��DQ[	H�J��*v�_���u�D�uBhz�7�2�Ptg�����v9���M�+�����0�I(���M�h�C2������g~�Q�/'������:4qb��JdB�����C������F N�{j��z���G�61��Wb��m��v�~���X��6>!�qE2�m�b�M�]vD��-S��XCu�X���O&Y(v\������1�
���%��[��wt�,�Ge,B�O�l���h��!��+���S�KD�%���B�^_2��D�-���n�p���S���rXv�	�R�]rz�jh�o���L���X�F�;8��C�/4���|��:������ `	����[��3�6� �(��B*�v����k(����v������@��m,A�PC��m�.p��� 4���/
�����O,����]�[�Ftx��?��z���B���`���$}�����0�n���e�Ww�?ZFn{- F�E�
7G'���h��������D�m��a�|������'�����C�	F��==���.#��x/I)W���H%$�GL��sz	"����H����`^�z�I�)o�2�W����0���Q��=[0�i�|�	�V56!��t��B3>a��P�{�R
7�
vB�[��T��O����q��C�I�b��p�q������*$�����P��&��P���y��)':
���'��g�8�P�@w�%���}}�m5���`��O��/�f����o�l��Vj�����[!���X�W���S����
��dC��mLBG;�����75�v�����~
��_(�';�s8h���W�}�&>��_����E��l�*a�`N;�N�`����&J�X���C���v���sX�"���$-1��hX�Kf�l���#-�J��c�A3����daox�RS~����o�G�f��Iv���	w�)��,N���f��}S�5"�`+�1	�4�k����A���$���g"�pX��h`;�Q	��Y�"��N�����3 ����q;z����2QB�x�J<a? ���4";QC��8�x����K�U����'y����d�:�����	!{�{�������;�N(�]=���
��)��������x�bz%�?��/�+�9�A�v:Z���&��>�6��s�1`�P��^���2#@e�1`!��A��[���D�Lj{�Z,���d@�f�����b�$J�7ZM�l-��P�@����:���n��}x�)X�1D��C�-�����Nh����,����<<�?hgEp���������Q#:_�fo��%w��8r����<=�'�Q�h����_��M��|#N��-%K�i�'�SM"I:�q�^j��X�E�`��B�����2�"7k�E�c,��������&�m{$A=�/,��R��qC��>V��/�Q�c|C�x=��E��i���p�P����IKB+x�6���(��&�������5�l:7�&:���@�$����I��@��6Gu��1�|&��{t�h���"LU����](`�<�Vl��mc��1�!���Z�g��b�����n�040�b���U����-��o��CK6������a��G>�����4*���UL���da�����]���7�����H�X�{>�=���-V��$����'�����S6��<'���3~�45�����`����Z1wb�`|��m�P�\Qg<aW�5��������lb��X@�,yo�Q��81�R��j�M��Q�����}��8_���G����w�%����p���DO,�Dn_E�N�l�^q�m�@A#��ND�[�����Jc�PbL�c@�=���AI������
e��(;QQ<�6%�zO.���SC���-;+���2����H�	�+��h��x
�)vT81TG�����M���]M}��D�'��wd{w���:CH��y�C}3���&���f��-�Dr�M�_���l�99��/]]���F�\�J���"�#���$	m����'B0��A1�Yi����4(ry/�'z����#�����;����[2�b��^IH����c���e'%�Cw�'���B>|����B��wx8�h�x(���r��n3�X ;�w����
�m�#������3�C������M&C
���U.�c��MRRk���#]��n�;��l�w6>�������n�]���l�!�T����M	
�\P���h��An�����=�y����/D])���^�A����|E���JI�T���������i>'�z��EHN3��X�f���	G��n��cBt%��w�&�������]�X�:��N�aE�V{K���Pzl�v�y��������!����N��&q���{�Y;���w��$L{�����M�4x�c�$[j����?�r�#��;�|Gfy����i�-��H�W$5@��-}=g��~��!�������P���c�n�}4�"�����#56E��%T�\������.��^XQZyv��H}��5������5��8?�w�
��}z����~�:����)��:��d�����o�����$i	�������}G�������/�v����R�����_)8@6���p;_[0�:�#�����h��'!���&�HnC]�{��k'�-
u�U�lV�~�G-i��{	uD��^�+�- OMD0j��������H9�U"��#��;��!�u�[/Jt'>������2vl""�w������=��[�b6��i�mb�k:"�O���O���,�wx�p�	~��N��y���\�k�����~Gz�Y]�&������dK�((��P����L��]#v��D�A +�c�S�w������f�`"�J'�{��{�����2��?��"���n�+�^�'V���/T������_$��=���y�"7�^����b?j��7�%�S,�r��a���:�C�,���VdJ�.���H{y������K�����oP�:4s����aA5EI�_8��8�Y-G������J&�D�����~!���Ba<�G����3�
�R��p�|I��'�����Ne%	
Gv��1��&�u�q=D`�K��E��.���?��Q!dP�����s��XCW1T�o�'j"�y�{�����o�^�����2�B�:���QV���s�h;,��
VHp����-�-�>�b �fG/�C2�<�Q�w��[���t�	���*F��b�a �|�HB��n1.�|�|��6�#�P��@B4��+|�
D������(���,��#Qh!��b��rz�1��]D��>���F��VO���*����;S���9D^EM�b��"h�|��S�!�&�*#PQ%�B�B8����	�R�����C�?�'	�~���m0�(,��\�5����q�.\�6�c�I#E��w"�1J�-�I�F�?IZLD]nT��^��N��������&N1!�@)��Gk�)I������e&�������[������p�5U�3
EhY�i�1[���,vI"���+I��
�G$9���e11�Yp������
M�����kk|"b��0D��%6]1��a����s=��'�N�.��V�GL�g{B)@A����{1
!fk�{�_�XBY9Y�����8�9(�QJ��Z��5��v"��~;��{�R����$j�.�2r���c����|�'
����$��^a�^�r#�{��k��X%����1X�+��#��d����y���-0����xS�{���D����q��u�8��|���L{���f��jD�*�d���u\��D���z/���+����HF��r>g/4�L_hw���-�;��S�������I���8�1[l��������V����-��"�;���,?b������Z!�k��������CM��-�ZIQc�&��)jd���::��J��'
����z���.����g�y'�b:�����amA2Y�����#�PC�^�{��3�T�d�
��6����5?�
D5�%�q��<��a-9+�E�N�����u��P���h������\�j�CP�������%k��QRV�],��#���N��xC���Y
6��3}���� ���f����B��l$DF���L��	��L�{��B�qVvU�M�r�q�����a��X��$'��e������@4�j4�*��I�Q
P�#-��,�3�y�~8F�1�~RhK�C{�Q���Y�;n'-��0��Y#i90m�����S��A
����(B��XO�#����Xe\T�o�"���~
F!�����c�=���Oy�2�yM���=��=�Tc���#$.��(��&VX�?Y���X�����U�����:��@��:������461������L���;����SG��vBE#�Mg%�H���-��%0��W���H��
S6��W?c#�t���?��=���
B��1�Bv����O-/�*��h����N���b
��������	��T
11dRg
����H�����C��aqW�'�=��=z:	��^�Z�u���1x�~O]�S�Z�A�?W��y���fbA������D���H��	�R��2�|+�at���P��/�-m��������:���A8k'\�54a�}���>a&p�F����d����l�\�����
�;���!
tCT�pt�)�Lae\�X����{�C��i^�{���av�����OI#����Z_F��U�	NC��~�t�z��!-�{��-l�&?������u�G#�dEk�Q��@H�jc�!eyv� ���� ���_�E9Q�~h�"����ha����������,3�+=�5�KNu��pL������x�r��y"�p��U�}��q����)�3H�Y�9��A���Bg{�7������h��0�_3b`e=jR7C�qRx+H�~������;�$�gw�9&/L4���[��qIZ'�#��j	�!��Yb���(h2��������t�o5�.����$�}��v��zhw�JY���x`���~��B���e���,�������)��e'7,hE��z��������l�Epsi����y�/�r�A�-�mJ
@�{��Qz���\���Z*6a?J���0�_3�����\A����G�vk����t��1���a��u�Z�\u�0����f&�����MY�������w�mrt*n=N�w�����r���~�_X"��U}�����:+]������%\�����IS���:2����p�v�{��HI��:l�'����� �r����������
eDF�����I�r0�P�f`BD]���9��}����>��{�7�&����c�{m~v���*�
���@EA�
����)B0�����<QLh�A���hm�"��a7 ��PL�l���=���KB&������nl��������y��C�y��N�|�S�y:Q�p[������P���u��f?K�4���������2� �J��X���������P��;J?��mo�0XU��J�|����>�vI��&]�F�P��@��8�f���Wp���K�@�r�z�4��&�4'+�
M��%�!;&bj����h�=1�f��|���f�H���.f�*����p�f�9l�����o ��E
�J��!���J>���XS�ZT���"x`'%#j`W�{PW�'q��]�����d�	}�

-?����!�C7D�P{����R�$H���p!Q�:���?�[����%l
 ]��z����m�U!�����90��i3W%�	��A�n-
aR�������sh����:�:<2���.�I�U$�C�"z!�r
��A��/�P���SV�����=������\�n0CA�#	���aS������0j�D�+�1�Rh���Vz�����p����dx���r��n���|L�i�=PY�
p(�Dm����=����`]ab��lh�Pp����3��k���1	�+���g�4��+����t�!S>L�Az����C��CBO��ED����<� �9!�J-e�����(F����]���l���8�/����M�C���M��R4R��^~�����c��}�=2-;���`C���'��� lV������L7n��z��I�p��D�Xpt
���6(a����V\�\d���L��@?�5@���D�#��u���"�mt��(tD,�����4	}�G�����8l���6�H D�Pn��_Pdj��z�A;�d`i���@c��AU��\z�Mk�y6u�pC2����MEt��N7� �������a���)�����������!4+E�����zF�f�������]�p���|�:��}E����A#]���5�K�T��#t@�u7\ �Je��2��&aj?J2��8O�����C�]��/��f%�kg��������f���\�41=��'�r��+�O�uF"�`���u��=l3�e�@6(��-�:� ������f:���$0�P��;�G5)E����?c������B�#p��;�^hG5N0��������A�
D+�P����pS>1�;q�����<������O���+�0�gv� �Z�����B{�qM������}��d�l�UP��]�U�0�xb'#\�����H."��0����"D2��4�	&���p|�B
u���~�����J�&��$r�{��>I��x�TZ4'tf8�H5�0(�e���QV�4J��KC2�al�e��QxT���^@7��,j�C=';��p3�uJA����G[)h=Jzh��FQ#�]�%C7t�?���	��oU��z9��?���T��]Z(xd��[�En�1j��l�{��o�	:FMg�
r�v&��1_��I��S���a8����p�M7D�P-�hm���TCp�0�s�}m.�����1�����[��:�m�d7P0[iD� Kq�;�W�!�YF"�X��h]7���/1Z`(����2�����0m+�f\�`������B�&<��
���F���i��(��7�c���i�
���$�[�;D���������j�fR6�����+��lS0r���T��DF����M|�(Y��:f$�$JOi�c=����;F���:���X#1�V`,A]j�����G@��d�qKu��� � �F��������N�����$�A��1cY��r�N������~c(��%(���� n��r�[�
�Si���i��E������i9�"3��pi��������q2j�7���J1��
���o
O��~=�]kcf�c��>-�������;������at�����?�Mv.A����Q����?5�����M����������nD��l�@&n�S[FB���p��7K��\me��.ch^���?�8d�@X��A~�Ci�)�����DWp���1X��}A��F���X'�xVN%8Z�v�F�-gf��}P��J�:���|q��S1+�������h����P ����&�\]�������K�~��r�D����
��:iR�|�ldw��������v~]���q�,!���r�[
B��[����(
>��Y�w����4 PQ=b�,�0`7}I|?:�Nc�3?��5]sp��,���E��YRw��Ph�9c������	�b��it@V�^�c0�Q�����D:;�����4 $5����L&�b
	Wns��7gT��
MCBI�`4�����2	�},�_@4�s�����#�i�K�(�Vlt�������i|�l��[��`T@:^���@J^����A���+Q���2��R�>����qF@���_^e�����lR�F���x/@G�-�� ��by3�����@'�i��9��v:��?%�H{[V�.�B���x[���x#i�@���\P�#V�����X%Z8�DO��<���\�&:~�H��n��h|������yyToEe��
�2%���:d2_��fD�Z-�qC����G#�"��)K�3���sd��9��i�ro��Ht-��PHe�cl��� c���%��v��{��f$R=�����C��	�s�Xz�(��u��,����.���oQ���a<{�>���d��V�U�����6���9����Oh,�	X��&+V
�r�1��yk�H@#m�q�L��p�#|o��o�GIhY)���Q���������H.�@c]��:�	���NY��~Y��D�����U�-Q%�!���M�����W+Z�|��|�d�,��%6O�]�QO}�����fZ�[�����$�����Kf�n3	:"6����+{-��=��4
���R3����(�d�������Q�HV$01������g��vb��n���}�>�
�>[uTq,�0������.ym���.����Es�Tq�q�E�g"E������OV�,�a������l ��(%���J4���f����mw0�s%�Y![���4��Zt���Ad���������[���u�I
�����{�`���Y�V����&(Rs%!

��s�8�K!c^�+�����?�����j��!D�Y��%�3k���S��Q����pL�D��gt��!����mUi'�$X5n�j��(�=�=������-�����n3`����e�,C�]�^���v���o������[
�f-�\a��q�cse�]�`H�wKUR`������t��1���j�������+������A��Sw����Q���X8;�--��N}������MV���hP�^d�rl��:���	U�plP�VcR?�A�����FP�}��9����B�6b4�k���%�V�H�/���F�h�a��k����IW"��X~���"1�
c�-z[�
H������4��N�6aB��5r.��M:[�A�S��3��0�3F�!��-��-z/��e8�jCF�W��+h�������@f�X�nD���(4���L��1�D�|��lr�������<%
>H� ��\�]�z1'z��(#B�+V@����0w��������d ���|���l�bT��������Q�����P}d�`��Z���{���2W$�)�n':�)S�$urQ�N0*�cJ�
F��(�^Xpc@�����hL�k�Q�����G������c0'�)�����En%�E��r�����i�������������l�X�����V�wcF����B�\f)N����J4.{�-x.���T���c#���E��d��:��v��w"��B���1.0|?.�7P��������{Z�?X�k��EF9h���Tn��|G��\�;_��$��OH�"�t���F���G � �nl�	&��G���+�����aF�1���[m���`����giM(j�����f8(�nK��FZ��H����}����|�G��!�y��lv�
����6r0~+��&k)�����/D�Hj���4�!�r k�6�b���6�`c���LZ���v�7������Fz��K%Ds���[�C3��lC��a��;I�������b5�N�3������}3F�=${�n�����.P]��?��"D�1�:Jw������C�#���OML��?�?����a�u��]���|�����GLy���z���l����|�v��B2<�C����5�����.L&���b��o���|D��X��&�����+�~sJ	F��m�A��

u�d���C��
�6nc
����(�a��T���9\��,{C�x{<�����%M�������qD�P?�� e��w%�Z�c6KC���u*�,<7���:�z_�����q��!D��#�]2��#����M!�
���u"t����}���/��{�T!;2��-[?]%��Jr;��A1�{(�Y4!g���w����
�HX=`�N�m���+-+�uLj�l|��\l
��#�$+h{Jhs�=iX�C�2���,Z�fx���B{��Y���&�B���5��_���g��
�
���{����1q�H�ME\�y/������?��f����
�n���U�J�.���
�����������������4��w����<���NXT�6"z�{��@��Q���Mm� *�b3����/��yd���"f�6��X=a�C���S����K0��mH|�f�l����h�43����b67�3{���b@�H�h���s���N]	Ny��w�S�d�B��z�4j�������\F�g�x�v0�r�E���bt�����(�2���nE��1�!�<*z�q�o>�9��g%|��9�eB��c�����U�'^Q�$�������$�f}�8�ij�w�g^"O\t5=%�2�B���_a%7���������'�po���q�1����������SbR��w����j1�h�)]������vg��c�����Ew[��c��	���>-�FH�h��|I�NvA���_��3��n����N4j�X�M�'��wqgx�	��W���A�$��n�w/�9Ik�'y�VU�/T�+Z���f���ia��X����������(����\�sZ�������v�pV���5�>�%:+fJ���_A��B�1�!>����P59��a��'*G�f����)�����
�!6������L�������c�z��5����lD.�w�e��8������0���������E8U|#��86x�������[��w��Oj���fkb�U�D�B��{d����=�"�1z��%�N�����nc�@?)���Pmw��c:3��4�d��bJO�
�����!���W ��!?�;������Q���{'���,+A���{������+���+����e��4u��Z�jN2��1 Q��*�dq�%Zh��4=�w|@�<����[���# ���-k�DH!��m�D
A�0Q�jN�)��VWD���"Ki]�8��}R/�c(�K//�7�#��'����Jk�f��e>�����CP�1� G�*�n*h�����sh���2T���iHCq �<��3��5'��[�O6�>�A��~�d��a�b������Vp[N�,�t�]��9���19��8S9;
�b��s����\��Vc��(�~y���~���B.�$Y�-q-�N������`��O�8qR$)�C�"��8Q���O����%��i1
��yG���
r�7���~��Qd����2I�@����<�K�m����,s��5��O��w�a�^B��������n_�3
����������@#��S}��>U��d�^�
���������S�;���*�S���hC����g�)9�������c��g�8aS�;�Ki��b@/}��,�q�����z:���:�B�dd��������B��h�����BqV�@i����E6���;��V�t�M"e|��y)'�`���+���w�
hq3��lC5�a�;<3Q�mh�'�-Mt�}�� }��� %�;&.�j�':)��Ai���(�t=$W�^',��TEp�cMp��:ii��H�<�;c_�Q	�z���m��1_����6m���&z�&�pb� E#s��y���h�
h��0��h?0����g�����������A9�BX�8�������%�{�l���g;4��O��������P������������e�D�_gf�����'

����5�L�wD�HO.�4e�<m�7��_l�x����p�J�V7���F'n
&��&��w��5�KO�����U���[��^�Z[	��R�k��>��7��;HE��#��P�`H%�">C�b���s'���$Z-�[ 1�Dtw���f7a
��Y(�Y�@�;��7�P���F���!g���O������s~vO5����n��$���FB�}����E��m[<�7[-M ��;(�D�����@B$n}�w�����^#����������)�����#�Bg���Ch���X4�cu����p����H1TJ�Q�4���LM����"�=����
U�h��01A+(��'8�=���w�� $�bm@C��b(����^��@��� �������w����6�`������+�!4��B&�Z$;T�Ve��<\�	�ST.��v�u�JR�e�+N�����������~�(V"v���Q�N���<�M"�~��`09��X�Q�'�Gk_a�$,�l_�SfH:����L��	�:J�����^|�V4���m!Il#�v(�
�Z�J���P��$AG��Q���U���(i���8�M�s��($\/1)L��).����`2P����g���{>����S�"��;<3�~��M{�^�$��O��[A8���^he�@�|�,�1���� ��<�Q�3�*�bx`66(�oR_~��'����:I�V�t�}xu�M��0�x<�����8R-�"@���`�������8/��?J P]_z��O
���q���7������3�&i�g�+�M���
 R���)�����6���	G�FA�U(|*��^�I�0ib��(]�(FT�0������x���;2��{G�A�������A��n������F�V6:�w�;:~�����mA����55�A��p�Z"J��>p����t'���A�h����N�3���g�>�!��G�;��������-*Eo�m�m���a[�pt��,�/HL��z��{ki��z%E������.0�`���@*�����N+��')��w��U�k�1&�L*qC�r��tmr+���F`k��.��4��XI��Y�A�!��X�r��P�{!�G�BA�-�Dx�Js?F��}*i�����50�F��e���YU����X����J7�0����i��[�V4���������������?��[���V����Q��o�UNJ1����Eo��-Y�9�Y�-10��U�BF�����������z�o�WT7��E&��g���c	�-�QG�F& ���C2@koM\�c��a��x<&�9�����5���t���%��w�[_�]_��"�GMN���
�h���x��s������Ou[_�UH�n�����O���x��E��7�:�[�s-O�
;j��G�f-���g���Tca$3�6��X��}�>On]��A:5!����������?J��z������VP��b�������Q�X�����^c���	�1_X�����	l����	t:�D��Z�v����)�b���]i��.��Z[@�/�[v�����_���+/������f��l���/�Y9�(Z����A���������YS�>Q{��zt�o�(��mfe�BVS�&���u$�5z�)�M�o�X�D�������G���I
q�P�<�L��4�{���-B B��e+0�m�����
�����{�a&P����@��
���Q~mS�����������.�Dz���A
�e��G��+���5z�����+ETO���h���e�DP|�B������P�U����)��}���7�%%^};�B��
C����!�	����lc�jL�s|��������Z>�t������83& ��e��������a/h��e�`b~��Z]���5����@���������g�U�V�+�Y����� G�QW8����������]_�T���N�����t;���]��~Tc�MKc����w�w�E�����dO�����5�C�����Fx������9��7��k�������
[�f0z Sy-7(�nT���*�N�����
!���HY�3�s=I��1J�lY0� ��nC��z0����	�$�G��a�Q���]���;q����DB+0PU�|RXy�������A�����g/%�8����
����Q�9�1��%.s1h�mh`�:����U{'�V)=7����,����e;���g�N5��1]i����x��W@�z�����H���[+��s�H�HJ�J*��h�q>�g����C�$�PO���@4�;��	*j���)O�Yr���]E�I3 ���r��8
g��D�]����}����E�"?�3C�e3,!�*���B���-��A���`�]�������j��G���V����D������H�-q;�}�u��[8�?���bS����4{�'��t�hB:��V6��o)��G�#y-�kF+.��������p��4CM�w%�j��}dtXm���������*����P��?%�8��� �f�Au;a)d$��W�!�P]�H[q;�{�Q%���sl����B��x��J��eI��-���l�.(~��S�������Y�g�B��6(���o���.�2{h��5����V@���bH'%�+���S������t�:l��<qy����Q�����������;��d���=�����]8�F�
�6#vY�a����� ���js1m|3x��EnK��"��
��f�Bd�f�������@oU�hd��d�CY����"q�C�]���4��k�,VOv�N��m�E� �|���p��NJ��5�����;K'��y��hG����m�p-�8H���]��P�f$c!2q3�!��T
��`����%UA��)i9J�6���M�}G��T��*�	4a�k�J��.wZ��%�R��>�uX6G��[�L��QH�{���0i8?�� l��P<#��������@�`����9�~(��������������x�D(������L��1u!2^;1�W������������m��S���h1����'_Y#���B>X�"7lG���M�����qY��������-��b�H�2�
t'��iX�'	
�HBM��D~#_������b�����XL�������
8Z[��[�$��H��
Y�J��;�~��\����h�����X���F{��B�G�5�n3	
�����@3��J��&x78��0���{��i�'0�F�_���'P{�G!!�5�o[QY']��'&V��b������"���v�������*:��d<�{.j=��tC�cl	�^��m�*g���"�����,�0"@tc
�-H�g�g�8��
6��	c�����a�����dM��`mC���#�P@���ub��=�N6G#������IX2!F#=��0a����Bg�O����G��r������'y����
��[<D6�u~�E��1��l��s(nDA�O
�C��%�:��	��&t�`Gh�p�LH9�6+�}`��e�����fp������2`XU4AVyl�1���z��l��=�u�p1��Icfc>���++"�(��Q�������T����Hm����vt���	�5P����.�=A�-�S�%xQ	��r2|�)l��4�������t�4*�����������D��wx��_>Z���h��=yO�������Z7>����h�i�\��,(����x`��D�c�6����.��s�<'h.�7U$v�</���#�@��n`@�s���[1��`4@�[�Q+�[�UJ	��h'10e���8�3v������1ag=8�I�wC����@���LM�pk��I�zL���0�������W��"��!����d���V4w��$7��>��]r`f+����^��y�����@A�b?Y�d�9�!��������["�|9AB���������Z(q{��`(��v�[�gtO�@t�����#sv|��0��^O��� �g����N#�H�-�Eb�d<��>>,����S�����b��e�0���1��~G{�)kPl�+��w<���H;�F�av�V6����+ NZ���LUCE}����d���mR:�(9|v��Ju����$kC�
w�<"n���p&�s�C�H#�_��D���FBd���%#P�j��:���C��f�8D�d�p�C/A���0����)�-(FskDm )��l�%��������5`h��@�HT*��k�@<�HJ��8�5IO����T��m��a���L�-Z�^�F��a�@���8e�3��!����\�f�Wv�qvAJ���oF���,\v���p�`���@AB����hF�����h�G���$V���G����������@o��x�:��L"4�M�g=�E���q%�:�r(�P���:��K_$0�3���:�zGz���v)L		��Q��Mj����4b`$�
	�u�(��#��
�j��s���D��#�r�[��
��<"Y��^��������6(!��j�o6��L����?E�:�1�08!�n��\S�������%�U?�K��,��GF"����?�D��V�J!��L����fv[4h=?�0a�T1&!=3��#��uI"/	?��X������c*�]��Z��(���I:�sg|�&;
ht�J(S���v���Zl�Os�F��S����&D�%�����a3�a���}��+X�w�P��-!�O&���rPV���D�p��oM�-�Wp7LYX�-;�L�`;V���$�7��Hs�%�zc�`��e����;��F����2Zg������E>?��4OL��6ZV����m2&���[i�O���q�5-O�������axb�5Q���BH�L��ZDh\8u��1ya3��=���uw���6�C;�L3��>-(��~-GD8TA�'�f�B���fT��V'���:e��3��DEd���6��|��#�9����w�������yp����6�.��s�f�fOIx�]kdEq���~�!3���56���l](�zeE
��;K�����y�fR���r���;{T�&d-;77��NC�p�V^x8�X�;�'��`	�4j���UE6��������[d
Q3�����Ma�;���<�Yh������@��������O�A�9��l9#Zx,����k�����y�����M�����i��z��%���&tf�H�?[�q���["�`��t+!��fR�NU�����3!�F�	�hW��j��I�����,�~&��9ub|��,���(O����n��f�%&ZP#f��0s��$�zO'<k�O�2aEc	f�bI����z�����n'gU4�5F���`�����rU1/�C?�U4���7�%:��rF�p�q�%<��[[n_R4���KtFw�@*w�F�j�$�s&j��q;�N��h�'�=5�&�&JO��!�{_����k�t��(��#T����M�[Ja��:+"�qO��/q�}j����d~�|�g�B���d��!��V"}�$V�
�������4e'!v�4x g������k98��+��=?�}1�o��g�HF�fR��4�;�����H�(�M�S��4^ �����c�[3�A1��twC&�W��A���hv"(�ZG��s����!v��8�:�b��y>�r4(�5���cN�7}{3���F;��d`���"�`�����Z��46�Udg��c	%�s�����A	�W����@E����}7��>Kl%v
O-�\�9���S�y�)A�*i�e,�(�����p�4�
K�Y�:.c*�o=�����'^Ot�����8�d�	sO�����o�m&�V�����Q�X����bq�+	��L�`�bG���;���x-����+���64����~��I�.�NcT���\����Jr3bc-�������WR�1d�����9�|0+m~Dy[�����=x��H.7�}-VSC�US��?��4������6��$�bO���-����#ht���RCV<��B����{c{�{�"�����/���,�6~/L���^�::�4��������[�RL�Q}�������b��DC�#5O"���`o��M@��Z���.����=d���~�3�����p��	� �<��.7�������M+Z{����Dt�_n_��|w�����D��20U�_��$��pA��eH�;)V3y���W ���FYG�H���0B�Y�3LF�DW�*�Q��t#<J��� ���KQ�w}Av>�<+'M���-���8]��9�p�AM�W��rF�8���Hy��T�b�N��D|�)���� [�cod����lK���J��I�L���0����[�5�k��'A6���:��-S$���hI�e���p����z�AO2�	�7%u�g�!���[U_�6)�%�My�Xe00,�������]i��8R�3�F��G�1���/d��kG[����C�<id3��c�Z�:�Qq��.�~���Z;��
S���=���'G�J�-���~A��>&���`�g(A�:���>�?�2(����eU��;�]���)�H���J\���D�g��:���'������V�/|�G^��8�B<d��E�PV�Q,~k@�e�0�6K����HJ+�[N��v���_H���_����!��0:�2C�m��%~G���B*p�W��K�����������Q`����d�s5��v��4ITh6
���GiS�C� ��$:o��� 
*���|�k�vn'BA
\DA���6��I8���A��6���`dy��8h_���R����������$��z	�X��A/;R��
�u$��@�c�5{������;�8h�E�&q���"Z�����V~��x����g��Y0��m�BZ"+t0s�&��@h�%<~v�d�);��F�6vt���*�i�e>1
�����������1�d�P)&��L;NIO�2#��|��w�}��N����mC�)'
j+���*��A�6��!I��u(m�T54n�x��j��1�������Q7�uy�Ol �����*�mBz��%����������� ?8�b'uAf4�u�������*��s�r��*�"2�F��m(B}��������d1l)�m<B�Zl��HAn����G�.�k1���A�#���E��p��w�]`�L��q�f"{�!����7F�������;��Mjq����N��0����mv+��TR<0�,$/��-^����
��kl��������D���I��(D7T���7V�����zN~��
=	��z�=>i�"�{����m���-��~4���[����vA��!����T��'rdg���z�Hl������������LR;����m�~����!�=-Z9�i�_-��2��;��Ar�F����a���-�>+{�T��d��@�Y���%*��?P�.�;�a�G�M[CY_@���e{�V�S��-\A�=�-�O��?�T��,�B�%[��5T�Qrg9g���Yf$\A�����6Hp���p��f���b�������H������j��aA��j,A%;�c#�[��l���G2	�0i��c����<��}�h\��0|E���i�����8���8��C8�,�h�=Nj�|�%�#j��#E�nG@B���G(DEq��%�*�O4�9�
2�v��h�8�k�b��Cn_	�fH.�2Y����B|O-O(Z���X��47�$�������q��(ftZ��;��������6�X����G'�#��d?�hC$�;�j�9�<�����L�;��
�T;����G���t1p���0;��jOT��m��i2�����Kq@A&�9I�qB��z��H�h�30�2g�#�AET8R$���D���1���3-�i����"{��s�o�N��"�Q*��9�����d��c���Sw84��>)��X���B�����&����#��s�`�����;E�G(B�A?�kW�l�,O�Z�t��-C��p�3���2����}z�����jH�=�
��2��*���/�g�+ibZ����f�5�5+h���h�j<S���n���"��[s�>4�W�iaAzW�H#
�qr3h���9�Jxnl���D��E��)�	��P�b��U��$7�_�@�5���x���=�������L�����
�K$���u�a�T�q��L�er��,���)���iW����|,O�&Qo����B�������q����j�x��8����p����4+��I����,�B��^���1����G���
���)d������O6\gT%wE�����������
t�1�F�9���w�H2��?!�O���m����H�C��nz����X��9��Rj>���^ ���kt���v@M�����z���'����3*���XU��3�iaa�|Y�*}16R�������a�{�l�J;���j�a��ec>�����{QYN���B�+2khRR�����*���X��B"���;H'���Y�~�#��?�#����.��{�D�^C�`l�)�����k���p��A6&g��-���#��V^��#�����'5��O��^H�]�x��	���,�"��h����,zc�X/%>3�@��d�j(kY f@�N���:����g�������I�,���6^��IV�S����I�n^��	H��6�>����7��Rr���	>�4P?c������C��LK($�H�o%���'��;\G
��nU��e���O�&b��^H;���3�]�#����
8����/!����g�9������i����{���I4HTL�7F�j��j�(g����w�J�O��|�}~�9�?1L�Y&���G(E!��x��{��'�4�s��@�d%�%�5���\�E��`��{��G
��uI����4I�3*�h��}������Q.{`�fw�����q�3Y�l6Z�Y,��/D�\�N��B��A�^�+5%������@"{������������;�A�1�1j���	G����c>+b���H�A�gU�����s����j���:�z<������i�����[����M��#�����E�����-&"���}:��Z89�7/�*Y���'�m�B*�[DA�;k{X�~��+#2�����l >��s[�����sn����i���?t�D���q���4;�v&P�{MF�4��N�d}L���;R]����R2��{���R�J�O:�m�C��&����=�Y�9�6\h20-L���e�E��Q����;H�vv~�]Kf�s�^H;,6#�����=�I��.���13��{���){��w��nt��`Z��)+��6wO$�����N��P��D8�^���?�������0b�e�Lh�p�S
��wS����
��:n�t�n����%��X�V�X�n[���g��Z6g�3�����uf1t����fD�[!M\vxj��|�8��Pl�a|�D�3����~E�y8J��2F�5A�f�sS��l�����<�FUqht4����;6r��EX�����m��	qE��Qh�9�b�/
�����
���"�T�$��^��p���U������d�Y��E@����RQG��bID�����w!9���,�]�dK+���-d`M�68q����|?�F���p}q)�8 	�����x��X��.!�~�����[��	�}�vb�Fd����k�/�wy�j��b�Y��t�y�@4\^TA�x^EF��x��
+b��{	+#���
yu�'���0��S�����,^�H���_DD��"�;��y�������������yl$�Ep��.����I���{)�F����g@$��w�x������>�M���2�:�]B�<��bv�h>f�b���Gv���l��8��*���������C��w��5)���� BA��(R�"����{�s�����`CwWE��AbEx���������� "
Tqht��4�(�]��O/N��'��a���^GS/B<���W�\/f>�8��H������<bb��]�e ���)�G�o���6�v
WdSg��\ !�=uV������[�}�^C��l�7��0���>��#D"j}C#��:�e���L�r�=8dw�>��.=�w�"�a`�t�4�����6_B��7]V�
j����������,�T0C�����K�w��/�4�\�����qU3��h����qL�������@����5:���#+�Q������Wv��������<���c����/�-���w9f�D����[���F�"x�^X7:F���j3��4��"`af���n��.�O�u*=���=~JdU�^��!3�(�U��m=J�AG3�������i�	R$+z�Q�52q���q����f��<�|�M�j��~��F-�ji����8�F��T[1��#Z���$�lV8�M��e_
0��� ��h�5����������)��f/\�C��U,U�CS�s6R���s����*��.[�{8��,n���xJe�
�����(����4q|�'��-jVtK�~4����
��.QZ�%�Ux�����UC��l�B$p��
$v��h�/������P�j����AnU(ZT���5�C ��H����U���|��c�&���kk`U�������)����]Bg�$9jV{6��q�y��U�����w���������a��@��4j�UAD�d��j���	2�b�����cGH�/E�����]w�L��"-�?g�����+j�
M3�y�mcYv!o�2{;e���(����P�����yW#�dG��j����-���_F�j�'.J~��|�B[�Y�^�����Wa�T�������g��t�q�^�a
�������o=#*T�JP�x�����L0M�	��DE��}"�<3g�1�Q�p
��"�r�	��(�dV�JL��=f��'�i4w� ����������A��E��p������*���:��*�� �����;������p�"�U�A�����tW���Ux�H|^
x`���U��uZ��G�x�����h���z��c������P��n4���xS�����4��,�"����o����N�����[���+�$r<p���UR���X�s�w�[��t~�U-�E6����>mH���&��Zwg%��5 A��0�*|d���M�e���Z���O��""eRV�m/����-��?l�.d
|�� ��]UU�"�*L���������+e8d���f��v}�BA�!Z��D�<aF���=�3�pZ���:�zU�%��T�r��/�g�E7���Y=1����h�0������t���>*���u����1f�0
Hy47#��w��8��4�p��~�������h���|.�����vO��lp�����M���s}W0bBYq+����q,��s��a�"`cq�L�5hB;j��7����gu�����7��Ymt��X�>
�
���k������&<CaW�A�	�85�	������q�gt�Nx�4�M���(��Z����-=j�%nB/@On���. ��i��k��S����N�9�)#�]��(�BP��j����RSm*�Jl�4Q��5Kz��k��V�8R��&��UR���C��D��9��'c/���lB-K���>��fk6������kDg�&������W��F�MPQ=�A7�����/	~T���'R�'�6�M����9|"�����4h�����3��&T"�k�!���a2$z���N���c�������D�Q�4n��d�D6�%���~����_���,�m��w�l��P�����]\�����2���{�DR�$a���.����DF/D���'��'i%9$�O��j��b���������4����� VV�"�&���e:�i0�����Q'�	Mh��Z�;�<�%�x�[-����.��-�ao�@���uQ��{�d'�b��D�U����bb��15I��fc�[�l�����GsLp��J}�W�'�=\m�D�N����-D`����5]'�3���Juj��`�&� ��7�)�����8���F�a��.�C�����U
A�t#����s��[����Wc��F�Pf���%b�7�@�Ul��}��k�:(E���C�4�f�Y_�� ,���l��������fUr�����c�#cG
���dK%04��+�U��E����8�p����L�*��3��s���P�Vhl��u�g��^�G��A�]0v25����@�@upkME����<,���(�U��1JEUB.�#�����2Xb6l/�Y�����oG�4����0��B�[Y/�;/�g��7�y��t�5�5uA��A�u�#$����)�O-n�X���D{1J�������Xw`����:���'�.!J���������DB	�v�.aD}�.a��<�yE�$��d�](����pcC�s����,Im�F�����I�����������(!ZgTYw�PRa�0T��[1�.�J
^�����j�=F
�.����4���$KDn���^(X���|q�D5p���fi�@zA���:�*�%E4wk����x����1��F��YC����X�USfG�FM�sJ2:fwp�}�������E��M �r[�����8N$�%:�t!
M�T7����_""%rn�jW���5��Gt��Y%��	�j�*��'�@�G�A�5MT��<���Q8�2v}����2
�T�����F��.���j.�"�M���>-��O�	��K�7VC�G�-S�yk���%��A��������
Jb�M�O����u��.���$~�`9;v�?1���F�����,i��|P&����i
�v���w0J��N]�D���![-N�s�f���39�G~y�v�h�P}-����g��9�gu�#�{���_G:�5{���}�8,�����e4�.4"���s}�;]��d���05�����P�.d�:��K���B����;0B7_���ls��v�O"�H�H@��B?� �;]7�6O���-Y�:1����x�Fs]@�HxId�f�r��U*�8`Ng0e���t����-D�N=0�I��8�b����2��io��Q�.��@,�XN�YG���:yC�:��������x3�a����3�cq��S�1�2Y����"?�aP!*�����	�.�o� 
�����e�2CZt��d���;�56�	I�&r1}�n!���p���i��lp����Tz0����'��Xr���\��#VQ�6,��n��3�
�|�h���xa����"����������C�;�A:b�YG�r����!�aap��bZp�)��0B�Q�C0+F��
(B�8��go`�@=*���<j!+x!�gD��a,$������?�H���{���Cx=F�^J��6c�D1�=��M�b,���HN|T�
��p����'��e�������p:-s.���i��,:��T�0�A� q�*�J����X�-�Bh���O>�9��29�/��T�bA19����l��?���0x6^(;lt��Go�J�������,�m_2�>C����i~GI*C��E-[�
&D}�1���jQ�a��4��'V���Bh��`h}����������C0B.��:z����s�c�W������:(�I5���N�C�����������K���b�r���p!�-;b
gP_����|��&�!��$�E���[;z��	a�,1��^�_���D��eD]�!H�?��;�~�*����p��=�SW�tP��g�K�=��Vd������Z���s
�*���KE*���\�O$9�����;��<uG��!��p��Z��)�7,��f�%�t�+�b2|{��h�o���UR���@���S���C�x�O�1
aX�lH�)��J�6���	���C ��?,��|#�:o�)���J�$T����tl�v�5{/`vV��~M:  #�C����!���
2�����L�&bn�8�6$��,����B)�����JvK��y����o�8W	d���-�
,����Y[��0��������v��r
����{
���1��{
��Z�S`��,0��p����IK"��Z��c�~�9�rd�S����w�l�_��&���Rm4��Q�4�m�K��Mk!�~z��6Q���k���������h��48�G��-���gdcZ�q����_�<���$I� _*Z���
X���o:6"���b���D���j�)nk����MA�>a�
#�D���b�c�H	� a-[�
cD��i�����8�D.��R����h�gt�Y�� C����2_ ����v
��H�i�
��9qVug�)�-:�M�,e+��H��/L`D��L�!:x#r���iHb�����������:�leo��'+"OWGm���N������Z������|���P1�v�*�v���6]&��B%�'��4'j
Ma�D�?�S��>#�&�$8���Q�
����	�h�]��h�������TC��vr:���e����[Bt	i\9�a��4L����6�X/G����h��NFM�'��h�:�����(������Y���)S��q����$�7CT�(�SP���(]qB���iK}J���C� ����iVpKC=�t�������
�k����������3��9}R������vG��HB�9?����v\5mu'�4+z�:���Y�p�g����-�'OA
0,�,�6�+��j;�afk�����Bj}����������dx��lmY��h��)����6��eH~��:�������DC�Q���D����w<�s�4&�������c�6�
 T���Vk������?X8+2<�Bf�_M�
���xo�3wp�����Yo��e.zTB
�Sb
_��\�Y�LA�G��4�����S��Fk.K������jz��Pc�����K��F�;�pa%�2\����H�k	Xh�Z'�e=����Y��{f��^�HT���-j�����V��I}M�~�!�wa@#��f.c
�Py=��F��n8�F�����U����E�Ql�z�~������x��O�z���q����#�2�zO2�x���.���!X�~�*+	W�.����-AalqsZ�"_��H5�O]����E��)���:�W%�%L�������m�+Ba�P	y0E��Um��xL*�AK(5}I�`M�g;����]�������$�P��\���ad��p,D�>�,���.�ki�/��F�@�.�I6�����nYm����
}�c��J��fs��|N0F���� @�|��-����TN��
OJ����%/��B"��W3�Z�o�f�p��=i{7m*��]�����y��vx!�{�fGY��b1#/������P���s�������'P�r��W�a��){T�(�L���[��y�]c�i-��.-d�1�� �M��m��neg-K(:��jd���_)���L��	�������9S�rB�f<IyD+����3Dv���~7�P1S�2R���_����f��w����1E���APv!���)YX��)6����vj�ai��I���x�]D��5���0�6����>M{���w����nv���q��#�>�e��T	����e���a�FOPx��
���^�4n�GS���
���%=��X�62��r�4���8"DC�����c�eE�Ck���z����M;"�������?��L��-b�4�v9R���9�&!@��1�+����3��%x�$�FS��dv�z<��E��l�&�@[�L�4����]��J�P_B-V��n���w,��|��P��T!���x��f��:2���������	a�������P�
Wd��VP!|��W�v��c��r��y*��O��oV�9�z �!���!�c?%�P�	��g���Gx4�������?���u(����x�a��l������[�'1~=
-�wA�W���)�kmAt�F����j�"�-��g�~d5�vdR��Q4G���O��qa�+`9��0"�c������"J��?
`G������{�)_�T
���N����-l#�����(�J��c`@�S��P�s�[���+�v��3��
9.�aEe!q[�F�0�����������ma[��#�$��B���pn��o E�+��X�����w_l-2�v*In�q�f8���$�����b/z���FRL�K$�ST�n�W#��l���KK�|��O�|��Tv�6$��l3m�����dtn�g�ON��R��������@�?`[��*�"�%�`	"��8�d��'v���=�u���Q2C���j�"�1[�P����nvP0�W�"��h5��Gc4���d�N������R��-�B�[Z���u�	�H���K�D��VN0������ E�K��Ap��NwN���GA���I��rvJ�~>�t�34p�������[����QGE?�:�?�I��N��It4�f�t��!�����F���U�W���p
M�`�L���c��0��J,V��y�?<A���?������R�D|�-4B\�~���l�]�b�����3V�^��?��� ��&2�v����BOC����^�$�I��?��*����ncq��H��T�+����"���)�C���G��	��_���N�����������V��������X�~,@5��L=�����:�>�Fc�V��4�:�����lf]W�dO������@��`(L?����#��_ZnAq�n'peD��-"C��u�����1gv(����y�|}G����]�����3�u���]M���� ���,	z@�J4E���2�Sm
�I4�/�
;bXT���4���j���q�+��d��W����U���#�<>�����?�6ZQS�?���#��fv�!:�t��e��#�@��Qe�G�T��.6������,�J��)W�6��D�BzfT��b��d���I��$9"�jB0����\G��������h�U{jf��X��$�E�|���3J��fg]���lw>����Q�WdQ}v�Ct��t`u��9���6.��;N�@���H4���������7���h����H{,d��'r��z�[G��#��Gg�#p��=��j�:�.�1��|�Al�z�����lW�4|W"��3��1�t�M ���S�c� :������I����aa@�a�.���!��k}>�`���
�w,c0��h)�!:��%�������L���8-zm�ZB������J[�L�u�n��v����h�����AC��J��C�|4����9k>������q���`c���n��2D��g��3��������WD6;�Jx���ESK�@��#���8�!��u�A(�IdU�=;j�SQ"#� ���Gw+����_��Mu���l�)D\�5T$��5w�%���0���d}5���X(��6�vL+�x�NG�S7#�6)B��KV-'B���K�uo&#�*a�y�2!�����`�BVC4��X��u,YG�MtJ����mx4{�����|A��Fkc�?iV��N���`����������0���g}�1Z�0v�s�%���c��cV=�� "���V�x������nEZ
uf�N�.a���[z��t�+�5�(���BA�K�F���#��E���Mn��,�GM�w�
o(�U���'=��:����(3�E�������0�H7z�y0�Yd{��F}/����;FD$�r��/�~���H'q��u����
�h�T��������d��mK"�x/��8��x�����%h<����i�}�M�N�t�M�	� 5S������O�-A���FN)s��xj��|/�]����HT
�6����w��IC���IcKj��t"�{!M8dw
���O��u,W����D�w������E��~�#����s|����������c�\��8{��<����%�>	O���1w=�]R�O�����AR)<,S6�����K��A�>CZH������6��"U�{�?"&�C��#��{
�4����
K����|����w���`���f���@@�J���\�
����d��%{����<������b�n^������v~w����+v����Zk������F�w�Wq���\�5���Fn�0�&�{���pA�("�Z���^C�
�0K�����:��E;������g"+����^/i2�#���� -n$�H�yK.8��e�R��l���ju�W�v�;�/H�J�&�Z�ZQ	t�j�Y~+��,�ID�p�������D��� �}�3$����Sh6�@��usH�Y��;\8����t�yZo<�1�c�`
���;��������6�������i����VC]�;��$�B������4�	�����=ZHI>9�F�� "��1������	��U�	}�n�����R��/i�M�������l�8��1v)k�m9�����ic�����= �ql�!NB�y/���F���f���G�N��|
�����/�
��p�pW0r~�C�J���%B�����-
�;X����w���s����iq��L���q�DB�~Y���P
)	H�A�������T;�w�BV�=)���/Gb#%�hd����5������7L��	O���p���X���H����*����pEF�>��,�{�B@J��#�M^Lq259R�����<�����|����������I���S~��{;����^���fZ���w��Q�\s��YcMuY��#5����qE��aG��b�$�Y��[�ncL�d
K(�P�P3�J�`a6R�U��@�M�Rl���vf�(,����}�I��h�E�h�Jfj� #Q����5{J%����M����S�XS��|����J��q+v-Z�����O�3��
�h�.�V�6�"$�<�����^���b�!�J3���u���E=�����_��EPDW�dj5��`���O����	�W�6"|Lj�b�<��E��HC�Z!w�Q��m�l��K�=*G�!H�����	Jt(���Q�|��0��B��I@��q�utV�_��UN�+B��l�vV��p�Z<8e��JK1B�� 
��l�]Y���@��^�%!]��"��F�"|ad������n������]���Ul�����F�uXX��C���Jk���{�?w8(��r�>O��}h$nz/�n�W�e�}��
	� ���(���.(""���s�^F4�u�U�}��t7����R5m@��l2���n5S�Q���T��������}=�����T���h�5�pKh��H���C��$���B������},��E��`R�O�?_�`����G�����+�0��(wK�z	ch��d?]�c"E'�8���gbH0�PrZh��q����!���#A���H@2�t!�����W�H�W� �v�p�5}��I����3��I���\���|��8W��
@@+G�ic�#w3;��f	�_�����$���:�cDf��0���f�A�|����O�����fM�r��K[�������2���QFk)�P��7���3-sw���j����7���T����u�@W�U�>������F��j1�G���T�5����������>�HC������@�L��U�=��7�b�A�.!�7Y��Z�U���k���P����^��.�]���w	�[t��t�jw"���T#�u-p*6q��������p�u��D���0$@����({K�n�OA�����Gr�rrVP���k�z�U��J��F��WRg�w�z�QqTK�=
�}��y"A����Y5k��D6h������9��m����i*i��6O*l���O�#	��X��)�~������o�vpa���c1 ��E��*(Hz����	OK�����KD���$�@R�;����@�%)%���_�>�e���	�VZ�wMD��� ��	��{�M=�3���������d[<H!�������T�-���������|z
��v�������/�%*��}��������	)p���^���|��l���g6R���n�D��i3f^`!vD��/�������*�b��#l����yF�n�/I�\������lg�����~��d�`Tf*|A�o,�J���R�OLt����:-C<�H6��%�����lbH!�*�E����)�QC�
�5�:
���@��g�:o�Ly��T��u��@���.Z�#ac4-A/�n#���U�,��|��U�*>Fy��O������^�`lY������u����Y�7`��������X������)����c�������	��F0����B/�����:��"��A'�Z��f�����A��_���}�Ol[�x��yD��g�*c��n��P�e<��m���
8�
���9\q��0�\d�0��3�`jA>\v�h���������l���?�y�*>�:�UK�q0��e:�:�@U�p��v��<bT!����\������G�fE'�f�����.�K�\#�]�;�Bg���	8�P��B�w����Oj�&�G����>q�W�5�)��	v���91�v���S�@o��5����H��+k�^m�_7:��1�	v�5)��*{�dgi�� �1��As�;���j6k��0�y�u(�wE?I��{
[ung�d��V�T��;�E��~:��[�5�!��b���:dB4����M������E�L����4[�m��������Z!�����77�t�-��L����.����k��3{��D�q�6����m�
i,��'8�����~�?�I���\4HP��Z`���I��������N�[�j-.����\��6d�ls�t�aK�������}��xv����2D��5&�>��wVt[?d��e�T0�'���#]�}��X&��L��XI��xm�f����RY������E_��I�����1v�� �zx��!��+(�0�0���N�oC=��y�/��8lV�8�u�������i�*���o��!+��J��`�����L��0�-�V�Fh�Q7�����d��f=����~_���AG�FsF�"z��x^��E�bS�8����{�1����{�&����B���]C��c�n�|n�w�G�t����Z�]�a4��\���a3J�����������M�lT�_/�[Q�Tt��)�JT�~T�T���j6a���(6>Z�9�%��47���EW��OM�rY/������x�8EA��5MM�������E��}���hj�Sd|���>BCJ@"�kh����*�)����H��y�}A��i��z
k��TP�?Z�������;2
AW�_�������.��AB|4�����7����j�6�=��k�R�kK������DP��P�[�@���P����|���P��h)���(%=m��+�6C���CE���H���������ER�[9����34�56���Y�h%���=�����&G�����.0`��\��`�%l�Vr�j��4�@������q��4G���);e�jARh��vE?#�"u�G�p-\���j�a�]���>H>�#�~>���A�h��HkM`�[ni��B6��O57����(�t8M#���_���d���
�K0�dr��5e9v�K�W��|�((���?pg�i��;�A5����l��!/ ���bj!���1=`P%��A��2�c�m��D�e�5
M�
'�N�� �����%r��7*��E	9X�����M#�Ow^�C�C�O�E��+����?{'������n��Dpi��:���Q��[��bS�[B����0�������9��DW�|��	V�x���4,w��Y���/t��M�;%_��vo4Ul�T�#����=
���o
E��psv��~]�A�4>@\����J$�����v�kK��.t�n<V������T�}i�M���x�}���n�$�h Gw+`a��Y��5T��R����M�mX�����k���US�U������m�V��+�9wFW��Y3i����l�������}V�A�
S��
]�%D����6F
����s'A�7V��g/�D�r�m�K���h��>�������E�{�<���l��:��Y:t�
-;�
]�D�T+��u���M��T��T9+D��������6�|�E��,*�@���EW�u���F��h������q�g:��.�!��8����>�SWx����*e<�,vF-�M���+<�uXm}�C�����p<v�IV�aQA��
��0��ZV,��v�i�������#����]�"��mY����J��Cp��eQs�52-��E`4Ii���y�G�����n��Y�]����f��h����0@@�{O	�d��H?7�	p��V�i��Owq��!�,�p����1�Y�����~�vQ3u
 ����\��f88A��H��;�	H��! ��k����}�5�@\��}^v�F��A���?��y�V�NC
��I�c�`���{q�����;9G�K3��Rb��P�Os���� �F��`�-����'EKF�-p��������SR�s��%����[�F���@�he��<��tny�K�W'�_�����C�s`���4Do�����<��/?l�dls���t�vL�NC���)�EK�oC�@f�4,/�����=�m���,�||!����c:���i�����E��tl�}`��#^���-��Y`� � #D�t1e��w���>cq����k����nD��U)��Q�p��������p������t�����+p@����p(���B�����5�jRF��XecfD��x�SpS4Z
b\���gD�YT�7GnC�M��uD��"���.�QF���Z��!���ad�9	=w��������������	"����r�����O����
���-������8PF��Chf������<�v�f�~�	H%-�#dZ�!a�.�CGp���>o�"����C���%!S�G'd'Y��`Mkt�K����g�lU9�����m�f%���/yESh]��g� �[pVlQ�:
��JMO%�p�O��)��-yk#r��_\s7���,����Ph;�(��Y5o����l���)la�J�������&4{C#2�c�����y6R'V\;i~��@N5�X���4�;d}�)�A���'lR��-��s:Q�9�9@\T�^��n���l'�&�Lkt�:�X���0��!��Z�5���#�Dv*S�C�Z*S��o`��;fs�����#aVJ���_-���ag
|8����)��?
78Qu<�4�����^���m6�~�{��">�l����Z���66�Il<i��4�U�<p�4��#"��y�N�r��p�)��X��Q����"{�#0
/P �����@�&
���<��1p
b�W*��[������S�C��.`������8HM���v���a���"/������/R�f��)� ���t��D9� ��*�@�[J����.����M\��4Js������z��V6���M�$��������G
�NA5;4:�N&�}���s�����5��u�|d�bF��f�4v@��p���E��)(�:	�wGr�)(�41#���wr��3{���g�m�B����o8?� Z��Ayb8lD�\A�O��������5�uh��I��>M��4�L�������.�]o0�h�Q�~.�D����e41
D��t(�b6Gn�4y����Q�Dk���-g�b�R���>����c&�.�����,�G������]f�1�/N5�3��������R��)~BQD��N{e].��ghu"�`:���
p~3tZQ�5u�_���/��g���	:�0��:GNa`�R�-��'��9?�I���K����Y��Z����kx�'`�����R����rjE���sA�>�%T���G�{�{0"z�r��	�'0�y���%*���6%N�Yx��� B������������h�_��~}.Ei���!�i���;���J�����l��z�����8�Vq�sQ\��W������`�B+1�%�j$5�h3��Z?i���h-1Jp�W�d��_�W�*��>Vn�;��8�e����$���������b�1�.|���U��pgm�g-g0S���2`���X�D��[Q�)]�����M��q�!�A�hX�	�e�e@\���0�!)KO��(��jF:�&
���J������s�cen���D����d��	%�e���g���l��nQU��v��F
�,'PA�G��X�q��\��a=P��3��R�O����6j�n���4P��p�P���Km�
k�wVlP�h}8s��]>���aU>C��h:e��-�0������e��K]l��Bn2����0����"K�%8�7����C�vK��IA�] ��O�>Cr�����������������(Sd�g(�GZ��G���c�����y����I������;�V+	v%��Q`�R�_� �q�cv-q�)�Z���gf�v� �%�������X`-9	��k��������zP��O��?�����fu�p���r_VL9� +�����'�B��������-t���hm�������+�_�s��@4D.&����������/�l6X �������d�#��B� ��W�K�M9��|�Pv&7���P�5��]�C#t31����>/"n��P�=�S����t���F�������uc$AM���!M^�	�;�~��<aG���8�=I���#S���v��=��|������2��P
fT
ex���}��[\r�f�6@�n���c X�����k��)%�A�@�E��6,�������K�
�8*	�pN�(��h�N5`!t�qf��Q4��}�@eY��ob�r�*�"{��Ie�����-��]�#��m��-L���mX`���q����R��j�H�F��~Q�����0�R�9#8P�4������7��I<b�l![�|�$�t�����Z���5p<f�������7��Hs����-8
={"��XF'��,��S�@X�o�N���- L���l�����e��>ezG���8�S2D�-�a������w_��|pgT����t��g�yH�.����#��.���3R!n����oF}�����&�p�-�;���z��w��6��r|r�����9#|�����[�n���K�8kF��vB�3��IcWq�����\Z��w�,�?�D����-$I��4@3x�X�d��m9C��
��������-M<���/�g���vK$����M��g4"�k[�0��G�q�k�|� ����Q�5
�e/�=�aw������������Oe^g=�-�B5*N#J�bd��=m.X�����d��FG�`�)�pG�-`�������O�Z��rs���3�)��E�������\g����8��:G�h���`�6�+���������p'��r���$RE����������<��~�h��=�&���Kn��?ep���N+�+d�~���� ��e|�����f�7k}��Q��(o�8�oh�G�����Y�������}����!	�x�m���6�n�
$��+���3k�����g�{���*YK��F�=�rs�q>O���c��C�=�Vd"��F���xp|��l[�QAGd���t�1�7K;|`�]G0Gd��������8��Y���A.�Rj{i����_\:��?~���n/i������t�s����i���%P6����GxI�l�4wg��?�g������Ut����W���#=�r���8��M�~K��y���"X�!|N9�Q�w����)6�hQ'�!+
+CA!\g��q4�X��M�cp�-� ���1����!���j��\��,�5�[Jd��GP�ibpF��cU[��X�Q����n/���������0�&K��"y����n��p���E�Q/:��p�|\���x3Y��2"�����.���%M�55�?�PD��c���3���9a���`}����hU�|
�b�x����-y�p������G�=��}��5��b���wb���X��C�� -�.nS=�[F��c-�-�3t�|��h~��Qj��Q����G��	� 0h��9�-H�A/��&�",S���Y�74"���lo����"�����'<���=�g���	v��l��(r������p,Qd=XS����d������Gz�=���-�%hpI{t8=_L3�[b���0�
�|]�y�B{��0���P���)�8�!+N��p�yv�?B%J�o8F%�c�u)%��"�eO�]A��`�A����lu��+=(�����	r����Y�Yk���W���r�P��:�#*�}�B"ND�9��\4Y6��)N4F�Y�� <����nAs�vk�Wu,��z1n�������}x�Z��o�43�<�V��"�cP�����G�f�x�����+��E���Fe�P�(b�J6��Wb4F��de��&�KV�����CP?�O�'��o�����R317�����2M??X��Q3��9�g�@t(�����J�����=�b�����`��-A�J��YRAl ���Q[�3�X�G2l�YSIi���w�;���#�f�,�]`��L6��<>P3����9�s]t���rI1��x��~�HO�W�H}|^�5��U@�����^C|B.�:�,�	�����M�������d=OK�8�;"�R
���:�xdS����d�xG�_��,�l�����:"�U�LQ��;�}_�N
�w�<���G�U/�����������,�5���#g��zG�����=�d/Z���������
�������,���^���;��U�3�:���_�M��~�#T���?�u�6a�KT!+�rxt��~��+���e"|"����W7�����cP��|�a���LIU��&�����yG�N�P�.D���:����H����w��YB�~��������;F��K���y/=&���{�E��#���:�&��~,��?8�cn������Ew���wd�u�@s�Jh0�5���xGT�w��,��'��pxF���^g��{0z�D++��U�����^������;<�dk���'�/_����0�/�2�V�4n��	{H�H�VI����6N�lxG:�
nW�������Bb���>ay�����S�`��]�dZ����?���7��P�P�v���w�S�n������������@r=����},�y��j���,�F�#���?8w*R�>ch������QK%h�|?�5�=�`�l��E*����� &t�(5���3`q�WA
Qs��]�T�j��-r�1l�%��2��u
������Q�!�h��{��
���%�h��u�k�S}G�=�>����8O��n����Gu���Zl�N�.�%B�D������6�m�s�j��$
���w�	����A���)���r�
o	=�� Mxa@eJ��K���%���Y��~�(��������}�;�
4�7�*�@fIY�F(�LL��]�"P�E�m����L��
\�����>�q�pt!�7��h��$�� 8����:H��N���UY�Y���|_��6��� Pgb�v�A3z�@��h�)6u��gw�J�f�;�VP�fcq��)6�/^�RX�6ds�8��3:�g?L7��o?i��|���[�����] ��]G���OQ,_�J,�m��_^�o�7��"�"p�Guz����	�)|-�i�f����q�QoMZ�=����Jv������`�zU�k��,vw��1J�[�"B�n�B���n���Q����~Q�i;	��-�c����
B������eE���$���v����M�JD�"���w����J��)�"E�U:O���}�B�����)���gX����NHx�|��"���H��Qc����"��K��7���S&�.(�8Y��cD�Vd���+��z�f�5�4:o��@F��!�Yr�O�=�n�p}�w����G��v�-��}�h��?�-P��{
��[d�Q�t��"��`1�sJ$�z/$�4�8[�-����$���Y�/M*��2(�3�0����fN+X��,#P����7�D��"DB����"����T	��"#��66:��T���D��������kh
���p�r��KB!p�dss�o���K*��1=�i��Q0G��>�$�]�v`���E t8�5q�@�()���^�d<&qR��������cC�en�Q�Kt���`���.�'X\��ilT��OA�fD�,'o�Z0������	\+��WE������J������u������X��3+]�}�~��%d�M��V�N�9$���'4��������t��I����$@>�#'4���Q�{!���I{���J���A���E������Q�A�4�a�;����(��G�}JB��)d;;��2�N�D[���I�o����N���a�c�f�u?�D�.�u���$l�nC9�T7����E�����u�([v������<.yU�h.vW�=�E���Q��u�5��M�q� ���~����wW�)AR��wUB� ]�Q�
(�:�;�b�?��<����Dq[NJA�����D�I,�o�2���
� �gF@t5����^�o��F��R%
�z��>\��D�p����&R�U/B;��b��mSo|�3C2A0#��^������I���]�w�&�����o��S�����j��C��LH���D�@�P�x�-�V��}GGB��U����t@�����+(���]E�&i��:SJ��HL�G����tL>Q&����P��������f����
�y&~��g��vgGD-�j���x=+�[T�G���n�&�������O�RGD�j����D���
V������,:�V
D/:��W�an��N�?�)%�| ��F������Ed��� �E�5�"�Ku��=��@(� 5�dUa
3=������4�7�]3T�,�N��IJ
g�����,;>p�g�^`�#�H�d��W������U��[g�]�is�ZF�������J�����
~��87��������l�w������TfP=�HDBK�M����V�����T�g�N�Tv@������_�J�o0>�����6����
34��U(��agC(�]�H��X��wB���2�{o���8	��+���	o�X�uY�}��R����e����0�*yG�@|��"9UHCU/�R)��I�H�)�u�f?��>`P��]m�m�9��{�.�L�����k�-��������j��3�������r��j�x�E��ezG�*d"2��U��/��E2�*xB���Z�<��F-1�T�Q�!C;\����AGXX�wx�$���w����`��t8���\���Q�o1f��.{#��!��y��EY���^HHEv�>���	A\k����4�/�tum��-�Iw�&T��A��
��Mp6H��h�n�,j��Y��?vkiN�����b
7�)��f2aO�L�&h�����0���F��+��-z��G�12D��Jw:B�����QHK����	o��F�����JgX��];�����n���*P�|D�i��^��'��6A�%eZ��"�Q������y��8�S�:CQ��Y��9'n&�N�FC�m5�BI���4MCO��v3�p�&Q��n���l��"�1��'�/�8�[�����#	gy��s�F�S\4Z;��M�Y�GOk�`����O��
�ca�E]��\�E3��gze�2������h��\�N��`%��&��=����!��:l�P���?
Mf`��h���}��<�P�{R��	^�"+�� ���;�D:��H�Hq��6����ug�����m��,�
�D=�&���Br����p����s��l�NV#3}�&�������`��$�:�T��)���"���}O�������!�LG��������j���G���w@��C3�0Wj����,� 3���y�?�� j7�����S3��6��;_G��t������H��h�������)|�����G������oK�"�S�E
z��'M�k���K�0���Ys����P���-�	��K������mD����5D	��9<��{ZY- ����W����MH�u��D�U`<l�����Et� ~	�����m
m�[3�Z�Et�����.H�h�n�?�cG��
{qVH�x��������;h5M��7�h�>$f4R�/����Jn��,���	d����	���E&?������?k���7�L�`���ufo���l�I���.Q�F������,��xQ�m������k��aZYi*<��bSR��.0a��GG�.4���D��ns%m8�f����szw��]�Xy ����2K����Ab�!��^t�0���%�=���m�d����L�������[�<��pY�F��^�[g�!���-R�)bL,��{ontG�l|��l����Q������
��)ld���^������B�0rd��;�t8D�k��R���/��N��\��8[DM�.$aD�Y�0���r��.@v�>t���/2��OF�")����@�M���73FJ�;R���6���)Ha�p����KRwA
3ju#	�)
#�]wt�6wF��}o^��)��g��F��XcQ��Y����4���\���q��3~K�������v��9��dp�&�rX�f��@`���3~�9����`��$���]@BS|��yr
�*4��F�_o�vz$������h�txC�u�\������t
��a�@w�/u�����&]�A+�m���	��1%��v���_�-��d�>�J�5�������f������I����cd���{O���S0m�4Z�K��?-+�\��t����)m�3Da_��:j�g&�`��
a��\q,��(YS�*�<
N@��"���ug�mN�M����Q
���^f�������I#��g�ejH�2SW���s��f5�����@�D�k�����]@���R���L)[[-n�F����~ow�����z��_���������_��o�Y�wV��B��Yn�1�-���i�����^g�� i>P��)l�a>)I���C����F��
���q������S��$�l�*�j����s����!����`������w��P4��8$F��������(	��0��A�[�Sm����wF-�N��2�%B�����A��F}?��Bt���z�I�,��EyeM�!�!�g:D�������r0��B�Q�'u�*_vq���aF�����c���!3#����2�:,4���3�g����!���J��c'O���F����R�q�a�C�#�X����:AP��F�n5��]�_fo�"�f�C�p(;�_�B�h�|(���9�6�=�k�k���x��q��Z�?���m�����C0Zl��Z%��� >�����~�K���.S�;*�Dc�B�+���8�y�q7u��
�
�|$��}�r��nC������$�+7a�A����WO6M�N��F�H::O�fsj���
��
w����/��@���-Z��t���f�8X��r��U9�^pX�Jp78�tfd�1����4�04��4,wpT�mH<v/�s���D�a�L��%��:SC�!���}AC�8{Z�n��G�C�;^�Y��jd�w/3q"���1o�����}K�b���G0:��0�w�"4d�]�_=���2�h��
���%8���t5�n���9R ��/�Im����YWe�X��4 `8��+��@�1�xX����<��mfG,�a[&��=���g�)C����M�LJ5,����A�~�J���!���1������1��&��AEMf[��
l}��@u��������l�-��A�L����"n(��$�A��0����1n|�#M=�{��-���=�/���?o��Y�<r+���N-���D��@��������&)/M�heX�U'cl�������`����@
�y����yd���
��2�ZY�E�b���V�l���hYC@�D��o��d��y(^I7yD?n|��wI�k
�����'��a�������5	O�N�>�&Vxh���bh��+r������V_�(qF�Z��
�m�-b���w���y�����i�$hF3m�5����"�|��Z�lYn�|L��fv`�?�i�nCB�����[qlt����ut�d���QM��������D�Z��a��,�[��(�a�]�"2�����?y���g��n��dwJ�]y�He��)�aF �4�������uQ2r�,�{&,��(�2�iavc�SY�)Is
I�Q�|���e����k���	?���
+�/z�����5��OA���[�U���f����g�,Z��j����-F����4y�e�����=r<��������V�
�����Au�[�������f
=�y�l����~m�+���fQ��JZS�H����d���q�4�/��U���<-�gOK���[o�� ����%)��o���/�g���x:���*R�u-���z�`�G��i0����bX�S������nNw��NB�p�K�s�`+����L��1��v���IA�/�b���sL��y��!�
w��Jdq$s��6�	�
B�"j�P�����AB
�����7���G�T����u"�����h�:�pF��Ya)���w����V4������8��kEW��5�~+(^/OsO! Ep."�`:��ey���������m�1���������2���{�W��7������S����b`���B:�LL|#�m.wy�dE��)!<�X�@�e�����������c���X+��F*�)�o,H�"jD��)� ���U�#M��
�D<&8��	,����� }y������}�����������d��)��m����������<)�P�u�A���VncQ�������T+����::{Dt�iC���>i����v8�i�?SG�w�����[d�I�?����zp���%�a)ax��V#`z�V������h����M�����H������9{b�����=�0��(��"��m�<.�NtLXB&���JB� �]C��e���5%�@
�X��s���K�!�o	� F�it�Y�'���3��+�(�/Lz��7SC,�0a��}K�D ��`�e���b���B��Rk�U�{�I"��q��dd~��>L
=�����"�.T��%��.�]sdE�C�]�"N�r���{L�X��=�]�3��YE.���:>!GSX�f�g�*���Rt=-� �F��-mP�B�B �	9�_�4pV����i@y���D��r���hBQ�����Q�b��[b3�,
`5�)U�+�3a���f;���%l�H�����=��~Ed�%x�`!r�`��U��h�
�@I��=��p���i4�1N�i���$�qe�OxMK���
H@�{�(�]J�H��V���v=r���sw��~TH�s�v�n�b�����#[�����#V��V�Y��5�.W�Z,�W�z���Ot��g�$��*��F��|�;��LnZt�]�O�H'A�DD�DD�����"�3���*@��K�da������Q��]��1��ib�!Q�DfL�Xt�h���{W���npz%��0�~]�7�H�4�m��I��hvNK�~of=�l�D��,����7|��62_�%D�ZS�&�R�}���F����gM�� x�V� �F��e�����Qp�+��S������P��V]4��mx��d�K""0`	���G'*"E-��y\���y�#dmt>�7gv�0���h~
�(8S>��
�]���h�[��5��`�ZhV-���;�d�p����K��b�����
��4�9�T���1�)}3��^`���[j�e�f����S�����F�(�g	���!����u�Rpd�5@�#��e<���frb9��A��1���-���I��M��}$���6�A1����i+����5�nK-���,}[��Ry�-N��-�1�aS���~?V�T����V�6p���6V�]��L����n�N(�2�T������P	���d����N�L�B!�qG��
��I��J�]�N�Ph�R���iw1������3��Z�h���"P�\89Z�
2��
P��LN0��@�-�`�����^Iz�h�T���%n�����vtm����,�2G��	*�o3�=����1>V�c����ri��q@���f;Y"BFv3,�)�L��[�D�t�[�ut�t���#�-�3�2��'�j�wA �:h��N���`"����n�Ns�)�@����6T�)w~_��5���[j��Y�e �a�	�������nk��h�)�������������w��������m��i��.���������H��������{;��"���U����7��l�h����6�����M��A��d)��RG�h��=�r��b���F��O[�IM����U����������-�uT;�UFx�����`gT����a*��"|c�����]B�;�v��g;��"�G��6 ����t��zvn26����\nTp"��o�K�w�����h������%S���S[l���|nM;M����C�d�eG����8��J��8�x��H4�=�<�U	?��N�z�f�3�#��� ��Z��Q#������`-���h��h�U�*J^��������	�����l;L��96������q8������=�:^�_�N�
�v�4���	2B��J|LD��4	�rZ�A
�@�W����	L�p���������	��
�#��"|�~=�����M�������)t"�{��o����5,~tt�?d�V��l9^	�d�Ea
�S�����4E	 �+�m���������>��V2G�~#X��H+r�<��rJ��x�Jd-��(���u[�d�'�����O{����=j�T�{�TJw�K�l����z����	&�A�8X?q�-�����{��+fU����2(���5{Y�*t��u�U����CI��c�"�u�
�ih���5�E��EY�2�hq������sS.a-��]�V�i2���`��B�D��c�g�le��t��zB�p"��V�������gC$���������3F����L�q����
O/^�[t;$�����3z����Pj5FG����;2��cL�n/Y����*=3����k�����vc��Z��jOfG��8v�
����,+�[)�.��:�d��m�8b���Y��9Q���Q�����%O8z����@��:v�"���"�����y!5�-�3���?E��s��Dd����<��Z��B�)��K��=��%��Nk����8��RS��c(l\����<����B8�AZ����n�?�g��E }<V!:HD�G=�c���@zL�q!l�($����D� ��4�k���/���1���3��P��1���g��+��������y����l���5�����:u�����%��_��� ���v ���i�1���zf�������SM�-g���>Ru�q�qQ�g�z��?����	�lD�8VP��gK����u��A�����g�
������7�I=�5vd�z��=�dB��;C!/�������LF�^XT�w�&�?DJ��{�4qG���f8��fsRT����U�t���8vZ���n�ey�V�R��2T��d/�c#*�dMb��!0���)�Xpi��p��>�a��=3�E���r���q��v�{���B2�J��X��g�`l7�s�PU&@F�8�5����1*��j-/�\�~#xrFyo��q��A+��:����uj"�yG:���H����=��r!w�V���kE����OQq,�a>5�Iv��Bj�p�����w����k7���wQ����lo����kwX]�x�^B�-M�"���1T�3l4�U����7�����{�f�	Q��BZ��z����\�,�^�%��4�tU���w$L��@T0��um�P��w&\��)+�e�yS
�w��w���;�����Q�A�n8z�|���VXP��]_O��^c��?qI��iv������T�$�]�.;��uH
O����I����V�vvn�RBY�{+)��4��#A9�kX�3�N��1C���2�ow���C�~��%��s��=���R�&�Q�L�%t���'@4H�Y���	q�T~_�K�����^C���Z��#U�A��f���������4��l&P�;�����8|���{��+��~W8��4%`�{!u����a���c���]R�(�Z�.�S�����E������4�/��h��1,t�P/2������B�d��|������+�u�}�i��������"�/�D����h�hb8[6�V����PEK`��X*�C�nV�
���"���������� �uK�V{�a�����$�r	�[=�c%��^���O������q��b�H��I���Nl����/������3�I����\���v(��}/�"���#r�yK����W��>mA����K�r��&�O�o��j�|����1�xlzsd��=���m:E_���b�����m��6��]������HG�D�������	��Lp���o��U&d�w�����j���=�m'�lP��P#1�xG8*����Q}������<���I��Ba	�����R{�s����\XbHIj�9��5����?������(�ai��7��"VN4���}�D����&�F��=i�������zE�S�m�k�gGt	m���D��n�f����7�mj���\������1���\����Oy,y�:tD9E�`k���7���������"�A�����T.Y{���o9�b������u���� �� ;:]��>��V�"�!
F=�

R(W����[�4@��(U#|�s���p1� $x��#�p-p���a��L*���t:������
V4�%m)�bQ4_�M�44�$��7���p��,��g��$���-��NM����3��Q�)�l"�6�8DZ��Y]�uEG�R�MFB�~G�X��������D���@S>��p����Y�J�Hm4Z(<9�9�����f/�fz�#��cv�d��/0"
��7x+� �<BJ��5�c�Sl�t`�PU�����d��`��-�@�h
9
;a��b�%��!|��=d���4��.	i��b���m<B"MZ	�N�^s����N�KP��O��%����a�!�`dg�Q/�O
�v�:������?���b��E��}��s J~�%lf%��
�Y����+$h`�.�Zw7�^����:x
�_����h���o��F9�n<e~0~4H�>��TE�fZV��g�$y���@6H����G5-6[���
������n�o+%%gZ�3�0����`��c�/9�k�{��&���K`�	/0��f8$� f�Os\FGI��l�m���O^{h)��h��dl�b+&���G���u��+�x��W�jQN�{����Y�a)��+�
J5JyL8���	Y?
v��y�P��q0��Y�e��������8)�eN�	�����@��x��Hu+c�1e[� ��ud	l&RY���R����SFv�4�p	1����+x6�p#5������Vs�J�(���
��(���S5�D�p�P�Y������`��BJ��	G���_0���12���]�z��Kq�B��O}�^�.
ti����t���P�+L�y��Pu��r���Q*�����V��:�8���)���P.D��w��!��6Y0�%cGf��
]`Y��f<����R~e=��"3�h��L�I�Eu�T�d?��eN��D}d����a����X���a�9�Q�������7��!��5����I�:��������Kh�N�T
����9�&��w���Q�����T-`��h�����r����;�m��X�����.t4�^9��������6X�����	��]1��+��Z�0����P������F	z���������`���m�H�Q�k�/���������7���9�G�|��
X�9�Gg��Ou+�0��,������!��G��G\$��9���@�9�vkc�O��/#�U�b���)5]X/r�����JM8}"Q�������TgYm����v�G�:��WGM����r�hy�����C.���Ne�����[�?�v���Hc�^"Zh�eY8l�8X�H�[L���P�R�O�$.�t�*���43�Zu����_�~�_�{t��E�{
�� ���IZ�~����xw��x��jb�z���F�����:�=}�%���7�LDu����Uld/�w�-�k�S���{P��6�
��.�en�@���D0�E�����R�j����A&Gv~��Rv���R�����<��'P�d*�j������O���5����	�*0���s W�-�F��C�E�U��
��Q�
����5dvJO�Tv��� d#�h&���-;?�_	7��=��h���l��g�������4W�m?j�WzJX��H\�O�����Y�Eu��|+���������xN�r����=���w�����O����P�	s�L�]A��p�7�(��gEXI�r@Rr��7�,�VY�w��h�z���aPG5zA+64��w���e}�C�G*�i'Xv�E��������%5����K��rb�F��5Ys��v�|Hp�k���o���N*�i���-���f�}9�f��w�#� Go������'hB.�%���	�h�������iG{E���q��I�	���N��������g�<��=<J��G�
�T�FKX5,�e��lYb�j�It���~��*�f�'������Q{�	����r���&$���|ZHti���'%��j������>�,&�#]�P�?�jG4�������n���fp���;y��a��i6�c��#K�|��~y�
�-�o�C���pX,�@���SV�8�#�5R�rk6�.X����
������y��#�m�L�_N�n�;X��4���w���q�%�d�N5��k��{�d2^H�$�Y�Ou��n�;��t�(&���(���L���!p� {Q��i>�=L�����bR�DsN�M���!�i>7E�Y8GU�R�e����q���4a}D�����&5�-��Dxm�&4y"�Fs������	����E�"��B �������:M��=���s^�-B�>x�~,z���7}8���������rd����0��XM�hf:���h��s�d��~���������/���nAd���x��s�t�I���ezS3g�d%���\"B)�Yi��u�"����{
��e�k�
�$��	o ���7��|�I�xn�|�
�N��$���5���q���[��C';�0��4gNS��;�����X'j������#�D��Mh�SD%{f���Gi��g������he�6d����&!�@	t�-��GI\\��J��	j���}J�6�-��:�����4d6TMH.'
Kh�(�>�EdZ6Ki1�'s]�Q�5��2��t���78���.�&6��(���U��'���$z��K�F��>��j�C�����L�x7���eB����d���s��m=�/��M����0�6hf@	.������I#eTw;&Ac�p�^��gN�	Izj��^Xn�,��t"��8w��s4����pTR;�^m�b2P�c~�=7G30�����Yu���p������)��[�p����i7@��'Ua��!��I_�3"1�j_���~F��n����*��
���4��W/����2��p���,
D�����������s��H�aO �����>�5����h�X�]0��������??�'�v+��O ���6Oj�����Q"�t��i���B\O���V%O�{���S���o�-��������i���}w��gz7�2Z�,t��W�|��� j�vu�	����%�D4�>L���-�ow�e<����-�����O���`:�5+E�
����.^��.��N}����������md��>�G��P�!�]����lr�B�~y�40(p�'U� !=��&�p1�%j��fF�=���1����T�������D$j$~q���En�je
�>���0��t�0D��(h�`��C�a#��w��$��I���W8�������r �����/s���h&���(q����dp"�Iw�Bvq�������/������8�i�CT�[�������i4R�N�8o�4py�!�����>�"Z�z;"�u�t������b��2#���BO���Z����$�]�i��[�>����V$B��
H�I��E� ��J+�
�r�h�]`����H0;3.f���,&Xw4��,d������hc����c2M�OKU"�~w(4b<��b��~�oOiJ�����mi!?5n�^�,�. bP�F�d��b�do��>v2����y�>0wt��r�(P�@���Zc�@3A���a�21��i=�m$��'�,����S���x�;�j�x����A>�~
f2G�5�O���'&L������v����xl��3�CD�?�H���+�.�M1@U_���%v����w8}��5��'�t����^������H����X�,�2�4��J4�l�6!��F�T5�s��8f�����o<Jlpn5 ^v�b,EP�0(A^�����mf�.v8OJ��#�JU��"f��h��hG1���
����K��\�s�nX�@�{���Z,#�
A6�'>/�z����{������e��z���'���#Uy��E��b>�����eo�[���[�G���|��w�������XA���V,��
vl��[���Y���)���n���CV�1��![pA6�O�u�������2�ND��a,�`�}���a��������h�1�"�tO���\����V���mV��JH`���b�T�����U�R���#"hL�!e��p�
2R���)!�7#l*���n���r����h4��5o� ��?����0CA>w�U�%Jq�H��(���)6�l;\����\"z�X_$���8��"�:K,[��P|Q�3�O �c�������E
�^��A����c�g��K��Xn�f������T�U$vUR�;�n����&�2����
���!!�A�2��#����;�*�&��H��b����7�Tv��2��/�EDj��|��l���{�������g��v[4XD���%���w�&��r��d���.`�L��
���3����%������I2��a����d���N=�d�oM����
L��uB�y5N��r=D@����1��e��f^9IP�G����T8v��B�dd������,����[[!~GSd
c@�C�;�%���a}K���v�x�0F���)��
HT����6����D���4�m�&lo��n'3p���[���ho�B����3&�~�e4
Q�_�����Ir@����&A��3��$ ~�����hU��K�D+ik���q�p
l�Qe!����f�o	�':�O�O��y����~�S�H�'�D�zt�����0��Y>�4z�}�B/��$����������p
�`�nQ/x��:���E���������C���Q\��-S���(�&�s����9�'�>�PA�mvdV6�}m��X�4b
�����+B3��[�����.F�2S���4WSxq
�8�;�M���3��t�C�&�f��Z}�'�h�0��\e� w�~�S�
����+5
���q+5u��)������J7�_�a��#��V�E�)��c�H���0fA�=���3�Q�p
���Fl%Ex�������)��(��a?�PL��hrY<��U�� `������%{�:DD+��/�=���	���v_adO�����d�����_[�0��|��]�NV�����)g���	����K��UD}�9���;��`�����Z�1<��j���m���@��F�$�����#[��Q����A�Dt!;dF�H�V:p�A���h:�����g5�C��'���jT~P������B
)�z����Rv�u�4����[s��Hp�v���[�SNl���1�O�/����~���\����#�hwoQN�t��|��&9:4-��9c
�B�.%] Vkq�*���!k����!��H�9�= ���^(�/i4M=�4N!
~:k��Y�p������&�����
��A�%�
R/�6��N!D��3�ml�Lp�e+�[V�[����yo�x��m��ZsY��c�0����-�1A��f+)�$�.�3a0?�����%x��:z��Z&���������������hHK��3��0G���}���'!XVEd���}-����Y����Y�dv�]��G�tR}�%�"[��[�Vt�[6i����qc��,�%d�.%k�-2�KH�}�_�������P���������u
�8�1����L,�(.����������}��,�:	@�l[�Cx��{'��/a�r���5w��-bM/#���lp�l�	r�x��:	R�x��Rc�&�R��g+�����D8���]�]�����gM���\��v*�]X�8~���������
_�c�����[}��g���SN�/A��(�y�,�+�aB&(wA���-��j	�(������e�K_*��2��.�AC�H������:D�>4[>EX����Z�������k���;����vV����a�P�G�%bF:�%�@���k�YP�(h9�!�L�!��2W�e����H=j����vA����d��-�8���_!��L��}�C��%\"��"�C*�������E���?Y�#�pA!R��4�����;���7��.�r� ���n$�X����6.���2`��?� P|�[�/�}@��H�/�����2���([��b��<] n����A�G�:��-�M<������e��
6D��SN�^�������NJB�?	��Y1o���2��%PC�O�xWq�2#�,����J37s�[�<
����x�({:��$��UR�����)xd/�	�"�{�m:��V�(d-.�$��=d����{���o��T.�?}�����6���H2�0q����S��&�%�����d{��K�0���|��'r���J�����l������:���Hde{Bu����v��/�.0�����M��#��v�e6}��Q���Q��Q�@�}7�����h�M�m��-v��.KKT�nP��j�k�X���,RnU���f��i#2"�8�����1�x��
K�yn��?�c��G*u�K�B92���1����J�SV���("{�C�����nEs���7� �:r��_l����1#Pl[a�}d��t� �v��n�Z�-z�����C��0x[G��J��Y��z�+�>1[����i*�?���>"��n�RS�F4�m}�����v�l((����E�-����AO�z������1���`x�"�b�?�)2}��k���s6�?c����`T�����`���oAt�)X�c�������u��]�
>,��ZD8���aGO����aQWo���f�E��Q���I����Fg��g����kd�����u�l�f��K�N��;9E=�- �F��-�?%r;�=���n������!r��
����I<N���t���-�8�|b�923�m�-v:�Ih;�UP�	`|���u�2mP*x
�ZS	��f9eXG���:��C ��mf��-�A�R4e�7d�	{O-N�����i'S��))h!�s�K���r��Vq���C'2E���Lj��G���z��VK�6da���ka G������4��P�������y�@���0�����u��5��^&��F�i}�-G��-�����<����H��������������P���!6gv�v���� �&�5pZ����J�S���[h��
�M<������~��x����S�W5�Iv?��ZP���o1�q��#���^0)���'�
����U��	X�0������	����l�5)���a;N�VAv�9SAj�m��.��S$�?ts�J�o9`/�q|�P*���9�GDG�c-D�:�d��M�0���	����P?�A������Ec�v�	5C���jV���S|0}L���/b<���7r9TuJ���s������83����G���@�r�R����$d�jxw������m��F:A8�v�T�t/=�\���Gx'���>
��Z�n�^!���c����
����pk`��~����;1[s�Vc�j���k���v�F&��S5���sTt�3}����U0�hB5�|�9Tg��!�>�2��i�CJ>c=���\��1�����l���%�Ct��;��N���^�\�"�� .e�}����G^G��c)��d��G�k8~)���)�sZnO�c�6�]���h;���h��r4`�
"S�AY^��D��8��Sqn%x�%:B�MC`�@��Ri�����g�*�a\Dm;B!�A�
�o�r����_J�|J�4!�S�"\��w�x���������l�+DY�M.h�E�]�u��Fv'�3W�i�����hRm�����M�{W�)Z$����6�8��2lfgg�Mt�2Y>�ct
�0�����8s�sX��8�"����'<���������#@B�}�s,s8��\��a�������U������t��`'h;�����#D�MDV8B :.�0[_��&��A3�.���m��uE���P��]�;�s�H����
��m|�+���Ve6�����<��?'I���C�y�g�$	��[�l��N`�C��~G{Z~hr��a�e|��K�P���g7I=G"��@��25���O(�z�B�����l���zB�+�uF8����O(��
U@Z���	��/����>���=y���*r;_��Q�,�!��c��������TcN��\�V��R��VO������#�x�3�������h�d�b`�u��3���i.�ekWx��1Ca���Z,��?M�H��K-�
�T��B����x���`���	�v��z
��0��}���^3a��&2����~�L��BDO��Ps/$R����:����H0?8>X��p?��������D1�f>P_�������N��d�����G#�����+3#�R����:'����
���,w���l&�l���[��=	������F����K,�9�@�{������y�a:���[N4w�}O�i�#|b:���k��2��{	ud������=t�{/$<�HHP�������U=,���w/�y�"�v��;�����,dqJ0�`�F�����Dj�;���/( -�;��_���������x4m
t��;H���Yx���C�����������w����
��w�[/��	3H����n�fS5��[�^H������'��{
u�IjS�l6\RD�Y�������%���	 ��n�0���<mq�����@(���tP��}N�B��'#[9,���d�t������E�[�9�@T�;�S1G@@�2�����1��A�=����;\@/�`�i
#[QlP�.�ev|�?LG���t�@qzn����s�{�?�����+�:�]�����=�dk��xPb��;|�J����L���Z���v�*~2���F���F�,i#%#ITF%���8@���]wx������'(��f(���(����M��z�N�"_�0!�LD-�j|�����UX�!���{	�#	���8X����������@/�^5jV��^�P�+���a%8s����������~4��)��!��w���C�W�_����v}ZY�@-r��I�Bw��7X$��=�^Bt���z���#���;HL�������z��8���`�JN
7�qg�Ve}<���9�����7m
�k�q��<�Q�T�������{���
\��0�;�.d1Z&�������-����kh,2?�:��;^\w��N���6V{'�7��vN\D=�b�@�}	�%G����
P,� x�u��K��c���,���N��#�B��5���F#����s�������?�0���i"D�^qF6{_���}�PE��"������5�aX	�w�J�}l�'Q{��,���r���W�K)��E�tM6BPK����*)V��QA����g�;\GR"�:��������l�h�f[�Sx����pCTE�f�lr6*��"3��������v��`f3�J
�8D��3����R`���@tyR3�B��8���Y�<��De��^Mp�gu�Tte;�����W��E�x1���4����E�"D�)�v��V��=?������k�_'I�+I�����������=�_�.[<B��{�G�k�8��kh�#sC������7
�a�GH��&�������}�u0�w&C��P;������`�"�T|��P���0
��b|�@�	/�":�����B���)�'��B*1��61
�����0g��p�H���et�(b?Y|���k���:	Tv#������f�t"O��8�����4�����q8�d�z~ ������	]PT�f�y���m�4�=g��b��|��^r��<f�.�+;�.���G4��Ts�/j�9LE/�UD��6�x���}���jD*�F��mg��IF�a�'����n������w����U%Q5���C&�v����Cf�J,��h�����g��k3���_��3 B/���F���k8�d����^����\GK�5��R������!G1��F��4y�hp�6��?�h��n�>\�����e��fQ����iGb\V��TV}D���b!9j����  �&��>��o��~�s|�n�������i.���,Z��0�� A���8I�i����5�b\����L2�{�@��'���(�NRw-�,�

Q�k4��M\�m�$k`-�G3��
��Xo��Qu�����~0���^��l��2�'�	��Q�)�S�#��ha�����Tb�y/�6`6u�PD|�ZL$�^`h�E�Vu�v�x>�f�X��k��^B���Q�3B��
���ly��T�<�3eu���� b���U�w��������9{m�c�D���<
"���	�]C
�{���6w��)PL�v��)��Z7���K0^q��n�U#a""�V�F��G4m�!�p�9ou�)���N��#7���T�o�E����-B3�~Aub6��@	�FG1��7��gc�D6��"�f0#d���HU��!���L�;��'m�V�����g����8��ZW���H�U�]�i�g�lMvW��"�i�P�E�+�{���`�d�*p�9�#<6��&�3+�n���H��h�v��wUu���Tz��I?�3�	oG�<��9}3q���A�8�~%��e�K�F��(u�K�JB�mE6�B��0bl���]��������,��R�����.�c�|����K�k��;��[]�;���(\����\�FkC�a���i��#�$V��������#�?Z�B�Vt
u�o�k��j��Y���[6]i��x+�h��y��G�#.�362�L]�W���b�������t��m�������ns���h�,����H������Zp0S���9�d� ��h���*������@!�w6i�d��~R����+��4����n�����bq���-��OA�q����k��kr��F��J>�fv%�FS��	�[��	��!��=B��eJ,(����kKwvf��C�C���TK���T�T(V�'c=X�gl4���UVd4�z#��;�I��QO�lj�
������M��t�����R�Q4ZK|%Q?�=V��I�������cjG�]m����haM����{
���z�f��h� 
<���v�"2��<�����r�	�X���/�.�)������&|�]�	��_���M�@���1��M���F�L7�O��fq����l4���D�`T~6�E���f�0
��l(����w����k�!oLfn9q��� aE�q�1�����R������+gj��q/d�����@u�q����i��>��#*�Z��J���Vi��:F��A��>�}�Q������i5���'���w^+�"�w�	�����M0r�;�FK����>O~V1��������V�jy";Eu�
����5����y���M~,=<,�CNk��	�������W��.$o�N���f�s������M�	f
5�_�>�cS�p���n����v�8���e��.���
�-�$������N�SY���9��9�;�T5[O�������_�)�[U�L��=�g6��qD=��
����������e�pus�FA4���O0�`c�;v��a��*3�j�G�x��p�t����}�g��bN��$���>}��� ��]T�������y8d���=P<��D���`;N�����x��T&�i��������������u�F���320j�BH)�U6��:(;�}���S	D�9�;�l��>�)��Ew���6��dq7���+�D��,��%�
5�!����FPD�o���}�������2���7�e6s���e)t�f�U#���?fy��4m��2����m"��S��:��h��X�D��CKv&��?y��b ��~�
-;���<�m���G|��D�N�un�p�������y�6c*~����
.�i�S?�[Y��wc�G�6�e�a����A������=�d{���K�"a�]B��Nn�2�����6"B@$�Vw��C�������,��/�����3Y1���!�GT�.�R�f�	�@�2|���gfa��2:?$kN�1�c���U����;1��h���<H���,Ivy��`��N��So��p[�w��L��a��wQ������t��I3��,�[��((����#*�{q��>#���#�A��J��,@�^ck�=�~��(]��`��j��u ��(]��1�ZF��nP��CQ���c3��_�.	�n:��a�fk�����>�l��;HiP���[�qwG?go\r�(�����}w&x��7d��^o�[%I��B����3������B0VJ�E�Hk��������m[�Q������I�mU�����=?g��V}���>���'�;>g5��t!�o���.�bE
�n��
]=�v�5��uA��(�adka��,!t�k�?V�jN�f�7����{���$�(�n�}��.�R���(��S���Vj[Ge��9ZAy�����X��a9�^��W�=*�����<G��:e����V�CY`a������sf4��--B
�D#f��4C�2��8��A7�u���~@g����<j3{�>m`�d�/=s��^����1M�P1���j8����*������l�-BB
D��X.}�#%��,�����D�e����v_��L�����X�RhC3@�����,��y��XXB61��x$�5%�t�o����{�y���RN�������?}&��PP@(W��3N@���l�t�G�����]�g*f�_R6���W��
���]��
?w�
�'HDC��$�O����~!0��V�?3i�����P����m����������7����������:b�uu�Q{��a���>k>���S6���[�^��<i��P��o
���*��#@��}�A�@7$1W�0{����
Yk�-6q�p�=\��E3r|��%�L��x�#���>��J37X���~8:��v��j�j��
gM��!���i�����F�����[��<�z�5B�c%��$&�-�v/f(v�$���$
�����~�Z��_�Ef�����e�w�p��~?���cy�p�?[Y��	G5���'U����Rv���6{4������uz����g�PW�Uxg��z�%����#�����I���Q�8J������+�m�e����%!�]�SHC
oc|f�k�5����f�C6�Vx6��7�����.$b�vF:�IN#:a�n�����4��&"�s�������h��HV��8>	���,)*$(dd�1�n����Z_���8� v�bT������p��5x�rM�:��
K
�h�����!�����f3:�����w����Z�cC�B���V�l�fVc������0�hj�#�
����k�FR�1,wh�S������ ;|�|����T�B)�P=��.��������F��K����qL]t������W��j-Z<?[�H<)4<����?�y�������!��Q�vy���f��|w���>�}��C?�h�����-
�C�b�:���Nd7� �>�=�l�t��cU!��,j�������?�����7�g#1+�j����O�l�������Z��A�22�T�>
��g�fAll���K��*�/�z[�_v�����T����)�5���[��"u���)�,�"����GHr4#�!�)<�ce��i�a5���C)����B$���N��D*�5�m�t�����)��e7{~-IY�E'�i���Y3�t��B����Q�bd
J@�B"O�M�����k
��8?���w?�x����5W�9���eK���V�la�}�����1�SM>�iA�*�-�S��t4Y�G.��o[�`��Y�L�p/"���@��������F-�)d>X.2��o;�1�7y����k���5��7��N�A��2)��������w<20����P�:���M�)/{~��mV�x-���B�����L)�;-#�P�)0?5�x�7;^�������n�4� {�"��,�qZ=podGM��(�r�sst��Vl(���M�y}�7y���c��g�O�n�������,(���&��Y���_�(e�FH�c}�.5F�8�����a��ggV�jq��Z��vGC���	f@��C&���jD0����=!���ZA��d�j
s�g�7��#�b
���Ga�S�
9����Y3��q�gD��O�5"m��MJ���3-B���}��h����!��������L�<nm��NIs���\$c�������=m��mE�\�j��Hi>�y�l����!��)e=�9~�=dl�������-Dg�9MS:vFS��t:������?�#,"�u�H�$;B]j�P97G��) Ath�Y~���"�h
���C��2g ����7�������M8��x��������� �h]�����r;���/+��K���j�e�V���,����szD����;;*	�w���*�.p0�2�t��#���3�9�3~Y�n�����z�?�zOgI�c���ZI�&!4��m���|Vx�L��Qlko��h���9�k��m�����g����q��q~6J�G	�K"�~�8X�q���H����\Z��� ��s�'
��Rfq����T�\ V��fa;
F��dF�
�$��P��N?}�P~"�o
�P<�����^h�f���%vR���� T�=\��k����9R�:b	����������D��e|S+�6�����?O/x�E���wtA���f���HX9������.�K�Y;��<�"��#K�G���ILM~�@l=>g���h�M�>�.5B�f��Y>ZT�/A�f�9�P}	���@�f��,C������������DQm}&Iw�������A���)~�����b�������D��jWup;�rW�!O��Z�>�5�@�{Ue		9�������:�SVk��^�t7�UG���r���O�v'7���g��#|	%i0���p��
T3����^�F��K ���K0I"����6.����NC������"{	���7^���
A����*q5���?(����wh�j?�0{y�=����B��BC���\��jwN���U� ,�!ue�X���3�bJ ^�$D�dk� �
��������,�z9��I�
����!�����3����F�����!�
��l�qE��E�q������rB6�k������dF�9mY.���(F��_jf��p���h�"��H�V��Mt.����O�x+1L��)�k41���AM��|��3��_�s�������:����Q���]&�xRF��eQ���������:�u�������#j������md���S2�_}��>_'C�E���T�[+������X#���������i��Q�u	��=?"r	�����x��,!%�(�]�j7H����Yv�lZ��`����e�#�}��uN(�A{��eX�+�O�:/�d�q^���8�l�4�A�8+����-+�r���f�m����>:�R�9��;j�wd�����~���6��������F�����~�0�������s���,�HR��N���	,�o.�p��n�P��t��������S��7N��]/Kv�8�2���~	�82�;W)�maT�}����g������oQgw?���(���m��`���#z���7�m`=�(��Ah�.�y���E������,��:�8M���Q��r��Qt���h��A��������%����nF�*��v��T��a��3����(���-i�|�G�M�!��l!�GE�6�������o��S�)�RmK9"���!�$$��E���U�^R�h��A���C���O��*Q��e�
B����0���5X�q�<�,�1�+��m���=��;��h��@4�l���O��t����i ��J`����|��Pb��m�����3�W���E�����dDK����o�4�J$N�M����0��yS����5'�K��}��0���4���|���"p��G�h��AN�eY_���<������0w��+�����@L��h�i�� �y���c�Y���"�������_��]�z���8����o[����*a��:��J�����U[�=+���p�m���Eb���k��6O����Tt
�u�<8+���-�C~��m���T�G�,�`��U�����#���v��E	4��s���W�[v.p��}U�kr�j�{���V�>�������Z
��he������N;~�1�T�yMR��f����U�:�?Xlf����8d��$I6������P�k5����Zg.7)���lZ��N��`�Q��Z��S�-�"����G�:Qwz;�:
���Z�IB�lL���<�rv��8�9E�Gs�������lgaH{���$����o�#��~��.-*8h�i���ln�Y�� ���t)<�!�n���v��F�9���N4+���o�}w�����;����i�T��M���
Q��[�>��0_���vFj��i&$���G��C7o	��-���w�/�=����c��2�q�1vz�<_�����l"���/*{��T3����&���,v�<&�$��q�+��f �x	uo�SS+�c������3}��3�����q���HVu'PDg6��j�l�
;����1�9�h E���U�G5t����F��b�f�aTwl1'�iP���`�r��3������t��P����^��#p�� sY?6���	�t�i�T��3CO��:F`{�s�j�0�8vq�xR�X 1���2��i���Q��8`F���>�
���"$��]oC����b@�
�~�1�.��cE��I`�=6���(Z���t��*s����GOGK�%�;
��l���$���S��3Z<�$������t��vm�H� Z��x����/�"za��F�tR%Q�UV
0�s�!���,��&�"+��H�4C��?���&.L��v�.V5F�v�����F�q�p�����d�m�����7�G�[��o��+����Wx]��~"�#��Ed�c�C��:�>�yV-�1�C*�I��4��4�����A������d��0�$�$���q�����p6W��=F���;�7"��`����2�=����:�B����0B�|'��"wc�.��	���f���eo���Qh�-���GZ�����d&�8����B�
�(���Fa{=��mV-��]�O�VY���������U��:��nT���|�������*��
l��0��>�/���G\�e������{��>{��l�
��y�{�����H�j<G`/��3�|O5Qp���p�Q@�H~,{`��<�k�Z��	�?�������c����]���h����kDd=�7� ��*Y#F���W�gz�4���K��`��8�4���P�dI��������GF��yib2�q���w�u�^�x�1REe��-����j�a�pI��'���k��)��:�����HM4��	���"����I����V+*Zn�#�2����`u�oIL8���h~���C��zG���#���E�&��t?���,�~>���krV���`)�%��Z�X��c�;�%���rMD]�B1�&�;����h��W���q��*��t�h-]�&Ow�WOD�5���-k����fMC� �������+)��k��i�a�^��V�P"G��n ��>O�����������IV�[�@�5�u������;����m�N��z����g�w���;\�7���������u��nqW��z"9����ag�}/N��CM���}�������A���#�}��7�M�$<����a4���"�O�U%9~��6z���P�j�z�D��c�Q��hm�/�h���	���T�cwJ�O�az/��C�a���j�a��h��B\�+��H����R�v>������6�����~p={�c��x
4���M�`��UG�6�e��]Bq��n<�E�#����%���QK���;Hs,��B!��(���Z�d�2CE�;�KPO;`�p���6ntn�%N{�d���w����(�+�}|�#n&�#��'���GXC;������� �ad�m�H��~]��d��W����������"��2�Yv�{
;�F��a��~��[�S��P�p����WY5`�$L,dxM�O�}�B���������Kh���fK���E!qX�E���:�2$���W��Q+�|��C���D�^h�*K�4#f�;\3�������R��kh����(��P�_�6������{������'��������k�tKP�w�_��?^9�u4%��Fw��N�+�5tT���0�������w���DJP�����#���������E�AS$<�h����5�6'ZQ%T$z�R,u��	�oAW�I_!d��"��&��R�?��'J!M�b�����R� D��78��J��be�=E��wd�^��o�UAt�.7$�b)��U�<��a�p�J)��F��0���w*�o�J0��V61�@'�{�?I��� ,S�F
�"�bYh5����\�%��yuVv�.B�Lv��(N�(�R4���i�D=�"��1��#��w��I��:�E��(L�����Q���9:���_+`��i�=���
Ug�d�#�����V�^��8�Yl)N�~�`��o���(C��_�H�Wz��+��h�f����e�/}x
�h�g
|@������m�P�w�
�\g��3�1sV�l�-��H�A�f��*��X�X��N�wC�DBpJ�KR����e��te��@���N�)������F�8��Kq|52��: ����0�(zJ�
���#[�� +� �R��R��Vw\�
1P�6wIk����i�iV��I�-@����e�k��K���:1N5�za�q���a�-E���V���(�R*`���7�6�Y�e8�v{�V!
+;Z_*����	)�MD��*����&�q�W�J�������p�Va�ud��i��a
��w5���K������t�Z3w�w�_���o��b!Ufj�?)
�,�~1��/�&�"X�X��i
�������I8v#�>)�]��D������rK0���9�E����l�����o<���"`"[��D@���������;'��������
���";r�-e�j�~gMCD�)�~N�1�q����C���R����^�8e^�9W+�+�P,w��,����W[��[�������,��)��Cm:}u`����v_�[h�#�InE@��:�G�Z��t�Q�k�z��p�5��>�"fzj��%�g��_���V"P�
� #^>����&u}�j.QP���$����V8���[�q�

��!���6PJe�o�&���'�gwr*NT����8�P�[+�}~q>gEa�sJ��=�WB����je!gv*$��:�n�|n��J�4�F\pNN�.z+�QT�8$��w�v�
��M
���I��������K���M�>���P5�-��,�N�*U
/�{���5��C1I�I\�J��� 7�)U8��������}w7P��(�����)"�~���uu����
�Ut��k�U����]�����*�qG��>��h�����Adw�)B�mj�������9�E����Zj�G'�����s �f�����a�OV?�*�����H�Y���Z�p_�>�-s���^?��H�F�8J�_t���0�=/�XZ����})�R���v�q�hF������#�����2Z��lF����\�p�QB�Ua �$���%d��E	E��T��~)��H�Bh����������I�i4�s���p������<�z�
N�����@t�o�q�t���mV����0��
�u�(��T���"Zi�������GD��:�wC���~#uF���3�<��eo�$�������(	�TK�c�3x`Qlq��8����D[f��*��g����l����G��*$ag���8\�R"��R#(f2�l��
g/t�W�� �WC>��mg�jro����-�K|Gj��z�U���X��lb8�v�=��{R�Ue������j�#h�x� �����6�M�?��x[�%t���]f�N|
0M����i���U����Ikw
�V���i�M ��z�H�Q-Z '|U^�no�K	���i~�Z�xf�#}m?�}��4�%����������^kX\g#��O�is�3�dff4�:��������H������f�,j���v�x���C��Sk�e��T�M���*�x;�f��Ns�Z
���z01��a�E'��e6o~�R�m������[	�����-<
�b'��r�[1����f��sv�;�n��pij�C��|�x�g}jNp�G��k���$k��.{X�v]\�?��x�6o�`�DuR @8"�� ��AK$wl�J������-� E��=�2�x�<�
Z����L���}k���oB
�b��QuJ�3k��Z~�M!����G����j�����A�KR��
E���+m�	���B��@Q�%���d����!�i��	���j��;����������[��h������h����T�Dr�f%D���I�qh2�E���o�=D
�&�����V�b���D�,ij�g���p��1��*����#2�`5=_t}�T@��@��m�
nLG�G��&D
��h��y�o&� D�gk�Bp�������*[N�=G�T�	�h�S�E�6��Ipm�F�V��8M<h���[�<>��(Z�4�3[�DHy�w�X�[��zJSh�$�g�6�,H�(����B�m�O���4�
��}���HOl�KEK�fS%���)�l]�
|DTs���I��B*k98�a����16�����D�:z���L1�y��MV[��\���dH�5�F;�x4kn��8${"��y
�V������'r!op�u���2'{��,H5G���,�����
"��B<��m��g�����XwK:�l�	��(M����E4���VC<v�(�3�s*������3o��9��)�9z����*!�
��G?[0
��������9�Q�x����)��5����t���k.F��_����zY��1�8�D�&��*
#5z�]��0@�����hrS,)��?3$G'jBu!p��?3K��������3~�v�l���t�=Z��c�d�w�I;��],e]��E7D����������V�-b�v�4d/��Kw�=�Q�;���B
����wC��F��.L�Eg�.�"�j�� ��n���q��%�R&�r�,����v���+z��v8>�f3��_��:x���q���B&�c������I�vKw.�	x���V�/�a���Gl�^�\����D�O�EoM�(~#[��\D��n����Y����N)�5�f��]�/�OTt��#���yGD��bq�9�E<�.�A�O#��f@p{?����7/{�2X�U�[�p?�,+�;�9�
vA�fp�	��������y�>9�������Mb$��hE���5����RhKjPd.�S�6 ���l.[����vIr��itZw�s�1��dq?�%��oMvJ��B,��w�Cf"��k�5*���qk�����-EC��w�L�8�	����h��;e��i�h��}��^E��.a�{���g�@��&�;�1\��3��.���}��C������^� �"{�'u��
�1j[<����ow�3__�l�.�,��]��]�t$p����l���p���+
 ������e����d���C�
�<�X���/6�p�KPC�G;�G�����d��a4m�m�R���������Z�}��S�Y@D�������<S��n_����@]���698�;�A�G��lu<A��!���f;��c�f��n ���_U��.`������q���;DoG]�{#��P���W�!�yJ��v7cawaX~2��?v���5K
���qNT�{�b}[�����1�_�Q3rx>F%���'b�����v�]�(��re�#�v8�*�]�B���!���&�������nXZ����%�4��������G���f��!��4���=p��la���*�(��zV�y8�;[�9EE�����������yh��������,��@����^t��`��������_��d����[���!��f�J��5�6��J<��L��������Ne,��$e��!T	_�:�nH��Q�"����3�������8��|�m�tW{��D�������f���u�}F��F��ah��m�����p�"z_`g�g����f�:�*�
��Sc(����}�L�b&�>0����l��G�Q$ B�_��V.��/�"�W�.�������ag4T�|�dSG�pKx��@��>2w�f��!��~�Cf�5A������a�����d������pr�������`��|���C���}�_8�c��m�9���P��p�}���toh)���9ot��*��4�wX��!l���1�3L�*�R����&�&m�q�R��RR�j��X��du�d<�y����G��FP�8��3���.G�f�����s���?�
�^)N~4�V����	��		8
�P4��}/�+��X��g�� 6+���u\�8��I�u���2od�J�(Ej�?~^���0��'3y�'#�����N��_���loq������5����/W�5�9)[
4N��8�)"�
L.��K��������+���mI4�8�$D'{n�h>���b��G���p?����f����|���%�A�G��h�A��)����7+��n�|�f#G'�����r���ln8���x3��ch�5��PK�$��"����}�iO�<9�	NRI���+Z��0��%_�Fj��g�t[���0Oa�j��7|������'jOL�A/�p�R(o:ma����Bm��8�c�;��c����$d�X����WL�Q_w������F���6Cg��}��h��_��HnZ��=j��#������8�?Q�R���$3����_��fk�!�)��e�\��B����|z�),��J
~"������ k�e���E������1��YM�l2�pG��-�"J����0���F[8z�bw����)nS%9<UJ��_3�<�>?d������IX�/dOMk�v�)���4{��pD���.�J��2�����sp
���
����6�6�Dg�)���C�����c�$��[7�v�������8�'{v����[+��,���5�g��M���irE���X� ��NW�3�]ZJ�z��3�(0��"Cd="OG0���������e
[��$��B�U��E��%��Ay3�)@aD��9����0"�j~����F��k�����~��u3�]���7�i�8�����#�o]6"��4�0��Y��v�����f�&�.[���j��s�����TP�
���dS�r��dF���p���XN)���)�?��@"6�\���'����
��
�������H����8B$t��_��l� �g��SXB��s�z�F�1`��p���qD((�G�5������+�-���.v�p�����4�qZ��<B���l��	
A>��;n�1-�=�"-��p:��Hu�S�B�2:�b��E��h�8��X�X���I��-E�T��B�)�aXO(�<Y#�z'!g_�O�x>�E�D�V�`,i���(������%fv�p�C�pM��}�]&��9��:$�G���j4�"y=���Tw��`g��%��/����R5�� NPMw��^��xU�H�T$F#��p���m#>Y,+��8���B��^����6��u��l����e�O,25<!2�����6"��*v��'+G���P�8dK��{Ro�rj�3)B:�����^��So�e��C��/`<� �O"[=�z�.+ d��
�Y7���J�,�{�h��x�����o��'��V5K���������#�j��`��eQFj�5�w��I�����JeF�h�Q��Y	��b6R�-cC����B)��������Q
�>Jq�+����Q��
�����n5��'VdfV���vE��e��i�\���'��d$3�\Ns ��Z��vY4�j��<����>|tqD���elO\Y�F�u���%/���]�$�g�7����|��]N�&{�+���{��p����]����
���V�8[sZ��9S)/���,�^OV���	��-fL�^�0��UL��x9S::�-��$dY����j�
i��]b�:������5��3��]���7���:W/!8w$�d����}�&�c�)Z�g�������e�����������5>�	������	���N���agU�
���D��5�����w�+���&�p������Q��:����9�!{��F��G,��)�c�W~*�����ky�Q��8��LI7�1��-��O�q_N�&���>�T�����d�0�<Z,�Zv`�����_�}�-��Z���yN@��k�����ve���#M%U�"�L#4o�r�����{���HQ��S����/f/��6CL�t���u��*N�A>=�����)aUt,�y�@�u�fq���R����{"N�:����)�H,t��3�2���<l�}�%dMr��\X^ ���zl~���x\���|���hZ8���^�` %#��iI'.2"���N�~�_�*r#��L	��-��zC
S���.K� m!�:�J����K`Vu�r��k�f;[�x>�
ssa�8�fC����]����+�T����k�.���-����A�������mO�!���N���/����.@@!�#Z�b~�������\�M��87{Q�u�b}���g���ed�m��] Ma��(���vn���;@�1��E#���Td���`U8��6�b������,���Z'���>��h$��H;��:���r�]}�c�\rf����&�/���U� l�����h�c��).JB5 We�I�i�� A-{}B6
�X��T��:'�n(�~�p��v�U`��������g��	�{�(���3����jx�F�����1vw3	�bF������@��R���i����S��{�E�������������+ ����'C��?��l�5�q�*��e��9a�}���+�l�t/q���h�������	��[}�9�l��Lp��P��������,p���*�l�+�$}���eW� ��l����\�=m��jB5j���`LEsG��9:R����FE�����=�e	��mO[tfS:�������"yh��k������9����@Z���uD6��q��R�?�����6�A�~��������@'������W��Ra����U�3>)���9��`��u;_����i����m��m�D,6�C4�@lJ�����^	�8k;$:�0l��L���� �,��s_nF������=�|���1�e/�f`t� �P�<�%������k�`�TQ�w���S��m�g��Ce�
[�>Q:���s���H�d�����
���_P�G](F�b>�l�J��8)�R�X��Y���������a���T{Sf0�y~�N{Q�u�P@���F��L�y�W(b����G��$���[�k������J��,��Y�j(/�3�<E}��8�����#hsZ�",���|�P4�����:F(�:�'T�h�2[c)���S\�EsV������Vt+���<�%`��J*��U�+*]���9�G�����G�
N�Q���@�@;����]B|~���s��q>h"Z%�J��s�$��8��=�X6j�
2O��]0�aOu���Nm���'F����a�=oG"6���h'E;�i�U��V��=����7R��k@�����/��F��	a� �L�p�1`��
����@�%�%B�h�D<j�?��h�6�
�2w��--�#�;2�ad>��J
x0�����1��Y�Z$[��;t�<��-��z��G�nz�Z2UKe�&c��I���Y(�/`��*���H�i�?Q�b���&1����=��Uq:�U(Bj�*�,��} ��>48��K�5�����=��V��6��CE��
/u������b���u�t�a��O_���U��`��� �����Q ��1G��Ev!u�!��+�S��XlA�OB�F-:b�Ha��xFi�5����AWx*;�a�P���4�.�GH�Pr�����	�?SG�#���Gu"���f�L'�b�DE��~����W��;4`�S�F���H
hV�P�X�!���9D��c_)>���\�}w�W�P����	��.��{B!U���� tM���N,_9�=X�P�d��c���p�����6e����r�����utEja����2��
��hG�R#��#(�[h�������|L�"V��q�����Z�j�hE������Q#\���oF�����~A��2N��{Tu��9r���#�#������xX"a��0#{��������:��S0�>�����	h��VU�>��`�9�������/t7~���{���v4H`GD`��g�������x=|.p�#���BV����^�V4�sY�	��k����(,t�y��5lN��pa�Oy~�)����B����=�@�$�d�B`u��K�51o~�!�b��O�5���k�^�]���#u�����1��������~����_�F����l]�mg�����}��H���@4�z���%0(���;���L��<�
]F�����J��,����4��1��p{>8z|�������a,|Jd
��W�!H.�����pu�����-����@�>�������Vi�H�vMt�E;��_(��v��!����a7�����
���|�H�}�vQ�uBBY|�"�E������
��4!���Z����H�J�9
a1�,7���>���t���H{_tOA�w�VALA�HSOz~�5�~Gi$7��'������A"�H����a1���e�m.�62���e�Sy>�������^b�.A��
�O�%�g�&����^�`,�Z��Yyq?{��Q��;�a�mM��3���k�����������O�{W�VRG��B��J�S���{~�T��(�y��x/d��h��|w�%xG��N��]��Pe�c��6lM��w�����f"�zG�����^p\Y3T�������\ ��Us�b�p#?8u�CV���j|$��,�Hda���w
�U|���rZ3�9r�ZD��
W���1�N�V�����/l��������I_�d�(]�;m�1�f���f[���4Zo2�����)@����B�S���X�d�<a �����j�F�a�	�����iI<����^^�j����z�]�c�ZIxp� -k�`�G�m��,{/F�.y+���O+�_�X����i��!L�"��>bQ2��;P����!��"��2a�$��V�v���U��?r�o�1	f���<�h����*����p;`�Bg!Q���I��d�����$
s;^uT84���;Lde��������Gb+����g���<6�H>�"8u&&h2�����se���E5[p��kq�vTR�X���g�R���]����mZ_�>�1�C���[���y	�����a)��mI;�����#�{!����&4�w��h
xR�rV�U��9��}4Z�� ��(?k����ob�n��.\��g�!�0�:�:XXw��N�E���t��`��d�Z<���$����vb�=]x/���}�c��V����������;V��~{��S��7��0�j��"Y���w��xK��)r��5N�z�An��et��Y(��fG��(���7�O�D����)�z>����1�"��8�f���p������>���D�"��Z>O���u�D�B�B��"�N�'�Z��Y�`��I�
�� �H��RU��Pa�<)�[����N/���Q��0X�o�����r�����A
��4�%�l�6N�:M�r��(���|��d�@F����{��O�	�>��54?1��A�o��Ha���jM���[���%b�Z�
>�99i���$t�:�!A#/K��x{���a
��h��g_���D��������BzVai��?BC����TB�[�w�$�z@�B����l����S���F"3��(�����������P��(�^6���"�a'	C�,k��$L���A�R>�F��8�}0;+�A`H��$�t��Q��q���9�j��~����S^\�M�`�qk"��+�a$E-�%dI�_�����f]�!�3�Q�gk���'��������k�D��F�~�-���&��Xa�\�2�1�VA�L�EU�]�`@�>�/�;�
��n�����4�)b{����mL��3�|�Z�^�D�S�}�0���UG�~.��W��{6�>�"Z��,��^���6��:����H�>U�#��kx����
ISp���{~6�8�GA]�O��@\��	=L�t�]j�-�$d6������a������g[����D�D���r�n��:���A�$S��	�VA�W�+�s�����w��l?k���R"�k5�A&�lP@'����}0�eme��Z�:m����*H�z9��V���S���LuR-�����<��d]�l�=������P����y=����	�M�k�4#{�����-0c�
%��j������8+jF��Zm���w�_+EO����b���{���W�V�4�7�"fz��'��1���p�a�+O���J/����k�h�:��S4�����j/���_��|�������>@8�N�U(�b���qi�g��c��%���yC�;V&"�r��q����+���1Lf��1��=L�4��\��T��WCQ�_�#�J��PQ_[q��5�j`�Z?���>���~:KY;$C����(�uS
�����t�����0��`^��&��� �X*B�X�g4Ef����X�
T���1��
���*,Z������v��N).��hv�t�H����pG������I���JG��|AmH�Z�}����b�e�7����A���yIN��.�h��o���h���n��W�����t�7%kF=�j�D%�
���FJ�Z;��d0oM��vR�L@W
�8��I�F�����ah�b��1���F������[����_tX�}���m�h��0����O�\�����`�}$��9H�QWd�3����W#"�X��1�R�I���;Xi��o�<�*��Q�=���V����a:��_
t)j��c��K�l����fH  
���)F�J�e���c>��n���j����k5�1�xG���py������5X�|�\L��|D����z83�#���E[wW����ff�����x�:6�@�w�[���Y����C�.�R�����v��?g��C�be�Yg�Mc ��ml�PDxJ�x�aQ������P�z�b}�b�\��N	.�����.��u�� �?�����d
jO�������-��#�iT�GogHG����|�1���E���.�:�mti��B����>O���XJ�k�cB3�����1_��]��2R1O�@M3H��[&�H��J�R��L[��?���w����5{6*Z<�N��;g��"�@��]�PC�'����lGhA+TN�?\{{!I��X��j�����~�s�i��������GSS���
�f`b����g,ti5x���.�tt	�N�
�M�=��������Z��#�Z��Nd�M�R;1z[��V�"��XL.dD���f�B��>���D-Yr�A?�%+�[��P�����`����}���h}��E��>;�T|h�OAez�c�Ja5Q�p���l.�!��]�Lz*mR�����X-L�\��:���f�Bd1��U����wcPw�)���1�T��]zh�l��:�?E2_. ��J�;��o��=�6��o�<]J!l����T`���:5c
����%.SfC�X���A3�!�j�dn8���� %0�s��w��H[��T/�Mq�f��Anh���H����a����#�4����1�y}%
�G��-0F��GL�J���a
����G��p��
������A
un����:������ q�V���>h!7���^�S'�;����0�����5��C��:"�����
��:���I� +�p��/�3��T[�48!���K4��g�����b�d�8�6B��PGE
����cv����@��������Y�K��-i�������Q��4�!_��I��G����[w0"Q���(���
t]Hw��{T���0�H������"R�Z�����6�w6��Bz�&����]�+��+����,d��v��rd����1p;a�I�ME�NVC��|>Y	�	
1��� �Y��af;
`����-��#�#�I����Ki�>���y�a��P�T������A����X���E����>>F`d�']��-�'X���yG^<b� JsG�q��zp�c\�nXD�7���Eo*����D�����������H�3aS�I��������z�t��%$U!���N�������
���=i�G��7��s,���L�&������b=�V�.*i
�W�
�o�M)k�f���z^Jj����ib/��a�9/���Q!��|v���@����0�Z��������I�/v�s�
��Jf��|������9+MD;'�&��;����Jd�#]��It!U��1����q�r�n��A��f�=�
���#�����P��A��K+2�Z�)���nDA�"�����(��&���
Y��[E{�Z%��e?�Lb���p��AI(�A��n(d�O5��waA�X���U�(O>oH����#Y�������>��@]�n��A��9m�D�n�C ������=9� �U�K�l��l`.���@K�f��W61�BvD}���R�@ON����n�b?'������!B�{5T���CDS� ��Xt��D�t>E����F4����O6b�L
�����W�}�BKL�:cq��>#z�X~'i!z=Z��C��25�e\��_7Va������6D��������dk���]�(U���n������H��i=^T��wFX��Gy!U(;���P,�����e_�+dP���;����O
���n`b�_�^HpUa��g:��|�;�C9�i�_�(1��z��GF�-D�!�o��R��P!�r78!����O�8��bb�0{�q�_T7���m�/@�
P�?#����K:l:D���z"��{���tXb�������T�Vr�
[	O�z��I���+����G�1�IZ?q�f���F��Fv!��$U��YG������� �p�,��2@�A1/���0�0$��yz���q��C��a���JA�ZU�5�������?�[q�CH��a�A� �����-�{K�����#z�;a�j��#�����n"��a�AR|��J�b��a��^��Gq���H�(��m�
��Fd����<����~��m�J��l�E�"�mh�&�0��D�`v��8�:�-��P9e��F0�X����n
��I�'+VR��2�:�
p%�A�\�����OM]���x�HU���ev�����Q��l(b%K�_�Lt������df�d�wT���s��I�f�q�p�� ����j���1�����{H������	�>�o;vRbi4��t\�E��.��������g�?BM�;[�Qd$~����!f�0������L�D`�m#�V�r�%�9����hDza��p�P��b����
�
���S(:0�q������+�!��@O���j)��|�a�BY0�#*��h�1>�L�,x���Tr��0��C�v-(���<Q|��J��[F��1��Zoep�,���V#FR�a`Ds�N2K*;����C���X���H���d����h:�Q1�j�P����o��w���Be#��0����0�L{��V��5�R�6_h�M\-���*J��d�/r�	�l��6Z��"q�����
IZ�QwE������C�^R��U�H�Bt�aCG4���7�E}hj��i��Q#p��lE6B�>��G��VJ�0J?v�g�x���m7�.�I�4
9h�^��\;|&�uq����_r�-SKV���/���b(�T�1��K��f��	��?s�(����.����00����pu
�"�,8���.��LD�F!,�@��0
�s���E�n��:N�����������4a�[=��1#zP�-����G�y�3Y����
z��8�+!�j�� ��m�o����=�?������Ov�{vP�n���R����3�;0��LD��f�)D���G�-T0��R����T3�Ow{G=�1M�27��v8�2�A��gZh�}c��4�p,Q�u�����9�N��,���)��~�fU�p�v�LH�t��^�YZ��;kv���d�}$�+(��9�l����W���
�l����X��U-i2;*eg���"s
wn���
�H��g��U+M}�	dV ^q�;����8XH*=�l[=�[��x���%Gv���Da`?�S���I/H�����!�0
%w*�?�1��0����12�g'���.� ��48!OU$�1jB���	�}�hxn�lm�B6��J��pF
"RMCj����q��[��N��42�o�|���X9d�@�$�a�,�t�#=�����d��~�����oU�HV3�HZ46q�j�NCr���D=�i�@�Z�~���Z���iE����3���4�O���f\�D
��F�mE3%����z��J�Y��;�����n 4qF� ����0r �k����������	�S�Y`��G6�b��I�����i�@AjEY/��2Jy��0qp`���@��7���?���A=$�8�&�k������s��<��1
)�=���j`���=���g���q
�t���hz��sg���1lj;�s�B� ���E
�v�	���N�E�p�_!���f����=t����k~PZ��E�u��{8�$j�bv3���-e���n���~&���1w��w����<��A�Ii����W�>9��/+�P�e��F@>�&����$�9�J�;0>a��>(����gH�������$z�4�����q�
��$K*�{�
�b��i�B�������Y�I������|����U�qY�q����c������'��\�T$��n+�	�RS���FG��'P]����������F���J�0:��'�X��|�V���Dw��+�g��'0\�%V���]���6�%� ���B��� �5�Z<�EAG��.�������y�y���/�se��!��UlM�[�J���X���q-�"��.�qt��OKVJA��j���2�� t�[��KL'�s���T]�(�����c�����_FB�zWE[�;N�P�����@!G�f��t�]AB����"b�O�}IF@NS��m	9q\�>��K������X������j)��g.Z�\�~F�3h�It���d��~,��[-�A��E'�{�x��":��U��q���VL��e��72en�G�+���C���{����j�����e�ioV�q������<B����Ga>�H���j�({N�y����Cm`�e���5>)3�[F;�])kG�n9�l����N���]]#9�a��vt��]#����\@M�$QH��n����b����� ���p����V��M���L���;V���k����J��@#w" ?NVc%iB�[v��F�/�	}��[]�[�?f	S���?7;8]�`.{WF+\R#Y���A�}g��T8QW�sZ������P/��l��1=�*�Z��m4a�,�c*AO���`rE���)rVGP�2`1L�C[zp
��L��D�w3\�s�`������[GZ����$�9U��I�#`uN���2.��F���P��������T��Q;��c��}u���]����]�ya/4dc���������gQ��n�Q�f����&��k��I�������P�^�
q�M_�"`/�(��o9w��"26�:�E\�Wx%5BP �W
?����.�y�������S:y��H��*�d�z�8vp�O��nH�!M��t�H)d�?E;"��~�o�e���d�#o|?��z�e�>��b���*+`�b���I�@8���E�A��h��d#���{P����P���0����
��w\��Bn[��M���<���_�C�QI����&��b?���^�z��s��O�iw����@u�6�Pd8tW���s��4S�m���k��%�����k�!z`5��=��pU�����o]Psg'B�����{�H����@���f7	��p���>�5)���$��G�k��O�����n�����T�[������,�n
pmla��W,�vCd�]���V�x7��"v��ya���DA$�mb�Y�7$@��"d"~0[@B8����������v��rR:�s~�@��!�=����mP�b�y����{�MO6��8��b� ��>������E4t��n��;f����P2���9���rW�3s�n�kq'+y�m���D�9� m����=����J�r��f������Q�G��j����(��RN��5�	����X3Y��n�[�}�:$���F���C�0v�%�8kGs!9�LP�,�M�#�`��C�7���#!�l��e"w�m\B���X�����g�5�=���nW\[������L��nd�(@���hAX�N��<��481QGu�{�I	[d��m b���vCw��=�%������h������2?��t�#��*N�N9�J+��LC��(���*o����;�LO���a�e����g&E��Xv	V���Z�Q3� ��;0/�5k��|I����I�6� ��x����PxG����uSi�NP��Filu��������]B���:9��E<��Pz>��J�|��#m�U�h��k�j!�{n)�����o*4�l�P9��'{������+�@���0�8�U�=�H|"}P�*�O�F�YH�9e���$���E��E;�1��m�����+'I���o1������K��;N�#;��U��q"��O�~G��$`���R�1N��Oh�8���� l�$RBd�&L��'�h�=+,<B�k��
�G�H��e8�>���V�=q�5������P	jo)���N�w��yS>������Y���q�`},�L��d�R��������8�8��d�k�]#������~&*�O��=�tJ>c��&"������MX5[Z2 �����\�K���cT����>�7>�T��]�n�l4� ���k�����0����(������Nz�~�\���D
�m
�����z���K\�ac����A���8C��o�1|������P������$����j$���$�]T"#�Z�pRk�;>�#�Ft��k�x���.d��NOFNK�VX�%#���W��$P`��=s�BB]-%�6���-��n�����"�Ai�y"q9�kYG�sF�;F���n}��0�,��g�#d���0�W�������9#���jt:g��Q�mS�����N"��P��p�o��,a�<,�apg�a{c���c�B����vXh���R*OB�w����]�3��'�Zj*	�k���clB�:U�������+���P�D�H��������>���HI����Lli�E��:��K����T�-��O/���Kx�C�	I�pn�C2�a�|��%���v*1OV��������wFM�#�84a�'�/�\q���q��{���h+��N��!�����B��1����-�	GS����F���'�~�O�5��v{P�c`�*�-��3��fj�s�b(�K���K3x����C#�q�������5�A>B��)���	�p-�@�A�%��=�6����V�}�F(%1��I����h�K�K�{�?1�}~GZ�C���A�[�b~�S'����$l����_�|������Aa�M�ty�*�=j���y	�v��L�hO�����b���[�r ��wP�rE9h��"WU��DD�����d0ik�2��F����"���~Qt�nI(�4����M���z�5�Vp�J�K�+D�?"� G�wt����)��{�5"q����h����A;��X��*��d�~/1S��N�P�%�&�m�;�{$������=4��m��1��=s��0��<�����A�#�gh�A��L�$=D
��^���5S�i+9��#��(��h�^!�Z��q�\��:G��=��
a�������������K]!$�wt�
'#n���%�#� /X����$Q��;�4�j[gD�y�y���~��H��^#��w���Y���b%�
�t*��D`�X=��]�Q�^#>7&��BUQ������������g�%-�
���FlQ��/!��w�'����m#j��7�Vc��$�Jw���;<uL�h����v�>44qb�$��*��</
����61�8�Q�'u��TE|b�^����D
7C��w����k���;|�Z}R�#g��z/�~��1�����wk����L[�Op��t���7Qw����X���!���bQ��wd�@�6�|�!5p���a������[%�G�zIii��hc6Qd���i���9�t�^���\5tXPn.���kxc�������"�N�a5�"�)����{!�u�p4I�������c�0�eQi:�yuuz��h��}V����2#�|B����abU�N�M����6����0W��p���Kq����RI��@B+�q�.���{�u��0d���a��m���Z���8��IR�U�A��I�Y�#%���tk��HwO�G?�NeR{�^��o���0��������~L����q�F�u1�Q��$��#�I�X��5~�H;���Yp8b��n�C��VNtT���"��EKp1����6�b�Aq�-��o)_���d`�����P��XA���CpA�k1���h�����Nh�[,�"b##�(zY�x��H/%���I�AY�9�R�x�B|�S����.TR�t�+�9����y��'J�3������#wv�$m-T5�:����j�C�YV���Qj����"L�������E02��j�����nJ�V�G�cB��f��t.-n�hL�a{�h����Y,�0�B���b|b�1 �	������:%A��+!B`��e���-����4��c�D
F��#=�n�\�p����������J��.�tP;W�R!�*��_SY2�6��\+)d�t�0UpM0V���[18a�5���eA��q���#������
����X8������uC#�R�m����;��A)��@�����d+��&�m��i�A��n�4��@>��E���l�[���i�$�����B1'Y��$�A'� ����Q�)X����Q�����,H4������wS�\�Vf�_�#_,e6 �Vf��kx�<�[1�c�����N����S)���=�[!(�g��Jpu���������"��7V�����3��M�[XY;%�l�1�`�����K"�X����z���h�r�{q�����%sAm{+��*�3���w�Nx��%�b��M�@t}/a�������D�������V@4Vgq�ojs�t���J�'k�����Np;�}���
����'"��,aT,�%B�^��r�����c�o����w]!���$���������}����3s$��R"v�������2X7%�L�c������t��lq�h�k�5�0�b������`�����T���_gd�j�A�h��_�A������c�k��Z�P�.���g���&#���k���V�;%��yC0M5�`kt��RT���uO��PP�FH&+}4Q�kL����V}v>�T��C�	h�W��Ln���#��~��"��IE.����#j�w����A��
��.�`�]���3�T(���S�_����VG5�z!��p����S����Q	�QUA��Z����J�����5R���1_�������6�/����k�;O�[���[��[���Gj��W��
������@!�+�����
���C�3��q)��X���F"���v�N�y�
��{��}O�Aa���=�Bn��V[�;������:�!	��5?L�=���e6�o��E������C���kDo�#L�n��Zm��p�ah�;�r����n1��lP��UI�H�P�����/��#nT��!���XU��a
���*S��@C\�!&s������`��J��BH�?wo����_�,�8���K��=��k�h����~M�i�X��a	d��S�@��j�B#eT��U�ZH�7]$9�l[�z7���m$����c��YE0�'"�yx���9���g������g1���}pab��Yp����3M2&�����$W���b�9_W;�F##�����t��l8B]�!����+��.E�B��6�����	�d����}�S&[h�E
������ !P5�\i���hX�F�
�}R�U$d��'��f#�b��A�s#�C��u'���fu5q�a���'j/����]p���}�K���65�~��j�o�_���'���?�%�1�9r�_ly��hL��#���Tc�t�h9+N�2� �]+O�Lb"�TC�un���)�V����b��tC/��V�^��X��3�P��I�}����[5����Qt�n�$���D���MD&���P3Dkx�^�5��}5�Z1��J����jq�D�������u��%�����?�z=���M��RQ��qW&���oO���B�n�]�'�2Fj3P�>��pD�fZ�f�B����J�U"�h��KZ	
��m��`�Rk,�.�;U&���P����	�I��������-��$-k�T�7\��(X�����s��c5�HA��~�%�������I�~q�#DLG�ZK���!2�+��1��f0����LBK��eh�F�5�� ����/|75A����������D|�/:H6�r�d������;e�8o����6��Q����k�[,��3��uuZ#��M������E�������E����~�D�-�Fh�b"Ue����`�9����p��9��b�t���3�}vN=�lFqh)��Y����r����2|����]��H����ENG3a[��Lj��mzbV!vmKt5:i6����!���EM!^���!�cU����n"�H�Y��2�ZQR2_�8�5P-��x�l�����Z4zm�*��2
SI}(�s��%�����I�U<��;�3+0�m�����b���`�f������[��Y ���l�t�
�I`;�����&-�M27=IQb�"�O32��3&kI|��������@����C:*x@�-l�@q�7l[�j����6,��K2�U��G�R�����v_C��I+�_-@-,A�M#=FK.�����wQ��a�<D�cg=�!G��[x��*�:�e���Im��%m�1.�w��� .\K�{�#)�_2^o36��/Y}W�Qd����f���D
+}��A�G��j�����V�*�N�%�w?���-B�Q���h-BU�&���)`�����%�Z�2�X�%�KJ�V�R��x.!O7� D�D
d��;x��Yz�cl�nB�Z�zPT���pP�F��~`����~~F0�:O����C��M��n�A=��������{�E���S�~rx�O&$z!F���q_�8e
F��xG���I��Cs�3dw��X7�L�G� z��nR(�]����Z{�:�#�C7��x��e7�n���e�
2t���%��E}#{���k���E�m
e���5��U�yZ]����G6��t	j���^c��^�LR�*��M����!��uC���E��=&M"�����!�E�C�$�����a�*{>�,��m=������H�lb��4LC�������_*��q���'HB�Mt;�wt���8�tfu���-�A�����~�ra�=��������;��&I|������Xv0���m	���m�hP�����	�o����}�X3Q���&������pP�1c�'OBv����G�y43(�{:��������5YnUHhq�V���A��n�A%����[��8����O�����(�����F��rhO������O����t�2�a��}�9GLvz�R�k�;�T`�CG���p�f$-��O������KD������	W�+i��S-�)���"���k0�O+�f�L���c,���2� �2���D����k�
���JG`��}�/�d��C��n�A��(���5~�P9k
���Z�^�����ahd�o'F['�MEe7,��F%l��Mv�6 ��k�*�%�E����FE�=A�(�;m`v�-PNp��>�����c:}	������w������[O��oT"�t�mk����y89t���EK���l'�\�M�Md�����,p�M�O�f�I�
-��<�5�pf6�h�����4� b�d�*C����
pPI�(���<z��D�t�G��H��vc���AF��h52lT�'���z3�����.d������5��B��a\a��
�y#fK��k�A%����A��#�SZ#�����[��n:jl
#���UQ1�iW�>*^����	b��5��U��`�D�b���	��XBCU�0� 3���$����F���s���%��{�E^
#���g�!�V/	�X��
rS��-��lh=HP5j�C�d��D��}������z�n���-�����S��8w}eY��������S���a	��TYn	��F�v�ap�qF=�V���=��OU�r�  q�X
"��>�g�$Oy�������(eY���3}<��6Z,��C��#�M�H��aD�����G�$��P9�h�8Q������S}���3'�H���@J=�q�@G������vg���L�������J���^v��0�F�Vrk�����F��0!!LC��a(b���|ri�6�Q��	m�����w_�d�@�
�`�Q%�r��	�~���1F�MN��B��[����]v�������`���5���O���Tn���<�cV� �d��`$��'S�!���6a/���M�@4���[��%&M���.�JH#���&�#2�-��F/���)�����@v�3�a����=D��F�!-����"��M��h���,�7V<���0��V�{�~�����i���'�u��;�@X�V>?xx�B�*�+�@�O(bh���;�9�- ��'�����q�$3E���V��$����A���4����|������G"���h��������~�������.S�`;�\�y�#:��������5m�6�!P������hm������t�����Yd�)�
�ry���9'I%�m7C��VJJ��:dA$$�y���Et���
��c���F�*hD��=:�(�n�^`�������itM���i��+j�C��L ��uWg`�*�������"�|b���2SI���
��u�If����Z�wo�h�M���fI�)d�I+���P�0x��|F����L�&��e�t��R��/�K��A���M2�m�Ag����R[D���Ue�W���4��c{r�3 ��k$�A��x`(�
�<����;
T��]�jS	�4L0��T]-�k����Io��,b�M�Z�M�\���c8@��R�^:�z<�F��I%!T�!sJ�&���J�r�gb���l
���FDqb���Xi�d���9��f�rF����2��T~2S�2����H�v�=>�p��A����aC%�����v���SV���o
Z�t(=~m��42��i�#�����xh9qS_���"w�7j�N��e�������Q��]i�#���$X}c�v���h7����T�}�wa��o�]t��vw_�q�`E���e�T���7������P��O���Y��W:�r��>}d�d���#V����v3'���Fe`�8������#��J�f[�����9�J]P���W�����A�B������E�`9�se���]$����K��s���1�������/$�~��!X��6��]�B���qC���Q����_y�������,��{��,3!<�m&��G���8�j����TPlM������`u�����XZ�����Q�p����j�����OL4|9��w8��1��y�9�>//Ft�Z�I}V�0ml����A�������9�l�$4�
�p��a�xo�:49��"y�t�<���;�j�>H���2��PeiT�
G����J��~�Y9���)�y+����@<�����N�oz�����l1!/�]�Xg�bwe�>pZA���/&����p��2Tao���*"9��oMD�\Ft�v���^T��O�pu[�+�]-����d���$�e��(S
E��%x�L�{
�5X�t(�|
}�[�~IP��!Y
W����lH���e�uLnH)��%��N�.(���PVP-��S��2����
�@d��a�+;�\��/�A��� ������T�\�UY�
[v��EB��jY���2� ���y�����4P+�
������2��������2ce�)����!���Rws��I�,"'�^�ai�KJ	�U�/Kz�a!�+	
��v�8���=p�=Cxg�����=�Vc��epBI2AW_QE�A>��DG��e8b�o?�H��XJ���+��
)82h����TiMyyKQg�V��\j�<�[e�s��dQ��2R!�&5�utj��m�@��
^���x%��Z�	���R��[������k�fu��*>�����kR��#+��A�n@�1�w�V�w����*K�5��h%~�����S����$���Q��8�0F�q6�t����3��2�1v�+�VvC�����9�������vD�G�"k����hf}�
=n�����3�xE����1��Pkj���)IB��$�.Z
XL���P��(��v���2L�RLWp	mg���b���M�w>*��K\f�Ft	�1�]\���_�4��;H�����~��B���/��aM�5i�r&@��#��2�I�l���d%�Qu�'���+��1�ex	/{k��nJ6Z�1�<K�e�OY
�A���j/��?�{�a���P�����|�Vl��n�P��;�)��ww������.�i�S=�n�
���6��bu)���c�t�/MM��_�)���t��[!TT��'���6_����!�1;�
��i�S�9i�6b�%Rj��@j`�%l������^���P�m4���[�T���mt$��O���o6\{���?��,��\��Z���Y�N�;���U;��4��*� gkB��J8w1U���m�
q�wI����)�)4<�l�U�1;���j���w���c�t�y�K�mmG�`��[n!��B!��=������>Yn�Uk�L�on�?�Q��j2��?p
}o�n'�+���F)��C�jB�q� nu�om��-�qAey;����8�W��CU;Z�� 1%�F�0��D�1�� '����{���68��;fH�cJ���5l��)�>�����>i#&b^C���;��,0�g
�
hxe������3U|� ���m,Bf�b�T-ZGznt���-j������1'�'����<����	ev�}%�O�E1��m�Bz���a�
X����Q
�^4`!�LD{�w9f�L���IGa���%����������%=MI�)�����y����Tx��[��5E55-����$�0i��q��*uV�2�mH�Z��?�Zm�4�G<)�����������w��+�������rb�K��x������(��	d�����������X��%Ef��Km u�$����m�c��lI��������.�m��c�A��=�X���
��x����/�Z��h.�`;X�8���[��&fM2����� ��$����$^r��qr��w���9�~R�&�����U�@��	���FK;�&2�)I��U��NX{�N[�K����Zam�%�(D2�j&N�I�/�Z{Q��g*gJT9��������2��c�{������������
�L�|���;�l�(O�����h�c�����i>����q�N����E�B����]}E�lB"�����M��f*
0�	�F���43�����LU�:a��yN���)��DH�*�ILE����M�n��M]sF��*��H$����HaV5����=M���4�!`�	Q���JG�H$�����Gg��B0N�w)W���v�9�1
�*���q���wE�-��Q"9�P�"�������S��Uh�0.����r��tJ���������:��_���`�<%{�m��Z�����28FK�b/��{�5��E�2W�cp����1$��|���9zj�2VN�����rV���%Z��������4����.��?�	��c��1��f$D
`���	�����n�|����sS����TSoM���%�]'^'<�^��$���vU&&)���P�}���E��\���A��I���C�00�f�l3z���{��5Z:
A����2r���T%z"���Eo�f��� �����'���V�����Lh�wm�&r�Ecb��>���=`=�������y��Y��gI��ny���1��J[��:�,6�����XYr���!K�88�<�}:���e��j�����g��KT�����pr�����'��b�������-B����:��t�1��-����aF.qLb��>�����T���@,?��D�`F�����Z�F���L�`S��:�p�f�l8�c�$�3��1x��1�H���$N�l�5f����1�[[����+���v�
��2"�A�"14 ��2�<
Jhv��|"z�1>��_�����cTa��}��'Fx�9��;��?�?��!�d�g��x'�N<]%�t�$CBH����heF�	O�
���l�q�"a�s��7�{�
5p�|r������D�q��zy
�:�������a�����|�H�;Sn^���'��]Q��2Y���xP�Y@�>U#���vK#Y3���LJ�a�pvTT6gT��!KU1r��'������7r���������3x����f0���!����2�����Ai��X�9��
���B����m��E���q��=/�
���������%�8!`�;(���	D��LB��?�#�C�E��P�^&�'R�-���B���XV���x��0���#������;r�a7?��eB$$r�y/�~{�=!v�7� _��??#b�)�F��Fz��yd����~GZ��p�q>�*��}��V�#I'�4��R�q�=2�������,L������x��Bq�Qf���sz(y�?_^Ee�����d�`��.��o����O4������C����	v��1�6Fd���E��Lwt�~���M����&��e�oXmBq�O�)�U�7],hD�S~���*�/��VR"+����6c
JG�����*�����9��#��Es��1�%�K
��y+5��2���Z_&��#O@N2()���_�"\�w���[�&��F��f*td������W*����M��
���Z�P�����{�m�\��c��0z�#�����	��t�d���|��(��������B��ho�*g�H�-�@����}������H���W�q�XD9����N�CXH`��2�0�KX&��s��`�n���f�;(
61�uT<�
����~�C:����%�
�|C��wd�����c��
:��j���nfK�,�3�����%�� �����a@sNg�M�������E�����K������,E����?;�1�^����6���48�D�"
v�� HQ�@��A�J@��A�?[C
�=�+�qQ�d`�T��W��g_��A�5<����:-�����`�?I��v��a�����8!*5��� ��{O����#y�;���[1�[IOB�}���6d��F�jL�+������8����4P<�{���y�.�Pli�_��_���P��@)���A���*�D����6���'n��VD���F�Z��C,So3Iv	�"�fl�^�\���%Q�[c3�|yl�9�����a��r�C�����#��:����L��h-+%���Nf3���K�(��1L����x��
$"�^�a ,�^��lI��h�MMR>�����r��������������R��'�H�����5W�I:��4�^'�����������Tx�7a}@a�{!�W�����|*���������DB���I���Q���@��_l�����bJ���O 
���d%<��B�7��T�h�0�P�mt�����_�O
}����i����6 u��X<��H�Q�HK�e�#",���{�hI���-�+�����b��B'��&���u��q��U*����h�5� ��*g�;�ep����c�-xzt
�#
��`$A�%)����T�������8C�����K���-(��"p�s����VD|mD��������g�g��u�Jd2QT����#��Oy�g�m�$)�,����l�R�~q'h���"����@�aF��e���'q�eF9swj�/Ft�W��1����H/4��T��i�({��"��������������6��n*����qc�{��2"PtXC���
�-�D�������)�����L�I�~�a��$g����K���%��/E�<���#�%��5'fd�KR���P���q����J��!�������a�.���z1r!����Q�����%Ij�i�����]�*m�l�7SYQm�B��TK������|Q-�B^5����3����������.L����X����n�/U��2U������ga}S���6��������Q���P�����K�*�������|vZ
��B]��s�`u����8��]7��8]�����5����������N�|�%u�2�(F�){R��X��'-�-����vxn�(����[�{��������4�z\c����;K5�����2�j2��;@O�>1Hd��������A��q���}u2��'�3Jy/�����HS#�(5�����Z������#�vE�]bJ��k�I%,�J�DV�jPC������P�1�(j
nj��Z�#r��PH����Sd#�9�����f����������I[{�B�B���i|>\*"��Fl���H���Q�������- �d�5~��Rik�	6}K5g\�����^�����_��_�����&8{�s��Z�����Om�d���-�J�A e5z!�M/�����0��S@�R{���T�R��1
�L[5��
e��3P�a�-�B�3�^�t��
��*�H>�?_lYI��q�1_���~^�qJ�@+��
w�������Q����*�XG5�QO�&�b�XH�*/]����P��Q�$�W5+1$j�����Rm�����P�vH�9�N������6�g��x/a����F1�d.&���E	�y��
v��F2d&3;8B$���D��/���o1!kp
���I��c��,3`�������
3�z���'�{��y EI5�1�W�i�E�X
���'e�`{D���M�{��p�Aj4:k���n4�\M��V�!�����
)q^�%�C���H�r���`�_����������$
D��a��r�g�����,W>	�^W|s����w���&:���}$�������{
�yw/ixI7$�L|{M��F�� ����$�D?���W���A�w��^�q��&1{��
�N	�������6'
.��9���E@t�^Z�����^�k�%���X��X&�"
o�k����';�J��H8-[�
*�;El�s,������]C�6.���h�~@�,�g�@:�V�JX���n����W�]n���������h�5C:�7+�:�-AsE7&��uj��"{���������su�"W{��mP�PoF\�#��9��B��1TB'���'������E�"��gmS>�T�7�bX���u�Z�~i
�0Q��{�����S���E�b�$Z��Z3, ���j�6�kfz+�/*�Bq}�
KD*��@�Gw���m����Y>�D�-�
2�Yr�F�c��V�`��:V��@�������"{��I�}��P�fA�M��v�T<�l	�F���?XB[
7�WK�l�Q��}��4F�m�p(����_dt4��@��%e W�%;d!��<v���t����������4#���J^C���y�1�-	Fu[[���U��e�q�I���b��I���E!%�=8uF��iD����:T��"�m�lj7��Dh����T��i_���,���j%��9�������Z��S��RD�=8[���������������eu�C3 �Q���f@���8`�����k����2�ii��t�j���6X�#u|TF��YMC�)���D�e��[��j��<�"�f6I4��4$�n���:�����<�>����m�����$�Y���"��|�����i]���7-���2�����0�,r?���@Z�;a��{!��$�;�$Tf�r+V ������b+�g��wa���xy�U��#"��o���OR�d�A�7+{����PG-�f�"�[O�*
Z8"9`���3����+R����.�b�������cDl. �������i�k��%��<���:������T_�N��?4C[�v�OZ��7���-�F{��` ��j�I{@�| ��@�B7 ��-���{)���� ��w�;���<F��,����#Qr)y�0bX�h�9��M�G�_Q\�����.H�{�L6���{���,�)X��%0�A6q��Y�4@�n�G[���1Tv����rM�9S^0h~��j�n��=nI��k��vc���g��F�4jx/>4�!Q���Zb}[Xd�f���p������iz�h�&���5�� �l��	��p���N�A)t�(��b�]��h� u~�
����')8I.A�`7
��* ���S�U�����ciO��c�$������8�f���������k��@��v��.�N��f�/=�
:pkRo��yz��vK�������ME7�
���{��n?Q���q1��'KA��[K1nzw���q����}~���~��o��^gw��p����@|7�ykc���9�G)���������>=�G����.�B�qO�_F�0��S))��P�n�$ �U)I`oZ��0K���jEM����~5F�.�>�~FvX4�� [4�
h��v�C_������+�t��	�"�����I[��f��2~z�w��N�j98w��p'|���b��E��{��G?q�����>���
����Luzc�Xq����;�R����^%lny��$�!�ZO"��@R#�6��*JZ��J����]����f��,|D�p���/���4���8����cG�?��V�j��<���'�������VO(�)��)�a��.��l,�du���q>��&�xu.�l���2��G:[Z�>�#�cv�Jz��&��xX��2����#�;K��}�e����'�u"�C7� ����+���	�X�D���S�4�����]��2����"��G.Q���0H��Jb$������D�r���q��(�����_�Q�L���x���0���D��������g-�]9��3�=/�? y�����Q�d<�s�u�� P�r�H��@��aB�uJ�gb<9�n�]:B���E��g������g\���7!�LD!2�!��J�,#�_hW�`b�~��NAM���#��0Qml���p{�Z�G���F�h���h}��,3m�x��7��{}L����a	�g���CH��(f��Ms�%*�G�g�������:���g�������o�po�o���C�#nG:C��,������lY���l=�Ep9nI�}d�&)�EiE�G��i���.RvbpK�����(����o$�
�,T/Z�X��q<��1�3	m`���
�\�)+V�H���f�������L�;����H�|F,	b��a;]~����)TF�&k�������w6e���3/�s�����F'VG������,�����������\#�f >i6���b��c��P�$�)#�@5��c�N�_��C��0*!��#Q�l$��#���z>�BO,��Iv'�`��g+i�~Aae���%>��p�o��rNhm����&��3�
D������Y5�S�$L�iA��$1�������|AA���V���L:���"�X\�9���~J���)�Fl���huW�f�{YnY>����H�-�j�R`F�J����J��!��	����4:Qv��R��x �!9V���g�&lL�%��#����#�N��=9�����Y���HT������;'��l$g#����sj�97���a���V����.�Nh�=6�,�k|�G2��j�����$�g������hY�l1���7)��?N�5w�E�
������� Dph�J��� ��R:r�m�����9%����'��V���8�/���#�U��a�6���'{(yT3�jYM��*S�<����o�R%�N��3Q���2��hF�PK�s!t���IN�����5H��>��>k��G���!�4� ��NR��>
&��Y�\��(�,N�!v*Nd��PiT����L�8*�c���_pB�U�<��n���/$;��sJ��8I����&��ydmt+ey��-8�9��^cD���$�9����:���j��u��M���?Xd+w`6<&\"�7����B��_�-� u�LPt�u-��W{���_G�����j��EZ�j���(��7�������5"�G1�I��9[�����B��4�`�_:�;��=��;~]U=q56�	����K���*3)��")�����d���sk
������M���bo�A�Nj�����Pc�M�,8ll��8
60s����e�<���l��h0-��p�&L����W�n,��#�z^F&"�����
���B�������Q<���*X��+^��v�m��~�4�����4N+Q�"�������A��#���^CQzcX?-�hzK�I���I>3���(�%H�!�q&Z�����2 17x;���`�����uV��&KG�s�{�l�<c��H�3�}��}i��0�}yV��
[Z������!�\1��
�-���[����+�����Q���l]��voh��m&k��������sD���J��>
�	M���Jz�hD��``�mci�bI1�E�HPBP��[y
��)��3VLj��zHVS�+�����U���6Py���CF�����FQ(u\�%(K��,���c3vVq�d��"W
������4z��Z#�z��O�*���
+����$K�vNE_�������~�����iaTwFC��������%nuU�\�y�)x���?l��2��V�M�r��2
m4����c�<�_��p�
�����bry�+����dp�
����Ig��Y�f�W���p'WEE�J��M��|��K#i��>�B�C,8a�(������a�s��@h�� x�H�n����"�@}���'*�RY�=�������GI�D�T
>4/�bk���C+�V�%f�X�����VIp
��5	
�1��WO���u<���2:Q."]�I��(kpV������=��yKz�8;�~V�|�rz���~�J"F�X�W��2`���l����b.����������u��22��2�g�aU74tnZ5.�->��7�r�?~��"��c�j!���p���7����%��.����k��AiJ�g$���e�C�uH��T���>�d�B��+����Y[l��;�H<���2��^���������qYHF��D[8:��K�)Q�@��J��:	��a�+I�l%��3��8��� �����gK���_^x�m�_7V(�PV�X�h���e+�P��_+���.�F�f�4J�����)7�I3�����+�{�c�:N���\I_^FF\s����d1������TJ�|z}�`��$�ME�0'�e��]8� �!J7b��x������~�A4�5���g����D]�Pd	l�I���Y�u��)r9z�CzZ^����/��l����z�}�e�D�:A�]�M�?i\Q���K��%����U�X:�"�����9������I����uT�XH�l������b��������}�+���g�B��
��.��J�}��k%;��3U����:�BRM.�
Qc����0����� �2�T%K�q����"_Wv������0D����h�����:�r�����m����1�f�"�	yV���r��6�������3��2�q�Ga�w���g���L���Q�O�#���t�Q~��3h���^��=�DW;����stE��
�!�8�%��5����[_~�P:cU��SM���6���������w��G>��-��o��+�H��Z�w���g�?����:Oe��@F�)����P�;*1G&���O:��A9�Q�6�������g�?{0�M�N��L���R��l���%h�>#cn����N3��#b��!�
����Y]X�d�;
�w���}��[��gD���j������uH�gQ��S�n^�x���e��3�P�n�*�:�n�EdH�j�=�����[h�AM�v�_�(C�I��G(����}��l�7��T'�k6T�mC��^���w�.T���2\v����;���-��|F�[E=�M�`��oQKT�7�x��9U���6��M�f��R��3�w����D����kD��F0t<,_�
;�mCJ�c$�}�F-��'�����_#e����Tr��������L��{h�O�f:��f:���v%�(}������*#��	r�okD~�o���d4v�-v�m���U���h6���kw"-���M]8����P;1Br%��&�?��������2�AF.�iG��PdG��zd��M��M(i��3���Pc�������W>s:`��NR��:�OX>{�!����%M���:(b�-J��F%$�d��Y��`�T��f0B���K��fk�M��b���t�� ��1��i�����L�t�i�F���xl�e�����6[��K�G��yC��M��� ����`B|}3��|�X�h@���%�����|��!�L��'�fG���(�}���T���,�����b��\�6j�=!D�	�P?5������ O�{���E/*�DQ��\����7I����(qf��ED�*d�b��z����\q��I���	�w q��'�hS��mB�=�%#�N^�~���
����f������K��AgT���'1Q;�j����&;�IB6������m_J��N�'1��=���$�@�2&V=Fb�c����7���#�1����9(9U�^��eZ�&i�����bo*Q>FDAUF-��O��9	�@���������R�e����$��D��S�Z�1n��F\i��#��!��8�gU�&������>�����]���%�	�qD^;�E��djB�.�����Y�14�����5������N@��<�O��3����D� c��zX��#��m��� 6Y2!� {w���$�}�vh�!PuTj��d@�X���.�.��8��p�R��A���|�h"�a]Y8Gdx�
��i'[.6���vV
)�NO�����M�9`���6���]��B��;��HZK�.FrX�!}�I�6����J�:���k��8�[�Bb��0��	mRKoau�|���Ixw7X����{F?q�e�x(pu�R���!��{ �Ys��w"����5�w
���1�0�6mA�2�m��e/�(���Z&���rc��s����H3��7'��
���)��^����?��v�'�F���\=�)���E���{�k�-ESE�u�����BO9��pzE�L�ca�c��|U�z�]��=m����kv�O�����\��]���Y�"���$.����!}<����K���x5Z�zE��j�S;QE��E'�����$D=F�)�I���z�~~�Q1N�
��3m����Q��H^
"fE��k�����L07��'4�ipN|��(1n+E���va_�K��'�.���g:�<�}b�T�1(x��u%���	�_=L�\uN�$����7�X�;~M6	Swl�1x�=~<���'��diM�����"�BK���T���{
SE�&?r.|�G�P�?9��x�������M�Py��(�h�=4������)���.����h��aBA{�,�3��)k]�R�C`<�t&��$���^#^�%�bU@��n��}/��w�ZV�����:�������
D��������[(�E��P�<����wg�.����,ee�S�m�;��X��O
A��
�4�xAp=zC5�*�k�M����b+������t���0w~-5��')�+�&y?u�D��?)��`
�xe���c`���AF�G���h���X��R�=3�2-"���HCSbk�bYF��F��a��y~
wPT%�#�����`^��������xJ�5WQ������B�+�P��>d����
�?9~�<57����qy�7cwR��x��~O��s�;�MZr}��������1YM���I�������Q���p����{
����Sh����;~4�
�ed��?�;BI�����t�M���r=w�m�h�:��.����e�U���;tH�R�����{
���.EX��HS�!CR���?cK�~G�D_
��G����������UT"�!����s�<�v�����$R�������-���H��u�{V'���^�]�����v@��^�M�-�W���^���R��/��K���������C�A��w�)���qC���1�������c�_Y����hw����Mz�� W��rF|��P��{3��Xz�}k��%��������$D��Lg
C����~�mBM���^@��3�	�D��tW��|�v���v�~m�����	Qx���W��iT���N�n����i�����	�2���A��o~���fWt
7��r��[)�y���D����U|����.Oxk�����$��n�^��\=4KZ���h���!�]��8���^�W$�Q�^f7��LI>���#4R ��QbU���!�y��{7�y;N�#���DA �I�-������8��V�����������H���*��V)+��h��)�����R7�/$�4������}I��.A���S����XU��W����Q��;:6�����?��M�kA�(�e���LK-������8:�O�kt!s�E�����C"~*F��j	N�z�����z�.�n?J]�K<?��8?H�1�����#���:��K"�:���!Y�(F:[,�V��&��)��sx#	�����N�l33� �i���5T���J�EOH�H�&�������4Sn��(�J,F�����3V�	���H�h�w]��?��T9�Z�x�M�K�Vh��d�����:�ff��RY��iE �[
w��6`�#������"P�
����mWf����<�q~�{�dh�W

��U�OX�_rce�zqT���}�FDx���})��iw����@Cu��=Un(my/���n_�A��W�8h��Yd$����]������&��o1��3~1�.���=^�Q1�1�z���6�j7Z���U���N�����Z��0�#s3tS9�T�[v~�H)^%�D�2��Y����/ q�;h����Z���r��4��:`���f�.6{VS�YW���NL�J�gw��m�!��Q"6 1���xI�A���	/"Y� H1d0X'q������Qm)x$7f ���Do�����#�1R_I$sZ,q���i0a���Q$�;���@��*�t ���d-;n
�Ij<At��D�[���8�C��q����P?�q�x���v��i�I����JM���X�NlHa
,�30#Y�Z����e����qU��rj��UJ;b��o}b��$�SY�!O��A���NTN�'������$%�At��k�(������$��b^�rL�������cj-q�Gs(��-����h<P\�f�1(����;������5I�S�"d��������L����F$ ���S��A��L@[d5n0���>�2!�>W
Tt��5!�Kd���H�Qk��e�P���&�@��(��q"5_�R�q��F�%����F�x�����T�����D��_mg�t�P��@��4������A�f���Z8��hj������F��������J�I�V���
O��lbE�B3���@�&e�}
(�y�h�:p��G�BJ��^�T�+�;�}y������Sk�y|9k�0�,���c�A�=3L��HQ� ��6|HD��C$m5�Or������m�?~�)��y�{���a����3Q���f��e|�3��h�>���])�/���9���"]���z
����Y��V
Ti�������&�8��!,�����U��#��
F��A��~��W(k�l�B���Y����u���kJf���N�2������$��b��|~�P��0im�����jHB+UC�J7[D�F�>��G�����=T�_
NV��`��w�i+<42{�Xib5��>]��Rv���W�S�3=���F{�E�����t��
�������3-}V:�2%bMl��J��7��k��������� ��w�>��&?�d����J��TCO;���
��d5�5j�J�Aj����_gT����w�26BK�����^G�;A�wQ���������U��MI*u���)���!�����p�/���x��pC6p�&��>B�(1%U=b'�Z~G�VK\�;e�og��j�B����/F	�A*��Y���apW
z�������)��H�Q?�b�z?�F��6��x������(����'�U��7cY
5c
	��BZ
vI�t?/ahem�&D��H���|���cZ��TZ*�
!�-aj<���XP)���0 1*m�4�")��nI"�Q	sP�@���T!��Z�PD��������m�{
���v��l�t�w)�C���Z���x��e�<���[i���%22���R-�D���3�/���c�j	M�.��FY�-����-�U�������9\@�(�4o��8	yZ����k�u"��Z�mB��D~	-�Er����]�&U/����]`�����Fm�f�@�C������$�$�f�O�P?��86L��0X��l���g<���Vd�����q]������W�/N\�G3��\�� �_s�_Y�����%�����=�"P���������X(���^�;��B��6"�A����J4�:~#8���/���R6���_�����:���IE�s/�_�>�����Q/�}H��r�!��{�p��F$�h�E�`�!�0���}(�Gj����^�nT1�C�PV���[�Y90�y�elj%+Y��6��4UwI����n�X������m�j� ����tZ0������rpT��}�� ������������S+�l�'�{P���]a�-�}�lj�V<�W�F���)<���j�H���c�{�#e�Z��L��^�\�)��I�%�="����~!_�Z���]��2�~%��r Z�v�Mw���5�������}�/
] .�����W���������dudz�Ee�=��*��ay��yz�N���'��z�m'n��_qO4]8����!�>;_��$z��l3#�I��sj�Kh*�Q���o�wLbm���D�zO��|`2�l{<����b��[�\Af��������:CyeFW=���-5��~�!��G����
�����$J���/=0E����'��g�
��|Q�+�3���?Qe�-���t����x��������L$G� z%1��/V�����W���
r����m���T���V��HIF������q�z�BvD;F��v����t��� =Q7��R���l��%��;)����y@����v�-���j")���[�a��h�w�GVU��9>O(�OI1�gPK�nPA;�9��,Q3��8
9eN����$�y����)R�vc
J�W	R�yN����(�A�j�:T��.�F�~R
-��p��z��H��;"hbQ���m��-����(tc
���\`�@��������W1�{�f�N��h���}	�h�F�~��@���}=54bd��������V?�:��uC
��|Q�Yh��F|�F�-Q�����=�8��DD�1+�����}
t6F�9�]�T4�
�d*
�����h'�k!��G1���|@t\4n�p�9��*�E�3Q��eu#���2�gZ�����?S�ZL���1\2��z��(�8��
�aeHuN��d��,XV<+��'6[.���v��~Y
*��|�������3�x7����uj=����
 L7t���������W�v��W�����YB���
����4�.@mA��� *xcKE�P���?d!���;�+E;[�
-T$t	�t����?��O0�-(Y'�'�����'�L�����v�����/� �*/��2���}��g��n�@T,�":�;������g�Y�����"Usa`=��-J�L;��wU�����[t*Y������$����#���d�[��*�����{����i�b���5D�IF@d�3#g�hQ�D����e��Wo�	e�R��ax�~�U�I�:�1#��;��E��#
`O��%��F<������9�IR��j���t@su����Z0�(kFf��.�
����*�����8G\���GnqT�6� S��y�#�X�PL���&�����Bs��������y����S'�		���,��E���j$�@�r��Dq?���a�@���w'��n������������HN+)�����<���~l�E3*&G���LvG>'���9.s�{�e����>n[.��5��z'w����[*[���E�:�g*0Z���E����Hv����e������&;�p-�%��BA8�0��OY����2�a��(Nc�����c����;Z������$�j�%�XU@���>=�f��z��C������a������}rn�[2�G���Z�%~�jY	g����`��_#G�'ug�Yo�P
���X��5�
��g`�R$����p� �j��q�����]�
�y?�d���� ��u��wc_�1�s��)S�"��0D!*���<L���
f��a�6�Ytws���9�[�������������W��sp�Tx07`��"����oOIdD���Vgz�a��l�}�^����,���(CcF�%'��������Q��������=��4V�����
��F��U>�f�X�����^��c`*1R�����4�����S�����{>1D�=K�����;��w���Yq�������/%,�c�[���0P��)�A���Ew�?(m���oe���0X_�>�KE��a�B|2Yz��6-�F���#�
t'���\MZ$$�� �3f�u�g�X#�:����L�
+�o���Q�������r��U4K��Q�����*s���so����&)Ttvc�X��oG���:�E����g�����~$�^4�o�I�4�U�������bw�Q�\cF4q�m�o�&{[���O���t{�z�>�i�D��y7.�95�p������b$�����h���F�f7
��M�\;z�w��� �5Qb�1e=6�Lc$�2&�a���W�HO:��8�C�|���b>������:����-Y�^���n��P���7��x�C��~T�]�%���2���������L�T��
E��4��vfRmu�����e3G��������	s�B ���-3��j�q�XVA=�	i����� �|���u���Y�.�2��6Gb�):6{�� ��I14�UH�+2�r�
��-����xj�E�%@K�H�S�� �����O(��->#|m�X��L(5D�R���o	���!1��#��}�4#����3�L"�(ZoH��fE�������Z���7v\c��Q������4�x)������r+*VQ'#��G�n���+;����m�!>�4��Qcw����@���@>��/�:u�lG��V5ViFO��*v������s��[��<c��{��$e�a��X��h��>:5]k&w�����������3�
�_���3?u��B��/��PQ�f�S)^h��aL	��B|#v�����A-I3�Pm��"8��	x1�C�}�G�����F����3��A9�����#�]�c���l���BF*�D�!�L&���/uK�8�(��E���zs����:udc4
Yt\��� ��LU�����$3������j���D2�?���ZP;u���HV���O�M����N���9��$�m�/:\f�
�
[�m��38�:
D��F�d���R�ib�p0�:b�����E��g\�X�x���$�1��g����.4��H�n���/x{�fx2�00�iLA,�i�3��'�N�gh�7K�>�b���H�Y����@�ZT8-c:zjd��z���tR��2f ��0od����Ov�4�W�J�!4�����j���\VR��������V .c����5B�V��-�bL���#��2��Tt�����J�f�������,v��1� ���3���id���FY�+���K�`��z�����5lD�_%	3��kN8�� �*-`���N0Q�"�@�d�}l5��F��t��0��K�!	��G�������������1�}���J�U���#.�Nm���>��&�G�/	T�����B���-��3vL�����xD�G���1r&PV�t�G
��6����Y���@*[^>��N����������b�O�mL����b�$b�^�-�7��
�]_
�]A�+
^��o�M=��h����e����x�m��� 	��9����>�d�+Q�z�;@��I���
D�B��2nW�����,��w<X��@��=#Czw	d�W&���'I�B
QW`���w���(�����1��"�8����,��j������f���s���F+j,���J9�o��I��V���(�k�o9�hJ	�b����:�%��#��-��#��������[
��38�mZ����N��|xK�A�z,�qs(���2T��L��������0��>��4�hcCl�[������n%���h� Z������W��(���2����C[r`D�Y����$C��I��5O�J�+����;�F�Y;.�w�M�Z=�����;���v`1�Po�P��_;G������)�dCH.�!|��z
��;b�#
�����B|4/i]�g���l���4��pk5�����&�	��������"��'l�����=������y3g�����\��6�PG��	��h>_��x��E�8.U�
r�;'�0�xS���;	�����9�)�c�$�	����g��O;�D?��(�>"���l��j�x��DV��&��C����aYL;1�w.ID��������(Q��
-0�Afjb���6�����d��c&c�`�������9�{�K��G4K��u@��hy��jr���#0�A�K|���L@w;)�s�d��mXA.�
��>Z6���+�V��L81��
K����eC=�]�(�V
U6��CU�h�	i@A;�ty�mT\���W�E����1�����l����6��Rw��Z��Wm
;�9
�:ll�>A��I�������ncFT��4�`�4������{f:}0����J)�o���+����H���N���DG���Y2��wT%�S�@!-�=~��;)�y�h�~�	�����eOo|����8U\h��n��O@1�����m�B���R1��n��I@������s�@R����L=�uL�,rBA��i�"�R��g*�m�BB��rz^�P��\��#����T������%pZ"x�kt����/A9;���i?z��R�!����i
T����Y��e(���������;���D�ev�;8��_q'0����=���H��e�P$�F�O��a}�[���4�]&x������/����!Pd�j#�	���F5��8�j��<���z~�n1�h����*��e.�K�M+^��N�,8o�(��K��.�:d^���q���~Nx^�����G6���
�g����
;�������TQ���*��*��4�znU�c�X��w��mv���#�Zt��"
����dpD���S�h�mV1~0�b����Q$5�"B�O�I�x�r4�
���jC��Nd��c�#�?	������������;��y��1`���g
������n����D�D��%��,�zD]q����{x����S�H�6-��U����q��[�/�
��-��VB�	�&�����r�<I&x���	l���'������<q��1e��l��_����etul���]����>`C���'D<I�FC���e��"��-��mR���z�l�S�m������.~���r\Tp�S��t������]}b����gR�:���~�N-��h������E�e��F�x?��5N�.�*��bJA'���QG�8�����w��<�i0�S5�=�TdA^�sf�.�P�M��}�%C)
�A'��N@T���(���#��L�j:��:��'���1�B�l{ZhX%���E�!�B�xr���~�����,?i�X�z�����*G������y�}��v~���&�ot\:�V��g�i����4�q�1�"����`'I�����r��!���C-�J������#1h���b(���D���|�P3*R��.�I��3F�Ob���G�6���*��=���
j�[����Bw����zI���f�*u���F8FAt�e]�3����X��1��6\��h�g��wh����j����.���1=q���FM1�XU�����TC��k�+t���5�gb���|��V}WF5�$
ue8�2�����C�@>$�����`�Cc��������n�`4�|,iY�+(!{���0��M>�'k�cm�X>g��b�$�.�N<F+T�*Bu��
".���JM��h�Ip����L�w�Q4%(��6u�����)�SK��TQ����@%�V����7d���h���w�A5�p
�V��@�������;���Y;�d5z�ShJ�����:JF(X|�1!�n����u8;���Q�'�>(D�O�S~=f���l6�"�@$��OJ�������A��E`��yv��f:��0�� )����6��:�<=	c<	6���A�w?��(?�A�B��D�ht�Cn�@�0�t��k���`X�;�E�c3�o;)����]��w����4�6{Gz��
��w`"%��GF&g[��9rSF����B�#��V��,����{������{L�l���� �� c��4��;�4y�`���]��Yx�T}��:)�9�����/�t��r��O�R�#���zpQl��/�a67j�MK^
hd�-�$zGz���N���E�0{���q'���<����+mU���������.*��gD�����A����`95���;��Y�������f���)"�V�c�������)B�,����������}0��lQ4&���M�'g�w��m�P$�&8�;<>�M�V����������b�):�!AO�1t ����#=��j� n���z��
�p��F�=��YGF����"��ml��>A#����h����*��Z�����
���/��?��'���E2r����p"��;�F�g!<�l����L�yg��%�u=����rVJ5����4J2\%T�]{/O%N�n���.�����}�����w���u���|�%&��	��ZPC�6������e8��j�c#2�0�q�cU=}@���kwqAj�w���I������T�,�5��9 ��%���D�Vm��>f������dA$!%������nSC!z�+��c�fpP�Dw*�z��PE>
� #f�_~��`N�{�d/������.{!=���0D0>6�Q�NU������T�O�T���a�� �H�%T
L��r���,>+k!E��M���W�4jQ'����LU��q6��dd����i^����"�`AL��Y<�t�E&�NJ^T�z�'�
5Y��"^�{�h����������'��a7=��Y`@q���j�E4�U��
�(n�V%�T3h�+Q-E����@&Y��==����JP��9���P�D���/g��Ji���2h�C�����-��
����gk��^�&�d�6�Pg�|�P;�[��P�\�QK"��D�U1��?K��Q��|*��@��\F��f��a�?��X�2QDUe1� �e�v�� ���B���e&�u���dT�Y>O(a���D��_Y_�m�{�7����9M;��?��dq_dQ�+�Y���_�����Y�3�u�]JK����+Ft��o����0B�y/4[WG��b�A�b������q6�%��Y�l��L�,-�#���cMHy��x��_
��k�n��(F��.+{�/	�._��~�f��I�!�|�C�UlWl���	Z�<'��,qN��-0�l��u��%Q& rB1�p�w)�Ht`�b�a�vT�*�iU�Ohx��a�(ag��
��xH����.1����0��,Xx�a��,Fd-G��N��C���:b{�j�`�"f�b�v$>zf1sj;�p(
}���/u��%"�!�����#7�P���'���g�z$��H��`����#K�.�������G��(����s��!��o����!�O�G�;1� �����D~)3��wc�p�54�Xq3��#I�3�"����D���(�h�LX-�F��s�!��~�s`���[���[��j��e+��yI������a��J5�f5���D��N����~<�^4�*�J��]���X�t.2�~
<h-�� WA��6�1y�h��W�4X��n��Bq@����@������B=K���%_6�B�
v�!��^otv
�P�Jn1��ebYS���>1��T-!VC|����p%�YC(0M�(%�5vj=1(��-�� tpQK���B�u�T��6����^"X��Y�2B�|6!`@v��x�o��lI�N��������������U6��5�'P��v��s���>+.k�	D��Y�����go�>V��G��k����)Dg5FqP���C�~,s�W ����� ���ii
NV6B����&���z3�f,���������Nn���_SQ6������YV�m��]Qe\
J��	�]|&B�jI�^CLt����-��|	=�?��QA���P�j0�A�-nu��Y�Af)\	�@�,b�5k��# \=��PktR��(���^�2,����(LQN6�(t�'z#���7 ���/�VVh�n��dc���������y��g�>��y��2����p��T'}G��-*�{8��v���v�D	 ��Y�X0�C���4
o�pgx��d�������y/���X��8�9z�6�
S$Z�������}����gpB�<j�v�_:m^�e#�@
<q��B����{5F�5!����/ ��l��^V=!��%HY[���������W���2a%�������K���/�!�����{��%��pB��yG��tW��\��i�2�u��4���'n?:*T�%�F.T4����ij�A��9,Ii������:�1�T�����m�?������:'Z_f*�'�Q���`5��	!t�{��T���B�U�����Z��A��a�K�x���=��=�
��Pf����km�U<T�����$a+�)�&����X���i��C��������	�:��������+7��X,v@b!��V�M�Pl���;�cw�����p�'���T �c���%�e?�cB������5XO,��1(!:;��~zf����uTLW�����{��$h\��Qw�hz�L�.����������������/��F#�~��V��g�^�H	PO����������������xe]��'�VxB�i��f4Q
8����K���k�p'�voUU�������M�����Q����T^�O7��1]�4U�>r5�P(�l1M�&��f��)�T�&���ghJ�Fg�f`�V�l���w��;������G�����?��������~�2�d6(B���-J-�3v�/zi�5z�e�Z:�u��7�{
�WE>���`�Y~���*���b3���*RYU[���y������=����{�M���I�,-fJI,T?��&4C�x�����8��[��-���[���u�H����8����,Jt6�	�!�hF��)�L���-2����%.�w�S'�A��
lAlf�%�H	����0��	*�Z"ng�K�������EF6X�qz�h����m���o���X%����%��Y��}�Zb`����*c�����S!P���0�����=�,��"�h0��l����
:X���Z-�BZ�
% ��}i���8�l
v���-��b��B�C	n��}*�����LlV���4�~3���~d
5�!��G9���5��v���I|mF���yn3r P���f�`���q���P�aG������|���A[3r��I�b�P?�CP
�#�>`�>�^#������L��
Z�
��4O��`A���^����&����30,��7�
'i�e[HN��+�F�JH����lS�P���l+�Z��.ptp.1�>%.k��M�/������H������ -(C�����S��������v��l3����o�A�^�����xGQ=�z�NQ��]7�D|�������f���e��7�{�ti�d�>=6<&�h�G���?��=��A�C�gOBP*{R	b�+'N�2lb��vBa����C�d>��j��%��[�v7#:�()�~{��.����~��@4�fB�+f���+T���9�?�O�&�Q���j���>�����^E���I1�	%�!�^���)���*��C�|���>�b!!������?��y�L��
TXO<1u��Xr�@UF7P���n�B+�N�����*�_tc:^/�\�%m�2��P�m#�'���'������/���N�N[�:{�����h`�Nw�^�8�[�Fe:��0I�p�o���#53��F0��J�i��>�F��l�JV�^���D7��K�,:�V���qg���}�5�9?v�E�Y���2�D7v�G1�����:]=i����
]�
~-5�sh�����
R��tC��B��'�`��h��U����2P���h���-<�07�,�F*����41R!i�,�����T(o���-��M�{�����M�,�=v�h1��AZDU��+6�`v����W�����,
�zKf:�#G����3���b7������>���M�XS��'\Z���;�8�'������Fy7S�?���p���=9c�����X�3�
M�\��#2���%4�OH����nL�X� �iL�A@=���b������w"b�=�[�4ZSb�$����"��H��p�]c��9��A>z
��y�X@F�U�3���l�G����
"���6����|va�.g����&
:�d#�'������	zo1Z�-@4������9T
�u*����F��� VKRP��MP�

@�Y��W�����M,�>��+�����+T���v9�:�	9�����~�f��0��dta!�q����0����p}�y���%��������*FY[�V�Q�	t@�B���N����r@T���XuC
�UY�O�o�����!�!�	2�[��A���[���HP��Pz�z�F$Cq4�c={d
sQ��IPGF�
}�gk�T��'������q7P���L���_J�&�X����F=#��x�_G����t���%1�x<��>qM����������t�Ce�#���B��PQ����qQ����b�O4�-H�-SrFj	v8-�'��F�s*0	�y���b$��j7���`
ee1R�����_����K"L4��/�Em*���Q���Y4�0�%�P����CCb�	`*_j5���Tp�Tk�j�`$jZd���I����~=4��>py��C�H��uY�*���Q������s�]�g�u(d5����LE�h��5sS-]���d���|���{eAWHONZ�����b,�sD��F�%qd�H��j,a����3F���A,��nI���&fF��	��z�`�
�FN��`0"��B�IE�@]�aBt^��Z��a<B�����������8cnv��_;� Ly�pI�V����K1�t/�.������!A�d�����`|��sb�Zv��:�.$f�Z�&2#�u���|�G��0	��f�V#�������g`�����B���������N+��'��
����[�V�t����U�Le��L��'�8	4aB�a�Bh���nc#�x��&<A�B�o�\�a ��f�����
��C�<���~Ia�Z����m�3��G���k�_���)b����G�Et����zTdNi���b����6���H�J��H����]hwf(�0l��D]���'�������kd4�d�vl}���@�~�G��=��#ZK���pl�����M[:�^"��K\|�E-#@���,�}[E���K���
��fG�Z
�w#���@�t5��������V��2I��`�aHC.�K��KX��c.��'��L�O��N&���0�=��Z�>I�#R��V����'F"���W��zy���3ZEbd"���.�[��JV�iTC�"�*�������2$I����I��N|�����H&���� �1�FFq�X[4�l'���go�)|��k%]��l�v�����������H�D
-�H�9N0�(��,��(���@��Y��'�4q��1dP��Tzo�����D���+��y-�B���_h�'���E��/"��%q�[��"���ME/3rmBD����)��2���t������|Z�D���)*6
>��,_�=���x���1+��~
O��v3D�r���c&�Ank"����g����2��� �����~4H(3���A�����$>p�l	Y���
�L(5����gJ��E�F��eZ�:	sf��9|n������������oYi�\	K'�Z%�e���(��wSC����F�(��6� =���F��25���v�/0E��3hm&����)�� ���&d�����Q�B�z���d'����~8�����o� �����x�?�MM>���#�a6h��~Sq�lU�UW��r�b�,3���|
��P��4���V4�X��M,T8
2�����������K��a��iL�"]�4�p���l�s&9c����T3���PF�sf���Am��~`B���F<g<!�+�1�a�~3&LZC�&��C�p�6�)�F��|.R��-����e|l����@M����0��.P�$���q����e��{&�Z��
�&e\��Eh�L
�����6q���5�L��PV�=���XY��&�RD�����e��FO�0�@��
=�k��#��Y�����N��bSv�*�*�dQ����1=�f��26�G�()D`����� [m"��O����j�27�i�A��G���H�2�g��� ������s�c�#�bT�r� ~f�8O��V�Z����]�SR�HYu�)��3vMw!,�U�bfM�$V���d�G�bI�%wSb
����>B��-���-T���E������[�?�X<6y�2��z�h�{G����o��l�IPq��IHo&7�*�)XQP(P
���1	��Y�|�H-1��l�
��y/+�T�S����Lj��KD<�����pUu�F�2.!���f��,�E���_��h1+��6/��X�$J}�`���a�������UV�a����<.c���$bF����Q���������J�z,�|��fw���?������2�F��vu+����$y@�m�h�.�v����4�������lo4�b�V���Y-
��}P)�~j���ML�D���	���#T����J�LET���O/�X�j�������p�D����.QC����
���$�8�����&W���C���v�y��h}+�a	��
-[r�G��������-�&d���&��z�(�e��"k(3����E�.CJ<�fI�+V���ShU�u�s�����+��iw%iB����=�2l�\��l���U}7C��)0�Q��Cv�Vv2+#e��2s!�s%�B-�i�+�8������(!�x��a�������)U#K�_4t����p���'�o�������)v�&�4�\��?���k9�AWvv�Z�������?:���f��&��
!����#|_��A����������,8J���C����L�N�V�u���h�{�l�_���p�,H���4����)���)Tv2� 0�*����c��E��#/tVR���w#G��0T4���v���s�
U��VS�%��+�l;%#�r����X;G�&�R@eK�D(+C�$�4�Z���5���H������'������&�������q���i]�����+��E��W��&��-J;�#�kK�J���Q�����

O��bL?����9���S��{>ITK{�4�#�R	�B�����=v�:?�Uq��������an;�����
���.��hzG���_����t��W�*�]�Ll{�I����+�}����WL�dh��.�7�� �a��)-9��J/e�6M	�U�4TOo7��T�O�eT��J��f0z=5���#���\��������j_t�E�X�A]������e+�}F��K���#�"T=�����d�����lD��"�5Do���OD������GFM����#j�N��|]�
����G�Y����p�:��3^��4�?������JA,�#����p��g�[P�v��Q�w,��J,���n�������cev��^jz�b'KH����$�K����~�}j	jP��
����[��������vz��q��B��b'��'��#���!t�0��n�I�p������Q����r
��/+Z,n�5R�G�}|R`L���K�r�������_q[�ng��](m{)�QeG~�^��5t�I�.3L1i�[���:l��w�! 3���U�D1TZ�XI�{���{��
��$?��I� 2����n��b��K>����wR�B��
a��+�.����3j'q����T��3�b�M�}o7��J�����J�6�!�N���*C6���cX@����;fG�_�C����h�6  5�e7��l����j�������F�|��4d��������b��:ZQcG,J4|��

�S$j0��[B�@lo9�;>a���Rbl%��.���poM����L�Fh������";JQ&��D�|��e��0P��qn��-�AJ��j+#�I�3�'���j�YG�����/'������r�D?�my ���A{P���������L���;;OQ��p���<2M���2 f�c�t����T�c,}���dT���d�t���H��
�+�(�����;���wD�;%�m��'��D��k�	NY�:�j?�`q��]�
)	!��1�({�����/-Kb��<�y��y������i�A��I���C�������'����T�@��I��4+�v��A�������h�h���\NOT�Q���g�H�}-�w'K��y�/td#w(�_\���1� �����Vs�ot�NQ�:��
���/8�MEJ�������:�r��Df�ww_�u����)wZ(���
|PU����1��y"s�cA[�fK���1l��Pd?�-xJ�B��c�@��1VN�~���v��a�����s�?e�Z���}dI��$( �1�����l���c����Q�����S'?p��\:Y-�$�Yg�]�HJ~��0��_Rw�:$�l�3� �������d&���P����mm|����� K�gB�Y��1� T���X)c�V�j��LB�������=F:D��I�-R)��dX��<V�Z�Y�w"����#����c�z+����_7��mCf���~��hC��_��-NL|!��c|A�������-&F�v`����}�o}�������E��������&���gc\�-�������>d���}��v��btA�^�U����'��6��zvZ$���:���l�b�w��4Kv��i�6
�T��
3�f���W�	v���� ����>'2�#�4��xY�i������)��V:�u�j9S�$E=�N�����U|7T�&Z��o�F�k��P�=;��9F"��Jl�7��|mI���/J��?�p�w�q��|�@A���]k@�r�A���^��{J��[�2`�|��D6�5��"w�S�?,���g��^�T��Rd�%�,{a�cUR�[��od=%�}ib����;�X*��A^��O�c���"#|/����������Nm|r�{/��

	�r}�7������b�kk���
��,�!��^��LU��(n�(n�pA��9T����"YDw�����{[
�'��wd�5!��#C��{�p����%��|���RU��{:����|���z��L��W|�^����
�g�����l��=���Mi
FR� ����B���DP(��Z4��5 ��wP�
�n0����d\AG���X}��h�G���r����+dV����f����s��/���'E�<Y����!�Se2�`��:^�������kE��]���T�5,<.�:j����Oa�?K���DR�<�r�
b���Oo�ybI���6x��Y����H%��Y���{jlu�{���z]l�f��	�aj��s��i�"��;��4�����S�`��F��z�E#LN~���w���A����V�
]����z�g��� ��E s�^�����n�$��WH#�'E���l�^�h-,Bz����;���:`�������Y��%,�O���	Lq{���>"�c:��Z�(�yA��[.'�����{��f�k�j��Q5�d��^#��'oCIu��t6�p�0 :B����5rF�=��UU��u�F����l�A#�w�}y�:�
��������JN�3������#j��h��c��\Q���pv�H�^(�~h�L)/����=�JXo3ZC���������N�8��
wW�}u�T8����jd
r#lrkG����R���3H�&,��:^�Y���O����>I9�b�H��^�`j�v^�pl������������[��G~��`Pyr��+E���U,�
V�D��	b���Z<�B}�{�[�����B���Z\�����������E���<�����R�0{N��E�����^[�HLk��Ho�:���\�xy��oW�)�f�"����7�g���)�KI��
j?��������$��W��pY%vH��<��,�<��o:��������P�{>�g�:��8�.���~��Nz�T����f���~��]:�.���7���A�-S��H
�Uv"v[�F�#TJ�@w�0������l�������n��N%������K�m�<6j��d+�539
��'N)��B��*CH3s�NQG�|���T��P��pDa��5��Y�^����>����xJ��4�� �i��@f��Dag�	��V��18�$W���Bc�+���5���}���;3�-��N�&+;�:8�>8T���w�xQ�*�U���z����9�����l���C8x���RF���#�CLR�3��������6�!&q]zF�/��>�"W1����2��X�%��5��*�4��e����J?n5
{G1V�:��6�H�|��v�/D��J"�{��#���:&+����{��	��x-u9��9��$�1���]~��yzi��b����0�c��f]����������t�*����`������d�
�$�?~������
1[;8�P��]b���>Y	L�F/*,�&���V�:G�m��gT3V��J����N��Pz���$�@����
�m��$��U��1j6�Cbgo�M��P���(�.AEh!0n��S����u�����E���]a�:W�?)���s��c2B��e�B�t��EI������Y/^� F��J��}�\-��)	i`�n�B=P���<#��?K�w����.D�����^��f�\���ZI�%'!t�b��8�S^D9q��Y�Y����m�4$B�F�>�z�-�><�_���
��^�QeT�kH!�����	|����u�����j4�����9a�o��P�GkW#)�������1jB<���=#�)���_�s�%�:l�?�B���i�('m��e:V�:�{�L�k��^����������,34��s���U?@CL�+'<��t5��\&e������_����C�
vo���P#xP^S5�!��M��Z�h����s�t=�:^c�Tk��9t8�K,9���w�@#c;���$���0���3Y�����P���rJ[5�N��pb���kT��0��n!&c1�U��`T�"�+
@����]�e-0$�Y�?�Aqy��f}C�f�q���-��K��u�-+����R�D��S�D�����2����^`bGr�j��1Bl5���Lc��7�ag^�Y�#�}�W5���J-m�=���J��r:3���BnN���$�=(��{���V
�!Q��������t����K���W5�s����������#���_��FXFq_��n���p�)�P�g���lu<�unM���u��G���P�$�q��B�f��s��O�eT;(;'I�������_NB8���5z����Hf��P=�I�f%��Hj�U#��U�z>5������$��Q�."����+_�f,�4�_�LG]�����g�A���a�|�xl3�rD<	1�J�^�y_W��]v��z���D^�M}��4�wDS� �G�DU�vt�����'�[(�aU#0�=��N���zd�a-��
�J��������J�8�N�A9w���w����YW\����Hp�w��(�����b-�E���TqWEe���b����u�[l�?��FRA&'Pq6d
�Y������=������:�z������n+��5���&�Hq��d�V6r��UT1if��9��?�o���jX���g@	U
�b���MV1ZAq.�F���.FZ��=������`(l+���NTC$����\���Gf�S���@u��E��E"����%��i	�@F�������N�r#��.1-�	r�h�_Kp��;aR�jL����j�2pX_�@Q�k�y�
[e�O�D\�_m�S��F���%�Z�����xJ}L���Y���7�$]�S���<���/��d��D?�� �Z+�k�rhFF��������jk4�3�g�_U��`���Z��[�B�k��hP�}j���}�j�7��C|�V�?v������m%�PZdjJ��]Z�H��-�;� w�`:N������Q��OA��������,Cmj����:4�M&P���=��)��%pA��-�x�2RE��1��������
}��9�(lRlX�`�>K��A>��#^p��CB���N?l
6��[f��k�>�b���;[ �vxW���;�I�,�	l����$���j��-��%�S,PA����h.G�t������?P��g����<e�SS�U�q�^���n
S]!'�[����-��]�',������P�4��8�8pL�[��0n��^��.��cxey`���s��+mh:�u�4�Yhsm�3�����,�*2������v�1��@��XQ0�0�����0,��?2�G�_��l���w�E�<���SD���X������v��X�X5s�m�������������������6;�%i[4�Ol���K��S!�q�����WC��j��de������r[+�s����B����|j���i�VNi-��`xB��8�5��JV�Piu�������;��m�J�]b��fb#"x�'X���%7�5j��
p�T��A���?�"D�������v\%�0���4Td+�������z�K����Tf
��>+L�]����N�?	dr���q�����M��i���5�faO������������PG��q� o(������?�lM��B���;�l��@�����)J26M�f�~�5�bG�pYf q@�^������Z�v�.�*���M�/���	������7o�?�o�V��(=`��e��j��(1C7v����jMv��$�{����q�{Q_�^���gTW�L���+T����:�����~G�6�~;n,<���_����*�����=I��8�����T0� 	�,���VcK��}�5�e��_�q��*���I��TE�,v�_a\a�Z�M8�T��Kg�~��7�4"�D7��S�<����! �`7p`VV-=��b3z����_�"�z�,F\0u���
k��+������U����V{lTps�`s�	�����?S��%�%u2������{(�%����N�y���H���jkK�e��������wc����-p��G�����c�}7 %��xe+r���Z3=�P�D��g����hO���~V�E���2�����z��/<����wd�_��d`4	��4}?����u���������:a��KR��;���g�o�bjnm9��k����b="���n���.��R=�:������������GR�lAz�q�2$����}�%�HF���=8�]������b05��}�S�������5y��D�@�M�IQ��G�p�j�P�?*����`�+p��E=��1�R�����m��u>[(4�^�l�Y�����5�&3�A=����;6;w�X�,J��c��t�#�cy�<Mv�,���>'c~���Y���B,u�e��H����"�tc�NO����^���>p?���)������5�>T�D1X���
�/��4�5t�O�
�*7�6��U�|�����89��6�G�0dP��5�,Q������&AG����P��w�M��:����a���"(�h��,�#0�0���5����Y�ae$[m��k=]�
���R
)9�$�4�AP��0����G������n���'m/�"���M6���h*yP�����5"Q���n)��t�2�H�����0��$m���o2�A��wj[D4�
F�.�X#�b��x�������a��2�Pkk}P��.��m��f9����sPa9: ������
/�Fa�a�a8w�����6��,B�wN`R���,�d����
[�F�D�YssF��xV����_C%>�>�A81�mW1�61H�{Wu������p��(J���=$�����R����=��-q��c�����D��53��-�z�=� XJ=�4�9��N��h�`��I��%�M�0������0�0������K�5�IO��x�>\�13i��>���>�Ojp7�M��F|��'Jl�8)H����\A�N���'�(Mk$O��������!WC��F�<y^�ri�q��(-wE]�a���G	�C�}�e��5���d�aHA��rkBM�o#� '��B�g�?Ms�w����C��H�>V���nW��]�h�!v^r g6;���^�d�ui�4�X���{�D��34}9�����F��+v��N��]�19�w���1>�����\�s��LX��Q����b��	m���)�+"��92�A�W)�r�m�Bc���c���bM��I����X4�$k#0��/�E��^@��l02 �NaR������y'�rUo s"(�dh`�i������ y�0  s;�<�mIy����c�q4��:yh� �z�6T�T�UN���8�2�i�`��;�.�#�L�Bf��3�S��4�pT�*!J<Y�������
�����L;��:i�8���Q����B�l��C�G��i�@��n4~s0����W��j�?��Pe7K�MK�e�]���4*0��6
8�a�3}v�>EFg�FFhW���A<z�����@.uZP}2���E&��������$�u��^��VD��<mJ�@Er�Yc6��W:��)6�����k��m�������n��S�[�Ie�.�-�N�/��� ���{�,4r���"��=!���?+;��t�J�7�����3~D��T�r�t�����s�w�c��������}Q������yw)��Yi�6�:�Cny���Mp4�G�n�s�*vy�(��8�Mw�;:�������}��������%<#2h�����(���6����*g���BkE���U3q	J~�������z2��(�k��/�,���?�
��a��b�t��
�B}�e�4y(d��71'j�l�����G�L�^�[h��so���dF��W�:?��{�j��>j��hP�a�}����#���V�,�K����q�q�/Z
��O���S%G�9�H�.4lh�i�\
1�[�+F�����{N�7Qs&�as��}��Y��\��(��a+]�J�3?�6b��
����^"owzS���c�������O3�q0��x���6������Q��N��6��,�������/d�;W�|���������
j��6g~�3�A��e#��e$��[c���oT~�8�P��AQ��jf����������U�o�F���?=�s,Xc+gib(kER6Eb2�
J�fF�3��B���**([����<�rkM��2J��[FV��/���.�/XO�������K����5�������}7�X���b��c�P�eT@�)����Q���l$�������0�~����|~��*� "	,�g�d�����NN(�9�������e��1�`����K6�e��y�� F�*QD� ������]W��'�Lu���g/wA�d(S�w�-�H:"���U���b���Y�2g"���:���[Q��	-#�0�P���V��c��}7#�nV;-�"<k+���_��I�20�n,�,
1t���|�#����m%�@k��}��-�X��<K�-��pO��n���������n�-�VK�3������?���Wk5��U0(=���L���@��_��6����.V�B�������"�q"0�����������(���R3Mk:�,�U�Kl������HO+���c����e��X���R03Z]���z�_Q��
y�5������������]h�~T��
nFBXF
��)�E�h�H��A!��K"z�2� 3�sV��P�5�{u��(�B$1��[32c	��0V6��1���TEge��.��+ya���1�ll�-��Zu�P��T�MhY��@��2�:N@�8N�����:�3*�
\�X�k�r4��g�C��9r��	IvWdH,�����O�U����I����5w�2�����=����3�
q�����c��+�����ST;8�E9q�R���%��VB
$�tGe�������N����E�����-���Mk�
P#�OF�=�!��6��|+[m�O0��J��R������X�&�g�}�D��9�/me}2q+���Qk%OI�e�J������Fg�'���-�0����Q��V��Ux���]� �����Q
�����Vm�b�I,3|#?��x��`AI����P�"s�,��h��v��gw�@2_vR��/&�
�k����x�@��m�a�!|hx��.Af.����8�����|��X��]��w�;jH�"2v�
r��`W�eo��p�*�-Y%w�$�VgR��)u�jx������^������������;A
Kn3vX��k�@��mhB,��m�2,��QW�l�k�ub�"�k�*<�������.�L���\���K(����Z���M���gv�c?i�-l���W�d���ULW�5��O�+R��S(�S�rd���}4N4��'���M��C�����0�]�8V��7�,wi6���>ny�{��:��]���q���X4(�YO`��Lht�����?8���1���V�&g6�,%%��s�6<q�7�"&���6(Q��dE�~�
����S����@"�	+G@}4��Jq�������;��g'���;�E��+T��
Y���l��'���r�G��1���Odvw��a�����*w�=�07[�����	m�����dv&��zi���=@�����<��@�IV��0F�V����#Do���u.0`!N�=�#G��#%�l�
����;����
%���R_	n���H=�g`�|@�`�V�60�2K��3B�_���w����_���`�\H�EK�|n��nIfs���=�)_2!4�b�$�IU}Gd�.E�`��P���QQHQ7~-*}(Hf�L�{�p���8��{���(=���'d�~����{S��6D�!/��������r�������?W.4�s�A���[p����&�����x��Lg4����5F�h0������v����vMq;����I��AGN�����������b�mDB�KBJ���X��L���wVFG8a\mg�QD4s&��%d�&xP�[A+�1L���������\�����X�����<Y7���OD�i��161�*����f'���j+�=����G���&7�($��[�#ub���>_�f-+R�a�o�{�����c�B���Z����"b�,x�i���s<�"YS���Ht���*����h���d���c���cS�����)���_7d�:Y1��ou"���D�%w�G'�5j`��Y�t�Yg� ���uH��U�������,N]�I�f�.���*�N�Bqgd)�'�Kwj�t&j�T-}�[x�B ���B�.t0:�V�O7�M����`K�W����h�� ���El���1�������&S��=(S����{1v��
�������eM?��O	VUA0��\�����(�R��1�!��=<�2�����pcTS�����2���E�.;p�ehC�X�kkS";���_�b����DN���qraE�l\���\�&/��Do�Sh��d���{���I��[c����E���#�Jl!y��*�E�V��`��4��:#Q���c��+�ku���P�2�������8�'��b~�{7�!��bG�L���$%��P���4�l�&�����"M��c�BLO�WXp�	|q�C�X�����Y�D�9I��B���'��=�o��9�4OtJK���}f�t����VJ��>��r�bK��X������w�E���?KN�� �($F�������(wA�WL����w��z
��;QS��B�%������i�����&l��K��`������{YH��-A%�D�p�h�����\��)�(��>�*�N�(��"�������"9d#�rEO��l���	%�:���������n4���U1-����=�l�7�0���-�HGU�Q��"���C2��|b�����P�7T� �1��'N��[n��Z�X���~cb��{�%�\h?0,�'(�;2�crq��;�
d��wB#{���|BkT�|������=�'�y���L�w�*���;��|���3M%��;0�������owxCA]gr��O$��z�����,
w#O��H���������M����a"x�;�k�s{�o,m���;�gW���	:�7E@�O�����\S�U� ��~���^u��TD�������D��w�W����^c�3�B��wt�do������Y��Q��xOw�'|�������������.������p���(��Xy�Zr?���k��_qK*��+H����l��#s�EkK���8U���;:F�3���:!���H�&\%?�c��)�J��&D���c�l	���y?	���J%��;2��k��F{#x�;��1�{�+C��@����K���g����7�a�sFRb��qB y���nG���?�3B A�9BK�}������L'�g�Y�����x��id)�^#��M��.�]�Q���P��{�7^��;�*��}<��O���s!U��X?�S`�t�����@[tiH\{
��@X�9���]�R�kP�.��d4*������X!z/��)��}������{
3:���&@+��V��f�<�/
��2`����N;]��$z��B��M���4��H9�A��6�W(E����5�L���(!9���P��{
����SO���{��+�D48vXai�B�vv�]�D���Xa[���������>���3�,�9�6���h�7���Lq�����)�n`'ZG^z���/��Vk�����~�30P��4'<�wdV���"�(L�����g�d���a��e��?�����o
u��#�_���p���8�x�l�{`R�[�[���������yI����q���H�u<�d�����O�^��J>��a��U��3AA���SA��Q8|�>taa��2 ���;�)� ��;�hEF5Jyb�N;�%�A�v1���d��T�'�Xv��Fu�JR�e��d���YQ�/ $�[��d�$�h����~����*/!t�PbB�]�2���-6�|J�?�����i���s�zXj?����S�`� �Fp�w��`z�M�W����AZ��1])<ht&!)U��j~c�9�
U%��]>��@w�]8T����8�����u��?~-��b����_�S��(1hyH�h��/E���Y3�ow��L�1MGDs��+�T{�".sg9k �.��fC
�RA��a@$�]�08�l�*�~3�S���j��r��
wa��3>��.�t�5����>��~g������4��4i��N�!�.��~�������`�AKJ�Y���G��
����B��Q��� J��-y���j��X����=��%0��nQ+3��(!�TB�X����j9H�.��l�	�z���Av@�H#�� 0�>7�VT�-�����
��a��Y$����+�������~{�����x����������V������:�@-G����<!
zx��f��$L�:u��	j�C�w��9/��E�.�dI��w0"U��x���v+#u��u� �� ���&w	��`�b�����R����)1�dw���`Al�@���\�<]�~�0����jxv�>r���|��Y���X��"d��J���:;���H%)v�*eY�u�(��������t�]��=�vz	4��'�KH�K��6e@�1,$�w��-Ip�zx����4
���%b��^TV���Oq:h�����TH���){�Ji��h����ZN�����f�R�S3 c���}��k���V\�������R�m��r
�t��O,�Kr)4�S���{\'�d�>��<��V��[��:Sz����/6�Zm�jM(^�	�Z��Q����5!�b�+��f��/��p�n��kL��X�>�-��x���z��j�`!��'���$_T���h[�����ql���bb�Tt-yG�.�P(S�h��P���~���X����������Q���B�����@h��k����
�1r�I�	v��n�_����H��bx���jP@��w,����A^~5N�b'6�@������+��
��w5N �W8���l����+��g�X}Fpr���[]xr��G o$FhW�(��h��)���{�C���r0�YC��ht��j�]%B���:���H�S���x��a��;��L{�jD���k�

��P��Jj��jc�@f?��:S}d7�������1t�~���&����'X{�Y�L�xA+j}�D@ ZgM��!%B=2�GW�?�Q�"rA��p�C���������3t9�)���8b:#�8������z���W{(��}�F
��(�@�0q=���9�0�]#a�3~#�A
Z��c��93�p�xA��J��FP��p'��4[�F� ���l�0x g;���PV�:l��0C�P������Zc�t�y�/v�C�=I�k��!��`l��*�U�����H��'^
$0%n�2��8���hlk0��4�������*��	���Q�>�zG�<-P������4�M�?D��F*����)�_���kT�>4R�^��*G���,��X
5\d��^�M65��F��)������'���QX���2E�Q���s���t�{�.�dz~K�{(&u����[XI�@:qe�����J���rC��]��nR�Yxx?)�t��#Kx����s��0;z���9�����[uRe����
+�0������2$������Rh����U�T -I��=����Bo����?A��2ZD�C)G��bD^����H*WJSk�IB'���is�-@�f`@aD��������
��%������"g}��E�G�"G�o*�o%3�n?���@�t�5�z)���m.���{�)�����Bt���H��x���\B��0���?������o�@�H�xz-��o�U��
Q`[����H3l��14W6�k4��m"���u�nQ(��@ZA$�H�:�+�n_�sK�
�f$���Z�����Fl'G�
�[��w��,b7o	�#���L��?���;����8�0�
�0(���@�[�����f?�7���k�����2d����F��$��w�}oA���E@p��(�d7w�Y��%���v�t;����WNN��{f�~
���,%�^��`/�1A�sSbWs�_}el���_�q�E&�
�-b����jON$�i�xF-��<g��k�nfk���L���� �]�t)t��.`������d(p�}���P��O�6;���Q�-���x/�M���}���:DMl3L�E�|��x��7�������u0�
>�g�C��%�{��){���[������/f�d����8Y=3�c$:�
;H��Z��
{q:�����#�syG�����M/�����/���*������z��LY��������ull}u��oi�����'��cY(�Vv���*�<�h�����<H��v��Kv�K7�\M����x-;����n��W/0h�	�'���To
tcKG_�m%�Eo(������������N���Ze�.�?�����1�22|���'�T^B���	����$rN�.�����%��/���'2`|ldz�l��|y.�O��
z"��3@�@�=���;��p���������Yd��C���a����v^��	�����,*����^}�9�m�f�6Y�{��rE����|G��=��w�0��/���z�}�)������]yy�����Y^����k��^h���Q�0vJ��Y���H��kN�5�y�����;H�v *��5���8�NB���)n��!0z�:��r�d�p=|0uw����(�*��uv��$�$BM_z��)I��9�&�<����v�IX��)�z���Z/�5�����};����N�|����������
��m�
-K�M�P��-������Nr
(������V2�@������e[8���.�HvV�R�����
�f�[�jQ�vbI��U
A��Q!�#�Gf���[�1�zZ�w��9����<=>AJ���'J��n��hzD����F'�n�y�5�.�E#�X72�e�2��x�=�A�f�1K��~>���>�@�l�_�����{�n4�d�j��������������x�����0�FO>�����^��HCCHC��N33?�������b�a�M�!i�	z����83}��{�>K��qsiW����!F��A�'����6��'!1�I��k�F	}���k!\��Bvc
K�uiP���(�JX�~��0�N@����{�$*�|4��M���PRL7���MZ����=@�Im�m�[�-t�4��z����{��]����U|u��8���*���f��h��y��%��G�E_����:�����N/�H�0F�o�Ks7�`E����
;hOp�����s3�����_�m���8$��}���io8Bj��XbG?)��1��z������0�S��%{�%�]�#�5P��o�V��FP:�{��#�Fn#����Cf2=��:
��#����3"*�ZH>�c���Hd�<�GLT(���1�x+vA�>T��@�a4bS�g<����clU� '�����_s���2!"��uhyQ ��(qN;IFeQm��3��#��B����C�00Q,	OFhAp�(�T�k����1������3�C�i����,�6��S]��	�J�)��A�|=�@N�C�(D����Ogb�a(B��� �
1"�1	������Y��EwD�%��7��tn��L�F����ze�}�ih��14�?@�N�(f/�=�{��8|1-^���Z�YFTlo��(�xOx|����N��P0)'~LP[L����l��&Z$�4���t]����_P��T�B�a�����9�N����ie���>��8�<�P���G�	t.YU���������OEOg����6Qe
������,����;�����eb��|���`eA���t�`i�#��N!pd��b��eP���>@�
��F��n#�h�6� �Z���%���8	�����?�hBE��0����|����Gl@�9�L��nV
Q@}r	�6y��_�!�0����(���F�x���PSo�2���G��I����(�%�Sf5�o��n-���X9�"���+��c����`+`��������\bT6%��DhmE��0X ����vn1bP��m��9(-��Gp���S�o���f"��|m��	�h%���Z]#F�����[���3MV��HPcv|���v����'��Z�@�����j;� :���������4��Q-��+�B��N�~�0��Z��TS't��v����$��\����&h�)H=�3��g�@����4��;No�VGF�'�d�N��9�d����e�LV����~�S�����L$��������#����E����':�����4���3I�����D��X	3����?9�f��%!�\������o���P*)��utF���@"����,1E����Q+��0&S�Q2��K�$|	�3^Cb+!��X��g�D25�l�B����C`?���e�q{��L��DOn�_u:�����:�lI�f���=kT�b��s/�<�`Fh�=a7P�%1�f��R����)��Bt2nO��!�����p�0������D��8�����Bk���������Q��4� �[��)�����UQF�4� ^�=w�*��J-L���$H�O���V��['OW��*3vEV1�t)���[2�A����;��g��}��u��h#s��*&���/Ed��c�}�x��=a-���quh��IK�-c
R����������B��i\A�*���S���T{Md5	���u-y4�[�3B���,����Z��%e���o3���uK�c�f�Y�ntP�ci��i���l.d8ldpb����tnP@����u�qf��nF#r��"�foX]�'�S��!~��v=28���O�c��A8;�5g\��������?�T��nc2�����b��e�������@�������\��<�������\hM"�z���dk������1���g����M@�7�U������!���j�R���1��V�h�t)
OX&�3s�i��E+B-gD&�*tN���7��h�h`,!�c&$�d����)1�Rhb�����r/!�^5j��&q�Ntrg.|���a}m�n�9��^��y���i���9��h114Q�lh�������#:���4
J���/S������2 9�4!��M���8��|��[�x�:��7��xB�;V��:�����8E�A�M���M�:W�[�X}���>�J++h�Z�1d��Lk�m�������p�\,J]YO����=��i����1Ut
s�������4+��}�7c������������
���X��c:���9�����h��@������O���f0`q�����Q9�d��:�@����i����|[�U��D���4!�e,�u~9�b��|�O��1�A�<���d��-�a35��]�~��,-#5���'������jb�-I=%i�-
��L����{t\�-����n�?���!�r��$`k�����D��sV|���J�[+�	�c���q�����q���@����C+���`��PGe�cIf'l111cb����[-��PSk�M��=��m$8��c�H���k�@��+`��,�����	��
i��D)�6�V��K+K

�j�i
Iy��c�/�8V��������Hd�����x��(��Z�z7^��d�����(E��J�3���,{�F)ub^�'4qD�e���f_
i��-$�D+����m�C��6"�����'��%��Y��+�������@V��S�7��"��H���
QOk�Da�0�X�kt��IV�)���	w��>(7Q�b��{�������%���n���/�A�\q%(�b�/�c���lB��>}�2od���E��R�k��d���DC��e B�/�%,�{��A��~�l�e4B��wu4��/�>&��V�jQp>���6E���QW�6���m'�AG 60���H�~}"��ckP���3��2���O��&��T��@�����HyV)+lEc��d�MG[�E�0���h*��5�Kw��B��UZI}`/;9�C�+9�.�K���m'�rW�Y(a�Af���O�Da�+a����+���[�#[�u"mEo=��8i�\���o'"��@:���y �m�A��2D0B��� 3�"y�;Y�h?�O���e��V��41��`�#������������9�4�vR��ae�@������V���(��8��������~�k�����w���DP1������N����� �B�_u��!T
+`�)��]r��e����P�����z��I@'���b�1��(D����4�Pfx��-G��]�o���m&S�K��[B��g�/�%*+�q��P��$i~���Tx��p��l�P�@y��f��5��l���W>�dG��4�����w�H��{r����%�><������2����"���{������-�����
� ��ET����Z���la1���{�g����G4��h	\�lOF���%"�����i�`RX�4��Q��2�����w����J���������	#o��?���:�U���wG�tt����������,m���X����V��^.�u�B�����&{�EU��P;�=�]A��
K���
���
!�8��	Z��Y��S���j�AL�]/Fj�z�{D��4s����i��z���Y�7h?k�t5nq��(���������� QU�D?�K������(n���A��������[�0C���E�=i�����'���� n��4�K�&Z�|��?��_~D������siv�#�
�8VI��7��j���oC�D��.����u|�#i���6#��D2���"/��dI�'����{+��k��S���*N�|7�W�>���#d��-��>�8B=���}��'B��u��Md��w��3bRy��x��u{���N��-<��>��u[� �2�;J�*)8���0"��R;=�����*D%��&���=�H)P��v�����B�/7 �z>�T����O��i���G��H5��T���H��l�J��=I+�Q'2ia�p�<Q�KD�sKm9'�O�AQ�$��������3w��:��������Dd|���'��2�[%��Z?F2DR��a�m�d���=*<���/4��@��t�P�L^���N�s�@e�1p���'2	�eD�D��	R��nD�8��B
p�N�o��P�������.���
������������'����0�[�o�e:�c��i�O�q���x�.��F�d'����/�p#��	���]�������l��������`L��j��PQtq���N��sb�$�5���}`?6%��V��d0�n���/��cZ�Zm��}��8�
���J��
��A��u��t�^�fs!
������H�mz����4Pm����@�x�����lf����
	}�	��c,����Ho-����v���U�N����:�O$�G�	?�$�A��JlV`C���{|2���?�4�^������-.9��O,�'����H�~B���/�a��B�H��;Iur��'
�G��c(@�1�}�3,�SQj]�����L�!	vf�-�[Tr�*1�c�"�|���	�P�S-�ixw���*'X�b:Q�1  �J[c<r~@�0 �&}��B�@����g����{��{�ew�M�;m� ��k�w��L��kt�;+,�?�n�|������G�Or���~��g��?��;<$��<�i"9�I���]��9��;A�������N�������neU�y-�:;��H�;%�(d�$Eg�S��9����!(��@��10�������!s�9�	4������B	M'����-�e���g�$9z�'Kc��PQ���.=q4k�Z�I����c�����w(�m'��yhf��n�����O�D���M4(�]daE�G�p�p���'%�Yr�z/a@�c�p�48�	�3�=���)R4���w�6����f�;<4�'�-�|��<�����������!��;�<^t�n�+mZX�j~���Fq�p�~p��nK�}R4�����U�i��*��{�t�� #��hT.�����{��7������&��/���g���|���#����5�4�Y��Ec1����������]U�-� �M�KBvw������>�{�B&�����P@f?AdQ:�y"W�I��n���'=��:^����;���[�������&D���w�1uq�������tK)�:���e��	i�v�^'S��?�O�54g����iz�f$��\�I<��~�`��(��t����/�� ~r�P�����{
OK�$x{��G��{��$��XTq�
�dB��F��{hK|w������1�#=
�0�U�[�4�1sB&�;������$�{����X�
�G���B�/���p������!���=�x���������x��R��������k�O��7j��E�xdED�h�n�C�����S�`(��.C�����L�����RJ��������E� �w���������^����N����%��|
�$A���������,~�_��VM��
<����x+r�[�+S�����>��`�v��
V,m��&�J��D�A�;�����w�>�@E��{0�w���� 3�5�|G��S�Y;������^��,����
�p�����t��=�F���l�P������y ��-U54G
9,�~g�&�� +��B���'`�m����!'���p#v�C��1���t������r��=�^�T	�5"{�de
!����������0h�xN����T6~HC�^(�{��-WP�
���#]��=�(1t���!�\�2�8�KZ�x���`	�*�!n�!S~���KO11��w
o�w����A}g	am��aL�hB���d�h�+�Y"��SF�N�V�A�+�{_�3���pO�������&��S�L��#��U6�F�O,�cSg���s��K�L-��
m1%��%��/5��wN	B!)��K���FZ�p_���M��:m!��D�P�����P�+w�3���M�������,P�Q�W�'JH4�$�Z��;c;�}cZ��]�j�0T���d^-_��Yf�{	��r$�:.��1��J�Fz��m����z����x�1E����O��,
!���CJW�����I����Tt��
�b�BYQ�x��K@
����+hx�[�f$�c��q
t^.�$T��rx��z101������I]A�e1� �D=�b�AN
D�rJ������������^sLE�s���GHB�H
ve�����a�&Q�
B���5��	�j��Rw�S�v���>��iPQ�2�n"���?��C�aI|��=�kA��S?���NA��;��_c{�K��@vN1� +'��(#"����cF
{V1#���� �NX���)��V�
�Z�-�����,�R5�7Vv5P��{����%FZ�
�hY@��wP����E%�95(�H�"�{}C�,u�J��L
���?����	�#���o��/����%���H)�u@�����R�F���$%ZV�E�p"���'k�lEKLB��Q�:K��!���O��������"u�kX���OA�E�6Q�����D� =�2]YC02���D����}�KG��
bb��i�N���[x��a�We�%�^EO%,�S*��������+�������_��Q[��5����Z%:����SkP>�����M=�[��[g������d�>�q�P��L��l����b@�:,���,�5��"C{�+9�0h�>q�>]�H�Ad�*����J&~5���&A��8��<��Y�5%RAVG�>�-�����OZ O��tB<�J��Q��Y���jXA:��_��9�(�ae����D���Qv�j@����F� a����L�j���h-���*ST�j������E�@
z����@j�B�F
�6�UZ����� h-zN��0P��A��.��I��j�xF�����#��@(a��X����b��g	R���?_}�+�L��m��c�B�PfJ��IeP�����B���8��G�DA�����]����#{�M%�v��q�W�� ����`�=Z��c	����I%��O�������gHA����T�	:8m�n�(�����0:�>�~j���-mm�!m�����b,�M6��[���e�j�a!�~5�p�_r����7�>Q4�{�P�D@�����\2P������/������*����"�� o��$����Kl���d;�)�;%U!EE5R M�:�J[Z��S
�d�S��u��9�w�k��i�"iz�Q{V3���0k��r,`��24z�HT?1�T%R�7	����eM��n�7n�`�����Ow9��{E�2hy�<�J\�d�?u�dE�1�,�5�X�T�u��!�6J:u��xU,���2s�95�Hj*t�������9P�:�C$���%���]�&��$V:����`����n"�w5��R������#O*�n!��&�YRsq��r���X�*�����'R����u���&�S��Tc����.�5�V�����Q"���d4����1�����s4}#�`�j�A���MH���F-�+"e��I�����	oZV��vH���%zm$�d�V5�PL+�9	!f[=�/�A��$	�<�
Gu:}�m��\Lv�S*��u��W��l��4���Z�!.��B����9Y���P3���^3��P���0(�j�P);�h��R����gP$����`h�s��B��O3��<��A?��;��!1%�XZ����w0���*]�������;z4CJ�.HjD�4�E���g������g}*��PC+Y���5� {A�#,���<�����hTK�3{.'�16TW
�S�lh3o�O�g#�U7�n���y)%��F����0T���>�g�������eI�����JA�U���X�oC�Jkq�D-nI�����������&���-����S<��q�e����Z���K3����"���/�������e�"7"V��N�-��������kF6�Z5�	%i������h
��vC�j�/��v�6'�?�v�V�
&�9��6VP��[P�bO��D�����AE[�3WA]�fX�����N*Ln������4p�� �KBS�oi_������*B�����U��8��,s=.?����%���D�A	f���B,��J�0e���&���_{�4��e��%�i�$��}�@�m�3^]5K������Vr��'�v�r�
L&��g��XBT?7c:�0�f��9Z���a *��}����ke��f8e�f�����U�j�BhIj�{FM���8�x��FdE��DN!������i�k�e�������e�a	iQG����{��#*"{bE`�:`���z�ME�����![����	4#�r��:�-*�]���'l�I#�F�_������Q��b�DdE-����jrjD��gh������Q���K62o�!�3�GK��x�B �������iL;���
�4�������f?�e�RU$Jt��'�{3�e�?��;��<9�������E� /���X�,��(9{��;��J5S�R����'B|:f>f��R_hH���L�*:�q	�^� n�BsP?��Y��2��O���gz�i�D����%��j4�E���	��������.�nw�'x9�T[��G�D��n��K����n�a:D��>8���AH�q�?��H��f�Q	�wz�r����h��oZ���)'����(�
���+�M�X� ��OO����^G4����c*��<���/�w�<���,�X��N�Ix@����gI Z�[k�wI�}�}�Cr�d�8g�[
�KIA����kD�%����J���id��[�u;�UPG���D�4o�Q��n�B�B[U�-���kyua����2g�B��*��s|O���ut��-j�{��3��nQzS��R��(~�u�z��U���]Q����`�~�B�o��		��a5f���n�"�?OZ�(���w[��z2F�RV|+�w�������'B�{�^Yz��kb��E��/��}I�a����6�/Xz'�G�'�-P.Xy�����'T��]�������GD�%q�L`��-�JX����>Xn�N$�Rs�6i����N����l�5����N_Q?����p���D(8��'p��{,�G�d%�V��T1Z�=K�����r��L��k7����'����R�ucR�oV������&��:k��Y��C+6j�d;�s����(���� P��i���y�C/w�YB(m�	�M8��~Z��7�)'�AA��Kw���0>!��P�kN��I��;i��������lL�d���#���Rn�hB2���B�xwHz���VeVv}�bkT��,�ndB��\$�^7Ym�Cb���l�1�"��)��H�M��C��~>�
�P�|�I�&S�Y��������2�b5�
�)I��hm��?l�m!	���2�d�Cc����������`O���&���R��f<��f�����a���M��s��2&d������4���!�+c��!�pa�j�g�p*C�ZB��6�k;���G&|+(j,��3:�{5�/w��dq.�?q���F!=�B��`��$	����l>�<(�T����L�?b��03m_h �O��v�&t���D&j�@b�a�a�e|D��*�5���yfK����a��S�����p���xtn*��o���[���j������I,\�[�/?Y����F�G��)f�0�v$~R�RQ
C�5e���#�Lrb��nL����a_59���G� J}��$�W�d�`Y+�h(�A�0��V��j��{2an���d�*��%`:����s�|t�F'&[��E(tA����a"����+Q���ThS���8S�R
4��qu�����Cl��@�������u��NE���� <�m���H���k��gxB.������l�GF�?�����D$��C:�90vD)R���0P�/�����YSP������72���;������?#!�c�������BM^���%��!Dc����z	�����JF�i��!�g������(�m������!�
�}���}Q[�Ak4Yy� ~�]<f�G&i��!E8H��x=X�~Nw
'C���@c~����r����c�YB-4_>z�1n�V�!1fU��������Gw����y�J%�#1�j��|�	��[5�S�F;l�W���������dG6������RS�5�n�WL��F)���a	�	�E|���iU:��[0N��cojN��T���F��������������mL*��i�(��-9��@�/q�O8v�Q+Ic��<�p�����,�V[�~v�H�4��Nb�D"���hD�bo!~N�h�"Y���@
�������[�L3�`H$"oL��T7fb���\[�X5&oJ�(lmI��P�[Mu��G:#�@B���������b�P��~l��i���F�@��4��(=��}VNd�>�����QH��V��x���l��3�N��>LVQ�6�D���F�O"�::�NcJ�U���!z|-:���A�����4T!0�&���ur#�D')-��x�s�e���$��Ow�6l`hf���VTu�w>�v�8�����,T���1��6v/.�<�����e���a��l�
#��4v�X�3�q�W�9)t7O�3'���[z�qc)��zfB"��b��J�@B4��t���<1@y&�V�As3xDQ��\6�^5��O���X����-p��;�������g&&�\�6[&�r<n��h�PA3�N��Fdu"��0@6�c�T>`���3��qr����S���Q�W%4.���5��3�L<��3$����}L5{��:��p������{���i���M�~nGMSe�!o�i��*O#r.?�1�$Qs�Ol%�A
�5�\0.���F,u(�`&c��_�E,����LTk��p��pM����W�3F����z��$��s�@@���%d^����3�}8��|(��B�����]����U������T5�I��
�s3w���V�Q��w�u4�����m��)��i8b�]%���WD�l�k7��|�t,;}P�N�1��������EJ��?����l�OD��Y�+���	��#�?f|��B����\5�Dkb){s��%N�7w�k��Ur t�?����d�B8��a5��f�/�P�B�����h����	c��1��:���Xc���t=��TV�E��dYCO�����RF�;I���0z�[6�f�����z>w<�s�l��p�y�W�a��(�oH���1�@�v+�
_Q@��o=�~��Am|F�Z��s_XX�z��JP5a�������K!���}K��\������$r��22���HR:_O�TM�	���x��9�|�������@U�2� y�J����;H52_%KZM�4�XF$q��~���
e����,�;���J,H$�]�DX����,gZ��@��l��P��^��~��C�e�)?i���y	�W�Z�.�Q=�j<���p��'d&0+i��KB�N+i������{�C���x��-������'#�"t�G#-:)H��J\��%�q�����������l����2�p�J�3�\APd��������)X�a��di[��Z�3������2��Q��� �rE�����.C���P�GH��z, ����_������)�� nJ����7���^�J�,��j}�J�+���EL�(�������p����@AMX������-�D
�e����&��i��A�<���	+����P�i���D�T�{t�:�����e�@)	�4�PC/6��wBJL�<W9����bD����	1����H����4V�@b��[�QR��]f��Yt�P���Q�CM���t�����!�ix�����v��v��a�R��eo���OP�f
��(���Y� nE� b�-=�������%�ZN��gX�P%����������0�2��c��?�A�+zw���)��
)�0�N�_��,C
�HJ�|,�~Z`���t����$�ZA�i����������V,%bc������a�AYz�J��Z����N=?�GA�@
���c�#��{�PK���X+����V��m�#�����D�RDa�M�09����dm�Y%d�����VP�J�k�X~�1����9��}l���8�+��a��@(�D@5��;�0eu9���#
�t�K�>dG��$'/���0��(jq������$��|>�w���i vb ���9��	��Wx�ov��YaX�6�,$f
��
�6�C&t�����a���A�d���� ���>�wf#n�S�IP'���dN���	cR�v���^2��C�dz�]��S/���h�w���.+����
6 G�A�R������&��;]��e��
ZC��������8�m��n���8�
X�#_�4�i}�Y_/���F
5b�_���te*D���"��G����(�?1[B4�m�A�kbq���rX�N[�5<mP�;v��Hw�eO�N;���I��@������K���]*�;J�YQv�X��|(e����=��ul#�~�Q=�o�%%m����]�<h�)�j��5l��
��mg��kx��,�myQ9�X[
����,��.E��o�/���#���Cd'��^��z�q
u�HPg� ��b���������b����v��c`�XyO�R�mDf�#gW���`���
����|?���Y{���~�aY-H[z&�/m#�^/�����uD���Z���f�z�F%��v�����O`NR;�����Ai1w�a���s��-
.��3XY�2Zl<�"���������u����o���M��VV�[Q��h�����b���o��#�������V
ry�2������}G��;h� VT�PY�&��+�C�������g;��B����f���4�+!���`L�m����$Nht�}�E9��IT��^R7Vl#���������)����a��j���I��k#7�}�ul{����?z��1�2j����MU}��������>
Z�=�'m�A�kxR:������l�d�\�g|�s��#�)aK��I5�i*�s#��c�9��D���(����{wL�V�~�g�T�hih{: �8�����p�Tz5&�?��I�r�Z�s���I6�p����Z����<�o���xF������n�����{5����xb�[�9���O2�����q�`�����.G*EU���C���cB/� �����;}�	��HM�C\'FL���?Q�*����aD�������}v'O��U0��I85�#�a���'����j���>5�������i�}�5r�;�}�W�F�F���aI�����P�2�=$���1AN42��Y5�O�"��=���d�J�� f�i��joi�#@�fs���2�E��c@B���?p��1����P7#)��:����0Qny?�v��,�b����$s�f�	� 3)��OxL�-r={�����7�g07���>�lW2,}�Z?=���^���1���X�
q�O i�DB��%'�k�E�mm:����h����Q���[����jI�K��;qYbwi����-'v�V��\�{�����N�!rF��7H�#��a�h|�_$o:F)��1+^@2�g����B��l��
�^��c��'p:�C]�:�d�222��8��Mtb'f��h���T�����{���Gk"M�RlV�����l%�d�\������=,R�K�������4�������-F)�c��]?��3`QQ���L�7&�n�
NH!��������( ��3�@Q�Wf��X��'2���xv�����t�������9�%GAO��|��������s��a��^6�n������G<	���YG�Z�p���pQS
}�'`)hHB��i`����EU\s18�$N
&Q/zx�&���d�3��14!8_&y:N�t������� �rlq2T����RV�:�28-l��{�R���g`
p�}�o��@���j�u\�����3����6Q�w���z'���U���^#9Y�������*M�3�����f���rM�D_�+ts�{�� ��w7�`s/�����;�5����2_�{�$�������	�w���r��;�p�dT*�����W���v�C��+�isi��I���<�Jj��������W&�:;3�{!0�p��3�h��5�S ��w�+1�c�?�6���%|�]��Kxl"H��qN���B���g��M��?Sx���6�c"��{v�P�ft������>��
w�7
6��o�:���S�R*z�_��NiJ�������Y��FX�����NRT��=���
���S�s>lV���!�w\�|&�\���8�k��3h�!TV[F�����5�X=6P����$Q~=��z��������P�~�n�T~n�D��0@W�����m���F��g�$�r_����G���C�>�����"�Op�x��vp��	L7� ������4�;a�p�[��,�����5[=���{
�D�EvDM#�����6K}��������K�a=b��N�$Q�J���:���Owy��j@�����:�.�p��;��D������w���p�;�v�������*F@;��c�:s�Fz���D����G��:��XAR�f%ra6����bF:���.E�	�e���q��JO�Cw��1,AZ�5��^�%�iz�;����9��������
q��dLaZ�p[�������,�(0��#�sx~��E����������0���w���2%�|�:i�I��>kh�=���TN��wA�#�`����)��/;} ����H*�j)��F8r_���I�u���G�T��35�{�'�#a:���K���3�fk@�p���[b�s*��5���`WE�<��b`a���<N$���9F&UyKC�K	�`�%�^�&W�0�W�	Y�����w�G�E�| E�qy��AqLzZ�k^�.�����EJ4�@���Jgc��y����A_�L��D�w��� �;����V��J���SG�R8���1��� '?4�K������pB=�v���:����Fj��o9X���F\���n��
/��������������J%���[��5������/��k��iN�Cv��dw�MS��T�TIbo4�{!���qF}���R%��uo�b�j����e�����;�e�D��N(=��m����b A���}�-2�����]+1�wK?���O�v�����j��|*qVK�R[�K���1�k�SJ	���	t���p���=�ni[��5��wP�;���P���[	�X��s*l��[��'���)���#���K\��d0a���-%y��B%_��U��O*�y@o������|����`�x���p�u��*�!��|%��a�%���@�6��@K�������Y�������1�1L�]�/-��Q�����x]~����������C�>	C��Rf0�PR�9�FV��!P=�2�f�=.��vn"�$Z�u�@���hQ�~	���0���^��9����o����^B�{��;���a[���_��������f��K�E��D�g�L���q������3�r�R���M_��%b%������0��AX�����O+����$S����Q��-��{��p-�����~c�''�E�=Uo���=M��'�>6�����@3�Q#�������`V8l53<`g��)��*�Qp�!��oo~$���]�;�Q �@pA?�{����~��1��%Y�Y�k�_�������8&�'�z}������A�ZV�C���F�C�����J���.k}bFx��g)~b�~IMhC�,n���y!5p��Fj�oJ���uj ��?�4�	u��Ih�+�xj	
Nf��	��pS~��+q3���4#������s~"�{��)��&���<�� �U���� 7���v��������5��E�dP@�1RaF�-
jl��R]#n8�=��Ur�����3I����W��+,�����I�����<��k���C��?y���wx��r�{m�:�$�R�#8��!+-��&�A�F"%AU�
��5R���
�SkY�EA,���h�*�#|5�Pc�{X��b�{�
$������N77\@	���1����rfV'Z�%���%i�7_e���Q2�k���6��P+�Ey�!����k�������o)�=*jM�k��,^Va��}	=T`���#)����WcS����e8�I]L���%N�kr/d"��� ��or	����*_GQ�Grz�W����)���
��j��~������/u��HoO��$y���VX9��RI��S�d7�rP�� f�����|��\2���w�+�"V�g�f{L����"�G����J��(5`������h�eT��w������P�[��_�U-;wW������.{B>y8^����v,C���n���q\
]�S��I0k��P4��,f�@�v�eW�)����n]�����9��P�0���^�K�h+�p��#}��/��bK�W��I������F()�1J�o��(s3���F(�*S�q��B"����>�dL�.�a
s��[I�w����������(6��&�I|���-�����d��h	���+��S��%�l���;����q�u��Ih�<1��*|���B�,����]iG�uHZ������s�a�hV�&�`����������hF'����������5m`cw�� kquC[g�o��+uFDM�fpB�"�T�� ��O#�����>�N�n]:l�K��uqvS��(�����Q��1�Y�%IZm�NN��=��x.���h������i%����'�fZ��I ��NG��H�����I��V��u�����@�/���g��+�I��f��D��A9��E*����2��~n�Y~���H�F��V#�g�d��
���6�V�^�eL���W�L����k��������Pr1��#]����HC���2�eWi�{6�<��@"��H��n��T>�R"�R3����z~����/eFu��s`�K�.����FhD���{����lz��h'��������D�����zh���j���7%E��E�k�R�����c�/�:m��V[B4Q,��,H
����p�2��bQ������^HsK�
R����h9��r��)-�l�
�0�KX�P�������.e�}j$u����> �����@�H��Hj?qGf��yi<@�T-9c��{	����7v��IXKL���� ���U��	J"����I�-I�	�����-��|���'��H��G���f�Db�!-,<�F !M���rg,��FfXS��p�H-���������3	�J!{dPu�8V�g���VA�b������&gr�����Ud`�Kj�c�#���`o����}c�(�e�1���u����|3R��~�$�^�K'���z��j!�66�Kk�n���o��!�9Y�����|�}Rz[K��p����h�a��_��
�@`c3!���l�����`�.B�F;D�Me�-NK��t���L[�u��.��dLBI��,����H~�$B �2��10�p����B��m�~>^��5�j�/�P�fal���U)@�;���H�����C�L���%��$��[�|����({n�(.�qog�d�����K�b���&���#�|�����P��'�Zf`���8��/�e FI����4���{��[�(:�������?!��P�'c�J~Ia����K2C���sw"Y�B �7]�D���q������t���K��E��
��i�������n��b7�	v�R���&�Ye�Q���������PET�����=x�n����JyRQm����o�A�u�/�V���%���u{��W�qv�me=�	����K?� ���8,����b��DC���~�����FdOT��'{Z����h�`��D��/�������-*���F4����a|v����!
f��Nbo�k����TFE]o�t,�1w�/R���E�=��������
Z�l�!TB7�#������UGi����t�.Zy�i(�rY���V�q�v�.����{w�D0[b;Q
Y����X�{�7���0�W4���P[�t��c�q~_-:��$�&� �@���Sr(ffG}��YX���`����:��RFi��"�P^��!~�R�FB�Si�>���� ���N�A4}��S�-"����������x�R
�Y�k�C�"d6��{�`4�� F2z�	�(�H\�
��JM%��A�@�n�CS��+��U��@D���D�=ew���X-�Cj��4���P��������E�Aq�A8���z�=Pl�6�!3���.t������!}\7z�����dRgq�wx��k�����.��s7�Q���P���%������Z(��6r�Xmd�Bb-9!l[
��i����j�K����jI:��v��Y�j��N��|5��3��d2�����P����(V�X�,q�
TLi���S��
Yao�B�:,Y� �E7n�x������H$�b �{��SY4�����y4�Ew����X�I���#{<���}pJ��[q�����-wa���2l!_���S2�{��8r�!#���#�%Yx�1�K4D�"X�p�P*�#�tM�;KO��'N?A�#O�`����-�%���+�F��/��"nv����(J��M"���1F�(m�����{��_����a�B��}���4B}���]�<h�v�3��`DMQm()�&S��%������3�^(;����Z�C2����F/���j�Q#���3����`=��^����>�l]�L}���/*���X?�V�0h!�z��w�?&23#F(��N����=S����x�O�=X�t|`E�$���@��X��Q����v�Jh����l�%������'9w%d�F�PEA��h��}�-���v!=���H�<a}��'*�9
WH=�����+	F�(U��:���6C��f?4>?��L����F�H��C y���$���x@&��A���Q� "�H��T���DBFGZ�a�Bl��y)y�=�i*����������=���n�����J��,��Le����di�Y�����}~�XN�5��@�v���ei"l#.�q"��U��^�7�5�n��������8�D	hqO.j�������0���0ha��N�vf��������l����V�I>��(�P[h�P��@:����`���X�4�"��@a,��#�^��7#�D�l��N�M��F�a�B\r~L�l����k�56�V�+��w������U�:mQ�k�X5�rrX�|��M�`E���J�zJ�:	���82V�hK��&+�\�>uNs���:d������B���.�J�����0�%|4�2����������[�\�4v����c���P%W9����q����2�����x����V�������B���3�������hCE��++��C������hKg������/�@�Z���#�)D]���7�i���?�-z�Vz����[j�QE�1>;y�"�Ok2}���y�O���q���d��f��������;�V�k�;]��U���X���i<D��q~�'RYs�:k&)��-:�6����F���{7*���)3�RRd)Lj�R�C�
m���)`����>���%s�}QR���	�P�M�-�UED�i Drv���>P�n��o����;�"��i�c!��Y����>�7����E>���������J\���W��]�ho���!�y�~am)@��8��VCp�TF{�>aH�{x	Vy�c���=�nG#M������Z�Ax�8��
�Q���!���#!{w������vp3a�r/G�i�C ��(fo6
t��
J�]a�r����=K��e�N���=R� ��4�������@k�4?��0
G��m�=�z�T�G�|V����3��w����`�����h�o��,�V��k�H����)fP���r�OLi�a������n�X���B�:3������OU-;4n�N��#�������.���� ��4(��A��t�.���4&���S�dn���QR(TJ!&�8d���#�R�4c#������|��p�J�����fkO#,�y�p;��jB����=v3���+r#�_t6z��$��,��F�0�S:#�!b���b<+����!������e�Y�s3��R����������2��}O�d�������`�9x
��	E�������1��iDA�u�}�:����y}w%D�q�%n�)�og?%�04fg������T�����cy\�1$#�]*u�',�#���_��R��
3[s�7�X����
�����Jzv�=�����2�
"y������]K�)���������V/&����n}H<�#l�0���q�G*$WM��8lkN2WVT��yE��������2��>)�-����1K��\[OLRfPa�b�"|v�"f��[$
RDJ�ex�%�.C	��u��eP��
���%������D�<]����(#.����J���j2��
�@���m����F[���pB�����6M�BS����6�^	�����D��VM���?M��%�)X���)���j�J4���)����#3���
��Y�:[����������u5�`�9������V+�������|F���N!Z��W�`���$h�+`��0��\I�]@�+Y�����6���,C��2��-6����/U%�3�r��l.7��8����02jBs1"DaZ��;�D�R9Z������V�>xV����^Q7�YR�:����~��^��E�Jo#�Z�L���O�����H�8aB
XGd%P��a-c�
Vt
l�gt���&��]�C���@=�ed@��:b���a�]�h��5��!f���oowf�E�b,�P�a$���f�1*����b�4I���D�h��J�0��fh%����t�;���o��`��!���2B�9��=�y4�i^�9U2��Z���D?>:��Bxv���~>�mc�`#�m��_�k�H����@�tU����lAJ���Y�G7a��J�y�{�
t ;��i�2t G�#���� �#V����\��Jh�I4�Ds�V�H���"FWt�:��#��q�������5sX����cT�j��t��@��"�x-i��er��[��' �/��w,W�������9�t�J/V�%�z�`�
Y~�����
&�b�'�1�������lFZ

,���
���x�`��"�0_CqN ���]�v��CH����D��Q�?1���w���c�^;r���O� '	��MF��ma "�~B/��
*vvb"���c���/������p��'��:�JN��{�4�CKP�R��4�&=ncE�i�Q��K,[H��<
jG���I��9P��KTR���T$�@T�m�@��4��a4l�c�4�HP�H@4��|=�����$�O����3ioG�6� d�A�Hv����r�0�H�A�BE���%�?�'g���dO��J�o�J]������'����T
���H���V����	��e�l������5� �B��j���q�|�� k5�����6!�[!�jfwD���#��V��/=��N�:qB�T)������*���s�n�%���jP��"�4:�=4�V�jU����ES(�L	Ru����Y)d����NX6zLF)�-��������>~���xah��Y��~o�w�����I�������-���[o����F��=B��;��>��G]�v���J��u7,3i���>m#�&���o�Y0�g�`�1
m�1]-��LE�)������"k���?�C�B�O�qY�H�W��>=�`V������Rv!t�G=�����@��u����z�M��1��urO���KG�&{f�t��<Q����j-U�-7P�b�B�%,���
W�;@��1W����/P=��+���S���*��d&4n}���lI�(�E����3;������*���E���m����������9��,vc�`������8e{r�"��FXZ�l�:j���%��i�,}1F.��V12+h�`c���R� �=;U��w-���q����&��=6�E������BARk�N�������7H�5;q��E*=),��{Sq�N69��#`�nWv ��}~�f�(���>�,],K�%���S�	9��$z��NJ-������|,K���O@��1q���{`^'a�J�ir�g����|����:?O'��xTw�U�|Ph��:�*4�Kd�z��mgBr��C�S�����0�P�NO����ZwJ�V��<�p��csD �z6d�8%�����p��)�#��
���H�{J���"u�,��8��e�����/��:v�A��P�5�O�h�Z����p3�����X���#������b���hkd/�SN�T�hN��h���S#��U�]qtW<��c�A��b�s
h���'IJ���8��D@O����9
3��1�L�rOL�f7���I�5����jG��8��QsO2"&>c
r�T:���Hs�qDZ��	T��`
"��0�
D�H�M@����,r�7����WU�
���;T�����7h�����x��bW��a��p�����$���\�X���0BK�z��y}:��������Nb�W�����sh�6��d]����U�����x)b�2
@tm�la�BfT�b��au�O,���#����r1z�L�����o%ml����;��(#�mS�;;��H	1O��ot�8��HB�8���!��
9�@dDg9U�}���V=����#D��f���E�J�����>�i.�Y�f�:+bT�����7�������<	J,��oQ����w�Y'�,,VR7��cR`����B�1z����yd!1�Y�
���tdw��OL���@	�moT4�P�?���O�XQ<��oh`t^w��
���q�Z�P�M��.<��������Q��Y�����R�y�K���}\�D�GS��&c�*BS�:��`.�Vqz�@��-��/X������F�xdt��f��D�q�
���9�~�ro�s����j�g����y���2�P�	��kXl��M�����G���A�����M�w�U|�Ty��||��� �;��wP��2`��{�n"y�]"����p�&��(��>��:>q�hw���5B!<��D�p_�0`~B�A���BA�����?�Z�N��������R�*��������j~�M�9~#i�#��4(�j��,���q�E���`�\20�J* 
�;��(������J�-k�|)K���2�`g���Q���&�a����3 2�^"
[����b�p����7�P:��i��AFZ}����=!�
5Bq^����y�v��EH��%�x�r��z��}K���9�Iu����E�u�W�����l@�
�|� �K��;l��}��DP�N�L�p.R���VPv�;l)���[Q����m��!\J'{o�xz������P
�;F�ZD�������_�������7�
1�|GZ��N���3�5|f����sR�}��z�5\`'���P;V�N�Pk���z_�Pt�GkA\�FZ���[@������@w�:����>	2�^���PN��h�}���z�4� o�{�#��wt5��>��}	������V���|.�a�����'���Ib2��^#i�d�8oW�H�k�/�����;���-�#������k�������p��d��"H0\XI���V]M�Y�i�G�������X�lQ�[� Ji	�#M1�E�����5���G.���[���������wDl��`�R�tE^��5��=��T��Q�Whl2A��$_�g��QD�[���J�C�3��4!���d���w�Gx� /r�,�9!L�w����w�;2��`w���x	2��G+�����S(���kds����"CY����E����w���H�����1����+�W�8O9+���h������6��['��{	���\�Fx��N�'
�c����M�uR��"��2�9����|V��	QX#��/�=TQ4��V$'��H�G�cIr�2/	}���3��OM���F�0B&"����L��l'���",�]��|�GQ\4�WJB�����%�5[!�RJ����] ���z�����	�@G�11�}y��H��@�O� ��	In�;Z;��x�^Z-��P��/h�^��8�)�+�(:��J	^���%�K����%[Cr��MB�
��������@Y���O�uO�2�D��M�mOmw�BG�R���x���[	��`*�-���o
��~d�
���`�$C��>���#p��y*z���>H��>�c��/51;��m�8�T�
�y �X�o�;%		2
*�}������v���RZ������,rO��wp�$^/���p<��6�kc��hC9����H���%����J���1��m��"	J	2�[nA5~�I�_3B�hD�PJ:��>|I�D��R�,	6�=>�h����s������,�<T"�R�J1�av�,O��M��=?(uK������X���	X�:��x����W��CZFB�N���f�D�_J<��-CL��z�����f:�+#1��mKI.�MS���Z�0�2bA���k�kOct������*�E����/��d0�b�C&g~*
�OK��T�r�YR�u~:P�P���ew���6�F�97��)��F'��R"���;���b���K7o���&����8)��qkja� ��R>M���s���,��^%\,����duFB������6
'���������z�4
�~��>jT�`�}����B	?2���D�aJe��a1�QT����V����l_>�u�H��&�^_� ��l�0�a����H����1X��X������A
���=��U(����,dOfC���#�s����$��VM��N�ow������\�s|n���3��\au�d���	�0� ������p�������RE�!
r4��*a��K��K}>�4(��O�:	v}����_�
SF}��K�����=�1T1��u�.���~��i��`��>���3<��	�����:��(�V�<Z��L}�4�����Z����PF���V�������c-1YWo��-���R?�c��%7���%�0�*J>���Q����L�-`?��/����F��>��7���'#5�I��R&�-v��9�p�����O���|f�<��v�P�&��B��3"�*�#�mh����.��]�9Q$�W�
�6���
�PGA��jlc�st_�*���L1����c1�~\��$��0.,#�g��'���V�m�A��K
�a6����cB�kB$��n�tZ�iHT�S��5��S���N���j\c6�v��^��h�[z�g����0FW�����N���2�-��Xh�3���.�����)h����t�J��Xt�wV{�h�|�� ��a<fkV���.���X�mb��+�jR%���yVSI-eJ
�}^K5z1E��8�1-l|~�Y��x;)�Cc������Z��c??�N���_)�n��;I���������+2�NbhQ����!�I����~��(��T��;K�1BYgH+l��v��Xg:v5�C���#qv>�?s'l�^$�#���K5"1u��O����!�
d�Vj�	��(��J�+.����E������Msy/����ER��~���'����E��3����V�q	Q����(�P��{!o��
�v���/����{7B�����i6v�2T!�Y����I��d�Bp��.��&X�F.,�SX������(-6��s��8D���R	5��W��-�;9&+��p�0B���N<y��c���E�)IUGDIg���J|����M��1�j�x��	�Q���S�s��=Wj��&�b,�UO�H���CI�|B1��zc'WCl6�h1:3�}�y�E=�ft������
����0w��d]��4�[��V*_-e�Ig��>���K>������3�kt�
}~���Z���^`�'��\�9O4�[I�De�������=Ri+
�PD'P��?�<�KF�k�_��o�hc-`���NAAo�8�p������=\�����)s#�.m�&$f����a����-�9�>��U%3Y���2�@�/)4��>������B8��x���%�����u�F�=�|�%�Zn�Ghb��B�m�-D�T�Z�����+���P�{���eC��*��hK��~�������0b�fd3�6��
!������9�}PR�l:���;<�����E0�yJ3a���dT�������n��v��?Q����R	5X[4V�oV�	4�y��N��s�os�q��ua�6e���_
�;��C �g�zlI�@�x3q"��5\��NN�Fl���+U�����)�(5L��;"�D��{�ub�y��Eg}E{��i}?���RF�(�4��V�R53�m3 !�'w��`��l�O�
@�~����}&�����,m3^�
HH,��^��>�VI�^��`3*�T�:$����ahBt��FUg}lI�F�lK�5�?�r2�K�TV�nD-�L����:�6�����UM�Ss���2c�����/��Ca'�F�K�"����x�k~>�o�V������&l"�:&�k�~���*��h��]��xVz���Qt�{��[C��=���C�4���l�,h�?X��DO�]: B��r����������������S�~D	��#�b/��x��E�4*;v6]�>���'Q�/�"Z
�1[�'�~n8A8E�@3�����E�������E%f�-�"�jn�?=��f%�IGM�8�ut#�v�{^��m�n4A�
_Z�d�WP3v�B(�tc
��l)�m�.�����>�h��D�'��{;��GM�n���4 U=������L��
50P����{��Z���x�x�h<�����Bu�{�h.�x)�b�'gBU#�w{G������Va�H�
lT2vc2�P�����~�\:{�fU�MpR���~���67��u�R�T��EO�m���Z�A���AG��n���������Q�_���68)2E�=�!��H/����)��
1D�����x��L(��t���R�����_�2fa+h�}�O1�!�'�Z�99<
���_�]Pu���L�"����3����:X{��xH��| �F�o7HPI*\���f����>���g����!Q6�� �u7�Q��G���M!7l���������n��A���JO��0�&���n�;�����J�#D���������/)B����,�v����H�m�!E7�������KR-V�$��QI�b�nv�u���d,��-�q������i�>#���a���^�G�'9�(��������@�������)0����%���j��'�����gzhB��t7$�hD���3�5��CN�_��U��D�Q��A������o�H%���������nA��V[��-�������r������������G��p�k��+GI�1H���
T��$�������A�)0����N�~�IB������&���&�������Gc�=�ZGTq��i��u�F�����e^4����(
�������s��`����q�#��`�n,@�J�}>��B��$����*O�hFXr<jO����z��QE���|� 4��e�yN:�F��}������JL�������k;Q���mA\���xw�}��*b���N�2T�\�2H���6�Q����P{h��?�N�T��]�1{��M�W���6_�m~��1��Q��~;�J$�(��x��<P}:��5��l)�A%#^F��y��r��9�������!T���4�Vh�������G�����t��,�~�3(�YZi�\��f��aX`:�PB4::��3�G^d��#�FwA��X����`��D�-���;Be����n�S��hf�= w�a�@G�����#kZD<	�^��]��y�.�HU=�m���� m5�����j��kG�b�U?�.+%��EC3��jf�E�{�!xh0X�;���� s��b�vq}��6E`����X�����i�@N?,Ma��H�q���1���*+K3\P�n�?���O��;r]h�Z���2��'9<��f�H?J~L�4�:h��+���Y������k����q�^���Bt����=����$N��v���Z�vr��'KF��S(3|�i�m<�h�`��
�Iv����'� b��;��P7�a��|Cd������
�P�a������L>fk�b=3���oP���#T-�������u)������i���hhB�t�OH��~�j������Q
A`[�8,Whb�PuC0����C.Y��,M�D<��b���o6.��$�Z�^��:�]�Y��nl*0�X���$�����-`;���0�[o�>���}>��(5�6[M�b�{*B��a�B=n�~�J������K����y���~��
�o�-��}�������s��I�6�gX�����6j�=���:��f<�a�C����:p0��0�q�����3p{�����?.����A�o�������Qwp�iD6!������������$��=%���=_cC���uNXu#�=���C�nm-�n4������)\g��IMx2�Y��*%E#s<VC�I(����Bc&B��V����|s�	�@V��#`?�P/*��g�4b�����������O0�r����+�+�fQ,��
���Bn&�Z������:i-���E��'!�~�q����Djz�h��������G�?Pg}~����O��
��gr��������O��#�n�/}�0$�`�9#��e����r�{������:��_)������3�J:,��������L�C���:d��*��=���;H�&*����}�n�����Rg�ri&��i^�\h��]��jS������?��F
�I�5�-�I�PN��:��$
���8��C"����n��=�H)D��rza���a��4���AK'� =t$��M
:?M%
���'&/��$�@�9��;�c����a��1��\o��������$�O�c���8������T����]�a�b
Kg"�o���iFo���w-��4e&��������C�H��4n�����5��s];��'��Zf\�$��sf�q�U�u���c�p�UF��Q�|�z	�������m~a��JP�:�H�<#���\�
=5�D�Jg���ONtZei4�G���&�/&*�eg�]�9C�(.�������dC����gw0�����d��7�q�B��9�BH����%ZlT�.�`�TtYo�c*�A�h3s/� $����4�
��F��s���/l��G��K�#!�!���|�����w��,�
mi�4���_�wb4WO���l���IY>;j����o���I'[�
t��?V��6H+2w�!��H�}��k.<�
h��8���Z��5��=r�g�{�h��s%A[�����6���X$�4��%IE�;
^���7�S=�k$-B~���_H@7����"b�X��z��#����;� ~&'�n{[6��f�NCw����>q��v�0���g�@k1�0	s����H�a��_,��l(�q�*hZ��.��M
���<+&N-�UAZ���g���D�A+J�K�\J>�"f�"��8������+����~�������1�EC-��K����S�eP�m�x�|l��x��I"�K�O%t���G���e<B�����d�D:�x��
�w�>X�e�)=���3(����O�GX����q��
������D��r�W�	T�����=!�����s+��.o}!����7j��~���\��_}|Q�}��X���'�AB��U�5W��Z�b��Z;+VMp�iv����e@a�.YN~�,�q������!�M�T^�{��!2����`�^rPe������R���(�(dsEvq�?�re�YO�����F�l�m�J��-W�D(�
����1�i�m$=]$�pM]��)k��J���(��"�@����$�*y�:�]�x��Z�ZH��tF+��J�Qk�`��+8i���^�c��iP�����q�}� \lP�5�T� l�>;��l}�%�(��O�t�e�A�N	wt��N�����9��\�������!��>�2� w��:�,z����)���)�z�Fvu����
-_�����b��WmhA]�j�M����@�k�!jQ��d���1��v�
���Z	�VA�k��wy���uM�����-"	�T2H��*YmA�����L�,?�F�\%	)��t�x\����Pwd�v���	R�/�h��(8]��S���2d "�S��rx{#�����.�!��>C�F�+ix���d�~��:�'b����'���������m��"�g
��V���Y�{�?��$�r��Wg��+�~�����������twLC���R#V4_'.cB�'��X�
����=��<��/6Bo���/�4��7>�������Y'z��p&{X�&U�'6�����	���� �^�u2��dq������<�mP@���'s`v��(�F(�~�f����	���m@S
��Of��2;�N*��-����N.�<6�S&����v8@�������E#�]B�]�
�� �v>@o��	!�]��j��k�@O��tu���q�������_�s����3z���_�3��#�	1�m(@^��y��n��G���53�*G��R�W��@��j�|��@���&D��$�^�����[A��m(�*3��XH�i���^.�fe�s��Gl.��4P��`c�m8@|�k6P����9�h��]��n�Eb��F��l�/�7 '[�Lo�� @A"��
���D7���1��S��J���G����h����Qb�Ux����������U����C���0u�( �m�o�����F�����M��I'.�$a�qm;R��{��v���@�VP�.�,:X"8�����Yz�
�d�q��N�4xp��c�R�y�����l�U7�<S�+��A�f������$���6
}�C���)�A��e�R������w�3P�6N�@����Bv"�2)��|HY�����j�����0����xx$���x%A����L��^���/�A.1�\rj��<zc���s>�M�WL��ow������d6�������V ~�=��K�^1n����$��BBH/s��F�'�Q!;�TQ���`�j$;v��4b7��.�8�c�Vj�J�_�� ��6��?���+,>����c�);1�R���!Sa�f'�����9b-WD%F�L��=�� XN1l^�3�gU����y��7
�Y��!?��<�gVj��\$?�x�/#:5>E������a������������o�_�R�����Xj3j�yBx�p�;O�~e�B6����T����Q��d�&vf����*@}��#�>6Q�z"��y��#b��,H����C[�)�8��f����o�I������F.�i�N�����`U��b���O���*�SB�3p���$��Z�
�^��Tu��.T�R����7'���:��AS�}n��"V/�������`����/�p"!����D=�%�7�#34�!;{�a�I��~���"v�1L 	����Q~bEt��}-��������3�<FTF��'���9��\�91��/�������e`v$n�\�q�c�<W��������,2& ����=K����8-D�X�����3Gc���h�\�$��vbIq7�(���D?�#������<�t��*���KB�G�����1�Vf�?�
MO�WA@��-�������(
��Ot*��;��?���<������MN��hVp��|�30�d�r~���{�_3.�N��>z��+r���%���nE��3��4�d�i��/�����@�c���5�BH_�����,�4\@������{��k'�u�-����o���Z��#��'f���CD�:+��C��
�9���d:;.|�?e���0�������f�/�R2�I����r�e?�R��|D���g"��IB��'�������'������p��Wq���p�wO��k��I���b�j���$�������1i�����^�o�����<�W�C�f�����hTe����9��[5
2�|��o�c�d�SQ-��	9@\�z��x=��D��)E�����V��C�,HS���<���~�A2������T�	�EyW(w���4&LXx��9-(��5�����������')��8���=$�_���ck�?=����o5�����H����ftt	���H�"B���P�"A�� �O��*m��C�>�.�@[���U�����j��^���k���@�<;$
E-	%��������e������I�1�G�)�P��e��O�x�~�!qV�L��-�H!P�U�2v���Y�������)a�}?���d�p���i?�F�{��#6�{�-��_����Y�����?����;]
MC�w����K��|l$��C��T�,l�i���Dq)Z�&p�{!���E�i��B�_�%.��a��
�H��.r��I�FU
��-���L
Uh�Mz/?v��o���w��m�VP�	
)��Wl��y������c*>��Q�{���)�]U���^#6
hM���
9��9����Y]�"z��B�pFQ��x�!ZMD��C�Y�5�>�b-�+}���>1":���`5���H�FO���h��^�������!��r���4�/�r^�UXD�JL��l�������<5��&8�{�����{�����;z��?���n����g�F��I��]nv���kx������#��B�����3e2H}���ug����`yR���qd	
���v�:��<�g
����TY�]�x��H�4���a��6pI��8'�3����u�-s����2e��le����� b�w��/�{�.rG�w������7��������a��������)S61�gGg�hje��q�P�v��7���Q'�����(� �w�����E���-.�]�> ������xp���� ���6�7�d_'R����]�M�(��E5���#�o�.��'�O����v�@}��246�vQ��/8	!���i!��c�}� k�"A��J�B�:���H�J
���ky~����h�]muj����=~y�"���(���Z/$���k	������2-�8�~$�A�2��%a��CK�S"��B�J�����<��24�)_��tO�����b�A�
{W�����:���<�t�,)�j1�1�S�!��o�<T&Xb�Bw�Z7���Dx��bD���S�Z}~������[K�
P7U��,�*:�K���M��D�����W�	W������]�C��������G�Pv,�[=8�������T�{�a �9����n1����-A�Dx+y�����p-FP2��(���1uS���p�\�e��+���<`C������������)�uM��*���dY���E���0@u{�N�����d&n�.Z��S���\{�t�G	���4���z�b�@1�v�vv��
$�RS:����6��+V�m��(%�x+�T_J2<��t
�����v
����m�	6������2`�|Y������b�A���%

E~H�5�o�/_������F����|B:*/�K����!�T@	����+���T�2�k|T���Y�TI:
�h�645�[�@�t�%Dq�Z�"�%QA������J��tO��Re���`Ca�{��P�� U������D�W���
�0�YK�%K>����h���
\c[i��1 ������Xqr�L��:K"�S��@O���:R�x�mR������-��y��^d���Vc�������H����6&P������$.����S�JJ������O](�"�(c��b[{�UC��KR��L�5�/�&d���/��z2���M(v���!�'������������� *�w��;
��B��P��;�R�<
�EaOU"����!���R����6�~�h����&�Lb�g�:�%������I;�$�X��P#��Bm�UN�e����bH��fqR��<�3a%�q
���-����� �y��k�N����V�����i{$��~5���������d�)��J�������q���KE�!
a}����D�^kT-R��FP5*
1�7S��D�O���������i����d*�o�����@c�j�����[n��p(M
�k����hb�'%^G5B5�A����oEr�&W���zR
jLDf��2�cG���f����E~>nG@Q$�|/��Q>Q=_c��fH5����j�
D��1�c�k_�oXk���j��$W� ;�1
e"�d��Z�����V����r5.K�x��L�iD��q]I����>:�F!������4�����!H�$�R]��'��u�<S4��!��9�����}$���f5�a�+\���JeV�<S������M�)Z��'�G�C���Xt�F(qo�����	}��5BG��^q��.��VC�T���R/�c*{/�$�F1T���F1��~'j�3���:"���d[F��{����$�(y���9�]j0�����;j�B��zlqF4�@�����,����Ut ���^����e����<�Z�	v�
�0j�P�_c�t�|m��W9?W��`HX5H���/s�����}T��5���{ZYXS�bDF����k�36a�����f:������������XVr�g2�_'A
���+S��h#Xog��}��*
�Qk���3`����[�C�2J��L�R�,�.�4�A �d�"
c�a���c�f��0��B��`�b�a�u��Xn�yf`qQ���z�v��1�f��UzF ���68���X!lb�G+3���i�7��7dd2a�u�_*s�j7�z� �x�^"��2�j��
/���d�s�Z�B��*�V���]OQt}���D���z���B�o��%�g�t"a����~~#w�e���u���:!���C#A�����l;��E�Y3�`��,	by/�A��#�������wKf��@0�w����!���}��@H�%4h�t@�j{�~�G�n��8�V�Z��A�[���*Amp��������=�����������*�C���A�}Kt���j�j��[BL�c7 ��1�`o���%lkk�Q�c�hX�<�4t����$���}K�s���ki53�J�V�|�����5
4�hqYB;P�����-�.U�$A��8-�O� =]3������CZ�)���ck�V�n������������Y�a�a�����<����m�*{W�����[)�w�!�ykR�=T���YZ�����w�[�;�`���"xe�p)b��D5,�2�p1U�����G��LA�������b����8�������OP���2�E"L���GQ��{��k�7�B4Cs��SCk3t�Dc��
� w�l>�/
��Y`������|7&����*�C?Z��3�B����Tq�)L���?���q��9�X��<�2����
<p����EE��z��0����z<�4;�5�i�+%keVL7�s�	]n�-Ml[��p�6���F*���c+^�n��#z�"4�������`��h����\6�!�`�f/i4�bS�����G�0�p?�)���h�$��������,��)����F11E���<L��		|V�F��0�������)��h�*|�a3������O�j����$a�*��v��Y��Q3� ���A�j��(p��3 Qf�9T��\�k��7j�p����Q�nhA��^B�@1J�U��
��a�A�4m��%��<��)��p	"B�����r���������*�%�����P�������r�������70��fhahXrv4��������=�D��A�(4��2������GO|4z�����(�w�	r��%���"��:�'2ZjD���e#��_Pz��=�����nXK����oZ��Mp��z�n�Ai6��*����=(�������8�C3�n�����DB\���F:�dzv�F7)x�<��f�����3���%�O�$4C���ZGe�p�A9T��������PO�K2���S���D�(nI�v���5
�=�M���A�54i�F!��"G�%?`������$"=:A�A	��������3�`&�%����"}�hkN\!W���DEX����������k��n�����$�ek�;H<�?tB���U���yI�z��~�Fs@���=�*�z���I�&���"��r�,���}UD1�F"4�Qs�Y�<�i�����"�P�h�1qR��as'�~"��32���-������I���"��n�b+4�����-��Lba��^B[r���ad�\��M�'���\eT�n�b!���QK�K�=����W.��'�Tq���G��m��k�����%Cf�p�:������	��X.��a|���	�l!U�w%�k�������b7:�~��R�pDa��������<�*1�C��������O<^i��*��.�f�]�0hy�$����4���4=���c���_F����=�x�����t�_]����?����vy��u	M��Q� �~��QK��i��&�Z)�h$�B-a��/������������T����W�����)�8�'�u�;M���#=�.�M�~(I���������w^�p��V�J�3cw!�_�����tq
��y>HL+U�ft������0�y�CP��n8B~`7��d/x��%?��7,���?(��~B@F��'Tst�"hPX��>VJ=x{2�Ck�9��{=:$��A����`��!�#�,el�`��)��!p��%Ofj**��T�E��AH1�th�Y��.��B)�OT�qJ4_Z�8zo����1�B�f{�*I���~E�����'O3%<c�#��)T�0A����a\AJ�����b}�_�~��!\`�F�~qw��&5C$U���;�)�_�6�(`D��n�:�A�jr��F�d"���6 j$B�K��T �F��(��~����)+:������F�-�dMdT����%���Gd�9>)C�V���#���l�*�
�CF��|$������)�|XR7Zp���u\�)�y*Y�m}����'�)�O�>_��H[j}�
�����_�P>�;���ID}lI�lSN�3�!=���ZE0��4
hc���1�h��!��S���+x��/�G��6l��';����Y�.@�]�.t?��������\%�c�ea1�A}B�4�c����z�?�w;�D6W,��Y�3"��H���1�d3oJ�
�Q����j$`A4��
��}����4����3$ �����a ��<�1�:q@��ff?~��
�Y���Z��t��!��[iQh��1
�����BfD#I���E����|���\��ww`��]��a;Z�%s��K5��?�1GG�o$��.C+���P�4%��w�v��'��B{E5������E@k���}�!��L��6v(���1��0N����^�S(H{�b��/�q����w�3c��C�|��E��}Q/������/H�/�����L4�sr�p�u��
P��$�S.�Dw�H�;5�B���e#"��)\�nFF�"G������h������U�:�:��(B�F������>��+�@�T��`�|r�
���[��r�OCb2)����-(ha��	���P�Q�<�Tt�OC����>���<
UY�����@��~�$��d>[C�f��4& r\G���R4�g+�
�	��b72������d�"��@[�44�&g�c{��t#��a+	��t`&Na�P}�%��������t]���*T�=
y6���42�����Z0�7�}�uv�����c"$��A������i������F��z��@#���3����Y���?k��V���i��n=���49���"I�|����bd�����n�4�/c���LR���f�eE������2:����E�'�6Z8s��/�����6�Er��T�-Cs��:[�S%�,�5��/Oag(���%����0��b������_
�����g�<���21������1(*{�M�	�q �!	Ii���-��^p���O�j��*�}��.���P�}�%�t�����H���
b��;�Evs���J���X��e�v�:���1��?'g9������AG����fd^���\!n���T	2��i���,sf�k��
4���$��;&�_m���=4�bF�0H(����?~���@�Y�����0,!"�TwnF�p�qC��;e��Ht4��F �F]�X�T?4��t�J�jKt
�v!C�u�	�_�m��Y�|m����h4�r�hJ���c��S�D=+HS.��F����� ���'nV����������6��h�Zj`��i�Av���=&�#�L��3���`���>�D�%�JF���c�d��3�@K�9%g�0}3	\���3�������������������z�H�z��7�w����}�� n��Qf,��:zo�#�x�Gc��v�/Kad2�����|�BMWu4��tgs�i+NH;,m�H.���u��v���"Np�u��y�tw��ZA��:������)�b�M>�epb����Cm=��H�^`>�z�h��)"��H��/W^Q)(�X���lZ�%d'�T�+�G��k�����!��.0.������Y�o<��@���~���)Q�s��G#$���z�����d�#�D~Z�'�wt�3B7V�������� 1����zA%��T�����!�T���!�Z����b
#M�J�x�KY-�
2�<:���I�$��dOwo"��jA�ij���z����Pd���=4<_	x~�i������7�P���
��+Z�V?e#,���V`�C^�>���<t7��\�l���	�=�0� ���H4�I��h� [E��*�7z��l�����"�21M1e�9%��m���8�+����������{�P�K(��	m���A��+0�m��U��z*���b�$�b�)I����#����F�O.���|���]��������=W�+��<�S(��"�`M^����\�T[���|�
�*��6�+���_8[�$uu_?�V�������4���c5I��|�[U0-�J�J���T�k��� ��a�L��8f�k�1�B��!9���\y���i{P�`_����q��320[�t��
�Q�at��-����%C��
a-��5��SQ���@����;���[Z�c��Z�2��0W6q1!�@���;B�������b
��3*V�y�����o>��2�����S42�,�����Hl����q4�hH��AHy������ dF�PSg�!0e�����NZ����'�����Na�#����������T��+c���Z�:��^�n
Q��lt������<�����}��%E�������������"y�I��f��g��?;�o��tz�q�N����w'*���?c�;����>��$9k��s?�7�B��N����f�}���.t�i~��w���$���}J���tT$��-��\������2�����m#�
���X#�o���r�]����S
�.q�}�������~�H�+:Z�
����7{�o�B��4Bl�/���x5;�I��( n ������d��;w/��P���w��tD���*��@���&;��}�Y�����;���������0yG� �r"�-�91�jh�9i�7H��j@`��0�)���
;6J��gF����<y���Y3n�6�0��h�`���1�0WdU8(%y��av���0F�-�E��M3t�hk����c�41Az.0Ti������4`�l/3����a�v0`]�6V �w�O9wV_7xj�_FX��R�ad�{�2��l����nd@��,xm���="�a�>�(����w2���BFSh��]��_��K�Wf��F�]�wb�@�b!�}�GlR��z+�MC�	rp7�e���oy��V����oz�v��S���������*E^��C�;��vc���Fl��X�7!��Nb�fK
�do�z~?A��y�@��o���b�3����������;e������4�B+�q��<�5�SH(3�H��b���UQW�-��)�l���s�`������h��&�s;��V����]�^jx��C$����2 ����Gu?�F�(��P� ��H���H��F$����/<i��t�UC�'�GC\���/�](����}��+�}�h�w����;6@���e��! ������Yp� Jw8%�e���x�_���������f�O�����>�3����_��e��1������H;��Q]g�8��1�a{�����x�F�4�x�/�#v�����NL���\���N�*�B,i���GUB�E76���k�s�V�R!��RG�hr�{(��$��"D���^B#s�1H���{O�T����d'NG��D4�S�������	�O�~EE����c=����}h�t����	V$u��Y������;�:O�����L��M���g�-�v|��rR���������b��'���m=�V�y�����_�s�p�8��i�x��
Z�C��]�i�-��E�"C��J��_�,�x��������������h��0�}�	En�~E���a�Y��O7����Xq���y~���qB������(S>	CE���(��>���o����n�G��s����dG�Ya�y�b,�P�x�z�f��{H�w<�,c�yv'�)��r&������U��rH��7�����'��9#9'V�z,
�|~��a�r,E_J���yfl�z|3�%�����
K��L��#(-�[�8���N���4�Z�,�vu$98����S,���t�(���uk&�=��K $�������������e��W�G�,��x�/wC!�����:����S%���w~��4�e���������gE��~�ME�R������d����vve	��@/��G+��W�wG�������=D��3<y_k�J�7�YI���z��o��.��	:����r��E6l�w76������?���r<�?1�C���4dQ�4K<��&�X����BkB�i�����I��F����*��H��}!	E���l�{F+���V@��@{��3�p��8!>!un{"��v=��5�*��^(�x�f~��
�'`�{
�x��w�Ox������&���<3�m��E�^���oH�������\&�������(w�]i�[c�p��_h������)�7�5���)��+��@�(���U
�_����z@<����f1R��<�������$ w� s�r7�2��}d���C�FG���,�F�^���)1� k���
�I������R�������[S����C6Ibd������<�~��yWf"'sj��O�":]!���|z�-
H�� ����[i����]�a����S�/��L��oO�{�� �����o�����Hh�#������k��&�)����/�������L�x����$	���������v��E�U�J���g���t�:�^��"Z����C��<��4�	��J�]^s\����u3��_�<�����O��Q����B��y�zT"o
Oyb��F��ur���>|�f#6�{��
-�soV3/�#��'r��<Z����U����h��5�$d��&"m����~22{zW���zz���o�eP�/�����Ys��DO �[�����
���QF�Z����'f����E~����]�!�re�Q���S�G�?G�a���<-\�EFs�r�lk�*A|&eRI�{��C���O'�e������q���%� f����n��f�[������E����9X�{Wy�N�?�����]�/���d�
��Bh����PZ�E��d�Jx- ���>(�	ifC�@_�F��8��5����V����VU��V���\��rp4���c���p��xW������
�`��f/��L��"���-30l�1����}���II�����y���a�n���nv���!N�5<��L����,�N�#�������G�����Og�4L��M�(�`�������������Qie'�Iz����&����W����a'��w��nC���%vh)Ol�W:�C�:Z1� !��K�
r<�:�����+.�q!����Hl��	���E��u,�!_V1� �}����V���C��Zk���[�>����I�,��V�E�����6v
�E��<�$���s��gP����5�H��^��^[pDc.�2�{/�O�a�*��j�)�b�B��&|�w��Ni���=�������%I	*1�^������6\����Zc�E��t&��>*��1
K����.���F+�PG�.F��e'���Pq�kXt3{l���:�������b���
C���"��}�ez"�����b �����%W�E������s���8��s��Zn���^����9�o� (-�5���������au�c�A���$;�1R1l1�������57a���V���B�]�.�+�V��,�����5'u����/��m�T������IV���O�HN��.���jHu��QT�WVr"6.)=�n���X�i�C�C��������q�c1
"q�*i%1���P��Dt��P���m�&!����<hT���%n���g���T��h��������f���LYU�
��CZ�I��X/�J�C�%%��>��4�!g��M
A��|�;2�����`K��Zl4�,�r�*��syh�Y��D�����h�����im*`������x�[�bj/���8�eg++&��[R�q�M�5�+�P(W��%	�R�=u7������)�$7	i�bC��Rj<��=�K{f�|��B���0%D�,�T�
*����9�SR��@w���PS��_���ubo�\8��������z���#��D]���9P�bc�0-��F,������@;����X63LQX��$�������h`B���:���5�k]����8����L���#nV`������JTiO��K��'%��-'����Z
>!���l�A*����������+��-?hk�F'&:����K�Pr~�'�e��M�k,�&y!��!��<��		}G��5(�B��������F\[�myDt�=������B"T�
eY����LQu�o��=�/���Qx�p�w����"
�u&���K[��A��aj5����d2#��F����� ����L�V����)T�"o_������V�Z���a=��b��u5P������QE\?������1BP�vT/Tr��1���^{~���6����bpu%��Na�A����5�:NL/��A������h��J�bjSm���.�X3��t�w0;��.�����P��q��K_��q�����h���T�'��,�4W���rc_6R<TC2������hdh��cj:U��D}��n�A��g6������@%��?U�Q�V=�W&���%���#�gm�_F�-�n�,�1���tu�� �B�j``J��'/���"V$G�4��������8�����x����L�D@/J$
j���4-���A��/&��j�I�j��5�["�e��_[�f�lk���\���� U��F�O%�G�G0Fhe�!���������ST�HSS������j]�7���L��=\e�fD5������~�m�Z����OL������<�*\i��Qs}Q���2���O����Rl�D.����������]��*��;�#w��M�5U���@#���y���g��v'E�YJ���E�N��������y!V��a��8�,�)�&aA��=���8I����N���-�}��A�g�G�{dMw���Z�7��K �],f8�9���5Ejj���5���l��0~L��W��������Ip��<�1
�q�>:������Nb�z�P���k$�"c�6C��-�K3������3]B�,�b�^�*��s]�����=2�i�X��	�Y���.�j�%A�L�����
�%x�\�Q��jN*/!�3�����|(�	�|��h�r�\YxLE���`
j[���q����[b�(�����������oz8i=�Z~(��\��o��jH���*U���
�B��0�|�5��r�������,3:
1�b��_��&����n}��T�&��[�t�^�;�P!t_/�<�G�f�M#R@� g<
�c�(�ZBCl2����w�[�j����f���[3��� �p:@6j�����~��i�e8����E7x��l�1� x�������irk��L\���E���6H��Fb�P�2@��������j����r�[�A��"OF�dT?�0�f�a�Io��@�u��6���U��TC�)H��F<��f}���X����w}������Edp��b'E��-�[����X
��#X�xa:H��A�W�����c
ja����#������i�,�����1�ig��i"*\K���z���e�]�-Iv.��D)z�}���"�{�gNH��u4+��=��5fC	�ZL��S���Ok����Q��T6����_�y�aZ���$�ae�����A��@e�������;3|Zj�V,k>BOKe��~�
���~�8T�_$qh�tW&�;�6��<���9���k�[�k���0�]h��r���N�3e�v4�;�X��������wX��X��<0{��7'��y'BW����7��nF����#
�wl�$(��eJ#���.�����#��P�r[�����������,�!s8Q��"`�)�JJ�����x$��2�mF��$��|B�M�A�h��o���n��CY��u=�����?���r�A+�p!�O7� �u�� �q!���|f�!�G�������M�z������x����Y,��)���Ub�8k��?/�U�?8�z������?c��j��tv��O�x�wQ���:�P��
Kl��.�����K�p�J��x@gB�C���7/�0\a�m�=�������[,�_$��C**������������M=FI�"B����4����$�����8h��x��
?h�
]�a�=�[<���4��p������)��P���E���Ye���;/��������M�Cj�z�����h�p��'�A��a�%��@��n����[zy�����g����$7J����z��+�i�{��E�'^>�����Ue.*�PEC��������uT�w#�z�F(��X��K��m�+
)��F���u��d�z4����~���1s AD7X!���Qz�����w�DoM��
4`����@=w$��!���\I�^����0����@�n���C�u$�Px�B}[�*vu(����n\B��d��=����n0B���}���q�Vz�dL�)lw"}�I`�S�����U��s� 98-�f��^�����(#�`���L��I"v P� $�?� t$�kD��C.qPx6;�W`���W���
9����D�'�
c�����F04<����lE;�����-&c��/8���;�JV��`
��	�,�W���KV��L�0�;���C���$����#�`��(���^�k��m1Cb�tBd�Z?h"�n�Eu��q�����$tvC�>���h�yEtC{`i`?��������X.����(��G�v�J�`��n����t����QP�P�O����@��n�A�L���(�Y�����hg94���p���f=�a�I*y�G0�;k�M�Fg�}�]�6z�����:�o$����cD���J�N�\�%<PC����GL������	7B���Aw*��F�\c$�A����~�k��8�(�@������)��h3���
5�����2AG�c��&������N��X���1�� {6U�XF�0��-�~DA1����S]C1w4�t�=*K�I�V������e����C'��3���(�g|PB�}�����0��x{P[(���FB���Q�"����f;gR����gyg��|1Ewv�@�H�6@#�5M��`��r������i~K0)S9�//������*�?+ib��l�GR���3��������h����s�����@���C�?u���F�t��D��*�F��%�����m���.i����(�����V#Z^X�5F� AC��U�S�,6��F/��%���>�lV*<�# ~�����C�����>7p �!���-�"�yG��Ca?!>"�AD�"W0v �Ze��,��;#(�C&��1���ST��S�+�+B=B70fI��1D����u��98��9��]/�7.���T5���DBG���$D����T�����������_��a�g��u�� %�f����_4��q��rAY���*a�Z
c�rWa��V��v��|��}�����F@���������A��� Mw/^�,j3"UP6��Y�_�{�����O@M�8:�U���
1q���8����	|��h�HD� 	����pb$X�Nh�6�0�H.d����@>6�|���e���S� ���I5w?fv�<`�
#�
G�;�1�F;�%,'nj#8� x���2�W�GPz[��J��"����r���p��W�W�T3������%���~(!?"������s�c�g2��CY�\qYf�����d����V��O���z��TF�l7
H�����"E�.�O`��(��V31���;���]�2Q;����D7I�#�@m�Xh(7K�����iT�#`��I���
��3��g1u�3�m���(�����laXO���B}�L>4[(.*�����x��Q[��g�|Hf�
�C��M�(pl�q9ek�"��	/db:[�d.�`����d��3�KrC���+b5M���:q�����N#��O-z��'�3c���
�q��D-�=m\N#�c��R�g4
�;j�����{isL�����*M\�a	)X�=��g�%�����%���l��4�u&���gR�����q/P��8Y��=
������i�B�5\��i �_���gn��,Qg�
I�uv(`��]�^&ze���J�n���:4��'�jA��@7?���1��q�(����n<��^��?����{�m�3Hj��WoF!A���,
 �0���h8�L���BnY�&]��E�Q�--�_l�BC���(�����BUs��Y�;=3QF_O<�����1��,�,yS��k�B����
D�v��:���,�����/<5t�������{�XM��[�<��BFS��	n����Y�*��7�>7�;f�
���j{�I��s%�M%�J� T�	�#����e��+���6��&�dd���u�q[B�����Z$L"!#j�������7��rK�$��d�_N9��p����+�����,GT�!���,�����U��R���s���nd�w������������1���I���-wr!C��x"����)�v��'m���3����&Ao��}i��{�~��N����Q:
q��������J������f����5�����bk�F�G�4���������F��_��� ����^�-��V�&R��FA����DW[QML�uer�w�S3�e�B2FV2'gZ�e�bqY�2J���9R�(�A��2&�������$���lEF���U�D�&����q�I<����
�����!���-C�q_I�@��*���e����eL���:�&1��ePB�P�D?�`��J��5�w3E�
X lg�8[�Il�w�F��������_I��;�+
��EH�$Wm{g���{�C���*���`�������+�b(��C���xi��8�rU:>YIz�4>e��\_��5�Sb����i�V�ah4�NYJ?���"�P�'lAm���P���O�6e�%B�#���b%xZ�����t��%#B"%a�VW�}���^��1)w����cL�����]"��K�Pcr��-�p[��^�����	��x_�H>�����nh5vS#�e�B-8S!�J��^�w�����t�j���a�5����$L�f"tT���o��f���[�-��F3�pwn�9,[}����+y������-�R��5��:����.��k���L��������e�������V�#��-V�A��!��>�l��^F:k"�
���2|�>i{4,b#�e�CvV����I����2t*�,�!!(+���"��iFS99��P��c��E)� �����t���n��^F:����UQ&�fQ+����W�,j��r�*���q
&�Z�4����*s}Qe���$�-�K49��o�0
��@�e8C��rXU���@������2<��YpGc�'�7���4@��k�CNQ����-�1!���r������c
�,�2��G���(	�xH\���
Y'�5���m"�D�z��j��#��O�!�7[�^�zA?@��C-��o���~�x/���	�f#���E��e(�=����I�a�{>����xz����A��o	���L��i?��%[l����&����:v�&4��%���1�Kn���r��S=�����~�d������D2�~�_7�E�-����F�F�~���O������!�7M�Q}���9�:���^6u�/�z$LM���qA��,�dx����"�Vv���i���Fq#��	��1+uO��4�A��w��EF3,9��������P��V�r��Wm�CP����H�tA������������9��d7a�nBc�g��g��h��q
�g�����|vZ�"+f��$F����A4*h
�
sT��� ��a��+!5�;���b��)����o#:]�a0K��~d�<�D*N$k�v��>zt,F����t�:�{���/6��QS��ZH�����E;A�B-���i��\�$����k����
�;��y�P3&!���I,���
��"%��`YW�(�`��[�Lr��GS��A#����=�t|�qe|Bl��GBM���
	%}��NE��=�L�E�W���;C"����
�p��A::�1��F�{�%��]�	���5�*@��%YO5����e�*zn�D_U0�qh��V���m�`�'��x�@�PmI��U)"��3x���,('��)�;��������V�{��1f�	�A6k�h�b=����\��ZO!���|�p���d�m`C��K�^Qe6�M��9��-E���fmi��uH���0+���
#�m������0���~���EX�d$�#u�~�9���.��z�P��K*��
r���6�B5�f\L��
\��`f`�p�6����2`E����?\YCLP��,l�3C�_� ���f5�h��?K)t<�����N
���C��X!	:����������'9�[R
����&����g��fb(Xs����y7N���
n�dr��:F�������'8���o|�4���@nL'���]��Cs>�1�_��W��^+�k���;O�W5]B�V����w����r�E��P�A������,��`��Bo��&�/:�N�C���"�����Op�*oN�����]=�<4>%�c%��W����b)sS}����	/����
g�U�����9L������b�9R�`E�6|�����<4B?�d(�c�h���������@���	3��2&�z����E�'��������Pf'{��5>�^v���r�U��������h�p>���������;
;�J-+Ot������Q��cz��y�w�v/7���1\�@Y�@�~�p��������F�1;�U������%7����1V�����R'�Eo� �����KPg���M�/�b��CU�M�d	7�_��.�J-���CmO��������xE����&t�)X�1X"��y7uI���Dn��1��_���?@A��3��h`H����*��N�w�j��Nu�'����'�Q.��m�L��y�����L*�"o}��X��AZT��e�B�p��9X���1@a�u��St���a�%M�g������[��M�/w?�H}v�P�SV"�z>_���Cg�����B�����bV�EpqI��u�(���8Ob2D���3�G��Y�_�h'���g���i

��wJ��Fw{c���B5��5�W2@E'N�	��	�l�7b��Q����
{����CB�:t�$�|
����jH�p�_8�R�"�s����Hb��%�s`�M����C�9bYi|��{��7\����jc�����1B����>���
m�,>��`��'��l�5.�:����CO$2r~�=�e������N�'�����:���:N�	�����F�����`�^��>'�X�#}�$�T�r�T���VU$'�����E��wQ����If%�J�}/�1�O�"Y�ms���Q=��E��������i�~��t�E���c�A��`�y1	��^��������a�P����p��|W� ���k���kd�&��J�:��qC������u�-�+���G��>��������������������B~�o��p�5.���3�`"�j%�����V*�F��O� ������r��
�f����$k�]��(�ME�K
�j2��Ba��{���qO8�&~y�+����U$���{��9GnZw��!t�^#��#_��U�X�5\����]��T���J���\?��n�5�|��RP�_�93�t��*'��k��r�hp��.7DE��wQ\��i�d1�������w�"��2�b3Y$*	��]�{��7��,�G�eb��^�{��������S��s��Y�e��!�]���(�b�
y:D��^�a���j?�yv���-�����������!3�w����}yc�"|���h���`Jx����Qs�����(�"���	�����?�vr���JTd�����=,�����
dp�ovG�����b(��F���������WI�G&��������������������ujqc����'1D��.�+�T�]���E-��W���f���wy�P_����������u��>Ty�^���V����
���5|����6�b��}�������.��v�Zs����4)m}b�7�HPD��0���F�HGR6�����>�����+�eU����*"x�3��En[�?
%:6����^�g��
E��}�3(�zh����9��S/o�-������p��A�1���H�X�6�d���������y�����BSzW���n��N)�X�aA)Y�m-8���	������#oD	�05� A1�����6����c�U!��
o��������(C%S��5���
������:�-��KW�%��N�����DUoIp��se����r��c��J�w�K8M��,G�^J4��t�v��:=�]���f<Ao<��K<�4��G�%R3�$FxZ�����5�t����,M!�qYIOb_����am�K����������:H�k��#��>(�d���uSv��?�_n�������*��%)��_~4�����n�J��� �A�m`�A�z�4�$8B�W����\�E
��a��A%��h�^����������)��F_;�!U'{��*��PfC��]��u\���4"�b����4�:�U����=
OCvM�D�k	
!�1�/TfU�2E� �i��h$T�I9�H6y�76?A�r��['7�o�f��G7����f��9�^��<�Z�bTb:G���B���I��&���R�
d/��P�����,�}��x'�K\�X5�A�R���'��Wcr^�{"�8�1�x+�
�0�J�}5��DO�:�Ay�S�+��hk�Ixh��#��^g����~A��'�"�VK�����A���V��f0���>����#��D�q������E.����T�HX�8������D������k�3�O��J����������~��
HY��H
}�����e�L�N�4[���������%���,]��W��Ae;�!i#M�p��L|�;s~c�c��P+X��N��7	�L�����=��P~��!$�^�����UqF�����L��$HW�z��Fkp�e%��h�2������@/l�e�L��\���|~�bG����:(Ea����LT5���i���}Z>�����^M4��U�{I|'/����.�6w��h������d���5�����DN��p���5�
��W�?��Tb�+f����`�g��L��������k���)7F��+S�^c����jT����jM��wb������bP��M
���d�T*%��E�O�fA������Y��)7�=0���F|��V�r�;0��L���v��S_T�
 �w����Y
;��U�����w���U#��V�gK���5��-
��b������)9�)�k�;p�'s�!�{��I�U�H�g��J�B|��k�'���irX_P�������,0g��P���m�	Cf*��x'���s���d�tj5y��/�v)n��}�+$o)m��%���{�"����B�e5>q_����H��Z��l�'�����z��:����q�d��yK���n�w3�S���`'&���R��$����/x+�z�D�%�BM����m�l��=���7� 7��c�^���{b�������x��p�����" �� V���L�C���������������(��@�?� a�"z��_0o9X�j\b�����'����V#���O�$�
-j@mG� =�F7r�����P��^'��I���E���d�&�n��fk�wx&#Xp��?R
Y��^�fh4��{����:���I�Xt&�y.B�����P�?�dC#� �X���I�3���p��|���U�-D^��9��H�^�����P#Z���
k��������`�mq��\7���O^1n�8Z
wX�h��K��Fj5Y�hM���
C���Z��Z"���"Ut��6��m5����j�CX ��������B5TD���1��0�Y�l��C�����3nn(Z�W��&T���\����v�]h������TV�|���^1 "- ���F���������J�!2PF*B�jb"��lE�}���jd��=0"w{6�����(�����L�T��2@�Kl�p�L�q��5���	�f�V#t�&����bM��5r��)��U�������!��j����	���f4�����0��Z��!�C)S-��D�G�i��5d_�z���{Ff�!�4RG�=�[�����
q�ZI�VS.��X��D6��Z ����U�S�I����;��K��{K��[������e��]��J���`�"����Y6��11QU�X�IoIwP5��04<�c[�1��X-��������8�����
Eu��)����.Z����_5r��w44�k5�p+�^�\$�����7�)���
���������+E	�j�����H�*L��������h����^���^��"�5DnFs����E�����v�E3����b�x2�.�nPD�������9���/��[B��Gm�A���uQe���0������d�����	����w��pX�+l�9�.��c�A��B0sK@��(�Zy����`bIl,�m#�5����TTJe�-�cd�l��{!�7C���Y��.��[��{R�����������\���BI�H��\b��G�&u��wx����-�Lp�)�J��wZ���)����+h�'%��C��4���I�����W��l-C�����e_�0fu�RX�������S��u1�`�Z����'��������f���h�uE�����T���H��"s���h<��� ��i��O��6��%�Snz�������c��c�8.�-Y�vmj��V�0k�Ak�@�L�(0+�fA�g����V�&mZ4O���W���C)��{���o�������_���T������-Ls�B1���~��%+.��X9�xm��{�����R%(���+M��/5��O2C>dE��z0D4i'b���M����jF��4{JV3]~i��������.QM��I��1z�'BlJ�ng����DP��%����F�6{7���T�t�����(Z��z�o�}���?!��sB��HtP.�{#YG"Y��c�zq�_�PLZ�v��+K$��=vN��U�BN�����I�}}���W�C����M���doD�"O���'D�X����#���pX������^W_�t��V-���^W�	�D�����P����=��=y5R�!���B��C�z�ISzb���m\�)D����Y�%�]G�	�E���f�0��w-]Ts�������
f������V�/����:6�DFe�\��d[�i��I�Mj��B�cdc�M���x�@���4�����}	��(����F3���������quc��������)�Al"��a������`kv��
]��9�N�A�d�Qb.���_�>DtC�nCu,��z��}�,BJG�n&G���G_k�!�>�:q�����=��X�w����.���-K������~�T���J�b�E�
}��=�O�v���
�P���@�]O�t}���P���y�����L��Ml�5���&���tc�ylS�����l�s�G�~�e���a|�S&q�_��}n����a
{@�69#�S�H�6�l��ILq#{�F�o���YX1+��ST������g��� ��4X��yF���)�,�7>�
Q�n�������&kc
�pO�%��a���$-b�����js��B6}� ��U�X�*�K�:���?���t�Mh��J�q�bz�b0[d���P��D4�n����eB����H'��XNj�&}��ve�t�
S�bD��gY�*b�u��i�����>x(4~Co��	!����3	���%4Vd��~2��	�W|����dO�>[i�����?���iM����lxz�b5�����IvC����T����q�{�	M�f�:� �B�=Q�B���=34F��+����
�e>V���O1��d��P�(mFH�8S���Y���Yz�x�lr�&�Vzt��\��FpD3�i�*�j���:!���C��aHB��;:�&��������G��
(����E7>�Ph��%�%NB���>����B�O��c����W<>�<��c�B�$��U3�d����P���{�@Y��@�A��0<�U����"��H��j�UB���Te��q���$)J��{y����Fd�;@9G��J!�e/�;�3���{��A�P���2�a��#���D,�|gI�v5�G�Z����m��f��i����#��������[��Z?c�h�DW��cV��_�d[�?"�j�GP�?>h�3x�n�4M��1�_�}��}���������I��F#�OG����p��2���&�"{�����H/�������U��#��Pt!3��>fe�N$�ahR33a@r'�^s�����{��u%)Z������2���#{�Dh��� zWG��������@2�VB�J�����B����Y�����alc����������|����>�$b#Pd���wg�q�V�D]����0-7�����,4���|��^
M��a��Q��������������W�:1mB/��a���L��l������=_EKl�r���j�����:0|!t
�-��Iw�j���#�n��h����I�(Xo�`��#�����T�5b������#~M���O�����rbu�F�TJ�>vJ��g9QM �<B���6@�����z�Czbl���c���%M�i#�<sQ_Lu��G}0cW����Wc2��a B&�S�m��1N���c��`�A�=������f�Y�h��WvfY"�w��$@��H�5RU���c�6UX�}��������H!�8
&�qE��z�E�Ds���-�1W��
������lj]�LG�������3��k���TvSP����#�u��������(�	?�$��4� a��EF��F��w�\C�p����G�OFU��6��^}_`���'�K�@�b�m�H,,�pF� ���;uh |u@8�����=/�!�{�+w��_��D����u���kQ���8����X�����Fs���#w:#n�3G�i|`�W���Y�I����ih@V�����${K
�*r�R���5�`��(�[Ij���$g J���b ���-4�b��l_�����#�+�Y7)����2��_r�C=�g�d������9���t:Z����v<{�_�4mF������q����y��������o��lP���<�3�bs��7�jk�1v��t�]I�2x�/�9Q:;���>�3}�=
0�����}�{��&�/3W���F�W��h<i|������hv{�/}��w�����L����7�?�$��<��IW:�e?����7�_	z��#GL���-$~u	����#��������x�=�H`�G�L9g8�=�hY/�5���Z/���>��C���g���W2�87"92�����y�sR/��
@V,�w���G�t��3���*J��+s�I3C����>#���N{����g���3�Q����[�"<J�Y�%(�d@3��a�N
zaw��'�={�ph�_��2�U]5�>�	M5��I�6��P��������4`+%<�7qw��PQ���Y5 -��cX�%t�{���g��el���T���$~���g.-��m�	^@���Q?�����Rwh���������:Bj
�}������'.�W��������Au�2
�}�y���d�-�����hQ����%�V���$3HPz�"qpT���`��c�_4�G��z���U�����*������%+�GBI��)����pA���r�a�`����?n�`�|p�zE|��������=G����A�-9����.�|�Gx��j8�]c��,�a�d
��y�*����U�D�z���M��b�X��E���&�G����b4P�#���L���n�h^�������m�����l��A�G���	��j#�����[(�,0y}�Yc����2vPD���9#$qA���X�y��hEC0?A�B/���h��e^��C����~��j�7��+$��Z�p]��@�[k"v��c�,cr�@����#��}��o��
�����jm�� �T��PlKff�E�"Z�s����VNV���Z�%D�r��{�c���	����Q|��.�:��B���8��#�oq���Y#
*I���l�Y{,C�k�'��Y	��oK~�PV�J������2P!No���p��? ��'�M����X�HP��9�k����*e���@�0�z{X�1�G�T����o��bc![�e�B�U
BX��h���I��U�r%a�O���0X��<��w^�)����~l���f��5�E��a
�V&�2wG�5~Il�[�G&/�<�?�CG�1�z�}",[`n���d���f[�1�s�>����}�?�J��CD�eb�M���:���/�ukrPA�}p�����������iWu������`���� A��.^;�4��w��l��@o�!�-�~�Vd�
:I��8����]�Lj��L�+�$4Y$	�f���	�	�$�����at�|1��	������/���)��d)L������[�c�E��d5���~����u���b0{�C�M~%�j�����#��6m����Y�n��[��m�[�\i��o&������4��� ��N���Rf��t���;��������>�q
E�9_i�v�
�<��/D�b���D/C>�m��<_
HG��NZ���r������������8��H���F'���
E�{�6�m��U$:�o&D��G�S0�@��a3
�-,����i=4�x����X���3t'���k��3��H�;(E��a�k6��2EDQ��s�P�%�>�����t�����0a�����i����eN�G����P}=q����8��*����4Ha�FD��&n�^��������@�k(��K?�j���(��C8�\���	:�
Ilx�������i��	����z��yy(�M6��Z����`
��9����BOI�I*��
~vpI��;S�x�]h�rc������k�b�gu�cn-�H?�^�M�h�{��?��G�U�\�q�������U����q�\�X����6��8�=x�
�W?�qN��;�
�����w�`D,P�8%�����-|�-?����6�/�CV4HY�?�#�Y����#�G@�(���0�?�"���i~�!��I�������!0|�F�<����Z�u*(h�1�!,�sOv�3H�+V:���\8��
;�Ww`[�1�bGV�?�&Z��=z��>##	����4L�H��wled����c���t����D@1����������	��CF�
2r �G�:����n��&�o��!mCV��@&�]�A���3)��Xv5�eL��� o��������6,�f�T"��CI�wp�����p
���yH*x��0�Zy��i�\Ye�@�]y$�x�QHV^!`�S���k�1 �F�?q3�x�z<��p)�����"h$tV�(�^���x����s2�w������	e��(w,J����O��E��0�9r<�����4.�:}<���u{be���=a�3����_�%�xt��_`3Z�?[��[�03�c�����f����J��%�������7�������O��~"�(��95%��_'���}�IJ�-t���.��������G�g�Mf$�MP���`T����M~�5`UQ
��>5c3�+���I�g)��_��"A���i8���t�K��?�����W����y��"����!�������2I$���'��H���^��i��m����\��q<������=���,��
�bB�I�*�����i������&��9"��U_�0Q�gv�L�9���������q��)V�x�_X����(q�s��������v7��e���O��-�q4:�W�l��BOyDE�j���"����YH��:
�4W������������Q���Dqe�|2�y�1�Fa�F5�`R�QA�\L����\���d~wK�A�P'���pxY�I�f:�3���>�9>tW���1'��1C>ogP��1�����oh{�v������#e#H�x�o��#�+�Nr��L�R����6�����]�P��l8u��\�c`@lfQ�u�8[f!l�� Mi3{����v�|�w�TI���q��x�*��)��<���q9`��vC�OY>>�}�_<�����nA~w�9r�55�����Tl
;I��p<�w�\���;��{lGf����z#p���e��������1�d5���P���Q���1@��t�{�#����G���8��&5�A�jx����	���D��"HB��x N�������K���D'�����'f�2��������@gKB@U��;H���H����0;�s�{�>*�H�����9j��q���d�����{������oc$��;R35��G�;�!��%�&�}���{
�����#���6��h�A��U4H}��'5���yiE�l�z����{����������B�k���q���x��&� �����Y�p�9IFW�Ob
tL���X��BP�'���n�(�8��-�����?p>9����Gv�[��Cg6o�_W�%[��`��5���p�wDI��=D��d�(�$�{P��v�"]�x�Q���=����o��������:����Z[+������j����=�A�A��W�����A��d'm��V�.;�E!D�pu��A�$��H��	��$�qM�x��y��	]���P'�����y�
W#Z��.D+���������{
��Gs��d
�p���i6i�@�V�5�;H���Q��Q��|���7�7��	�O;�Z���Z����g%*��XM0��Y\�W��kQ��JD?]H0=y#	P��4�;�mX�E�0�i"���B�n����g�"��%�xGk*"�N����:���>���3 Jp��2>����dU���idA�|RK���������E�^B���`f$���1�{-	��2��n`B�x;���GB
{�"��v��g�j�����5�W@�)h�-����B����3Z ��3;1y `�N�I������j�����O��t�����a��e��Rw%!*��LS�;�����^C;3xwB{G
q
����<������w��{/d�����zH�9>�
�c�����Z�

�E��r�����w���� P�����H%�e���	�	����0��� %2������2	��� ��Q/3���]��r�����c�����=@ax�t�V����?����$��EBPz��N���|N��
��U�������g�<�OyZ�P��0��I$��*��ZX��,9"���M�`Pq>
�D#8�������6��VQ���~2$t �\	�l��qz�� Z�����������4�i��[K�p������b��j��@V�o�7?z�'-o�����*46^+��'6`���.�b~D��x�]a�(�D������EP���E�P��{����G}�"���6�CS����&]�=/Nk������\�����8{+U�b�c��v�|��t�H����E�����T$�p�C}'{B��
��Ku����G��������a��nd��Z�u\�f������1P��(�Bp� n�>}R"z�<���'f�`��-n�5����T�1��vg,D�3�8
��~��GAY���&�qt��@��s?9��f��]tn��M���\F���A��m��2J�K��:X��&��Qw�Tz��:����
j��OAAm��Z9��IY���i��n�����w�'�*�I�T���pI��I�(*n��J�=�}�3Q���"��w�9,���SJ�(�k�D�TT���0@����f���S#h���r�F�OI��y-�D�9� >��4��������Uq#[�[*K�>|'|�;B7��3���@��#R>�$*Ld_�p5������=%��Wc���	�2�1��?{��? ��H�Q��@������	q�=|�
�����T��=ZGsM�����M#��iu�<��Wb�8�C��������mB7��Fg�;.��H7��
1�$��f�qn��KW5Z'���
C���(�q�uT��b=�K��:�EHp�	����xU�B>����H���A�����Y��f�M�(�$�{�h��.�P����w��~�i�d������3�z���+�E�RV\
�fF�@C}����h8+b{3��!��f}�c�_6Hh���#x��@
9��;R����R��@���W��`RF��Q��-�-��U�NL����C���X1{O��"�(l��R�d}��TvZ������l�6�*(ck��Fi�>��t�V���g�yq����i���|�:|���s�kh�S����[-��<�1��X��0V�������/���7�>ok�@���s���\	����"�3zwS1;eW�9�����*�Z\�.�d���6���V�?�jt��2h����\�\���Ux�<��� ��:��!\�����
�
�
�/�k	`��?'mK�j������4��d1��L���Z|�N(<U�F��y�$�e\�=n\�I��T�
G�X��@U%���[T�T��c�9����K%4��l-�!I�a�����?N-Yb�����R��g�D�|�m�*T�VZ�>�C����yh�(Cc������F������B��v�R��	�������q����*<cD��*(/M�SwI�����5}z�dQ�+�{�(h"Uiu&�5J)���Hd[�q��d i�N������A���	==��UK;>O��h�F�n�U#�5;�
�p��V<�������!�����G����������\��p0H����j8RTUA ���0=E���_����pB	�nd����G�j�G�9���<9d���X��R���b�p�����Z��R;�p,�8�v����m��"��h�d����V<�"-[[�����?z�X�B;�b�dt�c�q������}�����KK�e���k:�%;����*{Q��#z�N�V$&�n����2������r�DD���D�5���e�������-R�0�A���"
�@�]�aOw�����������q��5�B#�8�m�]n��Q� J��GU��g��\t�O�����kXb��s�h�J��U���vP��{w���(*��q��C��YF�	�=����d-�c�m����i��gL�|��Vl�R�ZK���g���6_�I*��dg3�$�p��C������]���%k�%��FNv�"BL�y��kVx��[AP�-�����OT6[T����E
�&P$rqh�C"��9�������Kh@�^�at@f�8��,��Q��	�8��^$�oB?xt�����n'-`����lI�q&Ft�j?��N� 9���������&dc,x��:�'�HZ�#
d�a�I��(�o�GHsi���-��h�
� .Yzz3��r�+,NhJ ���0�#6-.T���	���q��_��b�t7���~#�k��F'�fd�B��7�;�2�j�|4=�]P3g^��Y|���8����h�/"��	�XP	#�wXA����i�<�����mGr2��9�^:�C��n�-( �'�DR��/��$�;����z�MH��:TM�	�Z�c�H��:����ODhVb��aEB;"�5k2��	qt&`e��p��������h��	�d���y����AD0vz�;��� ��o�7l���p������[h����a ��g7�6l��>���:�$�Q~�;n���1 c��1�` �!A�W���F�`xQe�]R6]���+\��E$��^��g��q�Lli��k��.���Q>����b��i�U�.����s4�>�b}��H>�lO%����W��@id)���fX�F%�9��5!��	�X$�j��������������\d��&����8]�/�D�~��FUN4���[�MK�Be�zm���Kv
Z
]@ �Y?Gv$�1���Tp�1g�
�cyKF�l���R����\�e����5zB/&�@LH��f�e
���F|����f�d.�����t
nY����m�����$�������~�S��V��Nq��������9�����.Q�|�q;�4��6�R�������
��r����f�4�}��w59�����$��NCw��GX�����O{IJ
�;��;��E>�$��	���lG��#[��H��lg���"�;QC�'��;u9�� �>*����c�1��-n�	fuYa������!��(�Kf����T,���I�����S5����_����X�H��t������L���hn���6�����d�;l#bvOEt�^��cM3|�Y�m
�i4���,�s5\F|���Uiq?%����]��\�pl�=��/R�V(Os4{o ����#7������zm?���(�qt���7�Y4Zm������`3/�P��}�6��D�2����qK*��L���-��$�G�.c���1������2���@��h���N�	3����E�!�;m���K��\���r��/J�g��*���m��W�D���c<��> ��DPr�.S�y]�w%�b�3�5]�Dfl����C~�H�F���w�L����������&��!`cdVb��n3)�u��m�CP6#��.l�i�O6v�GA��4?�{�27��&�=+��=����Z�������8 �x��)���9���?n{O���o]��d#l���=|,j������g����z6�[T���bx^nG��������?��I_�"=�����nBY�)t�pEn]�O�NY}���ks�@;���-J��B+8�o�Z��w�.��"����f�c$��E�3���*@�5uf����'�B�k5c�b_��.���.�54���}�����?�.����v���Q#�,������T�h6	��K��h���=��k�??����M
[����+��-����;3��m������#���|#�r�0
����Y�j@��<n����;��6OD��g\E���z4�,��+q�%���>��"��U�������Y�mC�{��j���?�#��d}[K���f8S�v�,�������������.a��'�h�5���h�?��4���>�����v��x���'��x��C��<i�_4�-�)�(�}$���A�~�G�68"��0\A�5{������f=�qv��kj���f��a��Y�"�%��x�7�0)�U1j�
�,q���Ae���f�T��D�@�Q� �x�KI��3J������3u4r�p�����$���/��l����'��;��d�@�����}?N�D�uB��@u�A��`T���f���w��G����q�JZa"�n��h!�q��n�"f(��8,�@��F�IX�Q>_/B1C�u��)���u��%L��VC� ��l����?E��UE���6�:f����{D�
���m�����g~�C@H�v�y4Z�@������kEL�!�����3z/+e��fx7��|p�r�NI5q��jf�3/BCt`���>1!"��Q��#�����?E�D'����qT>���������xM������5"���������R�!T�@�q���`������F#4d��EeD1�A'���������� =#z��@8fy�C����J�K���a�����G�lF+�a\�g��_xx2��a��2�q����M����t�d�"n�p��g�;�93"�e����� ��5
��H[M��a')���>#�/�%}	��,	fd 0�M�6YH�������{2pY��#��A������;/������a���vG�DqC�GD�N���E�-����w��2��]��T���6�vP�E#5����d��SR���8#���=�"�&��5���a
FV|� �/��	��E�������2�+������
a���������~m��g5��I��S�	{�C�Gp���
�D�!��g�^!���w���B/�&���b��N'f3Mp���L{>cY�	3�k8����=��<8����^q�����/����e��ig(G4k�����)�c
� ���������
"'�fW�-�)���+�]
������]��2��
���z~L{FE~3��
8"t�QBG��tp�ItQ���y�U�bC�"Ev��O^���,W�'
I��~�,VuG�LHES~l���S���B�;r��e��:
R�W�_v�r�!Xpp��\�Ym�]�/;��{
� ���,����:6�����U����&������,rp
{�<�'����W�f��0�Xr(�a
�9�����{�����Xg*�iA��jw���U�A5z����p#����O\R���3��#$@��7��������h���S�DS�ru���L�4����A$��8�v�pAS,����	�GO�?�?���d���H�l�Y�L�]���=,z��9�t�w��$��r&��-("�h:���c)�t�v�B�~[��n��g�8�wia�������Px���Q�f��e2��@��
�Q��������n�9^�cn��Z��MA4��*���������������g�4�:�|�����)@"S�N,�r����4�IM
���o���*�o���h��!pL��F�-wW���2���>�='!�8g��t"�`A[&��Vv�s&������4�%t���������o ���F5��D}�i���M���g�hS8�<�e��y�(4�(��H*�H`G����SQ�D7�dmE�\�������j�������	A�g��M�m;�'M��aB��_Y������)%�>�eK���f�����q�YQ��m�hdr���<-�p,��O}��������7e=`UE��L��|�dl3�=6���O�;?�'��@���j����g��+S�����M�c�������E_���D=�W2���h�Z�%�� ���B�{��OPmM���=#d��e`�L���Y���3C���+t���YVKT�����p�a����y��e��K �-�}�~k��\�f��5�����ZP`et[�4=h���wt��a�"��	�����eqK�Zl���G��,�G��Y�6L�U��=�*6S.F4R+ [Q3l�Q�j9�;���O-
�����u?{G���\���[N��]�o�%p<z��$t�g�F�%<��G�4R���_(�s6�[�G����=K���Q�o	�������9$�"U�=�BC���~	�P���rT~��f]�*���Du�j��~*����L�
`}�I�'�6��Z*z��B�BD� ����G�%��h7�3����K����K�N�����R3��[}�9�G�*�e5�#��s��d���<A���,9SE���-��x\��h���%@�<�C�[�B�?W�;"�.�x��3*O�P���hu>��F��������#d�e4#�?���^�c%di�@F��/apu!'�(%p
K���&Q�
o��U��hr�$��i7S7�a?c%*�4��|������J��������������e��%,���,�gY]�C����Z�[:h�ng�'�jO��B���W0����"�������}|��=wqD��O@������Q��b'�% �)�g��Z�Qd�OB
�S�}�m(m-#�/gtg�L�ZD�kQ^�>M!�zv�����1�`�������D�)g���#��`B�<9��Y�?��;�,X4z��CNd������[$i\���8ym��� ��y�t�`�)k(R���Q$������E�=4��:���*�fGp_���h�K��9#�g� ��.N7����Q<���v���,������
�}����h�4l��U.B6j��}��{��_��iP<E_�M���IO����?�d���|�
9h;��>�Y�oA�d�w�������zIO�����x_��{�Vi*9���d�������y�o��F����"��l#�r��\`���p5�����tq��P�����.��z��W����h�u����@	�#��lK("`s[.QhNB�9���9>O��`g'0���;���mk�bu���-��U��+��[r��xWWp��y��r����[�eX�h�%��o+)"�e� ��PG@�T�Pv�*T�r���������h\��d��$!�w�h�&���~�-�P�������Q	�!@��n�R�vsx*_>kLm�9��l����D�T��
�7���7�^�W;l>�6tOQw`�������xK�����<pt�0���m��<��g�	AJ~����� g�����5r��N��t&��7���#���
�o��������2QG�@��@���n�#I�����UG|����L0�[K���^��E@s|��6# n��);�;q�����mh�|�X�v3[��}������n���,\�����<�3I�A����b�G�B$Sq��1����MN��zO
]����+��V�JMO�,�{t���-�adk��*ZQP���Z�l���S�?=Zh�8d��.��������oU�L���?��J����D��=bA
@d�@	~t`{���),�u��������>�����VY@���b��m������ �?XDD��
�{sn�
E�~��Kg����|bPA����b��B�D���N���&Q4}����,���2B!x����-��v�<bC����s����(G4�m�V��)��
"X��hx�������Q@�������5sQ�^�\B��o|��������N�fA���9
"a�[��D#b�l����F������53;�-��h
�B�1'������c{��%���EH��N����|1��	���
j������	��!�m��$�|�O�Z�L�>�>8M<XXZ�_��q�P,q�����:xgG��S��nW�D��{<�mJR'k�NgC(�������-S�t�S����To�|6�` ���&�M=����E�H-o~xV��	�AG
�vf�u���j��/;E��I��@kQ��`���Jj�q�Y�j�Sv;�^�?���t
�%U�#��d�&}��8���(�N������^h��5}g_�P
VR6���{�Mo�l�Z$�;�6(���%9x��g������c������O3��W~�D*=C��8v|B2,�#�y>��@�Ir��O�����_����0���u�����:G�E�z��FOh��szt��2�uR�EPp�H���t��C2[��c ��3�a���}������P`��>l��e��a2��U�Y!�������J�c�?�D��p!���!�G��:M�����5`��O��`�0q~��)Z4PZ��>2����!�u�&�ho���������k���9vr2���}���iv!($�)���|A�i���ft�����{1q@t W��q�KMv�l����8&��*�u��&#/�
�����uET�#��eE�@������6��}�B��~����=�����1����11-T!��9A�t'�g3Y(>��fXY�c)C��<��(�c���a�Z���N�e��esZ��c7�B���f�LB�7 �o�+9��Cp����M��CVw)�k>�N��!F9���g�8PJP��<B
~�Y�fM:��f�~B�h8������%��c�~Z���+g\#Q�k�O�	}���
:8�V�[2��=P�s~�wN&�{MDhi����������B=J
~������R��5LS����kV&5�{��+I��;�m���2D��L�{����2I��w�6�
��0�[�O11���UA�pS��	�>[����Q��L�C*�����8�����-vk[���vn"�~	"MX;� ��}T������bz8�s�^���^H��}�;A0��6������z����8�Zb�{R�>5�	"�&��w�l0��Z� %'��w�]b�;��Z�>~�/-E�fr�}����Y�{*��{��/H��g�8��3|��6�l�1�'��B"���Z�����'���6�R��KD�u��6"!	��$x�;���;���%��U������7ov~1>��������P��:��_�)���� D�����
��lx�*�(1�(�D��{w\�������h�d	��#3=��#U5�{�Lp�����Bj�����V�p���3��o�_*��WM���2;���c!��6Z"�!�R�#�L��w�E5�9,%�����A�f�p�; �!�z&���Bb�n�}��VMPN|����F�t���t�wQ���iI��4�Y�t�Z�F�{���\�1�d;�p�nd�X1��rg��eB�����B "��w�6S�AN��6��E�hFa	����e@;$�`���0���%Wx����[���>�D�w�:#8yc���+�w�kh��1`1��_��M��)j�x,G����+��CO�w�vY��`���I$\}/��q4�J��6#Rz��$�>�e�e���J@��iT�g�����wt�u��G9��������!�S�@4�lS����K���VM �w�M��W�H���2��

����D���5��#��du.z6%��:����r�{	����c)�^�����V;�]����D�E�8��/��cs����Q�eS�BI��w�cZ��U��t-�)���E��-	��0
�`K���3D���"L��<���X������Q��,�F_r��a��,V%|^D�<�8N�����v�B�D�w���vGWy~g9lR��Dm�"�!��,��J:#	P{�k�E�"0A�x���]�!H�x�H\9��j��B��w���	�v�G��"HA������,���U� �Q��;\����7�C��
����i�Kw��I�d�p��/�N�9r����^��-�f���.m"?�Y�$��9p�$�#�0��h��8�An|��&nk!��J������:/g�l������n�K��XG��������iA�T�Z)Q��|��
��L����
����fh���Ey��X����2��j����=���bog���6�-|�=5(��`��Q[.��?����Z���4�����Q�DL�u�������#>;H���]�����J�P�%����}�3j��.E������r��4�}����'�����SP���"�s"�bFz)y�c >����tEn�;Rq�^;)%\�Y�=D:�w���A����O������c�����}1��z>��J�y��a%�*���;u�W8�!���"�M�i������P��E����)-���fJRP9D��^ g�g�Uz��{F�b�
������L!tX�H��wg���l6�Fy���,:d
#����#�W��}�X+��zVc[�������Av�n��/�������]`98�������("��b��9d��0�MF����@�p��#$�q�q%2�xG�r�;'��le�
�,���,���
�����=����j'��\�������"��e��E���h���4���;L5���
���#��,&�cf����B�~�{��+������S��eM�f���Ys\Lgl���`�!k�}VH�Pu��^���~�.��,]��R�~H���w���l�h�J��]�>�@q��3UD��8�4�������~��u�
�`�8�����&��
����P�-���R� �]�v����G�I,Mg
�����C�Y�xY���>�����q��JA�9z����������V����
���|R� �\4�m�t��QZ�����Z5�* m�^V�;{����h�"��>��k�9v��
���,�j�e��Y�R��;t6���Q��:������h��������*f�{�CT����h�}RD��������J%�lyG
�G���JT"'�0^���h%H7i�Z*O��:�m~K�����F��T��AF�J�!Z�-	u�RF�Aj��;�d�MK!5Lx�����2m�	���T�m##+j��/[���V�u�p��$����/�����1�PMi�FoE(�u]-���������MQ���aa��+At�?	R�����/���P���T?%�9<;���9��fJ-�O1�;��=>!���`��j��p�@F����F4�~��.P�
� ������k�������Ow+��U����*��������a*���@���k�4������c i�j"�"�W���Z���������f��<�C p*�'N,2*��{r�}��f��V
f��������7U����*%��u#^'������j��M�e��c��jc�xK�{�;Y�'��~}������,��hj,����(1�� �$�E�
q[�����rv�3X1���rj>�OH�44=�m?B��d���Z���Ou�NW�0�w�� ��[����BD�}u����kqbC��|^K����&��y~4���f�.D.4��<Dc��������H%��I�p������=���_[g�6���O�L��wg'���-��{��ZeMC-��l��J�kJXK�V��8�I�eH�M��BF�l��W��&e�u��b�	Khp=0
��N-�a��7��#u{h"+��#������d�7!	�Sp0��/�d�h�����Nt�jV6y����qL�R�9�!�Zqo��D���{�V����Fti^��������S�)����8f�q�@)�S�0�%��Z:�bB�}XcG��l��}���gr��&|O�.�k�4r������C�����������pZ�i2��	Q�Uc%c�6c�d�V�G;�Pj��+:p�/�!zj�L����c�9}���l�z�����>�
�2�L#|�>�$����;l�+7�p�.)��)�%�i6A
���G)�O�J���K|��=\�����L���-yA���:����N����0��M��a)�� ��:�������{���E�l�"qi3pp��Yf5#b{5��)D{�)v�F�C�i�����Qf�h$��F�Mh��������Q�eU�M)����>At��k������-�l�6`��L	��N���"�Ws(Nm��������	}LRq�=��>��I�E{��d��{����L�>R
rZ0A��L����A1O�(�5��q�{Fj�,K�n3���"�@���t~�h��Y�ba
���4MvE��� �b0�_�A�T�w������x�<Mu2��J��/���'����=��7a	���Cv�L���c(�h��'`���!�m��5�c��{�����P�c��I
/�`�A
BB���GD�h��)E���d�O��e������Hk���h�R#�&���|�]�Li�m������H.�?�w��������%k;�:��7�����V�B�f������\�V*��ir01����6�f���1�����	����oQ5�w�����p���M?$����K%�QL����'��L:�fE�t\�>3"�w�A��c����n�Bz�n�
<bj4���'����Hx�]f��������aN����{O��`(� j��I^����6E��n1D���[,��tR���Sg�\�����>�]�2%vn�5��lp��
���[7dqg>;�*��f*L��f
��[+wkC�����yo�[q����F�MX�i�j�~���i@��C���D4�^�N[)@��,�	��
�����n���h���#F�t���/j�wu$��N�f��n`�>�In�L����
��O��ua(�*
���,�n����R�S�Mw0�*>J�=�`�@���$�B�;�U%�����	�����k�&��9�����M$�F(SCg��h	1jl��������Yh�H��4�-��6�nt��c��U�����.�=y�^�F
�EM5��
��7~mH!�K��s��g��v������MD����KV<,����K��
�� ��I��8�
-��!���~� �M)�m"��������vHB����9���l���M�{%u� �d��?fN���aK���xZ��dW�G����3�l)���5K ��A4����Q��{!U&lD�i��2#;s&�hc���m�G8i��-�DzD3����!�x{����dF���<�������u��9��{��4��K���ZSr��Ey�� ?��L�J��#Zq��0��l
,�&�U�o���.d����?���e)��>0��t�-���@R������e����kh#;������U���������8a�W�^��>�_v���'8�E��}[D�&A�qy����!8]P���h�`6+��@���VN4�}D���
P�-\"�z&�%���M�n���Y�"�n��r���q�q������N�m�����:��C"��. ��v�6�z���&�����i�q�NhICX�I����K�����=C�j����76�"�@�
AM�dt!A�Q�a8�����_�i!0waj:w�A��-Uk�
g_s\���+I�8�H��m<��2vs4�N��{�B�|F�Y�&4�}7���`��?bG�!�C,'���>h)�q�+U�� |��3�������������Rf���4	<CWMI��'Sm��H�ZnG�d�hqe�����������!��z��t���[���f7���E��!��������hw������oW����,�i����!�O���BF9���!\#������B.,��������X���>���d��l�8���3}��y�u�:�HC����m,
��$mL�8��G(
w���iy>/���
&���,(?�rp� .�
-:�!l�%�^�'��C��f_�0L�]�M�[�v��xG���� �!$����X4��U��c=���c(*R�l�;��\�h���H3���NX��a|`A����#��1���/(���`f���p8��j=���LFA$$��q����E�p�Xs������?;������pX����m�r��r�����TAo�*��C���}�q�d�zL$��E�i��l�&*��hRH��@�1�������Q�6`������H21^�f�^@S�����O�=E�����oG�e��!��6Z�D4�R�������`
|����.�)q��}1@�Hm��O�8Q,�~�K6\g����l��J������A�=R{�a�"�j!%j!����y��NQDF����A��,,��JG��A�M=�"�TD&PCP��J)�Q���G�"V��	{�y�i���T�H�2�v���r$��wv������=C���.<p��jb�G��8NE�>�cs�n*'nHx?�B��+93~�F��x����vP\�U�X��q��#���Q�6�>�i<���yHs�Y�Lc�q2+�3+�K�v7�����c���*�G9I���p1�K��Gfw�;M1��u���^��;���I�����~:5V&��0����"X^��M#a(
1I����,�gqUn�/�`��#���=��%I������D%�t���L9(z����4vT�N�X�bL5��@��&���[2���,��-��h�GDKt!�G���Y�������S����+��iZ�!?f�Mw���Ucp���iV�����d�e��Y�s|�����X/����������w����f�m6Hk�(i���U4��y����3n��`��b�G��i�)NOQ}7��@��S��p�i�1�"��l^�������pL����C��Gh�`�~D(�L���$=��GXEf�5m!EgI-�i���m��
���@D�9�5��R8'�b^�����h��WCX��J*�"�����j��X����:�Co�w��|Zq��%v����,�����������������T������$
x�E�vS�M4�q�� |������$oG%��9�f�dS=�af�����e��C{� �)��#=�Q"�qZT���0��581��V]�g���BgF���2KinH:.Z~l+u��������Tx��D6:��-�tcS�E�j0!��&z�����!�����<�b
�����=E0k�'�"���/@�u�;��f�����Y�!��lnR�D��/������kZh�	��`|�;4����#����3�5�~S���C$�#dt�J���J����K��YhA_��/�
�R��������eh�&f0��8�d-�S]�l�V<���d;���S@t���|�*�Z�����)��nN�����b[#��8����g�M���*��mC�����i���2�|@�[�eE�S������&������3�i���v1GQ0��Y�Kf��U3�B?1��S������1��e<�v03��%,�G�$K0�".�Ql	����@\��-��E��r��SLr�:������^DIF��%������
Jd��q�)�G�Y�
��c	�.���e�)�M/-���5ZWq�!�*�Th����"Y�m����z��<O�RM�`?�HuZ�}v	�@xp��i���#�Y�/���@�le�r�N��H��d	��c$�}��C~���N��R��{��~�?����9�e�CSq0y=�!/rc[�����L
�>gb����������'c�/gvu��={���%�c+�#�~8��n<2������-�@ ���v9�;��+$<J�������������2���@b�#��r�K���D������,���� SGwn
��������� E#��`����mM���Z�]Ux4Ph����p0����]���+�w��������|�Yd
��E�VSx�DncKp�4�j������g��e��u�����������Q�|}P���	�Y���w�L7�����IA�u���<X�����O�`p�1�P��(�t����V��wXgGZ!!L��\k9`�~�5�P��D[P�(x���#�Y������	�rQE�sa�K(G)1�t���^u��r�6Sq�Z��G�K����D�l��:Q��L�b��M[E�����Bs77Q��c�IP�����W�b����"! �������n��c�mNZ�L-)�g�?
=m\�5���]wm���l�8S�:��Dx���i��-����.�Y �����)q�a�F6�,�@�����]0��^�1
��C�M�J�&O<�M��xm�E�f<�����o	sX�U�:��X`�S����K�C��\_B���DE�~>�������(jCn�
3I�=���+h}�B��0��/�YZT����',&�G�F{��	z���a��������{6�!��-lK�,3j?f���i~�~�b�9k�gx����� �tD��d;C~����f��	�s���v��b�c�r!��������I��p�8d���z,��sH�����[����3[���`JE���U:)��\���<<����Y�B�V�RO�f�VH��]]�fT�d�)�(�i���*va��E`�v"7�}��q2eM�~�8M8GPOD��-H��!?��So�v.�)p;P1d�[H���
� ��}��`v	3<��fl�(@��}�Rj�z�>G��g7�\�e�����8�R�����ln���p�#����������;��b�^Q�l-���%5��K�3k?�W�G�N�
���O�uM��+��|���D������#��(y����p�==��L>���vwO*���P��A�].�+�����)w�B��M�G?	�o���(at
a�w7Q9���a�`���v���}��f�0���Z����0~�"he�Q*D\�D����0��Y��w����p��[P�J1��'��{��
���;aO�@���n*0d�'�co�W����6K*��d~������Z�A1�H�^/����2�Z�^d� ���S��HR5�D���(0{����f)�[�0��pP�U{�#���::���Q�v�^5b���sWL��$�����u^����k5��5KyJC�� ��aW��Sf�3��s�7#�!h�
����6���04���gRA
��%�d��������j���a���~ll�D KQ�6��(�8���9�U
N��6�
3K�AVU�%�Qx���E*�(� ��
��!��46�.��Z=��'�E���g�������J�c"{M���z�)�g0�<�[r�hE?B*��:��S;�w��2��3�R�0��X���0LTzf�r�L�4{�� �)S����O���L���1A�����3
�(�qw����*�#��)vo?�+{o���v���?K$���;���}���0�a�r�������q���#r�=��j�����;u�q	�4XtQ��X�t#Y�O��,9�a�{2����O�<�W��b$58N��-�R>�"��-�]L���G��S%��L����M��-�8<�D�e�IGIGu��;b��8=��g���iEg�#XB�����dm��fjI��.���}���K�i�����'�f�?�)1�b�4M�X��?Kv�:�3��X��A@}d�p�U��!�1O��5c�a�������������}#S{=�q��r����Q��l�A����c_������=�����S����){ej�n�a.������^��&�rO�Q��|��A�X�(���66S���f������-;� �)h	L�W:�`�D,�#��Lvn��o�H�����E����~f#%�);��=������vwx���_K������	�#M�9���fF����f_���{����?������I��Y��#5&1��Q[�8l�i��^L�s>�>&U	:o�8zB���#������	a$E?�1�u{��D/Dxp��Wv�1�P���i*y_��=�u�����q$E�����Q����K[����U��N8�)�h}I�v!�Sr�6�G(�N@,�a�������G���3��l3.����i���,����,�������',�i����4,��s3����W�����������=)J�}H����%8�ds�������-���Rr�}��A��~�����B�*�n\��]��]���X>V�Q���0�Z�A.@1"Q�z�]���r�����;P�ob���m�mq$s�)�T]�&��E�����8��8���#(���;|��=���;�#�����l���*�^"�z/d�y��c��)����z>���T�&��;����o����X�����;A��}S2�*y~�@G��l5�5�����od �H1�^h��,��$�����B�F����x}&J��:���l��HMI�m�e�R�����fc��x��S��H�Jj��S������%����l��.M�j���9G������Z7�A����lR^���~�~��Xj��~G����W�l�XtAS,��#E���������~���7a[���f�s5���4�A��l/m�X$��l�w��N��P�w�{/����[��
�p6����9��~��B���L1aD����4OW�Q�]M�F��{i;M��w�Z|#�%��B�	,�����Op���U������.1���������
�S'��|��Ofu�t��43��~���.>�gt�i�:(��./��N�w]E�`��n_���Wc}��`��V�D�����XJ��cD;4���Xo�S:Ig���Y�������#����r�� <��u�^�OB��O��{/a��h��������L����4�n����`��M���p�����X���{!QR����t��lZ��T�Icr�I?O��������@p-;��^�o�p������J�����LL\s��js��Y����p��*n���nqD����*�a�j!���`u;�g���X�.B'�S�?#����l�7�����AZ�vS��du���D���%���_�\^�AV �8�;��2L�Uc�F9�d��`�#���N��n#z�{��y��@�(e����6�{�#��$��{	���#����g��x�[2����m�{8MK��lu�� ��y8)�8Y
�=��O�S�P(q���4DkP��"�-D#i�*��-�5�>��!Gy���S�?�5|RL�D�hQ-�h��Q]����h�,U���f:,zh��w�H����9D�_�ux���w���PJ��.�@�=�BhzP�e�_�$BdC	$��������?G��U�v��2Q�"�y����y�;��c��?��{G�u�@�!J��.!�����J5�$��	�g��U`p�����vA8�aU�D��R�cr��tJ���J�C��� �>.���Q��P�T9s��`k4XX�<�A�*���":����V"�GR��b~.��E��	���}�9� ]k�3�&�)?�cn"��*�p�L8��8	��&#��*�����~��D3��	R��c��
Nr�

���O9R/��
�f��^�#O]l�-m�;EId�t9o;�J��$h�%�{!�#�Bq6g�D��� �Kr(�F4��X&<�����U?��=#)����P��9����@b�`dhw�����q��pq.��r��Q���N��z����m������r6���Lzi+�/���\p��iG�|�"#�;��$�����E�x���0����B�4+6n"� �gC`#��q�3"��
2��F#�����D���P������9�%��@M�0t��Wq��h6;�:jgK$z��a
K5D�<��F8�\,������"����Z�]���f�`8��Tx3E�1�����+
��I�p�����E����1��:�/]�:�^���sp����%����z��$ws&��H��S\���C#:a�6:��~G�������E#"��\(Lb,xaH���'��m�Sf����	v�J�e�+!�|�hY�mr+"O�U>������/!B&"��*��Y���.��@������2���@�F�AS�L���X(������W@!GJ��wH<���a��(!/��"��(�#���[�S�h�����(���r�Md�������7|'~b�^B�k4o��$"!Du�5T���_�B`��C��:�	�����P�&P�dw���=Q��C���w7�EN��+��i`�����������[�Z�U(�����_���r���lK��
�n
{���Uh��.����.�H� G��O�x�@ ~���H�VBA�kc]��;�=9h"�`N7���u�A���B�F.�f���U���R6;�<�s��;�T��!:�Y=�����Ki����#���&t7P��N|�����Q
;�L���&�L��V��!����f����H>X;DA��6�2P�k�xw~����uU�
�GMVT���U�&�W�����y�7� ,���k�B�q�����XA}+��G��I��W���4s�Q8�_���ZA}�����!��Gj
Fsu���������	c ��3��-6@�Yc�!+h�,��O�?Dq;��k��U���M���Vi��D�����9+e;��Va��"#�U(L]v��o����r�@?R�[�_���HoCfM���T.� �%��/(�/�4��
q�����mX����`�3|p�0�*1O�
T��8Bo�7�&#�TGM��������EV�>������Je�a5���	B����=I�)D!��-�k��
��R�g|�/��~��R����]�����j�!�����q��������~�H���ae���qz�����[����ryF�p5����h���"�-;k����,'c�a�I�����g������h�����#�I�����';�
����W��$%>��}��GG"�mv��Qd/R�KY$-O�L�/���m:���XC��q�������Y{/e���������������N��1a$��D��J{5A
Ys�9�Z9���|	�!d�V��k��`������wI����M����������jz��<��o*Y,�#l��W0r�uFZ�����)���S�0��)(�$�5�q��������(>Q�j<��� ��BD}l��3�f���J����p�(po5�
Q��j���Gk��q,���kG�QZ��v�@�A�M�W~��OPW��������Ln���o��g�"p!�5GXkoA��6 R�4!`"����}v���  �D����������&��`��n��|�*�f�$�#����w�����S��M����	��#m��M�B��[���	l�������[���G�jF�j�Pp=�=1�mf��&�!�5�%�Z��[�������f���E��m�� �9�������I�'�E?2���E�����ag�����������khz�� _���.�w��e��2p2X��
8������&Jl�������8Hs�S�#@]DxV$�m�J��/���9;q^m��������������Mx0�#�|F�,m���F�B
^��`S�_v�gkN���@��vWB����������po~f���N��k��d7�~���&X{�I~nK�oW/������g|���&��H��V,s�s�jpf#��V�^3�0s�k�"��p�>CR�"��-���u�G�)�P��H��M�C����O��Y��n VDNiF�^hUS������"���g
���!�o8�Q��{
�w��>��
EI�m�F�}����-��~r�r�n:����	S�� %�D�c��";�f$�qD�iNr����@c�ul,j�_2l���	G�Y�%�@�'�HF�c����oPz�u�e���q��#���X�$�U���i�d�;r:ZZ�:�x���o� ���� ��j�qk������w��|6���JV���Cp�>V�t�Nw���������C0~OvN��2��Y��%t�)��q�?�a����W��n�j����]K�����61�T�g��-�z8�2p�p"��l��+5~��z��������m��0������H�jq+���}�Nd�+��]�`�-�{�a�j�Cw�������IeE����S����h�2�p���\��2�d������O�=�����:�0@0x��w9��~�m��s�i�<�\(�����Y���2PfE�Fo��A�"���=�x�����l�v!Bz7Z�u,zB�(�����P�v#�C3�tc	��
�K2����a�a[�7�M����0�!���#������$�����?{��EeA�����D�j�EN_b��}}Qg*Z1��i'�{���b�Q�t5��� m@��r�v�~���}�����XA������Y�����G�M����V7,:���4ws����\���M)�\G���;�Al8�RgL}z��~{���;����t�S�%B��Wmla���-
:��k�6�y"����'�/{or�������-���lP`�t��8n!� �
�s��O�l���9y����#��-�b��V�h���)�u'�blz����������EEY9���1������:�_��>��w5��^4����G4��GG�4�XYIe�� �GD��2q��w��A�_pd����W�Kv�h�����_"n����n���u�����S��������W=~�:����cx�������T`^f�Z��	���N�XOgA�X5��0�X��!����t�<�h`���^s�7f�/NV`d$���������H��Qm�C.],$D�Eb�!k<�
��h��������,�0n<��
;�������n��uZD�.5�-y�F:)����B��!p�DG�!\�ce�����m�����2C����3�����4�a�E�^����9�*S�
�0�G�+����>��bv���1H��d����B�,�+��$�����q��P����:b�bV{�
zT{�7�$l�U���pBs�
'4G=�Q?���i*Te�EF8g�I�+�����m�VD�������������[��fX��k��D�a�ATm�$M�A�]6\�F^[!���*j��~�P�����!��������f�	��h�% ;%[�px��g�}��{������Y��q�[-��������AC�0%pSzr���V�������-K���
&���#g��!8J!{m�Z�50
�R�E(�8~y� h6H�����d����w�O�����G`���Nj������tk
 ����2,+n���[����q����p��S���[�k89!:�84!�U���
[&&
!%��C����V�P�4V6[�
�#��;?�����Cxoyd����z}�_�u�p��
z�W�"����D �Gd�7������]����c��?l�	�l�5�g��e�x���5:�]����n����X��T��[�Y/��)e��le ��\��7r�[�%���*3����p(
`k{v�S��v��������5���sF g���p�@�^v�q�s��	O o�&i[�z�a
]�|��g��\�V��J�.�%b��c\t��{��c�~�f!d������x�c���������`wx/�k�&`��&�Y	Q�j>g������vuhOZ�M���DRak�%���SG���T��U7�2Y����t��h)��9
:��N�xn�=�������~F^��o���d����l�����;�/ �(;%��V@��5a$���J8����6z�e��l�0��l�$�I�2�!�l�&�]�wtr�����%���d�|~��*��R�!�>v1���}!Mq��$���o7�.���P�nBb��+0#��y�V�7S�'�y_~4X�,n1�& �j��DcT!�r>�(�r':�L�"�]����>6!Q{x�?��"������ph%D��)x�VM�1/�����l-s�'�k�0�$�5��f_���?'@��5RgO��������.A~��)+k�Oa	X�����L�4�v
E6�J����-������-jN�;5|�zD-�NA`������)����!0�T4G���u{/���=�f�L�"�"��os�H���NJx�0�u~��]��TR��4�p'iw�����>mZt�&���4
2@��U���������j����>�"9���[��N�iFx6H���;m�-���g�!M����D��U���)aE$�i]�h�tn�`�����t8��po���iq����>2��i��g���/�������z�y����(����*~'�=@��&���!�!Q�0��K�h �h:kW�����H4\����T|���
'����E���.�I�Mg�*z����o_��	S��A��e�������!�d �?�����)���,gn�Z����5�]�E"����R'���q��������(�h�u��������ke������V����[#6��q�������}L]�5Z����[y"J��w�|p�{ �qpV�V�5L���(���=��j)�����<���>Gx\NT����	o`��:e�H��T�(�.�7���4�Za�6�C���m��j�1?�D�7�r���z�&�
��D��e]C��Z�O�P)*��P��"r���1
�$���[��.�����P�3����Y[��������j�K�*-��a��ks�b��@q~#�z	x8������u}p���!����~G��������"^���I.W5J�
l�
���)���c0n�a.��Mq��T���Kh���H���6D`��@�Mc�������UR�t�����
p��l�c���v�;Y�{	T�h��vf�x�[y�����$��W�]���t%�C�ZTh-a�"���[�6����2��h����f}f�����k���m�?�����v�X�[��;:��������SNC@��5���ok�y���}���%M�Z_��1Ci���#k������} ����Wf2�$dI��Ew�����&�r�A��;�E������r������c����35�B������!C|� K�6�W3�d9T9j4.C8���|�wu[�9�\f#��%�e��u|���:��k��/!������}K�������0�%��^7e|a���eg���,�s	-�����%s,��63�2��p�*C��qA���������,M�v&v^V%���o-����o;?��++{lbT`s�T�lc����L����0�p��r�gm����o ����������ag�J��c��tF��Hp�isG}��,��y���}����=w�R�n�4l�8.yME8�R�g���1h������-�	��l�u�A�����l��	$��EH�����6�ry^5�o"����M�������O����Y�Y���t���l5�k�"���Z�#��K4h��
�3��������Vww]�2�`�,j���Z4��Ew���%+���O3rY"V�)�m4�>��2`�/.��l�m%��>.[���������f?\�����3KK�6ygd}����K>�Y!���+��`v�h�E���MG�U�~��������f|��
��y�*�����w��D�ue�������p�����mh�tK(�&��k;T�E�{�E��]-����p>��(���fbG��?�C�<@b�5��'o7G�E�����'	����j��g��-���Cp�W;�U�a7�y��%���Vj0���L+��X��t����#C���L}OD���V�(��2z�=��dd�[��t��$�����T���G���BP�g���F�K��K�*�luf �J6P�+7�.����
I*��D��=DHC�h���D�-� �`�DP�L&���$+,!K����������E��<i������th��`<��'�a)0���=��o)�oi�$13s��!H�y8��M���W#x��(�K����hq��5,����}_�����"�bT�0:�uD��a�(%�&�����������MAP�YoZ,B��r�i����0��Z="�����:�gv'���:v<�9�^* ���������3R����$�@�N��v����T�����T��3�H�>��:KH#�}�5$T���#6���f���JE�,�D w"?$����X�*�m��[ ���*�z7"�l'+�����uh��tc�-d�\�X�n
���-��hPe��="2�6�al�/d��@�;��3���de������.}0�AD�g��m�=SD�?�8�
�l�5[���p���Y~�Q]���������i��SR�Y��Un�5d��=�$s��i>����H>���2�,��EfE��rqoy����Y�cB�����Ft�h	z�����z;r9�_��-Z�q�|��jD��S����, ��F��?"4��g�0a2����t��3��D��D��
lf����������,�>�=�#�cG[��h)�������1�:��[��-��$
�8�: C�H�~����
4������|�4�h�jj��@y�AOuRX0�vZG��?�8��Z��;��30[�H��{�;�����p>�C�.��	c��!��!���I���'�������EF���)Rt*=��vH�G�FL�4�f.G��U�G0'��3Os�-':@Dfg�sN���
K�L�p�E���F#�e�;+�6r7���O5
�P)���t��df���G���n�������YAx�aW���h��YG���2�����%Ns��`6\'>t�Y�2L���|�F4H=�l�}� ���\re,���o#p*]�h���v"&�1n���C�[4��Y�������qls8H����F�~��6mm��q�#�"�v%�xg�	��
��i'���{�Km�N��=�E��C���#}�t�g�����1���������&�1�A�u��	�$;P����q��:���uj�h#[�?��}�,�^�R�|���g��v B�����-���c�g���Zz�M��7	68<�0��l�B�c���m{��*����v�����#��)���M����/����K�
*���,{�v����@ ���������c������r��)��9]�hz�g)["�mS l�G$?�ZD�n�����#���vW�9���E{0����<���~��Tl,�F���;�%Oh)�t�i�t)���+};I��'J�&S�i!���.@��?���{!o���h�.C$���= �547x��\�GRZ�?��h��}���-9�����������J6�W�AZ���
D�jH�:�3�#��I���T{��h&E���N:�t��l;!f�^�
cr(j�����&�0�(��^����
�e���HWp�@�{!����\���{	�dk���{
Y�#��f.�.����d��{T��z�����=�Bw"���Z�6�f����/���;�wVE���T9B9��",
�x/��T���
6;�I5�3�{qS��y��H��?)��z��DT!��h��������������>��U�h���9|��?�s-��_J/'��o�^H32�O��f������#Eg�1�e�(,3{f��@��<����x���9��v��is��������x�0�w�]+��F���6\�2�4�R�q����������l��g���tE��*1`l��t����%���:G�8�C���������!��g���t?��b��T��P�Sd��3����%[���^�o�u��9u�f��`�#R�t��L`��:�A3Bgt?��F��Kx�I�>�AN�x���(�X��5�;���(�������T�4V���&���&A�H�Uj�5|/��v���P"g/C���-+������\�\����X����.�O�������Qz�~����;Y6d%��g��Z�=u��	+\8�\��**(	;G�h^�-�rGNw(O��{�z�,������{
W��{������`C��I�v?_45����O�.�^���o��������u���{�'C(���%�k4�
{TvA>�%4�H"��B(H��Uc��	W��8�43�[�RQESW,!��,u%kj�<��3�J"�������BP=Gy���5+�h���p'���N�:cMv�����������G(�Y�����$&�ZE�DW�����%bQ�����S��cJ2'������u�"Gm�"�a��3]�B�DM��P�Bs������T�����A�Z��]g�9 )z����V��2�b
���3�(;�L�E�D��������b��f����:0����,B�����
�b}Ej�"�"��1���r6���%�>E�~1�|H���"���b�^��J��Eh��B+%82pX����[�{�����:F��w��c��)����PGEJ1��O7���I��P�"����� �P��ubD�^*���He����3:��f{�{�x���]�5��P'YG�Y��j�D��K�D6��&�*4(��M��K����~�VE�?����������:F���g��8���"/���-�-F3��)pV����i���Q6���Vg1�\q:��#�#yR�J�v�-�w1�p�<��l�
f�0�b=���5`���!`�������"�� ����b�
��zS����n]���������8#c�q$���|l&0����<�P��E�a�����~�G���^F���N�������\�f���R�����9����+���>�pBz��?g��`��,�)�?�bO��v�}�Z�Q���B[B�����-�Bv�Y{�e������W!�K����.F��IRWh.J���F*�s�����o�+������#��]1����P�8�*s���k�����P>��A����.n%"��n��Wm�Ak�������|	2��td�%�O2������� �nn����}��.���T��nw��[��7����xV�����H-�n[;l{�-w����4���/"	���?��J��-�5�9���n�p�0��YS(j�b_J42�&����o�U�/�4��%h�l��V�d+_}�	�%:�\����NB��)��A��A����h)t��v��p�)��?_��������bNF��"�,�sh��-�����DG'� ��yI��|�����+���P���S���I����Ita�=��3�i���"��J���{��C����I�+��<�����b!��$�������Xd/�fUd�}Z�J(k�
*Ap^M^uo�A�Bl�������E�:��.��&����R�v9����%~�����b���XdQu��n`�K��1o!\���@?�p�:�"�����������1E����5H�!�����	�@C\������)A2��T��W�V�N^P��0��QGQ�+�]��/0Nq�S�?���L��-Tb�X�/���,����h�g�=9tT�Tuk��=�mC1�&��T�%��~NM������{	�|�\=���bG�^�O�Q��0�]�-9l�g���j@qkm�%�Pd4�k���Q{�-:�'�c�j�j/�{���`I������w$s�F�`w�����H��\Aw��z�����[�����~�Z6F�S�����_h qG5x!{y����a��f5fOZ=$+B���������2��:�A�]�j�$>���F3����U�]
g��=�>��$5!P{�&G���3AA��UU�b��:�()�yT����H��X{�1���[�
[L1��[���,�~(TXg��.���r�@����l�����p+��|8$�GL���������]
Y���9;��dV���.n����e��V�,�F,L�e� �����_�D��� M�I��=T
��O�W�������E����;�KF��V�� ��H7��+�F�W������ah��Q���~�:O�=+��l�Nv������!.<�&��UZK���>C�jRc�9QTc2*>H@S
Gq��V�&=���	��UNa�+�M�@�	�m�)<��]�$��R�EG���z�^���;����[H�B3.��[=����4B�Hh\������E���hE��i��9QuT%6��U�@m��aKd6�F���Rd�_t�b����-"��n����y��|A�:��#���At��MHrb/��=�4L��JT^'<PV+5��q�J��n��D2�^�_�K�#���9.�4;iU�@%[B��3�A�t�k]��4
���1�PJ����������d��F�aM*�	"��:�4�&���ocx�o�"�KiaHF��%������qw�K����3xu�j��H��A�C��i����^@g<6Y��C���o-f^WT��-J�VSV2|�6�I���c�������1�@�!��o�_���2Y��8i�������!"�Q�����������R�	3�Z��������r}�.������1�������B�'c�����&N��$���2a�`�'�r��:��e����uh��-�KV~��[�'x���,u�|���6z�����j�+X�aZ���,=n�oj���2��+:�a�r�M��-����������B��z=P�2��?��Bm�E-����
�&�����&m��^Ap��6o�S|DUi��m�;S���������6�!��=��^o��<���&��CV���[!�`�:�����yB�c��3&v���/��Qh2�P��^�D���E�Ts��x���_ q,vE#?�/2hg���C�7q�����*H���8���S�^���^9�E��~������(tE�����S-��+kg@���-Y�_	p�a�����6�k��hHA�)����(:��� j!M{1C�f�A7 ����� 
z�J<��mO'�[_������f�A'�����Zk'��$�O^���b��A	5�e�:X���t.���C�1���I��=�L���NL�FO�J�����#)�'�ZE�������5!X��d��h��H�=����@w7!�?Q�b��K(T}8���q�\����%6",���n���;�O���vS*_�p�6��/����^-t���~���U�r�%�M���w�{��Z,��������I;{	9c�z��<#���a�H{�he���O�Z��60Q��c���S)�����:�n�C�U5�����I��
�#y����(�����S�1������%�bs�FL���*���g`jI*2�0�F%R��A.����_�DCf=je�<'���S��C=��4��-Q�M=�d#�`c��T�(�z��VcK��Cee����i�)6i��Y������_m
��C��nC])���l�#K�_&aDha1f�����H��^��z����r���0Pk�������>�6�L�McK`}`���/(�R�
�/�#c���Rp1f]����hbM�0u�y0�`�5����M�t��n>R�����Ie:�s������T�/��EH"�%	����������A��������O�)� �a�a/�P���A
u�����9����7�<�oE�@�	=	BM�|����w���<�g�������R�+Q��A��U����3Yw�0��we"KH'������`�rc�����������T��=��t��w�Q�����v�+��V(�*+�����)L��0�
�r�2�z�����M��$:[�F����)�I�|���(�����F�;�z��#��Oj�P������Shj�j��ad����Q����

Y��Z���_�	�	�3�&���,��^h���&Si��c�K�F�]��IUEWq����x������oe��N��(������7B�{<�w*H�U����.��>�+#zM5�MQa��|>���>"�X���;�<�k��i8D���#������D��0� -��G�lY���bBsp<Yr*��+�Q�c���
rD!v��k��j���\r���fW���QF�+��x���������#���z��(T(�u���:��@0�H��O�%��Yp�t�1��-���m��B�a��|6��\mDFq�]�aa�����[�4��b?���2�����'	/2�b�;2,'��ap����I��x��� ��JN�|pd�p+.���\��t�%����!ca�/B����0"ac���CW%�VM�"���A�RL���v� ���$h!v���BV)�f�1g{��T������8#M�(�J�B��0T��p��'���5�)d�f�O9U��,��]��Ea��u�X&��������l��2'���6�-����E�*j)#���v�j,��8~Ih��uR�F�X�?f���V�
B�ep�+��x������E����3���4�~F'tfl�)��"C�$�W����P����=C�	���P�?������:���o�����	�������X!�	*�%��e��4���ow���U��f��Y(�`�z����J��QGv�X��4b��f��4�a�B��@[d5���7g��2dHb��w7���3R	�vG��������a��Dg��*msQF"f����<e�o\b�Oz8��
M�k�6L��@l�a<Bz�{�t�%��o��C�)�^������J5��[2�z���
�A�b�P�P�*�/��[N�(��>b~x#��*0$!m�@Y����!�t���������w���g?������Q��/_����:���f��	q/+;��`\�db��MDe��idB�mH3�D�V�r1�����t[*E@�qRvG����)<���F���p�i4B��)]�r�|�>��[uZ��g�b
���LX5�)�Wl�v��?06K���KN���
:lMn���D>u'=���}���F���n�����%���T���<:��$T9��Z���v������=�)W1���2c����#�SZw�$@��o>u�o����$t!6��Z��pn�4@���D��W���Y���x�R�����+��g����j/���w`�UR�-��f����f���E�s��d{��,�=Dq�B���]sf��$`-hP�^���_�5�l����-����z�J���@�������a����v�d�KbP��f����idq��� <;�'����=�2�FB�{gfL��'e�#������#w:JSPL/�F
H�-�F$L
7��(|f�����D3��w��1�fP3��`��a�0�w�2��������d�d��Y�C�9Eh�l�4����&d;���������*��z
0�X7���]�ql���~E�J�P��*�n��!��A��X���ubAP�4@�H�����	kW�t�@�W�5��d���_��	9W.��!��9#�Y��p~X��W'!$��D��fr��P���d3����oC����!	�$�s������OA��JI�s}~hP��w�R
s����fR�e���l����&�]��jS��i�B�#��<P:+*e�A�~��$���_��-yE�DM��")�tS`r�@4��Y<����\M/M�&���.`���@cr��1�\�����hE1{}T�xj� �44<!v�^�!n��+V�V��QO�*�����������x��>~� {�n\���A<��k&�ZfZ���Cyc3����t��F$dZt�a[��DA>����r��f��<��[�����	W���xg=a���dE*!��B��V"�y�g�Pn��e��bQt+QJ�P�����7���'�P�p}��lP�$��[��dI�8��0��N����B�!�8��Hw�P�'�6-������85	�~�<���9�pj%�Z��GA32�A�0xQ�K����I�b�m��|9�C��7t���A��fPgY���A���E�MnE
���-u'���b�$Z�=J��� �"�a����h"��'>v��pGR�e�B�����h�P���g�b��M�:��
S����W�r&EO��9QGg|����,�
2V�C���_6�����#N��,�
�[_"�
���2�Ey���	s�{�9�T�����M������
	��M�<��!-z,�aXP
]G�c�3�1���z#�]���i�������<P�dP�����gK����j��A��W[r"h��]��$�I���"��2tp�
q�t�gN��@�6X��g�AFGE�l�^�k�����PM�O��2W�e���$U�
77Ph��*��.����a����+�J�r�o��j��?(%�}B4&Z�,��x?n�����g����w%�QxPS[���9z�;�Z�P?k�����Q�����Bs;�����@����	�$!�:���wO��-���m�W����$��I��W�45�vq}�K��Qv�K5������hlt�_�!��[W�Yq ��r�������UF.���J<'W�B_�q��T/��d�&���C&�	�f���D����KWm���&���=��k�sMA���9�k"�0��2Z���2 bKt
6e���Sb��K$
�_��)A�"������_�C�������xYT1�z�Y]���N��4��[V�;b;w����I��������]eG�p��Z��p�p�3��$�)���6� jK���5T����v]'�%	
QGn@@�����3)�v6P�[�7
'C��m�@ge��{��
��hv+����/h��v	�\�Uk
�C�`4��LLi4.m[6��]�;�z�����H^��m��nr_BG;�6J Z�t��g��f2�u�����H�kz�Noc�%�
h��<�k�g��g�����2<�m���d�����u���L���l���b��0v���zG�Un���x��u�T*����	6�;m#b9:���
�.v�G��^���I	A�P�
/y�~�K�F�[��:��� �y������I�H2����@tO:�V9��������h���Dg��?����&U}
2N�e�S�xk�8x���=i�i-�l*�o���&v�>>�p#�N�~P���b���zu;A�H�fL0M�(]�!�>v�H4����]Dl���P���Q�Q�hmiH�H�X������dd�����O-�${���(C�ND�b�M�P�m�B���j�2�|�`��(��U��������h6�8����A��x|�e����k9�E�l��]�W����S����t��+w2!���=Q�~�TiS����7��yh5Fb�m�B;�
}������Y)l6^�&�6���p�l��<����@��m�B�G�#%����M��*�
�)���*[�W(GlP,n	R�Ub����S�*�4{M��� �*���h�:�*��'��&J�������T����c�@�<B��Tyx!��6���YS��B�+�_E/b��qDeG11���lMM�-A�LU�u|�UH�].L!�b���'kK��l�,��AgvV��`�d�������� �5���Ip���h�k�%������DIf�����=�?�D���AE�,�;mz�8�6�6��D�L>��T�b%NZN�G���Hi����>D(m�y��k��������T)�x����4b����1� ��r?�P��i(K2�>KW��L�|J|V�� Qh�(�J�[%s�@o�G����
{����F-%�1��t�g��E����1����k#��kV1�q"HhZ�|i!��1� �����y>}�:�l�i1��`t����P��S�����F~S�i�����@F4���N��e��8
�e�c<BtU���'����D�����q��|A����I'{ {���z�V]j@�����5��>:��
��O���hC�D�pZ�^�����#�����si.��jb��|�H�Gw��5�V(��&��HN����<�����:5x?QC��S���:z2��	R����hC
���1�W5GP���/�����"C�K���
�*Tv�c��+i:��=�6&����CP�Z�c0C��QPh�l%�=����P��O��D��xF�����P��ik���3� Y%;i��"��t~�4�[F|7�Hph�I���Y��z=���l�Q��DL����S#v�1a�k��2�D��3������cL��8���
k\$�A�>����Z�f8*S����Ngd��a�g�����/'�R��e]9��$����j����ItV
����������T�Q�i#����:l>q������S���NBF(��8A�`����G��m�Z���ts9�r���U���V5���m�B����(�r���f�D��<F*DY�@G��1H�4q'�	�x�cX���;v�u���'�����8�F��%��
o��8�JMd4��!� �W���3I�������P����7�*O�"�K��>�<�br�D;�v�L�wd��;��4S(���F�0?N�2���Y�^(V��szy���d�~��46�w�#�~Q���\�c���I����HAR9��K8����y�R���Vv8j�=�@�O�������A�+�v�/�O}Jb��^��5a#�n���^�����d�yG��Y ����|������Ws�1��>E�2���di���dszG����K���k4�;t�\�H/X�y�4YE�c#=y�+\��y�6���i���}���L�/�a��\��Emt��G���)Im��t;�I
UE�
��/d�i�9������������l#f� ��$���${(�wvm��<=�	�1Or���Z?4�5������}s����x���|��.�x���g[S����q���'ln����$L�q�^6�PA��aF��i����Ll��[J>���My��\:����S���1�b[0���P�}'q�B��&�b�&���"�N8broA�	��r��}!����c���wPp�'I�<���F�,���*g���)�s/-�,��f��/A}��vr��-�{!��u��giM����z�bI�;2��O:��=w���T���?���x� :��y��sb�?�b���L"��wdKg
���`H4�1DJCQs^�$V�'���C������V���h��� ��yB�|������cg�HG�<n����w���0_�P|����~�b��-vL k��X2|�pE|h��^��I�_�O
{p;�\w�e�N���]�H�����O{�o�R�^��[���ob"9�P���O'_�j�9�C�����WK�^�-;'��+1��Bx����J�)Oj6�c�tLB��Yy���d����>��g�����'�
��?������%��)�������\@��<�.�@����+%���n%-~��>��})�L@���������M����%��F>��'��S>���;�s4b��L���,Ii�8��5`Imd:k����$��v<:ju���i��"�e�GI#���Nq�Yo;b��j�����R�H�k-��I�kN)���9V/�J:%�~���by+{�m��U�4<:J�I\���n��pB{�Sj����<J��(]��(�L�B#���3^�7���|�8��K�����f���_a���nl��^z��k-�t�q y������K����=!�"��&\�<����������h*R��}�c%I�?��e��-��V����w���(�NjD�
�f��Q��j��5�K�&�
hb#��x`��;�l%���7:Q����6�k��)	e~F�<�G#�*.�da*{1#������d��J�~~������
iK�)�ej*Vj<�����[��%�A��K/���\�5Ae���	����D�:����Ae$�'T�V��
��f�B����3k��>���F���)3����L��Y�{����w9��*`)��v����50J`V���U�|�.��9�C�u�`��4@-��B^��J25��v'!
����${�p��/Yhd��i�� 	�����Dw8����x������k��:Y�f�AV+�&��$zy���F���p�P�I[��$:�l�������L��V�X�G�akK}�O����k��-T��]3F!v"�J����#�}�PYR��������������2��;��G�D�����mSVO��5����������.�������x�����b�A'��_v_�����V�����@��b
H-q�������k 3�SN�JC�Q��Q"+X2lWu�`��)q:R���dn�q�����@�S�4�dD�_5��� ���}�&�lv!h�QFO�����7�J�Y�jB>�=� BF4��� (]�� �#j���sFj�w���
b�fK
���=�f�GT����"����iT�W�(a�TCS|�[�9�)j���r�:t�F����QNMl��eYy���~oh�%�|�r����-�r+��!;u���>�q��h�e\�j��,�������X�W�4��sb����O�&��'3M$����!��&u�}�$�E��S�-H�*}5r�;����a<�I>B�rQ�Z���q��#��vj�������;�K��MW��H����zL-���4Ev!h��R[�
�p��~kN4#2�:S�l'IB��k���b�S�uW
��d���}	hfc% s5��"�QnkB_�'�&�t#��F����6��bD|����)�F��!����{����ja����|�
Azlm1� n��k�����[VP��GP����lr������8f�@c�S��y]r���<��c[�zA�c���8vEG�j���H���!AE��g�5��@C%�'e�;�Bw�z��������UOD!��L���d/��;z��#X�~D#a�r7W�3�9>��B��.��m�Rms��{�R�r���
�%�V�cP�mX���O5�`=��e!�Zb5
C��mBQ!y��%|�h?_*��������=�`j��+�9v������|`L�{	S~E�bs����a��a�D�05S�]�B�	�(V[?�CSp�cv��"zC5� ��U(i����?�ku�����`����}x��4Zv���rq=��� �9�U���9r!<������w�V))���P�z�cQ�TZ�:��F����#s�xt�hd&�sn����w�O�m@�S�)L���;^0����iP|3:��'42'��|1�HK`sY����X��X.��}��O�#L���)LeTI����ftAK��ld�@RB�8�=�0�*m���|0���K �����gYU,d�h�$h���Bl�V���+��4���C����tL��<H���h�y�|��?�����'�#��;-�
�h�:O=M4]�;H���5��Q�i�:(�E�\$Xh��:J:������P��cT���`�`������3[�"��R��.x���:���e:���F��T����D��H�E��������s��Y��|�'�l�Z��kj�J���t��
����]��T��L�ja��"j���3����jqA��~�0��j��J��u!��0�l�����2�]�%�E��@�f$B����5���J����������O����)a����$�����M3C���~��h����,h"��f�[=�,(&E��:�4Gol���&G��RY�l�4�P~YL
�i����Y��$t�nc�`Pq�U�*���f}K���V�}�z�b����s3���eg��))�_fP�fls���-op��>��L���8&)�L$v�7�0�g���&� t!����>
�H�H�O��X�
Bmf��2,���t@A=�f,A���v;b�6�j��N���^��-��$��������Vl�����5���@Z��k�d�=4��J���-�-����������H�����c�j�p�*^%�Nu�������R�O�������D�������fb*��dh?`��f�@��
�7���t7�:�^$�������>����|���/��#�(���N����a�������
J���<�����{XY��=�*��u�2R��������f�A�i�	�|4��hP��������#���A�e4�4���q�N�����B7�0ECV������<(��-?���`���0�x�:����He���D>��������I��N�r�^r�@��`CG=���#l)?�ND�
/�~�g��L�D�0H�v�nh�����B*������M������$���Z�1
Cd=��#I��sZ�w�[���H�np�������&LH=��Bc�����������
��6eF+��}h�9�A9������o����l{O|j�5����@���E"�N� �%�����c|-M�#��F�[���\p��S*;����E����0�n�A�%�z�6Gv^��]���������?����.�{{��=y=C�#�����dcr������������z
�	S��8�c��D�j@�~���F62��b`kvB���B�XSR�O]w.��F�I�j��M��HD�H�Wg��-F����:@��9���fc�tkL[���)�|�����5#�r���y#���X(���O�pQn���c������3W� ���c��/}���*2������)O;���
��G
34��\��I�uE|��$u��8�� �@� �wS��t
w���2��nIH�j����u�U1�Xed��WN�B��M�]�n�e���p��$nA�B�;;�u�����z}�f�R�����y����}j�9���#W`����"�>��0�����,��
3���;������{����������b�����c<��t���%Z�����rP���@C��w#8��>�
S������n�$�0;ut� �b���]&n
���i������D�P�O�?R����]�X�����X������{.��X�A/Z�O�I�l�oZ��PK�~�!3dD�p�yA��a(A��
�7���(���X��$�]�][G����_?E:��j�����Mom��kD���Q�l�uQF�5@=�aA�t��6n���������O�.����G�0�Pu�f�q!d;��xd��H�inp����r.r�co�S�gc���]�F	h���@C����;(�=j�P����9u^H
eF\��2V!!�KA;�0T0nWsx�D���
~�1Q�����p��m���Ia�.�e���$���I�e#��tP��w��}Qc�+	u�F��=�$/��#$���#�6�O�����X�?"F`vGC��5��<�����ud��������~��5#2�����%���K
�&
H���R#9�C�{�X���y�6�������y����@)&dEz��cw�fJ�cF|xD�����ij�6�H�nO�m��Q,��jA�c}4l#�`�~*[��m�	��\�+mBP�i�wq��GB��0���"�\�S���w��*�.�a�����%��,�4��t���nRW��}�h��dA��eh��5b�����2c(=��B;)lu[�,������e�F���= �f_��e�m�^ev�c&d�%���I1�6��C��1��hO� �iO�>�R�yl!,ze@�0� F��W��-�@���5H��1��W���5(j�����������SE�H�}
�O�4+&)S��DKLe�[������Ok�����<E�dG���>�X(5ut�	!
;��%#������6k�tbD��|�Ny	0���c;�D������P�t��u�5�'��\��:t���iu"������;}$�)'��h�� FD)��V��0�p�v���Y7���8ld&�������l�a��n�l6L��,�;�|@a�D���Bg�iHB<����u���h��y��=#fPp�}�2!��g0�����pb�k!X�
M���1����A?�B��%d�`)�0�$N��	�9��(!]�,��+2���j��/���M��qE*Rxja1�?����Xou6^P�s�?c�����a�zl�*+F���O#�yM����P"�41�<�@�C���
��c��B����)�����5}�5���������e���n������&��	���F�e6�?�a9��������$�P!�	��5?��1-��������
_�C�)�LD���!n_�s��B/�8����v+y�������S;f�����Q�p&�~����OR
�V�'���3�H��<j�!��4(�	���A���c���UV�N���=
Q��qF���7��N�p���
2@�����Qi��6!|����m����>-p�E����}{�����#�mw��=���(�A�&s�C��y�Ng��WnDB_�j��*s�
5�A��6�,��$�O����n.2����Z����1�\Di��p��Y�A�^��V.�����s��C/� �Mgc��4��P�]i�
�����Be��h���w��
�8������t&(�h)|�.�L�9�������tg����
�Q,<�u9�$,Zu��%��	������4A�_����������$���vnZ��IAk��d�������=�~��\�]�G�����/a
�+�S���@�C;�SBV��oY;Hc8wl����[����q������-4(��O"u�/6���H��e	�h�3"�Djh��v���h�s��'}g���^{7��$�}�
�lF�`�H�=3X��}jC�[��e���1e���z���&�s.4��������1���JW���;�2d ,�+/c�D������2W$
���p���(���{3(].��7������ d�.#&����/6h`_�i�@!���2�0>�������@L��9"��^F��M\E�[s �tAYF�o�*9���	u�{�,$vL���%���L���� 3$[	X�~
�����Z+b8�����U���9���]1?zB�l�xX���*V�����m=�\T�[C��A&
�Q�qQ@�����U/�.���%��s��U��`��H�_�������O����n	U���V����Z���������+=�����J�4����#5�2� �t1��������V��Gk`AF��*�����Z�
��t ES�g�
js��H���[�������;��i@3��s�_��c�������R�s��z����V�K�#V��T}���	P9�kH���t8����7)}�Q&xY��xR��=����'+��w�`j�-w���,��'.��p��N0Z��f������PF�vF���X�����moq�f����!��1�,���x$[x$�[���`�J�:�����<qel�@��s;ubl&���&g-$j[�jFd��~�Zr�V�b'��3����WV=����=_W���X@������������T��=A�������������"z2���7^_��b���&�\192�L_�����k�M�%����������������@��P�L���Z�D���mp�������a����5*u\A�������l���9��_���#��2���n+��c���0
����Z�w%�U�E/�	����
a��@�;�:v�������F�������+�O$�5tqQ&&+�b��N���8d������"��2��t�����E��dC���$�Cs�.a��WlC�2�9�1�CV���E�����iE%�N�����$^�N�DH��&1�b�)�C�;��#��ga�����v�c>������@C
�Fl�?�����,����n�������/���B��m�AFL�=vBjKx)�����,��hOo��B������S��f�@
\��P���5h�F$Zpw����[{�~���h�x�)lE��m�Ae%;!�(P{�X�����z��B
���+�^�P�go��%��T�
T:o��dxS��?\�gJP�(�;m�	rV��FSl�2�^o(1-M��[P�����s�ke���m�*������p&�DH���2����)��|�������t`�Q��EH�&�d3��� ��qXr����z���
D:��3��F���N����t��%�@}�\�jk9��W����l��v����=�����Y��$0���IK��#��??ya!Lp���7�G������:i�Ra>����$��e'�a�M�i�����[��%���2:���H���$���S������'��,������+�k(��8�h�8�Ea��;���6������Q�_��\h�04a��0[K��3*�|���_��P��v����IR�:|4�H������lW40��Z.�E�C�D�)I����(v�
�m��/�c�����\�xc"���%���V>������X)��T��HGw���wvv����&P�t��N?>���wRP�{g�'������k���e�������+��h���~1��w��e9�z�Ub�S6�N�n����j�qr8P����������x���;+c�B>P���
/�e!���p����V����1�w0���NG���4"$u���^O����?Y��lh�9�y��9haU�	�0���~�	� ;%iqT��D&�	�D�����8��w�;��)�h�8Ov�'�X�$:�FBr�c��
���L@����~M����u���A){���'��������X#\��&�1��H[���|2�"�9~��}�o*�Lx�nMyK�`�K�w��8��'���c�A�����$�D����D����b�{����o�
���pU^-Pt9�:hO��|m�8Ip@������T����@e
��:�&j�����2<5S�1T�z�N���J�O�������:�X�2p�����@��1���w����D_����RP�/	�����w{��R�����)DV��ZN�C���1� ��8�U�'�w�r�/�����A��U*4�����'U���O9H��0_
]g�
��%�e�.�rS"� n����)�D���{�c����z@������X�m��4����3���/L��<�����p}0d�s��P�����A�
�j]���PmYX�F� !�Z����zbq��I����fQ��l�@x��*�����'#�,j�C����s��p���%��fN�����(�����~hl�Y!}P�	(poW;��?+��<��X�ev�P�����-���s��=;��hO�R������ut��!�|����_Z�~���M�*O4<���q*������4[�����Y��
���-OqO�����X�nX@��.��"Fu�i��	s��SY���$	��������N�����a��!,�� F���`;��lf��=�Ne@F����vy!��8�nU��1cN��G�)&��D6�X���fFK�����"A���'��O�=	G��6�)���0n���|�^��:z[2>$�2��Ne��� �Y�p�Pj�9��>Gv�0�nk���
$C��l����O��	w��]�������Wf6�����[j�E�k�+C@���)�yc���^��K���V�kU-�D�{��1.�SvxC)H2�2�$v�b��}���'�S���w!�`��roC�.Px��YG@��wxj�9���h������[����y�-���_`�@�Q�2�N��A���Zl� B3<.I�r��@�>���)�2��w/�W��T���8��@��#cRS#�TF����1����M4.�15�����,|/��o� mY�h�^���5ah5h����D�{����8��Y�p�����<8�#��:��E�n��wC:&����]�R�:l�0�h��X�������-d�d�.1��c���:��e-p'��R���P��;�����?����>�,������;�~,����t��
(g��Y�P�{�Q,�`����wBHT.�Nr@���	S������!
��G�QT���������p���!`������;�����g@�|����A�������{��t�h���a�d]$�A�����������:�l&�Y�H��A���|��E#��\@}zG���0��5;E�k�ji��g��1M�M��j��r'�({qb���D#=��[.��3���O	r�w��U����|���	���HS����#
��"p�K�Y*� ��1�������1eY(�Z���{	c`h�\��%t�:���P����C�2�a�V�"t����{���z���'�?��b@;{/�~m�i_�����5<�w�����@�^c���[yG��c�a���W�Q~($�^�����R�������+��qrx@{r�$��^�3����:a��d�tBw��h�
�!�~�	h�	���Y�+�h��}�V{�3E���������~}��9)��.x�<�o�B">�p[���W�H�I��
'U�9���I�]�I���3���TVhx�2�h�p������w_���#
����d�M�g�=6�����F��}2{9��^��XEQ���w�;x�"{�}�f���3J��%�N���hP6`y3�_�*���e*q�a$%�Jr�AuS�
4��LA�E����h��X�XlyE7#[��l����VC�b�`q����[V����R3�VBB�(���{!o���
`!����t��������#c�4 $"Z�����o����Qj�[+��#�_�����(5�[-�s�Wt�Q7H�z[�va?���~��c�	j4b>��P�$�^#	���>�i�=�{���*�
XZ!�g+��%e��7W+U$��x<[���h�w���9hW���A�7b����v`������>���;����w��x���@��%�aeG��Fw�vK�����7QD{�_�"k�<�����|�*�tx+�"D���c���������D���������B#���Ln}�U�^ v���7���D!rE�����N�c��I+X�"���{�K�����?��O���~$��O_���sJX����^�{�fMb?�nn������P�<[LYl����}n3��&�^��eVh� wP&��/Fk���^".%���Jb!lj�~n_w�G��-ul����q���N�!dM��C��7��D!��g����`�RY�.��;�����1Fcbv���g*7��,�(�Dvq��Q�:>KFz���b�Bi"^�?��^���A�W�*�I[���_�bHt�,���@�s�uL�M���8��L�p5�Y+X�������v|W�>d��b�"g��Tb�x��w���no�}��.t6�.�V���^�P���0y�-���I����d�����:;3�'?��6�yT"�P�����n�O\�����g+��
���J�&�P�������6mh�]�!�h��4Y�cX���&��1����G�����QQ�ch�6@����{�������~��M����i����>�,�f���=���S�����j�� ��� Cqc��
9R�#���S^_�����1�OW�Q�DX
S��E�gg&r��W��Z
^�����B�d��^@ ���:�����$p%��1J+�7�I��I�4%
��83��@����dsv�b���Q�����S<�������9�ab�;������V�#jE��B6T�L�����)j���^\��h+��r�{�F0dl��)��FJ!�@-C��� ?��"�&z��c��Ai���_��-Pq
�|��)�JCr?=v���O(���:T�D:��V5����T$���<��c�y5V1^%��iV����A<����ho�v������%�e���;�VC>�;|�F1cb����J��.q~��b[��j[������Rq�J\�
��a�N>w�wQ=����-�I�F�R5���I]�|���V�LfkD���\<��l�K$(��!,^i9��;������{�[��y���'�F����U4�s�Mt���1G�m��4�h�]lI�`��Gq���ZE���Z�ov�
� ��<TL^#��������j�A��e���h�5"qU���
[������X~��H �]!Z�+f�acg�O#!������jbG����w�"��n�dPk�l����^����k3!����6H�\����U��>��P6��"D����G#�mO����af���L�b�������tKI��Q�'��V�9�G�"����D����+/"�������C��T
3��;�v�l����U#aP�������jdN
��������B��pK���}���%�����Krl�H>����������D�'��,Pv�@|�G���Hfw�G����&'`�x[�V�_K�G���=��H������|�r�]����Th����(�v5}���V"\%�u3RP��s�,B��pE�F�_vka� ����������tf/aA~�,�������5U��n�b��s��B���������V�eih�)IO�n�*<�l[�o�D4U";}��6
�F�j�T�l�&S�e��9�EA�d�� :��w��cn:r�k��oU�Q��j�"��*�A������d��V�����O
^E���AM�hhADyA����u�Q,�t��o����YJ���������D�}�@�w�/����Q������n"9VMtTG�t3�0��Z��|�i�X��5�N;.��i��ra��C��{E?=����
Q
��>��R%����~��@�%+1z9;�,�.�|����������k,�9�#�Kb�w?�n�}�N����s� �)�rSq�����}��*�PG���d��{����~���5�^UV|%$�MJ����-0"e�)�Z�Se�X)��|/w����3il�d�,.#b�/�m�3b�"Wa4�+����:�J-�V}��t�)�N9Dmi����T-M�7���5���)��������1���P���Z�
�W���s���J ��:��G��K�@%O��L
G/x��F%�C�)�O�4�	S$&D�m���d��E=.��0�pod}��L��P�\��3������f���]oGF�8-M&H��A���#�B��`�F��f`A9��Z���~��C����R�bQ�>�ht�@J��C��$W�|}H��{�8-����GC���� ��i�*�4C	�E�w�g�}hL���'�@1� �E��?�zs��|~�)�-��Q���h�Y�'�;[��eU�]p�������F�����K��Zz�!�X�()\R��v������������X���C/*�7u����x�����qd��w�
����B���fKOX�Ll$�Kw���%�����c�D&~/i�jH,tZ������sZ/��X�Q�9->G����6�4���n��P��{��;����t���Q-���S��{O����7��v��\Za����:%���;�M�/����7�F�����H���;e��x�!,�G� Gr	AD�^��H���E����������B
�!{�K��vP���6�y�m���5{�
�T�%��l��TH0��V.���z�"	��6~�a��$�"P=�����z��{�W�P�R���a���U�q(�DN�h�������e;<IwQcu@z���B-��L[�6sG����8������[�H��n��yB��9��E8�)�4n����+�����U7���+�4&�q�(?`R�Zis���
��T1u:�h��(<Q�H���&�".M�������Bi����I
`���+��|q���� �n�`��f�@	]FU�Q��#jYv��H !��c �N�5���X��}�1R���&�D<�tA��x�"J�����Z"}�;�ibI�:�Tv�gD��w��F0�Fv�*��zX������c����4�w�'��A!R�#��m�����z���
�n��>�:�
���I�@-�n�a�Z"�I�=b/�����r��u�=Z���z�8"��w<I�80�������w��R����8��n��N*�Q��;���s{�vs��A��������Q�D�S���[��J��Dff�|�%���&!�r�M�:���3����m�u\��y��=Ac���O��#}�Q; ��nLB���>��J�a+�E�m)��lh�Y�
������=F��r�A��Z���$�A����t\h�I�S<����H$3Dt����"�$.�S�yu��H��)�4�
�#�>j��%^��pl>��{e�0�{G"��^op�;-�!��_�-J8�[� s'|
=#:��J����~0E-h��,s�c$�A���������^oK����92�1��� YL��!2�H��\q�&�r��A	�I�����(������;��M��{FMD�.�]���5�?�o\���62�F$5O��4u��2o�a�����D�l�6�p�muP	(�*�A������^L~3��$)A@(�f�/I�=B����B�B��+�����7�X:�BH�%cAq���8��U��b�G<���A���{`;_$�i�L&w�!������������8-}[�2tc������*�����a�0� ����]����0� ���3c���'f6�����6
�	o�[*ht
����o@�8�
�*��#�J"LG`	�o��:d�N�e�Be����<t!wO��be��l���)d2(}�JU��c�(l�1PqdY�Zw#���m�L�LF%��d���y�00����;��iI��l�[��+���+/�o�s7N(F�8��+q��A'��v���$�G�X�^Z��a�f#�����gF�,������F���+�h!�d�\��&Vo&�A.���+I	���+*��c�T����]l��`���j��$�fK���o��wg��]����mg�,���`
��9� ��a�&�lKM4�0U��;��+�#�H"��s����Em�����D]���1�a��(����<t�f��
[B���Ci���a���:Z�Si�N��]���~6~�F,�Z������2Lz���gF0��!�Xi:��EQZ�h������6�|q&��O�c�
`���bKDx�b6�g]- �%�f�
a>��M6�hd�}����3�0N����
�;p)(�7N�4(2��T����(8W����������x�5�Lr5Z�f�����;�tA}��	Df� �/^4,d�P�L�F*�54JZ��������q�O9����|g5�5�����B�X�1�c��30�f�$����uQ�6k�rd52���7p��	������k�t�+{t�8���76cQ����':�e
�����B��i�C�� �uD��F>X&�4������`���r���5�v�l1�j�^��Mc�)��%N�?4������h`4�zb�t����-m���B�����S�-������gMh�L�rl2c�$*���Q~�j���ft:<R�wg�t${�I�f����hXGa&�n��qf����>`�^a��<�C�����%<��?*B�X�4��]����TPq9;�Y����H�|i��
f#��D���`���K�[6�v����,��5["�P;Q�F}���0�a��!6�#��{`;^�Q�5kpua|Cg������d�3Iw?h��6��$����+�WkB�}lFP��W����.�+.��n�)lK^7j��K��w�3��3���s��Ie0hGgF|!�;���3�F�WG��ihC���m���4��c�����H�&��^��@�s8
lTv�4���)�����������{p���u1ed���g��Ir$F��-�s���|a�9�s��'����8�l�������w84{�?��V������[:�����)O�{�)����o��b�����5+k�
7����1����g�"�y��A�`p����cTC�_����;�mt���|�����C#}�`��%d�s�E��u�a���C�A.���v8c,�x����U�����=
R������=�8�C�&�1����r+c�a�bU-%�!�@�J�D����[o�)\�)����/�F����0qB�f�2<Q�b�p;�~7t�YF!�Z6�V�4���w�UX�"� T�Y	��YL�2<�i?��M�'��G��m?����3%^��[<�[Un����@��e,��_/.�r,)@V����&�Q=��X(T1���d�$���"JN�C3	nW�����6��6��(���}�Z\�!���S�����q�o�����%b�^����i���J��l�i%�Z|���L��Y5�+�����:;� �6��v��~��F�����])�k����;Z����1+�e�B�9�
��k,����c�Shj"��2V�HV(*�".-�;����h�[E/jL��	�5�]��{X�|�oz��L"�S�����]����K���f���]���f|��XWD����'9|�B�N�x)~Mo���D(ZY\
��Z����B}�5��0)��]���X�e���h���,�����HQ�B��IU.��,
�I���c�e�A��[QP��L�r��*��������(���Kp�=g,�z�>�2� w3E�O�
:xW��v���@0��2���Fq��}V����LL��6�@��A�-�I-�*�U���{�9���t6���4� x�v���p���Q�����0���R��A_�1�iH��6l����]��:�����X+L��������HkY�Y���B[m�W���'�f�3+r
���II�y��FX�����x���u=�dY���A���	���Ke-B���1�N���}
���J�3��3�q�|�����.�4;Z6(~����t��u�zhf�X�L�(*e#���n���G����%��'�_b��@s�����v���u�C8�21�~w}��N��-��VG�����W�G5��WTB�����i����(Kf�#��%vUiw�������u�g}j������+��Y�*m��\�/#�P'�m�B�����&n�.��"��4j���a�V9�l#
�h����+��?���v�y�C�z;�������l��Eg�m���wr)�-�6Qd��<A���z/���3������p�mB)�:���pg}���3�N8���FfN&�lZ�o�
*�7[=k����H���\C'�m�����������u�Q�@w�]�=��	q��zS�l�	)
vB����4BRv�{��/�D"j��2��N��H�bO�)�'2�����[�l�53j�����s,I��
D(NW�y�l���?U�9R���#���������r��7��I��U�~�4�-�=L�{dW����G=�m�BL�Au5����I�v��
�KT+Z=���Bw��&�0�����'�*&����.��rN��S��5�yp�(� +�G},a��0��a�VPJbA�����.����\�!�sMF]�P�G�?%cE�>�P��������r��]�����`�h��^����������d�w��rx[�U�4����gv���}�=b�������
`��Q����_�iaG�L\������@#��
�V`<;�&�z�DkO��	�;mG� o6�RW�h�J��r�� @����������|��\�e�m�%R	]�&��/��{%Y�+��}�[��*���`�.�=B�
��kf*�����9e�);���gt�#yCF�������
�<�FQ���h��>/Q��[�2���&���I��sNL&q�uxC�����]c+����G���8(M9���K8�#C�Yj�A6��q��,l�K������-!��&!(�y���]�����g7om?�&
1 w�m4���]d���:v'�&rW��3���	'�GNd���Nn|�J�$�Zn��#�^Q��~�%��9���>P��l�?���T���T��t�d��WA�h���R��D:�
�:���}*���^,�����>���)�w>u�����3*:������l�V�E2=�������?C�#>N����n��Be�D�x��%h��!?62��*�84�R	���/L<,q��x����QN�9��w?�x�n����u�r�LA�I����=L�e~��%z�XL,O=,��O�L��qw�D_b�����L���]�):�L���~a*?��G�W�f��	�-fa���<8�E�?�M:�)��H�>�88]xA\a�2�s:�k��P��@��1@��I��p���C�x���I(E�-_I�D�7��R�w�8t$�<�+
�8%�0�H.m��MI��4Q'�B���zlZ�~�'��#���O��9���y��	�� =��[?�l{��zM�DX��A��J����B�DV��hb������f��ER{�<��2`�����L�'�o:O����c�B�Y�����D[8%��x�V�'j�b���X�@CLMD�=#�c��q�q�.���!B�1X!I�q��N��NZ���b!������n/C�?,���PWCM�nY5�>3����EO4b�+u"��a6����9����j�sE#g���I3���e������7[�p��H�:>�3��
�mJ�8+�v}�����Ep>?'1��G0aG�w�-���6�y=��K��[�X7�ipb�T��kBs"��I��p��!�������=d�"�����g�/��o��P�����.��SjBK�1��iG1y����=� �������1��T�RG!��1��|��a
����h����$�$�B$��(m���w�^G7o�CPl���@(?:T�)��l�n|��]{�iU��P2��4��$��hGq����R'�N�Ow}\S�X�r�����I�%�3��}��?��=6�
��o@��N�����W�!�]���b����T�A+
�x��O.c��7��\�^��:@���#CX�4d7��OI%x
2T|/��O)
B5�l��%,�����/bX�H��fJ�m���6�����H,�!��{����(h�5f�k{���,��+�m�<��2� +��>��f��"�'
4����N�l����Jv�w����9��##������'t�����K��GR�������'9�{/�}W1>j�`�Q�@�h���M������E�k�g��pL�l4�{nj�rWl�I���4���������z��&�.�`|��(z���J �	}���{��1P�������o%j�wdX��i���G5�{�����6���m(EO�?�F&5�/�:Ok��A;���m��GF��%xP
(/(�$Aq���-���P*=Q����o��MFv9�_���^���!(�������Kz	�������q�
�:��e�=���VR�1������r��A{�q)x/�MYV�h�$�~j�$$J-�1���J-h�7�tR��f���p��N�h�-���t
�~z�3*��S�E���%���*��RVt2����PZx_N��y��.��t�D.��Y��nC��;����^�D�]��D�1�1  U.��^����l�M@c�U��3z����7c�B���.�����,��z�X=hC�F�j�-2��\��xm��r�*��kxn)Cf|�J���5B�\t'�^r�X����F���n$s�n;t
�1�n�)6���._����NeP�CR��>�K�����!��A.HK�<�*t>�%z��,TcB~G��������wx�?H��+���K�d�~o�&F�s�[6x��b��h�]�c�,���U$"1�&U,�'yDH�2V!��Q�ZS��9
q;xG{1���L���C���k��I���H{���$�t���,6���Z\��u���������?Qk:5N�>����l
�Qj"~��=]�MjMF�!L�R�U,��]J�
�@�vDn-VU���I��R���'�
�|����)�d�0�RJ��-%.NC0"{5���!����t�����#/�rRv ��J�Q�e�e���'���������|yXJ���'{Y�����v�H�!(%�Ow�h�/!�\� �������AF�]�+�+%��%j,�~F[�l�>��F,5!N����D�M)�u����{�1w�v^a��;������Y
�D��b�Ai���Uz��>��Z���v"Q��cK�2m��������>5c�a������]U�l�N����B���������h.�/B�<bh�V�&�#�RZ1H��^�\B���j��������RIH�r{;�C���	���z��z���`#NJ]�kR-�%��!�3�;�'Y���ks��'���@X`�3��N�w���Q��Ys�����-��KG��nGc<��gvT%F�(y�V��
6�$u��i����&�s��X��^�GVmP+��e%��;B�m���F��\#��{���\!����|����~d����f\A��Vq���$��fPt�:i]�e�</�d o^�9{��g����m��J��?I���!O�{?$*���H�

2k�P��Af������o�&��Mv�3��������B�eK0t�C��_���}w�y�,���m�bT�X�����
r��+��5`�r)��q������P�u��[���_J�;v������� ��A�9�lJ�������(h%]�q��������z<C3��;SLGN%��3�"L�D,�x%0����2�0l����
�m�-���l0�O<���6e�u�T�^��_�h(-A4�.V�=B��n	&���b���G��m�0}^mR��4���JR(�Q#i�{�O���x�Wo��4�1�!�����'M�����'U>�4������>���8:(+1
���j(B1X���l��*V+��3��U?���&��9��|��r�X��>�d�1�l|���
O��j�B��4��K(eh�^�q�!������-���Z��������eF�.�.�6�c��Z�W�����Zb����~#�������j����1-��[7s�S��k�)d"�~����.[���%YC\��K�H�WV��j
NU#/�+�l�� ��7Q[����)��E=�$��,�pj��� �~�$�sG�r5�S��Tc�M~q��:�����CI������5��vI�h{6�P���&|�Kz|����g�P�jB;�^^j)�g(�o�K��J5� b��_)�3�>��P�1���BK��HX�`�0�Ojp��q��r��"IV�LyU
4k���D������W���R
9��M\�>*.D??'m�[|0h��^�])Zd�b����~�g�]
*���H��aOn4��F�O.���G�(��&oB�Xw�A!��~���\a�I�e%������e�������h��P�z��L���vw��.5e"�3w�����F7Y<#��F1h�~q����ILl�#��~�MR3���+ 
tM���������������uKM�]"d��V�Nf��Qg(�'���7�C�)��d5j�.�����0�=��!z�$d��d�h�B��j�A�'�E\HJ�r���]	������gi��O�+(���P{J�%U$�
b����+e[h��nu���|
.)X��Fy����G���S������BF��3�x�5�E-q���@������)�B��A����5�����t�l��[}������VB5�0��o��"W.�*3����m�9�~>O-�����zb����e�������
�@1�Q�=T��P���SX�Ur���UO((������0Vv
�O��v&ZK���-�L���D���
�^��#���K�^T����3���DT-��V������flbZ|Yc��%`D+{�����f������8�[�7��������a+�}�-�M�H�����d��>�fB5�A\�f,�#�i�^�`SjQ��6�Lr�J���YN���?0Vnw^Z���~�b��%��$�R�n����@!��Z����i5����8`����K���i!p3�����=Xs�Tp������.S�qJ�<��A�%i�����{jPv�h�!�z2��W.�4��<6��k����*�����O���ls��T��d��0���SKW�&�1	e�"����I��"p�IX!@���4I�'x�����H�.-C=��>+N2(�������?W:QA�=-m#����`5V�D!��L$�+�?%��l<�wZK>��!9�F}sS�sK,6=�6��-=~��x�>L���dN@{�q������ ����V������=���t�%�13pj�d�+Z=bK4�
�	h=����qv.I��H��,�?y����E����6�2BA���_
��O�S����kr�������Jp�1�^E�}.K�]f��f�|���#+6��<9��N:Ci�}���
;�GD������WEW�W��vi�vjF�&A����n�@ '8q������]�1��[��5��45�rv�J9�MD��<�B�y�o��Y��`h�t�-�?6��������6����*�/�����@�
���M���&8��L
��k�H�%mE~zY����{h�Y_�(l2�	� $��t���_�	Y )w1�B4E|o�]��IE_S�Q��#�_�SDl@�TE�&��������,������F���	F������t�4�|��9+�1�����pG<6��>�D���&�8u����R�|�cG������ ���vP�#E��x]�
G���@;�lX��m���n��w�����;�0;�\,��2(��].t����w�f���A�p�@�(�w�}t!����X%�nL�
����������7����J�#��d�{%0�A�B��.�c3��GT�^�A����s<s�����x�x��������	�<g?����-�@���-=�-��6�YUvt����'j��s�oCP#���V�2�f�D
�#�E
�.X�]����F��
���C��;3���n���=B��}��H�u�8������	$$��{��=s��3����.a�+�����.��34�{��(�����M=����J�L�2>���~�}�iG�Kc���(�j�;���B�+E�Sc�����A�T#a����1P���������P�M�D{�]�����\������_��g��,D+�sX*f<�)��\0�/�aJ��MG�!]�"j������N}����_kQ�Z���i�"��^S?�>�������8Vk���1#��t`wg�C�[D�����P�LaQ��{�V&/��OF�hT��>A�	�������Ny�!|7��g�}�����1��^d!0Xf�p�g�}��Z�F@�t��bZ��+�k�����PT~��"���>�S��k�+�#P������E-���M4�xFz�wQ���I&���7��Dr�"*@�r��QA��~�c�9�h[�u���J���|��a��lB"D�58[��se�D,1#�v��At�����]������;��`{R8�j��^����]�J9�x�]�|�j���e�H�i�Og^H��ul"uF�P�����N�gu+$��s
�v�Y�s��p�_niR�tMC��&JQE;wK����x�Q�]�-z3�q�Xw0�=-��d��P���hH�i�����\�]�ROs������$��$a�L)=����#��#�v�a������G-��UjYH�(���U���ZC89��~�
��hh2V,����!�U�=��e�}���n4��Gq�h��+���|�P�V:@�����C�������	�G����eu��s�6U��1!�0�����;�����}��5�����vK���?rV���l��=ab��?
������#�?����F8Ua`�f�����xw>���N]�P7���9C�hk�?�9���{~����yB)���z�!��g��
w
HZ
���*�T���>�� 	o���z0*�G�d�DW�bYGL�N�fd;To�H{��!3�df{;������� w�������@e��[Yea�%�4���=R�lAf�p����%���fJ���l� 
%�.��B�-��e��V��O�_9y:����qLQ��������~���_B���Hv��1q��=����c���0��m!
h$�#x��_�]�������we����Q�u�R��(Mk�����M������H�y��V0$}�It���z����w��3)W�d�KT�J	� �L�PV;}9��y�=;�l�t{O���9%�o!��d���
��D�2�x�D��m�(�=�zHK&������P�d��l�k]��q$�FP>����l� ����4���P�f�t`V��d��������>c��R��5��*��+"�A�RB����P��3�ir�,�}[�=������P���c��T�����.V��9|��^D��q<O�.������eM���a&!T#�����b���vf�����Z�`o��8VF[�0<�2��8�����|����h����h��2t�MV=bO[/�����������.���Et>LA��v
��_�}!��%+s:���e��9������&���>���d�~*iv�Ma������
\c���)�`aD ��������(��	����>����i�%ds�k��-���s�i	'�����?�!���
��b��tZ6��[�s������w:�z|�!�7FD�YM#���e�����	���^�3q�.V����!�������p1wR$~
�X�c�8G��A���:���{��o�2J��o�!��2��������S��P�u����)��E&��.�j	�;��#0�����W%$M�����t5��hV8"�[M��;1P�E�5NN��)4-�/R����w~b���u���E�N�#�������yL�L���d�����G]���nr����pD��4��O������Hj�h�7���c��t����]�G���ve���/��Y�`����nde�#V��z��]��yw
N����@���S�@����sz�;�[�����������BD������-�k�7���s��[���y�Y3-k`�zNh�2����R��������H�|
(7Z<�8U1|���y
�<z9���"3�����h�=���s��u����5�����0��a2�n�o`��[F�?�=7��OjW>��;Y�����#��)��O��a����%��	=�eV ��b��7�
.��g~f�5&8��	����X����_F�������pg�R��
JVL	X�|
��,b��/��@z����w��F��(=���]�����6�G)e��c;�Pg���7=C����+M<Ze���pq��.wE��d�����,zj}�JX��oq@�LY�-DG����+�Pt���d)�U����$��0�~�tw=���,�B�[cd��~JR�g1���Y�
�l�)�W��c�D��W����
i;����q��&6KP=8�{D�H�4�U<����?~J��L�F����LM%<^��[q�{xf���A�T�.�it�zo�Y�����M�( %oG��e�3\Q�9�RP�|9�!�-x���c����������{fK�D=��6�j�xn�0L1���K�n�����i�B��L�q�B�S��Z
�[����e��j���]�)Z�� (E�_����(���l�"���d'.�B��;��I;�|\F�?f{$���Hy9`��p�h��xl��$����f {����t���-W���by�/����k�����'�m���e��h�u�����#����
���hL�4��&@���V��0�FJ�5>=_t��>��d��&�(Ps�Bb��������"�<����?����-�������t�����c"������,* 6)�~\�<��r7�,%��y�[���������,��rw�[�f�Y����rh�%�,�DOu#�9�/�1��Fw�QhF���?8��:��.G.��E��%����0A/A���-{_>�#�i,����eFd���Q���C����"�����ez]��5o-���cv�"��p���\�M�2r��G[����S��vhQ���8��H)^afg=�0��.�,-����U��[���@��L!{�����UpE����h�,��>Q�0����d�Ud��a:���*;�/,�Z�e���=b,!	���8�7� dC9!�h,��%����X��d������^X{��Yn@�yG-�G�c�I���q��r2�����!e��,���q�$���������g�-=��r���mo�_fK�����(W����_���oW��P�Eo�
�&f���`�8�H��.���P���k�%�qUy1���J�-��V���F+:�����9t�&���irM��L�y��R;�+�bd����[��/�����2��?�[��*�]��}f72�US�|a�Q�����g�)��G$�-���`��>d��&��Dna
2� -�|[D�B�������J��57�?��2�`Fv�f-�t����7[(*+�?H~P�D����h�6;��]_l������=��.R�\tn��g��mO��I	K��5�
6�v�o���[@C��m�1P�G���Uv��k���E��-�A�[�Il���8�2���s�a�Dx�������v$b�l����]c�l^����nY��3��z�)���������"Z	������)�T���9��/ |���a�� �|��:���M��
/j��$���1���J�����;x0g�id��`�a�f�Y�$<����i�e�@ ����?�6�B�x�����\��("ML�[B�C���`���G(Q�O"�B��|��t�I���s����7#��<���gJ�m�
�<����2�'����pby������-Y��,���A�i��l�����C���Y��^�� ��At��{J����d�	�v���6�mS�O1nAp�io��g�Y�l��sP�D�YA%h�0%�4*��>Bn���
WhY�������=�P�! d��H��V����0�$4�<���B=4A����	�w�w�,/�Cn=x�����m�T�Mi������a5��t�#G���%�3�.��v�	&��ncI�WE��|�0�v��rWS���
>M
��<"E��R!XSkb���=L������<Y5�\�1~�*��y`1E��n�D(?0�U�c�N5
G��(�i������B!3�c����WG]�1��'�or�F�����
))$�L�~�W��O�r�Y�����j����������1�?�F�g4;:�����d`i{�#��)t���`���S�������#������TO�����x�a��\GE�Gl��)0�o_L��m�G��y"����D"�=�[���!����h�R.�{���Wn�����^2���nG�If�p>5��T`G�S��q��_5{|�����4)��$��q�_�_���)X��E����?��D���A��sN�=FN�'��j�#���N��6����#�������r~�f��e]�>�>��=:����J�\����-�P� h#Q�v��T`�j�#�D�#��g�E���8zC���mE ���j?�`��Y��+K2n]���\�`:BE��G����Vj��9j�n����4��t���Gf�2���&5C��`�m�"u����|a��HT�!���3�Eo�h�N��5����tG��CE�"G���D�Pa�4]�A"�.T?=�n=�/!&���w��g�:G�	��_�
^:�6�b�g|�(V�A��������#�'F7�-����t�z,�0Y���ql��7�l�
$!��E1�Z
��S��Tbsl������������+�O`�����2���#��$���k6���_�7������e4��-��7E)wn���6"����BF��b@��Dl�#P�3��=H6�pl�Fs� =��C��V���4'�����d�`
7N4�?����,��}��Pcr�`��!�G\�l��m)�$Q�S
N���q/��ca�]���d�� ��m2��X��S�v�����l�u�J�ua��#Ks8����#��z�����c����O4��V�Ne'��[p;�e��1���U]i���t��j�;i#�i(��Xgv��W�P
��{Q��e#���J�
	M���D��J�h�+E�O�9�E6���
@�.Z�lm�y>�!����}3�%&�/�����r�Y�-N�������Iv���(Y���Y	=��G�}�������?������b�A���y%��{��Pd$��{�F$c��{��Z�*-��0"������Sm���8�-4��`C/����
	%?�$��{->��n��(��{�~#��b�pGm0���h)�c�cK�B����}����~�(����Uw�]��r%n�����V�0����9��F|��rm~2�MF���oFa�v(o����P�{����.r��4��<��fg�u�G6�����g�c��J���/g	+��`u.����&�J}�Bm�C��P��-w�.��]�W��>�(���\�������b{��������o�^�~	:��|����t��3V!��P �,#����� � ��N��-����C�������FZ���O[��e��`
 ���p�+�[�D����e�k��C[!	=��z�0_��{#	8���Spd�}��������{h?���#����<�&�D������M��1�'2W}o�����*���������J-���2���)��@����6{V�)6o������@r����Q�5��:JW����G��b���,tuv���{X�s���+t�&�l�!���7�y�=w�sL��H8�B�9�k�^���a�mT��'�����\����6u"�%�p�4R����ji��{#�	��^�M��$-��8Q?�g��#Q����V�%���#ht7�y�P�"�����e�������<`�� �-�7�A>:a]��5����EB�(���5��l5���%�����H�i�=�g��%���.=r�UP�:��yY���^��G���~1\��������.N�&�^�mu��<�=BB���S�#B�{�����~�xR����8���=������d%'��ZK�<�YQG�{1J�$���\��T�R��N������������p#f��b�(�(���5D��
�����#��m�����kN��%|�ZO��xl�/�����(�d,�ZQ0�nwE���b�[h���.2��E���G�����E8��i�a�������u���'�Ga1�D���W����z/�R��`t��9��=��R�R`h]���rI��Q��{;D���g��vS+������$p���7��h��.T�haE��Q�����m�{{�v���wx�*�'��EV|��@��������vd���":����{h|RN�&�U#�����z\,�	5I����@�M��~jT���'�����T��<��@-��b����;ME����Y�=������c��FM��n�`hs�������{�E��,��H����E���vq���l�0I��xq�[�&���F���!GQNa������%|zg���E��0wh�T�����I ����e��g���=^�C��%�~��PiFP.��y/x������Z��j&��jUi�"$�8���}51D��i�gh����nz������SZc1���������B�I�e!�%����h�iM����E{�4d������_q4/h������8��-+Z��vB	��U����#���D�������<z7����+��E��Y�*�`d���Z-N�0
)�R,��M�I_�����
FB#/�bZ1��8���a��T�I�\����G���qw��_=>�>�j��~����A-����s�����j��Z��	_9�Q�b)���ea��:+�9��<�q�PKTOo�S�4+����@	k�������
h��V��oy��m���O��"��p���s1��=��g$*�X��;V��`�S�w�T!���D
��(kub����Ec]��o��?b�T���,�
��l�U�]@�M��?����6���	�� ��?�����Z��Z>~Zt����b�t��)@�����b����k�s����������[�F�s2?���V;��V��1h��*Z����t�~��
����y���X?L�^��h8�E��e���^�V����K7~��E�ir#����c�{Y!�a��27��q����%�k�m��69?* B�$���O�pW6����h�V�
`F�`�r���+`��+{�:vZG���|Fb�9k5\�Tj�[#D�Y@�r�^?�������>et��EI������o(��
w�C��C�]aw��t�W�S��3
���}��y�6J���

��>k�>�8�v=��TK�g��������S�A6�����Sm��"�2X#.�"��Z�������a����P���(�P�/:��M���uPd���	{�����k�v�"�����o(!,��#8~��z�ZY�
HP	n�Y:����	;+��r}O��~4e��@��'U >�����h^'��>*mw�����}i���������?U8�1l������Z-O�Jc#�3./��)����~��#�q]�Sf�-��W�Fp�&n�
@�*GC�{���$���	��Q8���8���0���"���M�������WZ�G�D��o�� �L�H���#eE�le��������Z��bW��uVS;�r����=�����}bn��k#�������d#��7��Q}��?������3s,����D�U�D�f�#&J�������c���j����p�wX��a��{�*�H�_�N���~\��#��M����HJ��N�:���*oD�J3�@XI4�h��pI5�������2�9�F �.|�ZJP(m�m�M(�Y)y�Yd����~�bZuI��0@hS�60����#�e}/��<6�d�Eo����p���,�����D��M`�/�i� BF�T�R4�nBp��$�DMvsu�\k�FTn6�M����P��D�j���iLT�.F�vs�t��F`ON2�h��#"a�|?{�P6�	qY��M y���eW;f��#��-`��o�p�����f +Z�60��\��@����*��o��L�9�+�6����>���_�T65M�����kvi�?'-AM��
�����0Q���E�wl�	��>x�E�����}�E&�w�����2��z��1?�1kO�i�����v��B��WX����%�7�24g&���,�����'Q�O�|	W���`��w�W��&`������&U����u4��B�������m��G��E��wa��}kQpf)��9-��+:}s�=�����``��c�v5Z4cx�sR�f"qj�m���6�s���P4T����Ye�U8�V
U�m��<���k�i�B�Et��
���%e�A�������:�}J�N/��G�z��R2pl�g]�w\�����zg����^�T3�al�%<m�y�
�D��8"�������-�\���"��s��v6A'Rl���b�Y-��P�mc��1��M�n��?�b2��zD(���b{>��[k�c������l���v,)n���������)�>;�����.��6a�H��Jtf�p#��e��xU��x="��jDg�������C�R;��Q����"�Q;����u��f#�Cv��o��E^�9��D8j�n��M���W�X�d� �����|���]�������@������rPZ�4u�=G@~��Aq����l���F���?�C��\�-	v����1�z~v�b-b����������uZ;U%tA
���oa���d��v4�/��G)b��9���r>����
lWH~�k���T����
QhGURqf�e����[����\-b���B�8)zg����}�_8MFD����{bz�c�a9��A�ma�(0"�d��
���Z����F:]�D���ja�t�=~Ilb��[�������}SK��]����H<��O�2�+��a�U����KE]��M�E���Q�_��yZ����+�"z%�W�2�)����X�����z�������g<���n+��G��/u"1}�������q^�Q���i��fz\#G7�IVz�CC!H�Q�E������������Wh:����������8"�$��[���^��{��|�*P�=�-�H�Y0TC�Hl��;�����qc��W���U�"�~��Y�-�DK������~z��4��I�Q=�I�k4)�/�\���H���AL!Z]V�8\a]���`��F&��j��5��U���D��~�>�����mO�)������	��Kk��D_�tXY�lW��'��Rh��a��V4�s�����MA0Jf��
>D6�]hp���������3��.�4��:C�W���b!R.wa�g��O�R�q#{�9���B#�?80�G5�/��G��>�x���E7�<���0����O��������Q��6��LJX���Ty�D/���y������"�F�B8�����S���hG�H����U�Jv�	l I��%�w��Y�b��qzaF���
�����,��}<���
�<�����\"��)��������>��rX�c��")�����>-�m����|�n��`G]��C�w�����Q�Rof�92 ��^�Q�9+C�ZT^^�����}+��F���p���0u��)�c���"H{�u�����OX�>St���(f��� �M&���}?S`�	���]�n��[8��h^:��T
a�h2�'m��rU�ChB�*��+�p(�5?���bt����[��9�.Hi��C�B�����B$4���c���`�a8��o��bYB���=��P���Gt5�$�N�+W���C�'���8��q�0�'C��&;{!��������4 ���
��s
-d��
0�*���"��@���lc����8�W��4�C`�W,C���4bF
'�����J��G���g��6�n?�aW�EY�Z���9�5��pn������t��#�P�X�R	,2k�{y��v��zy��/�8�O�Q4�~���Y��s�T�hFj4�0XRw�r�	���VRDz�! ]*�OhmX�$/�������P�Hl#	�8��9u�D��Y�@r�d�@t�0���0�p���\�N#��	L~>o����gh#y
.���.��/]+���
3�l�*��s��_�#PE�X�T9<,���R������H1>���KI�cMg����4Q�cx��%�:��4���WbM�A��W���i�p�
Glf��S0��H"�1�p�%K��s�
,!,t��hE���ec�1<���=����,G�5<a�o C)��$�:���Q�P�p�?�_�-q9E��~�����}�S1����������}7�MIAL��e�/C:$���,8�E?���(������"O
��r�\������FD�� ��<���%;,
vp*p���{#�di��-�����tx�T]iQ#�>�5)�.0[�g���,�S���-���(��tK��F����UYt�������':m�/Y:�HK��U�v��xZ�����$�"tf
$![��>d���*Xd�Tw;��H9;��+�m�!�4[��t��?�P�L�������|��)������O�V�HW5
���������i_��"w���|��lfm7�MB�� Z��Ed�t9{����EB��~AGD�T��W��z
!�x7;��I�BC�����4��T�����
�����P�[�,5��]�W�9
p�Ov(&������J��e�S	N����fS�iC(�]���6��������u"*E�u��]�7e���<��O�"K�Z)~%����]���Hf���(�d?������)q(������$��h<1������h�K�o:4����>d:b��X���LE������5�U<�y��7�4������Mj�*1��A���*���B8dv	��">�>��h�=��\�*�$
Ge�t�4�������8�O�-�4x�
�zt�N���Q�e�-����*=��L+��aj�W�����r�g��P�d&vs���i;(!T��V{J0U�N;��tY�=t�j`����N�P����S���}#��������q��!
B�#@w
��|cE��l��E7RU�����{������Z�N4��+t��9�-*pt��Z����{g��t��#r5L��F�X�S�]���(v�J�{ f��I/�SC�����Y�me��~�8�k'��b�{?�aF���������
��q4i�)�;G���0��9��#{�XPGg�5���K������
X�Y��j�S"��i���
<nb��jvV����08$�'������vr:�zgD"�>Qf/(v��B
��E��tv5NW�qgAK��~]���9�W$_�@l��8K�k�4�5,�#/+1��BQ��	�=%��,�I�����-�J���>Q\�]���D$��?�����[Vh���R�>7�e�D`�B]������FN���QR�U���>_S���b#��ZVl�Nx��L��u��C71/zg��3uz_��
k���r�2" ��{U�������nY�A��K���H��IK�%� ~��0�2Y�������`df_I�jT5/'ZC0P�p�G"-��q��{�\P��uET��Xk:���XF#4�Y���z<�t\F#��^�f���n��Y��j�����%��F`�@,����8�p�q������	7��l2���+�]���-�f(= ���-J<]B*(E��S�dA���3-����t���=,aYg���z �D����[��)��#�4�c	���B���3�UX����������1)�;�VY4N����N��������>QFI����Z�^�,�P�����u(b���_���������k��gzr����pY7����o�V��u����E��%��
�JPS��4kz�k��w	���=9����6������o?��T*Q/��x���U����0}����8�F_�
��[�W������X�0�b�v���?Z��������Dd��������0�%L��q�7��Y�EYCH���
:������u����6s��>���<���mT���,��Pkyc�
7��p
�V���mt�a�-N�i�F�������h�YL!u�
�����/����/|�l���,��U�5�@-[@�b�~��|���pEwg;��~'Z
�O�H��5�L�����z�C;�E����`��"�_2�wV�����E���W{��7�hT�P��d�~K��j���z���������{D������������]t�(�������%��h��@����t�J�4�n\����
���F
9�t[iO��	L��T�G�"���)����,�>����/*��F@��oO1�&��	���D�W�0ql��bh�C)��E����w��F{[��dP�h|�sGG�.^xj�n��C�����#U�������V�d�G��-ckl��>�[Fa����Lv�Z�]7��#�����/3���&�����	�((�gD�M0cB(�8����_`v��U{VD��T��_p��.�?���
���{��	�}h�`��eo�7iCe^UG��1Nh+�es�mh����t�����^�~���uE�����.�Zt-�[<n!t����D�����d��[����q[-������&b�� �mb��A�����B�9u3��m��U���JEPJT���c!����-U���$p�����-H��&��'b���[@��Iq�v4K�&��S�V���[��=1��G�hV���M�x�&+�D�m��u���Hk|X���:���XJ�o��?������-����h0a'f��?�!A��-bG��[����$��&�������T���R���>(}5���X6�s���{@acBS2PP�T8�H�Y#�$��V���.B��ld�SM���d���������Y��|~FK���z:\���O8�^3�m{9�wN��v��\�X�[�Zn�_#�
X8������o�3�J��+g�?����!���%d�a!6����7W4y�Z�=t\��I�v)R5��
����@��Yl��	�����1���m��MqE�e
�����_����>��<��m�����pD��XV�����%���/^t#�7�&��:W#H}����60��3E�3�s���d8�]�F6<�$��y����`�������"��&+�X$���P|O�z����[]G���9�
��m��!�;�I�u�G��G��-����?��N?!�l,������>"��/gjK}������c�0�a�,�k�G�l���w:G!���6(�:��t�x�(v���V���(Y[r����iB�y����8����!�7�:d �H�C7����3U=K'��Ah��f��� %�����w��-G�D��z�M��'�M�_��{�b��C���5w���0������98%���{1�i�:������	�V���.��L���l<����:�B	f��C��/?���z���_%���3��8�"d��-T�7�b])�M�j�9����S.o�{ZD�?6o�&bG�C���n����������`>�����A��(�ke��#X����H�����z���Q>bk�n&p v%�T�v�!����IS$>�s6���;��#�`t�0���1a�]g���y� �����
���J_Y?$�?�)R#|����2v@*t��|�N��a�����|f[�����r��y��WC��DG�A��UGXAf�z����I�ml��?���1N��?����Yf��T�$���T�)�Ow�VVX/+�����J��w���m������0���!�+���IC���
����_�	�����l��k�R9��0!^h����@�n�~F#�v.4a������=-?rA���/"�����5�iI������$�nN8�d���0x��;;���a�������-�����e"�@�����I�%k���G(A��yt�����
�l�8�� ������}���u^u�9h���&(����3��h�*+���+5�����F/��0c��i|8��w���6/Fw������bP$� n��uqKj��F�Wc���]��`c}o��nZ
�I���B�z8���p�9%��bX�#�������x�	4����:\��tzo��Y���i�;�� �yd7�����z����+=���h�#)�������6�������Zn�W�h������m�m�U�{�Z����a�"��~oT=F���7�p�1�qmR��W��Ht���$��F������HT���@�+�9�u��G�L}�V��!�����2I��],UF2�n�������T�h�:��y�J�:�gHZ����q��!��{���2>�G��x/���0�A���"�-<��/��l�I��{x�q?�����;u���H|6��Z{���r�H�����o���qK�y��6U�6B
�	�bzs�.v�%[C��[����/����������1_�9��AV�Q����=S�����i��.7=<���Rqr��?T1�c�����-�(���A5�����������)ZE���dE���9���a���4ra���t����rl����:��7�f����<�."@4"��{Q��4s7!�W�AV{>)�	���+����C^��	��������������mW,�	#��{�D��wV����I����w����n��A�{��g��EZ|��q~�/���"��+2U���'�A����0����A�h���8��w��l�@A���%��E�LZ�p��J��>�lE���?e�cz/�3!���)���D���1I���v�$)���@@�={t��J�g����N��_��t����[��=`��'P��P�	����]�d��!��z/���#���m����:F��5>s��n�C��k%
�t�V	���G�n���/F���H�}�9��[�f����G����|lh����Hy��X��wf��^h���o�+5�#�p��l \�0�<�c��)������D�������g��������#��<���k������{e�b��^��<r0�N~1jqW,:�l�W�i�����^�Z:-�*��`7�����+;���6Z���$8�=���"�bvY\���)����Q�[�OY�E�U �\��G�k>��I�L�`�D���|K#����ZaQ+�� ��B����
��a
���ob�QkQpD�Y�F�gB��.���b�c��Vr��|Q0`�����B���JzE�X`F���^$z�[��l>
*yo�fw[vW�c,b2����>��.5��v#�3;��;4NN�)$�a���������22�cG��O
��A����iZiv	�?�h-+�~�!5�/u�5��f�r~�4U<�hE
)�h������E��(�2�dPy���D��'"��������+�<q�1���0���T�o���;�m~sKW�=H��n!�%��*>.$���~E'?��y���V{ �f0#��{)1�h�)����	C���#��8�����Z"�����Vb�dXsfhS@4��b������^�16�LZ�)��i!��5@[���c/�0~>���~���l�Zx�������ssn5�|8�p������LX�Q������<�v[��'B��`
Q��`��;l�pD~��8��~�"���e���X']w�Oa����d:Si
��������V��*z��>�ex���V��&L�/&%�v��
/[t��E	k/MX`q��[[#L�������������gA;T�d?���I��{���f�q�P�h2Z�i`@;�����������=u��A
o���r�
��:=O����~!8������|F�)��4G��
���\�b2�g��`.L*,$���p����3����*�.����`���#-�UK�qg�cJ����w"�X�@���k<IO>��0�����"�WeQ�}E+:h�I��'��h���}n����{�@
}�h��O��X��K��g�[U#��M���������0�jQ	�w���>�$����p����i�������5<)����E�p_q�/J��������H�Fi��YXc4�� ��P�G.]PvW;D���Z�Q1L��g�~�C���a�}���V�I����������-&R�V�4[��k�0^���v��e�B/21Y�!A3��/�z��E|=�7��7����h��1�~�p6P�LwUm���BO�U�����j0oM�t��	G�J�As��K�B����UM������n��!2�oU�f�R�s��0�:��}"� (��1z�����!dM`t�����[
i,$����P"����(�jU��e����]#��k��
�@����*��FD��]�������V��X��13��JD��^��;�\5���Y ��q��VF�������LU�y'�f�n��t����d&VR��<
�U�@� %�f�����L����#�b@4
l[dA&*�z4��\�]*.�Hht$8��-H.�*���������
�7�a�`Y4B��VV�E�A��l���>���-�l�����U�<7���Gj��[L��d�B�����U�;���W���j5����}�fO��dS'����8��a�$�>#��=`������d��<^���.�3�D?��j�"��*+1��?���1N�� ��uz�������^����~�uG�3�lrb���u<�����UP����*�bk?�ag:xV�	�P������$��E,���j�ig�@"�Bl����;'Y�;��?���	g�v/�K�}<N�Ta�<1B�r����}Q)xwC�%|���)[;zIf4:c�lJ��(^m"�D+��8t";�2Aw�E��5�-l��d�+��W��1�O�]$v���C�^X�L�,0��I�W�+z6rs��v=B���8�0��	��}G�&�Bv�h�	�P�O�i�2�}Ps����_NK�<4�X+���,������|�>P���9�3����*���b���o5��[�S3fMz+�*[��N�&�!��5axhJB<b���j�\^����5�>)D��}���u�9d]!8��F��f�����|�L�����V��M�.�:�=�Oq�uYw�D��Vm�RLV��5��6'�������x�M�C����O�[�H�:�&��h��T�����cG���{R���3D����(
nw�x�%4<F�/+�FhL3�0��1w_C���f�����A�m�3k�Y|�{��E�b���LP5��j�$��Ql����p ���t���:�������_�A��\6z�l	2[�B�����l_`Dt������Gp�_!]!w?�2!#�%������cG]W���r����]�����K=�)u�@eM�)�M��h��7�1��!���^���yA�����.K�P��Y����\���o���]IFI�_����Ys�Pd���6��K����������=Nt�M���[*�����o�0d�KSyp��������5 GZMIma��j�)���"�C�H��F�9X�e?�����U+�c!vJ�#������Y/q_c�F��P����p��w�/��0j,������!�h��od/�#�q�Q���Y�*+l��'P+��I��m�8��Fj+�&<���k�iR*�0$�5�R��������p4V����C-��I'z7D9��m���Z���.<��7c	�"v7�e�*7;?���M�����9�f��Y�)?���/��n�9�_e���Y�A����0 ��`�F���L
|d����J�p�n����h;-\.���������.h��R#�2�_��j�.|!3>������.hAi��FS�.@��"��`��y7A����VTv�_�/&7���*q��,�e
rS>i���a��=�/���}dM<n�V�G]U�'B�/������d�� �]qw�t�7����,Y�
�[�pj4i�/D��.AS��M2���=��z���w�y�wCwnO��f?l����;C������3��I��?�����}Q��0;Z�d����4��ZO�������]X��n�a2�|w�D�r�_��qJ���M��P������o#��\b�#����A�}xyi��E+��Ax�F�3����T��=�kTka]O�$��V&@`a��?��A]�����6����B�V-"�t�v�����0	���R�c,�Q'��
����
��	
�ik����4���T�$��,��Qo��}�w8���fq5�����Uc+�!�]�6P������L��x�������h�D�o{�xJ2�'�
m]������w���+,�	I�6��5�)���_6D����[�V�9�!����3;Z��:�e���=�&��iA��=:M��7�"������R:��~~�x�zc��cd��.,O�E�':�h� �Y]?cGj��P����y�T@+�]Q�S��$��q�[�v��KE
���7	��e��V���e��������@W$��B0]�B,�%	Xz.�!�l&g12��Y��������]A�\�$�������Y�����e��n�c��?L<��/�*��O���P:�h�?���E�4��
��-<����#��|DhPl����p�C� ��<��?��QhGO������N��:(g&v���$O-��p�e�DK��A�y�?��"�����P�Av�!�������F1;(��og�gZ�a AA ��w���%���?��B2����A�s�p1��r[ 
�t�#{�T�35 ��5��d��Y�|�zq��������T��;(��I���J�����1;��"MS�
�a�E���63������l��/T�I��Q����J4c��!���EL�a=/|�H�>D�����?�v+�����b��Q7��[
Qv;6�_�Q��f8�x��	��
������ke[�?���6e�$e�^�RvX �;;��b��5%�
����M��HwAg
���H?�<������)����3�a�f?������(7���a`�w;**�LE<>
������4z��
�X�����.��"���0���k��a�=�nF�At������[���������)����j�h�����4�\P�F�OC���o�8�|��D�����B�~&��ZU\,����X��u������
f,k�l@���a���x������\����vX��������
���X�>�U��5jkq{T�vWa4
�2����+z�G����![%�U�}G�p[��K���'�iujot#�8�������FD�!������������@����h�s���_�����=?'���?���hCPY��v�%'s��B��n��6��,�!���������3fqw�H�m���pA��8���w�����x�.�H:�H�S|f�M���e�v_v�R�w-kk��8�%�m���15;9e��w��U��!��m���l9kn��Q��EZw�������b� �Vog]�v�Rt��'�>��n����N3����I(-�9�{0��vB�T��`Sk������g$�������gV��`,L�@����$�,���o��E����2��fm�E
"������)��A�����Ha>�Fm���h2>Rl���o�~0.32>�����E�>Mt���d�O�J��������8P	�����B"iG���RDW�vO��r�5
<��Q���vhR�9� v�OLw{@*��u�M'������E��p����u��QLGo����HT����	TD������4�Y�����������4�9�t5���26��&?����kG���J�%b�N!��A_�(eV�Mg�V�����������X���������>�ma�>�$$�n$�W�U��B<��V��D���R����e:��*d
���|p�%�g����B&��N�9��z�iP�>���J���0
G�w+������%[��#���ZD������f��������yt�M;+Q�����a���i\�1:��;p��4�����qo����u�#��2��L�"��l�6(1���g�SS�1����g�(xs
��xC�R�����34`�����)?G�����,��Cp�
8�6=Y9�oS;�;������,l�g�.�������4t~�D��-�XE@�H!eTV�� =#dF�sfE�!<o�H����S�,Vi^1��(����a������_�\���O���5�8����#�mNw(�+d#&����ZD7���O��������{�y��4S�L!����Bh������1>��;z�b�Y���te��P�r�d*���G>2���6Vc�(�A�(��H�����xe�{��2�=X!�>j�xLat8�������6�!��~M-;n�iT�5�����I����40�r.]o�KMC8�D��� �l��{��3m�j ��������u8J�����T G����7��KV��[���=N$Y>�9���$��.t����&"��r��tJA��D��~g����9z%n��S6��A�_8><��h5Q��m��k*\�q���B,!���H�QvTW-a������R\����p0
L���f��,���	;T���F]0����e��r/G
�#��,.p����K���#*UW1�.�G�_����ud&��x�rPv����s0e�53���p�������G��I��7u��s���n�p(�G���*�
��*;��������3I��.O�7���CK����Fz���-��1��`&�5��_�5����$�
�e��\��2���v	�-�F��Q�`v�/GVG����{T ,}i98"[H�v��_2�3*�eHj���`"�����qM4n[?w�[�2�M��%(���L��_�������e	������3U��f���c������	����-}GdD��	�W���*����aIu��h	|NP���Q�V���~�{� Kfn4���;��]�}�ZQ?���x���E�5���<����i��pRG��m�4d��x��wzx|��]m�������p]g�
�xd}��h�W������\����������Z�����S��vo7e	��r���
��pD��%dc+�(ZH�2��d��e�n)�z	�`c���KhV7�,��T�E�.���4�A��ZF+���I=%
�]/�����@%^EV�Xjqa��
\S*�l�!�k�Rw����K8VC���E]�p�����K�K\(`���Y��+eG��%db(���|�xJT�D�d�/!�0(��@�-p�l�}���n�`��|M�t
J��)�N������]��/z^B �/��":&�[���/���� !�s����gj<������w�0���9�����99/�C����(�W��n����/�����`A���$��D��Be���)g�{���:�ELzDF[��&Y��,�=�@,W�$D��f�-$��F���E��l��e9*�h^�Y��KR9R\����z��~����m}��2o��t���E5{L� �-d�e?�iYQ���S���UP!�c���c���'�!�|�oa{�v?�2����1�&���>{�`�d�M�'-������O��p$���,��H���x�F��NMCb����@�����}T	rf����P>����F��]=��S�+�aDd�m����l��?N��LL#���q�IFD�~��b���0�����w��S�lp��m����nE2��c	d���~Kfo��PMH���0�&��-1�
�1���P��{`�������Rjf�����"K�u
�W4	�hu� ��d�`����r ��gx���REg�=����6����*
�]�C�5W�B���p���[P0(z��e�PG��
����z��l�5ioht��P~e�J���2�����+��;�nC��:��P8|3�Z)Iv�`��}j��0E�g
y�l!���]4���`����������y������*��q��i��J��M���)�v�
K�Rd��P�ln�
P�B3��na�O�����c�:���������e�u����h�]|�"��6XA.H�HL��6U,u������������R�L�rd���������K���;zQv�����`
p����5���''�
�S��Dt�ut�|T��:�;���}^��b��nDZ 
�g����F�!Max��2"w���q5���`&��B.����
"��jq���L=�&�MoY �F��M/]Pp�����,y������k�Z�L(�D(�J��mY������Xz�\a+;
ID��!)M�����/4%G��A �����7)�2f[��)">�>&p~��p���
�>����O�6��/�
lv���<��%��d���Lt�#�r6���=Z��{��M�eyO9��Dj��*�L��re��j��}gF��c�'Ii���?�:���Q�����"�S�D�-�V�0�*EPr�G^G��S�i�>t�/@�du�j)K\=B���
m���wr��*3:=B*�b��Z�m|�;5���?E��SMU�������-`�
S����	�b��eZ�3S��8g����a����F����rs���}�T��Fj�u����o���O�F����P�Hs�n!���68 n3�%m5���� ��H�W�l�N��]�����p�ra�j-�W~;���f�j��z�#h�I�6�owt��}�F��1��g��?��O��!�]�a2����j{������D7rTK���'�@!8>;H �Hp�;�t�����L�rZ�4������F�W��������"��������n�k��ue������qJ�W����Mn��l����,��1	��8W&6��,(���a/8��'�����0�n|����=Z����/%����8��d���;�E/����G�����c9��N��8]�E�q�����6h���~��gM����i����HK+2�<�Ed[�����e����j�0���.D?�5��	������lOZ���r]X��E�c�8S��g���Q>G��]����|��r�4�7w����9k�u��#_��\�u�]���e���f+��x�g�\"z��~��])�#��F��e\g&���AV��?�2��Z'�MY�F;�����E�^��t�j�T<�"e���4����g%�3-|����"��!,������w��`\8#���S�8)�[�[��{��W�T�c����g(
�(ck!D:ni
�V��
��p2R�J���O���<��"s��5��-�
)k���%��"�0���ta��{#�R�?n�#����@���@kJ�����"��H���5XB�����B�7����zo��g��L����g7:�a=!��?�3*T�H�#ED��{#-V,/n�CY���{h��<���t��*������.��L��QW��H�������{���f U\�Z�����j����"5�{�T�E���d�^d������ ������(z����5��,��sW�"8�dW����-����g��K]�
�8�q�^$E��xO���Hr&p�{#�c�ON��J���'-�1��F��G@�w.oP����	Tp5�;t9I��H$���/�����	��^����&��j<����Jx���BpI���{�����+�<�o�RPVD��j������J�|��p�7�g��\_�xW������B.�Wq�(IS�^�}�����=�k���P�"l�W:E�qi��A�-$aL�F�Eb}b�%�(z�b!�j�`�~P@�N&����H�����,P>(����
F��S,�)c����B/��O%z/��C����+%�N(��E���oe}�q�����ty'���6.~��E������6W� $���r�����������Y~[D}>�+t��}x��np���0G{b��^��<�L�b� ���0��\�>>6Y��$��s2v
A;�D��*�4����18Oq	/
���n�LF�c!�|�����:�%(dG�������#�O�� 1$���>j%�}�{[�hB/��F�{��%{��D����0N������d�^$���Kr������R���"1�������NA����t���$�o8{��o����B/@���$K�h/u�������������75&�2��.W�,���R�e��&�B~���D��{#5�,���9g�J�������Q�	�����4;|%��~|zb�1���Uz�{#1�^�{�:�M�L��y�%������������Nq�����A������(�v���"�b�� 9���	��U����S-y�����/�������/{6s.B'��	u��O]��K�4���*����������buE4�,�ph��baEQ�Ot�z��CBE&��Tv�?�!dmF��S����,�;�"�|�Bx�������U���
��b$|�^:(��DT��K��{n��'��R�cO3�#*�����������P������V���F��$���h�g���V�,�O8���#��^���t���h[�.�)�]$�D%�)�����"���&�����6���J�bl�M�?Z�{���6zB��iD�NB�*���zB1���DC�"p�����@L���B'Zl��K�����"p�'��������>s�^�W�]�{��Wi3�#�N����W�oYO_K ���g����%����[18A*U�N	k�=�od�!�+���@i�-��{h��Vk�;���EEXR5���l=�
��.�]���
t�v��J�e������o`����K���f��-���#��^�Q��NZq|�e./�W��}��A_|13���w�Bx��xhE�E��J�o����:�"��� 	~k��L�r�����eRE�������W;�M�
O�M��Z��H��^����gIkz��S���H�X��-�%8����+vv���6H\�[c����W�D��'�����+�
���%���3(P����J���z0�2)������p�1W
����:eS��v6��X0��<�N�}�]�0�^"sFO����n�-
gv�
����B�����;����;y/F0F��[!��
I4��5�����.2�u��bz����������1�����"���8�Lom>���A��*�������"K�^�O�[['*��J1Q$_]�P�D���!)h����\RGt^���&�ID^lubI��yo�����8b�*c(�m�7f�����c2��B��vD�d��w��\���p����f�@k�!���4(�u[T�T�8�V��w	e}mu�v�G-��v���}�j�1�F�+���{HkU A4M��P�D
]�_�H��?�������?����C��������j�(�F$f�6,).S�!u���x.�Z�&*�Q�h$Q����g��~z���S��P�s(v�O��PM�o�^�#hh���B2[�	4R�.f-���Dk�ZfVM���r�:�b���\FTIVK��|o���W�I 3����B5*�����m�l���C��5"��"0{�B5(�9��a^"�a��e��x1���6��5����ayD���n�'�����8c������9�]{�Qq�d���]�5B�kwOr�����V	3�{���=� S�h'���6qI�H(���
�h�����y�$�jt
;���LI6�{����Nz�[b�E�G]����Gz�*8�#��LbS���������;#���m��������4�VO�N��e��)Q�����/�ZO�h{���q<ox�fM�K��L��N�E������?���>�m
&��
����^���������|�!-d�v5��G�F����Es�jl��]g�+��
� wa��yYS�!� �K^1}�
�PP���e(G$���;rq%Ng_�}o�7��|���0N��W�����&��;��hA��	��"������>��'�"_'����wX 	�@�	�"������������[h��ne;�#����a���3�������$9�H<�K����/���sKx�����-�_F`�R������>x�������;ct�8�tr�=�'���P�����^�Xd�*A��H��c#�m������>����$�.M`7=��m@�a�y���[�~�6���l��&���2��P�X�	� ��RaD3�fU���X�w�����xDWZ�8��=�.(���gU-K����nM��{{�%[����L�o����[�@^�m�-�&pB�I�F�,��7�>�����C���l�
��k�"b.5�b{��}o�&q;�55Y{���[T��bEv���Pp4�l��aZx���	x �����'�{����wnn���F�����#�U��GQ���fE��f����>sYhB��f��fyD���j��=��o�~���M&��>��C�zT�6a��Q��)���m
1%�rq\�������&���T	�>��QpA�S&h��0e�6�N0`�$��������h������~o���Zv����)l�Gy�0a:2���g��if����6�Dg�=�K�a5A` �����
@��D�v���d����}>L��}�f�Y���/ ����A��JW=������3�0��DkO(vj8#���w�u����)��
 ��x�����$�o��A�,��:&o�D�A��|Cw��l��_N��,�������/#%�5A�n)e{=ugK����L�������d��
��k���`,�:�6�3�;Y���Ygi�Q�D�f�C4�iz4�m�������GY)��-jV��$�0{�wF@��^d���/[��j����ed����z��rNH������ ����l��-z�V83��F��\�=o���&�g
����<b�	�8z�B�	��t2��1}(�-����p���������@(�����d���5��I#�\~,��?3|�h�14�|
�Q\W���(��brV�A�	-0�P���Q��V26��$`����z���u�:/A����ev��~Mw��Yk/�,�&H#b4�n���
%�:	�~��+qk�h����<���_�L;�n[�H���`x��lut�x"E�`@ ��SZ��f=�nC���B��{H(v���_,Dt�� P�f�����"���n?&Jn,�:`U��m��l�3_��W�:&�xnJ���z��,F�C0faL#�O�l��o���Q���6��+�7] �� Lv�]7�>�;��>	������x����k���3"{W>����1��i�Mw*��AE�5�������7���]�	W�n�<
��}�nkCL'*�y�7��8/�W�-Ev�u��G�dF�]��P���y�+�8_L�)����4f���;�Z�Y0�h�q|��N���$���uv�������uh�6��W��6���i�D�O-m��u�����`�D�R������s(�lw01)� �=_�E�r�tk��<]h�/���~�*��R�0�����[���3����`(��������na_&����+���-�M��\�~.�
3���_W���aSt1��Q<��Q�Nw�5�:���T�^k��v�0=����g:�.�C����qk#fn�!���X����<�T�Lp�m��$����(e)z����^��e�����FD���O�Z#��;R��dv�Z��Uss��$m���uB�LY�a�]���A����h)Y2���pNAt���*�6K0����]�
�h��@�� K�?�g����)��e3:V�J"{TE�y'6����$�@It+�M�k��������n���M8��X��)����&<�yH��#���@�����lyn�'b�=���U�������E���;"#8IC~8�=�z�#��dM����s,'�}��}&OK�;�n����3+�%�����Zw'V���7C���4�G��e��~XA#Cl����r���T)��SK�5�H7*�jg�Z�i�b�4�������?Q)-_���@@!������a��V��sh��d!�-���I�^�q�@���D�w�L^2�f��C&h2A���"��h<�����6E'"��<
���Q94���[C���f������C�Q,m�2�!P��3}U�4.�����"�����XJ>3��s���=`�i��)�k��`��o���hXO������PyT��D�h��4������&�D�L(��O�����l+�j���H�����9;�,�q �^I���_�Er����^m��e��L
i��QT9�K�b�	]��m��ak�������
�)F;ll+e����=Z�5�S)��S�,��3Zc�f6�J�5�~2��3��^�x2��=�l��|C;�Q��o�y��V�V��ZG��Z��.\CI�(��e�kX��c!r��<tH���z�f���zb����3�f�4�;p�g�F��aD,}��hwWPY-�C�g��Ec��?]�u��
���'y��M�TF�3b��]�
�N ��F	���o��>�A����W;��g�9��F���Y�g�����$"E1��0@��K��%���w��0�p�{&�*F��^h���7�dKH��i;f62�l�Ch�9B�e�x?�`��q{��v�i�@cf���-0g]>r�3�ahy&��~r����JHn�,lV2G�q�EV�E�!-����-���Cg��S�j-z���*����q������o�v��f,�b�������]n[0���Q�.����\w�T��^�6y�|U��.���b��d��������N�_��]�-s���iF(t�Yq���c7�[��y�Tw(-=��r,d��a�B`�������7�w�������x�ZrBB7
��D�!�{V�~��T�
�0�A�%*V�]��*����vy|������%S��BcC�8�7�n�#���������
b��l<�9q�(��WN�
$������Nc�/�<5��h'Z��"����*����!*�L��g������l����z����O&w����T'����U��'@�������]��`c��
����L0{�iH����|�s�4��J�"�iB�6��
�FD�i0B���f�������$�s���%�I����0{�[��KLM[�B��S��B���z����4j!�ac�2Olz{�wq�{�;y;��`��3)J+EP��1�A?y��U_HJ���fZB���l�0<?��OM���Y#TI������=����+������	������"Dp&I��h�}l�bd�������}��n����F5��/[�	�F=�r!�p��lr�aO��v'rS�=�=3���o��i���q�����
�>��e`��Ms&
������E`_;e��������r&@��
�]����o#y���������*��)(���C+�w�����~�1�Gd+��U���<�|}k:����
L(7b �q�����h�H�*�g���7�?�ET�C}8�1	�f���EJ��F(��H23N )��+��\>�l����Jm�-���w(�s���nkF�z��5���]��,��=S�|}�X������+l:QG�Hs�yc�X���~���f ��\'A��}�K)��Cp;+�K�����)�R����a��c�;d�C[�(U,x{�gJ]�3a�h|?�^(�����4s��Q�$�Rhd'�"{;��}7t8�2^��t��UqA���	4\?QS(�X��b��O\!�������B��lK������aB�"L�4�<q�/��>Oxw�+a`��3)���EXcN�>�.8��}b�L�3�D��5� �{��K]����uW�D-�.����X�p$)A7r��)��,�M^�nm�����w�h�����@T����Y����^��o��-Pa�� [-e�>��o���-�_E	�+�8YF$�x+�ePb�24!e�^hfF�R[P���
^�db�U4a���-��&)c�S�i>�A���V�h�X�Mj��B���x��m��|�P�*Z��cx/�#���7N�oL�[-��Y�b��:�V�T� �2`!���`��DU��f�eP�$R��>�����G���*�r�s��Rl+N����I���'�!��+�
�y��Lh����B�R���%">��3j�4�b�e�ur��3�-<������l��a�n�!Z�I�v�c�]�2�p�dvB� ��}���!���j��=S�Qtv��
Y�m�0��>��G���H�j�9�]m�_/K��CfK�1��
�ZF)�t��]6�	�,,�u%�B����F��P
�W�>��3�h�p
[$�$
r�\�#t�G�'z�L�I�Jf��	��Lbl�r���?��~r�2��
.�x+�FO�P�}����������>�wE��2���q	y8"f�2�Q���@���&���"�h���,�"R�e�����y f�e��o�����G�
a��I��< &+]H�RY��-~��F����OX�(���e��p���o;��&*jg
K��CW��1�0���qK���+V���EaV���	�UA�A�_*�[�v&���2�h�����u�I����@Q��`���Q��?��B�0ai}���	IY��On���
&�|��nD�V������7��l��\	��/6E1� n�so�������ct}��E�va`��s��Ch�]��z��I��x�+�A��k@�T���#2<d�8���:m�C:������M�]	��	��G	CwVr(���g�O��F'��H��lq��g0nk�S��`
C]�-X0hsk����Qh�����v�.^i�%r��I�n'�P3����Cc���� Tg'�bH��~#�:Q����dS�+�]�}T���0�XG��m��"z�6t`��8�w��"O��%Ih��x/��$K�z�����A�����}5P�t�,57��-���������	���o�;@POP��1PW����l�'�
q�w�v����@���~'�ZM��0�df���f8R�-�N��G���zP��6����L��{�6*3v��5���������9N��a?����
'uT���g��0&����m'	��\��	�6�����e�����e���2~�N��������
�7V�l��pG���*�[~�u�� ���}1���zH������8`.;�Ll�������';L�j�C��[�i�A�b�3���(~r�y��y�U����-1?������2h�'XB(�m���+c4���.Q5�9��g#�d�E��g����K��:M�����&R���Am�6>�S�~1yQ��GlL�S)��c��}��T�Pb�6D�i��Ld���k�V��$�����.4%���.�z|��:���4
��8Z��sR���k@1	��p�mL�����MB���y��x�g�8�-�C�!#����T��>�x0�L7!B�t5!�kA��D����pX9��w}e���g)�3B���9�{vd
��*"���%�����u#�������������N|�������6Q�w����:t�����t4���X)g0BG�|s�^0����lUFl�����JYD�Z,�:�F���3R�K�����>�<-�����g�{����4"!k�Zv�=�v�e�����v�	�������+�����f��)�����S�E}|�1	�)�Z��P ��N\J�J;�$4��z���?�~������������2U�iN�	$q����hN��.{|��h�}�|@������z�B�|"nPX��c�z��� ���!��eve,�v�I(����p�:2A������'q�r�U �^��vJ,�Y	B|��<h�rJ,��5� $���B��9]�)�r���n1�
�!����Pkv��T����nT�|�'��8�_R��lI�6e`�63]���j6�8�):SN
3��v�o5|����g��C����Tk4�?�9��k4B�@����b��c B}�jQMU�?����"&��5����������}��#�&��x<���V�J7�H�{��T=W�d����
��'mr#��rW�f����������=�9F!��N|���3� ��9��	�\��vP�K�=F$����@������?�>������;T9t�6���EO"�EO`��g��^�=��=��������).I�`��1������G(�e8�F�fzZ&?���n���Od��}�U�M�O��.2�`��v�,X�z�.(����a���4�9F\9�W�8�
9�P�c�"5$;8�X�����~P%����"R�/?��czGT�rQ��yu�p�a��M�e/*h� }���Tk~���+�>93v�=�{�h�0h.��<�?��Y4w<�V���m������n�JND�h�H ����Q��W��[��2��T��wO��o�P�#3��(�:FM<Y�����Wd2�!�t�<�(I�a�=��Q������!���sg���&d\n����< ����Al�
���Og�E{��l���Z�laP������y��sEK���`�8a�H�~�'��5V�cy��[��oX��r!+�c2d���8����B�WO��v7mIwT���b<A�U���SZ������tF����I������}�t{*'!5���6�{�nKz�m=�U���`q��=j6�Qt��S�������N`�=�5�������<�}�;�^��uw���^y�*�!�^#c���-A5�@�U����{��[���#���"�F�n���J0���#�q��W�O����/������Y��q,���"8*��^_
��N�-�q|�`�%L%�G��#��Ur����{����;�|���=2�
��u�I:��jS|���� �����O�-���8�~�L?���E���>Wmw�~�?�K���c�����i�ot}EA��<����&q�yFp��J�m��z/�:�����H��^�JnJ�h;>t��57Ar�����d��^��n��\4p�	"�=�_������q���W�VgF�m�����M���096h�c�K����z���|��&V:�B���,h\��{R1���g����XiB^/��9[�JIk2�.��v�P��}����Q��fW�W��q�N�{)�n�����m�m0z���	�n�onA�H��o�������eA����z����Pb,�,��,%f���"��2��"��{yfk;�����s�����w;,[��G!�E�k�>�$�6#]�%���_��T� 7���*��P�[���������\�E�^��AO���DuT���0VoT�/�s�����-��'����{������"F����`���	�y�#\TO����d?���P��PQ����s�8�y�4v?UX�*�����@
�����r�����L��H�bF��4�rEOD�~/������NKB?��zo������d
��<��7+�$hh���c|����G�v��hP�B_����V[��u :}vD[�D�@�����^Z�HbDoa\�hz>��\P�-I��+=�X�`$4���!��x���J+z�\��P�	�{oc8��h�E�p��5_S���y1�0�%����OR�lp:lD�n����#�%(�l��qY�C�7�H�Gy>��H���D6�3~hPQ��~/D�HO(t�S������7JA�`�"l�|%O�����,�aB{m����h�����c
��6���t��$I��g6{c�?Gc��(%��%h�Q(����m&��;���(},(D>����I3 =J�Q��]�*Q��}�n!���F��I��~3�
�����{e����<�/T��H�i�������=�������$,�l�����P����O��'����W�6�I��u�x�#�I����b�A1l�p�F	�`�!����{.����~%�f(M>���G31Ix�u����:����l@�bXA��=K�w�d3<Ot�R��;jF���B���N[�P�f��M�h�-S*t�����}O�!�"��0�{
��i��.�u�W".4�,�7�����7�����D.���g�����K"�5M���%���]"�%����������&l�����P1����F&���t���m�=�����(���]�i+!j����~R���84�*�w���m�+��"z(=��A�~���'�����V�r�`s�1Z1J�����(���K/��{�.�4���H����W�@�D�@l�F����R�JR�e��&oe�)jdm�:��� ��}=����Q��t�����G���1q4GD����J�����f�e����rF����H�QV0�d��d��U�aS�Q�2�V
ch|�Z�-t��Q�[V��J/,Y/�q��w64�.�:��)�������LG�a���|'�{�����/�����OYr"�^Pw�^i#L���?�sd��^�jM:V!F�p����C"t�*��#p�[�a���fF0��+cE� A���?������v)����I�J��ATg�Y�83�K��:���`R�X5��D	F8�[����;�@e(J�j�	Z���_�)O�*����k.�����L�����G��;���k��>��y�$��V�G�(y{�}
irj"�E�Vr�nq�����OM��.����*�k�4WZ�}hH8j���l���nQ�`<���K4���:f��l��}_AT�V����U�q�4T+�C�F�H�Q��8ck�4@�"�
 ?7\��-4�"�N4��5��R�G5�D�V?��$�����!6�[�%UW���O~���G���k.����;s��;�����V[�}}F
�DV���^�!\��*���XG �@m�p5)�b�S�N�X�*����P��L�q�zR[�0W,{��B����:�g�3�����_�'0�wx�j1��I:�Wc����}����
,�'��I8���oc�������>b_V'�����>��]4
���\���t%������:�����d�#3�Q���0Dmhg#%����?�V&��#\���w�E�^|-���-Nd��V�ps��)�j���}�iF����)N�;]�����dG�1	3�Q
LH��b
�]��gq��%�guf��}#���+���(C���D+�yX�h=�@S�|8��T#�#��[�TQL,�i�@���Q��g|[?%9��WcN��%lag_��)�x������>}�����0 ��QW�A���4NP����	y�m�*�&c�B��]�@��Q�M�pP��f��Fk�hvo�|��!�J5f!�[��^Dm<;�"�eA$�&�d�ED���A�qr5Ta��V��=��'j�����z�m*�]�T� ;l|e�B��,N��X�G;������g��%������o�O�����'J��9<�2�k"(��`C���E�%z���b.w�l5�KG'�����s�%���%��b�!-r3$!������b}o3&!�C�WW�/�g�?�G���2sD������!�.,e�>����d6,������&����x��,��h���X-	y�S�{�Sgh�_��O��h��@Y�%m�|]�p,<��CH�����~e��>��%:J�����Y����E�e��e���T�i�"!q3 !9L�_��&�"�"��%i��-�����k&�
�B��b��]0j�������W���e1H!�P����H��jt�+�1�_�������/D����������mX3���A���CV?�������Qz![���5���~�������s`T�7c]n;����H>�nd>���gQ[�e�o�nV�V�5��p��}�����p�����^d����B!F��'����N�G|��[,8�Q�J|�0�����S�jNmF5��E���e)�v��h����g�.2���A�BmS����c2r�5�d������O�����w���=�=�?�~U������P������E�J���W����M��=���I�]������S~��N�b��Oa��)�J��4���pT<����Rv�����1k��s�C�[��0*����:�($����(�!�c��C����L�.����]+�u3���;�srA�e31���v7�����`��6�����|��?��u��<	�\�+�L���I��{Eg}���Q��Y 9R�4C��~��2���>�������;0�E�&B{)�S7C�-K�
�7�j_�C@��~�O����}����lK����E���]'�����#O����$
���b1�rK�t�?
��C���k'T���j�������!hM�A4�nI�(����MM����K�<5e�!���?{D��^��e'��p�0D�Q��>�(">��W9N����
�y/�}��W7JShqfR{N���ur�j4L�{H���(�����
X���T�O��e�=	�R)�Yn���)v�S�j�5�
U����b��%���=J
��f0t�s
�Mi��gn7L�nm��S�����rw��l�����k�1t#���
I��Ydpe��=����.�N��#Fd�1!���2.!;
�����?	Y(i�U���G)��EIt����{�h���4Q�C?G7t�D��`���q��z������{wK�jt���wL-�Oi����BF�[�7E��������*�p��������t������h��[R���}.���$�����->��D� �`��������ePB���db�b4���1T�1��Q9�
1�t�?���F7� ���L������%�����e��|Q�r%b;�q'��Ni_�����dC<�*h�~>�'���F�)i1C{"Dm��KA@^��G�JU�q�@���VB��G�1
����:StQ��j���%(\��$���h��J�%rE����
/�nW��l�,�j��w�2W�
_�
w]"7�nH!J~!���N�d�^C^U��g�#�hO�9'ni
3d��)W�s
���50��� G��t^�X��(���,�Ckx�#����,T������*�
{�
@U���,���9����D�c��lKx������nPB���f��P��L�GP�����%6M���Bf����#|�����0v�����@����.8c�'z����a=��t�R&����}��q���i�'U5�C�{��+�}��]=fMBF�&cL�&�w� ��^��RYN�)w��*�9�&Qlc�!A9�X�	�`��Wx$�d�_X
�Y��e���������,�g��k&�V�Df��#�`E\�!wQ��{|Ba_�b����|p]_�&��fM�K @�V�3��
�	�9zB`��0`P�7BU�H��H�[�L����N�Q��8b�����=�AVR��*
��<�8�	=��C:5��l�*�����"=��0��0\��q)�Z��3��&6��)9���VO�x�w��m�=p�~����.�8Wz\FP7������"ij�����H���*��&��t��:�k`�%�w��lm�����W�9�{I������q_��-�j��>8'�����N��|��}G����&q�w��K���tO
�	����
�
�Z�DC��i�8��$�J�$?�L�����2p��F~���B90�aP`|���i��$�d�^P���-����'~�sD��
��JK�U��a����j�"F�F�]#y�XA���J�|�
�^!Z=C]Y��*w�B�%F�
�ex�Z�_����K�D��1�%�����)�0���:#�I�BWT:o�9�*�����x����q��q��;�<K�=B���Q�-|7j���)DHE'���
;'�4�
S;��4V�������aN=n���T���"3�\��h5EL�����0e��b��0#��(������a�AJ[E��pvo��E���c��h(���v�f�L�!t%���T����_ ��gj���y
�M��!��o��X����J��C
��vjP��L���s���U,�4���+,"���q�L �}�OD���t������������g��@���"�gE�dMdL��������G����[��b�8�8��5M#����8��F�����I�!LZD��!|M=�����������g��n0B>
�*<���!p��N`6�3>!2�h�ra�
�AvK��H�=�$����Xj6������x	AK�+��F�m0��L�����v&c��T(���%#H��|��9+0#���)
��P��<i�k�g�T�!��!"�|�1������s�h��n+���-Y���Dt'DH4�l$�a92j>���1~��`�QtS��x�-���i��>n}$suk�l=�s>1�������>�0���=�!����s3�����VBk���$���!p!�x]=<��0z�L���R�<��F�H��������`�y��f��AN�4p&
��Qxf��Y#�F�|s��i�f���~l������k��-L���PVSQ�1)H<
�h����<����	WA<�i�|��%��%���z�qqZ�3���p���	���F?��_����;D��z��������H����`#��l�%MNg���������+����)E��Rt�$6��`�N��>��9�s(�H��}��p`���$Z�R�&�s�=�h��Ti�w��"g��	�B��y��%��{��@���v��%�A4������U�f��Lt5���F2����K�jA����C�����T�3�]�-Dv��`#��4|!�R��|��$B�C��3!HW;c�tf��#�.S���B����l���h���!�QOu'5�H<��1D���D-�H$XA� �"1�����i��_.����7�g���V��p=��0���P�����������M������u#
�P���Ubz�+U?{��+d��S��L�F\�W_�i0r��0>8�+!{32�����JEP���a�3�{��������g������v����t�i���_.��B�����k��[l5�`���63� Z�B��#����$%��=
:�D�(��Q'�i�����>L�2��h�U@�q�+z��
���%�j,����p��c
���	�~jr���O�#z$�Gi�v�DK!�L�K����5�C��9aI��.LS�4�';�2� ���DC������0��@	��X�U*�"O����
D��2B ��d�w�}d=���H����sL�������������&
�:wyWt�,c�si��_	��?��
�]%�*���8����#�S7J �I��'5�������g���/��{%�+�������E�����|���j���e��8d��I~�J��aKi��4��xj4�]�	��f�"!����|�D�B��Gp;:w�32�����\��P�'���I����r��o����U��W���(h��JZ>#:5%���l}H����!+�A���}
OC�x�m-�}��Z,���43ih��veCZ-��a��e�@�u���!N�c��X�/�^������H�����N)�a&��c����{B-����$Q ���0�g0gw8��s�,�@�{�[����L�z���z�~��W�kM��8�E�����}���]����#�bt��+V%�>������P1:^G���i0���F�C�������x��BJ��f~���D�}+�Lwv.R�i��cb����j�a�1K�e��3
9���gfL�~C
����\p�?3������c���5�����|�@,xu�PC��;T�It��Wt���"��OWiw�h�kBZ�#���w�O�� 4��~~�C�����]����#�����?����+��$�[Z-�������2��
-��'
��G���F�+FL�����2*�0�n����`�������)����l��El��^;'��C�N�����i��G*���`9�+�L"�Qb���eS�K�[t(��������7}�DA��\)�d�{xtw���i�\���x����n��
�K0��2!�p$������MV�|��L���-���"��:!��o� 9�6�G���m"��N�vB$Q���x7)#[�{h�%n?a���|���	�+�x7!��6(Qd�����|f`�w���������(�b���E��m,�
9��l#�F����h,�K�����)�P5�Nm/�D�kT��	��^��h���z;���m@R���yf�hDC��6�\ww���Fk�a����z*�{���ct�v����m\B.�X�\�_��p���$.:��`�z"!�(~��fA�,1i��
7��
Q
e�������������(JlNT�IO����L�����������c|B��H�zcq��I���$n�1P���	��3[�9c�m��Z<A%�Bj�*5&�`w����s�J
0����E���b��Y�DA;���l�NP?�?�b��]iZ*���	=l�
*�F�F��m�B	y����PH8,��i���*dw&;���O;(���.�p������o��A���(���%[Q��J�#�������}����;�6m�K�{:���<���;�s?T��G�9��~q������}���[�����m�B��#�ht�-�
�,*��+�N�Y9��k}���-Q�����`�|��J!��"Xm#r9��Oe��A	�����/���CH����;M�gg�p��v����%3zF��%bm��Nx4����G�]X/�b�����x��P�R�
�m�(#���XG��@����l���;a*$t��O��JX�*%��	����e��	�����	�����@L�0DC���	�������i���=�	�\����5�k���`O7:v��m�?o5���-�V��Be%��?T��vT���@O�EB_@Z�m�>6-gm�����;������C	�����������o�(k�t�2��>RgnC�������c�A���B% C����A�4:�����NA��c�AU�V/�?	���bsd��.�di�^�c��y��
	/Nd�������G+!�� ����A��|v�Mp/[I�����1���PxJ���Q*��f�'�Hj�(�*��Y�����������;�@��1� �Y��h�.}���	��`�F���xX����aL�`���������{�f�c�z�
%���|Z���"8�|�H����o��UH�G�e�� s4>F�j��Dy���N���@�,>1=������/�����(�D�-z��5��`��>5]9��N��5gh�&����(�Hw���G�H���g��������)����j�/��q�\}���Q#V�
�	t �Ed�[t�����p�0��	=�����T�G�=��|9�w�1vp�}q�Y"�1t E�CIbD?�Tv*��.&�<#zh��F�ZI��
\�'�����]lh=FT����d;�=r�U���Fl��R��BW���������F��[Te}(`�1N��D��42 �R*��y?['F
&�O��4����������
yq����(��J<Q��}�������&C�c1�N��r�}��I��vZ��N@��w�@��28 %�PW�I�F�|���`8+�p���4�h{]�Z���V��Ah�	�P���jf��1��4i��=�������x^�+kX�*h�/�Uq���i5������2���m�[jQ���n����i7����xe"z�U��S���;AsX$s�>�������n�`r:8+��O��U��w���k����?�wg���&�r�Y��.-�=����
I3������4j�<�+���DUbuH��Vn ��:T�[��)�!�`�A�f�%�w�_�8g�?�����nR�����!���~e�c�^��l/�G	�(���&��������r'V`�w�J�Y}�R�{�m.�l�����^�:��X-T��z/�\��{�^���T��1*q�E���Q������e�(h��AKT��}�QN�����z��7J����F[�}#����������&S���,�[��u�)��{�l��-��E0��&.m�?,��^�t�i��dH@������g��~�&��'�����Dr�^����}o�Q�-dZJ}o���t$�E�%w�c�`��{�]BJ������>&��g�����>�	���(d�{�$)���w����������u>�6s�
��J�4�B�$��%�{�����]���UR;��[�-*0���q���F�JGc�C����~o�����$�����9�����Q��i���AG�mrY$��|zL�����A�d��^�=oe�,l�N�5iY���u&!����L
��>h�If����<�X<��@c��������������Bbl1�1����N�}��cEz���llj�DL@��qk�����]��o��|^9�����+�F1�!���F84BE�����EYyM��]SB�[z��?F����}�a�c������Xk�b��XG���z��a3����t�uBU{/�=������:�3
��(F2�3�h5��K��|o�I2z�f����[������2�!��5��6���FP��{y�]�(4�/�a*�uc����E�&&��[��,� f���@S����
7W�=e�oV�����L���c@Cc5��
8�
m�A5�~����UV� v&��8B�N��v�6���[�}������A,�%i�@���e]Q��������E�{E���X�s�
��Ux���Qe���H�W�"!�����uF�[.��O��N=s�����J���1b�_'��{��8���h�zCt�OUBey/�	ZTk���K��S��[1�TUA �y���L���O[�S(�������������b��
�q��+�^���X�u�����b��1�b�7.�-�%�,�)��+:SGGG1N��R���b=�014�.�'L��?�`���-������������%���A����4���n�>u��d���P���:���,%�_���i_J`����,%���
���Bs�Y�
q�<�P�^:(N�/�3�
"U�z%ez����c!7�8���Y: ��,�$r�uEQ��4I�,����w������)EOR��%�L�H���Hj�-y��JRR�C���x���Z�b�A�4��4��^��6'\
m�A���,-���l�'5����b���g���maE<v��w����!�e��"���{Jn����p�b�����k��YI	�F��b��YN�M����
���Z	ol#�����9�U�81�j���:�t�"om����o�A%X��/�Nt'Q��o��L��f��h�\AHz,A2U��8���l�PF�e9��F�A
��}2$�I��&*�������������2b�@��U"��e�hB��e7-+��hI�������N	�r��jKoT�I�����������b8b�0�>�=�g	.�vC�*����q	1���,��N�����^��2�g���~�����x(�I1f1��u��,�Y��������8����M|��	M��b�Ax�J!
��w@�tY_1�.�?�x��EA��,bV�
x�2#nKhR[�4�@���=<f�Qvo1p��{%�Jv�8I�h]�2��&������*�A��c!��>Pv�4i��"S	�p�_�K�po����a��Q���(�[�3���q�k&�d�t���Un��V��i
��4��
�P��$�~�S�Qo/lr
2�[��Ld4N�g�Bz�)�8���������f�a��(�J����%���y�#����y���4�Vn������]���H5D�Y5��v�����(b�*;�U�[�"+d��P�V
5�D]�5�h_��B�Sv���C��� �j5�`Y}R�+��UC
�����jX6���p%�����j@��e��~����v�9Za%
�|@�7����)�Z���5��!��F�������j�0C�����s4�@���Q���9��>�[x�tO�wq����Wf���R�2�kX�0�A�� {3{��r�&�Z)�HDU��U�2���{�/�����Y�.(8N�^5=�-<
R�Nc�-~��Yj����=7����5�fd�YP�]�?,Vk�#��-I'�����#i�j�S����d��7��T5�&��8����7���}��{
�5�F�p�������%�V�	�B����J|ql�]y�G0�/�F�f����6	�#���������P��Y{�U�cf�V�k
8k`��~���3��F4�?��SX"p�P\e��(6?�'4�M�����a�����M�M��u����K`�lO��%W#2�����,�M:�!�jC�l��q`��0B�q '_
z����j@A�/�-���#s<t��X�J������Q��Z8N�Oa�F�5����!�r�}�?��M"f�[�mh���EX���A8�L0������D���?x��qX�a���2�������i��Y
;����i�����JN�9M��#����*@��"a���P�����7(*v��Pp�]����8��9�/s_K9�#;��B�����a�'=l2�?�4�(���qF�PXV�']E��M$�XqC����eO�R.����7H��U�����'[���x�i��nL+P��$�R�9���{�e8,^��h�r(������N����-���^K�����0�*4@!F�g���,����8��jF"����'�[��i5�1��������=�)�l���$gq�p�D>m�D�L3�������G3AD�����,qS����GqK��Ho���<F���!�u3@��S^t��Nb����v��)��w�%S�q
��J�%>B�xb���GK4���{������(�q>�Ll%�L��Jq�X��M���[�!�����F�1��{�����1�c@��dV4Mt&3X~/6d���[j_�-�e��
���d8*�#6!m�DS+�OE������V��.t�}���t�0��0�n��"�����gk�B(��M�C��g���O�@��-�%��}S�ro�	m1hz�q\��`���<�{y����dD�Q$���q��4�2F�
s����o-�:���fn��lF1|06���QK|7�HC6Z�F4lBc�/T3��Q"���=��F7r�r���A�A4�n�6���\W��2��f�c(���SS"8�����B>�G�z�
(&�#��{'vF���`0�m������������IM�]�Zn>Tk��W����z;�@�@����7�.>������=��G��As30"r�Ac�6�'�vcr�g�6�`���F�K�"���?�X_�����?��tP���(��x�{>�����f$Dx�W�O�Z���k�>1$|��9����-�f����@"��Md��V��zZ0�T���H�U�R�d��F��l?��Yx1@��0�U��^_6�5W��������k�F�h��]f������c@Q�����Z���%�be�H��`G�����f�c����h#�f�C�Q���`=�����^�N�}$X��>fg�����y;l�/�"{���G�Ba������Ov���������E� �W���Xw"�t������p��pc��������i��1��|hFG��������u2/Vca���4�+��+��|��u2�&��'�B��lJR��������^�� "������[�T�1���U+��~{���'������sbe\�d���'���=x�Zqn���j�n�D��0��~7��Dg�����Y��?��>:4��%�d5sJi������=�Qc&�W&y�wc&��� �QuS�L����5a���'A[��.6Y}Wb��X����B%�!h��1�B��^���_��r��Q��&���7j��T"�j��Z��P�g!�.�Ke��|��`�	�n�:��0.PJ�\B�o��z��0�^CW.��1�m7�QY�'U['"��KT��TrA��Q�cV��.�����tb���|7�!��A��'��$��o:4V�G�q����"K�ntC���Z,�'mBdF�����#�)��dn��Z0s�n�"�040��x$��td������> �N������uQ����=��K+�S���{��`7�m�t��bUE6zA'�'!��<����u�3
�(S�������u4i��(�K�7�wU<`�#���naU�a��A�N�N��=�����gW|m`q�6$n�vP,����Cl�8�z7V�}�-�a�5`�xv�0����{���>Cz�
�:���0u��)}[S����=�����NZ����$�GGW�"2�{0��>c�#a�����^��N���)�j��*����1hQ�I7~1���'�{����4����E��t�������F(�]sL?��PtV~�D�(h�}P���D3������l0Bg�N,.�w�4�x~b�����������[��bBX���QMu����{T
V�$����o���'���5���$X�g7&����73�qO6�����]�"��'8[���>���|lk2*�4 �w�"R�v��32M9WX{����=F"���F���
�};������X�x�.��i�B���n�?��-g����'`[qgB�7����1��F��]�����Y�M�����^����"���E1�m����}�FeBr���)Y�1���K6���?�����$��7�pG��f��'����g�r�xcs��(_#�.*����+2�S\���)X91L�������	
�&�jG�����NZ%e�Y�0ZQ��n�OJ��:����EsG�:�hv\F�7��d�2�})����#;�+�����%���<>YR�0:a�w6a#y����g)�m��<���p���]�}k���;�
�Z=�UM���T�;ZP�4����c����9�23
D�����q�$�]�t������kyP�a`E�a�� �~�J���<�_���s��TQ���`�th���?2
�@-Z:=����#���{��Z��g��0��Xu}��_�/� }�0�0��"N��)�tP�������#p�&����E�g���fc��hn����h�{�n/�K}�O0B�C�����l�F$�/�_��8�����c��a�@������Gp�"������Y���Y�Ql�"E���$�nUn���p%��Z��$A��t>����`	#�#��7��*�Se������a0a�� zY����RQG���L����^��pJ�}��M�H����N��p�"��^�e�p�a������
�a�9o�aTt�+u���Aa�+ ��k�{�M�GT
�Q5hyg�x���H��ViW��W�,�2%H��cr<���0��\M��l������yL�@bV�c���2�Rp��<��s�����
��2�H����%��x\��_��4�:x5Eb��@�G��]�~��n�e���b�@�76e�HqoD]����E5��Tt� �Y�OcG�C���/i���i@ba��n?��#��+W���Azf��PS6
X���������H��]�A�M6kL
d�ZQ�7��k/�����jy��U��5 �A��<=�g�������T��zt��;���m1��	 c�''��PE6�Y�dZ��tC��#�-�o/2����q�w�������>3�`|����u��s�U���`���7��K����W;���/�P��W���`���n����������i��d�@����f�!^�������z(�M�	���X�p���K0�q��6!�vV���d��/(�
�fd
�S����
�����"�f�,���I��������&�[t�#E�����L~C��1�'��D+���k�p'?!���l88�*����3h��I�:+)*C:�	,4���"bL�pk��A����K2R����K��zVv��fX��
� Z��!���y�M���=��V��]�g���� 4j��6������wr��+2��i�AY���##����W=a���#pk�e�����

%����� ���	��qP����,":���p�[����llP����)e)"(�����S��{��9��O ������I-l������UP��pC���%t�e8�8���PP^�����_�"�9IV�MBL+�d1� �Z~�Sq-a�AKU�8�0� �d{��R���xY�!����4���W�F"����-}��>���w:�u:w6��i�}o��b��/ [�r����v"j�v��*�/ib��ez�c���i���0�^�.gO0�x&��>���3:�4"��3P��^O�^�M����@�������(<�����h�y��]��3��4p��M�&������m3���,��'6�"�����e��4�	��d�vx�5F2��Q��i�B�J���� ���%_I6���
rw�n�bq���a���DI�u��(^&l�9�3o����%�����[�Q'���5��^���eT�1���e�dix�{�"d8��#���"�����Z���h�[�4�]�����k8����;qZl��_ S3-��V�r��[��V�7r	y+�uo�JC;+�W<�D}�>M2W���]������������
�!*Q17��
�4���\�����U�`��U6���<"T��W����^�m+=DI�H����HD��^.�cBh������kat�����B���!����a��Kl�'��&]Q�V\�	v)��5���1�E2,����q'lT�J��'F���Cv�v	�(Nc��lqz�����[�p����a}�Nw'�x8����Xc;��AxL��Zp7�a��1�>�/f}��k�~V#eV�P���������2}Q��e�#���S��C��e��"��2�!�q��^�^���(��/V�%��2����^Q�_�3R�
���.m�J�2�F�b��s��
���0��\=�f7��6>#�&*�n�y���B�+=G�RjK����n)�Tf��=��aV��T�������<�8��jCd�e�C4�[7�j�5�������p�[���yH�S�q�2����B���d�P5�
�qkXe�0�j��h�81'������	_�z����.��+x�E��M$x;���P8�}�l4�Ac�X��L��8��vP��Jm��N����iD���F�+����SN�����L�ou"�N�%��)q��]�Syc���p�������!��
��A5�L����-<�~my�3�r��IV���n��>�����m�w��5��-�O�(I����ae��M��E���OvP:4�:�:k4�n�'f:�e�f�Ms���
�6�6UC����cc"�2�!^'q_��� �n�R3t����"?*�(Xq�k������L)���z����������mD^U�,T���t��`��I�]��LG�j��� [u����9����~2M&E�6��+�mc*3�W������2dK�K��CFO7�L���F0��cO���X�����l���W�UB�*�����dw�j �]���r�IF�c4$��*�o��:���Z��I|�������i���H�&z?j��$�bW����]�a?R�m���U
a�����m�����Q	p��4�c��m������^�N)z�m_���s�G���
D��X��nYR�0��c�m���f������-��#����!�2<���]i;9U���K ��D�O���<{u�&�"3�������)�{�QT��^~]w�z��j�]����U4!�_����!�6� i�@j#H�t�b�o8�.���&s��}��q���(�������A7�����gP�ttP��-�t���p�����Db�mB1�*���oB�?{�h��{���S(|�GLu���Bs������A��6����0iEB���'N�5��dS��L�.���(�)k"-�q��,?-Q������3��)^��{(������`�,��tP�����V���������V���K��j�Z��-����&�{������NQq#hYEQ��/C2�;��Q��-����*D�&2|�1w�����"��+����x�s�>��G��Ys�V��x��D����{L0B�/�����`BA�m�@�l��fBlDI��J*�g����+��d�J
f�RR ��%�5��C��H� �m�@���|8�R;�T`{��-��u�l������c���@�,�Y�>��f,t5'��A��}29��	Z���"�X��<O�`�Y���������Nv���sId%�!�'��;����%��T{������o���a�1(P�8E���
��oI
����8 �$^Zz�}���F��	,P>[6�;A�������Z�R�=���.
����HrzD�9e�}trJO�r^8��vd�0�K�E���/ZQ5>`�����5����Z?��$e��w3��h2q�����/���}?���S�cL:Z+F�B+R#8����������������ELAo��i����Z����p�F��I��~C�d��^�����A��,��4h\��kI�F�
"guJ%}l���������~��T��#���II�R��.�$���*+���ua�3�W<$9�w����}Q����I�sJF��e�#=�;n|������I7Sw�HX����Z����I��c?�G���8T'��v����c���O2Q72<<�$z��dk/�+����/��4���'�}��&���!1{1�%�-��'0���({r1�iV�lx�y#Xg�6�^8�}��?�L5i)l��!(�������������~dC��U�����F'��np�D�����6�������,4�=��K:�\3c�vC;��=��Ik�"�^E����YQ���<�����q�5 J�1��Q�"��$d�+��7����2
��@�����|��/')��t(?(�;#�����L6Z(�U>�H�w*Q[~�����?�
��m��,��$�Zr�����4�������	�������S�~��2��{v�:ok�?�w��<��J[<;V�wnyOd��!Pt�Cdw�a�5����.V�'_b�J��j��3�A����s�M|�I��v+8�g��:��N���H+�����hji���4��.�	�����I�1b�d��:�3�	L�m\��_�O!~���]<���
_(N�?���������v���}���x��[��/q6��xoa0��kr���}�1 ��44fZ�}o��in�!��7��'���5�(�e��6���e�e�����=�\�����WX�����k��/�
Ts�-�`�NQ8�c�7l�$����;�4��+E�yo���>�&�|�)�P1���C�������^n\M<R��'M�0�X.��2��M���4��	��_[��]��s�g�8���b�����UTwDXj��^���y/�zS��Ar���Lj2��lo�� R�����F���JK#���4�>-I9P��{y�z6����t���Ehs�d�`"��_K�~D��[�������CYn�Qa�[��p���5�<DG����e��>J��i�������X���j�Va�x�R���W����uI���4P*�{#�e!��[N�a�{��CH.J��b��{x�"w�$�g����qt��<����������Ug����>5|1k���������:h-M�Y���	�8���W{��<L"5x�L�sF2dI������O������5�!��&ve��.���)�}��Y�^���Q�y4B����4�;m���}���~cMn���Q?	���c�:�I���+}��cL�V�E������+�y�zN�����}���##�	�|�����{�, J����(`Yl����	�dsc��T���L=�����F
4!�yg������	6���Wf <�c����dN�n�C�������y�N���������mo��0����'��e.�E��}�>�:�+������b��p�h�	�`79�C��{����{(0eb=�s�����.��'C�/��������G�k��:��<��E�������������d�HL���l�D�P�;.#����a�O������a���!_)V�U��NR����PDt�x�e��&�|�V��,��1[�X��V�������Y����/R�Z��"�����r��}(�W-�S���&D����F>��X�$[�����G�{�K4�.������ �U9(���{B��b�A��hx���J�k|��������7����t������E�R��0���"���M*J�QN�l�[��:j	����.2��~��K���V�A�s�`��$�M�����_"b�h2��|'j8JP���@��<�-�>I��n+%��������Rj;���C�r��
��Q~��-��=��]�<Q����t�&�A��m~�p
�`t"U���K+�6h�+GCz������>>:�����g��2�Vi$�R��%����O�?0���l�2���Ag{�Q����)��VV�$��~�i�������k����)	{8�\@�j�����V�������F`m�Xk4�.�z@S�b@��1j1z0T.S��UZ}o"C�C�?�7��u4�����P$�*_h5��'�4�]��u|^���3;&
�+M�V
��4�/3+�6V���J%�����j����Qf2Q��~{��,�iR\-�����2��Mq&Jm�d�q�Dx���'JT�qr�m�H��*_��-c��o�94��
���b�a{�mM��{�bEG
Tc�B�;Ou����5+^����b�A�I�H��Yi�A?��&�h�W��$
���������-��
��	F
���b(a�h��� ���F'l��;�l�oh���\-Q=��"����~f���w���X���d�C��I����_Dj%K8����]J����e��(�yC����@�`��A�".���}��,���k�u�qsR��-�D�/�a��v'���|�I_5@p�����3:`5BP�Q���Wi����)s�;����qa
 �b������&+Z>��S��g�����������~�
��!y����@���?��~/��*�Zk��T�f�t�O��Zb����&���^W����|�������WM�����Z��x�R*s�g�������*b�(	�����c����I�J������d���I[�I��t��j�dv���RO�^��;>w=�hn���j�@Z��:tqdVBan�-/�P��a@@c5N0������V��C���<���'�-{���f�OOWt����%4m��w��MkW��[��T��8�U���l��	�s��G���%����-M��+���\��W�"�S�U{P�/M�4XCy�&��.q�.����gaj�C�="���i�b
�}���7?��G���%��,Y��$���$1�&�Fh`}F�!T�k��oQ�����uD1����������$0l�N���-��A;��w��JH]G����J��D���������;��L�Wh���H������O�m�0�������Dv3��V���a�|~i�R��U�-�' ��A#��%��l%��y�
X�����WD��(\���l`���NG�$4�<t�_@����$�f����{���P�6��|G������[���_R�@���}�����L^l��~6��eh��	�a?����n��P-[
��$��@8�m�����"�����`:��	t �*������U?�����`S�ZR����PCC$���9���U���jl��3"!K�Ou�BIW5��������y�����Z��+�3P:����1����AE���� !k�&�AE��G����$����I&���DR��,�Y��H�qK�!����t�t�T	]��
Q�k���2�<�V1�u����qHr
y[`�+���}�IUR��
m�-���*fo���H`t��5���'c��X5�"�"�B.q�/(��U�Y"P�0?f5�rZ�pL�Kq��m�*tVv�5����T���A
|o��V�%�+���!(Q=J�]�0�fr]dx��g��Fy����{-p���R�'�;���4��j��s#�]3���x�����(*Hv�
qz��p��bhb�������R{���=s�J�jr+a���l���X���)��h����t�K��l�1��ru���!��^+cj_P��j*T��������v��N�f��LH�}jH��b�����Xb��vH��
�f��#(����:�r�����]LC������.�E�&�n%B���U�Z�7;.J�F�dk1�A?WR�-k�"������'i����g@~I�0�B���C��B��1D�`_"��'�����[;�Z=�3��E;%�l���y�I6�~^-�I"�v
�6cNi���^�z����:Z�&��M�!
��!���CZ""� �����KZ�!9X4�(����{Eul{T�6��)U�YR��=i��a2���B����Mu�Yx���l[���>�����s�!���3� �Q��4�m�-z����%v��@���Zu�<��l'��_���*�����*1Zb�j��ZT$zh�*����]��N]tQ��-P��jI�f��
��F��?�4|>
{��R�.�IC����h�������{��	T��>��\������v�+�|w��	5� �(}v������A%i������AT��ll�=|J:�(�]n�����B�=������H�b]c��zx>({|����MH����z2a>?���#���p86�:�M����hhU����?��\�6YS��O�@�q���z�a�m&������&�����3YA3>!�K���LHZ ����^����#�?�1r�(7��F�
�KY��&=*�*�yz��keQ��� D�V�]�����X��&��Hg7�M�_�t����u���J�# �����&�e��%�mX�7BR����}"��g�VM5�����O�}���F���Z�i�8
�sn#�*����T�1��(*�������y����2*z2����(�Yt���4�$�B	m����������V��������W��h_��F}���~w��h��P������NQU���$�kF4�EKr<�o	'��g O�^��DE�`�'�Z��W��q��Hg��Rs����=�	_�ipB8��1�D���cW�p�~�/�	P���%��}�*8����U>�K�����������0)R7n!A�*q���&��(����,f���{� DF��nPC����nM�^�^��LN5������0��:�!6��D���Ucui2!�W��v����O��q�U���IlAa/vl��7��&��k�pn�3��G��=~B��a��1d��V��
m#��d�K13;;�P*4�Onk���Z��@j]��	�}FS�s�AB�hv7�+�g��\NqgW2*��\���W����2���%����������_N��@U^(�L0�N��.�?p�5�-�=bBqq�v��W�L%����?��7��(B�1
yF�H�P������@i�5J���6Uh�>��7?9L�_���`x[6�_�x�fR����
R�H�""~�G�U��0���Gw0=�����D�a��[Mv��p���Q���{����@z���Y�Yh[���t�F�[</��^���4�p�=�z)������V~JoBl��3����v�=MEA��9v<�������@����`���#�n^[�]hh1b�gY�iB��(�7�sVc�6��I��Y������x����5��dh����K��������1���^�-�(3Z�f��K�(��Qa �a�J����bl�a��E�g�*�������R*����k���H�����B��F����i4J�(���K@��	=���������i��Gj��
�����R�"�8?S M�0,!n�������#(�L�����(YP�G�)�F�����R�F�P7����J�]�6 ���(T�J��2�����f&������Qc���IzuJ���sq�������0O���`]�ZC��u���
�8�#2	���uq�������i�;�C�]��F$��	-���]F���9����
�	*�6�{&�����S�8	��
�a��6�YL�|6� V�0���a�u���I���)
�A�kFd7���a�@�yT��3VH�D��������#���j����#����7��
tni�������aq���5�
4:��?�&�}!��$���l���0� f��;�=$�&]���l�3� ��d5�����e���`L�"}��&1J���'�T�aA�(\4�X�[�4���_�n��.���4��#�s8�������G��#�Lq����Z����2�����0j�mW���[�t#OkY7d�@n��z�:�&U�������G��]�)��yb���b�����w��
F�����N���	����~�G+�e�l�L��M���n�+j\@�C�!�&z�"�J�&Z�;�����f�]
O�K���?�ee�#�|&�1���h����z������$��{�v�q��`|�.������,��2����;�P{J������v��|
���������������'JEY#���e������D���Dh�'�VV=���Vx�h�auAB��� ,x�h�5?\���p~!�:|�����-�jh�4�h�����/�� �E�h�g�4��C�J��<g��ETC��LD��$D�Ju#�gF� M/���riG@�������p!�44 �W�	;f	=d�}���42tw�����I�;����X53!���g����;�i�1�`b��%3I4���i�!zU�2Jv:��/9:�F4w�AQ�2
(����,
f��	�W���HN�IE0�3TS�Q�9��F 3���
��9���^7�
n��v|�FeR/�i�A����s]���M:���,���9�@g��:�Q�����R���B�dO���c|]�d�'�vX��>��jo��W�l�@	�a�3��{����gb�%1������?��v�=E�G��|�V"��7c���VM�b���u&B�t��L|(jX���c�����Q�9e�x�i�A�jc9���2 M�L�t]��hd�%���#;�H=w:#NP���<�X�p�s�M>�o���gt	K����'M��>�#�7s#:r����������qm�6Cj�;[��x�*��� j�8$n��,c7\]�T���4h�*��O=g�h(�
4������������U~
��@R7������h'�'\���1��3�_�6Xq�a��c��_y"�%x��a�����(��1�?�G���}��a3��)�a3a�@��A�Z����M
^��-��h�j�63��>��g�����M�U��iH%����L�k���ld�2?-Zo��s0��4TgTF	4o�l���h�V�d�,Iz�My���@E����*�;��I�����XV��@O�7;7<���+�����2}
a���I�Gy�����=�Q�}�}�\��:�YXOLh~!<����<�e\`�OR����q4DE?�22 ���q�_O���+��6~�����M�$j^�r�[�4Z�(b=��f������D/CKNfwAU���(nT���#������d7� :��
���-2���y�l�#P�$��/�
u��qe�V�Y����,^�ah������K�VC��A1S�Nn�a�����?��GN|+��RL�I�f��U��H�l6�
4�&DZRe�}Y�n1?�	fEV�����~[
i�G��������HY�
�db��+�[6���vt�CNF��An�Xy���FU������[G���b���%���]+�F�C
s��U^����}K+#�E�W���IN��6�B��i��lC��?t� �b%p(��$-�mx���'m$�t���C+h��xh�P��9[��Y��b�(�]����!��s*;���xI���
@�4��u����(�S�2��Z�7,+�yK���:$+Q���Vs56V2���,�`�:3����m�=�u�"k
��V��d����L�#�G4���k�����B�r�Z��� ���[�K���
���`�<�����|�t>���5>	�S���u�C����2��]#����[�#2��S�n�x�T��^1(B�e$�~H��u:�-��[��"���X:������U]�	$�dZ�`�Q���6	b=%{���}T��������,j��[�l
k�t���^���}���A�!�HA��t���s�H��u������@�"n������u� %���"x�V?5G�*"�)];��-������^�Gn��$�
����i�0HX��V*[1�/(%i��-��:�a�����8���?>��?6���!��b��O� ��&pguj<���@��m�@�[�@��D((K�:d4�t��3�VU����m�@iao�:�����i*� r\��D���e/��V4���)�u��1���B}��,d��<I����+; �}S�#zG\ a�<o���7�N�Qy��
e2��O	<�T�/a=;�������gr5V�l����hm�F�w�
�w����E=�]c�q�')W���
���
t'!�$���hd/4���;��&bdw�IyFRz���?[\V�o�p���o������A�9�D/M��@? )	R���)?26����bd^����Kd���r�1TQ���v q��c`��g�{G���H��v�1�������������~|?��=
���y�4����{�c�������4/�.�����
5q Y�6��$�D��~i��h�wX�l,J�F�����'GR-��r�v����9�/Di��3rwF�A4�G��A���"�7�J����.�A6��@
()x�H����	9@/��Airxg#}�B�m�`��%&D�Fe<w��?"��6| nH��hb��k;��{����=L�W�$;V3�����#�{�1�Csx�_9��y�j�=�_���h�{�����	���&m�r-�	/P?Mp�^*����Wlb�����:�i	�(�v'���nR,l������^���^��.�TR�jA�N23�I�}�.���G����f��h��P�(��&
����	F����@&k*	Y�aG��^��'��}�{�����jf��!�)�����Hv����W���	��������:��B#�K���kz3���C�"���H��1c��������"|��W�uju:m�����i��_���6wr����8�7�N���E�z�=����%�sSUZ"R��	*?����sv'H �����F�����h��������KP��(KlpJ���BU�I��|�BZ�h:����O]��X�+���Y���~��a�]&�w�*N|9F��P�6�n`��%B��YY��	�M	��@N����Cc���1FI��O�	�����&Ah:I�
2��0P�T8�:�b���L���	zI*���Y�����@�W��>��%g�c�A$=����#X�u<���:��1;�!��`�a�Pp��G���}�_�Y��H�}�3�E�<�n�������P����)�Y����=�����ym���[(�G��'�wO��wvvD$=j�}%EN(����QQ,����Q��1������8MvO���[�HStz��/�]x�v�����bRb�1p�P��3�kr�t��� �F�1P`�����~";���T6d�v
�����y��s�g�u�7��0��������!���{���K
<#�+,Y���X��<c������M���4��U�#��S@+.�Q}N������\l����Rh?/����;����bk�!e����������&�}���1� �vQ6���l6}�3�X����rIMf_lp�y%jdwm���������:q��D�~�_R2����1���f1�D���d4.h{I���O������+���[kb|+���0H�)R�(�UVy��l�-���XB�1�P��!4/�XPV�:?�%�/����`[�����l+��i�Nr����h�'����/���#���A���m�A�#���;���/�����:��P��}������Y�^:H�z�MH���K,�Y�i�B�4��Bu�Bq'X��]��i/��B�������ha�A�7���a�I�^�%�;n���_�������MS�V)K�e�B��a�d�d'zv�q���d��|�
������t���nd��^�k"��c�C��^#���H�2�-&I
�_�A6"�Y����-
��+N#�������
�B�d����Yrx��D��IbB�%hd������e]�vKT#~���c%����t~W"^Q���$��#	����|��2�T��]e�#��+�X�����%����vZ�Y���w����a���6M�dB���������F8����N��������@���H�{���>��<�����B>�(��E�-���W�oH[�f���nH<�#]���w�/bM��$g��1�����F��|/��o@������C��j���P���P���h�����~��/r�:���;|�3�+������&�-��G�^��&�\r�b�����A�Qf���w�a��^�w�u�XI��,&��h�s�`]��f�<�4����%%I��g�����lK���=j?Um�+�{�����5fQ�vf�F{%�Q��d�~|/�3�jH�]���}���L�z����������-LF)d�0�I�;2Rm�������o��X1.1�.g4Bz�#A�������Dy����{��R�!����V�K�Z�1�w�v�M��&9A=�
�	����a
\�5W��
!��{����E���n>
��bj��?#�
��c��J8	�k�}jWI���J���zb4�����2F����`��;�-9�bE�[4��V�%Y�X�t��H���D- H�����5B������3����b�1���
�����Ey���q�f�����p|��S��W�[����'�V�b��k�.��V���R2�W0�*���]7e9L�aT�Jo���_~ ��Y z���0����i�(
�{SGX��D��2X-����C��ryE=�D��U�am��g�;�x�����'q�5�B��sj��)Y	�wL�;k?-
Q+����y���Fz��a�.�d7+F���-���u�����u���$��;(z��R������P)e�"�+2�KI����
"w1f �[��L.X��3���������f<�R�����}�#
��6�RR�����<d�*%s��FKzI��}r��q@�������J����!�68��~{J�I�l%�H����1v�(��:U�����q���0D4��L���n����&�*���J�K}sA�@�R���(P}_!���������<f�+F��h�[v����+ma��TI����U}�����=�A4���I�������5��h���*H$���=v����@���t)'�,�,�]��,���}Gz���d�R@u� �I��$P��:4���+.E���y	Z����Iy��:	�u�x ���������"�7�S"�A�_�1�>�C2�F�2�*�~����V
���P��.1�����������e |������:��Qw�$K��e��������l2��K�jh�������7�~�d-��5��>���e+H	���2�$o	6b+y��e���C��*3:z��gL~1"�����qC];j�cS/��gw8�50Kp�n�%��m��#V���������-�G�t����G/%�������D����xI��Y�Ac�B��!�����;������k��%2Z���;2*+���|�z��\k�$'\2��g7���v����(��W�d~��n{1@���JP��.F	��cXP7��DhBO��h%~H:�6uw�d
�{�O���w1L tP@�~�]5�K����Z%��������M�����+��������\��[w��X�������]*E��$����B��n��=�g�tz-�VUC�]4�s7��QZ�����$�{�mh-"��eP
�J�d;�jpAW���%kWM���N�t�bj[!�E
���-^��B�tP_������4_
5x2�G��j�Ay�2/����[0����l3�4�����i�Ai����+]�"���d,���t���X��?�S�<�]O��2�����X�H�����_�.8{�k����']4S��$N�V
���$xc����[��Ch�}���6��j0A�QV������X$�wW�	L7U���v��mY��S���X��0���j8�����hP��%���PS��4d��^����
�E*zg��Y����
��u�������P]Mr��)'�'T�Vm��$FO��l,U~�3��U�Jg)�Y�������g�����;��I&���S��"��
)
jR�n@B����������J��^Xi�����[-6�HcV�)��mQ��L��F+h�i5hqH��#J��{W��B��0�.�V�p,�5#�1�
s�Y"O�W
[[~�QQgf�9�[�������!���&�<�M�����!Z�
���P�j�a�}�������F�"�-������Y������f����z�}/	s�GYo��bD���B4�P�����������
�F��u����Tk�AH"����i'���#�	��v]���B�8r�u�Y�������V�'���[!���p��'l�_���U��
���2A�j���������
kWC���'�5�8}�Q",��>���m�� 79$��=Tn&�o�.}�h�nV�V�Hr����:�����.N��#"O01R"��������^����
l%5�����'s��(?5��}s�^b�� 2�D�gM`���#���>A�wc`a�;[��=qc�g $7j�tB��{���OPd�������,(\��g1H��n�C��`��t{.G�5
},�0�� ����[�h��W������g�:�Z��!,��2���tDi���u���NZ?Z	���-X��q�-X�L=��Kv������xK%KEKX��%�RQJ�X	�bv������#�{�A��D��dw�v�=U~b��Vs@�$���]!J�>E1*����MK��a[P�W#��=s#�m:Y���(��� �a��������������RK��.��D!�e��K������m5�#9r����,ey]2�;�/����������lo��&�eE��G����C/�\S��;7c{Ts�_���5�8�5�5
��������I����\3&���o�(�t�g����1	�uL�����F�I:0������;�� ��I7�84�����O��y��O�Z$4�����-�����/z��{����S�
�p(�e���^
�}������U%=�n��]�8%%!oKrsS~D�4���������S.��������1(DZ5�8�73a-nG��l�1���q-�H���E`����j�&l�i����S��
��Q��t3�f�@H�z����=����h�Y2�n#m&���Hi����#����p4
J�����Nt
�\���F�>+=d����C6�*�T��%�Y�}��5��0)v�>��[�s���;k��?��wl��n����X�"�F�|�>[���v�
���g��la+����\�����/��<:4���(�u<	�\� �7x"����,��-����"ofv���v�yh6)��5�+
���h����xa��lTmv��i}3����~ ��v�WX��`Be���WKf��*���b&v;9w������~���{�����i�n6�����
��w�jk7���{��{�����i�����>�O� T4��O���'q'?j#(��)�.���K*E��}���4��Vq����K`6�Qi��?q���e`'�^��4�k0,�_���#I@$�^���3DA���-0&�����n"�5UXD�sP�����|��6V9C�'�Y��������R'{*4�3L�JrID�0)Z��������>D�D��^���5�����w�k��k8�IQ�E��z����>,�%��;���1N�w�"����L@�D.=
����3h�+�9��d&��t7���_���]�E6V�#��v{�T�_��6s=.Hl?I������>���~rt���m�/]B��{|��<��K=������� #���k=�	�������A���U6��-S	�ls6� �"J���Y��?��g����I{���?��#�O�XC+/�����~�Y��{�*������q�8k�mX���h���+2�P���p�P��O$E�"d�N��|���<�|���!g��n`a�o"��d�����ol2� �)��A�����'+�I��=�	�]�5���G�'D�����&2D��,;F�n@a�H\��P���W���;�SR��
1tv�^�M�/��������,L������TF�gp#�q7� �pc�L	�����n��GgIM{����5�'�Tg9���"�p��$����2�/{�A$6�-�?&)�]�EX)h�LvBd@vOj���q'1���Z��}X�O��N�_�#��?�@�����w����\{��`����zt��)TN���L�O�O��h�@�	��O��1bL@�
	.�����{�]&SU�*0|2�mK�<;�+d\��`F��	����Q<>1�gw��m���
�^�02��7>+u��%D
 +�04 xjUD���	.%i���������C������]Gp0��'?U�C�� ,m"X��t�o�bE������
�Q�����JM)Q*���`r����~�p{iJs�f��#H��F��� �#@����TYk#�g�#�
0�����Y!
��#�I$�Wor�m~�����A��]Hn(��-�[�)*j`�D'��B�	�0��Y���5����l@x�L�4��w#(��~�����cG�*��KZ����X 	�f������� H�F�+�\
**�G��]&����d�,�����~��p���9"m��(L���pD�#Q���%��!���A�@��<���3� f��i��A^�n�k�	qw���
 Xh�?S�)\�#���Pv���8dX?o���i����#���97pcm�9����X�;13�/:a��+]��d����z)g�.��,��~�
*f���i%��TrA8��3f���ye#�o#PSPV��4�	����7�a�w�L�K��rK��+���tRk���Lh4��g,���Q�H�����.92�S��B5���u��F�!������a�A��q�a��F$�R������������o��K{�����WB��g�����!d�/�k�5Q�p�H�n#C���.�7����'�sJ6���1���)��cz��(���q����;V�#�A�TqP��0����.��n�������e	�Z��Z�OD��s3���Q�9U��~�0%��yXl�4����B#
��`����X�H:�1��q��I�p���.���]MmL��k�`����AX��E����R`�i�����c�L�f�\@a|e
2�*������0��d�]}��[������At�^�Pz!����d������L:�O�$��2IN6����M&���A22!G�<���@�����:^���e�(	�Q�'��>9i����G0K$�:;�b�v��Y�,I�����x'�'C�O.�I*q�;��n��-"������������r~e��Y����q���>���x9D���`���r�����r�'��������i8��^R�cA�6
�:� �v���"����w����Kir��SB4j���Gg�uq�d�7����0d_ �w"���a�:�J���3Kv���X3
e�G��3P���%<��{�w�
��7��/������;0�!0X�DM�b���N�i<��qH���im��|��T�+��������O�=3�J��]r�0���A�r#���a�d��[r����=�;tC��idc���~'f3�e� 3��4����s���5G,W%��B�i�����Y�^�%���_�N� ���ws��%P���L����>J���M�����h��/����5K��p���#f���n�*��?����{�d�������x�:�*
d�-<���p ��������]��,6q��P�
l�BNt�j�{n���2gH�-Y�G
sy9�����h	T[E[��D�����$g
����`�BU)+;)�}�<?�������V����0�-D/7�Na#�s�����Z��"d��������)`�j:4�vb��u��+����
���W�M��i���-&����u!i������rS4J��/'�i����|
�_�����
1(d(�3hC���(���3��@���3�����q���8��t�'�f���HCG\�i���sVA����g����@p|&��M��(oUPYA~��2���|������Ax��M�)�SZ�;�RdE���xV�%.C
;��
Ej�=������� ����������v-`9�+���R�Z��3G�et@�������B����O2d?����'�kb	*�]��3'�[��^��	:��0�����h[/�3�K�%�q��%��O����2Fc��zj2&�H��Ry�w���Z
V��{��.���RJq�T�����5���#����A���O���e��+�H�*�l����$g^�Z"�V��T)/C��sE�P
�	�����.#�L`7����4	e90N�z��H�$\�`E��� ���-2�vQA�b�t�$A�+b�=B�(l��?���5��%�H����G�I1���W��**>b�dl��9x����f6�lK2X����
�'�`
��\F�A�7}qq%���b����g� c�5��I<�2��y��i,A�sr��2��1���|������`2|Dm�A���Yi9��E�-��Y�
�W"��z���n2��W�D{���!k�_eo�j4�( �
������E�	-.O�>�o�O�C">Z9�l����HJ��3�?O
q�2r�A���;F4g����*j������
5�}S���h(����5f;�b�t+��lU��ecPu�YugTA�l�JE���hjh��:J:�{������b�m;�6���Mw���`��
��������G���]��Bj�A�B���ZhhE��	��1��*P>��
4�T�:`�5�jhpPz(l��&l[�`r����p��8[�������B�c��Nr� �����gE�����fJ�e�������#v�J4+�
5H1O
��D� ����6���n��P��h�%����jO2A�
� ��
f5������IgqO[�����rG;xj�mc��TI�h'�F%*z��0�L��f!����7���'�gN/2n�3d/c����SWK/SkeG� Xn	h��/�e���92��p��A*�2D��4!����"��@�
��Fsh�� ��u���Am��%�\����+�u�r�B�	;���7{���B3#b���	b@T�]s@���D��Adz��;3��R�0�ZQN��s�;���[}GA��k<~k�>��5��B^�k��x)�C���A�	�#2��.yLm���b����H�wD(DO�0�����6���fx7@���@�>������N���lQ_S�����%9���>
��3<d��-ry�I]��{�h�n���K��s=�,j����v���iIaw�~M����^�;�G�����#�6�
%'���%���m�F���20��C�;p��F��J|�GL.i���w�*w&^FO4�J�t��X
}O���@C-�=���_�-�������3Pu�R]bfc������
����/��.��a�E���l���6��o����F|�m�6���H�{�9�Jf���2h ���I-tr�gd���ge)�zB�_�`^��j�H����jl���t���!hgI��q FU~'�A;y�l��i�*�C_b	pYx�2F {��]v�F���������,ke���&���Yt1�E�f�\o��k0�l�0B`��=����V�OK&)��
�x�h{�48�bnx@��V>1�V�+{�u4�/��[�0����#���?R!�Zpc�(snX����Y��1��o���\�p�+��O�f�hthE�����a�yB�O�����BR[�`�,�A�����$<�� 
���p�������:��<s�C��/$����"O�m`��F�I����Y�)��A�z��V�D��:�nlMP:�,���*Z���=�7����K���:Y�S�����gu��)T
v>�|���	�Q�y��y���f�������&����z3�6J&��>���u���q�<LT�C
��l�$c��c�a�$�
b�
U����[�J{b��{�����x1(i������Qz�;%&!2	fo�6IB6��<\�0���W[O(�����R'��1
�������#:�0G�c(����Dx��b�A:vyO� J�4m'i��;����f�g����-��l���hM��:A#�bB*�����(���Gi�x��EGG�c�� V���:��d5(�O�+�={N�W��*�[�3��Z����W�h�I������i����-ty^������g�\P�|C,t�>=@��ki����F*���tS�>{|�x�Y)���E�U:t���c#s�c�AA�j@������Q.�*���d��\W��p7(X�t���c+M"_P�����R��z4�^E����o���x'"q�l���d@��9 �k�qF�x�"A�;�X}�]�&H6w�K,�,<�����T��N�9�&��3�v�#��A-�c���^�1J��`���gg����\���=��F��'A���P��F5Y�g�AS��9��z`'Jvv_���Z�����B+���e*x�S�	� �7��~�4H�����9���1��Y�jN�
,�$
�����}'�G$8F��
�a�'A��5�����,$�;�~F��cA�ia��++�%���W�\y�<�c0A^]���!������Y�4�D�7���y�&�F�����#'E�?[��n�^�(�����?D;Ur���oDAH���+&�#
BT��>��6�Pnu��-��|�|�����M�|��	=�:v|G�L�6�j�|�{iS������/d	=�|��ywB�:i
C���B������V�����W�6Y�K�[������4���W����"�1��<�^(gUt�%�8-Uld�1:��>����3~������2�b���F��"���f�u��h`�9��\�����u�wP���,�f[��F���y����)�Pk|G{�%���D� �]j�]v�~�{� TO���ZR�/����w��r�i]'��{-d��Xo:DTCMN"����4A:D'�#M�?�6+2����b���|S�+g�8IU�'Z�5P���~K	�>)�XE��R�~��_�t~�wdV3�'�K�
�HGz9;N�ak�ak"�8�Y���<����RGO��=���{�(6�U:��� S��1���3�����e���?H����%"����|)�-��k�ur��^�&"�f�3@��qt�mkb:�������r���:�;�j��X@.����>R�n���;��5t���u&VI��^�L��i��C�M�VD���F�#'�*�EEE�������)����}��T���w����h�a{Cb�J�J����
aU~��W\~	y��NJEF��v���H���[??D��ug��hD���P�b�@��t[��D#��w�+�������~���C��E��k�f;���d��&����M�X	�=j��D����	��R���Vh����A���6���?�J0�GU� ����,��I��O4tbd������6��tt?;����UM�1��T����6����F�*Gry��~]��s����$�����HM����5j�-t��t��F���&q����#-�c�^�`����V%��|*������l��+.0z/����O0��p%�Q�m�@��kxv��L�%��������E�=G�,/NH�De�H4!<At	��d��Im���A���D�'�>>,��;:1ZZ���/'�W)���8�4��
�?5��j�b��	��	�"���H��J�A�����0�=���pcO�������S��f��P��H�)�y8�UA��dta�H�"+��N�2�{
�j��?^j�>)�]L�����[���gB�zC��=sj�wx��d)�r`c�&�!����R"��
DTB��|#t��"do)������~���(dAM��c�gS�Gd���� ��n������3E�u�A����j��)
Y������Ny���:���'��2N�xau@i7��%�(8���\M����kGu[i�B
��)|'����DQtJ��
t�\�����,�D�����V�ya�Zt8��c&K��Am�btB�����H�>�D:��D�::m���;+��=�hl�'� rqJ���R ��0��c����������^��2�����,/����w�2R��%1^p�mXB|CB�<�8�ly�3��_e�#����u(�� A �b�~����Y~�w�k4�S��]�������p���|d���P�A>�rkD/|�|r�;M��T������V���Z��(f����~h�
�c��#Bfhr��Es&���lF��>6C!���j��v�8e���b����]�*�x����b@���pg9��G���lUY%�J�:�<U�D���F&�H8h`<���L�N�Q#Jp������X��x����Gh3��O��W?p�Rv\���fe�*�VE&�F����,�����FzfQ@������������n��G���Qv�#�����J]x�H�[s5~K�w���!v����1F
!��"lu��h�/��$Zk~Kh�%j�*�e.�����)t���?��F
D���P��w��'�-,��8,b{{��K"�H��#2�A�@L���h�������x�TCjr�
;;��L7P?I�9/\Fmb��O8ww#>�/PB�JM�B���	����Sc�t�4�m��?����e���}NM^{>���Y��1����j�jh�+�,�%B=����Gq������Aa����������3�����AI���%�����'q~
���@DE-��,�s���}�j]�_�	xX��w`|��(�BE��Z�������
S�_d����I\��_]��N
V!�a$S�,����>X:$�H#�fHB���|j 	�D���h�:� �1�Z�X��Vc�b��>��t��t�T�Jw��V�%jp�g�t?i��t�@�TM�dN
����� +�T�������V�V�.�Vk	3>5����Zhb��mw;��>����_����<���D=�nM��u��;�Hr��d���'���o �.�A����x)���!��S5��$^J��V�2�������^G(!K%�m�F.>���?�j���������R������T�%�;��n����wC��S#zPd_����4��	d��o@������vu�=
����p�F�gt�9 K!���:��g��H����Tbl\��>�e3�j���b�g�����g��s^����u���9�	�k���*�j|��'�r!�$���N�V� I�|��4������N�+���}����}�(>�;<�� "��hf�!�z�
a0���<���:���s�|zu��X��1�K����1��V�BV��C��9+��.I�V%���Y�P%Zf-V�+(��?{w�LE9`u^B���X�8�A���Q@�mDA*�u��r�����)X��[�)���R�^4J>� �$r-a�`���l�2�0�4i�%4�8G���8I��t�z��X�
��j����=��&�cK`C�OwKV�����q�Y&4nIm���U��c7A��q���	�90,���i��w	 �����������f�@GM������d4��Ma��H��� ��������=��t���JL�U����{���U����m/
Z^c�~)���&h�G,tF�mF�$OD�j��������Y�#�M3| �������F����{�
�n�6\���P�$�*T�$���,���$%��I3�p������-��������l�e��\��NF��n<-�i�.��*���1����
��d�T��X��A�n���j-�4&��-�t�	4���-�K�o{�IBwI4�� �����4�����Il	>Un1BK����;��@g�f�a�]�1mez�q�L�J4D��E��1D�n�����J��A�U��i=���
p���W=8��1\�~��UQ���?e������=�
g;-6L�I���������j/��M��bxB)03�������P���V=D�U�����v��j�%*��G|q!��[9������z5A�b�&��#�;���2c�7�,L�i�f���*tC�{��.�cU�n�?�83I0����F.����Ij[@����@��"���M��z�����0�����}|���"�0-Z]��Tie,�����VH���
-�O[m=){������|i�"rl3j��:M%�t��
��HR(�bU���eL��Q��Ec'����+��[����@��*����~��!=(����I��0�E�OK
�*��O��b�$61��!��%d�V���xJ�o(�H�?��Y�!g�y<�P�c�����$9�(�+�C��
?\5c
�����st�#:�b���'�����*�w��rz�'�c��D: ��x@)��i�\ujt#
�)?e)�}{=wn�Z7�I�O���m�O4�{�}��#����=�A��$�FZ���6��,'K����n��1
7�����������U{��V���%��� ��8���$W�N�29O�x%���LMzi?T`�)}U���G�0
���E:�{��w�����sC��!����V��ces"�+h��d�U�$���.�{
tzb`�n�VG]'}
4Aj��72�);T|v#	��V� 	���;X��is�j�J(�y��?/}$X�-�^t�����&f�@����-��z{{��p�mD�]�K"����1G������IFnfh�
��\7F���A'�nd��\�~�s���w��QOl�]cD���>
��=A
��wD�wq�����:`=�7$}����?����6m�����
�C��n`nU�2��I�=�2�m
8?� ����O�,�b�����1��������m�,7�
d�SF;6����������%��Da��+���=���nJ2Y��,��/bFB�O7�n�����NCw�$����jw���|Q�CG�������O:���z7���=*�,���A�$���o�wm��	�@� �������G�P�&��8�����/�$cC
��#�D�����4J��P�����D��}|�q:��kfHn����%��R�W�d������/}�v��C�=�q�� X}	f���v�p�[�#�Hwo��pft�e���'�HY��+�� 7���~�2�n�;8��jci$i��fMf��������L��d�������co$O��PIT�|j{�	�����{�����,m����(�`<D��_����7�;�BX;������)���;����-.6(��-�F
���#�HBRS1��'^�����N��Lq�6;�n|��3�b A;���f��S���G�$�k���� ����T���H�u��'&�3)�r����3�0d`F�B��m�j&~�����a�	�$JN��17e���b�S*��	~���#HO�4�4��?#�h=������>(� �UE��m��F�������>R��up$�.�������B���:�C�}�}tc/����i���c>8��P��i�Q��9��Q�R�3j����T�c
��1��Q�1)�tw�
[z�*����uw�/���[E��0����`K�����E@���Lgh��`�AaJ
�%�]��fhBk��wAy��h�1�^Fc�" ��MD`du@���|�:-�B �cD� "���TE1��,8�J��sG�F�Y$��dxW2��<����F���a��������b��W������^:��T�8�P�,\���R	�5����[�1"Q���}���zs#9
��1�P�**�}j�b����NO#VJ�d�]����c�nC��0$!e�9���C��
�����C6B1��l4b!o�a��������v�F�#�%s��lh�&���T��h�T��o����YB�SE�O����E���@���
w�Z�e�$>�����`� ��k�G���
j�0������N���:F'X(�0:1�1V�o"2���YpL�H �}A��E�8
��U>"�^���:"&�_l�Z^��2^��W%�d4"M�5Z>V��5����V���a�Q�}@�n����[�L�e���4��������:��o�""F@i@�>�\���0�v	[�nc�b�[ �L�b�
jd��<��������B&�������h�����3�),H7��5�e��?� ��7N��j��XN�Hrt��vr �Ue���'s`wkw���"�a�bK��\xF��X/��^���=
���	}���g
#��i&��_�������{J� ��@����	�:������4'�&��*�b2��$�`�#����SE=�����;sb*H�.�2�m��4�PV?�G���{��D5�N�3*�f�&�f�� `����7c��^�q����r�D2e�Z2�04���%�qv{��_#P�=�H�S���Z
�:u�XMe)�{4��4�x7��f���-���-?,
z�La��
�,�]����dTm���n�4`�0h�Y������i��xe�r����Tg����;#���n�#�(�U�������&�gQbW��������O�!	���DcS��|�f�����y<�;59f����q&AD��� -OC�����,�d�/����Xt�|)

C�!z���ijK
Vg��E�T���<[	!^�,���f�|�\C��gR�ZsZN��z&�yJ�y����X�/t���V�d/���Y5a���q�D�)�0e&uA�9I���4t C:7,��l��F��[:�V8����l�f6����|���x�������1�1�A�S|Y�}m�w���f�����Y�x$��3M5����+�|g4�h��o	O)R2
*H��PonEpV������N����c�����g�K
4������q����|;|��s>{����FZ� pKqM��';�Q�{P��� ���SE�o,� =�����Z��~�k	�`���acZ
JF�8<OK��������;OK?�2n���O6CO��D��
k[P#��Nch_��)<E�X�|��m-P�Kq�7�vt�l��U bM�36Q�$8
��W@?<��VV<`���S���<��<�f3I��l��
K�\��J��1i�4P�Z]���Q�"�^'����:��z&nA9*X��[�/OJy����p�V4i���AR]���>I�Q�0����V��I�$c�`(\\��R��}[mMvn�h���~-�A^���w.�V�o�h.�v�l�_.���2b��Xjf��h����Y%s�iUhd�14��<������Vy�����X	�gn4��$��V��TU�&��9+@\9.�Cc�VM'X��)��s4v�"Uh�y!�X�j��Q3�]Ij��W�JEk��V���`�'��DhkD���5�G�����?�yyW�NM�W4bX��S��?qJ�J)��=��uE� �!����J��F�����+(��u��qh�z��R|�u���l0E�V!��pi���_U�-�g/���h�������e�=_2��DC��e B�	���}��i�b��%�Q�~�I���K�u�����g�1&�=����b�4�}���G�a�S�0�H������^	P`�FD	�m�����s�x��	
�����d�O������&�\����Bg��[e����k�-)x-�IG�!��k� *�ZGH�2|�@�
f�������K���#�fZp�Hy\�/���%[,���Q��=*c��u��p��.�>iA��(8�2)oQ��Y�z�5����q�#K~�������$���E��s����cU��7Rpd@-�f%#��"�`�(��k4^���f_v������c�S�K��;<�BVD{�M%�@
���T5������,#��c��a�6(�oEq �L���$u^�G�[�Z��?|����N?$�����

�c�j��Dq�BH)���T
{Q/MAY(��1OBH�2�`���?)/k�~��8�I�cm�`�o��o�j1�kePE�d�+��q��`���1<����-���e A�U�L��NW4�;�B�h��� Hz�}�d�6� 
�������rg��3�:bS�Oz�%-kF���������z�����cB�J�1������Q����XSd�HiTj��:�`._���0w�mb�yG��:�;1�2Y�����#�:��c���7����p���QL��Lv$*Y���4
�-�f��a�5��:�YwP
���?b�H�O�)����;�l��a����\a5h`�XE`��&��FX+gY�V!Z�V�=��N������.:����.�������������6�`_���P��~��h��?&��tY������&L���(Qa�?�������l!|em�J3��������~}*��	���v��
	�������S"����@��l��#�����3�����g���GLi��KX��~8��)��<r�`�����E���:�z��(��#��������k��Y��p�� rtN�=����<*A�d��>%�fbR3����)��g���C��{<D�c�\B�M��������DA���;��������^#g@��~	
���o��4>L���	g`�W�
H������i�}
������/�����T���������e���F[)��q ����q�!U*��X��6!��E���������6
!I���T12Z�6
��i��;>kh�����-��[f�w�A9#�y���xZ`	��l��p�G���e�}�LG���Ex��Z���I�ds�	4E������';}���k
�(c��U�X0���s���^;[]wj���m9����������NT�V^JC��RN����
4H������r�cf����\`dS�p��7�g�'=��O����P��_��N�
i��=GJ����A��m�a#��6����u�Y�=�b/�Oz6M�c���"
t�/M���29�]��5
��J��O��?�,�LFy8�_���r��v��������A�-��wx� Z���uQ��y��oN:��V���KFR_z'D��p�!�����+sT>F4�����u�����z�`
��t3(���y�N�UO��C	O������c�A�������6q�)��G�����?BS	�R�vG����A��7�H����/1&�1�p~�-�����<����l�7����l8����7�pf��Si�:��E�f��7sPK�D��F]W���U���k�a�1��=��_�I4:�X)��!)[��5�,}Z�w���Dm	�.��]'�[��h��ob��Q�.�Vi!����I������0����DW{�3p3���0��M`T�����6�	^��z�!	C�/���fkq�
2&D]�c��i�O��RqCb������a�#P�P)��3�f�
H�&�4����E:�H*7����:;�bR��I~�:�"��-_6c(i�=X�����*��|;I"r������$rA	/�����|�	b���������z�!g�/�Aw���|�5gf*����y�a=9����c�C��STy�	`���Mc��'��-�_�_P���\���?�b�A�>J�gy��'���M�9�"�����8�:���
L�|�.����4x�5� /�zg��c�ex��1k;�I,���L�G��c��sO�@�:�'���� ,�$_Al����
����uyr3(��}��o��Fz�!���hhR�LJ����q�-OK�,���!	��^�+�Y�h(�:�����@ye���&[Y�>c����F$���I\�ZQ[�
�y����~�S����|����+6�>��h������T.w�6����PN���{R�����8�9z�|����ji8|+e�]]����B�U��:���5 ��#�V������+7��yZ�:�r���0`.����#U����f�\�����d�{)��;�����Z��a��{�X��'���ss�@��{�������`M�{�8��K��Ro�ke%��(W�5������L�����������������b�8�V�i>�	{����y�j����0���y�v�G, �m���;�d�	�FTZ�t������;����h��AC�^�u�j�����U�h}	�S;|��X��Dey����{��@(@�����0y�q�}�d��4q�t=n	�85��=�K,�����1��5���:rC���5�H�K2���H�ou�k��d`Ar�u<�[��5O�h�1!�c-���%q7���@{�;��C1��\���yJ&P���_���9��4���wP`~m(�`���g��K��e��3@�� ���G��%��
?�B/%�����d���&j��#m��p�;��%��A�)�������j���\el�$i�,9��fc��E��w�����M�;<<9t������������{����}d�#�	�*.��|����|���e�� ��{
E#I��;X���*`�x/���1�����OC�6�����&���AFz^qTCBK��#2v�"f
�AI^����XCc��H��U�D�����{
�<�<�?����t�$���w/z����� ������y�j�}��-	{/������^��<_Xgg�U��G�R:�����<�K����D~���y�G���l�.���|�Y/"��W��&`������e�+�_���C��@���Z6�a{��b��@��o)e\A�:�?�A�O�O�B2FKz����\�E�
���I�Td��
���������p��TA���~���B.�t��Z�|��\Y�q�$�FH���n��OE���Sb�TD���"��z�}��P�!�2Ai:���j�����d�6��u�����fmS��hu�@�r/c�-�'�4����U����.�*;����
!h��lw�>��{��~�@�m�"�DE�w�wj�� ��;(~��+6��a��6���hY0h����2%��L�q��rD���e�n���AfK�(�{���PC��0�P����+X��,���5�D�GKM�eqtr�RJ}T�[/
�
�0��d)�������q��M(AA�7�J
CE ���
�T����V���+��^��2������by�����r�XX)I�����b���{���S�[?tx.-��l�7R�������6��C�'6�AT�B�c���J��e��Fzy[/�������H���pV%z|/m����.O��G���:��:��H�����Cc���5����p[������o������Dg�f0	��~V�2zA#�i������\�����:I��Q(v� ����;���O�����+"Na��>�j�	��,��^b��$��WH��#��@����I��b"�!�f����~�a
G��!W�m	F�=����A����^�j&���(�`�v�,�G����t�E�x
t1������*����I��;�����J����+z�g�2�%�^�4�1���j�{<�$
F��e�����(�(1;����O�jU�V�����JdJgSV�$U"�"���h�'C,b�����S��QSJfD�_��baX��'���X�`�{�F��v:=�ZC�'p���H����F��2L���F��U\X4+���@�H�v�����b�?q��W�B�[LkuG�I'�S��Nwe��|:�.�
�@����BA4��Z�&�}:K�����/R�u����B}�YU"��F���c:�oI�*��(��5<�jI:%Qd��1n�$Ui�Z������^��j|����D�H/xk����e��H�j�@��$U�e�/]�O�#��)�]�U�jM�)�����e�km�d����������T\j�W�b�+3S��1%"#r}�'��������*sW���I��R� ;�mK����j�BB�����bu��B-!��ifC�e���Z6U��1�e�Pr�B����T�Ru#f�"$5�����Y� s+���W��jH�������D��������dC$�[��q�1����Z�b���� 5YZ}�(�J��S}�P�����#h������u����	���+����1L].���q��)4";Tc�&�9}�<u��&�Z.nE�~4�T+t��-^dw=Rl�	���@��������iO �q��X��r�d��k�m!5�u����%�*�S&gr6B}�q����i;j\���������
*��(��������J��j�c��m�q6k������n�m��e�e�5Zy�,��5��i�T�h�FkO@��Z7l����N��4��(`��FIH��?����X0��L(1�S'|�����a��q;<����J��j$��$���<����5^S��������%E���<������E��<��p#�[��s�����X�9���9T���Fz!�/�$�������6L"#�j^�A^1���*���I�i�E����A0+�����B,Jzd���FM�������W<kY"&�c������>	Q#�\���^��B�z�d'���K��'�d��>l]�Ht'�#������L����l��7
�����*�
��}�FS�C4WL.�[,lt�X#�����2�"&�W���.�Tw�/�?8��J�"�3��a�E�!����P�B)��^���Ee�j�WC'84�A9����-[���PT��-�_a��I�����'v`���kh_��V
���\"���� $�Z68R������#�}�������W��,��� #:�������odd�u�����6c$L��Z��1�C�|AL������s��G v3(B|�� {��s����l�eF% �����%��pG��]��?{��H�qe��X?-���P�LK8�~�1u[��n���U�8;l�dU�J`*�h?%:�6��5�mR)sd1_�{O?��#�ova��$��y��guna\hy1������,I��0��n~�����f���@uz3xQ/������"��/mB�Ur�P�����36�����?��B�6[�����PR:L3<��
)��A����q&?i�`����b���Dw3=!c51Z@ie?"�*���B	gg/��b��:�:�'���=�hk��,���lT��.�_��V�5�'��P���<J)@�]�[�����hk�v�[\�����h�-+�x��G3�`�w�.�������������C��Ee+�X�l��p[G��3%�@����z��
��^�vKL^��m�"�~�Hv#A��B$��e���AR�4B���*6$�t��}G��^��R�7�������AI��)��U%irClA�)��y���<Z��C�;�A����3��]�n��7��4C�(��0��WfS��)�#D����
��E����X��0�������
��XX��dm���v'iQ+��)Va'T�~r��9VXaQ������jF%�%�J"���ef.�VY6�3O�I
@����+9�^#�(oS&�����R���K�v�[���D!K�1/��M���i+���X�*��bY����x��+�����y���`�<Ls�����zv�(w�RM<�|-r�E������,+��������l�a�w����n���=m�F����,pE(�&t�P�f�B(���w���5�o3g��!���q0#��o�X�8��1�v��y����dd&,n��V�/��f��Z(6����w@4��-�F-LI�2*���n�b����P������zG�iC��K)�����$�B�O@k$��f������T�9��r������S�D�nC��P�/��P�b?��x	����%���a�z�Q*��������-2�)�x��1��fS,���D�M�����,���������g���G���P@$a4�#*��vc��2A�W0����2T%K���H���6�u����9x�7��1iP������,hG�P��4�5��q�"�Q��@n7�1T� ��ndc�e3���Y[���!�/�3����������>���(*�Je�Qb�X-"%-�3&*Ck"���6������?U}��:422vo����e�����w���z����ASB�a�������;���]��x��O�
�X���{T�,���o��LO���p��V!�`U����:������:��������\�
��5�oU�T�X��f}D?�y���YyW8�i#QMrD$��n��������!�g�{���c����]�����H���grvj����X�z�-6��Li�k��������u����Q��.���R�}7Fb�Ig'M�"a��8���y���g�&����@�nD���v�27\�(�P�X+u�d���U=��	Q�u� A�K����m(D�cD0l��7����f/,���+4B2�� <T���E!��-�A|�a/���0��&�������A7P�N���:��!�P.p�B��qH�*$��=GI����;�-�b�(A���nsC?�@���6�nw�������'7���sT3��YI�y�����).��-h2�8l3�9j��=m#2q�o�D,��X
6��_h�f�_7`���k�b}d����*]���)�ii���mmV����V�����-��\�!}b~��N���H��>����ZD�����|r#�r�Ph�t���2W�aHC=L���O8��0�m8�����o��O��z~,�u��J4e�������X��)1ft�:�5����a �v$����	!��0f!�� ^�0\�/Z���������m�#j�I�����V7Dn�@���q�/<J�9�A@�e�QY���x����#r�G��u��n����^��	���sF���R��Jk��.�N�Q8�Hn�R���r$�{<� %T����$o[��yC�-lE;j�{�	\q[����;����������T���H���0-�0^�\vF"1�#���E����d�a2��0��b7�;�,�����-���-�i� ��0� !�8���]��y���8/���.C
��h�j�!�$�r�	M��.�X����T}���e��
$�a.�#��.;���O
#
g}4Q�l$�B^�������_����DCr����{�Z����Dl��L�d�l���|>����'TV���;s��:�] �H��|�"��=3��	���r�=�C�b�`��{b.X�n@?���QVYia,@H�z�S���H��\/d"�bM��[H�"��jN+u�����=�)a�����`D����n]�nF���n
�H�jh��
�����!l{!�4������0���X{0�E�\��:`U�����hW	�&�/�"�3hE��A����\��l�����q��g��>����F�S�y.U
�����f=�����oc>o��'e�����X���~"�,|[��0���|A���'���o��#R����&�%@I<$�[���l X�n�M8��9����\Q��0 r���L8�/b�����@5���m�G�Yx���KMB
�-y���~-]G`�5f���
D�=���y��bF� �h���*����@�C�OHz��^�O��d�?_������7
H�s'�<�X�|#�7U�R�I�K���l�^����scP;�t{8,jP8��%��AC�����$tK��LN�������p����4~P��x����G$F���Pj0-�M��������gM�6��2�G8�4`0E#�Yc��������F�qPo�Y��,��@�[�iSE��3�����c���'��8d��6�i�`�Bl�H���b��qY�V��>�H��V�kS���$j��P�F2�l�PcNP]&G����-��Be�V�h���G�0�m��7� 1�D��'���
�i��;c�n�w+dp�4�����yu3���a���ob����=v#^��6���
f,��K�4!��e��n��O��u������#�R~��m�i�B(.#y��������~���e�>w��j:�m������Og5>Er����/�D.��#O
v
��.@kvDY���}y}��,�$�a��1X=9���#��:�F0�sV�&��N#s������t��	5��q���&Q)%xF� 
�`�=�Xu~�rp��|����i�B5���� ��-sfE+�T�2��'v���������a��i�1�m&��E�����U����)��>~�]��c���H87�F��Gv�
AC]�����%oBv1��	E�n��G����)�[������
>Y ���"��KZ��2��������d��jK	T�;��>"C�>���"T��!�hV3���:����K3����5$�e��"����Nz��}��n-Rx+k�f�-��(D!��}�)d��S�����3A,�Ni�B�L���5����)�*����D����x�����'d������T��W�>��M�_]B>��X��T�V���]-��V:��=�@v!o�w+����oNQ)��Y�2�\F+�FY2I���R��6�W|�r�p�$�T�9���h-�z
�r$Y��/+
���n�����?�5�J���D[�PE����T~���%\���Yi���HI��(-�u��!�'#�C���J(KCg^��E��v_)�V��(ki�������#YD�2!K�-0�J�&BB������8�+9��=�t�x����;Y�"��<�[F&��H�>�t����S��.��Z��'�*G%�8��f������������
t�#��p�6����~���J���x�����b��f�QY�*�L��N����,c�����ZO� �c?X�C�~A$���`��|�@��Rl->A�����#d?����h���������.�z1�Qo�hb���6
g��ex@aT�c��g$�)|��{���\=�.�98�@�C�����$ekd[Du����^+=�#_���)�~f�����r�_�3s"Y�����U���������>� �=�M!�.V,&]�U�3�X���.':�V1��HL��+���x/�&ZDW�q>b���"!��g�/�����B
��b�,(�.����f��3��H\+���x��kS�����M�~����\����+FI_FXf��P
�2����N�����e@������j���d����������w�^���f-��,���	hx��b������o�=j W���h��K���;������9��X	WD/�����r���v�8c2h��s�$�� �&��O��cl�&�dt������&n�w�O/����g�qs.��0�<J|m(�?O��Y�,{��:����$�{�u&
���w��1����mH@'�����}�"~��{8hQ��(�/a���L[�;��>������]"��������Q�'��l����7��Cp���$�C]�m �T��d�
#��a]�9WMQC�:Iv�^��)��O"�|�����*���$+�wfM�5� ����g���&�H�o�F��;z>���!���w���5��#����v�����r�fG�]#ui	�Pv�d�,�t�w�c�]s@���@�����h��K�2���6
��?��E�@�m�1$(�f(zQ�2���[�����������z�=�KD��F+�Z������`�(!��C4kLg<�^�-l��"��������������4+e zFBr����[z�.?|����h*���M�o���iu�L������e�|��<i���������e&R��n�7���Q-76^��8�#)�]t��2`��="����'�v���`���YV��J04��l��������
�����;fG��(`2�C���8�a-Sg���9,p=0�EYR������������_-���|)f��D�`���������C����?
��u��n����78i��c"5�^Is���T6�V��SS�{�^4ua'�96U(�}��$FD�����\a�����1n�J��M�p�L#Lt78�j���hN����J���YP��LQ�e�@fx���\P��N������cE�)��g���=��nU�*��N��[s�
0� �J��V7
���	��Q�������64eI�)d�t��bXXl��C����y�o������
�~���#C?we��#�4$Hk�>��2]G��s��\�#98�/�]���k�D��"��f�F�3�)��:�����W9o����B���<�d�!y�B�$�������H&��u��L��F�1�`�Ui�B��T��C����P�q��,�'��p�����'�����f��LU8'�G��w@��^�{G����G}f%�-+�[��[��z+Z��$�e}�c�A
�H����������)?��s�0�q?��FO�C�����'���`8+�7��+��eQ1xj��e`����
�P}w!�����;�c�e<h��q��|�q\^��������n�]��8��$����6K)��|�QAr�@
�c�a=�^����X���V��v5w'��mV:��d�#t�;*
p8�P�v�4���������6���	�1��
���
�����FAl��u�(���*�'��4�������4p�s���[���C�d�0���Y�O����F���ylc�l���Y4\����s�(��S���qdBD
<�B��<�����u�-|B�x�J���%��aJGXl)i�Xx ��������=����5t_j_���3�1�@���WW=�\!�uG���-|�����Z�"\��S�"���-`��BO���0�D��k6�E`���d��h�Y@��`!���iM�}����������o"6�n��,|�8m�Q����0|�Re�0��#���;���N�v�f��.G0Df�y�lukm�������i����<,�?,""�Y�]t4�,�i�@�7ka��-V�g}�1��������@���;G`C��
l�����E�g�K2��W�����hD �2{v��+Ju�u�A�������U�����Ke��t��&�A|�PCG������(<�s@.5?������s|��Z�%�$�"d����?P���^HP�!�(Gg��:jG��#pbr8������(;�	��iY�Wp�x�A������
vV�Y��<��AI�|sG��B�?�9,���S��j7$�5)��A�7���������Q��������g5���	K����]����
�4s+��1�^H_�x^4���n�cM�/����H �W��X^���~���hd�����i���3�!;i ��O���#����?v���1�C�{MIlG���;R���=}�w�
�dwzG�e��\��cHB�|Gji[��`�FG�
?� �B$^S^d�wG�������w���aY������RG|+i1���@����1+��}/dpvn�|��T���oM�	��i:,jN��h�k9��q������� �PX�Q/$��w��-l��������ctb�����������^G�l�k>�N'|A}����FX���u��Fr~~��>���nH��w��$���3*�k	��)t���=qR|G�����4������]�[�d
��nwa���<���Tgqe]�i��G�[�	�7
Ly���A���i�D����'��w�6O����R���i�$������Z����f�H�d�@G5���w����N�K��:�|q.QIy�����#��L�� ���d���&�BA�5lu��h�3Jva�IC����!�,�l��W ���u�;�V6����hj%Dv��q�wSO�z�%�$��� �s�O&�'���@�5
0n(84��m��9��eC&����E�l���,�P��{�o���q	�6^J�����e<3��w�9���
���%w��A�v�~���Ir��y���a���J��	p��'�5m0^���Q6R��#��xR��w����?���3�BA�19�n�@T��,����e�4��!�Syt��D�9R�gC�4����;��(���.k�:D�?a
�;�u����I���D>�D0��4k�|���mwj������7H�&��f���n�Sh5���nEkX^�����Rl�$������D<Z�1:3�����a	PNX
o��V
��Ky�\.)n��~�R�X�4�Xv�V��%�!���������UnE���U���b���o�"��E�P)=�`;#�/D��~g�����*�M�y*jh�b3�n�^��C=�h�������cF#��Rl���a� `m���#u2����)Q
�b������goF]�P�E��j�E��"aFg�b�B��.������8�gw��%q4�Iw-�/�$��q�-'�`��Bu�'��}W�M���@�!w����?��&�`'��R��De,���E��-�<��w3�"��@rxL:�Oz]��f������J�f���W��o�N�d�'p��l
���)i������8���]�^�3>��g,$l�R���;����~��#��F���I���]�e��o��T�86d��D���oZ�����g����b�fYa$<E&?"h�\*`Q��G
�"x��
���%b�����$�����X	�BS��Q��r�c�0^�.�^I��&��5g�����f��!�z�'r�w�	oW�������������fw�C�j��
�rA
zg8rx��@nDDV��)�Pk�X���1W�va���s��.�����s�)�,O���NA��F��w�zs�p���S�\P�D��
����"���:Z����i���x ��7Tt4�������"���_��6�����jX�W�0�Q��-�F��"�����l�
hx��fr���0~=F����T�G_��RL�����H��^(L���!�1x<����2�mD�x�q\O���<�{�a4�Z���d��"�1�7(%h���zLO���N)���z�I>��N/�����z�eZ�Y�b���xf���������[���
6fz|������L�j�?��|���*��'� �,\�T(���@����p����a��kDi�+���9�������_v[��S�����E�
Y�����T�Y�V�Zl��|�U�Vh8g���2'�V��I7�q�|E����TO����]@��x��#��D\��Qd�Q���9�@��s{d���B���&��9�:t9"Z��l�fP�cUf�K8��=j�U-��I����1{��D�������+�	Qf^��w1~C��:]�x5/k��F��V�����Y���q�����	���	1]�`".h�Q��/����6l(j�J�~(��p��Mu�BD6���Q_4je��_����6�2�#\�X�E���^%zo`�����AGT�Wa���
%�E;�����=1i�o%���Z����{
���A�!D��*`�nQv�������f�����w���
�����Zcd��@��F@;X��wd/t��g'����R��+���*8�I}������wW���e*���!�n���4��N�u�����|u��mV�
��Z�	��'?'�K�������`��Q���H�d�@�rQYg#�� _`xt��G������T�*8�T� �����>>��HFS�u���(~�h�He_���p8�F�����g�(����`v.w"3�;z�3���� ��o
|�|����f�9�	�����=��tZ���?����M�����|��1�pw���<"~E-�j���V���������jW�l����F�����3�	�M�6KU���t0�{���Z���=�S�@6qQ��
��AI;�J���(c�{������R���,f@�����2�pEn&��FwC���B
�s�C5{h�Y����T��-4g)DT3j���z�l����WY]Z��7'3��K�4�Xeu�&(��G���=�b���/��5A�|
�NQ��O�m����3��4(p���b7b�dj�zy��M$�>O�Kn��-tta���qR�������ln99���Z�B��w�+��
�f���h�m���M��	�Z1�hSh���U� ��	u����<2��&��;T
��n�R�8�H���vj��>�D�}��;��]�����;
��m�F�����f���C����b�6fTq5�4D.��Q��}A�d����	�@�{��!0z�%0c�(O'b�6�=C��	�S��L�H�;ki�/��g��>M I�����)[�3�Kl ��_Y�r)��6���D`�g?@�+�����������@a���4�>7�5@oGd����H��f�����0��e]�!X��	�������
�a��R���g���gu~����"�o)�.�	�@v�ih���e������2����^dY�^G'����lC���/D��h��Wr#FQ:���W}�����`��Sk�&d�^d��k��_���FK�-'7�J�
��g��@���tD[��
R���k')�n���_y����������jx��L0v��,���R�s����tTH��sG4�f]^��l/�=�g������69hC��N�4p��lK��&|�B5�.Y[���a4�;r�����>�>C���ft"���A
��}��d�v_���Z� 5Z��t����1�H+�pv	q�9ee�Z�E��N�����B�If�����[4FS��35�h��"+%"6�=|����2�&P��uw��`f1+�9�/�P��H���,#���S��=�oFW����g��������}�-�b����\\�w�V��[5	{G�����������~l��"��.��+��t�'D__�fN"�'��?�X9�%#lv���/�-�f���H�]�������2H6�H{]�B���no#�&l��4�2)�;z���m�v�ty���wd����<������k�]R�jwPsD��#D|�^|�v
����C�#4���:�#�_���{���!�hC��#dk��������~�q��.J��G^�>Fu���l���,��Kw]ef
�/�2�4�dwc���H��=7doAh��������j���>7K"�����������$���m�����;k9���e��.��q$�^z=�Vls�|�s�Nj�GQ+�����,b�h�2��
r��^�#�]�0z��0���(�R�����r�_z��+��M�����NV%�m�n?���B!j������|�x:$��]���Q�[�P?���ilD@:�	��7�yX�F�����h>�=��
�:S����:E��>��H?Q'��TdRu��~���'g��b9��W=�tI� ��G�*�.�`o�wzf����D�������h1����{.�z��)���pg�
�������,�f���M������������t�0���AV,#�Ma���Q_6��`��L���������N{q���3����C���p�e3K>�l��=��,���&]�5��<v����#{y	�c��N��e�j�(�v0'@~tO���<)
c�6���B�V�m��B��Jb�Q���y�+"�u[E�zw��HX�
$`&�
<���e��-����$`f�E3�?V
>(�Y}R�l�@H��G��n�C-/�SK��*Z��1�bQu���.���������yeu��[6"~Vw�2y�_� �GW�DNl��[��^�����'�X��~���3��������3��1q2]��o���p����^�>4,y���y����C��B������b�dq�\�;?���5������Kg���L$���H�F��c2�a�6�w$����A���h�������x�[����M�:�%{��u1-PzTK�j�}w!���6;��j��o7C�<�
D�.C�?�tDB)vdi=��23��)�+ s�'�/���(�<���,�24Kn�.�O��4�?��l��D�}N�;B���{�����2��mP�{3�������h
���E���y���������]h)|0���#�pZ3��pQ$����p~�2���ki��H������QG5�����9�;&����n�������%�>
kn!�7�/�9{V��F������D��a1���t�M�8bn+�#�1�����
�'� |��,��@?�z��xQN�;h?�|
Z��TDQd?
xW�5����J����s�*���Z��zB)�X��9o�����h��V���!��n�{����D'e��i��������/�����xg3w��&���$���������p�5A� 	>S\��V�������DX�0"�q��k������c\C����&�����@UM�}����
��������0,J 	}.r�7	����/����0"W�!������V����602�E����H%|4��gm�)G	�e�#T*��������?����{��v\�^����#l4P(l��=�=���S�����������^�$�-#��UW��F k��f��q��k���2;�!,B����u<�N���sf��b��:x��<=�.o�������z(~Y�J(�H�w?	���;�*��`�4����'�_��?�����?���?m�S0D��������ws:��A4_8cD���.��Cow	��;��L����7�)���c��6����c
��)NF�V����x�t�i'&�&xX�D$�)�����?K3���r�����Yv�_Q?����6��G���H�h{��6&�+�,Gy�:��r��J������l2�'T��:8:*��51�1L�&�
���8%O�����\�9��)�W��T�\��������J������@�9�<��w�D������#��!nd�iJ����@��D(�t8���3��"����d�R���f�L�1��%[M?"u����d��cDp��e�6�[��M! '�N4n��Km���S��������,�12��;�LG�G���~�����5SPI�6
sd���#0B@Iz+rW���������Y�����9�{��lE���"���w��:}H�Yi��������:&��3�������e�P1w��!vr��/E��NMsg:R��9�9:�Dr�)LdF��D��P8�zDSL�F�v�aU�Z�� i.;B	�8���� 6(���a�d�#=�g]�iP��D�F����).J���B6tjD12�$�5�����y`p��M9��,Z��
�R��a�	uax�t�4�K&�&�
�,j
���.8�D"�+5���*F��N�NGh�$���7>._vJ�����_������*���y�`�
{�1"�\'8����y%�������YuI"C�S#a��L���l�#�*�p ��;��:���eI��i���r#nw���Zv�3��8��=E�v;e����)��I��>y		Q9��w$������Ad+�C&"���B�AYf�1oq�-�4HY��	hD�)hc��j�\������&��x���s��dDMp�h|2�h��� �n��8��w����p	������&q���l(.
=��0������r����kG��X����
������d
Z�:�?;:/A���[�|Y���rD���X��}n�9�8�
`9s��� +f�hT���]���������.��W�
���4,|�3�r�Dv���z$
].�p�=$��04�+mdz�����h��n2Q�*V�D�X�S�j�NC~�����xl~z4�j�.�T��d��0�v	��x4��P���7l=H{EE;��vI�Ht���Cs��}����H��>��h�9�^��^� `5,�+*���B�#zV�0����A�����a	}C�W�$j�.��G%�����
�yB�i	s��p	n�ryD6-Kp������A�nj�?�ku�o��=&k+����
��w�+��;G#|m	y�$��x7^�+��]�o~�m�1P������k����s�T��o
�<({����N;�����
�kG_�m�m��'��d_���H��>uE� ��)����"�����S��?������mG�g�}K��	1$��3/�5�XN���J����)�`���&�4�3z���gk}�Ff�����8]����+e4\pCD-[|�U��b���R{	X8��o	I@$�y�/�%+6,�(����h�V/����-����|���%P��I��/Q�o	E������;���k�E_���"��=������%f�!*�����u+z��
l���g!�6Mh-j��c�72�6}��Z��0��c��!��V�������_C�DA`�->#����w����Ys����g��~�N�
���������0��&x_@is_���UVM����=��3^��r�@�r��ex'NZ�e����hP�u�?����/��������U2�){�:<,?P�`/�=/y��A�f?�W�(h�
��g��:��v%�-�l��SR�������3�,B����	�,��:���4��e"���!-���b
��wW�l���r/2+���������xw�����g����F���1X4��I>)�u~����h��?S�(w1s){FZ���K�����dq�P�5�gv����}�Vm���5���c�&[!N{�f������#���"����$����4��"��v&Eu����'Q������M�m�A����S��J8u��@���l_�(�r�Xc�>g�VOQ��=�m���f	I�Q�q;}Zr�f�P�7��e?] �zx�pL�a���^N�Trt�
����n���i��S���fD���P���'�����es�j���9�������=Z8?�)l{�l�I{3L��'8��P�&��
t����$3�X�B$v�d�;�z�$�J�����n���^�}��(�������O���{}M���Z�������H>AUEM��R\�
lB��I]��
���n�-"}n>E��6JA���Cz7
�����q��� :��Y/����=r��*�H9��iCYS����e�b8��>��
��
��we���gM_'TT�h����r�a����D��PQM�G���t���j�`�{gE������T�+[�[��F���S�n���^Ih�:�,0��3d�m�#�Po�Qg���;���>l%��d�����Pp����Y�p	95Gn[{��$�s�G���-B�,�:��2�'-�����sL9K��>`�
��Ca�2��E�&*�4�"�A��z��m�bL �G����%
����(`�����:�	N�������r���o�BQ]�������?�����s�]�����"�Z��5�����Ee����5-��;i�^}���D��m�� 
r	������Kr�G(��Nx��7������h�q2:���1H �5�|�����-�:�Q_�F��'���p�d*���=������SG�DF�:�ys�3��PG�C�8�G��B,P3��8�:����F�K���^`qn@���h�CsE%�)6�`/�������	��1s���z7�(��1W��� �<����Q-��	D{��AZ��B��h���#<��b�[*m��G!�{�4?���AQ�WLB���m�O����TS;o� ��:N�����SA,wh���x"
��%����z>&\Z9�F�M �������^���}�~�t���#������i�s�7Pk���F���v���)��� �G��"Av�g�8�&J$�;�S7;a%*�^��J0�?������C_�#��Y��18����:���X��K6���['`�6rr����i��Z�#,rb&-<���N��W��+g�k�C�s�zg���Pe( ���{�weEAu��`����@�c?�Z��T��h��
)�9�{UQw�A������������G�B���O!��h�"�k�������
�X��?����t�����Q���":�]ya_Q
fh��&"|�:Kd����UH�CH�,�����q���������f�5��<`Q�E�{�U��-+W�4��u�%j[�e�;N�a9�p����Y�0������@�j����>��s�:����@�%3�?�P�d@��f�4W{$*!,�G<�>>3;a�(�y����N��%��q��������UR�C���m��n�F���^�V�=��kMc��h����=��MI�N�By>������d�'=v����WJ�;;���:%��8��5��<q+�8Cd�s�3��DCa��X�:m����,<�#l�1�O���|��15�^�|�����&'���p���_9��p0]�A�n��hSM�����SE��w�N,��	�x��V���l�����A	
�����Gn��;������
:v��^H]�)�Dk��L���Bj{�U���y4Z�\�sz�������=���k��F	u��HV��F��A�@�y�l0���f��*����R����� ��y�a2������mX�&5�f[M�
�	fH�w�����@�*-%�=���Mj�w�6P���)�����m����0���������F5�������l��������{�]H(��\��#���5jO$���uT����G.���!��^���	�$}�w���!J���^B;o��:�z�'o�{m������_��>�$B���(/��%��(H8��>��v?�Q������x�]������Y��~��*���O��H��T�� L����=�������s�V��4���59�S4�3z�!�SH���HQK��$���I��)6��0Q��	���v�i�a�;�^&�xe;��!l�Z���I�������7{���m�� ��8&�N��%�f��P���-�;�RV���Mw������+0��*�p�����9��7!X���o/�&����%�_>���0e%���&�n�az�{	���k�����-2�m^d�����N��	`���(���
[���=���������@a������8"�{!7^���Z�`=���Z��-j����w�J<�Y���Z&�g����@���3�QN��sd6_>4X���{����;��@ L=�Hu�54��
Se�����}���H��^C$'����d�@��%T�@���u6��H��An�����a�-?G��q(�V�lt
�\�&#��8X�d#%�A8����B4��������o����G������'����'�����x��j��
�;
Y�@R�=]c}8���M�����\��*�N��;_h�bs��N�:����45H�����P�$�L ���x ���;��iw�(�N��d�h�,��-��'D��"$��L��"fY-���wu����C1Ui_�XK�`F 6H4��� ! U�Z �']� ��^"�N�=�Z�3��Kh~�b3�(�#Q�V�]����B��~E���[?�����Y+$��
\�g������1�y��]���EOB�$����j("��hp��������=�hsa,D�"�M~�,�� �)�����I
���*���p5�o���j���}Q�`��'���$<��1�`5Z�;�h����(�� �P$���*��J�"�$��4w��->E����y{�bUrA3��4to���F�#�m�Wd�]2YJ;N;YM`��[����L
���nO�lP�u^�e_	]�A���K�s+�;m�T���5_�5�������4�6��V��8������3X�?���p��h0��s��k�'��"S�mD���
���{[�X�K��r�FtB.����{Wx� ���"f%o���?�;�.;��@-n�[�d(i�sG�!����Z�kL��j�ll�����9x0��������OH�pI+��;����W-�'�~�"��,�����^5C:���ExF��~Q����$MO�����GW�i4Rk���#�Xv�� �����#��h�����I�k�6����AI�
������#%����������"�ZgLx*m���p����H/�F��q�(6��+�#�+V5V}7^����������y�=3gW�x����h��5�d#R-��a����n�"4�v\A���
c��:��J��t�����zZZ-�+`j�u�-����w�5\�,��^�������-��:�RO#oL���pS��{��#C-B-8S��E��hjh1n�D�5�6W%�D���`P5����zD�J�p5�P�Z���T,84��V9��H�Zf������!c�����M������n�m�@���&��?�P2Ho�|�
�>�C�{�Fv1��?�����������Z�|N~����Q
>��	W�~v
������L��d���d����V�N�L�����*^P4��x���������A�����^��pR�U!)�CX��xTU�	��h\��IV.��!���Of4e~(���hD_�-a�i}�nG�/�(��V�-�'�x��-���/��:$8@�EUt!�]��:��{g!�p��D�t���#&���d$����������(�T(Jf?�;UT�U�<��ygS���*�$���]��	��������_iE���JY7�
�8�p$*��UP$�� �M����i������������np	5��HUw�:����^�B4����4�*����"z���b�9M+��������f;��]����>�+����XX��������������h	��%�ESf�$Y\��D��I��1;�#�1��NL�j����0t�V4��"�c&����2�|��}V��1�����X���b-B��!��|��~��E����zl@�l�hN����%~�����p�N>�����2T�.q�^�:tF]���}��@�����#��s[F��
���6�����5f���+�5�	^�
v�H�e��=���k���h��;Rv�W"�����HnV����Yg�J���0O���E��� �����n�D������7�W�Z��T+!n�8NO����-H��3l���@�#���HP
&�#��4��U�
n� D�sh��D����HR�}���)�E��g{'Pqz=��Z
����u6&������RO��i�u���1;����Y��!��a~h���7Px��������em�6�ZK^x{����y��:�g����d�Q�=V�%|��������&��F]�&\A�y���}�N;�a�b���v�����������s$T�����c�1�n���@�'�h[�B�x6�jU#�^s�5���Di��l���{'�6���z�'A���t�fQ�|��7��x���c�&�!����V{�O�hm�x���M�&���Qz�Q���.�X��>r�������4#���`k��w��K��N���5Ws�����G��f�'>"��Y�@���z��!l�Gl�&a�
$Z;�Z+D���Z���-�����~����U#D�	[����%�C]v�j��Vd��@#:� r�>�^~�_3��&����O��l�r��n�>z�����+��g�D4�
*�X������'��cw��4� �-ni5�-T��X�@m�+9��_j�gr�)X�e
��5,��eV�H��gp*�T����������-��dut
X��[W��ZqgnMX�!���P�Q�mN�fG�=R���K�@q�
�}mF"0^!j�}�B���^��9���rg�1m�u���JF�C�}x�WO�������=hY��d������#qpD*�&��������fj�����076jt���E�`��+p-������}�����g<I)�p	�h�B���.,�bg�����oj�0%�6�H�������(������������? �>vTg����]�wS�9��Q�T0��QW���������c_>Q�d�&t&DE�����.u�0��Y����qW�����c�������~��	�'�D�[�g�a
J���X��������a���s}���[h�G�����?g��3z{�)H�j��Q�a�=.uV�Aa��(��6�TC=��c����ta����
1�H��S���1��0�.��B�D��.\�UF������@P,(�3����C:�L�������m�Z��w���QQ�����
vr�9����+(K!�l����{��B'�D�y/�b������s��@Vjmv�"���F����]�����r]x��Q��JMt��
`s��iAgm�n�%b��'{�k�����������d���]XEQ��{�])��[4A��M����X��^v�����G�(��W��K�C����g'������S�?���F�!]0E�s��P8o�2��V���-��{����Zne���>L������4d���cu/��*����?�bD�Y�Mw��)ja�^��'���y't�X$������8z��Btv��C���n�`^���L�Tw*��
S6H'X6��&`����z�� ��f<Ymf����x��8�V������|��!�x�]�`�����[D��1~Rh�!1En��
��(������������A�a��������;��L�Pj�����]�<�q�r���>�j�E�m�C���K����df�_�,�JV}�����L����O��������"z���`���PD��.XbE�f�"?�.���R�����&��l��4��]h��^�4�V���<l��Tp�>�*V��Flfv�2���|d���x�X�����-�X��%G���/����lw��#�{��fK����J4�v�\�����������������������������mz����\��6��:(i���0|f�3��	�$���fv+�h���o&S�B P"�mS*C�D4�@(z���v�aG�ny�}v�;<�9��O
��4"�|w6�V>�<�G?���@�DRf"�.�aFl������y�L#p���X��K��0�4�6�U_d;����9ZD�p�C�O������T��Nt�O�u�3�_��6�!b��d6"��!(>���A���e��n1�<�2u��"Br�[#��)q��U|�f���XI�$H	��zy�OTi
#"?�a������s��Wi����������cG9?<s��>��\� �D`�������e��"9�E���4����Ak�>qH����t�em�Q�_x���8�gvCXC�Ks��Q�o�����be����a����*����G8�;�z�h�
k �z����a�|���,I�I�l�k�_��b����Z�X���#�!C�G���9i+��x�i[D���F�aY�v�{���.�IT*�
��F���\������A.��pVJ�
=v��R���5 H'_gg��X����n*&���w!�yFx�s���u�I�C����-W��G]L7'{��I`$a���K�De��=m5!$����1����a{}����&A��/�_��vp!��AB�����y35��N��_�C���SF��aK%������s8�zb&p-;������T����������R4�m����	N�Y:j�,��w/��^"}�X&|����7	X����2�JV�
*>����yF4�!�
�(Y��8�,<�c�"���{R�Z�[�W����+�Ab��	�r�l���p�B�f��dcD k�8�J��J+*�n�T���<��S�������W��8b��pa�v��<���Y�<Hs[}����4n�����	� �k
{��4�E�:` �Q~��I���:�{9����uk(`�g#��g~��%���!�e���y��A���9���,���D�z
`AGr4ALS;�i�{��<0��0�K&�F@�)!Y��������B�d
���i/����]D$�� 5��<a�	ku��C��,=|
�Qu6������Sh���6m��'����C�D���4�n�#w�MS�E
X�P���=����p��,����5��W�4��`�BX^��i�S`j��}���|4������4��6�T����QE�Es�Q�w]?���F�/"L�?�=��STN���cJ3���"���+=bOkps{���Js����#���f+�@�j���N� �)8@>?�t���OyT3��1	���������$��Mu:����3�#Y�T���e�AP|2m�T�
y��;�5��'5��7e���~�I>��e�M���9^�#��>7��a�e�D���G<�D����6m3��/��fw�Q��U�M�?�=��=\�M[��Xm�3�Ts���;UN�/eDR�9L������~I��vJj�1��g����O<�gdz7��J�`v`�3G���#fR�J�5������i

`?��O�mZr�is��J�1R��A.�����
�C"G�i�@�TD%��M'=/���HF�������6��@S�eeG8��p��d����e~Q��!�id���l���A9�W0���OC��~ao(�K$���i�Zy�J�{��@y�����;>f��)d��V��YI����

�}R���@d�V�� ��9ONatB���u"��p�������QZ����
���P�N�ELa���=j�N�#u��'�/���������Lg@��x�m��_�6RPQ�==5URE�l���KN���-2e������V�jC�B4K�-��
����d�i(����7��.(bfU���o�T�)��Z9������5��NG?�#�v����������Z�=V����6����)��p���d���.93j�/�0�:�H�d�]_��p3^���dY�L�C�)�r.*V��{��<��
�,=������^Q���8�^��ZV��s^�>R�v�j���!�������k��b�]o�yk��}�7�J�F��!Gc���������
w	q�g*��[�����,("'�t$����	�Q���@��x�lt$���<���W5x�]r�|r��,���H�?$��8��i�����������p�������#{��c�rO~Y2��f��$~R��%B��Q��<�l�|��\�������>7�h����r!.3{��
p����rLa`���<@���BK�C�����\�����@9����
@t�n����1����K�C�N�KP���o�wyP5G��e�������7[�Ad�}K�+A�B��k�������j}�F��NZk���a4vH��sMn�/��)��&\�b]��Vt�^!�1+�� �#Z��W��t����u�"�g	R�X�KhB���,+�!_���>XY=gq-�&�L4\�����Ad]SH������6��	�|$"*A��:8�w2��5�������\���~)�3���g��9��Z��,C�����]`���]]���X���,q{	0�'�m����fo[�a��]z�h�^V�V�~����C�0�p,��e�B����.{��p��d�n���G-����&�q�#�:��8Ld:������	���2�?������wWn>�G��f�����W��|6�o��88�o	%�t�O��Vt
�D"��r�iu���^���Y0�s
3�7QAc��f���X�������%���������Qh�#�}~�6
|��&�J�������������n}��T��sro��q~p3�L��"s[�M�-Ha�O�o���x���B���~�����g�H���]���Z'��~����Af}�K��*�v�
���p��}��g���$����UH�+� �����	[�D�I5����1�	%32A�y-,���y��m���]�l-	Y<Qo;GZ�!��'�l3������,�J�"�Y��	����������������p�i���w�������7{%��u7�����]�2�
�)#���`����{��F�Op�`4	T���@���T
�-�r6mO��I�u���d��=B��b$���"���}���p��O�!��x�+:�o{"������~�l�.$AkT?��u&h%�v���o�@	k����	v�9m��m��'�/���g4�RT������na�k��R<m����Z��`���r�St��kL��`�
EP�F���_b\�zd9T0����'�d��MCG�-B%J�l�4��0�%g<��
��tCqGd��p��GC��O{���l�	bk��%dbDD��0��K"o_#|�������tt
!��:Dm�-��=�!�M�
��rF�6�:Q���Jr��]CPq�TL���������#S++��p���"I�������(�m��!%���r��0��������l����f�%AsT�[@�.nAa����o�z���W�}�M�$���@�C7�Lh��}����w/��H��-����>m���R��v:4be����Xd��u��4�\)�g;��NJR�]��n�A(5�X�h�EGL��m9�7�Jc���0�NB�N���j:!���O}���coH�G�M������a;��s*�
d�?����9,n[3��Z�1#���1z����
�2�fL�	���`
fl��.]��,8���eG&8�,��v���pihW�N8U����������m��b��
/a"��)ZQ��.�.�3I2�����-Tk�g!�S0�����������;c2g�� ��0�M
����K�����a>"r��vBd�3��f�h�� �c�"�&N��H���x]C�C�������wWL��.Hp��|H�e?�n�Fw�����M�[M���#�"�G�
�nm�?�6��8�XH��9D��#��	�e�8B!�)�q���1�<�K���������>���}��t�w��/���,����gZt>>�m���U6�q�$���.wF(:@m�������f�
\���&�c#8�=K����;�\A���0�S�EQg���i��S�8>�6�(o#��HA�k��������I\z�+h���sL���d��iv�&�M��G���;���s+
�<�3p{��d����0�.:r��A�R�SW��S^D�$$c������H
s>k�[!F ���	=��rz��g$��c0#:���3�\y��D���kRLpw�x��|�tDFd�)�Q������5��W�h+GX�o������s�(�:{m��A��<��&�������EItA
m��0|�c Zk��'���8zB3�qA��q'��f��,�A����Y�nSO2I�|����Cg;��,�Vk4z�w
r!�~���k��G_�����GA��n���vI�CC��?�d��~���O��?�j�n��,��|�L ��6��Mx���ud�w��F���;Bz�w%�B ��Z�GXL��� k,l������~/�d�b������Hs�g-��gu���6����eC#H>7�������@d��Mv�w�
L��t�����@-��u~�L�%y�XU!�����m�����2}�9&�E���\eML�]��[��Z��D���F�qs#b�
@��D�{�Lz�!Tl�;�w�4x�<Tb1
�h-x������j���0�x��q�s����/d�����f0-����gA�I��{��k.���SL&3���N��x�uJ�f8\�(�e��$����y���k��
n���da}/��9Lc��T�5L_�E���O�DU�K�9�b#��,��p�?�'
�4!����-���[p#OhA�5��
GC�����2�#����dOC��d�|	0��&�G��pI&����w�U�eC���
�d��Mm�HG�!t	H�w�I���H�j��0����HR���tIz�� u�9;�Fc�Zt��;�P��{E��fBe�I��<
�Emr�_����z-5i���8���V���/�N��`����'c'D�w��)���V%��/�B�Q����YhqEr�y�c���2����:x��jq�$l���^g���w�f]��y��?�nrhn�������@�Y����M��p�����e-"���>.Q��L��u|���
��=ku�X���'��w�8��7.��L�������=A�^"Db$��;H;e�.{��� L� �t�e+��uV	��T�*ZSY�uDmb��>)�KOp��!,&�&�]��{�}/��]�S~9�	�[t���F����;�
��S���
�#k��xG��=��� �a�����>�E�lP�_s����A�D>a��;Z%�bq����5>�gN�������2:u��s^��z�k����I-��@D����t�����(���(���\��6��h�-`1'�H�8rm;T��o����6�-
Gd���:��vzJ��Ab���������(x�.��l�0����?���3Y�{!��g��
p���W��K4""��;R+[���~�����u��c�c8��$t�w�?M�SB��;\������{��Ht�JR,�BYE����+�i�f�?��
����5r �L��^�]�a2/�����^�S��]�=�p��
��!��-�p�OfS��* �(QC�<����1!���{(��^��w�(P��k�������|��d�)��/eW4m�!��������v&\�V�"�ZaX�[��K��Y�m��'|�$m��p@0,�����q	'�3VB_}�aU��t�E�7x����0��/}�&r�V&`�I=4
]z��Q�B�G�����@F
��/�:���"��}.�U#��{	���P4��1����?��3��V		��|���W�D�V���$|�����|hxt�)�D��@�rP�"yQ+���{����N^J�uy�>��M�|�S�5�b+��d�O���%	���
����D��]���H������BC�<���*���Y���)B�����A��?��@m�
'�
�����
�*��h�*	���V��	"��)�"���S���e����N_	��n>^��/����U-b������N(3���#��@^�\4��KX���Cb������h��t���
Km~����s��)#X��GkDb�8��Ma�V�������d�_��'5RoE��%���;�6��p��	���-�>GA��]c����3B��8L�@�����8z��r�{� ����x��+�(�>��w����(�'`m�88���l�����p�zAX&��(p��eQ|f+�u��������Z��g�7]�d3��t�H9B��6�Plt�B.fV*���e�H#3(������"e���4!g�9)
m�B�+���j���@d�L�,Q��b��:�-y�����j�(*�*v��r�\4�P�����I�_�l{�4$��\���������EP���S+�*�t�����RGM�r��KXo�MvJ���bI��p�xg��>�nF�L�Q��U�l�<!�eqd�]=����Y[>j�~+�'���L���[�Ha�(�na7�_+�9�;�G%i}�4���B�;\�Z��Uk@~+�L2Npuz�=��/jY��;��
� ���s������G���������\M��DT�OD~(� pMK�	��&��M{%Qj�
�@�]��������3���_�c �F�5�j��RG{).".��o��&m�����a�X}��G2Q���	���O���=��|4P(D����� �������:("���e
�X+��W�=[n��;r���������8�hp�9}L�@�j����V�����Y��V�C� ;a��;�s�&�)e��V�at�;��<y���0fX��*�a��UpB�����R�����m)�&�`z�y��a�������u�����{-��NF�^G���XQs�
)`���"��L
�����:�����g%������UP�D"���+����-�!�t�i>�D��Tz3����������h��>N��f�Kg����{6�`�4�Vf��Pn�T{��8�7��D�S��P^��t0~G����.I�
oB'��d��	��5����.n��a`�%{�Z#w���n+������.�S�)�N��dN�����]�=O8����U�r����.�l�$�P����G%Q1t|h��j�:��m6�t��1�$%P��~��������y���8-�mU�9�$����&��X������Y��-G����j�p�,��B�t��9U����a
�M(X{�*=Gbo�D#-���z��|��<�/1r�m�j	9,F�������`:m���r�rU�D��'������s�5�x�f ���n��
^���������|�Ja������0�1����)\A����^��t�\>��������Pz�����U�DVz|��<p�oH����A���M���#f�2|��c?��5zE��4Z��U��6'U9j�50q��iS�	���8��kB!"v]���EM�������j*LH��t3��g���J2�����81�"df���E$�%���a��k�,x�B����8JP`D
�V��K�9�C��$��*��,���7J�k�*T��P\�D��$�
3�c�����p��H���@�[N���b���!8����2;z���]��FS����,�W!�A�
d,FG�&��g	5a%������X�^P
����r:����X�o�������&b�*�	
��s��U��������huj>�Vq{�5��VNyU�H����"������i�)�d�����?��O�p�#�LQq�LD�p���{���L�\�#hF&�g��8�	��URS�_X(�>�?(�3�b��D8E��(�*^���A����83>���D@F��fdb|1.�IqkB%h��t�R�ZsAS�&���{g���u7n�sF�k�%�6m�Fd���S�#�Ms��zQFk�!d���o�/�j��w���x�'����?�m�U��H�K�S��E�A�u4!�����8ln��|Fx�niD$fk�5.�����6�2�4�}��Di&���AGo�\��L6�e[��
NR4F/��M@��o���;HB}�3:4���a+��j���
�����k3ss�DD�m���e&}���!�BA�����YFKk�"L�y���C��z#P������0���������/9�&���M�,
���9�����M�Mb�&��i-�Th�����b���V���x�����C��#i1r�m�}�kE���	�;��2_�&����d��'�����F2����1��~�W��Z�����2��D�X����:�:��4�U����Jg e�+��lAsZ5)Y��e��X��.GP�+\�����l��?w�����������q���p�%���f���1�����U��&k�w!D�e_^�A��Hd��T����������h�}t����6��S������ST���Gp_4�-�[���b�7DLwZ���5�B#�_��
/�(I�r�Z�O�r/��+x!���bo�l�zwq�� �c���w5��s�9���X����2�.��o��������}@�U6D��Y�v�!�����RfL��-����DM�^�J-U/
H ��j�B����8�(kQu!
��t����[�D��n� r�Nc�m6:���~������`�;�Q�7�B����[>]Vd���!,��F������D�#]`���=m�g���B6E�~��-d�F��_Z6����A�]�@I�f�AV�D&�{����X�x!f����/Dd��p������v���~	�����h�v����E��A�1�oA�	��=��
�?���p�j-����v�I����4�'����	�NAx^mQ�S����h�=���i'�;r|�mz
�J�S�4�yO,��ly@~|8tVgL[oM���Fp�2�u��p���x|���n�i��W����?�B������Bt�������B�
��ft�������d�q�g{��lkT��N,A�[���gIi^�S$��}F���F�����=�R�?,xw��4��H�R������#�`P�C�����FT"������"	�7H#n
8dD�@XG��
�p�E�c�@8���)��?>���g��%Y3�Y�5����
�����]9��e���� �u������U���b���! �����e�p)�{�z|���n����a�vI�au(��� #d`��V��xn3k�
-�4��O�#������/�~Ho�n1D�_B�d&���:4�h���{��9�"[r�c�A�^�����X6$�jB�s��|t!�I��#����c;T
Lx�b��;�{�+`�����������E��u��Uj<�YCrx���(YW����^��Gr�e:B����j�y�IQ'b�`SJ0W6�JP�f{�(�W���K���pQU=>9`�Y��Kv��("���_/��V��|HJYh�����]7E`���gGH�A&��\��G3�E`��������f1���w��1`�B.���������L����	J~>{���-��'��'d��2E�w�B~Gvd�'2��h��o�z�A�P4��}�g.���A��	4s�������M�
��w�>���a4g��q��N	�-��-P	��^���?������i���g;�b4��p�03.�����pr-�����g��}�4��kn��)E�A����m1/��n�����!$#���G��J�w���ba]�	��FK��S��~�Wg/���lt���H�:l����T6a4\��ZSq8�z������n����C��M�=��w�4��_��4��A���p��]d�9�T�5l9���y���N�w��9\4��
���aX�@��|	��)DC�{�ts6u��2f���0��s�F?@>Z��3�~\���ef�@C��k\��X��p������Ah�����D1������OL
�;����q���<�LX:�gO�
2-�L��G��!<7�D�x���d�G���-�G��)Ot����������9��R�6�����!4��^��p.��y�p�ye'>L�����8��-I�T�O/�=����4�m��Y�&hc���'� �7��/���+)����"�;6b���G*�!�x�,p�X����x����<���
���(1r� sb���|<���(��������X�[�B/���|lUHY�~R��i����=bF��t5?���F���Hj
�X4��F�&{���3:3M;6�������"���wS6�I��cO��|NN'�������Dh�Zq�]}
������D�
�Y���!�*S�NA\�����@4��*��O��K������9����5��Ok&�4B
�@�Y-��>�j���h�����6C Q�:������D��W�PxdiG}��:����H5m��W���A-���"��@YR��������}����i<��"-����)<bEu�Q��l�����<${"*����l�
{ ,��<�B!ph��8;NA������USf
<�������k����"��: ���g���`;r����k���#�2���$R���"S(��t�S��i��uh��pu����'�4)g�?N^�S���������$oG`������"h��P��G�'�nX0��T8�D�����%�-���BE������?�!Y�f
��=qW��s�L�G����Rs�l���S�_=~�Q��	At�!���eo@�`�.d"��'��Yu��C�'j|.������n:,"��L�#|����P>����M�N��s"�~
���	������hs�CV[ZW�"��~>+���>���[�b��L�+"z��@�
M�,ExZS�8"wL�9��������Y#�!�v�_�t�p����,��������~�����q )�:%�am��vYw�pXiY1!��=`��-����z�M�%����m��I��S�B�`�)$aG^��"���!p,#����UU~0_���M�IO��v�d<S�B&���m��c�QHe�@�^[��������Ma�^=��B��sM�r����y~5�U3�����$D��X�G�Y����A��P"2��� ��g�.u��#�����K����3�D#�����K0�A+��"*���)e� q$��Y� 0
k�Hk����)����&]�d�\�"L~�N	���h�*6��|fb2�nY�W��7d���t�>8�Zv5"���P`)��D�)��������AG���c���VT�*��+�AR��9���X��pX���i�8����cb���E=�%�	�����e(�n\�7���<����c�]HZ�l2:f�D�v����k�?����>Z�<l.�7 �h@E�~��L�r��#��%��e��������w���������]�>��O�`w�%Q�mY
�x����w����`3�r�V��Bi �H-�$GG$���i�F��>M���pW�R?�,it	O@���Iy���dq�\��l�p������m����K���^�r�t��C���&?���#�	[������E���5������;D4����t�&�����t�����m������xWF����{Ld��Q��G��%���a�����>����%�A�Jam������a��Z���8:~G-�%���_x��'����4S\�i�I�k�[����YE����m�eio�0�"$dY��|�3]������sg_���1����x��O����Kr�Fky��4�k9m:�����������3�v+���/��!�S�"N�~�f`�C�P#�����$;���)��-k��F�4E��e�l�9���_Ff��
!G�u�@��e�<��q!"�-P����0�]����N��:E����X�d��NIL��gr!��e����f���.�S���[+b�c�4���j��8�a�����m�����mj�"~����-U�1��Ulh�fAtLBX6�Or�1N�
\�WT��/�a�]���O���`�;z����&y��i�����Iv�m1C���. ������e�wYfs���@���[��w�V��l�K�E�N��nA�h��B}���QM�B ��5��8z���}��0�-\�����5W��oA+�����7�����FE�6:A��=��3<{�Z�/�:��<����%��|���l(B���Cc�����-$�)���Mq"��!Ux��$Qwu��>:�l�N�,�*�-���w�b�w�����I�9���[N�=�����v D���B2C���i�;��XJf�����u�-q��\v���+H1;�P�-��ek�@��2r��+'�W�.H�C�0[�1���CP�Cc�a`^�\B�N����X7���'�l��=%%"���B:�t`����-lP
x6R�^|D���f�]�}��!2
1%��=���{)'�aE����qz ���BQ�b��3������<���E���"�NsO)�]�G��rER�-P!"�n�B�GA8X�����+�%�~P���^
B��k�s&7�}F���X�x%l���o�BS�JA����$t���l�I�?�O�$�<'����x�$A��I�����nS~x5��,�N�
�n��}.�P��!6r��(6{�G��-zj����@6��k=��
0�������n��o0���B`	��5��e@W��L���q��B���/��(��n�
'Dm�B�H����O�����q|(oc�����`n���)����P����p|���"x��)���@�����J`���QA�}�`�=�Rk���\[[����hl�2��Q��y�����jX�F�D9f�/���df����FWlaa'\`D�6���}zg��~��|�W��f&��B�lmr���wnd���E?4��h��RDv<����w?�6p��p�#e�"�*�#�!k������T�O=���x�d�M�����;��,=�|�� z����lc?�U]8�%m��71�C"���AiSKLS�a�g��#�!�PN�S8���5�_��*U������T[z~<�>��[q���5`�
VB�]�����a����7Q�N1	����#��Ym`��Y?�D$��L)�G�C�B�8��h5���;���H<��x�1('%bq'O�������	�]�h�7�i"j^K��E5����1�O_�����]A�k�u�%6����!b��[����<K~8vM�P�#4s�������w��[C����l�	��_���h�����4j�� z�P�q�!�<\�+M:����4������r,U��KGP��5���'��znVZ�P-������y�+a��!'���C��5�m��Fs������c�� �XDmf���n�B���d9���l�Y�����S���R��`���K �3:"�z$�;�0��p��������~�M�bK�j��|��!�Y�>�����1�e:v6�O�p+������.�@�s�Q9l!�;�������&��������.��
������,S������#d$�d[���S.�=��+��F�;����,Z ��pHI�>;a������Y_F�=P~g��CY�B���%F�G�@xl����\9�v�5�y*���MvO|�r�����G�>�]}�n�-��
�B��=)�������A�A~�aD��l<6A�v�=xu�a�/g��%�#d���(�m�;�ee��cK�{d�:'n����S�X[@��AZ���G��hO~	�LD�� �3P����{�����^�oVu�����^��~��z�kj�4{/4~�OL�{�v���(������6g�(J*���k�����|��(-[��x/�%�>���y?ka�L�UB��w�Z��a��]�%����"�p'�{!��2�F�N��O�X���'9��\��������)���
��|~��<'�����f��o'�A�������-���;R��� ��l����HC��O�/�q!�F�	1z�V
���%����lj���� ���6r�m��h����%��/�xA	��T4���/I����E�'�f~�4����f3��������Z����6��w�H��.d�����+v���f��E*��C]~��p��J�w�V���T��}$!}G
���x�\#�,��_�UG��W
#����CV��S�(B�3>�5�5�1�@���v7G��^ELu���t����}wt;1V������&�|�c��O��:���w���V����;Z��D���$��������u�L�*� �bO���	���5�T��?��2��k����������n�{���KW=�o�"���9���I���g_���H����L�W8�wrp������D���+�������`�*v	��^��F���u��:�&]�w���b����x~AX�+ J�*	��^G���	 �FK��t��������{
M��p�$�dv�B�Il
��[�������m��ciP5�{��L����I�!eO^�Q�E������]z�/��"�72���.��-�ZV�l���G�e*����Fw�W���g��d� t����`LL�%c�����~�|n4n�/G@DM��� m��$�@��*�v�
~��A��=!��D���#|f{��Q�2���#5�P}��p8�d������s�?F��y/$���B��w�y��,���=���*�����kf���������S�-�cI���j(������AH�w������<���<�c�^�!����}���N ��Bt�.P�VXc�9v�����2j����HQoeBJGM���S��^'�S=��F,�
��{���m�;�����N�o$`�{
��c�[&�*G+D8Nq�]��vd)^��9���j�JP3�4�N�"7��-+�$4�2��u�k�v�e�"H�b����>l2C����D�l�[��[�}�7`�Z��l�q�|N�-�Nhm�>��� �!P����D'�=��pX���6��j�����6\��Br
�E-4��EH�������������)�����>2��5+��U<�)���y��������������� e5�	yd�4N�1�&p{�A��u%s/NO��z����
�����c�fX�u��	����lQq�BB4y��/����b���}:%m�|.}��kQ��X��|�u�<�?��-�r��S2o����H����unWtN�f���u��_��xD���(d)�������K��U�~q�������&�� w�4�8j}�F(��;,�����~F��e������G)v\0V![D�5��kJN�|����0�y/�����:��(���%vG�cT�?��.�e�^bw�9����Ed��~F�c5{�Yu�3b����������A���)^�V?D��^��-��
�^����C�Ps��~�y��_��L����=���{!�y>���^5��"B����������^��Le���_��=q�A�?�{����%�|�
!���U��m��Q���Fz��A�t������p�����.��{�a�� Ld�P����=�*�*@bN���a���	{���+�x��@�b�B�Z~��';���~!1���U;�W�WohA�HbT�LT)��U�qA�Q2QH�#�%G�y�<�3�=G���t
a��[���N5[c�4?DN{Kc���[���thL+CTv�3��������j�C���q��z�uBh����
�=j�V����&�5�*E��S�����������X�y(�C4�q��lX�*��P���4�O�����W�y���(U��
1��s~���cAKI��U���=	�s�
���p�Bd�Z����(H��
C�z-?���z�d�{b�m{y�b�E���D6����r��U��Z�_r�����+�"�����c'� �w��4��
ya�#�]	\]gC�+�I��Vk�l�������-ga��@GW���'��CckM�O�;y��{A���$�Gh:��j�v��J/����8���\�������f<h�)g4���|����{����- �����k	B�w5�!?�id���=�y�E�C�D��IBi���e����"�w���z�.�:��@G�&��*�@��E	w@�pM����q��i�Kj�P��
�������X����:X	7u���A!HG�wd����;�3�>)#�~�&O\}F�!?N�XAf �������aC�����H^GL�G�,5�!�H�V
����-U���0�wP�?Y#t�4��6�Aa��HP)"T�S��/�Vt��!����33�!d�������j�����k�����[�:�r������YbE���{��D�A���"D�����+�r>��N��}������6z�6�����d���Z&[Z�W��Y���(���$E�fo%I|���"�:b�L��������<�u�B�J��)u��;5��!�`���JeUr�Q���.���?������g�C���;����9���{�m�V9����Y�D�g{sU���h��!kv�	��
}%�����a
yp#�wd�};�7�l����j`���d��� `������C�����P
��3u?�A/�t���C���c ��&j�����K�b�Ih���u��h��O�t���jCO_����=� F���<�C'W�4�A�~�����Q�m�40vP�q5C-��������`�G��Q���Ol98`�RK��"��}�T�����J�A	��:��m%D���B�S�6#�*���	%�+V���Z����jj-�����:(:�������7��Pn�T������j��%F��N�*L��WR��G&V�xZ�ilO��4�������^�Z����g"��h�mU�!td��]�������bU�{1KJ~%sJ���y7s���F �t3\QL��U�c77c:����4rQ�uZ���;;iY��A��j�������P�@S�������Rf��;�WL������)����.�0yu��Mh!b����Q}���n-����D������*?M��1���G�w�c5��|@?'�D�����h�e%�,-�������s7�����D��x;�\�}*I�n����h���9���#�����������*MH^i(����[vO���7�+o� V��j3����G
�w8O��N[�>d������h40��&���R�5������E�d�L����
�P
M�C��3�������uO����D��n���`a����b��S��k�uN4���!kVv@48���-�Q6� �-��������M�Yj���U���m����:�3������N�Q����t��J�0�h3X�BC�A�����������4���`o&������h�x�%�����N�6��}�a�u�Y1n�����L�����R�_w3��q[@��"��+���b����7��6C����M�}>l�8�[�t���$Tr�*)��]h��PbrW�nC������]��]����'�b�=6�b���fN\��0��9�
�%�b�����1	���0o��(I�X� p�����i0��wc!�������F7�PI�Q�	��3Rv2�QH��VJ�������	u��O����W9)D���	���Q����?��v2`��r/i����������-�pJ�D�����z���F��TIQC?�u#:��s�t�&������/k{�C�:B���cT�Q�J�T���y �n�B�Fb�M�%k�A�I/�:�dG��g�P��^,DK�F*X����IJ���c,����h��)������F�<��X6���>(��`7N�������^������Q��*�n���o�!���������j-�1glv�+��Z�������b�D������y�9v����G��tw�% P_�
=��l"�`7��l{��x@�(�\���l.����cG�9��hQ2����!����}�U^�9���u��q�VbG}F�h������a�Rw/T*�
@t�M�~����%�T�<XzC7��mQ)��J�TBk���7j���
w?+��@��aU����:+L���n��n5�}�#�����F\������&�-P��d�v�u���L^�����N���?C��GmZ��@�c2���W?t�B�������H9Ro ���e^���Z�gYv�8^Q�]�\��zgf'��R^!�
��S��qV�ae��U�8�BF9��D�J����
]�
A=��d�1	�\�wu�j�h)����t(B�����zc�#:�^z<�dIp�%]0z�'���C#>���ww�A����C+C�Q����IG��<EtE69}��T�Gfr��l��E,���$b�ob��D������1�R�yO�<��W�?
�kKm�Ymg��Wq���jH��VZ���z�A!X/���� 2�B�����00���&��<T�j�l��y�E~�h��SQ�EOE7:��"C�>X!����B��0� ��\<��U��h:�94F�G3I��j�pC3%b'tK>q��y|q���#���s;��f0�L�a�A�$Q99H�2�B	�I,��	{J���V��4�[2t��o��R�`��a���MI���S��r�O��2�G:�g
�|\���G�I�S2� ��}��X�wn# c��I95��<8����p#�����o�0�Pl����ph����_���f]���b4Ay*h����P�M�T��R@=�m
c	Sf�q�)�3�f����9"n�@qg����C�h��R�g�3�_���Tr&q64��[��#���X�
�|Ur�����I�u�k�k�|$����:�b�������a^�Ns�pCK�1Yx��
%
�
�U���\: �t��I�U+[����hP8����C���]5��y�?>�0aT&����@��
U��b����5�� ;?H�Na�������������{�(��4�W����`��(�hToI�����vuJEE��aC�og{����!#v%�58�\4Jv��I����*���.
����Th�,L�5L�������"��35�H���o�G�`;��i���F���'���q�TA��1��W�p��w��o6G���X;�t�./��v'c������Od�L )�0q��j������U8�M�o�-F�m��'|<V����1������d����c�u��%���t����<��$w`���P?}�`�����U��l=Q������D�$#�w��f�](�M�m�h�#�M�3���C�Ng���e/5���31��FZ��Z3;g
��� �! 3��a$B�WauR�����������(f��#�<����$���O�&F<�u�lK7N!n�4�m�(8C������������V�����g<�aC>�S�{;h�6��E[�O���_�v����������i�E3�M�CB`��o��	�t{:*
g�fK5�c���� �N�>d�G�AS=q�ou�F�D��N�1�]Q�:���3~� �|3N�9���Y$6�A0
Y,=X�+�z���������C�4�]huB�|L��h�f�x�,i���2��4Q�M��2�!;yXJG��Y�r�8���#hu�4�����W8�}���?�,Q
Eff��`���e��@y�L���k��!'�h��LE>�8Q��+*�E��������iC&�j94c]��m��_�_������?bd�p#���I=z���o���4�p��i�p�Y�O�=�	�	�`K�a	9%!j�!�Hy*�{{�x����j���)b��k���F}�ld"K&MG�����*d�U��zJ(E'��%�:�y:�Fb�=�,4�P��}��RM4	-�a�@9YF7v����>�bf�����fr������H�8����]���Y��4\ �u����W��A��~;(�i���@���L��c�3>��"�L����A�&��)x��,n~����B10rI�3���O�����17$�i0��jV�1uV{�Z��qF0���Y{'�k�Wg�6������Zb��	��;4��
{������~�]"�~��}�'��Q3n&)bj����n��u�?���K��*���/��}X�_U8�����6������4�:�=�D�-��I�>��H�0w�m&E������^,$����������c�S
�2��4��
X"��,=V��������{���h71!8���:@��_'��T�4"�Jd�"�dCF�8�#���V4:zW������H����I.�uJb�=i3��4���i�-m�xWox��1��>O&Q4�S�+[a;0��i�AV����.+�	�.�a����'>���\d�"�T!� M��[�_�Jm1����2�d����p���=+a�aA�{f����!�>�b�1���y��X��,D�X�I����a�T������c��f�!���N&O�k�!9���\+v����;h����R���bv9m��u��I|M�ZP�#�
���J�A�������U���b�bs�&r���"��S�|4o���c�U!������
L!dJ
��G��&�CZ�Q��i�V�l���B�V�������("d\�ny�%�W��S��X&����m�{Ef�!���8(��-��HWpH��>3���"Y��R��+"�����Q�e���g�Q���~���L������=�E Q�w�VI���x`���0'�4�u�I���>�2� T��*����@���`��
�DZ ;�t5G���0)`V{
��!�.����!X�y�GRr�����,��Z�4�x�8�IE�4J$�Z�~h+=��Hd�����Y.�
���By�I	}#�6:������[�<,�
5�V,�X-03���
���{����kL�3���X���
�b��+��ly��+�mv[��f*��$�x}h�]���Rn��c���wF�
���K�6�G�g��[������N@��-1t-�)D�`�h���;)N6��k�J�>��;4�*���5y����)N���{DV]+�76��I�v_�B
�eXAu�Q�D�K$���;���&�F��eD�����Kd���~I�x��)�J�-G� �[��%t$�[$g���������,{F�d����D><R��.����/��^��QC����	��K�d<���f����f���������y"/v�F��e�`��f�(��I]���k�<��Olovx��Kz���Aj�Hs�6�D���G���q2���3��a(�;z�<		���v����>lW�*C�W�
$5���+=���.��Ml\J��m@ATX&0���M���#�*���_�C��Xw����������4�{�F�����V�s���
��@j����^d����A��^��;=����vR`�.!i�;������@<�]���
Y�������As'Y'��-�F�U�	��5�����8j�{���1��6���:a�
YB���9Z���������vb�5�N��h��d��]C���Yb�����>Y ��nq�A�;�L�5�|R��m���w�\G&�h�����B��G�1�<*AjY�P�	l����7SIh&B��qq/D\�B`t�lE.�
���d|7����rX-��:t"���Yt�F\�m����:����~x��,+�>���F�#\�xy��n�?��DE�"��r��������;H��'�x��fpp����ohx��$Ek�~n�%g��,�c���
��!Z>SS�����A��2_�m�A�yL�&�Z�QAH�t_vGm�)��mPjVJ��A����m���}�.J�}��&��|���
K���m��~��\!������c��mQ�L�������DNo9���T�mg1Q
0�������XZ����;�#�����O�Q�l'�A�Y��T�U��?����m�B"E5k�O)]z3+x�����`�*�
�7^��v�y�������KR-��g���F����sAD�m�BH6��v�
V��i[6�r�a�����V��RR���A6;����p^��)
Y���j-mk��#�&co�O!&�gg`;'xG�'6z�2�!���lG6���ae�7���'f�3�Z�.)�9�5��*Y�d��sD�"So�f'L��c���>l}�ZBL1!%����!��6�1-���i�jSY�D>[�6�����h):F������f��!�ci��|�Q�<���H^�����DS��F&���c��mw�
����'��}�yT�R���������K%���*���	�����A4{�s:�;����������I��l:��Vnf�*C}����
Z�J�?qn����������:PC2D7R��@,�l~V���$�Z�A��Qs��2���>��!#�o��E�-z�d��c"/��a�+6�Qd�>��T��n*6J�?�1�����J/����4ID�p�j,���`��'.M����\��[y�e(���M���,�	@h�1�!��b��M���sk��<|}��j�*=�$��E��c\C?"�j�5�!�S��8O���c��HD!r���9T�sZ�:����_o�����(md��������0�!`6��5Gb&Z=�z��������w�V���C��[) ����N��D6j+�o������H?�U�,�.�1���g����'^�����
�kKI��{
��F��]l��a������5�Q��w�"�a{}��T�'���O�"N��a����^��o2:x�-�n�/�O}'3��!d�����:��""�����E8��wfwN�f��T�8�0Bi�Di��<�$V����9m�`!l�6�1���	�Qe�B��J0����g>��L�(\K�M�
V�����;X9eC�u�1���X��x��@��&^j�`�����?n��8�:�����T�/���cy�g�mUs�
7�!�{Qu(�9_�5����@,��O��r:��n�B�%	��	S��������m�w��'y�);'$�.G� i�����B)�Z�^5�:_��=
��5z��($���2S���!
E�(\5kA��]�u��x��>���&�L���I�c(��DR!������!�j����	(�J�.�������d\�.���^�g �B�-{$��{��S���9_R't��~/���B�m�$Z�����2d��QlH/��c����LPC�
�%v�[��J0��$�t#�An���;�lQ���v���y����.
�!y/a�B��
�#
Y���w���
�C��;|���;��G=���L���H[Dny'���2u<����&�W�����J��{��oR8����!i����?�M����F�� J�wPPY)W�
��A(?���U��=���������o�;�GW������b|<H!�Tt�������B�I�:�P�s!��wd��eYs�d�!��F�����kOE�;p~P�$�w�����;2�����dD����S��w'�9���^0�������J-��{��f�����6����&yGf}>?yrr}�{���X(��~/aa���Gf7�P�ht��� ��}K(�`r�z���T�qJ�f���+DTD�� �l;����`��OH��$��L*)���x���������{
����e4��\7���g�}�$M�w�wG�5�k���������Ezf��������f��� ���)$KG,�'���{	/a
!�g%zia�	�0������T)b�P��
��b�w������S�U���^(�N4{��P}K�����$�6�������t����;2��<;^�#�h+z3��������A��<��"$o�Z�^#f���)�j�I};.�2�,Bx�G��Q��)�Mj~���\�"Q&zq�']��@3/�9�5q
/��Px+~x�ky�{���p�_��8�l\�p�?djqc8)��^�6�<��$B	������U�v��D���N���`�w��:1k�a_��q������"^k��0���T�B����5�%|�U���4E9�9f���!�^����h$@��W�\h�+�?V's��Q��;��Q y�����$�<PBrx/d�
j��'�v���F�N��B�l����`#�_gU��I>P��^�����E������E��:LlH�p�QJrq��{GZ�(�x���P��Q��Q�t���v|��Q%�OGC�QgPt��+<�=-~���a����B�%4x�E�GG��'IHP�j���L��<J}~/A�L�a�?��H�>J�q��<�wd�J��f#�r�z_�f���6(_0�W��)�Zq��9���}�?��`��\1d�j(��O'��eTK���xZ��]b�����=&L��Ev3#*-�(-�^����;�-�t
� �����
w��������Z���D>6���$MBJ��UM��^��$�)V��k�_]an�;���<Ut3/�O�_����8��b��v�f	x���{-�5�4k��������3A���'"{���b��g��L��K�_c���##z�V�9c;�k�C��/��=J�we��S���(���NDHako��	op��h�$�����L��t� �Wp����+��6U�D51J���CM�
f�G��Vl#������] uh	1������b��c�>���K�����v��]+3	����#g�Z>�;
�����'�hs������������w;43�B!E++bE(v�9��I�	���A�]��l[�7�Z�%M����T��<���Df-�b�bj>a&��m]�5�����G��PY0�b�dM���j�����o�(F+�F.�,�mY�����&�C�uRm���������&�#�UH#7J���5(�-;sQ��}��
���r��ab;����_��v
�xG������*o���TC8���$~����R"v��5�8�� d�������ESd;lH��	�uz���h�e��|���T�d�{(#z�QN2YYR��Q�Yh��ZM���Ut�����j,����h����t��[��*�G��WeC���j����&�������V������bDd��2�n������Uc�v�<���4�^Q��hw�I���f�3�����(F����L��H�D��Z���<�[��A$�"<*�����j!���B����M��~�W)6sb�%+[���jbx1
����XG���������4���F�5��.��p�
�����s�gt���1f��M�� ��Q�g	��D�^�
K��X��6�S�!��hB��@�Jg@}�j����&J���nk����:c����YN���	�@���a��;O�=�����Z�Q��	�3
6�=*�r�,�<����l5z��I�@D��S����cy3�}�F�Nk2���=�����j�A��b�V�E����1��N��0�����;�+����5�e���+��%�g���e����PPz��ZK�|�@��7j�J%�Z��Z��(Ft��}#7�w���^�U~�@�#P
3�J���zjT�����=�������hC�M���62C�Ml��g"������oP?X$f��?e�t�@����uf�{t�C#��p��O�
�G��/I�f������F=�j�A#%�m������dy�H��E������H����@v5���wx�ND���M�GG
��k�����T���(�E�
�u�\��;(*��T�
�9a���HI����U��)�����we8A�c��8F9�5�A��QU,L�Xw�H��M�HM��F�E"��gG��t�"����	/��J�tlG���8!��9�j�@�|Exk����.[�����`����D��p4�������:?R��Id��-����&�Zi"�--z�~R{���6C��w$�,4�^E��Q;�E� oH�9=����kK��,C�iO���)�AL��d�=0Ri4#����P���A0m3�
������v����M.�F4#��vt�j��S��-�'��fL@ J0{G�AN�����8���a& ]�����<�-{~!�U3P���Qr�V�=��<e�����-��%a/0x����h���ye@�I�g�����k��Y���DO� 5�^�A
���o�2%i�l-�Fl�#�����0��v�X9�n�ET��P�'A�rW`�����1}k�S)��E� �:��a����9�Z���h����RT������������d�����#�G�5G��
����@A�f,��@Z/��pG�@��[����$�u��U;MV������!.���{�:��yY�m�'<�,>+�=� �+b?�#Y@�]Liz�B����U(-:�7#w'�['��ag�i���4�F��cA�P"��Xe'�����"�X��	]�i�3���7%\Ue"Z`�A=�/�@9`�B�JE�����w
������)��P9�oo��<���!���0#]��&�y��NK�����\�0���F�U
�?����
���Xt�H*�m���?�b�
�A#��:�u�j��a��x7��"-������ 0������A@�T~Z(�8T���`��$!��Z��L�����.�@9�)b���	��15t�%n���!�D��5
"�o��o���S�m��40zF$��4e��������K� Sr:<�["�s�4�	��������m3�0�n���k$���J��[D��8Ao'�u#JL�pI�6�91���`�_)$�eC�Z;�h�������
�>Fc�L�e��	V��N�TG�8|�E��Q-�R���7�3�������!���&,�#kR�O�tV���5�8����!�3�e�+ �O@�w��T��Q5���E��_���Q$/��|hU[�2�{������OqR���8�grgV=&H��G�����D�r�F;u7���� ��fG����LCs�x�Sxg�)%=j����k��z�h���H���ht����A#����i�������w?}�Gs���}�n�}���t�I��B����\�i�m�Z�5��!�P4������{@'*����nL7�0�Y�^J5���3nO4r��4k����|F���C
aPA����8����rj���n�������P�-'��k��s��,��w�	��k�F��nXA�:����%!4��>���}�<�Btt6y�674y
>���~L���8~?Z��=�9��������E��,�G�p��8f��z�����6�@<����V:�
c�R���4Q�O��Yu��!i�F?�P�[�C���E�I�*%�#�O\�6�?�4�OP4�0f����{���EXT|qg%�aX:j�|)2�u���Xb���v� A�����'������b9�m34�����DPOO>��[�<��y���o�lLxJ;i���A�������#qs'e�u��0�3���B������ZK������
�N){�F'$�����M^������~�g��������?�o��'$"E�	�I�F��S.����)�������|A�R*��>i���`F�H�E������h+�@j�nXb��S0�K��9���M��rtM����E��
���q�������B����������X=�A���c�����:(d
��I�e�������M���(~>zp�,�u.d�#Be\�@�~BJG��H��$�dj��Z�H�lo�#{j���2��LP��L��DQs��.�deF,��^���Y��������o$A�:��0F�J����:j�
y����0b����	�I+8{E�[:�����������a�9A�R�U�` �B��?��5w�'Tj���s����r�H��z�p���,!�sG ��i�d����D��c�P��a!*zG����bPu*CQt��@�	�b��apb"��0�{�������181E27P����}����F���� ��v�BS�f�d���]���������-������c�7$6i�p��D9��q������]�H�H]nc��0B
v�n����U�:e�W�;o����o�+�%nA+�����@#����|H��Cu#a}f@�2G4���+��3E�C�g�P�<��(��� ��L��������|��<��/�����=?��������!�uB���l}��.1�6wY�(�F>��;�.B����d���l>��^L��j9A���D�P]��������D���yf� d�uC��d�_y��W��@��[$���d1�f�0��C	s����������?�����@||��g�z��u���s��%�=�<��]�D�!x���hL��-�*��p!G$9���S�>�YF�@�oY�*��_o�s��&2H��<������m:�:2���S���v���-���D2"�����B�o��L�q�^1�!��-��i�l���+j����O���^}�=U�������k��C
����q�`t	���DWJ���B�A�0�p�%�_���n�S�bG�u)TVR`i�h�"W����f��`�@b����X��L�%��u�l
+u�21c0��[�,�&��,5�Z���j2v��g?�������z����(1�-�X��j���9YPOiF��?�����r���������Q��S�	��F���h��a������������h���'�N${n
c��4��3a���=�3����f��sg����N��s����4��I���E�=����yP��������4H��a��K����7������k����{��_�sK�(B.�SL��n�����a%�����WT�����lP�A���i�By���B�=��:���������CBb������voo���~b��������h�,Y
b�M�y:���-@�9��o�P�Og
=���z-=�2��o��z��
l�Y���}�s���U���� �G��i�Lj�
���B`���G���tY������AS����T t=}<�e�jcG�CI�R��^��Q��"R�{�����L�{K�-?VM%A��N4p�.��~�ncK���\�A_��/����"Q��JG��7�!:�i��>�7���3�	v(2VQ�����`����/�A{��>� z����Y1��PA\��7V�s�0����O[�G������C��i��Y&��)5eQF-fl��v4'Q�����{<��\��)���Z���{�p/e����������6��
��w�Kg�[�H�_�U��gO�h�BZ\���$����o����87��`z��z4�]�����N����J_O�e4p�K��u+�h�����S5�������{�5��
���d�K�&��C�J���"n�"����4�}x��r�B��H�����,�cEH�E��uw8:�Pk�iC.����Qq\�������k����3l������}~�Ao�'�p�z�F,����<.���A|;}���v�����F�������MP���E�����y�����_�v���<>�2|����a����e�U�o���������S|��KX��vl���h�����(��	���:�i��r�*�3����ZA4��^�d&�i����j��\�����Q��^�$F}�n$�*s% ��5t�c#�.+�M�A$�%��������&�1�}/��y��v/@�[+��l��R(����u,
rAY%�v���%Q�
�y}b1qB��e4B>h>}X:+*^F���3�
���Ye�"5����/F�T^roB=�Uq����y�	���������e#!����!�`�O��4�P�Z�'5������2��DB��j�4_r����}������Oh��,'}��s��4�_=���Kdo40�`����;��Jl��X���f����N������2h0��F���`�1���`��(I�"����m������[���p�pB�D�����+�7��"��q��/���0q�2Np���y�F��*��3bs�
l�L����0��19\�eV,�8��$'��T$�A��A��B���b(���K�����%�~D:�QE3��iLad�A#��������1���oC$�� ��{^��3��5c���O2������^�;������;���0H��b'��x�>��������]`7,��/�QD:��!�J(��b�Nf�����b����P�|
���D�\R��DNZn�\�pv5gD�=��o|��I��S�Ih����};#;�,��W���T�`6��G�������/i?PC�o��H�C�l83����;s_1k��["�����t�C�4�J�%t'������{�vd����6Q
F�/��Xdg�d?H�*�1\�R�-�`��:>�����mZ+���D�T�j������/�Q�|o�Q�������IYw[���Yt�2����;y���;rn�9;@���������D���l�����l�{&P��N�wZl9�����$��yT�`���n,7�"�6*�������ARDE}z�����3��������8��K+�
��D�*g�����igvD�+���)hY��O#��g�4��������`�
�_������	:�h��5���IdY������$�46�`����N�����:
E�F�s�U������L�m�A)������N('�s��/=_�
��m�C�
��1�?�L����-��X�)��}�9��~�#�8w�r�e%@��J��)����2����ODS�?i�18d�h�?-ZG�;Q���u(����8�eI�6J}T,t�hu1�p��}1H��{�s���w�F����kC}��PjE U�����������(��NHJ!XL�1�Pt�8H���P��98�N�'+�yF��I��O=7t	��>���"�2D����f3t������
?8�VJ�V��uP�G� ��%SH��<��$UU�ZEY��6������������Kx�Q���������(w�2q�6�0�����������6� ����K��s{F�*��fM��/iLc��9hU�5�D��=��
��_r�����
A�<��
=Tq
�s7������/�e��$(":�����%�L<�'^�>��F�R��2�,;����G�X�60��^��4�Og������n#���A���6�Q���~�	��������,��"a[a���l��(6��qg����2d������e'���*{�ov���1K��F'���Dj�$�+vB���BYlo�6m#vch;���6�1I���C��e{�����7�j���B��N�X<���8�>��a����t7g���k�h���
]�v`��U@*>����Q(E�}}����S�||wa��Iyk%�i�a;d(���)�>�.�����f�1l�_���R�)r����������A^�yB^�fX��1�Q�4��{���T-��5y&�s�IL�u��?���m�����|HY���_�5>
�F����@3���Z�
N����m/������A���a���p5j�t*q�O��6����������}	}X�J�;c�8�G�\�)���')�d�^L"�F]"N�O���U@��-�#I��h|��-qlBB�c(�zGe���N���}���c����'���C����=�6d�-��(�������L�q2��� �6�7<<��������Q����h4��H� �B31�nL�8A������A�d���J1j�u�i���C��:���sb��O�$�����0� 5sX�y������xa'������{-�@��d]�EWT��Ya`C�^��u6;?���t�cC<sug[ec��2���X�m�~Ot�`�cT����x~��p�������FS������U�@�c�C�+�%9�O��j��G�#����F����<9[�l4���=�uUD;<F4�|��c����D�SJ/��
k�f(�b�C��y�*.Krd��}>HC�M��������Pcb4�Y=3��2���83"D���(6�=V�|�1~! a���fDj<�3�4�(\���ItY���`�B�'��&��:?�f�1b!�`ye��8����4V!N�`�jX#x�$U��Yc�l'L!;/�q�6}6�S���]������{�*!��-�,O���kt�=���!�/������Xg�ZE�)�=����c��5Q��Nh�t����������U��e}��5+v���!��`�4��������fa9*�d�P���h��tr��<���f}nC%�}
6�����@.�' ��u�U4���dNhU��h��}<�
��k����P���i�I�,�A��u2�����
Ap�;��A��A�Kd�ee���^)�H2�;2�$5J�������0��f<����e�|q�#Q`��<�������j�wtqkK;��&y�-��������A��o���]�+�_�*�}] ������J+�
�P�]����w���^%�������UGF�A���s�� �����>��'�H(�V�8`q~�C�d#ze�����)�fH���L�!����{�d�h���*��@h�q�
��=������������)�B{���h"T�w�J��y_U$���I��~~E���NT�I��\�n�?{����E�3�`��0b�^("�G���@��h�Ab$d���t����f��>�V�]�4��k�-��-�~��rC���B�?�9I�VfQ��`rLxc�:O=y���p9i�LIM�k�����4�tJy�G�!oF42��k�I��1�W��7�kx1#��w��T�`xe	����e��tS�6{H�o��L���w��+
�`;��,�'j�[�wAw?}���k� ��w�-L�61"u��;+���^��u,g��wx�
��|�K}j2	C@�;���v����(<c�����A��Y���_���Q��u���oc���._i��������(�����5��dd�^Y\��9Q�W�������{OGE�8��h��{!�i[h�(n��nHd�^'��w�] I���mS�Z�������dB��%=��J�%<%���[��������@���4��O:RU��� ��B^�p��~6������u��I$m��2�PM�F������W��i���)qi�d����k�dZ��I���M�'�i@"5�k�)���9���|���B��:���i��L�����Q�J\����#��=������D�
��u��m{r�$(�;��Y�b8�_��ua�B�1�w�O��
�Cs8
��b�Y1����)�/��W�����KB��@��g��x�>�z���q���\�B(
�����%��D��h�)F&��)Bg1F!!�Z:��flI���q�JOq�v����%�Z��q
�o�Ca��C��M��^�������1������Y�O����-5�W,��S��Tw
��u!�11���9$����&�o1p!�;��	��������v;*�O�3t
F�Z�G�\4���NK������*B}b$�k`�J�Ai^��p6������V�-������!�s�_5������d��]f�����D���o��W���"K��uGvw�&��L�G|Aqk������:�y�O�B��cg�{���Z���4]��?Gl�Xr-��)	�b���]�:4A��	9�<X%t7�#).�e��~�X!��7�a���R������M����llQ5�!�>a���aCR�L��}G�o��J|C���S�V���,�0�lg��C0g�vB�wi�Z��������#�z�������(�[WU� P��8�����F�:����M���#�<�
�~]!ig��vCH`A���?���t��nG���+�z�=t���vZ�;�����h�'��S�*�z`�������b(���,�A�taU��T�Yf�5�������.�o#��� N_���.^��#F@���y�b�AG�W��$��%�"��	U��Dp![G�=o%���Z(<L�XQc�P6Z"�7e9����G)8H����%G���H%����k�UKZ?kxX����P�CvO[�s�'�^(��m����l��V�������F(MY�5KC�	�,+f=#���4K���.���o� !��Yv���t��!��e��l|��"T\:ZXw�����1�6~� ��������H2a}���^jHy�p`#]�r
���h�2�a�V��G���\���Q�x�=i�x��$��q JtZ"\���Gn ���D��D�E4y�����,Qq�*kW$@[��zlB!��wPh�MU<iDD��)�Qx:*k���W
�[�4e�P�WMB��#�\7�X}���$G��j���ZR�K�����BAIJ$��6:���	�F#tKbt*��J��}��iV#$�]y�'��&Yk���P
�{.���QD���2�E�
�jF'��	F�l5"�I,xF��~�wYtP��:l��,|����0���$��UR��t��������8�HP>B��Y��*�b��tY:E����������yDM��<��dag=?��#T�p�.���?�.j�3={�1���i��8RC95�:�5d���}��[��HZ����{j��f�g@m���<����z��o�B5�F��j�C'�G��(�5�b��au���p����ZX�l�_���t���X�G���CH�hAaj�Tc�pvD��F;d�T�����Ck�Y�s��*��C�j�c�4�4D���m�������G5�k�ZU|9��#{��1�E�G �E[O�%<0����YW�]d/��l��/h�$�����R���I4���]���&xFo1��������������6�������p�!VRD�!m���8!y���{�s�����\C��K�������5v�5��w
�A��}���C��Y
u49:��D5�q�y�O�_�N"{wg��](��'>u%V)��4��u��HF�'�.������w^�)�R4�P>����8�R��h�-~d���"51��)1Z5���g]��.�<�
�`SBY���;�YUl��4���sBa�j�B'dqEa�g�1XT���f'p��&s3k�8��n�7kr,�b�"����Der��,�_#<�����+[�C���Y���V�S����aE��yOv��\���Ox��������I�8�(�w������U���F���"M����J����~�*95�79�J����Y���F���Y��F�<����vC��Kg.I;$���	��?��J\��:������V�f�A�����x*�m���\(T��[���o��t	�{%djO����>�&������-��5����Z_�H�X�	��1��L�s38!��a�V��y�'��E�����G�,�����%�B��h������}����p�8{i���M���-Dh��n�OH>��N@����U�����Y�:���iUl-��E
i�),��,�$�UN�����B3�Q�T�V�x�Ol�7���g�T_�w�yy����^�!��j�f�C����R�&�>[
e'_��M��Fwrg�������B��f0C%�}
Q���
'�#E]K��(0��5�!jG������!��}�S�Wt�m�3�,k�H��2���^�A��r�k�-�)�@3N�c���+��"�������lZf]����3�:�-z!��5)����6������)j'b:�d[���4�4C����I
o:�����([�������=���Wt��m��PsZ�r��Y������4p�_��-��/Ne�N-2%����*7V($�����$�2ZuF�[�+45 ��J%F+z�#���9Z~n��n=vg�������u��	C�V���~m+��3D�����`�*EE,A�����Q��N���UA0�>t���M��gK�7|j���91Y�6$d.@+��c���&���/�Q	d;[����+S��pd������\Z�N�����7Q�y�;��Zq����O�o�zk#���P�c4q��;\3�����
u��B�K�6���k{Z�Z��A����m�����s@���K������U���,���d����(�{}��u��6c������D��?�����2b��G2�Ik�zq���km4����PG&�KjF$d+���fB�y��{����'f>�ae��A^���6��g� B�G���y:��$f���=���\ A��f!�U��(#wr�����!��;_��h����?IE��F��������)I��
P�A�d�v���eP&�T�*���.�U��x����������C��=�P7����[����b��%#���DV�Z��{���B���!uw�s��F�3(�t����y��B���,
���u7X��dQi+{�
T�m�D�A��6^���+^!(&��F���Z'?%x!�N7b����d�&�����%���{2����r���vV�����}�j}�sa=�}p�vG��/x&4�3mzp�5i=%�������!Z����S�A�d7��Z��DnQ�(��v��}�G� A�m�������q�f`�b��x�{z�P����@<h���b
�Dc�^�|����#�k�oU������fBU���&D��n���p���}U���h�2���=�-�G����
/�����W1jy��V��\T�% N��u�/??�Q�.���:�B
Z����y)�a}D��V!�[��A UQ7H ��p?It�
y�1��F�����H�'��(� p�]�7;>/�2��z^���2S�n�@�+5�*+�$qg�9}F�*��T^h��;?����������(Jlxv��\8��B��>N��+�5���}P7��N���#��;F+����F�'�{)x�K��z��D 2T���n�a��"�L5�J����'�H���[�Q������n�A�~���;���S��OQF�US����;��W{JH�t*^c��w�wW��XA�7�Kw��A�;zd��+xA~�1�������'������������l�!4T$
�I��_Y3qMc2��2���#�����������/�����G�Vz�8���i;-+�eF�"�������nG������5���)�0��6��J�����5���#6����0da��"�9]f<q�f�������@*�a�B�*�1�[���������s����A�Q�d�����R�F2.��0W46[M�f��5��N
�'���$=�L��)u�x��sv������q���f�����6-�����&�55��v&]���
��oeA����S��G��}'6[�R^��6T�U ��5UM*�F+��n�/����7^y�J��)�^`<��%�j$C{|���m$E������'��P	#��Z�{d����6����#["^%������j��pm�S��0i����h���0UT��.M�&i��+Lvsdd�I�]*�2iDB�a���f�������f�n��g��J1?���;m'������-���X���g?�[(ED;�\R��`���T
���X�K?���eC���-:m�@OK`�r��CZIe�]��iP�I�l�3����'u'iO
C��4akk��wi\c�9���J<H�0F����v�CH��������?�LE�0���2Dm@r���i��0tay���@l�a�bj������r�Y�&����	��Y�y��j
���x9h��0�a���+��W~�=V"[��v\�+(#f�3v2���/B���u-*+��'�����K42n;� @|�x������H�U����9�^,:_47���}�
G�	�^������N��E�������[<��EH!t@ng(�lDRq���G6�j���;�L����2�F4��c��n;��:��)�#w
���vtE�=I�Zn'�nA1c��[M�E�p�7���������P�bL���=� ~������������v��8Y�`$���N�j�[��59���8QT���Q>�0�!�S��e�t���0�Q���0��~m���s�O����Nz�
��3��>���CESkF1!��}�L�5?���d��G*mE��L�����	%5��)�$����!��z�� ��������a��i ����Z=
G����`B�t��^\�{r_�6������W��A����4KTb3�������3�
�	�W����2f���5R���,���V�J�>�y���s�/�A �)��Oc��ZB�v�K&$��+����n/h�A�F����i�B�^��e*��������S��#�
�l���A-�j.�-,=�����-���4='���:Pc��g���Z!G�����[k�#����`P�6RK�Q*gR�%43:�^�`Ha�(
6�t��UX/}K>6��\#�^(d@L��x��FA`���U�����^�CL�8�^u(�v-��Ag��C��g����z1�Is�����kt�#�5�H0Xen���J_x�'(�](p�c�����2���iLB�����MUG>N���Y��s�7��Pa��@����� �?�{�j���K0
GTG'���c�"�Fl��T���$����%�0�:5%�'��rl�N>6[{g�&:�}�B�@`	���6�b�3L�12�3�lY��c�A�;nX�j��W"��s,tO��UvP����a>��E�eE?�>O�&���o��y���_��5~�����L0��cP����QJ4��h]0� _	�10k^XHo=�'����G#	�6?��������VX���E��a
��#�`��h0� ���%�L����������@#�����"�-uf�<����9(���R
�gs����(VI�� ���&/2�f����}��]��=�zu���z���N�
����������w+c|���#�=�o+o�xE���D�E��z�H"[�	v�!U�2�����-#	,~sI�
���S����9u)A�L�����	�[��y�h�-��x�"m���Z`�$�P�:��h�Z|�� ���@�>rE&��S���)�f�J���WB$XU�C�������"v@{�2j���A���<���;%�RT��S���
�����=k�V#�kD��{�
������|fs�h�$�S�6��a�T�%|@82���'gC/#
��/�R��j��.�	E����^��V��r9yOppC���q��q���?�2h�X�+*y����Pn��'�$�Hj��#�
j��wA�c���-������@|L�-��i�����#m����bc&5a��}_
������z�+��=A
�e�@a���s009���;�4��_=�����2N�XyF�^I�n��s�S�2@0d���~�	�n?���7j!��F$�5���8U&N��n-��K�]��DX��W��"������,D�������_�\]��������d+�������T����aj�wVQD� i�}���?\G�,#
�*�L�d�hBy�hK��AC��[&V�K`��e�@Z?&�X��q���V�P^�Jh�
|8��#[�c�$s���6"C�e��������}:�	��v����"u5@����)�p������8����������_<���N�(h�g��S�V�����l|k���+#���f5����jb�X�f �UT�I)X�����j�� 0g�	�LL�/�a]J
����9�29�2�P�oUX���*��h5j6�2~��1K��@���P7������V%%�4�]��{��V�
6-�"���d�`�����{�g�~�W�J�:�.�db����v9Xh���	�x����;����@�&S}�H�A.l;�G��u�����i�%����	�p442���}�9�'`1c:L���yL�� T��
0����;l�j�{�E?�d��Q�����0�m�@�s����P�]����~���S����8�m�@��Z�gu���]b
W�
���5c�16j�����Y����'K�+�D��x@�%�QT�)�A��C�-�|�*�����;��P�vPS�4}dht\��?���
�w
M�.��g@��Kv��6^�M�7��m�b���4R4a�?r���X�g'��R��(�Nl�YU�c~$�������%���@L��#��cEl�6�b����(�h2���f���z�??\Ou�b
��wL��!��.�$����tn��������O)�r�25���#���!e�������-���k���C��2k�����O\��G;���e����H������~PU�F�4%s��{�.�l��)�F�
U�������l���n���.+PF���������v��{�
s�X�������A��Zh6^����l������fMn����^~^��N���k��jhx:'�������,
0l$���EE�&�Y����U���\��q+�N���n������0�m�a��
�AjS=����6�D6��61�H���_t�6�,�+{E�~�I
�f�aS����`�%��b-��$q[)/��lj(H��?��J�)�Ba2~G�\���2c���f4�PCQ%V=w���4���$9����g������8��]gt�_��mDB^��K��=J��2������z�n���dw������m�A�BZ0;���J�g�%�l���JK�h��l�������w�?s_&n<O�|�1Cj0:������|x�^N��[��
��:@�T����D�����f�4A���<I��"v�c�1�!��������u��M��5���`w������cxC��`���O�e�|B����3�G������:z�f��B����A�:���C��"N�������A8����!'���M��z��1V�`I�)-�lJ'9�r����\�+�X�)���3��0���Ak�����PC�$���A�.2��1���Q�'����<�� i����8	y���1����t;���z�&��q��\?���&��
]	5�
��sZ�:��
\4�l�:����s�9������;�����<����
Z,���^��f/#+C����F0�	n��.}������6-�qP���c�$&-y�����=��q�QZ�]�I���sa-���q�Q<0��t���4V�����m�����[�����%�d\��3�c�:Ir`+TD�������I�����A'�����>#(49��$F
[T�<�s������w�BK�q
aa�JN�	�n���FK��6r�)��X��0O�� ����]>�ueO��U4��j�r>Ax)�]�4�o�okQ���c$��zFtLV�}y�KFi���%��$J+�X%2�8_������z�H��x���{`���C�x��+�l�.���I7)V��F.������'�IH�pJ85P�)��H?w�Ql��E9���k��P���b�r���|������[iC�e��Y��h�}^J�w&\�.wl�5�,y�N��NH�f]�2��9;
�������?�*����"oPC���J����B������)*�>�S�:3�"��$L�-�������C���I37�K%#H1ao2�\F���H���O���z>%W+
���6��^�hr�/�Nv=�M:B<�&��%���7���E��{!�j���o����>����o�n����}%��v
!�2�*�_r�zGf����V�-\h�(w��D�@��2}�ty��8�*������n-��}���h������^f�lR�����AJ������������a���c�e��S�}������?�*��������u�����pwYq�������'��M��"V��%<!	q�����A`�w�O�2zWKv�Q�.f��4a]9jCn����<�(5�~0�?&��y�{��OD5����H@���D!�1����d	��A�W�G���84-& ��;(���-��A��{�������g}�hF5P��t�#C�Tf�%������J�M��n���,c�z�!���:���H;��z�I#��];�����W��bGu�Bl�@����[:��	#	�%����:�������^�����s�@	��i����)Ic�J�K0�C��H�Lxj	���#��z/�(������gF=1KAp�{
��{������D���5�_gE�&"V�����=3/zZ<���.&�f�O�:�E_x���D��D8���g�y���>�/��
1����5���q
~�(|a���l��L���g����;h��-m����m�'�De�8���������,\���^d�A$C���z?��� �*�pwMT��_����kD�S�����h���>��MPC�{��9���V�-m�'T�n�|_�\���R3�k�'��B7���q�7���=���0�����p�1&������6�/1@�y�mF��^(���4���������G���
��+���pC#��;�|��`�y�7W
���?�f����L����oD�{���b�Ad��zN��P[YUH���������0��t(~/��NL21����k�GN�^�������v�b����*����:��
�5�#������6J��2��KT�I���@��*���oM���j��(DqQj�.�F��b�%W��5�L��>d�(O��5����IW��A����\Y��J�o�5����~I�����1��KDO��&=)���a��8��7�������nR���o1� 9�H#��K��	�����g28��f/T���@+�M�H��d=�^����-AP�Sj����%����hD���!����qw�$��U�3H�#&�u}������]1�0��{�/�=�@l1k�p���x�/?B�Y�#��
j`�C�M�d�2)�Rs��*AN���g��*�Q�l�x���v�gE�T�>w�����:WBK�GK�C9���c��rMLB4��g$P\����� ��`������$��}9����8Fd���Fu�J0��
U	�����UFNw7���#�#��h`t���E}p0���s�!�����="��&&�.J�TF%�*F�X��,p���F4���T�wP��ql�GYb�T��3B
T"JU]�AY���wd\@A�2H+��EefAC�d|��Gl��R�J����n+�k��XY��V�%r�.�M_�Y��}�+&�_�Gh�?��I�����.hiE�(��:vF��	G��^���b��#u�`�C��^�:�l��s�8"�U�x��y��-2���H��E��H�R��od��J�X�@K���$�V�j�U�H�s�pY�Tvj��-�Q(K��5���������Z�0��?;^�dzlh����#�t5�\
"���rb�v'��=jae�2>NJ��[>��H%�����J�,��|���Cw1�$E�,]�ftcP�����=+���?WB�b�n�bh���Q�h9
��Z��
�B�`�.����
��j$]��ld|���t��,�_PsUes��xf��ZE�Rr:��<T�p6�jB�iu����6���_�_���q�Jj�$TQ
�S�k��@u��v"�8�kUw�EmR���7��E)Zj�}-&Cs(	���/i\��I-�2��5��Jg{/��Gy����v#���B�w�$�t����q&r�w�P�^����:5.Fh�_�B������fxH��{!/r:r+��"����B���,;�GZ���~���Nt���'�r�V�e��mR)W�]�(
i��~m��BH_5H ]�rh�Ng���t���v4�?x����wd6�\���z�&�	�_���3D���������W�BR�i��05:��������e�"��Q����2D��j����
�$��K�&#|��x]��G$F�5L�Ph
��{��"#���F$�����L�V����u��=?�M�U�k�
r�E����E��W��5�����'{�&����0�U���P�:u�+���Z�:v�������~3��jwdz����YT��f�+W��;SA���8q�]���V�W��>5r�Q���1n��o&�����nB�4M�8������X�l���%I\!cu�lC��]��)���j�i;c'��	X��"��^�v�g��I���<V���6��,l6%�Y�c�k#Ahc	�p����C�*��1� I��S2i�$jb������u�����Lg�1��lv4��h�xCa'j����S�]:�����^w���|����o���K�(�� ��[��#e>
OG�1�r��q@D�d(X��@��R|'��X��������d����r��o$G��eS���5�p���fPcz$"6|f�W�
=:�"������W�� pK�o��X�������j�y8�R����|14X$!��O{�U)2-YAZ�$dhF����W��(F��a�i��x�B�����,���3~-nm�K�������!����@���NZ\�4A��&�$n�"���Y��@L��lISM��<��Ol%�7�(�u�(���4��j��kJ5C��zZ��p�UAz��������S�?�6�����5�Q���O��.��8;�$�Q,�NI�a�k��u��_{���J3:���R��(m5!Jc��zO�%�������.4�*�����	�@S��3V�� zm#�7(u����V��
$��Eg�&��h���	��Uk�.�Ny��h�%:�F7[��K4�9�!_A� �#����s5GDG�|�}����d#E���=�#��kC�6�pQ����I
td�w��5��5A�����a��f��&��&"��i�(��.zWS�P��?[_�p�7��2F����E�����@b0D��E �")y�v!�e-iQg�w�i��;R���_��|-��7�%pD���0��-B�#T6x������Q�,i!o�.�Z?D����f|�3���H
���A!M���< |���*��IM�k�}��w/�b�{���-q.V��l�)��juG3o:��.T.�W��4g>+o;�of��0ZF����e��is���2��N�G�Q8-�������A0g��)%=Z~�)��l ���q�X4����L
�H'YeY��t��i��2����m3��-)VBL�5��w
Cq�#�j��&k%�#�er����+
C��-SO`���������)/Y��������5�k�iGL�&��"��LE�����������!��~<����	������`
*��a�	����$l�3����m�	�h�iww���L6XFV���5UH4���	����[�:�vH�cR$"�ys4����~����`R��EW����YoY�<��5Hm~�ZN����v���c�Sl���K@�`��>k{p���A?a��;R����}�9T�)����Nq&�w� ���,[����H �$�2f
��Sa<��j�������O�gA.�5���T����4�T��#�Vt���^�9�j�+)�F�� h�:��(y�
�P�(�|��jG��.���A�b	�8%�f�\s�eO���v*[3�/�C]@�u:��,��[�}&�'8B����<��w�>���M�(E����&�W�@�h�6�
_�X8dR-c�'�h�^��#�%��T��
Qx	)F����D����	+���gdI��N�y�**:Bv�$0b�x���(�}u�?S7(���{��
X1�jG�J���RU�h!��{x,	 �D��n,����+QL!/��!x#����B48�PQ� �*�6����@�%�w����GK����!y���/Q�d=��fH���f����J;
��[�f�����d�f�7��'F��.�c�=��_��F��.�CAw4'������Q�|�l������d�%vbqw��0S��/4z~T1�EZ\I�����uWz�Q�9z��>��������|
���|f����$���u������yi}�,�,�e�K����z������[�A^_(;t�L�Q8'���~J�+;+s��G��22g�n��]�`u.)q�[�A�{���.�cC9�X�����`���
9f���m����w!�������U�dM�.��fL��L��Ry�y�Euedm���lRP����!�>n75Ysg�j�l���x���r�8!��2bC(*���e0l��M�������9�}���W�q�&��8Y-6aN�|-�u>�����!�F��|o`q���RA��d����}��L\�v(/.�xt�P��qt!9+����7|��B[#�C�H�l�l�
R�JM����w�k�����A_ {��F�+�g�U������_rE�Z��ov�w}[D
Ds��2Yo�s�M(F�N4�f���h2w������U��{���T��0�H��2���ooE2���2�A��e���������<y�^��	�k8*,>���(�d����)\$B<6���6���`��B6&n{�F#u_t�?����.�:�B�j;�?p���6�4G���:�Fn��kt��5�AFO�b������p�E�����m�$���B!�g,(dE������Q��C�xtm�QM2��n��-�"���<���#�c�l���e-����� A C0��v�����"��;U�#�ri�e�������>���~P�Y	o[X�QA6�
u�UAC FZ8��*:���&���r�&�3����#�0vA���;��p�HI1�XDL���D�ST6k0"6���!����!���P4j��z��������:��[������a�Zj�h����G���v����B�p?��;1���
:_uP������Cp��#:&[D=O�
'RG�G���������3T�<�g��O��:>�*c�}�!���5S�D��!�!#�
�NGH���":��F�Q�Y���t�Z��F��*�*����q kJgIdG>��������>��S4�-�hDo�BF#<�YQ�����������U����wet����K},�M�2,�t��f�'�eJ�
���k!m���'ZlV5@�����*2�.'f,[�G��XR�,(8�G�����E/i;�$�K�Yc�}?���;�=`�Q%;�:Mz����6F�8��L(:p.Gr��]�TV\6�|��6����oT�3�v����������f��yZ����}��������9Z��$L����9#�sN��w`�����.����G� �H�xH���/B���g���C&���!s�m��fN��Ol��&��������/n��J����A�3;�4�N��I�
��{�N����N�~��c���i� "��B����.<"���@	���EH2Egq#-���o"�x���[����W#q�=�X���/�aG�iL���s�����\������X]�����V������r��b���XT��j0��b�)�`R�e_���}Q��A>��q;����]�]?�Pz/U��`��B���F��jP�bl
'�
c33��N��e	!�H������pZ5p�����7���|�N���I�oShA���
��O]6�%���N�����G��lv����V�e6��YE�V���MCQ-:��=��9�E(�
-�H��F����	��n��Q#B�n�"���[��+��Q��s:4������A��^�va���F���]g��n�D|�iW'��h�Vu���6,X����S�R��u�c�K�����x�W�e-!�)a��,��)H�?���B��YI��M@��u=^Q3x
f(�q�����k�p�w�������.�xs���2��)��g����"h{
bX�*���gvd�]��uS���a�z���f�$�B�p�)!6O�D����,�LNCw��l������]��G�Y�L	M�����S��:�!�W���8m&�Mt{��\h��CFjdv Y�C
�F��zZ(��k�RC������$T�rA�������%�������};V��[��t��}����=��`�d���	��E��p���qI4���+�a�t��G����#N+��y|tx������uu�z�����.�|!��3��<�7Q)!b���y;��DC{z��BpL_�}�A?�M[9?���'���'�;cUw�q����������@pA>G��,GU�/!��h�[
���V��Y�$�b|@�8����L���xz;�=u_26����y��J�uK8C&1[����l+��,/�0�__ B��0�AlZ�����@ d��A�
��'��-�
{8�	����e��8�'�V\��~�=���U�����I��S�M��� �%$&wFyY�f��Y����^68�H��@5�d������G]�f�!|'*�V�3N3&N"����-�&���Y�G��%D��(3��^}��m���MD�����+������*��P�HA�>��&�!9]��
�����(	l�Q������d+��
,z�H�zv	��?`	�X�/���nYx�
[�~Ym�:jZ���"��,���m��iv��2<uY���1b�,��Z2��e|�N
O��S4|��Vw[%�c�#8�ff���?7��i1����G(��w&62����L {�������)I��%t�`gZ�gF��F/D��%)��Gd�%�b��8��3`���~X����"2A��b}^������@1�=�!�?!��@���=��|o������0��NK�D��_	��~9��U���n�a�h0�GZ
��g6����Z(�N'��G���]��N��C�3�_$C]�40�;
��up�
�����M��Ts�z@*�����U,�(�i4E4�%�c��9�,��,�1���=	�2��o���[���u�'=>����TP��H���z�h�l�2��@E�ma"�Oz��4{a-a"8���o��`m������!��g'��&!����3�2$�M����te�?�U��,a"���������(���}Y������N0��;� B%�����+�4��:��^V^����	�r������PIV�Yi1��E5��@�20���*��@n&�g����x#~��	�%�r����/JNVo)��Dn KH	b�\����]����S{w����F8����#f����>5��,b=�Q���W�4VhC�d�����C�K=�&�����%&�o(H�����$:��g�zv��~��#����j��� %������^9j4y1Eo^h���A�e�'��Uw�n��#��j���!gY�����E!']���i9!\5:����)����J�w?�]�����_�m{����m_�h�
2P�t���BKt�[�'9)MP��?$)u����3�-��%[�bg������p�
�n=4z�>6p~N.�%T@���$��l����>a�f3
��-B�t�|`����B}F ��QX�p\�d�=�����c�+�	t���>��#��o"C6�q6%���P�D4��p��H#���[!�J1�@W�%/hh�Bna#=�
�`�h��#"��>�Nge�U�2��	����K�D�ct!-�,L|����b�w�+�"V���\S��T�f��K8x
 ���n�f�i
�r��}G����
�s������E+������F-FKR��;���=�X�T#�n?����J�/�W��;���&��j;���1�>
A%����Q[y+�������m�����p���9�nQ��-v�d��������<"t}	����%)�3���X	bqV�
�����[��{��
�Q���|`1-K���l���D��w.���?~Q�$l/�s�W����X+
:j�m���G��3����w��q6b-n���d��}��h��>&!�EG(X��������{>��������~c�{�<�~��N������
�b[�7��W(��X�����
�w4\LR,y��<������cV�	����&���w���z�wDp�>��������/J�������B-�+bU�S�e��N���)���t����$	�H�H���}��E�0*@:�]��d~����)�����G�m~�V�#��Nw9�K���3(��m<B3����)���8�^���<F\�E��?w�l{:��*\�h���S��~0?�f��q�?UP*Z��>����,8�8[$���M�K%G����4��gO��:���jQ�F�j@+G�"�_t��;�f����y_(wUP�{�|	��t�!d�T�W��7��
�&��<�8���Nu'�}�l�����C8�g���^O�
����d��i�5�W`�'�������� Rv����` A�F��i��=��4��Y X�Eqf�|�&h��&U�	��G���������'��n��\�����J�6��$�\g���\��QnG���1;��`�}]_��e��I8n{���x��<�U�W��N�,J���)����N+�at>:��j6m�-����!�6����%��>�P(��.��F��##�+bS�v�;���hI�D�C(`W�??�K �V�N��E	�L^������5��Q���w�.
��h�X2a������~���R���Vf�s[=va4��L�e f'�fXu|����L<���"�=��M����NYfVz
La�5��;�D���!��;�fX���>n������X"�,��o��#2'���5�$N2c/�L�|�)4��?��
'��Y����A�v���;��������NkN���[I��F�_�hgsn�'R\�����������1h+(6��:����e;��g�?�A�i���"B!��{����d(�2���7���l��Wod�j�1���R��M��*_�B�+D�,Qi�Ag!<�f�X!
Q��P������y�AR>Gp�96��I�
k�M�'T�/n.�3)�Q��c\!1H}��v���len����PR����@p��p��I5��G
+�s��up�}�SZr�}/$0>��� �
�h�:r��/��7��B���6V`i �-5�u���>f�a���)�����H��'�i���i�^B����,oO�!�{-q�8N�i����}4��?DK���I��^C�=%��S3��{	���P��3�O���X^|��2���JR�Gh=;�@�E'�����%2�w�e�;����v��6���(�p�����[������+�U�;R�	�i�g6c���6]6�w���X���x7(��c�CR7��,WE��D�/+�/�;k�-��)A'�Ab����M��M�R/\�?
C�
b(r���?2Y�{	-dIa���j�D<�#����?
W��3T��G��?������{
/e������z`��]H�n�
�~�	��^�����;��k4s�Cp�����b��G���X����	���F�{u�(H��vrB���7�L�;WI�����{�jh/�*�������|������;����	i��XxO(��C�]�Yf@�V�NDb4���t<5B���9��ca�|�#M�~:��d��e�]O��u�9NX,&x�{g�����Z�M*{o�@����3*�s�	��C��
e����h��Q���+5(��*���Y������*�|�@�
���M9a,�����H�����C�|~���<h�uYCI`�w��X=N	�����Yd<�^h��,�c���!�k���@�qL;j���v�	���*g�h���������@���ZKP��� 9z��M����+���A�^��,�j+:�8�]ls�����^�8�6������P�^H�r��0{F��tNx���l1�,���X���nQ��'>��7g��l1�x;�d��r�g�������#����D��[����a�����K8�(���j����V����P�F��KXU�����q42���F4�h��tb6$O����+N��S3���M��[v��e�h��������c.�����`Y	��R1���8����&I17Fit�N�@nO�@�5-(��P��RM<bw)>Q���x�
5��w1�  �.��6t�;1���n^�)\p.�}��Sk�5.��L ����%�3�_����"��.����]�t	�b���0H?�=��>+��Ds��\��u-q�s+d9���&�^��j���L���H�Xi��Wg])�R���/�-�[�"�b/	%+��
����&���T��o��K�y�k~�5:sK�BM��0�m���������������&d�����V-4����DI-B����Q&��U����(:!APZ�Z�3Kb%��)lQ��6�DW�=��p�n'�h�;S�.��
���E�.�H"Yu|����Y������K�v;��������p�������X2(���a�����V+�p�"0�%�����.nJ�+�
�aYW4F,�;����5��Q
y�O[���,B%2���h���(9�����my/��f�U�G�qR���@���E<���.lB�	�|��;2�}�������G��*�����+?8$@O��k�M.j��G��T�f�v�q���`�c���H��wY^�X>�0k�� ��"��>�h*� ��\���:-������|��P/g������$�F��s�"��Q.��u�������a@M�I'C(�����t�l��R��	��Um ��	%C�����8F�}~e%�@
,����[M`�O�X����Lv:���X'4�����Od�B��"��e�����RP����(���1
�� ������:���_~xZ�H]e�J�iw9^�Z����0
u���������w���f�P
,�q�Z���$7�Y�T��������g�����Pp��������;��/P
V�P�6�*��D��j��dw�����V�[����<���	�"uL5pA-����~P2eQ$C�U�*��QqZ�VlaV�q��!Nh��#��,2�d��
�l���	d���o���/�p��H��k��q�&OE��jq:1���jDk�eG�EFq�
�@�J���k j&1��
�(���
���W�����3�5�k��w"yp�[O(�U�$*���T������:j�{��~���$&��w�4�������3�?��qu�5�	Q9[m�tI<�����GD���i��<b�U$��,At'�-��]���$����?��t�0Et��7������/=d+��/�����b;�s&���H�-��U�]�b��YQ��r�j�&��Go�[�z�nQ��
����K������"�O��3X�Q���NknF��-��D@:%��������p�v������w�	?Lg�c*z��#`<F�����4�Y�)X�T���B6��^k`�I����%j�������)����`��F�\�)���B��������E�'�����f���HK��?�L�(�mW"��{Z����fV�X�B��9^�H��P�Z�@�L��A�op0o�Jr��X��B��}	�����o�������`��A�D�#;!-{�m���s��Z_
�'��aA�	���d!���=Q�+a6�L����GA�\V�c@����Ym-��R>cCW!
p�:WD���H �" v�@o3c�Vc@xJ�@��@�;��2�i���A���5������?���j�C�6�BV=�[�pt
�7�7�jv��������u�������dg�v{�0�^F}Q��#���4n�l���Kh�N����gX1q�	Q��"S,�����2��FNm0���Kx+���}����	B�|���������;h9H���I��I��+�����y��&�YGt�F�0qG-F�����}�M��5}�x��������f����l�i�\�T�rE��u�v��:.<��'�_���Iq�&��	����������H"�5�
�o��v�*�vgFe��f�!���������|so��d^��mH$���I�q���z'5#��=��l�M����~�;:�61�NE��fx<+I�}GZ������C��K�08A����������D���OZH������&(�sW������&�M��>�*��I;������(n�a#�	mp&�T�$uO��&�����6�X5�
T���^,5"�U�R"�W�����a
49j35k#*����y�+�4��/�o��s�&!D0��x��k�l����C�Lm|t�X�y0����D6H+!��,n�����&D��~���0l�����p�+h&`���L5\��E���S��h�
�h�c���EF�(���x��w�6��BP����Q0������/'����`����3�p���]t�g?��%�;��i�$*��{Jk�F5����f����C�O��\��O���MI?������]=�q�����n �����D�}l����h�s 4:Iq���+H�,�X���{�����a��n��_������l����kJ�j��l�6ZjX/Gss�:�`���������r%�$����5���Ut!��_�M�
��'��p���h�N���R�&7�Fg���!�h�|�J���<�J���c;vg%'(��-!q�}W���cK���h�|�t\������'k'��L9v�	����#�����N�����������@�=�M]�l��f������`oi�:T���������L���q���t{��4���W�k��e��R���(N�Qw�������P��}�@l&�&���B]�-ed����@g�q��v��	
�iO�P�3W7���������g�M�� �h���L�����w�����R�Im�$�1��&��w�DG��n�$`�q�XT�?�+��T�m�D��@���^YgJ���TdF����������F��(/���D�Q����z�Qi��n>�$�%��Zw���X�9��F8c<+ez���.����0��z�}�p��6���G%�M�p��n�'�C@��������\a-x�����._=���PRto���u���!���U�g`�#�MH�K�,p�1-E_�������������Dj�c���4��:�i��<��}��m�h$h����CFd��?��
��ht�!�-:.vJ��3��h��@�Zl�$���PV;���|9n�W�m����R�C2��>�����:fA%}�9�S���A���O�O�i����`����c�C������J�i6f1�7o����hD3{w���lKr�\n�%���feE����)o[%�����.��q��RX�����e�] �#��?������*_�y����5�]���~��o�"��
 k�X�M�b�g�;�0�,9���;f4��f���������Q��6v5����Z���n^�tDl��h� ���2�1��������q|\RZ�-&�C�s>�Y�C�B�y����n��d���~4�-`�e�����\�Bv��5�ar�(�_L���B���K�Yl���s���&�[�g�f���������h
�.i������5��"]v��:��%�}<�����k�*h8Y�O��r`|��	����*�:d�;��H��!�*��eq`�Wx/����n�j�8��/�T���G5�q�'r��gU�����>���������L/�C��/v.0<�E��F����?���2A2� #�`�Y���a�C���*a��w��=�e��!��D\�as%:c�}J�R�-D��C�V�="E5�0��F�X|�qu��|@�&�hx����R��a�%Y���2t�u)�G�c�1p��WU�������1���P1YeD��!��#�Y����R�@���r�a��#2��;�2����e��a���8hG�����!p�]���5h`��g���,���)���;����z�[8g$5
��-������4�j��ys�n��B���'hC��t���V�m��Dv!C���$p�}@���&��
���@��-�N����y�qZJoE�1���n�>q��0��M���k��6�`c��}9@�����~������U#�d��G����8|�C�Z�c�_�D{�G9��B���;,�Vy�1}�`�-����������`*M����e��M&�o64�d��g���=a�L�����u��4"�r�	��s�d#.�0�q�J�L�;��7Z7l���5<��VG��X:�e<!%���ID-�a�;�A]�a�p��w�`��)�D�'
)F4"���4�^�eZ�&h ��Y�}f��a �B�k�c`f��QR��qD�����@%^����E�JCX��a�,�li$E��?"���M(�����Qt���L�}OYZ��1#9��6�#� {��.B+��3��r��?���,d��lr`d''���|�!D#�30?��K��H����!RF���qE��~J�
C����e�j}�K��=�lqw�������u|�j�������t��bO��)�"s�����a��7�Uf<?g�$�f
���,�T�9O��S��|,`�w��S�Z���ymK���;�E?���R:�����m:��#`4�}������[t*��E��$��������U]6��@�{����"�a;}m'vX�|�h�:�(��p�������ob��a���`�=�Nc
� ��/:�L�*@Kp��+a
����w
p��/y�F�e��@��i�^��yA�N3.���0�"�F���.6" {
z@��G��<-������K ��G3��#�d
t���q�f�S�-�t���������3��Z���w��.�u
|8�Vc��������5��MK*�1��.0���
,�*�9f;���L_9�@�q�E�Bd�~��s����u���&�$La���Q!>
,0���zDD�iE���B@��''h��.R.L#m:�iGn5S��[�z����p�R[���y�$����"���-D{��Z'��l]����e;������M�/�aZ����d��~J��tZ1�JI������`
C ��o�B��![Q�:��S��ybw�)����[��q� +�!(b�[ZD�����^���G��)8������6���>���3{{fnV��q�H[S���Y\���"��\��p��^$�g�)pAZ>�(�b
a������1B�&A��Y���i��.��j)�~~HC����
p2�ft!�D��&�T��:���g���=7'A`�����F���B���c��pv\�9"�c����A��X��L8����zN���Z�}b�����c��mK%"c�)`�����M��n`�v��������MM�`�#r������c�f'`A
Y����<���#HiuJ"*G�j;�1QH����6�!Yv���,��9+G���[t��#��/	P����eG����*%�j	<��sA��������E[�������Z+R|/'9������B\f:��4��A�7���oE&����=K�Z�&���Bw�@Q>@����*����Q�~_$k�^��W�%@!;��bG�[��{Rm��@fA�������0D����������)Ct	VX��x9�Vlt���m������������z��I�(�ZS��e����[4P=�mDE\(:NT5,������W3}w���K��.'�u�`���p5V�iw��3��b�\�)�={\��`^�>�]�p�h������pk#
�.�S�D@"�a�F�??���W�s�j���$+�.D����6US��"��D���)�-���p��������D���wZ;���v�W�k�f��%�@�~���6����e�%��E�JxdD>�
�)Z���H�B���/}���CFq�`������ ���%�TKY�lY�p�*�T��f�0��t�K�<�G?����.E�;9��O�I�M~����n��xi���>�������1bT��|w�v�HC����i%R��p6��C�e��vR��8U+��g%GF����nCD?�UYcp	A(��I�`���!�Ws�3Q������9@o���5��n��}������?��mA�������H��@��8"!�u~�G��/K`�f�,!{��;��\�*$G=���-F��JV�^Lw���Dt������JND�_���l����V6�t���3����hq��=�`���0����"_6i���U-��;��*U�)��gg}7�Z;;��^� 
����%`�����5-�����p��X�;<�{�16�{Y����M�}�7���WS�����l�?z}�p�X���m!D$����Zi���h��0�-���&��qQ������F[]9O�vL[��6������
^D���������qs��G���Iv��B+�]ej��H>�]l�^��%���H���������=�Hc�>�R�~z��]w�[���mE��6"��6R����pQ��y�@?�2���D��-���P��Mj��0��vz?�-��"{��,������KQ&����|��M�m�Dy�la�aO�68��=��oa���=�m��;pG�:�f�
���T��-~�x������%�ge�t�'���Xl��~��c� E���"����RV�\�����g��]�����j���16R�8�}]�&�-y
��<Dk�}��d	o[��-I+������C�P
�l����2R�m�2�E��0�+��?vh�����W�KI\69Q?f� ��D]���H�;
"�B�1���d�d��/+"$���f�(8^e��a
^0��h��/�04�Y��$rQ���q/l�!{%RLm!}Ve_������C�h[��/���	>"���y=j�)Q�~� �~hW�et	�R��~�X����^�V��^d�C8Fao�^�'y��i������)3]��x'8��>i�f��lW�G���/�B�Y��|EM�&!�������	J����
M���|z�����c���s�������}	r6q�����6J!���D��RV�:"�������m�_���c~�����[���T��t�@����n�b[}�"��r��^�5
�������h��d������[�e���c)���H�j�������>�b�M�c4) �D&�>���wT�4\���Tf���u5�����=�Dk�g�t���e�d�g��x����8���9z]������@��s�(	����c�,P��������8��2���"�#"�D��q2�=y6�����&o�<VU�a�������8�vd��?���_B���[��K)��F.|��=_f\��%[�	�X����P
@MA���HQ#[��))�d(��������u����Z����'|��Z�3sML�:�������L���q�����~�1nV�s��b�,{���m��e����D���o6�x]�m�a���2AsV_��WB����m���>��S'j��2�eq��>^�{�\~�#e�y-�N�&&*qN�f��3����Xu���`F���@������3u�V����j�J�&�����nZ#$�4;��F;w���y��[��#���sP��=A���y��}�Y5&#�F�` �:��]B3�\0�P��������LJ�F$o?4h���y��\��3�Qq��G�������GXF�����2p�|NM�seQ)g ���W9g�r��W8[[U��P(���U�#�e�-_���GF��8�0VD�<��*�z�UE3�A���5~�G�����g�w�f�kx��>'s|�"���k#O��EoV����<g�T�m���4����0�t�;���-���n/`�0��@���gUg~X�����1��$��((r�b4�l�D\����/��0��s���8�j���c����`s��|�n���h�GF�ta�?10v�%XZ�j��0���t��JVI��	��S����F�&/������`�@m��
��A���<�a�G ��v0:"�&��s����pd�"������%�C��;=������;^��[�����XcA��w���2��Q����I����������6���c���o�gJ�����"b��_���g��������g���=Q����([Wy��?�7`6e� �'<�3��|8_�Ut	-����{�u>���la@g�bQ�����"I^�y���b+����Pc99o���X��uB���
�9H�NV�w��B��(�2�;\�c�������@5�I*����T��54��
��
���-�-���,�)V9n'��\��c��|/�}��>��1p�a��vO\�8��&
��Z�P:�����-7�d��\����-f���y/�|,�1���7�p�xM}���
w�dp��6H����O@X��M�Q�iF������`f]�K����.#~�^�.�L_P�h	�PH-��
���Nc��
���4q�/�-��z�f_�=�_&�Kr�x�?��n���Q|���T{Ha�T��HQ^D;�>GH!�N��w�!44RNx
~�1~��H$�����"���#MW�-U���e�kH�����=����m�ha!8�v�<O~MW����0�����=j�p7��A�#��0]z���^L���<���=�w�*@�����WJ$��%���������$�!��D/�d2!&�#�oYPl��/uF�yi�k%L0=�@���t�\�{�a��������W�H�
�fV�?��{GJ�A�M���#�c�.�uS�����>��U��a����k���|9����	i��������
�#$�z|Y�(��N������T=����q����_�00�j���{	�
��;��4\I�t?=���0�4Z��t}��B����W��Y4�K���3�~9��A���trN(�y/���7}y�7O�l�^G�z�\a��;Z���H^�s�� $ ���^���5\!l(�uH�r���Q
�h�l�]�����__�

�����+6��[�M���(���o���B$V1��z/��n�{�h#[
`��s����.�M�U����3�W��O<��y�&u�	T�s3��7���1�>8�f��
����%�PkE��iT6�mu���d�)C�h�����ACfOK4m����!���c�[Tw��0����:��I�1CC�w�f#6��p����tp������H�A6���n2��4;:
�YDeIy��BV�v.��mC��j��C��d�)v��7P��ny��{B��)�1�&r�Q��)��wP����:�w"`y/T|���m�Np1�7
!i�B=n�hne2�`^B��S>�(�(��C~�)��E!Mo�l�)B8`3@i��U�k`���>R���5�m�8.$jYU/��;�~�Q��8-;�g�����(�-�8F5?C9�)-0�I���H�����a,{�$4��|��m����T����
��0t�����Zl����-n3�>�0����*��~{+?��[Kd���`�@���`r;���	I����MnU	i ����}Vc����N��bcv[P`0���O�1A^�o�H�7����{J����"�EP�,t4�he%�3��J��?��Uh�Em����u��m���2:�"\�����P�8[��K47��X�S�M��ei���*��dpyT�U#��w]����/�S�O�n�}�2|�$���8Ck$�����<;
�;E \����'����6�/���2��0pt����z�������/�.�D��"tB�jw&E�E�^���M�`G���������~�.�D�?���p;!#;���+���Q�	.�������h�Kj0|2r�)�,�����N�����qp(�
�-�J�h��,�eAe$:EP�n�!A�[N����!��Z��k��O��Q� �bN�=������Qk!N���,G�d?].��C����v��8>['��wr
����~?���>*�����wE���4��Fl~�������V�o�Vg` �g�^��0�!���w(t�V@X&H��=F�i|C������Vk<>uw��RL�F�����d%���c4UZD�]�X�1RW�w�=��?�5
~em�O<q�\��_�.F�
�(�|51��PtL .���>NH>��X�s?����P
�4������SGT>��Y��VT�N6�}��P�?��t�����
R���7�5�&3.k&����w?������������n��"������*��
����5:���h���[�����	H4�&09&	��^�����2e��$1P}��nz�m��VOt,�����d��0
c�2�\��7*��p�^�T�wd�N�E�|�$���*H�>Kh���K22|@����#�Hdn��d��et�*By�S�[�������q<��m�6��������	J�r�HkR[��g	)��D��S?b�S�F�
�j��;�	q��HN5������;�5���hu�P����(��B:�Ns�F��7�������x_��q�i��w���G|���$`/�=��\ID�{
��V�&�����Cw��u���	�����)fg8H�^4M
@�M|~�%{i���D���F%%��*$�n���I��h!����)��f�!�^C�
u���Zxu��V�,z���2[��������?r�-&����	F�����J|	�k������(�M�4'6���T���Jw��"���Q���$�;�������'��!W��8+L�=U�����s4\sAW�}N�`wV�iM�-���~Q�c%�����`U8:�L�X���hn	s 
�o�R�����Cv8�<�njz�-#3����������"��V��&Y::�TjUB�Z��-(�E���.�Q&P����F��U��So<�s8��Y�i��l�r*�}r�EQ�C���5g���[
o��l�@�v7zQ�����
���_' ��}�B �#X�����VR�,�)�x�
�`�x��|P�+G�Q7&"#T��>�
v��e?��t�}�w=c�=;�{�L#}	��&���mG�`������V
K��-1W�
��;�g��l�r�qN���
����h=l��N>�&����1��P
������	���m��
-j��m�=���PTKq\Id�u�C-������-��[GN1�����Mv��Q���D�ul���0�x��8Zc�����7��F���))
PD4R=����������=�'�e�o95kc���	�(Q�����D���K�l����b���d��p��7�n�q0��e_��6�k�WD]�����oTq����a��+����?���g4F������)�U��d�?�vNO�f�)ZCY��9^�%n��4N�e6�Z!�{���]��C�4gn##��JZsM�3��C��j�D+�p�E��&����
>�)
�q���z�,�/F���a{��j�JD�vsX�"5��J�9��H��[��z���	t������u�����"eM�&hbp��~��0(C4�����������"�<�;[��pb�z8�D��&�"�'j}��z���	���D3K=�h�V1���+pbE�f�FxF@�i�%d�Mw'W�7,]�}o�m*5�}8�e����pr�l�5�����w���~fqD�����f�j����x�uS�k���h�E��f�����8�����#����h�
6|��L����-�n310���s�������Z ���O����k��i!H]�
_]�Y��)�<���;�""�6;3�/P�h�!�:���Z�F��l�����%hU@��f��5GkS�wV+d�_�Ux�dE�����kw$Qi�OL��Wfp!�ZO�f���Mp��O9s�n�����4@8�g9�37����3��K�Z��'Ek������%����z�/�R2A��
�N�_��l���'?"�B�#��M��J!eVp��L��j���}y�K�$���6���E������*�uPs��}2GA$�h�yM��h�d���?�|��8hf���������r7�0�4���7���]��FF�S���p�

B
������~�������m���=�P~��u���p/������ag�Y����K�D�G���8��S��=��Q+?�z��Xg�`jF+m/�6���>���]�����xY"3�.4� �3
��%pRFrL�6:�wa|���/�N�_�3K\"�?i�L���8�q�Q���������})�
�p
�j�9Y���e�b���c��Gg�n1��a��V������[��\�-� ���d���aP�@��g������.��g�mM)�}���(��D�]�$��s74����8N5
M�L���_�Wx\�.�'�e=�y����~��%0�"��H��QtW=�vA,Ym~K�x�1�%1�Qa:��N{������+��{�C�=B��c����@	F��.�8�3s���+Y65�[ww",��/{<�|F�*�C�����b�t1\Mu�����[Qj*��C�)�P��g��v���T���v����U��|���:j�l���_����,�j�B,2�AD�g����b7T�\�4U�U��^�x�)���()�����6/�D�� ��������i�a�Q�d?A�X�����K3�.���]p��:z�����'�wU���#Jq""K_6T��r��R�)����D��:���I�hh���_x��L�����'+8�k���Y�t!��l���~�i'���{�����g��IjF��`@���,���S;����1m'LxO�B��gto�����	\Op"������s�����r��-�1"�.c��u��. �i��/;��6c"0�e��;�c&�=�e������/�yt�����g%������I|�����������dA��v������PVO�)j�f�0>�k�S%�g?G�H�<=����	��L�!��y���> a�5@�JM�-�����3#u_|��]���6;!�b�\���ih��	���.c���K�`�MN��h��{l���l����M��p["�F�g��+9'����C������9�
[G�cs�m����Q�d{x����H$;�?��n��P���[��D-�!�aE�����e�3����a`���u��<qG��Q���>*���fe�p�u�"�H����D��!D��l����3j���}S�bV��I��]42��h>)D3�(CT:�/�:d��{��c����G�8�8�G�D��qYA`a�x�l��3�tG��vGb&"���=���/�Q`���G�d�C�����G���g7:n;�-}� .Z���
=�h�����n���N����s��@�8�yg�%����
�p�
D�F�'C(���)Jw�}v��m!�X*�H?K�2����7���m�6Z��u��:=S�&����~�{rt�7r~M��-���1�����V��j�~�����4����,��v���e����a>=P�rv8R7F�Pw�g��%�������:��`��|��#y�N�[�}t �L)�����X�������(�k,�����x<-J���&hu+f`��;C@�9^�|-�g�M��!����	z�T2�/��n�����}�����=���FR����o8k�����)-���P�I�
�-,7xf����)����U�DfC����gK��w�B.�X=`�/V��cC��i���>�4�g�HgHl+������Y�u��S���Ve/��a��P��i��WA����$�l�cT68;Bn����c�]P#x}|"����N<�+���R|����
:������G��y�
�+jT���Yq��n���o������+���W�NA�{�=)y�S�
�)e7�+�����x�O.me:�B���Yh���e�DG��P��)�z��h>f�?v'TmG����l:� B��C�ONH�B�K�
#u��1��q�����Lsj#��iP��}T�M�"+��g�3��\�����i���'��B>r��������h	1�]�����#[���}�.�O0����Sp� v�%{�#�1��oS�$��.��sZ\���z���B9���U��������2w�OF����J��d_��L�����/�������q�0��g�
��':��f�c4F�N���~D��)�xCz�-:~O�=�N;<��� �D������9�ei(����0����O�G��5�I���@H���S������-+�=���Kf7m��
f�E��=\u"����R���|+��-�_����<��6����� �,�lv�D�����w����=����h�����9Z��8[���{I���T����R�qH�i�~��Q`�4���j�L���k}F��l����/<f2Oa�T3����{n#��z�j�Y��QZV
z�Q�e��{�3?���"K�i�<��9���;Y=l�E�@���
�fq����]`�~�o�W`K(��{��s��7-��Yy$���s����1s"��9�\�c@4H]�-#���y:
��x0��n��>��D_�`L�5dU��sO���tV�����
�WJ����RC�@�@c���r�]An�8�^��&�D�x���� �",f����1V��Zm�l��;M�a������OcbPLMZ4��`����`�]���)���3\�L�3-�@
O>��5#��Y��gi�<�6-$��JcYs�	>v��DOXpE��1a��
�@�rq`g#��\5�}��S�Iu����I���|r������)�m/6��m��p��Q����W��W�
d��B�
���G�����T4H
��NX��NJ�eiF�MG���X�%��Q������Pd��$�+G���>/�e���c�dw�cn��ZVc�E��SG�%�am�w�n[��!���4[e�?��-fU6\M������{:M-���UE����*�,�����bU$!/5�%��g5)�^�/%��(�����LD~��������<���&s�hQ�F����&�(��ND������%H?>��k#*P�-����j�ec'
�Xw�>�����V���:f�����eX�t�GT%-gR�?�������d���R[�e��-W�h�����Q-w}X,�����n�vJ�6��'
	(Q)�R�����j���m<�X>���5�t����nG�J��T�/�[%nw
���#�Zt��;�e ���������_�(��.Pc��2R���h���e*L����~b�h�O�����j�a
��J#��28�u�4�������W���%��>���f����<�h�����QD��22Qh�FSt��|��\��7N���3+�%x�Rx�4\p
�����?�[���k~h�my�����U��DR�5��{>���Ze	&Kh�	AA=;l;�������$��l}v(v�<f��~DJ�^
A(G6R��G�o]���VH�
x@	�'3�\���!�Y�d2�e�'x�������D�e�@g���qw��i�WbY�O@f���Eg�#]�z�P��.ym{D�a{�u�>p�/y�����[�H
 ���2t��]�������Jf�����^P����T��S�]��6������-�� �f)��t��a����t��������.��	���w�GW� 
d������zL�V"A��(�Y~,�Fe�Ql�(�c	(�6�i?R0d	{�~�(�����[�*����"U�Ru���VP���-�/W��mogWl���pw;)�~� Z�h3���9%6U��y��!U���ut0���z0,[��������Q<4�9gMk��ue�`K�����oa��v�j��
�h���m�F�	D]DL��H�z��A�|ne� �)�4?c�P*x��{H�8t�',��G*VW6�O��f!W�n���3O�m�UeI��w�3�D�::Bo!D��FOJ���l�e%����K��*m������y�Lb�����P���kE��-d�DG���	e%F���e�2o����e��5��t<�����}N
��L����	���2���cfi���U�1Z�X�o����1�s[N����:�m!�<2u_`��l�f��!��4,�R����(`:#����[H�����0RQPf���j(�j�*?K"��*VN���G9�V(kFl'd������z�����
Sd��('���+gN��m��N�4b$�j��&[�D����"P��-'���5��@���� �B�]Bn���!S`,r"��v����%���������o��
��A��5�/�3��B&(��6�60qOKXe��,���MW��t�VVF::�X�������#k�����1�|2��K��u���e�Dq�^��5������N���y�w���5���Q��	H
4Pa�f0�*A����R��P�[������{�x*f��)������v���nf�I��d7���B!���_��Sx��%�{;�$�Y����c\!���67	��Vlt�NcB�G���8
 $|+�����o�F���W���m}i�#��ngL`�_����:�M�W1�@���������-X�64���Y]���9b���o'N�SV�c��`���<�
0�,m��O"�@�P�4���OH��#,. �*�u#-��@��21�<�s=�8Dn+S#��xMf�y>p4h�y���2��k�f����'~~[��\��It.:�j�>�b��;u��(�NGHg�:`WE��1p`�/K���@��~�����M����XX1��z��S��,�G%�8#-��
�c����G�~�0�t-����*1����@V^G-���on1f�����G
Q�~�4�5��@�#�"u�;V=������>�����N�#i���
�3"v��b@��>jgQ��
A-�x�s�������W�s=����l�	]�5@������X��{b(Y=dD�i	b8�p'�E���c$m�_���T~�&����Efhx�yX��D#�r�=cVQ��	�r6�?8�Q�y9��=S}���F�3�����y:�J�pG��#Vb�(�5}L��ry����m������#0����B"��ql��:����D���W4H'�=4�H
�${�H��9{b/�3~J|X`38!
�r�SY������2|�TF��r���[��GG�{��#v���()j�J���.���q��j��e�d	�MXN��X���g����J�g8}/�u�+�'���U)����1�(��H�	�W�[�2��Oq��="O�#��}�S}��YC���%�k�i��Y�0��<�2�5s��V|2�:������	n/�8&�S�*����A��}bYYAc�!��5��2��@��u�Af}<d��G����A
���l[��5��gk�a���������X:MO���X� �G���)B�c��M���9Q�M������@�]���5=����=17�8�zhY������+�7�XB��\x>���0��P
v2S�U`��otM>�Rj�;��Z��S�$(+8/�A�i����4?��/���8hT���>9�FI�&�w����C4D�r0��$��p�6�L���p�p)��;�h�eUA

��w����z{�<����!�'h�����~�1�7�j�����pn���JMXA
5��A:w�rr����v��8l���Y
����d=�A6��&������F	���2�H���
^��@�1}��Xb�	!��;���AZ�6EX�9�		o��H���
r��LH��?^k�����_w�m�f���h��#�F�q����@ysG����-�����
W���|��K����F���V��?�?�8��@-z/$�i�X���wV��t���MX��d'�#�����t�h����^G�M�l�����f1�����D��)�
�d���0�\�����������~�s������dR�;r�F�z�fIj���t�4����G�=
�L�,AS�9LP�7�UDB8T���G#&�>�U������n��-�N����4H���9�Q�a0�(�u��i������K�	��;RK��YH�;�"�@�tyZ{��W�86IM�R����W�O[����m��� !;�@�%���w+�|�������p4=��H�� �p�1�ae5�������-_!��G���:���(��l�(�'�H�n14-���LVm��D����]w�K���(h��p��t�=�����
��"�������X��?T:AK�^��n�5oB���M�?����%���P�mi��.��V8�bLf��2X��~�H�x%��$�@�4�L�#p[{���&�fw{~�$|�i�#�"�z����^C�oS1�r��b��E� ��o��.a
�xA�:��`����/���dK���-E�h?������{�-W��Q2��{	/��%)�)���(H�H��;�8�2��jH1��oq$^Z3���f��nI6�"�A����2q���cQ����r�%T���.��{L��5���:e��#������U,���-1�A�!8���0W�i���j�8D8H����b/A�5L�:��W�cur��b~����e�����Z�hd�������"��G,Q����zQ�w������{���I��HQzi�������^C�otJ(B'������&[�\.�"x��[��
��$���^��U����^"-JR~����Py��������8r���bi/g�A��1D�C�R=��Y����HY��7L��$4:�h��H[r5�V���.�%����m����/�P	���z���@$��0#�K31�����&�pgK�5�������;�qrtV*��1<��;����l�P��*��o�0���Z�p�;��
�i�=^A_8X��@�\�`; E�E�0��R�CX�_�f�`(�[�b�c���C+�]�0Z�.��#%�D�F�Q$�*Arv��/B��� �>$��w��� ��������6!#�����oc����R�hG���-'n����w�6;����?���)������[Gh~s�k[$����pt	��|�Sb���JA�f��$/�^�^n�Wh�#���'���{/�����u�eB$5�� ����^g�u���(�Y\����,��^H;(`
����o�����Sb!Y�3F��5��A��dO�
�ciF���}�:E�?A���E��o���Go���%{�>�V,�n;���^-����P|o���w����(�npx��Fb��p~]hd���T�N~�����%h�9���Af���������-���x|J�lB	�h�n.H���]3�V9�w'���(���O
�����N�e����J}|����Y2��v�*bFHI�@t;���
lHB����w�.�;J^V�@��$����&�����m���W�w��-:����5$�o������
�����Y��B�vy���^W�pK���Y�j�)M�aID������hO���BI����&jRWC��#�)��jq��O���->b�8=�P]���$�-v���t0�cz
�\��q/��7�fp6�X���
j ����`����n����`�{�e���7����K�"���5!�eQ���*��'�����F`��������W��Q6�XA�����NPC��gd&wxu�X_Y��]�����y#�FV'E�j�}gU��Yi]�C��}�@�r�D�]H��]Pidb���h����6;���u8����we�\[H
���Q��;�f(R�>\�����h�=�RN����g@���!�_z���]
�f�Q����,��XV�O�J\� e5��
UP��������AlG�{
1?�+��gd��;:�T���&��[m��6�����X�/;���amwG�G���N�>��'��K4������Nr��]2]����fA�}w%|Y�?|8��X4HxE����+@���r59[��a4li�� �>9y#3����<�|b�{���n��tj��-��hF�Mq�)\cn���3��I�����.�m�:�!���Z�U<1��#]p���I�S���v]�K�t���6]�����S�Ns<zI�Z��,�-[
l��m�N�f�����D}�j���O3�I��u<�&�������Bz�R���48���-kn�q�rT���+�������{f��D���d������p�rC�=��C�pC&yee���x@��v+G9�����e��$��}��[P����$���F�%�NH�|}`x�MA���d���i>���veb����&��Gb����2\�&�pw��)�E3���pW�& #y���T�nY��w�k|����%�W�L�{!U�����
DfC�$8��v��JD�j�s������DPh�����i�9�!�%Z�� ��2�?�^Y�3��F�h� �V:���	#����(s-�������0>�n�*�����Y9I����P	������UT�7a-b
55��y�D���?p����fC$T�Qo����^a^�w�����Iw����"�
���6�7�q[@��^"zj��h;Q��Ymp�*��Pj�������_���,P��(��3�NM-�)�I[��r���,: N)j�4��i��-~�4����OpKV�|�	�!�-��l��n?a��8[�-;�����(z������S��m���TR�C�?LCg��V�^BD^�	�Pa�A�������>���=���}B�{�d^��IfX�O��e��f�����l�d�ld�F����f����V��N[FG����6��+si�,P�r6Z�-�X�lV+D�Zs���2�6�n�#�C�[�Q���lf�M3��5�#��,����sX��(��F���3r�k���%_��v��v�/F�M��l����BB�G�nA�S���{!�o���1��=�+p.��0��GV9}�y�E#S-�Dj��`��#��[�r��f������&��27�'�L�������?:�"l�I-�����c~w$�dm��%z��<
���=���{I/�0��Jx��F���U��h��v$~�Ia�n�8sKn,a/�(�wi�E��)_�s5�����{��?9�3��������,[[��1I����-�����Y.A�~^�B���?�.�� �L���{!���d��X�@6�i���b�[b�cP��]B�-�[��5g0o��=��.����|�1�u�-t�
=*�������'�K�����p�B�3|��wDW�$������w��F�:d���I�6V���l��C�0"��[�?8RfQ��O����1U��p�N�iM��n�/�4�;���l0�j�����#��c�#������D��C�z�����=�A.�����,��Z��|��d��������tD���(�]'i}J�LXr4��U<�S����D/��b��
�������N�`���	!���Sv����[�����"�Tw�3�h�Vk�����|z�z'��Y��x������E�}�Q��;��v4�����'f�u!K����	� �����n�}���*��o��I���.�b��:��fU�cE�D[��r��Ls�s���Nq��6��E��cC����d�K�����C�2�`TAL�%XL��[�_
�������BD��n��|bO����%:�G��$��N�)�����TJua��4:��a�������\'�eG��q���M�z������Gg������Z�v��-�"R"n����z>�e����E l	�wc��Y�.0"b-w!���Kw,��_|��B���7{T��D{��3���$���J��L�����i�Ct�??%������]2Fh�Q��5���%V���k�e�@	|?�vVv0<Q��{���h�������@���$��4��g����.z{��;��{`�Ym�lQ}8�($�A
	T�m���I>�E�ms8����=3���:��hxZ����X�y���<��Ud�$��H���X��8���S�H�M�;��ww�����^�9�������Q�A���w=�?��$Kr��Wg���@Y������Re*)2"0���OZAq��0h�l45��j���qZ���Ib�G�d�U�[h�E��	���J���`���	��7����MO�IdPb	pfg���!�%�����D��a���*#���'F!xC����t<�2�a����DT��$6 ^�����f�����]��o�C^��|��{:��d|�B'��5/�DU��,������(!��]�$S����AF�r�X��|RA��t�:�F��$�y��h�P��k��C�O?�L�����$���������G|�T;'��F#*�f=�����z}�DF������"j�G���e$4zhO\_�2d7-c�����56��V����m�cG��4&�#��#��}�]�y�Ht�f�������*�abL��t�$4�@�!��Gv�*���Rz���������'i&�!��A+�E���,�����!�]D.a�,���a� B�����(SSV���E���!Li������b��v 2��!
�x�S.�5�Ad�������IAWP�?��8�v3"�����{���2�<������D��T���K[u�"/=�tD
qW�Y��p4!�2����q�6!��&���m��c�_����Kp��kF+7D����@%G��8�D��>���Z>�
�=�8�/%��v��H�0���h��s����:�]��JC�V3��_���=	`�;�pM5�+GJ!�N��D.0�$i��Xi=���o�����yg�
cS�a�fO{j�m6�4=+�D����YsP�|(
q�L���iW�e�(~��[��g�O����y���W��N��+!�l�������P���5�2D��[�!+�aC�vJf��ac�h���i��;��w2�Z�/���C[YwY�m��]+-b�tw'Il�j�v��i��0v����OC�
��`��:�_���!����h/D��S �j$�a����)w�{leq�#��9:��G�]LRt����,�hD2��Z��������P����2F$#|U��F�:^#?��8����|�����rVS�2�������~p���f���������+�����(+"-e5+H�"D}&��Y��m�#�/�}�����dlC#��������!�R�
x�����iDCk%���A'�4��B�@W����R���?�4H!*���s���+��:~�N}fIIWB�����7�����"���#��AgMC��i�b����",.~�%:
Y8�v(0@<4��j8��'V�~f����B��ja�BR���
Y;Ky��� j�/i����N��0�*�hLzSqB�n��?���]�)q��L�4�N�B�P�g<#���?��e��b�T������fo��
ij�x�'�1KW��N�����l���	�V����DH#v�4Xq��5�;����*	�Xe���z����.E����<�����Q�8�[����3�Vh�-��(����O�m����b����(������n=#�	�Ad�j�j�J2��@.3P�fZwR�bH1�A���[f�$���'��>
]z�v�[M�vp3����)�g�5X`��\w�A4af�o���8�K�k���t�@j5��k������x�b�l`]�� ����W�HX_�@b�?�t9�!����[U*�E�T�47b���
K)m��I!X�Q%6U�
ZHs����|��5���������lu��8�Tl�o��$4Q��#&q�+k��Y[��MC�
Q�[�Q�A,����4�0��ZHpx�����b�0��
jV:.��U(>L+��Yh-��b���x��>��	�Z�qf�7cu���>�!U���:w�Ff������Ov���$��w���S�����]�������D��7����M���&�N��3y���a�����F��2	fX��dj�Z�7zD�E��*&�%+M6��,F.�#V6�t���7=
]�P����&�TLC!�3���'I��"����/4�XO4��l������V���l��!����[(����'�c�G(`m�� �Ff����H$��1`+�t���c��q	���b��vK����#���J�/�a]F'�X,Cg4UZ�dM�o��	4XX&4!Z��s�=�r%V����Q�#53!:�P��L�>�[���2o���f$�&�9;��j���� �"�P8��{��K�4��:;������DO4Q����FV�[�X���3"%���7�*����g#����
M&U�)NOQ|���x��	�q���B

tJ�$R�� �H\2�@w��^+�i�_
z�+n1)�<�Y��:�|���NE5�R����W�*��"���J��(�s%�B�����B��������|A}�j�|���'����h�>1XD�?�_F/��2p1=����E���]��s�m��
��zV�c
^L�Xb��2dQ�E��7����-�d��#-�!Z�)���s[R�����Lh��G���Ti���!9�����V0D�\��PU!s3��!z�J���C�Cz������{~���j\�����A'��������
q�GKv��?�;�w��%FV�k��B^h�58�.�j�T8L���E�7D�%��c��,B��
���z��X?)|�.u�rj7H���Rl6������;0��e\BD3�Z��8��b
u�CjA�C����)���1�Jz��I���0C��<D�]�o�I^?
�
V��2x����&��;R@�1"!�?�����=>��T��v��)tz<�����5��)��N[!�����F����F���f�\`��q-

��Ot�s����
�����^��A��N��#���2Yu�8
���
-�����c�r�n,�,���������&�I������O65�����`�0�n{��k�#�x��;
��`��A��fd?�M%�"��%�l@}�N�uK���vR&�|YD���	�~�}}�c��8H}h7ft��4>�%�w����mzJ�fg	�:����C#@1p���Kb��uR&���=;����SjG�8=]5�V4Z��@��@�z��e{^�B���-�-i���F������b B�6���}�$d]����A��������h���6Ha��m�a���F\���X7�BE�Nn��e
J����z~�J��<������"�Zf���B����$�Dk=����HA�' ���{����\[(��n3�{b���)���<q��c�-.	Ol�&b
�����v�H����0��6j ���b��ZF������:am�������h!l������?g�*%"����o.jO��$8��]����b�W7� C�p|����g�6����~5c	�.`[C�{
����sZ�~@�{����%��{�`���l�It�����X���pW;S�m	��IR^�Lf��g\a9o����j�W�����(	���z-v�r��0�
3�)3���'LB�wu��S�\�DIal�����/����~���/9bh��"���RVw���"��gA�5�J�-�:�M�W,��E������m':Bp�n�n7���1]�#
������h ~��YJ�N����%�[��AF?��1UVU�#-�V����fT�)�sR��i��k{����}Q���z�n!('		Y)�c�/*'{���!��6L�X�b��~C:
6e6{.�����|��H4��'���L�@W�����������N^t
���=x)u�P@�@~|��"��N�=L��2E���@(�(1�\����*��!6�������Q8�2��s�(i]SO
5�H�F�������A�+0��<��?��������S\��lN�����U��@qF������(>}!��F��U��`��1� ��=*W�}*����r_�F[��mG�0C�d~\���Yp:��'Z��������9�2i�I��$����^��p���^�t����d"YT������B��=�:���g�$�]�IhM���P�LH�
z�#&j�e��Q�|"���������}�Q�w�Th:R�lO��a������O�'���� �������_.A�h�tG(�C��l6&�,N�
�2S�q	�����`�������O��N�������D_�QM9	�f/u�qA�]_�k*y�(n6PC{�R�r���5��H����'S&��1&rm;=��������UcQ��	T�������'IS����U���%8E�OH�F��`[�#�8������M)u�z�az
���I�"Y�A��E���k���MX
T���
YT��VeD��@!�j�����_4�i"���Z��C�����'�d��'F��cn���K�@?]�#P���I�FA���Ac���!�c��	��O��#�zE�y����E��/Z`��U��h']����Z�{�
�O�"����P'��+/S��-R���������#�T�������Z�����>X���S�����8Wg���")��m1^�k�]h���o)M����!���t�X�k��<�J+�����]:;n���Q4���L�*�7�/KL����(Y���?��@�%e�����F����lGn��/��CW�~"�6.:��`�j���m!���f��<�-dy�G\�����s~D�������1�������k*g��	�'9�w/U���!Y#�����	����W��NE�Y���]��G�v
��d��^m�B~|:[���`����?8�����#���]�\vh$ao�G|8B�:��xoc�VRl2�~�t�'�5a�W&�I����'�z�T�TP�����T�RH��{�IO��S�8�����s��X�#3s�lST2�/�ZCn��E���YH����iP{b$�X�F���{#��S�z���0�=B"�%Z��!��P�����rw���y/�7���eR��]�B���Er�����(R]����'�]laG	qK�b���#���a �j��e/�.w�p���}�<��n�D�sB���o�Pp���B|6{w"�`��Y-�.K
����#N�2�e�����`���^�h%�%��Q�r���"TH*�K	�j7	���'��o ��-�������L(-��r���������(�S��������}
�yw�Df���B�E���WF�qW��K��}e����#�t��pz��	���<:D)��{�	�hcap	��	a���p��0���*����d�^�t�@�G#F��z|V�wL�!�����/LN�.�(6�d���Y�N�����_\��w�k�kXLm_@�k{��!�+�?"����d$",����dO��	g	�,��H'{W�J�)��+�A���4j{��Y+�Z�j#��n����������v�`]v[���7��9&�>/t�AD��E������9�B`�����Gc���f�Y�rb�L�jv��O��?�'o�Bs�R����[��B��a�*���>�r$���A�����'�����h�_�^��� �O���ihB�m(��<�&4FdG��Q�$ l��c�: C�����%�\�!��h�j����3g.$�{�lQ}U�/H�xo4���B'��{���a���%z*���������Fy��{� ��F'���0Cc�:���1t��])$ix/��E�h�3*�F��y�
���W��U}��=�O������k�D��r��eOS����yrv����Vg����3��7�2>q� ��<� g���|���� ���B1y�i:���b�B{����_���������9W��Q�Z�k�>1���{��+K~e�O��~�(|!���d�Bv�����H��^\:��Q������>fw"h���X&�b���QQ]P���D�(%����}E��������.�@ ����X��
�N�b��m�SM�$	/����������?�:�h�Q�\�4ECx���S�v4�-I���wO���FQw^y-���:~�G�s~��L���O4l�[�c������A��� �,�����_{�Fn����Sn�j�!��b4C�����4P]Qa�(�������*\f�����e\�bTC2�{K-K6�/�8�
}y89V��c���;�u	�N�$H��_1��8[�)UM��=�	�f�q1�!F2)I���/������$	�tK�
��/q��a��f)F*�/ �e)F*D�=���M�i���O�$����&�����D�iw�$�o��	�mf�����������a)�U��,MZ8F7��(Y���.���mm��&\��`�dt�OW��&�Z��K����j�=Ln���>�^�j-�����B�K1�([���-�����
V�	�pC��F�K��Y�I���p���c���d��r�����
V@�h���S"�P"����j���[�U�?�v*�J�r���[`�b��?sQ�T�cxI���hErG.�|���
�/H�C���J��*?���_|���Y���T�A$*����b�dqq�+�\�������$4T{;n=�I��{��w6�NFF�(�1Ff'��!�l1�Qo?p�=��{��8��b���G���L&J1x!�$�}�4E�������F�%~P�w��#����%[J����a���l�6����K2#$��M������.�I�����}�pTT�_������c`B�W���5���L�]������R�$QF�����4D�(���g�8�R�?i�&��4+��!��h��u��nK}��������&�R
h�:gz�<��H�5^R��wv��N����H/����U��e�������Q`j,�P�^�pZ��ES�O"=~�aji;1�$KM�_S���^O�)�w��@$��W���]��|����4@���m5$h�S?���S�jPd���1��Q��:�,�6����O��>cV��X�i��R�-�i��i����O�BCa����G��xD�o&:P/P�vH�!/�������TW�5����&~��A�pM~tj�+t��/2TY�����_X�(a����u#�Y������56*kkTw��J�s�J5����Wh�wH�]D����b�}/|J�q�z�����n���q9�Nf�B]��o���=��	�X!(����y��M���7T��J����Z�_���=��:^�%���%5V�xz�"��w$
�[�p��7���\�P�B���jr,dN��gu�yq�_4�'���?
4V�����nV��0�ls[��%��a �D5|a��B��5��UD��j�q�2������w:�a��B��U�"c�f�+�Rs�MF��[�V&���!<�C���
u�M���E��|v�c��9
)j.4%A��P�/]]��$0�Q^��X�J�����-�]G��!&����?������#��j�LwG���r���'y�l���v�I�Z��`��/^�,��n�Ct�F�5�g��_���>�����y�@��
�z�����I���9���B��*�E�tr��v��"��c�yp��C������JfIL]h��'8�$R�#��^�}'����D
�Tc�M��y-A���Q�d��Q%�
T�]N�����a��XekdC�C�gX���k��B,%�g������S
c�+�9N��l�C�!���Op�y��s�:z�[�������;�"`���B����B����&f/�iX���|@!��EW����������-�*�o�Y���I���#���',O���]��JQ{/7%@�Sk~5(A�NXR�Vi�G `3�0���V����
I��<'�_J+ �������%�)�S�$�S��,DD�_�J�,7>�E�A���Fl3���k�P���:��p'�}���

�������%�0:T�6��Z��+=��Q�Y�Q��4���A7
�=����J��9�J���6�M�_����F���{��-b��G{I_��T��ITk�xA)P��E�<��)���Db���C��-�$S(Wt��^���v#�Ae��_oI2z#���<U�x?z=1<�����(�/�2*��(bR��)��dm�B��fP���Z_�]L�FO��dB������ �P31DZi�cg����{*7D�d��G.qU/m��l��b:��6�h����'H��������@
f�,���wd��&����
'�MK��(>�)MZ����_R
�7�
��n �r3H������riF)�Z36�po��������b(7��y�|P����HRQBZ�E�)���[��h?���'�^������A��^���������7���`�R���^D!�"Fn�����81���x�b�y�0�?�B��~�E���V��?e�L�J��@��3\��Zx��v�yo3Z!�h�Q_���]��A���r��/k�B�m[�	��[�	�:%���n�������E��B���2����0C��0<�Y}dxB�p
o��^Cw�?�T��@O���e`��f������G���5���Q�?!�)�+7CS�[E�7<N�R��v�8�?��R�X��EaA�����@����3(�P��:��5��>u����h��Ig�����k��=>�!l���'�Bq�m��[�c��M���(��]�y���09�����IV^7���\0k\�'j7��������J�d��Ea7�Q�(1��L�����e�S�K;���QJmV��3�!��|e��\h��jO�/�����e�%C�F��z.�����W���(��]�$$�q��=���>�drw��m�x�|������PH�r%9H���Y#(n��(��4���j��j(wy8P��=��R�a�~q���W���h��q(1r�}�����6m�C�I���JK�6���L��y��DO�8�V����=�
q_�[���7=��R��������D����@?�!�H��P�i�-�>�7C���W�7c���6������'i���������OM!���Y�����$[\�L��{f�_2��d���v�DI���54��q����~�'�B�����E�a�m=���g-�'�=�}/�ii��3���dl� �����s>���4�}����
�C�+���B��R����H����������vu�/��59�M�	��A�����r��N�����O��R;�oB�&4���;�,�"]�5z��-F�����`���������G��q�UZ;��&��f������,�i-a��^�/t]�����!Z;��G%<��Z���F8�.��va�`5������2MF;�1
�����y�W�'���j�C�C�������H���v�ds��F�����1�����] �����c]Z7h��9���XC�r??#}�`w'92�EGJ����XYa�B]�
*�S�-�x����;��#������ok4�E����xl�]�
X�%nhB�u&����}b#>g?�W7�Tt���
DLq�u���IfV��#���/���
�������![om����$4�b/�0!Z�~6�#��Q����E+�2d`�#�
U����!�t�;3�PT���,P�8Bc<�aB���O�xc#����$�K��s�����%#	��]vqhH�:1L��z1�h'����&��5(�1���awXjZ�1�O/��F 6R���JL�Z���S����3i�{�|�Q��5s�=��"�bv��HOR���JX�Hp�)��r�F��������tPm��`a���pDeq����
�A�{�`$�Q?FiG���{��t��)G�(N:8ta�F�-7gf��FG���tmm����$gm���V-S���jk)��i$n�>���{Q�6�/0�0����#���I��|�G�1mG�P�}D+���!�K��GjJ�Q�2zl�[�-K�h���9��h�:z�f�0��m��
�������Xpi�V��l��f>4Vv��I0��3E�"\q1��Eq{G�{�8�#����a���Q�>�S�u�0�P���.�)�����HK������'�A�R�u�'�B�g���lk7\0m������F�m��^�k9���4��
���o�	Sm��7�'QU��^��l���(�Rj��j3f�$����:l	�+W��k�O���,��1����`!:�A�C#	-C�F4j*t9�)�@�,pD�F�C�d�}���{���L�
�Z��D�h�>O��>����E2�Pa�������r�a�-��%�����p��V'�J!���mL6
1� �r�w�b"�T���>���xt��r"�=�H���~U��,����c�"#�R�/_� ��a���u���+Gq��Hz�t���-"I�*�/���?VN"b����n*
��G�U&�� �^�1uR����]U���I�>O�0����zN��%��M���x3���62Mq���F�%��<��$��|H�
��B��w�>��}���w�����~��oa�}#	�|b�S�EO�����Yc_�������!�<�dN���4r���{���j�P��4�nF0�*m�g�����	J8xG��Y2������-Ac�T��5dF�o����E��i��%	LC�����<��=2��IY�HF1�k���~���J�7T�Q��!y��3?{QP�FFY���g���FnE$yE��4�!	C%����y�zh���g�<t5�g��!
��������|�x�7da 
�<"!�L���g�hT���1�B���� �39{j��T������73QR�?|�l��E��
������$S��� -t�@i51����;��tG�S�4.t�+�Z�F���?Ib~	��K�x�����aA�Y���Q	�a�b���ID�F �44"�)Q[MI��d��L`��2(F?_@DZ��C��.N�e��P����4{��;>G�1��eR�����SE�4<bF���sK�ixD�j�e7N�#�qW��x�jM ��2$�4��-�/�b���`��3�Q2���AH�L��������������������V��,Yx������
�[
T@�{����r ��iD��	����"�Z�-�4
���U8������G����K��O� �c��*Z�l�1�2E�r��I��`��z���4�3��Q����� �i8�~'h='����p�U'�n���4/\�l���yw�sbe�Jc��+�#b���I{�����(��\��W����h	k�����L����}�`"�M�����7���g��8#�P�']z���Jta-nrws���,-����-n�L�4��M������+�����	K0>��������(1�|�V���d�iX� z�42�o(���(l���',��&#'�(����z�6�=�;p�������b���>��
XO�|��.��4�[s�����B���$�@��e��9}��Q�=o�
!kr=i^���BMX���pK	�X�2N�1�T�Z,L��Jf%�����E&�)�S����I��$�+���Q����wVd
/G�ed�����1�*�WF	"�{D��������5�,�C���,c�.�����Y�U�	V�	�����g���J�e0B\��#3����y|0F7|���9E�2=)B2Pe������B���l��,
S�����+�7�DYXruYA#�����J�A��(V�
S���hp�����+VM�D�b��:�(���q�-0������Z�%��B�����t��;
��)�5�	B���)���?�2c��+��&��Q��h}}���>�xa���atJ���(��1�����s�Fi%��:���������d����
lC
��T�.���8.�P��_�-I��	�D��
��F_��;q������:�v�4�@/cz�Z(����q�\���7���`,j�����PO�/q���W���Keg��9���c���6 v�2� �
E�1��e����,#Y[�X����d��dz�eA�2���>Q>;���d��D]���gp�'�������G���"f4+����.�+����+,�SI���[����
�??(A����Z�sX�����s����D��b8�����4i9`��A��JZ�-2,�t�����$K�i�0��O����b��1��}*l��q�?�r��^���V�2�\��O'��~W�{����h���`��%$[�o��6����=Ro���ec���s!)�2� s98�3��i[GL�e�`��������k4���R��g����R��)i#�eX��U*�y��I���'��|�O��^�=��*���'�&z��!������ik�,~?���
{�]d��s�3�T�Ae;�4��FyI"B�}�>���+�!5��'T<���
.��P5�t���Z�]r��s���}�B�����(��*�n��:��l������	���/hB��'7���A����'5��F"L��d��t��E�D���&��S�NO	�v�4���yB��Nn6�f�:l���KX���;�-C����}3��l��g�*�x9��uePr�=�������>@)�Q��j ��G�O-�����8[��h �B�[~0��� ��E����]��oe[
U/���R �r4��[���t�uA��C:�Cw��df���[��F��m����o��yeIA��V�����p��]�)�2�wT
�&�l��a
��8r����~��_={��I0,����z�&t�������)���X�N���lVK�
^�%������B��4o��D\~�N�y=�x���X�\���]6��$��893�Q���6� WrsE
X�#=E�WhP��vV%3`~��@c�N��4��C,'����hY�O�H;.O�%R�u���oK���y��shune��r���?���Z�HZ��(���������Yx1�����$��F����=��	Mg�(�B��JK����C�h{��D"�!�<q�y�BQQ����x�h�������~�'���ek���1�b��jbF ��^����mI4��cZ�����b��XlV4�T}2Gz2|���nd��,r6���$�g�>�2�m;��	��{�����P��d�^�Vq"�F����y�;T)Q'���A0~��h���;���<��@����#z��:H�]��n^Jf���TE�A/��N���\.�����9 =����E'vMR�Z��|Rw��D.s�3�����6U�'Bj��CR�k�-R�'�~��]���-(3��P~��X5�.h�:&Xd}v��j�������D������j����?�`���t�+z�������L�������	�]$��v�c0Bl�����p�2O	�m���2S���	�Gj`��Q�	�p�hi��T������Kz^��X"�Z%�u��{CHS�,�m����i���.}��h�6h�B���������@�y��L�P��t$X8/L�A?��>I�"tK�����!9@�����q�1�Iv��~So�l7hq�q�f��'q����A'q:��G#T=q�J+���B5f�FY�5"��NK�qo�y�b����u��bw����zg00�$���b�A�1j���Y��������I�<u���c5W�������NR���
��H^'ug$r���w�����YR����>5�{��\��
��;%�(���4�+b����)�W}x��
h�uo
<F�������;�7*Rc�F��s ���u��v�[��R��n������wG�7{�>We���1C�Ye�mv���33<F�,������J�f������Z
zh3�;9|��D������'���9Z��2��1:1m]t(���X1M�)�.w6���K�/�:��70t�����.���b:��>����[���S��y�8�
��`���`��'# �?���8,�l�����!����]��e!�������"�za�LIt���2�]*%"���y��B�:2Ohb�����e�����:��Y��s�1�w ��ci��[�=���q�R������p�.����;k��Q+�M���ky�b����$[���#���b��s�����hkJ��>4�����|��[t"��'S�{x�}�da��D�8'�M�����O�"���)K�?����!��������[lh�q�{�L������L��C�j�NS��	����	�JFT!���&u�@)2io���g����r�D1t�0��{��	,��"����^����r?�C!�^"mN}>P�]��&� ����&P�{Q��w���U�z�qr����j�o0����W�4����������{�%��[]�-��{�y�q~��n���}����������2Y=�Z��d8�^�j�Y�
��O�'pB�wE�g�c�I���6����A���F���d��"/<�9��I],|��7�v$��MIFh����NP�p�������1@���CK��r�w-�d_�|��i
�����`h6&@?F�/���bh"#��1<U���{#OR���(�Q%����NIo���M��pyk��1C�.�
!Q���^�-N��d��>:��Lp�"e��h=H�xo��a�^_9.��}o��[���y�����E�V����{����F����x�Ea�+�&���`Z
S��������~ub�=�)�SdZvy��C��2��_�G=s�f�b��,B���#h.;�����e�E��������@��$���H�^U��~{�op|��;-�5(	��������)��d�-"hTC�.�����E#����O�.
Jn%��d���"M������.���������l���0"��{��]E�H��}T�`H|6���_7�5�/�lyo��~��.$\'R �7�T��"����H�����[�V�rC��X,6�X�&'f.�R�����w�tH9���'�&��r6���{����j��-�n�
{C�,��("�(�����'�	�&�����3����ZC���F1a_,����S;�9���@�a��a���G�~���jX��l��F�G�a�]
A�����*�d�7:����`b4��h�zP;�W����S`�it������b��/�  �{C�
oR�t\}'&[���`��+Q�q-(L�/����X���5[t�,P�U�o3C�r�+{8V�J(�F�	���t)wm%���x�G����[�n�v�����[����r�D�� :|�.�b�����xS��4�1|�M^J����!*	{�6>�{~'w�`/��	u^���A����	�?@��uAu\--�!2�jc9Kj�{��-�~�	X�^*\T��]�Z~SE9&#mU-�.�o���;*�ZWl�*�/���7��L��G�[������p@w�"����Bt�(�N,���m�}���6TGk%R
4+)�'��������iu�%�wPT�8�K�!�ZS(zt�q�=2������b�b�Q--�+����`1BQ����R���'1y������
vE*�~O#K�b��M������Q��������K����u �`V����������+Hl�H��$�
bK����������>�����'Qh�2�v#������0z9~m��(��%z�!+�9��@�Z����J�t/�
;���<����%nM"�"�X������Uf�5b���P#����nF���Lk1^0LSE�z�������?;�)N+tfd���M�w���e0h�&���������>��	��0��Ek1��XI���4S�#��ZVT\=�p�����T���|tj��m�#�4�G��'R���U����5��[����='L(��%ivE$>@��b�@��Il/kI��F+:���D�k�
2�����
��D��o�o��-�-j����XLv'B��-��D��(�r�a#���	���Y���8V4Cb�<6J�����"l��x���J9C/���d����X2t�G��j���d.,��������P@ke���������|FI��1h'Y<H����D�z��0���1�B5�P��>Y�-1��>�Wgy��T�����XLSOD�r D�q���B�""/7\*����*B����&�-��W(��VC��?E���Sb(�K����j�
�C������v)�*�3�7�Bi��Q��_�G>l�V���LY�WK�p�]"�Y-�(E�����T����������Q���&|� o<��F�z5�p�Rk[9O�P��}����5$t�k'GB�*�
5�d��N��b��3��Q���D��#N��}`�m���(��c�zM��}��/X�U�P@�	�E�!�$��;���.�`�����aK���ls�9���&�)9k����:��MP�ql7[~��������{��{U���p������l�0� K����j|a�|]����5����Y!�8��9N4����������g��z��e-�S1RV�E�����	Gn�_v�K������:��A�Q�">��g���ZGH�Fh�WzSm���u�b�[�;
hHr�>��4��eb�
b6��c��C�\5��i���>�{V-�w�_I��<$�&�
���A�F~�kUR����{"p�1y8�4����C�(�� :��0Yc�t�����8�=fP�{�N��5b�$�/������y��*#���]�P�P���zJ��
:cz���,P���gQ!!�_K6���=�����]�����L�Z�d�9�n��9�Ee���c�1�p$��k�~Z9��[B�q_��W����Sy�&4S�F/�Bt6�Uic����sz��(��UzV&��ukcjd�N'#L�R
Z30W'�=����v���?�k���'f��&����;c�S��jg��z�_��Z+I���!P�SA��N�4����7�$�Q�������>��jJC���%^�ba��e�H��z�`�r��{��eLM���$�88�1��9�p"D�=�y}�q�+�L��/+x@u�F���hh��T�[v$�����������������5i�e%Q��{��!�.�RC�@K������
�����Y�qjZ����.��70B��7��$�����	��%_e����1j��L��S���K<�{�C���b'�h�k&!`��bZ}9Y���O���q	ww���B�0D�R5h�����f����Q���B�������{�����25R-���e���4-�)����g��T��wR{	B�w������	�%������Wjk���� ��[L�Z��>��v����sT�*v'�Z���X��i-����r�E/_�!������k��A^��4�
��-�L������r�j�9�N%�X#���h 4����t�������&r�O#t��p���>�j��fh�+���������`���r���e\����Y�������>��H'�������:6�m#^��R����-���7�����P��@l�r���V>�'R������?��/���I3�C���<�Xc��f0cn��^�L���I.Z3fsh-�X�"���6�D\q�����`	�y�P�^�q��dnF"��%����CL�����e$��F�<�iF��Hi��lM��$Sb��	!9-�l$�+�0�<�N�7p���b��W�m��#vF{���}
���9���@
�D
���6;��!�@�lN�[Er�HA&o�y%�A��������=����-8S�P���P��c��)��!��nl�9~�J	`����J�2ogw�$;J�E������:�%�!��$�2��%���i�NU�����(�u��N���&e7C
�uS'67���������y��6�����EW����w	�������*��%���)����~����OrF>Jy��	����^S�a��������NHz����<���"�bt��;9�*�N�O�&w7� ����"t��O]g����D��n����h:�
9L!�F���P%���O�kG'x/�'�Z�U.�����o�s���~k�FQ'J�~	�*7���rP��;�PB3�a�t%�t�I�V.����N��b;7M����@���^�X$[A����l������G�F���De��	��`:������+t�J�S�v�����"��W��(���������w2"��ucK���uj0�q�
���[�>v�w64x�F�]-�a��Y(
��1�=���-(��������s�$td��#^4�_�C�:F��_�z��z�����q��������T�����	����Bj~���'
_F'���Z�-��<�Y����
�����=���n��O�3� x����A����L�����~�n���q���4U�Z�b�(k=�M�
c����z�
<������H,�.7ci���b�u���?�BVBFB���&�����R�����$�5�[�1C�S�p�IB�z���5v�n0��n�K4�:8%L
c�t8"(�%,�Fu�?4���;���XM�#T�����Eqb����Ib�oUxdr�>v1���P�)�>{��t���Z�	�����7�bC7����d�����	}�k���n���;���8beO+��_�S28����� j|OrC��OV�q-~Iy=J�6�_�t�t���iynk�u���0�p����D�	��������=Tw�~��v-f���ARt��4c��'��o.��&Bbz��Mf����[gO��}*G��+)��+v���9�6��mV
���u�Q8���Q��q�qbB���m�������S��$����#��0 1e=&�������%���i�}�Z���#AHLA�.!|�|�����D�?S��'����OQ�Jt��_V�x	X��1��8j
�W\�wk���A�B/�N��#%W&��)#�D�c�aPB�����x�sR���h%�M�$���<��F'2cA��d�B��a8b8��n��e��5�n�b��M^��J�2h�Xg8�Fo5����k���(R#�pw��Zl��-!�������P,���A�3H�QMn�"|*��)��P�6����F���b�t��A-��r��L�
��%;�Z8�����8s�F&h�^w��[�0ZQ�[����V��m|b��C�HF��&���01\��)]�7�<h�9�H������3S��^~C��j�a���O�T@G��W�@���qR2$���&B�	�N&�!��D!���@YV�$1��F%�}b������9���h�5~	wS���-dQ�`B��G��0��8<D�����R���T�;�7�0L���F�w2ux<�D� R�^�|���)������|,-s����\�}���|�45��~F���KH6���p�]���eK�p���S�`Pv��Y��^bS���G�v�0��12��g#Y���c�?�d�����>���=��0`!�Y�	1V��OH��A��k�� ��sy�
����YsP�����)�Z�{�?�g��#�<C�����"@a�8�:8%\�F5�(��Mc��4�d�c�d�]�f�a�E�Hq�w-���a� �H�4����t?�Y,�x���&*�B
Il����k�(�e��@p�Hh���RjK2����X��UK�p��g8�J4�
2b�����s�C����||�� ���O��7��$N���h���_s$H�'|M�1���������]H�|���[�*�=��A��\�Czg�!$��W��HQ7�7(oV�O�z������s�/�~ZT�N#
Z���Q�3�v��������)��Mc&�wl�5�z�ys
���������y���O%E� L`R���4��^��mMj���LA-9z)BRO�
��%�Q�����o9&��N�
��� �$��5��K���+*�f����E|�i<�h�&�2���j�f���1���"lG���t`�([�g=���M����D�1���KG��iL��0Oc
�0�'4f�b
����-��"���hS�a�B+��YW�����?=�S�B04A�1Y�M�Ha�8�E��V����N����7���H�5.�j@�����uq��`��X���v��<�B��f �{���)�O������}a��lEG�
+�7m���|��n�����*a��<�N�\��P#|X�E�CD���aJ���O��G�mZOXWG��^J�6,������a�@�/���	��=��V�g���X�^:�� U��C��3�A��>���83���+e#86?g�����g�b�����(S�F�#@�J������0�� !k*���V������Z1h Yg�)�
�~L����F�'������{4������)������*�����Q�8����hX>��HN�+#�C1�1
Q�4`���F��������D������AE�#F��k`�������*%k��?(�M��n�@�
�(��w�'b��4~�s����t����k�����?n�G�?�|�8O����y��4�3��*��n�<I���N��{��B��f|��U��J3#m�,�9���@H��0_��U�#���+I{����+#����@�N�[����~����:�9�Vr���e���b#7�s�'�w��&�#5�bz�ed����/�9-TT��D3�fy#Xv|F���c]��C�fi%i	V���s�����hM%�����������D��
mV0���4 ���"i���!��klU�,#��������SU������f9�(�N���eV�3"uj[5�o�G]���U�y��Pcm������!f.4][�y�G�F4��p���5�A��O��>{��W�F\�o��Ll��� �����(��"��%��|A�2���LV�-�[���4�N�CS��A�H�%��H����'P���W�m��6���
�h�<\=����!������:j:;0"��b���i������vOY
k����e@�{5X+9	l�ND����{%"��u��3��9�a����X��S$�DK9P�Rd�DGX'��=��*&�d�(�Q���j�x# c#G��f�����8�2��O�Cp��$�����#�������(�,c%a������k������$�2��;H`��
� ��nc���:���:te�S+�����Z/�9�����uK����<��j�@[~k��2u��1?�n�wa�+�!UZ�� 
�2<��M�
Ma��(��2d� #Y�,�-��m��\|�����%kE���N��s��8������f����{�IY�����=hl�?vZ��	��y� �`1T �=� :����]�����������=�WR���N��l8��-�<9�M��p[!���4�`o��Kc����
��.�G���q�bM�3.������8�0���@�e8�e�D8K�:`�LN��tT�l����7A%����i�����AC�m�@A"� ��~�5���m�������8}����$Ti��Mi�E�}��v?1��?���!��6C�k���;�Ak��l�P��
��/�!���SiNM���rx}�w�d�i��G���#�%]BgS�FS!�.7�H��h���D��WK�-�*RJn#
�!.J����m���<����)���Hna�AS���}���4Y�h��6q"=����6��������;�Q��"�R�j���?H@"jB�%>��+P4����m�����y[q���P��f�(���i��&��x>�����<5��o�K3�`Z����w��y&&Vg[�A	Q*���
��k��P��\m���fr��YuJ��-�Q1?-��������B�9��8�����zmC�;�4EC��m�u�;a������;LIt[p]52��h��Tyt�gno	pVm�%�P�Z����Q���Mh&,o�z�Af%��R�U��&sGU��cu�?G+1��k�B�	bl������������C���,*c�(���`�!�����h�C�~x���g;���g8uP�N��
9�&��F(�G\f��m�zu|��?XL��S;�� �Vg�=��f�,�H3��!���Sv�O*B����2�1������Ex��*&���6B���\b ����Ni���J��`C�P�g��R�(�2��I��r���~�PQ$$C]����|���aG�7���������J�m�V���rI`�D`��<�{H��O��l5F�p��"�� �8���A��>�������J�; n�IBY��{��w��]A�{��I�����D���P�lF������3�>!�`�s�����T��b�t#�����d��,*���"����w�
-���
�x��(����DZ�Y�`�bz`5>+Q�N2���v������O"��)_�Y��Iq4	AW"�M3��6�VjV�>��a0����?��N,����<5JC��U�Iy`4[�g����P�<�����h�� �sz�;��D^�S�j��-���1��FMn�,P������[x�E����]����d!>�m�'fI��<)l:&��S��~��k�����$���	
���!�'�Ir[[
1�A
Y�"��	@��^�8F)*; N(&X
��f���DUo�xM�u�N(F�Ih�>�\�y[)�+R4��4���PrA��n����'�I��'cs�I��>�)�i�b�`p��������!�YV�i����x��63����4D0?�Y �1L!���A5��c��t��?���i/j����c���M�(i���l\�����E�A��,Z��!p������)]��� Yz�1��T*��lN4p%�X��k�����!����[��p��w��-�ncTd��A����w���c�B
m��]�.��;Ye��h�H������X��X�(w�cN|�Xue�B2k��j�DE!*�c������G�$d�I����C��?C�z�@�{������3(!����J#���~B��]��V�O�DKOQ�Bc�C%��yfLo��t�6w��[dt,������7��������� �h�"t�h����gEQ&������6:�-:�[�%��!E���fy�hF��p�e��#D
�hE�_�.zj��/�;�	ae�l�]������0h�yv�4
���N}C�""���������K����xI�4��W&V���W�*a�'6L�/��B����1^�<X��X��p�K($J��iUtO����c�����9I���}����������@�Y�/7$o>'� 3Y{���fR*��j�7L`c�:E�=x���X6�O��U��#x����9����B�Lb����[�=��I����
��=<[gZH�0�;�D!�����%
��"w��lz/�����4R ���r�l��>��y���g�E�����Q�)i]7���+C�d�O}B�U�{���"��{���a���{��TiN	���r��?E�>D����?Q�A�p�U�{�*��-�����E���~�^�1���PDk���5�hM�w�KD�E�V�}�������Ptp��|odh�����������+X�D�.L��G�<dJ'hO,^2�zo�1
����s�e;�d�&y/��_<k��rr�g9B��p{�� ���_��{�oLk/���U�����12��}�*JT,��v*`������|�{�"��j��di��Io�^�:a;�9�u2�{o�!���U<5qd�C,���0���j�o
�D���"KJ��J�r�Ei#- Tl�����!���{#������-V���eq[/9�QB�����0r�d�@�����H�K��i�����:!��b�m�8
���
�V�G�8��?�V��c�B��v���'o�B���1� �T��X+3��.����F��\K��z;���n���iH��V�i�D\����(�!�����.�c��u~��������p��N���J��d��^��N�#�7��#>�����Bn\(�R�A�5�q�5�B������{D��;��.$�>R���\4���>F)�d~��2h����q*��6�!�-�[�y���U$<���7r\!���K~sw���s}��0��!IM���
���{�%��������Q~ro�A
q��x5&tyod������`M���||w�^����#�O��.�j�m��Gbl�F~/��#@�{�)�r[�^��D���:�����{��>��h����Iz?����|Qh�>F�������{��?��s;a�w���]��&Y�pa�����t���������������})�w{,
���VQ��#���y\:�,���\^"�x'9�����Z1p!�E&|h�X����/�'�f�6��D����%�y���D��u�������J��{�F`�V�_(c�M��a��J���i�+
+�p��R����!;�J����E�P�B�1���)?��^qhw-4�"F�Dup1�!q��^��P���OX���)��0���x�J/�L��xo����r����D+Q_���G����L<R.�:D�sP�����0�!W����R���M,���o����2�[�i{v�S���m�B94��� W��Sq����h
��S}�v��@YT��@
A�-���������
��cSS�V^�$i�y�
��	����Y�%�^��0�9k�p���:`�~k���OcT����g��ZH�)��b� E�����=���J���S����":}��Ib*!zNUczwGYP��J<����{�-Z�&�Z�Iz}��NF���v0D�� �.��6�f��u����P+��Ux��~<C�@9����}�/��^yKP��
G�Y)R��H�V�Tls��W�#�B�La��\O�������R�����3�5�y];9��_�#�^�eZ�	`7��fv���[��&0[K('e����	6+�O��b�
��>������!�'a�
�����T����"�1��";�R�a\+#D�P��Ny�"s�V�aM�(�E�hoMe�f$5���_DJ!����uh�b�/y
�v��
V�s��$h�&q�~�!�i)r�Z�0BJ��K�5�����j���4hZ�K�x����"Oh+2���H����)gZ�������8��~D{)�`������%�g��bDA��/)��� 
�}�"P�$��x%����MS����2�-�>sR�U�>��B�_�'�Ad��jha�g1��4���9���y!<�D�f'4����u������O��j�j��~sHD�O�K��4S���Kt�<�?�yZ���3��X�O��
�q�yt��bQ����c"�{�!����4[�i��A6*bk���O��xj��8.mQ}.WZt�FK�Z�m��jj�F3�3\0QVK�qn���>�'j�~�S+�AdB����
H�TV�.�>��������	t�����~8�c���j�@�1�^����-���bO�s��A���kr�U��s "Dq����k�����F�������D����r^�����E��7��s!t�g�^+��2��F6s�z�wV[D+D0d|��G��8c�UK�u����hb�m�7��x4��[��d(�&��BU���CX�-����dY?��y�x��M������
E$��5�����@�wU��6����%i��O��i�@��!��V
H�=�|{Z��"r�Z?@d��4	�f�����R2T`j������on'[�)�^�fD��������!t"L�&�Z�!�#�[�)
��{'X��o�/qv����k|��1@��s��_���$�u�1���L4X�F�s��(tu��X@C��jE,�y�����%N4��&��j��$���E9B��q�5?�$�����w�@���}����]�)�<I�����g��2��x��
����{�6�(��`d�����0�V��de�R��a]������L[�����%�39a�P9]��UY��7"�HJ	Q�2��������{��!Z5��gs��������8��dP�$e0iN����m��T���c=A`�EwD�%v�bv.�� Pu;�DS��-�]kuU���#�~9���f�2pVs�CM�ww��^�<�'m���2s�F�����M��;&z�}��o0%|�L�(�=�������h��J2�Z����dQk�/}�V�6�w��s}Q����u�g�����#-�� ���v�f,A����kFd�� ����[Ivzk�r@�jZ��Zs��Z��1��L*�����V[3�P^�J�C���NW��N��e4C�-�
�}e��1D+�I��g��y{#���)��:QZ���1�[���UM<��rk_����)��
f��?h��`
l���g[��%�Ab}�X
l4�j��������8�%��-�$6����|�Z\���m��DO��i�7�8�L�5��������w����(�?�;�Q����������f�`Jj �����B�9�y������M���I�����3�u�}�[������aTv��G
u(-���MQ�ik
��EL��vh��^��J�%a�����1P��{����Z�r9E:�f$���sA��FA�\P4'k�F�����-@�(�We��H�hF4�m��\�XS��2��%P>5�j}��q����t���|���:{z���{W�������hhf���[QC�}�?����rU�	��ds��� sV
7��o-��s�������XF���t�����9\3Z �j���z(��bYT�Pt+N��|�����=����@�� AY�$m�fi���-B+������/���v#�'�s,e�����FA�H���h�Y�G��I�6��h�6;�#-cw6`2��l���v����1���.����T|2Dc ������o���T�6:CKAl����6'���2Y��5:�`�l���V$S����e�p�x�=�?����5:x�3�������G��������U�>��+���	���d6O�����~[���7���~��1p���� 9D�l���N�����k��P��{��5�5G� ��z���Jp�8���d��*�>�#��3J+akz���
�i(0�������i��Lt7�"g�w������5F�H�%>9���~�������D�w[(�����,��AD�{3�����v�^���_SF���N�3:s{�4r�U`E�M78����9��km�=�	���w>	�2�Gn$�p���DxW�.�ep�nt�W_ Z����"�B�*j����m��t�������gcJY��S���Nkw����m������'��f@t����$��v��01��+�����1���mH:/��,P%(E�>r�D����v�d���P���h��c>�F�gx���`�C���4`)�q�F3�=e�l�m���X�{`�'��`�&�*l4�	�c�k�G��b@�`�n��F��T��^�����XF�a�������\z�Ar��Ai�XY�!�������O$��g��?�{A|�n�@M�p,S���}Dc�dz�v�OZ {Y���6A����{d��#6X�K�F�n��Vl~���\��PI�x��==�(���l�FP�v)I�T"5d�h�;���-C6k�
2������8("�w�3���`
�bw(6X\�D��n�����������:E�l����������s���n�� �p7����:Q��ae�� ����au7�0<O�Z��L��H�+�oG���O��I$�L%S����A!�j��q`�A��e��������/��D��q4R��d��T>�Z�� jC��i��)�=N@ �2ZR�
]���B�*���<H4�8?���1_���AH@r�Y���z���x�y���_��U#�?@����$:�@�Z(~�u��E������"/o�����mZ	H�����!�L����;�
�����Z@N*��D�E�x��9�"�!>3!Oh���R�,���P�1�a��:�ab7�#t��5���-N����8�m���X�\��5>@�
��b#��x��$�/��[�X����G	X.���g?��
�6�Kh\�P�v�P ��!��8���%��s!!�����	�� >��������%L�{�;#8��Nh���������+��!xeD�`
����y�
c2-��Ce���A)��~1��*g"�wC�c���cUR�r�n��6�/�&-�X"���]��eg"��b����<G}|�H%p$3
3���bY�!�m��:oA�O)�d����'�h����*r�����3�!��`���yZ��%�GIL��Lc��ai���d�0iN:��04�:�D?���)�=_,�d9K>-�;����h�:?5=jG��+���Y�N����u���,/?N�@zd8�w�$i�X�1@v|���Y��w��@?PB�!l�C$1��J���m�#��[*����x%#����Q��<"���������!��lF=�nrH4��pW��%s�_�)��t�5&d�CD".HB0F�I�W�j�:���x.��
'H \g$Z�����������o=S;���l�DWg��ad����@!�C�b�X�(��3iE��i*��3�!N"|�p�I� ���!k.-��>�����g��x��+;�g��K����l���7�����"��
h�1����{���;dw����
Y��/j�>E�_����4�������l��84l�8$��K\��q�i�8,�cWz���-���v�mM�14�����2�^(��ZY�v��1��J�e6 �i>������4�2d�_�Q�0�������#��t���>��c�R�f
�����0������0s����$8���A�i������%Z�-��LCs��4f�Q;=���52
P�7�h$kR4��OL�D��q?�m�3���::�,��mF"Dd����gR����mn��z��=�S��b������u�k��e=)Y)���X�4O��]@��l1|��;
]��7}���V������P�������
a5[4�MX*z��\h*#�`Ee�,�*���Zmf���C������������E������Gd�����f���x���4
f�= �wSe[�a�z&B��M\���g��e��J��1f�d�!1)������������FU��-��Z��w�r>O��(e�h�G1[�b��?C�?��X���q��h����t	mQ�l�j)e��$�z#�i�@���9�N����d�Gl!��K��>u<�������Q[A&��x�:z�M�����K���IG��,Xz��I0�G��
&Y�=����+����)AC6(�sf�����%\�d5���������1kzV��A
�}"�@��9b�.��M��V�H5w����
�p_4��kw��1���	�t��;��C�MKJE�(�hQ|:�h��0�X�'1�����v�N�rW�p���`[q|��K��;{���4��E�yx�M=��L��h��� ���4����sI�U����!�0���X�����g�n�=3t�%A�og�a��RP���\���kF��aq��<��B*�b�L���g�i\�E�y�6��3|v�����[r���:
V�t -�nT�3���������e�r�i��~���kV�Y�A<�]�*k���"(�D��dv�U��@2�Q;��NgK�g�����_�� ����9�J��������al�����)
����u�����
F9�S��1"B��~�.s-�?�F������=>���F'Z�H����V�d�`��b�W� �.M�ct��9������Q������p������'�`v��Y�H8'���/�c�IgQ���@�h�?8������V���o��V<����R#�%��D��A�[�E#5�Fs�iDR�%<�w�������~���lu�s��V�w���m�X(�d��������n=��'K����Oz	����Z��yY,���JA/)j��.GI����'-�b���3$��t���-�3&�*6��Mz�2�>��]��������Y-����Mq�)Q[o������Q��pd 5:�.��j���i&���h��X$�]�'�s�3��U�x�D������t�K���1���Qo��&����o.\�Vp��x����%��)���vR{�Y�+a����a� ���d��P���]$P�b��M0�GDe�6q����R'Fx����6�vFn����n��:W::��W���iQz	|&��zw����!h&G�
J^wE@$�Q�������I�Dd���Qk�+�2�S����St
\���/{A��Ap���YN�`������ *\�Lnm���/�Nb�O��v��Y�~�8jl�#�`	�X�Ht'���]x��A�0[��\�Adu�
���B�|`��r�5��������Y9"�AP��a��4��}���N�Y�r	Z�$T�(�m�P��e����D�*����f]��{K���?�Lp	T@��)R�i���N��Ye1d����>���������)(�K�}yv>�
�������
c��_KXgbh%k�&4G.������[_�<y��f��e�'Z���D���BN����$zY/\ 3zYB8.��`H�@_�
������c����G��r4u�0l�5�P,�fY����u�u(9f��V�7��kURxc9d�>���z2���D"������h�'�g�y��c_�h�+�����pO�s�a#����v��h���(�l�Ep�����������L�-t@�;��~�9��2{?.�����!��������{�J�Y��A�� �M���M�t���~R p?fgf�$��8=9���]����3V2��-��,R��MV�mED�_�F"���@�L�S��i�]�U�������L����",�b��v�D�R0���o���:40�z�>�L��0=`���~����2`k'��Ie��3l�(a����A���v������^�p�%��66����Y�~�h����~���G�MV�LNc4\�t�@�������rv!�p�� 	'k5n+#��������o_���|�v���GX�6�����F�2�w�B���-����i���z��j �vE��m-�Sm�Cbc�R!�~��~�!��% brR���-��$�EY��/��V�=G~�Y���\���sFz�yv���U�[{��]h��� ��V�&x�xFF�4�{W�{l0�&��|g5��0SW�}�/���A�=���]tJ�4�W���Y�p�s��-0}WE,t�����1(�i�f����-e��$K���-�C��1&/4��>j����H����4t�jh~w�7s�3���
��X�a��}���F	9+����|�Q���4�	}*�����e�o`���z������
\|�0���x�l��2��� >�������~��$����CY,�FP��E�����5��@��L��N��������G�� �g��M��(�4{��bP( ����lY3���3kx����Y�d��X�_��Ids[V,���N��������q��0
�����}F��i4��D�By�qdW���f��%R��j�X���}2y���-��b��r�n9��^@�DQ �=��L���l/����A���|�-X$�D['����ZG�L��c�����8��R�����j�cSv��Ai>Er�F�_��D���Aj$�=���Of�t��fI��@|K�����=VH����E=�j��9=�8�� ���b�Y��9jT'��/�I�ne���c��[�[oe����
���6����r��=Q�:�2���V�#�cG��#�?%*�4��������h�`L�
Qf�G�[�J����v[��]@���z�>�@p����$F5��Y��j���T�9����
X���I��9G;��Q�W{>�m��������@G�F��Y�%�+M����tM������s�.���Y-��3����Z���	��E�Yc�:�p��h
�������$��)�}��h������$���k�o��s4R@z��������l�����i���� ���N��[��|v����@)�S�X�!��>�x8�H�q4Q���F6D�adM���_�,�">�q�M!t)�&�]	������G�A��V��pxYv�R�Yyib>N���2c��g����L�tB�b��������[:���3��&���-|
��e��(������g��&�(_�}� 3�I�,�@���~�K��|!��?3�;vf�CUO�w<_`�P��D���n3������Aq="��0��=Pvg_��l�Y1�S% ��Y%&�J�L:VL��D�c���� ���z�'��8(y���Y�C���mk���^�P�F24�����Y��<f�g��G a�Rz�ni/���;��?�(�.�^��B_;�?1�=����x76zl4��{X-�$?vXZ�W���)�����,��|K���������:��=�C]�"��8"^9�X�20�5[`���KvZ��!s�a�6�����gAd�z�N� �X1��V�%���y�@�0�u�Z��k��0k�:$�\��x�u�&�s(~*������O�����'g��� [�!,����k�@w�%� �������������P-�,�� 5�e�L�w��*��Q�D���3�#��1F��������<!��?��('��w���l����@q��{���%���j����
T���d%xG����U397�#5�����}�4�w�'��y]�����7q��|i�'^��CK�K.(;����,�A�!����D���#���~�vS*��4��M���V�>�f���B�������?��}F��t�d�d]��z��B(�{��������������������{�KCJ( �/i:�����Z�G:���gw$�u$�h��������V6R�YH��{����u��f��!��I�������(�X��F��7��~�Ww�qpTM��hm�8����t[���V��>������{$~/d���WU�J����)���x�u��%�����u��@�8�!��w��#(��+%,�w�P1`���YE$$�&��wP��0Q?��u,!:��t
�y�*%��l=6�.���X�d������;8�Rl'#�s�{L;���d�,�����	�����j:r_y�!��`�}_���l��I9�r^���v�\x�#F�Sv�qd�\��V6�n�{	u?X�&�;R��*��D�I.!�ag�����"����E�b�e���>W��m��_����hj��u�WA�@�6�F���\����D�����"
���E>=��T�:X�#�����O����:�ck��=������S�T�^F��h����M!����>�;_�<PI]�A%X����P��dM,
��b29CF�������A���h�q����q���:C�"I�c�+��~>`b��HM*
U��7�_�n�G��o�����\�w�J��)�o����$�aH��>��Z�������A�����R'H�;�;�'v%$0"��"xfm}�����"xV�����JT��ud���JZ�l��kXs=>&c4����z�=jZ�
Q�I/B"�^#\�sVZv���^�1��4���/���`-���v�W�}BE�1��C�;R�as�1�&��D��A����uT`��L%&�	#6{<����A��\05���C�I�\{1>��Qsm�V���Pl������t�L�/�E��x�w�"v"k��\S���AqR{q�D�H�3�:��
��{�|��h���2m�f9=�R]���R���I�����kZG�)���p/��9���{	u�6���q�iz������������Y+������GU.~p�����D	�#E;������U�kh���VO/:.�f�]�7'�o���t����� 	�I���h���z3E0��,#m�t���`�%�
�����������I4�����I�N���n��h�@�c����P/vtR���?EI���Ul�D�D��-m���f��P
:E'B���i��m)�'������~G�eXY�
R{���Y�Eer����b��U��5��3G}���k"�8�e;�@��-���#���������O��|/d�u��R�����I�yVT���������mz~�S���z������d�.2\�8��@X��|��Ma�vr���MO������Q���kE�����d�Z�����w���*�����x�\u+�����^z�����L��e�!�5��hh���`'(�Qc�|��h�zD��i)eu��
4�Q�|/��a��S'����Fa�v�/���)����]�@Zs�i����w��W�NZ��3�.�Q@ES��x�6��(���^�R$N����%�=~�����M4�S�FQ����$`e��	�|?��[':��! =��o/��q�
�����Gc�����6G<\M��8o�!@V
���7�{l(Q��d���UQ�;�����s<>A0�b��:�:��V���Q��&h�E%F}���h�z���/�����E�\��<��9;�>�e��������8|U���M�j "D������:"��^�A���S?������<Y�V^-^��F���=�;���>�!N�N+�X���"�����$��h�-��8B����>���%q���W��!	����K��
d�k�]]�g�|�����&��E�_�S6A,Pf�s���d4M��
��dHe_� ���G�����Z6��'$��O �6�G�Q�H���&���L|z��"F��i�y-m�l��;@^�Yb�����k�=C��~���d���m�X��yzF%l��|�Q���ln���~NN�n�)�~�����FuB�\�����^�M������h���U�A��m�5����v#�y�Vr��;�w���1��
p@,O8P�q��S�3�i&V���A���]CE?�Q���j	d
^�X�^���;@������4��{*&�
2��
 p����M��GQG�w8�l$�	8��r�h)6A�.a������F��In�?	�����r��W����W����t����e���I�s��E�j��f>W��M�A�)L���Z$�����HR�iG�5!X�e��P��������4�W��9�(���f~�fA6t52]�H��W[,���uQ��u�f�c���L0*�$�E�Z������)�_vTuV�)e���
N��*����e�R
H��&��t%���4��������W��1��Vww����WA ��yH��d3�@A��
#�Y�x���W���o��q_�5���v4�^6s���.���sU�f�W�II���SP��]�;21,���]A�"���.�:n�����A���hQl��G}�fQ�~���9��8@y�rFd��,J�R�������J���������a���R�$���em%[ ,:�4c� �����X��ki�
F�*7��#��	��`z80kF�&4@��(a`�L)��I
�Z�>Q�zs$1�xQ6mo���"�>��#�L,�{+v����fr���a�	((�G�������M��*����3V*V1������!�6?rTV6g9H�������d���#c�/���'���t���3h�ED�\����(�����
9����i���d���<s�k�F�����Zz�;j�fq`������%���a�<�����I����)��g�������E��J(�"e_��������g��� �T����P�\H�*����B!�h����uK��_[�K!$�h����:����
����OT�h����i����
����3	Q��[���&
�yG��W;I�\��w����P�"uv���at
s������	Hhi�������w��A�}��4�U�X���/?dV��y�3�DYf����n������6����e	��%�[������@	�DW�@ZDBm�(�>�%rq �
V����.X9f�gAQfMo���4�Czvt
���L��/Mp=�71z�*p�.���pR��fP";���)M(N�x;��R�w3�?r{���H���.=���3�
l�"���h�fV$�o�?p(���W��z��&����"��	uh"���T��5B�z�_{1�������&,Bj�r]�3������o�����tk}<���K��XqD@��:�C��"t��8'U<7c���2��~����2���6���j�e{Nc,%5���nY��������Y�����9�A��[����>vw	F�����
�?2��Y�P)���G�N#;
��Q��~xc����h'���;k�B&���S�M�?���������fmI�F�a
2pGU��]p�'�V�av"#������U��9���P�5V�������=Z�pj�ug6<��P$�D������0�trX�QR�)	�����F|�^L����m�9O3S�wcU]�{�ka]��p�0���2�s8�X���m�U���I���p�{�^�W-��(��k����H[��
�+��E��_y�#^W�@�nkM9aV�{
�bd�I�n�B��?���i������`������$�#�Fv!�~��?�{SlFY��8@���E|�n]�����"z�m�N=|t����5��io6�AV�F�n���7���.�����yesW��Z��	��z]]8t$\����8`�VW�(]�T����F���;��O�#�I�p�>K�;�����Y�@�u���.��E'��%7D�h<!���v
:M����)b�u�A�xy�cE�D��DmXK������m����� (z�������g
2��t+~1���Zx�RF��p�7z���u�*T���}�"��3t�����yt
������4��M����b%�&���J�����Y�!|��������C�u�(����X	�O��=v��?�P\dTp��
h�C���B�TD�S7�Q��#�����S��Y`B7��ls?��R�?��1,�4n�;��ei�������]U8�Q�sp�NZF�z5p^���ktgEG�k����#�v@�����0d���v�����q������G�Eufsw[E_�P��}i��l�.��~q�������o��[����3
f�F
����%t4�� O<�	9�D��t�?G4�.Tf-���"a����l��nA�{h�������0B�H�XZ8������D���5d��i�������x��J��0fp�����3�d��f��Q�����+fo���{&�[�{7��;N�~K�L�9�,�*b�'����e<�#���B���V�Q��?k��6x�������d0Z�.�0�pO���F��~6��/��M~&�p���(�\R�_�+��}U��s?��m;-��r��
��������6�6:3��@b���X�Q����a�!��D�'����e��v��
�!��c4��H���;�!}�e��k���++������	�Xx���������s4����R�Ifj7l�nC�N����1$$xd�(Y�"��05,��"X|z��ql4�.�c����*r��p�YQ���<�!��G�,ws~���G�)�Y���G���(���JZ�.�k)z# PwZ�\S��
A��rq"�p�t���������^^eR������8��"���:F�w�j^�i�He�Uv�?�����l�:q$���������k�3��3��F[��lP"���g�
r��LE$c��6�B�>���j�5���9
���� '������
�B=�
�����2��@:��6�9�`�Z�b�������dU���%��O��	��Fj��
�LYZD��8|��MJ�)8;`�W��M���A�nwI��Da��x
����f{,�>&�_fO�.J���@���g�z��L�>@��~��sffO0�E@n��:�%������if����i/�������z�sI�h��L�E��m��c�#�H���a��C�)��+��5#C@��;r���r����%t��OlD����@h�3���X���b#&�����������$xq�2_��u��>�e��,2z�������`���	��n&�t��:��Q	���S���q��0�!dc�Z�I�'1�q��7�gl�_�����e>v)�]�o��]B���Q1�]��)i��x�������G��Ej���d�/�J�Q�0��4���������5"d
�`���>��Lh8�c��B��;j�O�3)')�NG6��	��V��H������p��}��S����V �M9*���@w�V���e7`��=q��4U~
���a}
�X �PDT�)0�~L�����h����~���5�5���l����!AS�Y%�w���S8D����8
�������c��;��u
������v��I������z�=�����[��5���#�~���p����Wfs���9��"/�)�X%����Q��;��y��������U���:	�Y����������!d!Kh��~&l<:�M�$�
����G���M9��?'9�u�
3�0�����jH!# a��-������Au���/�!��$`��s��@�3��Ql�g8p �vd���L+�~�a���c�r��H����u��'R�OA��3����E����$c>,��,�|�/)�"���\V�X� �bG���f��.�����������/D2�)� 3��VV];��n
~B��X3���Dj�������J�T����l
��8*�Wd$�y��0��t���E�v�.�P������4�l���]�w����_	l�����7=j����;�4�ul�p/q��,.z~�HpVZ�
:�������|��:�}�"��\*\`f�E�]Z��y�O�;|'Z�d�s��������*�Y9vl��q�~'���l�=vpX�"���9��+�G�c�y���y��|jZ�p�����L��� ��A(S@���!����V7����N��R��~��P��|��\_�?����W��hS�x����� ���:@z�"�;�6�-�D�����>�yuV:�IA��h`�I����� ��)���OH�j��X��j��/!�J�-��m"��O����_B�����#|�qY�	���������s7N�������A������T���}�0�g��������H���	*���u��F%�f0�"zUk�jj<���F+Br����������L�y,��M��? ��o`D��%��mw�A5Z��	��P�}���j�e���B�V�WO&]8|D��eM���r�z�H�K������U���������j�J���g���1�PX�C8w�G�T���h����x�����bP�����W��C2FPBf�� `r�7��h��(iqJ�e-{#�g�����]m{I��[����g�,�j9��~-=�&H���Im��h
/7��,Nl9l�~�Y�u	bP w��:����I���
�
��$���~�j[p$�����t!��ag�E���Ne�F���0����oq���9�����R+�5�o����pa�I�����l�!������VvR��QG��%�����=�i	�}�{[�����H�����@���egSa����1�P�����@��>5��v^�8�E��e5�	��_a�"�eV��h�����.&F��Y�$�%TbG`�Z`=��Sp��~���anc"'R�.��1�� �;r]B)0���������	~Z0�:+�=�*�������n�p@��~"j�g�#�<��$��d{����Xs�4�n���K��;MI�f���_��}w�08��l�)g+��d�eO�
���,y9�����1�$���{�,vk���7n�B��F������+�>����]Yv��B�)"m,G1$c�c�d/���>��J��~���-	'���3K��+M&���+�fo+@�>K�%�w����\����6I���k���F8Q�T~��Cx�{8hI0����m����
�R�4�}������1�m�n����3��v�4�d�yc;@k
N��g}`�Q�w����F#�����}�W��8��{�hE���m����Q�d��n�,Z_���q�����k�N	��{��w[@��hjD����(q��_%S��/�����^�Ct��3���w�����h���9q�Y�n����[@1�2�A?�YyZl�#W5����i���!H��b�����S�����m>�-kg���t����{b�M����5�w�U+����p��A�t����iG�h"���`�����_��2�w/uX.��vR�x0a���GG��2�q ]`j�����;B/�
�t`��m��v��Ti�3��m��/�I�z�[�D��
�H�lPMd��
��{���_�����	Bo�jd�:SW�-��D'���>�K��1�@�U�G��aIG��y��5��p+�V��P��c���s�X���������`
��S��-<=3�.�Q���Gg��KY�M��s��$1p��HW���-��l�w��4���D���//z���m�
�����J�����8�
W����F&j3����s��Qn�1��+u��2��P�L��H��&�a��q"�o��3��"�B��4�8�aVE�M�������/���Ea?^O2d�������z-��oG;`��UxP���*���������S���4�P&n
���>�D����[��<�c���u8����Hq�m��&��0`�Y�[������@�f��1�����-���\�P�E2�}�������[D�s�����WB ��3�-n<k��-�aE]������wC�,�0��w�3��~F8L&�;�A���t����������}���M�������ee���fv���\�df!+����~t�%0�h�8���j�#HY�8�Qc�M��# �?]�E������Ry�����c�]<�~��c��!�Z�D<�g��Z��`0��1L���[\��4���{LwjkD��vH��-��E�U�7;N�F��a��	UP���6b��/�a��'���ag7��UY�z������hd���P���S�b[�;�Qc�8&�VdX�a��sC�F9�0�<����Vn�{#���v���%���wj��aw���$�.!���� "��Z�iR������b'R�����#�>ZV��!)[����B����R��pP�������,��Sw� H�aG����-���Q����q��4������c��les���s��a�((��6l\��(�\���k�#"����_�b�.'*���0�H���V.`�/o��g[ M�9{���G�����`��i�}�cX@����-{�=Nd��~[Y�dO��@���!�~dG.4 ��@�3=�p�Z7s0R��>?L��(�;nY%=������`���m�����,d� z|	�������X����8���(t�����8[������JX��E������#� >��8�e�r�����
��%����M�|
����F�6E^�r���Y��T�����%�~8	dlo��^��Rv��*a|�Izp�����RV�(�C�4�)�6�(������)�*��T��
���5��q��s�(R���j'�)D�cP`�G#�s��l�p�#$�
&+�7j����3�#o��L�f<8y(��6;2u�q&�=�A�o
c�<<��1�)ws$Y���B��������X�]����M�F4R\�"�2<����oq��VKt��y��������f����\���n�e���q��ft�y��S�e~�cz{n�S+6������/�#�J��K��Zi�����V�#����l��8�}�CJ 
V��j�a�Fs���	�-�����{�P#���\.@�H�D �d_��ti5�xl�tkP�����S���R��^�+o-�z�H�����H��� M�;��-�J�U����5`��H�a���5l'�'�K���_$��;R������@D�.�:��fr��7����^+������!�G���QG���
<z��s����)1�����k����
�l������v+.��j���1''����^C-����)��V(�!������G�&UF&���f3ux�p����u4keU������l�����$���U�A&�w���$��{
����J�����#������8vS�(`��9�����^��]�>B���jg�Z�o)�� Z�C����0h���&-�p�Ix~��t����%�w��~6x�ev�D��E�s��Fj�a/��I�'������0�^�F )�DE��f���+�B4�f��6���~p846�w�$��)95*��X�|�	�����S��������}� �1�{
q����B�Y{���������x�#b����,�N�dQ�;�^�����r���G��^�m����@m����L�����T�	1�cy�-��Of��<�E��v�Y�n�3G?q'}0�F�p��=�cm�		�4����J�y��C����h��>/|��p���s�!�������>���m���<M��P�W�������2�������w�/ ��F�|��h��>��z{��F���B�\���a���r'���B��n#7����yw�_����7=�����i��G3�B�jzN�5���	��'�;�����~����Fy��gB�E0�wK�9�#�
��N"�����O�#h�<y�0+f�i�d����Q��=�����;u����7���v\	 d_���!m����-�������z�'M���H&{G����6/�����/��[	���;��,l�@�/�����_-`��E�	H������������
����X��%�����e_����Y	J��^���N�v2�Q����O"�sG��D&j�u�A/��w6m���X��a3�r��������?�m���b�fC�c�h��t����-^����E/.cT�Of}2n�'��wP��
R�[4@	K�C��]F��[t!x���M��.j�l���ePMQ�p� d�����w�_ ��_�
��X���s��l]�e�`8��|����_���2����'��3>o���[��(�������}��MDu�I	�\F���gyB��;|���H1����C��*j�S,��a�!,��ZI�V�����~t�n�s�������[B�n��i�^��:O�Y���,��,��ii�8�#�+e���b{uH���P;�9!�t���S�z���Nh��:��>I���y�	h����*�A����4��3��Q��(AH�������v���m���5/q�������gq����Uij��G�Z���_!�;H�����.I��=�:���R0�h��i��I��lD�#~CqD�|��)qG(���[���	l��$�F�	���k�z@��g��-�"�n��	eA$�y�3�|�7~�D�TQn�{
�C��w��H-�%���GMa��u��@����<7���dDct����?w�CEA$��p���5y������ujD�����)�U�
)�z�\�>N�����Rgm~G.@�
���8��Z�"l�
!�����ABD����B��pD��������l����w�}�pRc����;��/<��(�dT�	�x����jBTv��0�(���(g���*��������Xf��QC�����s���e=K��4�&0�(@�@���*d��v�bo�1:���������S-Nu���x�X��`b�E5��j���=_`���� �*����*t�jJJ�B��`z}kH����}9��~@Mf���������@�2�ts|�:�D�XP��mSj�3�.�-"3�n���%���l~	z� �jo��|��Q��
u�V��u����J�j3e��u^m�7�-Z7�htwtt�J�~� ���oB�������7l�d~�B=���%VC��"�a5��]��H�Q�F�� �C���N�O#�����,w��W����� Z�������"(������	j
�IK��CG�w��}��$���n]q�"r`���!�.J���?=�������81fo`�v?@�>�?���9�sF#8'vl;��q�.�n��!f�@���=���
��F�)C���NtY�f#���"�
N�U����;�N�hq�lr.BkTa����b#�
�������G�Y4��N��\s�I`�W�{@[f%>�*��.���1|o7yX��]�},K����������O��H�CFux3����3�@5�A����E'���������s��7"�x������d��l�E
'��-��/J��TSE����*��K���-��s"��:���|��y���o���!����,e�z��i�e�}���I��.#����'���~ 	�������J5$}�G���>���}4|�����$�[����[��a&�Q��A���������������4��h5��W�����I@)8�*����&�c)���
��&Y��@
��D��c��.���j��q�z�k�����a����������Y	Q?S��
���u)��Y1�<f_��lgH��uq�]G�c�����2%����b*�����#�>���%�?w��NM �R����&���!l������T�����6�&������Q���I����h$N�� �����.��X44��[`����&��IJ�^8D�� 2�n/k����@���p"�tD=�V�/zvzA,<�m����\j����Lg(:X6{%akF����*�����)�u�b��-�@[��Y)k��9O�
	G���|�	C�#z����Yh��~c|A.�oE��fA���/x�w��Q~(�,X�4��R1I���?=C����~#`�9��N#x�Y���c���S �8A����#�$�j4�;���nf�����q�����#N|F��f���/RSDG�o�Ld�O3q>s��+V���&��EM6��pC]�H0�,��iNIb��b5��n9��3���5z>J�I�����fd��h�.Pi�Y�o�n>w�S��;�Q��M���{p*�Dd����~���r��/�l���ON�
����������&B��i�
�����6��5�;G�:M��8�����D�Ef���Vtf��FI���5+��Y�]m��������
k��/��P���w������[B,N�>��p���y��=�v'8 ����v-��4���Z������9��[�t4Z�1�6���������Mh_��N?�'�/�����Bj��c��(��n���i�� IG6�e��DGIL�	�P+��������
�?���vQ!)�9�fpV�~(�S�}gF�9o+��R0������?>X��awS>����z�E�VF7?�S�h���������g��~J�|��u��dk��y������������T
����Y���[��d�vAJr���n����*���k�
P��H0���L�c���� �,w�w�0�eE��w�$"�:����139=Bq���.�g�����\�o��z-�!�A��~w�s���`�r��N�����Pvc�*�dK��hfU31MP���S��)^�%��{�����~\����xb�]B�LH��qI����~�����g�/���8�!�x�����E#e�]��b}BH��Rt1���\o6���"F��ES@(��G,����t��"eL�nE�X���t1�
'r��BP5��&�%*����y�����
�@�l��_��-s�KtWO����}�J���B
���G_�3���_���-=V�;#��;�G�@������VhM���"����f�=����.!s6�����b�I)o����E��pe���E�\����g�>|J����+:����G� )�Xg�HB?�#3#jKt#��l�S����$�V�T������31���<�[/O���h������x����
8���+�e��i�������mW�9L]�c-���W��1(=�,=�S�C�o�;z������+#���cY_;��F��F�N� B��G���}}�h�{�$��/s([p-�D\�d���e�Mtdw�-qo�W��M<"��*���mKvxb)��a��$�3�y�0�'g��w�
d��|�-
T����P�.�a=����Ns�CV�
|��J�Eg?���bQ��fV=�pr����O��~p~:�QF��2!&]�����S��n��:v�������zVy@����u��4;^�����M�3��id����c1�a9�t���{�wc��v��	����;7M��L~�:�\bE��D�}t��AC����l�M��K���/�����'�	�]������j+�m��zo�'/|��R~������Q�dXA�,B����)�a�!EY�,D��(>M�%��`�N6>Y�B��w7#Q�0�1�
`Q�dSL�Q91AOq�f�C8�����Y<��2�����I'���t�L�et���m�*�&z��/�n3B��!����I��~�����d��1�g��.�����|��;���4|Z#�a��������!|4R��$(����j����J���O`���>���F�[����D�f|���?v��\9������%G�		��$�eO�%w�����cAE�Q����
d�e�����I�oCX���CX�p
� ���ah�������3g�!<���\9��A��)���
�"d�)v��kQ�?Y�fO�[&�����V���H���p�J��x����E��!�cI�[�2&.��O������v��]Xr$�8����%z�	z/��Y��0���fB9����8Y�;>Q���2���&�c��[]�`FNaC8�|pi�^�v�m�+r\���q�_3�8���w7��L2���p
9#��X�9�?�5q�"�U������!xc-��n`�,��}X���(U4LZ���c(��5��]�������@L6~�|K�a�-VN�a����@C�FiA[gX%�0"�
��T��U#]��������^�D���K��P�����X��m��w|a���);
	B0z6U���Nc�A����
�N���wZ�kE�,�P[6z�-� �.1�c������G3k4��)[K�]�t��a#n�{VMd�	E���+v
F�0�WM�3��������
A��W��`��P!�5Q ��h�����qbJ�HD�]F�+���!
L���D��X��
��,�j��wNr�,<`
�8�B���s����2H�^�3��H�1��^Ujt;e��(Ou:�:��s�V�tz�o`���#{������S��n&��+VDx�&��X�Io-wK��f��_�8jlM��y���i��,f�����~��'z[�$4_�-pZ_������~��cZd��O�JN�:�V��\���
_(*Z�S'F5�����{�1_�6�=�D���f����4�X�Q�t���&�b�H��
s��T{gw�j��`������:����i���q�Q4O�'�<�fS�"�[����<
M����k�P��f"�g���F���v7vj?7���LH"�vV�����n,Z���8�����6�j!�d{��	i����4q
�f���W%��g�����"��)x�e-0z�[D��"�:�E���b��{G�����aVD���*�y!v���g���/���9�0	
�[���������Ll���(d��)�aF�TS� ,])�j�E2�df\S 	�t����8���E���R��m�6*�����Li3{�r�N��0"1�t��]�]Wq7�13G����G�k�#X/��J���-�����%�!Mk%���h�
*��h�`�I�VID��9?�2h��p�C����P�����#<$#w���[4F��S��:�G���(M�^�Z�����L�
�h�@Z_��E8C�e����j�'�����M[�l�p�/�&�������5�5R�~�����mG���4��m�
E�����`�}���r�����$L�S�~k���n^:+��/�u1����Q�P^���� �&��/���������B���)�kh����7�0�Hc����Yw���DQ����S��x��3O���]G��,�pH��.r����������m�����dL����]������kDM[��P�����uQ�c��I3X�eSz	�@��E������j�}t��������+����d��e�{�u$bFg���l�R9�"b�)wv=&7M��X���z��,�fgo����V�\�%$,!���u�L��C��V���2�!G�l�I���c��s��T����*/",a�����G��"�������NX�?Tt�6����p��s&��`A�gd+�@
�6zT�-[@���g�Y�y�wa�"�\������|�%�bd���	Q"�J�2\em(vz"p�I�l����9�z-��lb���m���
3/B�V���!j��:"�26Q�M�ge�	�e"��_�$�����Ej��L���1O!�9:�F��e ��q�����-{�8�>�FzstRr�6"Z
�C`���F0��2Y:u�����u���=�tX�wy�X���i��w�K_��Z�C@��;��e��!��4�n�8��r����7��#�)c�D!��~�ms~�<4�g-60M�-'��a�����+��-w���%���uo�FyMo�<���	���/8e���j�u�����48c-u��5������S���5��#�@�����~�a'kw(������#��AO���D<��<��uy�
x�#����ht	�\����{��1��C c+a	x���D�6�����l�y��j|T�����
�y�v��9:�b_�4�@d~�K�.�43%dy��8a-"�/�';���%���c��u��n�P�%0"�p���i;_��E<�%�!��<�o�#)-�,�-{���0�hR��)���d{��\�����v��g����n�W#�z[a�����L8i��=�}���������l;��le���np����t������T���Q�h?��%/p?�g�~��Yz?&0��MY�[H��W�f[��g	�~�������oj�5�����m�D�
u�V����#-������t������V�������^s�#�+�6�����~�w�G� ;�c������*�Y��qi�@��������l���v�(�:������%������/��e����qe��"�x�}(���f�m��hS��������c����f~����/l����FeW��U�B�����S��� JCnk��v�1[H��j�R�m+���������A���l�Q#�X`�,+���m�v��.��q;V{�	BS������-���~�'��6f��/j9oA
-j�nA
pA�����1:�o[4e��A�����Kv�g
C����Bv��X���:{��0-`l�
�v����M�����L�/��U��D
�-��E���R���?+�n
�Ul~`��������A�FO=�����
�!`�[�����F8��D��-8�M!�yn'K�WLT�J�5[@D������'+��~�5�������� [�C��[p�/��l���6`Fb@FK�B0t�W[�R�a�1M������
� �D���I��]��_��VA4x��e2f��@	���%���#"p'�0�-�-p��U����f�lx��P�TC[����U�$��V��9��������)$3��������o!��{d��;,�S��|
�6#Kpn�n��UF���6�9pM��k����`��m!��I_�[	t���i!2�Sl�������@I���'���{
]���t�h
<Q�������>�;Y���K����x�a\�E�#"�3���+��m #�K��G6�
4�oI����g/��u"�f��[3_��@�����D�����{I=2�1U�A�!���
��Y��qn�s����T-h��_&���z�;����y��m���.;��X����8����x�����:�A0�&���)6n�vg[����	A�cQC$�9�% ���A|�j
������2��cXBC�@t�]@9Q�Oq�Wst#���}{|�S���\�������#<D�9?z�r{�D`P�Q���,6a��B
���)t�u���4{�7)pbE���&2��3��Uf��U��	�i���O�7?��;�'���vM�j��tO@���*�O��W��z�t��h���)��f)�N�3�f��i�����-���f�������D���L��6���D�N2��P�f�_�9g�s�r�������������VE����G��a1Eo�!	�
c�vk�h�8����]����S0,9�����tC���7�u��x������}�R^F�P��|������q���g9���a�M6H�*�!�o�����z?��R@�`��A�uQg�X�p���j�f��UD{:�����r��.#�A+3�E���I=8K���n_8gH�~9r!=#��]C�	q-[a�����E���z�q�� ��&k2�������2�����d�`OX��9�m�:��>)vU����G\j��\`o�L��g��c���>�0��B����Y���t�w��8�B#�D>�@Fv�h��q�U9�,���_�����X�����d��6K�7�9�`A5;�l{���~A([��Vd��,���`&�?)�v�������	��E���^�E��G V=�/����+�(�'��Ss'R��m�1l�zQh�f������V�W^�]9+���p%�\mM~$M��G~>����fv�r���1�+m���6�3�3M����'�J��1�K}��!�����#��BU�Lho)��=���9��,����1~��g|I����'�o��`e ���KB�����6e�{��{t@ds=i0���.���-�C�����{
'H,3��<}�{V��-��<����O��%��<J1�,���4p5���w�0
.I���l�	��So����.
G��U��������2���o6H-�P���3%�$X`^��<Gwx�y�c��j'tL�KR���0#e;I��C	A���f���x��Tcy~B������::W$
�w���Pl�I������l��@�,Va��X5�����04Ly�q�h�����J���0�Bb���!�5a���q���B2eE�G�#U�Q�� p��Lxl�5������0 JR{�����0��4���(���.��|����F6��5��[e��b�E�����)��N�8�1d!�U�����:����Xtx��+q$�~/��O�D���BFu�/��Q��lM7��(I�A��}w~����jL�����<?Lj$�����j7���W�EnPn}wk���������������^Cs�T��R��G&~@���	������{$�o�5�,�����z/���;H���	��y\kZ�/��A$��c���@;�0h�Y=3�6�u��f�3'�>D��>��*M�l�BFXb+�A���s�)	��g��b��z��qV�[~��u������{�<nw��9������?��rB{��P�h�AR�fk�a,1�C�������/nU��������}M�{�#+x-�H\D�A:g�
"������j�%<��`��.,�lGv������&�-��!~��l�
������54�~Gj6�Gx/��-!�����>i[,��pG� j�2l!;MV��|����B7�7I�}�,�����p��ACw'�N��cG���[hB��n?��*Yt���|���%<
9x����^� �]��I�r��0J����Vy:39���z}�PJ�Qy���B^����&�b��q�G���j5gy��in��D�����VU�A[7�2����A:B����t1��?)�-�l������N�X�F�ey\��5�0�w�y�%�p�'��A���5E6�O��%��I�gJA�z�;��`��J]c���D1
*f�����-��d��j�x(B.��QCf�EJ��
�[��a�
�"Lc��K�������E[e���v�0����d�
��!������'�*�"&��w���w^8�
h�$�������s]$� �9Q/�8z��,b���GSJ�n1�v,g�)�5P����)B2�n�Nw���\�J��TvU0��&��gk�5�\@���GOD�X��??=M�c��+B:�E�'=t�/��.XT}�W���T�y�l.��@a�����a�n����:�����#��P�����'��Y������o�������^H�k��+����oD��b��?Z�4�����c���f���/�w��a�V��8�"�U�2��F8YT(3j�,������z��3�zt4?���w<��~��8����_RS���'�����XF��w��^ ���U�o �G'�������f�N�zYE����gjG�Q��*�^������QH���P������c�����'���D��hyQK��An��)Tg�e?C�S6q�oP�e���,D�"����[vA���^�������r���A�8�0
Y�d�n�l,w�i��"@�����c�]��g�Y�]�%�G�VGlR��Ut��qOS
�B�|YA�"0�d$]����� [g �����g��5D�w��
�:`[gy�;y�����������T�e��i�s�'58�E�F��N�.q]H(G�_RC��,�e�y[8�D�B��g3��?L��?�&�����0gL���C3�N�GYw1�S�5EX��8��|�G�M��$?�>�E�>6�(�H����	�>�1c,W{ME<���(���*�����U��Y�
���a�PD5������<V����lF���@���N�@u[�	)4_"S�Y�� !2�����u����;9e96�t�����l��5����g&����$��{��sJ����
����:"T;K���o�"3��k�)�����������B5�b'-.�j5�����5�k�c&G��*|�D:�j1!��!0T��Xd���l o�������_OL�f���g?{��
3��r���T-�NU{G�)��T���Q�{+��7�x����
����jhB��l_\tKkq���-�:���(u�bw�D"
t�R���g��������)���.�
����U��-����{v�����D/}��#�����q5������7�X����l�wZD.��#���F�������Y]��-�=����~�#[�5�'��FD����<��53�yE&���4�*�Z}��p5����
0�����>�	�:�H�T���32	��U`�+�d!�m;8�%_���z7X��Q��
S���*`��>�������K�@<�s��+^T�RW#�����u
�w���i���� �Rh
�g]�e�E����/6�IU����2/�����1
���W���k��?���pT�"~���D����`�v�_��$��2�4�H�,9�
K����:� %bs9�_�B��~��!h�b��7��~��(B����6D--�vu�(=z�B�~���
���*�@���NI^�@�	t�=������.;�	@���go��@�����$�^l4P�������8q��nASk�,>fV@)4�������	V�OV�����!xAH�����-���^�;���ONp~^eHS�Q$KfJ����Y� ��F6�&�@r���%�R7�=�F�g��>�{����	0P�
zT���������__�uFz��E^c�HMmJ�������@ZqY��<M����;�l��J��GHh)��������V�c6�����x��������P���[�"���-�;0v��p��BF,	����H4�8GZ���d����d�����	?��~U�PJ��5�5j:5Gb�Ow�	K��M'a8�f=�O�����D��G"��%R��2j��O��f�
��O�Y�'g/�)P>t�}����W�pU��xcF�&X#�p�n����E��fuH�${g��c)�2 �E��f#'J��m�y�MD�h6�1�9j"2kB(��/��IP�lB	j��~�d_�m�C�k�I'��&\`B�x�%
���	�	+��
�a�;��4�7���������At��E;�#��D���9��
�[�����]�d�[�D��&��!<��,����Cr�j���@5���0���;��L���:�����7b��7R��C�O3]s��5���t�����
��@��xgxd�>����0����c��/�{C�������g�.g,�ssg��'j~6u&����qT�i���-�#j�5![a���}�=MP){|�����@Xl������������i(�V���U��l��DS�l���aaf1m�7d}��b����_C�,J�=R3G����������W[&jF\8F���yf���(�3<���U�F,y�c��_Fko�8�D�fU�����O��	���x�lg�nO���W�����~�����Y��O��9���Gs�S;��+kG�Pj�=�
�����o �QE��������0��q���qC�����3�-QB:z��;n�]�ud���c�D���?6=���<�������8T���|��������-�"F6�Ce7c���O�-���� w!"ydGe^7��
�����$+t��1��bWf���Q��w�N����s���]�F�9���.)�1����k��6�	��sW4�������^�qLKg�3;��u!�Q��;�����8��)���w������
J@����� �"�:v�Ks�A���]�����.�bp���N�n#'Hx�Dd�.�5X4���ZX��q_��e�����SN����o4Q�=��FN���H���`"�� ��������_-���q�mo���w{s���pGo����-�Y�z��������m��S?�)o���h9���];`5yp(�.w���{�����:����a�T���z�&	��?G��T1�q������%b�t�I`���v�@x	��qz���r�odbm]C�;Z�w�8�����n������R6[)5s�Y�(�B~����2�`:	��/g-J/dqWsj�\S�f���~CRG��s
���T���h�;N"���$�h������T��|:��5����wa�G������i��X0�����<�>>cBu�="�v��
�*n_Fi��u��n~�M�6,�J��o��� �����r�	��d���"�V�}����O�)�������B�,��{��Qd������������&���_�{D��������c�����+���Z��
��c�����Iy]��;X��[�[ {������n|!���/��~icP����s�+�������wXWo	b���-��hh�����
���
�]C����� >��F8�������y�'"�t�C8�(<���f�������D�a����&��8�M��i�&G���eK��!���@��I�q
�tf		�.���������������{�6LJ��E��C+#M��K`2y���7����u�������	Z�M.��p��<>�BMc�Jo|S*F��0�=o�/����L��K��=Y�e���LM�����!��24F�!�dY��585n
a�3g�����KoYj��vU�������]B�=����L�=���<q2�$�6���CPCF��z�N�C4����\=���0.Lu��C��8����6D����q7��95p0�N�1���JN�����1=����]CE�}n���+��������1�1G������F�9��	�PlGl�!�l������3-zn�2��!�aI7
#.�
W,��������h����SmGeR7k)���4�wA����F��y>�����@|N�6�#�`���C������]`O�$��0���j+�m��t�V\�Q����KFVBh���nG*�a�A���F��p�����=2�!7iikm8���������"s�!"K1��k�I��33�p�u�N��o,�`�2�����d���.�hG�E�-� jvu������jz����T�?�@Z_�;x�i<�[���+fO8} �O�N?�H�2����A
g�?���emN���,j����
���u�@Dh����n	O&���,�m����B�����?��IX!;H���%��*v;$����C�/�:�������Ls��ZP��;u��>}�E�����c[�� !��n�=� :�4���C�p�=b
t��3��6��f���}+!��B5�"A����t�$� �q����9V��3��-�+��X�O���@�i������D�}��O�|�V?�L�+��C���b.g7#�fV�z��1U�� �������CmO!9����h
m����e2��z��yF.�SS��0���.O!��0�4p�_i�kjZ�O�������@�o���3����G���
:u����ek�d��Ta�g\u��� ���h���H�3�B,(�EX�1�=��)*�q4�GZt�?��V�LD��mN���UBPrZ�����3b}�9�����D!:���	��m)����S�P�����{�]�8E�����W�H��i�&����d�z�l/p��XL��&�>Fd0?�����N��$ Ee���![?k��"U�9�
fm�p��?��L�O�^��+���:�@y}��'kqC����aBkF26�"���e�7���X�\�����C���C�JG�)0������	ed��!M�����f(�4�uV�8�.�i�n-���Y��t�4����0���)��1Q���� P�.�?�J�;��5����1����h�c/��cA'mQ�4���������MgGK`�=oq~��n��.��!
a��Q"\z
a���b�&���y2��6f�Us�qH_V�:`�V;�t�#���S� �Z�tF67�J-RL!ri��O�VA|?%�m�B#�Ee_)���"L�9|hb2F�40A��0�J���22��E�J1����5��P�P�����_��5���A�P)�c���@�?����(�SPD��?SP��vn����W��p��G��)B[	��Zp�dZ1
����9�Y��t�D�v�	��%�>":���4�9���D�l�R$���yUB�S���6��l$Af|�)�I!������#|j��V�C&e�S:?��_M3�0���=9��L�%B`�P��5dpM�9�F��j�I���F~t!�K`��������f�A
Y��*fxi'�1�����S-�tJF*2������k
����������Lw����V�;�C�z����w�����TP�~	���.�(:s��$��/?S��O ������\��WD��%lF{0zO>�}=���:4��%s	���4�P�yC,�]w9#S�o8"��l��X����{�F�DKHE�NsKH�������0�:��p���*��0�i����D�P_�n��t��E�r:5������Z�p��!M�E��h�`�^�%`+J>��]��X��V-n����m��9�*���lY5^����q�n����:Z����U�d��k�b�Gh�B�GP�x�QOzO�@�����7�q��@>jJu[_P��M����c��a�QFY���o�t�`mf��������G-�%��@yAE}+��������_�S�SF�a�r�u���n���MfO�)�@~��N���QK���A�1QpG]�%�C��;�������6���"�]4���X*��q�GK���(��N�����g�2'���C������[�g�l��.���V����^}70��b�,���)�h���&�E���N�[VJX"A�:j
/cH��L�j�j�VQ�%n� )vfUd��k}��2 �D�a������V\*XEq`�'���mM�%��,DzMSP*Ks�h������2� �#�H��#v�]\K��*+�>Y'
$wa��gDZB(`����3B���j�����6��ZB��>�}�t���jQ��#��rhDV�
��@������U���>���=>���\��Z���0����������W�
��m[�������Y,K(�R���,�r����e�DV�	�`��{3?�J���0�(����;�����,�BO���}����O4��D��e�&6�l`s�N:}Rh�����M3W�u��]3��e��A�
�j��<#��2����3l���=,!-qEHf����-<�S?�lt���"���~~�}N_x%5�����.c�o�	^��e��1�u�����R��mc
O��9��H�����C�������u��luLD�X���M�Y4R���'�BNt��B�!��CD��N���M��J[������ �9�[�L�BRw���>�eu��
kW�	�%tx�R�eA��~�����'��,�����na	�-��m
�����v����bW�nk�Y[��.TaD������A�ck�UI[��RG[J���8��4G���>`���&�=����9Q��uX@��Uj7���)9'���-��f�m��D-�-|�T�����gB#RkI����-/n�'���������~��?����-j+ogA��K����n���!���Z��b�������zZ������l6���sI���m�^A���{�����[�����D[KB0����TB�$*�pE�"����mYV�n;q����w�@"�2q�6�pl���
��;��;']������h�9����m��l�y���{p����3H�<�CQ����p�������s���x�o��Y#�
�)����C����"�Uz�3�*�N4�|$���#L�5B{wB!�Q-�H�$�mLA���*j�cY��#!����PsSP,������	���X&~���V���lC	bEL5�I���u���o^��QFe�.C�E8���i�@n{�K*����rP*��%h��A/�=@O�x[p>l�
�9`'���]�$H�����*w�Y	/-��-PI��V�B=�v����/w7v1L0b�(����Z�����@��4u7�C�w�2Q�>���@"��v�����Dp�|n�3�sPm�
*#d5��'K�O��2��D��C�K e�?
d���4��
n�"��>aW>j%���K��'E[��hE��c���)�|��c8��6�{+<��8P���P��&�y��M�:S�'�����i���&�k��y�l����B�@C���c�$+�1�0$��t�n��[q�fX�1��P�y�0D*j'��&@��i	�����y��F�XP��f/'���X����d��A�W��8�<������i�L�j�c���*��X���jT	���:����B����Vx2��6�1� ��d��� r�F�cdAL|}�jD0��Ss$EcL6:������P��^��/�L��%��
#��r�$F��;=vZ�	��[D~�?��D��)�6z�Iy@8�1x�eH�MRQ!r���D����':�f����\X���m���c��Q���������4'�l�6Z�6�4�j�hIA��&�vJ�J�^���k �� �1�\�t:������D�>d=&,�;��Jv����Rz����H<���L���A���2�#�{�vv'J��X�=#��{��vSH;=�0�e{s�����'%D<� L<-?��H(�D�J�@
�,������?���wR!��1:���ESF?�)���@*'I���3�v"�$+��hQg�m�E�wq�I�����A�D���#�3���Q���RV�K 3�����]�(������f7�4��h9�9������V#=�f���*�~c�\4���g��������2K.�:%v�L,��.dPl�����_�����h��@N�_�vt4�w\��[7�`��S#zV����oG�'������H�����hY� ��1������DX��1��~ee0��v�l��I7�R��9�7�:��;�3S���8�Q���cb_{2���*�N���J	^����&�]���7���Ff�;��r\��Y�4��F��?i/�#]�}��"�w�{�����L}fk6'�����z/d~n+��8{�j�!�^(��e�3����t�J���qe=�����Z�b�^�M��x�R|GF1*W�
M���!K�N�1�Qo`~�c<������wC|����)��O��������V��E�R6%�� ��I �\�dz.����������;�f��U�2��tCWA�6������/�������a����$Q��;����	�2.�������y�*�x��]��#t��:n�����M<��B����������;�6F�|X����p0cc�~c��B�)�9~�X�(�����"nW���b�Ir����#w084(��{b?Z����������CdCL�+*Zo��Q�
����D�re
G���p�����0V����,�>.��e�_ ;��}��c�hg'�M����K��+"���-�dC(R"�J>!���f��������=��z��F�^�;�����9��#�G������������n�l8�
M��A�a����NG�|b��SU(n��wx>�C=�e�D�D8���h������X�w��-���X�6#�](p�������]���-ot4���oXg
1�:}.A�9AJP6�fZ"
fy�#=����z��1��4ehx&����I�R��8��gCV�;�����A����O"���6��Z�o�n�'�����X'�u���A���O�A���B�TIj�;(����[0�0��;���6VI��TR���{!{������Cc��C�5aT�����G:��5<�j��96�s}Un����~�t���^����B�wdZ;�xs2�b��A(:.��b�w~>J�y��zf���2��#<a�\�����wt��'�X���_�^#;�|@/~.��,i�ef��?S�����$�����z{���K��:�-�mI�-U���4�d�/	���)��Z�
:h���S�,G�L2�$~2�5H����86�n9WU��.$
������+���"���c#��*�g��#�&���E�� �[U]�D����$:�Y��
��K��@D�w����`�d��)��B��w�2�C'���hFMR.1�/�2�����`l������~u[r�E�]?�
����.62�@M�4�cx�{e"��wP�3Q�d��3{�+e�R����C����A�p����P�����a�������B3�+W1v`_�"��B�k��>��@�E��eh�O�_�}k�,B�S��������Fh"��?[�����������r
G'��'rO�\���FL����]�H������W1����x%!��|��O3��A*�-�;rb#�����\z!�L���/�O�Xb
��{�0(kR=��ZP3���Wpw���AWH��
�4dg�D;�u(�D��I*#���RF�(1)b�Z	��e��b�@&VSTlt�,JP��R��ol@�m}����b\����i��h$�n�Mm ����4@��U!hy2.�bb�A^��qC���H�brb`Oi�������tV`�z>�J��rI/�oBO�`����jd����%���F�x��a�5i����Oq�3�����Z��D����X�KI�����g����Qf�DPF�����q(i�@��.��v��w�4�YE��ZX�dX��}��V����Xu�re���@UE����C7:0�	���b P��*F&;��>D��D��JL�,�R�;'NE�^'�~�#C����'�jLP�����*�g'�k[Ya�'}M�h�k/[n#4��1��
�� U�J���	;I���}gNB^|�Dr �;T$�`=��R ������V�Al�;ewp+��v��\��h��ICP�p+|�c��_
���d\�������� .�����{d
���"��)s��}u�������H�5�D}C���_��|���L��r�������Vj��;e�U�������T����vk���9�5(h���
|"�$�<u�%*��5X�}��/D��"9���w�!�&�+&�aY��)�tg����XF�B1��I|�eS
'Xy�&�j��U�&�����5A�����C���cP�#g5���X�iV:��%���,�|gQJD�|���SM��j�Vcr+TE�6P�:H��%���f�a��P��������{!]���~�\�B��@�����;X����W�GPn����]�z���PAN����4�����.F��
Q��{!��
���	}�A����������������BQ�<�>����3�At�jA�P�s�"�j�#�O�A[�h��HA]����J=v��#��c'���L�e��Y�;b.#5z��_�NlLA��<
�x�����)�����"��H��Oh�����P��dC�����P��^����j�@�����9(����p����C���:�s���vL9��[auv��<qy����8��fo��6�~AOf������1���=��ID`�1mm���d ��*�L�8���&�#�d'��	_{�f�>������_��������$������h�����^�P��xhY�g��#���k�)�iX�]����/��a1�&RYe��z#��������m�b�KX�h����!	�eD>���=��+=��klB��+6��|V������o�>��t�x:�Ig��0��t�P��;2��;3$>��]$)�"���Q����V�.C��jU��+��g�|��*����p�D�b��+�������:��cZ���5��@�}{�����{�g�~X"���.�:�i7L���<��X��=�%B�+�J��d��#���/����,�H����I*{���D���r5�ZBO�����b���r�X����#4��#IH���;je��~�LG�U0���0	cK����U72X3D!
�Bg3N��V`G�H+���6��a���>b-"m��+����k�-�Bj&����Gv<�3AB��Fw�>���u�Y%�eb��p��n���T�����\���Z�
bD�#G�@��Y��"�x������.�eN�A�(�����J�d�i���J��`����A����;T-�Z���
�!b��^��=q/����U.-1I��D���pk`�?4�H,�[��{�Xm�M����6��^����,���tb�y�'�!�d/�b�E� o���(��M�
���������o-+�c��Pb{3� "��<^�;��>#�����1uR]���b�H����:k�=���
Le�)�������Ft�6R��A�*��P�vtt��~�:U������P��n�M���hs���3�i�^/{#�=��P.���fBv��
�0�++�����J�(��I�)���!o�fb*�J>=�����"t�@��	Y3*Q]���~_�p~{)�C��b���+��l�P����2Z�2��k��`��#�=%�-������%Yo�h�K���@�b@�o�)�(f�?P��j)��V�L�*"��$2��$$���<t��R����+�#��%��1T!�����\�+�{!W"�����C�6�X<5�Ed��"�xvB^U����S���`Ei�6"�������T�T��z�;P�����A���bT����;P
 6:*����v=-�?zz�2��������ZU�(�����e��W�%�[c�����}]����$kg�����e��'��!����B�s2�{��n/HMZI�:�w
5z���������3��It���@�(�B�\�_������)�	��
��4�zD*Q����hL���������`2YHm-������4n��>���`:�1����� �w�����=	�l�%
�����2sk�Im�������-$���<����jv�F�1!)�k16<��O
�z��Oy(]
����#���ZK=��T���C@�Hj�������EMk���,��k*���K�]��j��
I��&��v�tg} �����w���)4���iC�Yr�l���@C>��R�����{������l���x0��g�n6����>{���C�o=��O����{gC��n���>z����p�����s���@O�"�=(j:��w#��;�{�Kv�@KR9V������J�X5��,.IDf����� ��%���w����a����-�D�s�u�8yFVV/��1{S�uh��7$�����s_7�!���PG���(���UR��cG���P�j �B�����b��u�5v�j��OY�%{�k{:.Z�:���P���P&Q����2P���?�����A��}�����b�Bg	�����P~�|u����j8��VMR�bGK��R�l�.82.A�s��\m@���c�B|��2%g�~q�;rFnq�q�����V��/����<����-C��0����lO���n�(�=*�*;{�"����)��N/	H��`�����h�
~���9?���[������X{*��fk)cB2s��������nTC���C���$����d 4�Gq7;5=e�26�Q�P�B�=�L�����z3�w&�w�pVZ���j`O��x��}���z�=�
������'�%lP�����'
�+�q�(
l��������1�L����C�++���@jt!6:~�;��z!����Ee6�x�_(�q-�L=?������x��� �r��Jz~5�$W#%�x�(Cf�NQ"�v$B���^�j#J�������C2�q�^h�>��
��Y�b��S��%�1��0
"E�(
Z�(�����9�'F}���k��s2�EDQ�un7��l!3j���_�'X�$*Md�1��1�H�����(��N�p'�X�1��H���~�Wb�GF��E������H�D����G��D����:QF���Fg�Q#���UY��_�Z�<�3:�	e�a�D&r�c`��#��4j�c>��a�D*,�m$�ZZ��e����0p��9�5���z�s�d���#S����oA��3��DM����b{��+�p����lS����p�@5K���h�A?4�c�jJ�j��EVQ��gG������)I@���1qL_�~m��O���Kzw4{��E]94�R���i!M����JtM����S��tTwI��E&�������0��������o�����Rdd����Q�������0�%��D��?��a��vR�������QI�[��������9�����D�������rD
���$bO��%�go1v�Z����;5���1C�CM���Z���h�0Z"�� pz#aY	�I�Ta�jl'Qh��/0��v��w�����0N"��"r�d�I#`�>n������C	��*r'���[�#"�(4"������I��T���>6x�6��u&���vQ��\$�mA>d��4��:����}��c��s��q��$G�5���������$a��^hx�-�/��/4��@G��/������R������c�	������#��K�a������
[tK�fk�/�Be�B���$3"�@Z�a�B�]��V`�Bz��@�a����qX�&D��6~C2�n��6Q�n��n_�I��ZQ����at���t����y}Ncw�PFA�����'y��`�Zk
3���R�7=0O��\m��
�����@Sj��j"}�|B��3�T�����Z'�B%r��1�M��^����w��������8De�.��6��eD+2Z���5�ZZ�
�p�D�xh�L�����#�i�Ap�V�>��lq�wp��n�\j4
7X��N*���2�?���j6��r6���{f��+�S�4ie��/���rGM�Y��znq/�{�n��t��b[�M��g@DD�5�Zt�1���������G�2��3
1h��sV(
�i�dX<Z�o9����2���k���lA�Z���vo-1���=�&��e���X���;$(�;�����]���X�3HB��Gl�[�HC4��C�4`���i������+T�h�]4Vp��?=��='J�@�V���4��B�������I3�5������������]��B��bw8������'���qw�E>���*����["Z��g�9�\���a/)V��4��DK�S
��w<�;�QD�:�s��9��=�t0�G���3�v�s�_&}��q__X���4?xw�_qt2B�|���?��b>�u�5*����8�g���~�;��>z���i&�
�R������l���A���|��l���������?�G;x�z n�/v�r�#����Z|�]=�){yt�n���-}�����jI�/��B|�U�R~F� ��(4�b���xd#�$��B�"��[�"��:J����Zc�n��u����>u�az�m$}�=���Bu���t��i}���B�	\g\�f6������$���)�U��4{R$dG�1y���������|c�C����>���}3��������g���?bj:Qq���C�9������)4�A��N��B^�imV�Jq!�s=����5W��Q{eG����<���7{����[Nw�?*q�����sZP�E�4T-
�.2�b-�U��3C�l�pj���%�M��}�|���c��e�n����AQg�J�;����K������������,�U�
���8��k~���s�_An��KUSC����/��\�d�$�.�GQm��:�Hy�Xn�	���kXBs����QB`3�m=5>��v�gk@a�$��?:�/c	�I����8?�9<�g)'36�-��wkl)�T-�=�/�0G��e�A1�,�ph�l�8����Y�H�h�b�-C
���5%�Wa�A��hY��Z�����7�X^�2� �Au)j��?��{pZ�����ac"V(�y�����q��B��	�����5
-�J7���b���]XE��X���=5"{���m{����Az���D5�W?�����Zi|��h��v�	��&�l�X=�y���]�@oY��_�	y��������'c���I�7�����b�	���a�������$u���'�oK��.3��\w3��eDj�2e����-#B�����uE���s�����K�A�c��~��-*W���xH�q\�����H	"�����l�C����wU��a ���B�D�s'�����B:�yG����r�E���\qyB��e�C�a��B�V���������U+�Q���������s��6w�V�k�F(�WJA���l�w���V�����q��t*G�I�
N/\_B6����4|���������,3e?���Y(�w�hX����6�(�\��&9���L��Oi'J��,RV�#���\��e�P�����[����Bd�����i���4�aE����ke (Vu�yM��Z[o������S���VNv������Z�����d� ]�,);��!��3�(~�
������F�;�J�}��	��h�!	5,��C�1�-��-.%/>4���v,��ut�����7��vp��+Q��s���P�eG� �Iv9,��K|g�z������i���E�E} ��Qt-�)�5������p������6� �8�5�!Q����~��O��;Gd�;HGC-9������q�����4�.���^�Y2�5������}Z�drgQO=��C�,VT�C�zp�3� ����u�m����
Cvr��<i�u���s@V��������gJh������y���M�����	�g�8��4�	]�Bu�R�sp��9��
�@Km��Y�]����t�5��v�2�{:h��������
���:S����Q�v�
Rs��T=�]�;8Y��n��I��D�T������#�pEu?En�y���FH�|+��D����WN�q�6�����J��.q;2oS(�����p�I���n����-"�(���1�{��G����Z"{��zoEH�����*�A�YyM���PA���cA��=#��3��H8(�]:�L��Qm+�nn:��Kl�����QH�z,4�z^��^�y:�(5� ���`��%���Q�;���C��%j���e�a��N.� ��HY�^�
�XR?49
7H4x��?��l�����4�%����uPs�.%�X)��u�D�P�w�Oh���W(�t��_��h���������X��������Z�0Q��:��E0	���&���f'[�%[�w8$2,�"}�K�U�8���!��m�B�MG��@��#:[gGLuk���g�2o���}�&��!���q������)���	�!�!��oCj�V���2��Dm�,?�Y��T�-�	���/[�b��j]�"'��O�<3�\<.�q�T�e���IO��}��0�A��������\Q�8��N� ����h�c�e@u�q�O����3K\^���|��E����
���u�����.������i��1"!� ;\#�!G��Mt�_��)+����~"�@��1!��S�����s����� d(}W��J��^�
�pG�J,��D�&Z�v�D(�g���vt�p���:%j�v�����������9��s�W���4��D��-��2������i�EfK��������w��V1����G�_��X�����8���`��<�-��,O��"2��F�|e4�-�J �����e�V����LYz���WJ���@Kr�M����C{$:����I��}�9Iv@��1f!�zxn�x����������~	Fjd����������� d�N5'yR�
j�y>�C�w<B�x}_�-��4j�����m������!����I��w�����2�qb�F���6t�`������9�j�d�,�����6�!����E�E��������9�m����FQ<%;��d�X��7��;2�S��2���������[�%qfx�����
��Wg�9cz��e	�h��f��d���"u�Y��&�-�Y����D1�Pi��Ya������eE ��1>��c�MhK�T�|V\O:M39+S.8�B��zb�t/!:sc{����
�H��f<Z�vl��k�B���z�v�7!�������3v?N4���*f���1hiFXu$A���p�c�� �������wO�Es��Nc�v}�����&H�~Pl�Iu[�����wP�W���P�c�#y�I���k��x����h4[Nlo�B�;"(����	�8l�����1� 
�N��&�b�Z�K'n�M���La�������ON�r�G{�#��;��:9����Q`m}�a�_-Cy>hQWqO
��B�n"p�;(�"�����i��A���%<����g��?'�"�����.f��/�K��(������;e���#Z�- ��{���-�����.(���^�&bJF���$BT��h!�{��n�	r
�R,(��7��1��4��������UF����&;�{�S�ae��#}�P�P�&�(%�Z���Q�v;P����O��(�P��F�*d��#�������>c�x���|�UY��[�6R[��0�]����~G���n��%z�����{��p�D-*����:�<�"��}������O�E�k���D����G�~w���m�Z������=]!��w����k�rm��b�;���X��)�.F/��F���H���;
���X����d�A�
U��`�|��S��A�H���}�6l_�����^?�9��z/�:���;1�m"�'�Y�F����D�Aq�������L�g�~���B���	q/U���xi��Tn��E����$�|���Vg�����B�t�(�2(q�������(��q n��pV���fZt(XB,-���H_���)s�rUt��{��-\R���$I���G��P����W�����N@�F����06q�y2	U��g�6�;�K�~*&+{,&��*��Z��y��P�NRC�:���/F���6g�v|O$��e������rw�?�!�;��E<�nt�I4�Vx���#}.�Ot��h	��Y������vJ��P����0Iz:��X����u�}|/����Rv��Jb}I�g�>dt�Xw�5b�[�g�G$����o+�j��wx�U�^
ZW�`�3_w%P'r�[v#O6�}���=����3b|�:����J��H��#hb����������#h������-�O{G���m����W����V��3J��h�<�;(]��C<*�WB����d	�,+���U:y����]I���Kp	td)"�\*O�]r�g�����+ii�"!�q����A���t��k�
����f�e�'4N-@��k�
�XU��evI����[1��]�.(�H
Jv�,��F���%�	QE5�=�,(�b��FH�}O
RT�_a������D,�w����7.��Yv)���[�!~�.Ft��p���T�&�����>C,�Ch��5|^��5:i�@	R4�QU�w���^(��H��T,�k������]��8�}��a���|�n����X�2Qn�.QK��.��R����8I��N���%q�h�0���B��C
��K_&��J�Dz�2Fc���k��S��oC��QY�i[��?_0 1�.�����R���%
��K�
��%4��uxO�_��g�I������j�#����!?���6u=�K��Bl���c+'���b�AlI�e��%�7�c����_
�L;�%%&�2�� n�{!k"����O�u���s�������7xf-F'Az���*d���G0�=�70s�f����z;Bt���~@�9]���W����=	�]�$|E~��D�@(��G�yIN���`@�<Q�:&�A2u6�
*����~M�-��`FU�E�u�
sB>�.38����G�._���(,�~�^����H�#��k��+��f������w�m�w1��E.D�,c��������1��\1� ��K�
�$Q��LQ�>/c��-�F��:�W�4�G"�D�M��lL���M�Ur�^��yhH<�iag���B�^'��W�Cu��h�Y(	��5���P�=�l�%�Z0�}FZ�8Eo������%���,4� n��9�P�%\����l8�5�.Z��O��	��Uv*���A8�UW�����!�x���J��q�����1�|k*#��{��|���I���^
+T�����
w��q���8������.w
�S��m5#k����B�A5��4��F�����eS�I^�0H�VPW�f�i����L�� +h#����S#V �~M�����Q���%�g��|
��!<�%"���(���c����~��1� ����ne����9��TJH��t�q�.����D:�Y=��S��t��&�Sm��T6_7�����i��n�>�k��kI�����Q�>P��C4�;�Pn���T����9X:�0�j<aJ��s�#�!�%L��x��V�(��"k��V�����R�A�`�q�-Z���$�74�3S��(���U������]#b@-���.��9�\m���e#�{5�`C$�P��
��Um�&&m���gue���>��}x�
�AC����)�P�aM��x`��;����Q)�������_gW9����p����mp�f����tt�0-�����:2�N|�d�5��^r�����������O�v�F�-�a�'$�BU/�2}��@k��A�c����kx�e���?THE�=�+��u	���R�F��7<!1�Pl��-�4��+CfS�a�b"�z5���]�0�:h&b��%/hwb��A�o���G�;E�G1c����	2,P��P��H0v!�jR�t������"W�)�$�(6����wd,m>�21����+����*��g� ��5��3
A�\���t�3z�F
�����BwI�sL)���U(H�%4j��]��t�l����!�B|�jHA�*LYR
,�|��rw5� 6��Vg�H�?�!<���@�v��~v��}�m���cEM��<R}6��vp�������au
�)�$F����EG��]M�3���t��5��O�����I��� �~��G*"��nc��<	U/�����`����������d4�OM������>����w]�FD?�S�����r3tWn��;�S-jY1�u�a���
`�����I����B�y�lDfl4LK��h����9���=�^���}.Jw=�>RU1���|`�������I�'W���s
���8�X�k~^�h�i�"�<�����A��Q ����?���}�PT�5�S�y������-�w�U{`������Jf���I�3�P{��@�����I�xZm_sv��YK�������&�%TA
�V���]�Iv�9-�?����h�/U��G�f�,�����%aZ���w�����8���/�x���l��<�W��t{���b��!D�#s��
�_+
����c�B�}���8rP���t�,Z�_8c{ �?7qH�z��4�������[P�0iqCR3_��$�}�"�����s��{�:u�j=��{�3�'�nF�8�o�d����p���������%8:q5*����E������c�������{D���r��Z��}D(`d�f�@�%t`�'T�wm	�Vz��$��*��]��5?�f��F�j�\c[�1�����	?�+ V���HQ}l��\S��/���3�zF���/*w�����������"(�%�A��&$���0Ba_T
"���ph��#�����_�����������!�(�%���7WA���w�~��_��f�E�p�2r=@�l���;��m6���j�L���/p-Z	\P���1�����_cN'IE�H]������v��"<WB���<Q,,�PE� mk������0�����U�F7�G��3�G6t
R��Y���%�����0�f����]�c�����D�'����I;� �a3� z������	��-�w�_C���#�-1�>|�V�3�����{�ogD���b�9)1C���'��{T����,����xK�x��?�����Ge�
1�z�%�7/��z�a��������P	�}w�k�u�R�!Yv�_���0�,������lb�2)ye��?�$���1�t�����|��(�F$XWu�G���^���E{>�pSt�S�\�R]��O��>jX���jP\���,h���T���t8l���k/���<k���N;��jB4�<�F�@+�Q�#������`^�����J�������;%y��NF7:�T�)�@9��]F����D�@�K�w�vY�3�@
c��&��G����gr�/���o�2��a�X=�������'{��&������a	��M��&!�Ko�.In~9qh3M��}����7^�:����-��8�����{<��l�'?�f�7����j��#��tJT{�f����{�$J�B;LL���4��j����O7��%<����'hA�lrM:@�nla�Oe��){
����A�r�0�� ��D�A]�>�)WM��l#�Da���)w����G����Pe��i+�?PL�OX�?�pBE}�>�_��T���-d���'81��B����;�
�Dv��.�q�����v0"���>�����}������M�'��	^�Q�X��2E�<�>�2��}(d�O���]�����y�JO��eH"�h�EkD� �������}�M�&����U��:"���_-���b��1	X��-b�Kvk�������N�L��bo�Q��u6��>�B
��M���#Ztv�3h�F����=�(e�!�_w(7yuC
�iQF����1���T��
5T�;&UA|��j]��� �G���7���uq@4���u�b�@�-�D�l'����Dc.�>��Y���
�h��x����P���,:�IE'�����Mf�?��7 �#�;�}��`�zL�6�A��Q�����|Oz�O\+E��h�O�>u���/��|���X������#Te���C�6�a4B��)�������2N%9@z�a4�9[�,h$���a�@���*�y��8+�TF�����"�[��"'�1�K�s�P��$AlJ��K,���PM1��g����#��o����=>t�N��-��Ku���a���e�O�r[��"�mX��F�4���7�0�n:�*����a%�x�����E�p/�����oF�qL����������D�������:W]���5z�5����V��v�)3�A��G�>���e��a�a��Pw�r��w���#����/���h�3� ��bT��U�3���f���S���;(��}�:�]���gN����K�G�������>�j!rGe�`r�f��������%GZ���#���b��K�����-�=jAQ�u����2�G�V��?�RE���hQJ6F��?,Q~rP�L����H��J�#/$f��Vw���\����fEh��*��u��B���
g���p:Dn���-�i���q\�&3�<i.���vb�"�_���@�h���O4������[N�=�����)G��+�o����G�T����0��4�k#���4����=��J����I n���$M
�
� ��#�Jm	��}j�w�W_��#>�0t��'}��K�)s`c�aH���S��;9�@���=�Zf�>�r�Y�`M�/�%�o��}�7����;h���3}h4�
�^)q��^G��
�F�#J������{�F�R=��hx>�y{_�6hn�������>������g`��aB�}.
�O9qGI(
�P��}!���t������}?��X9���w1z$��� �3+��� pA`3NJ�u4?���5R$)Ztf�JQ��:�(����!D7��X��|"��Z��{
������}v�U�=��-i��k�axJ���7��l�!�i�����~c�/�
23N��^�zh��,����	������LzC���w=
/|��Nk��1|$3�f�BM��������P��9-]�������!������;�,��z����}~&�A6�aF���
�!%���n��d^�� �P��������t�:
��OI��U@5���d�[����R�f�����Yo���g���[b�:��nj�1�3(���N�����t��6Ql���b��=��(�"Z��/���F�4������J������#S=6k"���8{L~a������[`�e�K�@3"�n���0�}~F��l�y�s���p����z����1�
u���Q>Y���B����}}x�MN6������j��E
�h
"
6��XbG�kw'�5����U���_6�w�F�����f@���!��4!&�&�"q�Hc>�6(����������["
�\������ �;=)7�R_�c%����������4�k5�����!������;
7�Bd��-��p���4� o~���A�au8�X�M�}�F4�Q�ok�g�����g|������IY[�������*
�>:�!v�\a#iQ�I���Wxm�U~$Oc*��|���%��C���%��#lln��H�3�N�X���J��J�D�a�"Y�Zb�VE#�~�������B��K���� ����z�:Q�����U��N���!	��P�������)�~�B���(�k�@���0I?��Gs�r�ea�3h�����?�R�
�����i�A*�Q�>p�:����Y���:�q_���\�H ��D����A��6Q���������~W �w5[������*���48�����V�����o�����s����2.!��Q#Y��$DK�$6�g���W+FK�\�����u��^�?����:��
��''��V����QX�k������pE!/!c�|r�u��]���	��4�<��:I�g'�M�/W	�n	����,d����a���r�V���j?20 �=�.���t�
Rp,#E=��B�f>�+K�x���RH��2�k��[�A ��9`�����Nt�\��bE� ��(�S%/^���"�Q��
V����:BP�n�`Nb+�J��6��=�����P��+���U����v��;�#����������$�\����v��/�_,����!}��r���
]#�;4w"�x�C�s��J�o�2d.��0Ed�(��Zp�$�����QS� -�2N1�]_�]�r���&���-�>�@B�N\��3?��C�T�I
4V��n���(��&�\�����Q��.4�c�d�'O����L��C�c�==�/_���_u5��Q�M���q�*�5��am��":an��2���&��%.Y��~���)m���t��g��.��������k�.j0����W�E)�����2�`Z���N�xM+�	%�,�7�pkx�Q9���{���� ��2�Qy�?a�3k���[�8*X�4���d0a�
�q/f��e(��)	V2$NDH�g��r6����	�b \R2�\$he���Q��JN�OWL����R������4�)�d�$�>%n-cL��^�����g�������m+��b��(�-��$��{g�-����t;�{������!��eHB�W�Y"l�Y>�e}��%��:2�k��M�Z�)�~}M�=�~Kh]�����N�w�V+��D }��1x���y����@k�*C��Pm��=��=�:�v�%t?�wFQ�V����A���m�A*�?������zk�j�"P;�Y��m�@�!�8q[D��c��w�8h�\���A�L�m�A���{hwn��7�'*�w�������]��!�<`k�p]��V)�K��d	@�tM��c�����8(�A}���",���?}�>J: %��rE��2�W'�A�Sx���kD�=K�zb�H��;NK�����k2�@�)����d�G��!������DQ��g�pW\T��~��f���,t��{�
5��Q���s�����Jh�xP-��, {�mL�:�Z��f��W������}���10��z��cBR�m�A�k%vV�&�{��C��m���S����x�|����(_�G�=���P
�N�t�Qet���������5,�pa�
����}��5+ulW5� (^�"�M�'a,�FP0��6�P\�#n/45jc�
����2��V����Y|��B+2��l#������|�^�E�H���&���m$a!r��EK�A>��zZ���\��e�������!B�����5j ��T���o�v�g��fIt����O�pM����j���@�w���b,`�+�J����;�x��V%=X�A����RM��N���%h��(�.��q�vd�(#[Q�6�mVh��W��?�"���_��P.��<����W����Z��QA����C=����;AJ��8�^O���R4����R�e�&�T�b�����{403s���<�w���]'���?}�f��p��>BQ�#D]F�w�@���I4�M��
X'�`�`e74�����G������w|G���a����#T�k�&����'�8lPh�%�>,��	����30:�X8�c�1W�}'v�(�d�E��C��M� :A���C�e��I�C����)P�����~/�V9�X<�1����'"-��@u�+���������
����6b�C
6[P|j���[�F�T�6�vV����c8a��A]���1��:FT~+"@�uhQ=%>�����A��.(l"b��v#�)IT��Et���-=���������N�����bpP�As������m������jVd��-�,@������������/@Z��P���?r[[���P<9L����q;��N�����s�~��%������#-����3/�������OqRh��1���1��c�t��A��lA-!u��#>�	���i���]K�����a�6�x�a����H:
�6P	���?��REFT���DY=�G������k��L�B�$9�{�fmR�&�1*��l����U ���4����;h$��2��/S����4�;�����1c?�|9���x��AV��HWI�1��]&�UNn�W����E�N�}A���uy���6%�1��+�F*!A���r�S�r-!���$��6�Y���5����
��*���/��p���y��$��}������S�P��1�!�ae+�a#l��(jN6����s]�M=��3E;�q��!�(,��,�*HF�=H�@�1����l��7x�h ���Op�H�
�dp�I�����n�A����h�jCV���bB�P��������H�.����A�W���)Y�D!	��g6vB�?��2�E��Hc�MH�T�lA�"�k�L�d��Z����cp�}��1�~�q����Dkc��Zx��{��J��gS4��P��b����(g��1R��Sj��M(y�<O��d�p�O�?l�;p���TQ��AJ�c�Bqg1�E��a�?�S�8�1$�I��>s�W�����`�<����B>��D��
hn��H��N������9]L�JH@�����l���������P���*�:�Bgt�������7F�����Je�=�i�
A��AF�F������q���;�����Q�;�
d�6~��j�%��4q*��9Oy~H�B�TN5���(�kT�G��P���B����!�8�� y,����F�:-�����7�N��2��bh���Z���T"���+��r/!���t�E��{Dd��
�5�%L�Y�v��w�9�A
w����Le����+��
���l�B�N>l�s���a��&�;�O�s����|":z��ZN������n;�uR,��,������B���@?��� +�[,����5���!F��mjD��n$�.�&���p�����=����$q����;���KcuT�*~9X���[$7����C�I)
���c�{!�vQ-	��'�l��i�k��G���Xb�@q� �L��P������UhJ�������b���h������%�%6�{�l�wW[�G���{��%���~�=�*lP�DK�S5�!��d�nB�U������;��,B����WSV��p���2��KD�C5��H+��v@3v��c�;���c0b�R����P��{������inc��R��K�t��l��^a�%����%��%�w](�bT'q����po���0g����w�1v*On�k"�����j����;��wi���

Yl�Z)���n�A�uP���;<��w��K��l��
^���$�-�Ho�h&����?Z��xG�P|O�b6��;XV�
�t��|'��A��y��M��xc���zWM��mv~J6D��A	{x�5��XbA��
��E'd�^�&���	����Dt���-

�4��S��,IH����wd���?�Q���O��1s��S;v�(w��F������TA���C��M���Aw�0���?����;2��5���b���`PR���myP��$��<q;�y�b3���{!�[D��J:��Zu�6m=KfOy��m1���b���d�#Z	�@��Y@2�S�B��BF�F)�K; �����"�����x\�� Z������g�bh�^���Z<�*"O)�8d�)���5:����	�M��!r��l�`�p����������`�m�{�����2!�i�B�2�Lm�D���,�Pr�{!/zJ��E�0Ix���W���-����f��6�q���&���b���P��D>q��S��i��F�K�E�h��L6��9%@���i#@����I�AB�=��
�}����:G�������~�!�wJtJL�(Xc�
a�%`�]��*7'�
wJ��*�1v���t��;��t�p���H���E�^��UC��b�@���$��b�@4�G��7�Dj��mh?u�Q������>-��
Aq?�H���0�������]�K{P�KZ�Wf�
���)F�N�I���i3�S(*d�.T1j`�;��9���R"|�bu�����QKR�zoe�2�\�I�Rh�*��b:vK^S��N�����l��d��
tE=%Y��K*�/R�?�eF�r w�Sfp��|�!�F�z~�	g���F=E�P��gQ�1�Fer�#w*�[��gc��L��bm�AE��`�n�}n%OD�F4;WX�hL�2E���=)�
"vV�Q�O��
���uNI������z���a�6�:�/o��=.�
ME�����u.a�
���!Z�,/����}�����n%^�K�Bc4������d�*��nwI�4�F�BS}���b���F�8������3g�EuEHn1p0����_9�}[�"{�'�7#�wYb	@���X�o4r���SN�����4���oU+�@��}}T��@�,���@EMMd���������D�B��.�%�4u��\����U������&�m��Y
Be(�����g!���'���u&� ��B�K���(����*��i���.�k4<��&�!@�W5���N5 j6���qF4%����e������K�!5<��_�K�f�I�(cj�Tmc�,}��W#���5P�D��Z���G`@Q{w2�j��������T����ACm�j4��k������1
������=u�n K���b�}~���q�A��`����������'v��F������{r��������@g�k��gT������Bq��'W�M�r�
�$E�F������L�
t��T���j����W���fU�EG��j�@W�U6�
�@�Hjb�H�z�K�1Q�I%@��~���](�4k����5�
�5�T��e���n_M:�����6 �2	;u�����j�@�D+�$\�Z����=�]+�����>����6?�U�(	u��]��+���hb�!�HM��������\5J��0�����Vu��[5Y�931C9�G�|8)�T�h6���7I���&������J�sS/p��,,z��g���$&�$�$;(�-����P��&�A&p��}gP�������������T�JV����`���bO�<����S��GC��F%����p����q��%�gz�cN�|H����Bg�M2X��"�j���\�6�;�e:�Wf��mE�x�f����A�J3���
;����.jd�n/��B�xC��R���b[=(�yU�%y���2�����Vs5����5����\���
s�~[���a����]\�������%;[��v�&���h=^���N����w�d_}�~>12���w����B��fXAV/�kg��fl���
4�V���2��!V��=�\��	����``�������|t���
�0T3��-y��TT��1�D�����6Z�a��
�=�]T���h���-���()���Q��W<c,�/Z��<&�������6SK/�M�?,�H�$��m��r��%:j���
�7:���x���O��M����M���)=#���WK����-6FH���+�\#��b;;�
)�Gz���6�"���-����r�@�f\A��n2����L3��S.
E;������~�(��Og y���2�����y��$a�v�D��e�N���%F��l�N���:y+�c�1{���m,tBk�$���v���09�`���������a�
������r��.��{��^!�Y3��b��AQ��V~{#I�
	:�A�=hQ&�r���;�
��EPTU����8����4t���$�E����b�@�"jOc:-H��������LfZ�����&Z������I��@��fa�Oc [�f(A�G6�?-P[
�"h�J�h[@�z^��/+RQ�h��%�b��LwM����R�O��m��� �L0d��������3��f��#o�t��`�@�)����QlV�V�|��W(=�-���� ��,�d�vZ4�`o���B6�,�:%�>4������m��Y���)��A����H�{C�v�cO=Z���-�%s3� �Dc�tB����_�q��IY����d����;�F���������c��~�c+Y7����]+�-z��a-���m�{��U��9��'$3|���r�]b���%O��n� t�%�>yJuf������,�A�z�h�E��$�G����(c
��h�2���Z�uK#U@V�-*������|�kC`Z��u����)���D�Y?+�����@*�����u�v���R�y�<�n�A��%������H��������2�������E�dw1+�� R�+���]���H�jv>L(s��8EiH���s���Z�m0=��-$g`��nBG9�'�\a��{aU���ATm�n���I
��<>�~����I����JPx<�S�QBH_(w6��N��#}rOrt����Y���	����I��r��)d"�p��c��^a�����hB����S Sq+
�E�_�N��:����HQ�����UQ#���
�5�/�|���d6j����������������"��������S�uoA��o5:����0�~3�L��S0�Wo�H��u���%���o-�!���"�d�G����������c�[i��AO\���@�I�%�OB���%����!E= �3�ERQO�z���p �%!�N<���n�9��K����������6w��t�'���~-t�1�z��]�B����g{"��"4r^�Ip�����Y���:n������}�}��W�Sl�{��G����e�0�h�V=�����6vH�P������e���~ �M�C+t��_zOc2�e^b}�|��J��IuQ�JD.�
���HD+�+�>2�b���M�1��c������)�hf����d�U���z��9�1�G_�Z���;��;�4hd'�
����k�?�H���������
c	��qB�h`jU�p8U,aP������k`~=�GS�@�P�m��c��3z�	ofGc
���v�$�=�
fb
9������A�����{���`� ������^����kYIeA�BRk��?'�b�s�[�O=�$V�]\�U����k{UUh0��q�(���.h�9��	�~o4[�	42�^���y�v=,��r��M{ns��<���_\mP2�F"���GG�BC�R��Y��/;�-�4�N�a��eV�'�1j&�MwWO6I��Z7C
*���� !OH2"k`o��3i��0�`����h�������#a����Jx��?�	b�@����c�w��.Kt���*�gVT�(�Jz�X�;�j(_\PAl�a�@�-T�
C[|fQ4��C��Q�}�]��J�@u�0b �^����j���Tsl���S}+��q#G"?�^�3L�
}t���R(���[��k��P�Rj���A�!�����vFK������O����bd-��[��E��v�4_F��CS��}`"��Hd��$P�H����b���\�iRpc
��*�B��%z�Zc*��'�(�/05:F��'[�A���1���PgzL�
�&{K���-@������Am�*�w��B����_������ys����|}-Gd�0��������C���F�����s��4��l���l�u�oQ��1�q���L	�tsdx6U�#
�+�X�jda�4���5����� B�����Z������g��=�\�����"��3�r�wc���M���O��m�h�L������=����Y��-�F������c��o�L�o�v��|���<�p��;dY=�Dq=��	8�{�0��N�%VQ?�������������d�Cu'�h���$�w�f
�a b	be�v���\���|.X���rO�����+k�0~����9=��jj�wScM��@�H,��5"�����0��Y�����a�B�T�*>h�B<������������$�s����'"���d�04��_����R�����B�OX�B�����	�k*-'��c�h�q��;(D�/�"�����8�I�3���n;1����>��s'��K:�t���R~&�yH|+�
�����f��*B����e�L���S�n��UC��4�O���iBJ�}_�������CM�i���4c��Gp�A,��D(��p��6����Ea~!�3)�y����c�g-���~���3���9�/�H��n�.z�(�
�<t�����D*!���o0���g =xt���l�G�i4|~�
x�9#S���� R�4��"r��a���`U��]	��?1�?�Gl�F� /D���hV��~"�'g���3�aU��-�S�� b�*��.3
wuGL���#�ai*fw"f�4� ����i�����
Z�+
� �;����p?����C�1�3N�rm�'��X=�,��F�G[��0�������S&���:k[����gL��x)M��5�h�<4[
<�6C�Y���:����A���P��Q�+[,�C�_�#R��e�9�r�B��@�u�B�#�z�m�:�8[��O��`���Qwn&	�����Qb�A}��!
��E%gZ��%AK����1
��Vg��j	9N��D�,�@����|3��	���fYas���sr�d�:��`�b����������>�<"A��>h���	�F]�i|bKf&p�mr�'
���?D���g ���y���3������;��Y��X/��,m�+���R�d�0d����^���3�Kh^E!��8]�[	:�����R�$�a��sE�D�~�@�K3Z\WH�#l%f
>�E�1��@��<
E��?�<fe�
�&[��j�~��(�"{��#e���4��Y1�x)0����1����	����;�����k���c�L��Q��]'(��PX�b�a�`��Z��S���a>_�P)��OH���
?�ejY� ��4��6z���"q
���]�D��x�4�P��t�[��Q�I�oL�"0;����Ph�>a'�B�#�Aeh[L&�|U+1��r��q- +���(n��9�����G�

��W������o�dL�a-���.VuL��������>��q7�"�R�-#j���f�?&::u����,�,+F�
ai�����.(*T�<'���}z\�hm[���J<4>-�
��2L~RP����V��m�a�5�0c��|W���u+��#sg�7�"W�M�����4� �'q-��'�#%LM
��fp�]����#�F�5r������������Q�r��=��V��f���
r�6uY	j@���+��D�nY#�Y&qK�����3t5r.F}W�
���mS��YHq����$I>�h��`�w��Y�&9���,���<F�&�[��ze5=�J}gP3Y�T�Rd>�j�>~�U�,Ok\��!�b��[���V����C�%��q�t�->t�
�D����e7�)ZT�c�2���C��8����fg��I���0mU��V��z ��2����k����?�!���k�RZ���\�=�s�p`n�<��L�E�@�X����@�Hg��_�0D�\�	��k���2N�O\3��V~���,i��D\\UW�`��d��eAB�"����R��e��1�wv@���\42q%ZD�_���L���h
Z.{�=�}-z+*�Y����W+���\I����Y��ID'����J��B�3;nv�`@��MQ%B�[�L����	��;�F��2� sP��Y;��a�QT8�(P��&���JV��,��^��[�hA���c������'��2�l�����'[:w,
��������k3�p�;i9Z����7���e�A�O[��Ik����gUL������IT���"��a	�eac2L�sSm 4<��PJ�Gc0BN r��Tf�	�z�;&L�4��,�[����
=t�Z�2����){Caq@��m�A�w9���D$2�w��?����W	�p��r�8������I��������[[m��z?)�� c�E�s:�R�A!�n���6:����j���A��~P�o��~�����Y��-�@�D
|�h���4e�>�I�#/qhx�
��h���a
	����H����M�����%�/����`z���NJ��Ad�
����
��!	d���>8�K��[G���B�!2*��9�z~���Q*$��Q3b�xO������?��Bz`���P�TQ��nq��!�i'�A��}���
����*�.OS���3 xc�P���vB��f�lv���Pv}�m��.S�:�.�@�3e4���������7�4V+��3��t�.��(bn�8i�x�H��>�^�F�A�{����"j�8(�&{��0����#fbC��6� �^C��=�f����G8�(jG���~��o��sL�#"��� 
�������q���v��v%��#�� >�-�$��1\g5E�����Dl+%@���}���e�<f8An�����f��������b��v���r�L�����G�@(������JAz�mA��"��;�R����\���g�t��F�,"y@���%G��C�����FZ����A��h�A)ZfK��\�b��$=��'ge*[�w\�;G#=�f����X�o��\;x�V>�
)r[y��2y�6���K����A{�1i��
(r�upwB�^�4��������G
�&�'&���0p`n����$��F�Tk���e����L'_���J��"<�EB�B��q�Z����
D��G�7j�1�����[�Q2(�-�'y�rj<+[
B�(n�p�XDw�E]�	�vg60�
��\E�����	���T�����D��p���-��2���u����r�lC�i�IN����Q4��<���O��V��de���$;B����Dg��
p��-��|��?��:H	�d0������#
�����X�)��.�v]��Z�Qv�����_��%���$+=��&�J��d��d�����~K�D��D�*L;���k��oV�#UYOc���X�
nCA��A�SS6��I������@�������@G�c�Bk��:5��c"���0?F)XT����5r���u��a����cDB�c��/`6�����sd������K���5�S��w>�5�	b�1
�12��X�,mO�l6��!���H\y��hx
����2����XM�+B�O2 D|�>F�U'Q�Bt���)��������~�=Ra�����m�U����0FUlj�c�M�$A���Q��
9���S�0&���Aoj���Ki��!�k�!ta�"'��<�F`{�q94�~?T#tc �A�����"zN�����h�������;���&�!CO��$�~�JbpC8`��vz���D���F�����p�VB��-�u8++��h8��s����M���-��F��e5�7BtN�
�so5��uC�mKw)����E<�������8��K��/\��\����5���!��x���-TF0���2���dZ������Z��p'0�4��)<k��P���HL[1�u$���C�����$:����u<��m���foBPx�1��������'R�����B}5�Y	�� ����/����1�l����2�� d��(l�&�Z?9- ��9�t�FO�q��Kw�d������lx�����p��|�o�?QEDO@��N�
!
�	���j�����gb��'���Th���m��~Nt�.i;�Y�clCz
TW?Xqr�:V��Vzn���}��J-
�YX��^�S�_���1�Y��v��]6��T���x�@}���U����7}�ce��8����T�����d�I!���%�j���%Dh��D
�����t�f~G�F���x�
k��Kx�n�d
����;#T%V��{!��-;��0u��?���]2����2B���8-�x�����-B�$�A�����Hs���8��owx,����]������;�}_@������V��n�-IJ|GW���n��Ub+���F���%�h��%�W
�)�����P\��"!��&�}�,z�oM�����-y�i�a��Z���sK�E�����?������o��=]v�`g*���<h��B9
����~��7��wdBpq���V_ /0W�����.B���������^���)��A�y��d7*��^W���nI��-�:'"H���OV��#����i8A������W����S�w��u��Q$�!4��@Z���*0c
J��O�d�������~�Ab�ugp�W���M�d��`���N��8��Y]���� w���)���G��o����f_�6`��Y��=��mS���|`nw�Es�	`�q�g��3� ��kw����]��@�q���q�{%�)XR*V��p�A�$�K'*���<^y���x{�8"
����}�&��}D"����/��)=�]t����V�!OW�QJ�L���DFME����T	��x���R	�G^���=�����[ky�EI|��q���0��Zq�Go��
;]{�]_���<Q�D>d�wVL
iw�9��B�/��������D��>;���X,����'�O��)�����Q7l�H��L��4YF�)�*�Y��8���y��%�Wr ��r�f�U"����>}��;�!�&�S�L�}#��Qr���=��DUr�en��r����.�����'v+����r,J=�$��?��#���7V�x%uQ�;��Q���x�E'�;QX�w�ef���DX��Af��������c����������S��p5��$#�Z�����/h�,%��=����'kT�'r�,/���.��0'CG�����%�X�,Y��XF�"�H[������h���E������y>|�G�R��h��r>A������K�	���<�PI.����5��vF��
������Px��;������hz�z~Gb��;(^O�S�����3|���6P�d�JRz	������g�l�;2\��'c�;�{���[o�������p�/tn_��d��;�o?S�.M(������-�
�%������g�b�����7�H`�������2�gm�b�d�A���+�&�����������M��W�
�!*J�����X���?.�KL����Q��a�Q(��mOFD�}:e�����(|;�7t����EO�?���!Q����u�I�_8���Y`gfr���:iN�A�7dZ��y@������D$�{�F��Jl
Il���Z�%�k����e������QP?�$2B�[�����Tw��Y�������j+A/��5J��80
�>F0dA��<��z�
�XFWgH��b��,�O����_;�DA�������,�������.����j��bM�)�D����G���Y�-v1��H���$V����,�F�"��)��T�;�;t&�_q�C��OA���TZ���������lCI�jG�}�>�����u��Xd�}�;��&���Y�`|�����lx�H�����=�;�(�sxs:�;(����2d���jj�v��s'r+����������}���E�����T��i�;P�%@Jd�&�l6G6>���w'��������������(��ujul���	��-��#q���F�D{�y�H��D��������A+���M��M��J����*��#&�>�(����w���������dS	*n_4!�=���r���|5E������@�QM��l^Q��>��b��Q?����3'��9"��+Q*~5�@�����NzS�d���5�O��";C������B���7��4�X�7���I��[�E�=!b)���e�b��;�	|��������	��������� x����@����.'�X����VT��&�y�D����)����PV$���^���kdb�W@&�*T��e4b�IMv�{5����%������;Q����k������rc�-V��'F�Ih����O/��H����j�A?��#�����&�:w��{�H�����;2�1e��g(���}���@�W~�t������;����n]�!�e�kEl^�N�0�;�0�;�;"�M(�^qr��9w
[T��!bk5 ����;���k��R�	���_����=��U��8��
W�����"8+I}y�8��m�Bg�|����F\Y�h�B�3����\�n�/=b�WC��+�����;<�!�0��m��4�
����.Q���a�6L�F�8H������v��Z
�7�a��-y;�H�3xU&D��=��'��m�3�(��{�,��4��Aa�(�����	_�df�;�
�9�w������R���PUL����	�@:�j��!�c]���Vl���Xd���eU����zg��B8b]�8����T�s�Jq�y�����	���+������Q-�`�������QtR[��^yJ)Q�}Y����U��(���H.�.�5��pN�`T��������hSM��^;0���E�(�b�����h"uw��8��{zb��J5)�\����`[�q74X�N��)�*�z#�������3���7��T<������|�����)F=��);�	��dv�9��k����{��h�H��j{��SH���~I�*���\K�f��nO�s�4��n#"�5c���"q��d31eW�����:�mh!�S����G�hE������?0BD3� nX����b��f���[��$U�%���vd���fP�:�-��W��RG��DA�E��j�Q��B�z6����Y �Ybc����PCz�h���'�^Z�cL3�����4U�����#�
��-9������t+������jq�����i�X�?���tVH�X+qP�����+zA��l��G-��\�)[��w���_���s�GW�f`A~��pZ���K90�Y�
o4X�����L�x[Zh�E� r��'����fT�����;��JxG�7XA�1Z��NR��SuW���/	�Q�z����4��p�w��(�����o��h�3�����6��8^���=Y��IP���y����F�(�B�C�����U���&�4C��b�`3vY3" mz���'���p�.�B��8{h7/�6��%����J�D_��aL�x�j��E������+���S����u�b��@�Q�b��z"��[W_7�������0b����F
�{��8);���������#�y(����J�(�E����vK.���v���CK����?P�����^')������"o���4�����������������A� &�d��~�w��E�N�����n6�v(F�r-[�]K�@3y��}p�^��De���H
��?D��X����A��p)�������8��1V�&4���*<�)w����r��9hn�D[jn������	w��E�A~�S�h��kR�R�Il�(��� h�����N��i
3*L��,��[�w���������?��w��e��=����)�6�&u���V�rg�S�OE\���r�P����?����+��>'���R�'���}j��(����(����Q�mE\aP��E��v��-2*�����#75�X?�4�p�B�%�{�z�����A�
,X,�GE�T����hA�=�������Q������5���8\p�=1S��D�;>*Oz�����F������:���	KQs�������?��
vD����/%B��S���|cC`e7��
�k����Y�G[(�5���P��B�3�VVW������Fc��x������|��F`@�#��n��m�j(2��������1��/c�$BF@Uw��Wi��AJ��K��b��,�^Z��	tp�x�d�n��%��d9 �'�)��I�_�y8Z��)$�n�V���'*�����l���ig������
���D��|���z�\�jf��
��Y{;D���h����uG`���@�#�X�z��4����
�*hs���P��5����F2�^�x"��8�e�>4�i{������,L��0hO�����]``��R����
���)>G������Y?ov��-���]�r?��yc�-�/)#���'+�{tfmHr���$�	r�q�W���D����b,g[vp���T�3��6�!�h�1�}�!P:�UaS��Ho?�h�q�Ut�n�]�I9{
��}n����D���7y�+�6=������]�\&D����x�a
�`+*vH�
WCd�n<a)�X�|U@#��,0�@�������M�����Hc
�*gM��'���UF���3~��b�0��E��a������O�����#����(#���)�c	����lA���QWBQ��7��B/�0� ����f7-�a�Af�*��h:*D�mqs@l�a�AZ\I�������#�Ty
#�iO�h�c)K6�~��n�k����M��]���D�8)�Mu�]?�^>>-��N�K�[��]����n��l O�a|A���b��0��{�R$$sc�b���y�@���`��P�%���
@\�l�^82���V��F�#I�>=��B���L���D	����>q>S�G��:Th��;�Z�U-@�/�����L�)�6f���1�0^��Y-��V���u�-��xPSw�\GN��(F,d��e�_���c*�XqoQ�
2Xhkq�
����S#�a�bX���4�\7�{�B8����9zX��[�=��F(x,���;n���L�~G��x�T�2���eO��������2<��-�6F��i�A8�xd+�GV)_Z �F�O*;X\�����~���r���]~�;y���1z{�v;����[�l�u��>BJ�a�B�w���W�,5G�����mW�2��*UXzB+F������')We����?1�Y�_��!��0p�6����vfc����i���s�?K�eW�������H�}���N��C��aC�X)b�2;�P��X�'w|+0��{
"c�����A1��)v����PZ�H(�}���!��H��b��/����
���a|�G�cl��J[�O���9�����Ef�B:R�?�|�z$�2�f=���N�hD��}�h
�j�/�;��d����@�O;� =�"�Y� ���4 ��C#]�$�B����h�/�f��M��eSh���p�����������+U?�Z'���K� �;T�N��o�c�qv4Q��6t�'Ao����� 4w��g����I��@W���aG��4fa[i��O�&zO��J)e&73�G�(AH�-�g�����C}�����i�b�I���Bb��M��������y7{�	c;9:S�����Q�����3�Z�1D������`�42��
AYb=�����Y���9����/�k��G� ��������|~��'����m���F(�:���a3��e�����EB�g
J�8	C?�5�0u��"`�/b���F&��>��G�Fh�4��T��QK�o�*otn}j�[���d��A��X�b&	Z��D����9�|����q�0�@�k+N�
���F�H
�v�D�����?�E#��1a��@�l�KE*s�������A��Li���Q�<{h���	�jR-'�!�3!�Z���������� f�PG�����h��LN4��8*�j�>��@�dB�i}��6��/E��q���n���s�	aenBw��p�	�F�r�-������"��H<�=�KRAX�P����m���c�,�`����"�P����?�	R�a,�d��
p�'��zU�bf�����)��2QXI3%Ki��
�^f��&5�<�B}s�����r��
;>��{A������S��Et�9���E�����������@���H�
�e���
�7 7�&M�
K�ww�������4���V��E?�D��i�aIe��4����f�EJ�#�I�}����_J;n�HE^0�_!M��`���UV��b�l�
�|"���5��L���-�';
9����R�Q��A��6m�A`���TM��C��3��jq%>e�I$HR���5-
<(�����:�R��U�O�?�'�,�"
�j2��['�84�������[a���Jd�O���_U�RJE�.�Q�q����
����&���#G����}V���U���]+q�hCXIP@�������.��-����/2���nG�!������4]�o��=m��S�'d�]:j�,c	���#9�
��a�����gK�\+X�����zP�*��c��S�K����x��U$Zt�Z���Q�D-l��dW.c�NE�����M�D
r�S���&�q=�����j�m��lWR�-��+����jL-k�%��o���0~�2&���+�3����,�8(����J��Zh��%��m�F������+8���8rZ-���K��KQ���f������(L-C��_����#�Ay��������dx��xmd\��t����RI������@q�����+�
�D~Zh��thE��N��br�cS����TH��J/c���wCT������@�buY;�}�2" {mU=�t�ZF����$�B�����_k��#2�Y�`�Cy���`�5�(!�a;����ie��w�.|QL���3 �e-�Z���F{
.N�Yg7>C��q.�N�G�Wz�D�b�����`����.����L���$��Ack�`����.mII���+��y�hU�l���������'%G�����d�k��+�������e�@{���bD�_V�$�A�Dy�EZ`����Px�u�)O�qV�����Hq4�i}�#�E��#xD�A#���JT|�\U��ZW
NUV]3�I��^!E�2H�����������
�N����X���2�M4����V[>e|���	bP����'��<�{
0(�Y��0?md�� �~����`\�[����$�*0E���
,Q�p@��D��:R+�	��!5��	b`A"`��e���!k����������,��tZ�X9�o�P�
;2>0e� ����n�6�P�.�3@u�
�S~g(�]���j?���;�����!����a�$,��dx�Hv����h�%�Aq����tj-��v?Ir{BF���T}���`_;�
w�T���%>�-��E�YL�i����n�7z��Iq�m�<|��a�f�������^B`�6"!g��i�N��Pv	���������(����������,��O�HT��`��N��Km����;(�(��mK�B����������KF����
ETe�I���W��������-k���
|���~���5��F�4����?��R�P�YZ��v*���(Un;U=����v$��	z�5M�l���������)���p'���/�!d;B�Z�!��]L���-�+��9��T�X
���!F1�*�����O���.����03�^�X!hlBJC�b
��l�zas���,����N�2�C�6@!�|r��66!.v.��3�+m����+�)[� ,�!�6��'���
M�J��p��m���*;�j��f�6��@�=�Fq�R�]QC��&3����
k�#��	Ac�g��e�A�o��%i��'%���>�6� \F�HlpLB���6�D7�|��T������A�����G~���(��m A�������U�.�H�� �s�%\��6K���d2����
�������
o�����8���Gb���:�8�E�D��{�Knu���Cm#F��?2����IM��8zj�l#�B�`�����~w�7b�-I����hf�N4k}�b����w��t;�{��������(&5��F�|���2� ���;�"U0~�%�L��q&�o�t{f{��W�	���;Vz$�a����l����Gn��d���|h�����nA���9��z�0��n�`�	l`�V�L��y���B���26�������v{�`���DO��\�������7��ZH�rH�)k�[����,
O4��FN������T����D`��)���"b�I�����R�tG?	���]�e�b����I�g��{c%'�I�����'�������`�O��-��+�-���p�	J����I*����D�����.�3<�%y��e=T��3���J�[�v��R�yr�g(5 ������%���%�

�gn�'>G�V?@-w�(�?O�s�>g����{t���-��[�=	~;�Fz��������vw,9�!���#����:�b��K7\��0�Q�f�Z��Vr����P��~�������������X=b� �1x �&48��h�J���=O����PC	���J	�B���~��C���'�tm<Q=lI#�'�s?���"��#�pW�CKo�'�R�;�,D:	�����?z<FD8(G}��?��>�t���X�U��,�� S�������	�;�?��F� gd����G��M�������l)��Ej�����6���r����a��l�9(�x��%Qto@��t��9���u�UP$�8�5��(���TA��/����\������ S����!cg�n��&dA�^���D���g�(�+����������c�AZ<��a��o�.�C��*9�%W�L���X�9d������Ui������|%��<�
��q@��%�����C8"���pH�
�}��k��i�K%���
���*���������WJ�c����<�Y|�1!����,����������m_&��m�%D%+��)��(�L#sCT���[�������;F T�����b�{���]4���M4~�%D�}���\�A��;���X	
�<PI����l�����4�M�0G}�I�9��T��mHn���s���(�\��fs�>B:�� �b��dE@��w�;trQ#��;2��s>$%" My�<~�3�����%������r#G���<��������9$�����h����?�${�z��<�IO�J�wd���g�1��LA�9U������9�?�72��y��+�i���������1� �v]m�gv��L�S}���\�����;h~Gl�m2������JBj�w����'`I����[�X�����s?E����H:��I�
r3�������r��?����B����w�k�Qc�}l/2��x�cI�w���f��/��B��,���i"P�;:pi�AFFp`W��
Ig�9\����g�l���Rr�4CLRa��hF�j�.��yV�s��,
��
t��7h�o����wA�<ep����{Z�<�P��~�~�E�k��,�����3���;��
�-�q-wC4���A�X�j[!
�� X�;�;f��P���M�Ry0����?�9���2���0D�t.��%����),�~�M���D��d<�za��P��,�5d����An��������
:x'����V�I��!����%"�-��=��oPB������~����A�3�D'�Z���$��<���k��n$At�Ez�����j#�������p����ZKp�}��-bC���+��h�\v�N�;�����!��w��E�L���l�B��������a��!���t2���m���$���4�.q�������eA����{
EZ��U(9�~��-����������T���t�>6��X=D[���`T`�e�I*do���(N�l� �|e��wh�u]�,�	.��l{o��%�y����ru;��1D����A��n�Hy<�Q�����3��
��s����$�����!F)q5�!��<�&���2�A���4������N����M�c)���%�r>j
�tg���J1�P����/\q�=��aL�z��99h���I������;$���4�c�]P0S�gr%�>PJ��=W+t�-	uvq()��;�U,��Z�Z��b�A/��.�VgY�z]J\���d��g�n��0��A�A��,
Y�4T	������~H�<^�����[����>{����%���}5��R�!�i�}��ZP5VD�@����K��YvEhK�!�~�ET�� 2�e���������Z��P�!��+B�K�������yrdh#�$"Lx��^�6���t�x�9��%��w���^��-(U�hopzf��TZ��'�����������"��RGt�/F!t-���=	���x)%���T=w�A�BI��\�E��.y��MdN��[:�E�c�fP
�o������.F-�Xu�����qVT8[��!b���e���B�2�@W�b�B
{y��d�RW�%�EL��A+�XV�����G)�'����-����CB���9����]�($u��X))�n��~��(4��.qV����,J5y��}��K���]="BM%��\VSB�]��D	��<n1Zh)�9�C�`��@	B��(�:.�p��@i	X��$�Ay#��[���'�������Xv'G[�����'Y!QJ:����}�vK��Xb�$[������nv�/_J��������
bh4��,%�Q���f��=�6�K���������yY��L���������
.���>�S�Hx�^�}���jBi�Pdk�&�bZ:u�H��`,C���l�0�b[���JD������	�%`"���TA)	�	�
����y�c���(j�+�N�(�>{'2�D�mZ�G������.G4�g������
�Y%��O�d�:z�2�O�����P�r(xG�ds�'bJ�����q����r���=\���*%��mG�=���JSg�R[8�,�{���U.��M����������5����5�#C�y�"_�w����W����������w���+�q"��j�����<���R
Q�)������egD�Z�\��/����>vl����0���k���-�:���`���>dW�&�7��(�9�#���e_Kx�S*>~!�����+��xH�Q�V;�D5<;*4	�Inh��G`E%�-��Z�3�5BV�Ohm�ISc����(!P���o�]%��Q�M<�J�2.��Sj`�sZ�A�*M�n�2F����u����J-C?lr��[����F��6vrw��QuZc��L1�4�#����'+ZM��V���m���#��r��]�����������]1e�y� �������H"t �v����U�;eX�n8�<@�m��U8��7� 6���C/�K��]�}�)����6	�q���5�HU!�����B���+��s�n� 4���@�9��$b���5��������&N�0����rg�#������@c5��P�:b'�����Wh�d�}~�6�A������f�����/IZ��:h����H���.�����f�a�H�Q����|'���%bZ�~p�%���b���������,��R��}���<�������R�(�'�};/?����*��0�2����-5��$,���;�d�5�2���e����Q���"��1F+��C��EGB���;3��j>�>f���.���T'����vIB{����e3&��Mw��qJM���Q����[D��_��8QBZ7��-������
4��[��m�h�~;��o�W�
��K���&VM��<�9�v[x���Z��P�f��������$A/N|�D������jBv�HFPO$<�G<a��l"�|�#������F'���@����)���|�y~5#��	���-B������)�qD�@���DF$��=��V���48"�������Oah}<�����o���@�.7&��w����(b�Bc�i3^��Y�Lj��/e�BJ]�Q���p��1bBe3,A6�fb���iuQ�����6������%$'h2�.��M.��5�y������i~%e��fp�8����-*����Q�d�o5���*��*���lM�.���mKb�5G3+|K:�>�+7���<$5o5��wC�s3(�l�^iS��Pkw��BK��.���X�R_Z|�P���C�^�b�$�]�"�4c5�d�w���A�[P	}�'�����-��2+���-�:1�N�C�#���4����Dc�{$��uV���f��9.5�z�5���z:��0!K
"E��E�<��z.�3������AA��d�����X�%�.U���n�%$�V=��h.��i�[��P�����6^8#�}��N���}�z��Iasu��a
�su�!K��N0��fHb����B(������������-M�������o��N?�;*�)0���t��bDT����-��#����0s���H��q����1��y+��?�!
�Z�UC .��&�#�K�9A��8,B�5l3�{��LCO�XCA�u-1C��IU��0�ZH���Mm�-5eu
��]PN7E����~�B]�����}+Z_+�%	��A�>���z)��g���T�l������P�2�b[y�[d��*��z+�e�B$����H�rD�xc�j��"l������&���~���
����LV��<z���$����(��=�H���f��3�N�g���A��2�d7����	U�}�_T��`���44� �^����d@F3�������0c���P�K�����1��v�	����\��X5A������)'F2��P�W��o��
L���A#��/�q�j�1{/�����=H��v;���
�~v�&@P{fQ2���#�|������|����n�=nJ_�������	�1��n�@��`�%��J7������,g���L�P4G
���}�nt` O�����p�l_zm���Y�t�=J���^o@�Pg�nh@A�
5���Q�&|�����W�8������z�B�1G��+$D����z%&��wC�Fz:����^��6zK����[�L����'l�J�m�.qw�_�[���"�q��?[Ma�������[��#������/�k.J]t:[
F�ww��#G�g#����3:�z=�U�B���{�d����;;���wXv��������_>!Zi��O���2���pLt�����T��}��5����}{fN����������"������:�h��U���n��X��.��JFB��/O�!W!��cb�]^��j2V\��?�OZ�����H*�^�,'/
vv����mvq9�N����=�H�FNLw`�H���W����bRk7�Xy��g����O�e��tu
�|��+fT!�L����g��]���S����2����VW_��:�������
y��6�$�.z����Y$ �e����_���=�
*��tLy��:��A�,bV�cw�
?K6�<\�C)zB��#��"���a���.�����U��l
���l����V�Q�:�H]�mO!'�0	
���R�VO����o��\:�������Z��v��b�B=iU�)��4| V�:K�+��9��R�Ypkh�*G`@Ur��8��d�"��#V����sG���������<������`!3�aa�"p<�^���HC5�����C�bV�H�9T����$��QU0�+�4�aHaj��������T�=�����
�r#�H�������D�0���B�(�gf��I���������5�v��a(��3��QBY��[g�A�9���
���4�cu��L�Ot\
C�T5�= ��0������������,�k|I
:aE��������0
!�C��1a�L�K�Q�����"f���Lw�G	i�A��������q	'� ���P����T��%���R���S�K���Q�Zd+��Hv\��v����9�aU���Vj�_�^$N�����?���9�qA���b
7�-�12�������R��W��}�7i9���'��������G���If���Q�PX&*��]����<K���b=y��{��B8~>JT�7���IMZG�
��+�'*F��2D���)���e�8C:]o��w%��u����f������"��kS�p$��1���<��hM�B�i�w�A�1d��P�a�B���G�����&���D���7�IHG,�����[6�o�~.��-�'2�b��8�]�oh�lc%j2�����`��q
"���#<�a��a[�?���%S��+F�
������,�CR)�n��bed��M��|�K�����E���nG$������U}�m�zqQw�����r[�i��*k�����+�O�/%vK��Z��������)���g���a���&C���_���
_0������00w��J%����{$��N(DJJ8��K��T~��%B�)�?SVQ�e�6s��2{ug���*M�3��S'������_%�I:m�z�hK�nT^��}�H� �K�v�P/FM��|O��
m���pD�� ���n��le�y�C��S�"o����v�1�GD����r�Z���
�B�W��6�^���j�:
[t��)b��(���gt����f<���Qy-�P�=*bg����P��1M3��=�H!�er>?j������3*��((1
JTC�������a�Vg��v��%�|�A����K��[��?�=���rU�3dZ&��F,���
�~��k�8`�:	���P_�.|�f��-��9RK�4G������Z}5I"r��4�b���4�%�A���DE��4:�>���l����(TQlT���8(���4;�"�P5z_�'�-]���	�=(����N��PG���V�-��}�;�I��\�g5g�Q�&Jf�����\���%��>�K�M�C#
L��	w���������3�����h��Da�����C9"��v���f������+'_Y!lh���2�*VQ�Ux���.x�m/�M�G&V��g�h*�R�A�'��T�^s�
���YZ�A1�W�L,,t�DG!��\�����	2�Q��j>!�L,��l�4����o������UE��*������7��<geC�T�ix�i��H�H�&d�\��#d1�����3^J�?���s�U��A#}C8Q
���l���+v��o�_���^v������#��Mf�*I��b�����0��s��]vV���5%����*�xM��9�?�����(�[�4���{n��I|jF���C����@�	����W��;�
5l��3t�L��QI��]�:�6��_���<�>4gl&�^�-98LD:w�qhSH���w2t��:�,@���T��Myms�_{���� �(��o��4
% w~����2X`Z��k+b
O�����G6��jM�}6I�@��'y+,�n@�hF�J)��nK�e��'��V���6�D-�ItK����q��eA��-��(hq�������������2���O��A�r����cs��Zb���@�^��eA�0�o6���XqH^�&��]��U���Lm��XBC
���X�jdw��%�c=���D������,���aT:��h%�Y*�,��H*(f������~���t=��� �|q:�����T�O/�V�����6!G��$X�
�������8��-��>��:F��/1�V�@���g4�1WW��H��~v�
5l���/O�?�x���0�KK���'��n%�,Q�N��<+L����p�������h�y������W���{��������l=X�RS�o����8�g��N�_V���Uo%�A������(.*aYQ6 ���(h����]�I�k�%����?^�����	l�?E���tL_px���i+)�.�&�:��"�����0C�B��GBk������k���f��r���>G�sq@����V�L������V��X������v��[�
��&y��O=�$6���N�V���5��C_��$�p��>	Q`��e0�#��J�;��ED�P��}h�$��T�g7�yu�����l�����m	Z���'������}/�F����6R�\��pW\�\������`$����Rg��9�6X���b�+���NY1d�A�%�Wp����Gu�#�-W�U��O������V� ����;B�x��-2�_�<��r�"r��g��Wy���mB������G�p�}�w��Q>�\d�!���"��26��U����p�����4B���*������o�p��vLo	�hr��������l�l�w�Q���[�B���|�X�}��k�m:0{O���z���F
[��c�}�f���"���TG�"j0k��p��jj�Bx�A��mT�(�I�k);Q1���Z/��s�����
VTt�'�K4��*���$Y}O�;m�e��sO}�1m�*�E��[[^C��b�.��hD�����D,b������2���Jx����{���@�,L%�?�����X�ht5Z����r�p�L���{!^��th���/�����A��P���]�)~��	m����7u��2��}��@o���������]�vA�s������Bk������x2Y��D{���eTC�����U�=9��n#X����$��t'��!N���k��EC4��vr�/bO���=�O��{��R��9��`��Q�b��;����1�!I�����*��b�/��!�B��K��h�0�Q[�����j>�2���d�������o��g�D|��{j�|E�6��QG��(o����DK;s�rC����o�i��}C���p�j��O����DAS�x3.��u�P�F��e#���`��������Z�{|���-���+�A
����20�!X��t���6�&��}J�D�m�cj"�
p�a��nn�����aG��Tzh����rV�${�f�b���A/�n.w*�H��~ �z�
�ty�j�x5�Z�U
F6����1Ck�0S+�dEK/���;&Lf��!�v
ca��P��#�1"A>����"���H�1�5SH�Qn��
�H��.�'tJ��(.�,,��W�pj����_�)��^�A�a����z���6DaG'���F%p����_�&2��)�6ui���f�_d�d��y�$�������P��m\B"��pv�`�[<��7���
N��$u��?r(N-��&���w	�f7��,U�����'�5.��Kw����w�����n��~��9�!�mF2f)�<9K�gk�
dc������%-i���8h�I����h��/��ub����%�hO\�ni�0XD�8F��>��;�"O��Q��<�)�	���k�Ar�7��+.����c����?�����O�dE.�U��@�n��1PT@3�@N k���h����bNqBN������3����(�������>�l����Z�E��k��y��;:�OB�������@
�sh"�����#^S.�dB4��b���	
�ETYU�
�^p�����Q�|�S����3���1��ZL
e%Q�����cPA���;��=��}���aYw�&��G� ���DY��1�����]G���@|nn�g*���v�^�g���V����q0e�	��N&{'�l}�&qv�q8,�O:���v��I����z��`r1�"`%m��2���[Sf���5T���&K��ZH���.k���"��zP���v5`Ag ������Sg��#���a����
ZOqgN.Iz��sb@�1!L�e���'�H���g$�D6�+Q,�������*.Mh�L,���a����$������umS��:#��^z�V��Ke�g�~{W�Zp�
�b�b �~B�TU%#CX�'Lb��jT�|!����P����5#mD�Q��T_�7)�M"����\�{��E��
�	�}("�/>3���p��T�{w���4[�V4�����
��Z������u����#���`I��t=C��'���_/��R�@we�������8��.6��g��'��:��1���'RvW7ha:��������1����H����Sn�'m�r���1f�U��;�����
����Wz�=_��Q�{�A+����"G�����f��O����@����G�]��#�����ZG�C��c�������4���[(R�	��Q��	dq{����N�����>s��O�G6;��_X������&����D�k =/�Y9��OF1\��0Pt�]��9���=b��P�wB���;���PxG�U;u)�,�w�Y����;��MG�����E�bL�{�;��u~�I�#��?�9�J�m�_)RI��nN�*Ky��om|B�tE�M����9�R��Uv}Z�d�{�����Yh�s��}����c�I�~��&]�����:"��x�n�;(^���v��.�~)}{92�������.���5����qY�8���B������$�;��Cu�	�����4:Ku��D�w���-4���Ts��n~���'=W%L���������x
�<��n��46���z�ES��(%���N���T1� ��I_��~�Fg{E�'#�w��5";x��tW������t�w
�FK���^�>L�����2<T���g��tr����D�kr�C���Ce��XC���������D�w��;�Z��m��Qa�,��tU����s���b�f�;|��
Y	���~0�K���6[�2r7}7~�MKb��U�:�N��T�/3�zG�z����N����5xw�]U����K	��
58��������&�~'p�F)� ��NnX�@6�;�LIf+�!�O���>��DR�J����m��O,
�m_����(��bz3gL����D��D����n&���d�`�@k��!2��8al�>�$5�Y4u)�r��"/�T�w/6A�zI��p�CF�����������������	�~���;�u�����,�Q4E��;vV�Xj��z�
�nL�
�����S�[��7`7���U�=(6���S���I���D����Q�)�����^�2,GB/c ��!{'Q��_	��N�@���(�j��_d�6��Ph�s��!�i�������!�����H��A>I�����?y]��N���o�-��^�$��PSSq�(P���_�������b��2g�9�Z���,)�{�i����Hq�[^��`�6�|*u�Q��JPV�q ��A���U�}SA:���Ix�N�W�����!;i1� M�"�t����k��.�WX�_8�
F'���-LMP����4���#v �m�����c5���+�Kq_�����*�>Q>A��i6�Op���>rI��;��W�
��|������9������h���<$����v���E� ����e��~���o�"P�\K������U�vW/��C")�5��x�L���:�[���<
�9a8A}D�L�C�&#
MA�YhMQh�7[K�)P��D������&�8���o�t�
j��)�������G�p|SZ�!*���K�w-I�&���9�G��r��Y�?�`i��Z�q�!���W���A��EC%=ic�.�wk8�k���Jz���I���R��%�$�����Zo�L>�����.��
�U/=�U���2�Tlz#��-�jI�tU�F�������JJ�!����K��@I�4jQ���]���(�����D�QK���_�n��,���X����)���w������:�I��C��a������
P�G1I,��a�Q-	��Y�z��O�o���gR�
�'����q��=�h��{���d�E2����:\PATK�9��O����#�=h�MV4p������40� ]�.�.F�k����m�����wIE���/��Uq]*����B8v��6 De(� ���������D`��e.�����B?`�D�,F�;:��*��h���=j�O��������	���R��~Q��z��q{������Mo��{��E�$�&�=v#]�Cm���b�$�����bB$G���J?�|JF���^���J�p/��%Ru��|wt4%�A68����M�iu#���z���)XDE	Q_�j B�WF��~A��S����W����N��  T��O{Z�j�kM��j}�fQ?
�&����Hr`��D�`��La��FVu5���[n�^Z
#H%"� GB�'m<�J�J�jPa������]�.�n��zu&j���������;�YI�(&���A�
�i|���i�]$;mM����l�'�Z&�%�S��cM�C�q��(�;��h������O�I}�����r�~��i�~���I���T��(�z���\���VC�����
�u��@����?������@���j�H�`�1]B@lM������������:�BZ����lU���?!����PDEI�&�AUQ���".rmqA��	+��{bP���2�J�#�N�~Dy��0�;l�,����s������l��=XdYk���H�v����N��U=e��y������DqwP�Zf=d����}+<R�����h��3���#��'~��b��Q�t����U�ix���|�$�z�~��@��c$����
nl�5�`��:ql��l�B�AZW3�#i4��KvfKE�-�����/�����a��h9T��\������+#fx�(����U�����%�pz�
�.����)N�-��>CKw�R��6�,����f�m�����<�k5� k���n���;"������H�����V#�]}Fn���WF�s�5Q��fO�^
����������������j�a�&G0D��F���d
��Q���r���������b?�^��!��w��BEd�j�@��RZ{�$�r!��.I�`�`#qP=��g���~��660X�w��U����u��f���G�'���-��������VZ	��
^�������au����
����X�X���bd7c���a��c�9t #���_o�8������T�Y�������a�B��f��"�X3D@Vv+�W�5'e>���9�C����vG����$g���UdCje��^���A�-��F�����)#�����c��&��)�Z���}Y�o�4#j�6]h�HZ={q�fD�bk��
�Y�����g�j����@�5�j�x�W�2n���]S?����/�5��m~�h���
w��B���^�D}pd�!]�^_������[����� ��o~	�����qXm������K&^,:���-�
�������9k�7��EE^����W�A�����Gm�2�� 6��o��T��S��B>Ck����8mij�Gp���

�8���z�kr�c�==~��j��_�<���>��@��UO�y���hy�3���/By��B��E�-��%S��������%p�d�2k3L�n�mD�,���
��>c���g��(�,*N>�#�H���u�W|�s3> �$F9k	���]���@P~\���F���;U���|��w��^��.��F�O�������&���l3>��c�<������
(Dk�fi[����d(�/����.��
��������5���c\���4��w��]��"�,�E~�HC�H�w@k(�H���
����`��J���W	i�@v�
�V�]S7K~�HnZ�;re����`s��i��w"���x�������;�j^v%�i�}e����4�KR����24�g��5����;��q?l�%�Y5+b,�
91���v��/lA���X;-1	w7��x��e�o�)�� �wK�3b�5c����Z�6c
��i
'H|�*BM?(x�v#��;<�������^�� ���g�B�O`���75�J����������u�OL����:h���>����1"�BM�pA7���/T��'
8�S��������HN��tV��(0�����g����W�7�@��L5����h�N�?�GDz]ruZW����/����������@��^�_����Ph�Fm��h�.����j�u�
*�j����3��dhx��oS�*�$��W�@w����b.�F�-��>+�~����f�x�v�?{��x�=�����/�.��
D
�q>��C./�51c��4t���d(��U�A�G3Z��O�1��t�B�����3���
]{������P���P�/ ��F}�n�b�N�s�&�G{�n���F��0�D��[O�.�O:d����O��(��'iA�x�P��g�B=J��Ca�M��l��+��`}/���<��4��(=>I��+����}�j����~��B!z��	Rv�/Q��I�/��-+���[q�?*�w�g
S�G�p�n`� �^�:i�{���^�!�CL��q�"�3B1�������GT������-����Yq�A����OP�I��}a];�6���Y��B�(z���O'�����}�5�ie�3�J�V5b�Kb5on�3�Y�1Zz3CTlY�c�������nU�wcz��Y2V`����A�IR��^�����An��/w�S���e����.��5!X<�����E�x��(��vC��7+�`���7D�s�e�|���}��y�h�A��$�Z^�l
C
1<b���Z�EwO2��1��%b���jS�=eb�D6�_�Hm;4VWG���Y{��G��!���1��+�
K,��[���<>r�;J���������n���\!
;kO�Zq-t0;_&Uh"X��B��&6��w�v���,�6��^$0e��D ���gr;�j���2�1���H{��
RM����Kfb�-�,tE�5�]p<��$�i����.B��f<q�'f<��W]B����2�j�i���#&I�oS�������O��d�OXv�{7u@����#X�B���1�b�`j���<������S��f���a�B~5��q�Q�s��kv������DF�����nY�j�x����=��=�`���a�B����O[�/�9�hs�������gD��'���"2"�8�#�b��R�;6u��B""���M�������P�:j69i���B�������{���'���4(�����5n|@E����� c�S�q|��DBx�hI��{�/
��P�A6��<��#J����!������C
�sS[� B�H.�=F+����#���3>�0�0z�z��-���kEc�~��Ft+S���"'�L�p�@b���g���Y�����G���#R��:l�7>��
Ju�}l��lV`��Ox`�����P>�����e
-c�%�����Caec�Am;�t����3<��3�t�7�b�P���=����A��u����n������*�>�w�����_�s�G����C�c��	�[���.}�X�hS2���� ��0��?�n����Gr�}L���!;A����T���[��^�C����K�8$F(����<�I�,3��@�@����b�zW��Xh��G�����K��T�#vH�G9:0�����|����F4�1����]�����<���G%����\r��u��A���y$��^��)P�"c�D;�F{'�odt��LA�W�X[�D���3�/�$�1�.��L������W�4������^��#p������P��t1����;/J�y�h���S�D)}�H��S@
���1.�!��|$`�����[b:�����Y;3��4>P[i�O$�_���P�jI)��A�Ckr~a
��H��)�)�B�"��������nI(��
�j�jV�����
Gsx��-i�G	]Nf��]����Nf������.��Q�0�p�7I	h��l���gI&�g6���3J;���P��Jb�Ey+��@?c��F#�%�G	S����S�$E)�Q�f=8�c�����qi��V�����t������D���8���(P���X��4��@��)��A����?�~g��K��z�����f�j�,U6��n1RU3��I({�??9�I(���"g�������Vi��4����e"���W����9V�d?��t��zF��#9��.#�MC�Gw���K��2j7(��-�O������L4�d���ta�Z4���f���=Z��*POkZ������q4�5YE�����B��r3��q�C����.�b�l�U#j��)?��t���#
���U�muD/��j�l�S<�f`�E#Zl�U	�����H��/�����E�����W>��6B�x8���t��>������Fd�/�Fd��9�U~��� ���s����%$�<��A������e�$z&���]<�
,��+v���g-c1vgt
h6& �u�g�g���WbE������*H��"���A��B;;��N�:�V�'H�U��)�����(�l�i��/����e#�
��n�\����,f�����l�$���)x�u�,�s1�9
X��@�GTL4E|��'�~)8c���*���C���/���a��d�Cv���\w��WmQa#(aJ�?�@eQ/l�����E�0�Su�W&����q���'���`���'d5�������d�+H���k�#d9s*���1�"�J}�/�
���_`�z{����5=�ay��;�(������.��1<3_@�2��r�^��K���:+p��2�Tp���Q`S�h-�^W�[�HV��xk@��+�������87+���UO�Wf�0'{t}X�D�V?W��LI�����E�@T/��
�s���@M��B���%�	�[apK��P��$H�#5���� ��2�`��[y9�Q�����O�+� �i�����Z�\5�J���,%oe5M'b�,�	M�����aV�7����r��D+�Kn�[�G��U|���#9Zz�^��6��j����>�|�����z����l�.�Tb�����h@�9�����R��*��
����� Yq7B}��f��XAd���������������T���������c%��$0�S_~
���P/v-�1�q2�{�Z��V�bx4��>�����8�Y	�
�Xx�`�[�^T�2d�k�s��n����5��1�g���7�MF	&�~-b��M�$�?���*e���f3���36P��D��,:D���O����)��h��������q8C���VTCZd���&Q_+�J�m�
���&k�]����Kc�B�1��������a��n�Jv�8hw�g{�Zp���������A�<��<��-��=Z_��,B�����*����)5���V�D-��g����ky�n�Dd=�D&����Q��zf ��
V��G��=���v���[q�lA�+p�'["Y�
EC��e�@AN����T`����|�98��|�7T���Wdw���|������h���ek�|�I4�lx`V� ��e�/��A�������J����;D��'��2�~�
X��i��6* �\r4�9��WD��
�*���jS��kc�s��q�S�p�O�Q��v���E��N�gV�*�w�N'���Bv2��G����hQ�mH����#-0������K\�O�B�h#E�P"�v�_J����(���m @i2��v^ow�%<U������
�Z��;�E��Cz�v�|���H���������"��Ny�m������s�_fL�d��1����{���b�#�`���o[WB��v��V���v������������N
[��>�?�"���f����9d��}�]�B�gC5�;�C
�#��-1�E��m$@P����w�=$z����e����[�`���?�J��W$��O��!�s�w��d�Iu��Tt����8r���D�y����� �"���
��&���a��4 ���+�N��&M��
w�&��=�rwE��=������wb�:������W�?�M�����AM�����$�(�Z��Q���A/��@���
��f�6$���<�mR���&��6�Y�GE�9"�m������E��A�b��Zf��~�1i�V9F�� �Af�}���v��u9�Ty'��zw�����5�-��*kI" c
P�G.)J_��uw��D�y�O�{��1�v{{���^Qq�%m��Y�or�nl�2PX}g!UF���O4��vv�-o�j���A�6B ��\�;j�ocbY�j���������k�#����Z���a���o�+�����x�����;��u��U�}U�G�P�����\u��	�E��m@`S��@�[JE
�����-M=z/O����F�2;�o*�N,Lm�HG��@�������]N��u:	S��n���Ph+�E����>�Tp�,�/���Ha^�	�r����/��g<���'��do9���_�1X-~"�E�A��@J���WHf_4�:�h�G�b:D��c@��U�2#�1:��Q��=�d&O57�@��:�gF1���<e}mS��.��;����=�����u2*PeQr
���z�"8��q8d����������0��k�C-�D#m�p7s�A������@J��hD�f7�SCAs�����;Ss��M9t:�aR{h!*����j��T���S���:-��$��q�����hAC�������p�u5A���m�'�'�0��l8���!h!`����v��
�@`�1���y��`�4KST�[�����������Au�
�EF��!�6�N���$��}���#Nd����^$���q�!���r�Q��?I&�cG�
���5L�k��`"$��6b?z`��e��e2R��0y+j*��l
�k���A�R����a�=���h������w%���.�u�;3���mt�_���`�� ���(���]G���F��!�D�/4�#���_�}\�{Q�w3@��n"@����|]���
��J�X�7g"E�q�[������%�_~��hi�"����p��a�R��/H����c@&�����X��V���\4� +~�s�$L����1c�����^n���~v�!������%��%���Q���LHsa������afKs��g�2��m����-�����6���E�$�066���VZ��#�����2�BC��X�'���>�TC�#|Bc\��z�8��!�s��~.� �����Z pi���6��������%Y����"/��O��,l�	�J@���*i��s���(%�~4��������yW;�����^F��wP���75x��F��Gl��A>k�4��E7+_����w�H�V>����(`���WY���<�P����0��R;J��s�~!�"��;�g�,���Hz�8�EI���>���
���������^E����)��DF�oR��hl��
����s�{����DCN!�1P�XF�#�;P���t��`�� wkI��20 ��4��&���p��
1����������#}�*E��h�V�1a�"(/h���/2&��~��HU�7 �>�����L��w����g��^���`2�;��MQo�gW�t���ww�teK5��0�A��2}���
������,}���{I)�%����u�� �Fh��-Y#�qt��.#-�X��ml�~�*����'@�;� z��-�
@w�E�^�D�jy����z��y����\�	��oTHp�ZW�+��.Ak�
��������[�'��w�?c���|d)I	9��':P6���ys|�pf��5�������y�r��p������MW_bA��t	W+^��D������������������T�w/5V�J0���
��9��g4r-|G�����|����hI���M5��Z3��%d'-�wd��SK�>t����m4��y��q��cN�$4hO���
�u��r@��Q�D!��;�m_B�}�p���P��w�W^���(!u���AG��Y��N��
�Q5Op�w/<I�e�)-a��s����g��.B�z��*�'�9���0���^�R�p�
zG���b�T"x��^�
rM��	��3�s@U���N�y������������1��-�1�#�o[���K]v�:���"�d����~���������
=���\�w�/����'>��>���KD�|q����������N$�w����magr"��F^1(PQ�lL���'L��=���^��!�*�����C��V��FI=����7l��P�<q)�BF����>�=x[u�B1�0�P&��|��K�R���R(��n��p
Z1����}G�T�(F�Y�:���;�K��lhPhD��S�3T%U��s��[�����m�2h��%k��J�����Z�s���\bV������wX�)A�b=�XN6���w�[%�C"H��}��S��a	�U4���]Q�{�#� c%J9�(^��hnSoX�p?����v���zi!�?Y������^�H&�K�%�������1�mE����bA�(�����M����G��G��ip]3��I����Fo������8�sN=^��
H�)�����������bk)s����H��I�/e#+�D8m���f���w�_|J���\�����~	r�� �-�"��-!���������;G�#;Kw{���`�V+�:B���y0����*���.����f��a�g��V���{:�x'�����W��PAS�S�P������.�II3��c+���q+��hvE�z����uW'� ���e��kP��'I^M+���e����G�3�v�����>aLe++��
�iA�Q�N+��zv�U,qB�����N�~�d��,+jcq��uC[���C���!���W�RJ��lT�����>�!�R���_���X+h��=Z���3������ (qBhyI@1�rz��b[U2�oCh!��D9@����@E�Y.L��G���z�`O�I�kP�V����n7��G����G�
�y[��g'n)�,	�'�E���_���A�M���P��w���l������5}����=�2�������{�Z/��$o���[�h{����J��D���S~-��5����O������t���p�5'���rtE��>����������M}]�V)�5�k�����7mX�!�~&d�V�w��f�-�p�����
�����hL\�/�Pd��-�".�3����u���/~�
�?tf��l��I�Xn@����G��~ �b��O������$��Dw�S!��U7���=���l`�������~��H�����G�*KF��5���~���oA�q��DN����?��B3�������f��D1qo_�}��mN�|S�U��p�h��F�{u�J����o�����d��P�J���[nD�8����f�v:h�/��43
����k$��I���C�;�H&{����K��k����~i�������,	�����J���M[yNZRj�!!�;Q����s.�v,{r.���>R�M�����j�G�B��VGrS�[������ ��Q��;(���C_j��
��*v#o5������P�AE���n?�_�O �~���'$d�~�y��X�����_Q��~�#���pu�_m�j�P��)��P �z�e��3�<�������t/�l����#��]����sX����]��qo���p�Y����@O�w��{>�����U\���������"UPz=m�'L�C����zd2�.&1/�j����V��5�jP�������W*@��� ��8;�,�Q$�nI�����03���������BOB��u���
f_��u��ep:}R���x$��-q�i5�F�Qc�A��{W�u6�qqo6B�������5@[��Xt����P�m��D
��V���T/n�!zPM���j���A���c�Bn���<�E�Q�*+:1�|�?�82/�������!U�lT��H���pJ��S%��!D�A����H���(��$_�F"�489ph���FQZ5�������PN����>�*sU��j�����
�Q	}�L����1;��3���lO��h�V�Q�X�L�x�D!Ea�J3N!�A�[Na���j� ���4Z�u5����i��Di�,�[+Q��H�d���-�F
MP�Fot.n�5BUo+q�g��:|7C�n�|���m��.4��j:r��jXB���-��<E�[��P���(�w���L������
qVZ�.���]�C�E� �D���
���}���9t�l�/�~j�NV|1��jF1���B�@M���dt\mIA��24�W�(��.l�6���]VYY�`W�:5�r����N<3ih-	���tH���H���]854����p�����(�'���@����I
�55M����n�1���VR��)�%2�SW�w�.N;�m���\���\ceG����{�����=<�RQ���u��Y���i�Ph�NU������!�������2�"���0~I3�!�e!.N�q0��=|����R���bm�U�r�FF�@��� O�.�����{G��������aD���A���.a���(��	h#H�N������e��C��f�C����E�c���}�n_d'������qQ�l�C�L1��x��S[\���if�C>n��\���X�=�#����l��dSXI�<�>(n�a���"�?�l�����1�:����F�ZD������'��'�u�7;�����C���	�qj��G�pe7��N
�Nag�R
�Ja�)K�������%�(%��D\�f�B2u�������-��;"[�t�[��$cF�ki
����.�����o1FB�f4��	g4C 9��$0�NF"��w�J���>���.j��1+�j����f�C�E4�k�l�	�!���Q�/����(�������A��oF,��)��uR2���k����,PHF|h��P��$���������_�wW���=W3ra����ZO2�&>"+��%�������U��0#QN�{�_
���������J��PL�]�X"��Cd����x��������-Y4�E�"� �,bP���P`�nw�������|�n��{Z���PM�
Ri;{���< `���t���=A��.��>���$��M��b~H&���� ��^�E����,��0�X��+
���D=�
��.����0D����$�g���������s��_��q����fS�(�v~YT�����#�E�a���(��&��/�GMa������p`(i�Iw�sT	g���L�:�75{Iu�������3������6|!cO�g�����[7l�d�����6�U�CAo1[��������S�f�67Jt�(��N��OH�S��w�����e� xQ�z��)���{����'�A��������������)I
�"6 ���8�5N��|�Q�w����}���HDc�C��X�g������_t�!�(����x-l��5��r��@
[���*�:���� �=d15�������n��?z�W��.V*������VL5�e���s��T��:]b6����@��qs$j�~�=����a3���A���~��X/��k�o�v�v��dHj��AZ��+��&;B�z��d����
��P4���D@�������-[4�������h2� ��P�n�A���?�W?��o}eEuE ����O7���rzcz`<T7��\�c�$C
�)U9[t|����~��'O���L�� PJ�
50���#-���o�Q;si�I~n�'�?�����=5���b+}�y��z�w������j������q�pP�@n{�/T�1I`7����[�c��T;3p8�Z��������
6��V�����	g�����/�>������d����Au~:�2FTl��z%�d$��.���`�#�E�c������!:��K�6��`$~A�{HcZ���7�@��a�A,i2��U��B3o��&��(_��w<a
��l�b|2�!��}��a����	iP?P�+uxP�$�AEI�qG|�����W�1f�(��9��2tx�&��]3�E����$���y��v}W��?��c�K�I��#�b�^G���i�Z~�y|2D������%���.*G5���6��V��h"���������dy��	u%G\�7g,�T�N���#��a�@�����5��
���`�LT
�6���|W�[E��T�#�#��HJ$27+��amER-Gd�����aHD5�,s������iG�]��P�������@��a�@J��#s8#R���uJ�����c�&z�1tB�0v�`�a�@.(�m�1j�*����1��$Y`�����0��4�3lP4x�����#i��*���vx���"���[PN�t���HH��pG��aVcd�)��=|/c�_$DT�f�4b������$�1�-���$��F���sk����A�T�Uz�
�d�%���:���X��PWv7K���cFfc42H���/^[�N���	C���}LDg�����g�hb�����Z�c������"]w���=�d?���#AL��fs� .�Ag�[w��(b/
���H�n_��-�+Y�L�Ob���^1ZU�G,�]9EH\��@�;V�p6���{VA%���A�l��u�D��6KD����]��w��E��s���z.��A�;Zv���o��m�`�����.9�k�6D�qw��Wf���[a������D��Hf4B����4��u��y�A�j����c��znI����}�/��c�W�M��K�3c��	��I]�'���68�d>i��U���t����F�%�`��|��,���m�V����D��iHA(5��>��0�M�y��*��L�i@��k���d�'�!N�A���p�L8q��3:c���G�4� I^%�=UR2)���2.���Cwc8��<�) �w���
ZA/� �`�-;
�,/�d�'����i�`��
�������z���P���%�W�)�g����w���l���W��<��AfM��;j>�]����
,��DM�$������i`�������v�����=��$�VBr��*��b~����������h��p��u;�5����fD��	�@��LN����������M�����{Y��4�P��� �y�r���=��
�T�K�`�Wf��{��<���������O�0C�����e�:��4t�CI���[�S3�����(��.������}�����������1�A ���3� ^������"��E��4��� [b��h��/4��2���@��i�a�O�?N�q�{m^��H~F����g���|�QU�T��-��3�p����� �K��
�z�`����6����U��[@���0#s>��%���4C�1��7&m��X(���-HVx?�X��������:f)������������e�
W+���N�5��!��F~�3�lLx���<c����i�a�j�@�m|�}e;��=j��W�4P0Qux����������>�<4��p�)=f"��#����q!��ja���n>��M�Js�5��S*Z�� YD�Q��
�H
2 �����Id%Yn������?j��")���h4l�V�7D��/�b�$�����3Y�7�S*Buf���9D��.(HU�&g���d',��������2�`�3y��s,�{}H��;"���0Xq�<��� ^�2� �����D_�2��
L�"k��LA+�2��l��{p�[AG�eHbl���pBX*e�J�/����p���^���5���2�V�D"���F������w+�R�v%�C,���(�Aw�V!��'^�Qs+I����^�"�W.�f�@���\�I&�|A����!��������x������(�+8�jI����W�v=���f��������qn(���3����=�N20��JX�6,k�2t�����#"���eS�|�(l�2���r�XA���(����c�Tw-�U��0[-���^""��QK��*�e�AR}�bn��sB���P��>�o^�s��@�.�`��Y��r+meM�#�+���o�A�f��:
��5���^���pL��
-�r�0��t������=���2YGw"���Y����>J=�F�T����R.�E�I;�-��f"�T�UG�m�x����,J�m���>E�	��L����F8Lw$+D"q�!
����p���J��������T'W
���%W?ao4��'���^CZjZ�G'�2��,c�����r��2��C��L�7�F/cK��Bpe/2���#�/��@��LL�b�t�+r\2Iv�1!���W�P�j}0�
t'D�2��W8���.a�0��e�A�����vg���eD�q_�g���w?w��l�u(����Ly�,/C�:L����7!�s\A$\��5.~I�
�S�u���n!�D�8�����?�$	?��[�~���p�_/��� ��F���k�
{(r2�W���B��R��P���
�����;e�~�dI��"v��R[E�s�AD�P
�9
0D_|����Bm�ocE����{�;��������B�<��!�zt�y:
`P����A2<4�����jof������Z��[�y��mbG��>h�^����T���9�|�������������;1w�����4��#�
�N�������Y��&�������w��('=�y��#�I��A��`������Y����\7��T�lh������,�(�{�
64[�N�H%f�p������:^����^������ V�Z�3�6��$���n�E�>�����u���HC^���
?l�k�(�]�owZ�B/�}�6a����F��Q2�����;r���@B�Mb4kb���O����ND��1]�Sg�����R�O�p��z�"E���Qm��F&�A���G�'
���Vb[kp�{�8(����>
��Q�V��D���SB�9
����X�7%t6�F+
+��)I-��1�3Rz�Yoa.�s*���j]���v��R#"�6� kC�������0�=2��/N
���P��O@C��r��%�[���|��D�f�)�zcnC�L��I�<;H7Y\�k��1��Q��}��B��
!�;&H��y/����<(�=������
k�	���a3mF8���b�;���5���$Sd Tc��v���[%Ua�����2��{Th��}9�f`M��Z�x]�U��7�9'$� �d����X9����R%*�)��^������_�M�
R.��5�;���g�*�$Tl4�!U@�������TK��	|f���H6��'z=��ih��:����UBx��q;2R�����mD�;V�5��4 v�N����{'2#d��v|r����	�������1�IW�I�*��n��b��6� ?�]6��t�_��-�_���o�N�hxP�����a�x�}2�K�����l�l�n��JJ'���#�kX���<:�6��{�����M�?�M7)(�1�U���&����'��N�h�<�Z�_B������p�^��O\��8�.'P�� �{J���f�c	6�/>���X������f����6��� 	�y� $A[>���	���'d�LTo(�
Q�O0����k9qW
����,��ENBPj�"l���l��kE��Vh���2�����a2�-���{����0Ob���-3\<f�p��$O�2D��:�8�Y��P�B�
�cD�I��c���T*N�?��i���^��d��-1.��c�����
V��BGg�cAfnj���M��������xZvQm�Kv>d�Q�����{�z�dpI�[��^t���K��/�����1k��V�(��D� �y	7#���_����t�c@B���E�ayu�����u&�\��v#�#U��n��A
����X��$?Z���8��q���4�D
`S3F��q�����Hi5��QL��1�I{�{�auU3Q���|F$���e���w$c(5\�B���Gc�RR�	f��ugA��Sub�$�����vsC����]�������jW�L�s�e����iD9�3�gR*�,�j0Y�1�!�i�Nl�M����.�$��.;��,w'��r���h�{�}��z��6vq�2h��&���3X�w%Ks����6�LwT���6,�R�2��c�B~����Y��D���;�-
���s�T�jAS����]�P���h�	�`�L�/�kl*�@NS'��Sh��a�� ��*����)���L�����#��iq��X���w����}��$�X~�K���A1��5��5m�;w��7�!A<B:����]foq�x�i0C3W����]����Sf���H�������=Aw^���Kq��|S���PD���~�����U<��� 7��v��u���+g��C6���E0��1���������{
��wj�^*2~���^�ST�"PL��5���AN�,���f��w����FeB�O�6���%����C�y�1�!���A(�����*�]&���4��Hg�?�[������/?�}a�Z�U������(#�G��}��D���LZy����7�����������En�d�Q�I��wPV84��VF��TnO�2������d};r�V"2[����
���[�SH��^���[��RQm�z����R�B@�wx���l�#�r"�,?Z���>F;D�����9�8����L�L�d�������"%�{�@ojj�9��������1���M�M�|]�9���^���5��&9��0�Y�h��Q��E����V�r*�7Ve����f	i����oA��@'��wt��_;�}�=r1����(�1��DxT�n���"PT�{!S�m�>��l����D##�A�d����Y��,rR}�a��pG�A9�����x�>B��
�����]��s�������(5�r��~��"���_��j)�����T���{	��^��\	A�(��~�������a����#�:x��qb���dE\��F2T#����JD��@���Q��=	��E�a���J�kJ/'vK����9�Wq���H�	ZE�V�Hdy��N����Ic������5�N��!��wdz�v��5pq�������������'{���=_�L����K��p!�p�vh=0JQ�2���Q	��_X���^�(��W��������y��������4S�&�1y��"ME�L�;Gk������K_c��$J��O�N������^��$k�g
C��i:�����&�������pM��_������>m�0�#�{��{���
[v
�wZ����;2G�����Z�l������jR?�@
�pd�� e-C������b|b�Z1�/�!������@�_��r)Q�v/O��K���%��,�GZ�I(����bP������X��Ae�����K%��B�9muT��'>��������c���n�%CB4�L�U/�r�4���Aq�3XW�
u���	����
 }i/�$����8M�����0U7���{1@�,
z1@!�h8���{������d��	��:Gt[y��{��?���<�Y^CGy��tz-5�|v/��P�.Rr���R2��
\��5����{�ikE�I3A����P��2�{1$!��Y��G����D���%�Ki�G'��K�;�D[�M>����f�mlI]VQ������1�1��E.���:�����YV/_ZZ6+(o
1���	"�s�{R��J����!�C��P��]`��<�n��i����GB�[����(�XB��G�r1� �H%z8e�0(�k�Y;M�0-DA�>8C�`�[ ������Cr�qL�����z�J]4��
��J��c�����n�'K������|-�;�]�KR����Q����>W�J�1��a8Be�,�Bhc�W�ZG��2�>9�C�Cm��x	%��o`�]��v�������c�3�0�N1�0�b�h0yC ��dP��5�25��R���,l�3� ���Y�����oe���^�:�/4����!���B������n&Y����'+����X����`u��E��Ua����B �q\��@��|)�d8#���V��@��r�z���	�`.���T���q]�C}���eB��D�B�Q�Y�N�UT_5�t1�6eG;��������C�M0�A�N��XC�'W�(���s�Zb�47����}i�y���S"�P�c��%f=������c-&�=��Vk����.��Z����O�>����J���"�{
�p�1[��f���B���X���'C����.+�P�Eu�gUDMx��,�Pk�>1Ea���'?-2q�!���O�H���qxw�A@z�wPu��R
tZ��� !t��,��L��*�N�F�&Tc���O�b�w��j���kv9|Hn��W���n\��@A4���N��Y����wLa;%v������t����;b;@��4}h�5��]������E�aa�J��]�0��kB!�m��@%��aK[����-1N�M�����K�A��Q/�&1�k
�d�wd
^�'�CB�g�U�5:i6�5@�p����m�z��	a����y�y����*;MD��-])�gt�R!H5��o�����r�Zh�m8�j3� ��a����D�-�Z�8�2�4[8c��h�O��N���z�m�=>��B�T;��7y�"�B�=>�>vL�
���h����l��
k�As��B�6��A��?����Ls�.�c����r'v����
�������w�!������wxpv�U%����D|�j`A����~?�n;i�������>3��9M��j�U �RW#	����eE �S5���%-�E5����5�1
� ^��l�De������� YxM���iN����V��gbG�����(��+�����{]9I�����5`����ZWL���=La1�$h ��	9��?��E0�}Mn�������H���la����A��C�U��$L�$��YR�O8l�PWV�i�=t�m����I������]c�$� -�l��,�����(��	�FT�j|A#�����T�A�,�
_h�w��k:Zf[e������"���6�I�9�Q3�FQ��%����.����/����V��l��c2�8*��q��T;2[0���cCK�����d������]���p3l��y����h���A���{}{>�4���1���GG���$��w��'q����%��$kh�$(�F��Y���y�S�>�/�}��|�oQ3� c�@�S`9�F�����L>��K��� 3-?$�����&b��*/{8v)�qA�BJ]z��c�a�u��
-Q	���E$:�8����-�U�px��BP����N�2�@�����i4+O�A�Q��@�WS)���5bK>N��^�m��o" �u�A�/��*������7c
2x".d	���.�2�$cnu�����I.���a�M3�0�Exo1E��t�mF+�"N���9:��#6Hw�q�����N-���8��������U��x��'���"�T3���M��jP������L���Z��DOW!aR&��>��$�S$��i	�6�����w�:O��#T���f���v��o���4����8��P�����GP��dR
L������@�����:����"d��9M�?�
����Q��=�qF���fP�d6��I0-T/��V�0@�L�CtNd=�fpA��6W�"��-k� s��n��!Z�li0��l"P��]�w��2|B�;im3����������/p�^-I�k���C����A��|�E���7X���`����>�D�v�[��=Se��WnmFd�U��w!D�f3!�.K@*E���0��c��E��Lj4�� {b%C��<�Q�����k0�����9� ��f��gpB�^�����?�C�_���Y�:��.VK�>�%�Z�+Z
<tx���g�A9��s� �(���u�K��V|@����Q�J6�n��U�����F"\ �u3�����R3`�Yo�O-(�Z��M��#/��F�7P0��P��T�g����+��A-d����b4����be�*�����Z�?b7|��^Iy�F�'���|��'�A4�n�b�
rmQ�'�
\l4�{���WW9����	$����Y?9������O������%�f~��(���<�t����n=jA@���{$�R{P��>m��=�y�������F-����=H��8��l�P5
�g��k�BIg��j�nc?�����	���9^H���
�,�M�d�D���1��L��q��N����.>0��'u�H��D�0�������'e��� d���<�AF*62D�-|���*�y"�X.���n\b�0���?$���D4�%�*}\�����(?#Z����;:nu��:����T�d����S���L��j��:�TGi�y���Hk"�!r=�J�E6���p���5�y��a!��K��i�Y����m��-C`}78��}�q��u*��QgUJ�	1�M���PQg�������O����fz���U[��J���,�p�N����!��)�a�'�nLA�5����
���H��z��Bb)�&��u�	���^���G����z���@�"�S4�SMg�[���j�����������F���^�-��f;���r�y[���2��t� ��G� ������U���,fH���+9)��@�7�WL-���^�.��~����Z��'���y���-\+X��2`fY=�/�O|7�#�p��o���1f�hU� ����|���!�"3(�F	d2#gM}��h�@�����e���.������T��i
�+�<�e4�����������IF��<�����U&s��o�@2��d����.���"�
�Trt���=��&����^;�[N������s�h���tOP_[E�0;�-]��H�

C�H��v���O�:��9#����F��Y�l<����W�|��3�H���4u���:b���wW5������{;l`����B��<t&Q@��sO~��Z��;%�;������A�Z)5F&ey
��I��WW�F@�B�?(��)9h:?8{E�-e	j.�	w6�-*F��:����Dc_�*���b�+�j�S��F���Sj�����%��Q]eK���s��������aDB�j�R"K���aXB4���()d��f�Q�#�
��Q��H�C���t�{#��� ��VSK���`��a@BNzU�#���Q#~��`��G����~��&�M�K��/��F%d�����
��#��34�B���(a�P��|&�Q����D:��-�{)�)��,��||h���#�5���	Ehd��l�wGD��{�V����&D��a�@M����F�47� �-u[�G�E�#��/M�[,�}�I=1V.�8(���T�F�������F���{f���G���������\��_�N;[��hdh��}�4�k���T(>;�1h�[B,�b��F�-E6y���,�'�H����/�'�S�A��A�;E�az�s��A2��u�0q�1������]`g� 
��
�=����z ��]�y�H����7�c�%ir�XU�}v�q�*����D-(���
]m�IO�������=!�p��-G����U��M��1�|���;��8����a���o�be:�������;z�Nc��'N@c<��_cYG#��l�6� p���/�2c��q��$VK�t��nX�Nq�AN�|�FB��A`S��p!k�P���z4�� �b�6��&��a]��;�?�~EM��l��5�H�H���U�5!�a�{�-�phe�!v�|�F��iXA��:���%ME� G�O�i19�[^(���.f��ac���4����q�9��Qov9�7�L�;MDBG(����n9^��jW�W4��9r.��s���<���d!��i���g�/�:vC�`��w�#?07�(�aI�*8��gI��e��?wk��@1
h�RH�*#N�	����T����1���/��m�(6s�*��z�H4�`��i&�����f�mC�h��(�9H?�*���'�G�z1�c������+��r�c.����r�����=6�uNc���$>K���3�����p������f\�V���wk�����1h����U�JF���QK��z��IJ����&X�s���B��i(�8PaF:+
��t[G{��,&u��=jz���Lk��&�����i��(:[_����r��C��GW��
�e�d��7#V`g��um�,�CA83���KZ)r����=
#tD�����@��9�e�x�	��k����G� 
�BSX�(a����|S�k���9c�zK-v������=�7fS;?|�����x����X}0����vH�6���3��������RVhm`�F3q�2u0�Y�53��|���d�^�xU8N����)M]���@��}�)n�1�d����h��G����f����wh2�����NA��vh8	@5����+>�d�!��G�	��Q�y�������XMa�6��;Q������<��G����#5��������e�ilA�@x�4���Bf���I��m�0�iR����g$%��-"tz�<�w�2e64�;�FHh�Y���	
�Q�-^�S����g�
�7�*��N_�X8H\8� �R�McJ|���&����] �:i���C�����&i\k&�z�I�+nG�Qf}��r/�	2a��eA@����t�\���)�6�2� ���#\��ai%��*I&mR<w(v[%�{+�{[������
�W���m��W��] �q;L#Z����u�^~�Ut�]F�K_��TZ��Omp�8����m�|�4h��
�����2�GU�!x�[���I?^���,����km9'�6���t�_�d~,���ZQ��j,yg���X����W��#��NI�L�����,ci�l�V���`��^�jM �L�Qoq��Ht�_�������0�%�����x����	��H8�<���L�0[�?��n����>�nc�zC����V26�u�m?|���VO���<�=���������U�0[�A���`E���V��!n�����1�,:%]�XI���g�{\#GR��E��#�]�Dz`�5��@)�	��Wg�@�72^e���xT-���N+hB(
�'����;kpn�2`P��G��1�ob;�\��������>7qy#�u�?gSu-$�c��e���$u�e����5�2js	���e��C�E�����Z���CU���ke� n�����#�����z�P���fx��X�j�Pg4A�����������hd���m�V6��w�o��/������&+��X�]�R��9�tW���|&�y(�_7vJ5T ���@���,�0���;bM�������V�D��sqEc0�{�������2(pt�n��� �H���MS
;
_q8�J���G@��e����v�A�.(�W�A������J���Ha�{���@B��5C������$5������
Cc�i�����1��:qs+����c�W��������e��P��
 Tvl��QUS�Gh�O
�%�cj�L{���F
��mI��l?1��3W���Y�6�?��|����r��T������t��nF��mL@�!J�����������r���;\������$�hS��~"�i�I�����"|�i�J?kE���mV�����v��F*J���/��U*v�A���m"�TZ\ah�I���9�����8M��j���n>��,���v�sl[l�������`����EG�d`�8��D�'�%)��iz��H`�='������6��d�F�)w�q�4Z�+6(�Y]-�{I������.���m����:����t����a�����-�F*�yw\�n���%����Q�S���[vbjtO�j�K�����-8Q���n��NU�{mK�^�W���������g$�p���V>�
bI��9,:F�U=�N|R�gvX��>�v���Hg����_�����{�`���#�����Ym���z�P���o�=^K_�������Mg��S|A'�=��k�ga�C���"� ��X�1�H�Y='j�*R�*�����mtA:�U��2�g$V��9�Bad�C�8r��J\3[�f��� ����F":Q9���"�6�u��s�'�U~�YNK�A��(�l����n�^ o'���ES	�y�.alAs�������2�s��C^E�D�����X���i��t���E�y�lo���6����+�'
91r�N���x�
?t��L��-x����#����h�z
:���+����!t�+�;������
��wbV��w�c>y]-���\A�����1������#E`{�-����q"��h�~�J1��a�����y<)�X����I��znF'��(A��7����(~�@�4��c���wA�Y�{a��`��<F�,D�^X��o�ifi�dUfM���R/
�A<Fl5��B�����|�`���vP�����	���4���J�,3��dk'H�{���n�,������5���rb��'��{;����\�?f�{O����!�����S���Lt9F&�S<�^v'��R�v�b�s�D_t�C]e�]y��gG�iB�����>b^W������3��%�R�|�H�����@���y����CO��@���W=5�%�8F$DX4�c����P��|K�[}�`���Y����6�NP���������a�
�@�i]`Y�+Au�N��D
�mm��-�t*Eo.I	������7s����>3����z��mO�}�Is�e�_E�q�$=�!���c,B^d����\�i������o�P���dr*��f�'���'�H�pzd���t��r�p@}������`�c�A�_	#e��4V�Kn����3�"�Y��I*��:�d�X-������:�_:S��d.��f�a�6��R���c�ARiEc�x��&�V����X�	����D����Dd������wb�A��c:�Q���?��o$=3bT�S��2c�_�W�1��
2�=�x�)w�Bv"ehM��.�gFW������7P�m�ez�
�T�'j]��-�^�S	q_���F�g�e�Bt�[=+B�en�E���
?�
����[@�z�r�i��]�2r��yb{�?�`,�Fv��U�}6�
.�DX-d���R.�
��t\Q�:FNvB2� ��*n)R�C�Q'�
�l~by�,!���`�������p��*Ax�eY���>y47��u�����\a���	�'��!��[�#]�11��iBF�����MK��\CDR�Q�J��P��a��$V�&����Yg��3G?�>�bB��x�/�0_���)�
�6��J#L�wP�G
F��#���;Y9�p������W��7s�,�.d��^���������d��.G��4�x/��� �7�z}���~���N��wPDl����:���s���wd��h�{�}�2�����@C������^&����q���v���������^?YI�1��*���������vP�a�4���Q������N��
���+��G��}ud�$��[�%���7�����T2���{	�D��;��;9��d^A���PG��5I1�����+����mf���.�K�������6���� ��w��k��iX�J�P(�m�S_��r<�`Mw��"��ou/^LM��+���{��?�ye�+�L���P�Wo/����o��	)������O(���Eb29��S�{!]\>"b��&��?�,��A�7�?�H��^[�dm�����h�r;9g�����W_��������F<�����a����4�fRb	��_���&H������l����������wv���g���{�����LU����w�L�
rG4?Yx�`e��?|i�v�;���w��h9�";���TSlP�����"]��j[�x ����|D����%� �d����bj��2��1A���ET���OUr)Je.������G����u<;���+�W�<cG*��(�B�H�N2!����^{KR�^�z����������_y?%Eqa�$��s���>���(���VK�~��;ki�t��G�e+4
,�U� v�p{]�B��PZ�;Q��.�L���}����mR	����6���L6�|(v��{!�#�V����o����G��� wB�������{L���a������.����A��EI��(n�#
�;���)�
Dt^��;��5(;~T��^#z��`VA.M!��C,�5^3�mmv��#s��B�<�I4@�L�$��)����e?tb/��CCs�K>�����.�6�����L�.5!���h�!�-�D�^U����DF
�M�t��G�!,�Q��;�G��PQ�?#�Bt��n��y������
���v�xXJ���~�����]}���~����V7��}I1XK����b�g���5C{������xV�8���/��"(!�?Z|��3��&!�
���
���'%�A�4��^���t�_�?��wV���������[����kxK��\^���A��m�$�Q����,d��J[O��iS��o��jn�=ao"��(��������JP�H+z�I��#�C��!��Q>����[�l������ ��2��(�R_X�L�B�U{�J�C����/&0��1B��%�:LeD*��b����Y3������ �����BLTK ��L�kX�t7�`'�@�H�N|G�t�t��H���$���g�g��6�
](4����M1���3�c����?����b� >W�	�:�dm����K�����K�b!�u����)�K�*�UbS�����T�8��vEG;���H������i��T��.�����&p��p����X�����Z}�s��'���`����jM�!]M�Cix�wGr��Bn���q_Fg�N���n��P]��:T����>>v�V��O����N3�):��"�p�O�������vG��C4�I
1}�2Xc��R���Nl��Q��E���I�+P%gfDo-q*B�*j��L�"gPt(&|���&��c��������vP�����+8Oj:v�N��O �C�����Ph�S�����&��yy>g\4��YS�TF�������4���o�MB�F�I������hu�rQ��!��5���<h���(��i���6�j����Q��>��5r�[��M����r������F�/y������$�L��A6	���.���lK���[�b.���z�����o
9B����]K[��)PWLh����e5X�P�������E
5%�q����jt����h��}��mH�������aC�G5d���c�j�E�`�5�)�C�Z&J��8F��Q��!�.J��)�\=/�F���;�3�_T�S;��Y^���-��X��v]�J�hZ��x�o'=����|>d��A�&"�N5��jk�����y���Z��H�o�A�������5���8k�x���I�"�Lh2j�
G�y-��f�?�}C��M���N��Xc��3��X������
��a)�bM�D#��$���Z�5�t��q"b����g�7��n��fX ��
ZE��j�XCk	�m����@F��p�LVu�G+�'������h�Hj�W��q]c=$��]�dW���l����V�}�B������76�bC4������e9!J%[�Qd�:��!�
�[���V�|%!-�5L�������u��!�]����������t�.����`��pB�z�K��e;��	���a�#�:�����5E%!����5��� l}�����������^�k�*)�:�x� �+]��A�!����b~�TA���(��.�R#�PE���6C`V]���f���O��7�d�6��e{��7�R��X����,_!m��Q�MjC
b����B���;�:�D/����?����{������C�(
`f���Q�'K���J5����S��$d[��������A����x��fJ�,�j<B9:�/)?��!��
YW"�����M��'�����/9�3�XF��#El��4aCIv������E+n��������������B1��m��!(�P- ��������4�&�6n4��J��Y�d���!�
�TG3���0����d��i��[���8��A��sfy��P��=�W����1o�f BJ	�����������p����p�/��n��X
�H2��	��������POU�c�W�����<-��I�x��i������3$Z��&n=�m���$���dgh�@m3������������(��lg
�zP7o�'�P�g3� z���� ���4����`�V�tc�Tq����Y���Q=����)�����Ve�I,���U`�Z��"���������b#�AkY	�T�=��)�b���J�m�m�LL����j����}���B#��z��}�!�7#6\3��Y��b%���qWt�j��?�`l�hqWZ�3��#4�
Q%�����;_����v@}����!�nD�iF�vm�T9Z`�LK���t`�	�sR5M��$��4���4V�V��Z��$`�����+B��a-

���<��"�����K�(����;��"�`����V=������N?�	b�4���\���E���>9�ka��0�4]&6��%K�)����
��>�5�[���M�]��Y�������������e��c��N!���)��?�mS+���8���#���r��W�t�;�L
��'a`?8D���e�0��o3� �B�x'����}�������W�����'�l����6��n�$���,�fA���tW|�0����h�!}�>B����X\�Iv!�/��'�){�IVF,I�|1p`�c��������f�FF�UO�l�4at�{!74�%�n8�!�x	y�4�����lB��%�{�v���M;����	���'�=�X�I�XX�vB/������f�H=
�s�'���/Y,�z�~j:5�1�1\	E  �7�����z#�Q7z�\�l�#0!k��8m���7PmNA��s������%Q
�z��0�����H�hs���%��| ���5�$3�FO����~�'�:������������b��?�������G�w�Z4�/!��z�F��1����Gf�D.=��O��Q���^����|G�����n�+s��o��n�z�$d��kD��?%�W�y!:Mw��9R��D,��^�y�}�2	
	�B�MGh:z��L�g����������?�h���I��8Cc�%�1uP~��Y�*�V~��[�p���~C��������-~����B1?��f�5��=�I��D,��^�X�"��Q
�����������RJ.�����X+eO����&"���c%-���we�yg�3z<W[�;d}�������jT����8����\]��G��X���9����SI1�j�0:Ki~��G+<Ej�D2�S}�laC����� E�`Yq��y>E���@C=�>�?Y��G�oh!1�0���l�}�j���^�1�Ujh���j������5�i4�b�t������%{�9��:U�L�'E������f���"��L���,;�����`!�r�b!(�}��J���_b1�U�P�[��,��[��0���&�����p���[�[��
���?�LE��;���yw�)p�X���<v�����|������]������,���=C
�q�R����ddt�>���������]�e�t������eV�y}��N��-��h�`��}P[�>��*��$D������A3S�~���J��s���&��������J�|�/�o1�H"U3���k�!�)9��O�A$�a\�~b.]"ocA#A��_����Vu�Em<��,��E��]Q;�V�#���E�=@e�0�-��3e��qx|�I�M<�l��^h�6m�������#R)�[�FUs�����b}�
�R��������&_�0�"�F����1��DG4�
Q(�c��w��]��<�W2J�|��P"��Y�
�I����Wm]��������-���q���I�F��,@��GP���v�X��-��D��(�����3����h���Y��.��b����Y��5�������Yw��5��[-(Z2E�bG� �8T��h���qk�\g���hq��}���i�`�a,��5G��b��Q
�M0h,1�Wl���E3?9�Ey�	��?�GL�����}��-�>(W�����^��ZE�|�@���v�=��L7��3"a�4uD��E�@�Aq;�����]@
m�wkAB���g�_|j���%5Ijj*Zx�<n$���Zj����U���6�2�e���� }�XS~?i�8FJ=��y����c�G2�[ )��}�#��1��R�l�Hs�D��J�)R<�o����c�����cd>�,����k,��!���~Q�(��G����mj���m}c�������C��1�o��z���+#�c$�ZbA�N��E������A-�����5j����?�3� 
uT�������O,�J9�z�#�:���.i*�]�P��P'��!|z$�A���;zD>���=i��0���z��Ri�l����9�!P�e���|�Nk`�p�k�P\a�,g�� �9m��i?���z��-�*o1|�g��l���G���	c��=y���1?����{D��<�H`������D��Hz�:���jXC��cX��z�1h�����(�n�:;��?VKw��}��=����{Y��������[I��q�����Bg�&��v~X.�0$���:E�=�R��q���D�����7$QQ3�~�������n\���cW�������Uq��I�::�.�n=�m���L"�(khq��-�=7��NJ���v���o?E��H�q����Q�FD��+����T�)�����z��4�X(���IY����P�3
Q([��2Ga{�
F��Bg���~��"�-v�hb�������������$���OIl5��+��QZ��;�fw����O������,��h�tG���.����U��+��B�k���H,XuzG��#p�q��'��
q?���ZT>��dd������J���V7�j5��$��wW�P�l��_�-d�������O����;!��?��j5XkH��g�l����t��f����f/�v�B:���w|{(Wl�Pz�r��aM�239��4�Mh��HE5F-����=���~����>#�0�Y"���u���x��J���Q���F#*:���<t����+�oU�X�^�}�#��c��Fmgr�w�k��d0�<��}8�1���3;��3A�����wZ�?��,!
mX��Q����4$���s�x�Ogo�:��3�w?c���6�F��������sgP9~���'��s����mH:������.$��v�$8��Jy��T.�S��[�sY���!��x�6�%�G�V>V��0;F*>�?�+������R����xi{��.Y�S6�*��"lFg�����:�"l��&W���Q��de&� ��X�-�	Q��0�'�`�P\3� IuH�3;`^�KK�Q!�i���	5����	W���L�t
���v��y��0�p���C�)Bi��/���	URat�'G����Q���P�D1� ��!��4�p���8���)+dq�L�a:�������g�hs��g`����}}��`��fB�]l�]M��j�@���j����Z�&�h�I�d9�S�Jx��i����;6�oQBY2W�����+@��P�������hO�Q��j%/e��AAG�e�@�-��*?��RR�]b��J,��$r�kvT`�e�@K����TV�@|��ANV�h�[����b*�/*z���*J�xf
�_FZ�\��7>��a��e�u�}��U3LIi��d��&�����x�n\p#N�J���j|���R�?�m
U1����j9a��+��zxL9���s�������
���e�``�r�_������2
p��E
���������ul{�����
qQ��WO������EM���+�h��$�;�W����w<!�[V��5
4�[
M�<���%�ZY�"������m-��;�_��%��Ew���$7�^��d�F�b��&�
1���n���-^��;����rH���)p%��}	YPR����r����2`gG�t���Gw�v����J��p��$��s�J/T���hwd�����g�I����hU,mm����L����U��J�^iH������ex�)�Xt��������-![������o��DF�� �9�K��Ge5wQa���>�������d��1�Y�$a�2�U8
b���6�b_��E�T�t����������P���������'�2{fR�����������q���l��^	}�&J-Xn���T��?[���"�SX���#�������R���Zh����@IG���]"�4�N\��o��}J�	%���C��3�4�+r�#N���0��3{\���O��FS�j_]!s����5$���pd�~��k���TU�)�x��jGV����;.J��!�d`�~r,��D���/����� 0���t�H�����fw�=l?�EG<4���G�AQ���4
���c?���@H�Nl����|<;������������i��q��&��Q
4�W��@�T��&����+��U�;�����q� ���i������h%�7�qZ���#����k���|w��m�
�5�M��m�����w�?TX��;���GM�����b�$����G���K�N��Fl��+�������r��k��Q�*B�wK%�%"�����f��kX�\'��
�9���
�Q���v�O�6*�����O�[|cdv"w0�$��=��V� `����t��r\��,���

�������L��{��D����bW�o:~FCe���S���+_�I4��8�Kj�|`�`x�9c�3�jb�&���/�\����#,n��>�����`{���Y���o�
����.z�F��~S�����b'���|����V�Isf__�����,��$�/�b���������`����ue�!�N�g�+4�fL�Xn��6E�K.�dfj<�3=�P�h'�y��ErF���nU,/�2�f�9�"UZc�T"��_K]��Y{������=q������`�@0����X�{}��hP����7����f��^&��+�3����v*r��:�Hoc��U����f-�H;�
���������E��8��d��2����3��N|�lg�D3�%n�J����2�c���>���i*�7������$
��n�Q���Q���,:� �b��b�R��}~��j�i&�m4]'���V��-9��|b��C��l"%�����,	�,�oEx�>auI��H#��������@��E*��O�:v4��15.����8��.�-���H��-O��
�?�6����?=�
��M:��\�����}EN��AG��)������������k70q�I`�����x�c�m����F�����>��6�o#�����=��I�NTj������21�1� �� �8Q	�#��,4���;Z�V���Ss�<��)�������Z�����������f�54����Q�1�!&R���	Uc�d�'�
���.t�8F�P�JLb���,�:����c�Jku_7*KN��m,���+V�|���tg�b����������X�V��8Kfx?k��@d��]����lr"d?x(�;x>�d�V���u�oqRHr����@��M���mx��[��S��T|Ty6��U�.����!��k��4�pr�*��9�"����m!�2��1��h9g���b�h��X[I8���)�W.��F��
���{0�]g�z��s��M���8����*��u��*���Qg���Do|��J}�NfN�D�;I,���!3g�����pJPQX9��������r�,��h�M�O���q���*AOo������vH�q��b*�/w��,8��G�R-��'h�;� ���u��
P��$t��T;J��<�=P\8�A�����F��q�9��
$4��%tY]R�*?_���*Wq����=���b�@��|�[�bt���a��bj�]a�����I�_��qM:Ea��`�O��M��v�oX�mA�k�s�$�1vVLP���&!�8��������&s7��|�TLs����O���g��e������u����)Cg�ZhAxO���>�R<����BI���,�����h�II�r��J���a��^��H���5|z����l��D����������7�����I�
���w�eSz/42>D2�>2��a���B^�$'�w�W;[��6d,����%�T^�'
�����^���a�=�~��Ld�������������
9�����F��0�RH�(�"��%\���JjpS���7!��)��|*�%���u7�Is��y�����9������E�&���>\��Na����W",�O���Af�I0%����[%��������l�a�;(l��F,L��_#��wtR��cRO��3�����
n�]��t7t��;���#��b���G�}t-�f�+��l�*[��4��,�P���=6��N;�U��.'lt�(�%��������w�"S�|�^�3�C����Q)��
���Qy�+\3������'oB|/��+9;�'��d}�h@�����gs��Qx�{
+Iu������KDR����
��I�OZ���?�H����������b��~�����.j������ah�D��	P]*���4��c$�z�Cb�2�����Clx�fn�tw��oc,:4NVH[����D��Z�X��3bK�/�M��Nz7+��Hl��;<v2�_���$	��49��d��B������*���D!^���| e��H��t�(�����VD�_3ndF�@n���A��{�h��C3�J2���Ld�}�V2X�!��j-�hOJ*��1(oY��/X������hj��{G(���U��^#��h:^(R��N��C��F�u�$*�W�O2nCz�vp��Dr��J��F$]���?�G�A�S�t,l��i��,�w��%4�����(N��`�`���gFDf`I2�w��dU�	��o��q��M���H���x�B����n�c*>J$[�}��;�P(5t����w��hF���"IZO~�4K@�CYQ�Hs���3���PJ������u}T �_��c���Mm������J��5�R"5U�4(J���A>l��]1�*�����hd��c�'
���y����K�0Ag�"��<��=T��Y����Y���Y��E����nF3S��F���<��Vc�����J�13
:+����:�G�Xj -�dO,5��h�00Yd��`0���(`�����u���"���,�r�5b��9)��I%����$��Q���\s�D.�(�
lq��.EB�Y�I�PY���^dI��$f1x`W�\ie	�|�������}�,�?�������
E������Z��+���(��_]���4������uc����F����Nq-�MlD�����B�G6�B�D��eV�(H$`]�u����5ek[�Y���N�j�B��D��?%q	waQl�m���
��������`t�s1���e��Y2�;	�����J���9�=��JT
��Gi+��}��60�����������r(���'�>AJ����<��5MUz�N��v���o;E�D�1���>W|�d��f�K2K�$u]���2�U�%3�~���*�j�1�����PB&�h� !��������&��������PC������]&tA�J/8";���YVT�w[a7�Yy�����}��O�&��������5Y/e���T���;|����g�<\u9�y3���_�S�;B��[��cCZ��cTP�iCf!��Vb��}?F��-�0��p��,��P�W��{�����^.�/�/|�������a�S�j"�;
����b�H&X'o����
���|1������;���P%|�B�F;C�B��{�?{��]�����������PV�QJ8�����p������K�b��b�	�����,���6�-��s0��������c�ed����/�S�2V@5��Lq���>q����"���L;f}�&����,����>t$W��@t�j�C�����`&�%<�$S�n5�1^r�$��h��^��� ~����woM!vj9T��dF&U�A������^]9�LU��-���	�k��Y��A���nx������PC���Mmy�
�nj��������=�T�;�����H�a��5� Wq�o*�G�{��v�� ��2?XW5�u��~�+d8W5 ��>����Y
wh�Buf���t���~`G���4u@j&myw����Y���:�����L����(��X�?$��Y��w�<�-p���n��;1���ET�2�Im�3�k�:�`�r6����_ ����� �X4z�u�dV(������j�BnMB=�F�����},�����o���[0Za����������*�������/.da
��+'����Q�n ���#TL't3�G����D�RW|�e�Q��'.�L�QG������qLW�.�,_GK�r�btv��Wg���;G��:3���'	������-j��>~������z�G�.�����%�>��1������9��2K�g\#���F��t])��{`o;9�X]^?1zc+6q%�/����`��"���+~��#�E
� sOb�7���c�6|P��9{*Kr�C�
O�#�W�HP;H� 5�
�'��	��k���j�PB��;��-9�9���k6���5���B���kDJ���+��	o��6���L��jDB�����]d�&!�+��?�JW���+��!�������y.�#����$�{�hC��j(AA���:��:��F#�����|�t�Z�Il�<[�(x��a����8Pf�����%�G{S3� ���p�h����EI������U���1�&�F�.sM���U\B���]�S�v'j�7�*>��m����7c��z�(%�������J�U�����������(�J����^���Q/�E!!A��#�p�d=%���B���07Kr�TR
��������7�I"��.�5:��d:����Fc�����-9�KI4�l�������6g.��\��3�S4$�B���?����i�N��-�K��@v3�0�7E�B,���4�l)Mt��E�JA����EEU���`�wn��Ai��Dtl�L�C��T��S���V���W)��b�tDPv�D]���/�/�}�-p���:��t@�3	��D�w3�������\d�����%��i����+ �`3�p����
�S4
��Fg�`1t��k/K�xN���e����h�;|�)B+O�-5�-��Nt�m��>�m�����I��?t|�I0[�c�tT���Y�����B�{>9�&��X5+T����������Y'�;7������B�I�|v5!�I����G\�S���~�<

!6�BZ��/�����@�&W�E�$�����w���u��W`�f����Ho�{R�(�Za��:��/�A�W�������^!+*:��N��p��������@iRXItB.y��al�O�l�$�u���[h������j�%%��q����D������M�p���%�aTX]�5t6[vP-4�H�IJ�p��n������V������������\q�J6�w|�t�\�,�k�1��a��{n��Z�n*��A>2�1���H�f���Y���H��&_��-�"�wN�t�������
����5�&5�Q�v^'=��3�.�<v�nI{�p�v�|Y��vPE�v�n�A����������"��R@�Y7� O@��;:�tc
B��E�v���npA��S�'9��+xR��b"�Gc2}����%��'
yG�I�u�o��������&�m�D���/�a%]���Y�(��O����*���`����<h�#��~�.,���4�l���&C��|���o�E���pA��g�P{��t�10�&@�nD`!7�n0`���w���
dS�|�&���q�\�����~Qo�����/�����g�?�*��A�}�5��P��1�^�,G��#���8���?�,X[�P������8��f��J��Z��Jq���3S�����E��g����aK%��"�@���cH>��%�h	�[7Z (�V�x���������������Jn
���zB�o�)r�A�w7F0��Xs�P�$sV�F$���b[��V��T����T���������H�K�9&LI�<Y��A��C����K�`�����T|�{�/"��X�1��P@����:��w�}���d��L����c��,^�:�	|�_�?��33�3w�B_��\3� ��D�+��3��0�`];��V��9�������g�+��<���b����e�*4G���G_�T���T=�W��[�@3t������Y�B�eO���L1�|�Q%g0@�������Yi"<h}X��.
��D@�D��8�C�&��9��'l�$X������x��{��!�D~��3RwT!����U�5\��!��Y3( �|��Bk�tD��f*;�$��nC��6N8�F�+�����r�dP��j@����lU�gYtWs��M%��k����B�H����������`{9�����>�����VT���m�:ph��w�g��e;j�	�!�0��Y��|�������RWBp8�	����4K`8��x����'}��f8��\��bd���2���3�N�� �e����~X�������w���2�NE��p�C7���x��%Z<��
���v�Y36�i��s�)���Z��j4lk���	�=�d���#��0���l���F
V4P�)J��t4�Yi'e�����hC#p��%!�F�5�gD��f^�&�`b6�P3cT�}p8 g&�������j�E��a����/�����[��-wB2��pd39VP��"rP�Q+}A��0���&�^*���x�i|g�I�AF>P�����0A�(tx�c;j�/D��a� ji{a�|`�>��kh��	a�rD]x��U������P��>��!X���(�b��B�����A���}(����dwSP3��!�:.�Y��XB���l��J��s�|��P>:dr�rJt����_��y���! �-�8X���C��Ne�Bs5X�l"��0L�?������Y�w@��H����`�u���K����y�5�4�i���i�p]������
�G-�1�H��"e
�aL���\,���%^�,����y���5�����(�d~-o��f���;R������@���d�c��������������zgAg��`�f��fW�-���1gh���E<�>��nG(E������OdM�!L!s2BDI�:T�h���&�b�������9���iK5�
��� Mp��y���l��
���&<��N�����{Z4O�g>
2�#Z��`N�ri�E�OP�A&���&�)S/+	�������k�B��|���w�d?C������A6#H��?)1;��B�d����OH\XQWw
)�KA!�HS��;�p�-0�u=N��p����i,�9� ����$+�
`���`H��.�Nm6�i����#D��T�����?S��[�f92S�����=uw���?kI>4����_6��'��=+�g1�tO�U�h�t�
R�cW;������A�F�c��{%,R:�}[U��S�u������ ���
��FT�N'<�k��%���B���i��l5������F[-�����L&!�4�0�1���0���@%w�O�X���e.���tZ�p���gM�)�2B`q���@�
���1��mUxq0Y�6����C����y
�z�@����}��n�?nstZ���U����r��S�B�@��C����}��}:�������@���$�����]B��I)A�������h$#i}��`"6�h����`��`�Z�*�
����4���x�:Sq����Gi�������5d
4���8�n
48wE �7\�p��T:��Xx��k9�\���nm���zO�d�������z�.2������-Bp���f��(Q�y��%��b��g'3c���nw��x��T����,k:� "#N(s:�>[j�5�p��J�Mu�1�>���~�T�&e��9=�����G,�#����������R�$v�4 s��F��#��t��m�&v.k�!\_��E��a��
8��a�A�6����V�~�/����e���k�����M�c(�mv�1<��7��6h���r��d`�"H����s���+5�����m�@�y�Q0���n�������r;$�o
N�y��������)4��J�=;���`�0mM��q�{������g����}����fP�Y4N��__tr7!��O3�._N@X���5R�.�_�ol�TX��:��%���
/$�A�c�����5G�9���Eb�b�����Qs�������>#��d`��pY��]B���H4PM�p��bYa��O���hH�:����F��X�kY�*��7���K��1K�[�}N7���8Y���y��e�A�}��S7�7"�����u��B�]84���#g�h������?�"�t($�H�U����F
����r�f�S�Z�<+r�o�31�h�Q{l5�C�#i�c�>�(�e��.�����D�������m5F.w#��,�qd[������^���I���T���N���|����]�����z)8!�@^NO���SG�]��w��-����M(;VG.A
��bDu&R&�_�1�C�~� �f����
;{m�mr���Y�gY�p�`�	8�y	p�[�-^B���l�u�A�1	W@�R�R���&�|�T���eW�`d�&��[��	88��_�M^���.�I<{v!����E���P >9;�
J@<A��i��g��YNQ&v��3pT��E�6q���1d��H���c�yV��L��X,��w�lj��xYy�0�DZ	����jDF���(�b���`�[E�o��\��+�XH����5�� z���
k�[_� x��r�?����
�h�k|��s���t��;�������<n��*�Tt��"���M���x~��et
�\s��2��T��_�E`���J�P�����G�E��v��<�D!�����������!���%���g|�������NZ��8$D������/i��~ex����p�e�#�0+��,�#���Q�q
|(5_&�@�r@�0��3Yg�����U~Y��r�2�����mwt�QYFt����mI�+����K����R�����GT.l�
�UT��G���@�)��h�����>������8`�&\t�G��>���b49�F���T��;��t���u�����x���_q���\�.T��m���R���Q+f��mxF[�����L�8DB�o�mk��?5do�*�d��?�e�1��l�Y
��a|�r6DnCQ!�����h6��L�6
`9���N@h`zW��D����li40����M|����G]�m�(���9��J`7�PUB�e�;���p�r�m�K�p����4�0^z+{��[^�N�T<�+w
G��@����F��-t�A�e����(�*���x:[���1���������Gde�s������gw����F%����|/��*��Kqh}�5wAF��Rk�-��D���B 8�d����_
F%���;j�o��W�����1���P�/����#��Q�N%	���;�
8�=[	-kPK����lh;�>n�C���B$ _���m��s���~��w��3���=�|@�5u��g���=�f�����$)B3����[���������Q"��m7�{�+������h�M��j�����]�7`T�-����T���i[�v�5�3�g!�qf���������y����9�����x ���gd){y7�a�{;D��J�~����n�%���nF��L\T&���5�m�G��6�PLU�U�����yO�=Y���a�N��P�1je�v�C��z�uH�I�b�"���-^�����SbD#����"�'�1�s�BG��>d��[�����(f �(RZm�D�A
b'��^�@��%�
�j��bA@t��e���&�������O��G����N�'\@�tkr0�h�?Fny��� ���0����&ah����:�Dy�h�:�_�6B��#�C%#S��/V��x�����:B��\2��G����|R�� ��OL��Rim��O�|��1������5:<aX}�{��������w�]Gm��]~��^����mi��	��"��@P�k���)������MzT����\���$�e&�GB��u�Qd��l>1(w�P��9Jq9"p�7@H{�8a�6�Z-�
�S���I	-��~��h�5qd��.�g�z�U�X����R��P��
!�����<6Db��G9-�m����a�4P�1?�q���X���9�F���q���y������{�
��P�)���]��h�
��K��rD�s�k��d'c'%h�n7�
�H�~d\�c%B��
�����/*-{�v9�
p��9u�O}�1��A�gY������Y��h�8�(;������z�����Q��0�������)�!*��oz�}t;�������������/Gh�l�q$��V�=�H��Q�^2anT#'�3]�=���>���I�
���Sj���w����Y��	8�����J u�cJ�,@�T���#��_�c�����g�����rR��
E���H�V���,s�.R���������R����D��\���1��e]�V5c0��9V# W�jK"[����u������GX���E��48����+k���(4�H+��#���mt�2���dk6=lX�c��U�Bv����w:��J�f�����T��K�ID��{`4F�L9��J��q�@ f6��,5x\u�m�iq��*q�<}k��?�8Pa����9�Oj~p�#`�#��F����kR��#����Bzg���u�{!ZM����g�n��cuj9)]�����z%��������Hv�w���e��N:����P��Re�k�y�R�^�^�t�4��#��a��h(���9f�����U�A���59����qc�A3����6o��F
���~���������lD��.�(��b���Noq������^B'e�-<�nY��0{)��� ��.\�cYB��p����������y�RY�;Rh*��>������C��3F����^�^�]�j���vg@@�^HK!`M����B�/������I������N(AX�K�Pd�`p������)�����4���V���W�;��=l1�#�S���J*�w��o���@�z�6a�:f�.�^C������w��F��R��l��z��l�y�.?l�{�hl�Fjl�v@�N�#u���m�Fj�$V�'�kLU����(f{�q
���&��w�g`�������n6[��m��c4S�R�g'
�w���w�]��Zo�.r�/dJ���RM4�y�G���&Z�w�L�N<�H�!���o����k����1�^�Z�����R�v���(���=���'"<(�������q�k#��JH�5,c��Ij�h+��3�P����j"z}G~2@��v�����^h��Y��{~�[�����4��8f�Fj��:���#'�������	���s�l�2`�
aO4Z=�����,�����	�q2�����g���e�	qg��|Z�:���DL��X��*L�|�`g�� �#�HV,Z�n�1JAs���?j}�/�;������=#��{/��wg�,��h��������Vy��G��
p�2�lo�Pv���HG�����G�����&��B48`�F/�lm�t�S�4�.���7D�� !������U��^������!T�M�������;�UpO����#�q�/�����h��������\������F4�U�o "���;�V����U$�����xl�����
o�L�����BS6���e>B��������Vy|�x���U�d������9D�K~/�n�%-��#`�>������*���l��'w���FV)����%��ey�p�*�0"!�;����/����	%�tq|����n(�[�Q���:{h��`Z����Z�*���]D&���.��\���F-�})�#nA���**����p2
v���[�_��FH>@��������mYeE{QN���BP"�*-�YE��P����2Zx
? ������#���B.��%��HQ;�z�:�E�*[^v�p�"��%��U.D��U�+`F�#���1�`���3A�0.vBj���	�E�,�^"�3�u�$A��>I5��~���������k4��[���m�����'���8i>���B=ZI�����=�sV��8�AK�'g�h��X���{X�Z��{�@�l[	`V� l�c�E3���f��}m;��"�!r
\�����?�hu����V*Q=����"�����Q�k�a��{
�6�-=A
+��a��ED�w��h%����[&6�;������5���bU�=�e/�F�P��{Tp?�IyvK�h�����s��M��"��xm2��U�7P���B��y���O�yxe?Z����T��$��h��)R��T��VB�t���`�1�[%��#e��?&W�q_e�������;��0e!0�C-I��'V����{��%���HN���@)�����f/U������w����#��Z[���x���c��{J�=�|��w�k�~�s1}����X�S��I�S�C�������oL���A��g,���H����a�b����c�c�j0������)�z�
(`�`I
RL��J\�VRAR������m���*�*���OQ��W�D��U� �������`A������Z$�*� ���s)|O���V�@����D/�������ZjU��#���o��F�������Xu��s�d�B
���k#����2n��<.�|_a��{�6���&�Q��{
���N/U�(R.z,V6D�V������eB��w�ST[)�	��V��Q��
`@�Y�WZ���&����/�E"�
-�
�0��D���i��b���w@?���v�I��Z�h�4�hu��yJ&C����q#Z��M�C��U
7<�dV:H���U?�����U-tP$��V����k��y��|���z�U���UD�U,`3��f=u7�Y��NS�sY��������A�Yi$���[%v�%	����x�n�:��U�u�uL��Q�3�H�aj���9���/?#��`/�����]D������p	�E9Y����)n�s������4�jB��i�e-j
V�7�hZ��tL���Sg���YL��'�(�jU� �kW( �@|���
����C��F��K<�?�y��Q�g77����eu���BL��3���
�57��`�U��Q��p���U�s�n��4�:�T��M��;e����w#�bG�*��@D����i��h�F��UU�D�g���;6�����K��
� 6�"��h�K��.�+;O�`X?B���77�����GQ]�S`�thc���Z�l�~��%�������d�3���zt�i�X!��
f���T�q�:�?
�@� �C��
W��yWQb�2 �n�kF/N�th�3Nt�V�f����[C���R�p�1Sl
�#%"����	�u���h4�;"�F�t��@w�
�?)N�x	�����c���q9��&h2�>�R�p�����D@���4"�[51�U��M�[Z�����M`�n�rj�5ATGFj�d�����-�O[���,0	$B<{�b2���"��UP�'�|.��PO���|z�6M�������nMHE��[MH	�':4�w����I��	���?������VL������aUy"�6\�%��v�^���E]�&�bG=�����_���2����A�D0J}Z�h��-j���Y+�bm|-�G����z�����VD�jB&������"��aDn6d"�n�t�S�n>1#�X 1���h	�b�J��FuV��������(l5A����g"�����&��H�zX $���M(C���8���u��U����0�/��V�_�^�z�iM6���3m^��RG6��:{�:D�}mc;�P�Ej�.8�A������@��?��h�
#W��R�lBZ6]�-��h���8�>�g8�w'X)������o���;P��0#b@�p�~���u �����Ek���4��iK�ME��)�!�u��Bv�p
4N������EWP�v�W������������I�$��s\Pf���IL�������#=�!��]$��fX��Y��O���l�����N�	�?���m� ?o�ZS;�&��Y�d�4�&�����#.�A2��C�FX����MB��
d�I:�����gL��,��I��k�t�������&p��or���n����m��_�����M���	c2V�����!P���e���9P����D���a����
�A4Z���f��8��SN��:��_q�&v��.��%���Af����I���0�����?,��M
-[��[���R�Z#�mN�&�(�����U��`����|��wV�[���M�4�9E�����
rWW��h������Re��A����D�����������~v�%�e����Nq�.D���}�{|��L1�-L,�G�S`\�I�8���!B�,��7�+��xI���XB�V��in#=G�b����B ��2���#�m/&�\�������=��u
�����Q=n$����"�_+$ZR{��e�����"js/K[_0$����F���������lv	5�����%s������{��EX�B����<��7�	���^�oW&�s�-N�8P�!�����LSp|m.8w��w��8O1N���]�C��v]x��w�M�P�y;����gt
WRfo7AjvS�
���"�G��.���B�
�.�!;�vCQ���)hR�;�������;���UQ	��'s+�Nk�Mc�[3:Sv�NL��2����&�������p�n�B����FrqV(!��5Z�����{�<����(�"`�>�3s�0�������c`2G��.�|D$M,�"7�7�����w�� �P4���;�J�#+�������@�p�Rr_/��4�]PB���-5 � �H
���������"��4��F2��<�	��Hi��_�j�y��Y��z��e,:��y���r�O�vI�����~�36$s���. !S7v����
�;�8��@	�\��u	�Qmo��h��s������B�;�D�����;����w�����e%���9����2Y7�_�
���yZ�TBO)���J��i��+��U�S��plVV�o�1X1w��TP�����Z��R���	���g����
��n���`�aS>i�i�_���#A};��D>f���SL ���!�v#��8�D���������2�M�-��2UG���lt�����}�xO81<�!�4������1
�>q��&������#���T?&�0��`01�
C0B����x�#���R��`��0kuK���C�AF��pn���2���:���XjT������BF��>&���gCJZ���p����������
p�a>��0���l�GnX@�~��<2_�a�� h�[q6����L��zb�htN����*���G�OM��&�S�=�J��	hf��!|`D]�a$42Q�g�<q��D��Qm�P�������1��RD���n��G7�w�jNW�e������"�0�qk
�>�F�_���m������k��"�5z[��c )��z�]�cD���Q�?�8Mv�+�)�P�&�>L�	W/� D�!��i�J�
��mXW���:h8Si<��n8��pat�7�U��~������c5
�,�J$�
h! t&���#�Kq��8���^�t?�UV����������}K�`s��#�e����*�L����
�
���=���n�s;c2n��l�k�,��5�a�������=2�0���~�SS��0��r��F%���DT�x�F��1,+�^�2�1�j�$�U������h���{=4�'�<���}H4���>S<�iZ��)xS�g:mG8���F����){�;d�L��1_��ic�C������!������,��u8Z�P6R�m���E'zgvNJ��C�kl�Hc�����U/l��>!?��B9�O,�����4���-#�|�uzv"s04^�Qo���8�N�-�O��m6�#��������#�e��X{(�����m:n[W��H�Y����!a4Hz�l�^A~.���J��

����0��+�v���s��P20UR�/X�Q���!���Ik��'��g�/�AC�����:V�:[G�����qK�gGD#��i�l�LA9l�xMb6�[$Ze��&�1�L���tX7U��Sp>���o�E�N#��a���+��r
����]|J#�������x?���0�4�d���-�����@����]$��t�����2�V�l
	���nD�,F����+��Bb��`�
)����he��53H������6�>�C�E�i�d���V�p�V���B��#<�u�	�X1����Y�m
��A�u�'j����=u���Ib�w��ef�a��T�O���:�����M��b����S����>���4���
�6���d���,�J@�}�����E3QX�������p�i�#:5N�)E��)�c�r�X��U�6jd�G+iM=�y����@����@X��-�L!����AI�
�0�l����Y�����f��7yJD���#�6?}�
)kh�"�x
�8���tft�8��3�e������~����=�����ft�����z���hh�,E`
��g���u��qo������{����R�y�>���.R�-�M�=�����D���8(M,��nZ�p�NA��?}]6�YY�1
���5u��� ��,'h2�%��� �_Q�j�9��>6:"T"%��7�>`���7BD���
�9	Z�5i����[XM�EG���Ix�G|�i\a{IhQcz�O�
�����;����v�))	o.79�93R�OA	Cq6��S:�+��=`"q����gx2�
�<�Y"!�"�z��2����CP���d;����W���='���b
'P�R�3.y��`�dU�`�>�����������{
�t��,���:/�c�@�)�V<��5����F��]���Ma!	����tt7������]ww������, &w�>���m��IY�mh�<�(O�C�O��N��(
�s����(�q�%j�	�"Y��c�%w�<��wQ�'N�r�l�DU$T�!�!�F�upVt\X�D�-�.�yH����L<ASk�e�\#*��_���V�%��dw[�d��xA�"�c	q���w�$��X�g9E:j�-�
��=L��Y^\�������u����+�F��9����S��YED��U�����vf:�%����bTn-'FG��%�a�&���m��k�Do�*	H��Pe��4�swY0�9�}^�/��p\�����hjW�n�1��^g��e�����5���j�(0����������4�������_O=�Ws�#�m�#����h�3g�U�nh6��-Ur�3��Fp���K��{�#YyH��j��kKT��n���LoOM�����L���XNa��:3�lukQ[e�^�r�����Q���r�B���P$DI�����m��a�V�9�d�����,��'L��=�j���b��X��C�&�wd��A��Y���dxN�h��������7{�gvk&�&����FG��iF�g�t9f�@!��X�������J���������?n��x�b4�?P�Cd��Y9>���m�7�Lj�6�G�{�c���(d��&~�)��Gtg�D#�����g_5��c���������:��j��B���H���}�f'rx^F h����A���l�w/���#E��M���o![������O��@���RO��Z�� z��������!r����=X���'��������Sh�����	�Pkf���
������
b	Q\��F(��������2����/qw%,8�_�.1���k�Fr�e
�zL���x`�.D�.�}��5 �Q9��.#��# ���~)[t/�6pE:=h�U�W���7�o��Y�5������q�{�:x�g���f��3*��q��PFQ�r�%�����_8����q���y�E���&"���3nW�G��d�"��~�Wgg����(3��_��U/�o�ST\�n!�O��vv����d}��{@����-X�H�r'*Z��]��RP���|�\�G����M�8g�T"S���V��V�����V`s�	�
��@Q3j��)ZI������	���`,�8�
{���[�ht��}k��h���s[*q�u$��,e��6l��s�y��h����E6]�����1��
��2��6`��2%.;0=�������p������6�"�?�0��1�>����/�!)j�
�"Pm��j�Lg���/��g�
��M�`�����P\P0=��jD]�-P#�K�3�MC(��/l\�n�����J���A��L�gT����I�Z
���E�)���N�y- �l@�
`;=�pD���{'����h��W�U�:.,5:o;5a8q�����y�k���mw�&�P4�,�{����+���Eg���Hd�����[�#}BA�vd���~�9���b������`|�oG�I������-����������O�M�(�2d�sx�
�9��f�!	�������w!\�D�- "��o��-�$���m��[��'�oa�g�[���4b����E�����(�o���������iZ����FP��-=��3"�M��GB)�����C��2^�6��b��^�_.�����ja!��S������c:8S�/�9[td��������(��F��mM��[�����G��n�(��I��V�f������(pd.��y]���?����2�B�],��>�����:�%n�(Y���P�h���Z����@����Yi, 2S��Fp,����A~e�����),��1d�`�y�������g�
w�
����%��#���<���w;����Q��F]��v�]Wj!gkbY]B,�^�x�Hw��pG���b����<xO%��q���=p��k���~^�8�e����?j������A*��u�0SH��T����{����2&����[4ZBw��"�0��N�5��I���gO}~m4�
WwlF�	k�f����O�^d^i��H7d�����qG@�D��%�G(�2�~���Ntwmhp��3�q��:)�������lw�'�=n����6�]�K$�:����W|���B/w�e�M�6H��qq|�=��>�-���Z�1U�J>�� J���ct!�x��IT��3|����Io�C�?�?_Ka����wF}�c�C��������H�}�$-(�a�Y�Gp����G�@�|���q/�$���x��t��I���J�����IC6' 
��X�+��G`H
�*��=�E��v@�f��t�I/�[����c*�/�@h�=[P�d��3���E����7?�9������8#��qz�����#}E4��;�#�]�:��
�%.��E���#���D����2�i����,������"��������L�+K2g�`�-tv^:�;����N����f��������5��0�,��n@�HM��L��%F��)�$��0����!k��rDd:�`��l��,�,���.���w��/Z������������!�fO��	y�ZjpW����h�JJJMV�l�Ya+Bv�s�"^��=SD�=�u��$��> �A�D�7�l��e������h������=E8���AXx�7�<��l��b`�1������q=z�!��
��&�GO�f��V^���=�2{WH"�4��I�_����3R�[��kv���ve�jja����mc��8SD�����Ce?�'��Y�<�wP�U�Q��;���w���8�M����^B
����R�v�&
�H�_�>#
��G��0�C|�P(G��{!O�cK�h.���yH����$���������>�d�x���g����k�"���i��|$p�{[���
q�PI������b�
�w�N>|�s�w�RRe#3�r3����X��`
NH2%��w�#��z&��n����j3����M���{
��n��e���^�{
/�tH��w�=���z��^-��&�;F�����	����������8����Y}����������,��5`�F=��:Z��2�)�aDs%�a�'p��7:�2�������ReF��@�u���A�]7��{���QB�;��/����������p�_�`��\���P�����������>�H�^�e]�0iS:��}/�-��&��sFV8�����JgT��$M�w��=���������T��[I(+�����0�����;�$OL����.�����~G
���!��f��+���:;��c���� %:���9�|�#�!	������$2U/��32�b)���%�bD2���Y��~TK��
����_4HsUP���#�q	\����_f`4��T�$k�4��{�@�:����#�{	�h����q���0�L4�X�#�6�w�^���7
1�4�B �!l��ri�Y���s\�j�A�Nj&t��B:O(����C�S�0���7�`�W�'x/$^�CV�-�X.p�M������)��v�����ew����sy��}G��H�P,@���*���J�A4��������}f��U��K���V����^�D�]�B���x����}6����i����l�)f�(��[(�3+oE��{$�������o��������{
[�G���.�,K�R�'��1����!8�s=�*��!���R4��j�~�^H`������F��1ej��N����Wd+��ne$�]^ wi���@kH~Vt�.�MH�I]���<������Qe���q��������]�i������o�R�l��P4�^HK`���E@F�����|�NAD=�����\�M�7]�g�`)��)�P>��/p�Ki��XbX���FzB
�"��]��D
���o���eg�{ �ko%0�{!�I�!��U�A���H(!��b�1��y&�H�P��(�����|w�:��zjc���\���[9dQ���]HgW��5�������{t�)�-P����;\����|4R�E����������J|1"Wl�T>���z�+-ZfM��*^�/]��D#�u'�\���_Eh�@���0,dAPp���_7m���`J�uq�W�E�ew���J.���2*��s���tQ�����qDm\#�H���R9�.����q,bQ��{�������G����Rl�DJhj�*N����a����:xe��K���I=��3��an�.�3j����=�P�����*��reA�	%;;	���l��q]�b�����|y�o�
�1
�j�C5�g@vf������+�U,��5[=��2/�/t�������
�g�]�.B*�T0�@����2�NG��*�'NV"9����5[SF���`�`H�m/����L$�sv�5N�72%Ym�r��.�����9��"x� �BF��>����[F�R��o���p�=5�zG�_��
�g�����k?��c����[�o�Nn$y+"��D�F���Y�z����U������yYcF�XJj�������'x�a���Q��	�"��XJ
��+�F�N��\�i�d�~`<(��A�L�B�����d��c7�Oh7D��_�{!aP�1r���"L_��.B2��&����t���,�8~�>!$�����S����=9M:lVP�-GzG�T�#n�@QT�?���U��kh.���g5��P0L��"�J5hq�P,Z>���a�-0��#�����*�"�����hy���W����/�$R�jp���zD���[D�*�bEkQu��p���[�V�?!�%b(B���������X����^��?�����)_�$x{W!4TeH�[�{�k�Tl|�Q�����!��<���ZiA=�����&gA 2�e!6��g���0p
l�	� ��5�D�3�k�F ��\����+rO6��f ���*}W;EE[d���+��E��h{VpRZ����~�5Z��B40$@n�W]���6w��g<CO�]�5}������\��������ov
��3v���.d�}W>������B���������9d�����"�O5��9.�>�J[�I�Z�q��`��~f����U�w�E�n;�������a�i�r)�*���'�������%��N�^�' ����k�_8S4Hm��F��!���6g5�q��(�uW��w:{����p�C�g�?�� �d�'���Hm�vZ?���������F+Xa��u��qAf����o��n%.��}��nr��:p��P��G�Nv
k-����M�Th\]��C4��]�i��Cp�����
� l�
:���g��_���mD��:�U����Q��,���
�����Em�=�%�������T��Hm������o�V-��a>P���`���Hb��u�s���[A
�X6��h��v�/������Q��O��TY2/����f{v�plD�������P�������R���OM*�]8������\�M���#�:A��N�������9�G��6�	�����>�R$����E���l�`N|��k������*��h���P�0d"�*pA�=�K�#��%�$G���;����4��g��PK�D�$U(T�l�� ����m�h��B�t6y��qZ_h�*�������j{L"n�O�
�6��oF��~��MSd�b�&��"�+Zh��T��|QH�n������<9�=���k,]L��f����;�b�_�lI<�vT�4��[��X��f��&�"��B$��p��sJft�k�z�W��x�f�'���yl�(������+3�Z��f@��|nH��f
�A�MW�O����f�x
f9�zg���8���G�0��9�����D���M0z���D��C��%����
��
��nG�y�Zb�"�+��Q�&��f�b��9� �D��$�5Z+��r����R�>_!	������@-��� ���I4S��m�L5\E�]��%��_�J.��4�+�}�',��3��'���w����>��O$���n�����������2���wg'B�o9�Q����������
���BTp��� _EJ�h�����/62flN�@����hb{�a���}���h^<�q��6gJdkF8��������q��|jK���:��9�:����v��9������M�x?���Z��!<a�A�\�f1D��oB���y����B����
������i/�[�A��z�M�J6J1����E�p����n�PO�:��]@CGH�����
�g�Qf�n������E^SEL���_��j�/Du:U���R��H�����j?{��j�o��NA���;H���x+e7|Q��z.Y%���l�����3b�5�Cl���f!�0-x��a��fZN���`�����L��;������!1��M(	��2T�+"95�
3������C���-+:�j�tt��S]A�?Sv�7��-��6?��]^J�Y\����fa@�n����S�D�&�aSRI���^�A�*.J4R��l]�0"c�.��EM��X�*����8V���Wt��N�����F\�.0��U;��Mhw�5�1��F���L�*���H��u<����8���P�j����E��v
TZHV���{�={�
qz��"z
_������;�Q6��7]����3�
���j+���bo���;���]X	�c3C�.�#Lr6
�Lh���I�vJ������Y13��/�	�:�Q��
7$��� �X��p�~m7����&M���q	;|.:z��KB��N�5�����]����H'��5r�ph\���3��m���7��h����'aN�<��uI/��-jw�u�u�f+��]F+�@���
�� ������P�������0�$K���(Iow
3wN��'S�~�I_"�J���^���;&B�j�����~�;����>�|�B���sih5>gXL�#����LB�����5�
�ja����X�SB�HH�v�`�����_`��e�k����4"�(��e��������"?�������'��M������
��l}����>�l��zR�<����H.�09�E+��muun�w%��t+"������n�x�\��_I}�%
��UtL����0�������T}�^��D���������q:�����-$�`��[������n�"���es�{�1�O��?���{E���j���|*��O�^���xR��.����J��5mrz�twJD��B%�!�����}�G���>.�G�R�
���dO+�KV�
�@���a�o��i������)��P�qj*q��!��L�>��| ��BV������J�T��}����-x0'0i��,~���d��~L�=��?"�R��Y�2�����p�i7�hO���V?���K��:,�h�hJ������\*(�^���/	��t����B!��V��!�U��NR���!"�V2�j��N������[h@U�d7�#"���'��|Ov�!@�P����&4"�y8�:#��r*��r����a�*�j�.��y"�<����>�q|�8����#�l���K�<L�M��k��F6�����l������?����8rE����j}j��4(	8��������}=�5��98,a��P:!{�FR������p�X��{Y������
���y67�i���J�����s��yfvm�3H����)����;�Z�����#PwE�C��*��� ��<z��6�4+d<�a��������5�s �TV-f�����?����&5�F<�@����O4����`���LUuN~��z�����%@6=�u�D2�!�Ay`��R�F��\O�����Et��9������N�
 ;#�����vz��}�M+�����f�O�.���E	�Xh��P�a4z	g�KD��1���X�������,!�6,hbD�1�
��E��h8��wS|���2���L����xn�ow�C�^��@��.����&I��xFM��hV
��6	Bn��������#�e�P+*[Z��T>k��}��Q��� �w
�9Q�~8���g��G�h��V�e�BO�N��������D�C�<1�o�7���I0�Z��X?3�+�rE�n�����v���2S�!���{���e+��C6�~���.{��h����O����kA���:ZN?�A���pX5��|I
o�f���C^8�c�����@�E1���m�~�o��=IdfD�z��y���a���
��E�]c[gX����w����u\����h���	%��~��4a`��i����Q�����!XR��������jD����zd�b�����S�G_�������`xf��@��/����3o���P��{J��mF������>q'�����_|D�������~`��
N��
���k��7�3��K�����������������L�;{c��t�N�U�C�>��b����}���<��6�4v������k����7'��n�OL����f�4@�T������V4����|,PEt��H��bG�J�
�����fg�Q"z����b��p��,4�}�`�G��2	�����i���I����a��;���0����"t{~)��Dk�P��s?���|��
f��O%K\����[��bWl����"\�	*����vb��6PD6'�d`:S#Q�l��r�:�I�RS��_�5�Q�>�����Fj��4m���SpL���iJ��6g`Bu�����=�vfz��@6�-�3����������&�vS{V���k�K�� al�����T�$���l������L{*��68�4i��XF�0��l���	*Q�`����*����6	����/���>�a�T������;��Mv�����c��Qj�V
s��|5�u��t��m��0-z��3��-Q����Q�mZ}q]�����R��g�������t��}g8HG~�S�$����#���� �6�r� � 
j��F�F0����,��`�:
C��NDg�<@�O����%!�D�a�&I(��F:"����"���p�BD\��j�Y+�3�A���E#.�t����3s�i���p�
kZE������R�)@#Ks�4�-;Y�IJ���*��h��vZ���,�{:����A�h�[2��'8�3�Q8�O����&��Ak�d���h�����wnK�v�C��T��	���+��o�g��e�N�b���(P����
Z�����"n������V���t����r<����S�,,"��Hf;��)7�]�0�;k1	����i�����-��,�;�}��$D�Nv������X�Iy��>%��4�*�i�C2���	���K��\��z4<X�/e���u�!3*����6}�N�k���T���r	� u�����Y�V4h����)t�Q��2b�N�y6�����_2w�U��'���9Z.Vqcy��K��;�1-B��`���u	�XQSc���\������	�[-���hK,��xfk�?��d9D����p��=�*(*��M��Y����HI0�����^�������f��G���������+if}��e��W�c�%"[����shl�D\�m��Z+�v���T������gw���V�e��%��I���(k���]�I��|��S�W\�O�C(;��92?���j�8�FSv�*��Rr9�:���-&R?�%,bE��%�ag[� $}`'�Y���ew��N��p�����C�X�%//�(��L\d|0+�
�6#�($[�#z��r��!Z�7`Q@�z;�z���5<��x�Csz�y]vu*-=T/a
R;QRNit	����z	���� �LZ��!%��e�����)7�q�. :��eE���]��r���H���ec-�Y�P��
�z�4�bMc��u���(n|�N���q5|�j�ta���ht8�"����L
��`������1���T�8�B���){�&`�c�F�'���3��uG�^F
Z�#���r�Z���P�q:�b��
�3yj���)�,�@vD���	-Y�r	����oxc[��(�t����A�cD�]�'���&�������B)?uE��<CD���)�S��2o�%Lb����������p�_C������U���v8P�
�,������|��/������H��qpd���>�E4k?��d�����6�j�'����k#(<����
����v��eH�s��+%�\.�����44R���O�5;��4���Y�f z�wTr[�������QT��`�d����x�:#���Q.�0UbT�n#@'�"�Wf��L��,W��+����-5���-�_��Bd�]��f��-����)������vH�����<)%���@������(xTR�G�A��6��	.��v�����>����}.�Hd���P����+o��D�]�q���\5�"G7 cFh�v�w��Of�����������4�.��e\�D��RD��]]�A.x,����E'�-<��-������-��h�N
�_����n��S�D�m��������UR��mE�:=����o\O�g'j����e��-p����&�6I����B����:�qZ��X/��d�Kd5�p��5�J����)�Ws'�='M��I�n�r���XB�M"�H��
X���+�>Q�lws�J���0j$�!1��Y��G��|�p����zz[������%������������+zV#8����a�FK�P
F��g�0��wt�;��13\��T"�%��#Y�6Z')�pl\���B+��m-D45m�D���5+�
J� �CF�0"�l!P���g��-0o�h	���x;p��]�#�ch(�(m;7�n����OZ�����-%����n�	�T�_YB�����KrO�P�-d�-"m!	���|�w���a�?�c�/?>f}��������q:��='��o�	��x
hUv	wu�9�EE ����v�s;�:��n	�~F��l��P���^p`������u
��G1S{� ��4�/J3���U��T�w�?���!����U��u>�y4H��\))l����tl����G��5����E-���2"37���!�Q��D@���pt�Hn�(�e����d�J�u�����X�@��}��Z��:�h�:����N>���4�������d
���_�R��6l>|���<���wz�D��T�W;>z��6t���~>C�a�F�nv��v��6#��u#<�.�>��F\�c����x��%G4�>N�+�b~H��?at4H��R>j�o>q�W�%��l�9�faW��
'Y����������188���>G�A���	������3M��>�P�nG�h�������Q�O��\���)���W�|=���vZ��I��h���������l�Bw
W���1�F@���N3�Y�(�#�IB`s�A�7:�a������U[�����#�U�*�`��z;j$����S�e_J�`��Xl_0�"��P��v���KD�:�������D��#,���f�� Jbd�k�Xvx� P;c�����������6���
�%�)��S���"`��{K�?rF�uL��{�F�g�X���@U��?�t�
���t�H���������h@p�f6U|#H�����=	�������T�����H@� �Ldyg��q_�pU��s�e��QR_�c[8V�� A�@&�:�%0`��Y�1Lt
-��(Q���� ������� (��n�1$�eV�O��������e�nv�,O�8X����QQd+�
�d��|Zb��:s���nZ�M��h��tb"�h�h��Mw�U��VT��4��P�l�N��X�]�S���}
�{�ZV@T�A�E�bHk�Fgd�������l�T����v�%���G�%��� z�B.����n���S9�h�5
}�'9�+��e�^��^��nM������+��)}~"k(�$#�l�0>�5\Pt�$K��^jt�?�VR�p���Jd�����"�mad��# ��~��&/��8_vS�l�N�p
�ELp�?Ms7����X�M����}d����B��-�
��n����v����;\dt,m�Q��	�9���$�|�16�-a��;R=��L(
G��Kf�;H6��0P�
(���K���T~���������,j=����1����0��oii����{!s��9��	�;\
��4�i�����&�1O�D����^�O�
T�����u����<�w��;���j�����Vr!pzj�R}�_��D
���e��������c�5��"��M�}�kCf���HN��p1���;h��8�EX�����^C���Ci�;R4bk{���^c�Dk��8�{��F��P�;u�_�PmLh��]��^�x��K��N���5l���y�����jIJ��N(�,�A�tX>��uE��{�!�W��l�V�����/>1�<Ow�%Zp���z2�ArZ�l�6������ux��z�I�-�4d�N�nr}�����>@������.ia �;R%��EY�GVO	���	}�YQ-��*����]�gVI��Y]#T���������Cv�]�fh��^�u���&�J������w�&a�����&��w������?gX��hF��8&b�p�;�d�l��)���.��xa��lMgoF����`�>
�������_�o����{�+�7z�r�I
~��!jJ�yGjQj��n���9,h!�����RF�;Rt���&ae�hYH��8�����x#��l���N+:P-��������0\����Hj��G��
��%�V�k� ��� K��M�1X���t��B����"���M<	J&�v��-E��W�Z�� M��������#"���>�l��7��$������\4���1F;at�9��y�����B�]Bx��!����#�
l��f|D
��r��+v+/����C��0@��j��O��
F�o��9�s	�jx��h�,��iS�bG��b:�u8�-��hQ(����C�R�)���6�i�@�]H�WCVU���K)���S.0���1F]��8_.�����8
����b(��X�2�Z"���A�6���I��h�����*���R���v��5��,	�1h��O�)��$��9>�2q�}�!�]�4 ���n�{�OK)�=�����y��jI:����T��k�XX��&1y:ECvJ(���'�p���X
������.D�^��Mexq>D��)VP rb�'�O6����pkz$
 �����}�+�eJ�ef�_^�Q�)_>D6H�����)E��b����=�����R�)�'G3�1� $�e?Xs��&F�J�������?�l�]G�D�H���X�mN���-���u����c@��v�&���v(��������a�:����w`�,)������(�����L���IDF��l�2Q#�O����@Q[�|1=4-=�Q��XC��H�b���O���%�������3��~��8\�eN2S��k@�#�P�^"��m�����'��e����9v�slM��*��!��F�3�8���N�R�"(B"`�c���s%��S�L`L�@�NaY���Kt����rU���D�t�N��L�f�3��q��>h����:�c��z�-v�]Y�&(�.���K��CD6�-P�.#��Se*B&�c���8	k�$�5��c��A6�0Fb���:Wl�W�o�0F�-7����xb��P��U�aH!����]����f���_�/�o8E���i�U���R0#�A�*���4"���B��5��n
*�	]��2���hTq��~�����[�i���8�>��_>�{��)��8�U����,�%]��� �J�Qz��������6�g��C�;~y�}���%�(�f&�m�Y����[G�w��&����_P��X
P��a���H�N�P�a�X���~���%T��jG��aV�f��@�i{�
����D�w���Y����NOR�/����������6[�FP?���1H.a`�
��e�JpuT�Vg>H7����Q���Y������M������|���k�w��	?�S�<�7�t�&o$rl����I5���%����n��sv �.f��Z��\���j��g�����y�U3U�D�r���)f�d�N1��t�PF�n�)�W�Q�PG��=�
�Nt��N��6S��llAREUm�?�����:�_���'��T#�g����f+�@��i�@�H�~�:@Q���N��Az;`�7�O8��T�����
�~��L�T�
UqG��w��_�����\9d��*��Dru��d�\d�� ���Sd{z��X���������Qro!R�T}Da��:�!�O+n�)����e��?_���N}��"����N�������g������iB0{����f��d������7Do����6"b=k�Rv���D���d$�������O��Ql�?�~��TX��dA�03��D�U���'��
�E}\zo���h��0X����9�w���������vV�
h@ZL_mZf)P�N���>
�x������B���7�;0�>tVO�
�'(@�����^�)��^���E^L�:@�����#�S�Q�d���$(�������M9�9Awt�iD��,���'D�w5FAFso�l��n['�e�&ax���Yb��Z4���f�=b�U�k A�4e�f�X`����U���N�u�`�G_�'�Xp��\�S@���(,�?s��K�C���U�Dp9/�����
g�+��_�UHV�'b�U�5�`F9�c��&8������Up�����(G�Ta+���������%�T�S�L1���[*�iN��]Z�F��m�=���U����PCB���c��|
M8-ZA�����+�l�1����V~������J�^���w��5**_OzA�;dz�$k��o�/D��<'j.6���Bl��)�W�����}�j�54Z���]f'G[����������KAJ�)q���	��]�jTU��~�"��4�p��h�>���Rx�z��N�E��&(cEz�&��&@G���k�{��a���J�
�08����]@����0��_���T�����F�ix�����TDes�US��i�L���
���������# 
1y��3���)����xO����;P���a�& C|XCX {�Z�d�'��-�,�^���2Eh6-c�.b[&R���1����;��� �]�M�B��:�	��6���t����D����n��`�M��N��:.�����	�Y$H�hFhm�4H�I�nO���0��m�D34z��Y�<�12�������A������.���H��l9&�M{X��������u,���+<�����0���uv>������P��?����-�
u��d�

���S�����Zt%����
7]��	l�H�r��I������S]��&�6���,S��@�pk�`��Q���>?�h��4)��3��&(`&
�>���X�s^��3����9%B����0��m����L���T��
���
�(��9�f��&d�erd�OxY�8�����&8Bn�	E���8����{��]�������,`���p�0�U"aN�V�F�ZpD�v�P�	b���>���#G��-��HA���r���^���h��/���OL�A@G��J���}�T������]AOH@D�����q��h�����}~e;R�����Q�^��M�n�����<�^3�?��)u���(�#��\�����Ak���B`��;�j����;`	rR�����I���,I���z�I&���I[�������X���n��[GC������tK~��-A��@�x7�O����]��~A4R'O��b����9.��4@�jw�VGM�^��A�D��^���v���i����}����x4]�~�N����!1D���������63{��=7{���>�������Wf�[v<C��5G���5�|�z�WQN��8�f5\��zt2`a�S�.`E������v���_�c�e.f���0�h�Q�?���+���G{(����������;�����,Zd�_;��Nlk$�����1����W��vAN%�%�!C/J���&q�?������xE��.��40B����M�������
�3�"r������b6�����h$��dvu��j�5��:e�Q*7Ly����"If>�8#������M��=���9i��~�����=*��/j�t!E��E�k����?��.D@�WY-lE�,>��4D���8<�pW(5L,���}
\L������������i��h���a�L��
�h�*�E&	��/Gk�����,G�l����`C���6���$�{��S<���@����]�� �]�l�� �Pz���Qu�������C����x���`!4���
���V�~|+2jEWY{��cbRW���0�C����_��,��;�![o���s�"��[�f\��V���K�Z������u�p��#����������s��w�x��:/d-FA���Q�3�I�����X�e���p/"����>9��o4H�n
j��0��x�}��{�����Knf<�o$x�����X���f^����2��ew�~������������,C�{9��C�r�j���3���m�������B6�e<^m�'3��pZ��N�~�3���.�;-c�T��xXS}�C8�	����C8�����H�0������i�����z��:�������lwg�e#��h+r�v&�)'��E�����]	7 c��B	�biT[����K������Wh����E5�%E
�a��kD�%g���*����
l(����l��;�;��f[�q��Cd�hR����"��e����p����3{��f��>kE��`j��Od�0� ��m�s��T��<G����`�"�����c�UQWlP��O�1[d)8��Fp��%~S�!��(a|��m�9_�d�I7����@t��Qu"�IA�0��������}���@��I��_��d����@�O�c���V����	~����� ��b�]B��gM�r���B�2������/�����N���I�[��X�[��#�"�l.8�d-�D�T<�?�����'(xY)�zhi�������Q�hXsp�-��9�f���d������l�$������2��a�&�%M��o�Q�@���|]�7�q�[�T��?��+���=��$9��xY���p��g��'=���<'2h}CG�=���C����?���t4>�lY����	i�6~=����NlV�a5P�%6;�������%�@~r���3s����f�������l+��Lp�7n��nD����${�b���]�>,QR��-��jV�8Iz�U^����d�A��%)�0�>wqn#�d�8����E�ql����W��R��C��!]�JOo�����������v6J2������H�1�����7+�������^��J�2;1�:S�����'�0��=�d��H��O'@�z@�xO��)p�����)\����B���pM�kB�O���S$�M%��0���;{\�0�
?���q�8�`���5�;p2������c
| A�mH�/���j�VNA�rp��������?����C�Z��E&U� 9?��mk{jn�EE�R����RI�:��dE�x���r�"�+����Y���b��NF��Y�o�&3hJ[��B���}�ip��e�N�V@Z�������`����5RFI���������j���~D���k>-��4�L�3���?QC�D
S�v�0�p�Q�yV�8��>�i$�0	��C�����S�QY(n{���tZM������tT�-�h���L�$z?�.������MdJ�
	�Xs��J�Ki����z����O��Qhj�+��>QAxyfM�i�C���I?�]��7Q|?X����5U�������a�-3�W�`��B�����Y�������q�8��D�~y%j�L#�g�	[���4�Gd&�s�E�s��wG��i}���v���
���B����
��O� ��h�pXl�w�/���`�hz
�^���4�����[��>xo/��W�lm��X�����-��a���%���M�e����_�*�X�2��/���]�H��4"*����6�>�4�e
��-{�&i��]nU��w���w����&���l=64�MlA=;g
�8�WBn|�4FD��)��k��(cD~��
�����>���n�0Y��������$Z�bItK���o����}�Y��dx���\�u��@�8����t�U��g�*4��}�F����uO.[K9R���9�}���Bqc����1a�n��9�o4?W�0
:�Y�-a-�d�l�p|��������q�C��zr�4�m=�����-vE� �=4�����+�	��[��AN���6����'4h�?=�Wd��`-��
�G+4����o������+VGG~oh�o�?���%C��(��p`�V��T���}%��6u�����"+���nV�)����l���,�%��-�r�J��
��6�� H���)0R��P�����R��>�s��"����7���&s��09������hB���_r{���Jd���,V�n5�7/����!����/�>lE(�jq
)�.`�����=4�f�I�~����!�+���}�qEZ1�����>$�R����c��X�/k��o}`������pQ�x�hid	NG��$%������8&!��2Z _������3Z�z����t������g4C����5�V����t�c3g"���qsV?��"T�4Lt�?���,k���0+{,$d���mE����Uz�IH���|����~�G�9�"Q���>O9��a��xu��F�w����;�~*�K�\����`��E�0�u����� �������������>�yY!6���|�B2�o!�{�������53���L���gw�@�����������Z��1i���|���r� 7�D`��J_?��^�Yn-�2�g��/*�`u2���r������_���C���U�+vR��b�=��G#��@c<�d�/��T�.a���	�������^�[�����3�.����2��K���W2���������9��[�/��"��J�2k[��@k"�e��,�b���^�hl�us_4m^��:��A�>�E��@	+M���>������|R|T�o7�;:;������+^����*��G�7��O��O��Uv��E����������x*�6}�i�?r�f#��2��|���?-�|�;����A�.q��2�����������vO_>�j\�����������7/���:��Pfy���Yb%��6:�n���NWo����z���PQ�%�a��;�F:L�>�.	���qu�e�7ElD�;)2��"z��B���}���U��~+��5���0L��w
�l��j��mO1B����|. GA�� C��f����)���X�Q�����6+w�y������rVYG��J���:�����|���uNk��#2X @�j���kXd���@!��$�c�tD����l�0nP��>�)�6d��s��0��������x�T������,(@���.��/W�'�D�4k@�x!�`#��1�@���x�z��I���B�1�~U��(S�.4�=x�t�)S�dS��AR�*2�v
�E�?"1}�+��;���t��kD��I[����f��
*��(PS�?�|�#.�^��B3z��v�=
~h������3����T�EWpMK��d'���c �s��+w�!HWy�s/�P"��z���=�������@��=����2q�����v�1&��f�������/}At
6�E)	�����w�� b��w-|��R.����V;�3>q�
4V���ATV/�P���v���2z��mE-r�N��2���`$id���F��[���m����/�&���>���+����,���V��N���$���y�W���%��9��?��k'����w�FC���vk##�n�5nhw�c��(;K��dM����<5�u�%vR��Mk8��F?t��9k����/{Fs��=��(2�G:Q���������}��l75:�k��}�	rT$Eg���x�m���q�h:H2�
�h�����i�m��"��>9���
v�<��$K�1."�����-NL�8�J����3�Ae ��<a��!C%�TpEN��������c� }�1T����|�H��
���!\���v��$U$�U���b�~�a9�Oh�YR�O�i{���>�c�D���0�B#=�)����.��5�����'�����rz�h�:�D��f�'��s��b�''!��e\����b	��N@���,#��=t�[�'Z���)����B�#t_�hm�r���Q>N�l�3r�]+�3q����6u��"������.�-�����W\���x#�$����%oD�9�FhEg�c�C]�c?��b�J���h#��O��t:)R_��]b|J�c�I�C�
}5��l�c,C^����V�Z
7��8�Q��8����%���R�O���c|C�����?����h`�56����F�bc��K�u�6t&�=�3:+4���[
<�f���U�iD=	o�KQ�`M�E$�:F/d-�d~'zz�� ��HP��6.���{�qm�.��h�tu:��oj[G8T��"����1�%T�u\��mP��'�U
�O��S:3��]�T1�PQG�_�b�-��-v��k�CfK�U��`�A���/+�H�NLh`���Fm����
��
��+4��N��t�J�z:Tg�E~��%�F������+N����j�_���iM]��eI�����[X�+P4�R�YD�I�pz�"D?!��M�4g�M������/�]�s����lx��W�x��.����@RGq���Zy1�(h�	�9S$��8QO�����B���m�H(��ip�g�����KD�k�X��	�����.�����%�a�h����r.�Ot_=i�*��c����Y��T�*���,y��Hs�EH��]��y��$���%B^M������_�� 7j��u�tq��o����@�p�z�\+w�
�{�������^����V�$u�|�;��������`���J����{�$��^�La{��	��7Q��u�_����������B
�/�([��??�8v��QI��O�H`S��H�6#�W��q�/��K7Pw�A��n���2���%��F��6P|�G��f����EoV���9v~��r&Ug�����3����=���H�����QO��$�hP v��(�m�A>x�#�;���[,�F�
Wlu/S��m����������v���l���^�>�wxUd����|��`Ww�k"����w��nt@��P�����{�?(JK�*`��k����p<��	Q�l���'�|>2�#'�^����t��+W��L�w�'������<wx�zK*�PpP����������{��+WZ?����n�vb����w�
���+�Ak���QY��C$"<���k�L)�6;��CTg�
�������~��4V%m���/���,�^�8���Mh��Lt���F�z�h1J�+�48y�o��0x�/����S��vpY�h��i��X�A%�����P���/�	c�C��ZRl�'��{�R���sle��;2�1jj�M��1T��%/����|�CW��qK(����k�JQ>Y��y���%�3�ZW�N~�2���(w���P�_1JBt�pw��#B#����pHP��?^�
Y6W,��w�@��k�k��	
����p���rW�*���^��,��1V��!���n�����R�F	������vN�����4�;<VO�n�B*3�js|�9X"�p-���U�k
� ^pw�����1.!�BWr�t���?C���(�j�v�Q
��vG�������d�h3��1L=Eyl-V��?~o�M��<��y����>������A.;�G��E�+��,����'���LO�����u]�N���2X�������K�2���Ai��?�ao�*�.���/�B�,Ol��@�#�L��(��x��kD��~u�����TF���#�!'�O�~"@%"�;�kYMn=*K	7�A�/���h&����s�T�~� ^��+	h������;���i�����@��^�&qF��E����v��:�C�A�_BS"��(��������fL�;��4��=q����LJ3�s����e����K3�|�9J�E�M1�0�����H�5�m4���`���D�����#q��n}1t�`��l�Z=v#�z��i�����\����	�����/>c:�T�C���u�������1�!
�{���
'��GC�����t��e���l��=��hvFb��Ae����$TI�h@��7, �$r�B�����B����1�%��+��1G���������K)��
kz�$
�^��
���������	�%ortU����p�H��U����n�:�U���'���U�K����L��i�+P�� 4��a���^����3��y���J�����0(R��~WL�x��jF%;��?��4�A(%"9����R�;;8P�4����<�j�G{��R���m���?�^��b��������� ����/�g��C�et��u�����Aa���}����p�_����W����	(�GLC���?�K4�$�[
-VI�?CUb�Gz�c���(�^�,]�W��'f�xm>��U����L�,i����v��k�!��T�{�2~r]N����X%��L^�3Q���CfcjWv�w�6%��|�f��Qe�*�_�����{������N�E�[�L��8	Ac���C���1�[���v� N���]C'������w$����AH��X�c���U�N<���AVe�k�n��	���0*E�s/?_[��C�n}rn�I+��T���	~��~:	Z�^
��P���v�C!�g�;����������s��1�*�i�x�l�����x��j�
pl�?k	��>2���/�ye:Vx�����SiVU��p�8Z:&e	�����2�Z���jLAp������;��dC
�VC
bG�Wm��q�������9��c�!��E��F[kl��$���!���gl\b�*������N;ruC�P����Q������p�GoH!Q�L������}�{�(��g����~+���i���H���&z�G�G����[��6�HD~�f���j>��,r[)NB�PA�l��R�qp5��Um=�n���P��Bt�������}h�&:�e- EU�}�F*j�j�'�����d��q��(��^��������.Ws��>�H���w��
�����Io`��	5s�{��i��
�{���=qb[u/�}���fI����SU�������V��#���A�z��r�C��UG�m������h�|i
�q�m���^�G[i���icua0`�re�kz�m�R
Z�u.Dd��J��4(`�y��0�j����Tqm=C6Yx�4hA��� ��T�"���ho)[��kQg��5/jp&���-�Jwv�6d��T5Z�v������6V��Rd�!J ������s�	�����&qZ�0��%�c�]��	�/��/��������e���/������{�Kf���gZ�g��~G��6V�j�m���� ��F��[��m���Q��`�B��*GZ��`��i�w)v&P�u��t����2P��E�����X���X��5Z>l�
��@���4�5Y��P�hV5�J��^�����LP�����L�{
O?V�(��lO�E�h@#m��� ������-A�hj�����$���V�u��M5�@�_�O��_��MX�,�d��� �������������^��`vH�I�L��2� p��c��o,���4��D����tD�iqQ�J����f�Au�G�
b�]�|�Q���W#�������;�]!g�A�%K��ad[5��Pc!���1�P�_*%�AY��9��%�(���G3���D�=;�7��c� �5d���E� ?	Q���6�,F��f��}-�H"����D��|n��\��M'������q<�B�;�c�;����)��!�mo����P���A+��6g���_e�?��8��Z���u��0�CF�c���r&h��I����!�X����W���f�@�b�M�K�
l��?�������(�h�y����~el���SY<�i�&������ib�I�?���:����B|�d@BR^�B5q����A�m����#�[3&�Y�D���m^0�Y=q�����-���sCcLqSO��4��:S*��=��B�-�F������U"��p�#�4���(u jIN�N:H�
l������C���J�=t�O���������w��H������O�*��`�f��$����.�sr������8/����X{�������0jJ[Qj������U����5L���S���~$6�^�sO�Hv�O�r��/��3��A�`��
����d�||R���H�XI��������������Q1�=Xdv4 ���|��m6�"}/�*
8}Wx��+��
X�r��1��Rz�����4%��x�5 ���I3z�*����u�N�)y�6�
.w�G�Ll',��w�C���ph�_R�z��q�8��2�Xc�iu�h��dH�9"hi$�z70P�2�g�Mu���c����CI���ihO���]V��yQ���i�#]��%Z^���@ffO�2�����������x7�%�y��2PS���6�o� ���)TTs������'�D��*�#=P�j�����g���o���-�+���IUV,��6��a4zN�:��bg�^���$V�5kG��3�ci$��0!X3l����^�oQ��������S�=x���eD��&j�u�:����;2X(�s���H�1�s]#b?v��������{
�W��B�1����=!��K��B�K7j��M;����'����"���5��<�e��D^�5 ������f!X=�h�i1��i@�>f�����h	O�"�b�����`%�
��� �ze���L
:�� r�c���n,A|���=67����=~H������${
j�����#��a�5��J�����FV�L(�i�����A�?P��`v��J�������_��I���
S`���8`�F��[�V���qF��C}�1R2g��Ai�T�E��^�;P
#'9VOjP>zE�t�I��
c`M����oPS�Yi�3��n�aKR�)y�N�4�h�����sb��������!Pj�K�C�'QA^X�H�/S�����a	���#��lf�F�A��t��g���#Kh���H{���;bZ���Us�WDF��6T���g%HME�C%V�}��;g�;��2,1d;����P�N�������
D�M��xzBd�!1���9�g�]	����`"z�FNf2g��
�K������s������*���
P�~�������������'�h�AT��H���
�W��~��]|��*b��q�v�����5�����~9�*�����LF4���W&���L���/���G��9���W
��h�=���J�[��'��0�����t�/�o ,{<�1�=E�4����/��������P��j�T����P�a�K>u�1�PD�F2lP/[�N��G
�&yP��:���o8�5WC��Q���\���he3wyu(eSA�������P8wC;�0�!���NzC�9�u�?X�?����@Dxag�a�C;cAH�����C�`�d2�����T���0��$,d�~����z
>���e<Ci1:����C,�`����\w��1�w|��:��g@3��a
��Z�� 5�0����y(�e�B'6{�V����v�w�B]��eA�t��\(��y{��q��Y�x��:|����VA����.����I/9z��&�-H�-��d��5��[�Q��d�-����BR���h�v������E�!1�C������U2LC�����:8KYq�*e��3���t�?�[�LJ���oY��VA����*��/��:G��S�nw�����#�3�1���;�N�/@����k�fR���n ��X��rP��YC2
�%�q��E&7��H������E��>�
u�G����T�gh�Cn��}
�_���|���7*��U�8�Tn�LIv(l�L�� {�a�D�IU�&i�����iB_��%cTT��`c��.9����x��I4*�RI��8���8�HxY5�w������_�O���JyD+!�c��cc�B�g2����(�c�������w�n�,��_�3��
G���V�0s�~~XygtbjQ�E�k����381}��LH;-��F���Ou��N�_ �R��7�Y=`�"��^�g,j�9vuO�A���F8��ID;�&�)?0�D����Gk�N���+!�N&�4�00K�������^F�-��e#2V�0q��c�^7v~XS��(%b
�O�|80h>�?�����3�d^�D9(�j����:#xb&�����s��x�7����m3"	��r
M ��u��rbPh-�����2���T��'m��~�AY
����!�4������������Zm�b�p���4�����A���3��#��[�����*�$$��u��t��DDsI�X3{Fb�����B��,*X��!�������#�����s���0=[���:����Ri�by��/��:I�eO�������`q�3�
�����E����b]������.(h�"�4���-���-��#Y�����M*�g��R\0��4� ��b�H������]+�#�-������K��2�c%�4Q��d�6�"�\���
���A'n��tEu4�X�|F���Hj��<����!.1��B9p��W?��xgp�wN|AY�d�P���E	c��i�B�oe�������M���3�����,� %��C���G�[�g���V��9bL�p��v�S�,������Zi��c�t�Y�q3q���q�\��e��V��Q`��+u���	�a�1�IF3���2���q3�<���&b�������0�����$38�}����]���C�{�h���j�s�?���G@�B��~�����B��,f�o�7����������v���1yr��O	
7$����7���+*�����{����x�9���qrb�!�}O��m�`��������Y���X�*�<�|^_��(��V�4 !��Ly���E�G��i�B���~��[J,����8���q!Z
�*�_v	��x�~Z�M�S�	
���J���p�T,3�	6�O�Y)�Z+egEjR��Tx)��Q	#fL��������A���{�{P��h�NMD�0��Xim�-�=	���=?����xRvZBNR��O'!s40��p-CJ��2���eh/��n��m�����8V�.�@v����lZDp�����D_�zB�\�-���2d��@���;.����<:W	"v��7�E��G��?��	 DfW�Jh'���B�hh�[��SL�"4�}��^�Iu�Sa�1	�g���w���+��<���+u�^�,�}�*����L� �!����?Y��[Ho�����D����i�����;�L�Se�}�M�e�@�������2h�}})����:�/-.���l1^!���uP��jNr_������p;��c	U��1���#��F��Cg��0	I\:��-CL�ZBJ�|�J,���(W���B
��>kl�\K$3P�f�`�+�O�a�z|z
�V���qF�A�Gs-�^�!�m�$�8O�I�?�5��hl��A\�����G�-A��X=��������}�V���2�SG:��U��2���Qv\�Q�}S�F(��(!d�����0���d�������,��P�*hO�u���2�V���� ���	����JUB+��Y���;\|�t�_3�����Jp�x���d��	�.�
��(�u!(�4$�({\n��;�#��\��a%=�Q��Jn��i�=��y�!���DF��a�}���~��a\r$�������h��|J4(���m��2��Z�%�����}a5'3���WD�4u4�/8Gh�(�:�0����yg�r���dwK��00�'�[H�N��C]L�P���a���v�g����W�'���������+_��~
Z�?H����Eea+BwWb����7�g��D]���Dd[V�j���a�PG�y�vmS��h��B�X}�`i���e������ ��5�����)���S~������WN���'�_j�����+-Ort���l��)��*����
b�mCz�I�V�j2l#	i6���$�|�uF���Y���xlC��Dsg��N~�5������l�O��?�J�D�<�!TO��v�>i���Hf;�w�m������b5����
�����mc��!�d��;Y���u����������t�C�XoT�:��r�d3!vaA��]�� ���l�w�!c@��N�_fyK�%�c���u���l(����yC>����&�0v�O����E+�:��X�=_:,+K>��nxh��1I+��
����T��o�2���I )@���N0d��#L�g�
G�kYsm�VU���PQ(Ty�G�������
��9M}#l��ee��M�E����
�w������a6i�!������d�kb�l�u�,e$�C��l�~�8�JFg?���Ug[�'���Do� ����*�����0h����zc�_����Y��<`��hr���f��H�cX�\�S0~�]I>>�������_w<)�i2���0��$'k�;c�GdL��{�F�**[��k-G��KS�30�]�w�-%_g���&;��a��x|���m�B��rX�NRH���STq��X;���b�^�q�c���*�)�#;��p+�M� ��(����i(�h{eM�dQA�qg?5�^���?�F���BIy��Y�������
��m��8��5�7N�2���?�~"f�Vs��X5)�J���6��S)6h��:v��\#z���	7{�o���0���2���L�~`�%��AmCL��OJ�TZ��i��yxV����6�-����3���sf���}r�U���<�$��\�6��	���������MN����u����)���,�t�?<%Q�G���9�gR�&Z���U�
�A����|b���D�c@b"p��8��x�@�s��=��������0W�c@B�*�=b-��<�'��z���l���y��1B<���JN��%���l�Y?�$th��M���d��8�MdLt�;%�hyb�P
+R0��Z�p�S����yb��.*���K��;���18!���e����(Z��E:B�a�A�[`�F����H&C �\k�A	2����,���!
������%��;�)m��0��S�J,Q��{c��
��t�r7|�x���:_D������E�C\��L3��l�c�B��|I�W���Te�B���#��4���scj�*&N�w���m�A;T����@3�8�76R����0��<y&��x��N�O|��<e;@�v;@�|\9��0W7�OB���D� y����D����]�.<:��s6t!��T�!����8�o�G��qW3]�wKR����	A����^����Sp���<q�H~��@b�7�{��E4�c�G�h������z��E�8��O�$�_�d?H�q�n��c~X�W&[�K�N	]�a�x�.9�M�z�l����7Q��LR�P��	����c/�/p����0�������T�����C�1���$�`1 '��K�i���K_q�����wcr5�/W)�V��~�W���A�[�,uG9�����?�f��L��������4]��C�R�c]�n"�Eag�"�Ig�!�����7��
F�\��\�U��>y��i)������`&�^tq�d��WjJ1�*o&�V�K�F;��������>_T��"������HJD��a$�T��}_pT�m�A����E��1)0Ye���@?'[��]4��o_e�G|�.a�:k(�P!2������qif|B�Ry�d2��o�]�=����-�ld��^��d������u|�����]�<|���LL`�[J�~�����F�
�p�����rY��#����%�Wys�?���6�6���h)�*?�a����m����k����_hI���a����:�R�/"Fz��e�R��#����h�rWMt*}�a�b�xl����`�{���
�Z���&���$��8 ������� �;�3N��yGz+�+�J�iad?�b��R��;8"�<i<��M.�7)[�b�tG�����] ��	�P,��^#N�%��+���[r��I�;y/���V��.ZW�����5��������TA�Q����G���H��+�kx�)C�O����U��}/����$Q��U�|�/|�{y�����Cf����m2X�����C ���W��a����k��;O�deq���Fz����'{�g/�@*�H�m���q����������~#�(d�*��c����A�n�q���3�@#�5��)	��^���tI'�����/�1A/V��C����dV>�`$p���>Q�����k������Z(�����e���4�y�q~���$�C :gyf,�g�����s�����#����P�k�����kn#Y�;�sP�}M���a�*�������n�	�P�@������o�B�]��X����bxI,�*���?)�X#�X!�c|��oW�=����F\b���HC��cm�|��`f[[t������_���C!�;|�>�����>���
�o��%7�<�#S�MB�B�������w�{tw�9lu�����}J�{�K���2'��]�����k~@1�� #���	������3��Ht�a���q��P(�f_�'���R��35�kxQ#��w���{=��'�Z����������#�:����z��/�KxS�:|t��*�^"�Ljy����!=(�N9O�����{��d8Kj�I�����I�����i_��J�btBt$y]��#,~���y
7�]��J�Jy-%�NR����d�>hR���X���D�����Aj���������E2YK�r�|��J78zI���uO1����;:���������R�,�b�P���?{��1+%�O;h�B��!��{��y�d���[�.��������d,_\dV�f���D�Wh4AJ|��Zch��2����+����!������Sc��	(���;�h�����b���'��XZ��p����O`#[a���
y��__,$+��_kU�R�
%������@�Rbe��.b���A��%�+�����q
�Y�J���������"���M�5b�b��@J1�Q������V�UPJ[�#���a���?�u�w4������������G+����o�A�Y/����	����8��m�%����>��\;��=��{N*�:Rb#%�_E����qW�1:��ZO������T��@��b�C�k��v�������VJ��0����2��D//��j���U�g�n��nh��;Y�.y��og^5F��o�C;���w�Wz(R���I���	��	���P�^	�qz,bP�C)3]@����>Q��e3������_
������0{���no�QN�PR�<x��\�7��l�J��.�
�>
�-if��JI�����$Nht����TuH%�hD��S41�]�8C�:X!���,���Mt��l%�	�C�=��>��Fnz���9�)c��6~B�g"�g)�>� Wg���f�M���;�JW��u�
A����0JK"2�T�g���R��z`����'��:�l�$�d�O#�������4���J%�P�����O�_��/G�f��br)NKO�n���f��
����S(*��y~������"����r�����$U|� d�D��*���x$��w��������Z��`"���<�YN��l����"�(��1��1���;0�*���'��:#	�!��&���d"�`s��R
q�3i�����^y�>�����&Z��%���J�	X�^��x9��Jw�tGkd}R���De�wr'*�p���;���d�I�.���'b���mh�W�?���z��<��tFS��G3���r|?�����*hEv���V�"�?)�I��Z�5"�{FSs�����
���z�#� !W�R�v�3���Lj��^k���wh���������A�f��#��k6�=�i$h�INB{����E|/K5(2���^7[������	�K�	�N��u����/���j�'�u�Gev�O�K����l��r8k�*zj"���Dm��C����h
��j�C��L��F�J��C2�5����	�W��9B�$�D���X��0�tm_��s����]X�f�Cg���j�C�ME��j�Yl�����X�r�l��W#����$#
�Ca���(�����Pq�)�f�^��f�E�GU�^o@���#6����if�RV^��"���!���nw��kEk�����5��������#�o�"*l������h?�9���:A0��������AV>{�1�ux�)�l�����P���9���Z����#K����'�F-��F#REx�7`!*��B�B����K�)����
bs��Y��������50�����	���8j�<���~C|9��(�{�L�����h,��;U�G�
K���{Z��bm��Z���M4���J:��H���Qf�R_>k��6��O�B��P�*��,5��;u����;4?�4�F�C������p��-u������F��T��m�A������Bc��T��|`��;����-)
���I�H���/U<tA-d�8����{H��������U�%\[�Dd��x���`��z���W�^���>�<������2�T&�6U]'���s���{�O�Xh������6���wW�g]�Hh���}RY�?���%<�?�>�f�C`j���%������Gw�Vf��~������L�j������f�C:�����t,B����c�����b�=���/���]�s�B�]b�Q]t?�����H���~������|���Xi�C;z�[U*.�%Y�Z���j�2�D3$��D#�����������N:���V��g+���c�����[
�
�1A���N+C�[����+��S���86-�U��k��z>i��yZ��`[��m��H���B�������-�����s���*�P���p��H��A�����R��$���p �b��
�!���K�[6��BuD#]��>��F�&��E��>�K��
hp#�]#�,O�
i������F�h���X��A=������)���A+��d~T�3X��_��n�0�s*�%�*}���Z���:=B��u�Y�D��uh'�E���DC�)#�3�����_���n~��u�SrV��0Z�j�m��KG��?z��3q%�(
��f�cVs�=%7�wB�bL�^�	z�mQ�o3��%CY/�5"����J��������$� ��R:��1�i���Yt�i����9D�C�H���0�)bx���f�Cf����"���
tC���,?���"S�f�c"l�E����m�N�`����q���	���M)/�xFE��-��%���I������������!5g1�s��HX��dH��9+e{	a����=�ix��Q��F��#�O�hS�u������~�J&�k����j���9
�Dx+���K����-[_w�z��Yg�B����������5���.b�����j�������$��e��C�-Z`
q�*gl3���:�-�T���F�����!�����������KX���2��
`�����$$�d�Cc�$�Oj�j�`.XiF6�9{�!��t@2��s����Na���
a�����@����Z,43�������'�b7XQ�k�"�6�P��;�,c3K�|>��������Kv��M���fv��
O�q�u�'
�FA��XoTH��N�!����%b� ��n�AMq�G�'�[���%��P�������1�
�G�S�Gl1w�N��{H�_���xwo�7��_SD���=�R���"Bl4t��b�C�2�@o,�
��l����qI&��T@XG�t7� ���[��	�F��w����V��p�����������BOb�a7�����[��,�����t��/
2��fgIx(�OHq������#���u\y��.D�����]���z�	���E�Voa=�����!�v�.+Q�������Bz��(�u�J���>��7L��=-L��tC
(�����3v�����%�1�R7� "h15LU�����/�
:��P�����(���5(!�������#)p�A��A�[p���IxD1� ��v#"4���
�'���?���������da�y/r�d{�R�����DA�CW�V�:�Rm����`����4��d_$9L!��'c��
4�x�>�fJB0�� %^����
3t��w
�v�
�n��_�3+[h��K�X6w�n�/�����D�+_l�9l��N���(����zP���qK2����,ow�7M1��g�����j*
�����q�/)�4���VyM��h��z@���W�Z�;Am(��G�|�_!:��f������0�� ��G.�b�k���1� ��������n�a'�Y	z�N���C��<�?Cht�1�S�F���BL�.d�U����y�N�A�����O���@���F����?!��~�ic��w�K��{hH^�pBPAT��OL�K����]h��$�`E�c��u��$@f6�8�����u<����	m2	��������g9�]:���N(E4�a(B�8�F����E �0!�GMut���v����������e���BV�h���+��u���h#����DV;�
Z�1��6(# ���tR�0H�|y=Mk�h�E��5Q�'�0h�\�G�/�/�N���)�YM9J:u��Sr�j�m�\� �$l�v\�
6j�L�z�h�Q
u_��r�(v����:��K�/�g.(zb$�B�!izc{��I�*����A������~�0:!�������GM&�m��Pt�0�a�b�Ru|1��@6r+e����E7����Z���4t�(Q����rP�;b��H�E��1L6���'��z�3��a������#6Ov�������E�����3b�4]���%��4��N��I��i�2�������	M��!���t�)�Q�b�B�HFe�0�zl�~D|(D��qKL���m�~��IKW%�G�!a�
����b���>Ncr��]���`gh�P[p�s�QY#I�*<�U�,T���J��P��.d1��#�<�ye�=��1�p��C_������FV��A
��	�j_V$��_��mV��#���_G������l��/��T��;�dlvT
v!��f����Om	���5�S}��C���������u�
�8+�"q��'<��d��;��w�TH��M\^y��2R,���@�_�~�F�
�'�N�*�9�mG2���y�
�H87���H4������OMh�������Hk7Kh�t�
!��^
��5�C�SF�����������4�\�1l��K��m}����Z��
K�3��S~��@��a|A���[�EK��������Kx3�?��gD����A�����)��;��d|D�p�"e����#�2�5��^�k2o����I�nh}�O���OA��L���Am�f�2;�U�<�l��>�
�r����z���h��R2g"��v�"��x�~A�%r���;c]����>-�l�\���P����3�w0��,w
ja4
<���{����3+1�K>'�|�������uF�����������%1;���/�������@�O��>
>h�g�b���l�������d����sF![u������4�`�s���V���Zg�����_���� �f���$L�V}r0��1���!������"��U�uE��8������4f��Hb%��R1#fk[�qy����b���B�2����a'X�hq���D`�8�6�Q�!)�L&�\��)b�_>�hg���W������7��iD�(��%����F
�nC.>hp,�o%�L��}���r`�������5�tV���Z]��<=���_h���"2�46���������
����R�.'���$s�'��X'�PT���;��n;b�����q���2��0�2fl�$��!:���:�s�I�%7���e���.�j
Mw�'�<����dT���uQSy�%I���������5��`����{Po�����?��*��O�p4?��@��s�a��v(�m8�a+3)��n&�������c�gn@��l���>I�&���H�F*�!�������{�Fy&�ZL�"���]������/��B����j-��g`O"�H���P��@� O��������>�SSC��Ip=�+f2�=�E��%)�FB�dO�>�X&����%v.|�;u�i�������L������x?���x�`�,C	�!*DP>���hA�'D:���M8
*�{<��YAu����3&�<�������w9W��%D��I�y-Z�W"���o�kY�.<;�N�^XI�2�h�<�����P(Aa+a< �}1�_����us#�h=_�M�Ph�������0f��3��Jx�6M*�?�(5�4*2��9'��z�o�	S��+M�L��j;���V)�[,Q������j�V�
�9�>��
Z?p���m����1b �G��*0�a�D��% A�h�^���������zZ+A
����X�H��_��Dx�2vp>�������R�����,g��&�)�W�3��V��s�U�����#�k4��"*ZU9d��J����������o?��s
>Eo��C������Q��.�P��C����-D�X�(��,U
�����Cp��F�����R������U\���&���O�p�TC3�k��{,����t+�K�l|t�B���91�U����3��Ds�������(�w�D��<l�RPV��T�T������5�X�.��@!�~���i�����n�g6�+�L�C�-a���+�����P�F�5�*[	G�Y�@���,pE�p��I�2��0mE� ��u������D�}O�g��9��������v��~D����Ji�@���.�j�+�@3�je�M���c���@�v��@~�5�W����-V+Rt(�Z'x�2��k���`VB!���}�:�2�O]
-��B�)/��.!q��Uk����������fh�	�'$��%FF�F�(�7�����g����+�ea�W����w"N�J0�|��L�'�W���_����@����u������7��lw���e�8�
}���_�[C�����!�a�����$kxCg����7`��`FT��'���T�x���~+�{���b��M�$RS��@�D
��;qC�<�&��d~��}[�bc"���5������exCU&��V��N/��D��:��2�\�3��D�L�mpCA�L��N�n���c��<�c>��)����i��~"�&k�6���l����IE��2�!����#������Q
v������jG2������B#-}�b�U��]/iS���G�����;��:�w�T�DCk�.�L�`!��1��<>��
�D�;y�����P����f���!%tnG��q�G�z�*Cov�y`�����-�_�������'["!��5�]���k5�9��glG�H��pm�F%��� ����p��R�]�QGH�)�z��B]kt������]Q�nG:1$3�l7[�[�U#�>7T�l"�u��m���t'�m�F'��T�;���eB�;]{@�j������Li�x"I)Q�a�P�&��tq�c1i�60!S��&z�=,���d\�}�]����?���
L�=�+4��=��~��!q#��N:��z6Y�GE�Pd���$��M�����;\�c��m�j��s�6�`���j�u��!�]�GB2���\�/�_�)���]�1oC���H�9�����F�b��~�F]�m,a�.�6��!v>��3�q!����������+��jI�t�.y;��(?p�=#'&q���;1�
�E�rM��H��5���;�I���
8��c8M6�;��d�;������9���6u~�QJ8\���g�|��c�0�3�-
S����{e�B��~~%��e3��������G�����3���� �,���NU���Kf1PIxq��'[H��X�roIf�Lr�� t��w��Q�w�I-���#m�E',�Jn����{�&����m8���:Pr@�|�y8��IKN�����K�^���}"B<IB'w#���L)�w�}|2'V@P(�,��J5��q�P����=��{9�S�D���9_��f�mr��<����D ��$GZ�)+B4�O������c��k_��m�@.�UA�h�5q��]���|�b3����E�L@G��S"r����w�0C����fO������,co�����P��c�@�i�eUHm���b���vPH�r"�"�r��AI�h?�����l��'��t�8(���~��8�y�}�?�:$�`�ykTP�Z*��?	�F��`�M�X%���L����Q�����|�F��,��;�K)sF��|X.R$K5Q��$�aS��1(�D�����?��������d���G�	�Cn�cL�{���Nc(@�t��Il��'	����$��{{h������Dx��E� �,x�����G���F�@��c@@M��Hv'����1�H�? �$FZ}rP�P�;��(6H&G��sh�1n`�'�sF�������|�T���a-�c����N��Ig$of�,��y ��D�`��V3

7a�g�Y�����q�����`5
 �l�4�����%z�wf��c,����`�Ve
8�]��m���V���P Y�l���J���B~?�*A����1� ���*(O\wp�~	;e���,
��O�|���V��w=�"i;��|��T��XUhxp����
�`A�1��M[17���]#>�39B����|y��s�Es p�.pS�s"u�l'�������,��4}�������ff���c	��I� �B�����C��K����XN������*����N���0��#�u���������i;(��m�l}�R'������E�nu��u"[m�����1F���U��������SA�14!f�:�L#p�t�����bn��y���7��H����&2;���.���A	�#��^���u��86I�_Y��S�LlVC"rk��F���F��s���B��O���[z��������SP`v���!���:)�{����`I�	0����sGb��w�~��}K6w�1�L��B&k�{��[���N��u<o�'X[���P7�����������|�5�+XP<���Jzb�u��1Q�4k������z�{54H!OE��M)�����d~}qKa�;��h�k��q��DZ�3�.�~�'�r\�N )�Sc�����Y;���p�	9��]��>w�"/�y��Wh�c� Ks��bS�
��^g2��]��	������o����=���~�AX-:�������	�=Nr���-7��l�J�����5����;�6::P6mi�
z���r�G�!4m��D
�A�����%v���F�����2}Q��;�
j��}yr�����[8���pHi�Q�3��\�������s��>�@G!5�X�6�@�����T6,��k������~���w�9(�YF�dN�*2�J�cB������v�Xn���;�H+_;I��}[(�����5�t
a���T�`#�CR�;2��	c.�����/c���pF��1�Z|ONZi)��t~�y6��`�dyy��gK��{�V��@d�&���Wqd���|����}X��H_l
7���RtJD�|����n��!���K���f�s<d������+�vt!���*~��x ��;����@��w���r�Q��}&Q�
>�U+���g�����-I�"�����K�$��x]Bi'���^#LPY!=�����j�$S�~��)v��@	��mC�{�@��;���Q"9��F����%���X�X%����%Sp�:�����kx�E�*i��+��w{���g?������Y�>

�����B���,����q���m�&?/"�~��$��E ���shBc�����@�/��!j(C�^�G
l������,�����[� �^%�f��������{��R����V��������X(xQ�B�6�!�za:}�G�=~&�0����
V�%��K��R���x���F.#s���M�|�D^���A�R�P	��S�������m��n����5_{-�Yc
���k1���=�I@�Z)?�4+���E��n����A�K�PO��h�G�62t@T���>jIl��!�;#�k'\�Z���)��W��\k��A��h����)@�v��Y�r�S
L�����$B|!!�l�������o�}�jv�N|���x�RLT	WL�"�ZjV34���9�
�%(�;k�"h-1P��M�$��)&����_
j6�/���r�P���.�'���������zDM�FBNS�#P�h�g��d�]���!��&��q���>��8(
Z_w/Qo�z�rG����w�k--I6�[h
^���3�X0� %�#�?���������h���7�l
k(�)R(������^��H�����L���U�
��S����:$�A�� �a�P\��V�on������/��E2�ZJ=da-��/4�j?#r��)���{��Z������	$f�(}��u���X,YG�D!�;��HrB-1\:��YKR�u�����f|Y��\��Y�
���*��a��;����������^��z�=H�Y�g�T���8:%A�c�
",�d�+�#�7bFQ���z��:K���oE~��$0	@x�zd�Bw��B����\�B���~��v�>
uF�q����r,����X3b�����3(���D���#��$�Z8�O�R;��B�\��Y0�Kv��M��I�>����Q�VQ?����B^���%��Zv�����_9�=������vM3�w�}�����S���NF33��;���Z��orb[q��d9r4��]N\K��w-�iPh8��O��n��.�0ao�=��}}�A0�����$r��j$���P/����OI2P]
(\�qk���Z�AFty���X.5�9���AA�1�_�Q&�h
f �FQ�����#��F�0�[����>����Z���F=�jA����2@D���j"����cW���j<�i5AT5�`��[j�&��B���X�hR*��`H_�n��M���8U����f��f��PtD���z)w�c��jpA%&�m�5�Aa3��B��������-WI��_GP9mqj�R�9��9������S�7���LS�����$x3�Q�T����������dJ�hA,b!�^�A;���HE
+k���=n�H�w�&woa��jha���M�>�Hv����0�R5���!���O�Re*{��/�5>Lww���k�g��hI��!�Fs ������d#����R3\��6��d3=jS�PP��PT:^k4���U����$���OM���3��|h:Q�lI�j���9�G3������������kURq�k@�	V����.�V�'	���W#��eP��XP�����W:�^UP�5\X#H����^y��6C��k���cY���j��d��~<��c���C�.
��[�jQ������?���j��d���W��fE�����D/���BJ
�'�HD��D-N���+X���X�y�����d7�wP���Y���}!�
�4�+���:k~XU�ZN�� ��-�A�7l�P���H���
R�SN�b4���`�f{5R�T����`�Z����g1�E����6R@���u��1���5�5Qe�ub2_�q����F����PvB5:��!n;`�B�rjkN}��v�SM=)��C_�QY���-����XY�@6=#��_��:&����%9�2i��6@�_�"pW�$pe��e���%�Y��R~�� %u6y���g �h{�,����^gK2��1EB�iD��e���J���`_UL�<��/t|\T���� �&����|
L�]l�m17BG�f� �<
�I����l���E��������z�X�^h�0�7�nL�����'6�=��(Z�(�-_rGET�f8A\
�w��?�KAxv3z���V��Q�%J�ai *�ZpC^oC[_��}<�9+�,[M_�W��V[�}]9u��P�V��1q3�1������L��'h)���z~`��Y���h���N�
'��XKx�O!��c�^���X������w�Pi OJ3�V3������\��N�]��#Bh�!��E����
>��"q-��#b
��i���[�|DS9��:}~bq�����6&��z�(l���{�	U��I q_�)4�<�����%3)A��u�[O���s�~��,f��w�a����|�{�z�S�=Q�p�����$a����D=�^{3� � �����:�f?v��D����V������wCA��f����b*���U�~�D����<�G������hfdM�^���+�#��R��I��������q��E��"exN2<�fr������b*�ao�L��-����-O�WUnQ��
����f
��L*(sb���b8x[m��[������0)�6���_J�&�iIr������z�l��I����9?D%�A,%��E���[�v4��2c��D�w$�_�C=[r�����������#=�#
������^{����!l~��]�������.������$������'��?s�{c[�N%h�1c�':?%��T��"�����ng�����$d��0i�/��,b�{���0��Y^����!!+ytS�V��K�]��b��v�;4"�=��e8�"�v>��~���
�$O��"��6�� �_3�~<4�������<�?��h���U��
h��Y}��GgJ�=���
}���v�����5�Krg7����������R��CRI��x�i���D���|2�0G���3��~#�Pv��N+���tk�_:5�W���j������#�@O�c2�D�n����z�
�+�F)�TK����%��I��}K@f����$^�XR�BC�^�,f����l�a�b��=K:���G,�^�'?k62����!�S�S����^��_;6������
�'�VJ��TE��
�2�Z7H!���{���sO��S\[N�rs���F���>���&��c������������e�q��U��x����t=�d1��_Rz3}]��������D��������o�����m���I��`b�v����a����=!
�<]j=���9&��V�]h�VKb{����~��j�]�3JT01)���S�}�IQ@;��SAoVl�*���B���jK"��NPX+sv�F���jbu	:�-�N�	�8�u|{4�����0D�F��lb/'���&$0}f�����M�u3���;K&]���,_��^�O �ip ���6O�c���FN{""���Pwv�]�'OK���T���C����[�i'��V�+8*Zm>��EO�B
:{rd$���~�����W�L������\n�Q1����$���	~0U���%L����m$AZ��k����Jt���_6;H%ha}�Z�A�"�|K	Y2��:"�@��e�������D��F6��v���$��gg�Us����
�<�������=��)���o���W�D�gQ��~Bf��v��5�����Y#v��}+�I:T����d����3}bT�fd��}��$��p��[_S�a�@]G)��]Z_���0v��)�;�����a(a���a������vb��O���z9�m������M��%3j�#����[��l��1�LM�Y���dC7�e�/�\b�X�/��P{l�s��{��n�������G(��,e#�	6e�G����|4�I4� pY�h]
v��[	l��J��,��c|�Mq�v4�[�#j���ee|P_Md5��Kv!B��/�BD�f�Rt!���|)���s��{�
JQ�e���{��*Q��v������$F-�eT_��!�}I�Y=��]�|-4,�d��)��]h��P������&g�����ew�C�.��"�w����������rC*���1)F����l`�~U�[�Fg���GM�I�%F����mi|�'U���7\�`�-t�����	pF2�����@���3�P!��E�G�M�����Ze"r�0p����Z�R�6C���0�!v��8���=Tv��
f��ui)��J�1d�0p��x��u/O\��<���K��[h�%$b�[�~��,#�5;"��k�i�Q1�����A$�T��������>��oA��aDD�4gA��s�F������*y���H�t<q$��-s.�L��(������r�8�T�\-b�~��C��F�l������Q} tG,�g�[2K�+;[��0�"���klJ��e�	&M���e2p�6���1��`!k���?tV&X��������<-����jtE��g�~�NT��F�!
��d����#)M��=r���!)Ie�;M�E���|K;V�8�i��b��Y�������Q�*��o��D�A?�S`����x|������������������<>m�����PH��(J;(��0yV#�������R�Z)c-ej�mu!�0Z2X{8��P_���d��#b
�!���%N��4����h�-9���>�o���B��h�#�����������g����������������_��
�i����L���hy�O�3�#�K9�
�zh���1��8Hy4
�H��4E-����HT]���J6��2���� ��K_�/��?��*4y��L����8��&��)�)f4������>lx!�Hh-�a���	���J�RjT;2?a�w���D�G\�nkB!�h��FK�-gT���5���E�bePi8k���w�������Y������`&�BTTQ$Q�0�����N
O�3������5m�'��Z�6�M3
��6�~,�[*��>��h�!z�F?:�����jQx��>T������� �]>�����c*-����S��3���N���C�i����B��4*"}���`�����:�Xj��v~����q�������[�h��VX�i��{�b��3Y���&fP�yej-����&�@����B}�������7K)1��*gH� ���q2_��r�]|� Y���8��2������0y'�&���;[<G�z����S�\��$����fdb����~Am��l���
>9���q[5�f��d$#<�����X7u~�����1y�a+����F�d#���V%�~�$uF�!��M}���}d1�S�)e.���>3�������[�p���l�G�@/u�uf�B���d�O�8y1��i|�3��Am�q�A
�N�z���6�	M>jA��'������'���s�����e[�lB��z�X�,/dT�,��Q�����zT;-�[#�7c@B��D����v��37��-��W��N[�R0�q"�l�d����m��#]�.��
��?�+pg�7�yU	��R��1��(��;�PXR�����]�����s�����m��X��1�z%@��4n!U�];tg�/����U���'�J4�N\oM)#S�V�'�p0fE���0���@����^�d�l4���U���X�
:U�$Z���2��{mZ��|�����bt/�
Q|����b���*n�QQ�e&��Td�������]�lJ~_��t�3��W���`!XM��{,A3���D���G��9i��~��+�������F�g��~vb�
����{hl"�P���.����La��~��r���6&�(Y��M����u��<��$8��dP����@�l�����cRv����FW��3�l/��9��F�yy/Uo��o�O�9D���e����d������N;C�}5|o)<J����.?kI�dF�����kO\�}��G��/��x\��+Qw��O���HU+�E(���x��g���k���Df�����S'�U���K��?`w���tq������~�'��H�j���0:��
zo��k�6������A�����0i�)�O�w��v}9�-�q��;,�����"��x!�:	/Ac<�$!���TK�]�H��q���xLo�a�p)�����!���^(:;����5��]Plj�,#����t�_�YC��5�\�������#|��"�V�r���&���@����T�P��b�4�g�~j��u��OO��3������q�}	n����bnw{����B�����u}�j�V�WM\�2�&"�����������#Z��'��T;e��ee
��r��Dq��-X{�62�X����v$��lR�5\�&�A],}�:��z5
9��]u�~f;���7<��W����t��`��.E=(��||��:9��9�����j�2���8��:���8+:����A�Wv�p+� �q%�ZB$��h��)��`�BG��~"��9����u�B�y�doEM���;�j��No���5bF&�N�4�UD.)�����G��&�A�Ti��	(1�;��o#!xV���0������e42���h���I��~v��/�/�a���A������&��2�^�|5=�!��������5�I�	M�/�Fw�=����\�*���vI��A7�m�@��&�>������Y�z�*H�V��l�)���?�C-�w�)B]
�F\`>��:�a���V�8��h;b'�z�0�JUb�L����e���U�������a�:-V�#s��9����7�����L�w��z�[	�hx�4����(�H��?��3PcI|;9��<�`l�mI�cg&��Y���A.j>l�����l�z�e�Z�r���Oq��'�=�0%���
&k��?x��������]^h�!UD��=��},lqL,�dH���gV�gw���h�a!*qv���]�F��Uv@x��^%���AG���}�hF�8?�N^wf��K'8�w�qIb����$T�CG��m8A;�D�;�Hw��\YgA�3�����$�������^�>E�x{��@,p�x��^�����m��nl��R�	��{����X�b|� ��%Ag��z�L;��"��D�[���`&(�+�Y�����Q0Z�������4���e1��a��V����"���,�*����T�����0?���3��w��O5�`��%e����~x�����BI���3I�����j z���J��^���I���D�$!�\�����il�DIp��WL����:VN	+f���T�RO(���P���6� �YZ������c���Z�i�����eBl�h��
�_I�5�CE[����7��^��E9� 
NGS���v���G/�z%�`�9N���n�B���_of��M�������y�j&p��1��?�zP�2c813C������XG'��K)l'�Q����wB����KZ��[��SE�y�p�W��w�v��X>'9M�ih�����:O)V�>t�peA��dA=j!�::���n����=��s�vyG�}G1	'�G�Bi{�y�/l�|{�����
bY���|!��	��X�����
2�#D�m�
�aR����y���h�B�VO�c���A�I\��?�O���|��p_�B*�S��C�8�b(d��Q���?#�"�=l#�EtZ�'O-�����i+i�&cL������b�Vqc"����c!�j,���2u�kkr�������M���;7,��#�:���A�ro^u�|���N,�^�a57w����ECv�v��'E�)�����_�_�L|��-LMN!��$��"�]��C����8]�S��
c������
k8��[{��$0S�E��c��C�����j�`�:�����������CR����cAF�f6�&�1�`"�M��9�����,n�j�Kc��vX��w�A�D��~��a���T�n�W���ll7Jx�}�j�W��JR����dj�$L':F��M���6�gqy����$B7kA�2�/����?��b�
j5m ��A����N����0F�dr��Pg%e���O���D�A��0����&:1^���'��fC���[�>\��W�M�Z��XGo=2�R�T`VVhD� ��~�	nG�*O��;L;92=�&����������5��S�Z��	�����F�9��Orj� ���n�Gc��J��H)}3�XeHek_�i��|�{]a;Ur����	a�q���|�T?��|��)�b��r�xz'�G/Q$\���V�J�`M����j��D���~k<9�.���0~/b�C��������E�g�;���rK�lt�
�����>Z��,{G7��P��H��$e�{��|��_ ����������l���Mt6�m4Y3��&��/x������2/+;tO����0B����W�{���.�{sHQ�d�K1����$%�{�hm�]�;<���i�A�������N��O2Zk>,�m�#
U	J��._�"\{/T�p�A��}`��;���G-�C=�l+�^
�q,��S7~���y�����,*,���;<IX�� ��;���)`��������,��LZ��e���rm���P\������F��(i�����C������{�Q��l)����� �4�YHUH��^���f�#��>��1/������������Ow�W���@B��e}GZ's��\�Iw�>���w�[��f�{
�vU����Z1�m>��'���B>��Z����������#�,����x/�f���H�d_�<_�>"�������@�2v�{	�@�82���rw���$'���L�~�����C��*ti�;d��>g�.�=R'�s�s���b4(;�g��*n2I�x/���]d��72��`��x�K�K@�cF��`��;�La���#�;�4u{�;}��_�R����O=x���ZiJ;%q��9����p>#��j[cr1��5��\�f����s���A9���N��}j�Ko���(��T~�`g������#U���:,�D��e���E3��ZQ�(�������8V>�����}���h"�y��F��v(B��)��*�v!�+�|(��=1c�
��5��k�jj�0{M�"�`�-F��P�A����A��iL���gC}p��l^�'O���������v�k��QD��[^Bz���*�A'a�4��h�zK~_+������kx�\���� M�{
C�G�G[4�cv~1x��K'��wd��Q�q������2�-fK-��
��
F����[�������88�b�B}�����<1&��+��12���O-'4���p�q
�~G����.#�
���:z(��$4�TO����n)���[�-��"�������_d�B��d�U�7h�(%v��\�9e����I��&��[�4�$?A��_A��R2	�VP�V��;�8[��N8�n}o:���{1`����[kv�U���c��O��Q�Zj�vh%K��mmpK�V�M���w�'�r��z�%��-�4em����w��������
�AJ���%�3���i~��Yew�~=�yI�+��������<���D��^�����h�[�k��9H)��WZ����7�P�UZLo��5!#gk`��$F�����l�H�[]z�3y��>���)�l
��V������8���(��A�z�w���sXuk��)�NO�j�e�Cz	�@�a�`P�_9����Z�r�t9x�r�l�poWkH=��#GyD�/>����$�Y���aR��4�����
c������5b���^���[��tI���%� 	�#k`;4��)��B�m��{
��+�~5R�`S?q;[�I�`�IV6���[4����t��S+�����VV�|�J���!��D����^�?9(R������7G���'\��W<�0oe%!��Z����;���C����a�Q+n�[<�;j�nI�^"E�J(�����z)�d>:�X��^��+V��HzVK������K��|%[q�^}�.A��dE���B.�������c���=(���<�*����n��0��o7a�h���;��
h�@����u�d�4�;��7�8_��B&[&��������!�5�Y{��3�{���+�B���>#�4�Q�T����uC;u�^��E���w}B�\i�%�^q����VQV.H��^��
k�~�j$T-D���ou��Ho�j�k%eu�^)��64j��z��h�dE�yu�~���s��s
���4�������p�O���F��$������uo�yG�T9�n�K�"'y�!���n�������t���
���gr���^������#�C�%Q
r���#��1�kL�p�_���7���dUqTD���!aFu�_��r�E�L�pO4q�QY���n�(��m���ET���5S8t���@��v�
U�����J�A����:���)����
~��(�@h�"�B�5|rhx�l����P�z��j���%HrS�h;7��y��EqPj��Z�oC���{��@q�:���1�y�p)s|V������Ui�)\����Io������j��B� ����s���>���$T�*)����LZ3:�Wc�$!�+��	��uA=����������;����i�d��&@P����=Y�R����n�P�s�U&#v�h���PHQ�F��Y9:�_u2�GD��j�@���nQ�y�3�����!�$_�BA�
�+�h������M��F�m��������� 	���;��2�9���B�'�J%�Y�u��gXa��K
��y�kx�#�&�L��/�i���~��shm@S���u�U�L�Mj@����*�d2�`�D3 �H�:��n��)L�%5�i��@�Z�������X������#[HP�HL��-�f��!b���Bf�:[�u��
u��
X"�9����$!�J�jM�����^�����Am����B�G�5"<����}L/�=�%��+�}a�,K���z]����u�W66+N�o2DY_r,[U���X��������T'"���4HyB%��o\�p��P
/���M�!�C����Wl<c�2*������t]���p��m��+,:Zb$�HD��L�dx���o���l��B^�P���@�fc��wP�~W�`�����eA����P��4n�EB��f�����d��
)D�1�3R1}�G�_|B�Nb��o����w`��fl��L���J�j����'���K�P����0!�O�6�Vk�#$�<��hIzFeo�?�-bI��Cqh�2��
��I���w�U������B4���'�_[�I�������d��?�<��k�6|=>��I�[���/H�`h��pkF�YP��}z��R��} ��j��&����w<~x2r�l���pU2HG��$-�����j����O��h���:H�Wk���A��f����[B���ECp���d{����5�C@��4K��TY)�kJ�_�Qlc3� ��)��5�<���-`�A~��eZ�wc��~L�j{����_r�m8��~�d����JQ���1����jQ;�A(�}��L�=�>Q��3kM-q�����
���@z�}&�� ��BP�<���
����6K> ��Ap#���D���"�4�	9v�e���uB������'�b�����8�a$7�"���I��-�D�i�[�����	l��6������GA�o#C���O�~)��F�&n�@X��]��/�����6T�Ui�O��g�� ��0R0E�>�y�n��,�����2� �,��jF6�Q��,�>�(A���Q�C	��@@GD��!����q�[D�m���eG�-9+�8I	5����/��q��>d����)hI���B���L����h������$�]�H���{wT��o�����w���&B	��D�e�l'o�Y"�a�v!b�?aL��v�:9�zd8a��P?i��m��6C*z$Z������_��Z@����~1_�n��+�=���y+���L�
gD���&������x���H��n ��~<K������g�+&�-�=B�=�rF(S/)�l�~�a��z���j�^g�
����a-$(��ip����uC�f�z!jq7<PM�����w��K�J�aw�F�,y��C��^�d��m}2�8����ac�����-6b�vcbB�W�����F����Tw�[N`h���	3��=rP���^���F�m�R����!�r�����{�2��H��'�CZ�nak�B'���lJ�]1���u��'�Y9�E�4z��p�9�\���S(��G�p��$7�8r�8���'���P}�[\Jj���!0���l�-'��
�a�b��3�<A{\#����n<A��"&	e���x��i��Do�p���-0��;�3�	I@0LO �~(9�G������ z	�7�)�\f�"��k[�y�u�"�B���tp�c�_h�C�e�T#��>�#�9�:-b�O�X�h�P��X�"�H+�X&��I6��m���x�T�����bKs7(m�����i9��u:����������v�?�ke��E+�f,��0c��L\4���1�C������+����|f���$\��7ku�:$t[�|
���/`C������
l�a�4�i�e%�.qGR1�����E�o� �B��{���U��G���F��3��Qza7� ����?���"�t7���Y}G�Wh�S��+����!9B�W��=o �N��X�}��af'�'�$0O�J�����P{%A���z�Y��P��v�Q�!�A��(�������De���	���B�Ik�A��-���d��}I@��F��E{�.a2�Q�1�%h�Yg������'�4����F���7�"E i�����+��.R�*����|DD��J���5���0� )�D��0v �K;��W��Iw�j�;�]������B���YQ[tDVp'��w�4$8
��Pn+���VQ�qB���8�-��#:�����	RulH�<�#P�^�e��T��C?q7Z��"28k���vv���{�h����1������D��%�U#�AW���0�6(D"���x%"�;�_����fDZ0�W$�d���`�X�[�DtV�8����<����a�@|�6�;h�>?�so�T�h�	,a	@#����R������25�s��2�z
c�mI��(�&fs1���Hl~wX����?�r�L�T��c,a���{F���XIY���c�����d�A(W���|1mD{��!Z����M{������������(���KX�iA�Zb�w��#H�������y,V[����#0���TA~B�C���g_�6`$FY<�[�����wFJ�@�Bn�~{RX$�3�%�#=���I@���A��0��Y����������:��zF1�E�C#�@`/i����j�[�k�"j���+���G��%Q#��������8�������q��V�_0����$#��Y����+�Z=GI��3�&G��a���`�������&(������|9���=lBM��-��F�`#)�l�
����#A�js��$��Z�����Th��!����k�m��Hx�#��2�p?7�U�E���~���[�:?�RdN5v8�7?<(}���K-�����wq�xc��>?,c!xi~�]��?��8b����c�w�u�������
#�����a*B/���f;pz����Gv9��A^�T�n��Q��a����!��v�{����'I|;�Z5��a��0���'"3�B���Oa�:���IN��Md8>XdJ���X�,*z&&>`s�Du�yM���f$����}@t�i�a��n�l��l��^���UB�(�:�+�l/Y�tO]�����M�w�@��'-�gY��Nu(Z�:0��LXr���pA��.�%����N������_frU]g�-}��g��Tt���ZGx���������Nc�j����-��rbs$��a�}��]x�) m���������A���V��H����#O#,&`&Y�.�z��;j�N��:�����|q�������F�B���f7�mP�6S�NC��r�`?9N43q�
��G-�&�'������o�A����X
��	�P�-O�T���x�ll��j�AP�d+id
w!rH��}gX��`yXl�jP�L��>������30j��+�A�bT[�F;���f��H<����������&j���Nb��( ^^�v�5��}b���l!���R_���L��|�?F��x���ADb�Z��0��W7yhM�@4��6�$wV���j�.�r�Q��1�BQ;uk�U��`
U�����6GOt2rc��s�i�;�_�[����,Pz&7�qXT��J
+()
	�f\��Fs�ef6�o"l�d0��k���#�:E���}���*��h
�'a�Jr&b��rvr�H��(��	e�X�a(x������'���Q���T��$	���>fIB��������BeV��8?�$�D/E����t�!d�7
/��X�Q�^?$R�����("��v���5�NV�8S�g�{�?����":v.����d@���%]��?���1T�qce�������<�;���*��i�g�pPB���RUQ
�'7�0(�������u��[)4U���;���|'� 1����yuXbS�9���$V�
��V��{�zu:�����e�At��:��	�j�_������V/v?�15)�l���8qKX����hk����'����eLB��xb���~q�`�!�e�b "�*a��1��Bs��_%�8��������Er�fD�[������W�j����;�h��z$��-�FO��������R�B2�@��e�A��Uj+��*�D���5�@�vM6f���������{^8n��G�.����o�}`��bp!?��$����"�lk��
	����X��)��A7�a���^y`��(
�.�W6����0���f���������������[�o�nd��2����^�]�_E�P?�b�#�$�w%������	U-W?w��7�x�(+g�=���h`6T10�@w���*������#�W���L��c���������:�*xk:�l����+��4�e��h�C*2vE�r����������x��]"��#��L��:���;����EF��~��@.F�^&jl-c���'��,c���D�Ol=N�s?���6
+��������N�	Z�%Z�����$�5��	�	��v�$�OPY4�w�Mi}x�b��s�����iX��!Z�J���$��+��_F,�M�Khj����x�������[lV��`������}��1+��"��i'ju�1���=��w�j���P} o�e|B<;�$
o������������u�
��2��sbk%?rj4D5\-J�����7b����o���l+���k��e��N�F+�=mMw\F+��dP����Z*j��$>������>�+�{���� B�����er^c��Q���jA���!ZT��@n�+�kD��l�Cda)]�q�2l�����N�J��n�&��l��/b%K��o���5�:����q8���{�g������O+Q%~#���9W�oi��Y���x�����.#,"e����������t���q�{�'�i�P��H���;6M�+B���!]��I���E9��1)�=�V�ZQH��
KH~4��u�`�D�l�d���Fqh�%�nh��I'������v�wv�h'���-���1L��]st-������������;���N��L���q[Z�|����A�?T�� �r����|�mpB&:m�q�a��c�TR�>��a.��CK��������Z4�(�����6D$D�m`B1
�nI!�st����Ar�G�
�C�n�au{������S�,������DC��#�}�4�-����n=�[��������|��8�p�����=��0�L��
Z��Cj4u����%����G��Y<�sh�	z�F,�q�zb�u��lGDQ��AE���V�!�A.��1Sx��g���o��j�r*�����j���N�-vT��:5Ya�*�������Obo����qo^���/:z���m�B�V,�-d�-��'le����m�����y���X����L��}���\E�m�B�^r��h����zE���e�\s�8����f�g����
-��<��3�������[�����6a�S���
@h�Kv�p���@K���VH����=GR�mHB9�����	���HC�:s��������'A�"�56��?(�R ��el�M���Z��N}jgnc��!�;d~3{g������E���-j�����6��.!�'c����5I��l��L���~��5�Z�(��g��mDBx��ei��v��=x��w7�~
���z�5����e�)!�Q3�%���]^�o��g*�t�1q�QcAFb2�w$'P����(5s����G
�iW.��k��y���&6i���[u���kx;�f��N'�
�=Ck�#������N��e������8A$Q��2�����N�����s�Lt$9�%d�q���@�����wd�t�IX�n��P���s���������,6(0�tu��Ng�t�<�&����c�B�Eo1t��y���,��p�(��9HU{�N�i�|4��
{:N�
t	�cOI�;��DL�2�~��{,��MK���v9F/��*@JLc�S8�W��<�9�}���c@C��c�]�J�
b�2�h����J�h�FFm���g�t�f�F�5.'�;}����5$i���h���l3�!�����:�YD���b�����F�h��J[2����a����L�x�*�^��1UnB��3,������
�����E�?^2�8�������d4��](	�.��|<fDc>�zRD�/sYy
Qo�
�uBw���5�
��LhB4N�',�S���j�[�]40o�nC�xwz���Il�}����1������#y�[����gu���X��I��"8���8k��,����j���N�����&�ggldNw�d�A�����s���>�v����m�e��M(��Hy���
�o�����'Q"�;���$W��K;����#�fdt�b�����r�(����.Y��.�3��bz�E�!���&:��n:������g�I}�I�g}��hP�)Y���%![,����R��
�6[��_y3$<�ob�z��&�I�*���2]������#c�c,�8d�jc��e!����o5�S�
�J,����lO�A�a3��1�\>�<M�E=� d�V���Q7i�%����f�����U���PK@'S�U�?�F�=�F��H�;���U�91����m-e��/������4l�iP��3*�����l����tN�����C�G�	Y��f�
�/{j�#��B���G��PJN���Bb�����t���������!���Bv������] W�w�w^[7|-�FX�5��O���������'$
��|'�J���B��~���w�IQ��{��~7B���!�m�7z��O��������e�5V.��Bi���U�O�i��,����"�@��Hb��b#]�����g7l���b��y�	��^�'U��M�M�1�K�&�T�����]b���wgA���\Q�%����
7b�)Q�0�T|�u����;�Z�k���".:nI�)l�����}�*����������n8V�2k1�wtp�-�;y�����U��G�� {�`������5|���N�W�5$�Z
<���#�)'���l�K���>��x�����O34��et���tL�+��}�F(�T�nm�S�Dl
L�~������D��^���,Hu���"(��)���j�����x?-dg��zh�Y,��� ��{��%��2�&x�{����`B��w�G���
��H�w���P�x����H[�9��
����[h�5��$�h�uE�c��^n�����b�@e���@u�Z}G����������s��H���z���%v��@���$�BU�������6u
�c B6��*he���{
�u��"�w��Y��'~qM������P0�A����$�2:��-|Db4��1�A������K�&0�x�����$=�	h��s���rE����Y��R����h��w��u�q�f���U���]��I��|B��������;\3i���������H��j�[ �������
9��N�uW���nb��O��@�;�m��r2F~�S�Q��v�er�J�|H`�{��
��ub����pfA�(�}�n��NU�Q��6�9�� O�����PX�O��^{�!�"2��������Y��������p�����"Bi2�
��3��z�A��<��4j��,��v����}�=2�}/)vJ����F/Fd�dc�~�����o��w��)���*�<���uf�S~j�rU]%�2J��%�zU��wJ)����k��NAM���S��]cR���;(Q��$l	�.B{�}u~
-F
�}�d����8�|YJ�Mq�h�wO�������6�T�����$Hh�K�
�Gj���:h�:X����VS�����M���I�i�~�������	x�D���T�� ��a��HVe�����OP��p�&�}���^��;'I^����,}urW�>�lRD�ELV��m{i1����d2&�@����	����z1�0��j	b���4F%xDG������W�e��.��c��y�H����%S��Z�h�4^�ZI�A��C���������1Ut���[d�q�7���P�$�����W��+n����?�tV��o�-})h�%L�z���wBq��h/���������z�5���6�@����DI�PYvJ������V�@1���/��"?xL����N��\�1��^��[��I���sSBc,�S-�4����7}�'y������������yq��Xq���H�����	@��W���t�z�
�,���A�r~�E,+:�{vh�?�w���{��Z��C}s�P���9K ��;�~l?[1oP����O��-7��FFX��?��Y3s�{����Q~����a�@�;�����p�l5f �KC��o�� jw�o����]":,wg�z��a�&�qpY
��4�N��z��f�F���t*���Q��P��.��)��������mZ;�]z������m���*�e
�$'�ZK��p�F�[�����q>jj�@XK9�Y�*L2%�m��I����Yrb}���2����?�#���Q�h��J��DS���8�95r���O�W�Vp���^"�H'<��Y5�V
4�*[D'bq��1VO�����3����N��V�����h�&F��_hw�X�[�\���s�g�v��a�+���
U��H�:����q�!�:iV�	
���P�L��;�O-,���A��[x�my�$*Ek���l+��{5� +[��r�@�z5��g��
V��u���A��j4���b�@������W_u��Td��k�s_�S�}G�	GkX������u����"�c����4:�����:���Id�k�QV�P:x���< |�>m[��+�#��q��V����!�^�#�B+���v����Y���� ���zx�=��E5��tc��6��wt�
]����T{�	%G��;��a��/�%~e���������������~��J#�&F~���<_����y'59M4����"��~�GiN�mV�Eq0�x<�'��Q�N��.����KuP�
����Q�v�lD�l����n<�`�TF!T�v�9����0�D���Q ������U�6��9����n�D��9�������������b��`
p�5�GM�h�'��������X9��v�%wc?83i�N.���G~eG�q���=�,[�<�T1�P�H����K`���������B%{M�4[���V������p<jb����������'L�1�w����B	G�����h�0�
a���A1�5��Dy�5=�A���5Q��BY:�&|A�������u �hE��<��1������Ef���c��1�%�l(C�N����E�$X�q:Z�<�4A��i��{�`��qB�M�6/����bu�bMq�
����F�	����=���FV�@��Y���;�Jd?�^"F�#���Q5����W�
2pV.wWS����t��Y��`8�C'w�������asW2��hIf'Bf��d�"e�}��w%�m�o��:���`,��Af����J��xM:���2(�Z|M���n��]�����12QT�������u��.S��>�V��k� �ka�~3�V���CL
�]��D��O��f�!c�fTB�@E@ ~p3!Pd�/'�HSa\���{
�����f�A/
�����6h�D�)y
z��:�� 9�����'fZV�����P�����*iq;r
���AMG��{��QQ�b��JK�4����v�;f=�l����#�b�RZK&V�z�f�@N#L,���
�j����
��M(�D�ODj�!��3by�/��'z
����
��8���AwT(�X�

�L��!���]�Q���jK�p+���)��;�k�����o�Z����QP��#_�c���
mt�K�#���G�D�8[4�Fbc���oi�-�mX��u������C4D!E�q|�\��[������{}.Z�e�@��H��,�/kI���~u�[Y7��RY,/)t���{��6��f���#
����!������Enw[�����l����-��J��4�D"4h��Yf�����Me�Z�������lv��a>T�]����A����E3l�xP��j��V�������
3{mFDZn��� An�� uN[1�9T���'(���'V�OPG����nG����n�'����,��:����&��%��=n�O��~���C�[��[N	�T�Ww!�|��r�7���D���Z������do ����D�/���aY��)da#�v��+����]R5��|��;��%hZ�����a��	�
M���Pd��v�8=%<X�$.��E�����U�;������A���=�@�T1��0t��3�t���!�4'�q��v����e9	{h�c�'R��u��uw�O��lj�4��1����G���%J��� =�������o���]�mZ����G��m��<z����������/��Kl����~e��1�P$A���K��2�{�%F�����I��������Op��~��F�l��B���'���Y�25O����~72 �&+��FP��>/�������k����|42��l�;�rI:�+Pd

-�-�t��
f{nR��n��!��%p��2rb��Ae���	��]�|6	��dZ�������n A��r�MA�qW8C������P�nA���
�E��z���C7��ocR�yQR���[���y�nla9z���f���9y�M&�-��Jge�������]	������L������lKcV���P�W����9&L����X\��8�^@PyYe��Fz���#��{"DvA_��+���I����H`�y�@���s?a�5���1>��������c+����w�qr	B���L�������\��v�fKd�W
��g|x�mH�R�'E�
*�m�G��U��	}S��'�Ymr��JO��!l�-��}z�21B����|�y�F��f$����=�|����
G�}4���pw�l��^0GO�sU�����6�@gQ�m��]8��O�"���Q��'���|����p�bnB1��	��]�����]kjF�k�7hP�2��G��|��4 �����j���.{���
{L�����d�|�Q!���K���#��}5^8�_��I�������\!!��P��D�{����|?c������� �n0B�e&�F%n��yC;�����g�xy@uU��G���������5|Vv��n�����%r���-#j9�����3F+��T��;Yh��b$�� ���=#J
�T��:|,OkD��*�-�N�����+�A�0z��Cf�2l�>�[@����"������$u2Y���H����eN�x�h�h�����%��i��6�0l�P`�x���:���D��9f�B6�gO����2[�#I�J�����[�=���d�����Y���CO/�)d�t��]�A[Z���`���:���0�PG�����[F����N��z�
mD��u�G�����{��J
=�l�2�Q�DE[gn:�����o��������4Fx�P���0���)[=���S�fT`����"��h9y�%W���N��E(�0��O���5������5��� �T���P���v�x��7����a�a����0�I��0�!�|��m��%�A�s�)1MRP�d�l��9]��bS���q{��S�%L���G�
p���4�w3�r�=�o�c!����.�2d�1Qka�����*c����N�pER#�
w���ie�#��?>��i�q�c��Gu�H��z���������G��U]A$�a����P<�{5� 4t(��
�S1r�[������RX*���k��d�mo����)y����
�@qV����<��@��0��P�!Xz�@�e#�	-�X�����-��=�3��X'X��
BN�A��Wqs�PB�I-+_����.�hpxwK������"�C��+��n�vU��
S��Q��1~!�� -U�2 d�������n�B��#�+��8�p1\����L7$�a�<y"�O��3�;��g�B\��N�����A-��|z��&�1�#��@�nz�����PS$�AS2)�6��A	}_R/�}Y���e���|���|:F����Z���7������e����`	�#HE��!�0���
iW��Q��9�}~_�{�>�"��48�����������o�3�m��X��{jr�*Z@�a
��G�Y�3�(}k�P���$��d!�3Kw�B���B�����aw��`�����P������3@���b� Qrz��4�����=��N�B:��>:c��k�Tu�,�!=i��m�L�����h��)aL�-�+�b��	7���b�?;W7�����U�
mF�q��/4��j���Q����i�B]m�*:�OcY�� J�F'���J�!5�$�53�
u2��uH�2
DH�i�[Fb�;
E��c�H7���H.�Z]>B�kL�2[��l���ln�0I���� d^����6c�������s��C@�4$�j�i�Ar�#��������-xd��Bgb���@�����:�F{rk�|B�H�S�����9��X4�����2},��``���]k����ON�[���s���)?[G.�Br�C��9>�JA�:C'"m���i�~�'F���C�
�����i�1�:hMC�"�u�H�"����1t��F��r\��C7�QgF@��fd�23��$�ud��	�t���rsF(!���<<A��D���q��lh�"��������:��}�L*�V���s��.��p��}BH,9
5X#���S�[�d"���������I��W��g��"�tb8�*� �m8g��c�����I3��2�5q��%#/��Jn��sd�_&z1�X��L��P������,���;�#�`�tq�~h��c�@-mx����;�T��?����\8����4�)������[^0
�;����yR�I;q?���7V����@�S�]�Y�$�q�<:O�Z?X��g��T����-���q�$���g�|�tJPb��n��4\ ��(��H���$�Qd��}������+����^��zf���\�F��l���2J0��,h'd@!�rcF��z���~��k�������DR��,����F]�W���m|�~�*�l�kd@<@��#��J�3��W�"5I�t�����.�
0���x���P;i"�!�$���m��+�#����z�+q���h9�M��X��M9�H����J����81��{��*xW��~�K�NX�X�7�� &�`���t�e��(W�������+���D^	o�f����#2��:^����A;h�I�_�g���P+�����o%j&,�6 w���x<X-6h�3n ��������Z@����g�.�\f����a=�e>4+�Lw�q��������U�g��GwK�6B<H���U�WQ6���j��@�X���,a#RP�(Q���������mz�>?U�C3���6��������4����&���0�6Y�.�L�:����f A�l&+Yq]��-T���8/U	����_���U���J�3Rv�D;��/��TV&`�����A���a+�rWT��^�v�XoiE` ��-�rn::y�B���O`��Q�������5����we�h����h%7Rt�8)�G����(����^�-�vM�����#�	j���&���P@�5h��L�|"��2<��'����������+6�-b�����5H]���$c��#�����\�b������<p7$�'���U��J��������xd�v����3�8;n��\;444�;�~g��y����Ay������#�n}5�7��zt7�p>��_�5��'f%���Le�p4e�@�e������ 
���h���w��GO�JR�#q�����T��
���*'�YT���K�yq�tE���w����;���� ����[QblA��m8A�*1g��t�9�����_�\�dT�o�
E}�=������8�P������]����������3s�mtA��+�{��4df@���Xg������;�J-@��$�;�Q�d����F>��Lg��<��$����n��de��fDz��Y��#���L�}��]i�x�'��V�6�`b��)&m���T����������j��B:��a'����������H���,��`S����>c$��SJ�3`��N���$e"�*�v�7�}e���G��������dr���mPA���p��n��2F+��K7�P�]/���xov/��}S-%���c�d|�%	Bh�"��F�89k��J�<���$K/�S��4teG���E;a�gR)_���T��C�\TZ�#^0h�(�v���O_��E���AH56�F��~��a��6� v��P�5�A�6��?�e�`I�Y_v���ptP��d�<��C�e�������C+K��F��;q�:�JX,��C��Hj4re�Pm�({��������]�5Q�3�m�BZQ;_BY'x���H*3_8q��>,{oqIR*��P�RF2��}>A.<�@�m�b���6^������k'�A�g�H�dK���t�zM1I�i���>���f���+;��s�D�"�������;	�:��dHo���'>���������5R�������Y����{�S�Vq>���f�������}���(��~�39�~��9�L��*v�����G�|�(�y����"��1�����Fa��$8�`�������'�
o��hT�����XH��.F(�N�Y5F�R�O�(�������������!��>!����>��LM�+�?d�6�eH+,��"m���43�<a�����PsJr
��'*��a��)��Npmf��bu�,:���Ow�X���e�y�Ix��1���1Q�)�x�u�jM�lW������ c
�o�o�('�����-���T�5�o1Wk�%(��v����}��	�'O����`]�*b8h���pW���bP�)�3�(�S���c,�-��)����������i��rNx�
�����r�M��0�c4B0�B�������*���ll��F���a���n���������c�A���xr�/HsD�A�����r�!i�c� y
_�V����J�#U�7=O���D�tNg��*KV��w����"!�I
���d�����DV5D��~x�5���dj!�vq�����~J�cO�TO�G>�����'��87w-��
?N�'S�����]��\�x��]�!��$v?V�����Y�I��FF�:������2lX2�cdNc�P��X������rt���`[�A	�Hw���4��0�b���D�L�r>l����hCGr�cxA���`�5��9�s������0��
�8�$��������
�*����d�:��S{f�F����i��HO���'	��K��QFR~4�w��_� di�vE�"��	�����b�+7\�BVlO������0�0s�zj��#������@�'�o�*���l��T�O������M����PH����)�EdWt!�B���t��=���{��=�aL�r#H�/)���Nd��!	�bP�qn�J��d�=����������Y%�@�]t�PcE`"+���A�j.��U�X����"�����/D�='�s���h%�g���8���*C��cDA�k:�i�)��eac����W�9*��V�������!$������	��_����X�vNX�O��*��^��:��%5cu	�v�:���>����H,AJ��B���A���R��%m��v ����]_����u������JE��������ANU���;����Vj��^���z"�F��E���cB��C#�Z��L�n��q�{��M� ��D�G�^#������I��w`�����e�B<m�5���k�>�j���+��_z$U}�0�3�vBKQ!k�Wf^�����F���DAq'j��#cQ���@@�dO2�����l-?�:]��>���9�#Gzh��g������7��B>�����ho�]r�3�{��7��1l;�!�����O�/��u�����t�a�2�����(DTG�Ax�����SR![��t����&%�;<D�7�IQ-S�Y���q;��������O����������
Kb���
��iTU�br
��Z@P��K�?���������v�86m��x6[1%��������N-NH�z�{5�^W��>��&�(�_�2��Ak`�-�=	Io��s�"6|����C��TX5�����"��wx��K����F��[������1
�W��)�����~������R��,�uo�����������8�eB�C�w���-+�f�81d�>�\����Z5-�w.�f%'��s!�JOV\�&"��B��q!��w����^P���6%���BAT���G!��w�^c�q_R��O1R��l�
&���=��C���oL��m8���}��E{E D��U�+\�]���d��}G��D2GF"�IP&l��������Z��GL1�>t���^e�v-����g[��Dqrc<��`�DiK�v�
0N2�2*�����V+YA��.z�v� ��;(�_���V���y�D��sB������,��d������`�1�a�Q�#
���'��<��q�*I�����R����I�VU�b�����K��%J+d��v�	6�5:����_���!17|Gz5S�pG��������Q�f�C��xe.)5��G��B�y�"����%���p�;�����-OL)Np8�w�
��r����5W[���u\����w��Sw_D��w�O�M����I�;<�������d�s���B�����_�	���
�id�A���{�$���~����mT��%>D��xA
�;�m�Yr�R� �=�Sz/�~������,A3n�m�l&@C�H�����BX:�c��!2�Qj�e'�[��(���V��9F1p�E�����)n�;��''�D��;�V_�EQ9���*�����n�(	�~N,(&�J��f'���G�(Y�E��AV\��q�V�5(��F�!���GK>w�`?���[�.����c�F�
t]zz�a'��V(�W�]�Y�x�;(�-��<�6b!��s~���4}�A-{?���G#&��]�1�Mf��,	�s4�����$m�@��(_^5�k9�%����G���:l���	} �'��r��N���$e<?�j��q���P�����d���	�
���S�lbX?����Z�%�U�u|��^?�g��X���{����Q9q7
�^e$!
2(!��$dJ�u��x��'."�s1��*_2��J���"�T���
�F1��H����������E���Q�7��kl_x��o��PC��AG	�������B�)�������]:��J�49��m�S��*�o�=Y+bE��^�J�	tV�����zl1"�~��JmW�<���
�9�P����iEv2tb7���
�q}�}�Oy�����`W24���m����h�G�����:v�E�c��3��Hs}1b#)�l�(;�&��F�����{
p��5��%�C��h4��:�� qt����K"6Y������
��q��S\�D&�]��C��IuW����S�	��Zh������N��8d���J�Op!J)X��}FRv�-���1��?|^�F"6j�W����O��@3��2�����YxS
<(LQ���j����=E���j�A�7���X���+��'k7�0�D�����=O�;7��"�v�9��sH���J��>�F������z�(�m�r�@T���kyOJ���}���O`�P���h���z5
�X�������P���y��	AU�Ck)�������d��f�a	������y���#�t���������F��9F��:?k����K��|EA!������5U;���Bi:I8D��Q��B��*�d��`�pBz��H�#�������$���
c�K������
=K��j���}���:'���>��5fQ�^
R�#�A�BVM�-c���H��e(�`� 6.�fW��uNk��H�@�a!��~�P",\�~���|���*�!�[��q��%�L~��K��l[
p!������������3���b��^����-D��� �MO��g!��Q�b�&��-gI��X!��H�1��V�EM"v
�D�����U�;b��j`�q�����X5H�2u��!���P�kZ������BX���'��|�DVE�?���#�1���������zq�bk��
%u$���R9���j�brj�;:��g��Qa��;��M,r�c�3R�[_ia0"��Q�r��F�Z��������zq2�v�!�ZV1�|w%���5(H�N��D��{��?�"��|��g�1�"���d�b~�����8��B�1�5<?��qHR�^�C�a����`"��R	w���Pn�h0���d��n6����B��j�o�wPL,�o��#�*u���L`"'�dU�C�b�\��M��B,e1�����"��h)~V��9D��g.��,#VF��;��T�w��,V^�s^����}8��c�B{���Y������p���%D��tcT������h�3?�~2:w��D�	 g0�l&:��XH���a@S��aaC�7jL�8F�~D{r��0
��������0j�/H��r�%>Q ���?��K���w�k����A���W(�J-��m���fRxW0����	:�H���Zh�!��G�w��s�P���C�5�S����"���
a�����84ej�l�	RZT���`����V���(��e1W�SL��dZZ"M�G�(�z�l�_�r���j�Z�Nm��� �A�O���Xm��<��r���V��)8�����$����Z���$����E9��f��>�,|�VAR��A�kw�W7��h'>��AH�$d�M�������(�m`S%�D	�"� |����B1�fx�*-$Uh�;)���[w�D�"3�~���U�*[U;,UL&S�?�)��7`,�W�ue��~w��c]��^b���
md�Dk��Y}�#E���[�����(y"<�T�#3� �x��l�$u=��@�eP�VB*Y��2R��2Q\��Q<[��?��;�5o�kQJ ��f,����mdT6���������1�r3����ZDrch�K�q2����6	�@����%n'f'� �t3������%���i�O�&�?�Q\F-v���������M��������@
rw"4
��5|L��� �T��(�����}]l��vbX.�Fz����Nob���������Anx��6~�Q$��}������������i2CPo�?���7YD��a�'�N�%��l �I�YO'�����Y�� 	�
���w.lv�M�|��$$��@�$4� K�^m����Q���������&�ZB�������(���?���:�IO�qqR&z���p�}���V�hr��J��-���#��V�D�0�v�]B�n����������
c'��%�!�V��Sf���jB��uC��@��'t��w�n,�]��Q��lC���?��mw��s�'![F9��d�Z�=NM��5w�z�JQ;�'/[���V���A��^��M�(�**0{r����d�0b>R���T�F�D%ET�nlB�s���K�����E�C:�P>B�{��J�"�#����8I?�P_�(�%�&w!�Q�=I�WF��DC��nDb.y��x6z��%�w�w"z~	����4���e� �^'
��H���i��e���������Rh#APR���n���B�],${��'������� �v|��
=��������
H~�
B�"�Bb~�a$���%���q.O:R�vc�lK�����Q�����o6�=���]2{
�d�:�������������I��!�����+����_��%�Q����jQc������$@_D�3�S0�����I4EW���q/l������Z����s?4����/�5�:�=O�-�\Cu������M5�zt���G��O�Y�j���=�����m�px�9�']���M(�i�H7t�t�/��_tJ��,X->�
rA]���g�_�hU����i���e�uR}:�K][0��07n#�����)�.cXK��be��	�e�������&YG��nd�2��Gm-<e���a	�	O���
)Vn����Aq�Ww�{=Q�`7�H�}��	&�+P��'_�|�sr�n��,��1V��R-��q9��m,�[G'���w�*��z!�T��r3Z%`#��6<���-$L	���9��e�����+����d�������Sw�k���X0=fPu�TJbgm�H%|?�.��C�TD�yK�gR�NO���������:����T+���y�M6���`�8@	F��M�����'8��6Vt6�����Y7������g�A��T���u�"���,'X6b������Ko'/�q��v�Y���_
�;������a8C}���_#��,��J���k�u�/���*�a"n�xr�]���O�Xf1pH�)~�����Q"ATE�S^���a\c7U�#��A�H6��|t"	��h�,#��E
M��?�,������`y� ��H���o���s�P�r���E���f��]K
&k3f2"�h"]��RC6F+G����4���<Q4iXH)��������.e�HM4�Zl�L���a�$�06[%_(M��w�a�`�����JG#m���)G2��Hy�Q
\Ab�a�B�	�[UN��wlH����
�����ap�yb�W�*/�;�����d���U�]-�E�HP6[&����X1��4���I��/�j��������������&���Q����8Y��?���0j=��U.���]�
�@jK�#�0�0u4�-���l�0� �������C������IT�(�j�8��p��v�*PG�����������[l��=L��Ru[�L�,@9�b�y���O��M������������DcK,��m��5������dUlL"3N�$6J,sL]G3}�BQS������0�Q��x'
�7��	u�e~�a�5�\4��0��'4�g|�H������)>���N{q����oE�Pt�L�'����d+����;�rH�|����p�a�C��#�"y�	)x��pHE!*H���alC,�����z���\����&2��"���~-;	��$�re�A���� ��T�2������{O����e�%L�y���p����ZN;b2
�V� ����^q����H�2m|�rd�4�z��S#����������H�#�����3lO�����o�J�G@E)n����
6��K���X<�w�;�[r$�q��Q���V���+�C��N�&A� ���&D��	�@���A?Tk���	�8�z4<������I3Y�f�&�a���#��������J9<!�N��$�vt�>���6Oc,�nF)���Y����dG�F��gl�����,a65����MK5&K��]��C6�Yb3!f��M���D3�7�/C*	��isF&�D�=�k���+q&��1�����5�+���C�Q��g�'����=7���K�$�c��9*s��**����Nh�7	������?�9(��i��1�KC�b4Q>H���gY3�a~��h�4�p���9����DT�Iw�c�$��#���&��J��
+G�i�Ah�&�z@2��z���4)�1���Oz��p%��[���h�������#����Gb����Y�IEs����P�x{��G�gM�i�b���+������P2��q	�R/�h'n1p��J���"���[�p7{
	�`��a�r��7pa��=1*�i�g��X�Y����tj�$q�h��5�R(�^��`=�[Y�r�����hl����������{-��X��S���	�)�	�u�U�|;
2��U��l������J&�d�g��&$���p����������I�������=�5h-����9\1�4��%����9���3�
����D���2��$TYT�J�����hYBChlW������K��u`��4� �>x��R�c��
�e�{���8������IY��b����]dV���f�����qVVE��m�fE���i��g�t?��g
�����g�t��e��f���
����j*c���a�EcF ���F�\
���s���({t	�������m�#��O$I^eU�a����"_g-���D�N���
����2�������O����:�����=9�[[(��9S��&\c�P�6:��8ClA��g�%����(�eEJ!+9�@���n��SVj���������h�Y�{��Iy���b8�2���C�G�L�(g=q�{�*^hEY=,�@g��C��RU#�h_���"�W���!��J
L�>�=������4��X�!�����j�e��(�����R�0��2��Q������	�9��@����^W��&0�������F]^V
�e�z�l���)���<9����{�>��S���9�s+�m����]�����r���>�p{�sPa�`���T������|��)�8<�(������1D`�Ay#9�J6�n�0$!�}�YM��8���2j�����bn�+�� )�����f�G\���)����F���g$��QS�&�~�����.�hY	�W�Yc�J2(���F0��
�F���!S�":]@)M]=k�]�>�D�I~PU%8I�=���"�(b�N���h%4G��A��"�q:�1�WopB�,y��5&�*�G�����$��[���5�:���b���M!�B��[0W��#�-�eG���R{>����)�+��� ��'�Z������	�2��U� �e��R(z��V:%K�_F,6���
E�9o�NW�
%���~�8����D
V�?����]"#���� �S��>>�*,]
z|F*����3&�\F)�������@���
���
�}i�\+'%^H���a/7������ix�> w�r{�������q�����1a���&��bz�vl�2�����+���eU�yJ�a����zWr%J�����SQ�q�?���O~ ���k�[P�)���I���D��c}QP����o���1~��q$Q��L�+�x�7s&us�rxbs���M���`���
�<-�Ky��"R�6�0Q�dI8w��Ks:����#PvG!��"�DU!������o}�,�h??��|��|������pBG���k����|�XA�c���6t`LX���oI��J�<�V�6r ��LY�f�p��=��lc�_-��i���y{ho,�`��q�<{q�t@�H��?A_��E?{&�����C��mLA����#;����Y��
/TT�O���sq1i�����`�;��b���p�
��Zo��
EN�W��X��
s1�I�F��mA_�4�:�2��LA ]{(�iN���u=�i����E���fA������/6�m6���p?� 76���0!QG�'�n�8���)��x��(��c�� ��f�f[�+���|$[���]��4-���/�@
4 4���)_4��|n2�}h�1� ��$�����"=���pU������ �;=R[�U��s��J�C�������b-8�l�M[�����0k���� ��X�vF���)d�r��k����T�|�~�z�v�����y��,�pU�6��$Gr9��@�6F�Qz#(b��e�@���2?��"�q��C�d����8�����:����)�
������(^b����H
3��+����L��Z';'R�{��+f�����w�����2�n�
�"9��%���2���DH�����>�$G��r_��BF���W�{c'/u�w,���{Ko��t�j(hlP��������)2��m�AP��$:��c�'w`�:G��N����|.!����(U��7���(v��Tay;
��x����&�.��K�VY��e;<�h�#�
����&�����P@�M�Z���l'8|���������j*N�Ev���Gp����=��V�	~P>_Lf�|>$A
����[��^=F�y���I��=BQE�O?EmD���@+�*��0�k�h�t)�HB���b�P��S�Y��Y��:1A�����F@��1xP�HL;�{�B��C	�%9�A����0����1��N��D�HI�!��7z
ddv����F�d}hP`��B����_���Fm�cP��yrpUy���}BdJ���f7�a����1��_)�����2��?5��O��+jU���������'x�[��SJ���#^����i�������KV�~���8�t�U���"#�n}��3@@�1p��n�����V����md�X��A7�{�p��@�����	��O�A���+�
��(��=�wB� �+�������c-1z�x�U��"�����A��'�;�����t���1� �Y=?�?6�zZ���0.I�xr><a���4���:�4��~��1)lr�"�t�Y
�g&~�M-�	2j��L��;5�P��C�.!��o�:>���y�5"_�B!�cHA�Ug��$T����%�jJ��x��@|��:j%�O~ ��)�/�����F�%k3�Q��Z���
4�+���X�{fV�� X������,'��%��G�dd �n<���*C�d�k��aUF�%^��s�~��V�G
V@_�����b�;���
l��������5I ���[�T��4�����9zDBV�^PGt���x�����y����'���g�5��;�K���yy��Q��T��Q������UN$�RC��a�X���W�XA.��I#����AN]��D�U�DS��{����-d*���S~�7;:� ����d��Ey�����-4
��8�<E���s�:�>B�`'9����T�<����z8����=��������n�]�@���0R���1� Y���]�o���$7�t����
Vt�iP2�^c�������t%�B�>�B�d�p���3*�@�'$�v��t������gBa�|���\�G��/U�T���4����9�2
�����N��w�e3wg1`������L='�Qk���^�K��b�L���[1��HS��wd��w��1rB}��H�������'�N�C���2.��o�_/��j�E�%�)�y�R]��	�� B��w��u�D���*������d��� ��w��	��2����������cDBe2�|G�B��#;ma����{!7�����hr�z�T���E�H���-5RW�#�4%G�w��!Lb����.s�o�{����Sx����d���n�8%���C1d �s��:�q���Hs�����e1D���&���?�����S;o�%[���e��F�C?"d�����S����=W�n�{��^=�"%���|>�����
t�a��h�AV��@��H�:B�z�4*2Z�G���*���h��Xm0��O�3�M�V�0��������p<-���y���x��pKtM����Cf|�nM����Z�w}[���F�4�������;(�������	5������=��mN�!�����CDF�<�E�ET��Bn���xw^zO�;�]�3�����$�AqmG��������:�����������?P����I%���WTm�u�����2�������������!r��xU���H>hV���

���!E/����3I�E������X�g���K�E
�!	��6�P��^C������������;�%A"\,���f\��%t#��/$���U�p�7|%���B��+�^�]-Ot
-�����G���^Bvpw{�Y�#H��y��#��ij2&��w���9��x�F���5����]K�Xw���������}h������	E��P��%���� �M�sY��n#�����@;��GL=r%ydK���38�����r��KRA����$�Q({��c%��L�?"`o�-%��Y�V��T�MT^�=fG
�bS�|�����N��[��<�"TB�*sy�7N���8��/xg�e(VA�m��9���QU[,�@��S�v���������V�T�-�.�3.�L=m��R
�YSQ��R\{�B[���"�"JV}	#�,g�����AtBC������8[+����1�w�&.H)%�;��]J��m�T����]�"B�,�("8�����y?Bd�������Av�i6�:e�������-Q=W���c�bb�s���W��H�(=������T��'�(����>AR��M���q�V�3ja���#���*�nW]�*���^��rqlCVL���0��D�m������H�rY���i���L�\��kh�e{a��pA����v+���_���0����vR�^�V?������_+$2`���[�Oqn�/��l 0/R��R�Et�.B,8�E��H����/ !{�"�7����G��,�{��������YY�lw�4�f@�P����/�+�0]	#tC������(Q�����@:���M����3��=��j��*�YS��2Z��;���(f�f/E�J����E[��!�u��
�@��7�R4'��/R�v�a${�eZt��,���*����_B7�LQf�,�+Ta��?gb1�RD��"s��_�F;�
��gQ��:�����-��1+��q���Y�	�|a�����_a�D8E;����zV�b�BD�lq�t~���RM
�g��!"��/���a�d�B,�`-z�)(����N�w���?=a��,v\"}� ���X!'�C����?$�����S�@�&�+����<��$��-jm�	��q���
M��m2�����*�3�`��P��D��W�wfSk�-�6����.Uk7�71���B�/��V��OG�����2��x�U�'+
T��yS�u3{�/zT����o4���WwA�'��Z�����?����3|
�X?��L^Pm�T�'-Y��V(�q�mxD��s*}~���3&er�p�U��zDd;:�TA]r�	���d;�N�.^39�����V�8D��� �4Sr���r��f�EH�i�WP��=C�M�%�
s�P�1$���Z����|wg�@~��p�Z��^Bc����\E�1��������f�j��������-�9l�g�0J���}�9�~���h�pR�u!xUH�A�V��7���;�OT�x<`��������h�F�����-���J�.��Z���al�K�k����d���?��D6�,�H���A6)��A
Q.���m���O����*1H��b�
]����r�)I�:��]�3G�����%0���U��`�����o0�oMa��
q�]<19Qw�
i���u�
~O��[&2����L$)�\����#t�A��7�)�����Q�Z0�b1;��ls�J���4u/��������CW�Y��p���c���(��e�/�4r����{�#��K
�+�`��
���{�������]c1pM�E�>
!r5~�H��eP`���i�,�g��*C6��dV'J��yTn�����O�$.v�^��3�4e��4�$\u�Z����x�y+���e���3|4R�U�p��6��������6T5z��=����8���'$�l���-�~d�C�����A1!�u����[�D+�#"��B��H�0���m��3S�V��E� ��}���j�E�O
�[�?�cu;}�aw����X�o������h���6��gQ�J���Y?���Q���{Awe${k���\gP
�=P#{f�W����\�D�F����E�3���^l�a��
�P��e4�i$��d T ����eD��*p�pp���$����sI��4<A�N����N���F���;�����S�u�A�7�bx��H��c@���N����%�6O	�����q���������U����1w�c�@qc����D�fpCF�������p@����1�"4����3bq��H��9K��x� �z��n�=��x�Ty�y�|����0��p�i7gl�f�5c�noB;��Ck#�Y�
�����9"�6����������E:'H4�mn������=�!D�f<�&$�uT$����9�
`����=���k����R�L�	[M�C�2�%��a�Q���^��
�o��uuxk��g��{!�=��+j�7#Zs�y.��D�xk6���xRo�f��d�Xa��lB<zt�lF<�F�hkg��}�������B��lBA�l�PlF�U�-$Lh�%%���Ua�
��s�E��HG�����d��f��A���.���q���[�e�f,&
g��5��w�.��X�#�	����TX��"��&����g[Q
����X���]�w�WCX9"�w3*�\��
�}�����N�B���ds��}������6Lg���P8�W��O!�����Q"H�!��[�����y��C��+���������~��Qf��,�P�p����	�����9iE��
�	�����m��'(��d<�y��'0cC��
��v���	����h���~m���e-�����'��M������Q%'g�3�h��g� �e��q��F(�#�i���;7"�������1�:�i3T�`�����*C
����AB�}e����]���?�������(�������^|-k�����38���p
�#�Z1����f���H�pMG��:i(��[�Ro��4���o/��.������w��m�����W)�.z�����5`�p��
��]K�2�k���.�]�3_$������	���
�&?�[����48Wc��#mB�=����A�;���+|`4�.�Dt�UY��C������S�Kwa$�J7�[�E�^c��
��+].�0��0-�]~8�d���P��%1��?]�
:��fU�}G�8n�Dm��d��*��ixt��K�����0����HE'Zt{�?4��:1'
|/�-{�dy�5�r�V����%D�E��#z��(=y�@(��y�������6��)6n�!���PdK�n\bd������<��}�&,��Z��(p��b+gF�.��*@�(���[\'��2�%)�n�;�E��w�.��*�`��w�i��e��d	���s��,>�����"���'����\���^ ��.z����q�
sj2;����{J�!����}~�Et��B1�Iy�H�Vx��H(h�F��n�F$��,��� �n=�)���E$�.��� �L���}?M��"vY�5:6q��>��l��lV����u?������L�c -|L���)����/]�R�Sb�B"As�vV6������fN���7*jkwat�k6c���h��G�G�!r�(��y6�!����]���,��@�������D��
T�g��0l���L�qRyo�#w�n��������-�� ����H kw,g����-��1�����f]��1�����������J�����F]�.@4,1Va��i��/;Z�4��U�~����\A�#�"]>�S�d����T���/�g3C;�$y���� �.|���dp�+�v�TvOJl�_��=:f����,����Q{����]eH��W���T�mP���2���,U����Z��������	]����&�Q�
N$���'��f����D�4y��&Gv�sF]*��o�M����2���c�n`)�],Y��=�Y�����,��;�����Po_)����Z4v���?�;[W$Ob��E$;��+��X�up����M�
��h&
K1�Chz=��m��0�����'�e��YM�.��S�/z�",(��.k��=��d��<���,��el8�"�|�3�������z�CP�@�5�
�����3�s8���s}v��+f���!��(V�Dc���1���b���o�c z��/�/��4|���)C��������_po�
��Xn+���]��\�)���?	��Qw�����c�����HC�C8Aq�k#��B���C@��
��Le8.�S
=���o�@&�1F^�6��������	~v	��)�����M���	���.����m��A|�&_�"YCb�C�<��5k�8As�fw*X2"����#��S�w��_	��|��(z��(�����r���9^�g5����i�e�`��Y�����tw�&�n���XZ�+
@����WHEf�0R� ��(���mx�*����x�M���O�STDOX�xRE�p�$
�Z*��A�~�l�k���r����b�U�EPMD��1��Gs��(XR�
�����hN��8#��1���O+Y����"eeS�x�U�ZG��	N��@������':UpB�";��V;��w��P��V
&n�P�x�
W��Bb�U�9z�����Cp7�iR� .d'?+(n�7x�`�;�S��A�?`��p��HH���_��
�`� �#�UOd��C�a����3"v���b��2�����V���`�2���#rfZ�;~t����	��[*�������kt�G����P�w_F�������m����-���!��5ev8�?��}&Y�'�bgk��I�iv�7�����! �UO�f���/���@>����lc��"�q����K�C�x��M�1�Xt��1	�&���������s
^ �"st�VGD$�i<�
��p������m#(L��)|���H��(�������%Mu�����4����+��P����h��BK����M��8����M���`~L,l�z:C��q����*fw�,�-e��Sd
���G)fg&���G��@�Lv�4�5�t*���sl4�L��$/1���W8�}�LY�*� ������'��Sp����LZ�i��7��QNgu�
TW�w8�F����Lm2���X_5�U��=�U<4��'t�`%��?�^�lv�H�����������'�������,a�s�?w���<��PN�L���M�
PX��(��&|B��=����]�'�hi$8,�y�6��V�Z	l��d[���S�1�~�]�n��Y��/�!oSHE����&d������#uYt�����=����F'��Mf�_y�mhng�����{
��$���E�m�����:L[�hyT 	�@�g7���YE����I���|����v��<��~3�:���a-���1 ����qr,����d��0�m>}�I��dF��i��s,��,��p�f�-���������5�����Rz���s:,*���wF��Mf���Sn�0M!Ek����nN�������U�U�B!���!��	�y���L8��Iv�pL�b��Y�E��i}���E H:d�Fp6����7`
� ��������A�:
h�G�� ��D�I�SX����{�M��Pg2������b�?[;�R�DsN`�������!ks�b�jHY2V���B�����>!��[�LD�y�-���~��'5���/��f��0�y��8=�|w
������D.z���p�G�ZD2"��|�mg��i1EV��(�>h���1a���
k��������r4�b���m
��
��jVig^{���
d�H�G�h=��J��/�>ql���E�
��F�A���L�%�#;�����/�3M�^B7h�gk�z>?�h�&������]����Ic'��B137_��������X�sE�g'������Chz��/�IA���$3��Ul����.!���
F�
K���������>�qK�2��r&E�w�b��������������gm	���SO���M{PD��%����";B#���D�R)"&�jb@4Q�6�,�z=�&�%�M�w9?+�8\�������W?�g���y7��%d9m����?��)�tS���l��
ro�~�)�x*E��%h"�o1�6�u��,k&nC������"A"��2A�?j�-a�*�{>m�w����Go�fM�w
���9d��r��-���c��nq�9�OI�~Jiz���	f��������	?L�Kq�~� ������eE�����zX���N��CfE��%e�������&~k4:(�6�K�l�F����3;�U��e1�������!3��o����]DQ|�b�0�e_����^��_l���D����������N�eN������Y\���f�7l�\���	e���~�����f�N�����Q�w����cz��y�;���+��Vc�����������A={R6O��� Q��y-���dHhj����������QF���`P�}����(� �/cx�q�Op���jxOh��Y���w��:�k�6�iO�(90���������>-�AD��%4 �I�d	�&s��s�dZh����?`�
����|Y�:s	`	C��|E����c�0N��
����,�����j����������f�C�r������?5U2l���ZD5�Vo��f~�tk��{����O��l����j��O�}	���H���sh���;�xUo��:#RDl�'����������,bu[���~��������AF��V���_���Y�v�4�r��%�����]�N�s�w�Q�}_+u8�����,L��\�>�B���JAK!�XM�%�W�
�{��EvJK����� �m������R�=����w#�>o��������'S���sw�C��Xg)[(lE����?�������G�W�S�n^����}*b`�fO����������5A�f�������.�mZ4z���6@XY����&h��0�`�v��t�����|���b!��Cr���-����P��
�L9�7��".����8Nd��-  #�m������O�4���g��
���5��w��&-#����?je@yF%��F�[=[$�����R��gX6�1�������8@����G�o�����.��I�P��Qu[R�?#d|t1�K/���J���?�x5�'�\�m�v��<�s�X^]�H�=-3����i�4�k�f�������:D���w�Bb�1��VsSF��hw�l�	hD�e���f���>agG�B�=n;�O���+����d����4�/|�r=�5�s;��T���������=4.�3+�d�����!�b�`�-T������9^�Q/so�Ao�%�
|��St!5>��&���+�
9�FWp�������F�=1B6�T�Y4@M��JE�|����j(wu�0�����q��������P��'n������S���e3�D}�vIy����������m�^��p�� �i�~��n������������J�:���'�8���#� ���c���(�A�2���Z��;=�\"���pF���������Y>�|��3�1]��'4���bx[E��c9�&Wk�XSPf\vG�q�JQq,&����GQ�#5d<�	h1�D{s�����\���Sn�sG+�qBt��<�Jj{q�P>Q�"�������;�a������?fd�AI�R:�qVt6�#�@�\�N57�|:��_|E���b�[�`5e�U���n������Tv[�rT�EM�cW�l
%��p��9r�1�S���v
Du�q���	�	�K��J�#���3G�
1-�y��bP�4�� u4�1V�G���H�M�����G��qYrw=�o�)A�<��1���HO-�����*=
P�<%�t!G��G@�%�Ha����# �p��lw�0��;�8T�X��s����L5�G(BX�
1�X�z�k� �o�h�p~Bvb����1	������~��N��DvZ��M�&�~���+v���
NBp�z��-����X�3
!;�OE�F���}!z��gR�ya5�Q��u�Q�d����>�>������t���+f���U��-���a�N�������
byA��z��?VD�c�"�y�����l���V�Af���E�.q�z@g9�c��!S���9������#q���e�$t��FV/[g�o9�se���p����$�L�Z�z���2��l	��#Z�� !���@@��7i6�.4�	���k�.~J�h>����'?8�!�8�����������Ui"���~Kh�W;��8�9KBr��0�C�[A��������������c�{y��
lq�_O%����/�(��'�N��n��^\f�{������$P��Q���u��������h���[�$��|����)wki4����Vb[�Y�R��~�Z�N^��~/�x�{rG�����:�J�P���w�PU�:���+�	���&�3X����m�4��	���Bf,�����'4�~���]�i�G�?��.eF�����\��,��KV��B�����8���<���K��e�
�V�5�},;!����8�K�$�����9�w�}���hE0&�l6� �5�����g����H-u���Z�Ky�k�K~y��i'J�z����X���*��Y��v�-�3zG�>|��[����t"4���y�a
�h��4�\;,v����+�\����^��X��	���~a���m�^G��h4��bq��~d����0~��0�B16-��WkR�d���O��CtV6�}D�(�m�uH(k� �vxk�qD�N4{��[��
��;��G��	��^F�neGD�{���;K����!7�����Jdq�s�I�v��xQ����`Yi-�3���n���'h��e�;�g��-.�2��������3��,���}F/���w���8������^C���c
���khc�X�3;�0*������/>����%��z��B.V�l\�5 ��������������-+s�E���M�6{O�~��Iw���8�q�3
�B�D2�%���5�(D�0���w���R{�w�K><�1����a�����{���O�ZX��h%�b� ��M���/��p��;�M������q�/�������n�v�Y�^�@�W��Q���E����D�A��$(�;Hk�H�F�%vm��"\�9{D����{��[��
�2�+�{�\�������[�;�Q�c�n_C}������Sh�
`����'����nZ[v���q�����	��A��t�1�bU��)|�:�2�������,�h,���;6����O(G�-t�~G67�\	G<�w�� 8�f�f�1�
�`K��o�'�Ez/$���?>�;��v�<�=0�P���1:���N���8'4����X�p_`����cZ�vE�����)>���;5�]Ep���E Gd��Rs���L��:/�����������������n�*�d1-B/`!U�x��l���^�Y@��$�6�'��B2�B d-ab�{
M.��{���!�������%�����$7���5
�Pc���$���D����I�"(�+�f|l"_�U�'���qdLU��P����������HZ����n�V��G��x�!�<���T�N��
�@
G�V�������D�J\kv�)F=0�$,��t��j��g*8f,�g�����P���1E�^����*��fqB��}������'��7�q�&�	�3z��:��!�>t�F�I7.N}p��Y�<]�H�@9|Z���fFL����;�H���'u{i�H�_O/[R�z��<��<�6+�#�}�@��#\�q�5��_��(Vo`����6��������J���d��yJ=.R�:G	�j�&�=gv����Y�y�����x~8���l�6BG�����o����B����Wl�b�����'�m��?����.���2<{\V���cVG
��<��]���S�80�����EQFYx������G��w�,��o!�#H�:4��JA1>�F6\]�h�����Rr�'7�6[�j�8	����t���G+���(�S�Q'�� zT{E���1Xy#0����ij�:@���%Xp����BZ�v���e��r4���l��dxH�M���q�FH�e�=�m/�n~�L���|y��o���C��;#SK0�N~��Wq0ti)T=�O��J%�7��o�'����R(G�Xr�V+��1�t(�x<a�A� �t��m
�)�N,�/k�F��/��Sj���1�����yP�%=���������P�^����!+C����$����
a����sF�Z�p�Y�O2I���D����wWe�d��+<���
p����KT�W�A�c&�~�;��U���%"�Y��Y�
�������y3{��t�_b2E%o1�<������8
oUC0�"�����{��>��+Z�<���a�L]��Vu6���S�h��S8H���T0�k{�f,c��j����mkO�~��D?��T�t��qs�:�2���"��U?|a����	��/Dc�&&��V�3B)��9|�F���FN���;�P'�lD��
F�8���D�_mf���	�:��#��B:������g�P��}"b�W!
h�KTMVa���Og�/���e �sD��*$7Z�#:�V�t�h���~`���2��'�����������3�'����I�W��h+S�V��5��i��9�&�P���������7mGM��?�H����t,D��1y�r�p�V���.��
e|�����R�� �!��)�Q���X��yS�U��$�c�}{�a���!\�.�� �*\��H"���iiDRC�.�c���3?�}�����f�[@uq�3~|����8���"k��Dc��z��;��t��p~���z��os�9~K��y�-!�r��A��L�K���3�Z5�@^��cQAV�N�Tb*q��Lr	�
����b���rU!`�N�%�v!(�O����v*����j�=���2���h���/��%c��#�U,�E���X<�3@(������kUX"D?��BT�
O��4���������aeC$T�vr���&s	��V����J�"t����va���$�U����Pu;lI2������c�(HB=B����4#$����K+�(Z����C
�K��F3@Xu�~,ql�kXr}�f.�+'1A\����@�*K�h�s��}&�@�)��:�z=��i�_��V#��S�������[�����,jo6�=��.V��9<��	��R"�A���R��=�g��fhB�����Y���c3vVC"��DWX2�A:�>X<��>�CC_]��-���s$��b����1.�]���^+���8��u�j��������� f����aa��������i
w��31p~/d��������e���M��]��H�&N�S����#}�z�"�9-���'I�U�2�����0I��������L���CV�#����g�s#�F��I�@���V���_��X�p�55���+|����EV�������*�2�B��D�8�������%��N�On��Yd4��K*p��>��XM�R�\k�wF��uM[s���;#7A�x11��k5u�g��Dy�`��[w�P�X���������i�k�g7b2�p�,HSfP��X,27��>��F�c�r����'�-����������]�����	�{4��}&�O@�E�1�EEP������N���e���'������sTF�;��G]��O���;���M�����K6c�4�hn�8��"6��]�����}3���Y�@3�5���(�h��G��I����
<���%��k�C��9�"(7�Q�	�`{�V�~FiB+��[q��z�f� �/������t~pM�#��4C���u�N��n���9����]8j��&z�����K8��0���wb��	�@CXAED�m���^H���IT��U����4�fS�m��a��a��`Qr���yU�Q��	��q�FY������:	L���Pd����'g��2��&�1�2��"����9:�d��p�(W��~�������p
��p���f���;�|z���(�Z.%������OB1�o��m�NX�����k,4�8���y�H9�M�-�{�P
������>+,,5�g�����{����\1nfTt� |���5���.�c	ul|V��M�.c��n5��#����|O!l[�#�#Rw���Q�����������?t�q��c����4F��p�a�%7���h7���,��xF�s7��`�aGI
�^|��m�nP�^�"�dw�6�9��=�Q�G�.�N��UL
�g"r�����d���F�a�F�<��k0%{����k��
DF���P&��vA"%I?^������
�?��H4��������@��nr�#����_`�@������^8Gj������0�������$3��u�"�z]Z�h�
��f�'�s��\��H����	��l�YDhEt�`����
�;�3��AX����"dE�dw
7��$���(�8���]B���@�f����I�����
c�{���Y�u��s�����h�����?	'�Kv�O-�v�q?8�G��� �M'R�0����-��`���R8G����L@Q5�^eh��J�n<������EWp�EV�4R��.��8N�>}���l4�X�|���_�nsj����m�l�O���������S�l7j���Qg+����)��������l]~Q#F]7X���0'<*
��!����m����d�����bsP!�K'��gHDd3�?{o���wX���]��HE��#����~���($C������}a������g���
��|�J~��jd��@���ea-��;���6����Lg���rf�}]��&��D+:�q�|0ovl��n�5<�O0�!�nOw�.�lZ��*vC���Mx�Rk�.$����
16���x"|�o��(������K����}2Bd�?�V���d0i�$�����XeC��}E�6X�I��$7�c�
�����Z�7�Pqj�����[���B�E�D�[1�w;�D���o�yT�H�&�-���I����e���.u�p�-�C��K��Pf�*
���g������h8�[N�;�u�1��#���YT6H���%]����&?��+.�
T��e���k��1l
%o&�L�~r
�T���s�'�a�(c^��!�j��)p!�� pbE�����i�m������p��eR4����6r[b'���y�
� �C|����!Q]��+h�A����Gu����n��~aH�=���bTKq����d��a��s*�H}7��(xe^����kW�Q	�Xd���8omT�2���{�@o��ct�0�Cf1��`
�OJ�������"�nG�$��;u?���1���E������q�N��6���>���Y��h��X�O���n�^�Z��s�l�,��(0s��?�{SQ�>l$�v~k�[Q����Mu;�Le�z����y��&�����D(�z1�p�Tq9�w_�-����l���"D1��I�G���h�6Fs��p� (
�d���n�)��?U]t!����;s�lv�u�:	v��rA%[�l�/�b���s�]��������>p��6C`��/Nj���C�Gs�#����U��8�]I���nr�6�3�����+i9A�".�e%���}���go�)�����MAB�"x|�Q
J���(P��tKhq��:��(>m�zY�S��b#�6���c���	X��@hg�1�5�j���	��Y#�&RD��]p�C�\B���g�!(�g5�2'_z����Q���<��n#����c���d�0c[!tl���N!��	r��y4������"6�E��w�=rC�.JWx!�b4��j�a')�@@�-G��I�����2����#��=u�]2�t��eE�1g>z�2�"��?�#��, ����tC�M��G�>����b��0l��@4R<<����T�<�]������Y��e
�6����x�=fL�c�'�FwG��)�c��I��by�Kh:�l�	��}�S��*�z
���PA?�<��s2�l"�t
������,�U���q��O5���h���@z�u����l��,w
u�n��??:gN���)x��J�	��?� ^�RE����0k�5��m�=�}�S�EF��1��R���r������H����A>�Y����46:6OOI"��5����
9����8����NS�k��f�m���v,�����F�r�Z{���Q�`
��nZ�q�4�q�`>yH],_�c�`D���z���l]xkF-�i��C��@qq�p�0���bu��N���+iFs��o(�k������}i>m
��>����'���h(n�����T.�

�]1��;#��/��:�,5|
�v�����:J����_�49��~]�/�{n��5��������n��F�) D!��>n #?���7,����v�>�+M����<��Oq?V�oN
3-�h���F�_
0I��z�w"��9��`e{��#�����_�X�ay�����Cm�����3��B��}�88m�o~1��&
r�K6H��h�3�1��j|#;���t:�T
+c'h`�Ay|��������\:�y��e��@�*)d*�'�|�_���z�t��<"���p���g4�2�E�%�1L�Yc�~Tg�mnFV���
�(%��z��$�QQ��F}Yw;%�"���LC���3�G��My�r�3���G��T�;��q�����%�����d���6�"~���4"z<�dP�o�3K|��A���ys�k��������2�}�5h4D0��Q#
�b�}��*p�]
'��&pL����C�\������-2g������5��f��u<s�:�5l���
*�^���y�-�v�cO3���������u�"W�i�"�C�r����*)F6�������h��9������H����guh6��	�<�	����n�,�h�*7��a&�n�,*#`�i�xX�����@(���B����lu�����q�,FK0��B_B4�
�n[+�DJ��Hg���%��#��S�����r�u�B������+��}���9�h����Z�O����K��,;C�m�!���xd��@#Q&�����9�����9P���g��Jy����>�e�3�?=T�����_��,�����Jd��U�x���i��T���V��:<F7�~���h	n�L��#2�0�v#
�������B��N%".a���������9c*z�N� �!�>��u��(g��j?p"w����j�8E���"DI��(���E�*�`u%� �������b	4��7����*�8����W7�)�s5��Y#�d��]C��PT�z���e���B���m4z^P7��{�l���}$[vTpXEn�0�[Fd������0��D]B��~�J�^"��V�\����
�@�����m�e���l�K�`���k�t;-,$�e[���h��?m��4�K �jJ.���=��P�Ydi`Om r|[�V�O��J��Z�D��U�����TZ_~��,K%��,�"���'_kv�[C?��,�h	S c S�-�\���K8������	����o�f]�D�KpA����~_c�]
(b���7DD���:�������-+��'c��2��-�VY������v�*6z]��>�}a�Ds���(V�FPo����0�%4Vt6N�O�#!��h;P�Ub_�^��+2#)�����2|d��X^}�e�8;o�	W�8�Kh\�5R7�%������]�6fx��h��F=�:������v��Q��)`�x��,%e�?{�}��{�>������&�n#
�b)�\�"��~����2���s9��������(�qu�srj �&T��g��@���[�D��~����Z����d�q�P ��6=�����c��i$f�3������F��GZ��r����/(^�i�674����F�)&���K�]�U{��)�b�E���&�{I-j��m���-�b��M��=MS�M\FH��?����i-�-\�`nc�C��z<�Q�4�����"[��Wk����-L����
_Ot�?�,q��kg���F��^,��J!X��(����}�v.�0�<��,�F\��}a#�\��,B��e�I[x(�[�@�1d�>[��7�1�\��#
��.���WF6��2��f��k��t�!2�����`l�(�sNF
��iw��]2`Hp��e�������%��[H������\3��nq�*���=l��#2��{P4oV�E� �zW���v7����g�)�QP-P�g^����������X!U�V�e�b[��0#��[��?�n4�]�83��e33io���v����-�B�=x_��"���������:G��-���k*�#�}4�T�F�������l���Z�3;"�m�0�i������t��#A�v�fr�*;m��Lm"}�e������(�W�3�2n�X�z�����h3��=�k�S�p"N;5M���������p��	p{
�#t�.����U�C+Hc�]�U�YK�/�)����#����ng���+v��N������v��~��Z���2	� �qn�sg�q��������E�6Q��H�-�h�
�#���1G�[0T{x�-�m�V�)wfjy��a��0A:�f�-GT A��]4�z�[Cg�����U����Z�{r�����9�W��y�����a����t�m?��S �
L_�7������=:�d�S�G1F����V�Oq\���`r� 
�Y�m����y���G�������
3-�\96a��9�x@�
3���0������/z�f�?1S�`��H��'�5�j�"$�*�S��{;s�^8����d)��<���	�LM�-�q ���q�J����]H^�nF=���
=���b�f4F���6�g��WHt
qN���lh.��Z�p�L;vRB�M�����A�
�v�����f��c'���H��S������%��Hy>)M�����Y!���B��~�9�~�\}9���W��7W��A�S�����\�Gd3e�p������.�MA=B'N�9��l���&{V�W�������x��B8_Jn<V8D��c���wIp�������(��$"��h�
���9
�y�����Y�F�����-�O�����qf��E����;�v$w9�JBK�M��E�i�=F��0�D��)
Z����L"�	
g4!����vKcq�*�#d!~�
MZdiv�e����+}�T�GP�_��1��H�GP\}��f8�f`���Q�H�9������(-lgE4�;��������L��%��a
���C����l�D�����]	�{���	8�*>����S�[4	�&�>�[�u8��������b�F��H���7�������?[��;�����V{���-����x?�J5�A����p:o$/���������t�0�����Z������s������?�;M���at����3��Dc��*��������
N�1�G�UQ��)vR��[�d��!��IW�N����Ae�� ��[� i���Nt	0�mgu���4�G���l���/�,mYms���=������3~�\��s���X2+���������|�1	3Z��1D4��X	��&���HuO�i<�w������j���������{
Y��;H
���b��;
2{�1M��j:����u"��t��N����o�&r$e�;���m��g�N���������\���vT\�q�@��tK�k���o?#m>��%��
;�Eg��B�f��P	����2�rCO��KTM��d8\��
Mj{/��E��3�@���:�H���[j������;\d=���TuwO���V`���Gh��A����M���X�d�r`5������)D��X��;\};�Y�f/�	H�B:)�	VBnz/��� ��I<�~��\=�(��B�Y����;���;���wy���@	��p�)	:�)��A���'/�5�Y�{����dg�c}_���{s����������lcp
�����at�j�;RU�T��w�����������uw�nm�����x2q�%j��z/��>q�zGZ�z��VBc�w���qpu�^�%4�f�[*{��n�����q3�A.����O���{hO�^H0�t�Y�
�
�D�&%4�w�
4�E#��K[���@zC������y*����9F�Vh�=�������D��t���D�<e���D���?�(�������������+���H��w�0�K�-�s%�Zg���S���-�d2tG�QZw�U�����c,�����{vJ�`��n^l�C�{!Y1�5��"��t�9�����;R��+x	h���E�zm�*���j�Of�9d������1;{F�`m�������enF��.����O'n�GA������0�b#�w���[;Hs�mY��`,� +Q�=0V����H����B�$���x3���������K�-7�Ot
�fe������d���OwG�bE�����]������h=����9y���� ���(�.s�F{��~0>���`��R2j�����n�����b%���������|z�h�����S���O�Nv��e��O�)��
�{������m#���B��D���S@�D���
;8����V��{���n����0m���	4����'{tn(��V��.�.�EBb�f*
C����B�#d'�w�6�Tq���S�9D@Y)M�H����9<0w����Nh�vR,p����e�IR*��1�S�L�����k��H��S�c���q����|*��j7T��:�8�#j
�h���H����l�"���5	�/5~B/x�k+�^�UH�B�;RSej�Pg��?9�;Q�#�o	�����e�m��1-���K�`�P�h��SM1��2e�d�w�&�8G#q(�;0��8EX�]SI����b����9��bZB��J������K�2�w1�����bC��t�*I	��K~��6@(�?�����t�Aj��]���Eh�,G�CI���?pln^k2�Pv��>RG9d�� ����C�jV	H���>�p�r�3���2�V�p���L��73���6H��"���R'?�m��i�V1A�{�,; ��Fl��u�;�v~BB��^HI>�;Ho�����h�0���SXB����a/\��=#^�w"w�]����d���x��`W�l'���"��:���$�@�
9�u7lK#��8"DX���s&�����>���>-���5f�+��'�yql
�s�+	����A��,�8�s��i�Qb�;����	*���+����:�ev�vU=�p)�ce�y`L����/���C�lW�h�0H��v���T�[��P���1m|�a5t�5.����i�@VQ��.����a<��##�]�a��4F�����i!-%��l�
���E|�~�N
��8����q�"<���v�3lV�#�c9��}j���Z�0�)����&�Z���#��dc?G h}|�H�E��uD����I�{�������[�]�?�%gd����W�-D��
G���V�jo�n����T��}�F���B����8NCD���M���,���f�
�D�eR�^z�3P�sR�T�-�l�9�#k�����]�#�x�`�n3���WD��\8�r�g��^L��p�Mv6�������n9=���t��������@D��!�������_w�5��W��{hT�_YS�t4�@0h��gQ����;��;���2����fd�:bj��D�^��}{��

���*����B�6u��1���)�����67>�C�0z�=��3�sj��+c^0<�����Wa����+Y�,}��&c��i��~X>��1e�
����Q����i�>11�:�d��|V������k�2�h�W���v�v���/�`��rt��64���|A��q�����^e�1S�C���g�Y� ����:>��>z$�@JkYq+��=u�#�IY��K�g��� @�Qh�{!K�i^f?�I��'��u��?�L4X�!����@UU�Nw~>e3��(}���H(%��T�Z��E�V#����N��:�������*p� Z4�!FD/�R�������l��kKRT�:���G��{�O>�gw�v�����9������%�r�[y���V�
C�[rt?�?(�+ims���^ueu�c�n��W�0��F���O��w��-�*@�
�x<�W$i��F�]���xN,���#[��u�I����l��
�L��q�A%�A&�`#s�]��f35�z/!xf_em��E�`	?�h�
O����*$�~�Z%�^l���?�����,���&�������U�"M2�L���]��,������U����G�w9R��w���>��$������x8���*z��sp�c*8~�lv��E�j������~e��j6P?�����6�����Y2A6	�t���9	����m����z�x�'�Y���Y��i$KT�7����m�����F���i�J�p����f�9���������fL��\�N`cU���F���p�U�U�����)���]��=��JM^�3�����@8r>q������EHs|t6Ml��r�ep�'��&�-[���F�Ys6�������<�m�($���1]�C#�`{���hx0�����:*q�	�$6��-O��ws��,�PHG+�����	�.:U��'�:���vs�����N����n���Vr3K�&����I[%�h�v��2{
j�`�SED�Tt��"�}[�ul��P�e��G�u2 ����'�/bF7���2v��je��&�"8Z�y���wa�h�U��������'��4,���Q��~�xo����[�e��cw��������y~����a��vh�}@:x��cJ�/9�AVK���h�B//��<��n�?�.�:D�0��:`6\�<\�������H��6�;f_;�����f����glV��k�i�4����	���<�*�X���Fy��	��U��42����: :���\��*Ftw6��c������\�lc���?a �;R���f8N+���=
(j�;g;���}�E��&�e�ri�[l�^/�p�w�Iv ����^��z�Bf��BB�P���]��Es���������g��?8�:�~%G,�&�a���m\�1��M�$�|�c���&x��g���.&�4#�W3��U���w���a�v�& ����q���	Ph�qGL=*��Z��v ���v������F`pf'��r�:&��D�n���� Kx�	��
�X��5kCe�M�A:��n"6���6�����9�AZ�"5Y��-�N�xP@]�h��X	�q�Y��	�9�a�R���|�n��cBWm�������-�PBB4P��i�?6�gj4�K����[�R�lC���=�zq���rX4�GJ��T����5X�@4uMT�h�8
�&KO��!kD�jw����2��������s����Y����5w���=���BJzl����Or��=6����G@�D�5i�U������p��+?3u�� ���������O�
rg$Z��6��T"�y�3���w�$5l�@��d��-�h=������.�z�Q��Ev��p#�u�[��h�9����}jV�:������FI��SQ�%�������P5k�w'Ct�J��q�8�6���^����/r��]��@>9��.zN�Vm��@�K�,Dm�nG'�,���;�:���������f����p����|��l4P����jx�:��m���@�RZP��x�gS��!�q��)4���V���f7������w�@/;v'S+�Y�������(�X�!���!�	��������`:m�60"W�L4!�R#�Z��bL.4?Mb4HS0�t,��������y|taS��w��O��'f���$d���lE�?l�a�_i���Z�vA�b��#��1��{����h�}��6�}I�#�aM��>�J����!��h�?��F�m�BK���2�X���2�����4��U�e�f+��������8f���
Q�^��S�1b��OOq��) ��Bb�7Y����
O�O�>�.]C��9�Dg] 1�U�o��&�"t�h0�b��5r�����ok��af��E@a����A�J��`A�h(�=����Q��I��Ew5�vgR�=8tnPv�<f�gN�OD�ra��B�f?���R�w���Y���l(�<���[�4�.�2�P6�[]��+K+�J�a�����A#�	�n��F4����9�g���@�xL8f����W]���-f�a���T�0Y�j<&�
��8UF��x|"��&e���=��'��-��i�p�������������1�CHG:H� �N��!d�7��Mv���� c��o�mC��D��'�p�~K��]b�����Z���e�b���Cj��-���TI!�Q-�i�iH��Q����3���Xs����L� ��|n,�{$�<����
�XF��a��|�G9����6��t�U�C�K�%����������~R'�!�����l�5�],�>��/h����o�����F��ua8���3l%���#.5���`�
_(�z����M7�o��;j�j������������%�
�-*��k�����E��p6w�����#����CH:�!ni�Dy����C(�?r��6h,��yy� Xd��@���W'S�OuV�)m�'���B�?��	��e� KF6{�8lC��F�Z
��3l�4?������	6�Rg����)���<Y��p�!�C��nGF�T`=���Vn#�_g��������]i���.TbG��0 �c
������i,���~��x���2��C�8���}��,�%�yt�F#�7�$:�&L���g2��Vw~���|�hQ��p�u4Dm�j�51'#,v������T[��G���s��KX!��()�8�+��z#�h�[A��^�?�;����;3
�}�;lS��SX����X����;�e���"�%��!D@ej�a+&�#��qLx��r uG��sklz��������p����fG�
Q�zd���)��$X�:|��n3������(�"?��hk�"��q8|"*1�Q�d^Lk#���!V��9�?�:�M9����S�M�";�l���Q�v
QpeI��
��5=�;��� #���:���
��e^��".)����s�� �c�qC��$+���e0�,�7�~p������|�GZ�����2Nq�)�C���H�����)�ay�����:L d������[��h��N���9G���a�6+(4a��`���zL�'�Hs��]�`������]����u"��\/�#9��>9$dA��A�s�������4�@���}���'����#d\��2�N�_(U4I�!de�t�u6���h��4Fe����QD{):BTbO#|��	 p���>[IdOA���%2l��J�w��4��b��sR��i&r���J�;4�P_s6���f7�������Y�C���@���-��=?�#>BGFa��O��:�����n��13�2$�g����"��9\�m{ZG�\����cwP���:.�`(M��7���UZ�kM��e"�b,u;2��c����/q� ��3/{W�N	����m��+�f �*ZO!
X��4u�5f��� ��P"����w:�b
H�=��p���� j�g�8��dI��ReO����'���F��h��n�C�I	\���l�8��@]Gt��%k�Z�0�m�i��9=�}�#2]���0&�a��H^�=��[�3i��@�^X����6������va@������a�_$�9��N��(���lAFh\9����}���rvQ�4$3���6���!�P.)9?l)�z2	f���G;<��*A�B�m�#���1����J��Gv��:�x�X�����\k�`3�8�!s���t�CvD�@�P&�|�@RC{
q�*��xi�����Kw�f&��Ih�$k���`����8�-��n�������ND�y	p����2�%�A�A��+)<)��"QvTu/��|�UbI�r$DY��7�h�.A���/-E��Q��l����#j�/�@#����Dm��5#`|	V�>vE%�*�8J���\1 ��6zQ�}��
�x������V�%��b%�Q����o�����j-�
G�%�@�f�;LV�%��(y��BX�EApmR���pQ�vY��$��*�[`	\�)j	M@��/��4��-'A��9�u��� ju��L���o	o����S�c�$���a�TwxUW<����3KP�Q���p,��,r<w	���#�� Qsu	������������e
��x|������������k)i���AK*"���g!�K�M�,�r�����`���� 	����.����T!:$,c�����}[|�c�;����q|����Al�`Q{r����7[3�%�J���L��<d�1�j�y�� Z3�<�+�f2%�Q���e�A�����.����{���Y���CJk��$fR�C�{5�sq��X��>Mn7b�H4c�/��bc������o*$l�3nA�>��������PA�Y|	� t���5�jZ�,"�P�����K�D�$K�����/"��"<����I���A	��	�gv�8h0�NV�
����y�;`��	�(tW���(��d?�m�[n�\0��::E�R�|_2�2!�Zvk4���0#����)�~������8	k�C��G����	~=�K&�Q��Su�����VA�	��:�����G������#���Fc$�?a�i��\����S#ZQP��]�wo��m�1�X}U��D�p�I��
	��[Q���#o�e�D!"��Z'Ri��z	��eK&)@
����%��VEHU	�IJ��[�p�����q�?�0���	��A�8�]��V�w�d��[8�vlB!�������`
�re���A��FL��Of�6��������]Fm?b�%/�o?�ACDN�L�m|�|N���[c���N��,d�#'��AU�H�����E�Sk�-�#s����`��5r��B;��=*�vio\����kx.o���i�H��dk�6a�����������v1o�G��$��~��B��}�"���]yM�H���4�x�@���?w��v~��=��[�E����k�Mhq�Oj��Y[����>�j��N����������-g?^��^����0�B#��,���h�����b�|�OmG���x��j������rGJO�_�D���(�F��Q��bB��y������_T�+"m��j/x�D����gJ��D�������aw��� T�4�j�������N�<��B:J�|�r�7H�il��-d��j����}�jRH�� �����sqD��m`y4�s
vt
�5�5�l3H��d�p[h�KU�,H�=�E����N����-��<Q�p���C�g_�q������"9�
���,g�[@�Q��n��z�F�����
�f�f����`z�x���e=a��XD��b�p���6��)M2AP��@T��c���~��A��������P����n�"1��q���>_�h�z$��R�Lw~2�n���NQ�%��e4���O^9��)�����E��
��Z���\A���{Y��
rzX���UP�K�,������4+����|�0�-|�d���:bQi����i��i�����N����$�[0^�[��3>�	���\�j����\�/Ax�e���.p��'$bd���2��`��9�n�z��;L�.&.��N%���������|�9b�l-���X���8�hrr��>�c�����I�� �h�<���|�������,��ws@�'�����6���c�D�[1��8b��-�J5y��=8�%j�'WG��X�T\���1b�>�NHl8[t�<6Z�F,i�������H���*	h�V�Op'Q\*�8���Yi�D(��{�����#��R�.��;q ����g�>��(`��|�&[�/[��������pD5���RE�~f��";!���UR0';�L������}����O,:���/�S��M�f9�
8��w��^��^	�Ad��)d���i&���APGX�4������=�sa��X�~�%�wA	��rOZ���"������uG�����_�l���.�C���m��O\i4�m�tQ�'��:�F�l��V,>)�t�0��j x,� �2Z��'�M���u�"D=�#A9��ee�\��\���`���(���qj�(<��������������:��xAV
!%��5"��V@��2L��cC8xF(���A���nE���j���{�q"��s�M���_�U�����?:u��r�{R�m!QN�d<��@����jD�<�g�o##��$ZJE?�o�Ev�aaF��#A^�-z����R���<�p��b�==K�:��Z[b�B[��O&�=���>S��t���&;0/�C���N""��tO��!��A��4y&\=����
�p�>?y�R�}���j�IH��r�8��R(�w{�x�\M�}v.�X"+]�R5��M�"5�qv����doJpP��I"�|�_�og��.���cx�X�v5��4>x�D�-r�=�=4$�X�?�'&�/F n�g�����$!��@P������G�����V�e�#���l�=��\���~���4b�-�����qGGLqzd>%_����mAj�h���I����0����|>��!�������i��k���#z��;\�j"�z�^'(��A6��[r>�P	X��t�WG�N������%m�w����Y��iE,.�!rj�k��i�>8nY�r�<:���]������(����cc�O)���;\g�����<�'"%�;H��^l�U!�;�=>����,a��b�����@�z���-9i���k���w`�n� ^��Tm�s����f5�f��
�	��[�Y���y�#}v��6{j��{�����Kq��LC7��R�$[�,\�y]���C��"��%�j�W�IzKr�~G�`Y����y�l���X!����wiG�L������k���|@������j����p��:���4)���f�G������hVf��	O���r��m��pn���j�3\�cIs�`z�����|�G%9���P�SfVJ�y	���%Z4Z�"YI��@��Mx	�u�O���a�w���;X�������9�f����.a��;R����t�9U'T��b��c�y���4���(%����_�4�����Z���Xn?�JAQ���I8����.a��	�^h�p1�h6�5�����pBD6��T��j��k��bF�T��:�p0�dF����m��b{� ���aE7��ieT�
.(N���r��	����G��^�x[tj�@hX9D��U�O���$iq�#4��q�����������B�Y�H�<�
����^v	?��~_s�����L��w��N	���95���p/C�S
����+��bx�����3�lgw�g�D
��ly�=�?�/��e{������2�p�6G���6l����������mTBU9	-�9~�=z�+�~�������D�U�B�5���#�����;}���;�4Pj�`q�����h\H���D�&]���a���|�Q�W>9�G�(��n��
�H
{�����Q�jp����������5�����[l�D�T���U�D=>Z����C���q�d���{/B�DjQ��z�.����e�{	�r��8��H�PJ�^0Y���9$m:��'n~��D�b2j��G�^Kb����Y�?t'�Dm��8��L��R�<n]��H[����ea
T�*��'��JE�C����������^`������!:��j���7�kk~�v����)�$��{+j���Oiv�s��ko��'P'Y�}:vXbA�v�M
�W�iD�Jqtu���)d�CW6ND%B Fg�"PBQR��ek���P\Mu����VA$������P�.�)*6��yT��S�Y�z�LXmy�#x�������X��R�5(���U�ND��V)j����x��4R�5����.E��v�����:�E��&���X��ne��J`����R�nI1��/_���>�2���81��&��S�mD�S�����an�a�hw%>��S�i[�J��[N�X�E�Y�����g��}�F3�Q�@�F�D���#h�8����h�������pG{*x�k�K(����P��X%E���
5;O!���P�'.��[<����Cs�S�[)���mF4s�[�s/�8:�%|�����l����:#�[2e����;H-��o"��*�t-���{'��Qv�Y��wy��[��;|
��������g�;Ze������(&����>�M0���r������W��g[���q%��H������N�>>_DL(F1���������Rj>��@a����%�P�h������d
g^�%!�0T�����5�
������S�,���5������D�����;FU�<)���?�E����Eb�W��� ��N�= +�j�7�1�{	��]��}$�?�y��a��*x���ME���rQ(5X4d�^a#�p��dK�1�[��i4O"2�6����������2$�~A�?c���UgNPy�+��*��L<j��W!Z�#�uow�hV�fq�C��:�����J�y4��n���D;mB2?�S��P'R�V��q�kTT����rg�%����GD�!Q��{����c������V�j����k����,W���,������1���\Q*���T�@��m���El����BCg�l�f+\���N��b��Q1r�8U���*E��YI��G���h�i��T]�ei�-��!��&nu�{h�&t�C��nY5���/�Z����}Q�=�;�==4�=�����lG�$:%���O���+�����?������`��U���%�����C����d��XU��D[f��Q:�U��h�sa�\��E
�
3���	�x�%�DK�y�n�eB���o.�e��\�N�1�\�WR? d�Y�f���'�97������f}G����m��"Y�X������F�JO3�T��	APwwD�����������s����m�F<��O�]X$as����{��0�q�,X��/LGU�ms@�Sc���=��u+�G��M���\�������  ������,�c+���v(�u��EZ�I!��F�XQ�qv�1�'trq��FF��w���}���cY�q�q������+rGB��,	����H�����0�
���������
�<���	:O]�O�P���j�=���
��X�],������l;$a���UW�*��-
�*
"�T#I|���lTW'�u�#B�dF{W)]D�@T��C?5u�q��
�(��4G��g'�����:(�����
��g9��U���U�P�wP�+�������>��g���^�DN�B��%������^����f�yj�Au����%���jP���������5��+�GW�7��4��o�9)B�u
� t������Q�}�.C����-%����Y���rX7��5�
bvG�u�A��h���	�zZ�����z;�R����o{��3�@�A~���sI����|�I��i�
�����=-�j[��1����P�Jy��'�e[�	��@i�Z����3�'dai���J�N�+H-���h��$/@������/�r�?-�O�i��p�e5U3� �j�d�.2
�?-��[{��z	8�������"�W�R���ZU;j6
(��4
=�Q�d��DF�i���	��N3�p�<y%�Y�3���X�E�>�Q���B���s�Z�������`�����M,����$08�>��J��'��x���J��Z�-�P�m�?�1�%��M����-�P�f���`s�3����,�Q��3��CL<����|
l�1�,��/h�Y�~A�#m��N
���u�zd�-Fr��J�}���]��,�1��l1�:�b��#f]t��Q�i�����P������4��+�������4�D;���)K~t
7����b����x��MT���n��)$��J��Ci��e�7zA"$��0<�AJyl��%-gX��NwLr�b ����R ,�%�B���f\yj��Zf���8�m��fRck\�#9l�DZ��Y�(�}Pf���*���x@��f@BH/�[��DUT��X*����p�v�FP����5�����L��c�?+��rPj	�PEz�J���b���������6;�K6��}�F)��R����������#>��;�_%*�U��?�xC=�k���@#F�n)DlVR�]���X3>��C���B�����x�������1�N�C����v���� �P��6C��-1��I:b*�B9�
LCX�6�!E���o�O/�`l=(����#D}���I!I�����|�v���6���������<�XC7.�a�G!R��~d&�h�wX��������w��C[��@��O��Y�($F�W!�����shP47r�s����X/��J7�}�=�	��(P���Q:�[Q��^��Ql�d�U�����9���F*�/.����	��oE��:N2-oO��D�`7x�T9t��+�7d:��X���A�=8��k�)�tEj�^C �e�����
-��I�L��0��st�"�r�%fkM)� ��#��W�-gcE�8��e�l��5U��4���@�8���`��G�D�R��/nH�L�zG�@����lL�-)�.�[�
<e;�u#	�R������3�����,�1������Bc��g����{"��#�kR�
���}�zI�E��4���aT��`��� y�9K����:W�����,)�%�<AF�U�F���'��9e������(}&����;`�R����)����a���Z9R�i����F�n�`9����
�~�����]�}4V^����N��:�nuCf���Er�O���ZV"���n��BV�#^JDp{A����U�Bn���utc�w<�����
�`�-�gXh����� �n]rMt�	��Y��]r�d_�qyn$q�D��E4X4���[L����@"A�$��SDz�h�9zE���z�j��_�K�������]
S	��4h��4�S�
0!p���i��;��>�����<i�{2K~7��hM�H������t�_7C!��
��W�}z���'�Y��Ae37�����.����>����u������z���?>H�M.7�e�zz�:��|�����.����^1k����K�:����Q�b|Z����~*��'M���U�y��
�	3��	n������������%�/YZG���n��]�P�3������E�H�4�gG��OO��7��H�_�-x�����F�D�w�����|\�;��G�����H�_0�<7����m���w��O������*����@V��V~���F��["�If�Ul����=��P����������d���#��!4k��j�7������%��.���k����Q)��=������m��/jG7�BbF��������5<�P�2��Gm������"�tz���JFr���h��x�F��mtb���"h2@w$�A�
��l�O���t�b�#�����]�[���}���V���<���]�`T�A	��:�V3�04�`������)���=Y^�H�������^�5"%P�u�� V�H�<����~���-�>�/bc�8Ic����FQ"��*i��D��Mn��X���fk��s��,�~��}Dc&��m�Q[e#�#3�����u�A�?�����G`����
�a7�,��Ia���:`���f(�����I�9�Q��E����_�md�2L����~w�_���w�W���|<@1}�%�,fjS�$�1
�X1V@+��u�$��b��M���(��}���c����8r�g��A���Vy���X�cc���[������l6(���f����^��G*��e)l[F��?�@��.T�=�	J�	�;h�X����r��l������G���b?7'����iJa���i�`��3rs��w(f5�Y�d�}��Na�a�@��Jz�T��`g�	C�G�/�T�*�E�L#�E��`7�����h�'(O(��J�r,�d'���v�(H���]~/sse
����5"4X��6�h������8l��k3�����$��T�h�l,e�-�e;U����"EDiF��1
jg��D���(Y��9;N���WT�Nb�K�{0�����?�6D������GS�����z�s�)����f����]��Pz
��Px�A�Y:K
ct������{�
AL��G����f��h��,9�	p`��X+�����Q���li(6�e7�i�%�LC�>uoL��\���u��	�PA���Di���9�)��#���p���-uQ%9�L �.��R�T)sw�0w%�����������bC��
7;���?�HfUj�o�7P+l�l{4s�fj�i�B��x=S
��h�HXw�S�\����������
	~���h�W��>+���'dU������Q�t��+�B�c3aBuU��oV
y�����QX6ob��(���|F���O9{I�9y����{��~�8}
�5�[{���3���<�;u��2��p���U�+�js�NhV�PWP���_���Od�������PKv����i��F�I�n��E#����vEf�	�KF`���`'=��j*M���*�1*l��[@-�mBWE7q�n��1f��gE�8�)..Fc�:��12_M)�r\Ef3�
�AE��z��<�q�l�6L��#h~NFb��7-!��q19�h$�C�����f�h��e���=��,"c��>��:����n��m�;m��5�R�����`��4`�C��[��w�@�y�?0^���T��O�q�g�"71��ae�����EJ����i�B������4z�Q_y��q�}c��>���L�2��D�]��z<:��Z��-�����X����T����	K������y��K�������`'-:v�����Z�2�m���X�k�2F!"�Nq�f��>b�{�S��'b��'������Q�+j���i����Ocq�+"�>�i��C������X�/��d��'��{���}Ee�
b!����!
E�[}�?,t�Yq3�o�D����"�Y]Bi��D}�e�b������|h��J ��zEc��l�@F)�h�?E��Il������~�S�@�e�b�@��B�A���Oh6	�$8�ab�,�E�Q�dEq����Tf��+�a�Gu��#���1�Z����,�A��:$��XOF�QmE���}^#_q?"C�L��i����(�M�� X��1��/�Y������H���_��^����8��N�^]���/+P�ZA��W��3a���u�3�j����k&�-���$������K��J�g�L+�����"��g�e������}%{����}L5�� ���U}���T����(sA_qT��H��|�P���JP���Gx�2��3�A�e����KyF�����F���r��a�0K�N>h���q�h���r�!�@�
)����P��t7|�EY�m��+���7���T������H�����Z��hrP��V%��������@�e�������e�dfA+P�V9�����^t��fFZ+��+X�h�2i������H���{}:�J�+�����My,dT���`�g�����"\|���m���9�f�!�s�&
�+�HjZ���g�?���3�)���������������KQ��k��`�����_{Y'��:T���<$k����D#<3���������
��V4r���4b3�N:�Q�g����������,���iF��q
ZH�%(�e��x;X���o	���A����%mvz�q�[S���X����(!�2��,vT�O����m#	�f=��XfDd�F$��>/;��F��$��;�	d�{�2|+���{,����jv5`���d.��r??�-�z�
HA��N�WHq�M���
�]>���z����v<���������)�?�����u�.����h��f�z�n�Y��h�����-�������r U9�����B�R���+�l�h����~�6���]h��������E_X�
�#c�K����(�0��a��[�J�:c����w����E�>��yI��eY����QIK��"����C�����-�E	A;��l)d �	��������(���Jy��c�N*������q2[-Z��x��3��Ns����m�qj�����l�� �b,�j'L���}B�4v�rv"���X&��;Z
T�	��i-=�����0@�$��_��w�� ��FX�����GR����$7`!��o��rE���/jn�H�������TSZXA4@G�=��Fcr:@{er��8�_�qX�a|�U��5V�'6������.{O�mY�h����*j>�����	'>�~����`e\Ya�^����\Ve $�Yv6P�C�<��a'�IJ�fE��,Rz�Lbf�G����~��(�:�Jt�^_��F�^���$���J�v�����z�($�]����k����d�V*�����!��m�~�
�A��E~�nb�M@���}�;���`���V>/S���:���$�8�>P0���T��-������Y�)g�G�b�+E0��q����h��{YS����V�
ISkQ/v����`h@�nx�����k���)����gl!02 ���&�5���>�[���g8��n$��5*�2V=��y=4v�
Pp��LZwb�� ?�<����a�@���E�hB��'�<��	���O�6#kEu|'���Y�hF�}�T�:�.|���)A���X��	� �{����!;����p*��<�~$���FXH@t0R�)Q��7Q�����&V2��f��3\t<���701���"xJ,��P?�����c�@�-h��Q�p ��%��u�#2�	�����1P[R{�,�47�BN��[���H���]����:���"�t�����[��
�P�J�_{<�W���7D�f��Y��rs8H��XD��F�������9l.��sf�!�1��iY�fB�NP�=��iw��8���rN�	Ut�w4k�
��e��x�q`��i���b!�I�RO����
�U�R�ZI�d��'K�����Tz������
��N�lz=����:���~���`�L�[������D������x�N����k���osFT*wn ��Q�) TH���LE�VK�~�L�}0a�I��*��.E�Ut�����i
J~8I_`e��a���R
�L�L�t"N�D:�����.gmg��\���@a�Q'I�v"��I�z;�S���$���
�E�� ��lt
������r��o1�Q���j�������n���Op�&sPy%<�8�����xF1�����e|ol�� �%�:Z�#1�.V��. ��+m��zRa�0�������I������fuF���o��;Fnh������\*��5�4}vT.�F6�������������<����?���Vm���U��4����'�sc���7����BaS3ApPNhO
��0�s��2eG��C�#�U~�2~ ���
N�lw>4I������t�Nuf9qN�����[��j#	���/��;������c�_�L�����n;�]��)�(�'���^��~����#+>�6�W�x��x/����w�7���x_w��*�`��>�@dn��J���0
�	"��{��LkD�!BL@G�^��u�I\��q�������(�����7�i�^���:K=�.�5��J������A�DI��&?^dr�7w�a���}�M���`"-��Y��:p��;���<%�=�#2� �Om�^{/��t/����=��Q���^"�=��^���JDV���A]:,�y[�3bKW���(��Pt�+xA������ ��������t��N��;��]����d�`��?�	B�����4�Rj�C���
��D:+`�8$TeJK�.�)�S��g���h��R�������6�M��%O�4����R�,zGZ��X��|�C4i&"��S�9L��k������
tw��	�kT�hq�G�w���;2�I;��	��kd?�����sG���*!TD-a �����t���z�v��i��4�DpV %�����x	8p7��^��;��h�480Y�ip@ ����;��JV�P�\a�u��F�`�����~�3���U5�$�g��j_OH�b����^�lu�_��TX
�ow��	R�I"���]��G���"��{
�O���U%��;:�4�J�������]aXW&
|{�3��m��V-Gt���V�����\-}6#���rNW6��@
���
;^��c�����|b/��8h��A�B��p8��
�Au/���\W��g���'�,l�uK�������p�G�o{�.'���^��~���+�f�3t�_�F�����;|�-IR%������9+�2�j�(�J*?���v�|��0��w�����
#����!����mr��������N����u�|��V�S�^�5����������,5����`����V���hU��t]V w�#���	OP�Y�X0��Rt(I��p.:�#�E�|������Zx���$`��A9FJ�9�"-��D�E1 	e�o������PL2Q�p��@qE�^bZ�o �	����)��U���@����[3ZVK�l��~l�����L�5��;�6�r���/Sp��v�P�Qj�"oeTp�������;4��B`��f��{��r+n��;��{���x���
����Tw������h�E,��A�.XRZ���@=�e���J"8}8b6���T_@|yZ��>�n��"Wy��~/d���|��,l&X8��\�n����]��k<�E�n`I��#\���+}����S9\��Q�D2�����V�4���[{�Z��B�MQ$q��
)��'��.;�������m+I(*7 B|/dP@�����3> ����=C�s@G�r��T���\�e�����V���	�'!d��
��ACp���i�%va��;���2F��#6h����d��K
�`V�w��6qtD�_#�w�V�^(�	��F,�|"fcl�2�1��:wd\��V�t���e�9^.p	Gs$".�"h[�6�C��q{/�����*l�6:7�����������V�����p�o{VY���bh��U!�D����[��@~��Y��d$;�����l���HN�r���Zv�uu�����m��e���v_v��������c��������L<���B���&kRJ�����*(6�b�����{
,@��d��*��Zrhty��X�;:�E ����g��~�h��R�=����V�"�-���xm
�%��;<<�Cq%��U��N��b�{!�����W{��>���8����o�����
<��e5���E����X���-�RW�j�	�]�Q���OH���F�2r�U�=p���� ]5��0��e�1	4P�!��8-�6���������!M����y~��c��QOcA�w����_�h�S��X9�o�6�xLU�Rf^s�����A�g��f�2g
���a`�t�x���S� ���+D�����OaD;�����S�I~��S�W�e��F���{5�J���5���}���-h
��.���s�;<h�LE����5&Cb��Z+K�����S,k����x3?�0��+��!hUS[R��xf�kX-u�Ej����;�[�,�P�C��d����=�e}VWy��g?��r;$#{���������s�
���2~����������G�GVND-p'N��I�����9#O�3�����$8T��
wy�=���D���#Q�D/��v���[�s�\
��a��5��~�`�I�$O�"E8b\��<dqd�����:��7�����u�d��!�J��n�:^����,�2.�gI�U+��w�@�b6���'�>�:�9l�J�	DP���<��Dp��0��Ve��iu�sN(�]��6	k�������|��1����Xg�z#��_��Y,�����#4�
+�������<��5���@/���M��w;+�,M���$�_�����FT�y&Ci���>(�6"��R�O�"W��L~����~���w+�u��F�p��|�t@����^���[T�cfZ�jtB�����)mg�C����0��hJ�#]�x���o��D|��*�GY
P�����A������? �����-88�	�Y!���A�"�s8�bp�_���R�u�
�b�i��y����w�q	k�e�il�������HK$le,�����dq��B�D��(����7t�����R��%]^3�t
B9�u� �]I�<1���$V�(�����1#(l_;��k[��<��5c
��'����"�E!�b6c�/bJ1A���"��
,���_gPU��
��'��^SM�ZRK�KoO��(��h�nO���V������r)�(�1��Q��������T�4�u�la�(:	�fw���KK3^��g����,S��U��� K4�p��n���w��:T��H"�.*���R��q�E q��h��"�Wd|��^cH���	�"�Z��0GwTf�#f������5s����jL�j��$��|��������a�Pa���N���h$���� i�wPT'��S�m�
�^����Z,��{�T��a�c�l�Z���������h�������DI]��9+ZK.E����4����fe���,F�t�CW���U�R��� ��Un�2�Jn�f|G�zs�����b��x���5�[OdG��<9%	%���:��������7*�{|�S'p!p�%�Y���<j�������w
�H��\��s�a(�#4+��,�0W�#=o�+�}����H�����������������#�E	�����7>�� ��w�y��I��O	�=�������m�8��������Dn
�AQO�����o�hxRb�GrG
���fi�.���B��*�f�Y������6>1�Lkj�#�Q341�d�_�2�J����������������H^��F;n-b�M���P|��)��n�\`v�Nj un�V��q9laZa�)%���DzhH����$E�D��;"���^��MA-�f,b"qFK��"k;��1���|�>��N�x5!j��aia�(9h�|D���f�AJp6O�5h�h���g�sf���Y��� O�p����c�x3�z� >�.,��7��	N|q����e���m���T��y�f��CbT���q���U�}�J�������_�kX;e�����0�R;!�1'�b0�?�!j�V5���U7�0�����7��T'���aS_��I��5��H���4#���'���`#��'�Y�RAn�8�"�
;��d��?&��c�$r� :��o_����f�p���A�N�3O��|��
�`o~aI
=��2���8yWgxt!7���I�=���w���m������g�et#m����'z��t~>=�]~�UD�1��z-����@\�,"��N��:B�{L��W�Z^�i��&�YA
�$>�#*g7Q���Gw!�q��_F����U���u7 ��t��v�M��]&O�(+���B������AS������a��	r�fVR���)G��`s-�
D�����$�A��
}���-�{�&h��T�"�X*��i���"y�w�y!��JX�]�U�,S��'d8Ay�bq���H�B�A��Eq��u�����r��E/�S�'nA�	�)
�E��"�UA�M]#{\���4����h���2�f��������H��%
��"i��o5|X=k%1%��uzg�A��D��(��$u�����v	5�{��5�e�05����q�H{7�
[�g�������>z�l"P2s���y{~aH�� �PEm��V�<@c~������(!�cO���j1��eAK=9��
�1	���|�9)>����-W+�]&(6��lq���	{�����?;+=(�=��.w��N�g+�b��j�/k�LZ����)�{���g���
�U'1D���'��xx���lv%f9���P�1bv�z� ��nL@e��3������1�O��2���i�`J{�k�.CiWu�'���~:u�$$2S��BBm��E�rH���a^T=i���l1���nH���H���������
r;F����rD����7�$o|*����kNv���d����9���j%������0<P|z���ad`#��x~���]j�
�_��r�l��T�;
���NG��'N�pO+���#��f���5��!&����8��p����,Cv�>.�FU #�-����A#���F�(?����b��Q����0��~�@J=��C	
F�vz�2zG_2���]*U9,na ��=t�Q�$3�>P��\C���A��F�\��@��0&�3*�4�@�F������mP����3;�k=ZbB�D��rNm:y��?�I��4Z�D�E���
�z-;h�"�P;v���-PN��F4�t@(�������U�������4
ht��rCw�������a��a�`�+����b�����t1RF���}�b2������F�	�3FR��
G�I�$��uY�O�tq0,�-��J������D�����P,�J�V����H�}�BNQ���4F�Zh����@��d���9������i�e����%�)���%�+�~=,fG�����1�bS�I����'X�I�@S#r���^�H�����\��������p�����vh4C�T��;BLGP�
�4�n�S�-���QG�+Pb�$�,�X�*z���0Dt���.�,�5	k��lz���.aG��)�����>P�h���1���@y$Z���b�Xn0��������q��9�x����g�����GU�-���
�g�x���#NJ�FW�S���[%9!!�0^!S��1�&����g�b�i���*[��X2��za�m;�A0T1%���~�%�������`���&{����9�NK�F+�E�R�oV�n4�X9��������Gl����0�����9Xg+��|��f+Y�,�7Al��e�.��J=�F�
��lG��q��/	y�w��'
�;��lS�I����O���m����46!"�Rv��:h2�HC0���������!� 	n���|�>R
.E�#���o�
'����@�zw����E��U*<f=K�sEtf<�1���\��'�3f������cE3��m}T�b��;��u�U�H�Yv>���Q�x7���1P�v���aCp�,�������\?�rwS�k'�����	P��� �e�`��U����$�Y��^$o[����%��4t!�
5E���~�������Qf�H�9
bT�A�F-&B���_�#s�	����(���3[Z;^��R��
9p�	����s=�����UR��cV2n�L�9�lf6�Z�cH�4�n;���������=�3-�Nm��Yn�����X��O�1_�{�H��=�at���`s����'j���)Ie�-��|���q��,�QA8X�s^8�H���{z��������O�������0#�8B+���d��N�3�0T����t�%���C��9��s�����@�������W4Md
$����s��}�F5��o�*��5�;��si`g�(&�-���9{@>����0�y��j�8��1��p'�Z�rOa
�i0�^�M�D����ae^����Hj��}�9�`�����IeK�_(5�����\	9l����<��N7Q'{�Pc�9�D(6�DD�IP��RV4v�H.��
�H��b�+C��g�le��B��}�2fz�"5��?����B���DL�M���\��~l�L2u��XX��x!����D��nq���v'�B�����+��w���>9����!��4����7lp������M�����b�^9�F�L�2:MP�c��1��?T�>
m��:Y�o0c�[N.5���+���j~�j������/��jFA�V�����i��"�`�S����>gn���AST��\I�����79�T���P�/vE%1wZ������P|=!95e�_�"��5K$�
� }�����%6t���<h�V7W-s���>�D
eH,��j�eB�w�ytX?���E
�e�A�F=�|��;���EGPtO6�K���/�[�
w[�^G6�U~�>u�C��� D��B}�}7�����+pB.Yh���������>W���e*:�-��D�N�W|�������5y��� ��-5:*�W��<�j
O�y���cv��j�X�w��o<���Hd��ZL3G	�U�(RW:u���F�����|E�3�W|$`7���V�R�
kv�FS�E�zWjy�I� ���xz���QWh��fz���Z�N;������A$�����f�t��+��Y"�e���{�2
��E��,������[�
P�����:�R�(��\4������uu�����e��dh����S����m���-�
��k�~|oP~��dm:��D�qu��!�VSo}iQP  v�,tb�J��F{������&����h����X+r���M�
y;��t2��2� -��g���`��� V�J
��K�{9������Lg+Dj_�~@��e�ATFi)�E����&'h�ab���8�-^RY�5�Z;�f����G�_h�n��JZ������TV��LJ���}D^��dp&/�����,�*T��={�	�|�m���
���J��x��		E�RX(�U.�r�g*��B��,�|F��?`l���X��v��m����nc��ml��?W��[�s����I:V��Y?
�f��]�Zt�N��$����QM��GK�Q	%<��d�������gJg�n��l�����#Q�y��h,���T�����T�l-�WT$K[�&T��m������e�����+���!^�Jf���z[%�Q�>jkE_�	QM;���Kb���e�*���K�tb����
o�<����|�������Jl�
��y�r`;�����(���?�"�p��Ck����Y�
x�@�m���G��I�n�$��=��X�������%���C���gDf!]���D;��|^��:jR���.���6��_n�P*��)$p�Bw������H�������foZ���0~�_^����a��
�v��}������9�2!���7�4Z�Hh����7������5#QG�8��@����9d�$��@��t�\v������}k�����c5t����m�+J��0����!X�c�����S��6���z;e������C�v��2l�������v�������|'-B��=y_]����o���c��*��hmJ��	��EE����wA>����g�����_l�FYqWuyyYo����+�-��;2V���B"����m1����.��#������cKo2l��b���m����i���,hv�����H��!����mLC);�b(]�Z���c����
���C�0�J�Y��W�'{z�9������^p%3)�������Y�it�L�DF��z�n��A*����A2O�zu�p�=�!��6��XI��$B@M�mC�0i)*j�n�FNDjZ�_������6'&U`n����Rj5���K
6�����C��,`�!��^�n5�$D��\H����C7;��]��?;�.�\����9[-]l[�����l�zg�������Y���N�@��m�Bi�������FC�:����q��^l��'i#���A
��,�P���KD���q�AA�$�A�@,� .W	D�����X���3}��-�&��KJ�RT���,��s�T��v��r�#
�6j!	cn��}��$�^%��9Z��h}W^�ta����f��������������y�n,7:�"���N�(�Q��DQAx���o���T"��y~��
S����p�G��1���\'y�r|i\f�<9I�@���szb�~O[y��!2J,91y�n���#o$t�/�
r%���'����'I���K:|{�B*:��'Cn5��m��}G�h�D^'>N�=e���v�ef��.����'fN���U���^gHB�AWDi=5��D@�4Yc+�
�l�[Z�����w�bX����,0%f����hK0!���E')�������3Lw��85M��u���QC���
�������bC�)���(�:F"�*�s-
Z8��`K�A�F�_i�!B�O*�����>������i�&���b�jq��CuBO*f��\M��Z6��$!��%�A���@�('P�}y,��$�5�N")�v���X��	������v�*\��sP��}\�V�;YA,�c�A�����W}�9l3rqy`���I��u4��t>c;��o��.;��������$~Mv�����y$�}��B�fPpVa]PS�������X8������Q������-�5f��Qhp�&�r�6��l�%ed�����Z��1c�����sh�X�(���
�����RJ�({t><��'�F��c	��eJ�R������������H��
{�S�0�g�F`�Y�Ci��PT�����e���F4�����>�����e�2�0�c�A��WC
���JX����d4�������Q������	
?Hv�����1� ��(����c�A\T�����6��������:���
MfR:;��EcN<���UP�]�D�lA�^B`�D9;MhU�_5������|Na�a�b~��8�QL�|�X���EY5z���i`Bl��:�F"�h�����2��s�![�A�Fz��,+���wh��R��g$B�#�L4�`Vm=VOyJt��xy^���+5��y�����$�N�n������A����p���	��^#��'1$��)�{��"7�_`�������^�&M|]�+�}��z���J�,M��p��Jd�jq�C��W�k����RuIT��LK����������F��2j����^c�5T���;��i�����N�j�.-�qYi���th��Z�5BR_R0�����}G��yO�'�_R!{�wx�h��;2
����[^���2�*��o����a����G�jh`��{�f�l*�?k�[.up�
Y���K-��%���pWD��lE��$�����w���{�S�^t����&���B�$�GzG��C8\b�tg�-rp*O��p�����;si-e��~@�H����&9��\���w���;�L7�,�b����|����O*D%m�w�;���rm%')-�D�0j �-��2TTzdqc:"����{>�@4����t�H�m� �0��k��{�EK&z�F�q�>~��E:7����<I`W��Zg�5�_3U�V$�{�}��^��E���a��5����;�������G���{����7+��	;��3.8R�ui#�������������S�[����D���_7�<����3[�Vb�*�v���'l8yHsT��-+�T4��7����n���r�dW3�����l(�.��h���`~>
+�%�A)���y����Y����Wt/h!	�p�o��P��$C(�F.bd�'����B��!
�w�eCN�;P��z�a���y���.�Z-����AH��Fz���nb{C��{	�W����}�7�w�>y�f�;����� x? ��NRI����m���{!S������`o ���K���^!���i��z�$�"��S:����j�L�/}���xR�����F��W&��{y^��;�G���(P��]�b�0�����w�>*�O�/�����������l^�����%���0!H�_X}���>t�p"�
�(%��{��z�������.�V$z{���piP�RJ���c�d��wx�6�'YP|��9�Iy�����t[�w�#��R>�����$�"i�'obX�.gG6��a�Rd�1>S"k)�`�
d�C��g)�%��m_H��B��RT(\KN���>F��B���N��9�7�����G�b�B|Z�KN�������tP���xH�c��Oq��c���v[e���u]
�r�b�bZB6�q��^���������	D)-�J�/��c^��W%�g=MlP<�$�b#����G�J����X�w������F;:(�*Q����lX�8��bC|�6?t�d/�0�D'��%K<�l��`�rB��Zb�B��N�S�����RzJ8	�)RT�gT��|�,�S-�����oCn#��X�6�_����1=��ld��4��i����e�h����L������PJ�J:����c�~���D����$���0r����Zp�'������$<�������T�J:\nM��hj�(=PN�
�PxoHK��{�^�� b�+���^�8��yF��:���R�v,���It �X�s4�I�6%�B�0�SMV�����<�����'�:z\�bZfL��(*��A9N�y�S��!4�����(��}C&������6eP�������E.����-
eK$�e�~>���"�w�iSr?�a}"E�Ge�>�2�t����@5H)�q����I���������S!��R�{�����B��m]�5�s5U��O�8\3$,���D P��/�`�})8�z��c]QO����C���4�W�d*���;�6���d����R�m������dS��YCj"��;�&�& h��N2�!Za~��%Bl�
����`0�����8I�����h{}�O+V�����(!
(5-��#��'����w2�Hhg��0��TDl��06��g�����z}�_�Q��J@Bp2�k�$����v\Mx�d.�y1����[z��fk���b��
X��q���Bm�Zbk���9zv� +.�Q����j�BY�2!��a�?RK����}~m�M�H%nI�
o���P�x-�r���Cp����`��R���Z#
���oW��I��Z��u�k�#�9�K(F���"�+��#=�b���	����y���Rk����T~A�`F��j\B�R���7A�g_�P�}\�����K��BH 2/|���N���A?�:�n(RXF����)�1��(>R[r��!G��NY�x�(yG�GI
��0Q!�vzj�m�A/t�v��P�gt!C=�{�0��E���^�d$������ �%�*���f[C�������Ep�%�H�:(u���IZ�dQ��;�3�Uh(�5�S(��x��r�6��T\�*-����?��Sh�6�1�R�8�o(�}����:�cK�������]I������r+58�DbG�*���c�b�{����uO8+�����1���j���R�dHa#B�'z�2�"^+���K���u�w�������}bG� O���y,���8�Q�j����L�}
�W��51��C�_�sR
hM����&Y�����<8_+"	��O������5`R���/a�����dK�Kh�k8lA�q��Z����5b.q�S���i��&�g%�Y
��v�D^#�r
� �Ip�������^(�V�����^�S�][���'�:0^���y�A�3A�C���(��34C��M��xM92��'a$hS�����@��E���]��m$����-jD��3�z5�0n��,y�������^c��w��&�
'���^h�m�^�t��:���!-Qc|�>:�6�F�H3� w:%�!}	��C#���E@�j�"�ET��P���
)���'n�'U���D�E(��K�e���A	�G)a	e3��
����=���M�\��r�C���4	U���W����P��h��$�cP�Zr��nM=��2��}.I�&�DK�*�Z���hP��+V�����P��[�������t���b-�Vc0)S�E�p;K��i�o0`�cX>`�x��>��1����
m���V�h ���r�DdO��(�Q5C��P.�����`&f-I��n��\�eot!��:�
��;���~�!U1�wvwg�H�9�$G(6��d�jB�w�#��k=*trokv�i�[�U��*��-?t!w�\e��~P��E���u������k��_�+�r�����!�P�\���d�I���a�������2�Z�	��=�p~���Al�L���7?���N��]�t���"Af3������^����[����z�t�jB��[|��d�� ����r�����&VB�
���ZJ*
V�����3�W��W�b��E���%eB+���-�XK���g��_S��oQZ|�D��7���l.��]h�������-�j���L(mM�[���t5���k�Q���WK��@~��Z�-X�c�)����\az�OW����n�D���FJ��K-a���������X�I]�	YT"�t[��<l ��=�ZA�v�A����)B	�*�X'-q3�[����y�0�F_g��S��T�|y.�%I�X�
9��*]����#���U#��3V)�,�Z�$���	�mQHk{w&+h�U����(B��0�4�:�?�a.�>5�S��y���Q�y�!��f����'�(]���w�L�����F�u|��>{rF6dj�d��?�y/�����}I���A��
�](P�)�zaW6���t�m�d�O��*�-L����P��s��x
/�cy��"@v��O�k[�G��X�0����
��t��_T'�q1��L�N��.
b�z7��"qK7���A��
k�]�d���9�u�F~�����!�o�'�B�2a�F:4�@	b�t�(����-F�e3�R �|��DP���F5l��u��u�~�A9v��P���2Gu��M�����:�T�#�e`h��qb�3I�Z�v���U7��:��?X����dQ��Dg�����=��i�8�Y�ic�?�;�8Y��V��G\�v��'-��O����y�.��>�Wd���I�@��~����,��\7���Zy<����z��y������\1z�������-q��t���^���!+CZ�+���{}�o�N�|��=�P}~YE�N��S��D[�P�����l��d������Pf������O���`;F�����[H�W�`&�|��
��&r�9���EDD��n|C����[�zR;(��L���q�������� ��eh��&Q��&q7��P����Z�'�B�����������I��}���n0C0���x�jZ1��nD���c����:�*\]���woKif�
E�����qQ�aa��R=/�#�~X��y,�=���5d���SO���������;������-�6��-��5�tZz|�j������8b�-?nI6;5�qu>��Q�r_��������}����[r�%&�5�R���g0�����?XI�`�>��U��z���D����;�����J�w�P�����W	�$�6�a�:p�P�R�%�3�f�`^4��������,�A
U��/]���v���+���(���Fe;H��0x��q����x���ThJK�%K
��o5d!�z��>c4U[h���S�����U���BD���~r�p��v+�����w�>�baoQ>r�`2�n�B���:[u�iZ��&����
���	�dJ'�Q�t���Ln���<��$?n���i�A�������Hrv�2�Q{����[��|"��|w�He;4��}cP%t�a�� ������$.�B���x
Q���;��;�8�*>����[��a+���'��7�� ����`����2��H	2#:5Mu�>��vg�����ls���P��3��s4�S�8h&��W9os���������fl�Q�[u�n�?P�{��M�O�]h_F(����FH�����X�����D�c��h��9��f����P��lZ��x>�Tq4[D��'t|W�F�@,�r��
H@sZEc|,P����#�Nbp ������(
5jG���#�$<��C�oW�!�y�E�����d�h��$�S�����n������y^�n�>j��!�h�$��T� 
���'�m1	;���m/t�#$b�8������� ��a0#.���33H����D6~M��5�.T+652qib��Y��I&�F
���	|�[��{x�9�<��i�/R�BK��������<��V0���U��/��B3GPU8�l�%]"�v'~�������:f������:�9AV���35����",Nn����RP��������Ib�����o��i�E���+Aw!�!�06������>=D��&T(��`��5�������s-�"�<������sm!�!yM�[�R�����m)KTB�������=Yt�E�m�veQ��?"��B=C�"@�^GZ�����a$�>N����)�8�����^�a&�����0�p���I�4#PJy�u��E��c"�7�>��u�`x�8�a��sX%�}���1���XB�z��=a	�@���MN �B���P��L��?�0�XA���lYUuM���~����Wc	��O4r�3���K��}bP��x~:d���x���A:4�x� ��e>�}� +gu"]�a�4�P��:
=�Y��NL�4��=�L"
��M
)������4(���K�c��p�iH��ju&�C3�.��|���L����Pn^��o�����_'s��_$�-=(K|r����X�@�����p&}f�&�����������E�'���������������
l�7� !�U���;�;(�F�hw���e.�6H��.aN��u�v� ��j�i�A���}�F���
��{;A����D���,T�����0�.�s#VKO
ZO��$t�X���cJ������x|3L��`\�+�_�Q]���g�������`���?r�\��g��V�Q�Q�^1��@!������%�L/Asa�P��*$(��`~q=����o3q��7�NLVzG��'M���$���4c����:�T�a��s�����-�G:��%�	��:�l��������$�)[�8B�||C�x?�Khr2g&�VA���C1�ipB+�>�[����w&Jb�k�RdG=�G6l�0�Y�w�I,�VF�A��8g��t����{��Fc��{�����E�/�z+)���E�]f�&n����W�G-��Dg�A���DQ=�k����C)�K�B���:BP��<{-+�R���'�m���>B�h�����J?c���-�p�����*����"4������=�����������v��3��b�fO� ��\����c;g%�Z���z����t�F�F	d<A��p�hF��0�L�<�� C����_A��8����\:�7�^O��R���A���W��7�x��<Z���?'�f�����o���''Q�v�a�2emz���eaI
�e�Sc.��+�?r��0�e�@��`��Z�+Rtd^	���ui��RZ��d2�-�R�}d���V�#������t�����������K����V���=����Z�X����A�r'�j��m��xS�����"�`�Pw{E� 2�jK��U^��d�t4�.,S��r��d^hn���^F����kNP��U\5Is'ncmV+FK�N���o���T�������n�B�|����A	�S�q]��0�
����d5��X�@�6��xq���>�"��
#�BT�����\;Pf��;_-G���5N���:A!�av�@����L��S7
!u=j/�"L46��=h�V���c�%{P�"���b�����|@���LZ�Z�I5'�n+J�B��2Q��z���|��p.�{��
��'��VN�A}�e����w�*�P�5���|�@�z(�G�?�%b�V�,�dl`s�`�����W�J��ii��g%��E5������5~5��2:�j�ci���;&|�83g�[I�x*o%�p����H����(��#��
�V*iQMp�I��z%�z��z��f%����[PX�R����b�o�(��@�C����vy��j�kt
t�+�.�G&�B��m+�
3hk���E-#������'b�����@�R>R��`��*[nWX$5�'��M�#�
���_�M����8����	�����s�Y|��?@�������SIxD�@_����&[I���vt�N#``\���k��y��
q!��K��!���"F�
������4�P;^��
K��)�� ��2@Q��g�(b
����I}���>2x��X�����'�edw�B��
L�T
Q�%�C��
vL7Ta�`�"n/�x�4hQ�uT�}v	l�7�!��&$%-��l\��VZ�ogU��]���a�}���p����x��	�:��b?�����k\9X��B=��i#e?	��W
�J�	v��}V�sD��mhCYwG�����a�Xn%���Ot�5�A�qfr������N��w��&���$^�v�.A�f����Q�u��!��U�8v0�-����%v��U������5V�8��/���
J����v
_������3U)s]���'�Bo�hwEV�&��JH���|G��������[DX�)A����?���y�>�D+,gku�g>j7��'�Q.��dB�H�3^R���I�h�M���2���xkg��go(�;�-
�"��7�L��k�(�c��+{{�
�z�r���7r�X��k6�-���"�2�b�P�F"q	�uTf0�N��2�JLCd}�����D��Y�lc�s��������[��`�@�F#�W�6�S����H4�6gCq��!�"G���1��%�Y��1���D�0:U�o#�����������c�������/��
������5����TJk�K�{Qo��|�.O�<�P�st��CRB�2zG� &#r���ny����(���Nz���w�#�XG�����&��n���GY��QbG�p_:�$�����#T9��0w�m����Z���3c~�n>��R�o�II����6�����$��"���b��MT�E��}b��	0�G�����|�V�M�.;X%vK
���[�E
\����t�=k��dU�L�q�����t';(��U��,���
$L��m	������WR{��k�/�����1MBL��?)jR���D����F+��"�����M�+�1���
�e���X������4�������|0 P���"�pC�8Kp�IY8
�����NZ���<���A����6�nw���d���������f<�|���OT���+t��JC�N:���d��H ���@��P�������c(a������;����D?�
��T����'���{�T
'7�m_l�^�,���h,��8F��C7�Sbv�`xqj�9�)am�A�o����� T��52������
m���5Bk��"�#����o�����F*z�e�k�<�
r;_���kJ��?�_T���v?��dx��#�����gH��q�z��e�)��{T���������:�t�_wR��&���=�9���~�3*�c���
\>i���|bZ�I�_�������I�s�������L'i��J�K�Bt�`���F(4����u�B����r�K��K;C� ���:�������Pck0P��D �������������b���>b��;,+���W���=����m����V5j�2��8���Q,=����Y�l����+N����Qf�q��������37{k��"��1����B�T;����c����V+�$Cw
WVW�Y�&���zb�������P���w�(2���8�l�n&�8��P��1j��H��A�$��T����F
�����Vlj��z
���b���!l'��-�%��u)��-�$�,/����-�a@a��1D �����@����iX"�12 b�,S'/���W�x��;-{Q�����8��)��x����<�P��?�,���\�.��M�������G�F��6�����������g���i��GGG�����9��� 
BU��d<�^|���<�t_�<�����	Ku�~�����3x[��r�U������������3���}��4�ZhH|+XN����iw�W2{R�@��{�{������,>r|�ir>U���N�p�Y���j��)2�!����t:'K����=����{r�X=�v�^#6�]n�h�YD������m�"t!Wj�y� '��u�����*�|� 
i������W��|��T��j
A#�� ��w���wln�~�}g�e�X/�����d}/d�T.hh����8��}��wO�rPK.�!���y�;]�B����XjR�$[E�'���B�\�
�h�[����������N�I+���'GS���7�#YX+^JD��^�F�EE(Z�����/�8���ct$��2����>-��3��W��W#�:��z�����Nu�u�tU4ZH�5�nb��
���K����D/r"b��^TjJ4<6H�m�c�A,/������N�W�|S�k�G�@~
���6h18(��Z0����[1)�P~�l�M��B�?o}G����{���22�C�WA	-=8��!w����!��Bq$W1���Ga\�5�W���=_&��{���;2��Q�wd��EB�+�����U~kGj��	�}�kx�}�q����K4@��w��;2���w-���+��X���c��%I_%��������_g�?��PbV}I���N�*�R=��z�����P�D\�������!:��BV���W6>�`���H���;����:�D��^#�����,�.a}�4�q]�/0������*�����k����Oz����]�e�(�V�.�
@�N�D
��&7B�zG���D�mW�	���ulw^`W��sD��;2���U������������������l�w�g��	�EH���:�N�^"�j��
&l��=��,I(�z��E��������Q�?�S��jno�B��B!2��6������	y��(<�gP�8��_SAF_D����H��Fz�c5���$�\�N��w�^�g>S#�i������xQ^�h�8����O�����Cc
�D@���Zk�"3�$��G���xt+I���A����c������$�����CQ{�vjy��x'�y���P��:�
+�M0�-d~(�8uV%UnD�UKl1���*,�
JZ����mc�#�/��#E���bd�LTh�T`���!B�b�Ik1FQ��$�.Hxq��Zo]��8��?��dx���p]'(\+���n��d��u|r��j�
�8~�%�
=�/}�X����Z�KL����������D7���?��M�Q������@#
X8���\V��)	���V���\[x�L`��y���O�C���A�D{�%AE|��AaK��������|7���G���$�A\�������FHl�ZZ���A-�b4���7bK�I��8��{�i�A2��a-�"U(n�peV���Y����ob�PK��uDaD������e�\��8:�Q���,p�\��������ZK�]�Rz�1��
J4���m{U���#}z���vo>j�W��OU1�X)5�_����=�h(�����EQ��r-�$������%���sP>h�A�;��K1�����;�zy*��x9���!�H����r����A�+��+F�-���4�j
���4g�k���������u,����,
?����j����k���[��R�;��y]����&l��F=�b��+�J�Vv�7�0n;F��M��Z�<K���/�������}���_I_P��}u2�B�$�����}Eo?y�l� �H�k�m)�%^{Mn���E!�
���9�ao *M1��0>���-�%�H����`�A�C����J���'o��-4Q?A<r:B��N�����G>�}�;B����������L�9t"��� �:|���rZ��D<��A>��E����P���
���A2�/gkq���eg�( Zzdt�fz��/R-Q=<�#\PP���Gf�����]��lR����D���T�'�8��.h[�E!���Y6��R��tFq�6�n�EVk�TQ�V�kP}��oS#{�VI�ud��h,�C $����eWt���W`����zm���HR�T�"FMV���Q	\#�@{T5� @Cn�":7T��"m���!��;A�*_k��]�[���V~>�r��T�iv����.��/��N�B�����n2�F
�`7@���%�8V��5�������A�j���Y��^�3l�aW���3�D�2�o����jx�+�w���������
���o�A��:���#8Qy�q��H�^k�����s`�j�AE">Tc:���M���Q
:�/����1��n�j�AAP�52�z��$�c5�A�_f�'K����2���=��`������0���>Xti�I��������a��-)�D�k�H�����S��P����	U�:�?^�Fe�H5!C����H!�������d�@s��zAt������-�:>s�w���`�-�O�w�Q}�w�%w�;z���Z���_��+`y<�z�G'��=�7�����������BBW�y�!����w2R��X:�g��H,[D(L�4Z+�*�&%��h�1��V��������]m�';c�?� �&1�	�{�`�M>���{@����3�Y��������dD���5u�qu��%� Sbd�^�5k���$�zh��c�]��t���U���Q��{
[��"�"^)!�������� �����E���GXj@�{�2n=�_|��:b
�A��+���|��#T��:+TX�����;v��#,:��{�&/z?��.���y��;�pYO7[]��:�[��s���Prc�	�b�����~���y��q"�.�[��#��Y���3���y+vq��q�)��-f�� ���W��[�2�Q���n)Kn�*%��/4��
��+���z�A����K�B���4�.����x�mB�m�q�ya-^N�P����Iu��=�{�n������tiO�9��S��l�j1o�k�C4�2��_�{��0t�E�E+?���R+�����1>^��T^	���cwUU�"�r��8�W�������p�F"Vj3n���-��]e�~3v����A�?@���N��tT�=�1��"n�bwbT
�K	�%��q��x�-�:�7��%�
HkrE]�f��%)�:�1
���#5���]�k��4�V��Yc6'j*�E?�q^\o
F��1�����}�$��^'�["��$2��L��)���n-��K�Y�K23F�~�a��:�3p��;<�7+]o�!�����A��T�G��5����e3.{K4"�5������=�^{��Y%]�;/bV���"/
4C�=�����yP22�����D?K�����	��1�[�������z/����23�H���2�&������^��	�D)���k���*�n�M�����@���_���X�c��Pm"�0l�la0� o�H��t�����TS.����^V�������T_�L�5�3S ��	-e������a����������������6/Az�p@��9~L�i_���{�C�aE�A��+�����aM-3�:�w�_n��m��,Ak�0B�4v@��oA�n������N�6�
.(N^St �Sh{��B����%Z��MY�
��H�Ee�k�8�l�|�z�;}]�}A`b�f��5�[���T�l�2�|%������Q��7���/z���VL�
a�-@b��@����3�o�6�������8-���+
D��]"f��q+�����%�j�6����mGiv�;��p�n�^�|��F	�*��s�]����wv����(���]�Or.c����P��������F��ywP���6�*�J[��`fW�F&*��s~G@w���6 S����^��h>�������r�������R��F\�tM�	��\�
=I�������\NE�:����k��=fr��n�����
b�D*h��/��`��8�B����q�{��ER����[ne����8l�Q�4P�9������v�����(B!���}����*�<�G�`�=P���}�?�XkB�~�z\���v�w
:����������n��?n�W�Phd�
��E��(#�����ra)P����t�_�(:���������s����h�^A���{""��-zf����@gKB�Z��!O=���_�����\qpT��o����R�R�[7����'4��]�$\1�O����y�67=p��4e��t��g�����Q	��=����z��
3,9�c[Ta�LP�
5�H8;e���x���G�u��|2m��Np�<����,��6�u�F*�n����tD�:��(;���,��e�����b:[9FvZ����wj�3���%��]���O� ��B���Xt����ua��>��e�U�f�>������lm�!��k��(�F�D.'��T��A�e�e�t7\v�6� V����	H

�T�zw��#�4���<������
#�D� 3����Xa�&������:7?{�
o�u2���>�G
�=
�b��A5��2�vL��
d�G��z�w#��=w�17�����%VG��n��|�W�-�)��L�Vh{��J!�l��v��?X����^}�X�
�r�#4�}�<�6��U3o�{��J(�WG<E�o]N=1�����Pg�,�}��+t�8�gk�B�;l(�����PB-.
���D03���!�fe���-�S�Z?�Rn>I�����F+�v�� ��� ����5������������9cZ>z,�H� &�ON�����yk���aC
f�fH�!�HD+F02I�-dj�e.y�";"�qD������^%�#��()7ZN�9%������1����.z�_P�Q�������H&�"�h&����]�h�o���p��ml����%"�6���1�dzD� LYl���Tp	\k�!��y�����8	��0�-t���i��0f!-��5�a���}��h��w�do�$k6iI.��2I�`�����V�]P��0�4��g�m�����T���c#!���59GR�Ui�G��alB���!X����^�.�G���	�F��aHB&gj}���ia����]"����s�x1��04!|\�-�&yZXh��}bI���UL*���F�����a(��m�u�Xg���F�+"����+-;�j*%9 Zy�+-�
jy��g��I����aO:��hL�`�$��A��m,�����<�4r�INf�6\��Td��R�1c�P�1�\U+/��z{D��t0��VI��%�4�&U�0p���L4S�;!i�F(�0D1/b���Z�Ie�#sU<���5�����B0Q,��z�j��_��IA-��06�g�mT�]<�*�{P@S�`��#�^!3�7�A�(���X�o���P�x����.U1�^�SJ����z����!4E��;�b�$L���A�?����uX��4����c���W�4�G-���d�Pj���u��3[C��4���J?bD��������[�����{���m�P���xa��?|xQFhu\�/Vw����`�L���B�PK�qOR���5�f���a��C�H�HB��".wX9J����n�E9U����Z�hZ&B�:wg����=z��i������nG��|"��"�i b/mh`����3#�@=�i��:�@}
�7cSx��?'��j��6��VK���Y`�|h��v{���6
4�[9���<��f�?�f�ld�!��	{V`<s��qRm}�����~�uaw�CI�s��z���:L��������P�zcP{@y��+�j�`w���"-����QOl����H���N��*�� x_g�h	�f�c7��n�A]0�2LF���K8VT$Zv�A\��A�W�3��������Wg<b���k�9t��F�������o��a��i�I��Z2Lloo�>V�2`��3���Sp�!��+��/�K�B6�8�,�G��Q�{FD!��\Red�@���bh�V4��<�=��?����+MCZ��V�
�2��k�x��A6�z�b�t6w�X��,Bh��%�d���A�bl�@����������<F�;r	T��$���h��
�������V�j�m�Pk\�c�!�V�����~<��?g"����'��[��J�d'�>]��)3	j�ouu���k�8��3��
 '��2r������E�����sy�(���V](�������n������2���:{i�!�P@�����,��dVg���|�S��)$!�����:�EL#.7�c%(Gt����3mRb�L���N#�rU�jK3c����v�3�g��tp`�1����(�7I}_�B��ihn	+-b4U���#���;~��2�K�<�M?��*wa�:��/fh������W�2:��a�d���n��0
U��2�U�:�0�)U��v~'>�Y/�<��d!��Ac��g����ix�
f�����;�qe�=�������F�ia�7
�$�z�����_���������K�d���f������4�'��V+Z��Ch��]��3sXQE����>�S����-cl�-c:��~��a�:���?&*��G��eDB�Y��	�W����W,�����1�n��#S^��&a>���A��~{���j��I��;�kah���w�e��+�A.C�|���������X�<(�D������Ac!�2(a�-�8���M:
������v�4��}��r��V
y�w���m�����K����W0��CFG��1���I=W��juguYW$�T�9,_&����2����4�>�P�&�2���KC��
�p���~?�����tW&t�[�����D���.���U�$_�9��}]��������8^t�Z�d�5���;�j�u�2VT���A ��J
DK���4�nYF�!~�:�nX=���,Y
OT���?��5���`
R���.��(�hp���:�t�����'��"�F� ��mb���>��J�`m�g�P0�s�Ttt���d@BM}8������1��jy����T�{[�j�.���`����b�?�>zv65"as6��[�
+���F|���hd�%�A7����BF%*�W 9�<I�U��i�W�"Pky~h�W�7}W���d��&���N��+�?�J��>�M���+`��
���u�.���i����L�H�#�B�S|)�d��	/����.��1_@���%Da��q�S����A_�.o���+���A���HDc���?�B��o��S�����P�f�E�!�:`����D�$�w$alPL��jq����M�����F����pf�&F"e��f�>�^Q��F��L��v�������F,�as7H������-q��-��I#��� �&nh�S+��avXT������U�������`�><N���4�F����HptW����0G�����d����"/��EeG��\(�G����r���#�q'AZ��-Zmmo_zt7��IEq�BG��i��l����#�f�?�G���M�VIj-��z����=������X�
���f��o�����Q��������4!�������a:�D��&@	QX�b�5>��&$7P�C�Z\w�	5N���K�=ToC�e	a��3��!��Ho�J�m���G��%����I�"�#�%��L��$���������Y����9C�[+��,Wh'\Bx�$j�*;Gm�p�F36<m�� �l�m�B�nu���tM�V6�:Qh��.:�%B���^��NhE?�P{~-Y��[&�	��4~#�U���F�A7���n��s����(�i�����4!g�.�l��N���`��(kL��dp���-�l��!8��W:��4vP
q+^o�����6y$�������U�NPl���Z�=�62!�41Y��6F��'Z3��~O���cfr�U40y���g'��H~�:w���t��gy��b�����eL�O������LuZ��.�;nN�jz����Q#a�1����6�.m��!��m�A�i+����0	Sf�����+&���I�P���,��pb�t~�42��|������M��!b���t<��X�/c�1��Ym9��h���U�)wXj�
6�{"vh9��"e�6��X��@�D��r���*^
��������K0"�����X����m�����;��]9�dc�A�y8l�2�p���M�\B:w��Sx���D�;I�r��f��
>(nLm%0�J������`��a��?�#�l��eIV�^���������;P���GX*��M�������{jwR1�>��H(���)s�Q8��@��I��k�-p�x�L�5[p�!��>c�Z�������Q�����dY?�����s�_(���c\B��2�'j��LbET����G�����Z$}�5i�l�?1j:�_x�T��w�"G>�c��1��1���O���O��V�$����X���:��a�4���DG�c���j�T�
��m�'��-�����Q��+�����x@C2�S������<�%�H\r��d���Dn���D���E]�Q:���B"q�����D�)Uvf>���`�x�d2l�=qQB��I���3I������F-1��N�A��~��&��G������������T����X"��-�39�*�hmD��J���}-Im'�F�0������*NQ�Lyb�TD�F���d����}������'�Hf^7��w0����G����8��r�:=������D���/�MwG��@Na-X�Pq�7:��6� ��7P�n�h��F�fF��,��$O�����20�W�����

����x6'	��@����L�g��{��$^�a?%�74�Gh�����
I�$Tz	%���/�3V#h�f�r�~�2O:��p�_�VQJ�(���p�X�(5K�>h�>
���5_����M{�����o4����>��IK�a?�S���9���A�.O��/����;���6|�4-���_������I���4�$�Ag����e��3���TUf�RK����p��L�E���X�>4y��.�4�4F� ��V(Y��f������� ��Y�t�h5	&���F��g��uE�G�MW���hK5: �S'
'
��qE�!��Zc'�(�KA��jj)���/w��h,DHI��������A��c�>���P������������`��B�v�x"�6A����ii�d5���"0j{�H�J*�w`\i�)���H�IK�i����o���^(�)�q���s�o��o����_{/4�L��~G�_�F8<=7�����u�K�0U���,��� �H;�u�g
�c7��C��?�6b`�^�}A����F�zh�}/���tF��6�?�^�{�:Sr�����0v_a���]�cc%������/�E%����O�,����H���Io����#5���cL�$c�m�����Nr�$��w��rw�S����� ���N����R���v��t�^`�A��JOA.H�p�r�8����f��)hb��(��p+�Hw�=A#��E��9>B~G�Fmv�@#�����;�Oa��hL��'P��D����&�E}$�_��_�V�X��7�`ut�t-Y(�f*��hn��"�;�W�P'�F����$-��'Y��>��
�F`����f��	�&����-E�Q���
������Pr�(O�9�a��	���1��K�5�Fz�[3����4;���kx��Tb�.o�'�5LY��5�����rY'��B�����p�/�u�o�������Nv.&\d1?�p7}�����Ag���d`��Q�NXJ���u���L�p�B�}Gf��)��;��j0
4RsKP&��#}�^T�����L�k��w�����E��k�Y��T���;��2S$�&
*^���=�e'����_t�cQ��;<��5]�������5����7��^��8�b�����|Q����+'R��81�Z���=�U�t������<h���r�0A���8*�-A���U���0��n$T�/�
>.7o���>��w���G��t�B��R�N;�a(G��b_���H��`v������vx U��V��*_���c��2� �@��7�?���"�>���^�E�t���B�d��~/�W���-�X<v������(�{��y:A&��A �V�4��j�
	
vk��v�����1'�_���V���>��A�����C���P��Y��^����%��fG�;���y}�!��}���
k7��S1m�h��IZ��Za�{��Of��)T�����>�+�R"m�� ����B�HCE��XA�-l����?�-�q����<�A�"n�����"�������i�3�Y_�xh���%�W$�	��w�Vy�!��wx���B����m�G;#��l�� /��m/F�u��w��H��*�}4��?
�g4�vR�"����~<��b@A:���Bf��D����;��e��&\K��x�nI:���UP�Q�_���9�m@��"\���s�Z1��-�o�@*w����\'bK���%�hQ�{��)����E�}=��*M��4H,W���	��g��:�i����P	v�/y�Q��w��$�2�����-	] ��Vz���$3�����Q��;�Be!��p���\�d5T��#����How.������W�J��N����%9�������c����#�R:4�����f��[�rA{�N ��X�d�A��t��}�d�"��Pe�^�����x�=���hK�L:E�,a�m:�VK��{dS�Jq������WMt!���F>�����
��kK`�k��s�
��A6����:�s�3�/
�G����	�l�N�3JJ������po���'"�����P�E��r��b�@9��'BO���?��Ox��l�����p�N=�#�f*mBTI��+�)��b���"e�N�W4TH*Y�'I��ek�
��/*�R!f��51s�Z��bw1������\v)�q�n%�H�|t:V%Z_�vpvH.t�� }�8�6�p��QPlL+'N���ZJb�E&�[=���2i/%('y �����0�T��	����������
���K��<�4���V��@��:c0��F�C}B
 ����sA{�V
O����L���/�(`X
C(�O^>"�[�C����BW��x��3�?�U�wF��hb
�@C�����62:2�g��*F9����2����X���Z��&,Q�����URJT���b�����U��T���`���L5�P>�V��3U���&�
u�$�R�f�}Z������K[�|d�y^�����e��S*pk���HQ����w�<�k�/[k�32�2�&?���Su����@��I��4������=�A�J)�C��`��EWI%���a�A��:(��p�e��'L�o5Y
��MI�)>X�D8"Q'k�
�Z�8�8��9Ydr�8)I|yg���Gr�
}��!9=�b�HoQ�P�L7��Z�*�j�����`uV5� �8�Eu���=��{u�������PH�=aI �]�Y��Y��k��ez.6��VC������
B�]�	}�wsh����-����i�`w������$�$��]R��:w��4��r18�����Ds���j���f?���&�@�~fJ�������g���I|�!�Q
�A}���'WJ�Kl`�Y�3���f!]W��������{�a��A��J����' �^i���\?QZ\��|�H�4�De��j,B\
����W�!Y���!jP	u������k�e~�����'��:����
��M���7�~�@kD���>���[%!2}%:E������#��j�z`Vv��I�wK ��Ql��d��Q�a�����&�T�I�C���d�P P�]���l�����.����'0�L���j��
�@�t�\�ZM`���i�B��M�?
����R����U+�[_E$�zR����NTA�{%Y�}�Ow
��f@At!b����[������A��G�������b�tK�����&�)$�~�Xm�`mO`�h��q6#
�����_���;9��@��f�Ax"��ZL�ZM`
�o�I3N���i�p'�y�������O��O����B�{��&k����E�]C����0��B�yQ�SG�T,��������	IF��Oy�
M#�k�_�� ��V���~r����0@�8��8��Z��+�|�>�B;y�_v�N�h�T{K�ke8	��u�R���X2����+���^���|d��0���B��L1���}Il�7��O)���Z:&�������;�DF����?#��
�C-�����D;Hh��[q>��k ��5�%'�Yr��K��!*���`�oF ���{�X�L����'�Y�fCl�f$B$L&�n!�]�6#��-���<7
���<��X�3Zk
9,$Kk=>��/��6�^D#��[G~C��K$����f���� ���� �]�J���� *�H�j?bT�-@�$��E'����4�
�.�w�,7�
J��� ;u�R+���{i�]���[����wd:v3�I5����H,�IXE9�u?Gs�`�Z������#Q������$
������h�ML��f�}-��>Z�j>-
x�o��s�i����Cy��[E��%,Zu�]�P�]k$����}��E���7Hr�;��&�9�b�$�����`�D���I�95�`}iP��;�{�=<1�{����J�q�������v����]'�U����D���9�0�H�[�0*60�*��qe���o#l�7��VD�b]���>����v���V2fa�;r�s��^����h�H�Z�r,��o�]r�E?U�{��cb�,�����kIsf�QC�h�c/�p/bbR����{������<������
���"�[�hah��o�G���p�0��nhN�����T��D;��O7�P~+����q�)�CG�qu7�0��T7� �j��m7� �Re�i0a��j�cg&=4��&t��=�V�q���^�}���h���s=W_� �������E�p;j�u��	������!^`Z={"�T����,���
]������X��8�{4W�vp�YR^�A.J/ �>��G�jH���=���c�w�z�90�s��������������4���y���x�}��^��7r�~�@��T��	BF=)$l?� ��#�(��m!�oO�Rtt�
�|��r��RS"��!*�TH���/� ����Y#�
�a��<�%^��j�nL�9z��*!�D0QU�����5Z{��3V���p�/�<-�O+L{��x�#e��Z�#��&�_����#T�3ie�Q��g	�P���*�BO�6�u7� ��{��%���t�#^��IL����E+LP/��/p
�?y}[0�2�'b�\��(���1� >�@�>�9����'�%T���C���h�<2�xk64��<8�Kl���wKH��
��i�:�8�����\���8��e4�����[0���6�;��i�,�Ybi�������65���
}!�n�d�h���D�AM�n�`;z|Q�vL �o�d����������3<�3Ll�!OY�Z�;�C���D��n Ac�.M�Eo;��h����1�:�+������D&�q�������K�����1���?^�:��^�=���]�p���[��
J���U����=�}���D+fN�� �t�H�I|`���2�},n�w�����QP�\�~X��E=\8;��L84���;Z�����bg��
�y�8�k���e�����{b�k������z�
��~��6W[�<�i�Z�y,�n��^�\�'G�����<�a&�O�n���?��M�'b,���_�x���CW�aHA��z�,$o<�v*��Ad<������w�I�=������X�Q�3>���,��Q����#��L#\u�Y_>e*d��"1F"PsQ��'2,��/��_~O,�e?�� '�h��b�D�iu"k|�����Oh����������7CG�at��H��2�d��w��eP��#I��f��6w�8����]�J-1�D#�����V�Ip�0�0���#��He5�@m�>���=
�sF�������6�����79L�yO��������{�c
�3GK���w�����It0b���a����{T��d9 j����>��$�A����{�1v��8t�_P������5��0�p����8s���L�bl�Xw�D>�Cd�{�f�7�H��S7(��e6^J���O�@.�9)��-���kb������AUY}���^�A6[�9,YJ]�&ib���h?m���n�FO��LD:�9h���t�MX��y5-����=FW�73b�$�/I'��x�G��o�C�'�q������W<�!)�DIV�$�!Y�!�y��y�Jqo���'�
,o��	��Ed����a�b��a�����~��F-&"X��L�A^����A����G�B�Vbc5}p�3���DP#@�Zp-$��z�(�9�(N�;Nl?N�m���HE������u��)�PN,�w�x��A*?d� �`|Z��W���R���8��&F)��Id�`�)�Mt�?;9���y��
�6Y+������?_���(�OAK,�i���\/����Fse
c<�a�����������A����R_�*���+X��8���6X���%�a��x�V�����*����|������5bb����wV�n��g#��4@a��li���cx��o�-�8��lU�I��4�����i�B�x���I�v�L�����fO8�n7iZ��y� �3
RHe�d�!Z������!ST�2X����z��@��nE��4F!�=�gIe�M)\�!��L��P�V'hj$<#w��q}v��G�L��B�yf��.R�z��-�����B�$�F-�YB�:I�R�ZA��3"�� �d�[q���X\�}uI�����9���n�BJ��g6~gD�W��N�o������t���(���]��,1h��������r&��Eng�s2����BC����o��y��x-iSW�$:��L������(B&���H���[`��:���m6�J��:}�?������D��=M�- 3Snc���4\�����F��6�V��k3A�����yi�X-!b�4,��p����g?4�����������a�?��a����g��,>1���%�wq���P��(�u
�3����;���V��T\ws�(n�B��D
�i�B�A�$��#�/14x�����.N�B}����nPd+��#
�	[�s�_�������l{�tB�X��J@���9�2'X=A2N���#�bF?|@5ae��A����[�0��i|�A�S/�ep�����w���j�M3����-� �[��n�
L��d��z�R
!�
��Qj#)(�}<+I$E��{�{	����x!,I~�4�������,���)K�h�����5=��,	�b�����ge���}+G�.�Gy���`��/���l���<���N���s�e��`��H^9
Y�>�+��������|C������$�W� fD�qpZ2;'
N�*[��l����a�����%@ZNe)�g��5��2r����F-���`�jA8�������;���=��=T�=����kKD`QC���l�v�q��l;��^��Z��?�~���#�nT>/C��~b�u�/b���HiF&�z��4�o|��h=��iTs��[�?h:3�I����+�VY�7�E(B�a���aV����Ykd�Z�Yqx���{�i�l0b�J(u�����UEw��P'^n.��B��G'�.c,N}EpaU�s�/
|B�j%{v$x�1�Yh�Uj�������Z�6M����������]F/�������`��)s��,.cz�Zg���:~�\�x:Y#)�V���YE�e��I�YP{k�@��a��A/]�
���UK�xpoEa�����]&�\F2�I�\+�`t�YA3��hEb!���$������1���\�0�����Z*�W#�/�����E�X�J�����D6[h�������X14��=L�Y_�1���Q?k��O��+�5��V��u���=�YA��1����*��W�
T�,:�������2��;@6��*2&e\�Z�f#��� ��XP�����.-#��+A�����g��V�}��I�d�8
�(���V���E(nK'Om��E�b_��V��=�����?���V���A��H+�E��8��:T�'Z�g�Oh��������*�8��������u��VH��V����[�h"YI����2��
�~E�-KJ��l��	���U������;q��&�t���`���sg��1K��+A������8Dy>	�g���Vj�=��L�vKbuWO�'7�%�,�G��h\���S{�K�{��w`\a��h��7�bc���c��`�SC���qUG�'��19>|��c��+Ow�(���NX(��<�i��9�Y�[����-Ld�~7�{�e�����/K���}�O-�Fq���1�c��p�������#�Q!��L��f'��V���H������lC
2�?��B8�Nd�|���1������]���4\=(��,�DC���'Ae2�gO|��9]Y�������T1�x<����}l����h������3�D��omn��=�/�!������zL������U�X2m��;�
<T����������"��@l�����0�M<��}D�F�pQ!�����1����v�� C� ������t�t����0�2���e�����������##�����dV#�a'�zI3 ��=_�����v����ov���;����e���nQ�V�DF��l9��S�C�����X9�[V@���hd�L�p?UE:�����~��C/�[�h��������BE�n���o6��6h����g�#���~�7�
����<�����B!����=>��g���K�)�� [���j����z�G�_*�����]���g.�`D!�Z�P+r�(�3�����0�C�I�\�h�,�����w6)f����������H+&���+O��H����I��QT��N�G�G=y�;���E�H�,-�Wn��|���V�Y2Ew|�2("
���R�A�{;��]e��sr�y���O4���1q��>c#�y(�u����S��B���-r�m�������g���X�^��e��~J���L��^c�a�&���1���oe:��	`$B���}?�R��Q�)c����a}L��;h�:=,�i|P\����u����B5f�2���f�!����8P�]�N����D����F��A�j���sU�i�K�J`}#
��N�'E�e�(>&G�)4[c'��~"�fS-�=x�4"�F��sP�'.�-5�a����i������	����C0��mHB���R�C�����G�r�q���D<�"����
���$�m|b�CW|�w���U����wb�E��S_-��`a{�x�,��	j��b8�*D�Z���L���;�`L�uS�B��V3"�1BQ�����v���w��<qz�G��|8F,S��ny�k��<r���lP�)������"��c�x��d�R���5���x>��Q�NO0AA|�c�B����1���c��4z?h)�"q�$T�yf$�5:F+�=8�Qk��7�W#����d����H�f����O��;T��C����Z�Z�PK�$�zw�t�]e�+��]/������ST<0�����^�T����V��eRS/�??/$m������?�
JO�����Y����'���s�8�g9	������l�����25"����d���R����`i����NB39�w�c�[��U�1�Q�"�&�i�����e==���Z��������c�B��&��~m�v[tL�t���c1:�c�|*������z\'�	-�^0z���g�1Fa�4���x���+u���	��(��Z�>���;[����C�F}�N��x�-"�	�E�D��R<TpQL���\�m�mV�����!�P�g|���hx/2B!���wKA�#�����7��`��1T�O-�J6dR�c�B�3���U�'tv�5������1��:|b�"��1��X�1ENtd._�_g@�y���&#9"�.������'��{V�:��N���/f�^<���n��p�tB�V��(Kb�����e�!C��w����}�$T�t���P"\��E0�c,B��Ja�f������UP���_~	���I�m��1 !j�FT�c,B-YI���'&Ad�������}�QB,�������z����>(�Uf���%���H�5 ���+k�J���t�����H3�u�h}�R�kN�ds�D�,�C�{�:��we���:�y"�����Yx�<�w\D��[1A\���2��<����$�{#��;���I6�w��5#���������!U�w��/��^��>9f���h�.$���=���\�8����5�/��T=���3�
��m�Gb(����,Qs+Xa�[{/��rHu���*�-�D���#3���
1N`"X��������-+	*����@��uK<I����1��~�C�w���*���v�x������9�x/��A�w��$�I�Z6aj��*Ye����D�����4������t��M�n�H�z�jNF�����|��a���"O��ny8���
n_d�;����;<�8��%����I���F��3T5�	��������9�-���y�S�����]]�m�&	�|�����?P���'���yE\����}fF��(
5���o_b{p�ash.��j��N!����!�;h�08�Z��@��u����'$[^�����Q�6K*�P�z�
�j�����a�=M�C�<KRn6���_�r��l�0���� �����;�,v��8������v�!S�JJ��v��Ny�`k��TK�5�s&~�&�;��#d:�����=��gLGn}�������������#Z��g#�w��PI)�Ql=���HW�24�����,'���&h�<��Rw����1��=l]A��0��Ad����h�������>1��9A�a��rc�VC��-��}�b���p'Np/��	qi
}`/�����y��D&B�8��>����	���Q9�������H:G��^�� ���)���l
�G{�d��V;]�ts/}�>�P`�|
r�����<VF���I�{�|����@����Ans��;���c�$3q�C�nN�
B���;2�@�>#MH$/;�kK���iq���2�-��	%����d��Tv�U������"�-��	�$cZ�/�2��8���P�z/t�Q��;/���?�{�2�o��|�
�_�,m�|�7�~Q��R��S��=�2����-w���H':�� ��+����b&{)���`�Y�s7����������?���;�S�� �Xy��eO�gh�Dq�	���k�;pr����K�������R��!�SIf��:$�-u%�������gy����a%��A���!��)Vl��/Bs�������>+�|��0[�������-�q�3���F{�9������	����w�%���B-��g�!����T%�
���(F;�aF��$c�rkp��m�F���h��HI�<����e���_!�h����ba�i/��zu��������	I��Q��D7L�~�� �YUg�U�R�i��!:B�pQ���~�����cr����������t
}A�mM���-E��������#NU;��O�p(�W��IP�{����fEL0���K2��l*�GmO8t�$�L�@hd�Z�
n�A��i��������N�|���F��b���w����u��q�J�^��t#)���!����:��O��z�4�|���>�n/�O�%(J��%vK�!~E����p�q(�R\�sx��h!�naS��;��%�����Vbm���u��aHf/+�$�X���?_�
ja��CHK�k��.~���%�������@(,{��9�m�d u=X��V�0j�����h�L��g_����V��LH��A�����wI�D\�{I"5�4w�����_���{��[��a0\1�!���{�8�e�.bA8�&��MUggYC����4T���(��X0����
�A�/D����M�����Kh���M�.<�!g��Y!Z�^N����a�9&��,�2Tx�:A]<M�������eT��������b�� ���X$��%!�j6�����sx������������9k�������>�����<������*��E�{�D��A�QM�����j����V��_�w�xF��f�C���k��o�|I5��h��I~�J'b4����
�WCw��vQ���
�W��%����7j���L[L��j�"[Q�����	��zM����UC�h��G�E?#�T�bWN��hb�	���j��P���`cG��zw{67�A�?��j&T;pZ��BJ|��a�;���4w�.��Pk*�{���Hh���������#��"6�"i���\�cm������k������_.�NF"��cy5V!����-���@��&4�����i�w�����g��U����%�D�����K����y{5������Z@����6�#O�C���b.��O��y
(�������b�R�S�Cm|���m�B���e4���>��M�#���%�_�}���7�:1����^��Ax?C2p��~�}�uY��X%�����God>�A����8W�l0���6=z���C��?-Z��c;��G�BJ�%�����I���,Jv%��~�J��|��]�����t��F'��u5&�������W�y��y���V1����+	��-�7�T��*!���W��:��<�dJ�=P����v��|	�B��@r��M������H�
7!a��+!�����1Z!Y�gR�[\w(SL�����W�[� �c5V!}��^�N?���)���V�x1�c%�Z�J��|��������
Y	K���jtr��\
N����9�l����V�3��,�\�t�������
-�)b�$�)�v��$�jR?��=���CLJYw|4���7�����<T�a
��Y��|���g�B����o��=��^\LU��u$O�%&�k"#�L0�-\u���0$,`�����:����|xh^;��'m�"�'�����-A��nI�@�AK������!
�t�>D�E����=�Ev���"��g�f��6���V��Z�
+k�������1��Z�w	�h�hF'��W��Y4�uZI� �i���H+��E4���{�d��j9����4��V��&��J(�"����lghF!d��Q{����|d�6�j�_VI|Q�����$��m)��[��oI��X���$��m1[�n[t���YPS�����-�\0"eoK
��`�?��E����\W�
��Z���8F����5��x�Vh��=��g���-L����O,fO��)�^�Q���OBi����4V����f�7�J�U�}k��&�%{t��O�9/�mG9qa����>�D��_������:(�8b����G������
S�XTV��^�G����~�1��Hz�>�&9�
*&jQJH��Z�-��3��Q�3�-r	D�k#RE4H�����{3*!b4j�������x�/�������@����
O�9��;
?4���>+L	O����=&"�	1�l���v��hR%b�9������T��
t�������&��pC�������w��6��>f��i3��t�z*��R�K�%��"�d��X��m��i+����+�L�$j$�"�X��	j6�G��8B����A����������4	�x�B����Wm�O�*_�f+�E��/pZ���4]*fr��<4��#�����|@>��H@X|���)��Q7J���r!� ��8�,Y��W�-����)NR*d��.�Pi��S(�]��:��*=Yy�}R���6�H����Q�.[t�P$����K�`;�1�b�	��;p����O�.��e�@��^�H���_����~�
1�tL8���N+.�~���4v�eFW��t��������0��N��;��T�3���y���'d�P��[����ju���(C"?z�?w��-�Q=��<����
?���[�y�y��T��&{7����G�p����A�w����j�A��m���{��?�y/�}��������*DZ�1tn�%m9��K&�C}�{I����*�{�$��=Ylu�i�9'5���:��("�J>��R���w�.Tk��7	:]vc@Eu��~5j��k�R�RO�_�����zz��$5f�K<��z_��;����n������%5 5`o�������E2C�=����duv�(D5�-����=��u@w}/�}@F7��D2����u;j�v�b�����X�TO���)T�u�|I#XCd���H�$��'j6^z��-R�{*�:2��I��L���	��=ih�'7�C��k��3iq�2����'���F����.�����F��C�[�,��l����i�vn���v1"���>��!�����jf�ALw}
2�����7�Udm�^�$��8'dG�J��`0B�iQ%��f���	M{�(���b�zB�E�--��F��}�_����d2��I[�>v�5@�(Z���J��=��
_��T?�&4�~v���y[ �o`!c����� DW{���4�	�h'F�v�"��z����v\��P7���I����B/_��7
Z0w�n����Q/@��J��{7f1�2��E������Bf#_�n�Bna�!�$J�i��t$!���d���y�-�&�,��5�x�����`�B#b���^�^�j�C���=������a�����;e+���1�H���n�A^d�b�y��s6��"�"�BK�������T�l%9Z&>,���iIu����C��jY�	~�=Z�Nl1����T��
Lg����"��0���9b��8�#��GR��T��������B�|�hI��+�A��h���I�#���g&��M%2�?�IC�+�	+�������8�>�)Z#�Z� �bB]���=�{��*�+�M�dOK�?'�\G��P�8:L��E����������P;�M#��%�,i����~����?����Xr�DP������X�3"�@��0��(��G��bX�Hy���	�����1�R�����>H�����\2"���]��G������xP�L�D$�iB��#H�}P�4���Bs����$c���="w 5����<h���l�.q��G��v"pe�I#)b(��||)l*x������y��,U+��q"t�qD�0$n4�j����@8�����f���a�m)�v�T�y��
j}*�k���0� JZ_�li��A��wU���94�{�r����4�;��%R��3�0L�������M#||j�����J��z�>w$��9��d=�Ll�$E���\I�z��ZBL?F�#�`��l|B��qI�an��@�m�`D������Y	�����������y+wGZ�Q
F0����P���h��*����2v���^�����Y��<���|�8i�iK�
#���u��u�}]f���!�� �A]�9>���J$��������$;�<������"�����>���s��P+��'�g��ceI+9Z�Ig�Ev��h�9�t��m�@F�"�0��0|��@��v���a4A�2�L�.�������g�����a��T�f���l�������+:T f����:��
�	������ ��$}�r���!&�L�.q;�"D���$(DI/��e,Al��r����a����m������*��;�������HM>"m@�HJ�����a�9�S�m�q=2���������@����O -���M�g�P�&�IM�$���*�YfrD�������,T��)���6���M��H	�F���n��thx����������5���5+�A1����)x<��S�w���va��4� ������`����#qc��	�8���������(L�hA��!d�d���x�M���a{���p�p�>�#�� ��hy�������`mmjK-�:�����Zp7�<�am�R�@��F����E�l�(*
�>��QGg��[��"�#���4�	�d�3���������%��k�h�8#I�g���Lj�'�`.�]���&l*��0�d�B���xX3.LU4U�\��61��Y������6�l���kt� ��(��QCX��Vb�t�Ky������["�U�5T����M/���b��Z�u�imY�4�!����Ue��4�q;����2�`�!�=}��DScGZ�E2�0������j�U��A�3�hH���n=�qB����^����%B����(�<<���>?��~����w����_M��'�Z�]Es��k3�aC
�c����Q���Z*��LS�w���U��3p�c��^P[n��7���aE�}12T������w�����
�K|MFPAl���z�0�1;)�0[���4���������]���%�U�,�Vx&*B�R��h�5=��<��P�y]����\$�-J-d�N|I���3�NJa{��%�K����j�?*�j8�����*�dX8c��
�X4u42��P�_�'�,�@�#��;wF>�j����~�kVe���Ng�?c��--q�
/�yv����F
V4O� �8
��[9K<��9T��O�dE�'�TAa��Do�D������K�U4��G��q�2�s���n3���(z��$�F�E�Pc����=�3�� jX���F}�_��"���_b�(�^!`=a�w�+]A2�w�R[Y"������7����� /k��I�k�U�)t	�8��ag�(*�e�~?����+&�"&�*���%M,�X���z��o�A� "�
�1�<� n��L\�W��K�ZiL�e"DD���Ub�����4:���QU��y����2���S�u���u��i�$����CVT�s&��h�dP4%�\0=��|���
�w
;��M&�	lE&!��@ENv,�b�X�]U�����?�&4�����!�4R���6#�W�q���S4��Z�=�F3���/fP�9i���r?@��Z��vz�5�x.�.aM+�0��.	4B=��b���G0
Z����J�`�>����eLA>M��=}%d���W��
w�_Iz�;7d�w���+��������p���S�n�Y-�O���!,���S�f��A�i{�����
(���A"T�z�mPPs�(������}%y���Ge��zo��P7��MX�B�_�h��P��q�P��&4G
/HF���*�J���~jxA�
��dqt�Jw]�3���N8QF�cs�]*��f��oY����q7�	+?��@,�e���0��R��K�q�V �"4]
�����HF*���"[t�ei��In����\�"�L�Y����S��wjH@�%e�!a�
,B.]A��u�b�n�2>W����x8���}��	kL`�D�}GVX���5(�k����F�p��B�����e$`g���'�����#�t��4����H�������~�8��-����\*�NA��Q�>4����r4Oz���N��wz{�*�Y�$M�������@�*&9L��&b%sI^��@��8A���2��e8Aq��`w�xB���&�F\�K0:��'�y�
{��$Oo'���;�K���>���3f�6�P��
�$����������`����UK��D�������r��)'��kEj�X�)J�d��7*[wTB�������P�]���8�Z�
43��;��=�	�R[�W3��@ �m������(jl&5��l���|m�-;���2HZ#��WJKEE�64��'�U���
D(�8��Yx������!���`<>�f����_T_��j��$F�~gwm-�I�
�_M�DuO:��-��>T�J���<��v�v_�0��G��}�m��2����]��h'`z�s2@F���l��+�����Q���`��v��J������*�
��4��A�����$��X��E5�g���� k��siGp4��mP�j&l��0g���vm��I{@������Y}��+��A��L�{>_�H�����H,v����qc�S�����g���
�}R#�!*3�5� }i��a������i��L>r���������4�D�v�E�Bn�A��#y�����m#�����i9Pm��k���Sh��6� E��'��-��:[A��p� �m!F1q%�����-IOd����h�Z������w�*l���������vs���'�����9��,��s�&����y����������� ��yb��T[��~�L=G���.kG���4b#_��4r�������!Mj%�d������Z7�����=�K6���U
��v0�3F
���81��wrrs�Iyx �|'bz�8��h`��{���G�U�+�a��y8����<�&w+d���G���m�*��p�$< hu^�V�����]86���!1�TS)m�}@�b��Y�
�aO�`
n��.�J��c�A�a��F�1��%nq����H��j�O��P��4�[;�y0ggfC'���djg��Rh��1���
�z@;�1��yyL�z7��'(���M�c�A�����\�s�
��|et
.�;%��%�(A��]GE��>A��U���)����u o��~��p�Mh�ae�)�WgN����$g����P�NT�	N���P��E��i��m��cF����:�DH�����%�vV/��fAl4����2x�AF9������W���MmY���"W*h�'�C��$
�_b�"���fE��T���H����^|
�u����c�AR����r�a������QB��Y�uZ(sh~f���q"c���%��O��p�2���@9DR;�4�f���
��������]��J=U����d:�c4����������}04��LP���M%e����\$��f��O�p�����d���)���u�1��E�'���40�PP��1��ZOUOa���L��T��M2��I�4�X���E�=?K�>:�U���WZ��:Ft��3�y��q~��	<}��8Y
����MD����2���jMcj�3��c�a~���s%�b0��!0��D]"i��	�/)�[E
Q��N2�$��a�U���Qa B�>����V7��-�"�u�����*te�C3-���zV\���b����� 
_X�X���'aH��>E��?|�,H�.�\�!X�|����Z�����LF7ll���@:��P�����r3������������a&;0[��������t�II��\��v�/�������C�h����
�A�����	�9����(�tQ �S�U���*�o!���B��j����=����wf$C��b[" ,��,��-��G� '82%�=R��f��=����a+�Ob�oc�Uj���m��_GgIC�%�]R�$�d={��_o]z�gbL�7�^���=e��4���������\'��S�;��9G�E��>��/V���������tu�7ad����5������f�?����#���	��0e�i�_Z5b�����'AiU���n6�4MBY���_����+�[c��l�"E���&������(�a�!6�'|G�z�j��eE=Q�a��l���A{��.[�-�N�#+�����y��/�K�@��9���>M,���^"����j�Mm��n��b���BH�7��1������x�����MB��!	�xY�%.�z�Z��5E��jBA����[���u��6F����"�%�&�#��\-J��������D�N�BBn6����]��Z1�}G�����IM�;�#��?���
42Ik�tG��O{�i��H�ZM�����^c�A��&�s��T�u ��{!/w��5�S�;��&�x����C]�I��}G���9	�����H�B��q\e?�3����}�s����_�T�6X��^�\�5��&u�	��^�g:tjq��z��m*P9j�!��Yp��d���s	m`���M��i����
-m��z��"�YI�]8��:%����L��#������>�&���Z-=r������\�G��^�#��0�JwE������������QO�;cBYd��hY���tf��U}�F ��4��G��U�	}�@�hw;�����2��>���f}Z�vof@\��:���Ex��6��^I��3� c���U#������M��xoiT��~�B�����WBy�����r�S[�i� ��{��m����S&)�dc)�T�a��x�THo)K	�����:��
:�r@Sq�f�Q�FU��Z6��'���B�V�������b[�	Ev1-�/��'�^(�t�:�u�k�}����S����K$LIHBO����(���Pd��Y�,���Gy�R���(�
w�!S�L�C�@x���\��&�2�P��{
��F�{�p?]�mf-���\]H�=��]��������v\�@U$d+*_�uO�����(OQw��?o��Y�����K�;h�)�Rx�;0et#2�*h�.F0v��aB1���pr�]<e�R�S�p��t?��2������"�&"�(���b`���g�8�l���*rp%u1�<(�����:�y������;���>F1�P����Z�A+�(��k�l�=.�N�����������%�{�Xz>���!`��@N-��8�F�,��#��&:����0��PQU�q���S+�Bi�(QU��k���$�WS�>]�}0���Xg��G�(i�����C_�	1�t���|�k|�M/��&��U��Ad�v��V�N��D������a�x5)��}�I�v��R1���P����j�)�-�1m*��?P_��P�{j�-�F1f�T�;�
�q"$���_��f����v�{{;Q(�J��MV������q�5uD����z�C3�$1~A���v
�T�C������|���g��5]dR�<��|L;4����r�@��L�HN%�L�s*Y[�����]h�W0�ID5J���5��g�US	|���cP�����`�cW}K����������@E�]-g�g��$W2o>��6�� ����#��w���>�F��z��e</�l\�P���q�5|�f��1�q:�����#�s�;��x@D5���
���N�d��hF��+�wbo��
u��o!�`I`�L����hr�%��xRp"��w��;����� �uI~���b�BG k ;�Q+�HsW	��?H���o�U�f��������V�m��P!y$�H/iwa�S!����d���F�3a��(�
~���9P8������6A�L��|dhV7��Y��,�F6����0g�����qW�����N���F��"5/�JN�s��	�g/{q�c����c��_r���
�@��@E�M�&VZa�]�BwI�t3�n����.b�&�^|?�{O�_w���S�=��H��E�D5� r4Q�1�B-"��X���Iq��g�jtA��2�l�sM��w�6 SO�B��H�)�*���d=/��(<�^tT�r��� �H�C�u�!����fTs�%�:99��b��N���Y����u��~X�5��P���Rk�(�
���p��wBuE�H��l�����\�=�`�
7�g�~d�E���Bw����d�����j<�F|���D�=������FP���H��)�F�_-,E)
���C6A�G2jt�L*{=CE�eeT:Z��M��'P����T�8rU����{����4�)�&�Z��E��D��I�����d�%&{���3|0�<�7]����xF����������0��?���	��@q5d!��~�65�lWx����
�@����}�-Bej�%v,_�k0�G56!3l�n��EA��:�_��a���e�����G#-���}����z[��0�V����Q���F2X��F�q7S�x���a�(������A��6��w�:��#�(�>�����d���ElTrL��j������x6n|�>�������;��5�5��^P��8v4�1�"���%�I$����)L�W
t,�q�x���(0�aTC�hl���0b�(pu���J��b:���&�=����z��I��+
S�;U��a�h�F�!\U��8��BZ�j��lq��P{J�0�`aD�j�c���J���S�<z�T8���;r�����DTHh.#��iV���|��I 6),������A�`li:�7�^�����r?B������h�i��,+�����0�QO�74�Y���[9htz���}T�%��J����t���q�{F�:.1�OKh��-r�G��f����X���b�x����R��\���|�F{�J$�w������F@c{�V6	�e�*�,��-^P�^��M��f�CE��2C�Tt�x��)R���`��L��D3��U��&D�j%�'+�I���@��VB6�f�X������j�w��l�9d+�=�dT��'��^Mh!�i�?A�����m�Lv�V�e����`���f�CwSQ��%2�- QQ ��f<��v�|y�����*�vA2���&��4��s-V;:�Mz�l��p�.P�t�@�j�g#���fCF�R(H��&�@��!����G�'�EM!-�������Wk��e/�jX5����2���hh$�������Q���c���19
���J�f�b���K8*�$a�B����w��w#It�����Le
���=m�S�"�-x�����_U�)�H���Y�U�H��N2��MFC�-~�'
�OaQ�5T3Fa��&g
�����*�bF�v��s����\�
��b��*�V{��]������=�<MG��S)F38����kl{1,��Q�*q��
X��"
�Z��Sa��h�U�u0�P�H���)��o��`��14V�``L���k6�<��	z��4�<�}h�fB����uJ�i����P��3�������21}hr ��k��OY��5��X����u1��oq��DJ�F}V��)��S[3���z8�EY�X������L4���������%R�vS��w�h��b���`���+�������D�Q�)�C
,0F���MGKz����zW��i�T/��Fi[�%�Z�T��}k�D��P�^�!bw;�SO�^���L�1��Sg:�����Sg���I<r���,I|=�K�VZ��� �V�H��'�'��!���Y
Z��OX!-4��
�
�T�.�}v� �P�����S�|z=a������c���8T�v���������&nOr��v����.������8�.��)"yOu��ma��n�`�C	�
=9RI@��s��{��T��/��N��<�����#�Z2��j������p*��DO���Rsan����zM�pYH�����q%u�=Q���ve��^S@4������MZ��?��
��F�bK�zk$��F���9�w�V���"] �R7���8x���1�\���A`@o�X���K2pC\�n@A�1����0��>}��`���1�3�F��1%c(����U�1�mx�h���������L�}���,�����!j��nF0�����z�=�L���
+����1��quv�:�Bf�������8$X������.�ND_l�����F
l��n��3E����"���2 ���iM&�����m����IJ�1bgFCZ���d�����eU��@em
N���}DH��!�J�h�1�1��i�H�~l�Gt V7�I/�mi	�Xv��G	v���e�|E$����=P��t�O�������pPt���7{�`[
ID��I�f����q�%zqF���9��A��VEuxcG��F�}�R� �w7hP��Q_�p�p��IT���El�u{���E$p�:���������if��x��uw��A�����/I]��5�	�������_�{LEL���v�0�da�>
�^���
�q,��h�J,jA��?��������y�cy�UU���1�p����w��U&U�}���S�%��q�������R�AKG�#=y�2��G�d;�A�-7u��'�xm3zW�>�?[5��)[��e���9��mD�	HN�:GT�u�,��q	���!g��n$���Nv	�3D��?l���xN�di�%p>0IlS��0z��e���y��D#}Z��
,��ZDH�0� l74��qTw��}�B�F�S03�z8��\9%N6����I	y��K�����	�|$kii�0����6&���*-�=Lf0(�)[c�/Z,zb��gJ���^@b_��D74�%�x$�	�.Cr�>C�U����P��=T������������l#�RF���	�:����#r9EX�^h1?���4�ax@6��1k�aP����hL��@n���Q�������)T�������,%D(Ct��bb��e���a �Y��[|���
��I)�H�1-����z|Y'5��Eb[�����Y�)M]vQB#>4:�O��0�~���#�@���:3�k$�g�F��#�j���=q#:����>y
el��N9��L�3��"
����3��9�I����A�����*�G��G�Cc��TY���19R�X
�3D��u������1����2�.�����.��mqF���L
� ��3?E����b�0tU-��KI�h.^��^�D�l0�o\��8u#��#6����0� M��_�zY
^cL�������A�0���6Q=;J'�Z	u- ���G�>��]������1V��e@<�)F���>��Oq<�o�<��W�A�Y^�,���8 5�� ���#VGB��2�b���;$N����B�'�#q�2"$�|�*�'����|��	��C�NG�>������le7N��qk2�M.��T4H�5M(#�EC������!T�F�&���UU%sG�a|b#���G� XL[���(7�p$��z����v����\	1�u����=2i�0B~�4�������3�}[����JU��P<
A ������W9��@��G�����`?�e�2�:�N���Jy�y9�� �M����b�7r��F��ZB�U��B���s�D�G��4������W:�#L�5K<�J(�)cT��#1}��j�Y��$4�s�X��F�Gc�&L{��5��������4�� _��0,L5���r�@��=�X��V�.��Y#'Z�j(I�31G�����{ vj��<�ih�#haZ�y�g@�[dV��g����Q���rFc0?+2!t�=^#	�@>�$HN/?���FX���+�����;4�*H���}L��� ����v�X��o���4�0b}��[�3��(��2��p��4� m{�Fd��M����E�����_
��k��e7���%�vK������'V��t�esG�Ud���JB�9�S��{����r�VX����IM#"���Xx�@��9��&+(����=���L��1GF%Z�sO�Zl��.P�`�=��c�K������;_��x�F�������^L%w��u
�>���`*j�H����l������#s��&���
�]������O��o8VLj@��L�z���X��4�p�6��TY���=��#���9�J�@��iA*�?BR��g�����u���Q-�}���"T���X�3���1�pB:��[���JWXv��������=�n��$�iVqER����������v�3P��$/��O� f��K�&���ph+u���iA��e:�6s/��
�vUt88�x�&�0�.a�����r��>��7
	h�j�b��ao��"�v��Ls8�U>r�E���8�����v�'�n�F����E�}nPi�4Lp�i&AH�>?p��DLcbhLV���UW�8��DfC����gm�0��V�����#"��J�eH��x����H�>��d&P��<�$�G4�X�Qn�����dn�+1	wi�s�����"�&�����4R��N���	
k-�������[�oiE���k���'(�}��HB���c�K���B��������+FH���,9�So�G$�]'+�����e���)Q{��I(�V5�5�W"��xA]�>���D������ho�M&��k��I�AG�e�������m�j�������������u@ZF!Jw_�n=.n�6&HY5v���I���Et�_����}(4a�+�����+��f�#�z\�"t��
[�Q��s���-��$���
��I-l�7!�����*N�B������U���x]F%T	(�=,v���u��+_t�d�C�	�{JY���I�RWO�$m���	�����.�(k&E��x*u�F�h�|�/LA
\v�����`p���Kf��,�������Y��bDV4�C��K��`�e�B��<��G���`,���
�������o �D�X�'�cE�h��$��h���?�?#�"c��Uy3~\R����C�gI�k� L=��=!t�bE
�e�B2�S��t���4r!��}��D��e��4��"z�v�N�(6;S��B�TV�j���Xf��/t?p����y	J�]�v��C���j�U�5E��#��dj�e�B	���b��@:jH;�A\���TGr�g
�D2 ��Z)%� �����:�ehBI��)�F��@\�'�K�������=�(���wgD3gG��	c����yI���3H�W"�o��&�}Y�R��22�o}�l������f'��M�6���l��b�?M;?!;��qwY�1�����%�g����2���pDMIT�����~|mNUX���zJ4+���X�(a�b��,�Hhe_����8I6�k�I�j�eT�m�v|�?FF,Tz?��%��.������@��~����y��N��rp���'��;7
#J1�w@
���p��Yv�6�!�	q�	F�6���]�P���X1;	�\��\������7d]�KBC c|�8�EP�6`!ge����b�'�7���H���Q�_���'�E�F2���k��h3~����� <iG/!u��z,����t��w]���[��������V�D�^�w@)�i�a��XI�j�����Nt��QT��{�eG��<��F��������������U�S)��#��#��:;�b����^�aqi
�6�g�����U��=i�c���+5f��9����9���
�.��P����V�N������vU'���������}'�}�*�LF�\;z
v�2X!�r��Q7���g��-�����;���7��K/)j�V�#��L\>���T��{����vu>.{�����:��N��/����'�9���;�z��I�����&��
�!�i����!��2_�=b�z���v�������]���*�Y9�&%���|�@��mlB6X:�+w�&��+����(�O��Q�i���5�w�:��d��4���b����y�cK��Lj�?�� Z��������2b?�um��u�DS���Xu����tD��+M>���P��QF��h��W��{9����D(�;��r���8�^�H&�B5J����������B��6B��e����.���(L��n����k��E�(#�]���mu�1^���V0U�����!��(��2TZ�i9X�� �=���_d��
'�������KZr�aQ��<�V������
�=����y%tob�x�/$��7�'���$���dR;@�������>�.��*�+v8K4�
��"r�H����%�y��2��y���o��d�Gs�X�-��c�B�������	>q?s�v��3{���c��zO�Ag)�>l�rQ��M}���$p?�nwh���E��`�&�z�%��Sa�!�0���s�NIia�C4�
�[�bU�I@��]������6���n5��*d��N�'NMh7<��@-��0�x3��kHA}����S�*1���f�1� �X�<E�-$h=��8�~}j�.�=��fn�%U�����=��;.O��hrR�k����xT������F����-��>�o�D=���hu������r��+�Wf�y��`��X����a�l�m1kZA�JV�D��2Eq`�,_�8����@�����K\���<��1���g1}P��,���qb�kOi�%I'	�(������t�m�~A�n���`��v�8�����*��~�D�QA��`���=��B��0Y��W�gwb�$������h�*���f��:b~�*]�����y"}����zW
WN��Bd�����q�&[����W�AyJ�[v,�]f~�*n9��k������{<��5r�%E��wO�,
�+I����Pse�>����1���b��s���J��;��������O]"��veG�H�WI\�:��6\2v?	�6�~���aa�����rU�a����c����!��I3��M�8-�+����d^��L����`O���@B*D��qVD��ns����p�	5Q�W���8�Oly��eq���fH��B�;�qAQF��v��X�J9�nb�-c
�|t��N���}'�sY��1��dAP��(� ���2d� /I�ML��;�/_$�J�<������km���QF4:�
T[���#���V,:��!���c(��o�v��i����S�O��_��� �	�@���A����;(�T��������^&��[O�%���8�{O��s"��;Soc-r��|Z#Vx��������w��rt�;�n�p��m�{!W�Ve����y'�m?'���S2�.�O�{������{�����^�^'���)�k�heQx�{!�L��#�S��}b;%QjH��O"��9e	�5��B��=���+����G��w������[VE�W��J��l�_��y��h%��;�������"��;�j����#M�ew���$O��Av���N��X�#����+u�(��,'�t��P���NP��t�K�����������3�9�����^h�p������
S��k��!=���),��UZ6��&�S"����<��5XHsz�����E

�|�:��l�k�����.��6�T�j��O�m��+kU�����8� ���n�%"BD���Z���,��x���x���Q��;��t�Q�tK�������a���{��w���W�	�2���]�Y�TeNB���k|
e2(���N%&�������$xb%�
y.����s��b�
�Mc6+����%<�d\�*�m�1p��\%��w����[�����'f�{�%(3xG�'���;	�&6��
�q��z7�F������Aq�h��;i-VK��7A�2���p�����		V�J�W�&���.�vW�:��I�A�����,/��^(Sm�hNFtZW����8�d_{	n{�Cu�]�u��z	��&���uX�&��5�m!
�w��5c{U����kc����Af�H`H��w�Qq�� �,���r��+�UVP�4;����z���WB��cL�D��=�c�)�&����q��0'q0�Fg'��*$�l���:Xf4C��N���8���"��;�������`H�|���V
c����-���rq@��xFi����8��y�������U�'51c��b����=�^4�����b�~b(���P�dY�U���&� ���%������c�f	�A�5�$�B��5��'ZT��X7-io�R��+#��D![��V������ix�9R���J,��9�!x�{l'v	��w���
rZdy�>�����'�\1�Q�zgY����=K�(t��#������YtH������6_9M�-���D4��o��T�����$����^�N��q{j��(�����JO�,uaoE���S{�P"�,%
��\I��t�,�e����Fk�R?�
�\�e9��)��S���[�k)1}�\T!�-i�
�8�eY��}��#������F@7sI��������"u�����}�2��n>�U�=��&��'���1������.A<���W�0rv��d(@DD���H��;O�J���n�����NE���q���#[M�Q:KaG��;g��0�b�Cr<�l+Q��bt�

gH���f����5�~���������H��p��Co9Q�H�>Va����?z��7�#��O[mK�>C����`�H���(6�2�'GN}�B\"���=��������S�(��w�V�,dB���I������by#��0���x����	��
a2��b��;���L,f�>��c��-f�.t�&�]LV\���Q+��P��^�b�B<3�C��"C/f���^�2�o�E��e&['|�$`�z�
+J\%�
�2���L�g1�a*��6�'���+���$Hv���%��=n�����!g1~��� ,����S&H�	;[Xif���f����H�<���i�Iq��xA��,�4������L
g��`�H���-�,�36b��$Q�T��
��e�X;��D�b�A�4��9��d����%����b����l�7M
�:_)�B�~O��\�yL�MSr�G1�1�g�?��;?���VNC<��B{�xp�1yRR��*�D�b1�Q�G�,F.���*l�	�Q#A,�s5���[���H*$��$�B��~�jg��>	d;����d5`���&��O'!����0�D'���_oe���dF�V��+f�?$���O�q��4 �|N���,���M�&Q{�j�BY_�T��Eh�@��2�R�$5�N�E�)��
��gJl��{^���F�q�����Y"^1=�k�������Z6�����}�<S�`Fs�FCd5p�<)�x���9�@Y��03�$�|�<�YR�A Y5*!)���������g���=r,�/����!�A�l��:�eUU:%���3�l�g�q�a������\����c�a!~Gmj�������H���_55� 5�v����{!�#R
+��Pk�a&���H�'6�I`2�'�=��"P�JP�n���Ad����Fc�Q���d{.�M5���&E����q����������������\^6���0�G�Ht���iT
*�.^��{�Tq�����km��d;��d����s�-��������]�m��P�AqoE�V4:^lPv��hU��?����=��`5-/^��U����	�`T
!�y`��]��;�@X#�P��Zjl�}������,������3�\MA)Q|!��`���'�]���vc	j��Y�l��q�{S����0�sg�SW�G��<(�OV�Y}~I*��~��f����j�@�C�����mFm+�V�����=���
2�������r)�� �ku�_8���mj�t|�!���1.i<�n�K�,e�6����
�E���z{�6f+��������+�{ElfU����"k��Iz83�
��5"���	�H5�L2�A�������md�X1I.�8���������':�'��$���x>)?�s��������`�����P��'��$�Df���{�	�0-������!7�����f����<������-�x%�� ��=�n���
�[0�����1
�Z��B�QD�lF��j�5��9$|���Om�	"���)R[R�����&')T��(�QCV����B7����p	��/��:�j���B��.��j�	�m���J��f�@}44��D+>�*��E�_Lz\��i0e��F��v����r@	����"bO3d ��dA=-j����N���D��A�l�MP_�E� ���d���hju��<����8�!���j�:���#+=����O���0�`3�0�������O3�0o[���5$�h��� ,�-�l-3�0������Xb�����k��d�Vd3� >���
����%[p�;�t�����;���xR���� D�j�#�Z��;�-�!�E��O�0u���
�	��A�����"�c�`38!���}��W�,���@h���8��f�";���������*��q�����d[b2����7i����������]�$�9����KH8��
�w?�J�b�Ec�(}-6NE
��vE
->N���	^�jl�6MK,��d�z�}�3��c��#(��M� �y'��&8V�<;j��	�������/��}D�1��m�����W*#i	�@��c'�B3y��nF0�F��$�������V����6��$�����n�_Dv�a���P>�<b�H�
�B����	���2}�#M2'n�O�*MvQ&�����5�������������@bg�� ��b3��f3
��9�f���E�W�i`��m��,n����4M6e�=�������,�����!p]���,^�l��mGS�u\G#�w�K�v��a��Q���p�n�,�Z���r�O�����<��<�N��n�x�������(������3!Vv`�Y�i$D[������j�����������|�4�_�a���:f ��i������	��������E���b�]��|S��fT$5��t��'�z#|��.m�P�Y���(�T�+YT�t&S
�;�&&���t&����	���3
����S�nx��T'd����Iy��?�������;Q�����e��$�p5����&�Al����*�F���6"�_<6��{�t�Q[����#��#U�|�BT�����.�&���M �w7�1��B����^������a���*�1
F��5)(w'/P
K�9�����O�=q
$;��4��7a�����9���vg�.��b! ��P��^#d�5
8�56�hPP���,UA}�9��(�R[����s>�kqE!���8����'��H�������`!�y������>DY!��}D��T�U=9
r���a#��5��P�TO�#<���y7
&��I����JW8�����|�������+�?���e�!��pF�P���]f�y�:�-��@���'���O�����&C����R�h�����������vGa��Rt�PU]���}w�pN������)ewy�D7���Gvm����WhR��xN���(�������zb�����V�%u�z������F�P�x�{Gn��e�@���	{�����g#�'S[�=� \��XE��U�����,�Zi�K�!���q-�fq��%��Pv<���Z�:�!q@7��o+Q�L��c5*Mj�+���*ac*�������"c\�����i��0��3��+r4����-F.��PCP�=��_'�L_9
�����������Pz���1�{��TC-]�������X	�Ct2X�&o[�'�8��n����zb�z�_���kk���	M�`���e���w�:�rT{��:f�������PhMGhJO��[�N}7\��>���C�7�-���P�\�����P��y��l{���U����p�
(tF�Z���	STi0���
���]�>
s�|~:���=�s��V��4�Ae��'(A���m�/
���������0j����6�e��>�q������p��(`������������U���kL6�}^G��".)�NF	�t��/�q�&6�m(�t�|��;t��`i���;�/l��Y��&R	�J��������SAfg�D5�q(	��q������A�Yi�C����#��]�m,	��\���
��(�ix�h��o�mI������55���!`�#�P�k���Cu�#��0(�F��V���Bc��KF�ra�=����c��Il�6�3�\�*�F0���
�_(cz��u�=�T������`�K�n� 
F�EC�����A���U~���6���]�)���f�e�N*6�Cd���KG����4�C0
���2e�P3�a��&�'�g��r���V���@�QBI5#�g?
�J����SG�-�44�h�]�bmSQ3b�T����FAd;��p?d������5�!���{DO���5�! �����.�q��4v���%��#+�1�������C,�JC�q1z������5)���ZcH���`��6t$b%�
u@$�V���8��Y�	e�62q�W�^a���-����1�1�/%C-4��^c��U����c����o����v�2�P7t�x���k�T���9U��&x�(d�p����<���R���r�1;��@,�a�B������x?�-}eB�K��p��)crgT�a`B��
v��$�3>��;;Jl3�E����m���� ���SV��P�F}�G`	�X
���J��	��h�����P�:�C�g�s�e��
;gF)$�fy�#���[
��~��m�B�g:
Mdr6ULG�����$�BYd�^� ��`t�'�q0y�d���LIB��4�e���)A����	)XEE���a
�XCLt6M~���<+Vg<��'�	��nf�=#�P����h�	�Q�g����TL�F���Y�;
=H�]6Y���v�yOM��Z���a!����U54���E%0�%��4t�!o&[�����oF&���DK�s6P�N��CE�3��(���F��i�@}����i��g����\�7S7�i]�����
�yn�RB��'��cc��(q}U��B"�>��l�y^i�i'b�(3:
��n��4�!8�D`	
��-��D�V�G�P`�.�?CG���6(Az�PE��i����P�2
&HT�,f6�>s��Ep�r����r���D���1)�WM��y$A�iA= &����B"<�
$���������h���i�@���(2��J��
$���*T���S��E�V:mC2�c����;W�S3Z`v/�OCZ��U�m������Fg�?�AU
��gr�e�$�[}����'3z	�(���EN���c������V�1�S?�Ec[�1(�V���4p������A��9�x�a�������**<
4pp�\����L�?��*V��%���u��3Saq�������7���+����{��Y�4z U!%��7�uxd4���i�F�!�/V:8(�k�"6#mO�-Z�O����3��w:�5(���}��D]F����8�yx<PW�������u���7w|���V\��q�8L�	��T2.�%NZ=�n�%����$j��;�q����E�t	�����[�wDT�����R��['�D������'X�L���p�t
D����#����{Cu����D�B���`dA��� YP�Kx�Y������������Od����	�E��z���!A9J�A[�z>�
J�)��pH�����\,E��:W��~�+�l,C���C����#�,�a +�m�%VzG&_���D'"�=�0w�P���ZYix�J�v-$�^F�c3�C�:Z���z.��
�=�V=Rv v�*������"A��%J{t�wh(��Fd���W�,�VE�hA�&��X��@U�2��������Z�"CP�k)���R���S���
{n�QK�,��[u��NE���y2�?{�[W���S!�bFP�����d�R����AM6]H=Z2�|���G��r"k�������������N��V[c������/ ��&�4���:���tE��Nx�9�On a�s=���d$�������(��\���������t1��������
�	��s���d���]�{'[��$�Nz����w��&����6<�z�}OVG��0����Vlc2k���h�������6���+�I��S�w���X��J�����T�t��KF���\���^�2�D7��r�Fz~�'����[�wP�SU�A�A�W��D��n�U}P^�r�_�9U6]��D�p�LlE���h�������JN��<g�`��U~@�������c��{���{R����N�Dx����o��s�1i�J5_
�1��>���(-��GpP%$���X�B��0zF�t��M��A����k�!T��"�u��H�.$�Z�;�cb�8�v�q�_���!w)��
����AE~2�b���\#V��LZ;KA,�ub��e|�[�$�u���<���.��C}����%���r��V�8Ha7�����r�����b+�����}uYf��]Q�8����PSn(`�k�	;RG�B��m�@"}�>����4����t�;��w��{�OP�-Y���_��"�	��/�jlCj{��3)�~rp#_�~BMC�"&@����1��R��t
�-�������������lj8]��2Byh;��$��>��1/i�h�A��.������*/��Z���Z������n�>���u0PtS�T��6v"����kw�B��� m���D;������da%R��DU����f���wd��(��>w��'|7�zXI9����c��w�J~E��P�j\82�G�E��g��L�����/(�AX���Pz��0{Z
:�+�� ��6� �z��c.*��=B�����%�TH��cwt���G��d`���4� ��'���eG���6��H�]�H��&P~w�?~�78��'�a�������6a��'�b�2���L��i�Q�����oG��������'Xh�6��K��J{lq��cH������ySH'5�9��*�T�����YH�!���4wk�����S�����;&G�~en��&6g����!�q��{t�~�%'x�����x�_n�>3��r*<:���F-��RC��c�A,�G���#q�P�^�|��Y���s��5����mdc#&��@
����8�c����4�#_P@�l���c�;�:�k�>*/��;�[u���p�C$Y�TIY�f�n�*$$�������S�!�-;m�(
��� ��f��S�EP�+�a������A��(izN�y��1�]�';E��n���$U�n��mC�V���@q������0z��2��(P7~��������is��?h���$r��:�=o�S��6�!��
A@�w�UZ�7��j�U%�A��#
�Jp]oC�^���Y`��g����s���PD����6dy��x�b�yR�X(��a�
l%<��?c�1k�� p��	�����(�h(rM��5�<b{������86��V[_U�tCy��'��(���'������s�
�e����W���'��kU0UG*�]�G:-��-�����}r�r�����V5y8=7�I����#QaE��1�!N�F���@���>Gj{svL��;�P��I4(�����eDM$(?5::�cU�i����l��_V��zx������O����'N�gY��>7����"�J���{5z����:����P��|�����>0�d�{�V��n���1b�$���2IOL�t�@�>h��o��GS����uR%�	F��-�-��C�� 2WD��0�N-n�2��tO���\4r�pd-��W���f���"�L�c��Y:;C�?���(	e%�p���/������S�� k��#5����V$I�����8��y������B�������f�L��?��V�Q'5-2�Bz�c��*Qh�G�j��jC����t\t��|fK;�A�d�����8�^DE��3B?~""�&Ho#��rQ���#v���_=#DZ(�`��E��y��Z�p�QdxB�;�Ex832��b�bh�S���.!X���n�;���vt���X����LlF?�Y�1QeZye+�o�9����r��t����'(�HB%�$\T��$�a(*e��a��8sh<�$#��t�C}�Or���'�����}tq`R������5�{If��p��ETQ����"�Kp�E[8,�x��<)O<��
��=��`�/l�����R�X�g0B�O%����V'�j����A;��Z-��O���	����v���#���+a�� 6=5�
w��Z�'x~�+�@��s�?��b^&��!B����=s�>	n`�Z����FS��8\���������N��#��a*�>�c�����X�������d������B*��)Gee>�w��j��	u�6eb#G��B&�����W�_������wPhr�!�.�Kk��j=%2W��?�6r�y�ah���j������^(�31
�}����&�y-�x(�W�����{��k�����h�&��{�H�OA���H�99���;�������&��V�S��GH��p/e�
�
\_>���E����F�HD_GS3X�P�+G7R���q[�V-�!A3��
�=�H�T�uy��.�=�1�{!o��a���rT�^���GYO��N4�L��H	#���h�mq�R�}K8s���~/��
+r>���U���.m��1���}J�%t��BV���W�[��h��kx�sv�>'4�
<|��C��`c[Ra[%U��B���$�����8q�'�{�&`��XU����{G��iEh�����F�u��bQi����T&���#��yKeu�-�G�K�mv���n,� ��2y��u���������irB�(�� o����	D_w��������wa�����	&1q/�#��"�?xG�/�f�a�uDF��p�D�f/����c�d�����A�}�k����d%��k�����&|�wt������i��k�q��Q�����������I�&�[�(�{���ZV�=��^#�t��xg�v��D�
�����F��Y���3	����zu���f:��g�6;�uXl}����,[�v��|h�D� ��{�C�,����`Cp�w�[��a���c���t]������N�����X��p���O�E����k,���w�S��p����L}��"��'��,�{���u�i�j���D�^�p#�������a�i���'�Lx��a���H���%�D|�Kn����@j�?����M'y�/�eNP���[�A�;�c�G��4���w�k����Mrn4�
��
v<!���Jj���
B�c���x���q+.����'0������
�9�fa��tC�a�B`��Hp���O���I9O�b�C4'�k*C��
�<)�V	�*A8�&_q��A�,�k�#M�qM�{��������Gl�`T2
D�\%^R�p������D�e\�-��PwT�����H�0���U�$�BW)iS�>�x�E8t	����HV���T�NG�DvP��\(���M7ezJ,5W1"�U$\���{r�R�@��U�"����aD���.,�q�`�Uj���$�G"�y���#�X�h��L:����{�cl�FkQ{bGWJp�-��� ��Q]�#�x�V�M�+�����.):�W�"_��&Z����(a6b�������DPh#�G8%��b��In�Z����_%��^r��6l�no��+h��b(D�Z�#�	/:L�"��[�������A��v��d��q�$��h���2NQ�b��A�6�E#�Y�b���0_����'���k��K-�����\"�Xzg:��������b�� R#��*�@��/[���S��+B�0����������C��b��%�^��AqD���^�*��?����D�J���2�0!��e(5��g��XQ0b�(�]3�9��SS��H�'�}]�N"����7�. E��C{%�s`��*�g����c�h�&�����I?hvF��j;,J?�f�)M@��n�>w��I��/M�m����U��P"��KG�6�]%!��7c5��6=�K�����>�2�OHJ��>��p�.T���eC��UV�5�]&�)<]�8ka;���|�]��[e��[�0Z�;�d���H��-�����:^9����.?j,�/21��D�q�J��"y�.}���H�6"Q*b�]_��Ru#��*�gy���Q=xt	�i3~�(���^.���w��,�S�D�*�~��J��������*n��@���=Wv��R6����N�t���dn��>
�\�x���l'2�"������
p�(J��EF��D!������D�����s���F�JJ�=u���O��d�s`���O�����uQ����eW�&�D�d,�������i����<�[#�M
d"�Q�z���dp�i��)�����I����jlD��nk4��g�,.R�����fs(0uSz/��v�2_G�bM��|u^��]"8���M.�����D��/*u�����&�hp��o�����uxj���Y�"����>�����M{,�����V��	EQ�������.nO��m���?�H��8rlQ�t/u��!+����a�T�}Q�T{��3M��j��uk��P5�".�����e�|
�"W�[c�
��C��u��,Pa[���c#����CV�N���S��0�dm��f��K$[�� �@�s��F��_��SL^B��V����j�D;2���%ZH{�
�����]�����/��t�LbT���?�m�����1D�B�5��O���w�[�b��y����������*�%	����$w���)\�-B���)�\_��02u_5�v�jD~ :���n �����2l���+�.��)��s
S�&�a#ft5T��9r�@��:���!kR6(�A�|3�&���Q��e8���!"����g������)o DR'����P���O�i�q����#.d����\duQ�_�Q���:�K�F&��%jS���l5���i����!S���%���#)e��;��!u��`���JbH�����J������C#�>J��������I���L[R
R����`#�X�W�b�T�. J�^uG�y�b=Wc�'ic<��Q�����(�����0[�����<�Vv��C:x)�Z�Rn��f�\�z�B��'�����Xqb�
�VY_� �=]����!!Ja�9Wu���U��Y���tr���	��sg����\5"���-�������4|d�Q�A=���Y\�V��'O���6����y�X��>��F�E���P�������=1�d7�i&�
:p7�Cw�0�{(���Fo�}VV�%5$yB�]��E�,-��#��-X�.P��N-!�s���EMi��5�r��������K��P�m�[����a:�3�jq����B3q�.J�4E��A9a��&j%
L�h����`'���^�"E$�5!{}.gU�#�W���=3�6����JaB�n��~�O�!��"&{�������5#M�.�H����.�bV�U���Rh���sC�A��B�i	�k_�����/�e_����f��C�Q�
��_w�����O8���X#zp�o_48Z�M(�D����YG������@����!���F��h�Eo6���e�Y=����WK���HI���B"���i@���h Ct^ArMD
���A�����y�)f��$miL��3f�b�V3R��;V�O�V��y�?�e��k�BK�ROP��;����F��4��lQ{h����=����f4C�B���!��r�(?P����!.��tP���Q[�]��!7�6Bl)�u���F��fL�3B�*��xa�O�(Z�L��Q�Ol��/��n�W��<!�)]�(R������xSJi��X������,ZC:V�>��dU�h����n��1�H�(E-Yw�����]Q��������#�dC��^���@�f�c�#t=1
u.�!�xd)�
k���*x�M,�!��6(�����M�]���|�����I)��t%,B���B��f�r�_Y	SP7�~�:���2Ig_q�w��X�T�,E�!�u�P�2�l32��h�^6�
]�z9��U�ouCzA3&�%|�A�(Y�k���������i�$����,
��K\X_����3�Ef���wh�j~��H���G�q�����x]����_���"�Pp4�[�8��[j�������|��RP)���P0����TX���&��|<D����������qy5�9��X;6z$2����~�B=��� R

���1��H����Hy��&���'�ja�{7,"Z��Ai��o����$Di8��U����|���h���;eD�s/�F�n����
����?_����T���g�k����=�-�e����.��R�M�:S-4y��;�eK�|������K�j	��8��Gl��b����F��#��Q�0E��sj��`!2�B�^4��Bt���B�#�Jh�(0o���W:/9@+J�������;���n�D�|�����HD7"��o���D7Tuw�"��*b��`!$��Iz?�8����!��h��X}��'�~�6���&ZH�S���h���#���~2I�TDE@��k����Z�hj����m�ot7�aK.����4�]��2�|��mlQk���L���c�xY�S��:��sz�5��R������R���z��=�����`���0/�npC��`w����6T���������A��D����X�����P��;.T�#r���!�[�>?+4����VZc*F����O
�@��46ag��r����_�S���vz�3�+h{1n!���g����G8����@��i�����#���������,����&� ��.�fR-�U�Vt{��.T��Uh��8�x��
Q#��2�G_��������u���nD,�FM%�P7�'�C�=�xV��I�b��!=9�@�+�Wc'��~�m�������(�a�4��4����{�v����E{�@����=R�j�Qr�p���T\33�n(C^2R;j��i�=��z>������e�d�-�{�����#=����J�p�W�9��������w��V������[,���S���)YQ�/aW�Q�mE�!2{?�@"YE�D����@�nH�w�B�����E#��D�����)������v�V�D~�_����B~'li;~`�\���f;�k��)��.i�Q��V����GuG�?��-����=�>��9��@������h�j���-��Qr�Dm�a��������%����t$��?��(1������w�`f�����v����t���n�:���H���&�������� s���h4CLB�>\��@G�G�����A*�$zJ	��HD5q���sh��E�������gh�"!Ct�)�����`|�X��5-g5Fm�2�M�'+�@�(TR���������m�����H2�vj�B0���-��+�`wi���M����%����5d94�E�p�
o�wL[�����>z��RB��>��p�����v�D������;/��t$w��jc[M-t
�#;�}��M��!�������+;V��z�p������Fu)t��<2JC}�a�AZ��,Q����G^���������DC��e�i
?�{�W����Djg�1���t+��/
]�*[�j�m�QT���������a�T/���U�gXN'����%�E�������W����i���ax�?�6�FJ��N2q�R��>w���dg/��C���b�^BA��	�GP��`IJ�*5#��5;�A�"����e�s&��#r-��H�� �J��]U�O�T
� �����\	o���j�JY����B$��S*|�s��T��c	���m�
f�z�G�wr��Z#��������DL� ���2�������?Q���
�
�����3����B~����������(�=�����aXA�l�r��NP����nGH����#�R��g9�0��A61CU��J�c4�`�������������Q��i$i\��p5{�^��O�C�c�<��:�Xb?
9%����3:���b���|2�������^��u^P�[6]�A�i��5��������w������}�F�F��i�Av����&�L��|�4�o���F~3a�S���hP�O��2?AE��^������3*�!{�����Xg���XM��\>C��
:]�����6�=��#�ff�|����V
e.�H*tx������:�OR��x��Cy��H��4
	@g�Sj�)�#��4&a�&�V���>���M���j��Lp�
��W�a�h�����_�"�R���L�.�Lz���^>�Ut;��*�VA�����-��hdhu
�4
48{�z^3'���{�
�V��#+lf4�������	��&��3���cn�ol�1!o�)1���=f�r`(�������0�i@����!���I������
��O�
�4% �����I�-*�f����EF�P�d��$��	�����p���E�������P�hK��1������vt����z�P��t���A	���*i4{#��3��t��F�l��;7��`���}�\������q)i��_�E������Kldy1
G,�^�D�($�cB�Q��0P����mB!�c�;�wO���Ug������n6O���[�����@4��(�2����k;��\d	}���@P�4���D|w�A���hmvh]���eR>	>�J���t�.��B[��k`�IRX	���9h�4��:b6��4�RM#
1�LF���l�Oh���1��F*s	:.v�1�f�.s����~�����.����i+���w>W��VF������n9��^���q��L��Z���9��}��������{��4$G1��U7�;�H�f�J���X,��P6�e��i	�*Z]��� �*�5>���r9n�'���M���4�5g%���D������[)�;j������ �-+�']��F�ZO���R����b)����
�&��OP���Z��oM(�e���[1dB��
V0Nl"�$+��GO�������w[��ME��d�w{�����m�������=`E��f���l{$�V��_T�m��d+e���aE����eX@������j^�;W��Z�3Q���&����a�����hjn���}��H��6w�i�X+v���X��R���9IM�@
���[TQ��j���X�v��8!��7����_]8��&[�'�����6� y�Bd�e@!J��%������Q��"�7Vb')9��D�����[�!�bq`'#���l�	��
�����etA�O1�����d�A�f�t0�1�@�yd����E��qq�g�$=c�pD�/|�N��%��,�CK�����@��x	��$A�����:����!D�����I	���h��g��l�zrj{� �F.4��c7�V
�������B�����V���C�xF
���h f\J����aG�@lL�>���.e�pEv�c�X��mv�s�<�U���Jb��J��}�h�tP���K�������������w��w�b��`BO|��Y�`�Y��r�IV-t�0}���Y"3�g�L����Vr#���Me�4I���/�&�SX
� m�r\�"�x�2o"��2��\��Qt��:Y����J��&�h��d#=��'e�a�l�e�A���H+���y�����r-udt������Z�x���.���fT�u��~�T�F�w�0�����H�s���JT���W���c �d%[|*��'
[E�d:��?���������3a�w�Nv�5��$��(L��;&I�N��K@B
Fz�F����w���k��u�����T��/"����'T^2A����JG#=�4��d���~PAfrh��vQ���h�a`PR�$Z��'�.��5(������x}I��m��zn�?����=$����x������X��]r
C�]�X�f���-:��I�*�����)&'b��[+EUz;hC+Y�%*U{����6� �w�5r��&X,���
E�
��'��c��]�X��!���@:�m`�Cw\������"(N�v2��t3� +G	#�t@���W�!�w��>��Lvd	q��qPJ[��H�'�1@e��-5f���m���*�H]�M�EA�1�P6�E�y�\�za�����C��)���i'FI���{��1�M�%)�>~�O���v'����M[#Z�N��8�"l�.�	�^i��UuX�a���
(�K2^�1�V��:���X=�� ��,�v����ZM��wl��Qi�0�
�^����a���o+��Ai����m�?��M����c�#�5N��1���n�����+�s��'���kP!���4�;����y�<�&|p��4��d:(Q���x�e	"�X�f�XR*��:8��`-�>o��$��Y�����������>��9hA�z b�6�p$IE�~e�$t���;�_�Ht�#���pK���'�{��F���DB�p��������;�#���jimE�
:��#��w	U�����X�(S����p������XK1h����.��
)���v=j���bl�zIh!���� �m(BT����B�m�V�wl���!�bN-��Q��v�dR�-F�iU/����������a:<����K����].h�|�=G�@���F�)�qw`GCG@(��#m�����4�Guw1y~��������~���L��	���c�a9NE[���Q�e�,+�����I��N�RA�)|�@&��=�������r#��c �z�B??�������� �-���C��}���d��:�'�Q��$�cB��L}���^gzz�e���e�������J����=~%�*����a	��6������l����xj�x�F�2�}M8��q�
�>5.�-R�fj��<����
rW9A&��H������_���Z1�h�z8�u[2�BW�F�V&:��UM���y2���r�����������}�dD_��~:'|&B!�3�h
S4�O L��p������^Q��a��c�b�O�EEw������,Q/(v�>fY��^�/���'d������;<'&VZv�|�#����,U���"{J�{X���2O�D���)�)�����:�y���*��x��N��3����bt�P$�D�����Q1���CW����)_���w�F��'%�fkK���� ]��h�'�00}5�uF�{����yUv�5�eY�]�=���������;&k���������@���r�j������& ������dRI�4�
����0��i��=���d>x����v})��g�A���0�|�r�n=��Y����H���Bx�����BM�����q>�:|wPN�\��y��C����Lu��A�����X�����lC�{�`n!�I��n]����P�������|
��p����5�0����d�ER������I��_�!�~7#�zy)�-P_�}�Z�B�� X���nOC� #���j�=����y��pO���R���l+�l�vz���������!;�z��+�7<��8C�N2�ow@b(8�J��/QM��4��*F
�;'��JKC�C����������Jz2hP���G���b���M�#�0{���~������	�r���I����y�����!k�;�g7��i����y��t��s�����g� �����5�I�{�i6��')e�A�V����v7�&�d���G���#*�����%�t�o�K-r"x�:���*��*�m#��~�/��Ix��@�-J������C��wx���
)��u:��a�_��hX���4�-���U�h"�8zlA�����Aa�d�]Dd��v�����@%���f������#=���%?o4�Bl�6���R��=���;�P�	^��=����]<����
GQ��:U����|D�*�E!
����2G�j��������%�A%�dl����b0�� {R���d���A�'o���%(�A�^�}4����C�J�M:��u�q	��x�a��P�<<�~���S6^�9��]���mK�L�5\��,�Aw�w�	"�
y� ��_C2������B��������6i��������	�H/i���r�������ZG�)�,8����������:J����:������wx�5����M}[�x��P���mQ����� �M��<2��;�K�:�h{5�P�BeA�frW�VZF�Pc�J�����/
���&�a?�Y�^i���F�5����W5�[$O����;��{��A���HO����D���AP��^��W����]b�7��N[���k&���������,�'`��k�I�N� v��w"�����_	��^'L�F��#��c�}��(�n���o(���D(���~��J�rk�%ODk�Q�.V��^�~�)��G�%54`�a��� �[&l�w��)��L-�A�:r2�����P�I��	h�?W"p�	YBb���C��V�����k�f�����D���FX��x�F'��dG��'�d���N��I�����eT4�&�$����v�T�Y&�5�M��w�.���D���GGbkIb�-�	*�N�f2QJ�e���]YHJ\�Z�Z�����mk�.@'CW5���|j�{������`���A�l���WQt�]�u�a��R������_�p��
��w������%Q��&�C�@P[��(����Y~�	���U�\>�%��s ���m�X�
u� �n������cC��wxL	k^V%r�wx�B����,j��$U�����]�0R�y"���Qp����������L��*��PUWK(��.9���"P.�{���
r��
�<����lt�%��zyM|�+�����>%��3v1� n�B�.��
��vIt�1�����E���I�>H����)����� �{#��v��+�+�:���0����r�k[
:��b�Bo��k��%�R�o�������������F�RR�L��"�n;��k�%D�]>�bPd���v�q����������)v�m3����_��rIN��`�������1���R�hU��t�??�*����Q����It 4.�K���2��)Z�H���B�p%����H�2��s�_���t9���w�A�8���F�*U�����b`B=���)�H2�K`��"�~�*�"��h�z��EYp%����K<��BiP�{��8�B��wdjV�1'�����g��C�
O�HG�F�3�V)@�4O��TV4�����H���ow�}����a��	r�X)���h�Hg�6)�"��F����.�:E(�Amov<2!n����!�{��Od8��Z�#�G29�$b�J9���h�����$V�o���-%it� �d�z�����jVF�NI�r�WA	���\EH�����.F!��,��dV����	|p�N��M���#k5��rFv��d�����]D��w��%�I�-j����EK����j �/5��HC��,#�����^���W5&�����E:���jP�Q���G�w�%M���92�O5!]�@��j�A������D{W5�`�����*��V�
�8tj����n��x`l�o�"������{ a7�V�(��B���V��NgdC�qT�}*��#<]���k7D��/�F��:
��-�J����,��
�w@Uu5� ��P/�wx�G���U��
�N �
J�Ssn����M����$t"3�]
I�eYX�*)��"��]Nl9����u�S����Qq��I���lO�!���C��@}�j��h\�]j��8�"1��I����+b��������,D�F6j4(���;#���D�g%�O|�[�N ��wP*�Cy���|:_ +}����`��
	�j��n������+E�����7'{+�v@u]���$��=F��`�tAl�5� ����@��]��g�X� ��#����1�d�5���1��S2�M��kd�*9�y���^Y�?�����G�36����uSH���/p}#����f��&�:�)��Y��/�
�^��^i�b�/
M��>�o���psY��S`���$��}�	jx>��g�~�����}�b���%�d����w�V�������h�]��+����cV���a}�%��H����o5d��j�A���t���=��������"AT�V0���[n��,����<���wE6����	p�kU#r����W�1H��h����Z�kp |�Y��������%<�>�w�	�M�_��u`�g����Pd�;2��s^����cG�
�w����/�
CuvMV4S���r���k��l�U	B��3,�j�E@
��Ey�b+wMPb��H�'�0hu����2h���x���=������8w��J�#�;d.�������?�}�x�������M�n�NB��f��j@8B3� �M�;f0��?�r�M4c	}	-0�����S��"�����b����-fIN�����d�`:-0B�����+�O��J�:LQ��@D[�����F�Q�[	_V������O$)J�����A+u�x�3K�Y��|X����:��VsLCS.�I��t���q�oy�h�y9�6Z
��0��OZ%��Y��0��9b'��������E+�������v�3S"cZ���
����v$���-�X��Z$2#F�
(�o�4%[L��MP�h13-���&4����7��TD2r��������I�6��#�y���L��
�W�������B�����2,���H������c?����]6�l�'�|6_ol�a�Oo@�L�rl�a�����������E����@���sN�n2`�9�{��9EO��^pSJ���*����f�����Q�
rQ0���Z��#(PR�{��N�� ���qA��}F
j_7Cv���m��:�w`8��k�����m��+N��A����!�^3X`��6}Q���I�G�I����7CK�ez���6c��e=�hH��n��S��m���E������"�������
��gY���U��2m8+��:����c0Q��\y�)H�U�����,�Q�������?V,��T��9�������=��td�h���l�70�@�q��rGFo<!l�3`�9�^����g=3�Y�K��d�����m�t�����<��qv;��8�O��F���"$q[x�����N�dpe��1���"/��gY���Al���2#S`�i������?���om������S
T�����{���
D�<Rx�<B����O��T��w���n�}u� �t&b	��8M�%�F�-�6uM ��~Q�'�=`�~HO���I��kR/�w$���$�l�_7��/X�#6���-�� SaTytC
����+�B����h���B������3 Qr�1��
��*������+�����@���45|�D�UM����&tX�F$WT�":|t�
US�(CeS7����O���~m�	�����{��j<T��)��iS��nt����$�F����
%��nL�9]f�+E��Y���[�8T�z��~��,#���r
3N�dd���-��;�����w7�P�w�����n B:#���{�nW]��>��+��Rhe���h���E�����	56���P��b����S32��%\�����}�"������TP@d�hb&�q��
}����K�Q1�}�@�!����@�1,S���������-��K�-%h�MAC������@�G�%%F=�H�%{��I*2���$�F}��U���K����:��
vV�w!Eb�{!f��
S�������}����dX(���(�G�~U��v���G��ZE=FI�KZ��?��W�V�[�J;�Q���r����}+r��T742"�C�n�B���FgU&������;B$�>Ckr��w�d{��aD�U�/t��G��N�.PC����
����'[���	X!�8�
��)�_�������B���
�N�%t��wS��������M���h�<|�dR�M_�\�3�1z\�%ns�"����Z���MC&H������`�R�����a��������vs��qH�o[nw\CN�?$"gxo�ZAr"�G��6�����FN���d2f@O�4R�V�,���M��&�H�C����!=1��A�

���I�L�X<�-��������U����N���KYjAo=zq���t|�
dF+z����*�����0RaU�=t��t�����s�x>�A���N"����0H��t�@���!�G��6��"f��vn�^�
����A��������{������i��Ft�l���k��h>�5�f�:Jp�AA����%"����a��
Iy��T��_a��6!w�HKK�!��0������fL��%�y��<:CV-���Q�t�����H�3�.�M�����'��9�&���A��9(�`F��j��t�7
��F�����`����$L)�n�&��	�D��7�\A���>�)�]��o��E/�J�a�nS��H� ������x������?�P�Y��J���2�C:��+��^dv�n�I*Y������x�#~G���":��pe,�O�N����a��$.7[�_���H�l-���=����N��zy-P��A��B���h������F�P�k-m�!���'ea#Xq�T�h �}:���m�fcm/��Rh���'7���:�b����
��}����SB&D���������WF7�L��
�
�B����=y�v�3Z���)
Z}c��Z$����F��1��C��J
-"ItV|,+]?t����b&Q1b��x��%��2D,o�<R_p�B���&��|�����<IF\���j"|�FyXW���%v
9o����6x��t��q ��1��D
�6���/&�F����������P)TGy���
���Q�
X2�0J��s��l �����;�jX&BA��>1��
&�
cG��|&BA�{b(�f$�Y^|*!��)rGe���]`�/G6A"p�z
�6\�����F4
�'�[�f&�1B�5��D���I-�&��������m��(�N�KN���W?
(�NZq��
��!c��]��u&\���'^�S6�!(R�4��D,�����f�9*�x�4.�������7�
����9��=�1CW�W��xmP�i����|��r���WN#
���������I���}e���4����i���������C���$���/Z���'�4�
w�5���]p���M�`�TI���p����f���Y%����1�(t^��a���`���\o��1��_�a��j0
?,�s�lx�s�Kx`7��=���
������"Z(Z�U~�-�-����e|,�������~�
������>K4�':9������
�g?�3�/*������hB����2���:^����[.�������\������f$
h�����
	���=�E�)E�<�;O�J��
K�'DQRJ�R�uA��%��I6���-��'�fl�iLB^�l3Q����&Q��"$B��-����~��x�U�G��b}����4��<Ogb�U�)�m����b�b�>T�SOV���F%����������M����o�.K����F!X��L�������0f4����9
E��JJ����B���+6��
B���_xz8��r`�.���F"<���
qw�)��vl����Kw���eH�L����-n���F*���T#3Y�WJW�}�@����t^���R_(���BF�]nh@�s��T�15|��Z��d�S��S�("��S�
�tY5c�Bam��D�q����C�pG>4���]5�K������3��ub�T�<O��i����5���T��������D/h�@&���'�u/�(f�;
N���5��'���a=���\���:=�����j���aU������n`	i�D@�<1-����@eGT/I�PPSx�!����J��:Zh�\F"�����pac��2� �\����p+aS~���#� ���|�����y^����
���I�"f�����w�<&��-bE����A���Zl�Xf���6���LkA����Vi�Fk1-C[��~�'�����Q5�=Q<��KHr��0y����]�����~���3����Z�#�9�C5�H��-���ku8�/E�Phh%�A��Q`�2�����Lf�FZ�e�����3TW����VR��)d�?��%�9B����X�7��R��D�
6���M����Z!�2��2���"y�+���W<���Ag���%��k����V��y�1�U��$����@����Lz�]	r����������W��=�H�gL|����k�mH��X	_�F�s1���>�q��������S���l�6� Y���`����57[���?�6n�A�+u�
�o�8"�118o�J6����nPA��1-��i^�!-4k��t�v7�����d������7��<[A���"{��rKa6���>|a��TX:�A6H�M���:k��+�����al���V�#����fup����"�� ��2� ��a#����
vU!t�!3z5"Y�B��B�Y}�L4����A���'�k�/��C�L�[�I9&!��ox�V�����>�.[P4�V��%f{	��J��%��7J	����ut�g�}����i<"/,�
�V�#���U����
���yKhdK����My��(C��`G�cV�%��@)'�Q�$��0����?���_-�����J�Z:���`�d���,c�K��(H�"�1�V�����n8��w-D�b�z��D?Eo�����x]��,������<�'�c�g}����^��x �	����{2|7���bF^;��22��
)L�	&ZBv���[�a���l�Bf�N�3��n���hf-��D�Hgj<T����_�`�����Ld7� z%1��/f���g/loP�$I��U���/�$(���T�1�{T��`�G)����]2��T��?9C�>U=37T��p�����0B����[�{6<�1�Lk��;j���>K����[)�����(P���,��O�w�
C&���m���J������Q���2M�/O�r�L���n{��"Y4s������*m��j�&��m���}":���)c���6::/�/ZG-�7c=�g���E;~J��udt���vPr<�|o�YA�wa����;%2ol����;�#�����(O�����+C�!I�~��N�;��R���8%�`��������b��1�hf��
G�.''�E��ELl#.f>_��0��h�e�������mv�����h`E�a�%��dI�#�������J�R�1���-Q>z|'��*�iv@��=���f`�6&L��E��J�v�	8h�u^�O�: �pk���f�_�q)n��F��EbG��dt��[r�(��1XR(:+i�/��8jvP c��V����D(mp��B��!�?������>��B){�lQ�a�6
������[E���G�*�6A�3 ����@/[�?
�^w��Wi���6����{<40kp��	��1�������(a�S; ���������;����3!rDu��7��1Rn���At"��x�u��A�H�V�&��(������5�Tz�
���v"�|��"�U����H�N:qO�b,`vgh
����K�&b�PB�OP���M�,>?���S�i�q!�A�;8x��Mn�d8{&G}.'J��{����a����y~����|����4t*>��C���A(�8C����X��6�y~�]��AIw����@��W�-��}�9�fO�����������b�CC���2��N�[����p�=��)(��ZR��l�r�������W���B[��F!�h�	����=���BR��Z4�f�;��k�3Z�1�_�+le+h������ !�N������D��@�B���@3�;5M�������6m��j A�Z*{��=P�Ub�vz��,�G�lC�dA�k��8�d��Dj�d}����~E[�[����Z
�����r�4��>�2����B����<O����l����R,m�@'�c ��Q��6��#��=����R���a~��!!X�	�p>� ��!y!+2�V���+iS�I��������R��d, "�I�2x�V�NOv'�������'lZ5�����8�G�"�@����|���f���rO�8�$�Y!'��Ar���e�I�#�w���� �*��;���=�=�|������,����RW��������d@�p�8���<��/����\0�FV6�q���/��u9{�V�An�+�B������#
�I���_�������)�>t	w4$��o��>���/��E�.)mc�
crP�j����`q�������JL��xhRP]��f��r�����]�P��c�@�b���Ow�'�Y�j:*�eP_�f���x�8�3V�1�������A|�,�����7�x�W�Q?#��:q<:���?�!3I��<��n��	i;B����I����a���p�(�����-
�6`h�1F �sR!�;'@��
��� ��I3�>�c�@�����dU��Y�^���g�4�!D��07�����	����>D�e5�\O�k�?��(���6�^c����3����CJQr�;��Ez�����kD����+[_Q=�6�%7Yr��9?�`h�;�q��E��Rl����H���z:���pz/���J��Yphx�+"���2���99tR:�#}�P�y�%�r�~/������
JD����5L
��XP
����������X=KL����~�����wx�IQ���d�a�4�.q�4�w�N��|B�;�Q9�l-��d���d���0��}��F��w�q��'4�� i�����#M�����F%�f����{����%�hd�#������Et������F��Sy}z��d�UR��1W>������
s��H���"&�5��'ZuR�_{#���q���S�@+e�Bt&�	A������v�VK_z���M!�s��x�J�$�)&�������&�z�1�Vs��4����%HL�����*�
M����P��L��9m��'i7�(�X��q�(��+���^d����d~,
����f�K8�=Y���>�E����hO<7��=�Cl�&*�`@�{!�6��/���)��aC�w�Eo-�DS
�d���w,�.������o�BnK����M�#c9XDVA#
��+�.4����p�����!�u�iR�B��|���%����	P����u�B�_����c�n���!��{��7gEC$�w�x}��������^{�Yu���F���5B�E�QB�%�`�vES�����p�yR��w�=�dB��;����@v���"
�_�|����=�/
�`�����M�777,*Q/dxb5|�2<�"�A[�r�C[R\J���y%ZA��V9��x�C�=m ����z��)p��=�'u���,�UyPL����G5�s7�%��>n��x�G7����;2�6��J��{JP�F�d����	1��B��u��6����W����x|�N���������W�����blA��5��a��D�������%}�@V��a��$B��x�P~�.	���������H��b����=�v�;/_�3c���y��C��>i��-1�laN3���d�j���"��
h���&�?;P2�-_r���	����-�������
TCU"�S10P��z��RUZ���\��/����d�JL}�F���5�SF������������]�����gI�7����l����������|���)�A�O�A;�SZ2���fz��b�=7�$w�j�����h�S���g�S������D��^�+�ph�p���A�85%��z��WCF<��v�/]�������+@TO���%,�_i���Y��������Cl�����iV�;�3hH_����&���
j�]��Z��
.����S�L���Mw��8U�_l���*���.	)��|���v[�����J����NZd*�:4�<�����@���>��bA�6������_u��/����n;�N${%!�A�a�\�m����B����������bl@�eaw��D������|%0��_��&p��<
'�wt�������UQ��y��nq�_�������B���+�EeG`I���\���B|�aF�|����$Eg4b��^���.B����}J�t��t��}	a.J�����#�,�G�QC�*hcqTE�Do���q��Z�0��V�!P�j�����n
2g�VT�T56�6������J��qP2�{����u�.]^&h���~Ny=sc]�-%z��'���(����A�r����J'���46����84)��@	G}$4�f4�@�^	^ ����	�(
�v'1����:���6I�|�$a�����4j2�o�F�hC�~5� ��!��-a'4�;���f�ji���.h�7[���kd
r�{hr��O�+���b�=�&_
:H�B�#�ZM�_bvy���!��C@"S �K5!�J����������k�32���b%�TV�U��;�������gPE��i�uDC��jtBE�,P���q���t)-$�d��V�,��w���;�T��D6����kHs(�������g�����Y�v	F�pK�Q����	������f��!���@�n��d'��p���O5h1Q/��$��_C[�mh�"����F����"�Sk@�����q7�}�q
���J��_� t��-=��,)�����<�J��<�\�:E��JO������.���c__P���X|j�F@�}���:�����fOe��M@(g5�!��Bd����~Dp��VYt�q^�O�C:M����/���� �7��}���^w�2�
	#��V���}�5U�#�`C�2DR�I�V���L��J�>��Hc�m�?k�����
�����}��w==r"$�"Q���\*T��48R��5���9a���D���Y��=fty��{��������5��e�i�]_
�����'ZK��d����������8�V/�E�j��������j�6qt��O%��J#&Z D&_��:g���b�p��El$��3���>h\&�H�s��z��J���%�,aJwDj�L��$��09������1"�YqQG�=��n��:�'��e�� ��S����A�o�%[��f�����j�&�*+""��b'���C�8�&&�5�u����Xrl�uJY<u�,���U,�@-������:������a����v�����5��������l�����X2�B5o5(
�������(R��U#)b��9�^L ���(�} �n�70B�ojB�,E�%�
+!���6k']E�$�K;?�����S[�us��$��D�wF�l�>������ �����<{������%�`6k
�,�6#$Z�T��w�>�?�5�}����{O<����I36�9�
�g�cO�E�5�T��l�v�#�����&*��E��|CJ3�����F���-����Ng���Q�}�VA��V�q!_q+�3A������)R��c����/���������}Otl�1��%������t+q�ra�\���*�<C.�wQ��9��A-�?����5�\���PL��P�q��G������Ia���V`���\i�Y��>�����F�t��9����EM�#'9I�)�sUf�$o$�l��`�@�y��������EO��]~��[���o�CbguH*�W��������)�XdA���[�Q�&���Z(H�4*`j����e������~���wcD�iI����z������������$&�<��AM�O����)[��j���=�����?-��.��H<�����'J,���k�i��a����6["���T��70GWq��m�c�OFM\�56;�D�!���r(!+�c%��=��d26��j=��`�����G���K��"A��1��MF<nF2Pl�;(��cY��|�_�N!&'V�4���������o�Hsw[���~v$E%��b����B��{v$
:qKSq��������Dd�8h�ANNNg���T{����B�P��i�r���Q�u�fj�(������2�.���i��C��Vl���Fl��P�6"o6�Ek1v�/��Rf^��n�B	
���J��������p�.�&D4��e���$�j	���Di}�$"8�%�z����M-�����v_�N���#��N�dR)q���$V�����)7�-����Z���t������K�;4x��DL����1�1��|.c�$j+|O8�2.G�V�Uv�xTK(�[���{��pt
��XS�'��M��lOX��d��>�����-���wPvd�*]1��z��d}�]':�]'�L5N�S���v#
J��}k��[OO�R�H+��3���Mz�j��~g�G��[��M�G,�&&r��Fd!1D��q`|��%��:D�@h�{�c6^��k�(�y;��/F����h�*�5"��5��Csz��w�R�Q�RV�������:����k�vG���HF���x��k���<l�����~m�k�=8����[W�����&�������@;>H����nE�1�;��*�z���iK)���[��QW���c������������Q��l���S�$T��}{I���mT\�T:����;Cb��f�>�@,�n��b�'��BG������� ���G0����v,����?�����*{�Sg��j0dO���p����jUE
���ZLD/@O�p�yC�@|d��?Y��W�3����9&���YO�1��Q��Q�������Y��\
%ES&�V�����s�A�z����r�������6��z|D#�?]�g�����i�����`������,`����]]���L���N�Fd� ���h���z|�p�6;y����v��C��0"�#��G��_��F���2{r����@�^�����B5\I{��������JT���:�OZjz
�EiS�U�I��] �*�T���+DK6���L�:����10  ����c�����h������8�L��&l�%� V ����l���$��w����7�U�w*9��
D)HQ�A����F�)�����4����O�������e;?�n��y��v���z4���m�WrOW(1��k�e��3!�v#j��s�c�(�����{w+t
�l#N���'x0FZ�Fy@����
$��K8
���Q5����:$���;+��G0�<����#�Rd��?VR��Az���l��HXKh��d��Q����)�%
�f�=�a�:����.t ��&�����+t�J�S�3.��>I��7�0"]T:�����QJ$�U������V����+�0q���e,J/a��T����$$��	�VQ�[�a}L�+d^`����Y��������6�~�0V�e����Q3?�	3��,�7�0P1E'W-�����"������"���F����QE�����!	���(fG�a4B�a?lyg���^�WE���$��������:��Bg��f�#��v������OTq����!{{t~��B��@��Xi?<h��u"��99��Y���>���[=zvh��q�8���F"T�J�e��Z�2�j�x=�B����7��8�*i$|B�k�A$�B��Hq�=[iF���#�:W�����Poo����l��^����lo����_�rA����i��_��i/Pl��j�e��O4�D;�����
��/u��_���-�n�����
�Q�:��x�^<�m�xA�������M���<E�e-������i4V�&%�����5H�m�tvH����E�u��;���Xx6����y������g��o"�js�j�4��:>���.���PN����Qn�0 �z�Pi�����^���%���E���=C���a�Fe�&����H����pA&��vN5qL�w��*{,	�Rh��@�K����BS2G�&�G� �s)�S$��w�zF��
{DN�=�������O�p?�!���\V7�E|�K&j��aI��K���s�F
���@��%���W,T���a	1�t��r�F����e�M�����p����O,�O2�i{>�L��!���S��|\ECLY�c�	��E���Y���8/�d��$K�������w��#������rzD��4>��]d!�
5��^M*�i|�-=�-��e�_������et�
�D8KO��2����0�R��8��~�
=����3J�QJ$����������(7hF5�ZHs���"b�McR�/�����~c�rpm_�
:���@��%����B���\U6����m-�q�1�B�;���E�8���n����z3�G�Cm���U`h����i<����= �(����v�7r���7z��X[tGP3�|6��Q�Yd&�a�t�������`K��;P�p~�B���4� 5��e��d��1���c�4� ���:������d��H1��fU�Ry�������eZ1Y�b����Q�*�u{=lcQq��
�C�����F�0����X���70�������"�eKPM4l�#ki�gP��CU1�c����@�A
���%�*������Y+�w?q�Y�����J�c��!Y��z�'���eOZM5�t_�02g���[�Q�wF�0?�zu�5A�Q���d�qF�����JX,Oa����k�A����d'�`
�WG@�&+�8(���U<��$a��e ��\���7��Vs���.]��%2�*����?�(���QRG�N��f��TB-0�@��i�A*�IsgL�D\���ZdCD����^a}3vI�����RI;lg� ��T:l�I��jv�����{4��p?��T%���s'=�a�of~4�� K�QB����E��M����K0�x���02��:�i�(���``�L�o?��*��;
P(�F5
�&�P��r�yV�>� z���������\�?�G��Br*�����,�����z�Q-d�-�J/x���R��H3�4=�YF#�������� �Y/p�_��W�@��$"�'�)C���Wi�jc����R�v������U8�*|��>�%a_��������krPcQ�*�h�^��E:Cs�D���q*_\�.���Fm���V��+����W}D�$�����fl�����o���BGy+�u2W��zz�t�aq���}���A�>�dQ+�^�sl�2� �FiH�I���vh��`���"{@��j��&U-���e��QwtE�0kb��a���ek-��#.�Rj(\���������
��@��Z��e��H�+����R��OVt2(��V������V��yo�-A%���:M�M�~�IYE�2�*��eI����a��
-����RW��e#�mKAO����A��e���e�K�v��~�j��KdW���O��W��
�sgjP�*A��K(T^�=���|���x��@�YRL���#k��o�i,�*>'�iu�L��rH���NB�!6�.c�&��f����$?����M�F�����*��F�|k�c��|�I�`=!1_+��f�3�2�>^��ZQ��gQ��Z���5�n=�I2q�+�_<+,�+��\�~f������w_���kb��d�k�g�dl%Os4<�Hz�R[o��6����m�z���ClC��R	-Z���X__��N��,K�O1�Rc�fA]�p2��2��ZU����d�$���gxK������!�U����^CLoT�Zp���V|V��RQE������5���",�X,==;�aSr������$a�0�a{���*2!Z=�(~I8���:
��< U���X���=)3e�w�aH�:��;���#�f��LL�#n
yp;*���f"��6����i�Fb"nRP���y�n�	���cN8������
re��q�Bw=+�F(��������g3�����^��n���]�91�f��]���N�c���XG6<�D�z�~��r�5z�1�2s�|�Or����w�5{�v���=����\yEL���v����y����s���:�Q��m���#�6���vt�12���y}��?�7��g���0,��u"��v����{�V"�a�����wr�T��A�>�M62:5�d�w��d��E��c�����0������Q�dO`)";�H���P
���o�u����M{��������y�4L��(�,7g�����v�7�Ke���-�n�����5HZ��;�v�=���E�_�}�5w8Z��3PH�� �^����c���mHS><H7_��	wV�5+���h��N���t�r��RD�P0	�!R����*�`N���#CF�mG1�b��	�G���Q�qA��B[O����,������Lv�����|o�'�z<���t��v�w�O�7�5D��`���X�:������:rE�$��h��<|�G���D�s��*t���9koX�7#�������6�����\����f��	y�V�<�H�� �I�d����ZC�!
�do� ��K�V4�
&���,Jc�Z0	�w

!%�0�R�������|g����5��]��3��2��	�
2!%AU}�(x����,JX=�l�����K9(jyh2lF���x�d]:��x+�\yF��_;�7�lst�54�f�O#u��DDd���$e�	�N:]����0��7� ��|MzTE��>�.�y%�A�����hQ���|��a�;��e�������Fl�PDd����:o�0�U�\��@��ef���A�����'�I����r���:='�I�5WK�AN&�;	x@�����O������F����2�=������B�����o	y����
v�E3,��,;�'n�2Qe��)�=V6����,s�X��YX'nI��v��:T~� �f�hV�8�N
~"JP�$�%���P�M���N�&xj-�G.J�<6���_Or�V� �*��y���n���&�V������f�n�.i4[�Fj�c��Q��!��3�����vH5�U?�'8A�pWh��0A�H.x">�ML�l����<�O��V�����>�G�JB������RE8{j�>��s��>�Yq&tVI��R��������L��!V$�Y6v��3��B$F�Ezi�
�e��q�NI�E�&c
Y�q���6����G���.E�pq�Y�Xu��?#�w�e�����s[����i�Q���R��q�v'{��S&���g��i��	 �hTn}�����6A��zbx$?t4���D�v�������	Z�F��������`�����M��Vn�[�������4C"4�:E��,�=b�o��1��/�������'�	:�!8�����j�n�B�����i�R$#0V����r��;���+��+1`'"���W��=���|�x�	�:^����k#)���rv��/C��H�z���D34�v��>��@����Q����@k���R��l�u�������-�{F%9;����x4;��/wW�\�<�'~��?#<n�/��<����fu8`��'�|��q��)�
�����n}��!���&��bK������t�w�?������(Q�� ����sY�GW�S�PK�R?Rn��R�U_+ test_data/5_10^5_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux����O�M������F������*��bJ4U��bD�F,`��AoF#�;�f�}�t����2��>�q�3;v��������/�/��_���������?������_�?����_��������?����_�������������?���(�O���������������_�����������������'�������_\�/����������_�����y�k������/��^����������������/���s�����������������?����/~�?�������?������7����_��������E����_��������������?��_��/���������_�����U�������z��?���Y��O�����<�F��G�����^������W?���]��|.7��/��E���Fy��Z�r���0����K�]��~}���^�[��������{����q/�����������������Ony=������~}���E�^{�k?���]����}����6[��-���.�c�>�z/���=��V_������Z�����_�]D��6O�C�w���m����)�:�<���]��y2g|~(�e��_�n�U<�4���~�n�����n������^�w�z�~�7V��Um�y?����i�ye?�����U�����>���[��?�-���?��-un4/����<���gU*xLI�yB��~;Vm.�������l������~�6m���	�(t��!���������Z�K}V��o��
U��n[��~h�?�n������-k/�v�?���6T�g�*���M�j���/��������~7m����a�@���>�@D��M{�y������/�k���;�iw���to�Vh�����6��]���3��e>��-��R�=��
��}%��~��M/ }��vO_��n:�����9�{����|��z��{����;�E��l�������L���
m�r#���Bxp�P�&UJ|�l�^�b��+���iI�����������)74���?>��@Z2K~��W�$���A��J�V��]������,�y7���}����L���KE��;���]���Yv��}��}����on:�V�p��K���7�q8���lp������6������N��������&���a7Si�R����7�������6S����ti�U���^�f)�^����6�#�����4`�����)��/�n����B�r�������5����4�������Q���Y�=�A�����:�oqK�A.�4Ia���~���~"n�oo��n>rT ����i���9�~;i�G<��8?��*�T|����}�@d�C���_���zW�$7:�����`+��'9����+<�_������u��uq�y����h������w7o���g��	p����y�Qn]`�O�n��Qyy���S*K��g�M���Q>������%�����\������������}�:��Q>�{[��n`��o������]�{��;�n!��}����G[p��=���I1�]?�y.i@���n1,��R~�z�e;7�+��(A��v��N���#7Xa�r(����f����V�e���-����"�|�+'7l7:VP,#����k,�mm%{���t���6y?5h�M-.��CW�z?_=X2���[cZ�������������s��}O�q�N����qq���b�P���[�Tqtd/���O����Y�����0�~���qfF�E��{���6��fV@�Z��u�E'����P\l�=V���v+YP�c����=^ID���v
C��q�[���W�d�F2���u)��B�
P�b<}I�H�������l�F1��������n�^������b�Ynh�x9�
���y�BmE�v��u���rh������1d)F�����/��GXc*�������Yp������@� �[?7�����g����F�T]�P����>��c������$b
Qbe���QE=�p�V����w�S��T�%<(��e��s��GG'y�!x�����W}3P��
�o�i+F�]�)k.(�2������bM��u��nf7�Q9�RfTS����3���� �]��������<��Gy,��O����;�8���H����E���r����
d�}��.����b���{_���O�I��������H�H�C��f�9�% !�/��dk�������&%�<9��������+}+�qw���p�%E��q���r1(����q�}����{���j\~��tf1<�e�<V�{-B`��7^_����h`.�|�.�i��0�#.�����/C��	������[��!��1|t����	i ����J����:���s���D��W�D��op3L�~�Z}X����uJ��`����N���%���|�����~����+���@���y��4"�����
�<����XQ���`�W������t���G5(��;H��Qxm���j�}������J5��n,;'=�P�>�j,�f��j��w���
���6"C.�K��I���O*J~�8��B�e�J&������o]��<i���WT�U6J�V��
rg�i��T����d��G!��_��E��[k���<�����Q��n:$
����A��x	�	��jD����*[�hCkK���V����@����V���(+�����~ow�`���[��I���w��f~��}'A�@�M���I�X��C��d�qP%��G���S5�N��jP��;]7�k�,vp�����4��&��Cm0:K@|6�^�3��+���c]��&f�d������!l�;�[
�X����$���i�7lj�����v9�
�o?�[�*�F�U>/�U���~������v3�.�@
a�cH	\�9�=W�-t`��q�������${�����jh���B����9c'��x�R�z+�q�*
�w���D�����fF�+`!���=(hv�:�	gP�"����V��t�y~�6��h5���������Ha?�JE(��E�?#�c���F��m#�Mt��t���@j��Gm
���Pv��q��!��0����������m^��:Q\E���<u�7V��l�y9�'a��;Q����<���7������m���!�����F��%��G�?u���Kj���krinh@����VC(	�����xo��&I��w�m
����D@-_9a�o����2�@5���-[��C�[N��:�n-���F5�>�D�a6
`��Y�d�K|��7I��sN��T����)]yC�=��a���^�t�6��gK�aK���W���5KH�I
�f�^��	RY�>�b�0Z�E?�����C~�y����L��_E��'��Z�h�l���z�'�ee�f�~���Z���1�
����@-�Jj���2�
@�V��~����S$���Rz$���|��O����=���b �	���x�@	���(i���k�)�h�\��������6\!������G���	x�Y=8����>�MG���������M-^2�����gS�p�5#�]z$��a����� �f�����Ws��u_I�
��R����T�5C�7�8]�����n��oi��~�����:���`�����E@3��A��"��	;���V��lv�����$`�������{���-�}���f��$���\L^��y_�$�K�e�N�9C��b�(�N��q�?y~`|�QF����)�[|��
��A�.����W�\1'I�/Q�z��=l��~F.nzU���x#��\#y����=@e�HRh#�E�h`U6�$E������_LW��#���A�Q�[-�7s�|�1R�wk�y%�(��m���^=7��f�r��uk�"�;�������1��f��46��$[z�i�H�D)Vo��Q��������KHD2�(��M���qap��W V�B
�w 0n����!<G���J���x�q���7��"7�������$5���k���s��ur���F�����v{�����%�������E>G#��>�!]��D�bns�*��V$^�Q���p���@y��w����A-r���\m��Q��XS�r\!���������=q�4p�I��S�<���8M�F�`~���5)�������M7b/R���=�0���\K)7[����?(?������uH\%���<���
����F	�?���'�����z���L�&�����w#`�A�)!e�O:����#�rt�������=����e
=��4No�,6���?�v��D������'���P���q�u7����"�p�.F^��U'���A�l�
�/���
�Oy����}�M���]!����^��A�t/?���9���
��n�]����G��G>��l�S����k��h��4F�����\��j�3�nq�F�e��|]�?2J!1�����{��[Iuu�h�����r ��=zn���t�� ^�W���]�Nb��K��:�y�__�[ Z��g����b��3���|]�L�����KZE~y�'�����F��1'��d���@u�[��O���@�@ _d�
vH���gGbA'��G�z��@-�c[>��������c0��~����$�����-����GL��5�*d+���A#����Z�bS#����mPN.p����<�[��Cq�?�,K�������i�\�\c�7b�|��D
����n^+����D���L?�����g�=+�8	C�2�	i,�����K���MU���F�m��}���@���b�|��O@��Q8�i4��2+���Yq�|��*�����_F�b�IM���i�������qt�[�5���W:�����G�L�Yq/���D6s��8�%��D�c���t7z~���������h���	Bf�\F�V�HV"����1t^����y��C-KR���\3���$���}���}$`�O�����_���K�OM{T��4h��	����u��CBO{O�)�<`�z,fT����D{���YJ-M���`.=�|N���r��zl�%����`�1uOc����UY�iM�/�H��m\�dt�����H���1�1�J	�1A�9����A��.�3>q���=k��O�|�\����0���+_�5<�FBp�p��r3��ys0�<4���O���������m��[&DTZ�0�*�����]%!�rOG�0/	�
k�;S����Q~|q�aFlk����0"?�r��G�;�@��w�P"���m�KjX��!L��{D��9�%�"@x���Z�lN,�x�t@<����� ��jt��O���#n4w���D�Dj)�.��O�0��xAuM|��4���}��kOW��&�@/(�����RO'Q'��!�w�%Xg�uJQ&������k�Asl���37���6����������q/2\�?r<z O���*���x
�����X�a4]y"�Q�kd����'-6pX���=uQ1�0�>��������V6	|jo
�9
����J�	���h��6��@�iq�b�aH�������z+@S?F&��$F�l�A���G�2yA�/�H����n������:��2c�~+Fw�I����dy�x��m-Kr��(��&����Fw������}����{��*@���d?��IK�>��QJ���g����'�'�,�qm�XAM�0$/�\�V!�LF������#q|��-+9���������z����
�Oc%?��8a�]}�-vc��'���#���8"=������������F��6�lYB >�����9���o�
�u���6��7v����tV�\���?O�p�i'�$%��]��'�
���X�W��5n%)�1�c����:��K�
�H'�*E��`��Fry����J�0r!�,��z�@�8�&��������"����KP(�Ljg'��0qp�@�;E�����j�f3���V�
(�����v@\N#���������'^����e���o���kY�|c�fy���������
{����� I�,?���	��fxW��g��j�W~�X� ���u�i�H��w
�%��i�]�aJ��4��byC!�B� �)re��gg������h�,mf<��<i��ZG�6��i�]����_�:�r���\1X��xa��������}E3#Z��m�+J�����0��K�E���u��9_���F�O��;o�ZR��:���}��]��&]��_��`rWSh

�"L�_��6���+�8x�%�>k�
����V_�2�D~����2�����;
���z�^EAY��AP�i@�X�>z���q4������{���CU�FI�`���U����.K5�|9�����#rq���H�r
h���A\J��������d,��_���4���i�]Gv��`�������QKzK������V)�."��#-��3E9��o���u�^X��b��7�%&�s�#+������f���-@�2��jc?����h���+���T����]cV���^G3B����}u��W�;�fi��Y����;�Ue��it�(�f&�����0#��	�ds)f��@�8cS�VoF�LC����Ww!��3�v)�F���	��.������Og�L��1iv/���^��)��$�%?@Jg���"�}��;�w�1���/]��UL
�{(�W�^GO�c��A�]����q���������2�	��"B��#cg~d��$��k��0c�.(��Z�a�4��M)�K��h�!��d��-P��[:�\=����C�imP��aF�.��;OwD�57���@�K�'y��������T�8�<p�s#_���;��-��E�^:x�\.��d����wP���S�s}�B�	.�^��3�E_��O�e@��N����?�&g�*b��e;�>��t���}���#�;}��+���r"��D�p������	�2�L�*Jf��s������e����
���2�.@"i�&b�H�Y������e,��ZN��rWo�/�"��w�����
��U�I��j���!'�!t�-������&O��:��������#E�28�RI�?�������w���%���D\�@��^P��1���S`��Z����
��1��w�������U`a������j�&#?�8����6fM��PF(x����w�rz��'�&9��x��NUg<xj=-��W%�j�%w���M���hBN������gf�
��uZ�%��gqKH`p^�\����ik�Y����#r+��:������z���GxQ'-���
#������S�'x���W�t�tE+b
�{<9A��k��$���' �����y����%N+�y�����&���A��
7��"GA|���zc�+�}������i�j����V��!0����
�nZ����}n&����;c���x[,#^kO�@�d���KW�Q� ���^]���$F;�	H�Y?�*6]��	W���L�HL��,��j[8.EIL`~��[bzb�`o�8��������[[�V�N����S���W�������o���<IF��Op��d���1�q%x�G<x8q���
u��m�2��c�e��dLny~�e���E���'[ouIV@��������������i|����$W�E�(&�%!��	^����WA���7�}�v�����"*�E�]>�'py��$U��G�M�$&�q]h@��-��j���:w���������;R������O@�o�[��/�D�������"��������d��d������# %�&4?FZ�>�m"@�L��������2�l���GC=�a�$����DM��}$�&dw+���O;��@����M%�(��tN[t����hO������$�Z�tJ�����6�a�'��w�Xgd�I��m��D�!����}��h!M�$���X�~)
IK�6�_���k���x��]�q�/�������\�l��g�G��q��s�S$`w��� �~
����I��$��5�������Z~�	^>F�M�79Z3��f�#Re�>8����6w:�Ui�_AL�v���	5UA3�6��i	Jf4%
 �;�6��������IO���?Z�I�Q��Yl��6~�����8�l���$�.��V�'�5$PE4����+������rwtohIb��0n�������k��MF5S�,���G����)�Wp��KTMyh�?1J����5����q�Q��p(�����Q�`X��nn|0�����P�
+�
���$���4�Ft;�WuNlC�����\�4�h����y�2�@�9bA=U�����x������(����+����ct���_�:�����U��%ew�t�PcQ���5jpP���!`�m@]��1��A��0�P������7��#��������$nf�9���Q���
���K��+Svo��jeV,��'q��;t����w���
�u��P3��q�z���1����0a������d�d,�-r4����t�t���^��hk�,��]���$����[�����/�A�]R����-T�/@�����c��x�����8���Es�����e7%=�=�<�|,'�\��:�
�_��"e��s%�"�5�����t�T�y����G^���.��A�h�@W�P�H]��nu
,���O�[�����l��HZu�o��O"�acN��m�sU�
���v�w0TBm���R����NLl��:�?j���=>�(9�o�#.�������pN��8�U���X��z�d�N�������V~���0�g�4�h
��i�<U�~�j�Fq���Lh� �\]������O�?����pg�����\w�dQr�#T&��]�`I�r���}�k�;9k��/�����LaU�r_� �g�vEj��[b�&����b$E��	�~�>[� >��}k����n���o� �F8������ �Z����&�4n�S����_���<��S+��JR�C6��oH�i��.�asz�K21�go7VI��Gqs����Nd��������>y�}~a@��y�E�%cb���o$�����
�d��!��r(�Sn����7#�jp����3j+Z�.~�������r@$�J��[�l{E�S���f%���;�y��_HLSI+�1��,W�����t�����z�����L�:��?"�����ph83������%(`l����=��)y��9��`B@���<��6��;4���M�L�x2�������.SX��	z������3�^53D�;����a[�YP&�p�e@vq��W%$gL�d.������O��e�av��x��HC,�Oq�����7�*����9k
�M����6J}����_[�#�&8;Z��V8y��U���������b���,+?N��F��+��wq�=����F�2�}���4Q-��9���V��!��NO�}��d��"����	��,��P(�����~J�
�������\�k�4j��\69�n��� �����c7��v�C���8�����������G���n6>����~�����$�Y��l�+<k�����-��u����7���gu������8����h����o�"�w������kL	�@���0/��'}sM5.������_}��?�a�Y�Q����gM��%m��+Xxw�`��g��������C�&Z����	Kdx�Ff�����Jy�2�gah!����W6��|��O����q��y��J�5=���2��v65r�;\3�����/8�o��<�S%'ya��I���1�(��M��8�K�Pa�Z���)6�6u}�Zb��?'� Fq]��{.q��q����d#�	�oJ�A��._�W*�.�A�=��_>K
z����=��ubjB>�h��Y7���R�9"-��%�RJ�Bs��#�����gOv_���(l�QQ��\��h�+��R��5L���>2 �� ��D�K
Y\���Y�C��v������u|�����_�m�vk���\%���A29�.	�s��"k�4oH#����N,�?���YxB3(�|����
�9��h(�1IP���D���sf�Yo0�b<k\H���9�1L����g
����r���s�H����XFkC
Y�
��~���;F�d~�9�(�9����B��*7%��'�&?�ef��2�G*Rb��O2���#NC:S��g�;��������6+���K��b�p�����i�0W*N��;P����~���i7
���?�q�2=�@��,��Y5�t���~.�h���W���\"�����)i�����/Tm��z���y���u������%�"�)q=OE��C���1�cK���cC8�#���Fkj Z�fH�^���m
�`y���W"<z�>.Q5��mr�a�B���;�=����eU�{����DA*?:�����gM����k�����M��|��N6�G������7g���#�ME�c����2��'�P���J�R"�W���d�B6c	��]����MU�l���v�'K���������+��`f�s�����EyB�2q-R����X��^c5%��D�Op�bl�~���z�4���K��7���V� ���~s�F�����k{�z���T�.��e��)����"�<��l�����h�-�Xq�S�M��u^�,��������(2 /��'���C�fL�����bx_h���%c>r	+�?�EuI�\j(Kt��W����
�_�%)1�A���Xug���
i�B:#����	�V��k&{�OD��*�\���F��#�~1���~~+5��r�2�R���;z���m�G����i��2�yZ�^@���|�M��8�B�`:���|�0G��2n������l����m��1�bd[�"�W��5�o�C��N���,q��Z�7������{���2��`��<+����b0������q��c���G v����{��/"#5�T���KA ��&��F��qG����b������W���D7V���a�I��N�[����������+@f��IH0/�4c�������C�J��N���W�H#�b4^�}��&4/�a���,t�M�J�a
V��=	2R����B����p�y���|���������f�pG���-;�u��=������D�n5����1�j����L�%�_Y����7��)8�#T�Ba�K��	�XbN���7�Wt�f_�ER����zG��%�v@��(�E2���*Kt�7���8@��K����*y+��#�
����7�eJw���H�w�6oD!��K���(���X�A`��xu��%�8}�
�wC��Pl�s����73I&��?��Y�%�
��'�cW���H��M}����@�,�8 2��;����Ej�/���8���!X��/$���;�jj��v���C�~�$hAwf����R���������X�|��Ct�5:��Wd��K2�j�^{a�Y�� �+���{!�L
q��1����L.CR�j��F"�$;*�7�u,��X�Z��Ol�c�eb����J���������)I��u�&�h5@O��?e4e*��%���	Ym����zR�I���\�'5�7��D)BV#�WoY�x�	�
���������j�^_Wy[0�GV��6�R%{���"���$/�)��h�o�����	���
�U��$��F�����������"��=��v�,g�2�������M4V������\XI�d�-���y����"�����u�[�8�����/=�@���������V����(�\����d(+76��������e^=^(%TS����FrQ[������^
����+���JX�j����d=����?M������~:A�e�-�k�{����������F��!���T#�-DDQG:s�JIP������F�����9��_F����4�}a
�/B	����<�.�7���"<��3�s�O��j���o���>8����o+q�.���e���,��f(��B�w5����UO��*�L�IiT8��t/���?�t�oq�����������?�&~l�+6��u�"�e5Y�������"��*�	4{;3k�R����QD� |W5C�fO�����!W��cB��?_�\f|B���G�1��*C���SM(R�;f)d��2 fJ�c���3Q.cb����������&6����"�:T6���I����>��D�H�_
��^>"hmy>F��ei��|����[#���������+����/��]����;���s����G8�k�/����Z�{	AM��y&�0`F��f������)�`����fD�v��Y1�:�jS��Is���84c����r��^_���4�FX�ql��`�6��K���D��Z��9�x��lJ}zB`*s�z.��u�v������~��t�{3�/�V�_#GO3�?���l��%���xN��g_��D[����A7������k�����e����M�_��XC�V
T���Dz���zu56��4��V�("���_Y���d�����!{����� �E]/�Z��D��s�8-R
�o��>�l��)��d���{�4:G��D��-�S���8D���K�}A�M���b����k;���2wV4��(vj=��$���>h���$�o=PhK?�L9iWlF��$�Q�Q�iX^�5�i��%U].��f_S�
DN�`#����Hb���'Y�l�t�����qW8���Il
�.!����'}���6��w���L�+��;���A���v!i��WE�c1IV�����E���i��U�D��������s3�]*:��o1������N�[���$����������.'���&c�R{(qS_�>��>�@���7]�=3�f\4�N�6����%��]t���~�X3��)h�A�+I��AZ�Zd�[����F2���4N�����0`"��	l�;��Ap^��������
���`��at��Q����)-Zt��Ak\��44!��
���Y�EM3����%�;���l7�#EF�+�8�`�a�K8�ep�3��	�;i^5���+���F�X.zn>h5L��������i;v�������Cn��������DV����;Ef������1G��d�K����<B�	jfjF���u��!��mI��r�4h����@a��2�vk����vLB����]6��YmU���H���|R>����QSq��~���������U����`J��Qw�Nj]���W�t���w�^%����:I��������t������������(��������ft�O����#}9,�Xp��K|���3�/@S���`��P����QO\�Q��v52����$��h���H%��-�'��F�+I/��|�[J3rHt#����T�)����S��-i�s�^s*�@�q��K��GG���2*����k�?���r���3
R[b��jo�"�E�������;lu�H�6��O�a�kS���M�%��L����D����d��K1�_�"z�j�gg����H7�q^��P
-|e�n�AA������7gP3��cXqy��8y"$F�?f���,�z�k����M�UCUm��/G�U�15=N:}��������_��D��M	��L	��Z]��!N{������&�;4��T�ne�r-';��A'�]=Cr�G�8|se����"����)%��=G �n�@rLU���@��>��#��o�������.wMV���tp3k;�JKKVI��4�)�%&�9|��.���Z����=_�%��L��>�$=���>K�	:����dE]��ZWF����o������e�e�KH<��������GP6�4�X!9�M,,t�D�D����rQ����z�urb?�W��7,MaPJ�.c���q������
�\�����5IZ5$��	<��>-�7[>On="~"��;�3�����l���7B������nA���vR�Q���#TV��E>!��Y=�I	:(�(
9	�1����-��IR"�u�t�2��"�Ad�=v5�Wv��L�������#�Em��/�4�d���Az�~~����qrt#�g���-`P
r���.&�C�P�{~��.��o]��I���&�x�KZ
E3�$�I����hS�����I��5L������o�If���@�g$�&��t���wd�Oz{�(��=/��3�`Jr��_���%MJ7Zu3�;N#�������'~���IW�,���5r�T���r��6����`_#��i�z��	s8�%��>j��e������;�@#�6#��� G���,���e��%T��{��X��j�H�G���|L�}��A�Fh��5@��sd�.����,�V�X��
�f�`��@�k].^�u}���b��2U���
�����	G>Z�����?�m������&l��@�I�G�������2�o��&�wTQs	�8�h��C7o1��]�M�j�F(<�n�SP�+]�6����
�=��z(�uLe�yi�2����Sf�X�O�|���Ybva���HKE�1#B�J�0hi�;XW��#���1�Xy��E���'2���MZ�@a����S	zF�#|ed�����5���G����������3QD2spl{Y�95L s�a���H��G���n�`�=!O-����T����@�#&����#8�B���n��;��?:�L! A�0]�m�'��������y��&����@�� �Kl��|�98���#@�cB���>_��&�
��*|8
'K.c�@U��15|QS@�mD��  �����dw�Q@��6���BD&�#s|m�<"2�PM=�6�DJ�0l�Y �������<��s\'m#e��#1v�����r�T�"�~����Q_�f" �a�A�I�^�0��c�FI��������ID�����B�i�s��\���gZ�[�P��v�+���UA�"�5�e������B"'��x �N`;�2W�~��h(F����/'�s@���9>p��8q������!�)\�@i�I,�;!W�F���a���Z"�(-1�@��i�A�
r���0�F;���O$sMgY��v*(��A����9�xJ��L g���	'����&�W#k][����������#DBt�4���}W�Y�[�OF��>�1�������
I��9]n� Qo�e�x��9y��TA���K���������>T�y�h�4� leQl�aa���g��^��A5,a�f�	]��?4�9(z�g��z�#(�jt�&�;���R_����$����Z�#�8�R���-�L��q�d�3��1,�gzz�D�|=�j���~�M�W������iJ���l3
	��"�
���=��eH��by��B��iA�}��J M{���"CXgz��k����b<�}��
����"�����#\���m�����m�#BOm���14DL���&�fO�u������A�����DZ�@�LWB�p������ \fW,�2� jp���^vv�JP:9��-_���aP~���y��r�`������
�[3X���Z	�����i�9jMSGN9�A����<Vc;�����P���N�2 pd���%���X��<��oo�

��T�� jJ`��j�xb�@��q#����s@>^UX6��f���������+�
�h�My�$�%���Y�Kk��L�%M!1�L�	V<:jP����S�s���`I�PV����x[z���O��c���v������':F����S��-d����=_o8�^�7�P��=�����i�mpF�2����fI��15O��Df �*F���8
������'$e1����B&�\���N��1�c�-s�H��I�Mfz�x��Gd�I���4����"����
�Jc�2H�W�a��t��-���w}B�����LN'��������R��>�e�^r�'�}��K1�L���~�cS��GZjV�k�\�I!�2,@� $�[iP����O���|9�UOm^�� �eL_����s9���}P�7���	������0�[�Q����%�i�s{�t����"9���}����_00�><Hh\�e�����C��U3QG��O��p�^A������4D�������SQ`mA��L�!������d���F�B����"�Y5h��{RM�
���*�7�L
���|D��`��
�+���e�_6e�LZA�U$�s��l�yT',����%����d�N�e�_
�����N�<n1Xm�uM�N2�����+�,�x�M!�}��@^��3G�?+���Px�D{0�H��5xz�
<�Eg���|A=���[�oeHMvu���A�u�)X��v��/�zp�F5K��e���bM���<���
��wkJ+)��g3����.�%��d	��|�&;"���#4�zG��Q��P�Z%��5��@k����b�H���y&��T�?��GJ��&a .���Z3 5���'6�')���G��
f�P/�
7p�,=�!�mi%h��H 0d��]����l���U�T�����)=W�������6M ������*��\&	�
�k��r�&	�V?��u�j"��\���"��eR����i��JF���JBN�L	&�{%�����Be��V��:;���C_�P��$@k�p���P���]/%J�V�U�����JC����rG,T�������g��
�8W��xT_���MVT�j!q�� �ZH��/�;x�)H�b�(k�@^
����Dc�1�Y����d8��W�����\#^��w���2�*�H����[W�Q������(��u����3�����4br��&���T�������r�|�%4��f���4wI~�;�&D��)��'��:6'��NK��)u����5y�K�z� JRh�OThM�����fd��	�����<������sq
����[f�W�i�c@�?[���%)�Q�B35��ph���=��B�
�\�&��G�&Kyj�!�@���3���`�����6�31R���,�$O�D@'#�v��qh8�M���j�F��w
-�6�j��~-�z�������T�0y�f4�U����0���.����$E����C�\(?R���i3{T#Y�����,�������-5��_��D�{f������$���GpYI������������:��2���q;���y @�A��eb%��
lU�H�����-�O�{��'^����ze:P�"��6�l��l-����.� �au�����G�����s�z�������]��ZU%Z`��A�^B���P���o������"��:�B��6M�%���		��Ga$7��?��f�w@�Z�q�s����UH�Cvs���x���ed��N���������d�q��R+������
�n2��B��=�K��8@���F��BY�k.�����{��I~
�m{�j����X���M����P�0q�&���G��6�����H�M��d���`�=������D�'_���)�:f4�f��6�`��vd��(�/}%&�;�<l�����l��3���M���J�;�A3��J6�3���Zc���v�S���(wO�������a���T	�F�R;�
$�����
�p�{G�+J�I�Oz�J�`*4i�� n;��5�R��t ���9�Dh�~P����3.3
��F���i�f;,�5�pp2����L��F�u"������a�Pa�-����DPQ�����,�!'��]��f)��\�:$�n~>a�4Q��3��!�:!I:|>?��r/!���9�����c�@���i������<��C�1k�Q�HMu2��3 jx�(�e@y�&SWweY��;�a��Y���	s2�@E-H�wLl��>1��u�xS~�"cK���'d���s������	+j��5�|]�1�`U�P�q��NI^a�������{M;h���5(��uj���}�M���X��KV��HyYE'M������������m2�!��c�Aj-�����
z�9us�Ll@.��\�����j:��Jh0�E���|'(;a������a?���G������Ztw� ��	+!�����&x��Mk�B��@:}@��E�y����&�)�����81%������Q���G��
AK��I*��Z��R�����j�����F�)�W7���9Ac��2��Y�1/�w���R����������M��c�A�P2������-"�����DpL>h �6.��MC�?��R�ME4���k@.N��x+��4�Ig�j�EX�I��7�;e��D2�
.&��$�`�dCU##Y��&�lZj����3����y�� 7N�8��q��FS�U���Q���b����;�x��q��n�h�J��%���f�81��>).0� \u�U!<��A��>i���X�aF���Y��m>����fW*��H���f��?5d��vx�rx=��=��o6��*��F-T6�FP�w�
b�m6�����<�����$��D��8O���eAp���w�t���y����d��4h���E�p$���QS_�}�/y�����<�h���k�[2���z�
�����sb�@>6sf��i�@W��q#��K�A��]#��Z�Q�o�@�q��N��zIn�xg�2Y�BS�"�������?Y�Er��. C}�y����Y��4T�k�����1jq����X�H���q�RC�t��I������6V7J���[�Hp����y��;R}j���F�$����Y��V�5��63?-$R�`������`�"�B� sz�XE��r`Z�,�����nN�����Z�B�����z<�X�R���?X�����y���5#���|^��n
�[��R
�s��+��j��]����e�q�jF�@%=�MDi��<aD�5�����/d�7��	@L���cB�?��Bwl��H��&:��>���5�Nt��4K��F�z\N�$T������V��Xr���/�D���
��F�% T��L�	��\b|�^K�-�$WH$���oDH���[�i�Y�D3���"�b�Z?f�{IG��0~������gMjL�J��" �����&#����F�[�\�tY>�q����%�A���}�����#��[�?���dV@���|)���H$8	��;��
��]���n2�V����:Q����I$��K�
��W������1�U�������&4eOSUf����X��,���
PF����x*l�y��m�}�'L]��qC��������v���i\������X	�������]��'3���&���.dM����6W�/XPu���s���v�c|:;��e�T�^�����8��R�������n�,����(�6=@�g�c�(�1����&�l����5AZp��x���;c�5i
}�i�7h{��I��s�4�V6�~����D��Bo5����s�(v�`�����;�={�Xb�������qR��*���!Q�Z������W���v �V���M	�Z?A���c�RFF�(��6��l���:F}#&��1��
�@h?k"��<���������YD���n6���{��.�@���\������P��
��!���������wn����/��%�j�g����v0�E^b1���h��&�\�}�}@������v��Z�2$`#(D���C�%�L�Q�I��SKf+#�E�4���Z��<����s�0�fn�a�O�RI���'�7�%�!��X��t�-��W�}�V�kj.�KZ	dF/p-v��5K�	��M��T�Y��G���R%@��,v�&l����}DM]K�����n�%>Dri�'�G�$�����-�+0j���@U�P�^������1�/AfZ�BPmL�@�u���8�ILx��!�7�@�D���|��i`3s�ZLl���e���V5�I�U�K%���������l#��,t�&���-8�!-�zNV.jN	:��+)�B%�ryg_�������N�1���v+=Mu3�X[r��{E��a����&AJ��������N���r��Yzc�@�D��������r�@���Y�H��Q~)-���OAnCd{-�����D7������lt���
,���?�d%p�|��=���yT5����-.��U/U`��\���-|��j������T:�����9���Y�2z6zr�<��S2=B�������;A�����_���Q�i��]VagA_��&�{�+(�5��Q�2���^9����s�d���v��#7����O��3,j	���H���P�jS#�H�L-�P��\Ao��D�Q�����M@����eX�Ez���Di�Ii�ex�P�;!i�Q�o�J�m������{zH<E-/�8A��m ��e�!���T3�D�L������b�B�����_�z����_ G^v���m���7�����CS.;�^���#h��@�3d�66�=o)8� ^�����,��>MNJd���G������9��g�- q95���66�����������5@V���(�$�5������F{F�)s[2���J$g��NQF�,djMG�P��JC�M�C�����)�HdF5qM��L-�E�Z���%^����}1	�[�h��z*�k:TK"���vQd�����D�[��G�o�p6[��X��!��|����w@G��:�����V��]���5#�����v�L�9y�P�"R���
�����}2]S�1����m�I�:�n�j�=�C��mj�edj5G �a��ZCxx��4?a?HkY3�X��^i�IJW���P�4I�k+��� ����OXbW������LU��T�P�A��j�@3d
��-���A����{��u��s���@|�n2�����j����8D'T1md5��x��wC66'�6�b,�R�N���Z�7�D�I1E"���I4z�G�F��i�V�
IH������I����%M< �5����#Jn�&.����>B���m��h�@0�0���Q�:;�L/���m3!w������r����<��<����P��"Bhx�K�xJT�
FL!�K���,����������Bkd,�j��u?�%uD�-������WcN����C�r��Y�?HM�]V�j$�����+P$����(�!�kHd���X;��F���	Jv�	�[U�5�.d�z��d�,����B#Xg]op#k^���	�����TF�4d��v'i��!�����D3T���	��<7�S�t]/�`���T��4k��T�)�U��	���V"L��~I^O�"E�?~��
��l
���;Q���3�_��,����G���G����#�>��h�����gu0���!�+#���r�2��F4$�� ��k���}��H�N<������8�H�#k���������%J'!?�Cy�jR@�=���>��
�q2�dl�T�O�B'=	S4��g��k�8O��O|������$�-��m�����3��\f|�Du%
�"���%���a(�(���uZ��!R��d�!Y���f'�[�d6H�[0~�n�t�'�?�^���f{<���������x�E@%Vi�Z\�*�2w�4f��J/��7i|��@�y*�B�������������?V�2;�_F!'W3��"Ct�.e��C��{�����*����W
�bD��ft_�;I���}��$�iF����K�0�w	zT�W%�A?<6�*'Z,a�[:��!ce�2����V%]8��J���$&�������6���!}�NtL���38���e(q�/A����P��f�������Al���Z��+{���@']��R���X���er`��#jIp:]Zp}��2����p�z��*�RX�������sC�/
�3z�i�8�5�K�1�h2�G�>m���������K�9���`J��������l��6��5nd�e�������r����nq~�c�
�P�	����G@�����au����0����4�������%4�<d��N}�����Y����^��2^PfKZ)Z$�"_�Q�E�E-�w�v�
��u��3y�����SvM)2"�y����i��Hf�T�-��E���my���A���5����_���i���9��Z?��#:��K6���s��
�IY���m�(��z�����z.�*��DB=:$������"�d
�`���n�l_������������A�4
�K�6��e�09���Q.��$�-nA��g�TL|l(F�c�E�V	����xd�_[N�n�m��oc�F�g�w��M����7*9���:�_Y33������B��[3_m����v����jFg��m!G����EI��t]S*�b�`��hL��\o��������~�=���a���t�,���O��iA��`}���?i����,���V��&�g��Q_�c�:�{��Z�T9�����z�4�B��$�8	�B�$����D�r?04���Eu��;�Q��D	�K��P��%d7���p"#�flD'KxM4V���	�y�;&1%��	!l��L�9�$����������B�]�T`��}��4�	{��s��QP�(���t
���IJ�k<�o�"&V`���H����K@%m���'�����D��k��.�qF�I��[�E��8"7�u��$���"�u��3��G�����-@�$�QG�*���>PO��
��4�
n����Ed���& g�����~`8�w�=;4&G��YU�z.�P����"9`O�����=.B���ADV.2�����e��G�W�{|��'�Fi�V��U��O!��NG��`��!2��?���4�������K����GtVG�O~���M��>��"�n������v6T`�#4���b{�7����We����G�&�m�`�\�?MtS�}���n)E�
k�nr@���Y�����z���E��B�����n�M��|D����;��A\"�����)5������wy7�fs ����M6������
6��AW�(�/�:�gNB�(ic�bKn��W�F�����6Q���W��<��I���<'Yl_�����H�5�p�=[��	&C�-����-5���D�����0E�Z��;)@�2h��0��D��m�E����}��!��r�LF������P�B8�n`���,�e�g|���!��lOX7{�]�/�K7�JM�"_N���C���&B��i��u�EiU(�%����0�\�����v��w��
����9�u���n�����R��\��fS3�8��N�����3`iz���s��1�G���p?R���h���3w�qH��H��RG~R���OL�34��0�#���������p_��iW#���Sk���M<2i�\��?�Ff�����������A|��(���br��kKT2�Rk����=/�_��s�j�GX������C	����>��@����}D�
��SV�7����*i��efON�aP�f�g���E|5G|�G����S�9�F����@Mc��UA��){������Gc��)%������|��\����i-�n��K����m�@� C�����W;�XH.��u�
:�
���C�=�#-�����bc������#����2��������lt�g�w�L���U����!���mo�����i>o��SM��5������uR����#�m��as��//ky��5
7��x�S�Ct�#�������K����G6F7�`cd�����z���x�=�t5��T����V9�����lw0��Y�9���|�xe��F�OP�����W�`
}�A��vzz�O5)�^v0
���3���K�o������j�~���� ���Y��o��W`�_`9��
���Wi������!U�X��,�6�IzF|T����(uB�g��DUC�hd0�d��5��h0���C���q��e�����Q}���Z^��7�A��1�t�����h?������`�r���hy�2�;�%� 
�+.��
����a�_��2���x�~��|��M�I���)]�8��GBR��W����������_(}5���~GD�J���eP�������t���~8��l�mwG��d�����kAM���D�@������gr)$��4��YaH��������D��LP�,D�*������}���
�\p~��X_�����u��d
iB�-���W:� 8wF�_WPd���>MhZ�����$>3@|QLMS������1��w���E��l�������U�,?.��q�w>��K��(�5�]��[��f���KG���9��������3�)U���g��r���
i	��o���0�l��%@�=����R��VMAD���z:d5q4!EN�0_�,����o9h�D�+���5,������#K"������Nt�e����%LB���]}M�7�I�k;/O�	��I����iRa��1����5z�5,�1�'���C;�IY>��=�Q����5� �@'�$tfZ���ZAh���"�KB��3�C��c�\�_��nT��1��^��6�A�t\�"&����(&KL�z���Y���x�s������O���M3�oD(	A$��;�=�=�
�����,�f>����<�)�=�tW�d�R ��4����s�i�AO4S�Q�
RO�t����|�f^��#��Mg({��7���f����D�&�������#YA�������n�����Ix� �s�[�qD������[�
O� Q�<��������w���e��D��T���������<�����3��r`�S�����w�zM���������_�j�AA2���	��d���er�@��
�W��Z�3yp9������d��{@�/6�B��U��6������6��A}�d-�LT��=v����t�H��z��kPt7�J�V~���w~����D��<��9�ShX���# x���G����wVq��3FD39�bo#g'5x�;�7�����1$��N�r7����'>��	j�@@����&��7~����Yvp�7�EC� i��@�3�8���,Z�8��'}.��!r�gf���hT�jtt��4����G&A���z��K���Iw�=�5�L�Uo�\H��LM  m����*����F��P���FA+mhI����k��\/��X��E4;�[W&�����CJ�e���\iBP�y4h��{8�r�ppA���@ZV�������q�p`O�<��Y�<�Q���Ay��Js�RP�Jj�U�g����A�V����D`�e6���8C��e"A_�����v�R�W����$�����;�$/�p�-�b`����r��**�����U�SQ��^�L ��JS�3�����L�K��ru��T��^�JP�i�EJ��7����&z6�!4�2k �Grs�?�w��f���p�/��Gl��#�c�i�2g��k�p��%��jq�&?�l�$2�ef@Fjr���j.r�PhM�??I��/VF
���-��B�F���{!;�z����_a>#�g�B����y���N���[l������&]&��7C���|�:��.��b��Qc!yV�"u���
���\���%��5iD��F�Hl�P�����mb��E{#�jtU����3�����`�N$�k�,�l���^�����C�e@_~�2B��mkL2�����H��B�qw��>
�H�A~�9���C�!������Z��{TE9�>�O_�4������(�NlTUH�������e6�.���AH��k�M��7���{����J����Z��uI7�Ft��'@;���!��������!=�=+��zEu�Q+�
H&�[����I�����8(��c��I��%��e��%+���q�G`.����0jI�����X�g�_�Ii�����~91��szB.��vY������\������|��k�qD���<t�t7��%�]Qat����"�X�0,�8�A�kt�����2'��6z��k�'�w�H��bKH�b�f���hx��oj���=K�J�.�o��l���0L���!���~�[�M�-���y�\O���p��	������V��e_2I%	�6^�!b:���xv�mc�j���ZM�� ��.���v�����%�*����#���y��w����N�9I�42Z����
�exe��|�F�e[����)p����a!�p��6�/��*�����l�����}����.9pw�$����AD���#vMV�2nH9��EPU�
�k��������D������F1��R7�����m_JT
���@���R�z���T�"���� n����.����,@�?#��*�Ea!0��R����L�����Gv��)��i��e��|`Mc�v�k��g�>��X�����3����j���}� "������#������5�VC{
}�
K�9�ia�5�/|E�_���Vj�5.�"{�,�IIGyr����)3H�6Y�t�}��hQ*��M�fFaA�2D@�G�p�6u0
+�/�f
�������������`�;�v�]��V�ice$���������������HM%�hn	j�D#FR{`����B��G�(�D�������9�� i$���_t���6�`�gTq�i�j�TW���TA%���z���g�JK.���|Kdf���R�O$�[����)(�2� [Y7y���E��cm���M&����L(@�@\�fi��h��6����j�ZgL����;U�+Pq��H��r;M�'�`;�$B"�bGGD>%s7�5�L��a�8���kY���Bz��h(�}@��4[hS����sG�l�e�'NY��~�=o���Za�)_�Q���$�gT�����J����������������}��p���V��D����CL/X�s_���i	i��.��P+Y��M}O��Ef����cq+�,��mg6��O��T��'���
�&"������zl��i,j���c��OH����r�:�|R�(@������VC�/�0Hzx�6pz��&cu�[�aO��"�a�t��~��k$!�D�~�<�_{��������L�0���y��~L:J��1t�L������2���O}j�����k�i�NS��@cNM�:���;���u������&��M��S�
x�O���An*VI�|B4�,o��j��l
S_S�nW��EOMK���'C��QEE�	�@@�c�A�R�������4���y�.
���]Bhd5�����X^�h������vn&	�F`#���1��k�-�Gw�=D*����@�t{��n�
���H�T���pA�0e�A-rn==�m���~,1N���=H!|2�X��V��E;�$@A�A��a�E
b<i9���O�]�������BC����/��F:��L�B�I�+��(
��u	=�w.��PV3R1����]�!'�\8YZ�j�a8_3"K�l"��4��We�5���p�1����]#�c��	�-���?��p�45a���w����H������<������i�q��y�&��$�&����#'B�� ����@��r_�haZ������A�g�F��9�CX�cA���r�,���|k����s7��25���q������y��U��5��1����Mx�>A3]Gw��yL-�@�*���'KC�?�
���X����r����t��PZM�/�3�(75�P�E���r�./+\L:�

v>�Z����L�(���7��l���=����o\�=T��}�()����-'�?�dL�>���4��^�.�tqd��{�����DIo�1� ���to�SE�~�+�[/�C;��6�����*?fXG�d?^{Dg_�k��M5� ���,\@8k�O���$�K�b����\�|�9�l�g�>�=�0���}������5!����Y��g�i,�����U<��j{���>���]��-=*��~����5���f��<!�u��t��N���
D��\!��-w��|�D0���D .��1'�<�P�C�>�'���K�J�WtU�G�-E�e�Vz��� ��s�ts�!_ ��h�?=�1����~k ?����1LV��yVgj��#�����=��KB�2�FM8���@t���&|��tG�,�e�K����Z'����>\��&t
��Y�m��Y��@�����/��>-��G�7������D������Yl��A������'j�p$>��j����ej-�����}8����*r��=84�OR�zQA��\���� $�!�����P9}���
�}2ZyJ��$�s��
>GM���c�a� ��
�	��������N��5+�@�	�z�������*�������`��B@��4.�1_Oh���>o�����v=���2,cE�^�-L��|����&��BW�**���/������2P����s���;�%rZ�[L�s��(�Q<�]q�%?u���
�������Y������I�D����b��eI64����%�cg��|��K�����]lPG��;�@��$�1 ^��h;��=����F�g%N]"XN�t��s�T���
%H�gM��~�h��{$J�2�@#s�yc�_����N:tH6�LV�A��_b���1�/���YhD�:%�����(-PCu�n_h:) Y��G�p(2p�Y�:1�Y���n  |&]��If����v����u&��G��WF|$azO ���LQ�\���t��o�}y�@��2~c�����r�
��G^.���i�}.��nhY�~���Y����?N������7?����`���b_�����N���K�"�tyY�����@���*i8&�k��|��o�,����T�K�>�GV2��|��~&����{6���'�2�v��
�]U>?�����<���%S.�^I�]��o�g
�[5�9
��i��*f,�h���J|�n��e���� g�y�E7�3�%�������d{�����K����C'���'�?1�P�i^4�}���*S)����V�+�=�������d�Lt+����`����SG>����*�A��T�xX�K�����8*?���%���z���B]y
����)\��I2^+F����c��
�`��TX�Y�of Y���u;�%�Mi>&�0k��.��\$L3����a�K�:'k �-��5�)��������[R�8�F�[1H�*.�d9g�|�C��W����F�$F�.�6�����M�1��j+��0$�I�Z�2����}=��Qbt�y`F���D����#7�����1��:��t+�������qH��[���Kh*'�ED#ukNd���=i����a����et�?)6�=!�l%����!�
F�U��dP��ZB��8�
�d��0���H���UD���(�a�Z�`	���=�L��?��E�}��#����R����@��G$���f��JO������Q~�n�W�$�d&��T0M�6d8�H��5�h��5�b�6RU^p���%���
�O�D��[N#�C��5A�-���F��m���zd��E�{	=��
D���r��`��	L�s���V�j|�d�������:F%�(�nyDfL��6�8�r�C���?8��3���_�����0Y-���,.	$�8g7B
-���C�����������C���&����m��Ew?�d�����M+��?���gy��c�������4��j�c�l��=Y�A+��x*�+��l�3������6�o�'��bj"�/%0�AP,�M�v����A q��%'��D�R�����F��}�ppZ#|���=FOMu�l��D�<��dD Wl�C��AP�F���S�3$����F���\��-�g0?����J7����U�[���
���
e����V�R`rs�U��er��MZ��<! H�O��	w?ar�:y���z�I�V�MT�kD5lW�p��]�u-���C�d4TB��~VE� ��I��4�Y����C�s�G����;���{�4��A% R����j��P�	8^�H���gt�(�#������|�:2��6�P�I�w������� �U��RX	{@�$�*N��1Jb����7�%_�����
N4g��	�8�)>l=�\Fr� ����P�p40	v]�Q�)�n
�6
U����Hj�*��E�K�P�`�G	���OT.��d'������r�_f����6�P�REN��I��j����g��7C�CT���W�E�DMDT���*�b"��c�����v��Ry����_��g���JLFj�<$N��jMF%�F�.~��j����D�Xy�s0�QE�c�B���@4�Q��]���V(�`�o�+1�ku��7E������K�E� �x��I.ce����h��y�
�o���{=f�Nhx���?X��,�>j�n�>������i'�H���-�F��Ax�]��^dE����o����P-��j���B��.;��
����U�)�:�f�b	0��Ac`����}={��-,T�Y0�{�zf��
�@;	�|��G���������OLCVu�H�������],��b
��D*��?���
�Y��?�{	���=?��d��n��5��=�
@u+i,�s��#�LBt�l����^�:���A[��Y�]�%K�M�g�Ok���
	z;���b��4j�DnQE���='�k�:0�>@���$����=���'�|�DS�]p�&*���c3A���Y4���c{���Jz�a��DPs�2m&:���'��W����y@!�������c����
��`�b���������lNV&d1����A@dHt����0�9��Ae�&59�Z����v1� �0�{�H��Uh�'"
��%vt�����+Q6s��������t�y����}9i�I����7�����!���b
"eZ�_s���c�Y��ri�z�O�Cz���/Q�^|i}�U�{���|�8��y������!���C� (��D,Y�lK�w#�	E�L<��e�+��%:0E(�8]�{
�h�xd��<�')��hi��X�A���+�-CD���{�40�>��
����M����Y��=#��5��7�m`3�T�����"��S�	MP���i��( ��?��d�X��rN�������S8������o���f@u�[���b�)�w�����81j24j��?.4��oE���.����	O��}a���N%/D�b�����ea���.�Q<��C��6���1o$Y&���%�]��}3
�,�V�m�Y~��2`�5}��N,`�+�������xP2��G��&R�0J<�)��������[�������ur��w����9�A�w��h�7�72kiN0��LId������l�I��EP�&C	mYT����|"v8���@�N��=��7��h��8�>���_�Pm�X��y�[�QE(�������s����VT�90�b�`�I��i��l�F�61��d@O�q�6��%32a;�@��F��Y���N�.1���o���Jb>�DLv�uX�!'p���O�dZ��A�D;�m���D[�&RH�rb���m��G�8���c�EP4l�<V�q���D�y���z��ysB2�D�w�}�tK�i�.T;z�tPj!��]\#�l���D�:��������e���?���X��t�	E~�`�8[r��Frt�
��=������:�e�.g4Mo/�<���C"��vDB$q�����;�������Y��/�{���r�&����%Q�w�PH��(�vq��S��$�b1���*y���i��q�r��v�!t����W�M��$���B����@/xa������v�&�`"lw3�<�f$�������_���c{��l��2|a�EI����CM��.ra��������d���S'�4��5�6�FQ�:~�D���B�?��b!����D��]���>�#
�{���p��L�6C���8��;X_D���t*�����oV� 0��)���}���&;��hCh���D+��<_T�)�."�?l���_�A��<�����3�	.x�&��_�E�6A��(P����v6q��%��_�����2Xb����p,���]����.z�<��V2���yD�.�H�T�b`�08����49��X��:���Nw�qt|�@`Dp���<�#D�1qg��v'$Mw�$M7��=�8 K2���@$�p���F����FX�@F�����L�!G�n�x�=��t�,�P&��Oa7�������=�eJ7Hkeq	=E��v�)0�����I�)��%�DJK��\�����@yj���P���J��F"�����������������=�w�#�Wk?D*�$�h���Bp��'���}"�Wp2���}y6+��b"C����<���Cn������G-c	=Ao�S���(��M(P�j������\����2���E���5�������s�Uwb��+�4���'#H�������i$�q�.VA$��9|���?�X0�����PV�
h�(c�V�GtO���_��.�F7?� ��Nv/�|+���{�h��Ow��C����H^]��3)��c)\w<#�.���x<��[����U��Qx��D2�����D�VB����v��
%���6�#V'Y-I"�������
A�Z��z�FH�G�P3�[Q�Q~����P82�D�0D�,�@!V�40�UI���e����xp���+������b���~6��;�(�>�L�2K��O���5�q�m�@}�?h?����=��|��N�����{��XH��HZ��!|�re�'`�	��%8��_����v���;b��;��d�D7Z��{P�[�@K�'%����}��r�0���!�
I���#%�s���o���;J�"Z2�7D�Me_������W��
I���$�C�A�c�1H
q��V2X8�u���V��I�;�Z�+#�nBf��t�	��\�7I��(o�0*c����p>�F�	#�0�0�eL,��B�i�\`�!���8�� �#Qm��IPuyK��=�([Fr���������|>�-j�1��-�D�H�E)/N�P��6&����h=��
��4�p�q8&�����c����-Yo����/�UDb��y�2��B��p�b�x�������P�l��_&)#�1�.4Yc@�tf8�<�2��p����,~�	?�	��*������t��0x��1�!�A���z��Q��mZoI�^�>� �C�C���[�q�4+�?�`:��!jb��p�C����"��^_;Q�Q�Q����iqn�&f�]��'7����{����?��HV�c%���q�����c�3����i%���^���������c������B=u�m�����Y������s��}�E�@M�&�p^)CQ))���Y���5�������������a;N��
�D��Hp��E60~����+�����\l��3�1���r�OH$�%t�b���GI���e%0��z5�������L�bF�_�@[J�����F�;:��cs�!�a[��N[%�4-��`�����S0O'�}4=�����O�2��7�q�)F����V��<wG���f1�	T��>�x�jy�W^t����t"����8��Ng�"���7�����>a:� �O����[hP.)%*��vh������P�Y�U���,���O�Y�4���nN1�����m��&�8���j���
�4"�MO �)���(j}�-H8����@�n��%�9��uD�����^��
�	�9���A����Af�M���M������G��������/���5���W�~�+������u�x�'�dT���KE��������+��5��ui�\�o�9�����VQ�q����0��W"|����d�L�B8'�9��k:�]��2����\�F
#�3��.`�9��e��NO�J����aL&�.�������P86!�/�49�����)�q��8���cb?#���������i�������	�Eu�+Xv�4Dh�'���B%A��O�_���w�^&��?��'����S�����M�i=����Z����D����������[n[�*D3q��"p��6��{T����~*���NQ���K]��,�����#@�>�k7e'�s�i!g����X��������}%��)v@|��3��,v"F��S0����&���n.�p�����[�V�=����#��%&�����*����!����+���Q�%v����!_���%(N~v�h�i�����u�!��H+�}f:�n��'wALr�|�{���&PT11=�SN1���'&Is�_�Y"��������i^@��s��15�����Je��]�ni��7��87���bH����!����"�i	�6�D3��3���o��[v��)x8�����|��C�<o�/Zl���H�'�����1��K�.�%]�z��x,���z��p89&��z��vObM��]p=��:B�H"(���Mfy��!�n#Tz-�&�'L2^b ���I��(X�Sm9K����@X�1����Hv�U�(P|�������(��4��8���`�]��*B=	���<
�]b�=����e3��PK,D�<��]t�DW�s�Au���%��A��J��%�7cM�-��4��e�*��:K|Co��`�����Y����1�2q�JK�Qh�uB����J"�[NU�g{�t���j�du`1�����W�����s9Z����	�`�3�\�"q�j&X� �6O��R�*��dE�Y�+sHI���Ga�U��{����tRCa����s������pVL��(:�p����.B[�����KK�X�l,b"6������(���n�����`3�ub��u�x ��%����C�����&(Xc�A��5L�X���50_&P��+2�^�����%n���;���u��`4��'c�kx��|�����$[���[z�d�v��0�Z��9~���x$�
��d�88y�i�����#��W�o��`O�<��?Y@~K�dO�?��.���$�n��+L["Z[" � �f$�25���m����G�#/����y���d9V-��&��sy1������-�p.�^G3c���*Z,5�4K)A����W�[�S��Cd�@E��Z�ug�a#M��@�9�!�$$j��1��'Z��*c��lk�Rw:0`'��k�y��%�|{��v��R�'���~s>�H��%VA}h>�5�6�$�a���'H^Y�/b�u��d���w1D$��0Q�/s�N��D����p����!f+�C�D�
{������Q0�:.���%:A����G���F��	g�C�g	uFKDj����Kuy�VC��\v"N�%��e�"�v����Ltm'&$��TB�M�E�j3��X[�c�� �X�m�"�����%����i�f��Y�h��-�c�������@����B+��	G�<���E�k�Bm]�T�'SPm�Fo�9)j�C�����4�y�=���KHg�i��;0��Lv�iZZ:��o�%��X-��8���k;#���#�vu}��p.���`D��:cYQ�BjW����Ox���E4^���.�����z�m�	��El� ��B!����1q[��v��N.�yO�9g�i��$��-R Bw�;.[�$l�;�Bn��z�����`������@�5SI�2�p%�$��]k�p��DdC��_I����3�[�i�u����h���'vE��|���h��R�� �\@�i-�?3,���q�g��)���4h�H4S�A���T���N��.�YQ�'j`����8a�������}MpF���s/|����z;� �����=E`�ht��8F����FL�kt\��s��1g��F�� }�{���L0�-0��?*�F���H��
���6EW�s�%��Tm��������]|4k����e��l ��v��\� �����S��Y�A�'o��W����=��_�>p)8~'[��k����&P7k �_:^��.:��
7��1��P8&��^�����d�G�v2�"0q3ad���e�*<:��D���O����SjP�K���d�i�M�Jr��cry��u�C?H�R��ck~�BQQ�]��
�f������X�G_���4�T[��T2H�Y�t]"_��ke�������nH�o������K����m���^�5��l�xp���:zb����!Y8�X�P8���?���2)iz��/��"~{e�����?��������v�����8����Ba�	�]AhX��a��N���`���U���<v�%������8F�Q�K2����Fi��K��Z�B���~�����S<���*m��\����>��	��������g?_�1��Au���R���6������?d�c�$��P<���������9t���!S���t���}������.�C��	���� �>���'�/�m��%z�Sm;K(:��DNs�m9�7YP>�T�;	%����6a�-�Iu}��c�)�r��MfO�|F-��2l��B�_R[0�e�'#�H���|Z&KtP2p�����8�s�#?N(fB�v3{r����i"{�=g�����~��l�26���T�U�j���&����Y��nk���<V�O&"�t"��#?����������\���8]�T#�J{�=�"42�=B�q��@�#d��c�3i��>6�boo�Os�\E��!����$S=}��548���6�J�X�}��O���5�m�0t��Qf������!w%�01$9��7_;yA�MG�����K���	 K��}"�	="@���Ngh� ��_��
)����������'����&������
������F(��9���5R��P�t�+p�u0�(��8�F��h+�����p�,{Y�S������_���� ������,�}_�?����QMG�?�^Q��Mf~vY( hf9���G��U��Kf��q�����q���J������M^
%�G�?O)jPf`"H������<T�#�����������E2�uv�n�����y�7�<��d�3,�H��G��1��3� 1�v{�d5%���g����d�����B���MK�c"@1���-��_v�mV�?d���	~���'������j=\��f��k�wu�.�`�Em�?���Nh�H��2���t�k\�Ek��m����@�����2�r�%�������(Rtk���g���7����p�_F��|����^�V��^a�k����`AA�.�������9u�������
��K�"����]m�������a!z��q�C��$������x��_�<���?�C�w��
�%����g�7(y8�����5���,�w�0��y��� ������v�
�%g_���^G<�����WG���q~��0����i��\M�i�����M�t�b�^F�����;h������M���P�� %h�{	U�3��4U�J��!"��p�u�B[5^ c�����Q���'�b
�]�Q�����a�#N���F#�Y������Kx���	~������n�d������eI���P�$���w����� Y�A]�h|�jf��^A�X ����Z��
��O�?rQ$���(F��I�f /�e�J*�\D��)��:y���0NP�.����0���MG����e�8��1��d����2�!�^�g��f��������9��xWk�	/����im�Ny{�
���Vb�Vk�Ld������F�'����@T{;�8���5��I�G���0������������S������
zd/�'���#����?����m��
���w���OiZ���'�.�����]��S�����x���Fn��3G�w�(
$���}���F]����5p,�gV������D�}h`	4a5��z/�����3p�*������wv������D�0�,�LT��u$��v8z]����H�M�+�8��;�`2���w�{�0��{`TRD4Y�F���-���b�������������+�7Xq_"
�����>�4��g�U�Bmjw�9?�.�~E	d��o�w7�4l���8��w2�p�"6����)��,f�P�����<����h�G��8Y���������z-f0��82�#]����f��g%E�C|f���^A��<��������w�Q��bHc��IE]Dp���w��8����RW�Y����
H.�������L��R~�<*J�^$�p�nn�f`J�^B{����aV���2�w7�R����Q@2@=�����{�?G��CL�)E�����{�4�2
	'�f�~.�?�~{/��v~L^����4����8M�8^�%uvr=��S�w�
��{��+�)�}�Jt���h$�qh/" �h~��'Mv���UQh�$�J��G��n���|���V��y�;�H��
�
e�&���8P`}�XX4g5��tVX�o�������]u�V����@f��K�����	7��p0��n
�����(��.�'��m�p�j6q#�����\�uz�H}#�H�����m����`�����B�
�z��{�In%M����`������E\���jByIb��O��,��Tg���` �7��%ZO+�a�nrJ�M%��x�6d#�V�Mt����Aq��c&(�����c�IAa�����L�!t{��[-"	��GZ�G0a��Y6)$��:�G�9������������5��x�y�HL{q&@����)�VT�:	�Y6:Jl��SiNO�!����	���f�(���[fo�^A�G���*H�zA*E�^4��+�x��|A��������cr�������$�����Ln�	��������0���� ���,��L\�%;�d�j��:W�J�g�+XG}kU���Z/�c�]�l���_/��.���n4��%�Ty�<����T�f�:%�iE�; �2z"�l��'���%�w2F�������:��@���oe��[��k�Y���0T/��`K�{5%���U$f�J�&6,(x����IJ�*Ji��Xb9�^���:����f5�TS�i�q�����p)�f]K���T��Jb���
���_�����Yr����/���*���@]�������F�l��������<����6����8�9������_6�j�x�&�z-v7�{-v����~��I�^�����"�W����l-3��U����R�C�������_�&��V���u�$Xc��V���0�K��
�*T���[����t`��V������	%�-�F�@�N��*@��c��P`���i��4'Z:�&�bmV7F[@��C���k���^�=�6
F�{5NON:��V�\;�����:�7���5X��{�"VG�n��#��
�GwVIf��>�"���v�dh<�?z`�k��a�8����3�1��EG�yr�{��xjv	?O�3(0^�{��,��j
�[��qU����BH'��jX���	�]����	��<��t��^Gx�)N��F=�T`��h��)��4�u�I���9�."�
��C��C�	�Y~����[8QS��M�?�d���U"���^���D"S�DR���	�#0<�GTK���?	L\-��a��(�����5B^�
�G�g���G��(�����DFb��<Lw�/v����
���*$tU]v�������fN�~b����@�B1�K�b�����|���E�R�
l��R9��H"?��bU�>���@jI�)<hNc~��|.��gT��W��!I�-%d����-G��
���`�4�#�
H��t����S���n�p.���
��*>�"���&r�'��c	w�h+9���|���~����d��@b�&~���
�P'��F��+�<��/By���NXT����vw�H>�WnB��$;����<���o�p�w�q���q���=�9�1�P`s�S�����-����CS�l�P*X�9�����=��������l{<6|���N�g�����xK�D*d�5���y
�0}Dd�@4$
eI����~�9V�R�`%�B��`��Dy��b�lLYD7m�u�j#���"
�f3������qb��,��I��$�U�G��:�=���*�Af����f��[5G
���f�[��)�ENx�x��j�[;�4��]�S�[�Gz�f��-��2	��D�2�����-v��	e��
�r�L��Tf���u��%K�T���Z�Y��X.���$�=��C	���.t�M�����$w����)����������� �;$�Z7��x&�kl�9��v�\�MuZ��\3��+U���k�T#�hq���q�<	}��8q�bJt��w��=����;'PI����<z��&��&D�(�J�{M�N����yGU�x��{�&
����?�ZQ����?}��7�kb��<�{:�k��<l"�"�����6���~�[�w�:�7XL�S�W%
�{�$������O���WP>a����PT�%��x�i kl�1��tk������D6��c�������k"�l�d*3����l�������-[�[k�6I0��LLokM|I��^xt�L�Fb�&�;1"�oO��JDz6����)c�<O�"�m	�����E��%`1m��������	#��D�Aa0��7�%����m.����3w�|�m#�����&�t�2�e ��$�@s��-�1���/�
8���a��N�.QL��,��7�	=A����@���������p~�����L�%jB���]��(Y�uo����/n��Q�1h����R�uOG�CE�Lj"H��q$]o�(�G�����/5 9�������l��sxP�%�R����c�]4B���-M���.�156^-IBe�N"��M���.��m2�����s��]gl4o�E�����H`�^�X1-����&E/��@(KmT�Ql|KF)���ES���9��d��P����=�x����e���g�,���f
����4]�hWPw�g
���N���A��0�8`H����/ �~��UI6�KhK�����W^��
��n��33�Bu��x�{z��R9�L��n9q�9�����!���R��=��
�EF���{:� ��f��q������"I=������I�J2��E 
Y:��WI�Qt���r�+|���C���V���0��p���|&�����)1��86�Z��@�@�
m������n�#x*��6?P'�`� ~G�"qb�=e���""��;��>H���LP���$�����73��d��-��y��������O	F��lt&�g�������������O��1]?��&W��mr��DC7S�}6�hl���i�0	�����c���l��H�<B���B�N��n����pK�]C}N����J���f6�)�L�	3������A
1H�"�a���]��@3���]�~��'w}i��{��Y���Vqi�]2�O#�F��E������~2h��l���1uR
WG�n��J�|�S@H��	��qE����PTm�2�6����?I3X�Jn��;��!����O���������*����S����8�j�b��� ���C�/8�!R��q�����q��r5I.�~{�����`��I�����H�z� 1��&�W��5���:���!����FC��P
�=_��V�_k�=|���`�*�����5�`��M����s�Z	6��Z:���b�!�}�7s��e�'e
���Y'Pm~�d7�;�hlt��1��|b����a�e*��yl�g��C6�A��|�deI��V����d�������g%L��<�
=-�cu���=�4�b�eh��t�C�BM��Fq�~�r��N�BA���Dp��L�0e�B_ 	"�q��V��WC���C4���*�Y�R��z�c����oZ�
n�
:A0+J�[�#�u��v;C��Y�sN��n�VX�|�s�������{:�E��~���[v'lXZ}�A�E{������~��T��7���	���d7\�_��}>2��m���\&?R�1����7���9H�s�[���RC��!��DO���m�0�DI��\E=.��K��oA�!��TJ&P�7�0]�P�!:L
�����Y��������������e�/tC����tj�iI���N���suy����lk�����|Ta�c��;����p7Q!���I&_c<�>MB���
���L�A�������0A]�����A�C����:��@��5��:��>�DT�����d�7���
��L�'x��x0���{��y�����E�O��0$fx� ?��'	�St��D��1=�\�K�����8��BJ\�u8���-T��N�4	�3<J�pU�>E�<���<�����w�q!�k�pi�>e$��PU����X��Q������/e��e�Z��aK&q�g	�,�*K��("���RW�b'<8;�v��jm�����cN�R�
4S�~!gF���-y�'0.YD'L��wV�ohr8�i/GPS���>9(�\2��_����%f�3-Jn���V�;�N/Qq *����dm�'����/�2&
�q��}J�!a"6#}t��c���X�'�F_���0f�?��e
���~43=v���.
�$����"�O�1D��)BAJ����EH������	F>mW�qp�-�����p���,���!jI,#��a�!�l8��;@<�"{
�FI�:M��P;���.;��b(U0��~Z2������-�D�K��Y<��E��9����@ W�l��zz:���S�r���G(Bw������:JSf�.�!M'@�P3����jC����G�K�^��S2�2�$�d�qzB!95��X�B<b��	>�0�"�4�j\;�&r�MV��C\S�j�4G�8b�D�`�����b�S����t~>GbM5F��OQ	�����:$i�����y���AO�,��n��dZ�&%	��"�3GlS����O�#4���M6l�rP�vz�#��-��1J���]la�/�("6
^�"��)b�3����x���Pm�dr}�Nh����n2����M&$GI��c��$%�ctch������n�=��E^�������<���a�#h�s��X_4�<�h��
`�1*��)���~�:h�G1J�{�G��S$�z�q��E%4���b$�,r���0"�S�L����3��6h������$���!'Ae�7����u}�?��gz�������(������
-
���������Sve<��<q�	�?�3Hd{K�5m2�S��RS.O
���(����D������f ��R<E$D$
�b�%�z*�����d��A���6*r���3��<�o� 4Ar�
�BHe����b����F�������r�!s��T�$Zxz�!�L���^"���B���T�V�y���az��W���m�&f����#L�FEQC%� �ZM\D{���m�����5������}*b&#��i�"EP���S��f�6?1{|��\�#Y��\��.��dv9��>�=����pL��r�A��-�2zrr.�\|a�'d�E��&z��OK��y�	��W��,�����QK�{L��yvC���d�e��d�gk�J��,q��~��
�%@����,�i��{�l<��
�#
��$=e2��m� ��I�����(?���d����
���gNK�f2c��S�"c��n�r�>��Y��S�{r�����(r3Xv$������ 4�T`�h����F$��?,TgX9������4vB�3=5A9�@}���d9�Xa��'z�����%B�$����'U�S.�����Z���g���f��m���R��g����� �m����I����	�W�4�`u�������A<M(0��+�f,����;:�����&Y�( &R�%2� �%p�1��m9$�Mr��_'��^B�KT��O~�����N&�H��%�F����������;�\N#��(!��/h����=!�_B��#�8�&�������a�O������#(8�d��{;P#��;����{�5=��|��@.a�=Q,!�t�+*��#�)rv���V�	~����%[G���)�dB�J*�}����S\L�\xt�?�U����G%�2
�c���+Y���}���wv2������E�=K�>J���\��v��j&�k����{�&���� �a��($}	��Xn��G���>�����ue��	����>�0�����3l	�����jY/s4��K@���C8�L�s�y����"�f�G�U��� ���)�g'r�����Cz{����9��D���<1v%�I��f�)?D�CI[��%k}FE�%z�L����-���
*��]0)�c�Y���Pn�D-p^��/��uKqp�k�$y�8��
)�!-Lv[�)��J����f�[��fS�m?vE�f�!q�:�K����6C��a�,T� ��[�$��~�����*Gh���c?�w�3�������(q�=� '�7|?���#�������c��;��`�I��kIY�E(��o��Dd�[���zV�GE�H�V�(��~����[<^p���P8z}mD�-�6,2��+h�cuR�l�5B����zoUsl�
��(�C�/�����#��gd���+acw��h���-r���j�vL����i8w�e�f��Nt��������e��!���3���X�D���'�o�`���-R�{%5����IE�!To�0��}f�o��`�s�k�#��-N�~n<'eV�xJ�E�������^{7{ZkI"Nx�[8�1�V���l��/XJ$����QN$���%�����G��]�aT:.�W#zr�7l�
�c�@��-�ah�byXh&�-
�D�r���6]�����o�|���>�Q���t;�3��%��-N���hS�;g�e���E��������H4y��D�����a���_�2��x�����aO����m��#zj����pY��o����9�e#C����|��<�6n���
&$�/m�#�f�l?X��$��6Eq{H������~���B4��6
�EZ(p����]�G�Y��h����q&��{�/H��X�T���$�	Jc((^`9�$�Qop�mJ����o���5!��<Y�4��&�n�
�
O�]px�e��9C[����u�B�h�	g
���Pm�
mH����{�y�����x�^�{�<eW'���H��1����#�[T��E���#���Y��m��l�_���=�����bL�6z5�����nh�>$j�}��w��V����^�&��a{��H����$Z��
�u��{f�����{���J;nP��!�B��C;�}l��8�1{{�����D�X�[��u	�y�@��=���#�!	�>� �AN�g�X����vH��#��5"��#� BJ��g�$t�I+w�:`�������}K�	ds�*�P�V������s�������`���;fDr���=6!���d% ���;1`~���@d�t����z���#!��=���aa@�@�\��.��A@�������gV���m$Z��b?�h�B�����9���?)�c���d���[;"iF�����L���8����@�bK����
��e�}P��<������(i9f�)-���w�-����M��`L
�����j�|g�I��#^�p�a:D���L!rD+D���y�1��k�Hm+����[q
tMt�GZ~����c��>x�u�Kxz9)�V����V��(>-��M�6>�� �A���]��������$��aD����9"4�Ur�oE����7<���8`a��]�E�`�������L�L:����O�qQ���S�}�Q��MJt`�H������uC"�>�D1vO�&����-7���h��q`dv���Z���	�p<�pk�vo)u~�������O�:�eE%���Z����4gD�F�"��s��5Hz��;>a�p�����L[�3����d��(�����['�|4�5��~���P<w��������(Q�QX�G��*?~,rB8f!����2��U�3��$�!r&;"E�={"�:�����,B�o�������g��yKV�ZP<1�S���^�����D#WL1�s��������,���6����^S��+�4f�u�VH�-�	��6!f��}e�0mE��t:cb1|�������6�<W<����9�`@�\�X��)2�@�d��s��{�
�����Gr�zNE@�t�)1��P����[��VTd{���Dst�$d�����@���Vo�%T�h��������������%�$�j������]��� ��;�/F�o�UtR?��F�##���A���^?�(��{����?���c���`�+@�S�O�<
"
�g����+y��F�E�d|�h����`��]=~��|1�dK|���
��*�F ���u��3w�-t�K�W{&�x��'�E-��>��a��u��b��$��C	:|r�@{�7��Lz�%����T>	$�^Bn�}���J9A��{��X��,N@�zP����kg�X ���2�������<KP$�-)�I�d�0i�,�v��:�x}�BH'�&�%�TDG�i�3l(R��U0o���b�w��Y���g���� �9��w�'Y�������~�*���l��D67�O�y�#��Fj���n��;�����h?������jgb��*��I��
��a���P��G�'��hR�9��B*�}V�Hp:a��Ti�����?����e=��g��O<\�z2C�w��N���Bv>J�!��N<�%���,�J�X��C����I���K�>��u4����������?��R�����<���5:1����.L��i��w����.���#Yc;M|r���\�P���_Q�f��^���&E�(`X`F�p��~����f?����Z���^��q�_&yk�e4�I���ENKw&��'�������6��� :���T�h��1�����^F����I	���E��~i�3����$Qc�`|KM��@��B���kt:����@H�h�������K;�,�P
���.�3�Dz}Ze�����vfd�|�������68��(��1�	�0��H$SuT(�����{��Ud.���+�N���%��p�Dyd���Pg�yZp��Q�*D��o���H��K��$������xW;�����/*a�K��yhVg���}/�g.��ls�Ad������4;U^��W���Mf������_��g�2��v�?��m�Nv���G�9�z�
�^b|,r��o��}��R")&�c�����d6'N�����E�BbH�6��tRCQMQ��um�>7�=�	Y�x��@0=	�
�Vj�~e���8����^2k�Q�'F�T	l�F��Z�$�Z������Qr��b��>�h�H�Aw��L�"��FZa���P�{Y��t�E��l�����:w��3H��t��%��2Y��$����wo�_���d�0A�'q'z�D��P�Q�Q�3���U�3)��S�����a=h�j��	�T�$?�x������of�X���l{��+21���������:r[�C�N6�1J�G7���`�w�U@��Tipn�1��(����;DIo[L��FG�?�����*��"�SNl_�HR�����O��+�E0�m���d��Y[&w���n�����0�"��-U��&��iY��Ql&��-
P����	�ea��Z�QD�L�NmJ�����2\��O�T�����`�eXF�<p&�\���~�~���]GepT'�2X��F'����+��Q_�	��>[�<k����x �����hWpf1���`�W6��^�r���_��Uk	��":A|� L^�iP���`����n����J��FGqi=�U�]9(t�o,:G%�
`��v��&rk�%�
T���$|����5���Gq��}��A�{��������@���T��:�g�>P6�+����2��!y��(��LG��dL(<s�E���.VH�d!�"Z!�M~������6"����n���9�"���u<���O��0�����L�$���e�,`~lZ�	��F� ��-��������5�7��^]B�]��b��j����D���,7�����'�k�p��#�
�D[�����\� �dg�b}\�}�.�x&Ws0��'��9�c1{��BU�C��gh��^Ab��!��3����H�8��~lC'p�� h�:��x?���=�+Xw��AP�D|l-�X/+3���,�����dp�*V�}�$v-Nl����%��+
H��e�.T����JJ��Tu�������V�FJ��^G�#���[�5$A{����	K�LL���7��K\�F)�c��s
�m�K�i�\��=z�j����.��(��Et@�����-���QM$�v9� ��{ZI�Z
���������m���1���dT��.����_%�z���H!A"k���s�����9�0Z-��,!�]m#�*I^1���.	pY�
D�E����O�������Y������`%O����I��N�v��&������z�]W]y� ��m{	��Q� QY�P:�`�T�>��
�R2eQm�3�L>���Gf"r��
")��Y���b
C�Q�o7��g�0Yn�<9.��=��_bKBTSw�!��E?���b�j4�IR���*4����w�3z��2�zr��|���,�:=�y��>��"_jAn�{j�;.Z�I*TQ]���
sZ�g|H�XA�A����sI
1��0���3�m��8���*r �E�3��/q�����B�m���I���Z��<S&lDu�qC��V�$�~u����$A'vH��X��D�}�����.���m}d���W*�N8jQ��T�|���������T�]�@�����5ag���E�'[����$���jS�!i��]��V�0u�"�d���������=h���$]����J��|�~>"<�&��O�Grr9u����'� ��]E�'>z;<D�AZ����!u3*MM@�`��P_%W���3�Dy��O�����I�����&���]�{����#4�`��
���>��Ql�L@��ib
4�{K��l!�;��D���hX�x����-���M�0wf,K�7Q�����GYq�p��e!��cF3gp0H�
��n$�N+����,��d�y���-��$�N��I��c$Bk�iJT���i��(��j�P���<2^��>�+}��~��"O��J������?GZ������2t<����OR�ie�%@@�@��{���I"�m�"��pl�.B	���d���c��i��)�z(�k�FX���N�X�X������?����v��'�a��vvG=��e���!��[|��wx^w��sFo�^G
�Ql�A�O���J��M�Z�m�����BL�����jG���3zh�_���q���5��F"�����t�&��O��"�*�Ie�/�L�)y��H�������>F������M-�����P2��]�?|v��5%*������FE��:��H������~~]�&���Jq�M�@�33[/!�+Ya�'���@�������v�Q�&j���L$Im��8��W�05�5�(Q�-f�j��:ve~l 
��a�I��
���7�A�����]r���<]�%���ba����d��
��Xy��43Q]$�
f\���Q�+B�����=�x�
�l�n�o��.Qt@Iv�����;�16����(��2+���/l���	��l��V���R�e����<�u�@"Vn�OD��st�M�����H��G[?��3Na
�����E��1A9(�����i/����'�������rJZ:��5OH��ms]������x4�D0���$��d�u����Q�Je��	�v�	L������M�R�-'MZ71;�#6Q��DS�D=�����0bACJj���L.3~�36�|�Z2����G���������{��xdY�����e�I��.����],� ��%v1�y���F�q��d����Aw�qR�vG0KO4g�"vO#0eMys���TH]$�H�C�#	{~#L��E+l���N���^*r���L�n{��H<_�/"^2	���'�=XS���=��Kf�}��&��< ��H��qB��������D�0	���%$?�Yv�����b74���V�`l]��� "�1k��\79p�8�u�|��Z	��s���#R�h;Y�Q2�UQw�=��8&	��T;�������h�UH���������]K0��YV���)B�p����������C&,�.��_��g���f���UIP���&�?�<!!�H��'�3�c���)bB*Y�����_v��	�����$������AH��.��!���'/���_��I�=�p�=M���b(0�>M���9�dB���WeH����+�c�0VZCvo_x,'\�?�'���-��������L]X?�nMx�.�$��n�_6��-�XUqT�
�����'�
���@��xd �;�����8��x�l���B�>kA�p��`���vC������P�.���B���/��|�^;Y�'��B0��]��H(�.X>�c�0x���k�3�B��6��H� ��?Cr	�����/�/��N����{*'*M�a��sk'�����2�A�{v	qW\��X��hw��i�C�^-f;��y�6�zBAD��_�Rt���MM�� v��������<+�O��IH�n�=�P���F��I�Qi`o���>��F��sM���!��=��B��
(-o�?h�������*�����"7���|%{���U�7������
�U�a���e�B�9Od}��	:=,�M���p~|�@���0iB�A�ArI�Cx�`��W���R�0>�^E���S��G��m������n8`��@�'�`���a�,�G���$��(v�j�j���	�5,���p	����!Z#$���l��8��G����W�VO��/y�>!�;����5��,��U��^At�o"p���(�|��q���C@7�'_V�;s��PM'��c����LvF�j�
��S��J�wu��H*���a}(
(��WD���uP1E����u4���!*�[}�����I�6���{�+��;�3B���sP2{7����5���6�l����,0�m����yw�he8I ���������=��5h`#���}?m���g�_N�h#4?c���"�1
���y��6�)��:�O�HG�����L{4���+l���U_������&a����
�e�0����r�=�5���
������
�
/4���/�!��8�K�(�j�A�����}��*���@�Q`� ��!(q�t#k����R3���i����za���0�'�����F��"����:��,�ZOH�1��� K���;�C�2����Y��V�rokF$yT�'������q�zbV5�+4�~8�&�6#���u�*"A�����NE�	��D��aa?;lr �l(���0�<�a����O, ��8s�d���$�����f��2������G"����*������hc�PvC\�2$�*��}"�/�&��b��#?���ME�UC��w5�����c};v�A�x"NLC�:�O����z�;W5��b��Pv�$��?��%��wd�:���arD����#g�q����x?+<$����'�J�������������R�����iK��Q��
���E�������Z.+�0D���{],����d�������Z��"p�(�����BO�)b��:��r23����0$n>F�P'�p�h>�w�B`/�{�dN�	�i0Lt��7�O�}i���#��)nA�z{B'�iF�>����'V�����1���������:��ll:�`���m�U�>���
��Q:�����tXr�(3EA`H��E�H�J�l�������G6-P���>b~��a'��O��V��O��zMUa������(|)8���P�'IgS��-zy��I�P���e�)6�����Pc��E/�S�K�-K��)����Sk�>��#��j�iw�h������L1�^Qn��8�[�|�hXS���t6[r�g���t�~]��x��8z��G�_�/��QZ�+|�����J�|k"d$��t�����������������S�C�5���n��G�����|J�	��L���WN�'�u<�BbM��OQY
���zM��W�i�h��Q��g�����D'�
6e�p�)�{"��k�����v���/"��1����is�M�v����f0��Vv�d��������2@�n����EX�4�q���|xb��X�,�E���B��L�����_i��M�����`VS��-�y�K4�1DN(9�s;��'���<��2��g����NO6L��O�>�7�����"�6T��I��_�N�`$���'�l�������d��v��x�=���A��d<d�������b+��m`�M�q��P�������7*�`��Y��_�R��'�g4y7��O�4VsY�9QJDv���!3���H�i���x�B�$3�s��R;�wG[�� <hRR~�](�.DC����H��S��������<3B���N!���'Be�}��<�g���v"h>��?�������U���I�h4y<����9�F�=L�!��XL������Mk�Z����c����c�eF}Nz �?�HL��>~��)����]�>5A��M��0��<�]���e�����|�
]���d����/g'K��r�!�I�DY��K�S�)������[�} ��+�_�~o�m�1�K\F�]����?�]������N*�������,q��(��_RW����	��>{�����{�40b�MR/q4C*^F�����K�U<}�mF�2l�nB�Lq,��H��>�If��|�i�0vy2"�["H0��`s��3�������o�`����/Yl���@���	���M�8),q�X.�h'�}�@�k�RF��=�bp��f����i���pD��������h�q�%��	���]��D�1���Ip�����_��P�0����vb�n�$��(q��H�2�<�
&_���J?��,b�V@���Aj�Y/Q
bh0���j>yE3���Z���MU���bY�����D�<�����P�D���	y����$��1���JV+�����C_�V@����������8�i-�����n{F�	�n��v�~q�`ZpD#����n8��0�=�X&E��x��FN�KRgjZ����u"R}yZ�o�����bB;�c�R����'u��P[z;DG������H��%��I��a�+���!y �=0VR�S9{�ew%�QT�m"�.u}
����~&%��<���:� ���b�wQ���������jnz�e���U2�����i����BL�L��e��S
F�q>��{�[�d�NtVT��Sh��Z�-5�����?[�2�h����}�5��
{DJ�ew%����)X�\�1���TPJ�CW���als����AZ�1t��(G�N������RtDg�t;���D=��7Q1Q	��e����_e�<{������Y�<+���FJ�yl�x��F^'at��;����/�"	"���iR$I�?P�M����a��3�18^���UK�����ELQO��������?�p�p4���������b����"(h��:l�(b�K"F�"0�^��s�����j�
jr	Ch��#h4���'����;�n��`�h�{����d�ck��������5��I��m�t{0^��W�_��P"�E�S�����>KIK���$���
O�c�,I����Dk<�r\�F?����C���6������DM�����ph�W^Y����������p��G�d��I�1�UwlA��|����f������A$�<Is�����s�WH�8���h�y���T�gn����XP�V"8�������B�"xb�n�W��l��!H��-t��6���-H�����6@����^i!��dx�g�y�$:��nC����3��|r���zH�o{�M�9&DZ�! 
�����I�����;'���z��T��l$�B5|E����.nn#�3��|^
T��<j����G[��zj��,��7�i��q��G\��J��>I�u[�<�%��l?��Q����=j!=!P�s�(��2��#�v�?�S&ZP��D����#��xF����9���	�����n�2,q>pp�]wG���_t,8�����.n�+�������i�Hle��wu�t_QC-���I����!�����d��3V
���������=C�h5rY{[3������jr��C���Dp�ZGE���p��	D���{�'������-�
��:P��Z�=���X�t����%$�uV����U�v.*6�Y�H�v<B�}��+H�<M���@�����9�f���!���/��dK:>K���U�vd1��8,�����H�v�-�e��Pto��F/���������%��h�9�9�1Fq�J�&�y�#����h�8�i)���x�$���G����Z�HWK��Qi5Q6�
���I-t�i�\
QbDp����r��="��c�����?��Q�am��3A��e�i;1�p�)0��d�l�
��/�^p���w����rk�5*?�x��������B�]�{DJ�#�`E����)s���6�J��]�%���aP��������}�]�5��nN�"Q��i�5��:;�0N�b�����#� ����ry�.*uwM�zG�9�f���b����E�c@���A���v#��_[���
�2����GOM^r��`I��G�\S�XI��;��'�����@�$�i>GY}�8�:.���3�t{&${�3�M���$Ai���?�'�B"���!a��t�[-��b�����~�>G_���/v�%��m@D����0^O�0��8���cR�LO�2���������=��C&���0��z()f#��f���KB����s���s�8!A���g��p�E&�����3?q�IL��������	Qw����#c�)�d:��>��2:�����g���~��|������;����6�+�$����&s�G����$1�n��j�z���ov.��X@rBJ��Y)�w�����O��>,Om�T�����dd���c�&��G$�d�H:�b	�G����/��~��K�������}�Q
d?�n?H�%���a�l��8���(��P5d�Q�9
����L�c�Y�jn�"U���`�����:|����c�>� �����P���J��Zb���A���?I��q$B���8`��Jo1���|����ND���?'����Y�1@x���xzx11���8�����$��b�n��}�$���J}���N}��'����(�
o��#���F�&���f-��5.��xw��(�����p��[��P4;����{����\����#.�E��x��Z�g��k�-��u:�=�4~��~�<@!��j��]3~�8\F2\���?��iy����y�^Gg�d��� [�F���u���������.���:����2:'GG�q��%��hT*����Z�S-p��(\<���G��#Z���*���8��y�*���'���;	�C�[�,l��S�l
1���5H������=�1@��* �N�+�
t����W�>�_�X��YNo�d��������>�����"�w�d�[����8�����K����3���eb����2���u���k�������R��
5�6ILk@��:&C���/w�b��+8x�Ax�3N�$e����0s�Jk�9�^B�\�1��Q�T�[�&O�S�]#�=�-�5b:Q����{W�� Ly����w�
3�q��.��r�,<�]��*@J�5:y_������f���D��\��D���x�.�A��9�E/��xg������L%��M{��������7������
�9�K�����J����q�z����6��m��XZ�G�����{�fb�IEO�Rx/!D6���aA�f��.��0?'�0I}8����{|�n��|I��^BE>�"���f�D_�*��I�,��q����O���uH0�1���&yUD���>����� �
~/!=8Rt�����6Y]�mJ�w��3��IPt%�ukD��P�)%99<5��)$���E�������?���w���PzLj�Kt�%�`{��o�C.�F�H�w���n��:I:�0y����J>0ly��.�������`���&E�}O6�"�sT����=���q.]���-P�����!��L����F��9�a,�����C�>��;��B}�,B��0�[K0i:1���R��vK"K��v�;Nob^�	jU���qlNR�;�� �6���#q�,��G����h�4��8m�v'9���
h��������O�d�-��g�.�k]2���<�W��';h�ylu��h��Y��7��E�)���'zq�p��x����=�d���������]�����v����]m��eJ�����:�R�
��c,��t�m�J���L��fa�-���FF��[x�h���H�#�KqVrK:�"@�eS��b�<����\�@��e|��<m�lfV��j�&dS�%S���'�C.����I�_@$�\�kv�����1�a���:*��6����"�m*j�oX��++���7�A��GR���G\$Pb�=�~�6�u��
�Nn�0>�l�
>�Qt	�P������L��S���-+�9�Y�J���V���qJI�l2�@�����X����]�q�e���4A0��^B���Ce���,�V�5JQ��I�eXIo�vT�Z���s�Z��D�>�p|������fR�+Hu����-�)�H+����6�/HV��:LeZ�C�`��MJ6��5m������c�Y������$�3>�r��;�U���	&�K�����,ok�A7#*�?�������_vmI~����R8��>�����m���5�"���{����,_�{�Ee�~�B�r;5h�X�OV�����Y�ud��$�-r��N�����F����CK;��M�Pt`���=�uT�Q��Y�d����.?P����G_���r,^,(z���1��p�Et&�Q�x��8Yb�,"f��>�E��.��|���4�8$�;�6�����%�q8D����/��� �Y�����K�g����c�n�|hZ�`8kV����$y�j=P���y��3�5��R��$��H���^Gv�I'Z��K����������o�oG����T1�������'�ZTq#��T��6�	��n����GD,��i��`�v����Kh<������1�N��,)���������z 9�j�s��cf�%EN���[�'��K�l���+
�&�l������	�P����%�����/����������c�Z��y�����{u8O?�����#gm�_��&�[�#�2K�jE�������H�%�V���\%�\�&4z��c��A�*���6���}��C�Y��%��e��)&�|5�������%�G|�-�CH�v;c'w������������T�g7���}[
��X��2+y�����xn-����7"	�{���������@$-�����g5|��������mOh��^������lW��oi���+��W��wb!1��3��3�e�TPh���OU=�'�1ad�����6h���*%������&��j�}"����V��|�Zi��m"���u�}w�M#%W��'����:�� ���c�*l^#
���G_^eR'U =*9J��l�Y�_m5�k�p6|b�4�Pz�H�Y�
�/�|�6�	2"5}5T��x�5~�h5S�@���+'���u�x��'Z"�^��:q�wF_�Vl�!���o��)���G��������v��%���$J�f����K����C�$���O�"������k/��N��"#�Y������S���vM�jU��'���r��ze��w5:���V2`��x��G�(�H�^h�;����:]����(����zV�%$�#����W�t�������h��F�_vv�q��6��{%t�����dTB
�*�j�=�)T`s�/��C���a��eG+����I���(w���������[g?x�[�y��T�W6d�N����-����9�BWgV���d�y���9������Vh��8��e��/���^S~���(�.4C���!Q��%��4�-p���@b�=�8C3b7��7��|/���eLX!O8/����-���E�c�GN�����fp^kH8�,P��>;��>��9[�t����Xj7�m�����	������9�{�u�n$E���x���{JN�a��r��-����q����n����$����[-��-0������E��jbz�f���+33Q[a���K(C6��U?���M����>}���4j.+��	~���{�L�����z��4^��
�MZbv�%����'�Ku��������!�T�}J#���zD��Q�c�I
�$q���[�C�4V!��AZ�f�_-5;Kc�_����;�=5^���,O�o��l���d�������
$
y63d���H+�����<C�-����]3��Z�PR��%��[��*�z=7��4�H][4���5sT�R����T�}�< ���Ez	�P,���(:���-��F�����*�1��|H'��'�WP��at��8�S.�������d��"�g������W3p�x<�E�w�@�0�q��(&0�����t~JdEh��OX���9[����m����k�����V�T������IvT6�WF��f���=7�:h���w;����E}�1�q��E��ZBy�p��6�T+��9H��� }k6#�U�;�9Iv�qi4������D�������A�hp|Q�J1 ,sK�QT,#G�f0_���V����c��9n�w5+IV��"lq���TwK���^��T����7������t�Z�wx����N�/{��4.���������5������������t#�S^0"�
�?a�f��}Q��n�_��r`&�z�?������O�B����y��%VI+���K^���X9<��G/B7���+������\.��Z����1���  {7���_����.�M3�O.4Y4����GB"w#����oh���t�Obp]m9����.����"�Q���a�r7|�vq�Z��&Z�n$_F6S	�B��|X�t��5OL=�;��L�Cm�{7��������:�(i�1}e�/F��d_(�o�����=i�{���|��3�z�s|�D�/�Q+Ym��t��r������C���n&����������-���T���zDq1%C(AM?A�z�(V!�z�vS�}N����,m��|���!3UF���D���]dZ?�ih�_�)��������������=�<]d�vw�c{���|f����=��cDE[��&�,*���?Q��.���_$C����T���K�*|T���{�Z����/�X�q72���!��_]�z*T��'xLO��m��>��=����'�������{�y���&^�����:�zT��&%w�`�LM�3�yLO����!�0������a��Ag6��lL
�#� #�.��xKe���L���,��	��eC�@��D[��
��Qk�l�K7�G���VRe���������������E�1�
��7�/E� r��<������{�q
3�����6~�}���7�k�
{.��|H�U�=���t����r������UZH�n�=.�0�/���u:*�O�������������H�J�h��M ���zG	G�AR{�O��%�^����+?Yt���G�O��%A���$�jN�3�?�Z�lz<�Z��{�����D�!���$];L�%W\�>D�1�2��R�6���'���8�z�N4M#��QBP��~Bf����MIz����[B������Px���Ol�d�����]Y-��`RK���u�����-�O���k��������s��\�F����j��vFcW#3�)^��|�����x�G��t�$�1�{�py���9p��K�qH�7�A���~%��(���d�����j���4�`�n��b���4��N8�9��)��&>D�Q�|7�%�Zz$$u5�,3����"���tV��}$C�����t�C$�?��TE�^D�v �����q_��B���r��~~H�9L3���{��8�	i�<�o��:a�+��G��d������
jiMg<�E����*llZI��/��(=���k����}Y%�CG�a�A-�$�=�C��B#.���.C��v��l5p���0��G����D��Q����C"l���!H�ig��k�@?����
�1�,xl����}G�����0[`4R���Az���-��e����;&
�������j7���]�hw�0�*$�d�7�z�5������s�dK(+�d`k���Gh�������h�����-8RP\��,13�q�
*�����F��
ym���+�PL��o��Jp�+"6)	N�#�@��g����lm�+SP]6��T{��@}d��(�RS�)��uf��$$�W�MY�)3�=
�z�H�u���F��[�t����>-M����abAy�FTJ�>
j	4�q��QX��������?3�DaK������;�wG�-:Y��a`~���&�
3����Ch>���H���.�p4#F�J8r
yOB<H��y���<��8�{��Z���h}���o���a��K��A$x��+ �<��������	���)	l��f������q\������	�hW�f$t�Y_��z���j>v�rp������i������L����L�h�r&.X��f�'�y�%�	�
g����IC��4���������|&�Q�o�C�)�8�Bw��,`)��8�	��m�9�c2qj��1�Z��d�#D�}�j�%�O��3�\��/���V����W)��0�T�tN�L�(v~�B_&a�g,���oz@��K�:��C����^*2��P?����+&����2�}�tD���)(#J��t
(Q`�"�c�t��`6M �Dcz�nP!1[8R��=��^�P�@��p:Y���w�ML��r��=J��F�U��h%t��a����8 m�4�/�QF ��7�^�sZo��R�	|0
��r �Y��'c�3�Rf�X~�dm&�W����=f�2���pT���m�o�����B��J�B��fr~	�2GF��j;G��Bw�y�.�CHP�������K��_50�H�x�K��d��q5�}H�933@����E�V���s�A�/��	<0�2�6��t����Aj*����G��f������y4�D�`'*�S���5t�����A���:c��&zE�=jf�p*x��-����*�+�m�����D��p�-0����*y�+H�)J�^c�9�Zx�G}w����4p��]��G 8��1��]X�jF��8r�d���W�p���)o��m�c�=d�%�S������"�g@|����G)a���ucI���B���m�n`�!Y6F��%��'65����q����� ����B�a��ns!3`)|�����K�^�z�os_It�[E	���!���Mx�E)�uQ��L��E�e#��gG�1�"��Kol^e���PW���[b��
��'f���S�����3��m�}�����{d_z�xQ�S`$x���x��5A[���g+~A
[��-�c�x�a�;�[�<R,�=*�\��OX�b�����E��c$d[edxk�HH}S{���
�{HCVl�9�o��M�,J�Sv��O�Z$�<!��1��P;�e�������&����-��GeB�2d�>��X�\��h��iH�/�W����]
���" �2��}F�[�U�[���1_4jM�[VM���]�/S!WX�+`���A���#��N�T8�G})��%�26���q��2CN�����#�O�������P���oI�l���F����'��1dd��#a��)7zY�1�f��s�Z-��7ZY�9���� J�r�>o^@�Q���+l�?��&3�+FC�Y��G��:J���:]�PJ��%f/:��m�$���v�P���iX�����4@$f���v��yGB1rn�!�h��o��\�
��&:��GD�eX&�h@���-�XY�����
m;	�Ah��nBm5 �����]#Z��^vGD
�bd�<u��
�C�����L��d'��fQ�W�=�f4U� ���Q��n�4#+����b�%����$�J�{�0�KY�	�U��9�j��w0?��e.�m���C�m%$@�����_Ch���E�9�`����3hqri�
 0�2�/���:z�M��
��A����.L��){r�q�",5���7LvH��(�u�����|_���ZQ�����?3�tR�E
C��@����ic���(�������i�l�_��6��e��]���%y�}u��
���Fq%���(���t�,��iM&��O���g%�����c�K�]��O���2 ����f�j�����&%�g�aHs��������Z�z
��@lvT�R�����T"�~b�����QZ���4?���,��D
��`������5���~��.�Q����������d�=G�[��������MZ�����������dzf'X�g�!d���_������o����w������eit�����_�iB���_��8y��I)M������o/'&$@�����W��d�>e���:�������A#+��������RY��CL���zo�FW����5�(�[�O"1�	��L���	+e{���I�������T
To��G��|s���q�o��\2���dpi'@�����1�)���8�������Q�m�_��������l�6�?�[��[m�.����H�����h��
���8�{���d�� ��gp�S���K��B�A���X��31����Y!$���?l���}���K"�%�D`F^�X�t�3����k�����@wA)��p�{�B:R}e�����b���7��U3�G������N��� �$ �O�N���f�>�����{Dt?4{�������S�"�����#tEG���.8�9�W�u i����x��!=�(�~��X��g��V�K$�m��G������H�]e=�����T�u��� �m'@��������cO��_�G;jV@�-�u���	��M
�"���G1|�+�+n�e���7]�Z����%S]*���3I�jM�@���$L��
����a���;s�X��Ox��"�(��b��y�����X�Ad�{�)}�P&��NF���
����9�����B�fKh���a5*�<QGv�SFY��9��j����I�u+?24k��T6:�(����q��D�6 s25�M�1�$�P^;q���"?�8 �ZR���%����hziQ�m��2��H�>�3��	_ ��"R<��������*dx��@���9!�zL 8OZ���������$��y������RP�`/�tsJ'j$h�<n��O>nB�o9������;dEBz��OB4y���O���� ���}r���g�8x��G� -'�}�,���L�Pbe��Aj�cN%��PDwj�&�������6��B�G���K#���_��2$���na�b�h�Ct����\��/�O�
�@���C?Z��5�
����Uf�YCBS#��4h�X�8M9�����g'��I�A��c���'!��;�����G/�|���#�D$�t8��1�/1��:A�QYc,_2v�:=��g&����C]JN>�a|�����m�"P�}>��3�������=C!��������r��/���.��r]���C����F���F���'���c�[i/N��R��O��$�'���8�W���j�����T�W�t��0������4�����|�]��K��NN��a�("c�����
E�s�?G�F�2�<IF���HRWo��%�Aq�'��
��h"?�'�}55L��|��W���f0	?�6!.��j���k��(�]��R����L0��;�lUY��5d�3�A~���������mYD�d����u���3�#�����g����!6�'��>RG��oh���\N8�}�����H;��7��������o2c����s��F��L��9B��#�}�/�,�����*�d>{�0������
�����C��?��A���{y�(��(�C6
3��3L�Hj��{���1�o#���� ��U����0����&�2JL;1�A��q�A��c�
�c�����,������S�����>S��>)�}2�����{M�+��;�^c��>1�&G�{�������������J��w�^�Ap���^�:�T��.��M��T�����ui0w�� �
�5��kr���h���|oc)�<��_��k���.V4'w���4B��J H|�v%vWM�{��e���������N�In�a�����a]�(_�����kL_�d�G�o}����iz��x��7�������qH�����=	�Uq���� fQ���f��:�r��{\�@��^�]���fN[�}��x����&v)�I���Pz����H��&��>&������v�$e��z�*��Ao�!���kLg�C��SX��4�F����r�\@"��!z��	'��Q��|�<+�K���P�������BD"����{�g�r�����X��{���^-+Jtu�����^%	�����S�����`��;���D
������k�nA�^����C�r2lA;�i�.�����Y�0��O:�{H����2:pC(v�y��ft�{��E]L���^�W�irNA"$��E0�'`s�j`�������k�=�CR���X�#=}e�g�����HE$ �hk=�d����\�p��q�
� �y/��>YFB��i��8m��I�G��Dkzj��}�8h������j�n7����1 ���}���{�t��N`�������i���H��Dm��?�vb��^]~G�CQ��
.�������"��NA��&��<s)y/��������D�����j-�����t�����(��b��t��z�|�?�K�y-<�N��E0��q������/z����g�6�������V��<]@����zO���;e�30���*��i��0����r���>nc��s�L��w=��	R2����j�h�~�	 �7�n�H�x���S��{a���j�{���"A,K��������I��7�c��N��~Iy���<X�S�*aj���D��>N���$�m����V��5�=�N�w�#�n�i`�W1s@X��$rB�Z��HyZJ�WS��H�*�0K�L�����&(���B�:y^f�v���(f:���g��F���Z�2l�[��R��3��P	�+E�l1O0��l��,������U2 �ER��o
�3�A_���6rF6�D�
�D�����=0 I��#�d���a�m�������O��O%����jXH~���@Xv���[�s������P��.��N����2��LH;$��3�Y��@�����E��b�@�"�v�C���4��c:����	�WZ�v/�u�dMeURS��(����'
�9���<�>��{��g��)���)����"Xc��5�fh�S������Q�W��/m�UC-jr����^��m���~y��T�Ub��rbe�]�>��.�U����U�)����u��oO)^`@���.�\
���Ub��I��k�j�2B��1�)�R#�K��[-c���b'����]��d@�3��
������S��I�@���S.s�z��>bBJ|~�}W�V=��L�w�OT�����9��}k>�nw�m9�E�N���ZZ�lH��{�k�����n�&��L����w�f�;:��U���L)�}���[EN��_x�]mF����*���@��\��u����I|CJCd�X���L�G����WY����\�H��*F�%V�����e��1����^%]���A����puE}h)h�_���2X��K�-I�����d�$�h���� �"��1Yf�b��`�h\�����:g�} ��q}a����8���0�|��hI>�]����=�5Y�`�m4�����V���A`8_t�sQ�N�E����H�����F�Q`���/�dJ�4k|��F�H�K�d�G����=��cUC��s�DA��35$��U���fT�H��Q�hc�HN�K
��bt5���X�5��6H�K��j����paN�3��u ��q�=z/���jA����Va�9��~��.*kU+����.�]����Y�Z�0:	i��t�����w�]5���{�xf=���_��UM,l�f�j�t2�u�W����L,���~�'����\��I��fN��}��T3�7��S5���@$�����.Wc
�-�����RH��_ �����+I�SW�
dv������\��G+������xU�H�^[��f6�BD�5q�HL\���f��mM&���k@���*����O6YI�]�2s�W���(�@A������y�m��tV��+%��W" U����p����B�-������\���+����#�J��l�4<�����PI�WM�@2��^�d2����d�&_��q���P�5���]��$�j55��n����msA^���@�Vb�R"�D����iEk"D���	lS���W
%���k��y��J8��
��j�A�K�/��VG�t�?JjSA�r���x1�@���k"�rz�h�''�Q���m�D����:~�?z��
4�]�{�J��c9A�v�1���QM)���&Q
�d�fT���#�DA���(�����oP����g����6�n�j����G��S]�i]�	gI��UM3��`�
W2�W]���D�N@^�R�
6� �h�5�
�P\t������C1��hP���mu��oj8�vr�� y�a���bNA�~�<yW��n���fT�A� B��xb��
z��[P��^�fSS�Pv�#�44�G`����d�If��_T�$�������E�P%t�'�5�'F���U������
�a������>�" !���C��o�4�A��	%��q�� ��dC����V3���0���r
$���D��a��?L�o"��
���F�?�b%C1���o&
���3����b���=��zf�)-�������*���R7�h��:�,e����+(Dj�2c@^��!�
��A_�BJsj���I��5|��0.��JrDJ�f~@^�:�2y@
��)�k/W�!{B�����|f��F��6S �Q��+���(7@���"l5R���-�D��h���QU�.T`�1[���_-c����)Z��^?�Q-�nl�$r�w��yki4��T X�'��R�F������2K����Q��D�
�Hk�	�klO��%�����!V�b���9bHW7���4	j�"����m's�-4��yP��{��'����-r��\�/l����&�&Ynq!�
p���kD
����F�%TX� ��U
E�[L�4c����N��Fy�S"��A�y_pA�f���5>��[��?�24��+��������)N��Y�f�_��T�u��k��?��p�#���2{��F������rQ��"R��B'�i�z������%i��f�v�!��!�&�eM��/��u���aru�tt���Ri!T��4����V�Id�3	����T1
[�g6@��&%�����8��d3�_AZ�j+���DG����l�6��`��l��� ��p�VX~�5���'�X�=���_!�%[�1b����D�bW�����X`Y����a��4��@��R�|�	("��W�X����{�B������*�&�ev<�nM���1�l��G!���W�X�a��]���e�6���$	���fda��gMj�h���D��N���S��&�D�>Tz���+��,D����g~jmM�i*�3���x�����X��C�AVK���n|�nP_)l�R ���@��F:��z���lp�v��1�'���<BH�w���q�gR��'G������2���V�������/�y���^���MY[�(�z��f�P����J�|��9,���9�zL��j���`��
�#$�'��Z�V��;�s�)]�S%}y7N?�,�eXF�Z���6)�^d2���G�!f��<h|�~�`����|������O}�_��^�(�^�!aK.���D�����G�~��"*�_���� �`�]P��	�EYM~%C����������-�Z�;���x�tc��@t���^H��#�����@�)���,�X�o:>]Qgw�`�u�������PxG�iD��J����.l���H������^���y�Wt���A#-a6�;06��R94��a	��]v����51vG� =i�!��������IX�n���`t_7������=12�S��p����CW��c�^��MV���P���.y�K��E�7��zp�b��a��m<>2��%pc��a�*���j7������&�:��P[��F��#�7����T��<pn���E)Qe�-Y��o�	?�a�oYl��;J��d(��Gx]7��_H�T}�5�v���/��Z��_z�=$d$�A������6c�������FE@���mD�[i$��'�_�/3���+4�%����jSD�%�qC� =)����Z��"���������A7�/�s��Te�J����C���}����� r���k�!x �?K
t�%;R��I��&���6r�;��_#�wi�2��������dX��Wz�T�V�"7pQ�z�h�����P��n�_C�6��,����+�{�8�~"K����������Nh�M�����8����~T
�O�x#����'���o�*�a�xB`>�����3�H0@����"P-!?�0
0	�>>�]3U�Tf�4���j�E�R��.� �H�0��H����SK:U��4�X�N~����J�fO�/�;
K�
��)�����#����&FkZa4:39L��a�`{�����p�RH�w�����3�&����n4���U���h|�?m��	��Z38B>`���T�������� �0�T�#$���`�J�"�0���f��~�.��f�?��f�nm�� ��~e>/t����3��"WR����t<�g1��,�f��I:�',��{�*?l�k���=�L��A��)���vY�
���������F���.@�|Q"Q%�E����$b�F�{�
��N��c�����KY3=��eD���=��!����?2x=� r���&���~�6n���t|=�w���
�kc�&|�����u�!~�3���#6=h4��-H>�"B$�% �0��\�F���\Q57R�?�yn0�`��2 �t���%N
�@�BK`�����QE:���E���;��5�"��[������g��s8I���2��)�W���zA��*xQ�h�������i����
1.����.O��^L=�"I���l=�9����0���
y�
t������'2�2^���Ezj<r�_�{����Y#�k>����'��P!{{��h�f���[j{eI���D��|��_T�:����T%���s�����u��l�~�]�l&SP���W7���y`P��������"�a&��+R�L���|�l�+�v��0�;���� ��6}Z��bb5�R�54��9�_���6Q��8N��k�l���a�_��bM�
���Y���������0�/�p�������JTE�����_|Q��_����9���MN����;�2��<�!{�����g2{T���������������7j��G��*���{S��3�~<
��UY!��4���C��Yb���W�R�>3��hj��b{��%n���������>���,F�~��������I��g�K��:����t_K&5����M����/"��������}�d^:�����@���������a�41�X?Ag�3�R�����>"��I
&#��C���t������;��D��h�c�P�e9��"��=�~d@A�)$��-��b��v�(�v���[�w�s��w�!�L��sLW��d��3_"��n)���Q��Pe���F�#�L=?�'����|�G%8�4����fj����i6`���9�I�j���UM�,(��r%}��n��Ms��������%���s�lV�	�Rx��rB��D�4a�T��j�D�e��HHB����� B�9�u��RGl�z�X�Z+.���%`o���T_3v�2���T�VQ��A)k������(���5D�&�4{8M8>����������1������������+�_��*9-��M���gGS|3^�w�[�����s�4Mx-J?M;���r]2(����|3�x�x�^�5�
�M���X]/
�#>L7[�& ����Y���f"4l#PX� � �.��^�x�+�%1RL��z�5W&N���o����4q��'�s�u]Y�4z�a��^��GI���k2":�����u�bqPf��d��
}Pi�C�I����D����-)��$�dg�x[U�fw�9mx
v^V��[��E>	d�������8n�T��	>Ov7�^���k��,�4� �&����r��4��J��P��#+&^�hE��=I�@���l��$,��3t2�&H#jj��?�:���~�q�)�u�x���'���A5�
� � 2	��= ���i.�qp�3����X�'��
7C�J.�m$����4O�I�����J���$���2�Aja�"}��d�m���+nCJ]��N���Z��2$
��1����^�������������8�28@��e�A�� \i�Q��2� ��K
;!���d�T���U�$8�*a�w"{|3�-��YuTz9Kx�AJ���R6/�e��1�E_r��X�����WFn%-(B�.y�U?�����3a&�$5�t8�CbQ����D����ne�����%�T����2W���8Kp�	�V�,���0�^MLH�T�7�N����\�5&�C�~�K]��O�?y����/A�\��A^"�_D"���C��U?J�Z��\��<�G�Nn3
�@R���:�[8��jh��~\qI��po�ht��#��z,�b�7��q�l����V���\+�	�����=�+fD�X@�w�Y'.����(a"f�f&Q5/S��%'`���g��_A�V&�Z��
����<�I�nSh�|��8r�/Kv��e1�pP343��^p�F�4f�I�z9r���%%��a�\�}�	��>?!����e�������F��<�d�$�%�P����&���"%�����?��<-�%[�F��f�BQ����Q!>���RV"������?����&EZ�""��Z����z�Cn!��{��# #��h��0��c������8�1z=L!���M��/�4�����!Pkp��Jv�Cl.8-�	}�h|{�k4���c���&��A�n���x<������vq8��Y��b-@��:��`t�N������=��(Qex��x-�z�$��������+Q���0{ ��:����)�Z�.Dp��,�X	F��?DJ�A"�u�D�Sx��L��c'5���vbt����*��!��������'d`�T��,�3��9�� }"�x��H)�������V�v�����O�LP����qz�J+��X��j�%���pv,���k���d����C :���M��n��{��(���(����r49 �H	�_����W]DrC��mv����aj�j�]�*zy���P��Z�'�c#�6 ra�y�mN@H�L�����`��w�o��� ���S���()��\�������\[�Fn@��r���l���C�A�g��H��SDD���������b�q������X���5�t�':L�6�	Fl�~��s$��!��q#>;�?z6��Y5e�_<����^2	|�
���S	+�
�#������l�]��Q92
�������4l�w���cBd�w@��m�_Yf�U������=H��_V��P�1����iI�Y�
�oT�d�@���k�#�yM��=T6�o��U&��
���w'Pm����� �%�H��$E`� �h�1w'��x����z��l����h��g��G+�0��':�NT&�x>kR����~>�v��������`�:�C'�=#��XOw�J��)�����jEn�X<�w?��5��������5|'*13(@��m8_�w��`\_~���`���}����j��
q(B�{&�J�+�2�qMr�!}���Tek�P$�6�������I����<fc����b�/��[����D��<7�e�&���*��=HGe�q|
���+`�A�;��3�Qz��GI���~�di%S�.I�!h3"T�>��jQ(�}�<}z���������M��(8���������g����q)��k�A���%�>���hc������:�0X��H�q�wb�r�@t+6��Y�J^�/����O���tPO
�Cy��`�Q���s����1��n^����+�������6�C�:4y��� r�c�%\����4���|�����K���<�j��������3x�j�Sb������i�����x���RF�O�O.�IY��1���
(��dZ������!o^�4�p�v'�S?�r��{Z������n�q�" �C
�P�	k�g!�N��5����N�:��*o+������d���.[L^�G���
�.Rz#������b��_��p�Jj�cl�EZ���i7���C����-�"j�A� ���x�~�DB��`���=����1�9���1"e�����a����4i�v�0�SWq�6�"YI��e��P
���Q��]8�O � u�������p%� �'hGFj�M2�x��.GG(�!�(X��9&�(�r�#�I*�sw<3�Pu���1C�����(bq��p�H��Z
�@����|	5C�@<�,M(�wv"�:ft�i`J�K����I4P���)r��`����3N
cO��$���F�:I�K"G)��+�C��<9��^"/������E�����F���cFA:�r�H5�h���#ce�#�W.�� ug��%��<�J,�.U��'mS�S	�k<���d?��/)jG��	��-����H^��d.��*z+q e���$�RE�n��u���%,�K;�j�����\��v�#h6� i���
z%z ��bI�v�7��C�O��4�C&����I��g�������[���yH
=���\�A�����UPs����(;�h��R}�Dw�%�$����-�/�04Y��r�������A]�N���J����Nx���������!e�E^�D
zN�g=g���'mM�E���}r��(�������$�X��,�����L����4�	�����C�8	�H(�;DV+Y�h��Q�N�z�����p�QH.�AHR�t���?�~ae�������xao`o/<��|��n1���+�6��K{s���
�&���m\��z��Bp�(iuD�B$`�m��P$�Ne2:��"�z�]�{�����@����z��
��%�{q�	&��y/t�v�,���w�	���sP�ZC4L�-:J�lfTW��B�k0�{3ZR���D"��\�����3N�r��Gh<���_.���g�t�J��ci<����,:!��}2MLV\��@	�^S~���^���W{���/��)���d���l�#q$>���{��Z�\����6�'�S��~�������IY��i'�rg��~�1� �q�����6�4���R����[����u���$���R���E<��i�dC����g�6=�x�i���W���������C�JI
ZK��A��mu�<�qh�'��hBb��rE���=O<f@���M��F����R�������QJ����}o�zM���UB ����e.-Q��}oct�����i��&`���(�759���)/���+�A���&�/���8����Y!}�SB��Y"ez���y]3� ��x��p��F��1����k4��'��v-��e�[�	j�`�~e���;���W�lE���7u���}-JG�[|�n�&���c2fB�h�����:������{^��{�{K!�R21��r��r~�C@��������5�.�@����� ~)Q�QbuzX��]�����
,��c��Wg� �u��{��=9e���1��=�	2��3���=L:j��*T����������	��9~r��,k��;[�'����,>/��-�tD�_�	��5�@$��5Xo6���^R$b��I�n�)���w0���60�,��K ��	[U�N)
���������+O"��;$sJ��.�b>AJ!�r�'��O<+�	�����T�l�s>/�G<����c	���K2��f���-���K���~���\�r�����/w�&j��+����'g;>[���h��W���bX���UR��femL��RR���n�@F�"|��~�662j2���W�2�������V���eR����+�_1tu@���9�E�b�@�hh`��2%�
[r����T����H�\h�
�-K;�S�.�8���f��:����qR�����A k���A[��;4��5?P:�4�z��%0�������+��K�.����lA%Pb1G����.��	y����]LR���P �|�KBd#������$��>rl6������a�pq�2�	�#&5��qA#?K�4�;?���'�<vdHm�o�]�3�v�]�����*�8Kp~��MW*L�@~%8?��J&$��1�T����8�L%����{���6��.�u��*);�����PB%%*g��[ n���v���4j%y�����x���S:�{bi����|OX�b�������`�wgV��t�
���2���Ng��":��&��5�H���[C�� ���a�I��TX=��|��x�������D�N�
��������PH�(u+z=����.��E*�������+#S�����a���U#{���BMig���d8�~�J����a���#�S���o.��E��b������&�+�Y�hLo(;��������y�����k~@(o�\mB�$0�z�IG1�P���+��c�le(Z�Sc��T����d��V;C$�o�E2L���3,��'B�B��&6���Z��JL��*u��1|r��-���E��1{�����vI���3��*6�A?w���H���rI��/�A��K�7�y}�u���
f�v
rO���G�k�~���T�E��5�����K���:���y=�����&��jl�,H�G�[��T#Ek5d�<\��$�g����F������uU�0�i|oQ�nA������y[�]
���o���%��j r����S	TK�;3���9�(���8_�D+�$�0&vF,Q�P� ;"U�5����c	Yk�g�z��lk��1�/������a:���'�Ll�
U���d��D7	���9TtW��l���1�������'!�k���/-��X����
s)v�����Hh��pR�Z��>���V>�bi��&��Y�0QL�!�5���^;�"��[Z�d3 m�>���xg���}���R�E!�Km
�F�L���wh��t��J��t�59�����Yq�V���m��$
c�w8s~�I�'��f�*���`k��V�`�,C�U'Sm���!���3��$[v���j�@o\m������O�a�j�����v���������@�j����O���2���$�fT����.A��_V�����V2�&�<`	
#W�G����
~�������:��O��G0��~+3b�����H����S��6:�L"��_�@K��
�����k������h�.dF�]�+O�3n�D���_�0ze����<��F��-�$�����������*-�W�<C���Bc��i'������[�� ��� l���Q����Kh����k�a	�^
�kx_�d
��	P��p_t����Y�����/�??���H��+%�}���/fj�_��g��.�XB��d����*���4"���o�\��������
As��!��������}�S��l�,�k(;����$z�"�mqTyQ���Z��|�:��j���?�������}LP��?*���7�{��U�Y�B.n�������-l���y9T����#�$Y�4���I�������������M���d���XM��"*s��-�?��kI�%�6"YS�t��7s�e��A�/���G�4���-�?=����o����JD1����������LH*0;�Jg���J���m�P�RZ����	�A`����,�GE`3�/�x�������PS�V�W���<Z���h���������'T3�op���QB_4��h��M��&��`&Y��P�*�H�!����&�dp���P�����f��@;��{
����h=����q2��4����E=a3p��N�O���� ���8�i�
Y���x�
�%�!�I���3��I�X`���M���!�oBxi��bJ�rw��|���.��{����!+�X�!�b��{�"����j���&�Y��r{D�'�H�d>b�&*;�kp��Q�B�����C�����C_�p+��l#���<�>�������
tj��s���,������	��R������ ��3�������g�_)�����6��_8�����G��d�e@m���\���:\�k�t
����	�W��-Vu�GBB3��{�^/!���C��f�_v���[H�@r:v[������bE-�p%pi3
 A��6x22'Pg��tn[��&IU#r�f:��X"����d����k'���fr�G� -�s�8���_'*������*�n;������S�G��w��i����3Y� �����N�� ���%X�P����r-w����3��h�"�g�U|
���	������5��S�w�2C�����ag�e��	�$8�w|�$d�+B?jdTj��if�����!l;��W�����n&�J- ��@��M��$AD��Y��R���D�xb0�8W����$��X|�����h�����Yn����)�6��d 4���M�]B�X7w ��~v
 �B���������f�\�������OF�N��![h��q�5;�.�Y�������5hz�'<@��������������h.a��<x��SY0��^HI��#H*��V��l���G\������S�P�~6k�n��������b{���$�)�����@���9z��;��%�����,�a��N.4E�{,d,}R�p����F/h�k������%����������O��4v$�G�p��o���������%��W�����(i�t3���.(IC��<1�`���PM�q�����y��@Mq[�"�n���B<n��B�z"�p�Pfu��5C*�����ApAE��n�a���n�������@�v
t,�v�����B��7p�tbd@�K{���5���M"�f&��G���(r��HI�da�l��{��H��z��oX0�p{��QI��,������������gT��.p��,��R�ol�@�#�}�����t��#�`~��f��UM�����n�@=����y&w��I@2��3+�,��~}��E�8�?'Y����.dP��,0��$���a�R�
���z����>�q8Q	H��WT�tP�����1M��zW�f��A���C���!$LB(�t��3�k���h@1��m�����Z�#�+%2L@4
��$��?�4#��!g��D��d��%X����~�g�(�Y�DV��zBb�n�`�Vh�c��*��BtO��:��(z
�6>[5Z��k����"�B���(w��9�Vq�HQ�LD�O��[�+Qh��u�&/�i����P�iF�H� 4��H�]��"zC2�A$=�b��j?�w���n"@�x2�����}r�qm�fIC-W#��I�A.6�&���"��|�LAu��4U_[���	�B��'z���
�@�������)�w���(�g9�C�:`Qu6)��)�����	vr���77����Id��&��GF��>�	��iJ@aJ�D��09�c�R�����y�.�L�������S(�y��*���4�J��Fh��J�O6�ani���cu��-�w�����8�0h�[�
��
��a��\�?���JH�a�@��@���0w )��:%,S����%����Q���&a�P�Q�&��7��a���G�U����yx�����oa�@c�Z�6M��FFn�.�@	�L!h�mdZYr"���)/������� t���+�X
6k4���w�8��6d���In35L
��w���h�@��>�4�HnJ�(��]��?����]�F7�J6/ ����<�'�[yu�hlI�'H���h��������X�>����D����]��k��AZ����'�$���9HvGd_�(iL&B,�������%[%<����L�	�w0� W�����1��f,_��.8
=|��5�);��
�;F�
�����Ft�H�5�*t�Y���+�Gs��f1*j?q�n~�����Y��$���"����
G&[#�������HX��*���W��D/G\�4a�6d�>�(�1>���i�����v�z�c����p?�/���z����1���M��x���#�r��	�>�)|�Z���������~��;)+2g�.�?�^��s2c�Q������@��R�"����?��scBt�[m����/B!X�
��C<�F���6I�Q�b)���K|�d;J;"��az`Ou'@��������JH�a>�h�EE����03�]b�:1�@�A����0���3s��Q3C�"uM�3������	�u��T��L���t�3�Bgf��U��H�x.�����*�N�I�y*���������
U����������,��U}��\�I���`�d�T���k~���Y��t��p��Y2������3.�N���-���*l%������Yw_��� ��L�]n�i�$���Iq?7@lf�����
	��j���"��Y3�t2�+��}]6�f|�4fL�*f���c���wk�}v4�9��w�����s �632 ���^���u�����O#�b��T9��.J�1>�^7���j� �=���o������$���mr��:	��	(e�I���v�=�w������$���}��<��^���E�1�g��7@�M�_��6J����	.7��K]/�Cs1A���������{Py�4�]�������6��NV9���#���f�Q��V)n��W'�/��"�����6zQ�/�8_�U�e�F��a-�������=*�Q6��:6�D��-%[�a�=iW�+�I �N�l�c'pX��`�a&k����/�$����������Z-����@���P*;=�x]�Aa�3A���RE��DBj�9ch+=e���`���T����!A��m�m� �=������M�����$t��"�T��i������m���������'��~,��m~1�B�����&Y��R���l�RS@�8����b��M����������'�����;���0�N
�������vMt��!� �H3\�OI+QP��'�'���x �;M��h���d��G%���jE��C��Xq-l���f����CX����������P�d��Q{��<b�v*mR�y~��l�Z$�K$	�N28�J�0�`����u�>�~IY�Lh��pf%&�IE7
���R�Y+�B2N���AM�L(����*��~a�@P���Y i��'h�]�)�V����kV���+$�f{�rr���{�3B���[O����+?��v|;�7j��$���JE�����v�\H����pU��$,����,��-LZ��$d|�T�2����0��H�x���'��Ju�X��;����S�d�D���d��L%�������2��V�����#c%�X�i�g}�:P�[���
u���O0�5i&A;�-lQ!��!���k������r�_ 8v���c�� S�Z(be����;�������`1[-^}���H�*�����R~�sP���?��[���W6���
����4)��9	�`���[�Tp�esC��+!�RP^��/�������Ht�b>$V��l����Ai�O�Ff	"�z*�[7�#@�Fh�w�y���!����I� ��X��+m�A#�R{*���]�l��&Y��G��2�p��c��b���R������������
���mi�L�H(��<�o�P]��������HRGy�!�t�?��j�s���������5�}�h?�'��lY���M����p?�J1���*h���k��<������XZ� T��
a�z�[	�9y�$+[����\m�"3�6y#W{�;�xZ&�@��E|��44����~���]Xf�I> '����u��
tH|���N�����-9FL/���'�����Sv�����/
��dT�#�>�!��\OQV��h�4�*��I�A-�r�+��� �Wcg~J����0���[�'P���e�h����^
��;#��uTaB��eAi:&�P��Q���m���P	��o�P�@Y���	TbJ�N~jS
:<$GFa�+DJ4P�Mv��	�� 	+�Lh�/�I#����V=�.����E�f
$�Y�_�&	��K�ag�@Ihr�"{��H��[pUu!H�E�c)D:�m2`&��\8��?��9�$�!7�D��S�����|��L�Tls�[�I{r��v��)8�4���?*��~�I�^�f~��Q��	��L�se|��+c�?c�&�(a���I���}�<��wL�v�A�,;H���l�6�/��5���������o�*ve�-wyd��_�� p����JH�]c�w�������(���M�����t��3��xdb��KRH�� �
s���J
�m _�gu�q&��F���d���|y�-#�w�A/�A��L$�P��7!vK����������-�&5�8�=��[���fU�f��m���q@{��c�W��Nx��2�)2>����Ry��L,��cV%_��Z�Un#�R:��lg�@�}d����-Rt]w�T�X����M�#+r��1U���D�2l@Iv"�=�G*�����*�����Z����Y�hn����������\���`��x>����+
��������f)��ir��m��g�@JEY/�a�=c����Q��N���M�l��`l��Q���b�m���a��"��7 0$V�p�\��Iz����W��@'�q|���!�K�qHR�����h��<Jz�9�"�w���}�
��i�"��}�k�@+���%*����B�1��\A�
���w���I��*�j�f'A�"n��/$ybA��{M�6�>D��wz���T�in�H�����hr�
�������s�?��!u?�(��kF����3
�Ze�����
��p�=<vA2�9�5�J��Q}�������7�/�s}"���'Ud���;}���o��b��T���N��pk�����h��C�c4_h�t�Wg$�y�\�l�Mj����&WY	�%�A�����'������ 5�����c�����Q�����e��!�����$��)����(T	�O�b�2R��=S����'�~�K���c����@����a�c�_��MJqE�A�`�=��5�zC�/��D�sJ���DB^�������/@����i9{����.��h5�$��&�S�Id��M���@�6����������1�/�Z~C*=�P��q��2�"�����_��'YmI �ZU�=��S��e``]���g�5��[j��0��d�"c�'���#F�'�,H�{Z$�-������#��S�����EP�0d
�_������������"'��~�O(���-�2��#�1���^T[�������'�3z��8�Sb�U���z\jsH{wz�A�H�Avb'�������w���!�u?��
d-��1= �$&@�@��$[�cc��#�}dD{����� �	�O���a��S�5�t������_/�(���>#�w���(�t��W� cA9��C��%*��������$w0K^�.a�3F�/�/\e-�IO}�K����-'r~�������W^m����_@��D�E��E����,�v�S=�6
k��VJ}�H4^%~���+
����(�_�vO�Nd?s��-�@]��"�~M�W�frLH5,���� fR�$O����h6�3jA��q�5*n�8��8h��-�Xv9|�~����2�)%T-�D�~n�?����}���&�<�
��x�1s��%j�_N��3?D�|���:9��5}���Zc�z�*|���9���/��odn�D�/3�[�t2�z��-����?�[n5>������%:�
�##�sbA��eg�E�������@&��k
iOT����`��v�����y�	����{��3��`,��0V{*5�4X��{���;F���\y����9E Vx/?�E|����x�`�{�H�O(�jSW4��%C�P���
�-������x����<&
��cgt�K2*>&1}�vj��}�X�������������&�l}�r
E tU����z�*��O��
!��������4�(�Dj0�����phy�}���U�nE�gd��a�3?����h����x��i�"#i������_�?`\����� 3z�3(J�^�����p	=�����&��*��{ovw�7��x/���b���k_W�������s'�1`����M�iD<�3�:�c�I/��RH01Nz�c���l��d�@r������
v�������x�����
M�kp��Lw@�^���L�&��1�i�^v!W��~/����w*#E��!]'y!,�H^���.�O&��sjsD_���L�m��?�?|��@�f4�
|�������>��&����Mz�$��-|
���yo�	 [�����aQ�4B_�V$�m�-��dR��$3�D��?e�-z�������RR�=��t�����Qcap�{L��Ll@�����G�,���_[t�S%/�q~g���3�RW��c�MP�g�L��������W��D|�{��2.��4����H�&5��`rM���Ec�f����yL+��s.�����2`�>�L�F��vvW��V���k�@`�fe���	�_D���h\��,�<���	���{�r����P�Ywr���@�vH�%�^��P>�@��^h�[�-�N�Of������"�����K�"w�L`�p#�E�?`9������M1|o�9��'�����v���C� ���������j��G?��};�hk�����vjx�$��
�{d��Z��P��2p	~�<_�����?[���EL��^"�'DyR�/�Lv��|�|ks�����[Ry�5
�`c&�<
��� :�S�W)�o_�a4����$���?�;���T��X�����d�N��O1b/	�L�E}��P�l���%��R���>t(����Ek#�=��w�k��N�W"�$z�`O���r��[YS�I�B	7R��W��T�a)`rsJ���1�E�<����H��������{���Z)�B��&�B��{4o�a�Q���SjN?�����VzOcI��v�`���I�R���l�����$�nif��T�4�)��&!T����G&�a�e��V�_���Y�7��a&��}&���V$�GI&0���ayVp�|�vaDK�������{����$���y�������RK`�*7�{������\�og�D���N���|���J��<���P)�`� 9������.Ww��F�Et�?������G��sE�"6Q���\�[��U��J"U��#2�2��V|�Bh�b_�����=�}E��A�{D�G������2��)���@� ������z�<� �DAV����r&��'�G���t(��UV*E������;�{Mr������=�r�(�!DF����fx�n��~}��DX}�axef
���4��5i��!9A�#��������u6@�~�����n#��'��Dp_t����Fp'"������e�>��e�f�����+q��.���ED^P��F�N	B�e�<2%�N�>>�o����u��*�����S��W1���7�a�K���q���������GyH��,�;�KO4l�S'O���^f�AG���j2r� �C����<�{����L%��S"��e�F��1|��#z�+�f�h�����R���{���S����i�[t��r���!�e����$�����_���T���:�]�|r"�J5�_�������������CU��*�5�X������QSr��~+,9�m�Z��|M� 5v���JT��&ewM�}�d�7+L:�D4���IJ�M��|���e:Dk����b"YvR����M����TE�rD��M�g�N��\e�vR�W�����W����4k�pk]�e3k�S��K�^�&���F������J�Lnaz��v��vw�U
�_�d�.�Z���<����kZM��j�H�PM4{C�d��t!y^�}����9a4�G4�F$5Q�"�(��-�#��}9���:�j@�T���L<�S�����u#�����G��y20E�a�[X�C0��2�����&$�V��<+��w�	���g�Emra7����N������
��T��i>���yhe}��&�q<��'���VH��y��#qd5�/��tZ��#����F�$R$����|��0�?�P
��0�-����HI&�ZR�'iM���g2nQ�mXa|58~O��N�(��;>ok<��"��>��|���7Y�3NR�%d�^S�]^��4tD�b������aG���Cf���gg�oCg)��
�����1o�&�����}t������MHS�
�/�������bf0|8���X����@@�?~���7*�?� 
���P��f�������7���|��y��+�u���]�Q��<]"��f��W���A�����V���?���Q5-�����Sw��f�_4-�:�������A!����-���t��M�2��������#��'WdX]E�J��&����]� �����t�W�Q�+F�������jg�@��dF
������:��wE���S����T��`�':�����_$��{T�[R+�������w������e&4v���w���:��-�:�o?��s%�i3�?5�|���`����/��X����1Zi�����������h���"�U�h��'C�����T\�	���Rf�k6C����w��������ge��<t�eRW���Wx�;&R����W��w�p���{�����>"����J�����@\^"��}B�[�5
8�`}
���nR��������^G^�~k5������(9v��g��o�I�����W��8�Z`|9�Y��Vc|r�W���i��m�6�6�Y�-���#*�V3�-���+�2�%�|3�/��[^�m�_D�&���7���RDVm��R1��mP��E[���dp�-}
'��6$������N
�f�����/�k��g���e�r�Vl_EO���������+K���1�/!�|�O��Bn�����&�1�$�}4tZhR�7�*���<��A��i=�������o1���*����*
�O���?�bl�h��%hy��nO�t��4��)��p����$�V��|'-�t1�e7A�Z�)�N~�D�J�%G�8�}�	x�me�lK�}��M#��x���;���*U������Z��z��o��7��������1k�������j��h(����i��B�%^�$�����u��&�e.�h�	{h��q�G}vL����H����#��~�)Y�WP����v��m�,��x����[��_��Ya���B���^����,�!����A���P�e�+
��U�2>'�(qn�����I��&c�����v�B�T����$�V�$��fn@0�d�F�'��n;x�� �_�5F<�H�w���y�'�l��79 FM�����M3C -���������dL@V5KB^�M�'ws�	T����I�|E���s!SH�L��L ��WC*M�V���'��M�II������������S�%!����[�~J��)r�l��bfA���&��gH�ng��Wz���c�c��v��Gt���G�q��}�I�U����
���d��
Q��g�x���=D+��z������Z�!

���r�����Bv�nfaqk/�F��r
w�$%Lr����DV�9�E:��%�#����4XI��K�F���c�]��?�A9�����-�x�G#Ha�,�{�I�$=V@_��o�B�M��^�)���0�� �{��*zC�((ZX
��Jd=�M+H�6���m��vs��o�k�Q��\y>��}W0"={]
�����%�����C����)zB}�LL�m������P
bs��M)�!P���x�&�W#����_�<�	���!H������q��n�a���=D�a��	����%%��L�|A��i�m��V�*�I@���&�	��C�'��bE�I������9��HB��X�_$U��@��d$G�6Up��*��(hOn��� S�}���	�� ����:�S���+o�I���3�Es(������N��%�)�^�L���������������` ���+���MY��4eOP����J����i�N~	(h��H	)��}{O��������F���j�9.u��������j�=u�'���5e�1C�Z������5i|_��h�����1��l�[�,W��2����~���K2%���A�yO.4.!q������3 &�,��B��kI7�/lG=�A+-�AwYK�%L�H�{ �t2��n����,��eD'�7*����	�L;����?��^k�P�v��|C���9�\��K��ct�� �n���"�ROM4�+��">Awk�g��d;�%�)�7�b}X�R��+�6���2Cq$!�la6|U�������.
�Y�����������;��{���q��@�# �����@��j�q`��`��R=N�wuOJR���g�����v�h�q�o�����>����|L���5z��C�F������nr��do�9���
�h�F������\p�����yi+��l�5[r
��7`��hg�����c�L��5v�Wg����������w��yC
��4����������/Iy�0Hq�����@Q��P�6���t�a����/P"#e;
�%�d�4%���[�lu�����Bv�u�!�P��9
����O--�7nI��0�����]e������
��-�I��}�p��$��uz��f��0
�7�����'��ZM��!y����#s����i��6SH�S@��0����06S`�;�r�pl@-�<p��e��=B���o��|�Q��%R����j6��x�$��h&s`�1?�$��Z;/Z��i�J�:ZQ��P@����6���;�����!�7���b�:��}p�/���Z
��E���d0@�)8��M���SM��(a7r��{���[�m�j.)c����������&��!tA~;�H}�]c�G
knlq3r�/�����3�-�j\�������l�H����)Cf8s�v��b#�)a������%m�a�!Z�=D�\�i�%�dzL�>�6�����@3�I)<��@��q�t��������>�Q��K���V�oZ��:�J�cD�vK
h�F����H�:<$7�<�>[��$D����{���#���P�Cf��*�����)����u�83}ES2��Bhaa�\�ou���Y�C�O�=cP���H�����Qy���EG��3�x�
�M3`���4j�l�>VZ}X���t7���E����=�5����K�q!��F����l�`�q��Hkn��Vm-�q�70g�����#���8`u�U:d=��{T=���=�iM�:!����<���H1���A�����|��4J	��5!�{���P�%��|L���)�b)vkx�'��f}�L�	��������%��� �4�n���Z���|�.a&�|�O>X#.\�%�Ab,XS�����9�7h/*�����%c��>m\�(��0��n��MYT�wai��f*�UNf?���D���bZjn�4�����)!��r�.P�{���b�H}��~Ma�Y�4�@�1+t���d	�o��3�,���3�-X�&Q�S����x�d���{g4;mY���SPB���m�"�_%���p��o����|���YY\phJG�Qr��]w:�.���,\�����g���u�zr�����t���I�I-�YJ��*w6+W�e'�����)�z�3N�8E�M���x(���d����[�%��iA{�?X'L�h��]����hL�S��bg��:9{g���� ,����[�@�*�GvB��	=����%��1���V����N[���� ���jJ��+�*�0����`�wu��c��0���=��`:�X�V����1t��D����z���^G�����$j$�����/�(�;�����	�<�������	1H2�4��T�aL���<^�K��Oa$�K�pyO�	sZ���
��h/�����F_@��r�C��2m=t���#W��\�E�B<`B�`��
�;-����?�������H/Q%DS�g����jO�Q��*��8�A��N<C�����lCV7@�
�k_
�
�s���G����t(��:?F?����h��-:+oC�08�)�YOI}��G�>?��#!�L��S9�<�un�u�\'����*1����S���$^h�����������mF�f�����T�r,�#_���=G�����������V��.����@�������}�����u�����to�%n�e_�!}b�]O�����4�w}.��a ���������ta\���7��I��?0�?���}�{OkyG�����p�"�Rl��5�	0+0.k�|Y-P_V�������-I�o��O���A=��[���Q�{B��������I"�^�4��b���<�j_GX
�,G���&�i_aK/02�X���qR��r'��X��Z������-�/�dr5\=��F4,5^���^��M�h����,w��!�'d�m��<QX/5�1�M`�e�@2B3��}���=�N����t��,�=�$w��6�dl��B�����rk�p�h����%���x��)�v����H�����K��s�h��MZ5���$q>����W��.|�������7���-���S��u�t#[�-�i���x�,�Dm�0������R�����;����,������H����GJ�g���8QQ��}���a{�d��M?C����Y!�&���N=�R�4 �,by-5�w�i[j�G��K��B�;���(�4���Z�p�5��m��q~g!�@PO�����m�jd����G%����m���+i�.5�7)V����h��b�cx;O K]�%�^�������	���J�N������Ro�:|'��r�04qd5
���X�\Gk���R��L;�,6�"\����i���,���<�����	v�k��?�kQCL�����;�q�;����#�m���3�tVG�|���h��?[clo��������G�zdD,}"7���a�}�;�z����r��������<����w�$�1e��\��J��Z��G~d��~�@�����0.�� �����nd���+:��$�>���N"���[]��N��D����5�t�����Ss�(���a��O����?�L�Y��
�`�[���8���H�A�l����F*�g81D�N��x#���<����s�y5��Z���m����#�
v�ZE���)�pm������$_���S@"������gX��pd���
����������gv��uD��n��A'��[�~S��������B��>�>�to(�Vr�j�S�l����%����]������6w�]�7��m�p��a}W/vw�3�o�����mK����������!�Vw{�Wq����i���z��Jjr�����f�xc��7�^}�L�������
��e����xs���6��L\�$%����a���=�F���9�)������sU�v��	`�I���X��H������6-�$�����1:D;�����������8�V�8"�[�ydw�)WZ�����.�\W"�����hs�0����cx��O�����FR��:B���v|�����m�]�i{����"�(L,�I�d��
���#���3o�*�0�$������@k���m� *�g� ]|gK�
�BZ"6��*���d��-���
�����^��%�y#���S�*:��v�"��7M�Q����������x��J��������c&�9q��	&�27a9����:7p�����~|jI�����$�Ij��c����e�@n/�vU2P,:
,�$���l��h�^@���{0={gM�q�(�<��'LS���E<�3l�{5N;���d����'*:�)P��C�������
>��x���L$�{;t�:���j�������	�m}@�3��ju�����e�n�d�'�`����[��]��r�w:�E�6�I�r���MF;dx9r������2j~���[���B��5��''���������%������A�}F(�n�{������p��*����
;-�0��8�&�����)9��
@O����%������2H6�S|��,"���v����x����<2_-����#y;��'���NO��p3j�!+"���R	�� h�[��#q��z���)r��9B��$�@g�{�o	��T{I%_����=+\��%J������z����A2�� ���A��v�Q��t��j�c��h���>��W8-��GG��������84|����q�?i��_|O��W�w�����q��z����~�y������>���`,�L������X|Wx�:��d��C�H"��cs�{�,���2#�(i�����
W����eR��3�#Ow���%}���H�N;V�_��R�����E6�G���dr��u�Kx�����XK��tx��@�9�#���q���o%�c��{������'�w�P4���?y��H.zi�'OZ�������3s�����X���&O���������X�\����y�D�(����?�@�	��6��+��Ed���?��L�6>�t�o
}�������?l�����t�D��$�	��/G5f�	�(''�P-#�!A������!�Sht	���z�$o�5�����Q��� �c$`P��[
��c�H+�c����<[^���9���PZ��u6��EN"����_�bzEOzr�s��a ��2�N���Zt�����@��	D�.�Y{PX���U���h$I^�<��v%�����	~l������L�"�Y�! 8�����"�q�����fA$�0�F�9��%�
Y�G=�_�0�����~qdy]����-a)���������������k���o�p��5�����`�#����+�����U��/��F�/oE���g��}����Q��-;k��j�a���y�I�����#������G�.��nP��	" Ax)S�Cov��5�4HEh4��!�`���y����C��m��t$�h 0x�>�I��d�ccw���!/c����}V G��8_7��X�F�
�v�8���Z[����As��)���������^H�R�j��Tw����OPh���ww����8��GRQ���w���#9{���g�_�����X��J��Q!#�P��4�@�	�� �-�W��
������p*�F���������E,x{�`'@��5�lA��~�cO�HL��Z�P���4MB$qgf�:��%8(��>�Dc���{�3��g/���9�����w�P���Y��s�������A�A^��n����5�Z9p���T>l���M������P�5v�uG���Vp����e�]iX+��0���r���}��"����"s{�p:���&)Zok������
I��8�'w�'<�Y\���\F�p���=
O�['����������Vnt���95�C��%
��eq��^��Oy���l�%�����'����'�h�2�tS�����M(#�Ctg��>*��
�k�����T���A��h�^�6I��O�H�X�6�8!~u�A��.$��rj���d��Q��Bpe��Z�'����p�
	�)
���EAmw��/~"6�������kd����)%;B
��/h�����Q�o����V��\�%���B��K�s$Z9�_�Y%(�>I��]�&�������}�!�A&\�;��j�5�%~��v���� jn������f\4�|�*k���j/k��	��O0r��c�2a[6�����in-[���� v����3�>!�7�������V ��������3���W.C���m���A��L:M`N����9�"T<K���/�f��;\[j�����*[����#tK������9�T��]bq|/�9c��0r}ij��P{/��1�(��{$������z����R�i��yI}r����V	���2����d�Q��,XJ��5��Jz,�[0�(��Wh��.�A�c���@�w�����E�v�vb�/�����&����5�(��Eg�"L��NP��
pO���[�L/w����#S�q�����%�|b'��c��Te��;P���*,����q'�H�t�y�(�h�+�?��%�$: �.�i��D�v��x�c�������Xy�`�F��@��`�}9����'��e���?	���uI�������5���q���t���Dqh+�6�k�3z�BQM_�m�4���"zSB9*{����pdY�u����A��@�O{�T��MU�"z���4{�B>z}�q�-��1��1�P�{t�)B���N���Ff[��:b���2������P����2���������[���]�i���kx/T�����e���#��z,�7D��b�c>�_3��O��t�#(.�K'8��L�| 3���2j	.#S�:�S�d�:���b�cXM�]�3JH1�����i*������l���T��9��Z��Hv��d,/���~3���:���#���h5����b��dG����1G��M�����������B'����D�D��iQcG�v�es�����Hf�l�3����_�k|�G���$�+�8��f����V�8���MP}g����2�6k���R%'��Lbc�Dq�����d��t�{c���;�! ���[�E��h���-F�j��M�&a���wr#.�:a�4Hc��c��EP��P�rL�����C���N���`����U��������7"�X�j��1k�	�@�j����E��.��Q��w\�
k�63�}P!�'�a��Ddu��S�$�]T�A����p�v<�������)��l���UX�]� a��E�K���Z�@��Z��H��{�E��D���m���������P��E�"Y~�����
��w�P����*[���I%R*U!%�C����R���+�Q_e-���g:��,�JO�y�c��[	���r0��5"<���If�Op0DTCwy�Tm��'��gj���`��a�Y�GE�L��'[��O���J�A�f#�0T��S���Kl��C�*[����`��-�A��MR-��z����������~����0N�o8�i����	n-wv��sXA�OAbTA�x�X�*�j<*0yy;#��.�i�|�L���B&PC�R��l���l�F1�b��P�I�
���E�J�N�#RPT�@K��J�j�-�;������������P��J�D��E'�jAz�u�Kh�QO��C
�l�A�5pm(�kD��
��/���n)I�
��V�f�?�u�6�H}�p���XL|F �F��3[/B�c�)���|��	�$%�^H��
�73�;\�`�
[P���!;m9m�A]�Z�J��7q�-�3��:P�����*d�p,RlFv�s
��8���U���i��UD��&;�n�i��$�4�.���c�^�X:��j�>��A�%0����Z�+���������hzq2��k������M����:�Q����:G"�u��d���[jXV�/�{��/Q�D��X|��}u�������$JKW�Md��������_SPS��d����=������gbQ>��Xm�����L��j6�/�I�P��Z�o��T����BZ���U���
:��[�p��,8�����x�k��b�pMd��q"�KI�������7��'�7��
&�h���R-�}vNnA�p��w�8������w�-�v��#���q*�4�����]��n��O�i����&8bG�|��TD�i �0�7������+d�����#�kh�w0l�r����k9�2���@���(d��B����������S5���9��F�YqW?������=�he|�	����@j���	��Y��	���p������a���/q�H�A`�E?�(DD9jo�D6H�x�1�9N����h�"��3�{�\�Z�[�"�;\Y�9���'��w��]d����h��9S�4A�A���Z#��5C��w�Q��Y����G�|�{
#��	�W�
d5E�	%����zT�6�@����j����5c(P�G�3�4���s��U����a������FiM���#`�	e����W��+F���fS����_���0���,�q����&��P��i/���j��ev���U
���b�f���ya
�p�Z�EGD���TG�Gp����{�Y���z)��b}Q�+L!	Q�����'6S�[3j��J�����J�F#����S��<b7�L���zG]��I��	M�/�/� #M�W�0=|d�� D�r�n��V&2ivt"����Z��%�'6;:����xAm�9�6����NN��s�����b���6���Q����)�t5At��{�}6=���{��5�Fc���\Y�f��wt��S��rD�-k�j�uG
���J)���+�ags�8���[�akB����������\�>D�~��0<����G�C6�.�/z��
Z7��+H��	@� �7�2[4�LQ���F��U<���w�_��U�5�!h�i)�Y���?�b�N�7@`\��c��rHF.k>d5�M���'���P����[�-�0Vv�s(��H2���4\�pN�It]�tdP�USt�2�������He�]0�����z�#?#/������1��m���K�y(-j�uA
����nmC�vP���z�>��V���}��#�����{1da��t���'S�������9[4Z/��'hm��p��j��wAww��@�R����C]���N��!�������/��.�����T�Me�e��n`!�f����/��r��@�g������'-�#�6�?��u���q�8;�����y�
��p�.|s�����f����f��h��!��{�sj��'Q�o�'�w����:�$�5������}��'5�u�"����O�87����?�|�	�z��b�M���8���7ZH�H+�W6;{�+Z�Kd��l����6�
0UOt|��6r��M�`J��YiZ���&x]Wv{�ba��;�Y#t��XA���t�{
��pj$����.Ha�#�q�V	�	"���������utD����;��+DsWh�={��$p����������������'5T��Q�Ek7�@/'{Q��� �����L?�aH��������`���M�iS�a[�@d��.4���O'��a~��u8�E$dbE����F�g��75��J��D��n�B���2���^�}4H�|AZ�.�u�z	F�@���-!�G"
D~iO���m�����	|yhO_��=�D(���5�l�Y�l��#N��)�[�j![�������?�K����6Q��9fD��B���W�F?����+�,w+���K���)Qk��I)ku�6	�=^�Y� h!��wa	�h����������������d�K](���Y99�D��*��R������E�]�2n��\Pw����h���va
@�%����"�U~��E-��c7K*���!	���,��}D[��Es�v�|���xl�
�>UG�$����E
���R�+���B2���CR���[���>P���Q�xtg����2=��v�5�������P�����q�vv<Fn��^�'����+eCp@���Q������>%�f�\���;�:b���DL�'��T]xEc�@[�����p�Bi���lrV���ud;�6�-�^�b^:S=��[��=w��d2���=��+�_W��8h�]�����lI-x�j�#�,�������LY����>]�w�L"�6$�Gq����{�*<����sx�����*���Vs#"V���u����A�-��}�sr% �/�����$�h����d���%R
���H�0��Ro?�#���2$����j�w�������*N��t?�h*:\![D�(sW���Cg���#9��y��N`-��/z��uT����
���g��J!YK�
5�`����)=�L�0�-� "!!�a��8
E��a-B6F��������IV7	7h�}�\	�1Eq&�U-�
�CnN��v2���S��1����n���Z0���.�p���nFOM�@��]�Ka%�'�����!��B�8����W�{?&5��A	������P�D��C��&>��R���c�����Q�eVcc�d���!��d}�����g����I8��~�c����2[�[����l?���C�)Ek�H����!�i�R���@���{���P�Er��������2!��h��E�G9���B�����&M��6}"M���W��piA0p�ad��	��
[�w]������%��hor��f%%>)ZH�JD��!T�D.Z�a�����g'�)|�~8�!�+C>r���^]C{��;0�&rF!�����P��'�ZLgI��D#E����S`��>�it�,�&�Qm?��tK����M2���
����G�{wbT���i��s�Vc���d��&�u�!��Y��I�IFZ����932�N�����Q ������t�����^���X=��g1�?��@�xEE�4xAq������=��$f��<)�2|��S��������(qj!S��h"	�����9��/����1�m@�xW2��l6Z�@)f�aB���9p���,S����)dC�~�8�9�!��%#Q!��_���s����
������&T���L>�j(Y�� ��Y�X%:hM�F�d���1~�>!0yI����,��:V�Z�E{FG�s��u?@q����::U��@���Dj�)�^z��r����l�{�PF3�)��^����J��b�wG�p-��xC3[)c;����~�!��Be
�W����w�QB��A�(���Zt�5`��y�u�+[�h���,6f�=��v	��V%��#^K��$�[�4������f��e������FG�)�c��od��������VGD<�)|C����~)���t��3-��B����4���Y�9�OS�wy�)v��M�����������QQi��-�7��Agt�iw��q�o5Y#��|��3�����
Q!2M ~a����q8��}op������}�vxA,��8��q���-gnJ�Z)r1W���5�-MXOG"�m�.zt���)p�eF��O���}��E�����2��K'+�hp� LDQ��	#���\���b�r
� 0]�����B7�����5^�9��5�}�3l�n*S����ns��}�/���<-x7��t���hSH�}R#bM�t������:�fu�����(��a+��O[0ee����e�}3�c9�E���
Y�x�s&U5�-�"�
�!�'���]��%�k4����9aPQW��!B�����1&��rH���A^D�$w��p7	�:ei���������:}_lV�����h��M&���]�7�RjYCA;.����aT�By��/����5pA^c�J_�������h�W���p=��X_����._�t:��FjVT,�-E;�,q�����%,��N���QF�e�%Ewws�[tJ]%0��{���Ph�c���f�SD���K�5(�/5������fv�l�Z:�?����G��U_���m���3vt8Z�("4oUb�\���������)3��r��|E�a(rw��z_�_�[Mm��Q@.%������g��1EkT�/�2��Er"��j�G�����������1F���l��J5��d��p&<4�g��0A�%�� ��������+�S������vc����Bvcjo<t�����KC��/�'�k��SF�[B`���Fz�% ��R8c��X�p�M8����L���H���xsK�K���1ZJQQy�2[X(��T~����R�����eI�5v1\

<��]��W���[��<��/�db@� 5�8���OKx����p���d_�@�!�(CV�V@�vK��\B�~��]v��^of���q�2�p�(��r��V�)��w�[C>/����D��%�MV�l�u���������u���;���i�R02��Z��^�g���g(!r�_�2?�%��6���E��-��(��wu�;�>��7�H�����~L,��(q��p��������!�h������l{�=��t��>���4�e��K[i�y��`w"v��6��}�9D��lP?�h������c$�q�MF�^���E�����L���1������
�X���H�Y/�Mx8�P��t ����t�4�b	S���;��Y�	%�����uq}��5a�'�����"� ���o��2R��m�������s����Mm[��.S�l8������-���g���c����"lx?���_�|�[�B��	�x�����G�h�_��h?��F�w�q����9����I)��l����+�p��}�����Q4��I\i��c ke����h(��E`��qO���8�6����R���]Hx'�!����y��PW�6�2f����C�,����"*���z��nY\�`����YDiom�q]��t�s��f}�G���������p�n�L�U1���o����w�$F������d�+z��#J������u=%B�f�b4�;'�9E3��O(�iy���5���]e��j��^�&�+�����sH�=��{�ZNTH�)����[(�/���>)���?���]������<���_Z����-��"v
�e�4�F1���Yy��Qav���Zyx�p-��c��!�\�+�F��� ����&����2�����c��n�;���O�?��}8F����]	h��k������s������:��#����x�{x�Yo)��d��,h��
-j�K�2dp�6�	������!�f�+�)��V����7xt�s^2WV�,+�oAB\_���v\��GT��8hy
�yb����W�C���^&�GO����PCS`3'�m��[���^,���W�}��F�s�%�������C�/e�-X4����pP"�-LY��i���P������"z����OD��zxw��J[����BKD���`�,Kj������Q�!���}��S�.�%���O���,��
�9�;K!�Nw�s@��[` ���'�Hv��N7�	�����%��y����I�R�1=${�vX�f��s)��;`P!2�:n1���N�~;��k�0�(�MQ�
x�3!��F����k�8���]����!C6���+��V���i^t��� �T:2��e�1?���{�~R_���u;�����R�G��S|�����dG�C��}�51I5r)0/1��D�CC6O�2(�<{�v��=V3������st	9d���#���1$�@�+�,�����69<d�}G����z��flGB�XA�?�=2���������j�8J�g�+��w���m���	�� �#k	�"��X�q��#��{B.C�GQ9q���pt��� �� &������� q������=�k������(Gx�f�(���MN��������%��i~~	_�)�� Lm�z%�p.g8����7��H�e���Gp�T|x0.������"�=�{��s��O
�hI��XIAK����:��3*�1��m�����*�Mw�J�,Tm)��?G�1��E���i(����~JY��	���T���f�����nN��q�����x���}��<��hzD2=��g!0g�8���s�tV#`X�h�e@`K~�3��s�9�7g��~�'��_��s�m�q8�!��o����
'���M��~V�Z:��R��b5��LD����l���RQo/�lX��;��4��}"��,��#n�X� ��-����:������J��#x�L�h���[�}8$`��`V���_���q������G���(s�Y����Fq��S��4��L1� �D+�M��~��3�M�9��JN��G���h��Y�����|�����>k�����V�G��[�e�Dh��{���������8���[�D���[8{�,+�H��h��>f��$�OC������[�X��n9~e���x�%����LA8m��lu�ep�*,JK]������wLs�d��yU�����$�i�=��������E5(x���:d$
�� [�v�?���o<�n��c�������= ��{�o�p�o���7�����[\���
�/��~���$q��)��� DO���p���X#����@��B� 7Ap���U;-#��aY����b�C
AG����=$�S���^�wx'4^kg$M��5�!��|���qG���5t���R�T3[w�S7�����^C���&m�����/���4�a'�2���4	��7�9�|	���G�{��d��5�K	�����z������%��9�3���>8��,'R��B�
�iD4;_@\�xQ����w�d����n�]v����-D�LE��:�7�z�=@P�$���:;d��M�
���fKm��:9>����U}�V�����[XSCH�7R���)H����:�k4�3�Q��F&XL��`��B��w!�P��w�C���2��bd~�Gg���^#���;p&D��0�r������V�h�-�?R^���w���.$
�Dg+�!�
c�M{�[���P���=�'FV�[Hd��&�))TB��~�En���+�K�QZU�d�{��h�7�Gx'������>�a��MB�B��cZNd�~
�u������{����bj�O{���h�k�j$T�To%+��r��};�tH	JLp����lvz�
w�cY��������g���/������
�������i�L4��wDG��f;�=�M�K���P{
�S�1.4�~mG�0���Z�f|p���%�[8��U�y��+��b�9C(��v��i�T�
�����c������ �+X/Y]2�~]���,���Q����9��	������~�;�"�vb{I]�D���q�����������hp!�h_�DC]���q�^�'�F�C"��.��.��]~�v��3mD'T�Y�u���vEH�*w����.a��q�������5�������
�%&�<���1�~��$	��@�q��r�;�1�����d�h��7��8z�FEmq��C��/����a�n3;�������>oD
�v�)j���m�-�H�R�����1P������;���;�yT+Z6R��wAk%��+E�A���
��CO
�"�`Au�~��J43�y`����W��6^�����:�������
��E{v����e?�XB6Hsl�,�����5B2���Q�R:=�R���#�v)����j��'A��%%+�_�"�e-v��
�q���t��'b���#�B0V�\J�����6891��!�j���S��$QI��R�D`����e��S� �J$F�	�7��m]8��-<�&;&��
�<��.azr7)^���p���i�J����I��p��,^���IP��"F.s:[����x�����������R�@��i��Mz��]��(���M>��|q�CBZ�
���<����V)�vb)�����������������j�b���]	��H��E��	�d��<�:Lx���!���I/�ev��o����]�92*cE�G�TMT��8�!���:$N`��n)[����uF��m�� ��T���hL���
������S���Q/�9�����c���!
�%$sD��"\����uJ�-��Z0�sM;-q���ce�l�h�|-��q��)oHy/EH�������m�ns�}�mH��tF�~��Y��&��R�S`��m7��(��w!h��{K���E����,���F��V�B��l��
\!��v�H�^�g��W���u"�`=������V3���"�`g-�c/���*����e��.�
��L[h��q�B
%f�z�`�(��T����E!��*��������}dC*=�=F��
6@j8��o�:�w�>�_v,��Xj�BR����M Q�e��TC
43�m�>�k��o�'p�C����\6����a����G�TXPo���z�Z�����M�R��.q8�W#c�c��h�
N@��n,k�U�-���>3�H3�O~2Zh[	)�F��E������e�TuL���O�����a�"����]�*��G=�Z�*}�U�P���Z��NPC�`�Z��HP�c$]2���'�^.��E	H1n���m�V!��0o�F�Rd�R�A|�p�:��*������&�s4V5g|���W�L�x�fM}�	x&�F$�����2�x{u�H�6����3A��Af$��<���W���:"�jw$B���PX�G-���E�j�H}�!��VLV��?���Z��3�x��(��T�08���l#�@!{��J��vI���=�a8<�S*pX"�u�K�q����Fcj��-���3f�1���%��������04>v�i
![t!����K5�.;92������@���l_�#6R���5������!���vF���G#eQ����!T~D��j?�������sO&����[U�|� �����4��Q,��B�:�V�AcXC�f��_�z��� ��-�'t*���N��LA���0|��R�-�����846��4�`��P�]������
&��l���Gr����\��j�F��*h��L?U
(L��lGv���Tl�r;YoM���v���^��tg�mA	�L��Y)f\"�v���R-<���*���%�^��������k
o��^������+�ia��U��~c����
�u�?��!bv��a�����ftMXAuFj4�2Q:��@S9���^�@�Z�{��}Y��}�c��F�G�v���HY9OF}�������:ka�O:�������>��D�3�J�	�t����bE�u���		F�[�C�����p�	H!#�~���\T�	�!�Rc�&4�4s�jF�kP%����q'���l��X����������e��R(�UCMW�,*��P��~�$�Y������9���*8����������C�fI�]Ky�M=��#ICs���G�EZ��o���[�E�f-AD�i� Ts��Q%���������5)���w3����n[���y��p�1��������
��u������`����?�
��/�	������x���n�SVeYE��W2��������� j(7�n�@,W�n9">�`4a#�75�a�D������C4�Xy��Z�:�36zQ�����:�<���z,�a�8�I�fi�}-�(�P���X'T��9�vp��:�S����e�����o������fc4���w���"�91���:�;�#I�6��v3�|!��q
�k�-�S`�`��V��(�
F������+�eJ�'��G�����f����-����]H������O��l3�[�)4�5[h�2�o���6�y��?po���@�"1c[/;($�wDyhj�SyP�9R�mS�)�!z�&���lr����xrP�d������}j/PS�����_���  T0x��m�?�O�R,���]M��$_;M�(M��bO����4P�� (��"
tZ����t=�>�k���au��c��m/ %@�G��c1_wNNF�j��"�Q�a	c���4+�-�*@?>t���@�����#m�i	e ��Y�/�;3�$@{�IG�U	��.Xa�_���@����W�_a����������'��wG&�71&;Z������=��X�d�nh"*{�`E�<�
�G����d�w�(dZ���$
y��x��'�f��_������JNd=��==zB#�
�V1���+�f[������M����G�u/�VeY���t��LW��oS�,%`,'�����������������W�+T,������cy�^��``�����p�=V����)��~N���X�R�U�Z3p(������nb���5��@[5�d�Z��?0t9�Gpm���6Ke���4���A7] Z�M����6D��zc.�y�3�D����C���7�����,�����c ���2�
��.�s�������yF�����5h�@�E��9�taG)h�t;�%�-����s�+��JV?:�![�����1Z�e��=�<��P�������b���c� ����l��=B���:\ta"[��$,�^��!
���[���t2h�L�g���#�C>�m\|��a�5"Lw�%��h���*��uEp	�`�.ft��IbV��|���>K}��!����H]�;���5�0"v3ag����A�J���wI�F����C�fR��G��}���>��74<AVi�q�G�c�s��0C�����p��k4��_����U��g?��_������,B��e�H�m(r<&�:"�t�"������
8��]H	��~
����]C�\�������1�6_�e<���Bz�m�X3�d����td:���A1�{�3�����}Y���������<����N�4��R-�E���&��oq�f�����Jg�D(pw�4�}Z+\#�k���-��y]	��-'I��k��R���l�v�+�R��L���g����0#��v������M�?���c��b�V�~j�u����;������l"�z����9{�aB7Hr?I8�S}����`�-��"H��d5���&a5Z;��^�J3E�u�V6�N
��"l5�4��u7��`�7������l2��cG-�C��=�EB@�v���$���b����y+
M�h��=OJ��J�H3�;c�U����T����&/�aJ0R%)�����{'���-�s5�1
a"�7}Lh��9�����5b��6q��H�Aw�Z���v�.160	���R�)V
���t�	�����>��x������@(q�k���d����l0}j�O�=x������2yd����"5*NF���O��x�����h�;�SA�24������~�ms�<N�D����uP�+��g�[�d|�!(���#��P���{{d��H���E�i|���tP	���0z!����=3��3"V���S,��AN������PB.DT!��1������F�'����6��;Q	9���B2#)�xD�5����4a{�v'��H�0f 3�%��mVF�
=����F�[��T��������Kh#���/+]
O`Hc�^g��5lL�D<�!�"��l����G<�!\bfU� �,�m�`i�"��N���N�[�>�Y�*
�Kx�F��!�^J�J!0�vT3;ot�^�h\^>�������>�D��qO�����l�4��Cd�4�
A������1Q��'���R%���$ e
�F�:��z$t�W|�sfD��6�C�T�\��0����?���H�!���@�"k8K�y}����(���tls86�S-�QXG��a�!���C��HE�H7vo-����%Jt��`<�1���A��"-p>�$��@K��4L��5
2�B`Q��K�����a�~������1,������N�h��W$�]i`������`fj;�A=HMQ�k>V��w��5����D"fR'�hu��?6�I���)�z	���]{r����I/����e�����o�C4�[��.�U�R��!����p�OD�VUD|���(�-�zD8��u������H�n��kY2��w�n�__���8�`-���It�Mw7�-t
,�h������Ya
g������pS��������}�C�>^�	�\�����������@.�f>����nT]O�>�>���Pn%m[O�k�+R����ziS�z�Ln;�����}@������0���P���z�d��
����8��lyw��]18G�k���
6��ia�%��m^���A���b�9�O��_��J6{�#�����O�s�<�iWg�D�9����X��Z�4�nW#y
0���q��/��
N�6_�`Z�}����FR�^�D��)�W0'�%�Lr��+��V�ZO�(NL�?�a���R%F��W��;r@����Bb���sj4��Q,XM�C�y��)n�"$�T��	H5Z��	 *��O�Jl��e��)�a#�F�a�S@=���W4��8��OjF��9�ZsH�������.�4xW�7��:0WX_4Y�?�l��X��ncK1Z�����]��T;{��=��Q��\������/�F�	u����f{�A��l�-�jpTx���\d��\n��P����_��M��L�\�q��Uv��=�v�[V=}�������������}�_�0��0�%��ou���\��{�����������b��s��dd�0��^��Wh�Y�f?(�!��p����{����R���q�V��`R�}���E��t5���Xl������?�s��	:�[�����'�$���JIH�H�
���
����_�����FQ�w���d�*��.�XirA�/��S�E"z��j���.�7���#��z^�?$�
��b���VRh����a�K����D���\��fE4�:�K t<L^0N.yw	�X��m	���V���6�6���,a��zc�^:�o�	�?6���YK��]3�:��C�_]�(����d�����!|��������)J����
�_�{/52ZV6D��r@�5�@h��M�O^�uz�_,��@�3�/]�e�=E�~�~�46yO�6d4\g�������%�b���3��"]������[S������0825�n���)4��[ktZ,na
��D�%�����,'x#'w9���=�!0�e^�2����2�k����&���/*�����uuQ���-�,!���1}��d7#��.1�<�n�Mt�N����Pf�[c_�"^������Y��pAy�r��rZuD@\�+��6�q�@
��Y�q	���&ym�A��)j=/gU4}&��g�0Q���2q�C�g�S(_�b��������`���j��f�q)�iI�,o���A���&�(N���0��
-d��l�����9��F��_����'d3r��YM+�!�]��e��k���	]��}����,�C�i����O�S'@55�P�eUC4D��l�3�51� �.�l�*��C�4��P��,���IEs��,�����e9A�v��!����.��&s]o�t6H���xy��t��f-�H�Jf��m����o�@�f��m��������]Gk����zqkvS���)+������i�g9�&"B�:.��I�t��XP(e����*\�O���KM���3e�R�_�mp�HL�.��>�
��E�����T���{EK>��`��A��d>m�������}}�xQ��w��:�Rj�~;�#z4p|s�,���	��5��3���l����g������-G�=��cT�l��o^"����-d������!j$�b��'��Zd-��A}z�������b����:�H5QD��,��cLJX�z����b��- k��j��/���m�[���^n�����V��������=�V'�D���~F
�n��.�������k|4�z�[/�g���Nc���fD����Am���2���{a�K�����{��4������k���4��B���iv���f8N�@Nx�_~S������������[M����2^�vCd��mSu��E��L=�P����/wy�l[�;�t�Q<+MX��PQ�A9>l�������HXQ�p��_���v�>��E�i����1K+c����p/��	���g���v�v���=�.���5�����o����$�%�����D����elu�!~��|E��6��)md]�lP������
���z�?]G]��R����k6C�����VS�fK�����j[��������8�i���HM���m���������F��3_�"H�����%FV�;G���@|lT��Y�`�F�U�a�{���Z���`��/C�	��������e��]���cTI�Dg�������Q+p!��-)���a������3��P�s�����������r�����1� T��i�6�p���`����{:��s���^��!���X&����9[B5�����
������?g�Y*��k��!�tn��	�*�F�d��c=|�2�bt�C�t�
���*�:���]Y��RAnq���l�d���9o�"�B;`S{n�e��8�U:�d�<B�N���s��9��D����bS���x�
@��k�v;X�j�%(���4��XpK�*����h��t������@ �{�����$H.l'�?:�
������	��V������y��"�Y@��Ns�����-qln�1h��l:":2�>����>��w4�v��S^����@�o�=c	4����bu�������qH�Wt�=�k�k�}�S��>�.g���l��y�C�����������&Hh��W�����v���|�MTT��uC���#|":�K����d��u�wtK������h_LQ����53��g�Xh������@�<@�U�$�:C5�vf��:�M@D�g3������[��e���p�V���9�f�����
�����@�}?�l�Ynnd#��YU�0��
�0��+@2n�yq��w��&����d_��|���I��N�Y����0�qE��c�B��|%me���l�T��EF(&Y�T����?Y�.���wW���7�����J�x���E��=�*�I#����IK��v0��s�-�`���GXE�eY�Q��6�V�DQ��{1.���8�9[��S,�\,��f�g��{kZ�������LuD�]�M�'u$;�!��@`�vv�06����m8Q����;�7��83f�	���
��~�Y&%e��������W���(z���^�]����Q0��������f\�`9>�Q���_	9��s�#���d����/l2o�
�*,>�S�v��r!������2b��Usl���"���[��(��P�%e[��?{��2d�NX�/$�*>)��������yXV�����[g�?v�F��L�
���e��b7���8�9Cb�p	2�p���� 
�������]�2�hO9FW�����a1#��5+tP�D��;h��z3�#=��)�(�	$�D����m�u�#u��.���CE�)HZS�+�����o�M�8�������%zB�
����n��!]�����<��k _���^��e������	�t���H���HUy�?��G�}������%�o����%��5g�&Z�M0f[;�
��>�m��I����������6�x��L����9NO�<��F�_�(�����Rv@J��� ���[���
�.|_&a�����25'pST���9� w��}#O���l	r��{��8���.1�eF�5Q%�H)��.���[����
��3H�g��G��C&Pw)�>�����P��.8Q%���H�
.�7z6#�K�3t�3q�	T����e�e���
40r�l
�~"���X��]�d��������R�3~�
�U{��(���w
�R��o�V��C��[~����:Y}&@�}a{t����%�*8C���H���l��Y�$���5v�G������x�����v|3y �Pr�7o	E��o����G/H�="�G���Cl?�YGID59����>�����dg�7�o��(���C�P�w��A��a3�w
;0�O~#%������}��;�+ T)[���t~���{)I��7R[i����i�����������Q����$��$D}��s�/
%�-MH2�H�%A�d�)N��l=~�X_�1����%~��{	���g���tO�cy��w�_+���__f�f��h�]�3l����e�������)�2��wM@�-���[{g���������)�#��w	����M���)�^tM;{�Y��83&�R}�{�_Y�e����
��AC�S���]�ED%��z��.�����5�,��HI��>=�U0��m�<��%��B�&m�[��3C!2����]	}�w
�����~]A��\���<��`��B�#������~�����M�������%Y��0��[�qc;���]�}�h�q�$���<Q���:�E*<�h�(|S�����4��yW�)p.�s�c/�n�?����(�w5b�r����E�	�����b�
A�\(�zZ/i��Ip��5�e��Q�b��k��i��E#�W9-��O:Y�C�o�X�O-�EjT0A d�3q�,����k(W	7�	�=�e�.�=f'����N��G�%CM,|j��#*�����7l�{��zM�HH6��g�]�i����jI�b1�
-L��"��b'���0�|�"��C	"p�1�{1��p~��|-WB=v���EXG�z����I7�8��Ef#(���e�ZIJkE�Mu�/]K�m��t�ujy������M�7�A�Hm�QG�����E����9B��p�]��$%<��r/�!�[`���8��)iKU����5�pO�1
����$��Z���V�nA�=l=�F��Z�|T}d�
a����/�b@	���}�+[}�@d��C!�Ex
�~�o��jIV?�%�4hm��F�&c����~{�>��!S(��� �&�=]'j�Z�DS�k��Stf���m�f�h`B�#����q$�g���q� �"��@:
��B7�����?@�ID�=[l5���?��

2�b-�>h�c��q��Ex�|I�K��G�yCp/q���w![a��I���Uw����Qi-��$�{�@�l�D��"��g���1�
:�
\���Z�sX�yP/I�_4���Q�]�@1���+�>X
fV���E�R;|J�~)��*~|4��UM'

K6���}��@��';',S�n�z�*�QO��?�3
A'��E��k�����[
����`�Qm�(z�l������S!+J����dElG�)�n�m������~��m5�x����[�2�J��Wv���F4�"�D����2��v��w���|���P�������Q@��CY�u��������?�����,I����D�}�M���]h}�P�������.*j����w�����a����V�zr�5�J�Z����0��V�&�<����::���,kW���:���%#gm��j<�g�����"K��K_�T=qHi_�
��J�O�`^�p�qg)�Q�Z��T���B.����;�]�\��A�������D�*�]�v�3�y�Q��g�VW<�D�m#�5�r�z�
�F)�\�S�S�GeTTA���Jf�����I���>��*�]a�:�
�� �*�o;��k�!Q��
�(���6�;���T��
�*�9�gT���kYa�L�.�Dc��n"G��dP�[e���>�d$T��E+�N���nF4�{�y(y^t
�1�.@}q
���Y�!7��:��12Z�������yF
����Q%8�S�=�m�[=�n�%F#�\3�Z���L',��Ua`S�l�5��m~�����.H~\�Y����@O��<|w�&'V��Z���7u��}��pq\`��0���5���~�_�_t��F+��}<�u����_��K�3���6TxA��]d�GHE�W�Hlv���_@�Z�U�C��/uXfF���gf\U�Q��e���3��~�?D��'m�6#U�E�/M�Y~#���3�O��q�e�q��^y[�v�8����e����n?�f�$��C��_q)���hAqL5]���.PheP�[	��Y���
U�3s�qkz0����V�';�XX1�����V`���u�'-(���p�V`<����m�+���mh���S��3�5!�N�+9o� rgm:c�&����ZGq��1�Ym*�0�JW!���BjJ4��S����/!����B"�}��o��?"
���!S��ad_� ����[;�i&r%
�����������(I�`�B ��X6AP���05�xrU��Z	����T���_�M2�_5�F���@�>��s�G����@�k�@[��RTG�&�AX���|��Z<r�!�m�	��w��Q�	r���	������-�h��h�c73�H{���e������"�M/"�.�5?@�E��PC�h5P������Et	�mG�V�A���7bY��h��Fo�*�����;0��I�MpC���|[���	}R5�����5�X�l���)&
X;Ds��-���V.j
7�L��m�?)U�{rwt
kv����'�]B��g���������;&C5�Y�JV�=�F�G��\�iOp�h�mF"���_%�{�$�[����55!QZUmB#�����������C���<�����T*z������%���' ��/=}K:Wp6�U+�����e���	�v��U�;�����5m��"�N��vXn�[��(;������ITQ*{mQ�?^!Dt�n}~����`e�J�/LK\�Ih���9+':�5�~#� �_��@#�UqOR�g7.Ei���1��%�B�k�T�u�A8���]bU3&�9�0�(Mp��8�HD;o�`����djj����T���DA��k�ga��F��C�����g����#��z��l� �0[~_��o=C�M@��i��?@?s�jB"8X�l��p�M�����U3=j��W� �k4RPjV.sB�G�d��C��M�"�����/�>L��1X�����	� %�
�	a=,Pb Z�)T��l��,c����<K��D����{4��<Hv��P���t����	t(Y�Dx�4Y.�����[;^��MK�K\���:j~���b)o@��oB�[�����(���Q5#
,"��Z��'
�Vn ��hB2B|���t{>l��dw�^o�>U��P�>9���
/��h���.{��VRNx��&�T�P��d���%:9�����9�J����"�m�uS$��>�V$�H�U4>�MB�I&W������QG�D`}�Z�]�{Y�A��r�g��*�)���\�lmMG�C�����?�/c������M�HwR�n6\��[L}�����g�to�>������I�E��?N	aN0�3q�p�awlv��tA��X��cpn�a��w�u�#�i��eoF������WC`�M-��z���DW��!�Sq��GM��l���J�h�8de?T�����y���6|�!��,(�msD�d�O~2��*{��:���tX@��.�MK��f��?H��[�:k�u��z��5\��������@����V�@����[W��=�l"w3c�wkZ}S�"�.`E��{JI ��I�������eo'+��p����h��=�-�(�GV��nI\���a��p6����d�%��������K�U0��0*��B�"�]7X�}��U�R����S�\._�(gK����qK}�<\$���������.�R`U�T�nevJ]6��K~�$�'�b���}��b��~~k����ln�_���.�AN�+����W@�@�D��	sT����n�-:�d�_�Q����iOQeAp]@�����"$����0N;�wRw�DV�-�?DS_`D�1�*�����Y��I�3���AS��x9�l��N���������=x�h��������� �<3{�n�abk�}�A�$��5Dv�r^6��N��\���v���vd�1Oy��������#�����G���
t]��!���6O�����\���DS�[u�Q��t�����>h�+�6�}ucw�V�/�m�f�%�H)r�o�������7�|�����
�Io�� �mG�!�jV�����U��6�k4%�c `�uv�"=��"/�P�A�Ee���a�r�2U�/L��\5M����)#EA�cC��.����TbFD��!���������9�?�*VtJ�����N������Co;�����M�b��;ip�BX�)�k�	��|q��G�I?��~t�w���|���@���0� ������������oF���^g�\�U��eibC8���h7vP*���"VA��2�CD�����+�B}��a�C���[��q�x����������7��O�R`��:��z���+��V4p��#�����O���#�����D��0���m�T�"�P�f��
�������
�7E��F��AgC�8=y����8�a1����o' :b����?�1#��!����1�j�(2�
O��r�K��
�@�
c3;C�,��
�z��tZ��Dt
����Z���S>'Z1��>�(?���5d"�ap�;8f�$N��7�m�&�m�(v��3�Jg`I���!'��k������mvbp���9|�r����3�����ceV�
��F�xX(��e������;�WB��66��h��}rZ�u�D?6a�l��+�X`��� Me������b����c�M��?X�zl^>S��J=��8@���������wQ� ��l72!D�����$P$����C%Z��=���~��V�Fb���U~�(�Qb����;u�)2��X�b�/�ud��y���r8��d�\���=�d��a	�|����cqlsO����q@��n���
�7�{08qWvL�X�q���8�qv=���I��m!v�S�`Bb���������� +PRVn1^p�Q��[��VCX��b��$gGa�l �aL��^�� �lA�R���r�8�r��V����k�a�H�����aM�B�����_��~�7h0�����5��������������!yx��Ft�VD��~����M���'{��'��]���������A"�����;F��"=��4�: ��6iG��i���O6��wOP��J
	����k���.����4���f�p,:Na �d�P��05x
���������.r*��[K��d�g���b��10�[��������"#"�������������M��F��j�)�����������S 
�(td
��gg��@�� �F�i�#{��j����n��y7�!���{M������[�gG�)`�Ty�8��n�1Kv6�T49�
���"�3��M��������<��i��w�G<���F\G�Q[�aj��uD8.�^3eINA�Yo
�8w��J�-(��k����%t�,����BfW1���8�>bY���KP��
�����l�k�
�@��D���������H�A�.eM?�O�
��-�*�w%tB����Y�i%�x��-��nZS���p����K&Jq��j���>&�J�5���N	p��C�����io( �'���]GRk�Q��d7��q!;��O�

��Y�u
��!P�4�rq���I�����w
��]�B��V��;���6�7`��5���M�o��7&��+�+������`���&^-�0�~:�K�h��h��~�I�0���v����6;E,���k�sY��J1o�F�mV��1\�H0
Rd]��g�K��O�H5�H����Uv��g�{��s��@�g���B(Q$���3I�7b�������,>@�ki���^H?SI����Lk;?�a����@�-���V�M/u�-�/��=v�I��
�(����&����/�� r���4�w����\
�xh�S���t"+��!�����=�Gv#���=��9P��b��Yu
������������M+�Z	U�<-����_��xD��������6�
F���c=�/I����C��0B��p��m�L}����qY�'���e�C��d1����;D��*�������<��>��K`�/�2F�����]���lmKwK�l���a�1��c���
pg��2�YjD�X_�Ct�p����
��No �3z-����!����sI$��Lw�DM@��u��
��T\���1_�S��h��4��hD�y���O�������"��_��	��F�v��X�e��Pd�������>-�����r	�2����0^q�5j
�/��L^�1=�b���}b���
uK��%��E,�e�%Z�{d������F�E#;�D���
�h
��}O49_���������bGM�rvt��/�M[�]���A�k�rdt��T9LF�_���W�lKw`4)��x]�|?�#��D�k�[m1���F��f��/��A*��Yx�R@-LZ�
�h#n@N-�M��<����/`�}�����;u�XB���(�f	0�#S�D��%�W6����G��%�����(v���;�P����vV")��h2�&L���O�^@�\��I{��C�����Z���#��2��O��,��E7��I�:;~�j6�p�CV?9����z�U	-�
�/Vs����m�"��EK�
�����qgg��H%��0l���*���j!V�������=��.�$�ND��#k�A@�=Qxb���I��
}	P����Dw�[*�2��J���A�P�la����F=�.�>��[�5���d��q=W��#��@����M���3�[js�_��YH�f�I�uF�[�s�������F�-K �\$ �������9�?�%�yk�}�r�U���}�KxC`���;iJ���@[�[ud�����[�6�p'm�d&�Q��N�Q;�h��3(Dh�T���ce��TM���"
�+��u�1������f^�T`���H��P�	�;��B��a�����b�����`d?c�>�I�������4����@;�H-�IHi�G%�~}�X��>���-y���Q���B@���D��v ��k;�����8���M��"���|���w�H/�f�P*��WD���W�Y��O[0���#&�6VA/�AJ�~k3Z�~Q��e�������bx���)1���af������A������t�u33�m�b�R�-dS�-�	)6p���>g���l,���]����!l�p��v�S_�L�q���������}��m�]����P7s���2�/�����q�X�0��b,�C��><���{���C����e�����~d��Wi��S_;%;S�s��!";m��w�])B0t�fdx_d�o��������*$�l��N>����I��+��t��R�gQ@n����,e���/��A�X��Vp9(���9�|H�HnA�����G7��s�l;gP����Z�4��x���>LX���XQ�C8FmI�J�t3M43#7oa%����M��������6>�7a�y���r���*������?l������/��g��`���B4p��6���(�|[	��?zna]��{��2�d�K�u4-�$A��$I�1�/�^o��9"��v�5���Q�	��,+O&n?3����")��qJ�g/xQ8#�����Z����w�F3�-���-�-R�m�X���3��do���%�py������z�~0G���s�rD
J����@6���j�eEo�P�p�<��� ��xy�����V���+?�!���{���1D�&.�����-`�)v�;%�?����a�G�#���#"f�q`�]^�8�!S�a���������(wa�j����}��:����z��ZE=�Zq"5�)F��of�?BO��{(��x�k]B�2_�#��7 b����������xu�G@L�?��:��
H%���1za]D6>G�['z�
�N��$)��c""��q\5���';&��iDi���>���`"dW�-��k&&\���J���uc=+Bx��
l�2��c�h<w��t�;�7��x��BW&�C����Kn$���]M����~H�Q�����"��4�G�L��|n-�^O0�o���������q�	'�#$�j��zIj�jk��������C)�;����c|���;��(��V_�*�QeP�����+���5Zn�Z�Gt����j����=F�8Tn������t�L���p48B"�7C�!8G D���G�C���}��R�n!�t��;"����~����.r"DW�����Z�}��_���z���l���&
���3u�:��$����d���@�0B_�AC�d���h�}Z�;��}G~*�����Q�1����V�|`��,��P�|�{�K�*�B�������a<�U��[��V�5bP�'����L(>��1P��_��o��j+F�	�|�� f�BCu��&C��dCY�N����\�#Op<y������X��X�����'p7kD�aJv�;I"�U9N�
�9�l���)��u��H�����}�Hy��*p�{��<�za
���pGI��-.�J���!AG�D��X�����1!���BM�nf��q����?�����;�+�h��E�-X7S���F�y>�7�9PDO_����G��Q��t��f<80���a��kG��s,kdl��0���	(�7J����o�6�v�����?�I9�9\�W�{#ul70��H�j����[��YaD������C
�{��?H�%�'��5?9��`�|����oE����GN�G�/yH��������K��!��o�������EZ�x�LR)Z(R�a?���	?���[I
GB�,������O�[�$(�{��`�3�9�f�E��*������?����H�!uN������V����3lz��a�����{��g	�^T�7Tb��6���k����@��A/�~���^�%&�[������G�x����U���{#u��������bQ<��
����K�Z#C<�MN$(��E6C��{�6��F}/����'����m���*���N��}�l��u,C���x������%�.�T��w�����~���������F6O���{��Q�5��s�{���2sZn1����h�~DDQ2�z/��z��
���^E�h�������79|F;��
�H��|���������Y���g������?=�2m$�;O@Xr����a|l�4��J
��P�� p�H�{B.�{��o�=�?<������'�x|o�~{�}����V����=v�D+V5��=�!���g7������n?� 1E{/���,|��b��{Jax�T���D��4E��R�yJ����M������i��`�{����/��4i'��G��X	_���4��YT�#w%���&tFk���4�g�[CZ2,1Gu�t#��������8HD�W�C��[����'��ubO���=��������	��A2/���H�������8�^h����&
��P�����WUs
������~������gw[�@3|=F0�{�G�c%�e�_-��*y%{��&��3O�����l�Vj����fo�f��'��o:��V����.�i��y�d�[('~odi��=�N����B8b�������p��x�k����
��YS/�b/Cg���^��O�#;���"pK�:��x�f����s��a>:���P�
d����gi��������D8{���`�.�S�N#�����}w
���a
�St����+(�a���V��;�\&����vh���H�m��{>�G�sV������`&vW��Kq�I�XF@�S��t�Pl	!�n~=�����"�"�4���E:�����c�J�c��F�_�+�q>��e�C��n�8�8���O�{����T�g�b����Hs"`��8�ge�����M����Pg�^�^(7���A
���o�GB������Z��d���i+������Z+v�J��|�I(1���h R�^0��Q[_�\4V����M�D5w���j����E�/3�@ql�djH�]-��(��8;R��g���N^�W7������J��(�T���H���8�:{a�Y�8iW*H:��#k&��Ve��Sk��8���"��D`}���.F���eq�E���E�z��6�&|��Fj'n�����Ew��u;�v��lDP�g�~K"lF���
�N�|�;���$��72����sf?��������C�_ |�v�h���+MT��ws���u�����X�����4�+��p���'�_�b�i����0[�i ����V�c�h�Ua�b�K��,��p0�o,��p�(�7�	U�A�����U���\`s*u��na]��Yl'�b���B1��V����k�Y	���=��u�u�4�.���+g�X���PlDVWX�
��r���lJ�H��}�?����{sD�*-�=�a[k���L��� ����;N�`�{�_A��Q�6fV��Gr�V�g,���?g���&&)�>_��5�B3�;3y� e����8#0�� m��}L�0����w<D�$�(�6b��_�#�w����/>���E��%��M���L(�x-��hk0�!?��/UR�jE7�P%���nw���x����M����l C������J5�
�-X{� {�V��-P�`�VM���i@�2��B|����0�q�����1ult������KXZ�W��tjjU���Q2r��B[�<�
�8�$���
���R���^��x��
s� ��}}�d��E�*X(�������U�������P��`M�����"���8���"c��Zw�
��q;�By��"G�b�9|���S�3RzJ��%�l��[��d+���Ov���j<��$�F���*@B�l��"�2_��:>7���F���.�	���Mu�vTfUP@�,?S
XT�}�@Wd�$zT����&`�3���g����'���
��"2m��?�M�M��T U�{��hr����X[S�v��C���,5;b����������
�@���Z�W������p����T�5w��Cx�Z�G��J��;z
���s<T,"�{Xq�>���N:
6k�(ak�"�g5��"�j�����&#i]��	���7+;�b�M�H]�����
��IO�

��'���{���j��l�������.���f�f\���1;��v4�	
1F�gUgI�x�h��D0U�&����r��J�0�7����U>B�H�0��I�g�t_���e���������7�0�rf�FD�M��`������,���R!6���k�M�eZ�y��X$�e������0"�I�0"�q��b�-���W������F����n'q,�3�	������������8�7�6o�Wcg��#��10[j�����"�����9G�Z'��u��`��d=��ho��C'Q�'L�������@�*�[�$��R���!�E�{��.�sB�jd�~�1b���p���)��S��
9��nGEF@]��W��{{��M_sFS���3"��	 (Q�w��/������v�']�/#�
E	�`$oh��@��r1?�E'X34 ��c�W��oN�������$#�f}C�8�^�]_�h�lB8�v�	`u��Q���i��E�����Zs��3��/����V�7���6��Ms�����i���u������"�f]8��6l�����Z�}�J2����yK��z��^.��l\��8]��>[���;"�0+	oM8�b���j�f�%8;u�"��l����C�Z�*�f����T����+$�=�h�����|����8^bm@k&U����X���)�0��60� ��(�	BHR
�k4U�&���=�+d�n��=�50�X"Mxp�%�U]����(H){�N�J�+ @�Q	v��4z�m521��������ZG;P��0v,���F�B#�O=���T#�J��u��9��GY����:���m��/
��������rvE`���)sm�6s�h�3����:{�M�[��#2�58�}�2��f���R�9���r���l�a`yj0=�d,G��&@���m�,�����	d����f�B����w\��3R�d�l��>�a�]��$Q������	re��n�T�n��
6&5!��a,�k���������1�#��	z��O�r�M���#��	�#�#��f_&L#��BUMX��D�H��k�v �H�
p ���?�8�������:Io�]o�����H�$>��J01[2�Z�����9�y�����MP�fS(���s��wv6L�{S�
r�@*��H~���i����:\
�W�0	��k`�&,n��2�����^N��`mM��4������c���4�{���T���{;������o'�B�8\c������!52�i�.2�D;v��o��zk$�+p1l�;;"g��l_V8��qG����!��xs��E����,����.��D�TjkxN�S�Q`A��b�Ry����IRg��l��z�s�m�8���W�l���V�i��^`�����E��v�L�h�k��b�y��
^d�AY�p������+��J���n�� ������+��w46��/�fD)���i����#j7������)��3��[� &��}��1���,p��bG�ht~u�V�:g�@�F*���V"6MR#��u*�c��'�q�/�7{?�<�.x��{���[�=��w���q�__����j���N��G���,( P�F�����2:�.�zR"RV�q��vb��.�����������"j�z�2��0F�o�cU����j^#B7&q_;D1�b��M��\.�C�.��Ek�F����pM[���2�0�O� ��61���k�B$�����]���v#Y#"�����k��e]XQ��T{t�H��m��Q���XRC�.��a�/yl��Q��bl�����g�]b��?��	�)kqh���qZD�t[@�f\����+���ad��>=2��}S������W �W������I�TP���=��_������C���],�K��4R������	�3Kw�&dt��a%�>�01'���4�-�("��6�>HLO�wD�����]�d�	B����G���A@F��g:��L\����Y|����B'�%8��������n��\����t���g������rGj4��R��X�'p�\�1�	XP���#��~���s���oyk�%�V(��J�\]�?��$��X��#�fg���K�#hXi�#�n�D�8Z��&fd��r]�*:+�������A[�l�#��d���J�����X`���_lDug� �wf��S���,�a���<���h��,3����Hy+�N�#�4�!�bF��!4�X~��';|�(y�h���<�'�O�3���m<��-Z�03m����g����	*���a1K/�
�2�����eU�?�4�`�_��G4�B%dI��ry��\"M�>�Q�G�?���G/6��T"|��r��<�weidC�� �U�����a���P6���L�����_u�	U��5���f8���e��]�����+ym�[�2C k��p�5C�=�L�l���i:�����}w���G�6���A��(����?G�G�=�qT.
���>j���m����D�L����m/(Q������a�;�=��������u���b�o���q��P�!@�����xx,_#�p���	�& %*�G7:;���h.9q����GB& S!�U�0{M�L��D��eMN����<(��=&R����������D#�:�p�`\,M��)����0�d�P
����s��)[�#R�EQ�=�Q���t|����X<36��1r�Fp�R{�1���C��1x�~1��HF�\iEE� �@�1h�&5AV�L;Tw���3��!((q�f���N��
�>N�Vl�4]���i+*Y
��C��$���i#���5������T��E���'�%�e����S��a��I�P=�����a���l�#��0N�\H�o�A��I��_��A�X�m�h�_6�X��$rGU��EKUH�r�
)
�l���0�!����������N?.������Q��cS!����}>^��DSQ�v��,��+sa�0�M���.�z
c4^��$���I�@�k[�f�����efp=�hlX�xhE8�����nrH\�o�[C��RP�FVL
����Cp�~"
��Xi��8��/�A���,Kw8[>����y�!%���T�V���z�Eh���"_�i�F<2���,�c� F�����<�1������[, ?��;���v>L���(�����F8��,rNO���1���t�2��7F�����vu�ch:��?�8��
|�"��4�1��Hx�6�Z��2�������`���@O45�v�`�����GqF	�_t��*������Q"�������L�#���M��;����f�,�mV;�D�h���x����-�[��H���f��U>Q,���}��e��qL!�}��3���`1��?�3�F��`���q��Z��������������tr��_�u3���lqr�R��S���v
�8YcP"{o��Ab6���8��<Y�GlE��TQ���$���u
d8�����d@�p�N����n���o����w"��y
�����A�m��3�������4�g
N@��������Q~����B�	��k~y�~�s�o�]��o0D���g��1��5�E6��~��G�,3���������������e�}�	���v����ec(��&�Jd;-p�XQ��LY� �`�j
��F���p �����xh1$8�k�=5O�_3���[��#Vbj��&d����e�[���P�����������l7P�z\�;��Ar��5r����z����d����CG���{D���������xM3m�@�
��m�p����s3�������v�,5�=���(�H�95�����'���NS�}R�
h�Y��d����J����^9[)m�����l�,�hFA��m���d@1,�R;�X��t�F3k5�/�c���� Zx�~?�����sH��1X������;��}���F���3�?�(���\��m���^"�F��c-�+ �vZB�$��KH@���4�?���`�+��	�nK��kH�����q9�-'��j��"ci��	R�6�p���h2�
�o9�Uw��-��3�U�g�dE����R���D����?�U���-���S��='��Z����5�����(�K�~f�X���;�"���n�N���0� ��?D�����[{��>���������?m���nY8��j	@t�l���E��U�����L�FJ�%�W��xb����i�Nf���(
�#�l.C�,@��/#{���NL��$����3U�0�l7p�
���GZv���3�T9d��1��^h��,�l5�8��3�%L�5g�:5f������s�^z�H�v�d�A�����w���e��������d�hr�vK�S,x�~���i����AzA�7��=k�|���!����f������m�=�[3#��&b��!��u,K�D�
V����:;��A�Z1���l$X�$���4�h��GD�����wT��[���&k�W3��N$weR@���k�S�r*���[�5p��=�����&X1���~M{�F���KEz	�����	��!�e���K�yt�q��q����!
����j��lg(�Q��4������dcKpN-_%�3-A�$����$�n���������2A����%t�>'��/��IgQmK��������Ul^��oE��L,r
0�h$YB&�9[��#jVn����0��R��Bd���vJ�wwP�;�)������eq>CL��Lf+�>�N�����\�A2�����A���(�������)��<�%��{����C�-=��}E�O�T#���?v�������*{�AXhp��J����M-;���-���gYr���}{J�B�I�<���|������CJ��� ����^_�Cu��0�m���W�f������?�+����w�G�������[��~�P�- �����OiI�m��X}��?�VF�'R"���l��w�Eu���G�;��bL�6K�m|"���/��qS������0�@
�33��v�}awF��]:��-���{��=��]�Y���+�����m���x�_�vS�4}n�g){��.�w�{dq��G6�� �0c�b���ME%�6�H����-0��$y>������T������k��=���P��h��m����`.��xt����e���[`�������:�K*�#up"�lR�����2K�����!,�D���\�Yy�%����a����>r{���mGT�iA:���z������"��EU?�P���{����df���e��8�hde�p�?z�x����S���l���#���R�}�&~[
���sS�~o
�� %����g�-�7��s[�(��B�O�C-K��Y�m�$!�<�i�:�H����f.����Q�g������J�/��	�`$T�q����2��$	�p�8��a[)�R���S4c�_|5?�����M����4uw���n'Y��0�HnK'��.��]�.�B�
$��6�NN��mD����������������p�rOM�3Y�Z�U��M`����B&��,c����E�@�����j�y)��l��i���
�Ov��8�8�O���	��Vl������{���}{��<(����2QP��k����	���@u���'�/��-�������b']��J���h����:�m��C�����FH�aD��P�{��E�R��z���P�I��M�*E����MbE�{�);jI�.�����/���G��g}$%�m��j0��D�[ ��.�tEMgTfk ��e������xX�)���}��������.q�m��%%��*��o
�g�$E����d�]n�C�im��}P�/�v���aB4=��k��E�L���MAdkj�F����d)����pE���L���GO��H������V6��������P# �3�����I��s4�g#�)�f^��9} C����b����a?��#�
����g��D���D)`�2�;��� �ZJ�OPL�������j��c�{.� zO�_~
{���:�"v�n�'	� ���7��gu�L��UG�����VLBt���:��m�0.��R�f\��v�
��=�y7|�l�
�`�Z"���' �L@��Q�t�i��V.�"�������
���/�����l������CX%�eP�h�y�A��h{�p"��oP#^6W�u�G����[�N�u��%�&�G����<���w����q�4l������>m�p������$� ��_���\��/C;xRJ�q�C��v�p��������Q�#:����8��$�����&���
��.���N,h�)=�8���:-�i����i�F��?3���������p��E��C2:y�j�"&��P����g~�9�EZ]��Y�#F�k{�l��Tw���glN�4(�,�6���#���Hqu�8�h�t��1&����HV�������H��!��Y���xx���4�{d���L�����!�f��o;e����.GO�L�������
�����lW�{����Z�4,�lhf����4�������!����!
�q�h���"{�nd��o0R������ef,��&�� �k��B7#IP���s��f�!��1Vr?}D��'�,tOB0Z���5�����]f���"mk�P����K*)]�c��/	X2:O���6����v�~s�{H���X�=�P���P���&�E�x@�#�S�G���+��h�G������������%����{�>���+E)��gB�"k��V_���}	�U��_�����F����|BJ�{�?�sD0-�l���piT+k;<2�J�{��k���lOtl�=4�1�.x�����}�V�x�����[���C\.�+���[h�����G.���	KQ\��G1�Hm����y#�!��l�N��~��>����\^2�~/rK�I���gG��=4��f�}�;����>j.���N'a;���pY���y�{���&Oc(V0���#<�@�>�����)a(�WkT<8
*��rm����%���>��&�R4g|��.�$"��J3�����M�{�x���me5�A����$�^�M���~,�@�K2���C!nYDU�J�^�y
b�[���]���(9��\�U7�x������{o$b����x�4�z�~�8[�������?�����n��{�W�s��S&\�G��P�@u�f'�#zc�KT�@2Tx���>`�K��hW&n�P��^���fXt3T������1���z��:Vq2���X7���&����78�q/u<��=�����i��$�\'��`�����^n�-���Q�s��Cbt78+��������D;�S<fi0��_!����h�Ib����Z��)c���m���H����\$�r��L���5=�������(jb��^��5!&�<�Q���[V�3#�����E%���FZppZ0�JP��r;J��I~������T��0���P��2qx����@�?�1FV����G����#=�"��{�%n�rW!����)��Z�k�=�����n��������t�_��H��cD��},�:L�RB�{��A3[wV�
�8�GA�I(1��p������������6�O:�,���4b{���hy2:�~�F�B�}�j����[���!I$x/�x�}��6���"Ai��>� �M���F�9Q>3V1wAd��J��JKL@�E�G��������5����Q�����`������E��8��V�3��������lE��M/6���������`�0�/��Cq*�~��hV����|�Ht����0��~������/?���E	�"I��{��u�z�G�~)�o�s���z�w�<�����>*Z_�H(M���b��G��������Qrj�b4�8O���l9��j���>���zL�DB=�,�hHY�}��`���l��H�6�c�T�^���k���[��g�jBX���y�@!�I\�{����()c���/���C����M�|�n�W�M�������?��*��	QHY�>�K3�*zY����.�#C���v.;T�|�Kq��-�0	��=l"������P�zi��$��G6����@����8��
@V�t�jb������������x:���q�D����UO\�z��'H��.��v-
��E���&>O���w���8�md������������}��lS��b ���x���|���"�G5|���������Lg����g�Z�>���,�c���&��*���n8��	��n�i��{���?��6O���x���z�l�^�?���J�l�w�R���{��X�q�������d<���")Q��N1����lH`(>7�cx��#��8G[9n��"�����@PwEb�x�W���g*�f��f�T���}
�X�eO��E@�
d3�P�@.�����������@1z��E�C�r�D�na�����es��,����N����3B���-*fK@� �LX3��m@�DF���g��E�����a�]������K�s$�a����Bc����p��i���"������uI������r����,�G=���(Y���nB��J������g�j#:)���K
���g�$��d���or"��6�%D$pU�+@�>�F�K����+��0{[�&8iP2q������'�IH"
������s�&��q�&�$��TA"8�F�%����y�J���:��(&��p�=f����
������+����@��<L�!G�c}<�Y���������i6UC���F���D���B�>S<�
i�S��`8w��uB����Yw������d��"@����[r&g�����~�\��:D��p���r/�@���{-&+��o!�N
��*�C��V
jF���=��O�����h
Zm49�vAEO�
��(��De�R�|���`�
��������b�a�R��U��?������������&qb!|��':��!�oPoOM�"�H�F�)y���������P�=������V\2�m�q���:7��G�X�������xrujP��5�
��I�v���>�U�%8k��tL����n$E����hxH�Q�j�B<�I��	�RU�LG��O��U�
�<���B�BX7�Kk7u�2�P�kw5e
��$�������1���
HX(e�����T��4���X�����?)wH�"�m�^w;K��U�
��	.z��(�����f�WVa*���:B�*He�\����3"�K�2���(�j�)�YZ��5*��@���w����n;�T��\a�Y����n�D�b���X���"}ITRo���b`�m�D���:�;��Ta P�����.R�=y/REZ}�:[B��:�U����������{��b]��=OCv~�	i�#��"L�:�;;���.�bS���D4uy�<S�J
���I��#����������S�m]����Uzt�
�@x�6��G��V�f`������q��U��I�������g�E�����@y���n$
��L�^H�e���.�?���}Qj$����i���~���X�'�of>�O��d�f��<���0������#8�
���rd?���(����� ���1Rfq��#"RW�cd����*�D�'���U��"�("J[{\�g9��� 8�����3?���H���J��.��m7jR�S0�Q'�'o����,�X�3C��rmZ��D����H��Q)��:D���9u&1|wD0#6H��D����)�Ut����V���@����I���N�����P	&�J��>2���M.2<I��]C������?�^�Qq���M���.&]F���bq��0,Q��lP���"�%�b``]Wu�������E�!':WCP�P�f5�=��F�	�`� ����f�!�j5gbD�f�E�c�T��j�)-��4E-M�BUJ�44�DS��%cDk��:���9#�5�f��/����=5����	Oh��"�Qs��v�h[v���~v�0��T0��VbD�fg���������j�YV�W��T��$��K��Bc��gw�h���$U���;^�Q���@;���E��fi�}9�w�gc��U��o�6p)�p��lm��:���FEw��?��J&wkB
�r���!]��j��Gh_T~�"74��wS{�&de 8��L������M�+g��0�0���C3HP�/U>z�� (r��]n��f��9I���TF6m:b��m]��GY���h���`(����O�	�e�s����W���,i��HV���?��F�p��$A
�"���W��	C �e������ks�RE��lf��U��Rp4�41LU�M�CR�/�XV�[��
$�t�|�&Q��{%�`	��*����4��O�5���D��^S�� ���36aX�o���Ip�u'}S��)����h��l7�P�E+Z8��L���O��		��X�i�S@3�����M������1���,YLr;�&�M"������p����]t���d��I,}�
�KEU�.�+k|,�h�����#������a����������x���F�q�� B�d���= ?�(�N�=u�p�H`��C(Z���8�2�I��������j(���4���Z���b	���6fdv��o�:����
^�#	&Y^�AAw8~�fwM������Ox"���X�Hi�M�B��F&{b�1�*�0����.��F�]��>(~�/��%��jN�����{5a,O�A��a��
c�GGrt��'"DZ����/�VDu7PQ��}e�e��jI7�U��j��^]�'�h<�V�{�����Biz��^OM0� �"�������E%���������F���p�.�bEN+���L�D�%]`�}ZC����j���ia��Z��0q�9n��	� jnS�v!
��B�A�}�t�rR)����"0�(%#�<�% ��m�3O�n�C48��4����"]p���@q�>�I���%4.!�F��-L��w�W�l��������]�.r�H���n@��=]��&�QE�F��[x�H?��m ��� b�� �O}�l�FH��]��v��eW�o[���H�P���.��e�������>������{]@GD��6P}���4��;���Y���E�r���������GS����H=���=���+�b~�����DD����������������v4;�6�"^�~<�p���Oa�Yv��r�0�v�8"�u�Q#�F��wF�z-;����,b��k�����{����#����{�r�V�T�o��-��I�A�U��;�2�{�G{�p�[��C���}'~7��h��Z�~�6�c��_c0���#��5��d���2\�P�.�(�����tm���iWd��5�5�!�������c���#�*�5�}��[��7����}�������H�4B������5�G0{��K=�c�k�_�D����8������[�@'�:Z�F4f��q#�d�q"=m���*�6PX����@�;�R��p�MzG��.���`17G��0MO?Q.��*�~�R�r�:�n��q��
����:|(��.c�ztb��O��=T2J.�y�aX
���g���6�g�e
'�G��p�8K�`TK�����Q��\8�9��]��>����pm���p��:�������_X�F��(��P�Nc�=����Zl�"ET�� 
�jLi�nKM���<�6��9��G��q��~��-q�`��h���4����h�%���B�N@[u�Qt#�UQR�e.u��qVIK����b�)���R��!��QS�G3���~���
�a7�����c,A
*��c���m}BM�����Y���Z�Vc�{�2�������_����>F���!��M��� �&����Y��
bq�����+t���y8}TS�@G<��k���|��h�������jg�e�-(�I�*��c� ���dk����WT��Gk��({W��D���4?��"-O22	����y1d�_e~4���U�s�v������Lat���k�-�nsRe��!L�3de���8[&�cJV
�a~O�"*���5��A�a4U�j~v��h}8�<�v�/grj�.�z)zm�D���!��B��P�1
�}����L?���F*����QP�����
���;�=X��
G<����:�~8}���p�x�_�E��V�
���`��2,���f���`��%���a�>ZV9r#;����fB�+�*
�nL��o����|pe9P��7��J6��"�H��XB l��<��jN�����K�u4f�����k��	1Y��O�V"%�lr{h�3�\�ME���������3��
!$�������m��-�o�PQG���$��T�)�}q����Rm�G`X$,�C2��7�;��-8���W�f��M�Y$\,D�{����������B������M�B�'pG[,����sD��q�TG/g
�u������W~:>��q��z�[�D�'����#n������X�������b��)TD�C��;����6����.����J�f0
m����I��8����V�G��)���BA"�u���WQ���L�5mS�J�>O���J��F#�YSG��%����]$���w���IE�������EL����Cu�����fu���X����VS�FB�`���0��OSH
���3�e
�8�:���!��t����������MNi�6��).�f=-��
��_�i��T<�������a�-�A�]�� ��m���.��z
a����~p�&]�0��
�m�8"|w���{ph����xIm%g����'�r��jdo��QI;
l���J-��3
G��>S�q�'5`4P��g#��*v��Yl�"�3|����]����'}B��F�eU� y��W�����~p�8�`P�c�������cte��������k��������:�,��
�/�@E���m����5�G���������������B����n��d�YT8���9������z�U{����L�����m���!�UY(aF���`��y���?��!���������N3-C��HJ5���b~�������Q=�|��B���j��ea%����6z��4;|��fG�Z��'� ��)�Z)1Q��3&�\f#W�M�,�������$��E0���j���?�h�z�p�fA	=�k�C+0>��3���*��|������0#�v
K8Q��t�65����l���N*���P�����s0�g���b h1���������x�q�m��$�N]��e�"x0���d��c5�R�F�&e��)�|�>�wA���Z��i��t����@�%�
�Pl<3w-�T���2�-C���������/����t^���u��4�eQ��H���"���p��Zp��.6�9F��{����������9�z�(�9jd��%�!���bfH�{])�wy?e�c�['��~��*�T���I��5r����hb�����pSN��~k�k�g����J�v	W����1�*?��m<ze�y"��jT o��)�8Z��~	S u�m*��/]��>7�R
��)��XD������`��r�C�p�ri����G
AQ���>"[�i��i��0�GOO8�=���1�l������e
����J��� ��w���z�Q�����M�q/ J)"��f�o�:��n&�QeA��
����}GLK_6����Rt��M17Gc�9�-����=cZDmX�*���|&�?s�������h$�Y2T���;����D�]�!����Y���Q�i�G�Z
��rn&EE>�K`Fy�-�GV��s*R�/A~�L������&D����O�]�Cx���G������"��p�H�i���9�G7��w_��33p[�)`���`�����8O(�d?G�h���s��!����>h���@r $F�KX������7z�����3��W�.C8�4��r1�E�>��������+e�%4��H�
2�����!�hS�5�_�Y�* C]����e�����-]@F&�\�hE
���%�ge��"�fY���B�0������s�d�.�aE����L$W��#f}�Q�SS��4�fm[�u�>e9D�|��#��tv���At�� �)�|Z�/>��JSP��V����4=���f<���/���Y�����w�v6�~j�%�-#�/n(t�e�D�e������p�@Cl�q{EDG�������KV�	�p�c��?������������ "�����v|?�&\	3j��@����ognc��,�}0����H5���M9t�[]�sU��1�
C�p���s���D���s[��Dw1�u�\�����P@�
a�-�!���5��XZ[���5�g��=���@2��.�e��g�� E��.��J�ml�O\x�`�>4������7$�eUg�0C4��B���7���e��	d��'��w5s:t=c�n�	��
$�p���j�#����E���=����j��*�~�N���H'Hi{���#��������-lkv��5O����w����P��G7#���d!��w3����I�eva�x��0�W-��
���-����F-�0����_�"l���FS���
���9�B`d��-@���F3�mO#Tc$�G��-��:v�
�i���#fw'������RP&�P��x�0�@�mL ��p-}���!������g+D�~d���W�h�����Ftt�R�m_�sLU��c�3��F�`;rG��Z5�,�@�
p�R*�
���tpG�0����>��v�6�J�O�k�#}��^�HY�1�B�>K8�B�&������
7{�Lar��o'Nd�����$&���l��#XFv���l�X�HJ��|�����f�Yb�^��Fk�&-��hi���i���Y9��k|�q-��o-�|��0����m�B,x����'D�K0���
*�;��Z"[ eE��4�aU���l���e��]��g;��1|t����)z����z�-���-��h���?},��g���~�a�Z]S�}�B<j�l�wj��qPl6W�G�

C�l��>>&�5�/��h{�_�����������l:���F����_�#��u;�%�)Ke��M�h���YM������UG���':�����"hfG�#�@D����Gs��y�����o����D�!���`�a�!ybe7*�iHN�S����MG@��S���i:� ���?�4�}��h�v�x9�p�����L�n�>��*4�����������c#�f��dBD�� ���>���#l�Y���d���L���j��t�
�W;7> h:��>4�����wOs����J�\
hvk2]����������y�h�q�x�2?�#T�G�2+E���v����t�Gp��������ZI����h�s�4��[u��l<�x���������y�Fo������1* ��p�R�s�!�8�g$�9NA��%9M@������w@�,mXK�y�[^O����vOU&�0�G�5��w!7&�XsG�K��>��Q��DW�\����i�i��qB$Q9�N�9>?��g�
t��{���a��ygx@���xl�;n1��=�5�:�������c]�iR:�+'k��C\����~g�	4[L�"M���iT9�v�2����/*Ii���e\���YY�d��=��$�#D@�w���?��)��!8��U��
a-�Y����vf'��#����+r����2� ��*0�U�����I�F���Ci])J6N�\z�y��&(�G|�c
������������f��t2������bB��L�"Zt�Y����08;�0����'*<����/s�?����q�+�m�����f[���T��2�p0���dC��=����JVQdkp�D��q��F���A��!���bP0o��n�.����6?�t��s<B
���y��;�q�{#Wq��N������Vl���T���G�
S#�������2@�-�Jz���>��HF��K����D����//�c�{H��^��pp&a
���F�WOB����^~~xN�-�X�G�������)H��Z�E�{����(����?��{�)�����@��!�n�^�^����L?�Z�#a��7��p<���/���{h�D��`4������s�
���j�Cl*=E#
�����d���@�P0w��^I���:�����H{!�n*���^��6$��{��
?##��J{�F?n�uV�@U���a�5�l������&NE�.��)!	pF�p[��}�����{���;���{hO��f�� �UD���H�G<���3?��$M�{��Y[.���`�����)����Y�Rs�{H�G�d���c��[�����:"���5:�y�����,:u({/��d��]��T�|���#�m�7�I����Eb#1���,��	���D� ��=�i}mUd];Ad��u��������?@�kk$��{���V��R<^���L;�D
��CVR&#��J5����f�j���f��n�5�HL���E�Mt@�E�S�<��+���q��]8������B��4�%t��"��Hn�B'��1-7!8��l�M{z|�����\����U�,/�O��6�u���������l�6���E�[��d��H��bO��^�c��`��9l���7�>��z�R@��_������Z�FP�a��y,ZT�1���	B8wv�8�9A����0�����\�c|�Qt�]�O}dj]�ew�n�	������Wj�e�!|��h	�+��B���h��BV��(�8��d���DB�y/�C���4��
��.	 ��B>?w��[Ox�Y��4�`�s9*��2�c�|�W�|ht�� h?�����pf6��r�Rw�h���r����H��K���B�z�������L�"�����������8��P���5
D(eRs�d����P���x�M�K���.5vB�xo���D��K-�SF�=��&��(�7�%�4�C��t�7���
�'�6�b���2��E���4���d]�0"|�(+�/{�������_�
���/�$JH��E�(u,�H�MX��|VD��p[1F_�ZG��P������
#f�{��;����E4�Q
�j���d����j���G��.�*�������aK+:%��8�u��$�^n���"mj�b&���������-�!z�4b-���9Dxt(�v��7�E�A�D�TD���:
��C����n$N�-��kd��b��{��p���Z�b�"]X���]��P�����8�Q�B��+�E��0]�]�LG���)�������H�1���3�����<���o�8� �N����3�����n����x��P=�p�����&��Q����v��	9����Z������jb��&��t�Y�=����:CM�=5'�����
&���r�e��Q�
�%S(Tj����r_������C�Ad	5�E�G3����9���l[���Xf6,����m��2m�u��w���W��/�5�v�f^���*���%r�ez��_o�P�{��f9!�t��(�gq3$�U�b�#��6"�G�l�Y'������m�`���O��td�����-�!"^C�v���^�s��W���O�~�K��Z�>���&���Z�	=S�w���4	������S��9JEEh��a�Ep������Td���e;&���T��!�^n[L���r�2\q���U��T���+�g��������}���a
����6i�a���+;��;�bLM��{rd�����H��s������{���c�w�+��rmg����]mV9�9�:�Xp]��hT����{��!�b����7�q=�!_$�]k����V�I��xU��IQWm��?�M$���#��{��C��}�xRF��=�����:���ek�6Y�>+�>��%��,��TH�`�PF^��\���ubT�7p����a����B0*���m���-�d(0�[�
\0��l�����xR�{#1�e�f����2������f����@4��r�
l����Z��{�^���T~`N��;�J�#)a��Y���A���u���a�|CI��{�#%��>��@�� �J7���O�}�������>Z�?��x�)0�$�&��X�k=����>�6+�o����4V�}��������w���U��'U�T�$���A��\�#��G)A|'�a��S%����	f�1�+���a�/����Z�#���D�_%r���,�[����!�E�Dtkf�Y�)�������%qM����O�3�m����E�x�ZG�T��To�U���{#�$�V
����s��Z�j��@��kG�f��HvT��I�HCZ��
����>�^�
��3�e$���
u�j4/��O�
���hG��������8�}�K}�z�q���U��t�
�
���T�r2�RZ�{����@%�e3��������2�E��[D.uF����]�!���z2
B^�������X��l���h�W����;���q����x��@9s��=����p�{<l�f$<�l�^��#��V�=j�D��?,56���8��)�YW�
C���rm{z����'�W�(����_)4��Kdx���W,���8%|�WPt��w���{'Q�>�8�
��o��$J]U(.�Q��{e��L��
}��q ���c����d��U��f��AN�:�@���Q!:�h�_��Pp��B@:&�8�d����v\����kDguZ�2��iaVY�a'��O�u�)�jj
����U����+�����6=lt���r�����:�����0D&m�	�����F�T�F�w�mo4Bi��j����$<�Lb������
�0��q?qd������]�H�%
NC��T����hRFD�iv��=^��nQ29es�����W���j4lZV����c^���5y
�F�q�"g�j�E���I�����E�B���#(����<�l�az*c�h���D�G���&��/�C#4�	�	P��sl�A&c��k8n"[B>���8�a�u�M��A�0����9�z��������3g�N�H������~0�k��	���)�rZ�g�X��;�(5[Fe�\PG��������D�6"A�V2s�&4���Ho�P�����h��d���E,��<F����-Z�#�f��m*&����u�MH��[^r���P���d���^Y�I��-���-T2�0Z��P����v��������:��=cL�#��	�@��#�O��}�i�Q��hB-�@c��wH4Bk��V�i���]�"7�6���^)����	���TP��M&�n�(hOPj2�^��	�������K��\=�}����I	L�GDiA�������}�����xm�#�c�_'�	����}Lq���1��b���Mp������h�k����v(,R��.k��O+,B���~�Bd��2��?�M�~�<������<��mM�#~������dm�z�����8���M��i�3��0��/�2D���	Z�;�9r:��3!Y�T�����r��8�M(B&}j��md'Hx����U�����l`&��:[rs���d$M�B��)�o��=����1\��6������Ow��hG�@���AgM8�hK�Z1�'�����l��j���*�����J
!{��w���9%!�.��v���C'X5��
"�%��]h����v_]Hc=LV�wk-i��Qmw�D�p���8I
���t�)�;m���n'VDq��?�AD�y_"���"%�w�A�	��l��b�s(f��5w]`�}��Nb�}���ZQf������B&��4b���.p�}jF�PEvUvQ�����uif��K�`>�G^p����5���K��^LY�>��4dg���it�S�GO\hAf��L�I���oZ"�	����c�4�������&NAw�f?�d��U��h/p�D�` Z��?���j��9d��.p�����*�.��(���;��FD#��nw3}��a]�;��?�h����l�D����~V�'�X_!\��DoP���0+v�����V���H�]�z���l����0�=�_f��l$������ >IXX'��%��W�_c�aTf��@���m���Kk7�������D�^n�:�:��������	��2#��EmRw<u-v����x�fZ�>F���|�6�a)&�+f��L����2��06�c3��"�6�S��4"(�;>�v�h��3��er�5�b{#�Xw�5�b4f��y9�,����A�Z�f��z�H���q@�F�.�*�*�W���En��N��F&����
��!n��1(e(�^��7���`�����F����%�uc
��y�c):���q�Y�m]��e�3kz�+�{Rd�x����z��u��{�f�P_f�S�O�F�����g�tq��A	��ge���X�������$�=����xC��b3\��~(�"v�u�M
��VFL�z���G�C�ug()�����!�E����)V�m�����c��Q�L�b�%��[?V�d�V�7(��pd��'^X`^v��Q�m��SV�
p0W���8:��:�O���
'�����6�y8�N�>1>���V/<��dX�@�U�~
����6=S�����V$w)�
�Q7�{�k

�IC�������$��k>�Hl�LC	ms�Q�w��,�2������_�����"A�'�h�4,OPv�_�� #2��!���\�6�f��M�@e?����=F^��Mw'�9q�
w������l�(;����f/�V]����)z,�2��!�Q2��+������\������p�?�4{����d|�L�j�aeBT�aQ�3�����$�Y������"�G
�%�>�O��m��G.�����*�� ��7��m`w���"��-!n�`0���J�a��=�?����@��,` 	s����8",��S�����^��-��\�.��,�uX�pz��4,[P�}G���z|��6�7}f���g���!{G�C�����}o���i���s��y�p���
!��NI���W�}T�ad����&��8����S`<;��j�Z���`d+�^L�Ev`�~7"�[V�|(����$*�i�@_Gn{��>��
5%	GV�n���w���3C(�f�
��%�&����/u��AF�3�H�?���e����c�������gR����=�p
�0As!�5���������:Gg��S\��;����J��9
G��>-23���[���P�t��<V�|�.T�=��&"��a�"�I'����?'1����c�]]O��#wh
���w���w��B�g�	���)�79 �F�Z"�x8����m�A6M��[��L{�[D%��^�)�	����d�>�z[L�n��ig�6VJ����i�$p�����+?��?H�(]l�9s��,x"��cea����
��a�����2� ����d���������<���4.5�F���	��zJ7��V�N�����\S�4�Qq6�P�h�k#NH������`>�����
�(���$A	@C�$���t,�Ex����-���{t&M�y���h#���@��i_k�\6�?���/��1q5�	F�:�����n:S�SX��uG"�Y�i��W���)�A��[f��w�
r��T'}�[d
� ��B��/p�hyUkG�*=�m����4����N�.��P��t����(Zd�D���Q��H�{�W�YL���-*�2��r��i����i�"*)f����Q4�J}l���;�C�
��F�=�q�fov�H&�[fc�-�L��De�d�����}v�2�L���K���D�N88�>�6�h����)�"��,������=F�*8�*R������_k]����<,��Y�����;�P�D�pM!X�e�����aD��f6�u�G
�Pc<���EH.E��!egr�a7L���� c�b-"iMA=��M��Ld
���A6������<��+R�f�]a@���#���j�c	��]sd3�[J�n���i���n�$������2����\vj4;?-�cr}��<�_X���S`M�e%��m�A���J�`��C�lD*����6�H�i�?{�ZV���Dz�\�i�C66�0���O�/k !{�����Y%d�I�*Rz0��j2�t���8�i
R(bg�
�2x��iD����i�M^�ehv����K�	)�a���"E�t\!�`��I5��B����|D���~�/��L����%�������n�����J���s�	�^�6��/��O�Y��h��2�\��;��&�Hs�JX\�������L�:':I	�`?g6��A�Yg'�|��GA��	ug����Xdx�L��|;nK���R�D������T�-���YV�
[����s����������Xg�����
�����/�4n	`�"lF��%D�a&�:3�LU�00T%ZbG+{	k`{]�����A��=�8�b9�:��-A�gL]�E-4�
��'�P���������-[��H����0�����C���A�R�	#'\W�om�ZL�������[����W��5Zvc*����@X"A�U��3��%�a)j=�J�����B yt�X�������%x�}-�,-�"����eUD��.��,��YqG����x,x<�oD�e��	��*�wr�/�
L)�����l��l�qX��J8������Lu��A(���7E�A�<K��)��
Z�L��FPH0R���D#�% 	-'&q��w5s��?B��Z�#����4�M,�P�u��$�h��R��	Xi�����Q���V9��Fn/����B�!BF�[�.b��{d���	����81��lYA��fV�
��v�h������&H^������$������(�kX���
��E���X��=�Dp�q�����!��Ql����IA������{Hl��d���v���T����������fD�XVP��,�$i�4z9��
�0 J-���U�V��o���h��G��������+�CU���m@�GFT_B=��e��S������%��d%����-@a�f�����?'��^�>d������)��1�3�H����Ad�u���K�GX�,���{�:���~�E�7]��S����Q@E�������M�v�.�2���S��%��v���:���,��|�@RvY^��r���=��,lwYO��K��h7��![8���.��6�
��������$Z{��o�f�q`H?#��%L�[�kpT[�c�B��dv��!LoeT�����!�������D���`��f	�X�p�0htdo�$nW�����(�N�(��J�y����c�)@�����W�pJ�B4��~��sb$q�@����l�'"�������a;g:���s��be��������-����J�-�FX�`Q�t}�UtXlc�h
��'���+d8��������h\��Xl��fy�X��7N��5�#�����-� ��N��"?����rA�g����/zt�m�"")�6��sE.���D��p�=�#�����a����MtP�EL�]Mz�+���7eF��-p�NJ��N���y�P�m�&�x�0����D�m%DT������������"AtJ�
��X��}��/���T>�6�$��.X��q��q��=��vG+}�e���F�a��p�M���i����>Vl��_��U`�h�Q�w�����E�@�a����q1[���4&�-�7!pbm�����9�� �h�\��%��0�;���Y9�C�c�f�xV��h����5]B���d
}U_��E!�u���:o��!9��}�����\������43Y��v�D����4a�u�RO��d ��3���Mg;<�s��&�1[J����T=�O��H�-� �(b�o�����h�;U�m������q{x��+0�~���|O�p�u�)
y���"}�6���
l!
e|.���a�-�a�W785P%�)��n�
��{[P��P��id�m�&zJ�n��*�
x�(`��g/�Q�3;YY3��^>`����>�����p���}Y5%�la,-�$�Y2��v�5j(p:��a��[3T����21�W������=��Y�w��goa��(�f��m�9#�x9�3-D��^�6���g��-���Y��l��I��m>��K���f"������Y$�aI�?���a@�d�-n��h�{KdX]�l��@
#i4'
����s���*fJ�-�A�HR�1����}����������H4�&���I�g�T���A��u��$1 ��E��N�U[�^�q�5�<"���h�XG'�c��n/�;&"A��A�)8�p��&�~Y����"�<������XZ��-�G��\�hPG�)�s0���^��]4���8�+��P{E�G�8�w'���(������Zm7�d����d|I�O/����p	��?N��:G�D��^6�/����K�[�5�|�Id}�S�Z�;�CN� 
���To{�_,L�{�$��F]�S�����L�_?�����+�����0�*�db�
��:,8�I/�"���O�PT�G����'�s�+2��#lB��;i���k��}!�w���
���Z!�Q�5����}�4��S��>q"��1q�4}���quM"|�[h���r������-�����iT��T�*�@��r
)�,G?��5Vcgb�c3*H�D�eK�p�,��t	��-}N��hv��Pn����l��������+�`	zh\�?����
vM���:1���#p���[GA�M�T�nL����g��p�q���"����������c�����2�:)�x����������s��."�k"�?V�)n;>%�N=a�����Z�B��w�Q�����z����a�4����z7���B�^63;��vH��NhE�W����r-��HvwM�F��/�B����Y���)�r}MS�4��a8)��I�P�	dFEs@H��Y��R�/��=�J������*	�aN�w%k_����GoK���KO�(�r+�f)�O�N�
�����5�X���;wb�'�*����oF�?�*��t�#�\f��
��,��m�����?h������"��b���.<(J�y��>:������`r�h�e�F��_�P������mvV��V4_�2����b�(��D�	c��}��_��6 �f2�#,���@�a?�;c�i�5�|�e$��d�a0K�A��$��w����1����}R�����i��KX��]y6R���#������������H�w���y>�m���	Xq��#dP�������	T��m�D���#�T����M&���p�H�k���Z�f�@k��jv ?!����
��j	D�%���D�� �����j~l��6���}F+�pX�vB}/a)"�in��(���{D���?������jt�� ?|��"����$2�d�~G��=�U������^h�����59���!�]>l4���cH������H����S�h�?�m�����Dd5�����kfK���l�
��'��.x8i�����Gm\ny��}�������"&�{
����")�|�N�i��2�6�n���t�w��O�t"0ti��K�2
��<Z�J@����������/�7������O���[�m;�c������lb�^B�^�#������!��Nat����w�l8���B'�5�E�0���g8��������
&�M���^�9���Y��Kh++����g
��~��(_�
~2�k�Va;:%������,�A�;�U��Ea�w�$�
<�L��E����kH�}/�/�ig��)���V����U���P�����u���Z
V�N�\�c�+�N�#��!�:���_|/����>Q���]�]��I�X�����5
�z��m��x�G���:�b�|k�Ij|<Z�����6\6	Z����;\=�R�,�w��u���x{�����~����������[TF�YJ��B&���45^��1�t&u�x����g��Ho�KXV�6����9��Z��.3~���p?�k��v�
���.q��~���Y���HFS�sq�(D��;�����r���7��r�Y+Q�DB�z������#��-���������M�=�����:������cS�3�'�������{�Ec����uif�t�MF����hv+cY���9���T4��k��Gy�����m����
�,��H��Y��I.�
�y��Y�[��C����c8-�r
+���[�k�`ja��L���l���>�d74�Q�Sl�"�������QJ��
^�c�3|�!I�J�{��!90�_i�Y�b����Lt�*�.
����.���9j�|0h�L0z���^6�����PFt>*/�~�}�w#����XtA����V�%���OxAKl�f�AT�5Vm��>:�T���r��hb��^������F��Bw����Ob�)��/*����+0�I�X�|����QTeK0�?wq���
+B/z�����l��?dq�i�`c+-������S��Y�i��m1d��m+:��fb�	#�f�AOz�3a���
+���
`�#���r��eK��+6K��d~�m���Y�>[����]�c,�E��s����l�php�*��)��a����aZM�!��P��lL���"�����rE�nX`��5�	w���I{�����<�K��<���	�(���+��r��Gj"�@(�;����M�H�W�W��!�Q�������%��b;(������L�~�A��DHj1���V��j@T�em���EphH�v�e�����(�k�OM����% ����#���C(�������`
��r��*���Z�t�lr:���$������$Mea5����
�'b�R�Ykt�*}AU�s�j�����'�o�L��@���9��m����u�a��5V����W��#�
,OhV;�!
�}�>0E�y���X���+��hd�L���Q�D�����$�c�v1�w�e�Q	�-����>��������Qg�1&Vu��
��
��N��w��&�}�JSG�hQq\7���"T�X��'aNhRu|4����G��#����u,������OZ�Q=K��u$����g����h���M(	�������C?��:���{>�p�A%w���*�����Pm9%O�TL���KhI|X1�;)��)Y��!��fuOlafR����X�����m����EKRr#l�Q���n�U�j��������I���v5*B�<�z6�-��D�Q-�-����������J8��"t*���������$�X������{�97Y#�s0p�H�h����6����}WWW#W�w�$�wUA����{�>{���H�[�������B�pY����F�k�p�h��?�/C��h����qO�f�Q7�Y�h���/�(���G;@
R��?��2U	xir�K��LE4N[�}��6Z���6���-uB40C��M�TZ����,eb&HJ�����%��=_9���O��lE����5O�����Gw 4�c�MJ��6�������!3\��Dj!�(2�x/�c-��Nz��+Tc���F_��������b�p�X��K�9#��
� �gp,?J��2��t�Q���B/�|Gt���9���l_�����!8R�.��C�\�h�!U�;vV�����J
"�kh��>�.Y��
��P����d��3[">���)��V4yp5Xh<4��J0���/5N���<������1$��O|"p�:�9�<S��
i�<p�Huf��#b��x��{��E�'��ul���w�|�)��!���L�l�gu47�,DU�aO��Y�T:'��KV��dB�N0l�'	O��`G�E=�hqDR"�B�	�����<��As�
E��*�����$�u�y�E���-R�9`��d�a���������n���������(���Z���6<�(3�u�_�T4�'\\DM|����0��U���p��=���H���l���F-����'��&����7P	E�0�EtS8����0�mV�6�)/����4��P4z9��MmD��*b��?`��MX�86��	�����r���	� ���l���������i���s�Y�����m<j���:�K%Na�-��5A$Z����?��z�!��n�8�pd��i���D��ie~fwj\F����}��]S�n+���|0������	��p�V~�;������H4�+�n�o���>�b�u��q�	G���W�%�F���8�S��Y�Qzzj����	����5����m5#�AL(�����L}���B�-��������Sli��	� E��}��#��
o+j�f���p��a�C,�*���v���Z��r��0�]|�h��+��p ��Y���VR���	������� ���-bX5K+���Jv�VUDp[��/��kG.��9i;+����b�L���}�h�(32Bh�r��UF��f�Q�az�9���M����� �����1N��p�f��]/����QYq8l!����6n�+:m7�ggc��s� 5jE��8�Q��l�����N5��6�d���'Z�eJ���a��3ez�)l�
h�f��&4~�
���	%���M7X�����q������g'����m�������gk�����e�g���d�EB6Z�;8�)a%{h���W,mm��Bp(����
k����)�5[��d�,���f���?��sx�o�
g��F:RmM[n�v	C�f[�!�
$Q��e4�����q(���>��&��$��P�@;��a]�m,�n[b�,��}6xl�q��`�^����=	Gyz�	0@�6E���W�(�M �I�L=�R5[@e��m�����8���Q,�{!����J8B��b���m��kBJVX��H�)�1����>F��J���������?bt���H#�n���L����$�����	�fI����>�u�kZG�G��
+��f�f�D��n�'��w�d�Ef��vP2��
��d����
��D�Y��t�U�oq�lmO$��BJ�����v����D����Y+�����2K���'����LI������W�|D4�8���~Js3�'t���UeK`/��?i��aH�����)xI%��	Q��M j%
��]h���+j�w�;�lF5��H��������8Nd�e��2�i���OPC�������l$v�
��lH��,��y�����0�l�3�[�%����`�b7{o��!i"�4"t��6�7�"EA7��V�|����S���0wV)��g���O"+���F��2�Q��I�����r����"�O@l MrL��t��(���O$m�����P�7*����Z���]+#�j��-��F��.�bFuwNA=��>L�J	/]�b������{z�[�>]F��u|�����b������X��0�^�uNF
����l�}H$��UM�%`M)K(���k�5	�?/�u���
���M��=0E��dn,	��}a� ��C�������%��}�������.(������Z�AR����uO;���OBql�Oi�3;H��q�2�F��3���<�*�2D��rj����N*j�v�$$��J�8����L���i*K��-�����)Zk��>��5@��9#�w��A��>_]8H��Y�:,��V�.8��JYc]H���������T*D��:R���|��z��kr���cg_���Z������b��d�����&_���QX���mi�K�^�H���������.�lu���X%������T�����r�8`,���z�]�������6�����9"cw�G�1��+������1��x'��:^���-G�#�<��"�*��#uvF^{1A�9vt1�y+d$�mwA!'"'v� �/i��A��qT�5}(��g������	i}�#=�
�w����/���xL:F�
�Y�3������=�;)�mXH!1��=��}a;�S�������Cug�V�!DeA�^
gv���$�z�c������<�-'�!|#�C��t���4��:p�rb8�B����C8G�9 BU�����r{}��]!��~��+��bM��VQa>l�DC8'(dG�!�cD
�a�de���i�s8�;Z�����]"���.�����0�Q�-��L�L��*�v4���#�n86O��-<@�2������#��jn������h���F3�r���6�%<%e�dY�R���8�0(t��������!�bE�cC(Z�u�����F7+tX
I����~�H�F��2�b>�|L���#��;���,�{��z}�%�FK�@	uEIA(8���o��s��t�8�(c�
a�W"j�����w�]Y�?>m~7�H;�F�z��{wO�g�y?�����U�F0
�gXR3"3�a�9�uOwF��hsC��`�X�c������E���P#������1��0�1�W����������]"aiq�?�
="�
�og���^GK
���(�Yqd�`���
m�-��ex<c2�E��O�����2�M	��^�0�P�1X����g��M�m��.�!*���g;A������Pek�&%��3����,�����~��������w������/�/l������e������J�]�|�������g<@���>�g�#����q���X�[��{���0d��}���$��J��`��p;��#{��P��������
���	��~�@ }��q�?�������`�u�+p�5�������}+��]����f�`�,-xf@�)�1'��Lq�D�x��)J��]D�b>�1������b��Oc
E`Wir���kq#;7Z���������p����|~���Q��_@�2pF����i>���_^Q�1m���%���d8?D�����>�E��'���p���o��N�2E��4��>9����yg�5D����[�9+�d�<��3�������6�e����zI���
�����;!BD_�`�?�!s���	U`�E9Tz*������]���z�}B����������
(>����R7��O��dg51	�'g�'�����J���k��yD���(0T���(4%A��.��0�����G��)��d�����B��l��[��!a��*�pT]N�7!����}��$�}���Y�=-����3���D#F����v�[�7��l����t��d��0h�T
Q�hZ�>�d�A8�@l���2�y���)�
�BY����W��"V����
�x�cl�����GR�)�!����g�L���������>����k
r�h�c���k
i��@��)K��Sh���w~��	S�C�,U�p�<�'%�S�<�Bd������S8D�2m�tO��n���W����.$�~p�gN7IJ�HL;?�'tp�$�E ��2'T���0���4P_8�tz��Z#@���Q}���5%�
���)DB�M"�~:���K��II������d���w�ef�sY��)��(�i���d:!���6Nl�zt!m�x��][zDE�eC�m1&k��M�K�E���d�~~�)�~���rn�c!�s��D��-g�0(,Y!h�/�����T�h]���8�D����S��jU�f���X�S�W�&'[�^�[)��j�2�5�I@�����i�(�|��8{G4�y��0��>\�%eU�0����f��)��dk��Vm&���+n��/��.z�6�����,3��B.�sB��-�v������� ��uB�K����(�h�5.��@�e}����d�[���S; *����H6���e�(V��]��y�`E������Z��� ���mK��%H�����K���K���)�Q"���z���[��m�"����?��I���E=�%tC����y�OL����0
�g��Y��h�	��Qa����G7�n�L��K��edQ��1
���S��������������r�z��e��.����4\q�Z����`Up�=��b���$lY��I�>��]���������vvt����]��
GT6�fAI��W��?zO�&T-E����f��S.����2��'���4��h��'����}�'����*"r�YF#�e �<��������	,Z�R�/h�
<s��&/>���g�t{m��@��h��z����<����@���D�Fc#ZWL��=!z�l��c^��lA�=,8m���{��:����	U���_
����UTRD$�Y,0���kX���-��$�}�P�%|�a���eK������(u�m�f�^.V�MZ�c���K(Ei����t�S�'+N��H����S�	e.zR�(d�4�$e����:��V�lg��C���$z0�k�"|Mt+^��'�h�kZm����5S�y	��W��c)k�i��l�f��$�"�Z�Q@9�t'��KY���o��������h�~��SfY�:�C��n��g��Y����X?�{��,�e-�p����E�l���b����omS;��,x�S_�O^�X��2��>�\e��G/��/a�����[-�
8US��������M@�*����L���l]tL�HeE}f���>LA0W�d����m�B��-V�������3�B:�1�:V�\���V��7e/&����!��X���F�[o��y�H�2��:����d2� �f$���d�{��W�.�2���F@�~LI��{��V\[x�>G�����^,y�1�]�"�����	�#��n�w����!Rktm�mW���h7���H���#��^q�#F�_���,(p��)����������oV��W���$o�/TGO�p�t�_`��S����\t�gEK���BN�.������6�&-G��
'���h��`?�r����e;5��-�1��6��L����������j$�d�a{�}{�"�h��Q9��� G��-"aj�������>jL��'[����G�]?g2�(#��D��{�������{��:���v�a�����[��U2������Aq-�T�������4��p�_"������[L����-��,�V��N�L�z���w��S�����N�3��&m%��Sa�$��K��,-�B9Z�w����s�k��
��z�4n�O��Q�6���v�M���GG�����hy�Y�y�@*�������
l�4Z?�E����nd��-Lc���q�v��
��Y,�N��-��^4����������V�S�*c����(W3�����p�6�5�.a�j�s�������l_��������8��m	9�nK�4yzy��,�h������P��2�.��Y�2$������~�8
���eQT�Y{�N@��p�\H�F�.���;V&���52V��A�Vh2/L�wl�
s��wd���L�?O����G:�m?(��D���l�Y��EAN�1�ol��si�Q�t����[�M(4�{���5s{�F��m��I���<�OT���A^d�6Q G�~���?�����'g����<.pXq�LG�]h��L����Q�z�����
Dxg��s&������({0�?0�����v���h��}�;�'{�>����H5���!G��-�Y�D��>�O	���[�+Rd���y�d!��r�A���6�U�*|WHn;�<f�����d�)]
�^v	U~g:h���u��}�X�V�ch�>3{��Id;��q�w�����D9��}�mEB�^S�@��JJJ�>6���	~W�5�M�z)j\A��F��L����G�2��&���Xn��#n�)V���|1��O�/^v��v���V�S�3P����������d�>�0���T�G [��"�X����)��px'�X���#(���@�*��pe@)�5�Z��8i��Bj���G��.���#�8����$�fe�1���v��Z?�+X�a-fy���7��3U�J�����A�c����q$w���R`<��������1�u����2ck�����pl��pX!��h]�>\)�M�g)��>���n��`{��/Q���@�V1FL�;�+��&3�?�T�	�U�gsFp�*j�,����$���u�`~�WKJb<�]���	�(��G(�����������uQt�=@c{�b��i��A:{D��uZ��9�N#���mU�9���o���<�N$??�2x��>�~��K*�:�-N��
��#��PU��.��+�h�
����Ny�`�%�'�b���hD�����j8xQ���@��P�f���Z�;By�}���]-�H�%��.�5Ca�w�Y��E��c��C2C��0�VX	�������[��.�Z�������Ygb��X�������p�[rv�e�J���;�.2���O@�=���wc�O�/�Y�A�-���*F$�>'(�I��6`g���A	�D5qw�����6���'8
��,��8�#>r�n��Y�V���}�cCx�>ec���r��Z/��@A�����V�Z�N�x�i����qIk�%*�b;�r8�� ���$8�����8�";H�?�'a�J�j������:K��D:�0��%��AZ�����Pk���^CT�#z��s��8�X����oz�ja��r�
6��B^�&:��W�F/W8���w�;���;6K=!e���������,���@�s��m%%��z��������Rja�� ��5��JP�-Rh��G��/z���JxC���C;�������kh�K8� �L��S��<_	�����)_:����}[g8$a����{
W�M����������L\?i6'�4�����
�=]��������.���9�>�WK����lV���0�;r�������;\�l���f�!��QE�l�0� �.�C�}����[Y����%��{
k&p��a��;������8y(Y�Px/$�+�R�A�d�|P�&B�pvX,'��w�t:OX�������l��M��y��b���^C�]6��hQ������U~�I��;\�V���DR�E��Wh�f�b�@�d��C��������PM�!� �s�����G����[���
8$;��A�P�sd5��)���E���ifw����7zl��GL��BB���)im�d�0��'��f�#z/�8\��5���Qg�R=R�d��d�f��0l[k��#5���f���o����
�O����X���]H�������lG�hp*:�
vh��D��w��������L�����O��J7o�f��5T�)e=z�$�C��%#+{��$�O���#5�����=[v���|'����_��R�l{1��bh���� ?=�
�+�9�����M�"��;���p������8i��)�3�����l�A��P���}�"���"P
��!�������@e1|�D�����J<C�	�"P<�H:?�W'���X�0���	�u�����~�g���d��}��$�W���a��i>�.��Z���8��TV	X'� �����0���m�;\(lv�q��u_~�����7��V���m�E��U/|�8-r���a���Qr��<���h2��E���Xa����bp����U,Q���X�@\%�{��E`B?p����(B$`�����W6��������yGM�R�a�xlqX��Dv����.E�*�"�DJ��,x���
�,Y
�5�a8���y�FuavA�W�����)�����"�9����Q��	*���"��e��k��J�f4��`(D��HN�L�c���T��^cr{t������;d)D�Q�Vj��/#�2������%l�2B��U���'���)e\;4E�\���*U"�����}�*%�G�^�*F/n��4Yd����ha���4�
 �����^�4��j���"�j�.z�j��k;�a��YAp��h�!�b���\������^��
�P��7.X#��B4�:����m�"T#��]�k�9��@�^Xe�-2���]�Fq��3������L������0�P�������.��C�[�f��Z���tB"�����Q����[�rA��������������E��c���#.�{
S�y�gjv�&��s����P���v^x}%;YZ!c�'E,�Pb�!����xbE�G�B�W�p����`�xi�5$<���>e��!Z�	�\zS�������d82��nC�����e9�Q��L���1:fD�D�Fx��AA�t�#���f2����
���V�5h���1�����e���#n�^�p6�icd��D8_q�E��OA-�������W����-6�hjh�^G^w��gM&!��8����"T�4�C�h��Ut�jp������d��n��Y�0)�>P����*�o�y(q [Lr�9��WR�Z����GH`���=���[���3�d�
=��A� -�g0�����;P(�6�gSP��v@�+��);��h�����F��-��������3#���P����$b���V}���>k�b� �c���&Y��������iV{@��;�m�>��N��vF(o]U�G�'b��u����
�}��X��U�������d���v��S���x?��i�n�<��{���U H�e��:������b����G��w�{��9f Ya�O�JD������c'�+�.�C-��-��C@�P�gg�j8�X
l��]�
��;��V :$����~��[8���Y�}��,z6�aq��4t���Ml�V�b,h�+�(��U�_��Y�����g6���;5��iG5��U�pC������W�0��i�hs�A7��3zQ�^v�/e@
��o1
hY��iq5$[��6�f���	�8b��D��:��G�s��	;`|���2G��*�b(l��1��
�������o����z���&�#�*��yQ
Z�@V�)��[�HO ���TP4S4q�����V�X����l�.C�>S�Sl�yD�������,V���N���5�0X�V�Y��L���#&#D�C��j�������1U�5F��9F�8�\�U�V�������=�g��:+p�/SR�h�<��ji����y������)4�������3(�?��M������"Z����{F�h��� �*�"6A��X�����j#w����v���������y����j��EH,��6A�P
:I+�u� D�S������(��}�3��
�����3J�&�B0������We����:>�C�1*����0����lf��sz���|8�v����n�_�w
�?������@vX�A2"t��Ue#{���D�zS���@�����BZ�:�`���*�qR���O��)3��W�&����?Z���"B-)@��2����z���r��NFB&8�0������@	�����|-���_%l*��I������7�`Ps��'��yG�d�h���4cc�:���������;�R�>�(>q$����g��=dGE����B,����u�_0��:�,�h=��5K2����Q��P����:������0i`5�X�@M?K��f
�R
S{�����E$K#���	�bM�a�j�"�E)@MN|qt�i%���;2jI<1�sIA�*������G@2$�
�"q>��#<B9����"4���:8���D����3�-r0k�O�i��x#�t5��VT�6�k���$���lQ��{�?G�q��	���r�&��P�ukD|���eD�&�DZ�!vIf�_�>��2b:OZ�6��|F�������8�����a�j�q�&?gG6n������Te�t��������E�����T�z�$9#��	���F���M�G��'!$?��/�~��P�	EF�O�^��dhF�_�C8z6��4��K��U�E��f(c>n�ALE���������8���S��n�5c�5�1�M�ant�N��v#�"{`B5V�!���/*�Y��p����#������4�74������Y�}q����5����c�������{���?��k<2�
��W�6����#=�������C"���\��t�y��K�{�?F�����]C��j�6�^�6��
O�{�*����d��5
�q��
�/ �����TjY����q<Q5 �"�p�+:���F���x���k�f��M�5���Hs:�E��Qg��)
�5�����`���_+�8��r�M4������iU�%y�;G��/,�����	z�k]������)����N?u\g��{����+G�'���%��J�JF:���*���zC�c�U&��H�Z��D�h��D-���T���g�?�_�}��e�l�J,A�IX��
��p�������0
"X�	|@�
�0��Q0���#h�F�M�"z���������� �)�N�A�r��
��]t�X�0��9!�n������.��E�A����Ix�5�gT����O����M5]D�t��Y�QA�������d�g����8�b�������A:tF<�^�c�Y+���T�0��?���C���5�������6z��w'O4�M�\�w��5�������]�[���c��������&{5G$Z=��������[�K�X�����#�w!�6I����'G��.xaa:������v���-��~���P�t���Ya�4O?��h�J���O��Qg��g��~�N��8�g��������H��hj�gn�^�[��{3�?�����@.�:�;t���������	��?'�	��.+���D�����s�1���\��-�f��d=��OP����F]��������������W>�g��3k���u�PyGPf�H���1N�����a��-n�a��>O���u���L��������E�t�
+�ugdcnA�] CX��?���!�L���B�DPZG�=-�����h&���&�P�H��=�@��d����)���6�II�]�����	���#���*EHJX%:�vuO�e]�Az
�$k��35K��iJ�����B����v�8�`��v�[J����Q)fY�S�=�[�{�����4r�;�"�P��J[��)�Q�/��u[��x�7?�i��ID����-v`=�8�e��p�Lj��1Pq���O�J�;�"��jj�v��->��5���4���B�|m���K�~�&����s%3#�~��z]M�Ftu�jsp��-5���$��'\�`C�5�p:��)�)\�p"@7�����lV;Ng��g$!�;���%7l�����D5���yB���o@�R#p
��q-���!P`D�ag��)i]�BA-*G�s~_�Zp����!@`<n>��,5`����XGq����b�i99E�C�2H�F?�C8���J��%~�e�����\;����5I�P��y�;,W��Gv��v����r0cV?�SG�Q���������K�w0�Y�z�]��
������L�'���x�t&��n� 4��L <����R��!`=�F��Re������
En3C��D�����R}ER�~D��f���iRt��o�s�F�.����#J�D�Qv����~q�����(t ��a�m��YQ�;l����v��Rs���}����#�IrM�r�NE��!`�2�YC���}�DJ����Th1�L��/:-�a�T~�gh�@�j���4lq�-�@����<�5Qsn�y��'%,m�+�p����M����P)&y�Q�p���`��Lb����2+��=Z����8�MjN?��t2C�3�?-B���p�Z����c�)�4����o��LQ��������qQ�^����v�P���%<������D�!e�\G���=���=
���'3�n����1� ��NC
���b�����������g<L9GU��0��/Q�z,s���i2���>����l������dms��������
�{�!H/�4t�P\r���!<���?��a��5�.��T�����O��Z�����_���Hp?
�ym���Z��z�gf�ll���3�a����f���=�B�����Zj�:�K������l�V�u*z���w��^J�w���9�-��I��L��x)[�i��d��,
��~�N����a��e���;���<�i�C$���)`��>-�����.-x�8?��}t����^F2���6���Z�B>�����[5�G��i��un��
�JcN�r��e6�mpq���"B�jp�U����@�q����s�?I{����B-Y������WQG��)�`�������p
A����Hh	����j����� ���'bV�l�Z)��pH��i@��~t&������~�$�I������OsA6��@f�����������\���is�bE�&5g��2���PDD���o**�����������/�}�b3q����3����9mQ���`�.�Y�}�����Dx���1.L�g�M��T�O�C�^a�B-�������������D�h>��s���)p�E��)4�@����3C����H�;�&(YIe���P#��vy���/G&,��(db�)0�����}w��<+x%��S o���;s���v�c���=-���[�����X�l�oo*3����c
��r?V�a��"�?��g�����D>�~������(lm���ih��M��M���;�<�V�����*<�:���9��V\����W��B���;�M�	�M�gbT�
l�L�	�	�$^Q�oZL0>/���z
O�>��~HJz�f�FO�	wzS�+��~�d_l����utW��,�w��,���cZ#����tNn��fO�X������� �A���d6�=Z5�`D�OC��i+Z?l^��'�+�-L��P�B�?�^��as�8�
�PF����,�������:7e������i�y@�������"�8Z �l$2�c?�,m��=��VQ�U�Rw]���F�i��%`��R��p�*J|�Z�������dy��nG�5�W�wk�
bg��!&v�a{��~y0n9w!:�����+z�T��Qd�m�1�"[�,�"�ZZ�����B����������_�O����B$�p=N�j�6n�:���l��AxG*
��'5+_�%N���G����8����y���]�S]�H�N��d��U|�E�W����p���}�6�U��;�YF.����=����*���<[�'X���0��d���t�s�V�����!g�Uj6�IQ���~���n�.�l.adnd1K��83��CU}��.[���}	� ��e���� �	aM�/���E��j�t-3$� 5p���2d�����h�b��~6E��h�5sB_�2��A`Q������Mn��o%w�����j��WQ���FD�vJ�c/�	����M��������)������}H�u���������
�J��P3�VX���m51��U��>�����6gL�A9�������3��[��K<�~D��8hG6����#�����c��hE���N�9���B"&���=�����G������#^���+K�Z�E���������=,'1�7v���,bO,�,�gPVT�;���3/y�iG�'M)Y���������������l��Z����@��z������i-���w��W��]������#n!�X� ���F�;h���
��o��#��9���3���V�%�<�c�r-7��A�"*����2
��xE�%�>g
�d�������K�����;�Q[N���9q%��d-b&c��m�h���1kN�&$-�lu���4����Z�ro���
/ap��v�l��5|�j%O$�M�B�X��_������+�L��0�k	���|Gz�%tn	��������O�`Y�40>�_}t��
����cn�w~D
��P��z6���Me�.!Y�$��Dt��\��_����<k[LA6ik���?x"��\1#n�����-O��������N��w�la0Y�3U�~�f7�m��=<����Xd�����Q�W����V��X�S�t`��}\���4#��1�C[+*�w)?�<����*��r��Z������
�����6`q �	]�
��"�q��4b��C��zS����zoD������ �7��Q�w�
P��i6Z����gX�����,a��������}���e4����������E����`��l��;������P�(�_U�5Y(v2=�
�����o�2?�OG���������l��}��1��
�m�%,s��Q������A�v�,����:�w��ri�g.`�PUL����@���l��������F��b�G�/�������p�
*d?_���t��w��z��P�:���s['���qQf���=��+��m
+��:�:�@��j����W�E��MI	�q�o�)�G�!�4=z��,�l[@��#8l.��hN�8w1�~���&$� kflG*�/|�j:�����B�;f'Zk%n�1������s�� l�@��s��G����DSe�����@�Ev��������/�������^?��O&
d��jO��:����#>|ZA�GD'�j$��F�{�R
�;R]�Z Mym6*��p7hQ��^��@���f��KWhf4�4�����U�A��S2�NLY9�mb}��^�]���#��$T|�0$�YSp[�_q�#��
��F���$�v��s�]���1Np�_��]���Z���6U�`T�����TEK.l��6��{���8��2
Q�m�`hw�+N4Z |�.���A���8���9g[�}�,W��?3��>��y4H�4��:�����#���S��>����|dG`dU\������M�c��q.�t�4���<�Y'/�L����;jp���y�����a�)�<>�����!�]B
j�>�k���Ge��
�c����3�,A�=S��Y6�@��B�>DQ�~���-�<%��D�S�1
�����K����q������
~;����x)�8��g�&c-6��r;���	���Y���<���8��.��w���cX��s���"o����O5�.@q�zF4<��5�����bp����Bt�8�l��^G8)���V�qh3<y���,g��	�jj+v�L�G$��c�M��\���4��,bS�/�96�8vH�x<>���
<�2��q����A|NYb���\��s�.j��m�� ��;������G��T�;��M��P)��Ne&�����N��3U�� @���D������S�HF
$�w��>�MThN#��8�oN��������}��X�G�>�b6?9�@��`���d#��D��3��g��uu�,<)i���q=b�L��0���6|���T�9P�g4��\�E7�rTD#����6�J�EX�z�8�Xt�*����V���l���`�,���D��������eg~��#N�m\ +G�*�.DF`;�OQEg<s]8DT�c�%I���m���#H�$F�E<�	8��Z�����H�YM�������d)�A�p2�T��U�PGg$���Z�1���t�b�*��c�y"8!�����)A�6��(���$ �^���LO�#���������8{��F�!�������u���,e���A��8C ���E�-�B��������]H^X>�7m�
��h�����q�v8���#����9�/���6����`?��*(���{D.|��,�
��w���������k��zI�3x^�h���?5�=�DB��:����f�����������+���w�[�:�[�<�@��:��`�|t~:���X�p��h	ctVBR�;�j�(i|G�ED�|�$#G�m������?�?��Q������6>�[4�;/�q��BJ����6e�������������HY��w�d����"$�}��Z�3����:�\���&}����\F�-tG�{�k�C�@�^U������H���;h�P�T�HI����[&a��V�3��/E�G/���X��Gc�P}&���
�g�:/���<������G��Mvk��W���	_�b���T�A�g�����"^,�K�:�����U���3��o��Q��Lg"=z/��.��C`7^�8q=i��r`��>M��w��/%�����&�A>�fw�~�YM����l�����Ci��Fv3Z�����7��Q�c,M��$����>,�b�;�~H���%LT��%4���	����]�k��T��^C 
^�0l����2�)dI������H��%5���@"��M`�S�Cw���`�n����"��C�E[#�#{�T��������nE���5L����yu�h��P�A4���~�N�_e����z����b$f/�5��
dg��%=�����A@:�(��5����#!���I��p���
Z��%(�{	�+��pA�^���fmp���F<���4����Y%x��Z�Y�v�{
5V@W�JY��Z ���)�D�%��wd�U��&��wt5�+H4R�[��7n{�p�u�:){T���5V!���O�\�.���������7�0��P""�{!�S��	��>		q���(�	���62�� ��������}u�G�M�%���A� z��W���$1��I9��a"��nk	���H����g��0B�JV/8�������|���q�6/_"u2�����P�t{��=��.��T{h������=��]�(��%���h���ofBuG��B�6~���O����AfO�n��_���\H��3��#��.B1`��x�*vO�{vq�����o�X*�9-w�9&<�w�N���YJ�U����jQ���j�"pDS|a���7�>'	"��]l���4
�k7��C��%OG7j����d;f.�evqfC��!$"��h[������}>���I\����I�
����K���Z����2�@j����@�w��U��5�>����\��^���7�K��.B#H�u�)��0��# j��M������+�8�.���R�����`R_.o�T	���vL�v�	��h�$�},y��=z�6O�����	��F�W�N3��IT���b�I�&)�Anhx$��bD��"��d;�s����g)5��AD�C��D��c�/Y���?�P��B*��
�"��o���W�h�=��l&mb��+����8o}������N�	��k'���d����������d��_��b	GPovO����O��M= ����������p`��na������(�#M�Y���;�n��u6G��Tq���;��jS���-����r��e��*����q�DJ�gD���p��DtDM�"����[��!e�!�;����&J�����|��`�-"n�	YvL�O�}����Z����� E�@P����+l=��o�:f�C6+?�C4�1
��H����xglQ�T��(��������*����:��������i�w1k�$f�������q��.��I+4�b���qE@2�v?uS�ZKH�����d4���wD`-6H���\+���%�{!F�K�����.B�S�#��]��[�����h�yY�X��A�'�������e��O�C[{�]��ofD�tuP4.���5p�CNj��e��O��*���fp����Z(�����M�������9j���shA������m�A�4H�J�� �=����pO�{v��"$Y���hW!	�����HQ��T!M�V����b���a�i����0��kDA��'�n�]]#e�{
�0�����<���eF->c$�c-nG/Nh�T�i��
9d/ZhC�O����.U�|4�}wT�U�0(����6�"U��xN*~e�cHAL���&��W��R��k��v5����N�(�zWaJ��V(�@G��j�!j�V�-E�X��;�������YXf�r�s.�JGt�����]�
�"7��$�o�aH�--;�V';���> �:c3t>d�k�GBxKyH��$���(�A"Qo����)	� ���8\�~�� UtY���P��g�����4���f������\�Z5�*�4Jdh�W��m��6T�x���������u3GO��u�9�XP�"=���F��*��\��
UhC��.�<�r;�1VC����K�l���6A�
T<%���ixK��H���8W���p���)"|��H��f@����*����T\�KY9h��yVtV N��>�{�F���~P�
\(V�E#m��
��m�d��D��T�C���I�!�k�`��P�R�H��-��V��ZH��w� ��*�S4\S
,b�AN]��n�H��~�B��. ���V+N�^NAD]�
�����������FJ�SaZ�n�-���)ag�T��lu�B=���
�6*��	[h���;pL3 �Jv����+��Gj]��M%�=O��:��I�������,�����k����7L�E4h�@���z�1�'����%dfx@2p����M��VU+B{�a�h�6!���	2�%I���j�B�e
�����5:d7�7�����A}~?��kB�8?��G�l�D��D>�$�Q
�������������.����X�c;�&����Zf��Lu�#�ES��j�J�<�i�n�RV��m��������M9eA	��#�;4���A��_l.�'��O������:�F�Yo5��%�Kd?��������r���	�T[Mm�L!.��B��"��
=<�h���G����P�L��>�.�G3X0��!��\6�Q����S(1F6m�8����'LC)z��������g��C3vPS���j��eJg�,=���	sXDX����?���(1��	K��R���Un��F�����!��G)�FD�m�xp��
���K���g^z���u���������d��P6S���Vps�����6q��9��9���=�d��&@!+� �����[��3����������m{i�e�.Ibn�����0�����	I����B�p�Zh�"�I^5]�v�}5ulX@����$��%4�h�//���+4�M�0re��gN�X�)����LRTQ���^7�6�4q�]$3jesB42la�������^pX!�B)RP5�'a��,�4ab�EDA����bm����j�h���,�i#�S[��F��s�F����-�pc�6�6"��-m�N����D���B1�{����1���b�Cjtr���h|O�V�m#��|�����D�P|�';�pB3{��-o�,�	p)��-_�*�4{��!�w�?�h�����:,�Tw�g�P���uVd%�,n����a�g�����]��HYO��l"�@�����V��Gn� �]c�d�Rf�+�8A�����;� ���Cf_��Ep�E��$�����T������hP�L��^Y�0�#����O�Z���;��}
$�h���(�z���&`��!���/��Vm���H]ax`�������qd���ND*�.L�T���@�R���^���h�s��Q��=C���J�K�C%����65z���EN��r������u��@
v��z�P�)#�� ����sF���nk*�f���5�!R�z��;�!���/v7�����C�w�w�������#
��1H��%`�k8�!"u���e	�k���j���M�j����.0b�O�0��i�����(-����z����t �")B�`AI@z b��!0��|��)�<knqlM��v�7�Y<#D����0��vgF�C�}"P���Q�T��k7ihtg�5���@�j��t
in�ZG]H2������~I�
�OH A��>
��.����?��H����s��G�N>���,������
�'W��}����ec*�#z��N��DON@y����/�"�2K�������6���k��;y)4_X~�E�y
���H�wJ�����x�s� ���mo'F�]��#:���EL����k�6����r
��I��|��J���w"F�1��I���H��3�q���5�af�����ZD�V�������;�>N�~
�����o=��O����[���y�G��3k�����aO7?"���pj��~����hq��w�fyv+1�����-�N��#I;��Ql����T�����@�{��y��c��	�@��5���V��Q����E�Mx��!Z��d����Q&��F3D2�^��x� �6l����'��B��h���
��s�]�=�Yb�"�]��#�����BM
�$�1va�vh�+��w�Q�y�+M�5MX��Mi4If��B��������1���(���, ��6V�D��)������\�=�@d��!��-�M(;�	����������5�"�EmR��
f-����5�vT�G.`���!�v:�8� �G��6R���f�a���C�D������!0��\E7�m���\�RmX)G#W���
	vd�;�������}3�aS�z������:qXA�t�P�h�?gl@1�3T�Y_1{��?�O��*����G�vc8��F=�a�#`=����>��&�v���H����������eD�!be��Y}�����}c��!9�[p=�!�������*��J����T��J�f\��Z���V�Ge���4�u �b�}�F��L����i��g���!���@n�.!>q�$UBhi�2�-����8JdD��a�C$B�����n���m��E���#�B����������-�V4L�F
�!��e�e�p�G7����_�A�]����*
�s7`�u2���������V(|:%��]�%��h6
N�Qn;�l��R�%M��V�V��E=�!'=p�����8*�#w����@�Ha��E��.��eh_mJ��&e3���m������m/�.���X�$�,;�	#
��p#���R�pvC��_2h�4b�j?����W�.#Z��}RG�s'A*�vap,F��<)pd��M�=qwu�u�9�4���7$�d��2l�D�}�M�p�)����F�]x�2�*�u��-j������v	����us�h�
K��N����
�	w���,I���S�?x���F2)���%��c9�Afv��)������f89:
�P���+����N&jv3�*&�l��"�#����>��8����\������gV��h�o��u6��H�OZ8��%��9%[��M����O��Z��A��5��%2��i�nAo�+�#6:�OD��45�n�99La0�X!I���S�9�J^�N,�1*���� (#�iZ.qw���������u9h4���>���4Qwf
�XP	2A0D�G�9N�@DU�t1��xvDL!"XG�%��,�KOJ�YL/^���t3��f��H�7�����?��f�<M����N�:D�Q�VZ�%�� ��3���w=�n]���"�b�t��rH�U�Z��=8�&ZF5e�M�&�ya�B�K������G��ln�=)+~���>�,Ne~���u
�`5��*�)�0����CW4��Fy ��ek�P
��j�~��*6d������h�S������h��.���FSD�D�<�n�%;n�9WY$q%�+��6E�)���;�YgQ��`�~��U"A�,AHj���l
� �E������>,����]`:�Ag��nG�9��hb9s��C�	��6�-�� ?�KdNGSH�v���"#}����������S�C�0��S.\!S4P�
����E
�&~4����m?v�X����@�������e�R��J����l��n��� e��)� <RN7m�[S���eu�pX%����I��L	�����.�F���?
v�n��P�;�@�6��L�m�
�)��x��
�_?p��;��]n���i�`S�&i���GS�-�D�����.���:��HT4R�X��!�S������l����7�����	1��j��d4�>����f��::��O[$A�i�=��f~S��k(�3+l�������uv�-�� �����?M;�><�Q���$���}*B����C�����4	'���2U����%�q-�������|7�[.u�W�-�4��a*3B���2���r7���gj.���'M��4&�^���T����c@	`�;}F������3���|(���������J����
Q�l���R���
��X6m�h5Z�(�$�����������/���(�jc�����3���Z�Y`���
=��r�B�4��1��R���]G�yD�Y�( 1o_lE&&]j�c���@��\n�Gr�U��e�3(�E�uDYcA��3(T=b�-u����`q���.�8s>���v4��3*��_Q��V@��l���k�j��oo	#�S������p!���_9���G�`}����YbD�R+�e� �u�PbZt�X����r?���G�����
�{�UZ�@��:V���%�<��w�-�.���mqF
^$���P�f������4��4��������v:Y���x�"�w	(Oq�d�wO����@2�[����
H���s��H�'�~X���,�e#z>���b�Y���O�p_�H�vD���4@�j�=9D%��
�1�&�w_p������M�:yH�l��|�k�W�iP��`���]���k�gy�K\xL����\��0��,�e��@�W5��* ����F������]�����a)S�,k�t�w���j�
=�&�(��$D'��Z�>��D��XoD���l�*�T4��\v�ot�BP�fz���,|V�� ���'���=L��-iYcN����>,>+��%�I����(��$e�C+X��_�[xb5�\����.a@���!�OKpA�z�T���%h��2]&x�Z�����#���L�B\�n�NcG���,�MvD����W?Pj��pJ�A��[��j%������H�Jt\�N|�`6�E�XO+%j���
]�����G���xi�@u�:��Ow����%c���E�1#VU�.3�m$kVr��NGg�������st���]X�$�Ds��N��t^[0B��Z[0����fvfk��,`�H��(�0����D��$k��P�Y��-8���E��@�������O5�gEe�.^� YF]�#:gG����A�������sx;:"�l�
�������%dD�At���v�l�U	�Y�d:�}D���������%��t�y���Qm� ��Q�j9�0�Q"8��L����s���W[�y ��k�J�F�����x*���:L�(�z;�92G�� ���Q�����aC�	U�#�����e�-��Ok���z"���!��������`w�G�<]�kh�EH��uf�����t�I�kx&��h�E�9�������W��Bi��p� ��@SZ���yC��1��������F��m_��!m���6G���|�2o���[p���SbV�i�QSw���T�F��Tc�?_����o���j�[��$���Y�s;P�e=�����nc��(s^xb1������~WG����X���
goF�����r�*-�]���
�e��4��Vq�w�bY�6�8o���+z�H�"����"�V�^�W4��j#C�D8=�1��YSG8��>1�������~^��W�	������
�7+H49
E�� ���2.�2}��$� Y{�f���)�H�n���m�r��Y�����������B.�j�d����8�>�S�#Yb�u�N!��<����e�d�_���-c8����w#lbE|�-0�w:�������Vn\"�6P!~v6R��[r��&)�n�)�_�cF�Q�js#��D��k6UY7�j��9�9a+S�m<G����9��e������>�|J������cC�[�Z��>��������0������<h�q�{E���/2�#�!�c�O�P|J���E�bh�}fI�p��L��}V�3��G����h�9������v�q�3������
H������,���(�	O�m�n-N�F�wlX�~�g)���/����GOc|�p?���z�D���p,x�y-�G8�Ar�|���yzK ���_4�hFU���D�N3Cu�"��q0tt9B-v��:V=Dv	G8�rv�j��(+$`����;������@��}�����9� (�u}�)�zF�4Nrd��,�	G�I4��'����/D��p	�M�W	$#��D��#���>���TBQpy��m�w=�n���(4BZi�Q[�tkg�O���3u��e�'���YR��#����3#g���f
����o��{�c�
K}4��d�p;���V����|F~>}��Oa�$Y�P�OT\"��?%�@�����D�\�A��L���NA�#�aG0�q���]�+��l�����Sit�%�ek��4H8N�����@{G.�9w�\Y�`��]��.�����~�}{Lr�%fN�G(C&V8���h������`��r:l�I����W��6|g������r�4i����G��c<�#%����5|%�U��	����egSA�Oe�G���L�)�k�TV��_���	���HAO�Q~���mPPPf?[3��:u �=����6���r#�Hd|����}|��#A��0$�D����m��0�E���8�/�s�T�t�LE�e/���#����F�����X�p���A�O=�M^�����0��kGGS�g������X�tp����9a�r��^"�`d��0H#���������"����d�l��	N����_�AZ���w�*���$���C4T��u��	������b�M�#eq��H�����l�5(
���[g�)r��{��Y��d�c�#����v�;\��agY�Z��������I&����B�?��%�vI������'V�����^�����f�lI������6�h�����BGARR-J
{/4�v�A�����������kD�,K`��c������z�x1�}t��&��}\
�<6�
��V����q�_�~?[uz�����-t�R
�O<)�w�-�#�#��{��k������B:�ub�,
�d�2@N��5>�)�=���o����Q�����O�	��x�k�\c��s���A�>���AK�	�N(���'���V���;��4��~�e�@<�����H��qB��b���SDHD�������v�y^I�(~�5��s��x�)��.H>~O0r�~}.�w�[	~�{����bE���I��B�������Hc�fI����;{1�FP�����b����n3m0i�v��(����A2KV�'�
5���J������Ub��gQt�u��P���z��t�n��� ��m�]��vy��I�T�	����T)#��:�WpY���Z�KP�����lKa<�;���[f}�j\��'��n��2A��	Q�/&�m�Q�����@j���� ����;2�����bu���^��Y�@��R��
$0D_`w���-h���}��~�xP�b��/Ty*�/�.!#���np�N�w������TA�wQM����"���;��5��,�po�2�Y����.�n��|m����V��y/4���!�HM��D��p�+=�=�)�;�M��N*c���X[��U�	����i���R��1��tw������x/��/�Q
�5�������]�.j�i�L�d6|�~��� 6�����"��[pTye�����������?Z/����n�<����Sy&���}H�R.T��~������#[��h��G ��S�������|�A�^(�-��ak�H(%[���#��&a;ztl+b�����6[	�@8h�?�P�I����hE��1t�����5f����������/
w��v��8��EO-�F}9s���J��e��w��{1��-��,
d<5��)1>�D��J���go��P��)��S,�DB�S��T����z��(�0~�g�~gP%�����
I����hH�}t
4��t>-�8NN�v��*L{/����x�{Z��q�mh����\��J���$F��
�
C��j���������
��`���$<j�`yw3�D1� T�c���S2H�-��pS�Dp����_���=�v����"N1����F�������� 
��o#��I��)�����Me�����f��t���#�������T�O+`F6�N�����x�j=��a�c���P��79%��mm������?�;��'�\~����]D6N�g[8�(<�������W�b�x��B������b��H��"��.�2����"��1�*�O��!�	O�J��Y|�aO0���}�������8���=�.�6�D%����������^��G�7$�@���:Q���F�_�#�����X�	FM�f�&���l�����O��g����u+��KV������ud��X��6����������,@�D���%=~�TXR���_����+i��7R;5QD��c������^�Q��We�M����*Z �����BJ�3�'�S��?����T�L��E%pB��$u�m���#����������|6�hP����yGZ<���@������~����������Am�W��R(�JN�,��T���ymj�����v�Et��>�\�T���y�7t����+�k���>�?����4_�m�aH�t����*+�F���I3@�cM��~��?���J��-~u����ll�cA���O-a5�7�Q
��!
�Sk����������:�J��T7���O�f�V����'�;H[�6[�v1��'����O�9j�����Q��~]~���Y
������R�u��V����8&�t�;��k�����w��0d�T�rYP�OY't�H
h�����P���"fCE��GABh������{$+����wP���c�PZ�bg�'m0}����|L��	�u�p�����oW!�.�C���R%V!/�����zc�������~�U�����������J� C�j���>���f��j�I���b��-��#+Pd:��N��T����
L�y�r���,�v��	�3xp���8����A�o��Y�O�l�����=�r�#&I5�og�Mt��{��z��� E�@|�������3�g��2C{IR	T3�b+�%15;u��UD��N-_����b����~j����!UW\�N�����F���<��_������~k��vW�������a#��)5�
�RV#j1L�d����D2�g�t�UQ�&�={�����L����=R���E���]����x�������7�]D>�X�E@.��&��G�r�kr���UCX��r�b��sP�KT�'s����(���2����4o��K^2;C;(HS�C6�;(��	-/O5X��C)Y�����=���J�����{��k�{]����A��m������������A�	���h���w?���X_��7��hAF��/�HH�����k	F�|E~��O�%<�cl��'��������{�\w�DNh_0r�Rqv	L���v� hOPx�*���RS�O�l�3�C���.I>~m���F;_3R��N�O>���s��>�4#
��-��n�@:�����W2in���'<Z-,�p�[�M�lT������p�	i��/p���V��u��}Z��O��:5L���9��0"��ec>48����}'r\0U
����U����`�e�>�m�9)U�b�q��A������E*;���]f9�������!�v���������p�i������t��w$��}�JDF����/B{�9�)x���=�(��W�����pK��T8������^��a�����	/U�i;%%b����a���0Fl�!t}
F
$C�i� �b�SQ�]u{y�����!U:)�{O
��e�m�J����q6z����)�0jx����C��6����V0�
��c�vE�^��@���J|�!f'||!����M���@��]��O���{��48�]��tt�C�����SIxh:��8x�A��Y�Ey�����1��d��w��� �JKFA�;m��+�,{\�F�
�f��WrP������}��v���,�2�n2|�k$Y2�2
2����d}i�vQ���������VE��!�������=�.����uXg'�X���Y��O����������]U1N�(��E��7Q������6Kv'�(���D"W6^
b:4B����Y��%�������J����tDx�)�����6���`w�$[����fH�!-�'���KC�l5Z�
"�yA�=�DW�z���(�.�(��A�:�Ug��<6���(D�<�o��F�h �:MixG�"�}.��*F�Z~z@�0���)+FAP���F�.��F�+%\����c-m����hHJ����sV������dPS�nA���@�$�FDP����
+�����(��j/a�=��pf�N���4t��1��F7���>�2�����e���g�U�D���
w�	o}� f�(��Z��Q����%��k�XT��s,l�6"�a������!��q(Q���J���^��q�����6[��L�A!�HW��{�	S����C���<I�����xr��dJ�^�"/v��O:�d�A��+=V�������)��q���?�����K�ext��t@������^#^����(a�����8���+cU�t	C���+�CG�/���k�W�����k���o�b���c�N�&���?�{�t{�#�B�JH��?�E���As`���+U�uZJ�Yd���>���{�MR8��$�hH,�6l��T5����zRaZ���{�]��J~�	rz��$�c�f@�@�_&�������R����5�{b��G� y�/�n�TTk����lAQ������lR��b����� ���0���3=j�rMV ;d�������wd�(��Q�����D�a�X�hf�Xr~���=Q	��(j[�G�Whr�X���gZ(h�2�P�T_��\�O	��{p4�K�LN�LW���|g)kL
a7��nw�����p�q��2�`�U��%�~���Q���)��J�=?s�o�&����!kK���	<���
-��1����mC��Z������i>1��K�A�6���!�F�z,\U����X[���6��y��<��Zn�M��Qr*���H����K��+?46������RC��hoI�����p[$���G!�Y�"Dc��a
A�j/1�����\��=
�&A��M1?����z�b;�c9E�w��N�b�WWLFe��?:	��&z�#H�}��\^��w$)a�$K&��B��w
+���jc���pD�OX��^TEu�0�apY�&U�J�@�0��N�U��=b����h��r�'��z�&���&�#���[A�P�����;J��@�UZj�C�0����a�c��-�
A���4���HE���[��l�(��m�#8�� k&�HE�a?�*���&�5�5���7�0
D�IR�"kIj0�~7�:F8�oRJK��������^G]�!�D��-5�h�1�!�'�������a,C.~cF
x�u�"��N`DJ!]�=�m-�����
lV&�v|����u���q��
�W�T���:�?5\�#�@-� �x#j	�4�>�Q�-.G�����"���@�(ZL����:��3��aPcu�$���P�T��.�������_p�]>�x[�$U�����-���"���`����#�g��H���p�=^���o$=���6��)�R(�bT�|pB��w��-���:T�� ��d���������+����EOfl9��$-��u5��C�.�15B����U��X�x>d���h�f�����v�0��������FX4���U'�*�����2�V�$E�\���A7�:�Xl�bqw�O��/�h<��;�k�1P�}F8����#�)�u�zlV(�t���X���$��zZ�%��)�f����>tix�1�^��C]��r�S����<)M�\C��Il��1r"��C'	z�D%��V�D�?+�Y��eA����;chov$66b����Cvc.c�u0�4�jd�/��%�v��qc���`}�����U��{`��(�
�P��NAC��q���|��Bdw9�w�'5z'��9�#��&"|�8�%���J�����.��9�3/���F��8��*v��Z��u�;��b�w?�"c��=s����q����y/�@�������'/y�X���s&���q�aX�f�"����2�
3����h�.�P��4�1��>q��+�r�!�|"�.��],D3��2�m�4n1e,��i�BA,�`��e��(j������*�g����4S��x~.Ph����j�G��o{8���-��K��N�D�����������Ag�!�(��@wX���3	AP�4��g�~�)J��R~f�r�3��$�� %��Q��TM����
c���A����*���	Y��'V,R���*3[�0\�B�����l�Y�5�Ou&� %��O���O����a��V����h�U'���	������a�3����"d��%�.�h���
}�-P��D5Vg�q^�8����
+0��g���k0�~��f~!���z��z��a�d�~:��*�����
��D��@�5�N3��6�?�a����"zw%���"U"��4!E��GW0���J�/j���'�N�`S,s�0O�����_��f���gQ-��@*�9B	U'M�/�g7�Q����f�������������g�#V�Di�^r�"g�A.�[)r���f�A���y��4�����hX:���Og;U��h��B�$��aO�ShD���0i�����u�Vj�W�Z��l�^q�F_NR%���T��������C�hX~�#4!�.[,V�
��F����KX��ms}-���:��H�wW�I]:{�$Ix���J�b	�s����38�0h�l�J$5jvOCz�b�oV����l|%�e�P����:���{Iv�����.��_��n��Wr�auK|��v�>�?�M}��[(Q�������b���DC���!
�FH#�����yvNS+����7��D0�����u��DTv2�P�[��,�>�dO���/��}z$Y� B�Z�`CE:����n_we!�h=����_��� 6�s��c��~���>� Y��@�{X���e���X�|�����,B�����	 9�>�|��~������~DV���y0�;A���+!��[�$������U��v[UK�����{n+UK�]tX_���OML�."���A	���Q�����:^�g�PY�S]~�B��B�X���+z
��%;�+���#�KI�*'Y$�F������@U3�_5�(�A��@�U�d��x�`�2���}a(wGJ���435$]�����,���D!�����P*�QN����BQTj}����n��2J!3@���nV<�����p%��=A"�c��j��F��W�7���<jQ@�2j���Q
�*�$!+����c���(�W��"��n�
:QdN�S����-I�;�sJ�d��}���J>���f�b����0�A����6��
�u������a�2�P�lmP��@�P�t"!%�,����$q�[��eD7�2����O��w��?J���2��������P�TS��g���1�a7.C��W�fBK�����7��-��d3?-��"�.^(�d%E-!��n"�E�,?�GYI�^��K]�����S��C2���`�������q�J:�3�C��S�K�M��2u�]�-�����_+~&��6���X�cZ.EOf���b��"4m�/�v��R�]��=����HP��Q��X��&�F�@5�PR�S��Z�����
A��}��Q#��6/#�W���ME���Pj��Z��c����t\�~h%�Z1���z��d�|��Y�6�H�H���
$�0�.�X7*��>��[�	�<�DE��S�4���������U1n�xK�j�**c�t��C#�l���#��Nn���g}5�����mB�������^�m�(T��g�a����E'��i�����t�J[2#H~���-H2�Z���N
�v"�e�>���	�Lu����?�������������W��A�d>��"�����i����fss�����.�VoC����*����q����*
w���aZ��"�#`�����w@�)��;}����S8��m�]m�
u��a��m�A�g�az��aG!�T������������0H ��Yn!�zp�5��n� (q{���H9bH
���ERo#��k��N�v�.X�=�%%�B�����}-����AE��,B6�:j�Fu���
��*��e�=��e��5:�F7��� =n�
��AJ��*&2w�D���U�#k�����F�y����"��6����2
w��!T�hk�l��lu�Ve^<A�����0��x����'���>��b�������F$a��"M/5���+�����+e���%�����`��Met���-[8�[l;o���i��N���~�?B@�9�>�����h�b���'UF|�Vw��my[3�C�����]���������"�Pv�`Z����(���@�U�3��d���������-���85���D�!{:����[0c�=TYE�m��1�2o�`S�8h�D-�ra|;p���M��4Gv���}��-�_����z+���������Q��wgm��a�q�s�R��X��^Acgx�2��6��-�7���m3�22���2��nxGZ�$W���t�����1���R�%/{�qb�7���1����KL���a��9w����Jp���O
Y����g�2�w�	�Z8�`�%�53���T���CS����tP�,�N�w�8�M@��\�6�*�'�}�7�u��t�~�.9� #�)��J|��5N����<	��}Q�h�9�"�[5-[&Z4�<�r%���+g�����A����A2������T6��lZ���'����9�N�@T�S�����eZ�c��#��)�b���nP����m��4�u�]�(�c
j�Ia(�;��6���)���~���<���G�Fz�D��S�_KU��X�r�e��A�o�F#��5~����;/����������6��o���Slx�=U<4�&��|F������I�fZ���5h��S�@���V��	m��l)��i�����|��3�i:��\#�$B(��<������t���F���>�L~B�_��1w��d)�
��e��}����2K?���A��R���������>���vA[4.�6��Gz�
�h�<�X�IF5�N
��y��2sb������I�ch�t�_�+�e��FxY�����E�N`��U~'�
�����X�{By�
�HC��#z
�=E����d<`� �c@
�}*����}�L�������x~�U�Y���z���'�J�Q�0�cR�M������P��#�"s�3c��(��@���XUwG�Q���b{��K&�C�|��v
�63��_��3���=�c�D6�"�|�(�������u�`��_]R��5��s�QQo�*�k���M��#�v`7��LMDoteb�/`%���`�����0#���x���bd�.��i?h�5DpN��R
hImv�`���j�yvL�t2F���K�=;�\�Z�oY�1H����~K�Z���8�j���zs����(��$�Z�>Z>N����T4?�A#��1�`�|�+%�c
��)X���
kq`�8���)"������cta�A^��'Ul�8_�i$������1�01�>�A����$�K ���{!O����8Tv��wH�P��ps�������wx�u�|���,���0����w�-O�P;f)(��wdbZl)UJM']��X��������*)�������Hj&s��#+E�� o�������Y�:������������>���6�2qL�G���[4����I �#��UV��#�4�}w'�(���e\�=)M����#s{.��>�Uv��p`uuGz�����K�x
�@��������]�����B �|�%{���hLHr��-O�N��;������J�Pbtt����F���H,��PXG����j�w}����t�|�
mi����f�Aqb�����M������%qZ����%�deT2�,;����J
�����
��7
�#z�oH��^��@M�.��TH.�2���V���E�^#�T���X�BK�;�����7��vAP�i>�*h��%�=���m#T��d����N���������OS.)<r����2�D�������;������6���d�a����_s2����i"�3���t��3� CZ������]+6�-����ui�a���B>/���?�
���O�%z�Vo�D�{��Fe~��8�uB�p������Ybk��^n~���%T6g<G�����������Uvr3�@�����+b�@���� ��!�GDA������$��[��:@{{����\���M����&[�^����N��<�g������Ir�����!��A�:����d*��?�Kk$^�\#��JD�
Vg����x�^�g>K�a����[�^%���}������F%�.���|>�Z�'s���	���W[?%e@Y�����_�p���S�	}�3��{�@wu�����&���q�W��g�y�/����?[M������{
o������;SIV����F�����eCk4�Z4�x%I	�������q��<�p|G�����,�{+�8T��[U�7U�MtYw�IZ+�:%���_�>( ^���<��4�<��=��_������5��Hn���h��#eC�1	-1]��6�& ����sw�a]�n|2��-��z�$����!?�;��;@���,{�F�zKA[hM,�)������������D�g����`��P�wx ��%[����UR�#
o��Q����J3��G02�5N&%�{��!���w�O�w�k��lI��^���,��^��4���(��T��6B�������[��������������f_f���G~�l\~$���(�O,�������,����m�o���
Hk�x��B��a
qge�&
�sW�����b����l*��t��.�d�K��,��>�/G[mR��/vo�����UuB]�b��e�����~�;R	x&�A^���
�wd�_���a:"�H���
��,F�zG���O��q�PO��P_d}N�u��H]�\,�d�� `s���~�s��IJ��$�M�.�,d�����{��g������+SF(�h��~^3��T�(�^���Jhd���^#X�J���c���qm4�-���v������f,���3�2d�d�	���y��)�[ ]�BQj���Z��@.����p�u���%X"��� �����P�T��w�atL�|��[VQ������}�XY�b��p�2���!����-��]���+L�i�(�8mh`x��K2���?���$�LH|G��+D�{���u�0�;����1��0��bCd_6|�=+�E��
wq����A���8?���%�A�_1� -Ra�Q�eC�T�;���T�yshx\�n��x�����v�x+!~g�BnJ���iX�L`Yy/�iv�_��������M�B^�]�r^,-:"y���'y&T�kx��P�S��a��U���O('�ozY�!R|O����g}����b�g�#����j�-���hG�TrJ'�Q5j�����f��w�O@��#r?y[4�D�OD����5�����q�k��-��M4����^
(��#���v$Q1�k�_#A}o���t����n���V�7(\�	<��b?��Tx����:�:Q��M/n��22LU���$���f|h�J���h��^�8t�>]8lr�`�wz�=L<r��b���
Q*j�~��N���K�39�M&!���s��W��2@D�^����6kG��C�:������F�b� -nd��M����j''���I���E��5L���9����x��^(vY[�|[�.$�7������AC�z�����o(�5���e�������\�L�T���S��k���few�����R���bn6�ly/���Zi3��@=���H�28�m')z�#��GW���K�+4z -�����o������yF8*_�1������Kl	b�s��7��������h��B>���nM:�P��&�A��RZ����pk���'�Ay'�#SB������B4�jB,T��G�Z��="�`�T��O�N��'��&?q����I�H��X�q[O�08*�'e����6(k�3�s��b���)A�sE�����}��&�����x�W>+��;�u��oU
qb>|/�!��;*�{#�B
� ��~�$ZcP�R5��F����} T������qd����!@����;�eb������60��a�b��V�*�'PC���I����,G'���.r�C���������[��=
���7����!kID�N���OZ���� `}����$?��t%��Zf�2(�-R~0�u�'�A�?���H���F[����;5\O:�������k
Y�������F��*���E7�w�� �N�����=9����u��P����d�M&\{�����e�$t�X�1�Q�q|���
��[��rV$�6lz���+�;��	�A��;2�r��5KEg�f�a8��n������rZ�����D+_n����mB��q��G������a�q���\���V��I3� ���X9�I�����p���%|������Uf�i�xi�:  �E��;�7C���5D��X������q[�%��Z_A�>Hp�;����H�T^�M���]�9�M�-�2���}�*�9�1k�������P��(QQ��0�����8-�c��������L�[3>&��T������k�g7��W��x_^G���&��GT�������
�l��#%{���nx���Ut��o=�U6��`�����`����Z�-c�;�!������A-�Y��P�MP�*#����������(�w�ij�#H��8�Z���N������Qv�lp�529j�!���C�p��H�����48�-[ �aT!@��RZq�g��f�a��c�AR/j���CW��#���Y��vh����ceE�U�����}3
����WU�7��m��Z9��l��n'����aUf��+�2�����e�K���\��Oe�p�h�\���,�\��u�fX ����\��(Y+�@bO���i��u ��Ba����R�O3^�e`�xO$���#����M6���� ���q}w&���a�,�"�2N�a���E ����Dc�Yu��vjQs#�}�%k��������a]�0��xby�|,��o�FL���(��C�z[@��q��P�f�b�*�P����<�{��������;[�N��h����Wn�B0"l�$nZBBV+��o������
�Z������������'���$}}U�N����R ���o�Vwzc��O�]�L$����@r_�O],g~����X,$��(�6s��b�����3)��� )VO*��+��WH��:}����S����i���e�������P��nT�n�=��������I=�R����Y7>�KDf)��q+�e�����hjK���+^��1����O�fyR"����������O,Q�� X��
O��u�r�
I}$�KHr��P�5A���Y��}L���S���?m!mN7v����#ch)aKh@��T�_��@f� �d��������P����aQ��k�|J�AE��f��,C�H��'�z~�E���g��4�9[R(J��lu����F�D}�nHC:����W
�GX!��a8�<��`�g����4�bg��b�b��������5����2`�=��P'J������S-*0j�vC���?9s�IK#a�w�y��z�����9��.����n�����Q
�&P�(�>�Z���2��t�r�g��p����%|���8W����^Ri�k('�N����*����)�r���}�� �#��(����?��r�
�}G��i���_�Z�=1��Q�����h�q�T��QS�������c���mF����E#�o�+��
5���$�=Z������3���^�s4���e�)��1
	�����@���P�%&@aq���Se���6�U�#VF_:��Q[�����0��Fd
�'��h��%-�HW��5���J.n�V������ZLKN��M����t�S"~r
�R�I�����F0��������(��]�S_7z1��|O[��tCb��t�k�n��&������0��/ ��F0����C{�$�f����x~�|�fv��}�'�=o���8$���=�ke����z���,���~�/f#
C7��f����\������s��#
�d�a�yw�o�Vc��1�{���r�����!�xb\�y���9eC&�0��&��!���
�z#I���;p!��/�����'�����A�� p���Ed��O++
8>�}����?���A����ERSu!(p�8�w���!�E�\%S�\���W��D[^��_���!��N�#��*tU���J����1��Qr��K�x}�P�eY(��F���V�������Ht��u���K����3yt��@)K��X�
c�J]T���U)��M��ohU����W'��;�h&�:�����&�Gb��8�.���&[�
cD��(��l@��@C�xd�>~�PQ2/��B*`wlb<��>k�b{:��9Z@��dD�������hD�CE���F��� 	�������A)�:l��f��&��]�������]a|5E���=E�#��6oj~�b�D�lb��k��\��(u���L^tD_��a0�a2MI5����NsY�Vvj_J	cu����[
����������[�!Gj�DV������k�j0��wd��Z �jau��3~��M��e���c����!Ik�1��0d�m�,H��`^S��`����aC%�J�!Q�W^;�hh��]���3F��a@C_�tCn#�=[�Y�}�2}����@i-�au��2�p(�Y�XwO;H�=p�xe�Dd��(K�o�������D<�*L�>Pg�����<��~,���
Yy�D����J+m+)���h@�_T�3�h��=�f�O����GG��&B�(���A����?;�����BW&{��#T���r�E
�a�B��8e=I�+p��������{�����Y{��c�%�c�k���m�(��G>K�v@4�a�B�xQ�e��j�2�3`g��XFI/<��F�X>y��������-���$��W4���_f�;?���3�Q(�R!Py0���
�N�j�����F%:$MC���'��P*��)�L�i���"�8�$TL4?
Q��_,N�;w����$��h(��(3^�d�#B����AD���m?�8
G�������M�
-�3>P��������)�X������q�5O�{[dhi��Y�����L�5|r�n����t3>PG�����8b�l��
U���A����\����*Z��;��{J7-7�C��f�Y6��5�%r�����������t�P����$�	Ew����3�	-S�N���@��y���P_uW���~�2e��E:���L�	3����w��3	��f`�[���cjW82�b;���s8
�g����k&���]�~��|y�S3�����.�-��C]Kg���as8>0���hwyP��Q�b&�z,z���jR���-���:>k"�4� ��<3��V�/����>-��	���/�Z{����iB*�^�JHp�)�h��6?H�������hc�	���h(���dd�9B�Cc���#uzRv,2� ��]0�}P�g~�Or���p�$c��('�!_��@��i(B��]>I�������V�u"X��L��\���D�e�s�Q�K1t�k�l���)Z{Q	�i.��%�;"��I,7���kXPO��c��s�4��������j����>
'�Y��cc<��%�t;D��S��H�z�[h)W��|IP�oT�Me���qpY8��.�m�DH$~1�
-�G,�D������38����|UV1bL��'f��i�`�z*Q�_k��t���;��/��;;Y����t��:��X����^3i�cF� ���22C@�C4bS��2��a}cy���Y�NW`����b���hd5��^� �fS�e��,#	M!6_���H{�$ ��J�D}�mg���q�d��'/mG�6$�6B
��%X�%M���=	W�&d+(�Gt�Z����^��[O�a�l[����>A��c����VI��$�c�EeC`M�!�Q7��q���l5^��WV�@Vc,�EVM�^��n��65R\qh�o���Q��
�`F�+�i���\B��WI����DZKE��\��cTj��%l9�#��2�����l	-�
�)1�����2����+RiD���Jp�E���F3��q�X$�j�N5d��q���X=f
�������>v'��A���X0�z`I�������N`�H��v6������
Z��e�q����2������)��36KH��%����!G�[��	�3���e�
�0P*����,���kg�P�[���@9'
�{Z=u�������f]��s��r����,�q����g-A�8�i���Z:{�������4� ��Sp7v������5�?>�d
��q[��BF��5�������
#��Jp�n�����%,���.��)���FV��k~6[�gJ���u���b��C'
/Z	�f��x��.
n���j���RE��/������3��5���&�1Y�iV;>�z4r.����_`��
�8�'�O�6"��7Vc���3����&��p�!W��1��6��1�����/j����3n]��F���d�WYe�<��m��T0��_	��"�����2�6I��-������ye0�!iC��P�:Y�Bn�"���q�]�y'#����S��y��A��
F�^�\#��
�~O��m�L�������H���+����b��
��{�]>��#���>��-�[�Jv�����T��E��eB�~B���T���������:z������"��
��XM�!n��"�'����I��&�������&g������������T�k�;��~��e�[&�w'`4�]�l>i+�Cz��#��4vp6l��w�xH�z�����M������u�ww���>�B����i���L7wUR���E��-i2LX��p'���VtF�:,+]A$�FX<����C�t�M���������H��$]��\i"�����i�L��d\��w-�G4Q��%u�O�����I+�pO�[�o�:L�S�
����F��M������A=��oET�m�@�D[e�5E��/��Qb��F��xt����HWt�0U�������^�*��u���zj+���B����2��qf�n�G���a�q���Q%�)��
��:K���Q�D��m���+�E�A�s�=0*D�It\�>F�Lw������$�Q�TI	�v������bv;��4�?r�����%T7#�P-��]��uyp9c�	���%�[���r�_���������y����b�XI���� ���j����O�V!����"s����V���wnl���`��T#�An������{�����t���00u�OI6����l��M��5!Idb��^h��������>�O��w�!���v�hl�x{E�l�P42��r��IS�.����B�C:���v��k�$�Z~��RaKp�X����Xv�����q��>��2|������U��P��0����7y����\"	m�B�%�.d$L%���j�#��6�1M��4�f�+C���-a��[Lv�O�xmn���HX���}aJ��R������F.�)���l��<��4�w'�Z��{�g}��2hr�dYk"�X=*IAD[�o<���S�������O*;��W��vb�����Y�#��D��GN�1Ha����Hm"f�X��*v�][|��j�V�����<���",��}F:+��}���_u�NJ��D�X����_)Vs�K�3m�@>��B�u<����l�'�A�����f���9�0�4+���Ui'p�<o�D������P%�Y��1�q�W2*D59�)&�,��W�i���E�������i<���T�\��6����18�����A��
Y`4a�2o�����'�������l7��X��Z�����i�r�����8?+Ts�"� H����A�	A/��-H�F�_��jH�{F(O�~�]��� =��� ���$���)�:&���.H�s9����m������B3�sEb����p��Zp���t�;����(rGg�!��U�9�f�K�ls
�a�!�/�d��1�P��/X�~"c��sz���EN\��}� "n ��c:����,��q���e��c�`������\	��j��*1X�Qo�D��=��
�����CTc/��3�=F;��o����>�@d�p��w�Z�}�k$5�p�Ge>�C�SM���;������w9�;~���?_-��?�����K����y[���J�{q����s���a���{�*��R������b��K[�#������?62�m��:�"��c�+��^�
�f��Q������qe����%R<_�U��mbO���b��f��L��C�[����,��z(�C��tE��z�;���/�_u��:P���;v�B}�'��t+m���s��~uN��zlx�����quh�*���%�HX;�`Ms&��c�{vF;o=�(?'���5�	4;������x�?R���V�TTU����yC�
����F�>�
����7?��|��pZ7L�GFJi�H���qn�)�O�D	�Ia�^c�j�E����o��_���n�����B�{r����_�wd�z(���/����l�&9(98�#�>.�]�7A&���������tb���zHY���#�� RZZ~-�I��5��&�/�z�@�3�{������U.��N��P�d+�<Q�E�$���^#��hL�C���(�"��(�H��e��~�����YFO�7�L���0-IXP���s"��g�����Lt�[��_&���n���P��{���W�������|��!F�:���LF D�.��>�E�^��v��A���E�)��-'z=F$��v;�J
W\2J{/��P+��S�FT�T�^���%������p��YMf�B0�bM���|��J�o��%�X��.�0�K�AY���;�o�����{d;q����Bx�_C����w�I!���G$��wx��n��(��$�I���>.7:W��`B�.Y^w��
�J"skQ�y�����i_;���{���.��{M^ql��D�4��������XI7�IRs)-�M���:.
���������:�����_����}R��	r�����F����y�v��������0��~��;�O��WnG��1��g%�����6��'M�w�L�����7i\�j������n�N�1l=����m�d�'/�Je��
g�[Rs�RT��$`y`�C~ ��g��}_�
�w��R�IM��_{_�e�p����h��%���n5F9�
o��~�Gs������T���D?���a���;y�n���F����:�u����vW��|����97��B���ZX�Wm���H�3q4{���[?yB,A��(EQ�b�*�w��u�W����~P�V�2>��6=������P��;r��f%�$�R�{
�L�p(&�5xS����2��#�����2,��P6���Kp1D!iq��x!������t�T�>
��m��.�V2��V��h��X2��I���t�MD��$���8�U����V��BHK	P����l@���D�c��S[E�D�BfZ�2e@���B�~��[K�v������hPR
^����.,�X�e��i)��
{z����!	�qu����G����\"O}tx+�w~t������f�U@��B��R����b��`JS�B5.�H�"Z�FJ��*K��0B��Q/�
���.���B%h��T4�
9qPJ]g��i
{O�l�N� �J���t�V��"���B���	��~O��l!�pKjP��<@���7P
a����Q�d�C�	�|��O���T���r���3
��e ��?�#�	�Ih%�4�\,�9�z�%��[�Q�����p!�$h-���n�P�6\J��t��/s	X�~0�i��?����<����uD����_���>nZ|C�j��*;���v1�0���s�]��R"��O�0�:��/�frIx��<�:d�F,�����b:TJ�c���j��4T�_����#i��n�#��|)�I��V?�y���_1��Z�%i��6x0J�M|���X��e��z�0�$�Xy�/��/�VN1x�'V��
j�KI�C;����7uDV�1�hI{~�>�H#�|��o;\�����R�:��;�+�����w����WQ
��&K E3�z>�(dT�^�,�3�	���xd�q���T�����9c�!�I�y��F�9�dG�����
�p2��I���C'a����Ts��nBG�R�Lg�
x`KF�������o���a���7I�����D�u�������%���=��(�u���~��#���s4:
�.~=.O���6W=�$�������:dh��[5�`�����	���X�=����R��Q�$�O�n�{�D��Y
R7��9)M�\���L�J5��#�d�:��n��J���,���F8��\�<H������Y�T��Wj�������e���ZI�����/k���}B_�]�����+*`�a�����,L5-5���\Ri��m�	��b��j�T�j9�q���B��F!g
��U#���r�Z)��BA�j4AH�b0E�E���~����&>�;�T�
�$����O���=��$Z�ny`�T�a��d�1QG�psJ��P*�,5����D�R�k��ig(�{1�Y�N��k����GZ�2�<l#RvD�1W��|����#Pn_�A�%��NP����~�����M��sv@�K5� ��BZ�I�r���y�m���C#���skMHC�������[1Q\���]
!���Xg�`������(s�8��P�=�-q��3�v�*8���l���x�|�P��w�C��NOh1���@���i�,1��4c�0�I~��;���H�XY}?�owBa���II�0��(���q�!g7is������������wd�@[������@������4�B�
Z���l�g
jr��G-R��84����)��R���Jx�!{t+z[p�.7D���v��]������>�/����+f]#H;��.u������nE���;��������Fo��Q�e��}�����PhYV���:5Y
�7�=�d��[L<�b�����E6"�<��po�K�	���&0
e����|~�4'W����,JzW%LV�2Z�0�&�����IT��Ni��c4�����@u�����[@�?9�Z����"�a�X�j�@~���R�"��k��h�' �Y�`��34�=�G�����2~LjRs]�g����������"o?}[���6��Z�kPK��]e�)s
�
/b�V���'{j��93���>�O��1_�
8�5c� }30�yDs��x��9��������qy�I��fp@���h"���������������b�.����/��/�J��g`
;���� @}� ����!M���������O�f��[�����Q"_M�S"������� �����Pg���h��T�q�	�����������f�@���k-�������2�O�p������Ht�g�E	R�+���g�H��-�����
r�d�n�����a`�'uw*�}�-�Vu��=�V��	[�ti���.U��"�X�tA9�������r�e��f�@�%�5��1[�����af<�z�;���x����Q�i��VIU�Vlh]Z������	��>��Mu:���`rN$��}��d��";�����N��Kp���y_9<[��_�:���Q�;2kFT��,K�{N6e
%LE?m��E�������KCeU�2��x�i���$��B8i3����`*������wt�7�9]�1�AH��R�K�lA�QE+�XP�����������A	~Qc��8|k_p�����:��I�Pu,
�!��YP����Bp���0�����H��(�F�5U?�������B����$<h��_0R�4C]������fa��P���B�����7L��H'z�o0��������+���}
j������9i�%���as��'�����������*[�
�qx^�d�"���N��YK�3�t�O�Ki���x�16q��R��v��?	5�]?��JlY5���p������L��Pp;(����J����\3P1o�s'S�
����F�� ����'�P�A�����t�zT�[�R�:^
U��!���EWC�����PHK�-���I�D�S:��c3�PH.J��h�{�`jO��OUJ���@��n�c�2��]iu���
j(�l�U��I�Qb�%:��~~?���t�����c/������N���`�n�C>&:`w9����8����0-_�2!�����X�G��+�{��+������"�`���	q�����5B;���{��{���#Zy���v�������N<=9����(R�Q?4+����x�^�8A��^��S�Fx�V9C�B�BF�V���y�Zh����V�B\0��F��������(�A�-r��y���&/Z����k%�A�FZ�n�b"T��`�u���<�a&V��������R}����!KO��=�H�7X�d�BH�"E����34Z�h%���;j��DJ�'I�Q}z<�$/���D)$��2������.�1�E���`�8�c~��a�=������0��u=C�����v�	@<Yei�F�n�c���'�bI=��l�5�ay��(��C7���f����.�����I0���74�7�����8��jf����s�re�Hj[G���y�O�Lp�c�$��������\�b�����0/���y��{�����A��|"��V������]>���Z���Su��(���?����T���A���1��fkQ�J��+��v� �;o��_l��N'U���4�$SH�����RY������ai������`[���qN+i
p�9?�T�rt����{��k~6�7�82�7�MCw��}�tH��������c��#1Bd�?@�?A�^����J^�h�IR�8r+4��h:f�!�Q���t��}]I�����\C]3i��[aT�7�,�z:kp�,~2Sf#=��{w!u�'8����cj����*����0D�:\Z���cb���{C�,{D��<�Y�������A��tgh�
LD�;�M�VR�Z�a
d�2�I��mD������0���b������C���E��h�1e�K�V��l,8��@M�ac!Y��'�wFL����K�<-��&�0>��i�^�[�J�a�B�����F	J�~�����z����Df����|��>QC: 9�Z�V�C%��sI1*�GB�����e!������������6��O3�b0������-��pvp��G���>j8|hL��z�-�������5Dc,��#O��D� �h��<L9jx�
F�2���X-{�H5l�sw
��,�1������*_A���#`���x8��Zu���^H}7plq���j���[� c�����@�
���r��_O���
���h���:(�dK�u:�?�GT���1�n�H����~����"J0������]r,�Jc�p���������1�!-"�.���v��B[��Oz��m
�"BXg�AY�gP�0�����D
A2m4f8E����s;a��#"E����"�:t�x���
/,�D�a����h�s�6j�����UK������J�e���*�h�N(���F�
�th�2V�h&8`��X�<ON1)��A!�G_{J�s,�!H*�U�7d��ye��T�#]Xq%Zv�lz���w)|�'
��;h�R��xF��y�s(��z:|jIu�}7 (�\�S��(����>X��E=�L������l��|��K,��'�G~�P�6�>�����v�X��BV�W5 �%������� �!U�
�oh���1��a��J��G��{�4h�����+-�rFW����s����Q�h��o�����3�U�.���:�2�����jh��'P����x�:0��4 ��\
Y$�KdE�IAP��_r&�a~�Ev�@��4>p�	o�N=��y�l�i|@a;�����q����+(�VO��_���i���T�&<�r�g����6��Y�^1�p��L�3K�z��->���g��8�/p��p������r�Xx�4l`DY�n������.j]/�$�Aa��{�|o7P���y�J����
��T���A���0����u@'�����']z#r����)o�����������?���D��4V`.�;��J�4SL���4r ��V�&lt3�������p���/38��k*�7�����@��R���@�[�����B �4��tP�����������[�O,f+*�f���h���f�V`=hN�@
�2���Q�a��F�q�3�M-U�����"h�4����5w�jU&���=�M�!R^������`���O��;2\�F&6jl�����s��4N!��$;���1��c�3
���u#��,�n��b�o�0��4L�;G&�L��.�o���!��lO�>�&�jCJH�\���V6	j\L#��	��y1}��a�oN���e^9��:�(�
�d���D7!sm���GLXD��3=e�Ow,3d������G��k��$����F/���{Y�}S��4���<�f\/+��fB���uHu&���"��vg���6L.P!�����Fq�QI��!��|�?������Q��Nb
������$��^W�0,�~���=B�;$�A?�o�u%3�F=�]Y�]w��VN����|*��y�j���8�����f��e��DmTz6�
�#��q���]M����s��Q4��k�Q���A�z#�/K�]���\gS���Y��o(Dj�-b���]���4<�N3�1��H������=�a�2�D_�Ua�cT��Ak��b�� �;i�����@��i�D�|��[�"����Z+Z��44�K�j�]+U���Hz�%�h����>�������qM����j+�	�����~���Kf�5���/��RqV,��`a��e0D~�L���,����x�Q�X�P$�������AF��E�/�y;�
���e�c���2��t3�@�����y��2�!lA6���2�e���	�U���k.�;�{�)fN�t�[%-?���!�#N�=����U)����=��h'D�-��PF
0F�_5�"$��.[64c�t����R���g�"tk5;��k��Q�mP�&q��R���t�ZQC���Zs����V��!�P_�-�����e�B������V	v!��45�~����rN�2S/�/�G�-�����z��	s3X�E�
4����E
���.w��-�F���GfK�x������UAF<�e��E'/���+�� pg��:c���<��@k�����/f>(+��H��,~���
�J�CJLYA5�����������~��
��B[Z�NI�����Y��a�+i�
�])�����z����(��4��J���V�����Tt�.��?�Ea��T g��&{H��B!�'V�������1���{����[��w�z�x�z[QQH�����r�A���S6�$|L�0���9z�	5?�D2���a;r��DP= �>�JF����{Ww�~�Q��@o�`0� 9�Pz�79�����.��?�0g}��A
���U���ifhl�0��n����n���V��z0�qR����?�� ��
+�	�F�Y�-�F6j=.cRE(�H;�����1�/�"1�������r��G������n-c��te������4+I����"�R�w��BL
7���C7v05�\�
�9�2^X4��2�h4&p�bI����N��'T�S� w%=��"��I�c���`�N`�1�C�8�F
�5a- oGEQ`��\����8�����]�����4������y�2'�mA�����5���H����������9������a��V��k� 6�%�)����O��]��-p�G����}��Zl����]�n�M����������
I�i������z����;�C
x��;���U&%�%���4���-Dq��d�D����w�3"�CZ���o�F�N����!eAnD�	���|��h��n�
4�{�W�`��E���B�N����}P��]�1z��]����6� W8�[\�+N����D���
zj�����������?B
'N���B=�m�A���e���x�yC������	��AB?v��������m�n��1� s���p���PSfn�O��U8k���h6�P����&��������*�6[�#���-��M����Pgr��)��YvEW��<4�����V�6�pW�P3Vy�x������������@^����Z������U�����
w�h���)��vV�w8b��23��'�s1kr���e%���3�C���Q��=#CD�t�[I
4y��� 9���lc"l���O��J$�3��UN
����@�fV�����+:��w����|�����_:���o�B
?�.*���'$��1����x<��alS��	������FgJ/k%�ZjHq�o%3P�q�X����C��{!6�6� $G��$��:��x�{�r�$O�'�����z(��.��}�qsR_T��lM�������;
�B���Q�>9�n(�x'��D#R�A���u'A��#�yG�p�W�r��*+bO�~��~���A�$�u���Q���a�>��$)%�����"V��m�|���'����W�T���$�A|O��rr�4@��i�	�NE;�1L�\����y'2�r|�MBQ�v�X�_� �tx�0��_'��1.`|�R��c4����v2-�O��c0��O0�����q�_z��c�40
���s����>t�>n���.(�����cV��)%A��m�<5�
�hqR	�v\'j7���(�5����!:���z��a����	�FB����N;��.�=H���t����U��V$�<����$6/�(�z�'�I:����k�)��j�I�'1w)��3�E����ELucc�������Gx��%��%O�������t��1 �+�4C�����B���]~c����#m����wE��������x>�$q�kr�����pE"F���.#
mC������"%\*��`���C���=?�g���$�DO���t�;zI_|�� �<
�a�1�y�d�)����/Y���N���P+��t��]+�.��O�'Y�D>��-~��� ����R�0�����:o:��z<������~q���:�f�������I��~`�L���h��+�M�?��iF�;GE�+�q7��CXg��w�?��}p�OcV��~y,�����D� k�[v�yl�s����YQ���	GD�M��-L1��*�D��&���/�K4��?n��ZS	#nT��5��;�l����Jm����t/2�e��Oo ��}�h�,����`���$
`~�D����4.�]��z�_�����@�y�����Tf1���x9=���p\�E������_�6�a�����V�T���C��k�-���ii�b�5a�Ka�@��|�Y��	� D�;'&�U���Q#�!	Tl?*�
��������y_v��3<_\�=��=M��>�� cU����/�<�ZK���q�Z�t�O��M���w�������VP���B�V��J�i�������}���kM�&��;���\x'{���"w��BfoX]C�Q�~���>F�c�;��7�h^$�Y@�����a�������eUN�Z���������Ha](�3���dC}��Z�v���${��v�W�����{
�0��TS-$�[�E�$�YI}�}�/����L��/���o�H[����8���z^�t����"��Pr!�_�Zi����FRT��>^�'�7Q�*[sjL�����g�;��N�-C���>-&�R��<n�D��F|�J��YU[���2(U7y$��C1��O���4�	��o���j[K
��p�q�w�;zX�Qx�r����>r�}���N�_����<8�o���M����(V�����|::{�#=�����������L�kL���|��YI*�\������{
o����/q7������:c�H�>�$!"d�ut'$x4-�ic���
�p�8!����R&�h�0`����A��FS���
�DHKr4���@��{�X��8)<�+�����mA{r]3��a�kx��Y
������xy�S*/�/~G���r���������%�K�nD�T	r�^#�9v���X"-�w`����?��f���n_�����;uCboT�P��-��}y}�����=w����\"�m\`���\��C���=*��m���?,�0z��/�e���q��z���^��>���:��[��Pv�{�gOBN|w���$X�� ��a�D\����Lx;[3]���N��=�w��|����t���h����D��>\���"��wx�Ej�aT!��f<���A�w�[����!Z�;|�fAcg���"�C�t�v���		ap_��>D�[d|�^(��{��Ip�5z�.�R4�d��~0�JU��������I���>�,)�Tg v�8	�Z�!A���E��#��Y�Z�w_b���o�p��%g��d���u���B����%����k@Ex�jB�V��dD��d)\�q��x�qS-	��1@G#��#��<�d�x�Z$�"��������{�t��^�����+�Y��b�!��f��~����nM4� N���SU�.��e�{t��*������K�E��p�+��rwR�'��r��6Z9\���$�ZJ�G������hN>E8iI��������p�z���T�A�.�r)d�Tt{�C�R�<���T������~Qg�=[p�vx�)/aI�A�%��E�����v�#��c?�e�'�P��������P�j��#�G6R ��CDUV���������m�"e(��-��?dD)�����\�_�2>�a�����P������C���.�
�iIA`�1~L�J�!*���e��
4<Z����o���Zz5+=n�{���V�Q�����4����]x Y��[:�E����!�y�6i��'��hk1��/�;sY)�>3L� ��f���+�������#�`����B��:^5���:�:q�I2��S�7V�����m�D�"��#'�X)X��p���w-{8�%�!��}�c��Or�PuE��}���X]_'���%0��_I�E���=��>,���h��������AMX��(	u���7�7M�Rj������P	G!u��*������E�U�^~+E�J������2�F��@����n��k	E�0\2�9���;����I�����V��-r�X�[++-��p������O+�z�e��!c"4�{�lK��$���Qz[g�F�!!c�v��&q[�
b�[���q��)\k1�(%�
����� �lI����\��4�Fv����4�a��#%SO)�t!���?}}H�s��w�D=dM���<�=�=���p���p]N���*�z�T�]K�Z�$�d�������8���_Y��
��6C�������}�Z��N
��T�D�=tC��iT�?P�]kB$D�E]��`c��a���"r���C�����va���	��JE��q�v���PK�����g|Y�d�
)�-#�?8���|��jL#�Q�y[������]��
���v���?��L����jx����\�l7� :������X�:u����p*	�f��2�{���^��+`�!���MWv��B,hs�����%��]R/��)�#��
�(�w,�B�E�M�H�V
]D�Z=���.p�G��j "*�}�0�*V�.��u�r|E0�"�J�^�]G1|����B���'B-?��bT�U �`%��6��?zU('h�X��99��
��Q�
�W�TqNtv&�'��6
��zf?�yL'.(�_�����s�o!$"�q
�6���n���]��vo�2�vS���I'r���e���{!q�����'P�uO1Ws��_��m�AB�8^�q�N��T?���]������1���������h\m X����\�$��v��'�gz����/1+�6psl��]h�E��>��mwJY��"E5����~IUu��5��M�iG<p�fxO�u����];����}���m)&�aU����{"Y!jIV�
�iG)��v��^�4`�N�@�������^�����:9��'T)uz��;��Z�f
c�GlV��	�����v�����R9Dv�� Uv��nC�t'g����a~H�B����Z�:�[�!�Z��Z�r[����A���f�_m�k�=���-%���e/S����pg�G��6��q	�`����&�#����FL�j�("k����q��4��'1��i�Q����������V�I,k=n��[�,�v���I�DQ��/�-cNW#Y%��N�g����:q�p��B����`#�S��|g3�jVK- lA������f�����#fi�A]Hf|T��;QD�|�m_�l��k����T}��x�h�j��&9jA6�$�*��\n��q��'��R��tX����7D�^���a
�#���GV`��z��|�w� �Y�(!��������i�1�o6"�'7+"�gX�g�(�su+v�����S�4x�y,#)�������Z�f{�HxkJ ����*:7gO�]����#�J�P">^s�D�jhF�{������	F�|;���p�eg�&�^a��k�����9e�`g��_��[I�����'��(o���(�&z!�=dcT��k���MN[%���P��e��������hf6��In��#��~� ,����E�o9:^7A	Y?�u�,�g�N���� ������#�H�(�ND<2�{�������_�D4HG�l���KO��)�mB0��@�6������d������:? 3l�d���,�K��X#3���������4�;vB����;;w	 
'�A>E���;2�k��
�0k�>.VCD)B���y
[�;�"C���4�62�^~[�l��5j;4�����*���Y�	hJ�}�{@�(M@@�E�����%���'/kzjv�Z6RlN��0�"5Ah��}-���#���@x �D�qY�f��F������q q4�m�
]:	���~���t��k���?��O5�-K��lFns�|�a�)H`����_�8���~�V�e�`8{}X�o�������V!s�	P�v�'�=G�8�.���Mg�V�v`k�}������>;�[y�KM}NX(���"[������/Fv�������e���M��O��5d�6�KV
	���"��?��z&����U�� �Z���zL��8UQ��k��8��h�w��D��.4 ����I�)Y��q������eMG��*�C�#P�?�`���x���D7o��|8 �E� �S�vG@�o*3.`w�DC���A��s��4��w�����}�(��-�KM�q��Dxxw8x8�N�D� �O
��T���������]m���p�PW�u�E�X01-�Q%%X4���������3c�.x�W�=Q)��(a�[D�J�|�����L{�l������D���.��Ufa�>�#I�=1>���kTP�tMA��O�H��~��B<������$]�U:�)z����B`&����@�n���5�T�
Bh>���XR=G���@�dw��,����[W�3G�U�
�\��;� �L������rr�aT@4<V�`W{�?!�)e�;���a���O�p�:�Db��mo @��������`�>|���bN��������
�/��F�=M���+2�a��o����;o4,c8���"�����$����cD#%c����%�v����/��H�����D�E<�>}���D�drG-�.�"CJ�4�7$��6�6e��������m�L��$��zvD��}�|��A�]��hG��5�#�������oI��}=���rt�u�>��')��B,@��x���A��Ga�"	��]�R�9=��t�T3�G8!)#��5�A,�����������+�#��_��}����:����#';E�����u������&��<t��{ )�2�U1B/��������~�L�Hf��W%����FL7�}��]��������l	�ow��������1������������DX��DD�~�c�h~�L�~��+���O���p�j�[�)��%�l5���d����nP���[�s������f��I��!i�d�0�����=�Hi�C��,Nj��X��4�E.��X@����S��p�����l��K����3�v����pW�C�&�>���:��[���~t*��F�qz#�x��Is��2C�/�&����n��z��#C0Z���>{(<<����0�����Y��pP39*�����U�h����.�~C�Yv
�yG�Z>H�XQm�Ox�r2���K��BaD��4���b�XG�����]���:gP���e����h+����<����3���]�M����C�����������<�2ud4����$�tgi��i�s������H��5ew�CEx�NN$�"zi�=p�G�~_}��Tk%�cN:�,�\�U>{�EO��>����������T<=�;:z�;0�r6��Cpg�Mf!��qj8"z�8�]tZ��n�-{RVn��Q������4["�c�-������?��x�m�$��B/�I�6�^���+��Ss�!�������t��=rW�4�r��-��v�����~G��i��A���]F&�$,��`C���M�G�g���=��7/�;����*��F��-�0�G���;m�A�����m���\�����c�="�������@������m)����2Y7{L;��Q�C��M��V4\^�i�C�Ex�R!������H6���p��@��[|�0^A""�� lX[A�`�9
��v"lj�����|�!DY����"Z,��	p�@�9c|���j�mY5�t��������ev��N	<��J����������>j'g�����:=�cv�]����+�[!����qI��U��f��4Z�b
�h�9����#h8���/?9�L�<�_��K��66@��"b�|�0>v����L����#h	J(���r�����4_	(��8�>��OH�6��p�\�����aAc����D����z?��B�Y��+�1�_*u��O��
�M2:��@KhG�ia���[��>�,d=�Y��3����V-������{�����1��A������*#�������i:��c
[����Qf=�Y�_�/z�Xu
H;�v�N����L�)�!������Yx$F
�)���Oi%��%=�n�VO��jzd�K]?�8�����L��|�E��r�Y]�%c,�����N2���9l������0��>�Dt ��v��};Y�cj��
��"u"�4�a9:�M�1:d��I�4Z�]��% �D�H3?&���C�p���%��|f��2��t~�B���"���]����k��� ����3�R"��N����v���Ie��g���3�t�S���6�O	���$c��t6����o�
�M�ac8yo�+���-m�w 9�W�L�	��7��1����Kz�_VA���N��6��=���uO��_�Gj�!���M�yj����=�d������~����}��<���k
g�������N=���^d?������0�FL�M"�bkj�G3��9���Z0��D�S�C��Z>��8j[M�
�6#Lj
m@�Z��cy�����(4z���(���w�>�i��������1��#����;�C�}�"U�����B���L	���)�An�O�[����
cV	T��������Ds�SD�8��$f+'��if�;��a$8�5�R�G������m�vvC�U��W��qR-�l��k=I���40��D�5\er��-��6iD���WvDj������/u��p�I [�Y�qHL���3!�f�����3��)�B�Ex�h�C���yGB}����	�B��0�u+��i;�L����YIc�C8��*M�LH��m�n�;]Y���a�&�i�z�at�
*��,���?Ud9.B���"��!
������{�/�V��}���Y�3Xd��p\K!�}��
���Z��6���(� ]�
=�V��E4F���v!�k��q����>1Az
�N�3��5 #��t"%�E;�2�Q�M$
��-��W��f���`����,��q�mw�M/#{�*/o;�
gh�*��F�p��Q�������dq�k�J��e[ot�zp	!P�8���o\��!O�J��l�W[��S�<��/�#����`R��������#��Dt�%P�H�����������R�J4���&�
��E�p�w��M����M�(��#�&R����+!B�������������&�c��D�#;�qF��� l2m ����j�>��Z�%�W5-�N��@�1�������A�4-{FG�%�j��U'r����@P��kD~ZW��������]b���"��_��:��}�g�����n^��|�5��_a<E�<�b0��"�W>3���e9�"���$���eK	��R���;6��T�����V���K�	����>|I���JE����`���S����)��MvB���[D�������b��*�i�]�Mg�����������B4�p�������t����=K8I�O!sXF2�����T��o���o�����eK)4�w�3v����O�}��Hv,A$��:D
��������^�I����L������,!u+AZzw�����&sJ\�IX#{���(��#���\��������8�Go^X	�U���%��n���E��)�t���e�����F��Q�:P�f��p�#��2��e�(��R�r	�L����������9��&f����g%�f_�`�[��c;��?����1����DD�����L������U�����s�d�dcHe�a�cd#M��%��y|��&��[�����WV���n+;Y+}w�y���o�Z�����Qo���
%�U�����p����-��D��mt�w������H��/s� $����������)�w1����GX��`�2A4����H9Z�/�3���4[���1�y;�.���hBfR��D��#�U���q�����ETV�/<;T����G	Xx
y�E,��xl���}�%��6O�J��I ��v���h���N m�
���s{��TG�]F�����E�qE������:`����;��7J>��-���D`]�g�fM������	TI����7"0�*e*u<e-oGg��:(�K���O��qTR_8?�}��Lp�2U����
2��8d\Q�h���Z���!7����]4H��5,���	S�fw�s(EI'O�N���()�_����2��?�L�����=%l�]�Ax<�XseUU���4���c�����������hi�8�CD���[H����{��3��F���8��y�T5�m�n��#�Rm{@�H~��t4�-�l��@�>4�0O��(g2�-��Ofi��=`�t�������"tuj��FG����;p?�[��`�m�������~����f�������:S�-X�ls+!)�
���6a�!;�9���[���]	kv����a�.�d��!�����c	O3����)��\^������mYb�� G�-c��ne��0p�����f����n#�������)����h���|@'����� K�W��M�������q1����Mq�k�����
���0�)��f�M�x����>q4����X�����b%E�����"`��������Y)��6�_
�E����!��+������/#k]?�U��^�������l�0���]�|NQ�
��I^�����l(2����c($���E������b{T��/�����h����B}F�B�U���<�gfO���?;wP��p,de�q�6F��s������� D��HCv����Y>�av+6�NV�#��`[yDnE��1��>�����s�1,d���{�x����1�p��(��vE���8�����s�����Kr�����y��Y��0#���?c��<N���.G���d-�#�����^i���L�z�=�X�U5����T���W.�����c"j��QD���><+��N�&�9;!|�=7�=��
����z�5�b�x0����S6�����a�KwVc``���p���^���21�|�����GH�\���������x!���
����e��=��@��|'���o�P���6��!��*��O��t���e��cP��aJ�^��y��zf/{�Q>HI%�6)�Y3���n��������+� [G���h�DEa��9$���%��F[7����#�`���y����@@��������9�d#����eEhM�+���J����ua�g���������D��F��A�o��� o0�����uD+�`�Z�U�o�<�hEa���n^X�<2`�u4�/Y�Z�(]OA�#%�ZHb�G�N��p�$
��/�Hm��c&�T���O�	?�������
��7+�k�U-�����2��O7;�8�~[�� '��m�l�j�������7����jA�*3�:N��!��b/s39�2�j2���{�{�dU�6����?F9b�����cg�h�����^�!���F|�Y)"x<���`��0�c���G��>=��#6�md����D�$��Uh�����m����!qf��c�
������EZ�������o@��������!Gs�;�)�WB�y/$]	���������Z0�� �s�M��C��{
���1�f�U�ISO�9������(,���@{l��Hf�A*���w�_G�j$�x�a�o�[���7��2���|w�i3�y/a�a��->=���R��j=��zG��K��w���mfro�(�o��_��5�+��}_���q��;I������/]v��p�d�1��l���h�}����I�A����[)�}����3��v%G��B��H�I��g��"}/d�/��;�������f�����_�b!iH��t���E�Sq��4�>(�4�����p�|PK:<�h�p.��09��F������<��A&��{������i����K4���	���S6��~B�{!Utw��>�Y�C��n�{!�9�u���-+K"|G�a�3���#U��Q�O�b	���'�[�#��#�u����%t��.�����Gl��dD4�w�}��lzF�O^S�ucp��i�9�����=q��f��������t����kh���,�S��U0��;,���5L�$�:�{!��w�"������AO��K�Z�>Z�D�^CM������ ;������]����dk[j����vz�P���{
-����h������m$��;Rm0b ����q�&�D����M�p�{n����gL��I�-�^C�����Q�����5�� �/�RS(�aX����{��iR]\$��;Z;-09�Sy�gw 2SSa��X�]--��Ws��$�Z{>��&G�3Y���j��/�/�VT�	�=�VZ1����������@�y���LP��B�krn���%���������D��#��13�vCv�����/>-�;����&�|�!���?i�R;�Wv
����;�4�;{���H��^B�
�����JBx�!�,a���l�C�X����j�E���=������_�8����F�dh���������A����O���������&�d��c+�+��N��"����F����E�QR�=���,����vQ�P�E�2�p�JP�V�U���a�J��(�.
��)#�h�����x1z�VI$&{�������[�B���\P���	��{3���#t|���,��h����d�w�<�$��u�dh
~|��(Z���1���-t��*F���;_r^�3���O+0rT�`+�3(��m��C����^C���M�����6���m����J�>qd�\�*��l�f!�E��W��|+��	�����6�b_t�*�,�l�(��������a20��%*�V�Q�D2�J3�.Z�
J�������/�#�H�O.��_�rJt��X��1B"+�V����B4P�2BV�u�L�pV�@��Hl�5�3�;R��	:�R�
]GK���b2�	��{��n~��}+�K(	��h�j1h��H�!g�G;��B��p,��Z�p�Hd��H�=uNiE�\����B{��-�x,������}�M`����6YR*F2P�JlC*_a�kX=q[a!9���Gu"
����J�'�&�p��=� K%�4��d�=��WL��E�k�S`�&
�Q��������^<Ftc]������XS�1����h���_#������4������'�b_&L�#�eqD"�jE���t2f���o� *l-8�[��`���������q���������]��6�o|v� ��6}�0E�V �/c/�]�'N8Z��m�m�Z�����hE��y7d���I�U.2�H!
����/�>L�(���m��h�K��P��(�*����,���\�����bl���r������u��1��K'�{���h�=����sV��[��o��]|�);�h��9����Z$��.�}aSp?���960�6�c�C6�d�T��R�p�UuT�W[�#���C�+M��K�����ojK� �A�C�L����"�oL"�i��K(f;��h����O:�%4kU�A�}��;��-[<e���<`��/�@T$y�R��d����H����B��V���ZuC���-l��&�(������P�Z�����AF	(���CQ'b��cbV���#A�����B&;n�WAdgY5@0��x�G���=�O�u�����.jQ�*�@.)�����I*�@�ZJ�Z��F��
����a��O�5}�'/"|�BJ����rfJ6�6^�����K�z$Y����� ��lH���.r_����:?������H=:! ��Y��Q�� ��I�`{'i*rAl�arB	�Z���R&[e@d��jqC���4doZ����>��Z��)m�[���i_�+">D�������"�������c��({�U�"�D�@bG�(����C��5�F��C�:e=�~�_v<+b�T#���4j�o�T��u(��T�(���� lC����I�P�6f��^f:#�u��&G����M���B�+b�V�D��u��s�e=|�u������*��}�_���dt�:��0����e�����������u~�A��U)��hU���	|)��(���e[���>��+�5����8���[�-��)��<*Y?gh��_4z�:�@���X������0d����S��ZMK5r�~������Z�l��������g�����i�B����X<���s�31Z�q�jb��E��*���(�Ua4�H1�r[Z�0�6�q�7��VA
���g����P�372�|���t{����{��xIHJ�jX!�kp�`Y�:�T���G�)UP�FC%�SWQi�_"����oB�=0M:���G���H��������Q��;��r������|��QK�FL7GIG��|�#vQO�����������%{��P���	��E%��4K�
DT�&��t��_qn����G��3j�ts/�-�����������8���*��i����	���e+�![�,������M��>����s��	N�5	t���}O�*F��@�~9�D�.�Aa����m�xO�U>��������0���M(�4���(��7����J]\��t�w���O�4-�AU��PT�����9@�����=�*A���]�����3�u��6j36��p�h�(s�E����3S>[�,��-+�P����tp��G������e�@q�\�{lF N������"
O�>`�
��_b �e��J��[
�u���Ya#PB��Y�.h��V1
��g����5�K��}��p�Rn4P��It���~4Z5\v(���m|��Gc�jx�!��m����M'Nx�n�
s��\?6?[�rk�h��c����3:Qc�����7evg����I���p!E[��"���B|*
q�f�=�8�mL ��h#�7y��Kb��^C�_��0vd���FD�t�	z��X_E�$Kvv���o�f��D��i�{�H3�u�']t���m�f�ZM��`Bfd��;b�/_�����g��XDi��&��T����';{�1�����;�@q�p�k������>�,���|����H&�3�g7g?��j���(��d���#�]�R8f���6R�]	y0f�vD�]�}��Y�g�	��YPC&Lm�\F$�&�aS�$�f�R��Dla�@�"���FWo]���~Ih��
SFZ;6i���^+2��f�$A��,q��S��]�6;�d��RL��z��\�$+fR&���Jj��� wox�5�l�����*�Am<���<���:
�d��#�cD��P��/���;@���.H�{��w9����-L#n�q�/�{����dP1'���`������D!�%j��g
�����2���}��&�G�C)��khZ5X�e��A����������i������,�U2��VVfk�)|.�A�v���<���cB����l�j��t�$�!����(��c��)��^����MM�d�����0�.j]�&��*q�Zs�Y�OJ����t���YKQ������{sef����601�����M��-����|��G�qwJ5�.+������rw�2FI������Z0���YcE��|i~1-�����2���������*A����A=T���Y���s�a��;=��u��6qw�ud��l����;����L��jQ������f�j���m����f�C����]8��"a�5j������x�����&�f���S�z��0���y���p��f��N��;3���!��?(kO�.$#\��h��1�����2����E���/�'5�\��|���g��U�nE(����N����v�����nB���^�5�2�Q`�O�=�l{�iS�|������a�������i�6��39{�r>$��b-
�AS��J=�����"��.��J�[=zo���{4�� /�YS���e9�}��@t�+Q_����[4N@�>��*$9�B+�c�&��;���}ml��ZV�;"����A���M���jZ��u�`���Fw��� [�:g�(�-�+@~G��D2�(�9	���]h��W��kw��2nn�(��}8��Sd�Q+m�v�W�0$�HM��h�7B�i�������B�w�Vj�m����}�_�^�O�G�V��l.x��d���A��:��:���L�����=k��X��C�@�8"9�p������Z�ho�
)%^4R3�6�Z�p�RD�Q���<��a[D4��"�OEm*C��l?����%������$-���a&����%����!�#�1
������~�`{�Fv��(�e���NMU�CxHs�0%�1!�5���Y���m����/F�R��A��g�R�a���'��;��]<,��o��d��H=�u��s��3����a�F��
�8������o�rv���*D����8Z@\gCB�����G�h�������F��a!�8��������;c�gK�=�M/K�P�T6"��
��a����QZ[)��Q<��1��{{���}�N}�;�
�8����ag?v���G3}�r��I��B(�C��Px~L��9�z4�{G���q��D��v�J��7���Pq�?�F0V���u�A
��] #��A�"���|2��[�Z���f?��"'�c;�MG��l��
��>����l����!�v��}����� �����������Sp���_�D��������"K��I����x�E	�&��;��',]35L���\��YD�IF�
$�`��HN0��`}�D��1���7�	S�!&w�����)���������1��l� �k�+�p�E���l�%	tv�4@"����h�JAzSX�9�D���������������n�f/���<������-.���������T�
:	�:�L���+��]��p��kxv6p�*�f���pf���g,q5a<eg����bOA������1V�8��D4�����6�fG�?���������[����h?�p����`9a�O@
\���"�0O���Y�,�)���0�������Eu���h�gp
,���+�BBF"xlA��"��!��>�F��P�m���||8�f5����J��g�@xy�GS�I��f�|.1Yq������H$���|���?)��tgG�) dDl�i��oM��)���D�����E�>�)H�)o�dZL�!�������6���[�
�n�>��(#b
�����Dz�)XIk&���C�Q(3�����`�<�SljTwMC!\>mG�pN�?��W�F����i3*D�p��YS,�}p��"+�����.���k��	��V�qL-����� ���z3���QoD� �.;�L'c�D��M�2_���c ;����������G��i�G����8�~�����\����E��r��nV�s��P����Am{��M�f/�mq#�v��vS��+�s���)���N��G���w{�=eU��
���q�����������pAY�����m���DL�i@�\�hG�������������J����<�.JJ���36�|�h�O��K~Q�M�zp����=��%�yM�R!p�X�\��x��3p�o�����S�����uP�6���+�0�����6�p�����^�]��n����=�pp�l�!\�z�������5z@�������1y�D����a97�B ��B���4�l
�@����=m�����RF�0���&�)\���{�L���J�i�
y�_�/�$�����J��5�xw�]�XY�O��AQ�V7���6�����8�i
g�N���8����7��;�Pf�>S�i��VH���$��	����Z�4�}Te�/*"�MGxg���)>�T��df��s����[��9��\�$����
��$pud��7!�"S�!��8G�����U]C���m
��9���lt|�n8���D�S�G�`�)��F���T"�q�p��8��g�J�;KF����m�J�O�]��p�>���-��A
D���,�+gx
>V����B%��V��SO����S�H�K7��5{*��_�7��4�kZ�>5��lgY���Y_��`��_N�f��Zpc�Q
��@���?��3k}VW�`�3B2�*��
�X>}�r����(D|P�K�2"��E5�����zK�nW��H+��Q�i��j���UR�nX����_���<�}B?6>��dg��EZ>��F.qU�&��DH�*�w�ZJ��o9�3��).�aM�Sm��,���N��K�G���e�+�#&N����;�}Wu|��qFo�1u��t1�@�\��W�]��o}�Ww��0�%0D�:,��"W[��@�#V�,�#;[����E�q�<�L���`{C�1Ea����!:z����������
>{���|5��r���d�����y��5@������������%���h�?�_��+"�/�>���*a#3"X-!"����Q?i�t�;�CC�)8�~sHNGV
��{�'�.a"X6���v-����w{�Af���m},[����������)��k�J�����g
���W�]>�~������G���l��s;�&��	Q4���qm�T�?�a�440j����BE�&��l��;;�	��?8S#��������	��4�!7kO�i��I��
4�������UV�9#�.$,������R�����+8��$�����(��SN�K�y�2�A3h�~�v l	�?;?L]3Y�Zv�=�ha	��E=���m��@K�e+;af���p��&������C8���C'6�5�R9
�\�)p��dq#�3�����C��4�^�����
��<�B[E���K��,��3�r��m.��eD"�%X�=H��5�����6kQ���m4���f3�J�mTxE���3��
.���3����(]9����S���l.��?Q��lO=�����4���Tf��N��D�F��)|����T����q:�S�g����"�-�D]K�����8�m��S�@�o!��b��$�GK��>#"�m�+2�� (^Z$3��[p9�������ib�6�u�=�0I�(�*���
H�-�![	��:�`u>�'5�����F�]����}��QD4��7d*�-l�EE������Q�V�������"��.v�;�h����[ls�����r$�=�G��,�kuf��=pJ�Y*�l��o��=To��35�P��+=S'n�*~0������d~�d6e��A]��Qn�E��$��H���:� ��b�r8M���%��N�d�����w@��d3I���~�?��}E��m�)v�^R�-�o�;�h��ta�/�g��� E\����f��7�G��-�����������\qv������P�qT�����i;I\	��gD���
(���HA����t`;M���4d�&�l���c�����,���X��V������������?���pt	��+5^�v�������"3P��rIT�Z�����H������f�?f�-��@JV�X��f4��2��l�
fP�D��-��8zaj��%����%�PX�� �����*�a��G5���5lX=@c�iDu�
:_Lav	�F���mhC��'���Nm�3�Q���YR���!(���;�����]��:�[S��C�G���q������Kw�A�<�d|�����������0�x����F-����T��ML�<P�"��Pae!���n<,��Ho�X��$���P�"�7���!��[��abt��:�\�Gj��Z�j��ck�[�Ew`5G���y���+q��N��&�*y�����Q<�����muG��Q!(G��9|��
�yY=�:r;�c�["3�����yl,��#O�Q�M
�C��v����L'�$"o�%r�maH�>>�D��������}�������1��g=^��4��h(���Q���pL��IS%��Z[K^�O�mv�\���9bn}?FS6{����#0�zS>�8@F<������X��|���I�zIw7�,���<x� ������q�G"n~�����]Y�s�7�d��.��`���;�<v�s8:�ZI���AG8�kQ�q��
�����������U�)�!������pv��z�.h4PGcgA����,��Y|,�5ES��+�%�J���w�A��>��T�%���-'{���[����G��d�+E���$"GeA6�l?�p`��� �J�-B"�<n��D(�1�B~St>�l���M�9P��)����e��%�	�td���<��9d�q�j%v>�IJ��r<P �?g���$�AF��#`�)�L�yG��d��F�T�{���a�Yc+�V��)0D����GH����(�/� �"u��~�er;VE��#��F����)aG��#0�&j�Eu����/���	(%�c�6���Z��ILF�=�'���;B�R����^�4v��y~��f��SS�[-�Z+3���0�c���Mg&=G�;_��4��Q'�8`��I.�d;=�d����~B�����{V��h�rn�)r���'��D�r��Q��~A5+��Z`��uMy[G@-�V��_0���Q# �[������9����o"�R���(�����������'���t����hQ7CzY{�,Y�����N��	��J^����_��c+n��
���*����*�nV��	�q���%���0bQ��f�A<��v�j6�T^�,������M��~h���������dm�Qa�K����f��G T�z�x�,��G�u[\dwp���`!�62��n�J�E��:�;xD�����4�2"\�8�|����W/��p&j.js�O��
R�����Y���g:n�����Y������^��CF�=�p�hKb�����Dk��V��U�@1���1d����#9X&�dK��gwq?��!�^G�/a����kVw�F�6x�*K�z� uR��{���;�b����e�>�x��fO���l�HR��'6HW��6v\�5���*&����P�n��y��h��������k�xW����Qe��$d^s�=Z(������7���T����#{sV��o����������(������>��'�q��S-��
bu�=y/d�hP���t���a��=9G��=!�r�#-0r���R��x�0~3��������^CLzYq�VF�������E�`�A�Nd��5l�|�d�w�z+0�c��L���q�����k�����~A�Qe���Pg�q`t0z�!^��Ix�;R��J�)=�h�zI�$��ToX��J"ax���o1� �'`�{�+<�[[�"+Z{����f��5z�(���7`�&��;��p�l��A{�E�d���������w�w	�������;���x�$�+�����<9|�PA�^�������I:��54	�
J:b�H[���KOde�s&�/�q�x��|��E���X�������BD�%��{
q���]fH�khKf
*�����a%"�c�Kg�o�����i����;�PG�:J��(����-�o ��M[ReZ�}PU��I���YW�A
��w�VDlV��E��5����FF�u������c�����g%�����;����l�-|+���#�,O�=Va��"x+a�#8_B��k�����4���S�D������*����P�3��[X�M�NT�%��e3���l�Y���f�����*�7i�E��}i�=���;R[�	��d_���.��h��Y�FD�9{J��i�>�G��,��N2�	�{39�o�"	�'�
��s�c����"H�
�1���Tth���l�.���x$*�3��m;E�~7V������0pu�z�do���.��y,TvB�5�<?��B�I���M�d���<���^�M,e�UI�]��Z���E�DI��z1��;���d.���.�Z��Z��WU>G���R�E#���B{������M{r��M����@%EV��s�J�"H��\�Z���Eh�r�AU��i����X
���0y($������� �lH�Y�$c�`U��i�?�t�]7"�v/��B"��H�N[���d/zdB"~9�>txlQJ�{��t�K� !�{�SE��T6F+_�,!V�0�M����<��~d�I6Q�R,�h�?�|���VA4
��FG�b���X��� �����D�Y�P"��4�Y��������nP�������+�����\�e+\�dAxS�2-�"o�w���f����E�/�X)}��GD��"TA}��������!$��g�������T�	���U��OY��{�p��t��G�8�n�P�E0���{�HK��{�����f��2�E,�����(�#��qe�n������W�=4�����wD	
���[<��M����}�c�f/K�L���;�'���bC'��o�<E��"t�E�2��xB�G/B���@�wp�h��"�/:��?���_h!����7[�����t�ldD���%�Laz@0�vK�C`X?���n;�\�� ����>Y;a�Jxd4��;�^��'�UM����0��C��%����������3�pTe�����Z9��!Q�b/B
��~�����!��O�e�ub�2���w��E�iq�����O�r�'$%�m�m�N���3��F�vs�[4M�?$���Q��=���@�w�6��k�a���~�1����qq�/��]������t��E��&M]`�]����	�8w{c@��������/=�g���M��a_EL��n����aZ���Gf��	C���?�	�-���0������]S$�d��N������U�C���$�8�:��(�r��������lw�DM�*";�TCsd>��ZA7����jK���q�O�,W�SbB����!RUPC���]\]��]�|���[bw����]����&��V�~��{&f8
��~���w$ev&���0���/{u�6��V�
N;�X��C�^������*t��XZ:X���V3����E"�������4��+&[W��"���q�YS�V}���J{���-�>�a{aN��r���V?,��h�����6�5A���`���U�CF��V3>F�j5�=�bB���2U��1$�$�6�:+;*�j��#kL���� ����lS��jc'xW��
��O���8;2�K������k�BT�V�
��u~>�'G8b5�pk%��6����*�����U�:Ae��<U�C�>	���w���#?H|�o4�B,Y���wF�F�$��(���X
B�X��O[�_���K���$�,5�-UAT*�[�5��6�cO���wG�;����t��#��<��"�W�b������3;j�TK((GE��4N/��E�]�C��M;d*��Q�l���w�7�P�g�u�F`P�X�o�(��Uk�|���zV��q�D@hv��Z�u+��2��9��$�a@�����Z��
S(���YR:k��S4)�(����r�*��������p=����o�J������Cv(����U3.���D���@�>!0Y|�-�f��Qu�����N�@uDHk�}��}��T-egU�hc��m�� +��B�)�P�{p��Eu[�=n�*����gtY��z���u�p���~>R\4��P^�-5[��0D����W�w|uhI���k�h��]p	
�� ��f]�(�D*������k������'U�F}�������k���� 0G�#�O��-wo�����X�h�*%S�>�� Y~���������{�=iI#��EM����p���arj���{����hF���V��S�S�f3�h���p�j��%Z�@��3�H�\!{?'���H1.�{�������QEDIl�5�� �NIX��aI�8B�ns$�Q�����n�D��J�{'Q�Uo�O"*���Q��{� �~G����O�ZDix(T�p�idf�i��,��y�M����.�Fp�6��,�K~��\
����&�����2���3��=�f���������@7��loof����f��2$�d'c���m�O�I�V�:7M��mF\�f��-W��pM��2�n	���C��<�L��Yu��e�9�Q��9���9y7��u�����A������o;v��%���j��ul�)��9����P{���}��E88�'�-s��EZZv~pZD�4��e$�&�!����5�����du���@'"�6g@�E����{�"Q���Y�4��H�����xM(��M5���[P������
I:o2;K8�� `1'����������Z��2�����HV*l@��x����_�X���]������,~@p����#�F�r�����7�L����0���e���y-���	j+$:�d��#^Q[R�IV6�-��h���X���E��f��bQ_�&ZD���@���o�FIdT���U��={xS���3�& �E�A��������IH��4���_P�U�b����^�`?�������9�����,&����	���>$�f����
U;-m��L��,����p�;Z���q����3.xB�#���Ah����Wqg��U�2�ihAy8��W@C,Zd���K5~{�x��jeIZ����_��R*���]F���.�BRD �da��\���.c�2}���K
j�l������-:����������Q/�����h��V@��gDEW�������Q����(xE�Z�EI�zPQ"�n�����3p������Pp�"
�dE���j��Qe��s j+:Mw�&EKd7B����35���$8���y�]@������H1x�
Y���>F����t�o@�Mk���W$fZ���-\���m�X!:���g`3��������`��q"��[�0�A�u���B��C"����%4��M��q������0��8�w�0������{3����1�V��+GM�d/�f�����5����?�g�]��m�OJ��D���a4��7�Nk���	55��6[�h������2[������RNeh(�|?z���]�P������-.N�Vi�Ia
xp���a�5�U�B��!����Yj�aG�h�������Y� �������.p:�P�.8Ai]zHM�vR��w�����X��Z�@�:R��[������5���A�O�nA}�ud8;z�B�SN��,���_�
{7q3Zgw���6J�����V]����H}�������X��>��9d�]p���)��vG0�����]��21T_�T��X�`Y�C_6��8&�T�/���o,���)��Lk�g�0��[�����YG�a�����p����/���N ��]�.���}g�h��������o�	����"�I�����G�^�����ZgMr�*�L��(��z�aN����T����NJ�<��V��?
�4d�4Xn%GE�y���Z�&�@��]�MZ�/������Fk��EB���?��DL�~�o�Y������s8:�z5�1�B�M�P�e���N����q8R^���JDw-UK��A���G���A��4����|�I��l��8�gag;�(��a�UH����E��-VN�aFPb���5�bu*�����&%+�����#��'�{���G���;��#
��\CB��3�g��
��������MbC	��t�4�.'�3����H,����R!��V��8��B�,!EU:|�[4�"��p��H20�
�{T�&^f��4kc#���J��H_3�.p9L�����mQ	:6k�;�P���C@��� �����k���a|?>�a?d�F���H����o��X�H����f_���Y)�q4+��t�g�"a��q��I�>���!<bb�T�68`-U��SX!������i&����U���n�B�6�]���,�0KF����RxD�N�CP��|`'m����{u�9�R*����{�.�%�����w�S=D�<|�}��~������|o
�l{sD���@�7`��������q���Pf�1,����4��~Tn�����F��dk�!ZO$��rX�%�� ,����d�� �
�v����$��cSK���)0��p�a��.p�s�/Z	M��������c����:2rH�ls�jH-�L4�Y����s1�`��l���\�g�C�,x�'�L�c��>��>�xt
����3U�������0�{��XXAY
���O��
i�>lg��eP�bj������z��?�`�v<�tL�������x�y��nM)��W���.��vHv!s�����w������N����A������?Y-h8A�Z�,�!��#C��&c�������V����"����S����n�r/ne5����Br����#� An$A6����1���L�������#�
Ng���z=�`| �F�l�J��xL��
�i1�������=N�H�3jspst�@!]��Y�{��q���,�rZRA�h�7����P�A�m���iP���i���/���`��,���j
MC+��28c
T����F�K'��L�,`�D'�Y���\W*�>O��_E4���htp��L`�E��f��5t���S��O}�h=��oFa�B����Z���y1+��w�5njQ�6��~� )Y��=wC������SJ�������/��DE��&���������hD���Fw~2����
M�h��8�8�j� C8��$����uoCAw����|��������YN���$��rEE�l�����Qc�?�L�;��D�)��);�N!%Z�EdH���mq4H���ia@g��7�� ~�QfZsA�s�1zK���4��!�p��L#\���4�����i�����N�/
`#������N��7]���6���5�0�q���*�(�����2����	:���i�?��j
Q)}�h����E��i�����?C�A<�y��l�6�e���/�	��B�F���L�AB=Jt����,�"����x���h�	���x8�b/�����l�� O1�]�T�d-�S6�����d4lI����f|v�M�21^z�
�����EML�T8{d��)lceW�B���"�=����h����������
�{_^���_�}�t:���-����:��������(�Hm��'�m?v��T�$^����w��Cw����'v$��1l��w��5��x��G��J�@�{�d/�6P|b�1��#���F��+�h!!��������<����-D��s?N>���S]_�o��t�����[!�gh���1����|<����U��2����=��`�[s�sL���i�YZD��e�I�9a�NtTd��>YG�����"��e�9������~4���G_a�� ��d�}��#��}j��(�Y3s9�B��[$�A�iwo���?npV����jw�_T=;��.G]C���9K>���m���A+��b0��lO��9�B��9��1��%����C���p(j��\��X�X����a�Fk2v���H;���F�������f���j���;}PJ������|Y���n����Td������g@���=��ul�}?+����e�l<����:2�}6r�Ff&4�z��~�S�!�����46�w,�[����?#�x[N��D(��^�%��1��%�@�M�l�o��;v>�[�����+���O�����c��%��G��e)�{�D����RlJ��@����p��X�r0���0�L�.S�r�jBf�\46^r��������F�� �����m�l�����[��h�N��������f6��FS���������q��L`�bA�_�X�2��%��<����e��W��f�m�a��,�c�����.��MT���Q����������%d���t�>���-��w9[��"dh4�QW}M;lW
�h������MK|o�*N�l�@��9�/gj�@�q�����h��\Z4-����������)���M5Gk���I6�.��Z��7>�O��_pv��e
���W�����f �]����^������c�TW��<%������T��T��Eh�_].���rj��d-C�������
�/��������n��-�v����K�����/*+�����
zH3;
��p��-l�����=XF���~�����tr�&Fj��-Z�
b���1%`,�N�x*0��V�x{tvw��[!���U�/��*�
����^[Q�/n���wb���6�����'Y�*��6 W�|a�8��Y�j(;�o���q.� ������g�
��u�#��"	�l���
�����G'���SL�k����:[{��*p�;�FG{�E�^�]��<p��-j��|6�K���6���
��0�����Z&�.��:��#�Rv?>e�U
���J����aD�$n�p�X���-@��x�^#�:�F����[4��a��"�}F��- ������[`F����\�ab�83����&4���Q��Q:�[����n*^4+�uAa���[5:o!E�U��������U�T�<
-`������������}&`�_G�.:�{��p����cw���U�������K2>	iY+n�P>
�6�0r"��B� e�B���l `e���DdE����Qv�v��A�Q����Ue�-,��e#���cjWDp�B%(H��S�&�������.��k����-L��I�2�#��-$�c��*�����&�o8�-#z����,"�m�,����Av�@�;��tg��Wd?U�(�Zv���'����
x���<-��<�lz
o���G��=~�k|F��A������O�"�����;��/{��RD�-����F��-�"�1��#b�(v��0�������.G����e��iX��h����Thl$�m���=7eF6{}M_�U{D%�v�d���8�7��m
Q\��@���U7]��p;�AQ���uD��� a:������.@���� ��f��poe<�l)��H����Z*���?d�D0iRRz����v)1��F$��}�|R]�xPk�����F��UkV<d�Fk��i#5[�V6`����r�h��@��T��wU=�+DH1�3���*���w�2)Z�?��b�'����������#yR��v�EO�k�Q��i���
��h�8YCL;�0��"@��u��S��5*��c!M�2�c� >���b�����Zn�-u���a�^��_��V<6WB]��R.�����C/��#A��eE5��H"�p&���J����`N�9�|��h��H���g\���c+���`������D�[n
F�����F�����1�C�V>+�mQF�8�O�z�O@�`4Q��������g�M�P��� ,`���:����|�O�A;H�#q!KJ?�W����^������E��^G��c��S���X8"��#��Ck�JSwN�Hf[�K�D�d?_�����df��t��
-����������KP����KH��L���K*�?N����.�sv��M���1��>�n�k�%���K�~LK=�c�g����w�U�F�]�A=a�v����yB�����#��%3L�3�Rf�
���*Sn�a3���O��Y���t�/���.a,�>�J*L���{,d���#��e%��B�e�t~���G�A�����bf��N���a��8�?<Bjd�w>�Bt�	`�B+�)�q��,�v���e�����6��5���~�zo���W������
�d��Bf�e	jT+���
����B��:WG�V�9;��=U�Z�:�El�#���8a1��bfN'��]Gy]G�������^uF�jG;��=�%����@�(�,�5k��?46
_xX��L�cE{O�D�g��YO@1c���"�_C�Dlo����x�cq��������/�:�����������%�cs��?,��6P���G���G��Z���rpC��!3���5��=�z ^]v�{�w���?�����G�������|w���d<6K�%t�xG����<9��#�I��w� 	��d]���8�w�l���#��F�WM����d��t�L��w�O�\��;P�{�#������'&�����Rq���Z���b+y��5Y,�k�_7��QR��@%�6�0�-�P�!2'��b
~��iV����{����}p:0~V@4w��i��$�a%J�w����i`<Nc����A���DIf��;���1�W��Ha��T�������U�_Wi�T��������{��|��s�����_�}@�q4�!�j�d�H�d��%
��4��-�)yG���>D$��t9w��}G�@�!�j]a��{S���}GJ����Y=����-��G#����]"=�����{!�iI��t���A�8�#?SJd	�����1m��&��VT�������`���������z�*4zc�y�Y����FIS�d�-h.4�h4�!'a����;�T�h�}Y`.���T@�E�����)���O�c�(����r��t|#��������Md�[w���&�P����$j�}���JB�|�k��4����G���B��p��������^H�����iG����)U���3Q#R�{!u�n`��q�O
B�*YA7���S(�?%��~���#�w����}p~��8%Z��BN��)YI��;|�v~�l�-.��@%���,wI�oy���"��
7d��j��\�<@�+3�y��h�����/��t�qEZ	%���g���G�����z���?��,J������"����:�w�\Cx�,��/���a
�1�n��t�K�uD��^WU��M.�>`D�w�*��fG4�����H�"B[�,�2�o��D)���������2����:��Tb��#���	);����	��f�}b�B;�:��n
q�	f��V���2{�_Z���D�����j�[�g����l43�W��wZ0z����"��m9�Py�E����E��vh��T�8,:<��l�:�]��J2���fy�\�l�����,��(��,#��{#Z�����cq�L�Q7N�����l������d���h{��yP��-�������c%��M)��F�K�C���b������[>�B2j3(F����Q�Q��T���H�#�r\�<@6��%�@Mu����Y�C�+�(�hp��p�L���G��
��ls)�n���������� ���l��q����Z����l��/�"wO�H6��P��+�QM��-67���c6����-�3���cv�q-:�F'��Q�MP%� �o���m�^H���*��y�E����4�"O��9#c�Q[���.�����ZE0����-XJ�A�f�o�E�����w�^�`���_P����v�M�Hc���q����E(>��@@���+���|�Cb��|��`T\DT�w�����;^�c�VzNt��G�n��+a��(�-��}�B+h�dK��
�<�6P�h������'HD�(�0nt�v��(��d��w���`�<
�l��@
]7k��5,��/D�qv�P��4>(^���F����?`v��9"G���2����(�.������xOh��u��eop��0���g!
D�R��{����G����x�X[f��b����+8gM
�
���;������N�9*�?c�	"m�;\��+.,f����e����wB�^��G��a~J�`VYdx>�t�D�5�
j�G����r�/j��'�Ne�nS6P����Um�|?Q��(�_B��?r<z�������{�Y���=g��^�~�����4��������uN��Vxv������p�(U�x�c�^�EYJ�?�A��lI9�[�����$`�j������+Z��5�����~�Y��>�SW������E��w�(���IX��v'�C]7)Cv����X�ow���/�mG�u����Q��h��������+���[�-P18����������6��J�J,��d�@�V��4	�j�
~��>��G�
��h�-*�j�;O��'�@���Z5���G��F��R�
T�������/=��f`�J>}�3�M���/��h���K��V
�U��"5��N�'�Z�W��8��"FX����A��t��5� ���^(�4k���O3Gg���[���dU�B�P3�Gg�$|�jJ�F"�wm���c������^�;�w���~;� t0|/�5�R3�>T�v#�w�2bi���R��&�w5uQ ��>l�	T�h�aS�la����n.&;W4�o���]��v��i���
�������
>�L�AQ�������.[#bI��,�G��")%�� ��/Z�MY�"ba��5��[q�;]v������V��L;z��Z��0���D����SfFI�����i�hsL�Q�'�����k��v�-�F#5���������=0A4���eb�*�����u���h�c���0j�il�,��F�]C ���gh�a�Zb�zu��F�L���Xw��v
�6&�2��E��� g���H�t2���.�t�_4�7z����$�Q�3 'w�X+���6�/X�1��Dr��~�$�x������.J�>���f��\��pg���mdt��]H���Y�o �f�V��h�~��P��%ZW�Q��;H���7�����YN����'�ZD�$�i�
\�i
����p��R�����,D����e�� ��W�}A5�M4�d�p���T�d���
P1����_?iG�@��!2*�����9W����y.9npc�[��p�_����
w�X0{�e��MM�
�LC��n(��':�6�
Iu��( XS���W����[B��Ro�&d�$�	#+||��;m�����?� �Z� i��\7a�a��[<�g ���������	�H6����%"�7C
2#�p�B��aB���*Q�[�s#�B4a
 ��CM<�X��?��Q�	��Rs�s�o5n��ImC�r��Mh���nf���;�����k��l�MhD�hnNs�F�d��z��K"Lf��E_�A	��E���i�d���L�/�z�w���/��ga��U�����4
q{M;���������5���0���={�<���1Q�B!s��x{��������@~D�S6!��$	#�H�M�����5�j�zhNl�3�8�F�9
Q���y�f�4v����������������v���2������^�%�)n�Su<E��&d��^"I<���$�VV�8��T�(�l�4i<&���
�=�*^D�=�^E��Y��R:18l��`�,���:j��#W��h�`���kSv�o��_���	�..�[DF���P���-{��"�p��j��;���r	����:��k�`�&`C pfgX��Z��lVP A2� +u�i��ARfX����';w	�������z�i�@hA�����w�--���_���v]�X{4�����lG� �%1��7���u�Y�����n3�W� |2NQ������%v�N�H������~��B�}�%$Z������MBex?������bMF�E�]�3-l��^(��y9��"c%I��l��xK��S(	��Yc�b=�\����i[���1��k�����L~�NY�=9PN��\7)����^���O"�;d3�a*{���{�SH()���$d(���H�SH4������g4��m���$�bG�3�����<�����4����lnl�vH� �@9����v��:��r�F������D-������Z {��`L�2"Z��Vtb��m��|�2��pTT��$F�C� 
55>/�A�F3��e����N/����`�,*�hA����!�S-����K<=;z���b�S�E��BT�K����K���5dT�8�a
��KB"-�����Kv�A����E�������=*���d���(����m��D3������x�<�S��G*!`���&n����[�������Y�� �1j(u#���
Q��[��D���PY~v!2`!���30���`��=*
uN4������n|1�nG�����'�����b[�Q��,�#�4<����O�8��c��-��R}_
���!p��p�V����hh�|�L�����+�-�Z�x��������#q���X��16�u{d�t�
S(tb�2�����r���|���������|��+�z�6{	:�H�&������M�R>XC��0���Y#v����q����G��>�j���5.�1���zu3'RH�8�EJ���+d���R>�B��S�3��[�P��2�b7a�������������_�N���\E���B�2�b���*JU��6?��e�������������+l���\U�i��Y1������@��+qd���6&+�e���C2�!@L'���g����:S��	VQ��w����7�2}�O�+��&�������_UB24�����7�1�/v�d5e�i�HFe�Wb����f���k��y
C����Z��;��

_X#.�I�3��3�����-n�BerEM������M������?�����h��0��Y���0����S
if�>��="yB��>J�R��g-EC��n�����k���D+=�������d����B�]7L�������%Rkz��u���l�;�lo�����n?M�O�A��a���[�1	)A�1�G�|�P�;3�~���������G��t|@��>A��EI�0��x?eQ���dc����r���x��7�Gu���(1���� �M~�k�A�������UK]�����Qv� ��'
�p����������EUK���������Vm���'|KU��>�F�[�IlQ��0q����������#����<%�m;#�@
�Q#��t���P���EY��9
�U+�E'�������Q3�Z��Ec����#���k���-Zk�>��8lP:�0! FN2�u_�@��a8b�����W[��{��G�h�PN�8!��������0:����FG��h,wyE,��A�h!��?���|���5���<���K|�N�+A#��u* '�y��1?y��}#�hA�T>N�8���D���0f<�j�F�s�/lMD=�Ca��|
���y�3Tf�:)hvH���+��B�
����>��$-�x�'ra����8%��� ��JQ�u
v�����f�j�;��$~�^�L�7d$�b���8�����n��9I�D:B~#FORS�0�U��,�� k�H�9F�btl���e��_���S��D��� �u�5&���6���O�`���K� zVqv�"*V��
%���J����lB���j��m��~g�	S�����j�n����ES� ��by,_A3����'����p{@����	1lX]����p�X�Q�NoW�3�1�?X����d�����G��NP�����@8b���Jc���~<��3��o`�	�,�#
-������t/E�"�oO@L�q��������v�������i�C���c2� hY��RSgQ�����KB�-+%7`�����Z}�py�)�F$�9��r��h�����C��3Yf�J3#�b���@�q�4m�t!o�� >�1��i]�f������qu
���~��h��5I>P�3��t�!
rU�O.a�A�	%�H�����a�*�W�7#�@��4����Z�C��� T�N#�t�
A���%p�(��I�R���Al�[�2��4���3���e#�f3�5t*X��;�2���B��6�f3��n�����LcB���Eh'��\*��y��������I�@��?&14�"(�N��D<���h����e�(��X.��������=��P��P'i��pwT8��E��Q��^T�a��0#�M��a;h����h����%tc�+(=JagU-�!�
t�?��z3��?2�2|���F���h������6��S��t��2(|4
!HD�������Z���+{&�������!�t&����F��>��f���\���F
D�-�`�{|��W�l	)g/����$<�Y'[�^���b��g�1�� �i@���%g�Q�o��INJ�<Jo_����;�V�����q?������Z��DG�=I�����`Oc�`�?��O����l�'
�eB}��~#=(���?W,�Q�f @�@�����htBd'�d���������[04��dm�.���X�M� �,����3t������2����������{�qJR�
=�����>w��!ec���F~s�G����t���e"�1�����I��3����n���	��%�_� k,�!;3}{X�h@K�[�r��m����lHz��*����
�L��7�� �!�2��K�:K����@��)o���q#�����������9��
�>�DD#��i��f��?�ae=a{����+
��/�
D�e�v�z��S�����PA��8��[{�
�|#�v%���uS��A5�+�
�3e�.�W��C� c��g��~��
�Ja������HE���]���u��h[���f�0Ow����+��������Vp���E���-��.�����~�+�	\n�W�X���Bf�������W��b:j�����G.��
�c<�x��6�]�z��t�f���~�
866]5�!�,d��C����4���<��!����C��*��q�Z�%��B���bJtO�"l��&v(�%���?�w�4`��|Ib���hrn*�o�s���,O���Ecw<]�5��UBRO�f[��f���$���1�A!�����;�j 5�u����[���M[��u\:[j(;
�k�o��7m��,��%W��Z���bI�n�m~�O��f����x[9�H	+�=��W��uV�;X��B�	���:��*N���4p%��Q��G8 ��lT�F3��q�V"�uz��I.�}��d���X����n�1x��JsKl T�5`����������EB�p1�]>.���4�p�����}���d�c�v
��tb�'B�����Zj0���o�����uNa���������
�T�`�`�[	{Fs*���:�eF�8�GnL��Fd ���8v�-�I�H*��y������oX0p>��p�X"�/��b��C��_";�0�vF�
k�%�i%t�V�����������t���<�w\X��?�]���a3[gN������5�J���qP��t�f�G�������+Ii�h�Q�	�@��s���Fi3l�Ih�j���J����+�~���b�>�,�*��^�3��v:��&D�#�����y��������62��������r�/�v�uF�����L�7!�.��s���bh����X��Z����Q�c�I	��;��5�{�:F�������^��
����h����������D���.`��5J�7�Gn�-�+nv,v`�t�n=x�}K�x�:l	H�������>�n�a$]Y��l`����)�Q�3v�h��L�_I2#�;��X��&-�W���	�I;9k�T���=��`���@="]�������GUG������k���[��Z<d�Q���F�N?�Sm!bl�������������uVf��/!�P������5�m������oQ��p�^�1'm�w�R���f��9(/B&��=v-�9:��J��d�D4��^�����&4�g�����`+��m�vg��5��Y����`�m�@��N����e��E
����5�����
D��R@^��U&v�}�#�L�����������P�N5�1V�<��Cb��N���V�B�_��f�i�N��w��������]�]k�D�#Qz�3LY4��1S�2������7EivZ��j������3�zh&G���}����v��'_u\EO)�>��@�E�����e�6C�o���i�������D>&B�g!����b�g2���g��t{�S���B�d?���}����b�J��-{����v9�[Y�:>Q�F��m<@=����mP�������T���I �;`���T}���Sx���
�������n�	��dx���l��>���D�d����=7L
�����5�%��8���%(*O�	d����.#����}�z%�
�^I�/�O�v�������}Fv��d���&;����;��PfWP���A�}�%�x�=d��'��������5�>	)��� �x�4�C}����Lp��Y��vNVn|�������g�f����v�Y�s���"�[HPu��)fZ{�,<��� ��T��>D���s��K���I�ry��c��1� ��`���;G�c�A'��j�c�����1u_�������;�/�Yw��=�s�������
�p:y#
"�^������1�������[��{�AB�9L��^�YE����&j7<HNxKp�r�P��x��	�N�fw�j)�R4�����8g����1�SF�)�F�v/�"���1�:h��rh���$5�����0f7�UN�h�AD�8�&��
��B�'h��c:7)SB�k�P$�w(��NF�������C)��#�B������C�����m����wtr$B��c���}�Q����8��������p���.]%bL�d ��I�u��&�fs���I��SKx��q�a�joJ62��Jw^�
b�u,��lA�KryD���c����4����{����t�l�C-qvO�����:,��;h��S��JK@��c(�\�W��qO\�P�|�/PU��p&�b��B�:-�#0�!�m�c$Bl�"N����V��FpP?K#��e��Hg�@K�9++���P6�I��H ��,K������c���V��1"�`ug��J�{P2.�[|�@<��%�]���k`���hQn�~~IW�-�[cD���??��bYcY����,�O2�F*��H�Bm�K��!��_z�q,I ���)���!z�1��H�����:A���a�^tV�b���(D�:F�Sz�� �Zt�?CIA,#���a����J��h�AfeMY+�;'E����H�r�P+YBY�My"`P�B<	�M�u�>��L�b������3U:a����D��V(�B�P��{S���I��B0�����i1o����w�������1�f M�wPD�������Q���I����rz��g������Od�X��H�JNN�u|N�)y��
���A	�A/�x�4�����������hs�T`��������ch�h��dk��U��}�'ZE�\��k���Z~C����;o���F�tBhz�a"��d�G�H���C������5�+
�w�Ru*{���`�i��r�	�����;G�A�p7z	O������%'���^���q���� B�wx(���-���r����b�+M~$������D��^E���^#E�����i�	�v>�&a�/����9����w`2���7��}��$�X"S�������~�8�Pw�BH�;�=��X-h�@��\��nj�6G�|���U"����X	���CN��p�Xwg�%�n��{3&	9�dg"#IK��L���H��;�O�2��Z	�%>�JF�$�����nI�e�{�e)��u��e|�dA�2�v(b&�C�;��&��W�����!��v����C��BY��2)��,m����������V*h1v�1C�b���_�X[z�Ht�^#S�@��;�NM����1�6�{G��1u��_�����fe'����2��>��e�4�+��

'#>��%���6�j 4��N���&�(��T��6�JDq�HeDE�O��)����Mb-?�����v�����)���>����:^��Jt)��x�N�����f��M-�5�3�����A�9�:
P �;(���E��Y=�%�{!,`����v���P4�5�
Ui�re%��:9;��p!����fG���L};��n3�I�L:I{/����R��~G�����	�+,2K*�{��l4�N��4y����v��F1xz�J�AK@16P$|�&�	%H���}OY(2�\h"��m��`�Jv�����c?3�-��U!��=�b�@����e�8D�����
r�W���-Q)�B�'gI���N���m	��������&9����@i)�R��I�����������
���bA�n��4��}yU�Sw���w��'h=,I5�;�2~���t��\h��,I6>jl��RO��a�Hyd�sA�,F���m�#}���hRE��+4yG&������B�
mtl,�)��Y>_���N���p���Ec��9�� �X����;B���A��_=�������L�d�.�7 o[Il�m!#��B���[�����`���,	?F=���c-Ubs��^�z/d,u�U���N�%���b��XI,���G�m:�hD��{���$����d����R�������5Vi� \�YT��`��6l�&��EG��Bt�����W���n"h�+�����p#S	��#���(U�]���"H��,#���h��Z!��Hm^h�(�g���QT�,c���F�1��%�A���h��@�q������%fB>b�|���O���&�+��Y����g1F�(we
�	�
�&�k��JdJ�@�g�N	�U�b�A���Ob��2�xf3���(��Qz�l�0���hm�p��V�T�5Hm?P��^�� ��VC'_� ���{�:���f�u����I� O !��o����a#�Tf1� J�~ycgW
������c2#(���x�,�8#����}��CP��H�C([3� Y�+GyAK��:+"4��P��U{7n���	��G������U��x��O<��Y����
��n'T�[2	�����6�p���9��b��~��,���a�����z:P+���r�����o�K��S]���L���v����P�_k��T#
�.��6�8�T�F��>�:�gx�3�����]'0���$;��'��"R��\�C*���X�|�K�t��K,��v��C�u�vP���L��x���K"eL5!D�:�'`���D$����]�&�Y�B��\X
IL��T����x��l�A���e�9�>8�a��@���$)�����L��d�2�9F$j��/����G<J8�,��r�4f9t��'�0j�c4���
�J g��5h>��/���!��N6���|��b�K�_�F��b����
��|%���Rl���GJ����~��Rj�O��39����@���_�qi5e��x����
��)2x���D����<2���r�x�V��	�"Id5����5������m�=2-���U��c��'>"fNWc?BM��xc�j�@�b�{�-������������Mx�$*��F�����^�>�Q
t����^�$���j�<�@ ��Y�$L����Z2��"���N�r(������<�v ��w�q|����u
��HBw'�5B�����������w�D����]��3��{�<���=j��i*����F�m�w�!�Ut�x%�'��1#���@+�	��0:	V���u��':?�8�M��w���@���t(A��P�B�jM�x&���"�fM��� ���������2kTJ�Qm�^D���'��3�]z�Z�~KK
]�!!����M�A�a�k��h�DZt��

�QFq�t�R}���g5���<p��
l��<�������'��4�!�|�����#����"�L5�����L�>��p
��vEe������\�[|����� w$wj'&��;��+�j	���Y���<�0GTG-��<���1u����P�w5�!��+��0�8U^��&�jdpP��#�:�|���D�
��j-{�oA;�� ���$��HkTK94�yu(;�����;t���N:y->J��w��DF��HC[���%�����x����o4���,�(����)�!�G���d��
Q]Q)hxV
��DH#ZKp4B�Z�w��j9�nH�VBjKNi*�k�w�OM��J��6G_��uI�5}�81����I��G�������I���)��
4���0�mD��������I�������
�Y���2�h�1?9������b�d����[�A\g3��(9c�Jt
o�j_��[�?�z����R���h�L�j�w���5KJO6�@�N�?d�3,������2�{3�1��h5�}3�a�#���P��D��x�-�-��s)���� �$�;������K
ZB�fD,���
7#"L������XB���#�����D���`��(+����s�G�����z�����A�W��l����z057��������
�1lI������}[$��E_O�e�s_f��z������"���`�y�h���&I$��q�d'��=H���2:��9mjc��L�VR�5O����:[�
V��%���
�t�g�!��dtT��h	�V�=B��yt.)����~��z�-��3���K����n[�����SZl4��""85�n��3����a��hH�7-U�
��C9(�u�nz�a��4�	�$9��qu���%��hqL����"\����3�������]n��#�9�do�����K�oc�-xrl�P>q3� ,a#_��\�0sP�M��
BZe��Po�^�����th���s�z>���YBqug�j��2;Zk��s��,�r6:s
GT�/�Z�$;h_�	�~�����f'e�K�m�����7v6��2]�s�dG_������G����?���N8up>&}�	e����Y2;h��yn����[�\D��%,/z��,r3d/I��:P+s ����-4�.{��G�A�L]w���9�u��A6��aS���}���;R�.�)r����	b��^t7����8���B��:��il��([7=1�$5�qE�Z�X X�Xv,��;�����������������n��U��� ������N��v���WB�J��~����+v
�o���'�"���V��vC��vz,5
��������.�������P�8�mK�'lSp�_'�� �
��fw�_�Cjk���7{���t��i�P7������HM������S�P��
z��k���������������(�{%��y�����k�������%AJ�(���";��JX:z��`B�H�1�C�`��{4�u�@]���)�# ��e����/UH��%���#������ NF�"!����
���_��HY��80^�����e=�S��!�-����8�P/�����g�����(���V`��n����1�J���iw�##�l�o/�>S�&C������b�l	{c^���=���-H�"����aB<=r�T�3�� ����V
��U�u����gJwM:�Iy�=���s��1��s5������N"�n0�k7� ���P&p_�J	����LO���XA19=`�luE�[� �<qiG��t?K<A�W��1���i��z�a"�l�1�P�mA�c�t�����	���aZO��pW�f���J��'z��.�+�v�
}���P:@O ��F( ���s�F�����aN�`�"�L�0�6�E�"{��H��. A�40��j�������������0�'�XdgV|����Il
�	���+v��r�k�E���	
7�p>�5����=% z�x�HU�(�f'��?{�(��S$���� 8]g���e�+��b��D7�(���{���v�%�:X���!%Z�FrT����	��1���,�%
.�]�Z"r��4�;T�_���O2��	;�cG	�Z"d3J$2j3����Z�mX�u�:��`6\��R�C	�� ��5��v4Lw�7f�AG{���������U�G����c�	E^�S/8�:n274�-Z��(�A���>�3�1���NKLu14�+'��F��_�B-��C�F��vQ-h�������qIfK�a��������c|*��H�����TY�|r�	�y� 2��T%���Sd�A�_*�$l���${T�[/�k�#�w��1ib���>'����0�P��U�M��.�F����H���L�U2�����
4�;
&�
CE��S��s�.���Q��S2�	g��KG�-D#�5DV�`����-n���EJ��(��[�!o�ap��.(2Ox�Si���`�FS��50{d^�dyr��B_����o��8��������$����O ��\:�#������eqS�v�5�`'Ki����ir�Q���Nc��kcV����������Ag��Z?��������Zi�a��� =t������A��XE�<*��kF���z#�6����F��o?f������f�q����9��� �I�F�dx������-v��Mj��
b4�����Z�[}\�-������p�a����?�J�K�{�8`dAA���5�*�6��.3�!�P4����?+�/�;��@#E������>x�	���<C;����wt��1���P.�-�%`��b��]f���d{���9w��{�h
���X����i+�N��o|P�z�����db���}�O���?~� �w��������2B`���Q��}c�]�.d���n��!4c&�A�I"�})?��3��LK�����s��
�Gd�{'veO!p��p��l�+�Pm�!�-	��A�����f�zO���
#���]O����3���~�	)+�f����,�p��nkVA��c0�:H{����i�o���5
��;\�!u&��-?�>�R�D����w���F�~��\��U������L3���$B������eL�/�VY8�tl���>����v�d��?I?��x��<�iL�f��EP�^�Ya+#d#��4q�L����(�!wV;$TZ���E;��I,�N.�%�W�-�>�8�
���!:�h*���mL����|��[T���/&�G��4����!�T���&��
eR���1�l�2P��"�r���B3�`�`���
�;�/���k�d�Y��C3a�]���[_��|� d7�|"f���$��s����ET����M��k�>��.jq+f������hP�v-�
O1���h�f����l�M��������3�HuP��iD��-���!Z_f�v�
1?u�]�F3dx�Q�d�������f{��M�Lv�<���W�L�HH�����Q����P��)�H�puX��i��uR��>�?L5�������}UE�������_.Cu�X�Q�X��o;��[X
���G�����
�����1��4���]+�]auX�������NW�*�N	��F0u~X4��DR�t`l�O��(6����t<f�p�f{���z��#$'�~j-��|�H�o�}~��v�G���2}�#�_556kx�0
b�4M��'�(�����~k*�$agIy�D��^�wX6�
:,'~�	8���O2�TEG���,��A����S��e�a!��z{�����$�b�ce�f�v�������+������\s��-#
�jl�SQE��*]�V���>�dY���PY��K|������	�b�Onl�Hi�y>��T�EE�#�HoE��^��M��/��R9�2������w#	����ZQ3XTS��oXf��:P�e�?W8�#n��� V��Z5���t]g�d��rw�b	����gJ��G:�����-�xE��U����Q4��0����&������9��{��-'�����:��t�����
J7��-�u:-,C
b���S8�����a�AL�^`4��[���B@+9
�Ca? 66O����qLZ���W���>�*��=k��n(AXLC����I���}����q�`E�FO��92��"�A�
���tt�<���|��h�EiZ�FV�_�Z�#\�S2����^X_��_�B�$���={Ci��n��U��Y�l�����On#e\�����O�w�����K�
���*S�)\�>(*���1�BO�^k��������r5�p�f�	�4��be���_�z,���(r:����f4��!yIs�*U��x���5^�Oz\
�Z+0��	��F�9�et%���������+m�q�2W��'��L��bs��D[�h����H���,Wo�����%�Ml9� ��Z���cB����*�������bR���{��i�B��g���t�
r��H���.�'P}w�(���d�0PY���X�@(�|�P�:�$��s������j�bk��7�<�V	��^_ �\;���>��I�b�9c��uR�
��[T�ltS�q�Z�.#��r��h/i�u��r��,DA]"��Dm�%�D��eB�,��:��W�l~s����\ ���'��?5#�n�
�S4+���� ��h��C����4k4�|���'(Q���zGq�{7;p&���;��z��mdB�I9kd�������������KO��@������J�������"����[�BMn��(�#had���!>�66Q���O��R<�@�%����[pQw��xh%��t����v�m�b��h*����������+��h�~M���k���b��/�t���I#�K���E,F�?~����O��bw��������bS�:K���m��Ct�0P�K��*�]���
�	w�$6�;3��^{t���)����V������I����r|��$)�:j0�H ��)���o�Rv<�Tk��!	�����"�xB��a��6�������n� �m`���o�*C��f����!�"4�d��UQ�����B����M�������(����kq���e�B3N�����M.;!�"l�����=��j�m�b�J/J�x�Q�o-BT��?���zZ4m��q�9�=�?����?�/�k��la
����}��6r��������m��a;i��.��@u�`p�D�/�?�e�J�e�����$����D3Z�>�d�n&����CwSP7`�p:�}�i��k����(S�7���q���gmdVr.B��������lY3��������eN�������q��--�N6���
�������>��(u�o90{�`�3�Wh_2^!�R�j�b�	V\M�[�Ue^��sd��?�&�Ro���6T1Q�|�l�W�H�8rlk1^q>�0v^�cS�phd��`lR����ie���3���f������C�!
��Y���� �_ ��E��m�B�u���S�o�E�L*MQSc'	�-%�%�R�4����B�������B��m0�Y��? #�m�A����c��U�����ub���;@���do����a'&�����1� W����c�A*��N��m��������w���Kt�* i�������|9L��t��)"!-�	��n�Zp�[]�����\��B|�TAU��E��&)'�J(��UP{�gNb����X[u�_����v���UNP�C��I����VsI9�_PY���W%�d�yX>2a�Q���	� �g9,@b���q�I�����$E��	a"'VK��A�?���?$Zgc��N�'fJh��#uPH�������i!U�X�x>�Z�����^�F��iqhU.�6!���7����xly3Np��dol�Z�����O'	D�>A
P����~h��1F����������eW u	��A��,#k���m��� o�R,�s��I�%y"�[yh�����N��-�O�x��%�b���p��$#-*����m�:�gd��Rw�������z#���t����U�����!:�d<(�\�0��1��c�@^hj�+��O����\nB�Ka�����!����?��y���1�pm7�Q�p��qbe���
�H3'p�}2E�[ffvf4�
70��I����%}*(��Gn���C����D��Nh�Of��@������Z1�;��1Fd:��ob�h���D"C��o���,�/��3�3PM��m� m��G�O�K����9��M�A	������ 	�1tpg��������0�x��K�Ew�.d�,��N�K1�Cc<�
����"�x�1F%;;G����mR��c1P�~sw�d���t�`������ih��
�
����!�;������><������@o�y��$H�J���#y�1Jp�6�[��J^�;��4��d����{!���Y�;�+���. 
��wtX��(�G�F�w�a{K�I�&�H����fW!{Z�9w���E���H�,e7IcY������))�.�;���_�P��L,{���r	?c?�%����%]�w������:yG����zT��#�����K���w���������}����r������-�I5�^���jc��}��t�n[F�����:s�u<�V�
���n�j)I@�U4q�:@+zdsF������T����R�JCS�Fc��K|��FF��^�d�+�����%\�+rX����Z�����������%��E��-h��.{I^��8��#�k����`si����	@R55�����>p����^�h#	�7I���W��B`��%�I����O�6UG�Z(���'j^��4�k�@�����>���E)���:��Bm��C�x�5|����"��;���m�"�i6��>�SX��A��Q���a����}4�OB��|�+���A|���0��A>���g���s��y��N1	��U���'��w��ud����dg�^���':'����{	w�������<��}LzB��H�����:d����u)�k}���N�_���e�����v�-���R�@9�u��)=�-h��PE���r	�����WE�Z���n0�P���r�pC�o����u������YG���5Bo�<��p�>�Ig����
eE���$��b���6��)�i�hB'DZY�Sn�w�b�!�h���\���	���v/n
�f��Ke��DR�{U~t�������#X�W4V<��������8�������)����_\C
7Og�F���#P8dT	t�����.Q[��t�&�xG��;S�� �.�QV"|�I��n�Q����H�x�=w��r�H�d%��;���<��i�AYQ��l�A��������W���lq���%�v!o�D� ����j&�"���A�b�A^�:��#l�+~/�M�G�I�U�jW��),��6�WI"���HwF�S����b0B�{+�.	�]K����)���d
f+�J�d��\g��N��FlT4��<8(L�P�z!7M��~�� �+�� 7����;�sI����)!<�,_�*4�N���^��lI�QWi�z�D'����t�m���J�	�6R0�P,1	�S[%aM�6��%�;�FY%a&�4	�`��{�������%������mBwR2��D� ��x����D��)1	R����h��k1�0�>��������	�["\@��b|�"WiY�.�r���C
o��]��K!��V7�OK��[0#[�U7��oK����X�9L��h��\��(�T78�l����i%>�N�F�r�!��9h��'�
��^��:U��G����x������(��-G_��s�����F����)�p*��tP� ONEu�K!����1X�U�_�,���U+�����-���������DeB�~/�|��1y�g���+�R(��O����48��$"���6�*�hr
C��zw!E��r_C���U}�l�e9�=0ZZ�R�g,��(}��4@!A���2�E�z�$�A��w��*�����QX-O�4`�B��,19&l�Uf�2+M3U	B^M�����S��W���>:�m@�]��Ap��Y2GI���!jT���2x������w�J�n�5LH��������#��O��<t
�\���B������#��U� F����m�����jF4*X%�Vz�(�DQ��r��k��"o,���a�5�:hh��^�=��^�0�f�Q�"���c��$F��.F-�2W�����," ��v$ ��c��+�=�w�\"���FI$�;2����2��K�V���N���a���V6�0ly?��V���l@�lb�dJ�����4���^"t�$�O�^9���N�pF��
�[�9�*TmT*e�rW
s��W��M�qV5��Q����H�RM�o���6�]�$W#J9X����9��?��_�?CLQ���������>��J����������Ol
��CkF}��'�T5�!��<\b�Tcr]R��%�ql��0��]b��������k
k��/�v-Z5k��<���suE�/�����x��]-C'���4*[��5��� c'FG��5P#6@��[z�f#k���E�|�)����^i0�A���n��8�,���=b��-
�*�QMg�>�K$D$Zm��xA�j5P!����L5��P��PS@>���p��r�����k�J&��kr����P�����K���������U�M�C�����&�4���^
M��K0��r5 ���j���R/;�T
�b�z�e|�;Z���g���fhb��6wX�[����D��(V�`��C"�V5H���fTB���+z���V��kU!��U<=����(d^���a����y�����o������(!p��t��M(A����AD�9��]�����S��{��d����h�KD�C����h�=[����[g���j�����<I����X�d��9
�dE����>����fU
6�e`������-6+B|	4��q�������;�T�)s]A�)�Q�m}���E2� zS��}8A�N�dEu�.��_1*�����:|�QJ��<#�69R�v�u=�B��78_H��W���\�|�zn�ce�A�4i�R��WM����Y!f0�9bd��D�����a��A���a����S���EkMrdM+N�%���
�F	���j�
���$��=A	Pg� ��U��[[��o��
,��}�	���K]�
�W5J��`�CgS���b�������L�f@�
�����bnK%,���G�`�@@Ns���Z%D����������p���v�L7�)4���J��n�11�wN�bN�Cs��"�.�6��amw�W�s�B0k+�����
uT ;�6c]��B*��`Z�B��a�{[�����p����,;���Jt���t��U%��(!L��(��X�%UA����\E,�5�ds������h)K��=�U�7�"�2�V���,��^$ydm�.�M�����X-���96Wj�l;}$��h	kYK@��5l�Kd��9Z1-6#;o3\`0�}K�f�E�U?����"c���$�L���'ri�R�����`4�����Wk�����u�}gPhL�Z2X�h�dZ�z�f0�$�����0(��X���z��~E� Y
Zy���}Hw�����[� ����T�Am% �Ms�x�Y�o�w�p+���
7�[@\��B�a��n�-s������h�����Z����|;�f�G�F�<����W�mH���yt������f���%�b!b�����7�MgW��cqF����Xo�2`v�t�J�6cW������Z�Aw�a�L��w���e��{�Q"�vC��.l��8�}�� ��Xkm	PF,������K����B���(e�(In��anWU�9"��]6Q��~�x:D�l�����+�C�`!�T3�o!\2�W�Pg��O)0�"�� -�T����	L��j;���h�
%F��`R-���Qq>$��*��%�����[�J�����l�0N �7k��	�1��p����<F����V�hT�Y����H��.dV�R������^1����=zW�\Vg`�N���mF&��6�����K,�|�q�yb��xd�|<��E�;����O�t;�@c��z��cU���^a�d���*Z�z��h��j��X=�R���H����)�'t�����j�Y�����d\�A2a�E�Q 2W/a��w$�%�|�KZ�dq������� �w�����gD!����0����=r!����\��et��x�@J�(��O7:���
��4�}D��?����v��p�k�d��d&oR3Q���J`�b����O-�w�B��)���T�K|9~�t=P�
j��f����Uc��n�b��/�F�y:�3��GJPg�%r��Q����2d��������d�n���:�������rmc�>�
C�����h�(&�R�Wo�RaA�e{b"$��Z�n�h�3� �8���j�#�m�e�[��.��!}=r������oz���Q�Ge ��"-@(QO������y�m?	
"������*���0�2�eA�����S�������k��Q���q�ev�=+�A2=����o���?�@*����+=���
b4�>�"�g� �v%��,[���P����u2�����-H�����He�����Qt�AK�Q�i�+�4�
#}��]�!�
��H�D8������1�������a�eRhv�G#��i��[&S����K�6E�]'�0�8��Q���ZQ���4v�GjxAz��P���FP����Z����s��3qC7�p[��KvC�b�,������R�t��B^�B��8��
����&��L.������'7A���>�CO[;-_�|G��"����q�����n>���� ���M���������'^I:�i�R>���pd3ek��V���1	�_E�H�.#����n�b#�y7&�l����AO�3��D��b�;�����#$/a��p�����ac�8{L�Xb!���f[F�������>h�Q�V�0�`O��;���Z��3'�� .�H���cP�pD���.�������.h���rh_��������"��(�xCG�0���G�z������$s@��(����)F1�����P���	�������H���r?O�i�E4e�Ehq�"
���!��A�<do~+���q�dge���s��c$�Ax����	~<��LUF3�GD
����'�q#�
=v�
z����U
�)��$v;6vf��j����m&bI{�?4��}�w;��4b��5����a�[h���H�3�S�y��gK.�����8���"\	Z���w~����X+p�0o�%�
���
�Lcg����nu}tBF����:�l�]����A
C����{��PP*{
����GE�������nVf(��.�!*g��F �m���4�a������X i��\�����]���c���1��C�������6_���9=�{�b.y;5)��:B��v��P�I�}cw�+_�����������,,���C(�`��g�'���#�3z����&������2�D��l�\�����I������]-���9�w��9���h ��U���m_B�Dut������<�'Z
�%m�G0��Re����`�]e�����?/X^"g�e�#y��ee����}���h�1#���
�@W����B��\�M"cRsT61�W`��N�VmZ�Xr����2v��w����������
�|,�p�x��1��m�]�j���(���,���/[�e�V�0n��J	�������='4�����i�t��n����F�I�V��G��l�NL�]���X�|�����+��
��e(I���;Y�r���o���eb��~��ia�^�4rP�����O$K�4r �e�B��f4#�$� �e�	4�_�����.�l)�z~:u��1�R���IC�8�8�q�;��)��9�L�
N���~��5.��Hq6�X��~�!'����4�p�
�4.�W�3��4� h&A��7xt,@n���wb�@���v����Q4�%�3>G����`�E��z}�Z�@�X(���n3b""�sF�pS���$�y��;�G_��?�%�2b���~q���4�8��������!��~p�wb,A
��Ny3�F��Z-�:�����l}��fU���o����[WTV$C�$�.����Lx��M���s���46�9����R�}����'��9���n�A<ms2��c����A��������Q�s�,X���)�����������~a����a-������g�$�KZ�G�t��
�>�t�92 ����wN��NH�������a��n��IT�s�P
�f�#4��L��,�o�R�
g������c�@��9��y���H>�xhR�J��� �iLB��`����f��	�
��x�������	�,��:
L��l+.��3$��
.F	Q�39�,|�����y�����t�� �(�:�GfX�4�rSr\�9����]���p�i,B!��u�P�X�3�
��9�#�BEH�L:�ZA�����gD[��j�`?���)Y�d�b���4DQ�Bc{W 
5z�W��>�\�x-�(>����{���F(�]t��b�Wgt�_�
RiOZUe������	eKH���u�4L1�e���C&qP���ib;[���u�?D���(��Uj�I��s��Pj�8����!n4�h�`��D����Fcg�w\��>�_���Ju�D�0��+���$��HC3�
����D�L������2��iTB��������Oc����z�?;�Gv�?��������Vb�1�2(���A��!]VsB	X(�z ���r��4��n
�6�e@BA�j�"mE��N+J���[��P���>��}d�\yh;v}r�����-�*:������7�"C��:���`��������+�~��E���A.D_qVR@�� m�h�Z�&t�?�Jl:F�p:�)_Ic�����
Lg�E��W��-��x����B����J"�q`4jLn�B=��}E�P��?lj�R���\���3+���W����P��V6���Y	�j�5��{�SA�^1�*P�E�m��E�Q
����eXBNp��=��]�u�]xdVS�n���V�Gt�X�(��y���aS3j�,��r��� 1���mh�O0�KZ�-�ao�����e[�ba}�L���b46Y���8����tw�N�"I���l�2J!�XE����!���z�����9�H0X�dhB��e��"����j��!�4����[��beP�J����*�D��i�P����W�����p��'�A4Y �{�P���C[�����)7{WF!!��Y�2~6�6�`�����=��C��su�����,tvE�4�.=����}{��?��6#�d%���h�<.�n�A��L��"�P�|i�{!�������U\���:=k���%����9]���J���8���%K|�C�j��&(�m���5�i�=Ll_�v�hK�v��h+�,�������:�*LF����8������A�������F �H�$;��S��(V��x���L�fGW�rK.M�9�[S
]���o��Z��er�&�
��kb����r~���{�>-����tm�D�2��2L!_��\�Wb�������m�h�������B,��Y�Nc����MU���B�H�X%p2�Jh���x|��r���C�hh�C���[;���uH�� se���������������#�����D�z<�un#��UM��D�R��,����i�;@����?�N�3:��\u�����X��\}�v�6� ���/���8D��F��vG����S���#���L
�)4_o�	Z������2��@A%���^QM.d4A�H����t>�K��*� }[��������k2C���h��k�9�����;���t��������F�/���H�O�����/H�y���w�Qo�Vi�+O��P�c�$��{
+�%iA��m���l�-�Y�-�/�A������E8LJ���@HG������X.�����u���*"ug�v���&*���A��6u�cm�����R ����k��:�����tOG�Ww��G��jQ�C�zZ��6W��h�m�A)	:����m�A[HE}�m`A-y��h�EF����!E�{����O���HR]d'�AX��P4#������������l� ���0E
+,�N�v��E�V=���1�A�Vu��M������t7�c�FOt����������A$G�.l/
�Pj<x�{�X}�A��^x����J����{�M����>x��������[]N|L��	�~������hi����-�@%0����%j���9�X1�Y�;�R�����(r�J��#rb:����9����F��C���B�C/���%�r�v85�`+�8O������s�`O�s�u���w��hL�U/G�KBnv�B�U���h��2A#wV�����q�y��.�L�{��D��=��+��x2ia���=���~����K(Z�,-i�]ae|��v�N�E�e�`�����7�G:�Z<�1��6a�E9 ��>��g�4�X�N�km�x](����)}��u��6v��f��Q�<4�y��D�:T2�[�����8�{�ar�}�U��"=�w�S(�R�
�+')���Y%���%Tu(�5e�W�'�E5�\B"��I��<�n9��+��Efz��l�=A0�r�s��������$���\��a7Hq|�eHu[Qz��$��IZR?4d�p�[��+��_�'"���]��=8���F��	�a^�������P��88�5Sn�����/��d��Hu~1����O�6D�?5�J�P����}u�<,(��-:�E(�A�"Q��i��{N��e����%"��?�)�|��p;�H3�.^U���������z�������1��o�,� ����T!������KY^��������Z��d���xGEd�c����h0������t]�vedC��rHZ�������O��������`�<c��������~,:Z��5�e�X��^E�W<���*6��|]������7���O�:.�x����%F�b�/]C8����������l�k��~��4����vmE���]'���f�#1��P�{��N��L3;D�o	�R�� �1>��*�#��cX�����{�#��=����Vm��z�����l�l���-�=pi������F�)]��\�wx��0�B�O��\�:��9B�Q���V���Y�y�����N2(X�1C� ��'~a�TO~��,D���a�z+_�1p��}�5{����T:��]A�sOZ�1a��hB'����3���!�}f����.����'�bj�MA�R��;�
�-���g`�W�����Z�6z0�����CX�1,"+�������	s�?�G��u�1Y��l������U)Y�D�!��`,4��>�t�?=#/G���*��?B��s�,bR|��@9;��z"�k41����h�h~K�XdlUX�&QE=�7*��V����y�"��CY2����2
"�|��=�s"�� �B��CY:�1�������w�1/��.�y�Oh�v<�^��B2��<����T~e�hj�^� 
����;���Z]4��zA�H��~ZO����
5��u<����`�p;T8qX��:%�=��aBi�o�1"��{���H����&�v��'*� ��*%�1J�~/�mXYMR�6jV�^�{q���I�S�%LsV���O��e���O!��u�P���~�;(��{��{cS��F�w���wS&�{�C�wrx�g�w�I0��j�U?^�|fu�%��B��5\����;��I����f�E���'���E8�������CQ��;|eoG�[�U>8��A�Vd��
������%_h��vr���
�y����$
X�Mt�gK�~Ht�%�}
�})�9Z�k�'�p;�?��&0���L��� O8�8	F��8=�	��wd�6���H��6:�S��DO�U�(���q1/���2)�v�Ee��#-rx/d�@�{��.�~�fY7���h,��x��1n��=��Mq�x�WR��pCN��=2�~/v������X��-�+�1����6�����2��{����~�~����XD]��:n�z�;�(��x���t��o�z�Ob�m���Y �F���&�B�%�h�'$���\��TF�K����6���'{kA���v��E_Hd���j���C%�N$���Y�xWZ!:2�W��_*6Z/
>�
�E����V�*F�F����WB��q��kD����]��sl����):!��~�L�n�Azd����9��=�R��.�������7P�b B��J�wd������8�N�R������N��^��&��wdO��_�\��i�k�4Er�����;:��;!O��C��w�� ��������/W����H���G��hCo�j5��6�>��F���o�b������>"oS���G��V��_����ztC����"�w���J�A�c1�PD��i���w	� ���0�����B��n��T.R�D\��#��
Sw1�P�-t����q�lz������?�;��s���5y�����������50K��mNe������.D��������F��C�"4�����<-�w�{ �q�jz�k8�I-0�lc���*��Qn�.A�]d2�Aq�`����.)��_"���m9�M��
=��������G��������.��jPwr��O�8b��Kb�Q��oP0�<�_������2�V{z�y�EIY�X���j��W��+i�:��� 4$�C�i�r�Q�|l��.�����"�f)�&4U
:���T?hW�B�>%���2�k������T	��d�A�n����K�gKe7g����%���G�Qy��@t	�GtjD�b1aZ�le���g^���]�@�<q��Hc�SP={jv�K�'��E�2�DeKb�����[~�w'�"�q�!	u(���I)W�TK����2���+�HU	���k����E��=B��;�
��w1�������/lb�O�P#�
2���
@H������P�@�V��o��:�o�C7A��]��>�D���
���qP��$����&�R�|�	�����|������@���B>>�S9��f�!m�o�����Am�b���`�lO���C��e���
qR~G�R\���JsM(C�;���4�{�C����B����W��1�j�(X;�3~�1cq�B����i)��q9��/"�]?f+������T��U���h2��SH"�]v�OJ,��hJ���A�(��)Xk��Rq�<b�����M�x>!,�����r�H3��/S���n	�J��jwD��������F$v��E�'���Q0"K11�8�3U{���
J�/���Pfa1�������������?�Fg��l���d<!��{
�vi�GY��	=�w5@����x�0�eWR^�*D����C�O���"5!h���7=����s�W+^J6�5w�F���|��S�#g32��C�����d��h�(������Z���.u(0C}t��%0?��vK��X8���=~f�.�rB���B^��yv�c5� 6L����mh����\��8����$���j(����������]?l���v���yhpBAUS�*�sP�����I",��S0�[���=��f��"�$1����d��T��Y�7"W���
t�����X�zY����F�c�S��&�B��*��rdpB�k���]����wn����Q�M�%&K[����cT_k��CM��h�g&[W>9{n^o�Nj&�e���]?��	�EW�j��������������1}B�w���>�;��z��;1�7 ��N����	�����971�5�Oz���Y��$9�O�������.c���Wp<+y���[�]��N_
Ql�V�K,H���0�'�=z`�%��w������������@&�ui���M�j�B8�r��&����������n"�=2�,�WUc�T��b�/ x�m<�p�F0��*�g���J��
������v����`�k��1�g�;���)1��$d�R�����n�Y�P���qb7���Y���&��N�����f�@Q
`8�Z:"�����[�mY6��j`�f�m4r�5��\h�E��T�}��fZ
f���P�<����u�_G�n*��"B@M����(
�D`u
�QF�[��
cD�B�����jdCKA���3�b5����-�1vZ+����[��
i���8�G�F�w���Q�?�Fg��5�������dwM~��=�9E@�1r�o�S�F{%�!��f�n	# T�iJ�U���t����_���u���&���Q	��1L`J������&��+7�����%T���$cI��R�/��hq{:�N����}4#!�ry_����8kA���%�[;�-0e���5b%p;��!�W� Cq�K�{���L��0�,A���y�@!
0��J��^c��������I����Y3 ��m�;(>�'�>�oF�q?:St:�-�N2�0�"ik��x��>�"��%�[�+b���L��	\��H�ic0D�GwV�����K������F�0�
�@m�Y�(�����#EJK�[~�~HC4��cO��6�h��%����,g��f�C>�����N�
��=q�I��p���GU�m'�P�*��v��p$�������d�%��@�O3����hT,�Z|?[@�.�M���S������B�~�K�z�,
G�~�n�=��"lI�L���~��Z��3F�h���}
C4���_��7>"T�� �|�9��@�����',_r�J�-��:���ic+�QG(�COK�7��[<�lM�����M��o�G��B+lR{�f�Da��9[���JS-=|4�j�s ��%���7=�!��q����h���~�7��Ic�~2,�G���~��C$"&�}{r4P��"�E�����qS��/���-��ACKL�~[`�nQx(5X������%X�1����$�h�=�x�2A_��z&Kyv�&7#�����-kT��_��t�(���m��<P~�n+�E�?�2i�i�7��ra����!������M�k��b8t������b���$���:q-.Q*3����z����n�$O]��*�DV��.�� ������@�<:�0/U��d��l���|�g$Kh����P6��W�)E�q�-hyg3�����;2��|#?���_��?[�w�9Q��H�>��%�BY�b�+��(�����}�(��;:�����+�Q��n�.Tw�3�:`<T>����
�N'l>�N(,U�m�%�8
Z���O��.��8�]YT�0SW���lq���?1�����?��'p�!���$���Q�
sY�_Z�Q�Dp{����	�'�[z1�X���?�+3�ist����u�CmF���
K�����F�FQ��DI��f��N������`�{=h��dO��N������(���|}�%�l�Y��_���|�r]�\d������=�)�����f&�06���>��N�t�/[�{�9�!@��&J��zBT��B�v7>�ND��� H;���
� ��	�����=��_|^$������V�~s���-_�,�I�p�zG���m��|@3�p�����,��z,�g{(�xp.�tuB���~�N���F{�	t��?��Zh��@�w�n3s'
����`�[z*�a-���B(5��VU�{��{?�����[=����>b�p�Cs���X�>�����1u��%�
�����b�M0��#��G�!Tu~V�e�s($9��[]aG	�
r���� Y(��g��>���V�tk6��!���G��F����mV�$�uy{�����s��US3�&���cx8h|��kB/gF�3c6����->z���'��[�+D_�N�|���H�
ATV�y�O�&T<?�5��w��{��)�xh=WO}�"��m'	��N���3����:9K��a���BM��=(�b�DVb%�
����������?���{$8�_t��"�n4B[���M�I=�$�����-$���q�oc64��=��%��n��*�[8�
Jd���b��0����;zV���I��Cc�u���,k�U`gJ
j[����Q�
����{��RU��$��`V���"M�I))XK�0�,����L�
8��f������<;^��a��X}�hrOHb|�O���Vq�x���!�u�[Z�$=�GzB,�����N��# �UC�0��=��L��#O{sh�r$����w��������@i-��vg�I�x<�����%�F�.3�)�94ce/E?|#���<0ihDXC{$;[���q�	�|�����[��`����
��!���"�;T�1����!� ��0ZQ���(��Ac|�P�_�j�`!�#�	�B'�`��1"������u
B�OS~%�hk���GB-t���`��^G����Yfb�a�Bn:���CU��qHF���g�p<��"U�B��Q��XbY�d|#����O���	AF�[�$�>C�$�D��vS����d5V��M::(�I��E���mG����T\$�F2T`
�=�`�kD��w����R��1��=��<r���UD��l�
rQ��B#7?����5^n!��?���?��u�"��:�g���~b)R�8�f�`�f��T��^��U�>S���O�����:"������a���}D#,������O�����pd�$�|�FB�E��"�)u�P����<	�~�����9��qEh#�����&"
��C���0���$�d��0��@��0%�	vA�������L�S����}Q>�,�L[5@�I�(D���QoQ�(+|�J[�O�'[�P�%l�/��K~��&��I/dS�
�}$���Fr����i��m,xt��j���������2��h��&qCf�#P���\�$��$z�Y�������~�I�n0��$`f��	�#�6����-����a�A^�f{��j�t,��'"���<)/K��Mcu�N�/���d�a�a��Uf��ww$�"\[J���A	���%�4�b,�s����aa~8�j-�C=v���0,q��7����>G���y�&��wc�������a����b�{,�Dx�?�F���2<�T��JEV9����t�;��J��=s���'����{��p0
Q���o	l���^ cR�3��8�2���mI���qM���:B.*"g	iG����t�}� dR��x����%R�'��s�^$A�3���ByM�e������B��`m	��[*�)p��	�D����]����`P�p�@%�!�Cq�����3����*�F��@OA�-�r�@4�8�
��7�Ih��X������a`B4l��:F���@o����~�h�43��|�h/T-e��!�NR��g�|���H�D�B�pE.����+@����a�^��5C�=k�W�_Y�2dFX�4t y�����a��8��e2�c�o������Q�u��h,���8z'�B�8��Q�����}��DoG�#��B��#v�l��#?�����]�M�-�*�N�
�ft2���P`{p�q@VJ�G:��A2j,g�4	�FX��L�j��������#L������I �t&C�n;��
�QA��it@����h�}X�0b�~�9jb.z�4��F���7Gt3=�{����*�K�)+]3w��y��!��a����r
�3����B;4JpY�,QuqZ4�FL#
bCH����93�����ixa���{~�����K8������	xE"+X����.�/��y�����/���e����&�����Y?������v}�d�=��a�
������5��o�1���~��S��b�]���G=9���Y?eC�1��]���Y��n{�Q��d7���MB�M�9����N`3���fT�92�fo�����K"���y���W�J9�f%1Z�g�T>�b���u��",G�E��/���!���3��P5{����	�f~=>�������QH�0I��a�?�u
�*�E��3�wn�Ha���h�
�6dC�U:�d�*e�X������9����;�0jU<����E���\^ez/U��z���4�/�OqK���@����G�'?y9V�4C��z^'M�(r�7J'����D�Ww:8]�^�!���N�dC��*qy
���.���T�B������*W���R���$]��?��F�u�����- �|V�kk}yJrT�r�E��	�1)�\�>y%�;W���n�0�L=��-KP-��. 3�e8�6,�	�e����V\FFD��BI`�\i���'&[����a�4�{M&5Z�tJ47^�yP���#c�
c�gU���[��K����i����go�RY�BwV�m�W��MfL�e A}��o�BT��b3}ByR�\�tC8eQ�����G}��fV}w���V?�<R1/	�~��M���@B��y�u�o��&@�����(Dm���}�H]�9�S���
�J��$i�A59+r��*��M����9�S;%p/c
��J��\`���Q!q�?��	�n)F�e�pD����7���T�'��&��	5�b��eA������	;W���D���\=��{%��VP�2s�_����H0�_���/C[���`4� s���`ld8��yX� ��h��t4�[o\u���z��t�p�n����Z�wPJ*}���J�BoD����@���r��3o����Sh#0� ��e';������U��^Y3Zd�.V]^���M�T�*�_FT�����$�������%������j�A7!�
������x��l���A�R�4��
�X5����}���f���Q1be�t�~ht	?�
�����V�O~�&���Y�oB������,�e�A��Rj�|�a�Q���.����Q(����#�3i����\�]�3@��}C����|7��$��������o���<���A&l+)�Iw����p������"�EL�k��������t�U�ooC�'>���r^��=6��Hk6��O -I�����{���s�"��?
jcv@�)S�03����2�e}`UY8��|�����8���S��.������6*�QUdU�6�;��Hk������O�%��y�����YDT�%f_r����B�=hR�KXu]:��l���q����y�Lf^���E�'�B~�C��m�b8#M�h���[�q��<�P�mC�{�-�����aTC�e��n�X��P�O�nB��"j��H��Q��kF5��IB�vx}lJ6������� |'���h3�q���n��^rI��9&�.l#��x'bT�MG��{d���V�Z���%H����#��m�C�
%���Uk;8��u������-xv�K�Ss��I����w�0M����=��B6��5�qng�Am�N���P�e�������=�d�h�����K���g�KX4,�}���D��N��"��s�$;
��^�g�A8������4*2Q��6��w2"X������[;����h�#�������1y�J��
�}�n��0"/o��e
�m8D8%k���M�<E�H�\&����mQS�o��n�LK\U���;�X�m��@����X+&�Z4P�n����[��`#:�k�%���7���`�"�?�?��I������"V�H��
}H�!o{������g�{G���=��� �V<9F�3���t��*���s��
�������`G���&���2�1�M�����m��4OnG#��e�;�F����������]�g$�)Z�(P��9�:<;2t!�����_X�����j������f/M�;����u�L�m�B%s��+��eu��
1A:;�X���<���j".�6N�\���	e�+�~"��}��)5����"I�6T����?�
������~��Z�����x��@o�1Z!N� 4�h��*��L���4P=F*���8��<9"5�YR9����������pp[�'�D���xphs��@��SBB��qE�����=�$�Z���QQ�1��!v�>X�j�1�yw5Q
?Ag�1� %�F��4��O	�������+�����8�m����`Gfi?��Ry���-��aU[��M��!�\�=��V�^�D	�v��J�c�@�����J��	��	S���=	�E��N4KU�t�h�q�f��W`����������ce�p��w��i,<ly�>�G������l��1=A�j�k}>$�9����/�LQ�~��z��2�`��(����D�|�N�+�j<A$A�����0�W��*�%(���W������d����<����&�fG.�������B��c A9���c���e+�c�$���|����K$�=o��8�/���Y_�N�V��c��asz5��yD\8QS��6��R�-3m�v��H��B���g�����P��c��S	�ds"�@��1N ���>���K��p��@�\��>AX�g@�)c*���f���h�.e����'~J���+Txf�m����iR�'�yl��W������=��O�U������2���.�N,�
�M8��W�6�����u7�HrsV�����2����x����6s837����#!�r&�C�`=�Q�=<1�|Ak4�<���7fHj_����#�s�"i���p��
���DT�����x
}��-��+M��}��g�����l�l_F���(��2�*�G��5���e���X��Q���@��q�������^��6g����������(f��C��p�Bj��s�M�<F�>�o�OP
"��������S���c&t��]��]T'�oa�e��P)�[m�i�4I��[mi�8��U��(�d'�](��Wl!'��Q���u\���@����b���.���	��]-���y����V����R��(T�|��L�����<[��@�-H�r!o�"M�z�����W�}s�7_�J�G����z���2Q]�.>xU^$Z�T��j���-$����������J2��]#�!���(n�����e2��]��\9���a� ���~���w��s���j��4�_Xu�����N�g�LY~������'#��j��y9O�R��E�ub��F%��n'��e���)�M�~\��5P�S���o��YB�-2m��q\�����h�n��$��'��C���yT���P�i,z�3��k���Bx�@v����O�M���6�JL��V��������Ze�HcH~��u�X�����j7���++�7�W��(���]#Z�)5Y_%����
I���"���h���LO����D,�[��#�WL�|A�9
`ui����
U'��oe\����(
%o���w�kz��	U���%�=�ts:a��'K���c�_qFo</HA8�kx��d����o��A��$���(�(�����%U ^�yV6�[D��o�]�����0+S��[����5�.F���k�f�}c���I�_4�;~Q&X��84��](����({L�r�O���c&/���_�\r�X��`��ouL�����X����E�Q/R�����%��j���t�����{CU��cX��M�T�C���-*�$�������	���-7���S�o�7A;����c��v�����Y�h�����
�N{`�o�7A�8�#�[���*S�� �
z�"!�a��w�����b����1?���!��I�q�*��0 �����.z��"��6+�QK�^��
W����W�<�Oy"Q��FK�{l��u*����T�+y�K���C�~��a��{��t\�lVet���iY���N�J��e�%����G<�xAQ��@���KF�}�}_z}
r���w��i������B�>%`��:%o�(�h���7�hh�_JkRe������=l3�-�I��m;�
�����;~����(�"����F��hWj�U�nA��41��>��%OI���f�(�:��znvvBd�S T��1h*e�%wJ����o���[<M�5�Kx��'��:������r.�hY%��(P�{J�(�,@���<@����?�^�.�G�`b���#��c���7��tT��
���{4�����nH��^�J�����xO\�V�b$Z��! C��k_������o�}�1���E�T��(���D]\ItmQ�;�����=7�Sz@��7�gM?9a2���|�����	����+�hl^":@-Q
���S�,�5TCU��c�L�w�����I��.�	#�Bx���q��jE�b;u����
��zM�2E+~��O�������81�0KHh��l������I�*e�X+l_H@��2J}.�eS����3^C�O	P�>��C��1�LLO1:!���i��v���7�A���GDXt
�3��J������+�������f�g4
B��+h�bjy�u���N�m��]D�u��,E���q�+�^(����
;���(���������4E"K
7F��RK�E�����F��������s��c�@D��c�v�[��M�8F!Y<��1����P7����4��
����<`P�);��7�G_��n);�I*=��V��)���������?1
<��nd<����K�M����G��*NdD��[m���&!;q������e���e���5���)BR<�(��K�����n�2%���-�0��^��&��ly��%*�8�h�l�����U
\��r
f!�w��R�|�d�Q����3�z#��V#x��2Z�K�X���a��(�*�T��C�]}�F#��]�)�����Q�*�vW
^��QSl�(��A�:��#�)����
�?Q���`��B�P�U�}����T�SKd�]�wV((���59
�I�.������E�Me^$��Z�Zb��(���TC
!�X��S�%�<)8��d����Zo��U�H~�����p�����bat�Vc����l?��aJ8��+t��d���S$-��#/��[g����h�1H����QR[��7���]�N
�!��b�&Z�={��Ga4�&fZ��J�dGVT2������C�{���b����%���-)I���"�3�6dd���`	��p�A���D$��#�B��k�t�E����]������x��$�2���#����V���J�nVK�)��c�$:��rJ#��S��$���!���0j|��R5M<N5�!
�@�����8Lp&�s�N
�QD6����A-w
�A<TO
�!�z�F�W�V�M$���$|th�wj���c�|j�f�,o�����/��-~J�\�jd� �������:c�v��lN5x1T�����a�TCJ�`�\�������.��T����O����u��c�j@�����6��|WF�	[���W�)5!'`��
k�2=P�
*cb�2@5Jq[
x6��X59���Pe���J�%K������[Q����,H"��F*��'fR���B�5�e��3Ix�<_D��3T���uG�x�'}�A�uM������F@eM��f41�(Y6������`�(��p(�$���Y	j�B��r���1��k�t�y�J��5���"C��f��1	��D���5���I~w�Wt���+R���6M�2eT�����'���!�!	��z��t7������P��"V�T���h���	b`�����[W�[+��,P?��@(sPc�6Z$E{b�1��AO�=Q���-�^N��A���d@&!�F��'��w`���!�tK4���j^��+���CW?�h�gq�w��wV&��j�`RW���v� �|BY=���������4h�!�?9�Y�Kj��A��E@Z�y��\4?��9�������uE�J�q��u�
�$-R���J�=���T��}�����!�]3���N����V.$�iIx���������M"V���V�y��DEGc�f�a���t[� ��r`�F-��XkJ0����q�#��bw{@�qW�c��D�h�l�E�:�-�DB"��H#������t5#�6
��M�R��W���w7�NJ��&�}��"���;���f��}���=�=�J%����U�My�m�d�u9m�6���A:�����/U��������*2Dk�|��������y�:&+!��g;��qmB�������
���{��9��0`�5`OL�5S'x��k�Al*������6��)���y�$
�������b�d����� �m$��!/�f�A]l6��?�����n�T��Zv4�m��n�L54$l�t�E.���4��4{3��hXQdE���6(*�!�e���"Y�������9�5#
:�����58�L}�*�{!��7b�qq!�M3� ��2zV�����
:�Q�D��o04�w�?��y���2����`�7����.���>��{@����#"C�y�z���� E��m��Vg)3-!��h�C��.>�~xr�������y=��ww�w�PX�i$����18����P"2�OnF'v�x�|��{�*��"�
v��
��R�h{D�FT�dl��z=Io�^�D����Q�uz���=�	�@EBYb����r���V~�;I��/��{�u#"�6���)��?��RM5�q��tC:�6z'�	�\�%�:�e�<2%����Kbq�_���~p����&:��?�M>D�7����=��T3rl!�Vs����I���|7��63#	2��\�d!~���d@�R���A�c���^6RU�7ZmTkX�VF�/*X�����"���`w�[�qz��YR�/fET��H�;P�����0�nB����
Y3�X3�MU#]�U*=NM] �F�<��=I6��-��FN���k�����<X��{(���W���=�����:.���}�U
LT.w�"��q���1(1��7��������d�A�#�}?d���{@�GXLW�2Z���iY����`��7�wN*G+�,�J��GRx���,���zt����2���=���4v�GS-4,��@B�8�n�{`qk7��5�����4�Id������U/#�a��	�<3dVq=���^u��
���N29��Atl���a����L���A"�6%J�h��4���j\�X��diMj�ou76�R ��wT�]@fM���p�f�%�#�c�9G���P:���?�}v��z0����T(�QfR"��c�A=���5���@��Q�b���#{t
�	=h�����%KV��Ty'�a����i�DV��B/���?��\���w�����
ao�����6��rb�1���f���%�����)�IU�CS
���N<�FN���Q@���	$��~�}7��{��^Rs���7�j��
7�{d�3��3�R7�p�D�������*�;Ru��U�4��c����)��ok��i��(j�G���
��B`@7� ����������
(�I��uK@M��B5�&��w��BI����>�D�EH�"t�<;#	I�E�D��0�pD&tV<Zm����#��s��z��d�'���������}~�K������zj��EhN3�$�	���QA4��ar�|�
r�XN��_R����0PQ�����h��]�9���[����*��%��f}h������Q����Y~����
�r�����H�u��g#��S-���2�UD��
=��E���a�x�"n��k;��G	`�:��P�8�V8�\��J�Bb�QCkC�N���E\�@��-Ft�W���8$��%�B�����x�R�I8G#�aPB3��p�������G"������@A�����#e\�������	�� ����z�<�=0QF�.4e���8�0$�	mc�������)�5t��xI�h�Q��&Iy��4����%�g�]�$��-�a��5���;;
D�����VU�^��~��d�#y-WJ�*h^2GHv+�����$��(UY�^<$MG-�H�5�rC��,���Hc���0L!F����+j3�!�%�L���)��.C1e�3���I"v��h0J��k.M��lW�w3.���hr���!~���[Ob'�E]#s�3F��X����=U(�E{&�3n�-����k���TkDZ�����9v�G
���,*�t/j1i��HT��w����Qpoz
YL���V�����S��>.0�X�2�|Q�`��j�H5�����G�W	�a�������@F�VDf��=�^��q�u|h��P�H=�a���B�A��Hh:w<a3���T��8�	���T�`�a�;�X��W,��~���S�}uO�u'��r0����@����Q#1���y���am� 6�}4v>�p�Yg��:�-t3�ta#��N	G��Q
��B#r�q����h@��!�uG3���k3����6x���0���S�7R�A<����F�?:��'��l��;@��4�Q�:c�$�7t���}3|�a��y���I+[�����4�����
@���q����xg,��~��~6���/^%�5�b�9�I��c��O���86jf����)���Lv����l����s�TAX3�dI>�_���5�y�gc|e��M��`�>K�x��+[z<4h��h�1�e'LO�6�#���4��1�7]�!�}�83�`��
�.���k8���{��l��z�Q ��|%�kq,���
E���Exz(�P���VL��8�E<v
�H�1[|7o[l�_:��1p�{���H�0#�`�����HY�����!1����e���U[��-��L��(g��	`������������C��i�� ������r���HA��il��D���	�@��4�pm�0QZP�s�����X��3=�����x�g��4���$�jF������1l��+�%����~&�~n�����^B<ku���k���~�F���%�i�/�9���#q������6/��@����zWSe�4�b����O�?�~Y�3��iBTe�f�����a�N�`�-i��h���-3��R���U�L
R������{w��D�3Y���T���j�x���dOC��F�(\�T�z����K'�q�C]�f`�%^6�2���Wt����3��G�Oa����F����7��M����F��N8
�E��]y��g�����(�Z��]����j�*<�����$+�';d�160���h#LE������n���_K�Zt�$[yTb�����S{�vM}����fdB��()_�9�7��i����L,��}�
R����a��-i�x\3I�Z����q|��
��E��i���
K$�2|�	����Dm�
���b��	��>/r,�JB&����#ZY������2��e�j��F"]F%4?s�.q���b�����tX=��cQR�2F!���Qms��=�(��K�>�����7-kf��"V���2J!����"r!GH��'���������l�s�^&X[�Cq��Tr,y�W��O4�b��e�B�<�
{��li����l��u�$�L�7�"V�(Ds<������V��c����w7�� ���K��RU�Z����b%�E�C�l���|���}[-�)���/�}�6wd�n�V�%��h��S�^�����JL�����e\������[��VY��2�!1�@P%��x�e�C����dD������(�5���6������ r����B���8�yk������Kd�x+�#�������eH5D$[	���J��lo4*"��
�m���GV���Cn�"L�q���2:�������W���21�a���u�v�F������W\FK�Iq��7d��)��E*�>�5��O?�-�&;�c������'����[+	r#�����ND�(6<f�}.[�w����p?7��@'
�D�������4�@�8��r�Y�9o�X���pg��:��C��	s'^#U���l��~w�6��J�v�X��v&�Qw�PL��a+���<�DO�A�*�e&H�a�����g�G�Q���2j��������%_�M��0����l�7��zD�&�\��O$HX+zJ����`���m�.w6�{�NS���:c;��]��?n�����@���'R4�U�#^��TCX�6,���������+.�hW����,�%,lc�R����p6B��WM�5%��X��PB��R����)��A��hu��.���n���+�S"��_Gy���@�r#e�K�}�;�`9�k��fi�3��
F""h+�2C�?*�p���/����Q�GQvl���AS4h��UV�������E�7�	������p�h���;K����u@Z-�u�8��3�-�.Xvl
}�?*E#�{����Y�t��u)%����T$A��I�r��.�#���������Ol$���9*b^���Yj?�k���&��T�"������oU�]�6H�����"7	�o�#���Yt2����J�"���m�D����	j��P�7R�h������l;�T�"�`\�i_�-_���"opj�F��
s���F����}��itG�)Z�cV2nm}����phf����I��}�
�T��e�K;����{H2+�md���(�+�7�(�f���:/33��� h��A�Bj����_��(H�>��5�!�!@N�W��"o��K�:�h�f�>~��A���D��\0o���&#B��?�s�;�y��&�n#���~�
��*�1">�6����m���N�<��3�v3�c�-�sx�E�����q#���N�"��H(��l8���12�Dw�����lG��isI����S�w�
���"������M��%J���A:�����{��{R�6��<cy����L�Z��UzR"����m�CE�\$Y��6�a�+�#
�H���0�ouq�����L@�?�����8�>��$Sr ���PC'�)��	���C6��	�K\"��%?��mcG����	����%�_���7f!����_�?f����6��4���7��o
�lQ����u�����;���
t7u|�>�{�_���w[����>��+���'�j�n��X9}_I��$����{�
i�V�{#�5l���{$�hV���0�N������G���h���t�_zks Xq�TJ��|��SL:���9X��\��. Dg������������x���y$�����f��tV���Rt�\��'T�uK����=��?�%v��$(�of���5`'^����Iv��
����->UH����v�����X��o��*��"n�u&�N���'��W�191������o��HU'�*~O���@�[�Q��4�����0}3LFa��?2$�8\qw_�8T2��y��rL�c>���s�%�*��[I�M��HT���-�c���^)}2�B`�����%�E����c(C^nU�6x;L$��6�*lE�~$_:�������xc�d�#��D���#>�6�Xp����o���b���~��K���V�-���}��K�1�8uh0���T�����U]�G�Fn$���~���F]�1��|�O�����P\[���`QQ07z�
[,4�8���7���i!C���Y_3���!�C{��L(����D���X5��WFy�����	T!\���'��<��F��c������/�Y�V��i���w�9F|^���u��Q_s��}k���o<�&u�=$�����E�����	Q��(��o�Vz�TT�=rz��O�����[�'�<*R�����������%�9��#^�O���z������N��F�=�	w"��Y�1���7'��uN�=q�c��yS2��5"��
'��o��A\�c�atjqf�+����8o�3|�R?����=��������(7R9CIq�D�:��M�N�>�h��V&��9(�~+U��B{Y_���6���Xi^��\��N.��d?q �*
�P�;�B���Dio���q��������>�:���x������d#����-��QF��Ot�?�E������?|J���9�"���5hO������6u1$_:FX��1� ������|���X�P����n'���?Av���Ie��1� �,��W�9q~��ZiyTVs��v��1��c!���^tM8�>Z]4-�H�ags�����Ba�����C{�eK*���~��j�<Z*�
��{
7
����FN����v��}���(H���I���{���j�4e� ��^c�X�7��>[5<�>����(��B�����|w�J�8�Up���dm{/g��6���{����`����QJ����}����T���"?oR���������=���O�gw���uQ�$0w��JfqMI5q��`E�����D�ak���Rf���:�c��>h�9�P���9k�i����M�K��U��5�j���fA�r,�8�^O�)
�`y2�M��Fk���K
*���`������XA���:-��y���qhD���I����J�?DM`m��TI{O�;�"��{!�s���]�=NBv�������'c����:���oQ���~&�������fM�Udo�!u5����������
o�ay��0���$j��$��7�:V�\���>Pw���a����]c?T8$����{�
w��;0y�-z�
������]��{ K�+
��;�<��:+
��m__��|8���]�((���
%���������1�����4cU
E������QjBL`��&�a��/�\�iv0=��
�r�+�D���?@T�������!Q�g���f�D�/d�p���7�-�S(X�%�P��5n�(����dYH�we�`���i��B{��bG@j��kh�������_q/����Mg����%��\�u����Zm���	���y6z�{w��N���	\e�x�*ja��w�?���w3n�<�mH�tW��x�;v��]�cTSA6�0b ��8�]i���<�����:�@�5�Q6�h���L����?�l��]i���k�=��3Y�]iX�������#j����p=�������$+��R�����q1��6k�@��%qW��c{��`vU�$�5B�m}���$s���P�@L�8���%�F_��m�*w�a��%K�p�5����1T%���yw�z�{�?3�$�����~���#���F�O�$R�T�{?����*��	�0�B��$���G���RqX�g��l?(�jO�8{����
K���z��+������������5<���F�7s���3>�D��
hV����96 G��?��������\���W����^�����un��i�����z�na���g������
�M�Re���l��~�/�S>�
��%`�y<�[�6��f���=k|_��j�W&!������'4m�uD,!��B�#��m�[�O�K� >\w�i�����2��D����RZF���Tb�=��_��FL`���+�;�f�D���F���7�{D��8������_�!,!���*���.:_�?pYT4��O(�J�y��W����&��w�=��L�D� �uQ���4������#LU|W��$N,P����A�`�8���kx�"�]
���Ag���f�c��P������#�_�Y3U|��p�S�WT����u�2����WoAy	�Q��.�b�
���T)�\��9#��|bGD"{����*�g��]'D���I}�<�P�^p��]O�2�A��b�c��eo��::��i�J����BnHW*mG����-��P��I�(���A����	�J�������v�����&����@���n�k��pB�#9��)�s����y(?-4�+F=�dm�����=�z�N����?���#;�{?b�Q����n+�n����V�xXn��n8F�t�}�7���7��{�O�b�� ��$����r*���h�������bw�����Vp�o���gF9�������y?�R�JMnW��0�1�?����*�3��������+�\�+M�=��[E�����O�k�`�13�'���:�/��b���s��J	���H�����'���rV�
u�5X�w������^��������
m;�	��,���R� e�\6�gVC��$����F/��8�,�F���� ��#T�>����!�N���R�iP����$�:�.���bvY5J�he(���~EbN�������\��������u�;t���
�	�8�Ad�����z!�u�/����t{_q^���(o�R&��U�k������j��D�`w��[��L��r������0��l������h��^��*Tb��4CP��h���^���S��3<�6�B���q@l��j���c���(��.j�����os3V��W�P�&�>S]��x]u5�"��b��^de_���A�j5� u�����r��a���������8��	�F#_Z�yk(���u�+ ��B�#7f�2\;�Cz_�_�����z���P_A�����w��I��aw��05^J���*���4�G����W����sj|�-�9��*�[��V#*�d ��F���z�0m�%V
8|ZdG�]^("�h�[h�4z~���F!���f��T3����t�Mh�M6p�jYa
P����'�Z�����_�I�g�Jw��26 ���!~IhU
��j�I��������������J�pw"3`V���UA�E�K��xyl���'���w�� �m����Y��dU�GY�l��R[U�b%l�]'����������n����������'nj�
�^�66�0�7����x��d/�{
�-E�&�AG�LC��`���8i!��H���8��U��%?:�o��(;hP_���l8�^���dE�j���hC�����R�T
j�$��J���K?B�����Q�jd�n�����,��A(~�<����G�������
u�h��E_��pF�D3��gY�WzA:��'��}��t��II�6T��� ����r�6����#F�i���E��K�eD��f4A$E�2h"�+Hy1�(��\"�"j�P�a�H���{N����JY�-^JwWd4�f���.��	Zp���Z���I����iF������Z�V�6,*(n�����7�?W9��4� ��_����g\��wYr����������4{�
H���Q[tT2����t��V�_n�",��r;�������(�f��8�~�~`3�����m��8��5�I�"���
6-h-�ohM����^9��,#DgF�\Z�'����J�4������W)I@b�]���X���}��5�Jtau��c�vO3U���8��5�C��0���^���tf�	i�H��:"@�0	s�27q[�{���m�d�u���d�l�Q���n���>C�lIt�-|�"����|���z�7��y����"}����:����r�^�we�����2���h?2�����[NM����i��g>v����f&��:;�?>+h|���5����A=��HY�l	�F��1���%E.(hZ.L��^P������{�!��l�����Md(��whNXi1��P�f,B[M�_����8W����+�BF*47\g���4�]3��b�I^[���7'�+�h*� G�w36�$Z��/�����6���l��zeN\�7�r����K�H���-���1��l4c,B�n�~�����&�}�	��G#K�-��7u�h;��h�T�0��fdBL����{C�o�P�Pj�������`����0�3���������'�c�[�(�/R�zV�1�U+X1a`B�)Y��Nm��1�:a��]�M����D�l� �	u��KF#�4�&{�4���\��G�`#���p=��z�J`�D7� Xd"��?�����UtHw��mK�=���Q���P�hn5�XMI��M��P����6����|���eZ����v[P�������=�������~c2�b��K��10�y7����FK7��4�=i���t���+M"�W/7�
�?��B�H���lo��l`HbO��3c8��|��\_m��B��C��!����^�����x�n��B�F���G���n8A�2�Q��L���9�(���H]�/$DH�R�1��uC	�
n��tC	�������NOV�Ty���?By��i�(z�#��Ka�At=6����T�TQ1��f;�+}����fh���<����{F"�F��Lw�]�u��k�P��0������)�^c�D�����$b����
����T����nb��D=�������h��t���^�����
<L�VD������m$������������BGQ%=�
M.�W����-%�
�Fmh��a�����+g9�7bMl7�
4hJ,`_��8���I���C���X�2��1z~"j�1�b�Jv�d?<���
I���%�"UU7��d]��=�-����#������4r[2Xa�-��fW��nY���*����h��g��"�8Y��hg���?�}=�,.�UP��f�P���]6����hs������sx�q��'Zs�G4Z�Y��5l�:����Y{�}���K.1D�|D�A�M�����S$6����/Z�FU��Fc�ei�K��H������4F�E3��Y�1q���d���#�F$��l�*H����a�N*�������Ad��I9WB�]�h�$�����t�L��O��l�yUv
������� �l�?F������s0v�:o�c>����=�J�P�'�9�;��������!�DS��\=?��9-��N�Wp�8���n-d�����WY����O���0Idkkli!���;>V�(8�T'7
m��(�*��~��F��	���x��p�Fu�(q ���:��dT|4�%V���8.��,�J����&��X;��9�����v#��&��k��$;n�(�i����4��P�V��|�:J�q@��aB�c�
��F\��>�Z���+�'7����_Sd�������y�q�w,�q]j����_��Y[A�>����5���joub�:�D�t	?����'�����\YGT�%`I��n#�Y��y8�?�`�-�D�2�Ge�C#�
r���*�)���6��fp����X��0"��o�i,�#�h+x3`o���������
r�=�`�A=E1�4�L����e�'���[4��n�&E�Q�=j�G�Df.�)G�X�n�r@-�081��h����5Rf���	Yc���������6M]f���04!���[W1���"���,������pz�����D�b#z![����!��0!<���}��t���. a�����H��Q����%�1��
�1�_�v;�n��B�RF���O��k�+�LC0�
�����O���3[T��,621&���&Gcd��2F�l�IP�j���T�����%*Tj�M��XEut=�}q�z�1������R�,��9���jM��8�})L�J����C-�a�~�Mh�E��R=b��1��E30�dP�����aC�`m�!�~�o�;�����,�)�%FcF�����u+dT$
2Vb��T�4�}�t
M�9J�'��%���[����
���B~���1N���7�Q�6qW*@��P� H�9�C���&}�^CnP���m+T���as��:�s����8�6��oxh����k�����IUf�O�
:�v�}o��hS�X��|�)��8*�7��p�< �2�2�o�_Z�A'�I�0�9�_����>{~8m��f�aM�H95����o��2b�4�-�LQa������m'G1tJTz�x�P}���Y�W�>U�����te0��i�B�	��8�oSv��K`��<�'��`C�[Jh���0e#�>NN>w����`���bB�_���=Ko�I�x&,~��
���vj�BlB�bUe,4#�I���[�F��_zyO����I���^:��L�1�|i���-Q�g��X��g�#R�����U(�R���`��X��_O�b���
t�� ;H�N6�#��w<%�DS�i�b��VLu��@��'9�#����8��'pv�L����z+�g����5�����h�c��]�~nchk��|��*�@������'����LJ��/���gR���ic;Q��=�^=�0��]\�4���#Ua�+��y����J�g���&[V��N�����7FG7����2T��L.�	�����s�Vc4Cc)�����,bCN���l�5�!.�UlW�S4Br!�f?#����	{��9���qsB��$C��b�KX!���������������?fX;g���)�qZ_4}�P�w����\c��j�0�|q�����-JC!TL.3�CB��L���ib|�D��*{3�W(�U� ?���>���s
l��[(;Bd�����[�x:��������ni�������kP�x��Z}��L�k*��"�s���2����D�)fk���Sc6�+o�=�Yg�M�q`�f��a6#��@06�3�!���m2H\��f����,�:)��3�8�j���9,�M�����10:���A24���T���A�tC���(mb��������^{� �DL��B��z��!�g%���br��/d4�]q|���@'�z2DAkbe}��Q��}U�;�z�br_�{�v����sL]�$I(��V��mg����M(V�#�M�*���v��:�h��.TU$:[���'�W�����	�@s4][1q�����d6"L���"SWJl_F(����"V�"n�*�����.l��5�����Sh�����Dy� ��2f��^-w%��C�f6'/���"*"Z�!5k\��V}�o����i�	��]h��+����Qy��mD�9V&Y��}��}1�y�*I��ubS�^��y�����"�eCA��j���z����s�W�@�f=��6V�W�����M��
[F)�������&4n+�_F%l��?�ke4 E�
,�Z�G'd;�A���bp���;��01�s���/c����[�C�Ule�����9/CB�MW�"���%�j��4V
=��'�r��Z� D�a�F+�N�*��^l#���g�h�=@�}�5�F�M+�
��h]�������-(���$��Qx��C�i�20q'$������&�u8N�6*��K�F\S/�]	��/q���:IC�I0��zk�����*7�2� <a��{]�~1���w�@��e0BSow�v9,�"����e`�M���	W�����P�Pq���N#wu]"���ZqO�<�m�����JwZ��
..���K��<+�
&������QVl`}�H��Z��	.x�q640j�&BQCn�dr�gCtl�h���2�{	��w���NI]�.������]��C<:�olV|��];���W��sc�U��,CRHVr���lG��a	I���`��3[���7h�!��I�����N@������{��u����Z�M��������PL�X�����'�"J�u�/�j��YH��H���D��C��,lE��g����0������H������ca�S�n��	�@e�6Z��9;a���F*d##j�T�Q���z}�Z4�cw�*����S6��������f;�m�S�l"���DS��M���������`F�8C.t�Pz��q�������m�2�BR�m0c!����D�3(��
ht�6�^�d����V���8v2+��K��������go�q�������`�0�n&B#�e�>{���
-�2�=H
��i44q��/��NC��6j��LO�x����&z �Jw2������I�i(��u�G���vkT��XU�_#(��[���K{A.#��R�{��M�������M�`�G5���6D!o�����G��k"����{����n)���d�C��p��-�k�[��.<>���w�~���
�
g��6h�2KX1��1Bm�6RQt��c�j�WF!����xh�{�N�$������*�$��e	Z�Bp��
�B�x������VA��2<����8
4	�	�`��q�)��8N�VG��� �c%}��x���o��9)�L~-�&���$�r7f�&�mC���'���w�R��#<�O�^t��w���E�A�i���V�f5l0�
J��N����l���9#M�w�bmm�w�K�G�%;@{
J�.$I��o�	��l�X.cu�X��_|ab8Fl�j,ihGP!�����~���l�h�'\��?����ao-��
�m	�5��4�`w�X(3E�+v��|^����ov����C�v�!wItS��`%���rL���AI�-o�P��OQvJ�J	E]{,���b� A}�����������
B(_H�L!��[��~R�0+/E��.J��=@�K�($�d��a��T�;r����HX���� ��m��Y��]���
:�[6�z�h"a����o��#"��Q�WJ�9O�S!������<Q�=��)�b:�����DV�gy��{V�����@E�1q����|ozPZ���z�m��m��G�n$��j���_:F����=��6!�%�u�/ Q�)���j0a�:7��v=c�%�Fe7���d�g~�v$�d�&����Xz��)�Q)K��;���S���U&�G�E�qzj�sIPP����X(�N>-AL�~j��o��*n:5'�x/�rU/{���$;i�nMY���l��9s
>F���*h�7�<��xF�2�
�#je��@A�)�G!�q%Qb�9�������7�8��8w!z�^K���}Y��1�PZ�	�pk�#�3]��dI�� TmK�����Q4@���������t�M�6����$i�=����%��aY%m���	��E��'�Z�O ��Ur�.���A�����|�;��88ad;f-_��S-�1��������	���"q9zZ
;��I��CQ����
�<�(%��Z���U93H=�&�B�������e�.a��0�`�����KqE!�d}����:���{0|��R<1n���\�~�I���c-�����rA0�I�|p5�P��.��������1<!A�����gmd�'�B��{F����:Q�a��9���=�k�paWl�B��������c��"������@���Gq�t�z�O������X�=�E��I���������]��g����(�'����)���4)��/���g
�g�0�@�N��&���
0F19%
�i
@��_�0%>��@������I�����90�`B�q�5&e�*hk�|���r��-3"�����o���E9@D�cXb�rE���
nK#�����<qk@[��E;������M�_�x6�
�v����~�u5O�$MI�����+I�#�5:����A�'�M����$=�A*d�M�g�c�b.���o�%~�����<~W��H�&�E>U	����;UQV�o��%�\�TL����66�VzW#;�oQ������Y���`��B���k%�BWO*%R��z�Tnbd�����w
ow�Y���oi'l��5�7�^z��o��t�r�-r�*����"6���A�Mah��3��;�9��"�����>Z��t�Oa
RS�H����~�*ViG�B��t\<=�������P��A�B�+��mF4�@���5�Ya���+��d=6�&�-��d\����y�Aq�#�(!��.�kzha(%%[�����o��v���[�����\t5���
���!M}��z����Az<�A��'���f$��w�TnlQK�C��b����[q %�o��*e��u5-e�-HS�[�>XQ�0J��-7�%��U���w	>�D�;�V#���A$�EOF�^P�]��������E��������).WC�"o�C~:�����!b!#O�����KU-��l	X���y���?$��)~+-����Q��o�|�
yJIQ9M[b_z��B�,�?T��[y�s��#��cd	�~�B6G����:�f�V�8�Y��� �ok��}�����x�lh1�]�����:�Y�%�!S�3Z��#1F�-<�(A�I`������O�e�?��+F�lQK](U���a5��CnA�4B��A%���T������b���y����Q��r?P��q6?�`�[��K�I���]��"���_7Z���I�J��t�Uh���N�.����o�����@�z�X����y]�P��oyB�%+�a�}��`��~2�5�"����P;zLW*����!�����%|B�F�8��6@$�5���}Co"+=������N�4~�]��R��z{\�P�M)$�5V��w�|���mK�@����-��Q2�/3n���9T=�����i�|k	([J��q���s)���M-�s��q��Z���x��q���
��� J��T�������Ev[��>��e���~`t���g�/���K�k�5��I�[�'�I�F���fK�~	�E���5�R�Y��*j�JL�n�8����2��{A�uIbC����R�/B*,%}��J8.q���_\)Q �w�W��D|�G:����������f�o��-	����������%_0=y�������r"E)����_�5O6��������x��zX��J���hE�l�~&��M[h�[ZR=�����V��� ��{����k�h�S<���S�q���[��+�LZ;v��V�k"p����F�#m��9����%�$�����W���jod:O(SL]D��vVb9�v������B��"����s��Q�'�����-p��.���jJ��~D4y�K��r[~z�x���A�rc`������Ow���=e|�x��������U����v�Q������Xc�J�4���1B�J�4(B`l	6�*�����X�q�l�DU ���]N1��
�g���H$�Fvhk54���J����1*T��������o�����?������I��yq]��U�)%tAtQ�y-%����4U4�8yUR���e|�~��=2?2O�F
;$ ��L������R"H��f}����q~�~� t�$_�>r=fr���1��=�;�������Rfa��1���5D�,�$Q�.f�i+%��=v����t����z������Kw�r�%��J2�Byp{�������@��?I_�{�L�P�@l�5�`�OV&V�~f��H[S���4��%0�h�n�!S��[`?�V����TP��\S�6��<hY@�r�d�-1m�U�+��5��B��u��>)���3�^���m�wC����j�I����������Fc�N�=��y��w�A���R#'�}01�(5"�M�J-�m��4�T����b�)��?j	��X�|�(=�������G
�$
�����]K������)��34��������59	����TW�����0O�R!H�*�Z�������Qb��oO���&�P��R�
���Uy�I��/`��Z�yM�[j,�d�/��{��.Z�����+,���ZS��H�&
Z>�p�
}��
~�7��I���6�U�UFK`@g�xb��������������>�T��wO���*������a��3���j{z'8^�6��7�Y<��QT�K��=��l�[QD+��$&���1c@��{�&<6��8x�$�	�x�}\#Y���h�������z���|���:l7MJ���$#������2�%<�2�m�R�B�R#!�U������ux����E��
eT�j�����?��A��H�g(������22"(u&����}�������V��Q�Lm�G����Z,tfR���G;z����v������D�_^��(/���T�����R�'�:
�[�6%B����c����it����oa�T�c�z=������ z�_��F����+Dek��O|i6��"HA��>5H��Dq�	j��:�a�5f�)����d���v<-�r5)������}��Q;��'!A��
�@D�j�@���i�M5	U������-NQ02\3�F�'$�-��m�KA�g����r�$'��L�t�E4jl0t�1��3��Tc	f?�)��]�����[@	��E����vV� ]���X�(�����)�a��QU����k��\�W��7#'�����2d{jIqV���Uo3���h�=��=0C��)<3<S6�hO�Sv����E���w�}ng(�
K�B�%�Hp��8��G�G
�x����������c�:�,%��iYB��[�@DS��������:�4��=
�$:�[0�#��9��� �g&�I�>vl4c�F�S<p�P�U�W������IT�4c����u?�^|v\����Q�h�����FK�)�������.��p�f������\���!!�%�Yh��=�+o5��;����Ro?0�4���[{�w����@��[�}Dr��1I��w��Lf��]�S0�bKp�����c�%T�T���,��t�.���J�iar{Q?�f�b.�
�/�m���A��D���h�A��-q������S�Fb?�������e]�F	�"nA#�IF���H���in��$��4����I�$,�m`�*4�O~k�[l�X-��!^2�����F�j�VPa*o;v���>��������"����
��u��*
�����--h�K~�n(�lj��������0��������a�C�*	-7��&l�T�_J)���3zOT�
*V��44ts1�7�G�3��1#YM/����b���������3�o$��/����n!+EE�t��u�u��d��*��4�B'E����]|T�0���XM��{�1F�y3~!��$�k��%MA����o����<��Zl�vh~
��g)h��S�)�
������_��N�*��!�A g{E��0\a�h����5%c1��f�B�aX���E����5�A����7#�-��j":#o��T�v���ML�+��[�1���J��T<|K��-�'b0����5,��iF�^<�(I��:mIN��������Hd9q��D�(�%��Q\������-��?�J�Q�Xi�&���'���M<B�������mT�uc���uLx�����k�T_�.�N�
>�h�����$g�!,O5���M�i ����Q���?���UBj�r���t��*�k�5������Z�1�0G���;���d��eO�����/�|LrG\�^���}a'm�45���2�%��tX0	�ND���;��r�`��s�M�1j��N�p�i����Cc�Uw���Nv���4�!����{��A��1O2�t2�m�:~v��%�����bl����FD��5N#]�&Zi`�=���>�
�z,�P)�
?���`������W(h��� �%�C�Sv����i�F���vs�3�TlMt�(F�I���B��_a�=�	�=mi
��uC
(��������	�%��r�N`�rO��B���\9�}��������t���(�H������F-�{��L�/m��v(8]�����kX���m���*��'����V�w>�gdQz�@s�������FC��na<#$������A�����-IX;�h�G�X7^���q{�Bw���V*CtPD�pW�/�v��T�Q��X�M����b������x��,"Y��:>���jD=��{Q�����g��8�c>�5�w��C�����T������,�������d2z�'d��w����J>���)���������A"�n�@��r��Qlk����b��m�Z�F��mH$�#|�i�$�c����[��d��	��k0$Vg����j|)V];�U���� �Ma4[��nOh#1� �C�b��<����=L� ���v��s'�Q�T�z���<�����hPb���0��k���!<v�?��XS�]��9�Q��{3n+'�5�b�$-+D
>L��mXU�Jx6� ����U�y��3;}�����K�K�������jM��D�(��#����'9������P`�
�R�4���~��nQ��0��%Q��|<���Iaw���<"��%A�e]@��� ���I\��'���Ap�8J'�9Vu�6��^��lm�\�7Q�6�O���H��z#KYK�a�������+n�m���#�o��n�r[f�:����7�a�}�����B��C�����D��e
��=o�!3�j���[`���j���x���5K��2��5c5+-�J�
2�muG,����
��5�-�u�k�������,�D�L���E�-L����Xx�h�{���f��"[���QC�W�UC��N�X��30!fL��O����y�e��V�����8b�$����:�4�b�X�"���w��������_a�1v��5�1��~��*��0b���&P�ni�7��G���{:��1�����3D3�D����������y�6F88)=��T�0i�1;9a�h��d@���@��<-���
e�������� ��0"�P!Z�����5�Bb��H�cKCEB�]C������,D����7���R�O�t�m~_��f���1J�k��[��B����l�C�L�?m�._�'C��`�a\CC�[_U7"�@
�a�b��[<8���72��Bav���nC��1"�hT�������.,��D�8��^��<I�l�0�q���i��n1��U��M�n���SLK}�����X��F=~+�u�o�Sy�,����Q��-R���0�!�O����h�B
�<�_����1���+�;������N�?�	��"�Tb .��bB��B2Yom��a��p�B[���j�8(Q�.�8~���[�$b���BhT�e�C��F'Hnl-��rX�o����������6�&��T\�X6U���;������Q.��y�\�G�y��g�;/������3���1_�e����C���&�����OJ���l#R�L>by��B����4,�I�@��ic��yx�Z��k������4��!~r�E?�a��d����+�P�F���dl�i Cf��
eW�C������;�������x�5�+Wf��3���o�����~BI�h�0#�P��~2��&;B�������	�F����`5�N���Y�?C����l�!$g�L����G�Zm�=�&�y��m�*z���x�=�������	�F��4!�&��$6Qf���,�d�/M�o� ]-�3��(	�;���_�����%��N��=C*6�AL��w����$���:���F��QWh;j���T�<{t9��F;��sE��a�AI�*r�����fo��@����c�.�a�S��?���.����L�
2����]�4Te��1U`G��'��2Y��?5�b�����i�A4Y���E��Yt��bXz��{&�Z�����/*���u��������h���e����"�z������	9�UQ�����P��
�p�9b��JvR��i���f��R��P���Xl?4F�psvN�2�b�$�3|�^�B$��$Wt��I^����C�n�
����(&;:Q�Jb���V��H�ug���4:q�\���+����`��g$�D�|�%��e\b�*���3xD
��!��\�I\Gx����R��=1��~�AN���@�����-�T�=?�y�L��eH'z$���|��hZ.�>;;h�W�-V�@Xf�7#��u�x>Kd�&�,t��Wgs��rk�T���F�������bGO����}��P���X�G�1��qh��Z�Q���d�!�]��u�o=��}j���$��g~7N�a�)��$�i�������	>U����1:���T�/�(���P�zHTn�P���jk��{�PXepG#:����26�*]9]B�6�,�+�Q<���l���'���F;��J@�`-^_�*��T��u4�\O���Q#�NeE��j��'�(1�;j����d�L��M��S��*���<���s�%"���y��=3�,Y�(&����	��B1�����#e�?�����e���7����w�8N�z��N�����=��h�2ZQ�hr��O}��=���/�:��q�����m5#%\���I�^)\�E���\F/�=|�%>d�\�D��*)v���[v�E_��lO����$���_������~�wxL
�q�sk���{�.�1�J��8NRU��\�C��X�*���Y��{�Q���cL�Z<���ep��If�� ��?],����������S��{"����d��9;��Q(�^�b��_����#�w�6U�A!�|�M/D�w����P�|���n� b�U�O��lyN������G�jr���^>:�,��F�SyU�[-�)�������x��(�@Q�L�Y�`��5���AI�)�0@��m;WL/�"��zM�(DGe�[��pf�J���n��D7�����k�'Y�4BnEB�h��:?�+	��G��A��/�M������k��2S����~�R
����6���V��]����"����}F+QsW�"�[�W��Z��DBH����",�wz����[�xR��s*��'�2��O&��F�T���$+����>{y�����>�������6'�)�}�:,Zk�(��Q��	e�7����v��e41�a������;J)G#}<��BVaX�&��[���ZpA$�������`	4u
KCEl������p�U-ii����M����v�8)Y�#h|���.X��-��V����V��>E2��$N�u�J8Z�2N4�O������X��H����!�$G>�tl�F�I�.�lU��d�������3&��>;a�C�	�G� �������}V���'�'4��`kK��Q��mM�m�Ah�����)�f35�
��'�X��/�=�R~����[h���P��Kf[K��l�X�c������
�5�P-tt^�*j���I��������3�en&Vn� 9�=��9��,f���]�)q�<�dw�$��`�P�w�xYghP'� Lw'�Z���e��GH4t��G$Rt���<�t����(�
�3E]�|w�4g�����n�^D�������
5W�����4���6o��2S�m�AE��:6���9�1A�*�I��;�!I��'�6� �-GS�����pR"*:9o�2l�������a��?g�9��0!��a��?�	it��������|�&8V��1gj`����S���	�\��Ak����N^�0;��~xC�xr.���l�����<E� ~�	@����@u���p�
����[g1�{�\�����p>�t��,�/�K^�D��V|n��~z�q����=����ogV�;)�������f�!���?j�"�f~��}�wg���%�kg}��
�g�����?���6�P�Q�"��%�{�Dz����
;�R%����Dr:�C��~u����*A��I����#�#|�:���q���i�	�V�r(��z�Q���)���{�cl;��0.4�"����(�q�T�m���?�Z&�����������
W�k9��G��#
�[W�-�K=`�v�[��1^2�����@�����X����>�>�$hc3��e�,i5)Q�w'�Z���=;8}��h'����[�7aK��;�(������ ��5��tpV$H�j}��u���.���a�	�i���0�}��DGEm�c��e��Qp��c�@���i�!q�Q��$�*�G�^��2D��	^`���u�a��]�@��,&p�k��&k/q�n��beeA��yk"U�G��
�^�I�C`�'��AL�\�C����[��I����<P���mdI<�q��t����x��s��\����=������1-�B�W�Y%�"�3 :����@�a(A�u��?5�^�#3��(�'K�Io�Z�-���Gd���RU=^�m@@���@��BD�L���@��%�jw@g�S����}�C�CQ��Z9C:�8����@����Y��-QB%��JP��R���c<���W%�S�u�dY����M���s�R�[""_���3�>?�L�Cp�ITu�a~R`X��2 
�_c�g��0Y�I��R��}F���E��J�cAH�0���'�K��AG��%	��cW��Dg�c@A.':vVLK��6!{X/�����:�
�h~4H��X
�%}a���9kxQ�O�Mw;��������TPZ�1�`�R�x;�s�F�L)��=|����<_��bu��H=�ES��Q��3��Q0)+k/(�������u5��sPq������7?5*���H~�@�L,�%�
1W�W)b���Z���=�(Q{� eA�X�'6Kj��)�C�hr4tJ.����RV��>?�D�����|�2��Z~n(��$�G��M;6���������1q���Pln-~b��4:'�����`R�u��!����g��;����S�l�oM5�O����1����
ll�O[�
G�g�LQ��d�^b l�� ztv��;N�~�F�h�V� ���\%�������������C�	�HA��u�b�$��YP��$��R'���@�s����^wi��U;�Bi�����&?�X�iI��B��I���F*����VX
rv�:���+IO��0�sb!U�H�R|O��{`��>��9�-0�~���/9|�������~g|z�F����z���o}��{�����_���n���K3����^�a��kA`�w��{dj�����.^}f}z�%n)��N���B����2LQ��g�&r�wt<����8�i"��{!���g��X��pC�5$��G1��%�yw>�n���H���c���H
�N�%���M���_��<�9z��X��K���e�;���cR�m��	��U���d��y�a���Q,-r�~����fE�'E�{��������,P>�{!7��q%�������������������s�=fbBY���T��a����Q���|M1DW�\e��m\�����1������_AD�����Eb��0���>��i��9&_��*��k��y���Q3V�9��1�!q�}��q]������-Z$A���B�3[����q�����������'���!��{��/�V��Z�5�Y�{!��o�.�[�"��-]��i�nb���Nf�CI��h������q�B��>�9j
=r���P�������r-{��#��������%� ��<�6�@�pe���59�+�ro�U�=$���USX5i�����U����d!~.�I�����D��&���e���4Y�+Ee��
M�7�4��:��F���A,a*V���/�3{E��w��-E���L��xma%vB�y�{���JnV�-2�7�J����q����<�����[*������8�-M2Fu���u��c��N(I�X6�����J� _��
�u��}{;%��w����Jp�<��A�A�������Z�"4V���O��%���{A�{���$e3%M�h�`��Z���L��Q
�d���w�u���*{�>b�3E����Q�dU��p_�|���^"�%��T�|����2������!W�w�W�����V>�"[d�0�{fs�h�$��
;�(���K�����m�L�
�N�C�����\oM6X%f|b�������T�����2��y�������g���P��Y������R�Yt���'%�eC�3S��{�I��3������:�����B�J�#��#-�Pt��q�� t���@�B*�����F�����{r)�c�����Pfk�%B����z��>��V����*���@7�+J��;`��b|B����D����J� ��$��w����
b��IeC[I0��

ZJLTF��������DU�cao�b�A�ceZk��+Y�3(	�f�S��kJ�S���}\;4(���/�0+����`��{�x�(��\�Z�����>_t4�lb6�*��,t��u@0wAUUi�Cg���W!�
W�6�N��}=]2(����1�p�?��>����x�<4�������1_�.#��%���S��l����$��V9Q��|������Q������d���W����1�{��`b%�!�v��nj0z[F�_S��D�������D��Z�6��	(��5k~6�U�
�W��gB�N���
4�Bd�%VKQ��T��'��D���f�z�Z�(�PR^���c���p��]�x�\��|c������"��+r�|�����j�`/�gM�z���)5P�^���s�b��h��+���X-�P��$i�����$}Fj���!`��������[��	9��>N\��6������	������e���t5�����x	w�M���X�eA�.M�V�B���%",��H�E������9F������T;`ED!B�&�y�rBJR����g+�`����B��i2�B��������������js���RK���C�CN��|��T��w�8pGXQ���,��sP7%o��������=H��2��hY���gsD����0hE� ���&�%�*��D��O�H�hM�Y�h��Ak5���! j��KX&��-@����4�$�E�w}>�?��������j��d�'v|
�l5I����I�F<�D��Mx�*E�~�6��:��N��j�A��J�F����i������g_
6��t����Rj�;�7�n=X���&�m�����#d�0��,�f���� ���&�!����5�MbS���X���c�y���%T����cZUu�j����Ps�Es�H���J����j��xh5�:��/i��.hdRF�gN�4z�S�hL�����\
TWU�C ��W
4t���CR?�)h�1%6��>���� �\����}���������V�qP�7���gv�R�3]�*�`���TJ�]���M�3�{���x�' �y)��-=x�Cv��(s�y�v��t��]�	���n9�
�iA!�dW5]j4��T�_������{Co�Z%�H���t�����*�u|�1-e7�pj#�������m<C�Kt�x"����!7h��p���~��UV$��]k2!d��z`�@�X?�:;��P��>B#��
��9��Wk�	��
:�)�5?h���-�
z���B�l��W#]3��b���x�6�T���5`�v��?��W���Q1e������-V����	A���Ds���;���8�5�;�������ba��Mjwe\���V#�
�`od(QL �������%�>����������A 5�K�;�M��*0a������.����g������w�Y-��b���#���x|��d��dP�n��1���]��|�v��~P*�3��WZi�T�1�!��Rs\��U��WR.�G���YEg5�7}c�FD��M�4�w[�E�X�R���H$��[h���BP���-��E���%���������fP��E�AA�S��J��2y��I�uO��-�b�$�p������?U���5we������Cn+j��H����&�g^r�dw���n���'F���"���g8����G-�Hb%��Y������}��/������(~-J�[ O����[N���p�%�A��.�$����@37�~Iuh�����1I���
���x�����b!�����\�C|q�@+���7�-c�[����SZ�bkn����1���<F�n�@�5��xGXfKT��[P��X2�Aqc ��f$��j4��� ������j-�G���a�F��������PU�"L���k@Z���R*��N�-�E�g�������G�<FD��#�4�1�Zr�:���=)��&����F	��=�N��b�%X�����%�e ��f�`h�w���F��c�������s i�rz�XU59\��h���a"�dK�����p�m��_K�������{K��Lj�d0q��Q���w#6���dx@J���R9ce>�}�=�8�h���
����l9?�
�������*F�[x����J���h�NT:"l�>y
IW�a��1��%�A:���6��$L�4m�����������'�����>����������������E�p�ha���vB���a���M��Ij� f��� �E��3V�9�!XR�#z^3.��K 0�C���6w����4G���p5q��.%���������8�.�F���h��r�i���wxbD���{�U��#j����l
S�!^C\�f`A�����*�E>�r���%�5U
1(\n���#�GH�b�#u���!�����x�2
X;�6U�&�T��c��ie!�;��s0
xKwf���$k��JR����i>��v�j��M�<�bP��� ���_�L+�YUvc��=��P���&���Y���j��q
��2�0��t$t�������Zt���tw���4�*��:*�{.1>�u�^��%qe��;���1�c���[��������c:�o%���������uq!��'����$R��^9*��F3Jb��0n[o��K��Q- ���#	&z�J��.��a�&I
��ngp����V�/�6P�(D���Z]�=`j�t�w$B:p�Ow+��������
8t�	��n�oEC�1�\h�v���-���~�>���V��V}�l�6&���k��lQ���*0�r�\�-^�b7����8�?Td�#RX���"uc�[{�������F$�
C$�nXBgP�N�V]�������_f�N^R�tp���M��j0#��?:�ZZ�5�d��u�
T4�3tZBS9���n������F&�i�r=���i�z
��Ho}��$6��a�2P�T���3�����o�A����F��n�a����������z�������_!z���.-I���o�FAm;E*EW0���36�5���];�$����Y�b0�������:}FB���@
��2��m�;O�L�u��/Y��(A�
��Q����W@����w�v[����������i��J�z����3��<{��&������(�P��d�����{��B`���
��dL�\����9w�Ic�Qn����mc��=����%i��`����B�T7.�"�{��1��#���ap�Spk_��l�7�p�@�{�|�� �n�a9L���/=�
�R�zd���7��Bt������H�Fz����$E]�{D,�
���E<�O�����C2`����X��>+��H_hX�x�,n+z4�?P��EU
��a)#�E��D	ET�aH�<���Q7]����E��L�5���A�l��*����xb2CNMqQ8�<"���t�Y�G��T^���1bl��v����p��V�~�_���f��H��JvA[�(�����K ;f�=8�I��=��P�a4`9����n��� C��a�HN����?[S���\QP��B�=�#�Be�H�Ba�"&]��bl�a�`!�f$=�-u��l'LPW4���XV��580���HP�i:��.Z������Z�'�S	g�L^��dGe7+�'���/E/H�2�b�R[��L�k����m�v Z���������m4����:����1�J�!����!�Y���a;|}�����d#K$������=v��jnnr��s_f���u9�
c!�l$}�nP���2������C �a��$$����s#H2�UZV���7n ��q+i�j���^�����F����0(4��A������OowUjM������uVw0����N:>�J4�����_J3:93����rbE�Q�+��$O$��
��!D#�F��>����9>�O�I�G�j�[@��'�g2X _O�"�2��0l �<[}l�1�n��mK������a0a	�A0�| �c�?�6+XhO�@�m�����0p���2 �������G�j�J�54!���8by�����{RUi/Y��$.h��O�m&*��^P��,j�5.��V��������MwDvX���z���*1���>\6�vN
l��2��8!����B�Y��FY�����)������
;g�O:#��R?NGB������Kx�[�Z���==)�\F�����2����q9�	��R���"��t{�e$B��g����4���
�~GJ)%�g>Q���c~�
��5p1���6��_��3�����i^��G��8�3�*�g�����������������sP�;�8�$����\��(����nb:��lt�8DC{�,?�����P�9��fIS��r$�2�����_��;�>�Wk���z������BOBT����i8b��G�p]#i9l��������~��"3�5��H+��kx��v���W&'L�:�Xl��5&�]������l�(���Fz��9
]lq��� �|��e xv&�Y�P�F���>��=�)ac#1����;���->�b��O����>L���p�*��)Qkm��
���/���A��Ehz��rw`o*d���w�bC��M����|e�
T���������Yx����#0a�wV��~O�M�Bg�%����H��N�2�C���[�
5(�V�_9��de{O����p%��\��<�x���Q�a��^h���{oA"1SN��|:�����vEN��O
��6����_��%���o�d����%�D�w��|��=H�;
F(@)�G���fL N�7���h���1ZU��|�6��KJ�bd&�Y�c�����:���.��;�JQ;4Yt��1�)���&����O$i+hx*hf�P��3��fnI@���`�vs�M9Y�z}�m,������\�
��l�6��H3��Ug����W3�V7�X��H:��n��'h�w_V~�z?�&�-d��x��%����Gby(��F&�U�B��
����^L]���Udg2�Q�Az$5]T�5V�/CE�&5;�e��G�a)U�����$E��H�M\Y���X��C�I#fv}���\+�]���?q�%G)!��������2��
�Fz�!)�L����d��>0�t���$9K�UJ�,�p�+Id�}�yq�P�H�������w��S���$�{%�ym
x/��*�D2��-�*�wtt8y�
)sV��-����I�M�eb���b�t�V��� ��7|}g�:��h�
���f��C�������Vt���De+B��&�^�����l�[��CV���G��auL�������C
��mt��Z�Mr$�]�B��Gh��	�4�kv�B[�#�������^��d�~�=��X5����.�g'���5�i1�����'��
F��4�z[�%dK�rP�?�3o[�}��y�Q�J���$�JsX;�..C1n�]X�[Bl�hBw��H������}%���L;~aU�+����a~�+	eU�W���w�Y%�U���b���Z��I��0��e�B�bG���tha�j�k�"���FB�,5��p�p��I��B5L![�f��K4DS!0E�V9�����.�9� cH_��Uh��%������)l�5sW���\9�3��etBE�|���
��X,��.�fEg��Q�g�P����������Wr������.��}�XN����#dp��yAv���P�i��^��>J-z&s����S�G'��Y���/���j�`
+b�hd����K>��[3N���z���C����_Q�n%��+�6C�=?S�E������&d����8��u���<�,f}^L�c,B����Rl���R�
j��O�����:n�U��j��C�Y�0#���p}��hP����F��0�	�@
6iLHA�Q�xEG��?�+��K�~���h_�K�F�eG�ZB���lv���
��MV���T��G���n�,*�u��t�M����vC[�X�X��V�$�V��G���Q�b&��<�P����O|���G+���av�58!q��~�3�}x1fr�h�h��P��b%����4�w������N�I'�9�1���@t?��|�9n�F�A���������H;a��b�DR����p��l����GH!��	�)�Y���?Gash�2��p�
z�O�����l+��}n��������q���D*T*m���Rg�5e�1���3�Ai1�u�n�������[���%{*�����Z�~{�a6��bt��F'���4��ob3#Z�6$1P�m'����w�6Y.j��"�k�����B(DA���%����=z��C�Ta�lD%�6
���]�e�n�
�-(�TzH��D*JV���f�8Mf���F �\�m�����p���{�	��
��Z��OJ��v]�:K������L��w��6�m~���a��C�����56�2���q����n���aJ��8Cu�w<�J���>�>��p)�v��A�wX������ -�6H��������������9�>�������
�U�Ze���g�y��U���!�d��	
�T<rJE3�`��V_�^��������j�6��R���6l!�|I��3��:�G�x;���{�P���)������4)����K<����(�_�9`���>��B pd�f����<C��#�~!�"��Z!���'�����#���.�=��3d����vDzd�CdL�9���������%3TA5���A��\��
�z���I���7�0�D���\m7�i���2�{:U����L]i�51���e]���y���� /cw�ma���7��-xCQ�~�I���![�{�rbZ�1v�(
X���ZC�!rG,���>2�6@�
�v#,�}��F�������U	�/a��5��m�n�O����O=��)}���;1N�T���2 ~�6�������E��i����Qe	�;�Mby![�=b�l�
��E��F0�LTN�p+�C	tZ<��h4�['�>I*:h�<Ol"��{>t@��@G����a�l�F��&g(-��:�'(��&M�/;)���������d8�$�����?	��3];%�����N����ICO����RP����S�)�
��:�i����W�#��x(�	�.!V���~H@��=K���(N����t�Y��	^��r����}Iy�0�~"�e���!��!��\D����=�����v�AEp��������p`4��W����e���z�`@j����H��F���8q�X�������I��9�����'��x��,8R,ZH�,2))���s�i�Q�6���*����Qq��	R��M����������F)�����~j��=Rw3��c��"��O��1N����'"/����(�����.a*�c�@��l���di�'I�cg�h�:���(:�����I�R�w���~(���Tf�c�@��������'�Lr9��������)��uN����O�[9_�/8���{E��l^��#2p��t'����}�+ ff�g�1r+�q�SG��E%`L�����>��]���4����TQ��u���um+����K�y����>�>�;���F6�f��,��E;���R�[$#�*�|�����;$L(�A��h�b��%d��t�DEH�<���-M$�<+2�&�	�\��h#"wv��cX�!�����'DZez�0�-�h��_�H��F��S�%>M��
�sN����$�C�)�w���	|�����bo���1���"T�5�NI\)���n�DO�����wV#�?9�%FvvH��n�c��c��*�����.�#x?��j�e�X�1����A��P��������&��i��*�]��rWD��1�0Y��(C��Z�%� ���|��'`~�a0)��kD��a
�;2����f����a ���B��w�A�|~�p/zBg�$'���kxW�Z���� �%I��/�kqgI��{����*
t�����^��"'*<��*(�|I��Y��=�0�yl�]���2���=�{p��z����u����T����D
`�y���`���J��W�5�Z���"NdQ��z���4?�AY2wr��f[��p�L�O�h����sF�����I��VJ������3�Bb�wx�����4}W>R���q��;�V�����Wkrx��h��F6�c�tR�����KA����4�5<�D�#�s{Z\q�o5��N���?#I �[������W�~��H[�!���+�ar�{G��1�L����_��
^x�ig��xf�����y' �I>���?��.���^�OLXR��#����}���x�=�h�����0Lf~z�����Cr4���q��:+V#a��������&���{Ad�}~;�a+D	Y���� ���i�J��l<��"����U�7w
�w\�r>Us[���������OP��F:��%��� ��VqV��P�>$nz����+c0?�w`�PhL���1�=�8��v9�����5\���;�KiI���{)G'!Y�K����Q��&�l��i���B:!�g�[t��?����a�T%8�}�5��kP���@�D}42f��i�P�U�)���&K�gA��{�D��]@d|��1V�����j��rk}�a������O������H�vK���kxF�X��E�M�BN��������-TUd%�;�����?��D��^�]>%3���;��Lw&��6�ML��K��p�]�o���`�_�j���������~1
i�tji������&*���J���=���	�����EgI���afl{y(�F�H�������L)����^r�B��{!����'H�;��Y���U�������7}������HS��,���W�J�Y+���l�MWNg��9*�����.����O�>V�U���t�(b���E�&��9�j*D4�Ec(�{�	Y�P���[��H�Tm�W�����&�2�������W��[f��N���I���XG�����Q#��L����"3�D�q7VW��*�5DPGMI���t#�iZR*j�����
�A�Y	�q��"���7�Y.x�S5�1��'n�\|���M:-�F��aF�����N������Sh���Z�~>hC��&Q���btc��VI�D�i��Ed��Jr����;��y%?�����#�2���o�{��5����@��wP%,:�/��2�Jd?�:	���j��>O4(l+)�b�C�	��n���b�_��j�>lI�l-]���+.��d�<���S"�����Zg�E$�;�8q�J���rK�P����	U����8+�����F��pO��thf��I��0�$'���b0C���&d[&" �������`����?K�[;:���^WY�?���a
�rsQ�Nr(/�g�Y���
�l����6DGn%0��+C�^�)���0�2������hI���[�]S�j�w���y]�Zh�\�!�L�2������l��*F1tH=6b�����}�3�<T��I2�K�����4%�:��������fJ3+��H�H��cU�!������N��XM=��}��hL��'�������8�����r",ti�����T3H�r�[�}����2�B�����X	�-�8�U�>���!�����8�M�?!E}����e���
�0C��g��Z�$�����R��N�q>���FD�ba����`�2�]���[9��Y���8�(���&�!�#=�oG�V ���L��
���Es�����v~�pw�����������ELm�����v2�@g�jH@�����k���w�<��<��>!��d����<�j`9��j`��I��T�>9�+�W��~y>�.�L��'}Z����+�tJ-�(��UcJ�A_W5*`�m)�k����v$���G ���Pt���o�����Jx�sF
6��*9����b����&Z�n���4N)���U�pm����jt`��hM����G,@)�om��zD��>Z.CVj�v2fYO�@}�@|lD����W���j�������2���8������+��`\O������'�M�&�A=(��V�M:�&��R�����$e'�U���N����L�Q�t�{�PfY�-�����[���n������]���~�N�o���[��,����o�+�K�6t��p*�K_H�1������m��
�ne�@�����l��J�j�����@��
�/:�_f���v���04�D��s�����$>��=vu��*��$P[�Bv��@*�/����=g�z�|���5��+�Zah&&�Z���J�b#|����0���T09])(��a$�j��<L���c�}<���H$q����x[Q�<1�R'�� jl���g)s�&�����Y=���kL!��O8�qW��a���d�N2 ��E}�U���UCm�Tk��/���'
B��*���V.��#��u��Bm���n��0���.&�&V���a"��VW�(�Ot�������u�+z�'�=�!ez��#��d���F&�d��
�qC���u�����y��
��`_�{{l���D�bC��C��[5V����T�+��2l|�&�H����l��Sw���j3Q�^�b��K��2~�_^l'7��4��b���[��E �;�-����������$X����k@#�VO���-Q����K7���D[���@t��9@�7v"�i0���hX����2W�j��V��j�Qd��=�T�IKN�����WhR�
_���8j����T��e��E��QrZ;$����<!c�f���2�j(����{+�X'e��;��'=��������'�E�����gL�5c��QIa+{�)�bn�:��~�g�D�(
�]_�^��-�����+d0������� p�|�Z��c�z���} ���?�	g�"z[3��l�Z�H�(��5C*��u�����#.�_���dck5M>��&�z},d7w;R�������rG�)��.��s3t!�<�=K����F�f�vU:|���W��%�R��oG?��+����EK��CC�g6�p��#mqR���U�`fI�e����8��nF+�������t9'&��� �l�h5�����/�q���&��}�F)T��R\������z�2�u�O7T�>�����b��B��[�[Oj��n'����u��[�m��C'����g/��-+�q����o��'a��Ol�26��������O��n�jR
�E����9j�)�p��U���P#{��vHV�t�m����b���b�i��q�F��5��bs(��6�B��������D��fX�TO�:�>�Q
&�o3����� ���X�b7.�!p�<i�B���#v�(�2��������B��Gv�S$5�-�N�YQBWv0K��L��M3x�,�����)��'�Z���.6z��P��BG��&�Z�����	����;��rnA5����51n�#1�H��m��1�L���4�!q6J�{G��<�|ml
&����[��["0�����+$or
S���l� ��-�I�G����`+�w��p������������D�.����6W1�4+-r���j	g������t��X�������8��`mH#�.(
�`��$V��*�����m�*��Q�c���B/*�W_L�W�-
"�@��W�i�c�$G5a�&���������`����C�N��u��}t"�^��B�m��;'7L�|/d:���������>
�����H�v��?9�����{g2��C9��'[@B\}��}���!��H��$f���|l��F]���	��vc������c��Kz���
2��CR�tD��&$���nA�����U
7,��C�����������i�����L{��LOB6��G��64��4�e����Io����P�n�Bk�
�)�1- ����Zl�0�W3����|��0�($I&��R���`�npb��R����Q���`����F�6@��o"�^�PlFD�#���'#��������J���N�K��,+�\����V�j�O�+��!k3���+��(���{�"�;�a&����D�'j<K�R�f��p&��+�G	^hY2� ��s�bz�nA�E��N�
��������y�Q���Mg�j\����I����*>/���� �����B ���a-�?D����U�2���B-)���G5��������U�����=����E 
��)�\.�RJ!�G7� ����E�0����B����4���h�gzT��;c��1)�n�	�`�i�#�k3&(Y8k���� +Jnn���������
�H�K0��dT���Up����������A�@�l����]�����S5p�=H�E��)�t�r@�&�c�f������
Ws�B[�q��JQ�z���������$�����V'%�}lM5���;��h�-��c9�#���j��5u�q�G�p�2a�,����=�\D�'�L�*!�V?A��?4��*��9�H���^��m	y�e"r������f"����;����y�����#bF��Is@�=��������c��&���<��e
��V�E��"0�XF�2"����~C4Qt!WnhOXHERjz��d$E�B���dYCc�����s��~@`l���:��5_q
cj?1���&~�)>���Z#z#�;`o��+0J��v����{�Yo�p�P������2��YQ+CQ~�[��d�Q<��C��QBDZi��A�dF	���#�����axA��Q�F<�P�cJeF���&�O�)�kP�lT��0�s� ��A���	S�$j����F�h��+���jwL�E���T%|^^�_�����s?o�	L>#0W�a�@}5�y;:�C>��-%�L�<�9h$�U�#R�{�, k�?J]�%�����;�A�j�a��������^� 2z�u8�wQP��������z��?�G�����9�g$�A�B�+��X��?�4�6�n}_�S����UA��0��2m��z�������������c��a��Y����za�&�8���~gq��~��$����"u��?lNE���2Z?FL��
�E_l����axA�/,�d$|Z1[�����w����1�*\��~E3BW�1&3J��f�5"v
v�E��1�n��3� ���Xj�c	��"V!^�����L���#��~�#J��v��A�'wk�O��dXqkAL���OKG�~��	vpO�$-����ga%�Xi��\Pc�� �a�@����B�F����t#a������y��F��-k9���/9��~Q;�h�Rn,�$M�L(C��f3��Y#b�}���%D���zD�er7��v���h���a
��DI���������W�z��������:�����2��P�Aa{����%�W���`&�&�{7�����	�8T]d�A�����-��+���C

���I97>�������8���Y��|���Q3O��B��3R��QNn��Mc�a�Z��5f�528;���W�������]b
`��4���w��v{�a�	�(%'_�(�#^�j4
Ft�U����:&�vj�6�LTT���z��YM��������������$x����Q]6?���Pp�v��~��	�{���>t�����=z�M$`=�Y��zwmag��9�<��F���X��4���+��F��x�zt��:f�M��f��?��O#���h�K�B�����c�0S�$N����<��??4bR���h���$FH
z�&�2(�������z#OC�X6[�w������lqfE�8��]g�g&d����a������h��F���+�O=Zy4���}@�!!��L���\���p��4�>�nS1�����`��{9>�ve���>l���r��:�	����i+���u��?;B3F���&0��(����(�,�9��~��
Vf�d������	)����b���!o� ���3�)~b�#�`4G���M�|
��n�>��$��*zX���7IM_j@<��;�ON�
4��};�$��Vr�d����i������U�It"��j��<�e�����w1F(���~������pOB1���H��r�e��6#z��5D�����6�Q}��g6{c2��j�T�1MR��@�	���-����Pi����Z�^.�����n��\�xH4����Z��t�_�$��]�'�{`fFsg��A.�T���QT��&���m����O=���0��F���&�8����
���C����\vw���������?��&L}:''�{b�H����=��3iP��41���S�L[z�=���~�F���,���e��D3ju���{te�B#J����r�p8�����R���21m��i�����~s���x�e%�A�k�,��.�{���BG=��3RB�b�������%�)�N=V��w=���3���\�;q��a]�U>4��|�nO_;��$)�A+ReO�o��tp���2dhE����+�tsj/���2�g34��5S����v�Ua�K.i%�.c�Z�2GP�u'����\���'���>���)��Wj���z�S����b�����-�V.R�k����O�?7�������z���ou��G�k�����Q��S�QU���T.�)+�$7.C!�_�\��[���&�H�k��G�6{*(/}#���K"*��5�C����J(����=���������D�gb��A��2���H��#hrXF��3��S���Y=�4=�����c!:�����u��k�T��F,���)hS����%��v$@zW4�+��
�.�
e�:
��#%�i�����������|~N���b���^�[�&#��2� �ij6�K��!xq���H���2��e�a c��4���o�(�b��0��J�[����`�l}��h�7T�^[�/���F��'E��Y�}��>U��:�
�����f�V4��+�WD2=�Bp7�RJ8N��������p\�3.\��}�������Hf����\�[�)kK�:���"m@����!����
�{��U*�������$&� �m$Z�����)�>G�t�5Gv�y��`�`;8�m�{2c�/�4rL�;�C�������-V��\;��_*����0h0����k�2`0Yqk$���Rsh`�J��/�L*�����Gl��i��It��5�����0��eA	��I,S�L�f2!���&"v.��e�/���y*b'��F��XE��6� ����c�������RP+{NP�����r8��c=���5I�}�F�)w�}�z�������Y����f���Jn'sA��;�3.95�����Bv�]b$"w4���$-�#�"s
�E�AP����9���
D�pQ�	Q^5j`��O$���K�����,jN�#V@-�]S����/J���F�k��=����E�s�:�}8#����sjZ��|WZI?n��*b��^����I������3���dE�8?XB��@3o�$D�"L�w���.Q�����g��}rH%�
1�wRh����6C�8�d�|�&7�u���
rX�����/�-��F��N���jE]��9,����	�Zr��zGu�(&����l��b���m�?��{�������`��6(��tw�������N����YB���Ph��h(�����	w��i��9����Tc�5�ISP�=C��n����k��/��|;2d���2���U#�"��G��X	��>�O���~��� ���7��c��uU9��)�"ey��A�iX����]�����9������s�E�h����@���8���gA�4��=��@���M����2~�G�>��Q�k�nl�(�	=w����!�������
�&=������=y��7�NIt���Zl�'������X����	g'��8��G$��
$�
�N�*�l��a�4����]r����$������"b�6�pZ�Z1�B������f��ai'��(;u}���l�����t"�(�;�%��`1Q&n�O�`u�}�]~���sP��zr�?rg��qx�Jr��d&�Y3-~Hj��!pg��@H���%��\x��M��n� ��I�:��D6+:�J�<�>�C���l8_��	�U��"�lt�8�ZPY���c�@	��{�G�Q��<��}��� ���'8��WZHt�G����N�^6��}�\���9���d�Br���U��9��M�$�;%�*��Nl���B����Ql���B�[>A���O2��� G��cHa�����H���F�m����$Y_N}~���7�J�G��5cj�������F�_]Q|�&���=��	��E@�Yt�O� �b�g�K��bi����O��q�B�g���s���vb@�"�N���eC%�i�)��fI�6�"�J8� {!h������4K�|��JU��Kw���U��sp��1|�^��<�bh�3���R\�4�����u�H��x�7Q�y�,�
�,���1X��\���f�0`��d����#�L8�
:[1#a`�Z����>�3�.�:����hM\��/�HAi����}U��=� ��@�5:j��QXj1������D#=1>B �������H�J�h"��3b���������u��<�E'����	�����/��-l�_�zUZRe?��7��2�X��4D�>3N �Lf��[��i2
����h�E��&Zd�;D
c7�RM�������;��5��X���P;����l�Vv�+:�a��@F���h�ie����$N��G���~�i���Ih�Pf�$JzGd��2�������jB���37���}Vv�K��yu� ��,�w��� �,��+&�S��4��1yq���	�����f������/�����Qw�ct#�8�����Y���=t~�����_`|��14�OR=�\�Nb�����_T�6Fc��
$�:Q�*�ly=�������������o�*�M�c��,��I��	9\�����7�������n��"I��Q��{!�H������t��������Q��#��y���@�=�{
CU	h����CD/�����t*M������B�/��^��g�v��Bn�������ihHaT�T�����|U8�2>�6���C���8z`�}/�dr�{��[���W(=i���2���w������ ��	V q�.���T��t�$��{
;8\��[;��v �;&��y+����O�F�,	��EH�Y`0�{��[��vP����BgI��^�������h%��o�P,�(h����5��k�����t�����t��T	���O�)`��$��m(���h�:�'	�����^�+�T�����$�{��A�=w�V���]����D��Y�m��CR���s��|��A�N����	h�UW��CK�i������
�/>��a��l-6k���U��jE_�15e�f�K�gtn����V=j}8DJ����
���^�����EeGK��;��X$�����]}����G��$�R�O���]�����������n���#<��1Xs�L�;����?��+���sD��_�&����!d�A��I2~+��>�b�b�
E-�
�o��^	����dn7��F����#SEc���k]2�s����I����QEe�B
��
�=h�3�S�������yw�e�����I���G�����V{7h��0Gv�C�LbY�d��w�w�g[�i��_�C���EiK{G��,�^Bs&�^��J���:��%�m��.�{�cu���9�>��C��W��*��y1j�����:vR������.u����u�� �]�p������;k��aG9a�*�C�jH���d�_�����0u�W��!���B���l����Vf�Z	��^(|������V@�+Y�
���;������4�����^�]�[^5�8Y�>�L��������T
��N��.��^�X8r@�	����XVts�G@#dA�^#U2-Krd[�C �Q	l���!�G��;���k�n�z���,�,�����0�N��uc��O���$�p-�a8;���SWj�b?��E���^�[�{v��XVxR��1r�^�=o����TJ��S�����^�^�Ff����
�"�F)�oH��<F��������4�E�BQ��w��,�����\e^������s�I5c]�4�I��}ic����AG������RKp�.rI(��<��v'�����Fg�����<C-�R�<�[�5��X��b�b����������	I+� ��;����G���@M�b�B�A�P��D)�z(%R	Y��926��`�;���R�b`�9>
�}~I���9���Jd��@��b���J�$�A>�G�m/�2Zz��%+A=k�R�c��2��{/��c�)�'$JvJ�-������y ���2�8t�V����-�$��i�l�����]_�b����\nPc��x=<q}apVY���Y�%���z1� CHy�*]p���BS�����D|�|!LR4�Sq�����2�y��s	J��Z/�@��vW���%�IE���=��m&��wd��\�,0��Qt�A�I?��1����m��n�E�������|�'��/������0%~����%�������K��������;��
B�')�&�HV�W��v�����(ImP�����!B��'%	�����b���e�As��}lE�����_��GV�r�,\�I��J��U�������i	eU�t(�|��GcR�tU�q���c-u
;J&�-�A�2�@�r��^��-'��a������A��T)�6��$�A��j��]���^�+����4}=%#
G��N���95����9��bPA;����EV�H�������VX�.H������&�g�mA���O���u�����:��Tk4r�'�wd:�
��#]���B�Q7����^�= P�F#��������y���"J�c��j��;�^
*�;���;A+ZQk��y�	��PPf�@A��A��R�l)��3���'X��������gjCFD���my�����#�;26�"E���[[+ Y�kID�G�Q��Y�7@%�#P�G�����jB����l���4����B5x��Zc���k�#��h5<���95�d�_vC�<�((bS����y����K~U�^�A
��OC���%$p��p�������w�=�������%�(	h�d;���-��-���lF��=��%�!�
+TwL��x��SS����=�5��8,�E����0H��T����X
4�6�����%5K�N��O'���@����x�^��tjSdi}�S��~�����?���m!�����n���r!\&5�R��:l�b ���$v!��#6(����Q}��"
wOdR�G5��P��&��m<��^m�Z����m {��
RS���g��g4v��e�Q��w�$���|��x����=��v}h6�0vM������(&��`44,$�	c����9�Y��&�q]G�xv�-�R�8����f/<�}>LU�T�
�m[���8�1��������q#�Q�<�V��{�~����
�^�������;��?34M�^�#�A���{~���,����%����S>'(��NI���\�x�B!��Q�	���jyO�SGon�'��uI���$E��Hx���[���c&4�vlYE�@�gR�EC�{�/�����]a���j�A��Z�e�����LuQ�2��� �epg}6��-���Nf�]*\(����0Z����h�����A��J�j�dW�%�e������.���~V{
��-bt~i+��]>{�jF
F}�U�;�'T?7�����54)5
j7�B�����}1�8�������AI}���4
(����*��?J5J�5}�G���yW���[l���%�Y�:IexG�_#�6�'"�j�7#	�"��@	�������p�	�E� �[�~���mF��T)��3xP����y(��	�w�5�&!x�}��lR��	��a�s��6��2��$��kA�}�b�����S���k0�����?l^�	*���3.�`c2����:���-��waB�)�p3x���TY�����cD Z+������A����e���z�����w���z��A�<�%�_a�I��Dc��������
��X����O�O�,�CM�n ��z}�S���,Z�$�+q 
kP��>`|p���6��h#�+m����{�����}&��6��,~���ZL��������y�������=`5[�Y�����Y�9�(�jQ��1����!���JE��JnA�I
c�A������|*�Mi����f��������*v�����#� ����H�lA'U#�-��O���l2Z|�l�O�|[O�dt���.����B���r�Y��#%Y@���D1��?��=[
�E���=\��,FQeG�w���&�v�������!}0�U�F�S���`#�g����dMt����K{2;�ov������"�i;XA�l�����~�{��]���Xmlwp�_:��z������]B�	�{|.�]0��H�B�h{~\��;j��/T��c?��Sg����z����*"z�����._|�>(��c����G�+=��*����/�������4�N���A�)b������L4��8���`/rcfg�TE}|DT�O�-�kfv�
TG1OZt�*e�#�9�tC�����)���B����O�.�����'��n 5z�c������x��6�1��D�#w�U���
!0uV�������Q��^��U�5�W����������R:<;��E��t���|�G�1D�!)!&'��)VJ�
J}z�r���eC�p�%�(�A������N�c5�%W~�vd���#��D�q���&���D.h���������Q����(H�+�E@��b�;z|�j��22�R�v�[��K�~Kj�@2�[o����x��yi
�c��A7���Nw��'��%�4a�[��_�N��KX}Uz��*��v
�RL����:>�*�UF.����``?��J��f�+c#=��,|z�W����t��T���p��e�\�$Y��/ ����"������M�O�����a�����7 L7�0����<Sv�O���>�	_P���G�*�����'ye����4��A_�x�2�_
�I���Qb�r�N|�*@����S8���b���Q= ��o!�3:�2���������&�A��D���&������e�nL>��c�2�g���#�_�Nd:Y.�h���v�����h/�1
�%�mw�������W���6^�X%c�b�HtO�r
����N�"K� ��h�VlW����p��g�B�4��h�b K�n�B>�:*j��X�J�[�r��=�V8�C�pl�����qbil�p}�r���Y�Ast4(k��W���F��E�]Ct�A�����4?F���P�B����a{T
J;�=�=lz�;I�9�a��(I���|
6��=�G@�t���PHx��\����cC�5<
y4�����5b������'����qO�%�L^fMb'���:�����N��*"��$7�&���=���c�PC��������g��0���#���a�o������ay����"�^�x�p��S��mc7t!OL#oE@V�����	����b�P������k<i�]�H���o;u��[� �Wd
��g����#�	�;)�T�-:��7�X�!>
B��!�U��dD��f�����b��]�@�F�*^U��^��y$���Z����C1���.��b$�Z�y����7�w� ����3dp[E��g$�����&(V�D���l�*�%vSUFc��f�<�{�h�CEY�����`���SB*6q���_�T�����C#�#b�)�
h��h��t4m/w��M��m��
1Y��~fJ���A��_*�'�����a�#[+��9-�
��X�.W��b��E\����pGa�^��{����s7u���������>/��?t��p� ���E��C�m�	c:�a�C@���"$��GH�{W4�}��&��������$*
b�!u�FOB�=G����D��J���)�i�vy�$R�+tB�x�T	�sir��.�Z�#����B��M�s}�FGV�S���^��z#`k$2Y��1�?�w��X�?A��p���f���C���c�-��������=��{�`��g,m�p��8�L�8���Z�����\i�H�����q��24m���O��"%�e��6���-	�e� w���Ql��k�����#�����,��!�.Qi��q�Q�9�h����A��!�����Y�2)�|��L&����y]��|�N�6��8�D����o�3���������S2�~4]
#��1�1+6�F4XJ��F����
�t��Y������w��L�J�t�1��2�W(���D�?)�������a���_��D�0X����m�h6��������%�=f����<���Q��F���#?z��(2r>1����e+���A<	$e���D�����_�!pm���iS0�IO��0;��Du��$C�;e3�Xc��,��X�6�M��+��fP����s��,���Q�?
Ql7���3���F�LZA?�@��W^c��iBZ����y�����������:�B��].v��rB��,�w���c"Lr~y�h����fL�r,�C7o��;G������a���H�������/��vho���Pz��7#�{��;�,�������F�Pf����8�
D�/ ��4�0�7l@Ai�G�I�?�P��lLNI�y�l��k��2��&�����S���	��	xf��K��V�M@����}j�E0{�����j�X:57���c��i�@����$��S��4r���V��43�N��=J�D�3��i�� pzP��q���,���(�V���X(�$��]��cV�
��aQ����d�-�v��2t������e9T���L�0`�<OC"����X0��#����Gqf���^�)����V��"��;�^�����Q��7>�h!U��e��I!?�#��`k�d=$'Rla4���w>�S��`��q�����Mp�8A��g?'�����[d�Y�����R����n�pc���H��k�g�Q�	�����I��{��
+��(w����.�H���[+���q7B��!��t|3!�k%O�jc���#���<�tV`Nxs�YOA�;���tA3��U�4�����	v@�i4@��}g�Z����� ���.���q�`3��T�}W�P47+��qyj�Q0wf[M�����w�����vD�EUMc1J�i�cY�i(9A��~(lr���`������c��V��k���(�k6����P�����g|����� ))�������pi��-2R��h�sZ�=W0�:�'b�-|q�XZN��6i}�Mr#(����Kx	t"�f=��F��(�x��iam��Z%����A����qTl��R �2��Q�Cm0W�w���c*6�� }������a<������h���� �f�2n�}he�0�a���78�~K�p�9��PBG=�e�`!~��Y[����	1#���7��~�h\��Ib1���_/���������W�������K�O�fi[������D�������nW2��%!�2SP��"M(��h)�H�G2�m6�0�0�[r#O�u���S1������4Rm}�����q����b�d��[���J�c��[�/����#��/���L7W�\�er�q��@�6^=�:=a����F �������Tb}���w�+���Ie�`�����,���l��pw:y�dY�"OP'�������K�
!���4���K� aiY-��a11rn���Nk�e�?}�Hz�x+���mC�"��V����u�����x_+��{]����9�����\H*p��_1`�?<�a`�|���Q�Y��.�b���o�y�7�d�_��`�\-��j���t�V��.V�������"�rt��)^x�M#
�?���f��������}�Q������9�����j�H�����`|�����!mx���q��C�A�m�_�DI����:
6�>?��=G�`)���gBJ�c)��������nY�Cv.�G�`��#/,�_F(�D�6�e�\&D{^�r�q���0����� ���-lz�0gY�0l����m���d��3�! ���2��|�3D��)����	��H��|#��I��V$Z�W'&��$�-��&�Q�i�e�����~�����I�j�+K�P�Um;t��1^B����N��Y�|��<�b\��F�W�P<���p�������P ��mDB��K���, �a	��X8��p�m0b����&AJb��<8�B{���Hy��?�~I��[�m����(%�����m�A�ke��D(����;$��~k���(X���b<��8A
*�,W�e:��&]�dD�\A����'��*��F��6�`��]����
U5��)�$�J�g����;J��t���|��en������.�@D�?�U�v����"��n�����q7;��6�b[�a�:�N�dR+���?W�eZH������C���
7HjS��=5��5">�����a������A\21�����p����0��G;NHC�/�7-�Q�� /����)H�PY�fLA|��`���(�t'�Z�Qr|����<�%�}�i��\�?:���ce9�f��F��F�:`�PEJ�����x��=��R��7��	$��Q5Tm��jH���8Q;j7���>j	,�;�6vP��?nA!&H/�ch�����{�JX	y�l�E��;r��kc�d9l����� ���"*��Q�����z��IPGb�<e��������5��N��v"�������,)���=�����q���]w
�{Z�Y�^��m�U9&K?]"q7�����#�����H%;�a83CS�
[������V����}Y<0��^ZA�	��+��C1�aIw`O�x������L� ���?FZ��B��6T���z*P�mQ��rM�<ke�0-%)C�oAb=�h�FF��@@��;%�l��D��}�<��=��I>���1l��ra�=W
q�PgG� ������9b��da������9Z���}�\���{�
��?�������n�(�i�!,��(��������:�;�	��P5�n�NN����pST�
L�!�����I��
���1�]'���I�E<����(c
:9��6��FL��P���\�)9�
��3��$��;��������N��~ThN�1����r�P�t�%�<� +��y"[�SX�Y�wF���0������"z��-H�Z�JD�Jr�h�u1'�G�So��hi��F%S���c����wU*�"���w|�@�I�t���+b=��������+��I���|(�4��?y� ��"���h�'nHbg�/F�I���N�p����1�`���������=�M�o&��r,
x��t�?-
��BW�af&pz�)���}T�d]%x�d�|��,��J�A���A}/Dw�_��%�vTI������'V����m�������������S��g��h�@�����Dz�T��g?Yi��1B���EM�N��ZD�U��]:�KPD�j��v�����G����.I��%�$�e=�tLSu���T@+���e�d{ ��?I�F ��+|������F�����b3~H��H�{?����=���7
k����`�_�n� ��#��5v*���[�]��I8�T��Op6�G��{���q�6�9�<�H�nu���� ���=�4�[�tQ���;+�q���YE�H�i(�����������cX���1� �FeJkd���a���J4�.�U��7UG��z��������}cj�1��
Ksr�S����'�	)�0
�
�V�c8l��C���)��L����)��etAn�����X`���
�$����yA��4���
J�<�/�M���_�D����N����.�<����NI����
����1{�u�
C��+h�y���1�mk���n��qr����`��f�]v�`i�HK.���Q- E�����������=<�d/�jCQ1��	����Z�����a�JM�'�K�h!�Q?��i�k�b�n��:�w'�����u��e����oi�����x����[�x��������w"orpO����/��6�,�7�	�����q�/����H:j�5���E�EE�;���L�����v��cEQ���i
��#M9��?�X��%�;�??t�V�x�Ih�N���E��5���:�������8�g�2��K��"M��A���a�N�4�_�7 �.T�j
�2�3�{�9b$��?��B�����m<B�~E���MQR��[�S:Q��W1X���Nm�9��a��tx��o��H��!�z/�=k�A���*��+G�~���^'��C($�d&�������bo�8D���#sX�q��@�j��R29��m��OV��������^�<VU���N����f��%������;�/�C�����!RE�����r(O��f���zT������R�V���S"!�;2��"�}]�w����� �[�h����]�P�r�%���p�8A:����.,��F������Hy��I����7N�{-y���Z�=B}���o��h^S��"B�;2k����w�9���2�JZQ� {��!V����P��$_�R��;���!�&�����Yn����l)�� s��R�d���*���$W�P��^�gGl��qE��!I���/��z�_�T��v�&/<�&X����(�q*z����PHG���v����)Q�uLx;2;QC�^M�:�~/��Ct��>\���N6��7�|t��?�_����E��?��g$+�Q�x��Z4XgGxg�zOB`��:/�F�<Any�'ra_�q�rs��)2����qI#�@��{
wu���)�
�eo��������X��)d� ��ZT&��������4�p��V��@1� �9�x��	�D��PGl��[e��(��Oy�%2���[&�����)g�|�"v1T��F�W�~8H��^��!2�A�_I4�����!����%�A#^�����)��
	����e���v��|�e��nn�@/+����qV�m�Mk�D�@��wP�g�77�gJ�r�"��w��a��4R ��(�
�BKj(sU���hF�0J;�j�G+�q��',����k��H���+��d�^I����|���{�@/����,3�V��MmF��������P��`����F�p��f�<�g=�b@��bc��B�D�#���s6�c%�����}��v�@�����2c�Ri���?��~��a������w*�M4.N�w
���v� u�y�a�(�,�g����"���`���;�8�s10�9X��h���&�bNI�%*��_�OK���jYP#��Tbr�j	��~����{Q9�P�����A�`��<��(#"-����m:"��D�i����z����Z��ACL��%;k�����gA_�Q�)[�������#Z��hV����5B+s2�P��C
5"�O�����NC�b�C�cB���H�$�r:��P�>n��G��0��#�Q���-�R
�g��!���`C��~�[��@/����L����NT�tF�?[k�X%NG�^z�b����Q4�!'L=��5O5e��
� i���V��XYb@a*�B�3Dq8�o�Vz]���e�����d�@,.��A���du��i�qnv������q�b��
1e��-	D`k����j�$5��b��|A��� `��`2y���yOT�-�b���]�]\Q0�(����I�\�-�2�x���ao.��� eQ�P�������!�v�j�@N��>Tg*��](�X5��]��X���pdq�F& A@#��1B��Q��a'�0����>i���R�PG�M�~)	2
���j]����!�����S�%�-�f^�(�A[���6�U�!�P���%�*k��5���Kz��XpC'���TR��9.2�j�y�3�;j��jd��E_�t�j�>���N��6�=��I��uY]�wh�����
�	Z�\�AH�H�P���P�Yc*��$�	��l��6I���O����#]k���!^	��y�m���k��B����T	5��~�����?�������x4�G(�B�)Y��F�j�B~_5�jR��J/�Uo����E�(�TRHT���,�F��v��L�eV��\���5T�2|c���%��NL�'I+��z���\�`�Wi+�B��;��]�����c|� J�v���s�@r�jc�r@����@41�g,�G�����k1�$(E!���X��Yj�@����D�k��	Y��#�����#^�j4wgK(����.*b�V��Wi��A����{��V^'����]��[RS�]�;�"`��#+� �B���vh��6D��$��H8����i�b!*v17��m�C;����-��y�3H|��PRXM��N��d�����)s���w��v�r�����������jC'�?1����V��RR�V��}�;GMN�?S�g��M*(a��&�=j�������,9� �R]����l�CA�j�05W5�� D4^�����M�^Z�r�o3z��*n�e�0��t>e���h�2��r�j!cKN ~��X����q�tD�B����r�{���Am!��k��W���|�!�x����-k1�9�0BN5���&������UR�{����H),K�B�P>����@��j,D��%�=�q�E��#�jB��F�&��
�Gg�D]��VP�9�����
�~B��]k���/���%;:�#����L:��:�TO��oQDg�t�T��d�D?a��+�E/���o�f\K`�����&<������tD�nFDj�f�v�mf=�����a��h���C��Sj���_��7O)�5q�����'��bY������EQqGn/�O:�������
i�>T���.�!�(�����?��b���iX�����7��D�(��l����6|�sh�/U��w>���&3�k������Kn/�b%�XIsR����Es�>::�5#$��+|~����[�����$Sc4c%��	�@��D�g�?0t������B@����A$]!������r��Vt��������������L��=�QC<��\�{���AG�f������lr�l�%�P���e��Y�4���=���G� �b3���L����%���^��'�E�j'�n��w�X3�f[��Tii�`����W������JWl�Ci���X�HR,��o�dB���P-�l��! NH�`YmTBMUW��sH����(�J����%
�_���xq�pi9�������T\�f9��'<"�x��[�?������|upE?�����q��1��(�V;'��mUFtr��#GR��O&Y������j���Ve�]a��q���~:	0���&�o3N�hv~@�=�����&t
��t�Pw�C����N�x�)\�9"
M�dG�&+� 7�
���V\�G�n�\�Jgt�wY�mA��O��b���M��[���]���	��[V������e�@�Wq���d���wE#�~!���?f����5�8��.��\�B�� �o����?|~���(�u���H)����n�1O�q����D�?>����E�,���S�9�����k'�j9}�RV���M�SON;%+jN�d�'Qd%�a���,�@S������Riy���-I�F�G����|�����Y����%���������{0U����H�Bs�?���b�Gh����P�:��g�����S��=�����Q���~IBAA��c��J��
�JV�>��*~{��aT���cU��*9 �Y�����c"�qF��A�T�
�q�?g�5{�\���
>�JY�u�����?�������
�):��~t70u��4�	��o��~�
��z���eO��������6���!��`�F���P������'�D5gw�_�
:z0�6c.>M4����Z�#�X����\���b�`+sF��V(��0UbYt�����~w���� fC�G:qw�pL"�kf�hr$���� L���'�$(]�}5����=��v(Z���n�H�(�y�+hN��[���G�o�P�p����j�4�������S���{���N�7��@�xdk�`�R �������\��$�"s6��tP�����$+��P��>p�G�u���W���G��<���X�mkD��(�4�����h��@2[Y�������
������#j+��dP���w���c�l���ffk�_��R�b8���HAj���(�U��P��tK�{�2���9C������`���^@��n<A3]�D��*�%l6-�V�|��h.2���-1]����#*������%��ZE����������@#�UL�J�(
�_�k��d����E��XAG�~}���������n��t�x�y��}GRz7��B1T�R�<p���I����[
�$2��A
��A2���t�7N�DT���9�KO�|t��c�a�K�O�F���X.��J��,Y��@����3�/���-��(�Q�� H	2)E�GLPEBE\��|#0�EN4�o�a0dFxd�Gf��L�,����PW����������L����b��}W��	~�M�>�^z���{2� ����O��������>��+��LF�G9�_�n���h���(M������lS*�����L�9�,���#��S������J�<A��m<�������D`v�k�����Y�T':bj�0���u���M`d�b��;���z��%9�[N��(#���9�^�"{Zf��.{d�����lF�^�����#��G%���h�e	�����	r�;�F���@q��GAs�G��<����MN� <��/zQ��0l�����9�^	r�	u������
-g-���v������g�����>�du+�B�#�
Q���������/kQ4p�pdQ�,�`�6����{�
�c�������'=��;#��<��]�� ��I��A�c��K���mr�M:y�
|�j�U�~v���E$jl�{���BU&j�cK�>w����MBQoqDk ����$�c����h-��2fj4���g>� �FR��8��E�n���aH@
��:cf}cn��l��\�G��$ �+��D%
�����10�'_���`]�+�4����>�$�����+G����d
|:��Pg(Rr,��$�����4�D� 4Cg���gS�""��a<AL��?�LE�5�2� �#�W���8;� �axA��Zo&3�Oc��������>���*s���: /��x������F�Oc�4�Z[L�M3��A	��i�l��<B�C�z����$#A*�J��:���e�Bk��c�?�(�cT�]���<Yx��'Iz�W�����#����'�M�[�m�B�������-���y��[�f17�*Pg�-[���)�����v`dB��4�g0
L����$�������]��&[\���Me�3�{��9�U�DChK��@���C�s�Q	`�`9�?�*���iD���?B{�42!~!sN���Br�0��F0�<�;uQ�bF�����\k����Y���������5��pC��
�����[T�	�rf��!�t�N�PA���F0��j��DEh��-��ejC���� ��V�%�0�1
&b�3b������[�$|��@��i�B��"�ic���yf�S��SEb��l]���^�-�������f
5��jI[0cv����%���XN+	,
�Cj��$����nc���"�����A |l&���c
�~6�����?��Yv6r�8�3�R�)�q0g����b�,/�q�]I?�E�s7���jbC�Ge	/5h����X�
5/P�=�p�����HU7�@��T�(���}q�s&rZ|���������(l��Y�SP�����)�K��O,I��I-�H�N�Gv���H|��yc2P��k��x7��������t��a�����t?�m~�H��W���;�=���k)���@<�KZ9��2$������h�>d�n�KQ&)s,���b��7�L���a�3�
��3P��,��S����4�j&���3 ��5�"���L�*�����/����amT�9�{�g��$��H4�0G�������Ns�:��K��rOhoJrCG��g�4�H��|IV����H�f�g�
e-j�<
oX�.,��A
�����yhO#I�>�C5w����n�����q[*�	�@���P��)�� #J��������s�)%��(��F"�xhd�4��&l���;�O�������Y����3�a�����B�Rx���a=�DX|m��c��/�a�vwt��a��q�	�M��T;s���^D{�^7@����f=7�U-c�[��r}�Kj�����K�?/=,��\�#�E��U�j+t�p�%-C� �z�~"���0�b�t7y��}L����-�:����!��201���2&�-D�'BW���wE�p��@y�I ��Z�^��~>s2�P���*tW�IBx&Y$���
�����'�x(V�J48������;�Qy�JJ5�+�7�O c��|"�,c�T�)s�]���G"�YCE��e�ABi��P�F-��^��<1K�
��p;���$~�A����M�Y�q�x���������85(d��WP=���&ve��#�vG��6�
-
�&,h��X��vq�b�D�+�Jl�5���j."��7l�-�
BS�{����1������H)o��?�$F���N��fd�MZ���*j�-�j��^�%A��2��^�`����uj��ZF ��	��`~�������hi:�1��e��e��X.���U��#��v���a+>4	F���{K�/QxQMeY��������K���hq�3�P�Y�
G/0z
�XZ���0���:L0f�2
Q��@��T��4j���@��&�;k�/C�}���\X����aE�8"y�z���^�#�k@��i�K���Z�e%SP�����#F$X����b������M�_��f�~�h\r��Y��>wf��(��3���,���^+K`
�"��2� �-'�I�������)!NG���.��st�R�U��T,�?�S[�Jv+^��;����~v��m��k��D
����$9����kD�7��4{�".�������:�p�/=�"g����r��<��a+���N��v.�bG��d��Q����������n�p��2e�k4j#y����u��=z*qvI�f[~�Y�v�~�pw�$z��.!#W�r����1$3C�=E�v�{r�k74��Bd�w���}F+�68�QU��K(�MmE��6.Q�V{�3�pw���n?����9{!��~�**�$pgj�����R�{���a�(��GH8�|Y���@R���U�;%�QEh
����J4�J�^e����$�T�@��'��)t2���l��E,a������R�.-��F_O��B�>��}��AM�]��cR�
:���FK>��S�A��{�NhsC�1�m5*HI	�=�)t!�@�h�.��G::4�j���_2�Z��E�PA/#����
X�PWt�:o'0B�6[��]0����%-�\���
v�t�/�xDiA?�s{B3�hE5�A��w�����Y%��
Z��x T��3HTV����n����b���v�!g�v)���=�vK
m4��dR�x=�,*��P7w���GU��T�������AO<�	�$���H��X;���|�T�q��`��[����r�8'��1a'yZ����Ne��
����=�
;�\�
�yv��*WE4�3 K��kY�����;�Ib���A9���Bv�a�����(�4g9�hMB��=��x��l�q�7L���*�S
���,��$�u�����������-����_���-8��@	T����!��(+;~QH���V��o�%��m#�p1�rB|`���j]�
fL�^�X�����w�G������'�i���_T�ocz����E�x�yF-��c������E�#Cc\������e�b���G'����;qJV���b��I��
�c��2.�D�1F)�z�q6Q;����H2he'\�	;D��Qf�`�
������8�r��.��������H�*US�+�sLx���6��D0�4����d��)S����kN��o���'�'��m	!�����'�z�X�v�5)�l?`����>�I����a���H�*y�.���UI6���9��u�d�

��2�0��$gP$�$�A����&�1p ��Y
�BK�xk��Pk��c�@�6�r8�UlHwR��~�L�n��-������rH&qLw�T��8%~r">��[�@E��Z�������VC�I�/Y�O@'��c���������y�$PYC�^������NX?�~���V����cd@*j�C��2�����e��nwj���jRi �1F�M���I�f�7/+N����!��12����cA��@���T2�[l�0\p���?A"���1����K�?����A����z�K5������8 �b�U�e�\�v�IX�}w�9��K6��'���ecEY�J��\QYY9����@�h4%��xOP�5��
���7i�@l"���u�����xb/5����=.)|����1r SP�Ww��F�c�@�L�C)*�������m	F
$�Q5'6+��:F�ie��A�*q�*
��yHo'SQ�������x@#��������ii8��h�@KIS��&�7v�v$A$�c�`��9���2��,�]kgck��������z�7�}����l��j��������\�;l����u"}�^)�V?T�|"�����Jv`
v _��4�(��>Q<hi"F�'��\[��"�~X;Mhb�MI��ph��IR��ch��m' �L�.�PK��_E|����+|�L������j-�5Y�<�;�T`!{��DVt���X1�E4�������w���S@_A���[��}��7{��O�%�6��L4�{���e\%#%m�������-w�;D�\Au��4;���&����h���R��FTkM�5k-'��YO�z�Q,��^�A��<�{>�B��g#m=r7�Q��P�P���n�
uH>z/�����ro]Q�#��{!�� �rcN��z�!� �{�l��l������!���x`�����%��~"U)
������t��C~N�������������SZ�]C�&J�U+Oh��
f��_�^(�#wy4�������)��5���('�9���<��0X!�q�gF��t��z�a.[w��p�����{d��L���^�A�X7���N'�+��q���`%;mUDw�^���P�A,��)�g����@�"=�w�;!�L����Yc�H��B#g
4���:h��FQj1z{/����A����P��;< ��	�"�
�Q��p������}0p�(M������'<w}����kPw�zY���QH��&&�w~��E�.���������x�I���:O|o��~�D���~�SH�j�#���a� Q��Y&���8vE��N�{���eE�m��x���#,Zg�?V|X��l��sD����b�Vv����f����8���;�O�*�B���&2��iqD�Q�z�qX:_��K�R���(n-,�O�H��
�kx+u���>�Di��
���T���l_7�����-�0�eK�@��w��~��+�{=_)�-������2��N*F���C%��wP�7�TR,
���n�Q6�w$]�2@lv�J��sp��A4<�w��q1q-�#���;��*|>���s����c�V��?��j�<���Mo'����w���acu�Q�>~��?��5���e�;p7�6;Dcj:����J&�p��0"d���w
}#yGg���BO�:�z�%VK���UW��F��!Q��[�g���@������vg����w��j8h��2"8r4`/��,QK���I�>�0U��	�@���n[����`[j�~��}�@#�����=����3;8��BDdm���������5���a�ZR}�|�^#��%_�x�����1�-���9������a���0�/2�<��� ���P�AG'���/�Y\z�4�����IQb�t���v�s��h�,�#j�� �Z�J��$$AD�H	q�A�����j��@�[���
�f)1�a�|Dp�@��;�sM����$V�~�]^5�e������hW.�w L�Y-h���$�A,\���t4��y%�Z�`L�-�����Qg�/�����d~�5�>���e�XPS�$�A��-
$���������)�R���C<����q�������W"�r�Q�]��5"!|�1����FX�o�x�]9��%?4�-�=��"����Ip��K���%�H�F�����i06`�����qtE?b����?4S���]�e�k�{���V���q2�J���pK@��t�+k���^��7^�<��z	rk*�~_�>2�p�Q�s��
j��� ,"%xGz�!��mP�\|�����H�u���	e�Ax�pkZi���ec�F'�b�AR�&c�{HB����)��3�wY�T���z�Y��6���VDr]eO��
5*tA��-�|Mh"���fPVK1�p�;�,�L7
Vn�����,q<R��|��B�h]�#��U��.�M$D�;�����L�Srd���(����R��z�eF�zql6p��AwC��|�3���5�_7�0�fn�����@N6}��D�
]�@��w�g�xrTf���	��Q��|�9��d�:������u*{	1 9��7�0�W)����j�A��jw{�� �U����e��(p��*����0SD*Tu�G���e4J��:jQ=��!���X��y���(�e��:D���q�*>d~?��2&^JK�O�31��y������� ��B�7g��r!����P�}z5S:������	
nE��@����VZ��������)zw���C@J�Y��t?�����������'o�&Pz��yBhC���F����;/C~-�uR��0�ZU�������������u��F��~n��R��y���{�A�
�g6)DK��F��jdBQ�U"�����>�7�w[aHP#��O�
o4�L�M��5�z�>��/�
�@����:�=k`��M����XN��`\����s��U:�K���u�����]O�<l��SK��3�c���^#���`A��w��a��r�g7�NM�~���-��)�t�����K301��oT��J�Gh����=�������Auq�X��k��������cTC�j^�T�����zA���
>��~����rj��}�
5�k�yvQ*Wm�t_���kd7�:��|�����P�(
�$|�
>�"����je%U\RQ�ZFh�?IaUi�p�jxB�M��t���=��6��?���G�!Y�>I�xZy
W��;	y�J�a[(����'�[�~�a5�Av1k��	���P�q��1^��U�{��BQ�KY��(�w���^Lh�G��jt����A��|l�uV��PB����Z���.'�$M{zv3�m�)�)�k4H]�<�;��i/I��WE�W��Dg�qA8r�z�(z�F"D8S��z1('|�h�N���.*�S�`�s�J3c ���L+�Z��l�Y�a9
Zw+���Q��$0E1�G����wm+Vd�-V����H�R
M�C�IK�J�T���_C������������T=�$5HIy$�n��%Gw*d�IjPl��,7Bnjp�G���h�����G�Ru�>v5�0�
��H��Jf��[)��^�����~�����&�R��WiBY?�wj@4[#g`u����hPIC|�{�(����|$w���v��/�����[�4�����I��%>5���]�E�����6t�nF+�<�g{��0Aq��e$�]���Aa&=1����E2�f a����w�����,���p��Vc���4�?z��1rTjp��3���e�J�D�b�����������@���������f\R�e��?
iSL)����;�E���T�6�	�`��t�o��%K��wk �*�^�Y5p$������1h ��3�E�P�-*����;���k���^�0��>P�^�p��zK��s��*��@Z�G����%�
���-��j��.� �*�{�:�I����T�����A�fD�7����RqN7"��kXa ��%�U-jh�~�Hr�[��[��DO������Q��;�u�0l5��_Q�����)yeJ77���{��;�{��Xl�?�?*fSd��=����"(<l�������q
Ej�	r��N������
��+'c
u]�A��9OZ���D!)�=���Y�e`�|(��>�A0����h:6c2D�X� �{������Qj���H��Ff�m��o���XR����B(����}$�����24%H�
�N��h���R$�0tn�q~�qd=n ��)��Hg���X�l[4"��@eeHDJ���]���g'>��3��;���6d���`����S�Y�2��U���~32�x1�^[�
�������#�`��a�t�ch�k�E1?g{-6c@�D ��T%K�-�y�(��l�d[�#�B��@f������X����BHrh
Q������MZ|�$�@y8�uj�bhPP|v��??N���&U�6�r���S�d����Tr�I�%Az|4�!\x�
���_��l ����l��R�_���i����{�z��n{��a<B*����$���lE�g��N ��\�{*�Z�%\z|������ k/���P����	��B_n�th!oT�!�Ot�����]���8uH!���I��@q!��X�o�;�?��!�
J�i��e��	��{��&iTw����W� ��.#Z��Q�&�����Q���h�
P������Zg�(���=D9HM��:�.��z2�Q+�zP]����NTN�g/������(���F�-[{�zt��Io@����������J�^���[~�d���I�~6�
�0��Q	���A=�[���������(Dm����qTb��$FK����5=��#)��[<�ef��n]��`�i�~,�����������6��p
��h��I�N���-�=�q�u���R� ��G�p?���9z 	5��+woM�$���!���N�m=�a :x+�Q;zdIq����S�qa7�P���l���N}�N'��w6+
�����9�Pb:��w�
�}�=]�� ���
$��/�@L�nAx�"��Y�G���p,�����O%1T��_�+:��wl�J�[-���>�
���xVD�����~����a�p�&���O��6��"yNu��_������`Gc��>�������&���gQ���Ik�������Q��Lh���\
������6�09���h�����������,=�����6��v������&���}��h^�kSe�R��A-����o
�*�/(=���-	����t�U�RG#����,�Bfl2� �nPA=z�jo!�	�@�nha�E��A����[-(A�����Q~���3�����o��M&�"��&P����;�(�?�����7}�WA���(%��*���mD;�v���z2n?&sQ���������TH	���X2!J7����V�z�}�(����i�]���lB'�u2��e=��}VM��B�a
�/����(mO��Y�v�i���
����9��o�+j	��yuc�
;
c��(�'����hIO6c�6��D�;�N��r ��H,D�"k� �1b�3�i�=1`���b��l��D���2��$<�c�Rp����;�;�����9+�u!r�0��/Z:�������D�����N{[����.h�Ko}����:ihew|��FRj"�a��I
jy���a|fM��J�DdX��}������>Q�$yd��7U�>=�J����,��J��f�^6����g��Qc������k���=��S#��0����Lu;I
S\�<���`��G�\J(��Ya�:�n `|�P������g�i�goJ�-��q��CAhz%�Z��]��mp����h��$���'�-L�V[j$���z7���Z���qZ+3�9�T�w���C��J�a�C��w��>�3P���,�7:E
��t�������������#����26}�+�8��y��V�����2"��-�0�X�`s��E�����;0�l$^��$;�������n��^�?���w��Z��.���8���E���i��O������ d���Ez�S��hdz�w*G�D�*
�P����@#��N4��-@�u�-9��!dg����	dDg��	�S[�\����qc��@"c�'>�<F+V���j��6�g��J�b���P�1����ee��C�|cE�y(6V���p�4+e�����G;���P���^��~s��C*������Y7��[���=#�H���8��F�#�.,���z����������q3M�dO�TT���8y�E�>�O��U�_�����!���/����Pt�b� ����0&�-�'�`Oz� ����tG�&�rx�t�j��f�o�k��/�s��~[��e}�7T�����������	-3�N��sN%�N�`�T1�!hMYj��]I0+��
c�1���r��O�J�i��5�V(���8��mH��tx#�����p�+H���8D�R����f�?�Mq�����i�c�}����vt�������I���=����|���t@%�Q#����H4P?`~�Q��`<M����c���F/�ek�J�/�9:]���)��B��YBM�:v�-�������1�2���	���!?��Sl<����N9>�o;������<��T2L���a����������h�g�Yq���pk<v��5;���/-#�F���K�F��F7�:�����3t4����al���^�t��*s��;�A^�����N5j�z~G���*��F76��kT=*�����b�������KT���O����;�Yc�l���6
2��Qi���2���n���T�Y����
2F������V�X�B"�mh���LN�N���=Eal���tN�	6)+s0�R��b�x�v$=B�'�����@������fm��F�Z�3D��c<
?�):�C�LF��j����c�A��6������R���%���]g�
"f�=�2��%����
� ��!�U!����8s�j���jcr��1��?t�%�Z����N�F��s&c���I0)�;�9'/������~�eq�H��������2�=����[�����Tk�$�k�%D<@���z&�Ts��t����P�k&>Bx1���������}�Fd&��vB�S�X����l�>���9�4� ��r)A���,�cf@m�il�(z��>��I�"�h��_\���<2�M�
S>����'HB��2,[��);'��� /d���m{aC@���!gF"q�Cr�S'�S�1l�+�>}�lrM����35UXe|b&� ��-��&!������F!��?��G��9O4�2FM�3i<	)6�K��G�e6���6Y(��+k��W$�pVD;]0�3Q#s1p3TO�a�DM ��z����=q d���jI�mTWs$��x[F�<�������A��"�
j�N��c�$*Y-V���%B�W������D��,85VR$P���4
�M��-*0��e@@����1mt�_%�s4	��?�QG������K�l5=������"!��w"S�������|�l���w�#��f�+��aK4�`��}�����,���F��!h�i��"�+�6�����U�b/���C[���v��W��2���&{]��KzzP����g��+fL�3���������l�m1��K.������+�L������-��.=�z���i�J�Zr��;q�`��~U�#B!��2*� �b��*��`���
���fkD�X=�,�:��'-�5�4��7, �7�0��f��uO;<���w~-�|_�W�~�a���l���Q��}!��2~ ��Z����+pI�YF1R�;o@P��LB������?�XFD}*�F�F���+0np��0�e�@�_.j������A��������`/�
���?G�3�#���Q��j#]�=�yk�t�'eL��7��a(�L';���	� ��������.�2t,[�=��4$�B��Z����~k����|@���DO��GB��JP���vW�%����YX`����dR�#�2/mI��f\G�B�9��|N����s�ux�^c����R����~zw]��]"cS'T��kGH�n�g���I��c�z��Y�ob���X��{����#_�@�e�a���<�nQt(l+�=>Wl���}���v):� �[�vr:�W�H�R
d�3������I���	����[����
AX���/-��vo���K`�N�5Be������pl���A>�m�`�"?1��KS�u�W)d(-k6@��m�@V&���?� b��/���2	���D�B��a�@A��i�dv� �
����
��S/�3�B�Ai��w��s���yl$o=6�T��v5&���I�/uC�9����V����
;*5_��~������q���y���@��`�D��`���'J9�
,��TP���)��S��v�;I�z��4w�x0<����_��f��w"��)}�
3op�[46(�T]������G��a�	�Cb�o�	2�Pl�0M���t���B[z-4�2)�K���p�R��;9Rk�kx��<-F=�5���?*����������q�oy
������������*;Q�
�R��I�vO��i2���B=���#.8R��8ELd��G�>��u`�qIP�!�O��T��!T�2]���gLV�
)H����kA������'�	6B�y�8������E�j���B`�N`4�}��u�����h������S� ����u0SP�.��hGO������ ������ �g� q��)�!�O�	�F��=��
������=�xG/ze��V���+�����E�,p����Y���<-[W��h*P��R��<2( KZ�APqP�sn���/I"
����+P��J�cB��>���T\�����ERm�������F���;^�/�n��-���C�T;"
n����7��%nC`e��h�tt��{�Rm!��N���f��w�u�:)j	~�����*%?g����l��v�fIm�N'I]�9�v���^�;���T�$�M�La�'8��m5��m��N���	�|����������~�XPK�<i�L�^���~�6L7���~�X_0���"�Qo�<���zuHVTx�Nh��g�O=�&F��1z0�vz�x,��W��:W���>��P�@\�}��8q#:�H�F��rJ�&������ ��cX`:��b��D��1>P��=�v�
-fiz�
���@��P���/��R�����U�H
������g����q��W�A�Xu�O���f�n��r`i����jC2?�ch=��%�[;�.�d�PQ�V�l���h���������-�:�g��j��8���j..�D�?S������ ��)�5��sPv�4@"�c@�YE�����(iK�����_�S�������y�����/u-�����D���DJ����&���r�gS&������vR)
t9��`F�l����S�Q���P������dd���i*��n��7��W�8,��$��M�Yq������9d� �fk�B)zg��(t����'�A��cx@��p�����m�G��
���m�j�q0?�c���c���A�v'~Dl�`��q��i��"�}D�9`gV7�E	�.�H['��j���5�l��0���0��2u��t�%���N�I�Zl�'�Y^L��y�)�����wv^9��]��n�k����u�!�x��-C[U2�Q������{����3����!�}v:�O�;Nr
����LW��z�������a�����'���20P�g��u�u����pv��0����{q��
:�~��<�Y�W���n�O0�A:^���W�����9!f�[��t�n�[�2��;���E��~���ICJb4����'9w_T]9m�n�*����P���A��f�~q�x����1�7��^�������^�m�wdZd3v��$/�/��X�s�3��lr�x��3��yW0(�Y��k������������H����9A������NV��Q� ��a���p���������E���zu%��V���RV�{���C�����Y���07r�{�1�o�c����������~������%l@�4*��*f�x�dCz�@DU[DO�^�5��I�����$t(S��YH��p��'A �w���{*���.�/��y/�Q�����Y�<P$����$���Pa��~{rE����#����D��f�f���v����^��Z�wz�#���^<�B�%(Z��A�@���>�EJ�����vhgK���1�zz�+��=�j�$��{���(}r��^� ��"�pO�;R�|XvI��M�������I3�������~�����Uz����������.����za�uoV�3Xp��w�T���e2"��K�q�p��R�_�w�y@S��{��G9�B(z/�2O��T��/�:�8��F���J���H�9Wa/��e7��,��<�w���j5�$7B[x�������Zkp�o��b��_(2����)9c������Bn�9����r����'��|�p�@�b!�����B�z2��B.�H{��UAf0�����^d���"�yL���4r~�{����!��wx��[����>����Q���V����X�2��3H+GR��������m	;�Ou;�+���Q?�7�y�a������X~��ubp���{!����yi�c��?�Al���6��x��"�'�r�N&�@�=j�'
��!��{!���1>$H{8����H&����i���)�Z�!H'�^���{=� ��;���O����L��jN��'����^(f�h����&��g
Rc�����P�V1*!"�������O(�&��-��v���I�Wd��F��!���Di�
���d
*���Q�W(���`�U>���v�A5B�C�|�Q�Mi�Wy������Icr���A�J���"��uB"��
XB8\�D��hs��D����O�;<��'+��[��_�a������/����#����S�0�H�Mh�w��K�������WI������e6k��A� �P��$��D�s�6���54������[W���g�q���
th���*���^�k��pt�@g�b@B��F�R�d���y�!�3D~�����@4]�2�~���]1Qom��}��7#�Gv!�w�����o7VFg���Ubg���}qm�����m"<]��{����*-����e���B��r���L������UY�hX�p_�v�F,�W1&1�`(6����k����&a��!hB���8�th,�:l����NeO1`!�ea_R��>�����/'��{${C_E�
���<����=t�����8�'�5]t���]$@G��\���)���6�������%�	b��=_�������}����C��w����C`d��AJC!�����$�A���[5H�3�,�s�B��,~DB���	��p���������b(�[/�0����c�L����A><�>S��-��>7��b�oH.����������p��h��h��\�l
_9P��j�\��J08(�F'�����x�A���&�/���l�[7��m/�2����J���[�����D��������08aY����p�����
	T|�.������,�X�2��]$aG�����oV�O;�u�K��$	OU��>3�PT���*�/���;(��{�}�"����-A����5��Nh�������#�����i��Ao-$�q�����F�q�Um�#�{�t�WzWH�O��u6|e�y
�,�����JP�V��BVM�t�Z��"A�W5P�Q����#�����y���(����U�L�	U���?Pb��W�t���O0�/`Ln��3�s5L!�V-����v}��a(R:��`1h�Ps���-5p����s�x��:��d�_M.s���]��9�Nb����V@���TAY��"�	"j��7}��G������N���������xw'��-��k�6����'{��W�Y��WW��B�Dt��pF���,�d���m�9�Nz��5��=5�Z��:Ko*l��W����2V�t��VMM��#��fj�a��hm�dBb��(4Q[4��HT3��j��`��0�����u�L3q�y�	�����!��e�%?@�������h������4������[���������E'J��WC�0��U#����a�+��'��@X�(�%>��z����#(fJ�Z����8�I�W�!	�.j�����^m������7�����wP�(]���������gQ#u�?.+{
 h�s��7Q�����H�NK��<����O,?6��@�	B��f��F-	�DIL�`�XPhf�]���a@�;2�#�?{O����`#i��p����h�#�r;Q���D�4�w)_��~^��0	V��8��1�Z�0"��c�������4���U�H��&9,��F�`?��P��81j&O�K��Q
�o�����=�(��x�UCgat	���6��U�
��"�BnV5!Y~g����3D��@>_�� ^��=�pc��I���h�P��5A�LDT�����f���T���Wc��N���65�X�I&������F��Y�0�ZA
;U	��+�XDa7� �A����wF�j(b���n�(������w��\a/w�X��� k ���B�-5����N�W�����Q��^�
A8Y{���d	i$��d8�d�>�C��<���y�d1�:�FZ3���Zj���,�N�Jr=*��`kv{���7��/�����$�����gK��L��� ']��h��������]���%�Y�a��p�����- C\9%pTCi"��}�����R���V�[d���H8�b-�	'���^&3���%�Y��-<���0��nv��A_G����hd�;0�h_�) [�l��4��
�pO�rf�^"�Nf
ee�7v�O�W���8��p���#6<`��2�S�����L3�,�@�`~?vT,�n��r:u�i����������G�v���e3�i�'����
S_a/�SHW�0Is�$>,�k�w�������1�}3>��![B�Q���P�����,c��(�By�K�%H(�R��&I��tr���h�A��j=X������ �h�
�����������D��s2�#�Pr�R[*LM���$P-���,n��d�}�8��b�~Z-��m��u�7`LL>��g��,w/Z��(���0�W:�^���>��P��b�G���	F hIv��Ilw�	�f��6����,
!Yz��?��g��"����^��l}8��r�W|����k4���/
��+�@���1q�;G]��a�qO~�C���WK��\�M�T�Z�
P�vFyl�}���6����,?q�RP�����K�gf��� *�������A�S��D��}m1b:4j���,"�fs.&z�;�\�����t

��O���;L	�������~�f�aA�dn����Alv��B�t��gp��#W3���XY�lQ��A�
���������gS��~���i����:���/����� +��/j�����}����w�}rx��p��'�!��SA8�����4��2	~3�"E�V:T������G9����������__���
%$���5�l#��t����%�gm�H���n��B��}�%�j�3>e76��o����,y��k�2vC{?f�7t��F%�
�v��K���j���'��uCy�w����3$Kf����>J9s����iAB��UO��r�D#�)4��H<�)�zt��I����lYP=�KN���6�����^b`wq63q����}@��=�j/v#].G����u=~M
�`�����1]�&��Y���������{�I���tS,���%�c���<	%qHN�%�a�d��M��@���2�S������z'$2�!�+������n%Q��9�!F��cH����L@��A=��VD����X��� ��_��\&9Z#�p7p!��i��,1�1E���-�I���W� 
������9�%����=�)��
�"g�I�>�G����}\GP-����fp��-Kc\��z��E��_�Lr[�������^h�de�7�$�T�'�cQ-�����-\Io��`��a�����tj���6������&���g���	9r�]���v��V$�-T|~�<�0��������eJ��B'}eP*>y1u�{@�s����������e��)u�RFP������Q&����`G[#j��s�,
c�p�E��6�������	������s�B�5���������x6�!�,�+���y�e]����o����}~-����h*T��S�)�o����!��'eB���W8����k�G�X����d7�!����d�IK�>����n5y���k�c��ce�a
�����dJm.Dq��7��Q��������}�,��,9��=r[e?���}�������h�d.����:��I��a��%�P��V�L����|�3F6����x�������a�:���>�i{���A����k���/�|?�����{<a��W;�a��Q������2l�������	������&���� ��l�����u�J��)��5��0���%�^E�4+����H�#�LU�u�
xt��
2J+)?:.��[oIN�;4Q��`D#ag4�>I��
E$U62gV����:O��]B��mD
�s2� ���M������#���7 1d���gP���F���RD�[�����d~0�Ud�IMBFT]ne��XC2�0sb��kS�oh��L���uKR�����c�#R�9F��I}��T��A��da!���75�F���%f#J����=YO�Qr��n��d��.?#lo
6 '�Rh_a$�A���Yq�[��,���aa�)�������|�0*�`�{:�F�pZH/{`����*��_�w����U#p��Sl��I"��������D#*�-}PL�0$�^����P*�0  �cP�����w����7"���SQM��B�e'^��6��|*�C-���b�>Z����ZB>,�	P�d#5�>Bf�1�������a;� N�=��V��~(p������C1�z?��d����%�&k�6bP�m�]u�<��{c8�H.5��t�	�,6n�$&��g��&����=�_B3{�F	DIw�S���)y�
�E�d�/�3*a�jr ��#*�X9�P-����Q��A�fg~�A����R�:�F������OP��)���^q�?�����e����al�K`�b����y�����&��H������k��26�%d�O��D��K�S
�^��8�>y2/��Dg��'@��a`�����II)���'��j���`�p@�+h��4J������6$�������J
�c�i�`
�Pu#���O&*����3��,z�,I&�4xp��@X�|��.�+7B�f��v���[��<I-J���#����nK�7y��jF���@>.K��$���SN�	b�v�F3�((/g�T�Y"�yT��*@E�x3���Gl0�
�b4��~53O��4�cPd�]g���Q�Y��4��#<{�D	T�P�Fm�5�<�h`J?�~e�����zj(��M�6����3�C�����fcX3����t�TT�Mc[��Q���4�P���Y��?4�|&�Z�p2�D����������d	���!F��F�����a'f#{I�.�X�1U�4!'?������P����:����$;�r90��������D����t�����v���
��V��x��~Bgr�����N��~��R���(�E��rF�������K��������i�Bgz��F���B����$%+S+�HL���p4����������w~����Y���?�Y�������[/i�R���W��$jVzE��(����&
U�F&�`ba`3X�B���~� ���������B����H<gh�'����e4����	����QkO�g&����5�T���>TE3c���Z�2�Y�\�e�?lB������/(�c�`�4(������x����q���f3�#h��m�;��%��q@��AE�e�3��x
2���SXe���)�D�P����s�_;E�h���F�����"H)=w�"������!t>;��e��P"8��NB���I����}Z�=e�V����jC
L�0
',������n��yy�`M�(���������xCrDh=q��a��-�A���$d����GE��c��6+�
2B��R:�,���'�����s�'�p�
-C��c��H�oLli��0Y�z�q�`����b��&c��"��uT�Y���5�1�&V"�u��Lj������������ ��J�:+�����
=M��!F�J:3:��$ �hE0��xi�I�����V���6���b�E,}���%[����$��������������9����S���/2�S^�RU+�I]"{]�G�X���cm�����+:�t���L<6h�8�ynYN����b��{���IF�U~+yh�+����	u%�B������r�����J����}��`q����K ��~dU;�'Lc9��Mz�I+�����������A���s����Pw���rc�������Y%{�i�o[���O��ww�;b�.7��j[����<K__������;��O��a����~��}������#��:'������${�+���q��5�K��#XSP^i�u�7�O�[����;���Z�D��<7�d%�������b� ���wErt:<B;�2n	����;����;���t��#5�.VV4�{f�����" g�/3�}i���{Z�fc�V|�����\��Jc>8���g��j-/��e"����]y&:�u�l�?���]y���-.$Y��k�UO]�\��|4�c�3�4��_)��� ���}%	���0;1^��*���� Y���F��	���21�]��AQ�� �EE;����������bEu����������d,���D/Kx}K�Nmg�����(zfw)����6j��t\�?{���bI)��2*X�t�V�9C������{��"u`���rW�s�wu�x��_P�i���E6���21W�E�^	kXr�v����,���T,��3����5��O���FtR����x�N5Sv��7,�&���( S�m$@V��`�!�3�%�Y�>t�����*�9��3�Fr_���������E\��L.9V3�:\��\K������|�2��A�����n���YE��+��w�����$��-�A���\�dU�dt���$�9�����������#�k3f����q����H��h���B��
���T=�`�_�Um|�3��-�����F��d'��!QS��4!�m�Iaf_Pr�K
�h*�� 60�I�Q�-���=�r�w`���ntZ�=���`�`����6r��
����j\��#�6p �0�E�H��{'�&�m#��JI���	v,�Xug�@�i���*��pV�'rM�����������zi+�i�wKxGL$�
(L�TC�A�joc�!%�4���}~�������&�#���!�u���N3�m�` K�m�@�a��hA�_�B��e(6L)i>�%C
4W��
j������-tC��mA}rq���h���W#
6����j��E��+6Yhl'4�����F����Ht���P-�Q/pz���h��-�A���E$�� 	�6!memC2��tB6�,qz�] {������fX���Z?���:��2B4������� +�m�A�\���bh���B��G��i���%[t����Q�l�������9����!���G�C�=4�`^�K��4*�/>�!���<��D�ib;)�K6�'����1��n9^X�����X1��L��,\�H�pR�
�S!�>��*,��%P7)��������I �����8FT49N���e��[����Nt��w
p;��&u�,F�/�C	�i��1|�$�@qS��w����v�x��
��Q��u"@@�1v0���'����l�9�	D������9��C��PW�/8
��=� �nz�LGN�[��zVP��`�n}�U���3"�sT�+�d�,�@P�1(��WsT�J���.:P���O�(����=v�tj��>��:5���:|NL�{�T��'���]�rei��`��u�d�*�M6+� K����uj�~Z*���4�
�m*��{Z\ �
;vM��tL����O��!��)�m�/n���$T$�!5�q<F�b��vE���$�2�:���,��=Q�*�X��=	5��3�8�����a��Zz��O�I������h�Q��we�N�zy'@���{,�����B�������f�
�9����X�l;��	�#��eQ�O��o?�y;��[�%��F!�#���|p�RMXm�b�w��:l	�����p�J�f�����k�
��!`�d�o��Q�N��� dI��1�d�k�rj�Na��1� S}�x-�7}�9XDu��M(�/�� !�I���O��N|�l���n�	�����mh8|�Q�X�N��%\	
);����,��Kw�����t"x~�N�F$A.�����H�h?'�z�q;h"�7*��d�#�|~D
��p�!�n9�����;+�/���&
�s�84�NJa�v-$H8+�/��>;>�h�F��b��P3���F0l�������������V�V�/��Mz]h���-"���@�3M��k��JCQ9��.���_q�`�����:�Itb2�n"�M��h�9����6Z�2��TB{�_3���'�io]2~D�H�Ep���*�eQ���O�<�.�[(����S�����5�~����E8 7����p���#�
t�,{?2A����W��������`��B��x������A�o�uJ��w�������k�A�{	k��tvd�{�{���[_�v�~���#��!�pq�����[���{�����.Q�����5|���Z=8<Y�w��mDh����p���p��@���p4��#q���&){�kd�e�&���6���~zH!���#�{4�j�M��_�m����w��V�,��wLD>i���o�+��T��O������#h��b��r�8Z��,����xw�&}	�S��u�FB
��@����-"0�����'��Xs��������]��?����eD�Yo�B
O�g��C�h���e���%�������4������~#k}D�[$6A
d�#����� ��|/������z���p��E������M��6�r�������{!�U������������P�����=�$����T<����F���{:�,"�|/g�{+wS���p���c�S�����ge�����s�������: ��7����P<}��L���������#_
����/ ���B^B������l�YGO��������P�A����k���-ZI��ws&c
��V��X�obU����2o�:%��{
��Y���P��47����������v�T7AyC�5�a��L�~�/�#n�~V��O9�/����2��h19TH������(����(�������^#�u��af������2���I�'i4���P(xQ��)YH��������0���+E��yG����b����uFE�Q���I��yGF�-nWW�By��a�h��u��k`wa��|�&u���v�{��kJUV���Q����T8�����Z;j�p��Q�-�c�Oc�	�Z:��>f'�:���v��+q����?�w��.����R���eQp��v�vw�G��"�6�u�%�����K�J���2(1h��5��n��RU��gU�U�[� ��]X�'+�H����!��.O�=�
����6�����&a��T�����g����^��(jd������F�Qd�.O�c(�|.��H��K	����;���}���P��.F0����b,C�c�������
u?O�=��G%a1����=h�����lD#U�����oR�}�@
3���H��v!���dz�v�`+����H�.E����������������N���X�'�w��:��wK/���]��\��B�����wI���BT�C�}����IYx*�����I��v��C>U&�h� ��]>�c�n_d����o������A&��#t�]I�[%���Bv&1����z������3�bD�=����m��Ed����^[�M�b`DeKK�62PU^�|(��[@�w�/�Vp9%	���1��c�$�#-(b�m�%��>���9$��(��wx�������6B���n�G�^�
H���	���DM���<t:��u������XF���J�4v�E��w�8�"~��svn���X�P}�7��ceF��>�W�:)�o/�d������S��y��l��&����F����t�D��� �"�X�T� �M�i��r�pl�.����9��8b����zrZ�Fep7�Ay������B��z����e�e�A�-o4����7���U���3[j���pJt�"D7�M4M�#d/�^��T����]�_T�w���nX{k���C����u�gKp�������A�N�'�����F�9E��bA�fE%?:�Gz�]OI�o4�!�v��B%��D�E1f��C�	M�K��z���I�tgk�����F��w���f(~G�8���	�p��m�?��*�F����TXT��|�kh��u�{!y��p�q(qy��]��-Y�r�d��������3qM<�wq���p������W�3&��[�E*��v�xlY�+����������ZQ!>�Q��8��9��QI@�;H��p����1XD;3&#<U0�����uW%"T�]�N�����Pl����������a���-Fv��-H^0A����t�-�	�����6��*���	g�q��yl�C�mD��)Pi���#�ct
;d�KQ�JU��0y�Okq���u�L��$���,�#.Fud5�i�)W�K�nz���*�a���,1�����H\������q�����9���
u �b��
����:����Z�ph�
�z�s��S��	��+[Eo^`����O�]�Q#�u�H,�8c���I1���	�
���GG�M���a�'��VX�i��Z����1�3��B��q���:J�{�x%<	�a��Q���"��
t ��2�F�d����fW� ��dw,
r�m�v�!��;{g��(w�x��! q���L�)ZM���)J�nh�1p+�YAc#��m�Z��;L�n���]�iQ�O� 1����6������;pR��Y����xWSd���t�r#�������Y��]�����;�^A
�l���.�@�*�7Li�gV�m$]=�&&I�)�Z-q/h�Q����=������i\�O����tB3>{t>R�VZ��	gX�x���[b�����[5
�D�l�����V�l��b�W�I��0Wbk��$�)#�
zp6*-}�s�w(��.��6	�P���kY� (��N-�PEy�����o��"Z��_�jb�(�e�O7��5���]~�������k��f&���
�h����?`�'����6w�\�\�
� C�e���������i���Imw5<Q��c�tdV�~��#���PtG����������I���$$ �d5��l��:���$H "�	^G���p���lI������<��>+���5e�WA'�5c�ZF��	��C��Y�3���`�A�����>���D�E�K{�;�~"
��@��~]���c��h��)�AJb����)�>��Q<�����S��j��!xMXaC�c={���b3~-�d�ms'f��t6�l�[Ar�E~�]Db�&�
�U�wE������f �.
x�c$�i]����#����~���G�l��D�FZ���jk��m���f}>��Um�5�Z�&Z��5*� 	��"u��vgaG��V���m#�����H�w���nF���l��Q�7z2B��4�}��2�!,H��4���&U3�7���7i�/5#�z�p;�k�����e���o�����{�}nNW�"M��)���.�0���\��a�D5}3�p�r��j���M@BO�\v������}LZ7��i��("01;64A
��+��P�l���6_l'�4�bJ}8���Bn�O;3E�J����G�V=�����2�������L�(1�������$��;�5�����D@�3�:���z�m�-v�����N6]���}��������`��������D;��;���2`�
�!z��0c��O�^�5O�����v�y7A���MtD"h���f����1���g#�4
g�Mxv�$C�\|�W�l�^�O)��a��p2�?�&r�Q�������x�g�a�W4���5d�n�����V��`��f�a����������F��(������}����)��6a	������w���xMF���m�����3��m�9>��D{��'��}����dC���m������mEF���js~aY���p}�w*aa�nM��m��S�Yj��+�b��k��H��0	N�����#2x���6�������"������!�w���1�dw!���W�����/(;��n��rLy]X	�9����I�],���a������>��T������&A������n�R�vv�5��{q	W�\�3f�wGN �v���L�P^��M2lD6�!���$p�9~����f�g��[w�6Q�������]a�c�B���Z|��_{�rit	���A����j�9m�6{Xsv��O�7�����.�aF�K��3�
�64���AX(���g�'�!z��}� S.R#
L�@�)�9���0t-Q������h����h��������|x�sgj�a}�����>�n}�b�{�D�RYuo��O������d�����&~��q?���BT�u;)����O%p�`��md}�����s?)l�1�!dS�2S�.���!�g�^�
b/	�L��`
f�G!���$�!8�2�wdZ��?��D���WJ��/8��,Q��w����c`1$Hb��_�E��>K������>����	g3�u����hsLIoFv}��3z��$���za}��Y/��zpU�eH��������	P��E#5VV�X�����7�f���3^zRYi�����a-��y��IPl��m0�`�_��;�7���� �	8ZV��'<��z1�b�gD$���=�]�����"������_ QHl���~7>A�f���������=���[4<i�\����]��C��P�F��n(�|�<�����	��fgfOw��}����;M�M>H,c�w�����y�!Y���[ �D�y�e�\f�������2���LF5�� Y����8�3wa�*)��d����Cj���8�-�Y���n�����P+9������ly��7�Ak!H��^X3�e���� �F`P�&4�������)��5L�E��p�G������
N��VKa[�����O`��������I���q��8W�fsY�*TT�k��m���x�������fP����xlp^Bz�;���<�!��e������l<��MV�!�#��6�m��2gM�a'Z�������c��q��9�����
9��;�J	k��I���{����xr�|F�;�~dd�!��j����h9�I�Kd#?�^4H��~.*��2��a�E�3�y�������q,7�'!��S�B��Q�p�w�3HSo5�P�:��Am(�%����y��j�N��?���d��X��L9���S&�A�O��Sd2c/{`:�R�q���Zv
7f�1���>X4�?=� 
�.�������J-q|8_�~�,�����s�@���Kl$�n�h�w��lq �F�(C(	��)�����\��a"���B;:�
[@��o�6~����&O�#���Auc��#_������R��&��=���Q����V;����-��N���L�D� �� ��J+���/Q����0�h�xR�+�����%[m��~�C��}���C�����[��
��(��B��k�82j��P���
����@D�B4���2��p��mz��$a��0���GdD�/����B&�;uN������\W�}�.O��4	P,�VQ�4�����8��Yc���`l�^H1�uZ�}�Sz6��:���9l�L�e��'���'x~�%Re��gD�No�?���+Z0d�:�����7�:�"���=K�"#��E�%�`�[�<x:g]y�-���h��v��
z�}�X69��!H(��0����%�B���7����G3J�52�����_44v@�������p����D��m�:iAL�����&8�{�4�rLNB8�7�����!�_f�<�YW�&�
Qo;td�n���vH
$����9zPT�8�YT�-+��m���������QQw>	d��������|��@i���6��u��� �V]����<�c�Y�!��m�$OatC�"��1���6��:����3u��-$T���i/���=��,���(�B),�K�����r�F����l2�I"%�8�\��(n�K�qmF{��%H�����������r
��Z2�-<�U6|�J���:I(�����s���6����w�������5^���>v"���p�s��q�8��OGe/4P`���e
��q{AX��z[�?��]jgD����U6���[��k
�O�3���2����4�>L�B!�4�g�l��������kg���`V��:��!L�'��A�9�`��$�+��N'O�;R�DC�C�9����l���W��<�C�6�K��\��k���n�E4�����]�&�������|����%��9.�u����=�n{��`�0#���n�j|"w�����"�A_�Hj�QV�:sbC���VN��F��?E��i���z8���"��	y�aEs#"�OC���]{����
�8F9�=���"�fg��j���YBOCB)������?���X��Y%=,��\*��g���
����{vL��mQ;n
�XQ����<�=��}����r�����[�l#��M��7���A�-=�v��d���v���*�xW���g��)X�f��#'��*�D�?S0*y
�,Md
FXO�D�f���5��H��0�������)������C2dt
�(�k[-����w^��j��<�!������9�+��n_��F�CH��� C�1m�C�N�����q�l����V-{7����h;�<����TB'�Gj��z>sJ�������aLu��m��c��������}������#��<�gi~���(��\	,!#����
�^��{"��<���b�F^��dJ�@r�F�5��j�N��F����z�$����H��lE�*M���[O,
[�Ps��Z�K��l$*��@�M����SR�`=*��=*��0��]T�d�,t-2e��p+@x&�Hd{���9*- ����fZ8,a��h�C��)�=Vqw���|��	� R��}bINtt^B$v�����r��n�|[N����e��N\�8���*������2(+�g6��>�5��7$���ek�
���{����6��5�����,�X�D�$����b	w�lG�����oK�Q���2id��%��|`�$U��������QDwF�A�yeO��o��]P�"5�����>7�h���-�h�R����@db�%,������v\O��W;�S&2r!^/"F��g��W����{�-8�~l����}MN�x>&\������ ���,��m����	�"D>��W��MBJV
� �E����#�/t>m��F>Q2R��}n�	�R�#��r(e����'e�"����������Q�r
 ���x�g�0�qf���	Nv�:4��'�.��'M��MAf���;��f���)����I���������gt�&���N�n�FQYi,L�lf��f�{��4��_?���0��';��Ov��UqF��e���'��/!$�a�3�
�����x��!W��>/L9AF���T
�p��v�e��}m�]i#Em���n��
Na]�����`���uf���`�,W��6����1�x��Zi������$ ���� �%�MFA�p�]���&���l*.�����T�����b��qK����d���5�����9DX�r����	��Al�a{G���kY�,z���P�(V��_F)%���u��ewi����6��W *���@p���Z��PGd##�-A����g���������G��#�L��
��IQ�"���z�Kl�V�u���#�l��$S�����[����r2%�g��<Y��B�]C$b:t��w��N;%j\l4���w���m�t�����HT�����{-�����-��F	�
�b����Mp8�����"�-H�E���\������kgb��-���
�n����^��X}�R�~��r@���%1����:�:O�pT�h��O��d�����d3�2	��c�b�hQ�
�;Zh�E�~vpz���5���'D�\S��-hC������r��0�����@L�l�v�5B���I@T[=�Q�(�<�1���]�e���N~����|�=p�Rk�������=h�P���a�yoA�L�t��}7�}B8p�����pZ&
��-x?���q;#|u�wN�m����\]�?�0��p�������7��H�<��vB����q�mXhG����q3��m4���]��{�2!Z�f Tk�G��c���Q0��2������E�o�t�@��[�.!j�����M�Q� �m4wI#���4Vd�(�s��w�9�o�U���-4�����5;�	� �6����R���}F���r���V(���m=�W��zR��m��@�Q�Z��N�J���D�[xF�y�`T>�{�zwV��+2k��29}2�Z�\�)��9���~��W����w��T�V��G���k�j�[�o��5%!�e���>�{�����n��22z�^.���b�C#2�����E���������J�g�t�������
��mk|[��:�[�F����>!�Ud�+0�d�8�1���Y�n>k)Ug;}{��F��Uql�?��^�x�n�\�D���{�}4��j�I�&{nj�6�agBfwv�wd�����n�����/r,k�����f{�`����+�3�j����F;�+D��&���Bv}�cESI�F�*�>�:+�mt�`�� :����X������#H�!<����V��!L���A	ud�������D�l?�F�><�0Q��h�P[K[4R���-/���1��)q�8�Ir��\<�_�d�����+Z��X9B0�jm��������H?�>�Sl2���hs�`��A�������!��|�j���(�L���.!���{l�)�#r�h@�k�Ft�?PZS�f� ���n�?FD���]@"$�8��������w3�$$�@�H��~�]�#���j[��o�������~��h���������X��z��!tf|��m�9����_��T`�Y-~�}����l�-�e2_:D�g�N>�h�~�R���j1����m(��Z|� ��GUD����t�i�f8B00����G0�V������Vv�j�#�H0�B
4��K��F#�������.UK�_vY��D��Zq"=���"=����u'�|�������F��G(p*���gu�$�2	��]�d���6z��y!��B#�v
�?
Z��T�;��*Z��e=��:���G�DU�W�WvE�������B!���(W�v�n>�3M/9�J�5U���?�������@��(����}$Z����h��?���N�F>�����.[�]4����������F����p�ZE�%	$��lG�,L�������w�xX�;�%>L���hT��w��=�G��D"�#H��m`���,n"���#��9,bb���*x%���P�&�v�q�(��r	�R[�#��s-���f�����G�CM��"���:�m�����/�C����# �&r���G���JY������q��2��s�X���*�y_��K����O�}E�4�n�h��6b
�����3t�XC�r�l	���73�p�5�A�r�	T\ U�7FB�|�����x���S���y�����n�Ws?�(�����8l��N�
x�c!�P� �����'4T��02m��l�(�=��h2H���(R������A���3�;H'M�U�6��k�����q*���K�t��>j&����p*���I��{;7UF6�O�;{��-1U8�#"�qOj�w���g���aT9��{6@�4Q���Z��{/���@�a�;\��l�	 ����k��5�=�`����EP�����\'��;H����`22������%_� g�5��P�]�-)[7�����OJ�w���#8�@dL������������)���0RC���mn�}����'��V��|�����w��~Gz�}*����7���n�p7��cA��-sH��� �	8�''�w�Z�DB�i>�k$z/��M�|��e�����^H��	�G�.=%������KX����#U�%`�y�_R_]���&9���:��sW!L������^��.��Z'k�����h�t�N�T�L��a��������R�$�<,|���]���vL��XT}C�� '6@�q����S���.M����Kv��l ��PV2��g`�l��P�����-��p!�@s9>2�l�������Fw���#'L@�{����G���B���V��h����+)�	�{�e��vlP$�|�;����t�o.��U��g{�B�����A5�,�a2�{����|�zN��~7tx ������h���"(��j�O4�������w���S���)#��;�9t�WV���0���W����I:!m�4��223/d���s�x���{G������,e3�hFv�tq�|)y��j��Z'l��(�K��~/�}��IH���pB��{��%��K�����e
� ~oe�+6�;�T9�N��o�Z���i������L^��O�c��m;6����;�jEH6�`��^I��Y��Y	��d�p0�8;�;��}�cn���rN�G��oF��be�����)�6����B���f�D�����T�#�x����)�b��r��*YP�p,A1�a�=���c*�q����Bn���O1��[�f����-���B�uY���� �S�Z��uN��S=a�)6{
����e?4�,�;j��b���E��S,��XK���X�<�[-�����xY��T���?L�YTTg`G�]�A�X
x�\�����m���wY�o(��\��d��i*j�g���l��?�[�V�G��Z����I-L�8�)����6mZ���}qf���h%�ignE
;�Em�b@(�4��pn����
��}���NK�u�A`���0�*F�������Hr�lm���D���M����h/����R��?N=�/���������
1���~��u�Kw���"1#A��WI"w�;���4{�����^�F���2�d��Yb�|�5>F�\qD�X
d�mFq'����y(E��S��x��|������������E@f9Sdh,��c����#����������:��<"��)�A������(������b$#��&����zQx�	h��?TB?e����1j��FDq�r����<�F��2�! {��������q-)��.�2����@����	N��P��z��Z�q_��A��!7�X��L���$v�E��v�r��o��jI F�c�	N�/������H[J�*�_��u �V��*8�fe�0EEc��0Nr�#:J��"���Wd��mf=T��bE�cwv�����<��}p��V��;Z4W����;;���Iy>��Y�����Y"���@aV�6�M�X��J�A�"<UnU'"mO'
�h����R4��Ap�X�E]���S��t[!0Y
 0����;�uM�c;\���C3�(���;�}��[����|����|Nu4��E�V����q�
� �3_f�'�^�9I@neQf�;�\x���_�Z>�����k���/:���z�d���/0��'����7�����0�1���'0�a�^�5E��!	��QAPm���y�
�X.���*T�=j�����}�
��[�!�*�83�S:�S���GHh�T�MT�h����_��l�6+Y��(���0�]�B�#p�
���]���|�e�����w�8�������D	r�w�v~��f�-#��
�(�o(�[T�U�U	��h��{
�$�����Jm,z�c�HB$u���U�STC�f��G�����M�s��^p�!���V4D��� 1Dh��TW
4���O���������-���,#�P�>~�!$�T����
v�����+��$5������P?
��b��9_6(*�b3t�C{2������E�\B����$���l���.���(�d��sa�`��J7�]���+[�����
�h�	LXY9&�`��3g�Ax���oy�oc�W;4E
�*��.��G�h��/�D�d�B
F?�k ����������5�F[�?R�[�OS��'`{�����������+���%��:"�o�OhC~���G��nd���)ze�>��|dxw�����V����������=Q����)+��� z�C�j��R�������)�:���|x�cx��z��U�
L����0q���>2|=�FN�%�(F5��r�%p���}.�������l�������xJ�0��T�H��E���w'S��^h�a���#!��E����H�d�T�X��[��_���J�� ���a���B��!/8sA�����B��������������N�@��C�����s�+���QTp�����HM��X���~��E�|��c��<�k�M��4[<�-�x�Z7��&"���>�'����]C����^ED�����	M@Q�z�=0�k��)$�&�*��� ���(������N�T�6k=4
�p�&~��j����3=��b��C A4r�j|�*��l
q-/`a�S?�[�FS�3�(6�,r@tx����2�N���,��Cs��� ������YG��JP,�����-��������j�U���3��i�T�M(��������>WVZ7<�y�����Qq��FpG��2,�����;M
��h�#�9id�����8����"�	���<�������m�$(f3�Y���^��V#xbf��@	>y�<�OD^(��n
�\"\�	�@��1���@���
��UOc�H�s�����'��4(Q��0?�4{:qx���Q�	y�fO���	���o�8���	�����1P�� nI.�@*>�5�V��s�"��!�u���Lu�@Zl��7���B��5����z3g�(����6���WV&g��vt�}=����"�{�0��K�X���:`�3���a���D*d,�h\E3�z�D���}�_�5W�
��A�9��k1��#��;r���0n����v�8S��X/�F,u�ge%���G4\������/7zXTV�O��C��9���x=+*8�Q����Z=p<@���;�2�dM!XaGH����^���K�����.� 
���.��t��i�$���f�C�moF!(�����A�Yt!�bg{�}��M ��6V�
aJ����wx����d�6����@��#�d~�l�vbKxf(�df2R��v��
��u6H<���4�H�[j���N���;l���`f��+B!�u����ef}�O�p;K���2���Z�N�=
�(�t�H�<�<�������^��:]x�,����DG�Y���#�����i�#�jv�0�"9`��R�r�l�2�?�j���6\6��0�k���A=�fw��R�[?3%����%�~��H�iDG{I�P�^k����^�4kZDv�N��=r��r�9D���k��w�����l�u���^,�!�<5����L���z�7�2
�[�&�-t
�����5pt��~r���0(�8�����o��{E����h�?q=
�VR�����j��@�[.��Q8�)z�����r���B��}d�����_[�0 l��O�~vQN�{!��(qX�"K����F����n�����uw�����J�]���}���d:m�p�l��ouF]O��~����	m'�2��w���T�����q_i�G%�6���w���Uqb���������m��0�>>)��3rw�6�y���h�t[�@��-��S�c���d�l����	�5:�t��g���m�E��.`c�j�����}�R���jF�0�v�������l��L�or@X��-��LL����`��F�6���\�M3cgv�/����pF��UP�E_�������Y������[���K�1��C�
m�T�S���>�Ow�D��
��=B1Jv�s�D����-h��H����JjJ���O��[:EDK��.��kb}���,�/3;o=5�Es+j�e�q6���fSM��#���g��:}���.Dcj�������n5�^e�u���2tab��!��~G[��I3E�LhE���f��I��.T���J����"dz�.�b���
?R�Yr�	;U����At�=F��.�w��L�A��O{m�;�Z���c��\��L��p����m�N����n���B��#���)E��`����Xe��l��nx{�����W����dT�-��3��2{�h�Y�����2���J�p������n�\�WG4��@
�3j���1l���9�:�f��w7�����i���ZeE0�Aw��3�>�!\��c|�"�s��I�
��!�a� �h��Df���>���.� QKn�8t�1�aVGH�(����ua�d�y����d��V�YN����G����A�DcE0�L��ix�h�G�P�?��������T��z�
!��t�����T�5AU������ZX�a�O��m<���F^4���A�k��Q
�
��r��>�R�"��a'��x����L�&��"�]r��@�C���i*���S
GfC��
9��pZ����&�����l	�PFPt�B52��!,���/,�w�hk���O`2�yx%�����������]��������{t	m��7�����c",�CDO-��`���=4#�&O�E�� !�
�J���v��c�����c�m��'�EZ��N�[d!7��,M	|�����o��|��-��g����Q_bXqA��[�C�v�=��'mC0��?B�3V�z���:j�?��0�c�UU�c5����S���=+O�%�yM����8E{#��Z�1��kM���:xG��a��}��Cq!�C@FS�@y�l�/T����[�d'�i�X�e�f�;;LW���f���EJ6�T��ZQ�q8Z�e
&���c��r�6�W��>��g��z�����;"�G���(H��Gi*r���e�X);Y���J#Wl
���Y0��$5������AA-����-�|-����*�RN��b�q��el��f|��#�S�1�X�qKK+���n6|���aa��1����h�H�_�������`��F�%��	���0���e���%
uv
���_h��d��8����Pu<OJ�6������������E���%[�],'�E��|��/:0��23����U|��Fj[;ad����E��O���"@!�ud�b4X���v�)��`x��QWz~���x$N`K�E��;����|��jE-�)��^v������~���
�Ei�&+�,��`4��B��8-�6F���G��=S�����z�x&S��)��p����Y�aQ�M�3q3��,V�V�h�*��u4
]P.DoQ�����4l�T��9#���A
�)>��NGb��8�^�0��|�'�
S�{TN�����5�_���5X��P4����=�<o�4or
����=i��i������;jN�7m��A�Y�3�c�lnw�9i�m�������k�=c-M�a�yp�x��nr`��]�R�~��QL�f����	Z@4����*���>Um�\���}R��g?�G�����Q;?��h�x��3��Q��B/QCX/[q�B��5:O!
�>D������~�-����
��)?i�j
h(�J�;���'Q�c|�N��|F&��NY�9~:�����?��w�b�uS�����|i�<�����pg��P�9�D��E����dF��&NQcoN�eI8<��^���i�$h
=@�U������]�;�RA���F��)��
h���#���&(��h�8��|�����p��r?>Q����s�8 ��.���8J_L!k�D8 �t]��RH��+��������q,��df��3�6B������A�r��j�D�����������'����s��������������}s�o8$�CV�m�D������c���z�Na�KF,��k�����9��1Qp`a�=P����a:;�|�M��w���N�Ct�s`��p-V�IX���D(��"lN4[��`����^�`����3�b	,����c4H����A�'�`\
�#�d��i=_�#�~+����8�c��,v��E�*����h���������
�#���;r�������/ZZj�o�*Y�o�IX�d4Km:�&F��e������,�������
�K����cq�?�{�m��������O�h
 $=|r3�p1`/%{�2p���Y��2)n�+"��r>D��m�����E�<
sU{�C:�d�p���a�j?9.��������Hs7�`��^[�����<����I��>�^$|S+\�6�Nv�?q��4�;���Pn��<��/�
w�ecP=��c5�D#�$,�Yp�>U+[����n��������Q\�7elx���#���������\.�A��^�ozu�Y�O�qRV�o��_R]������b�?,�)j�-�X2��R��lh����J-�����g��K}��'1�����K����mK��Z8���<����1���g��4�;�R���a/6��@YX�R���I�2n����2N���4Xr9s��g���z���[�Of��P�5�5}�TC���oF3\�	�w�lF,cR���^#Tf�=���8�J���F��JK�l�Q�<���Sv\!4����mt����_��3�3��26m_D�
:����tPq�Q��r��e�3�)"�dU��4�����d�8)�-�=`���&jK�=���������k��wmo��y�h����61-��N��&����q�v��m3y��b����-)�	K@����INXf$�^������?�
(��������b��X��/Hi�hg?��#x|Jw ��
*���}$2��%�A!�P�h�k�P�S�jx`����nY=nGR�	�g
V7�� *���"��H��t����>P|�T[�S�e>r�� �'gB�J*&���@�
����,:���HT�A�����o�$�icp}��pk�Al��C�n��"!#�n�����D�z'�����P@a����Lp�&��n��X���XV�gH��0���v"5����-t<��A
]��i��@VOE�
V?����n��n��&UI3������*��j�Kj@5����cDt�-�!�����q����h��N�Yn��,��H����zr[H��JQ�Y�B!�����KG��m@���{���~�A�T�Y��nF\�o_p��h2�A�������i���N6/�AM�����}�i67��U�[h�A�6`M�w��vgD�^�$�c�p��kr�C�%�����������u�D�.������&����������I�/;��n���(�^q�l��F�
���m�B���aA��-[�Nj���2d���[��m������6	�io�;�t�"�L������oE�m�K-��O�2��'�q����k���������;�c�	Fi��W��n������+Z��1���4����&h8!��t�>�L1��K���@�]�e4�3�o[��}h����b���6�j-.�D�h��;k������2�]��Ob������D�t�������=4M/��Rk�cn�����c:^�����p��NC����g��-zY����#�7���MX��<�#��(�+�|�fV�
��2��4���Nr��������o�@��5���*0Z�������-p"�n�����YR�S�!�:6B���v���d�maj�%�����@�G�K��{gs�1�C��%[��/�V�W��P^>���(��n� ���4���{��p?
$��"��g6�1�75">�y"l&y\
�d]:�
������t�['��	
��W�i�S��jf�{�i���� j���XX	��Fi�G���lY�|-�=(K:�������z�m���U�D��T�����d�aGx�zL�p�Ze�����
���o���?B������xQ����%�?%�?���hE�|A���Mi#�\�Q��T�h����VVd�j�����t�)�H�I�����](Q��8�a���#AqS�E���zGH�x�ij��4j����"�F�N�i�&8�d�5;��q<�������A?���}��������a����;��8�U�>���x���!�
�W���!Qsp�?G���Jn~8�������x�O1S"��1AJx�_p���Y.Ht�$�$�}�E�R���r7������GhC�G�?�v)L���@���m��x���O^��1B�q���k�83Z9�fm��E�����R��TQ�e�S[.^v��T�Z6�P���/z�N���.3
�8B����@�BQ����8v��+�r������WY@�T@�����BB!���I���7l����w�~����Vg�$z������C�*1������X
�M�D�O�+j��O
qG����~Y&�86L
��:��t��;�10����*'X,���Q#�8A� L
(��9($b
���vG�5e[$S�$�g����1�O�;v�-�;�aY����y?)ROj={�D�d�@G��h\
����<��0	Hh��������#R�
�I������#��:�"��5�����^���;v�9��_��
��w��W.����7��qz~���Rv�{�����G`������5����;g5���Z��e�@��`7��c���V�>>�����u�!2fp���o#������YO���B:����/�����I���s�������#:���������QE�0<v�KHJ��#��:@u�>��D�%�
1�O�f�^C8D	��;H'�����ir�v�%n"0�{!����do%���'_�8�������~R3vw�#�B�����yY2��t�!_5���f�E��~����h�!EWfG���N�+g�eI;�:�2��Fkw-��a�^���T��-t��:PdSY�E�����Kp6�V�l����!��6}���k�C���/�o2}^�
��B�_L��f�B�/<E�[���*�j�"q	i�f��e�\u�������j?P��Q���pi
��$�B�wi�L��Ij:�������$K?�I����
$�U�����7v�0���~������mO&��������p��}����
z�Vt�!���ut��v��	�{����!�0���JN@������	�Ow��mC�.�HM��C�A?&\?,� �����h�0[91�������]�=Q�|����;�X"��{��B��d|D������$2�D�����xU��-���0�])A����d�^GM���_���uFX.M{v�2�Ab$�����[���7H������>��~�*���	Dq�#\Cz��e`��V;@$8�]�{��;�r�W<m�j{�!�&����)$���{��k.���~G�#sl�4���_(D6H[s6�e�� JB���{
+���"��Tq�a�^�x.���=�su��t/Kf�N��GO�$P��g�C��_��V�.��X���j���!�����G�J��
��
\��@�4L� �e�;�(��h�wn��O��*�!����������� b�B��{!-}�|�������<��!���w�`������i����rG���+�A���P���>@R������+����o���\�p�2J�����0*�0w%�U����������e��1��)�;�h7���#s1��|�n��^|���-�g��-vx�EHG+��2��j�b�):��kOT��:���v9����������mP���������.K��K0��������'a��x�K��w�������"�r��piq�������8C�.��R�v�K	��^���e�~�� �;H����5�8G�:Xoq�U����zZm�&B�;\k6<�/����46{B��_��+�$`��k�A���,�c�p�&������%\��e�@nyjf6~/$bT�q)�^��v(�$J�O]�l
I^��b��-������/�a=��U�,
��DXN�|G[Y�=v��Rf&����w������ZDA��
I��h!0S �s,�/hf���������u!�@�������.��������2�*��&��Te�J_��n��������%ln��T�:���#$�>=n"���5�:'���H4e=B��{N�m>��wF��+����������67{�rbE��2��dV"&B�P��|��H��S���;��a��m�Q1�$S0��F$��{
<�>Fb�� �������U����[7�;�s
!as�-Q��k��c�� n	>\���!$F�4S/$���M[��w�A�����]H�����h a��30���^��q.L���<�����U~�x��n�������"lAZn�s��^���q��:��S�;r������ �g�3�6us]��@
��:Q��s�XdF[=��?p~���]b���d������H�\���^����� }��D5r7`�%L�K��c�$;e��l+8��l6r&2Jy��X8�A�N��!�/-�
�|�Y��&Do������x��?��z�b����W�e���n_��Mx
Q���	-_���Bjt�_�tu�q�kUA�!�1�+���/"y��Z�EEu����>v7��u���^��WOQU�����/`��:��-�U0��(i��D-�RUR�&#��-�^��1.�u�s����^�� ��#���5[���R�2�A�e�}r�7ML�UG�j�]r�����n�2d���(��c-��4�;���mR�
P�mD��zR.|�oW�����b�M��
nH��� /��i�;jwW�
�m�I}
��+�F�G��Xf�F_����p�0�j�@����!�Nh��p&<��u���6�^S�Sz���mt���/��T�#P���@�1��_679���W�#Md��&���Bc5�*���.�tOU�Db��[�I�@`z;i�����A8M��aN�������m76,Y���*bDL�j?��}V�hO�,��p�Bn/h��+VE� 9�^H-�:Smk��
�w�	�����E�FwP�5a�m����N�U0D�DquX�%�b4R�y6Yl�T�oe#�x���g���4,��&Vaw������HK(j���/�2��
W�w���P{���_����?+<1O�YP��fS�l����Q��B T����8L<3�vl"�TV����VH���?�U	7���s�vP4��TR1�8U�cv�q\����z������x��2��{	;�\DFr�4�(H?�Nn�%[��
([�>���`F��}�B fdIR��&��
w�,�9�wC�ja�pf�s4D�����@4F��K�&f��,�{}2�;|���iT���` u����� )�n�W��>�p;d*�*���I.{�f����.Rq�ah�F�A�rZ78���3��vmb^qB?YT�����������z��&%������������{��kRb�w���;�
��(�z�.z4;�R<QH�X��i���*��wBx
�Q��e��f]���Y�@��R�V���Y��6�HdV}���f\{�F�Yb�;�<?��Ywp�����] �����m��������9�P*������rv(�o��y!w�Lv�&�1s�j���
��	�'(�2�������M�&,b";�<�[$�i�!8)��$a|�p!�t��IV�WiQ}�����`tZl�r�����S��Y���d�L��IQs���4�p��]�}h���4���f����m��d��f$�m�I���q���f������,��^B�_c�E��Q�5���gY��Z�,[���9���@:����l�D*�]<wyRzq��!��5�������vPHz��OMh��a@�v�Hivg���.�K��&��?;�h�:(Y�'�!jr5�|����	k��3��������8�o�m8{��;���r�Hu����r�Z�M��nu�nod���	�Qy��#8���(�Fjq�9���U�B�,p$�� �2�,��&�O���J-]�������],�+�����Q�E4g-~(��������&\"�v��,����^���d�v���f�m���sg�'m�N��U*["QU���v5��y�5�)��([��Ddn^M �\�Q�|�w����"C��n����9U�*O9q/$�+�������K��[�C�8�������:�M0�f(B:w��������2'+;��>z��/��� ����W�BO:)�>�k������}3��b�:>�w)�T�M06�wI��+�~�l��
tk�L����Y��U����U��P��n����i��Ot_#�����?���d�� �;��!t��@�g�$1��T���$���#�j[nQ��-&���N�H���H�����Y���������
��@G��2&W����N�?�`mFee�2��O�b7� =g�JvGS�G�O������S ��F��n�Gv��'���!�G]��X�J���\]�k�p{������!��l|N��"vi��?im
P7G��sN���]�/���g	#^��etdP:+�,�4�@�Y��:�r�A�{w��}�9p��dp�����O
J S#3����#5���8�o��h�`�gsF�"����D�^m7,��m9�sE.6]PQb}�[tw�Mkt��s{.��m�c~�k�����9!Pp���EM�.P��"�[����j��P�.P�)��qV��3mkua�7G�)���h�m������/��� wxf��w�Pph�D�j�@�����L���8�Ccu2`�[Gk������q�XB�C��{�Z�	�;���h��@��-��r���+�NzjT6+���!������A��d����HL���6|�Xc��m�R��Q��]�w�����;�����pP����H�&��G��>���������?z��r}3�'Q���c!��r�
�.A��1G���.7�������)�WaNIqkF�i����ozF���v�^���;���>M%��cw�5.���7�}�ji����=�[�����U�"fD��� �q�������HHs�:�L�L���J�i+;��(�v�|�!	�rz3�+5�M�p�L��
Fd{����e#��������e_��N��o�H���F��u��I��6�u~�tff�-�����#�	i������}{��G�](FFP���g+��x��:8Z���_Vuv��Y��G������A�h�����Gg�m/9V���
� k�����.8��5��e��f6�I�t�x�<v�7L�8S�v&�@����;�f��)�+�-%��\���.�~�m�Q=k�:�������T�ML"F��'X�2_�a�CT��0=�F���Q1"��������CE���:��\�S�HG0��@�%���N������W;o���(;�{
A2J?�����h�(��t��S�2ZQ�j8�:���������M;�Kd����R4D��9��6�fU�"�����!0D�2��.�n�x��P���zX��}�E����0�Q�[�)?4�|B��giT3���kC�?�U-[��G������mt��Ot�;K��(�jM{��K�l%ID�T���N6C�� ���bIgnEv���puT���y�\|�}&��:!D�Y���I�MM�&=����xa~f���j|i
�[jY�b4��d�W'N�]w�:Qa?�^hX�g#�F����C�dG�N8�� �����E?�"�?w���a%C�E ��{{�*����V�����WR���n��]p���a���eH��}"J�����J�!!$��Q�!��G����hb2(	n4�,�l\���2\i�4%�E�P�����M(��=p�g���<jx��T�'v�-BN���3d�B5��>�k�2���6g�yu
'5���z��"F)����;}��
�qw�h��c�.	�E�E��o*�������o4���%��D�/I������G�/1�!/fOcyfn������g��ri��{]Au~�e��=5`;�s4+(�<�^�T�	��0��q>V
���zD���^��H4��Y���
X1D��C�JK����q����!��b��W��rd�R)��fQ8lH!lG��
��}�Ic�i`��L�C�z�
�d��}G��!����d���9�c� r!'�;��8������S<����  #Cc���xj�@��KQ|�`����!���"�4����/|�m�:���A����d����92�� ��T��J?���4dh��p!g���%��S�nj�������`G��4�q��Q�f��S��^�r��HL!2�`
���`�5oD}���*��2��4pqWW5���VjW�����@���$��/��k�&;�,?S0L�"��,�Po�Q�������F�����.���_��6qB��`f����`!��V�Y���UXS�,}�������_��t�jqZ[i� �4#�e�-����&�]oV���8��w]�����������k�a:�9�pLs��"�)j�h���	k���F1�J{~�K� 7���T���Q8Zx,(�������W���,8`:��W�/O��!����8�D3�����:�p��]H��Qs~:�a� xHl�t"��
�\tG��?��@d����A	��#��A���o��w����0"�CM�;j=�n����B��Oo����k����q���"7<�F�oL�@d������A*�0��P���i<�����9�|5���� 
*$|r�~��Afb���c�uN"r�4tq���G�O�����V�����!��2P�e�K���l��t@�����J�����&�Qc}~.L�/r{�(�f��?���e�S!����P����1��`��*8F���5�>��4��>���;���=.�� ��������~���sX�I�]5��{}�B��Y���N���V���Q�[iYI�Bx3l��j'�N>n��oS�B��>m�t�#�mF@����5pU���a���o34�f�4�O*����������T��{�H��h���� N��l�e�^������&%��~��NB���t�����d��p�[����0`��`aev�C��c���T�4��Z��z"��<��an3�A�@��
:l2���-��I�������^���O�[�q2�"��n@s��'3_���W�EJt^������^%)��_��!���f
5LM����ir�o��G
����N��%d�.d*4n���r�Ctj^6PRD|�eM��Es?��
`3��
(AvFX������������nj4h������|]��}�l	�S�/a����R���
�`�/���R;�U}\��W�&��jB�(������
��\_n���o~F�Pk���*�/�+I6�.��6������"������P��F
��L�v��U��l��QK���E#} ��
�2F���f�����S�k���.$h+q��h ��B���6�<f�Q�c���"�g]���c
���mA���}��nx�+d��4��ZO��fS��:��e��K8�p�	Y�"���dE�PhP��f���`�������?����e� j|/�(E0�R@�+����^`�e���Qm�#u|ZB�[��Vk�%N��4�r9�AD��E�������i+'b�."kZ+���0Ag�PZ��f���%d���&��Y��2R@���>��lY���B���Ov.*@e�a�N�.a8�f����=�bX����@��7"�-�bO��\g	78�q�};�}�:��iN��@!����dt�p��R����Y��f6���$M�4?���-1��l-'u:_Nk�:�k��7 �S��>������Zf0��dN��@�52��L�G\sX�������AdW���Mhvbpt4�������UdN�Ae�~��Bv�A[��h|,I���R�3����n�I�(���3v�*�����-Ig�r,�6tx �)�:G��C�[~�;�T�w���,px���%�j���
���p���?[X,,������A��F6/� �j�e[>���b�42{�-(��S0����rk�2���=������@���������(�k(��	�=Q���F7a� �4n'@G��]<���*�d=�_.C��u�6�-\@��Q�s
�i��s�l5�����9���\�6C�E�9"E��Q��7D'�m�;_�+O�p8�y!��^^5��k��>�nH��M��.�Y�u������^=� }��m������%+�
H:�g��y�kQ����`�w�@t������p�7��3hn;�Y�voD�����Nm�=��F�6��-B�xe5*A������d�]3L����5#��������/���!��0 ����H������{d+��)���Hn�'Xq8�A��u����N��r�oGA�6������+�0%dU��2?4JG��Y�u�U�^�����:y;:�~%����k������h�	E����o��(����:���f�cL�oc
�3~�	]�a��������[����%�
�/]��r+�8{��J�-���h#!���y�Xz����C��P�L
���%<����C>��Y%#x���a
Z���v����x���������F8������c�0�lk���0��*�l��c���\�"��6�#3�T�;@e���f���	-��vtM���������������2C���w�e�h�wF������]'#��W�;=kat�����
���l[��(V��{�f�h�K���mxf���eZHU��H��4�C��W#����>���&���5z���.�W	� ��d�w�|�b��qE��!�A
p�*��#M�#��
�����l����=Xr(�V,�l�8����b����!t�����%d��NR���5���������=[�Q�gt�C��0}�PD�|�D���9[�!���#�����J���@D������;���1k� ��:""��y�}1w6�<P<G��q�B���y�F_���*��H��m'��/4c������d7���6�Dn��n��c+h���*w�e�~��B;���0��B��)��/�GW�&[�&�8y!ja
D��l�@�� ��w��Fd&1 4�7�H�v6�/�?I������`��<���L7"�����
�,�4!%���fp5d/@�}�p4}�1�`�G�q����
z+��O��K"X�r��I����� uy�oE��"��e`��&e�����}���	�FYU%�`EM����Q��D��G����� ���P����@D�=Nf8�v!�����@I�#��t��%�J�]'�4����2���`�i<N{&e/;Y��x70��J�u[�����e��-����[���LW��lj����F^���|hQc���>a�A���m3������gX1��C�'��;�}�#|Q3��������q����@�e������������r���������_�ir����5vj�{�O��k,e4����~�^��4.���(���S�P��(zr�dX|{^E"��s�0���}��!Cu��W����������D��Z���.�4 ���=
b,������z#@1!��nfGD�c�#�N�y&��n�G���F�������mB*���-�4C�^�-�T���C���,#�v��`�
����"i4�%���N�4���I&}�vH�KO�m��r4�
�|	���d1��;����G�'=wu{�,��"�X����F�U
��|���aZVxC���2�-��H��<�J��<i7�#u�`/���;�����B���O�+f"i}�k*rr����t��k�_]�:0�[p������'�^F*�2C$�)�x���^������72Yx/q~}Nb?%����q�3Z[
��
�7s	��v�����}�������W��RX�������c4"�|��H��^C�
�k
G�4
���6���{�Oa�����9$������;�O�Uv����������_lH�&`b��^���b5�R��dGj�Sb���+���W��������3Z7�K�uE�z�h��G�<m�P��	~�k8���{8�7Jz�q~�
��=!����4V��wd�-;!��#�����Ue�F��0E��z��?� ���]�N!�2����e�2��;�>K�#�&m�w�N�Vf�]uT���0��B*�w��U���k����k�M|�!M���5D����L����U�%����qD�d�N�2����1F.���;�'�&�";��k��'p'+��=�{
m�I�<=������:[$��w������?�J�~/$+�������_)�Z��/t������1}��LP�������	��=��)��n�L�J&f��(�U�����]�����{0���@D�k������d������79�c4n���d����o�Y�3mP��F#uT���F�s���&���f�	{�!���������8\]�^Z��^B=��cp.����:DX�����������#��V�����!�C�E��1:�Z���y5��v����s�Q�h�Ez���w���]��|�o."���BR� 3����i�~���/�'�Cy��������B��V$�>�
<���@�-B!���hv��g`��4(7���1�4����GBDz�R�[�f�6��m�|�2� ��;���IN����� ��Z�1�/��]��3V�/uO�6����S�A��]NV���x����SA'��AQ��7P�T6B(��7��=>h`V��|s�)��(8���j2�����J�uv�{!u7`�U'x����9�`�uZ�����v$Tx-j��	�Q!�%��t����&~��
��Q�����\���_)^����'���5�������I�x/�o�-�a�8��!:	�b�����XD�#�J��H�e��e�1���-�!��s8����k��t��>�Z����B�Y�N�;�F���5�q��^�������������E�A--4-��^u9��/��n�"��8�!��!��k��b�wsyHZ��^��"���&�%���?ipH9������F��=�@h��=�����;z��1��>�!������n�b��qDg���0D��I��h��������@����D��RDC�#����cQ6E��6��v
����|�dw�S'����1�<�D-eX5L}G��;�i��JQG�8��Q�qv������A��GS`�_�;�K�O����pv� ;��2�Rebv
1/�����	���b>�U��s�����&�D�����I= V��sX3���~ 6���  !5C&~Q�<H�N� ���`�������&.$�h��3�l{;���"����zKbR�0��Z��~�L-�
�k���0�\����KY��~��L���?�{!m�vb��U��[W�/m�7#��p>�' ���-��4����H7S�c��4�%�z�m�}�X	8�w������������-��)e�d�U�����Z~T���2��F:��s��.�������a�{y�����K�5�(��>����X�GA��=y�)���������}�m���I	eP�Y�`�=5�}/�SJ$�0����I�aH���*�/�=�-�����-�� �1�����!����|����lU�0�o'/Cd��
-����YR�pTVtWa�I�T����/�f"�	�K}l��\�E�8�Z�p���d�!����.d����8��j��]����
� �sI���Q�v�'�W|�Zh
�^B�xf������P�qwb�p��6:�{u.���D��*�D��*�wG��%����H ��>[�%Qj��N��$�����O���l&	��?�-I.���;��m�=�V��<����{������#��R�Z��kF��j������*��B	'��-v8p��6�*����W����	��#5n�(86��M0z�LYj3Kn}[vTwU�Y�_QLYm����I�&�8QC�Z���e�{���;�FH�;�+���W@t���'.$5�;|G�i<�����VQ��3��
�����C%L/g��a=����U��+�]B%�)���(jT��Fm����~�T�%:
6{�a�U,��:By�.q�C�1l:��aW����2OB���0A��LM�����QSDZH
�&�K4Om��T����G-Xb�A�l�f���Nw8F.K�WA@:�I�B��:0T�#��B'0�h�@�
��[�Ff���:v�x8a���P�MpFd��$WP��@�G�l#��d���L��u���P������
'Fc��5�=Wp�'W�B)Vv�6���	��f�����"n4�M?t`#1Zh�^Hm:<��d�>1��B��]��Q4j�0qY�0��d���F��#���2+�n�ZR���K����R-I,A�Q�yX�?�J�eo���^����"Uh�$��N�*�1�'����b���'doRs8�[M�Z�U`��)�h�	��VFwp�/3S��/X@�`��>�c)M���h���q���S������D�RK`y�o���������e������!!�����T�:�O>�9d_����o�F�L����A0~$�'�6j E�w���3_�n�C�:�M8�0/��'�5�	p�����7
G�h�h���]"	�'��u/���cgl�N*<mF ���P{���n��������]����	Bt�j�����E�k�y�	k��,��3V��G�Q4�pC��u�Sd�[��k�A�Y��+���M*�(<�����$��<r��Qm�4��N?����=NgM�E�g�INI�ki��v�x��Q��[Q��	�(y�	�����sv&I��H�P/�����Z|�"�����2�2B!���)�^7����A�Pt
����+K�$���}����8�y|�j�X�
���()p�����w�G��
K�Z�V6��"�=	�Z'�=~���1�?,����=;@�W0�_���Y4K)dz8�fJ����_kv9�>�L
r	Vj��B����~����	�`>({|Na����u���Wh=�2i�:��3!�4���GHFd�^Z��EV��JS������H6��i�#/MF}�M���"�����nK�����S���f����Tm��Y�4a���DG��3�a�CR���=�����g��rVDynN�>P����VB|�,�ISM��Ks������?�{g5���L��fp�2q���o�+Z��"�6�E4���
���o[�g�qMh$)F'Qui�$�)���r�4J���1a�0	t2r<���p	�k8�.�,|/��Qvg��DR�&D�;/YV�m	�����`c��&��o�F/a"{D-�n����a�O�=�!{�v���B����+�������K/=�+f���v���n���H�X��
�#;��}3��:f�*�=��$�����E8�}�L��pw���Qd��1���k�vkC�[��������FgIg[�����S�Ht�z�tM(����c�/T����[<�A��
L5F��*)��	�8q;-4"{��c;��<����8.��&�G�IS��m��"~BAI��[�K���m��OH$�����CZg�������
���������8rd;������m����1�����7O�{��\|w
��kh����p�.����)Aht�?M��` _�AQ{,"��Fz�^>�,Z4uX�,uK������z�?VN������!�J��/���	7c�d�m��i�k��1#+�^�tx�A��h|��1'z�2�
��d8����+�r�Y��r�d�M��N��1���m�$�0�f��#eL���o��>�C��
i��nh�w��T��7�F��#��l���6�����gG���;�
#��l�{�?����������������I�tP
�C�=��J��N���[��A�������J��\G%���;4r��Q�Bp�;���#�`zw9�l�i��5���"��������g���{���[Ix����������������'[&J���;�����; \�s������g�
�v����Il����'af��?Z�$d5��KpK�fZ�jG�ta��B��}����]@�u���>LW��(e���yz�-��	�� �D���d��1��0���� ���K�)�����O���-�Kd�����O���]�P��zDy�%�hy��Dw���B!�����9I������E���8��E�/�2=��C���l����T�h�7��X���b����I��J2��f����LM��?��/g1U{xPJ�������a�����)��Dw����o-�j8j�EU�q�*��������p�qDh��tA��PI�c�D�n#(�t����8�����:;k�k�rp��P�.�C~����'�2�� ��YJ�
�oa@��N�@�G������	gE�-�������P������-�3'�|�C��Ch"�o��U�A�����g��:>�E�j
a���P(���~<>O��@t�9|��f���|�����{b�I:;���\��e�Y>qdFaC���H�Q�2;��Dz�*$�D���1��.C�?��.���2����%�3�����1��?���zA�[5��V�+��T1�z�C
���!Z(��)!����A�'/'.=v7�����^a�F��Z�M}��sa��?
l���p�7�9a���F�L�'l��NB7��p�D��l������'')����2j
0�3%������l�6��@�a�&<9�g����������h��^���H�����h3,�iv��B��mE���`	4@5�D��a�/Z@v�P�V[A�kd���a�%�t�<l��I�"����^�����0�	$��>}f/�}�"�`nxZ�S��'�8��)\���������=S��`�H��]Qd��<���@��RfG���C�VoC�&jb�&,�L�3�x�A�h����;2���&����W�&rC��C���� j[��
3��P.^���~E��!�}�G�h$0��0Xl�[]��$3����('`����f����&#<����%d�'N�������w(������
9��.�,4�P�"X���SW���o�����O?'��F$��Kw�Q�Dx�0"�{�-
���Ymbp���4c���=k��B@/�F�c�	�Vr������
D���cT~w/C*����A
��`*h�Ji�8�KD&$��O��!�K"������-������!�6��6���,��
���1k)��J/0]��>�
��C�C����a�_#�nj�����d��S(��!���������~��%�'"U��)0���s�X���9���3���2S��eax���;�����t����;z�D��6q"N���U��H�0��`�8���������8Z�g�Y���<=�1����!��������+0[(��ga�S����������#��C�!��{Zk���0Ddn4Cd��i�F��v���I6�i(b/f����j���>�����y��g��)��j=v����h��:����w
e�ea��Ok&6X�LiSP$�^���P����S�Q��1]�e�y�DT���i�D���PO���G��DnS`���TH8��ma����M0�Dc����v4aM����#��@�]>�;��f���m4��U����kd���28���O�B(�}��4���C�,�PJ�_~A�����<��g�Yz�A�dd-��M[8�:�)>9m���{a���n2�)�bDM�\�M5��S'P�2�6r�6��J�{���o�[8F�U�)��-#E^"�!�K��M����	8w�(�O(�9m��\4l��+�K����mG�.��f��GC�����i�"���\
q�o��y?F�����yl�H������SI��,J�������;�g�p
���������d�	e�	��?#�%p�,3E��)���0���l><��PZ_������t`�N��S�E��7�=��+@��Xg$�)�Q�,�C*�����|���JA3�z����Q��.������F�U����f��4D�sB'���zm��h��0�;%��j\��)��Q�:i*?0{�R�l�0>q&����f�DV����I�R��7���uN���r@��0��6��j�T"���7p��������+Wq�>Y��`�I��44��IM���3 �G�L�)��hfx��v���[RG8�S��p?F���QG��M��J���n���[p�FF<������
�1C}~�1h�"��2�P]@._���VH��N9,ADF�a�u�K�����e<bv�����8D��ed��c���_�%`�d��e���&�,��Z
W���XQ=�����n?`��A�I�A����j�$IE?h�tz�������l����!G����[��t��"1X/��F3�u29L���(rW���dp�hj�,���t�����0�=������r	?�J���{
���!t�~���e\�\a���(�h�KP��MX��=���Z�-c�,a	����x�p&6�41��GQP����K�E��R���_��D�����dB���@�����&y�-���Y#��e]I��
�Mt��N$Z$��5O��:��;\�V7;��S��r����{�.��n�<D���1�
b�fD^B(���yv�����+ObJ
��//��B��-�[���f��?����3q��N�/0{��+/$��/~���W��!�]�����G0��>
�-b�Av�Y��r�6��P�I���d���e������k��L�Q�e�����G6��M3&�G>P7�4��kp�����j9�B����+8bH�X[0�H��SR,�������FE������dw��3�.Z� �y�����vZhg.J��u�4(��f\b-��P�e��#+�MC	�\G{^t�Up��U3Q��t����Vr@��n�Za�����<;���D+�Z�����=��%*Ny��	�������vc"�MC m�z��H�h���w[����������J�n}0��j�t��s�>��c��n]2�l��m*����L�P����w	�P�I5����3+x9%:�� ����e�DD�__ E�e%������I��;�l�G�I ir�c��bSX-'�4�@Q�9�
AC��)@�N���X|x��k���j��8^7��h�_B6N��}��f_�|����Mn��)"m�(���Q���?@,.�'�6�p��[�G+MU�#�V5��.�|a�ES���D�m�L�	/2���w�;���<}� x��/�-�lt����2���W���-PB�����'7F�ee��S�0�,�h� >����p�- ����[���zZ�?�#+4^A)"�����G5���l���z��ff��D�SA����- bF��]��.Z��#�>�h[;�e��Vpy�F�����C^�{k���-�f%;\5������p���Ky�3��������;#�aFc���	��N�����h'M������m�����,��2������ ����>�w���#*��L��s����F o�	L����xmwSG.�i_,��%bS�n{�����}n�D�cL^kK
<��~������1������`|c��z��n}�ol����g���=lN#to�-j��0�bL��'D��6
{o��8`�e>�{�$������O\�
W�h�����'b<������Xh�C�X���@�]��e��WPvUq8KJ��~����KV�e'��m��: 5$��������e��
��Y'�	�T�i�c�8L�{�m
G�`"�q�RXgP���C��F����a?�)���DWv�
h������������,��*k4���-������vy��W�q�|��Dz��	#��>{`��>�9�E���*�7�T�N$X�1�-n�F��N������k2�B�9Pz�s��*�:V��Tld�
� ����������)co3�����kbd���N�� 7l)i�����5�_�������E0l�H��O�
APm�<d�#��M2l��v��X�������'Q�R�������#��v?!�#�����A��#�;P�R�'��^��J����^(��G�G�����VG�V!/!�o�@'���~��bh�=������F��~���������=j"���lrw>�"��q	n+fg�3�|�3=E�5��wN���a�D.?�H�r����;/�����M��c���<ww�J�������<_��2�����]�D-���S�V�=Du�nY���`��P���s_�+'����$"����T�����z���!����q�O�?s�:�>���@�c�'����|�lnv,�@	��V��?���A��B��^�"����~��8��4�l��y�|��u�C���"'�����GX�<���������8]�Jx���Ok�]�H���d�4�)F��T���_B�rJ1�5G�,9�9��n}Y��~�u��~�xtm��uD�B���B>� lj�l���O�m��;���Ay�K��d�?}�H�.��H�pt��"�D�=��9���R6_>VHd[������4�D�f���.�������D�:Mo�ca�)h�#:��S#�3�A,)�����	C�!�!;3{'nlyd�Pnqi���y���)�z�Np��>?���w,����NN'�;9M%��i~,������>�SM`�}� ����r�I`u;�����4���@����d��gY
���?aD��<�'y4T��TE�#���i�<Z�J�X������k����i�6l!��+H4�=_������q�Xd���-N}_����[t���l[&.yfQbd:�c?'�U�'��g�D����h��4���M�L����D�������(�t`v�
q�ND�6�XA�fpX�'�����5�hzh�m��!�K�U��@|X�����IXx.e����c����AX��O�Mv�P�4L����6y�@�
j�;A�����Q���6zeM�@�VI��E�oY������p�&�=���u�O��l�J���Q����d_],��z��B4|7�#k��]y��~�+:)�����7`�xg&�w����k@��N*��D=4v�J�o��$���K��%i��k��m�E:A�����t�kH]
�t���N#9�kh.h�L���:A���]�#j��m��#�^��id
~dK���|vN��PKv%t�|/T~�+*k��Vv'�Q$��w�2Z:P���]���(H�])��c���X����&z�w�@��}�����P�m�
�����3!�39�{�GHLZ���~WK�SCJ��PZ�������LD�i��7;?���z���h���n�yI����
����P�]|/$�,�)�����'�����{!u�K�h�f��00; %+N�G�0�����].p����D���+�jdA�A!0+D������D�K��w���g�D5������B��	�?��_�]��bOh���;�{!����9{��������/�@�s�{!�����5���MQ�n��
�R1V���7#�m����@T��I��h��.z���~�2���J�N�vA�������k�����=�e�S����
�����N����i�x!zm���\��O��vI���54Z��������(c�����a�{�?�#���h�F�<� �LQ4��%,�x~"�L��^�eHo��fgm�2�;�d�we���E	Ci��{
{����L���Pbr_N�6f���(p�W.F�I���>��5@��YY!�cgs!�\a�w���|��h��y*�f�3�p���E�}���������R>�Z���B�����*.��$���5>AZ�H��|��e #���2$e���N��lw!������n!_�wz���^���h/p,�|$LD���b����K�vb�^H����sx|���X�����R���o��Q���q~�
��SV��}/��uI�T�K`���bp�"��1�����S�"\OF)�����pT��dZ�]����������<S�e�xG���d#���s��IG��b�(��(w�f��@GB^��X�'�����#W��R����n�3��Ex��-q�zWJ���E(G�up��Q��v�j	�ckq����{����8�"�>�F1��
�b�(�V@��������w�p-_���G�q����VK��g�F��a[�%�}nM��9�ZU�B{�!�T�~qA��k-6������"xC�����vQ�����8n"!E��d��AT�C�S�8��d��P��p���X���mExMJA�	%�~8v����60_��g�b�Z��8�^m��p��"+Ol	����6��U���D�R���q+���.t�9Bc-_�u�9uK�k��yW����P.?�Md�@�������W%��
W7�a�f;�3%4�4�=�:B"0������=��"�����v���^���3Oh
P�q	R�_�A�T)4F����\��X���q_&Ws�g4�)�"���p�2�ve�����������&�_��Z3��o/���^�60����B2a�?����9a
�V7���HA���
	���FMh����M��u���oms��c{�fv3j��(�kY�����j����	�+��@�ll0�p��V�u�+���-m�PR��D����h;�
�l�`�������]M��!$��<�WI*����X�^V�(�,7��}xJh�M����V��X �x���<����03{�/!���P��,�kX���Rf�_'9��F?����7�"k2k�,���G�9�.��k9�q��M6ZvJZ��K���>�����
\��@f�J�)����P��Zqf�����.�@�7���p�0��LXq���]O���M���?|��5qO�a�C,�&����M�O�����S����I�F��t���J�ZU@�l	���B�?I�h���	��xPp��DuvT�Wc���V!{��R�B���T���k��~��z���B����1�k��}���(�����0����Z����p�7]������N�F�p���
��c
��Zr	K�������L(��V)HV!�����$U��N��E:.q��
���&�~4��V=���F<@��x���j�������o�%UA��*�@����9q@�����]���h�Ym�D{� �i)������\�[�r;B������P_��T3U#D~b�
7����|�d��urp2����w�dr���� "�T�E�%z�����W�0�����U	c��:��C�z�����Up���X������3<�XF���-h]6&�;�Y�����V>{��E�va�h�J:��V8��/�B(���Gn��Y���n��^P�j�<�Zg�f��j[&B�!B���#�-�z��a���i���P��f�x�&�
M�����
fu�D��$��������t�VW�{��	���Y������V�
K���v�eeVhL[��I\�3AO���?�eI���u�����|ZMmn��I�������Y������V��D"�%kY���mw8����>
�@��,m^�$<��F��g�d:!�y|6��(,��+�~�!���y�L�l�"��gM��
b����p���]|sf~T%����	�Gp~�c��'�#J#w��G�%��
P����5	�z�K�����*�n�����G�k8r����q@V[��?��;��f	EgN�l\I�+�p�)C��L�:~��o<�%�w�u4�{L�_�YN���;�5V$qt�	��~��=\��T����F���m����8�;���gQA�)'P�W�l�O��}�
��ju���5L������v�.x���o��:�����!=������tmt�Qm�PK
�r�FkB7HL#�
����7��KQ^������vP���]� ����_,��7j�}+zZ$75�8����=(;�a�r��8{b���1
���g�D2#/�fO(������\%�{�/\�o�}d�%"5{s`�K-0k+6�`�1�����e�RbE�hD������X�1y4R��,�����l��Vd}�}�{
okO����l? �Wd�h��O1?��������T����:�9�����9~���?'�����JNyI}��O�9�;�d�a�[�g{31�W3Z������8j�����8Er�������>,�]�E��r�2�|�>��>��$��q���D��*���kv��3��]<����p����lBE�����2�&h�����L-Q�k�uP�1E���r������Gv�Z�	�0�����RgR4�����uj���$�O!c��`@G_6%���ksB7�Y�
Oa�E��]rO�����B�O?�X{�/$d� �Z���`4Vl�Dx��Lf����.��h�F�+��Je�74R�5A #2�i�6Te������|m\U#Fc���g(7���^%A �����{�f`���{6g_�&&�_��XK�qf���E"���HQ�?�V�W��	�`b�WD��~5�5Mx��Jmf������"*rshv���"��A�*\�lB��7���}���%U�.�`F�	W����I�\��[�1]����Q|�A��w�N�����
�Jn28���/����P�C��B�{��n�q��d���
&�
a�c3���T2�g}/�����6�b�"j3�aLMHh�����]KvS_0���>�%A�}��'z�V,�D�D&���	�8�Gg�p�#�y��;{�[�'#��lH��
$��EvZ�gGV��8YQ�eR��6 ��7e�,�O�|]P����w��<���vJOnW7A�v��w�������q��D�Q� �.Ft$���0��-tG���8
9�=���?F��u����%e�C;\����~=?B$`/�����k���.����W�#iC�~�:���������lz�m�bE�1��O����[v��3O8��;��	Jc"�e��.cNGP�6��:t�WL"j���.@#K:���]_T�j��i��I��� ���T>mF3�n�'�5;�����7Qc�
w�,����]B�g�Vw$&�1w�^H��R�T��^*���I��%:���
M?���:z�����_�L��-�`��y��OJ������
6F�I5��=	`�*�Ot!U!�wB����[C�c�#�^}!����<�=���;�%���k���I�g���m	�����.�.f�����m���@RF�.���������.`�F@Dw�v��v��q�e:�����������:�q&�.g����Y�F	}X�{_��uj"��������Y�&CC�����+]P�_G��;���I]��>�utHM�����TC�M-Z�'/z\_Qq��UJ���������Q4�m�(������8_�4�Os>�7��2���2-{����q�~��+M �l�a���U]R^gR�.��D5}"�����\�B%�����������/�>��_uC�������[kf���;	x/�����b�p��r
�������o���ME��1QPdV��	K����:�������mK��L"�U�6���8��L�q���v��"�<���.�c�����_�$���WN�����3r#j$A��%z���� ��>����mx^����>�5����W�HE����N	�l)�"���7��F��������g����g������F��NwGU�6�;���\�nI99�P�����u���4�0&�x<t���UT^��bv�}{���d<f��hh���s���d�>�H��k+6�'��/@;y��E����H���C��a�����"{�Q���3,��G���]�3x��\�������������?�8��
a/�I58U��]H��b+�p�N�e%9�.��2Dd�:�.�
�2���Q�9�	&h���F�}5.�����R�6�6#Q���-�6GY����@���'�d�
I�p����%�����#E�9�Q���b�5e

8G�0�U9�����CC��8��}���#:27N�&���)����cw�2P�\�5�n�]C���J4���!5c���4�b��nIM�P�a���BG7;}D��-��������[����y�gkA���aA�w`7�cX������n��������:ALf��ip��?���������Z�J4�_DE1�����'�H�����=�_X�B;y���n��&��X��c���l��-�vKk������������zzv2`�t�2�2�hX30�(�q[ 
kB1 �%M�EE��!�!3�6����#ptG�I{�5��%T1���rd^��l!3w���}w����f��Y 1F�5�Ad��u����V�7�&�l����(R���
D��:V~e?�l�p5j��f
�!b3��VYC��4����jg#Hm�8���0eX�tW����2��p	�����{����"_���-��k�8+Z)21���rkl���7�LN����m3=%F��&�J�DkL��W�P3��`�
w�_�=g��#' md����)��Y�M�a�ZC�X����
<���HR9�p #<���c����N����;'�t0@���|������Fd��B����c�	a�c���Gj�V :{�%�F'�|���9ndl7Y��/�E����������q�So�5���E��	K���m�S��V�I1�~eEU�t,���r��7M���%���(�f4�=?��V*@z�n�P@�2�����*k���wa�k��f�@��e�4cV[����Fy�)���Z���� �ES�H�^t�O�S@Pjfg3�,Uf������hf5�'�x�h'�~;�;H����|6k��X�J�po�����R��;8��1�"&�g�G���Z<���p����]
��;����U��+���!�����{��������(3���B������#N���Lf�s��<5���S��e
J@�����M�@��F��G<�)����xg���p�JD=��h�*J�����)xa;��D��)p���zA
���g��"�����e��f>���pc"����q
d�x<w��V�Lqp�k�!3Z��Q�{���D�D��������,@�	kTz�H��)<Bf�V.C���2sX����0�5���;�?l����'��{���>���m�Xy�r'k�Y����x
�������o&�8�)<���
���8�)���S�
��LH}�q����#J�^��9��U�b�?.��9�el�gd��`4���4���R����/�'tF>��5dsm��5�U6�����Sv����N�X����Iv!�B�d�A�WT3P0�����p������%��f3����[�)"?&���b����{��u����^�D8:�P	�V�I������wg�Y������(�r��������M����%'�h�t�6{.Q��U�^t�������O!�n���Z��lfg�DO�4qK����Y�.��,���{~�;�����0����s��$��,���v4gZ;���WnDH��1#E����f'�LS��}�L���ep����L]�2��H�?v�.Gg+f��+��rX������y�/�l��fY����&���9��h��)�/��${�VA4Q�Z/�[�9�*�6}{��E
�����x��P�w���e}�z@�*��,��5|���e	��b�}�}	5����9�}�K*�Y�-h���[�~� �H�pv�$rr��7NFg(�N�@�p����1�r&&�<9H$-r�ZB.j�F�V�=<����yo��
�X��a5�jVb�����h��,v���KHD��!K�"J2�2��e�anG�V����w����_;�*��Y�*���v	�8��K�>��-���=��mY��.�
-&�O
�k��IG��%��h�Z��ku��c��2A���9c�?Q��w;�e��5[���QS��_�U�����l����.'�0GS�5>�W�����%���k|S�h$��������n]�t|&K�����=�#4j
cb�n����l'�P��]����M��G?����n��2+��H���\dK��(����SO@Ni=\�i\��N�IX�>���4�!�+�:�2�+Qj��?���R�����[1����M�U�0<.��8���F&���@���l����&��[�c��ZU�5�������1�l��YN-�MGG��[C�M")��,�X�{��]���K����aKPDI�C���b	���������2&���FLQ�U.���(DS�!c(,����NJ�(�O�r��H&{@��	�P�[�q�@������?�m�uD��^���;��&6w�:| �KoZ����oyB�:�w�������B�����??G�uH~;#[��1��{��M�_�J�����7��?�V��#�f	�`�*�*(Z�&7�@�/K��Y�e'DW8?T��(8������2�����b��"�pF�3��l����w������`���m`]r�n�*���#)�K��[@�:Z���Q���o�)���hGo�6�����i�j�.l��rC�HN�]��m��Z4��F:NOe��Z
�Vp��@'3"�@����+��6�?��r�C;����7��Ctt�x� �)`��=
'��<f����iv("��7H�Y��?_'N���[������'�X�����
b���]������q�m1'�����w���1s��4�|����W����k���mG
���ED]�n�7�_�����c��C,&[��?�/f�]_��Fp�������J[�-��G�����_�S��k�0�0�zr;).��Ym��#,s��.�"�����o �a#��(��r1^v4
�����Zd��[�}{���z�mA���sfJ�-��0�CLY�Z[�OZ��c��}�B�?�-{�l�9��v�����3lk�=>�{$���`d*����F��m'D�t�("�lH���m�T���r��! �Q�-� �m��DV������d����	D4<byP�6�,q�vt��(JY����&��<����`�#4]��G��f%o��ir]���x�#j��F�QY8��A�WN���w�-�!�I8�����B��	�(�C�JF�fQ�FZ�-l�\Q��g����5������~r(9�����.-�(c�n��K��������,�>��l� ��6 ���he��J�">Yi��2����T[�����*��6���F�3gS�-P�EH���^�4:&��3�o#��"��D����#z��Q]j�;�RD��
Rb�Mo�e^��W���Dc�-�O������?���m[t��	�FX�V�J@c�{G�pt��N�;tS<��?��x7���@���A?W|LTz�O�6bJ�S���k����G&u����X�0�#,2u�v�����*�zL~���l$@�A������g�����&+��c�Ol�C�����x@�������:������g����4��`r\m���:�bw�.Gp��+Yx�������f @�F��z����S�}a���S�G��#4����[��h�n�a��z�����R�T��������8��bL����1�A�����8����j1 �M,�@���	X��j$#:}������d�D#�z��k|�l��4Q?r�fT@y^���h��9���m�$p��O��I�[��������#}��@#{n�)�O��w��AV��C���&��)�Y��5w	5���V@���#��qfUw�Q��D��Z��lp������#�~Ae�*�c�ME��;��8.�Sb�AG�s�n��a�doc��8�ew��O�R�k��lA3��Q��]�����?~ �����	�,���D��-8���&�:�J�	�Nn��^�'�x�������������iC���I;�����
�+���i�}���=0{\{9��VE��|"V��Xr�m�V[�J�d�����2��f���IQ��8��8�"��
2�f zF1 p�F�gY��\��I�K�45��N������q�0��M]�@��"���������������-�9(;��c��`o��3����L�Q�-	m@RY��Y~}}t'> ��L�4vXB�iD�_��x��f$��6�+�)����N�J=��h�����.$w����V�=�z3U�q0v�����Lg�K�1��>|p����������2��9l�,T�XM� /w�>&����^��q�P����t�����	�������*����"(���"We��8���1����K��W����;���%��{���#�@0p]I��^C�b�p���w�Zm�3����j!���w�����w���N���t�Q;�^c��*Y
&���|��-�gz������2eN�WDn��X
�>LHD�rAb�n�.R���/���A��^BpB�yI���7I�	����!0Y��=��Z�~�	��]��nc=�
���*����s���tXdtN���Y��OV
v8��.��J������x�������o��}G���F����$Q�����<��D�>��k��4��4^��K�>=��}/����s�������`����z3;��4�a�_4�<�^�������J�����������]4~�!��*����0�������N��
N(�r�Q$��w�*9�g|�Xh��i���I����K����x���-���~v!4A��0&a���q�f��.�3�C��]����CR��C������{�5�������^������V��AM���OG��h�_V��������~!2�#U�{
5������Rr�d@��t�%��Fxg���g,�~�J,�;��:f4e7�����C�fE��*����+������d��%4(
'�j��#��|Wj,w���[�&�.��F&l�>����
q��G��2�`�����!���o������_E�1�%��1D �l��D{��=���w���:���[��Du�r7��?��%���R�Y��yN�Nb�1I�����w��l	7�]��&���q������n��o���d����6`��q����~:���y��a�d��|��B��u�-���2,���'<��i��=���S��W�`�w�6��[`��,��=������b��x���/�0��Xh��g����8fm���~�0=�@��u��
�s��B�]�A�LS���H��^C5Y�pH��_��e_Z�n�(�	��~��;�.�S�0@��,�8&����1s��By/#�*��[���H����{
���Y0���t>V t�_L��&�����������"(Ac���}��'�f]e�������K�5�y���"`���cw���HzsB��bVIq�q}B�p+������������B@���T�5������/�2��V����`"@�8mV_��Z�%[$,gw����]"��V�=�o�>l�����W�E�jt�0�������.�P�D�u��E��>�	{?��E�,r�������]+��v�[�]�wCd��^����� �@I��~�_�z�"d ���8�����cw�E�����B�x�s�NL�/�e�g�a��
%���M�9��QF�}�P����IG��7b�0S���J��u2��V)p�D���X�@����^+B�n+����,�������	����Z�@�����~��r�Q�]���w���*[j�8GZ@�u	4�K��xP	����R�]�}���x6��F��U�����L=r��E��+Zt�&LI_|�����"���4�w-�>4!���F1+�_����GFD-���H��	N�$��M6�4����9�:�$����V����Y��i�oS@�_4&-�������'���:��zy2����w�v�����N4�*�N�z'!
� ��lP�@������
(��\��o+N�h�C#���=�B����G�d@@�1�ERE%�3��F.�C��,�#��q����]H�\�@����a�Q"h�lc����p���o^��5N%[��W%��	Oi!�`A��7S�h���]Y��~��"!�,$�a�#H�|�J�K5�3�ul�q����}<j���� �]i��`������	w9%��"��V�>@�%D���p>c��y�F���
s����i�]�94�����f�m�=�����7�N^���&M����g����j*��*�"�b}<�}�8a���7an����d
�~/5{��T�����h��V*�ar�<-��k��B�IN��V�&�iC��I�UA
�U�u���5*Y���x"���N&����w���ZD�B-	.Zd�����+���er�d����j��vR�h��p���{u�\��
4��g���a����>Pkb���q�Y�=�]6#�f�������ld��e���j;#t�Qo^�\�#���bK!�j��}zT�Ukf��6*��
�@a�c�jX�*��P�������V�S��'�(4�Kd;����h��zR7�V
D��+[�~���d���T��l�2�<F�q'k�l�E�!�������������!3��F���TN����Y���!����E��5�7��<���(7"�h��tZ�|�hTU���~hU'VGMz�����{���d���
Lmn9��A�u���~�{��dG��*@bE�*��C=��e�S�*�������:�z��u�U
8l
����Or_���Q���6����Z���p�*�i���V��8����#0kXJ��-�>������!���sVb������!f��F`�iW����Z0��k5h��`C�Z�N�<�B�{O'aML�o��)������EzL!�E,���osL-!i��a�hRX
X(�r�CP-~��W�Y����[+5���3�:�$/J�ju��~��3z-�g�?^O�����*zg��	�`J?(c�W�>����� ;In��K�Vnk��y�����S�g��*��(��b/-7�q�[�7��Rs�ic����0�Fw�q��������n��Zp|3q��oy����-`64{Z������z�I]\�F6b�rMY�%��l���J�'Fu�r�0���c�D��NBa�����J�Yf`�,c�&1�}��Ng��4F�Q�Ck�74�O$���C4������gPd��������8w���������=�P��Y�L�&�����/��1����^��8�	�p�*7Al�}r5+)��	�d�\	���+���`
������}������8Q���`�h��l�����?�x� �lKlVDD3��@����=�����h��L��7~�+k�(N� ;Jdy�k�"X�@�M�� ^cT�}fKI��m���T����hL�D��o���0�kT�5=�REGB`�4���B����'a�b�G�Oz��8(�X�\�>�����$�	�� [�����'��f��6U	*r��6������CF��	{ R}�@2���B����!�st6[Q�E�ot.F�g�x9m�_>��0�uK(�������aVHn�v5R�Q���<F���"���r	��O��m��oL�trs-�Sok� �.��k���a7�h{�x��"zc��l�1�q�\��>�g3s
k�C���yrzt��'��kM F�B���t��#��6�������x�3��6]�e���G��&��i*#�Td���P��=��m�����Q8;r���Mdu�p	LI�
S�D?�B!
�q�X;�v�<�(Gu�����s0C��o�a�j�Ax���j�iQ����p��6w�T�@�Xp��	|���LxpfM����3U`C�����x�f���A&�Z����4�
?b�6�5�;�w�=Q�ck��U�i2��L0���t�P����I�i���X�+�E���+���Y�b{��h 2���5��:gwk���>z��
�O,�����p�F��2g�v�ydS;�&F(A�F�l�������V�s���M�c�1��������8����
!t�B��d��M*d�������r�P��_Qy�=�oL��3M!���g������1����]]#�iw�-�d�?��s��4W��wDs�0�a��.)�'@W�*�{q������z~?�aFJ�.�������o��p]������x�dC�^������N�^��'R�B��t!d*f���n<'������1l��a�A1���.(�D����	���S��r,�;�FcT�j�Vz�� �LO��g@���z_���Y��|��;%�VM=r���fp�S��;Z�������G�B�H��1z]#t�R���Gw��J��z�[������; PaG2��l=�Rrm�@dJ?D����"�b��{�����:2��������Xk�#!J���j�������4?
k��������[�~cy*E�v7���m^�8����?c�F-����Y��GK<sJV�82:������M���`E�;��R�s����q����
�u��L���E�K�������9�qy��FA���-��v�$�&�8ie��@��f���Y��8��=BJ�C��=}�+ikMs���3�c,�9Vt��.0B���3M��x�%;�a� N(R��
0Z��.,[��	!���^T.e��2����us=k���`fE��u#�Be���k
N{�n��/rv������w��,d��c��jX#p�������������a���O���������p�HV�H�V�-1�����q�pD���p��M�.LF����n�+��9�z7�>����{m�&�Y+U�/B.�'j�����T���d3���D:�nd�����$;�_O@���B��Ux���.��S�d���!���	7�n��0��+�5mXe��(��CP�<���s���
�sSZ�<fe�u%f�S���b�P�a�A��D���7�U9�sG��!�a���Q#'�a#�f8��>��8��A���
�j�Wa�T�ig(��m�]��={��'lHx�;}j� 5�j��l�3���������]t~���:V�s&��7��Q4�1dc����;���"���.�l0���eX�p��--�!
w/<e���a����m�4#>0�3d��C���L�>�G���k\���������1���:�Y��3��!�B���|�H�22l�m�.3�F{�yJ�I�����1���`j� ���o�nU����hN�q&c�mE��a��$4�<yxX�p���X?� v��s;&� ��O&�aD���.����FV��O���������sp���}��T���g���A�^�F�5+��K����R����������B8�_��o�:�-
a#X��Gv�P�0����zF��D�)R4���Ux�2^�o!�C��5o�� ��L�+	���`d�OS��P���!��OU�#���<&��������iy��x�������� ���@\M�W�0?f�_�� !+pC�|��&��N��X�=���e�g'�$
��N���h��kH �95�vW(=�8y�WB7(�3��!t"5�^�x�3D��%�Q�bu��E."��e���n3���o����Y �^����?���>�"f�Q�q�|^t��|�a�#
�����^	�wn8W��H�4&�{����Q���L�kG��������Sa���zv�EB����}��h��NY��l����������"3���Xrh�As}����0'Y�
[oN[��������Bd�f�;-��@pE>u!_t���J�]�N���e<�aIc������Y����j
���;x <�rr��e��2�����f
�r\�"^N!XZ)���:��`=IyE������'
��b&���X����7�ED��������? �b�R��t�DPO�������%�����%4���s���[fC���~�5Z����)�����`���(��+��c�a������������<i��4����0A9��I���C��z:dg@�.��fkX��-t�������v���rr����"N�$��\"2S�N������Y�*B�-2��Y=��i�6����-���j�i
�8-�	�#�i6����=��
�D���dH�,�o������	�l�D���\�-�(�lX�cw�E�`J+��l�0��D`��qx��[�����jI]���� �%�l��i�3���v{4��_�����Sc�0��Sa#(���9��=��:�qd_k��'���p
� G�����>�-Pho���-��N[<5Nid�1�I�;���DD<�^�/{�9���3Jw���G,R{pX�!�����v�}�!YS?�~D�������B3h������&����E��C4z\��S����6�=�t�5V��K4��03���F�4.f�4|j�-9��@���:}4�-�����`	��m�b��"z&P,�g?�B}.k|>�vt;@^5������h��+F�$.�T'�1���?�F<�`������3�� 2��t0D�Thf`LaTCgb����S�K�*�[L7�>�kg����`�������g
s@����"����p"/�i��R���a[,�
^����G���|�a���vS�e��L�)GV�8�!��1RZ����RE�����x7��$� zT�=��8,�����0��x�)�lX.�
������O��������Sd/��h��~Yy����	ZF�f���7����]����v���~'��g-���/���N'BL����,*`	[��e`�K��5��\����x���M���������2?�U���/�u.�=D��U�:���%�A�������������gF EIe>Z�'�����r!V���B
�<Kb�O��������Vc5N[�����^4�+�������Ci��k��`�}7�l��E'M{W���#�������$������J-:���
������{	<@uK~��_O.!��3�FI��h��	���c����&Kx��c�3kvK>x!�
*DH�����F;VgN�E�i!�
�����������<u�Z�3�j	P���cuOl�|�`(�]�va	x^ �&��Z}EC�%,�La���f?���p6�gv��N���a��5a`z_\8KY��2�@.u��/[?�O��aYF<L_�p�P\���kL8���6�P�)&�����"�����|	kX�*\!s�X�0[�-6�����"+��	�0�l��
�3O�<��tD��chf����xl0�c���eM�z��Z�7�y���?��Q��TXTm�E&�����Y���zv	��L1�"�����P��7���O�e��g�t!zo<��43i_&��f�C6u]v��6Z!=��[Bf�d����;��{(�T�8d���[m:�
?���������i/�h���9�Mg������g�i��x�qyZf/�L�a�b�Ppm?�t��������#��I��gX����\����d?�������;���;����8Xn���t�aIK�Ef��������Y�Y�"���0m�����D�S%n7���1Q��t�%���m^I&�]-����T�v;��1U6�=�lvY�}<2�tM���1wp�my��SR�8�#(s?�#J�HD$X_D!����0t��F[X�P��-s���$x29�A���J�WDI�����Q�KQ���-pX!�a?����
�F�+:E���P"#���;=WF)p���<#?l{E����j�m���.���;zfv��a���k�������Y�R��b]�h	[T�n�L&2��-C�^&vK'����(p� n�Jt	�UneI��LqJ�
��_-���>���d(#�"�P�����f�&��H�]b� ���Q����##�]v�ocL��a��f���E���C��h����=����l�Nl�^-���Jg�y3E3��!kj��\�@�_d�-�B�BO:t��0(�����`���c��GV�CEv	�tH���p4��N�F}a-;W�_�C����m�Pt�����n��a����v�c����/���T��b������,V0l��3����<rq1�z0����n<7~I�f���|Az[H�|���$�Q���i����%���f����{�Ov��^�)%�5]�Q��k�/t���_V��8Y�����d�%�m�Y�~�mn�A����[h������Q�6�@���L=/�3�����6s�Z�9�hW7Z6��hX�m�t����xk��C�N����8��3k��j��Jc��2���ha�
���Q�e��6��0{�NA+���BD���E>-5���T�l?D��w;���S3���6ma�Yi�IQ�&�%A�e[���!x!���������`�T��o�����U~6BF����M��`ow{f��&$��"�{o��E�� 	$O���Q���_����"��B1��]S��-\D����&%�c8��\��?3�p�,�bj����s�����YM{�E�F������e#S� �f4�}~����w~�	�`�F��}�A��NXp���� �c#B5��
����G�ECX�AJ�$!�M>NDD�c��LpMS�Ij�uVd�G���S�%o�q�=���
F�C��<�J���E���b�/�����M���#8b���I=
���3������L>��L����{(�'����#Vy�8�� 0Q���(���UB�SK����#:i�1��s���oG��.����H�a���q�������"~�����6'*�%��2���������1�������d`w�p?hy�s5��FoW+������H{TG�/��9��C�Cp���?G���l�;B��)"���h�>��\2��Q�z�jI�C�|4�1��8�d'���o�I�~r>��p�^
	/�,b�s��
E_�@=:�P�
�7x�(��O_�����D�����=�����=6]b�B0(��w���ta�������g�5:��!U�M4�M�n�/E����I@���[��A= � ���H
������c���9JC,�����>�SR�4�!�=A���z�~�Lq��<"���A�3<Fla��@�~j\��)$ '��c��R�.n;�M��1�#s<k��Ed�����`��FD:�.����2��c�c���w[Tk�yQ�����lt!�yu��;���a��#��� 	"���O��)t����"$�HE��AZ"���}���o�����F�AV�Y]�!���+P��n'��M��5����9n�Y�82����Og��#�"{���t>J����IP�����ggHIS���*�l��g���b�����O��=
�8(*��%Yq�����D�31)���#��Ja��[���O�:2;����6��*�}
���Zv�t��u������1[���B�t�:�Z���O!�{��Ge]Al&����?�1���"�U?_����	��?����"�q�.�]�*�L��F�5<C���*%��w����)�b��%4@A�5B��w�OOJ��!|W�QH��w�F'd6G�������#��\���������}[7Ek�8T��Ju���o]�J�L�*y�#�k!��'�	���:���[��9�<�7E��'����^>�W��u(6�nd/�BG���:���eDU�A��~b#����Da�1x��SA�k����� =Q'������Pp'�s�M�{i���C/���v�O,����?
'����=#����a���$�@��4o����D�������L�$t������T��J����].�[�����Mno�3��q3q�8���/<	Ie�^GccB����J���������q#�r5��$��~=�	���>��8��D��{�����p1�� ������1t��l�)�)='B'H����E�n&�(����&&���+�9����
i�p�{/��o:���*���%���������	�}'!;�:�E�PP���&���z��?,�g��u����l1�]�G����zO�����vH}W����.�O��	�����d8������G�D�D���p �O��J���c!�w�����w�ZW�
R-(H�R�c�vr�1�mqu�i)p��'F$c�w��7a:{�t2����q2(J�8Y��<���QC���?��v�D����u,��I`\�
GYg����+
B����������$+!���m{;��Gh��^���
�-?�7���%������xy��&�}��x�f|"zp�G�	n	��]�y0.�;e���pr��?��A���~�M<���#��]�M/[$@_�5�� 
��N���4�"��@
�F��#�����';g�Ot������0���" �e?�s�$�����E�( k~CtJx4��'p����-�J�19��7�����
6S5�'�E�D$H����:y��]�PS��8��}��c���`Jl�B��"�?tKl����L�D]@���}�>C�����b�������.�����XD���zy���<E~�34����	�����'��^bt2D���EB��E��=�h�Q)P�_�7�K+���"�b�g��K���^�X`�3�7�-W��6
oM���khT2��;��|)�&�����N���+�,����C���5W���Z���F�M1�q��Q&^J	���S��xi��}�����
63I�\/��c�JE!y�'��d
�� ��#�M/B+�D�����#a�buE��Y@*% pY7	���h����v��|��Gq���w�f,pS�����`)g7C�"�(�&"���]�@\G��"L�
�-�[	T�k�Y�
������p�/���=R��u��FZ���FVu�Dk\�Au��)[.Dz@�h}q����v�H`�����(��atp�,r�_?��U��Gad/��Z]0���{��� d*p���������N�"�k�NtK$����/��H��:���R�H9�M	���L�fa]!2eX��J
uH������[�0��X�^K�c���6A�
C0�)�::��_=�w�#���z����?b��i��'�6���(�"q4�#@D�]����:�x���TPC���%v
���|���Y�;��f��8O�v�Y��������@^�����"�x����p#��j�(��O�'|Eps�����\G(n��x�K,}$��!����B!
��P1���;�Ux/�~7���q���>���;Vb��r�P���������H����!�O����-�i.��
�|)GDd�"�c8����IPC����.'��7����8�TG���������4+vk
?�_�6���[��W�����N����8�1���OC
9�
\��<��R�����V
A���*l��Yy���hU�BdY��c���6L�a�?�_n=HPa�B�^��i��T�x�L�g���*L�0Y��2W
�D�
R�]��v9�:;Sv�V�d-Q��������&o�]Z�T�2��n*{l����mo5�=�1��*S�e=,����*L���������P������q�QR��]�}�0|�)�
2�W}W������������Ogr�*�`���
�*�"���.%���*���q�������������~C"��T7@W4w�*�.�����jL`e��S\�h&U���P	]D4���30�8'���j�;�����7Z8A���e����3�%�R�����{l0�q�:�k���:�����`1�)!�s��]~��1CB2�7R@��j�*$�}��x���:x�������CZ[�U�k6���;�cO��\j��5�P����Q���\���&�1�����jK��/�B�^����l���1�E�yi,�7Z'x�}���V�Z�u0�,�
�Z�p����v0��R����2��4�7z��]���|cK�q�^C���:�b�z�����W��0g�X*���Y����,����:�~�0��V��C�������*|��j�4�5��UA��B7����?��h.T��������+?����?�t{�l;:f��j3&y(e_C��(Z��.��'V(������ct�,�����5�i������]@0:��u����x����P�@pB���Q���b����W��h>����K���������h���X&4���-I ����Us�O:���U3�����C�[�Q����Plf�U8������~�J���*[��UN��%V�-;�qX���Z�@��Fv���p�
t�d��p"�~=��#�}�z"i�G�Y��S������2mT��\���c��l�a��R1�\�M�DI��E����#��������.����j�;u1!x��K{�a0��x��;�D�q{�2�zl�jK����
�+���#0�n�`	���c�'��[����	�	�l�TL����&|B*QR��H�����Wd��&�b�alj���Z��^��ZN��FO� ��=��(f���]<�yxoF'�/4U�j�	��[-��[0a�\$X�xt��y���N�����k�]���>�NT#4�.%���?�����l�}��ta����h�b��$.1o��?R-�fO�b����7�)�)�L��&hC�I�7������	��&����������Yu ,�g�p�1A����}n�]t�h�� N:�mBz�����_�5�V�������-5G����7���gf�K��rl���_hrIV
b"������h�"rV���
���"��AL�5��|��C�W�%�^HT`x�^��=,T�0b5f��c��T���d�#�6l	1�l�Dc����m�����Y����O$�n
��hs"D���X�	�����$sj�)d+���<�Pf�f�&xG�� �A�O4�ls����>��(��{d-���hb�F����+J���L����c�	�������k4�oB( 8�v�db��(�7�p0�I1�&pB<ex�E����|����>Y�������-S�
�Z���)�������w�.��!��-�����	��Y������e��m�����%SKbI:UD�j�K�3�wQ�M��m�4��;�P���f)�-Vt��������gH4xO���Y�&���M�g�
�R��E��)T�X�]G�C��� ����{�%L
���X��,H����/{x�#��Y�
��$�"�(���A�0�\F3������,T�P�{83��&m6��26��m����.x�l�q�u�A��p�C��S����?~�0��&
24_i�?����(�M����#�U�5LB�Qu���o}�v��-��P�R"�2� `E�]:����W�i����:�z�������^,���S�hX^���s����������q�8�6���O]1$���2���F5I/V������D��5��d	%PF���&�
���X�0#�n����v�5���1z{`d��.����B�����X��v����d��j0�2��*�������b�D/W+�aW�t�Y��!�4���[�Z|�(���(:�^������Fd���\��:"*��
� <3��vA��UG��yJGC�n�"Dw����?�a�jw��,�����<����!���Ae�"����	��Y��tjL�)���:&OI���R���JC����l��F�����Y��
�!�|������w���hgx��z�h�y1$U���uM�������]����4���,#��B������bGF�0L�-zz,���6���������}�7(��J?d���^Qa
dl���s�iT���A��D��n��|{�Ip��??���� /EXw.5A�`�������������ag��2�)M ���s2DVZ.�^���j��5w*�e�f�q�6������E���X0�����L�d��$z%b��&T��z�rQ��-B�;�L'���zb�e~�)���B����>��X��o�J�����{��B;_�yk2i��H����N�h#�6�x.�	��U$��vt�#.&�Mz,�|��+�](��-Z�E	>�X��[g�W
�����&��u�
h���z�m�'��hg1� �	�d6b�{{�- <��8}�����O�m��t�pr;���	*��;
����d�����g�[��eX*PW�ld]4�a�v�s����#��@���AML5� ��0����P�w�������k#���=�00=�x����B�d�	p���R92^���L�F4��_B�=����l#RU�"9�U��uc!d~����l����;���d�����q�>D��#�&6���44'j��#��0� �!S�w�������!'j"��0�������0� ����8�hQE��#'$FH8��V�ueq0)�0�p�HHw�<s��(o��-�r�H�)��V�L"Bk������]G�Y�� ����B��P���0�P �-f3�n��&4��kvt�		F�^�!�>y�@&��0�&g�e3E�H�����4L�7�Q�g<��:h�8!���HV��p<��6<!�UG3����v2��@g���p��+��x
}W��h�8l���+�Z������:���<P96z�Vreb4�/*���>��1�J��B#���t�������Rm��nd�R��`"��N}�\t��m�B<�]�'��1~�5vX�����N�}L�5��tk����N�����X�hkC���m2��I�6�G^���F�H2f"�����4N!�lv��?�\���� ;�_IPu-|F���U��
����8��bl��S� o���+6:�=34q�	K7����fT#��K��q���`�a,�i�'>Q�o>b���#�%;iA
�R�("-q;��M�+�B�����6�Q(��~e�$m�I�8'���1��HJ���^���a��"�HV����`�9>��M�=
��7��=F4��8�;���:j2X���n3�6�����K��\��� �����^ 7�F$�����`_�q�Qz	��-�I��1�����c��(����!���q��v�~	�g�JV}���=�'���v���5���H�.�N�������ql�?Y�x���"��8D-��$D{P��x�����sV�e'j���>��HwU�	�:�i�B�I��b��EL#��k_a��i�b��e�B,L5�R2ttr��k�e
XL���@���tl7�U����3��u�v
�E��4V!�L
a��D��i��#��4L!+/�qq�4D!�j��GK�4i��)���������d��=�b7j�^�9��s�����g����_��QwQ@���I�1Y)6�s�}vK��������0e�����~��P^v��Z�������vDC���9�2c��u�������uv��5A���
��/`p��40!���qI�7�T-�u���%0D�GWz%�7Q����X3i�LQ��;����]iTB�gE�Zt�#Hi�P��`��@�Amg��
����g�}
�gpq,�x�G�aK:���F������$![�7f�X�6Z�)3V�02�k�yHARH�8�g��Yg������4����iPCW�o8�b(-K�5��g��)��~W��F'�E��R3j�L"��N�R���@c��lk4���_���U����O�	�ru�e��F?���4����i&s��mVA�+�0�Y��LE��bB	�������9�_�YF���9�bE�A�"�c4/��1��G%� �b��p��$.O"���������"r���L6�rc�$3����pP��4����3�r4��Q�?N:s��CJ�
��%k
����J�-s����������I����������t������eu�H(D�`?��	�[M���/`���}n/��\���X��Ur���G,���wn���@f���"�������n�.d��^\q<����h��8O��Y�d���1�����y,0b�P\��>T^�����ic��,�����_2l���a�*O��������km��9���G�\��;HL������Y!�kw������ ��P��6�������2������3���X��tv��n��~����'-$��f��	~g�_�k=)�4���-�,�J|?N�:A *�W������1>�3�9/��E��%�x"�x�M�o��kg��[2b �H����A�����(�<r[������/n#���#Y�?��l4�l�e��r�G�]I�`������e����H��Z�F,���0j�:����SOH��.4R!��#98����\$*
����K
D��ehB" ��Z$$�-���V�+�tZ-'��[���}�r����x�[��Q%��<��w�e�6�/����v��(�P�����_��j[����E��TD������*��� 1����9!��J�����eD��7�}P7	*����dZ�i!N�������.���%;	k�q�Ze�����������H�Q��~�x���=��T5�F��3e����0��e@A,���������J���Y�H<bx(�p�@XhK�_Rr�����x|l�3��#H�%��,
2��ZjM�b�$�N�K�N!�
�u3
������+��?=���;��S���Ajk,�V�$�|]���+�Va��oh�Y�M4�^F�i�A\V�;�Zr*C�
{�7�t������:������F���f���O��h��9��	�Cz��(���F|�Y
��Yy2��e,��%f�B|��]�P����,���g�����Kf���u��Z#'$#_� ���Q-��M~���CN�����Jkq��l�g��.�����b��	�&��"�	-f���qmB��
��RQ1���@,z,�:-$N���V���_=4�'�}@��r5L��=�0v���'�O�}P%�)�7@�mA�����3G7�L����3��������=;�M���O\7?�����{?iS�~>Q���g�i�hS���5�����h���z���z7[�
J���SS��[��S;z�"��Nh}a?���o�
�<%��?w�"�=�$�3��.!����=u���~g��h�k��H��"Fos��kv��hi%�A�j�������e�@�J2ie��m�I4��1;4�C�D$��%{_�&�&n��x�h���^���k��xG��l����4�PL�#��"�FVA+&2�D�	����lC�=X �F��rX�?O�5S���E*&%�����7o�m�"x�|F�)�o#����bw6�������=�;�=Yq����g���f�F���~������k"d�!~�yeGF��������hr��R���}��T�X��4�I����[��t��y�0I����v��~���V�A�S�7��Rw���|G{ ��,�����Nc�;Y)��i<��u{�]S
��sh��#:@��U�h����������H^�.�r�m6��P����\g��������?c���F�zM w���k�m�!���.P�����2
�e�T(�v�Jm�!��2������K���#���J^�~�#�d��Y���LV�B��G�eFr(]1����&��u!�
u/�#���O�X*��n�*o
���et	Mc����#p�OD�FMiI��x'')v�2}6�f�FT��{��t;������U�OV����Q@����-��_����N�������NI>��}n����b$`,�m���?;�@W��Z��6�R/.I(�m��'�H��?C/�1p�N,�E��
8�B��h���T�$"Z��
�i��<A�T�G�����Z�/�\���|�
��'I�O:'6�=�=��Y���O�#��?����ut�bx���)AfJ�?uR�g�%`�����,������E��jOB�Q+t���v�����N�����wO���M�gQ�������*g�n��	���Q8z��_�N�;�;x����l�r�q��������&�}�@���	�3b�������
�u��
((H�6k=��-���c$����H�Pl2j����PJ�NJ�8c����*��(U����&Z�@�����S�D@�p����`�I'(����=Ib7�<-�:��=qh0$`M0rB9������h�T��(%���2F��y=7���rs6�������@zz��K��	f����'[U�4��K��#�Tc��p����A1�� �^R@����M���a�E���>��~��2��������	��B\�3����C���\�e>�G2�o?e������
r�������B����U����a?L�r��v�w�C��3��f~x��qJ��l�xg�'9
��ET���wJ��V�A�w9[�P��c�����we~�'z��'����0�J������Q1	X��Y��eF���[D�~�l6r��B���$fd������c�@���]b`�Q�����d��_�drjCkB��q�(Fq�uqRT���V��=���ud�@���~��`�c����2�MR�;x�<kN����}-F�=QH��df���6�n�Ox�H�v>��R���>�`�?�ws�[O�6X�l A$`��Y4�1� }y$�9g~��F:�c��F>��x��Iq�����ih��+���`5h��^Y�3D3Me�A<t��>�^����Ptv��[1%����~/w�*���+�x/�2	<S[VFa���m��H[�^�eV%�8p�/O��������`�k��i���Q�{Q�f�������Zi%N����A���>F�P�P�
�.������+]����{����#�)��7��['f�������=�BP������B���  ��Mfp�s|��S1|��=����O`f����5�m����Qy!�z���j��Q���5�D+��_���
��n~O{�	��R	�'��E�y.G:����C5��=�/��	��2���3�e���&����5����^7,v��S�9y/��!�[����T���������lK�Y�{����k�Z]��'��u5������[��)�{��(�
�^d��o��E>p��~ �����z����Q��M&���6J�O,�{����gn�{#�`���^�~�A��#��{�'j��x��/��Z��_�G��	��H�����Ea��\5:C�c�H��;Q*{Q�5��FL��{�XDp��"�1�����|a��#9�B�H���_�s��3�F����P�6���W��g���^�������y7��O�Vi$�����^4����M�2�'�/~������gQ��D2 m��f��M�xx�,�=�@�wF5�o �����	p.��Q��x���E�+����A���rj��^�-��M��z�����x�/���:={elwT �8�����E"D������6�A���\������N��NB�������1���p<�W.�t����T����
����l�xk��)���K��N��2�.�����1��vr@`B�	���h�����C�A6�{���92CT����u�B��]�3D@?��� ����(����(O^�VBk�[!�QS^>5AUT�E��A�1�z�'�6hDooI8����yS��W��i�&��s��������G��_�������'G��@�Md�)�Wv�� <:J����L�������%���)��h.��g�s;�
J��Q,TN��;eE,��F����O!y�����EIa�Dc`�P�w2�s�E����@�bh@������!�9��%�6�S���<"�����.�P�S(�u�{e21��1 �XY.���.BJ������(5����&��4!u�b@������Dp�0�b( ��;��8q |�D]��,�� �>���Q#��~f��.Y-���1����+A���#P-�]��jw�x����"U�%D��Ak,��u%�S���m�Fd7�0�(����J����Xr�F1� �z9�,x��x�����Q�����pA�ah)E���@+Hk�%X�=&�[W��V�	>C.2��=���9\Q�I��a��b������99�Vd_���N�C��,3�G�|+{�<>d�Y�W#����|�����%G)#���8�38����I?�IW�f:��*�k��DX�O��*���R�6��^���h��Q�.�3Ufl�;$���+��>~
�j���$�`�E�"���QGI��F�����wt+=m�hT>��A��K�He=?�cz@��x4�F�o���)_y4�+3\Q.$��x���1�Jl��aR��u�>��Mys
�$��{���4�*��O�.X�xC*E	e%Y�m��t���FI*�!�'9�H�����~N�Q� ���"����� hN5U������9����8q?�c��.��D���C��5���>�!_�n��r��' -zMN^o0�����.��Rs�;h<��9\���|��o��
h�j�_�r��Er����'%�V��4��%������q�X���"����R;r��r�p���'���jc"D5z�����	��I��M��c�	�_�r^�����3O�T*P���7t�����d����9�/�6�;���c5f��8u���%^�C+����,���Y���������r�u�,�P�S���H��=6V�4p�Z
X,b'�^+qi4�#4��=�{�b���4�6��6u�H��J��J! ���%��S� %���q�m�V�&U��Fiz'jl)y���s�@����i�E���^u4w�F)���N�A?�N����E1x<ZDwq������������
?kyj��}A��w}��Bvf��P��~��Y
W�R�N:���"�cU&���S�Kla���4W��-g��}Q�nR�Q��02�Fy����e�c�pD������F�S8� z�
) k�
Bd�����W����0����=�����5'5!��
��"�VM�jB�����C,�^1�F!���F���G����n�]�x�i�������"tZI!(@�D�1�jO�H�M�?F
<!�_)�jN����|�R���Z��ZF=����+j�BX��HE���VT�y���{x{��e�0����� ���Ae���\=�B����ahb-qR5V��4k���P���	%��v�8i�j��J�$���0!u�R������	j�QNj0�;�U���t4���r�w��P�1��*ar������|���62b��y�)�Tv���Y�����^nD�����REy�j���o�7����H��<��4�[I������X�5��r����j��1����X��Qd�P?��+���R��V@�-ic����5�q'z�vl\E	�}��
�-vP�Q3��4�,q-�	�b�@5��D����,�p�W(�
�.4�Q�<+��p�Xh��E��=�O�Q(�����8�#���nL�&��8��������K��T��J+;����Q}h�z*P�("fp�u��psE�3�w�h����5�|���Q��Y%�&����xX��=�Fb���iQ|h�|K��!E�
�=����h;��oNTF2�J��c��a��=bS�$��������P��E���,�����"E��@��b�$�x)0B��<2������ (�_�����1~�UA53x2P�����	'{���?��wQ���J��E�E-
�;����b�v��@����t
o_������������H���(�� �M����B�-���mt������mx"�f��'5C��J9g-��{���J �K��E���Q���a�p
�������qq[D�j]�E�{����fP����-K�Aq�Z�������Y._5�-��+P�!�c4c,�z$-kMCf���P������7�"Z �^5�*w����V��M�����@��������M��a���"���:!&�n=C��Ue58�NQxC(b�Nd>C���*��h��)\��i�����mT�R�t�G"��X�mg���X
4ejI�`���Oq����-���FU&�?����)?Yql����_[<�J��iJ������?�=�F��6��x�l�=��$��w���2�m3BK��%���*��w�BL�6s��]���b��%�@<�6?-o�d�h��B"��FE�-y�_i�2
G3��Q
jTf)��}�"���L[���-1�hL��h�Z?��Oa'�]~��	~3@R�����H��S���+E���R�q�k$�����xd��z��Z�^��,+���@hC3�!�u���K�������,�q��8�i�4k�s;?Z,��E6�`u����*2�����rg�Kn�dB����8�!��Jo������2��{�����|����
��+?M��j��N����iU����8����fv�������}�,3���W�r��g���6�7Tq;��@*����?�{JQ�;i!^`7P�e(y_�u7iA����X���r���VE�$^��X�W"�8��/O�{r��1����n�U��K����T�C�����Qw<���	�E	��=�J�)#H�J8��T�R�p~��C������Mq�	s��#����K�[�t���n�B8�
�[�N� �^�Q�q�DGvO6jz����}��x6��XT!��'���zh#?8���X$��_@�=���.$1zt�:t�+ D�tl�'�B�\w��+��~��_��P���~R�]Tc������v�Ul8C����/	���G"�]�m4K�5M�����|3Ie�����j��w����`��'�%a,���vcjr����`���zKCk�Lt���;}U\$��
_,�@��6?���O�9��|�qq�=�UJ����=�T�{����m,�(�{2�E�R�p�����{�*w����2���O(N��	�PB�saN��=u�-�D��u��z3r�a	'm����]����4����Eh�i7���!�`O�H�&����v�$=#(����H�����x�TV,��/q�e��+�h<����p-�o:�Sp7@!���8�H��O9VX�\��%��`��0�
c����v�e7��2�{�U���R&�h�����}����B�	�:�\+u���)�]$bo1BC7P�4����Y�Q��o�'��?����j�b��q���
YH������)4�:����,���:�A��{�L
�����#�}�����&��|�j~����;��q�������:b,�x�m\b��u��������UX%��S�+��2����(��D�s��0D@A7F1�,���]u�Vf!^]?�����)��)g�����V
1)����'��~O�5���F �N?a�<r�CW�5�Vd]
�m�'^���g����y��g�� �&�`���y�Fb��d��S�(�J,T�
�
�G�2&�%������g9�;�;.s#��F2�5L����GU�9�F>?�&��$�]�D���{"�
b��W�F�1�4���71��	�����#��-BU�(�w��@j����-C�/�c<����(q����j�d�%m�������P����B�QiAt���sDY�9�c�����a�Bt\:S���=�.4��8Y(�M�������+�Y�y�����]�8P�\����H!���=��������$���������cLd�w����F��
mmI�F��0!G]L2��x�'�]�+2�	�~4i��a_�"v�00!����V��H{�@,Z./VYh�0Z�X��
J����lm��4�����n�y��s��RU�hA
�Q:���!l|#�7���}����S����a�_���Z�>�z��*eU�����*��< Q�!�Q��
�:�w��Yw�e���deH(*'A�;�3�[y�-J�4Z-��A-/V
������@z��3��@������2>��t���}��B:�'��|F�U��hA��"����!"#��V������@�a�B�����v���c����~r�����!9��u��o�|���{�[1�w�Hr:�Vhr=CS~�w�K��F���V��kF"0�8��3��6��~�]��V%�
������=�%��~�.|�8=(�Z&"[�
���������.� ��0�����j���������#�S��$rD.1i��0�L�dW�0�I����4�d�qz�l1��1�yFR���"�W���?���N.��*�6h�NhX�[�L��� �<2��%��/�nWvt��	�%�:�n������
C����������j�S�qEo���w9Y�(HF�G�}���(O���>0��w�(�6�	�����A	���1��L������D���7���	IS���Q�#����RQ5e3��d��o	*��5�J��g�oT�|Fq�q��=�/�b�P�'��6
D(��XK������d�#��4���hQ�������n9�*�1i�
�H���4n|F����8j�9��j�iX��Z`L�	}��]�F?�FoF
	�F��q�f"0D�C�����a��NXr��#J����itA����e��q�@����u���-:�g�Z>�����
��B��a���5a�����"��
1T��4|�c#�� *`e��w��"��� 
4�����Q���Q�?�\�Kz��@�B�$��!��@P�������oQ|#�(F�mF�iDB��}?�;bff4�Kt{'�2���p��Oz����".Zu[RVR{X�/5�1>����Hc�Y��b'b~#m�L���Sc�$��Ad�i�A`��xq�� �@���ei�aa}��Sh�u*;���I�&{�X����=[~I�P"	��n]JZ���/��	�E�_�����	�T�� �b|�s��H+���xV'_��q���f5�A�m?o�S&���H2�F�i�A��:w;.�<h��oOd&5���Q[I	���� hBq�'�`�V���,�	"�d�5W0��$t��v��!�4����>��W�����b1�����&��*��j�r�g ���3��sS�Wj*����oLBy}�S�
��*o��t���'zpGhj5�/��DV�_~GU�Nv�`&�\����I��H�9���6N���'SR�Q���n�o�IF�5���;���}������,ndW7�I��I�A,qhF4�W�<�0	��McJEP��4a��sLZ��	EM~�����g~��
�����f*����1���2|!wkeP���%����a�B���
�G��W��G��J|������rs<Q��f,�������-[���^�t��I�^G��p������b'L���/�;6r���f�eDC*����������Ec.�/�^�s��"9����=-N@&��C�<���|F��75�e�
�q~�_�CZ�}�K!7"�R�%"�n}����|�E�z+��>?{��$���U2�Y���Y�2"y�V�@���0�������A��6W#$�J�z�y�S\[�=)o,DlX_@�X�/�����Y^/��c19J.Cn���;���I���^�kx
�u�X&_�H�LX���J���4�XI���QX��Gq�>�u�9��X�q9{i��V��p���o(�(������*�A��Vi�,\�N��^=�7Zi�����=.�u�i����^�c�g}H��rH	��au��gNj�#�K�.��p��s�~���@��h#�q��uP�n�+��
��B��
!����Y�M,��PI��v�"������-��@j��lp��@h���	v.�rM�J�[�9���S?��om�&�+������$�4�Z��~pN�;�B��eX�}XkA4�e@D�2g��A��\FEXK;#�~b�U����1Y��o'�^����=R�;�
-BC!��@@�J���V
m�r�}Wx�z%-�,Cd}�+�Isi
{�_����j��[$�\��R�t���L<X�i��xL}{�8qa�D��m����.�:t0
z{�L�{�\����{�V����i�ugP��Y�RM�n�XY��]�&qk�f�o������[����\V|�v��0��l#�t�h�X���
d25�XFJ�u���V�8b�����H�?���]b���n�E4�+��W���&CI��U������K#y.��
�TE<��`��i�Rg�nH���1*�&M(]FA�$/#��l3���7��P�I��a�^:T�b�$��|������P���~�X$�q�6��U!�'����T��
��g�u��������C���~���N��>��8���3t
����V8*^wP1�� fC�����#��Kv�2tP���}H��#�P�H���\�8���i�D���������~����,A"�i�9Ew���5!R7���D�	{r9��5�og��w���.���.J��C
���
�\K8�!�6����dv
��^�����Z�'��
�wR��k���o��$���K��
\T��,W3�G�:
����,�!?�����H���d=����'{��b��*������;��]M�����A3D'�4C+1���x�~�/����������m�C1�Eg�o�����uz��V���a4���@�D�q�%v[�I�F�������(^d)f[�{���1t�s����}���B�)���J3�wOb�x��(ht����.ZF�i���P0���������� �gg S����D�Go�����L��kl���Ul2TH��wB��?B5�*��c��kD���Rv04��	���xo;��(G�4������b��Un����������P�5v���
lh=�<�@+7����A��u2�����>��U�����9#�=rO�g5��uh�0��#��>��/�I��m���b����u\��A7i��:s��������o4l��{�gg�XM���6���{Z��� 5=!��RmT&%CF|���mC�;�8��X��4C�3�B��
����w�!��6���'�x���)`��2fTw�9N�����j�x�{g��#��Fg���Id�#�w�t�}d���4%&a��{
��b\����Jc��������p���"#��M�D�;������i�h�L�D9�����1�j'C��
@�2,����:\
qT�n,Ul�����.�s�@h�y�a
(��;8Yd��rJ9�)��`�4�f������Zl[���a�*����r���<1�B�<	h4�<iC�
S�B
�(��j96���d��Z�c4�����b�4k6-�G����<�U�d��PP��0�d�l�z�B�����qbL�6�b�p$B���j(QU���*WD���6t�x�U��r|�]�_wx!j���Z��*�(��D~1q�u�S�1I�9�yV�UH��F3�S?�Z�����l�r"����T<�:�O�;�x
�N���������O�LqOp�	UC�v�����{����E�������T1V��g�!v����������q�}
�1�OU�'�r�lH�q-�����<4��x�l�u���jt<��������t�� Wn��<nH�u������`BsFTw@��zp|�����������V]�]M����5�������@R�*�
GO4lW1b �<�fr�w���s�U!�����S���=���~F�����PZ'�0�/�k���?�	���O���D���o�[
������@=b#��S�d'`��Y��l�����!=��1O�ww��;�-�������k�r�8B��y2?��Z�%��!��Ea���Ao�M�R>��j��l���G��iz�P��@�������l�`���	�V^��9(��L*8�v��!�h�xH�V,���"�`���]�|�	(be;���$z:Q?�(�Yv�	LpJ�T�����%�md�yx�(��]D�v���n���x�e��I�6;^hV�h�Lt�f+qhV�W���
8j6lEBt�L��a��"�3I�Nf`??�?\�U�T��)��O����[:�����F��c� ��c�`��e>	���+d���g%j��{e�"������=�"r�L~��zop�?�n��\P�7�e2[���{���)�?�2�U*1�/������g��0����(	,���|/w�O(��E^M�/2o\9�OOz��P<���{��~�/�b����n�r�����J�&}�{�yC��~/�S'Z_����V@���h����S��q���5+P�����~��	X�������}���a'd��������	E��Exo4��DE�����F�
j�rm�B���GfO�;E�v��v��R��:����n���B��������Qp�{�1�� ���$5]>P-S�M���F�7�Kd�1�{�5���1~0�*��3���{���*���nD���*����^�A�|z�c�-�W������1�����4������i��+3��	�W��G���Y�i��7��5�n�5���X'r��6Y�����~J���7rq?��Jb�+��tE�}<���!���2� /Sy�M������5�%t����7I�'��T����yKd�I��������{u��;�e�VO}Z��
Ym��G���!�r��S#�IX�=|�Q@�+]�������l%E����?�L�:�l��I�8��kH�	��c�Z�G�"���������F����K��nk����+��t�i!s���Ff��}��zk����K������MN���BO�DxA�g[���$�����y�(@���a����dz."�=-���b��Jr������1A����HQ9����2��#����J�h�Mx���&�Y�RG;��������3���7������<��w��y/�5����{��	
������{�?��������E��mo%u����yKUVl����[��=Pp4�
���~k���o��d����3�����b�������pO	��[�}�c]+Fc���M��LH�����7C
��w��R@��1_*4�%Q"�-�� �B�j	T���b���%��'�N;���d�p'�����_�w,g��]�����]<�pO+��W�g�^@��6���0��Q�u��hNS�T|;��{�[&�,%��Rb��>u��=�	u��2��J
�p�%z����n�x+��[�Y�N��q-����%s���'��Y"o ��YJ�'3�uE%����4����P���i����,�B7���m1aZ-��H>K�s���2�������
�H����Ar����5F2U�+3;K���c���P���G�0i��Pf1`!�Eai�N�2���b�����q
G���P"Y�w"%���E_���y�%��4w|/��PMZ��b����I�R��gi�M��4�{��7�mU�Z��BB�b�B������vI�Q���lq���51m��	lq���������zw�n[L��s7nq�s����H�2�����C%�J�L�%�������DeU������`��W�����Q~��U�{�{�YNw��l��V�����^���� >$/��H�9�T�m�!�	Z��yd���^t~(����1e���m�y���WuJ�.�Mt�mF��i1��e1��]��'Y:l%��M�@DS\o���e�bB���D����K/�����>G�����-q�AZI8�-V����S���$+���)������������9�����mG�J^V��U��fe�����#�J�TZ��4ZW�W����5rR/N6?2�0�)�:S%{���hqLb ������"��_���.Q�?�c�W����w����\�!��!J�{e�������{�+�Gv��7���%I`e|�.>��Q2V4K.�J�%���ov��{	D�������7��lz��p<%�-�p~�
"��1�6����7D/��r_�F4��I\z��{����v��4��h2Q�� W�Gg����fp^���-�C�!����k����L��k�{��������J�q����N�i��1d��hR�e��=&!GU���N���w��n(PQ��@c�����N�x�I�>r��^hrE\�Z���(�,����H{\�������/��o1�nR��QQM�CEW1l��T�"y[	�E�HB����n��2���+�:�jd*8��,BI�>��t~�v�������m��*�9���`�:���Y!��%��nx����A��P��X�����8*���Q~y5��\��AC�jl�!H����i��8���hx���q��$��_>�K�/���{��4������������n�
�S9LM^�:�~E��k?k�;`e��z:9��>���L�e;H=��~�����7�{3�q6r�T^9
�C'�5P�tl�!��<�Lu[����aX5*�������K�Y0��3���gNn�-�/$,���QDs�j�����<��$�)�������)��A��j$B[JWcb���I���SE�1E5��M��cv|D!D@���0G
��L_�}���� u��t���U��&���#����C%��@�����v� ��kv���}�.���?��{��Oh
�� V}����J�YE���Yc����r>u/+�
U�������DNG��h���B�mF.���j�B��E�����~����3N�{������P��Hxt�������}�'����mq��������Z�}�f�c9`���Y�V|f�b?H%�4j�FS����}��"7(ta��p�-��W�����9V)��$B��m���w�*tV�	���
���u�>�Ux�"��d;�5�f+�E����%��f�h=��"�@Q�y�g��X8)k���B�:|Q"�d�La��3���M3O�|:���#�RM�52b�A-����d����Uc9hGk	���J
�jK6Tm	}���oA%$�X4����L����+�����8���n��p�){�n2���d9�o��M3b!#|M<5=�����^t�;����v��
��Q
	�$xQ�D������4����"A5���E:�8�-)*��+T��#Rv3��R f3�q���%��VVrL���,��Yn�4����+W�+�5�2��6�!�Ap������@�4��H��J�YGK��.7�1�Z�]�]kl5���L�>��u�qa�����I����%�A�[�WJn�#<ky2����_���t�ys��mF!D���o��6���4��BD���h�B3���?hh+f��\���"s�'������QVL��P��#�#��^����`�`�G7�dqbB���@�\K��Z���|�$�	�a�fHa�:�q��
��Y�0��>q���P�6����|��r��#��CEB��Ay��/�"�O� �h���70��6����� h�%�a&�~*�������"P��"C���h��,g�3g�I�.]����3n *�\��A�S���������8�YT���b��h�}v�q�r��k�Q�/?h��VP��(��S��[�z�i���,(����%5�|O�C�R4��fm�6�&��2XGf�@��)��a!���+���YK����s?!�h/3(�Z:L�B���T�Cl����9%���������%���k�U��e�@��c����i+5Pn;��%v!���Y#�J-����0�n3Z`?K�~7�������b��6_#����5A���TV�����U��pO
�zb�����G�b�[�-��aD�'�A��6L�kP���,�l���{���}��p��:�Q������E�)=`����w�qEB$���TN�|���C��=6H�+�dD������������km7���g�v�wB����u�B�o^���7��U�r�EsFL����`xa�G��,)���>�������vO|���Q��K���"�g��m�l���$<I�,�6��m`��'���yDd�^���Fk�������t��X�5��T�������K<$������Z��^gRm�t�Ik�@�Q
5��3P��9�_[����3 ��@�BO �R�����������|�(�����4�3<b?������t�����������X#��<o�v�M=�2�R��� $~����Gf8��?���=4��Ij`�;A�B���|�Z�� ��/�
]�~@�eD�����Z�>��=����Y��_3'/-y�\�{�/9��6&���+ST�{Z��;BT�>�6~��:(a�'aA�������dWfPv�8�h���@�Rj���{�/!�����|��'���.��Z�=[p*tn����_�Q���u�
��	vv��=�43c������+\����#�
3���v7 0�������19���Q��n,��o�|s���'U4���vj����f@�s4�����6�`������X����]�v���(��	]_���12j_�e����Q<��i,Z�	xF�]�	�����1�N��H8}�U�"�0���S��M"&E��)����$7��YH����l��P'7
:��M��)���C�����.�)xoj�Kt����(`����G�e�	����>h�������V��'F��f-�)3~���sIB������dQn���r�h��0G�����m�m��9��=��8Y���~Y�1��x�M����v��2@���<2��,������kd��Kl��lt��p6�6���.��e�
���ws8���\we������D+93�����4$��F4 ���"�'�D�l$�
�u#��;������5���Q(k������a��19�Pp�WL4l�3��w���H��c��lp��e�~~i?Q�<���j���9�������@������]h$�Yi�m$�e���S���TX :gZ�gh�$
��!��q'�?TA��@�n��FDR��u���ox�/����C\1t�jr���&8�4o�X�|P���;��,����`����E��r���a���q����/��=�W�&�|SC�>���W��cy�h.?h�uz��v1&�LDd�������B.�
�����<�@r���l|0��P��aH@�3Rj������15�[��Gl�����F?�Y�I�Z1�7���>������>��X��q�h8>fl$���9zJI`68-���fYD���@�S3��Y�p4�Q
)�GPa���[x�v�o��n4r����s0�+&��I��fx�8�r��0��V���f���`�b��%g�p=
��+j��d����rv#$t���K;�6���S�"k�0�a�������K�O�=d?�V{r���J��'�����~s�G,b%	�C��Gt��}tT�=��3���Yl{��A`E��a�AGuCl���o�/�>��D8'I�2+��3�F�����j�O�Ub���
�3T�v��63H�c+�N��/!J� �����<�{VES���pd���!j�0!jS�B�;�G��w��x����^c:��`���e�0ej�Pf����Yiw�T�6��)��D�IQ1P38�;���Qw���1�9x*��l`�����`oU���^f`<���IGC�,B9��c��l���������#�,�k���<@�=��7?7��#�r�����]t��4����|Y��S=���Y�������'�����G���q���;�8��8f���Z�ID��2�f�%��3@�;�,�o���@��!$+��exN�BF��o�I>�q�f���H����~�S��� fDr�V
��h!�8x8�]i���Ywcv
EWX��i�
GX-�Kj0�k������_��o��P��4��-�C4H�������X�R���g��&�tp�zfD
�$�y"n��6������w�����Ag,�n�6�h~����&��q+&��
g�b�`����x���[�����S�*,�L>��,4D'����&|���<su�b�
�.��EX��n��~z�*������J���KI{,��Z�6��d$���s������ghz�����:�4���S����
5��4V!M������QG������#�2B�}>�s��/�8����=D�G�H[��N$j�dg�m���J)�3��g�t�G2!�����
K�����������pG(��g���
Q�����TR��(
u����	�O��sWz��L��e&A�$���$�=�C�`U���Oc�/z,]��N6����(�
r������3�EJ�c��#b�D0+}X�k�;4?����������n3>E*����L�2;�[���dI�~S�rm�����*qDlW7��jv����
ei|�d$A���;w�Y�5d���H�f{����
��Q��
;#�d��s=T^=��k���u��;OZ�&��b��l�iXA�A��z�RE��8u<+����H�E�e��&���}%�BS�e$��9h��>L��f����|\h�e�'��E���9�>�0�tn�s�/���q��)��v�+�Fh��J�
�{��<"�����(&�x��+Z������2���������p����S�2����+�(a��qJ+���V����;F�Y� t����eBbTe
O��>�[}��CO����L�Uh�)4�c����1}������a-d�M��w%�@Qp��/h��"t`���*�V ���)����Q�����(���/�	�Oi�5�Z����7��zQ��uL�sj�ZiH����n&
�7��=��#r�6V��
R�/c	�{llk	���b��2��P���n���gc��8c����a��m�lf�K��{�����)c���� zWvp	��/�E�j��i%�����o(V<!Uo�{���P�t�������
�Rc&�!:�
"�)�u9����<�WX�V7��+A~�W=���E�/�&x�e����MM�W�
����uz����	st*�|��]���>��%�A���P�D���,d�������a>���i��H����>nB;�2�L�)3D�	�H~���Bc����}c����+X�]|'���f��.�����2P�7�BH�Z)��^�E�lt���O�)�V'�?�na��������^�X+��������B�Dn���g4�^�+�.z'����C|�e0A&z"��J�{��3{���e�5g�P��2�`��frnh��0��q�����}p��!1;D�<(tY��vd#��9|�m����md%<�-�(X�h�a�-'!HT��Hh�A������F4��bz�,c�T+��HD�����V�����sYQ�D�Y��\�P��PA�Nb���������B��e�K���F�o��~�;6I�[i�"��\b�h\(�����m�A� ������ax�E�&���	����m����^����������,�=fZ�K�,��d����dD����I�������Y8U�;�|��w��k}����������l�z�4���X|'�zJ��T(���>�<��K�����������?!q2,|G� ��St.��AQh��,I��\�jG���pS�m8A�<�?A�Ctv�:�~���������"���Q(l�P�fR$����$���t��6t"F��fi����u?M������pQ�<Q��
2��w��P5��>Nj��(t�tb��%ty�C�vK�Z�7�6� i����]-e_p���CO4%��.A���n1��?�B���%���j.��������p�P��e�<'�R&��pUi��m���(R��A�?�������}�����l��<����G�$-��[\���^uu��j��r����-���6��y*�zlCvTed�����vR�uTG�&�;
wg�F(jyC������B���$q��UC���Z�]v4;���z;�����I�o��5��Et��� 4���,Y�/�9����e�
������n'\Y�I��a
=91l�9 p|G{ s������"j�^�[���g��!��W^���7r��4��v�/fY��P/�^�L���l�PikA�����i6��Q0�z��:n#�
svx�%�H
�%*�O�}�����n�[S8�c�d��wd��"/4i�dr$2=�\o
L
�O�5�x�%H�r<v����x}��js��&�;����e7�S���Ni��vhk4�P�o.ls c�md�H��8�;�G'�e��'�����c8A<CD}?I\�od���LE�8Z�'^H��$g��c AEG]*5�����Jevb~�xiU���9	ah�8�<?E��e�D����3����_Tg�����L�r�G��sS|3�~b����-��
5C�1�*�E�Q��MPs���'��y2Q�1��P�q�U@��c����3��%��.+�:���-�����y���v�/�y�1����"�=m��"��1^P��uP�{"=�<p�)c#��	p�D<+G�_���'HCpU����8�����Zo�2Q�s��	NK_-���#�(�,/�rm������m���W���`d^|Z4�w�a_���V�h���x�p�A��O9�����O���G�|��@N�z����}��|*�����/#NZ�_����m��A��.s������cb%��^t���P�R��|�
��6j�w�� H>#j�E�`������m����<g�3�L�E�6�bMkyI�*^�B��u;�j�S�a����lc��1V�� O��V"����1
�i/��
d����x����,���������@��� ��7�:�����1'(��������
�����d3�\�����Zs��3fQ���Q�}wY����}�>���L��8U<3��"��pO�#���-m>���1q�	����=����xK���������2��R�OJ�<�14�o+shF�<F1���f��U~���qfXwV�=C}x�Oi
*?>�x(�����U�1���D9a����5R`��J-	`��c��Q�� ���vV�p���$D	<�KXd�G,�@��1j�)-��8�.�����z��������}`=��7z!B����/�l���#z;�`�T�������S�A+�o}��H]��:��!�����d���7�F+�BW���p#0b�������"�8# ��*���d*�,�R<����,��������|���Oc�.
�|�PT��~X�7j�.uD��=sHt�;����W4�dd��`��u��r�^�}�?|_WcK�o3��?�^r��	g��oi0���4r}��m��m��n��_��i�W�BIg���-��K�d����l�#����������U:?���ak��{�?(��L��|����M6�=�[�{�p�����4���!G��k������������m�a��GH�{��Gd7v��U2���<�	�����^x/2X��}��A���)��������G_�@�c5�m	�(0F��Q����-5nn��~o�G�Cz��J[��I(
����g���>Z�FDS{J��K���Y���F�\�5Z�s������b�����S�0B/��@�\��7��l��W{]������#���J�z����@/�Ea�/��	TD(�{����TP[D�^�,�uzD�E���R�����tD���'`�T���-���d��^i����PXy�S
5�Q�3��W��nC|�5Tg�7rzzR:�<������w����4�|o�Q��q]�o�L'e�.$��K�#!��@��8AQX�0���S�)�v�y���h����f���B�����K~��o����|]������V���>�lXCo?�Z�����T�>��3D ��r������������xL�W:�\���B}e�Y�p7%�H���l��6������f>��V�m�Z9�������B(�����
m������K�n�}�D�]��j3�~�l�*>�w&�eED"I��1����=���������}�-��9��D6�^��B:+6�1�����D0a��wpcq�^^�U�IsP2�T��������-=r�����h��Gn6����d�F'�+
�����~4��39/l1� V�f��B{��B;}/��N��8��431��Z_5Z�I���@�
�E�qe!cvh���"�b���$M1!6� ��<�f��������w~���-I{PT���N�����HB&_�����4�)�Iz��w=�,��1
iUUs����I�W"��~T��l
D7��%H��"g+b�EW1^���zo�WeP���JC`$Zl#rEkY�V"�Ps/�<����fa�@��
�O��2�;��\����{h��-v���Q�Pj$�_$�l����h��?tl8�rA��*�T�-*j���]�b����b	N��RRDM���\�QTTZc2e*X���w�h����.��&�0������f�
���*���r���[��rI��������v�bpB����{OKd���'F9�x�^��Gp4:�U4���JO3���8_���Pu�Y\��;}��d��a�-�}~��������BZ�h�}/�A5����3�O�b����8�-m��f��1�v[���sy�V��7����02.���M_�0-�+-�Z(_�)dZ���������� ���Q�Y/�2Ia]e�I���D����?,�B��G������G�k�������*�*�@�_N����PqW��@�|���i@��Uft�������	�?�,D{uZ^�l�Z�[�6O�d��������������{��\��}�]e��Yg������H��Vc��r2��UV�7��z����5��p���H��C �2��'W�����B��-8�v���a\8�9�*1<�P`��G6R2����&9�(���QB�o�E��q-DY�}|r�`��Q�J�h�|����kUC�;|��v����vK.%�c_�+Qzb
D��9,Sr�N
�F�B�*�h������AL�@����*0*$�q'��$(qm�("\����i�:$.��6��|��l�'0t���Dp=��w��1HG~�JBn+�s��G+���]�u��6Z����;?+bM�e�����*q~��Yg������\q4�CUI�"%&��^5��[M���q���_�����j��4��~Dv�����]����~�W�1~����r�m�6�`\t,W����E���U�PgZ�+-�P�2{�F(�`��@�|>��t�rWh���&C�w�r����=� �&���I���
m�WM�'q�D�5[+5P�Z%C��&M����MF	����F��jC�qE��N��8��C�=�����hC����4=�*�S9d@�a����(��0���f5
��U�{������I����[c�$��~Q�V[��kRXb�TC:����*�N�h'�����VL�"�N��q- ��`+"^d��^mf����N�������:����`�"�QMh�l�5�3Q�r�P�W
\l�B�F���r��g���+.��,i�[���7�TD���~�R�/��^�����(W��r�$��B���cG�t�O'W�8q��<]*Z��S��5��j������'���b�
�_�T6(���z�F����L�CGN��	u����1a�)�Y�Tc���Y�k�'cMk��������������^������1����&��3d���
+u�C�8�~�;�Vd���4�I������@�{��?�����z����)}�U���U�6hN!��R�����`5i�)(�I���y=�|`"���j��h<����yM�)Q4y�L^G�m]�\�_:~��4��Mr*b�5h"��8,	^��gcH����������j��CX��3WD�5�Jg��j�g����%��6Q#���������K��(�oW�u���7�6���R�M�=�w�6�29q��!��*N����jb�'Q���!&Ze���-�tVG��������>���_��_�Ctb���1��4xB����� �(}��
?�aEr�QM�%�f���������1������gHA=�oC�[Kr�����2����"?{3��:�Q�O�����2��O3� ����h�h���g��u<2�D��������7&�o�"��E�M�C��(�'���@�f$��v���N
j���K(gC��%��dL ����H4�S}�tY �����xl3���<����.�n�!B����C�����$��5���/����������@3�fB�	�24T��W�Y�YTL�������o�%��x�$y�j���LX����*[�MZ")~ZB}PE��f�BN��/�EM![_��[�������%�Z�b�3]�#x-j!H +�2l-[a�+����$R��f$�nrQZ4�*�������f$CQ���-�
M���Q�0	Z����Z��n����b{��^�!�DtR������)�T5�����	#G�����0H5�:����ag3"a��'����,����m��1�(�V~�ANsW�����	�VKh�T�����sIW&���G:��v��(H:�TQ����F�(����Bmw���P5f���FMq[�����������EH3Ra�Z��?xs��Z��n3����T�Sc���$�i\�G���wPOS�����}3�X���2L�s������4����x9"�#7���?6���(�����^
�o4PlA'��
�W�i���&l���]�e�*����eH�iZ�X7���o����1�g�������Qs�^n����))"���gt���4�b��0^+���x59��&��FR�f�A��QT����=,�}�0��������C��H��
�G�M���w�?�����
��f�`!�%Y�#4��u��������+2��4����5��-����]�]����T���l����s�9����'��[>ZF*��o��0����	���������f[�oz �(Yz,���o`��R�����=��9F��n���j�'����Yn
�B�8e=b5���]2B;�c~y�`����c������n.�G�v�!����;�f�Z���=�9!��`����Y#�g�B/��Tj/��%����
j������#��M��xL	����o���(�O���Aw0���P�%�O��5IIZj.6��1^b[���	���L��L��*��&����B��G������#����i<e������o�h�����J���9����G����3�[�8;�	��#��<ZC������c
2����gX{������{0$���$�9�f	<�F
=��}-~����
���dvA�G�+���$B�(�^��F���,>�q3�nP��%v�*�����xT�l��z��+�~U��G���$�O�#|ai�S~	�Tw���:��1�u��@T����hh%��c��c7 j��1xD�iH������������Cu�������B����>C�hRU�����b����!��G��(#�h��U��H���!�q\p���-f�c�=~;�W�1WR$�]D��C�P�n8��y]O<����co�
����d�
���� ������fsb�kuj��W_q�A{���&�+9�%0��n�a!��'
�����W9�O�P����,<
�����)SFE����68�S����/������7�%b$����H��ws��@���U;����(���(����S��(5�o���U�O,�b�t�d�l�ehAsh3K����{T��
��M�
4����,z�n's.����eQ+�Lr��)���N�3�3�'����x~6�K����F��F�E���aC��0���m�0����,?�
��[��o����\{Ia?� R�*Y��
�/G<�i�|R�(��F�S�L��X�������;��Z-lrt�<�b��J���"uY`���$�fqwA��Zq]��

��	]���|�^:j���
�gV�F&��F��5�����EMA���h���j�mS����������4�(m���\\�Ud�DI�`h`	G���I�(
~��q��]S1�f����.���D��Q�0b���#��� �r�R�u��5*��t,�&�o����E�<eU��L���!��0H����A�n�������_P����/s}VzG34|I�VH�F92Z�X��v�GC�]b5�}�����%$�����	1�=V����y$�y0�~����$�C����~n5���<����mFdX����p�
2(v�?XT�gR���2>����������������)����g�|(��?j$RZ9��U7| �>#� ���4=����������!�0\ )��dT-���O��")(?n�p)������`c��+���!I�����T�u���q�F������B���B������3zr�
�Y
:R���a��A�G3+�24` �Zaul��K�Z�h�<V��d�����"��p���U#"�oyT����0�`c�AO�*����p/���53#��{!M�d|���c�%]���N����S�P���$eB)~t�`��G|��=�Aq���o�F��L]W���+L
v#�H���;��7�&k+�&��/f��,V��I�{�#^X3x�d�������q"�a_�O�����A�K��C���A�%��DJ�(���#�C��8�f�Z��1=�'�_����d��q?��]/�QN���6���q�%;�������qCB��|2�c,j����Q[=�6
 t3�
I.���J�F$�Y���k|n>�:��)�g ��i$A�I",�a����~��D���W�},Vp��������LV0�u��%�Z�!�i�a��L��l0:#R�;e��F�?2B���������gM+{������f6�?(�Tj�����p�Y�C����t��,mLj\���y��X�n���$u���6]h 8
C���6J^��*�C8��
Gj���v9�w���F���[�
����2�s%@��)t~�E��XC��t����}�2�P7ec(��,	�g�y��
Z%�gO�����<1�?�3(}O��F���@=8|O����O��\�Oe��v��P�=�� ��5��eJ��h�>kBq��Qh�8#S����Y��L��$��k� ���3��f����o�BT3�	}��k���"�������L���;�����]������N�3�M�K*���4�`�	��x����Y��(�7Tf��o��/�����z(�����p81�I5s:�b��U��9]��c5q�6������i�*�h�S; ����Hp0��@�3�����)�tP��'�sf�����J�+�oh�=�fO[��4�����������/p@���o���8):���:�M�����D��i�@� ?�Ji
����c�����h���W�>y�0����3����w��9�e�3�
�eDcw�D��7��N���D���8vs��_#Z�<�������z�S
}u���y��+Zv������1��O�����dc�=4�7���P����=�yz3�"2�m�r�RV��$T�7�jD(�4
p7�E���>a
���k�H0�u��.�+��y#�(�2�{=��B����%ulh�,|\3j�/��I�kq����X|�c�z�w�d�Ba��F��e�A�Nr!�<�<��|���U��r6���[����+)�5�]z
�&I���b���@���[��\p����0#���!���C��[h~V��[��!�:C���%a���zC��G_�����>���KPVn��7H@+[2v���mUwu�p7�CE���x������M���w
Bx�����"���)�����kgq����
EVe��.H�'��������������[�;�&+W�}�=
}�rx�����g���Oaa�����]$;]B����H'da=s!d��f�~���������b�������,�n-Q��%�U�����l�[`D:XB#�%C�G�L��B��{kju�����
�-�D�?@%A�	��Y��2&q���;v	��4��f��	zaT���9�,(E���
w��W��~�H���05����(b��L���:c���@��5�"_�%�"�Z��1�pk4�MN��5������fu�	�����.��
z"z���4����c	S��f�E�h�J����^Af���Vl:=���fF�7�9��F�����;�l/��;]��3���0>d��N����'P|w�Y�pF�H��B,d��T�48$P��KJ=A���e����zp	��O�����&"V-�]OJp_B?�z����RKg��C,���m-�����]�v�L��I������;?�-+����Y
-P��?��+�l�����S�������Z_�?2�[oJC�z�#����?)#`�Y���q���%���������V��<���]�����]$�B)-��� �ht�5�5ZvUbu�
`�#X�"`��ce���>���g��4����J����(�#��--D�3�P*+���`�����o"��^
pq��J�8o!"-����I��<�J|Y/�PF��#�������CD�������R q?��'�k� ����|l�����w�1�K�V��9���1�sw�!aw��Z#z�v$����A����\%��pvii�����na�<�������u�?5���,�z��>ra�����ma�}�x%R��	�:��X��u��j���������1[����w� ?���h��x����WP�=nC��/�3vL��5����#�ut�����-��������x��
y���.5�
�gD����]�h1���}�z#�M��l���D���S�}Qd�p���;�@w���I��
Rm�]�z��1E>�E���]Gr��	��UB� J�n�6t2\���Pw�?F� �zQ�%8�k�[��v7��e�=�w��wKqxJ����n��1�c!�x'�z��#����1����+���7[0�����a;+L��;�p
��;��B1�D[X��s��!h���9��n��h�!�sC��$�o����k"xd7o��{��1��]|��dG�m�6$Xe����f[����Ku6�K�m��b�E�-D�}��sA�q��F��H<��_Ld��8Y$Y��|�9�n�n�8�K89f�oG;����T�-T����d��`v��y�6b�lk-�����������
w��������=L�
�M��Z�K�c{$�,�+���	r�������4M~����C�P�B�1k�	��E1)�h�������T6+�^_���Rt�h�"��"���!H���lN7#8c�����{�������u;���� ��Ho��J�&6\FW���OKrbs���V3�4q��#&G�'%���W�:6i��*�$jq����El�d	��YU�G��$��-q�%X��]�<,1�����t'h49��@��>",�'����}J��c,� bF����B� SM^F-�;%�����e�X�����"Q�c�1����=2g�#�A�'�����'���FGK�)��
>���0!���X2�M�kJ����@�
B�uf��[�4O����p��������1K��h�<&�r|����9`F�I�0����89:���}�:B��=����"o�#|���n��$���@�����PqGh���"9���"������6�]X�K�����i���(7�U6����Ge3��/�@h���`�HN��6��hmJ��
g�E�,���-��5~�t,��r��]Hk���Qh%3��P��D�FV_��8�����z��a�jo^m���
���n��v��Fr�%8N^��`�&�a������v���/�,�$`J�q��r$X9�p����>+�-�L`%Rgj}��r�
H���qLDD�;�w�z�gX�q�����'�-s�>��9��{R�1#�X3�����=���@�
<��'l8��n����#z�!Da�#���V$f�\������	���&���*����.���2��+�x�4rBjV	i��Z+J��Sp�4�(��2��("<�L{���L!\��F��39�g���$ Te9����Sd:�
 =	�a=�l�sk���a���l	�p��c�A���-l\\2>��P��[Lv��@������\��kx�����.����9�"?���
����-��<M&Z�V�����oz�
)��?i��a�3GXW��u��16[Y5 ��4�,����P�u��]�8g-��o�1���?���HuD���@V��3N��s�>�����������2�(������]!j���c�0����S4\g�;
Ey����A��(s�0������A�-�U|�����d}�������A�Ri���e�S~W�����b�t[.~����v�@����H�w���r��LP��5t�E�J��d6|�a�+X�?��x�O�:A�{S�Z}�;�}$������t&>�9�.��-�g����3E���-���m�P	��L"IM�\G��;�D��4���uD���L(�
m�>�P�W�m�Fj���[T����OL<�#��.y
;��~$����~���Wt]I������Q���g��&J
���3\���4r���������>�s��j���0Fj�#�6��?#����C�U4\���Q9:�&����
TNU�����G�#r��
���B����,F���\�Vdr�h����HL����*��/���Q���B��%�h���k%���u$���W���g�6�~�:��R(�#w����U�mR��G���{I4\��X���n�\`8�&�����d<,���*��j�$g�� 1�o��2�g������oIX����>D�Kd%�p�I�v}��b'Fo�8D�S���JbB��w�d{�I�sq��9��oU��|����mg�&$|�Z���'�\d�E���YEv7���������Di'L��\C��s�3 EC^�H!���3i�|i-�a(5�^|�;q����P�������t��d���-�;f�svH1����r�5i�T�����6
���:���6�>J_}����?2&����}����a����
�$�nZ{�����a'��U'hV�z�&�@
�����oD�$��?�����;;���ib��{X4�������m!x���m�'�-w��~-[Ed��`���j�!v�]���.���<��|.�u��L?�����Q�&��pv)������q���Lnm�2����A����(�?�����uB���-$�|F2��7��-��}F�
�F��g�v�Y_SXDK,�>���>EA�\&�g����N������^a��g��Q�_�,�@MB����`��|��m����-V;$��X� w�{�D�� ��k�(��E0�"������v��H��2�I��\	���1��Y�.�����"4a$��]$X�o<�c�^�&��Xfv*�g���g������l>��{����iD?�PAF����:-��& �������b��h�/�7���q���z����b�d�������	hFPg����
���3��g���j�s�GS�Tj����%��(�� h�Y41wM����bH,Hw�@�D�OJ�!�AL��B��.���9��hZhL<BnW6��5�.�!.%z����)pQ��	�G'���+�x�����t��9������STG�C3��v��o��3���/T���ct���I��Ba$��v��<G�t���z� ����'���nj]�l���=?��-����f���;���y2-�F��k��k|���3��wg�C�3/���m���P��-�P�@w��Ke�j�_�g�P�;��dl�89:(�7�z��G�KO��4�`x~3�"���t��#�S����k� �g������3����M���$�@J�����?%5��"k���"8����&k�wS;�H�(�s	�gw�C
�� B���j�D�|��b\�3~U���D�m�8v���U�DD��_��N����=Sa�H����r��n���Qi���Fc����OD)��!�#zM:q�������6R4Y�n�]������T�%d-��M?��<��n���co�mcV~�7�Ya�D�o���ZB"��]�)d_���cc����W��!���7{R�z2����q������T�(���vSa
'���U��s��j�)�9���W���f����Q���#s6}�1B`�U��@7���B��� ��G�S�����>���CW�/��E�IV�*���������?�uP���dX���:n�ZVTeTG]�*�a�?E�=�q������P�[�p�b�Ds�>?�t�,)�X��!8=�IO\v-?+�����j�-�D�_����Z|T��[��J������}gF������w�T�A�*��=[g����U����9DM�*<aE��j<��!(2��i���4�L�h��t(���D%n��[`��64V�����zK��R�����_��`z�~?b�(��s
M�
���u��Nh��W�T���g`}MTn���\�8a���js)A%z�db��Z����w�	�\����d�j�*,�OZ4�QRe7������������S��7���;���ZW�����>1@0�~vw6W������N�Ux�Q<Z?
i0�������=a`${*��V�(�W�h�����k+�u��U* W�c2����R'�
�a
dk�l�;�&{��m�B�p7e�}��L�]�.@�$C ���I�\��.�DM�E�H�U����@�j
��N����E�0�����p�:���n$�]p��`�*��Bd�h��*�
����A��u>����N	LU�C���V7M�J�Y�/D��*|���a�".&��|-n�A�_;���n�3����?���-��IT��P�e�����������"�#Bg]6��&�Uzj�:��,w���X����7U��y�����pQu[���ES�*���AG'�l:�a�	��vu�C$@���dOD�h�|o�bH�d`D����LG+��[I��f$�*�!�R�����j��-��+���M���9Gr�I�w�����iEL��T��� @�M��w4��#�����-Z�O�Y=
+�j�	Aw����_`F���=����~&��qd��d���-���{F1�?�3�J6�k�i��QF.l������a��n�5�O�f-�p|�S��f��=���|�>��v(��%�ks5Y#�Y�|����R0|	��vH�k&�U��:��Bv����u�{arK$H�s!�*R���k���*��@V���%���������������nN�X ^��G����������^�%V�h-qF�Ds��"�V<!���	��	�5����c�����	�@�Z�
�8D:���9�NI��Vw���o�"��qv�O�o�5"[��P�c�c3t������6/
Bd���[���7=dz��5'U��b�-��F�'qA�����H|,P��v�D���CiY�u
������Brvk������T�OQ��	�(_9(��=��
DBP���5n�0������k0c";���l�eN������g�f�����o��z�50"0�	� H�E����i,En�����5l4!2X���M����#����n���'qng�Z�~�q���Jr�w3�!A�������S�����y�;�:F#���h�m5����[��*}.�K���8���?�#Z5�N�Qb��=�
��7eW�&#���i+M��&yC�p%�4Sl���	��&���4R��f�������F7!�'��6:���
�9�"|����y�����H�0��g�����6�����Q��	�`�,y �7���7������3���W�`��q�]Yu/(��x�O8^YAfL�X91"�[���7;{
~��-�-��3�����G��Lt��Av���J��+�����I[����H��29�F��f4b����F�9�6A����� �	x��~��z�!D���/h��Y�Mh�mwT)3G����S���d��c�z�?PaT��5�D��p��p���q@�Q"zW����E��9B��i�)N�������>p�r�/)��?6�[6�k��z��������E}����(���;d���)T#��?���-�t����nQ���7""+�������n�D���6bZ�]�-������������wF'�.�aE��^~m6:M�K/�\�'#k�K��m6�V{�'���Mi�:z{���e�
�c�X�/�6�|��U����Kw�6@��;�Z^z��<�^+�.�C�����b�6�
�;�!�c{���� �;�::�ta=R�wcQ��6@�����k���v�m �g���ua7�a�5��Zu[-��E��zJ�s��(d���1�P���H�nR`D�0a������J�G8k7p��S������|�s�������FsE��H���Y.s��'"��e�m�Tq(7�,S������l��v��q\Vf��&H�	�����ZJ���J���|7��������B��8;�]��a��!��9s��K �d�Y]��l��y�P�~�Cx�fn6gC��wE�,y� �a
]���5M;�:?��B�Z��`;Uu!�����D1c����p��u~�-���+�R0�)It�]G�R��E4�����r�d�0�!9��BCH�G�o�!�����3�e���f5�qNx����������z��������h�6�k�X~��Tw�tv�y����Lyk��C+l�xYwTC�}����fG���/1���M��G5�e��B���N	Q#����^G�7T��W�L3�U����~6U���{�M��%h!��m�~4+�@O!Mf���U���I�w�*-�I��]v���`��������kn�����=Ro���,J�]0C��)�5DT�.8��)�mOYi]���
�Q�sZ��i��S��*�f�4��}C�9x�lB8W:�������%{����P���j��\IG�������(a6�"+�����!��F��$�6C�=jJL����4j8�o�������p������b2��F�7�Mx�gU�C���� �k�'�XEi��O�k_un=��)ZM�1"�1t�,r����(f���i:�(����L���N�u�OCX8xG��e%�(?��,��pN�*���i~EJ
��q�}�i(b���X��������#� ��G�4|���F����=�-�G�-�@�D���qv	O�hz�����tg�=s� 
�D�\�=���#�E���b��z5I�U����QM�|\�����9i�����_@Qt�B)F���R�J
�yJ�E;��&������7�=�x��3�0^!��-�6�T�9�f��[u������'XHb>-Q�N��h�=����?`�}����h��B���k��%2�Q� K����7;u�y��DQ�=4��9r�����
�`��%d����5�-�n��`7�'������9���P�i=����$?z��s�7�ec
w�i�=M[V�96"�U�aa��G=�V%���t�x8!�� CPE�vM��a��Ya$$�doEm<�r�����T�=`x.5"�
�4�#2�������6�U��fePB����j�4�o�8��[mcw��2������;����>�irJ7�
T�1���7HwG���C�F���5�����3_���%�cG)e�E3�+u�!�Fz�!\�����}�p����3��R�f������
�n��&[�Q�e�>��i����s��_$��-IfC�j�_���L��������b��������X6u�Z��+��Y�t����j�Em�@�,��?�-�\o��@M~�$wO�GJ��%��%>|4�98���~��fe��q��D����)�`�#�R�w^%�j���OO�J���L�1��s0���\4|�C�nM��Tp82g�)�4:���Qt�`��G-�����u��J�A�X������{�`��P����E�����E�H��Lr��).�,*��M�&�2���5m9L{1EoL���6��|j�����VKQsh�m��g�����U��e���"4_�����ik�#��@�	�w����i�W��f��M���	�k�m��-��'�
�@#FdV4�-Hf���g\�jsG��
���.��7S'�k��~s/*w�O��8)�,�A`�l"�@�rw�;���2B��`A�[x�}3f
�`s����/�����`�shiG�P`�8$`���,1�l�)�xH$F����)8)w�s��Q�n�?"n����]H�������'���������m	���.��(&��k������8D��	��"�%��������VO�[W�l�W#�c:x.|�Z��|��#�a����)H�g���!�����N���Sp�*�{=mx#K���8�SY�-l�O��$>
�X��w��G�DxZ��q�BuF�;��`���i�C�nz�;m��M�C�#��~[�=+~����\����t���=]A	?���!!�CM�;�Z�7m����t
o^�]w���Zn56-����2%�1���l���zB��$�V�4n�Q`[��{����
2��)���t4����z2�9m�[/g�@��!n�=����t	1Y}����:r���;��D�5�B4�I��gS�A�&�S!������\')hf�D���$C���[4��$��$Hv���6�a��Il5�E��)�G&���U���l5z��hZfQ��A�e+����hz���e��i���H��)Hz���c���j���m������V*�p�+|�8�J4��[����������]��*�	WA���9�Y����i9��AT�.�B\8�Md	p����)\�P�S��P���������b����j����^]!�������v�e�,e�E�����e��:R��A��!�n�V��_B#�GM�N�48�Ik�U����^u���,��O/LR��%p�^���K�-�)w���b����"�6xj-�����"a�*�
�}&�
�N4�����@ ��m��q8B����K����r��~���U-��i1����I���Z� _6u��?�~bV�-Z.V��,!(�H�6�eO���I�"q��o��i��7�cf/���}!�!HQ[��?������/��M�1S���j��� �@	�<ou	��,��eQgz9����a���dz�?�H%r�A"�/�������%���RbK�%b��*�;��-�iwEX���GV�
�8d�����.�%"}/�C�u_��Yv(�O�F���>�����%']�a�H�[#.�z���A�'��b���a������	fl��D\���:�3����z�(�+��YN�.X�5��d��}uvz��Vd��u0�9�
��F{�5_h
pp
>tt	���������P���cc(��=0�@���L���l�!\���}`ls�h�����r�m�?��'H���V6��x;�J($��f$�Y�B�*|s�gD(@�l�}[!�h��v%8����C��%FI���G�,=x95;2�_�P����`u��G��-$x�s����~a#-J8^�q&�c�~,�a9��e}/C DpG��r�5a�J���A�����;{�tE6��|�5�h/�~��0l���M��Q�UO�	ND]V

A����C�ht	M��8p�E�5����L��#���.#@X,��#R��xR�����B��kY��
�m�����������iu3�R���q���T������X��F���wd}��Z F�y@-�cg�����������d������Kx�S��4�&Q�k!�B��2$��[��.�������Q�k�������-�CYO�H%j5�W��S~4R�
l�9��>���crU��BJ��V�Y�_%F���b������|d	�[(�c��wDh#*w�`��E�.6��V+�[S�e	p[�G��-��-A�2��8��f����k����hs��%x�� �VG�L���x����'�>lQD�����&�n!����!,�"����]JZ���d�&�����	?v�����4{Z������z#Y��7��
o���;���t���7��bz����������1�O���4sYR�'dC0~��k[_q����;�WY���up
��qR��6�������J���'0O���w����Tmd�r����0��EO�?� �<���N�����iqg����$���7���1���@D�A���c}9#�E}��B;����^<��m	Pu��l�3n� ^b=u�-���.,�h�����9�M�_(?1R�lax��O�K�(�;�(�ko[C���~�L%L��g��(|!�F7�[��Wa,��_���1�0�G�/��S�U�g�]��0�����r�T��_�>�l�1��n�7j^l�DP��q#��h����F����ij�(�N��G��Y�5������h�P�����SR���/� d����E�v�7�W�'���V
�l�t��iE�������;�f.�[�����q3 bl�����O^F����k�7�I�����i����)�&����nK5n�b�&��j�H:��It�V�U�T��s�������+w�^��stv�_o���!��\8��J�����0���2�yY-'P�%�WxH��J�lKQg�[1eNE�N1�Q#h;��Z3bo�c�����}H��=��A��������[�`	5#R�64A�V�'��X��f/��=�����L[dG������R`a
����gD���3&����x�_���Z�y8�o�!�����cA�? ����ew.-��o�q@:�����#KD�6��w������Z����ua�����L��3��CQ�q�x�A�7��k���_�6Ir������H(�bxw D����Q���8�������)�x�~�&�y�/~z�v���������(��<B;��A����?\)������G�e��Z�|5��2�!�u��
����O�s�u��jo��@0Q}|��M|���}~  ���F����G �$K�|i]��P&b�g_��jG�G��8�rG���,�^\Wjt���5��
?�h�7S���(�lK��L��a��#��#�#��?���N�#�)�����Qd7-8��1��<��l���Tt�<���P���6���j*6'6G���b����W(4���U~�h��1�9*���Ev��nS+b�G[��5���P1�&�����z�=���kd�smq��r?�A�G����������.��h��������N���FF"y���-j��,v�f��c�)��]���9Q��8�"B���x�e��*q��h�z~��[��9{t5a���W�����{��y�@��D�����#C!
������K�
�i2<��[�O�\�)�_ 4��	�`���� 
�L`|�Q%���o���yG��������-;�=�,�^���%,#�[��b.������
Gs�,+<���y��O����&Z�\��p�����p�7�a/�.������TA������
J���������������>2��>6�B��!���n��Y�)����\
�p�]��y�c��MM���9s1:�plw������5���tr�����|g)(1�*b?�1]����r ;�c��1�Hy��1�#�����n��]�������������H/'Z@?�M|z��FX^EP��B���#y���=�%�kh���:�����s���T�����v�k
�}Bw��%�4u;!�k&�-����n�AI�$�,9:|	����H���Z���$8�g�*7����I������&$������|
VK��p��������D�E���%|pM���V@}�ab�Q���p�V�9M(�\�f���v�E��((���\������o�eoJ�f��vfr���j��4u�&�ar��\G����,bK@>����G��h��{���?J!:������V!�DF^�y�u�`��e��6T�������%��}�#f��la�b�=����m��oM�]5�Zd��&&
�� 9V0��5��S��o��g����s!|��M	���@�`��C��%�� &x�J��6�dR���3�~��0 #�J�PC���
������p�y�K��0�����?.��,b�����S(V�LG����=+�l9u_!b���$��>�|4|��s�$��s!�N��EQ�E6��Y��~0T���O�)��R���P�D��$`���������nN�a/6,��Sd3�d�'�F
�q}Wp�W��,�4���|����n�h�0`ls��x|�t-����Y�w|wUbr��g����PuN'��)\�����<�U���^ bE��
xc�������{dK��n�Vn0�]����YPP�e����	���ce�[0�mm�t�id�w��P�<r�H^�+�	�Y#b�/���W��=R�F���%[LBD���A��%!R+	��3\}�����`-�����%��p�l�
���s*9v;�����U6�5W4FGPi��l��.��.�r�y<zc�������Y�d"���������3�n���{%� �e;�iyi&�g��1;��N�@Nq~E�@8�Q���F���,�EX���$�����*�On��I�M��=��7��6��n��&~� #����3R����P�
;��B$�BE�	����le.Ae��r"�>E���z�O
Fv�-���n���a��'Y���
��	m�>��E^7)X/����}�e�kXA��L���}����f�m~z���o>�%���Ku�y�� �!
�8EHR��JN��!BwJ5��"�1����u�ZT-!0Ea��=�����[V��D���hI���(������(U���B�`�k��G�2�`�gVy�	��P�D��4����ane-���H��r�y�C}�����we����)���h{�UM��2>#EX����"HQ%Z'D6r�X��N�l��&������S	e��~��1�gd�>?�z��{� �����e;rw�C}7b���Z��KJp"��X�@{>|Q��(:�A�K8��8W�[�����nj��uN��HA�z��PWw;��rd�s�p���jX��B6���S�"<l?������N��p�8y�6;�����F��q��������o5L��5��bw�0���=Mk����X	�Q�Lz6��HM��^��m��k�o��j�j�8K����i�@�Y�/�V�ik5������
:�v��7���8K)��5��LH���wV�,����_����j��lg��B����[���RY��x��Q_��Y���ZG�ab��]c��A["�g�q�)��`�(�������`�o6���K�zy�&L���?�E�#,��z,)�p�"��3E+)���=���bH"�X��]���%�*�_g.b���n�'fvD��S��!;�C	| X���es����D��m���&4l=���o�Y�q��6��JL�"9ba��y)"o�.��l	:���j�L�yd�!�f���HBi����*XODm�*t��y�<���V�}��5#�|�j)�f�����>(j ��?M��)��+����^p�������ow��V������V,h��UC|;@�
7��{�jg����,�kgd-]t	��0�mk#�g9%<���m/�&�����������L4R�P��I�W_?�e��%G������>����M�b�2����)$����p4]�1(�f������@�Z�����8��4������}�B7�;�	����5T�9W�WAQ�Y-� ��s�tJ:�li1L\�Om��we9 �cE���v,�A�{E+�0��=�T5���L�i/*V{5�|90����
� ���'�D|� D�G��w���B����/�����P_3�9���E�`��U������qC*��X�-j����1�AVX�I�b�b��G�]Fg�j!���D
e/��F��.`w��)�R[4m@w/�.�^i#�
��u����F��:<��U�!����2�������]����*����vW�p�X���|�4������
��l���S���z�+3�Q�^��F?��Ko�
e��L�#'�h�{��[V�����w5����J������c|�@����-��\E�).v����uK�P��_��F#n�G��J�9U8��0���	vw�3�M�`X�=r�����ef�I9�u�z�����g
�j_��9]����#��
�@a�2,���d� ����q�D����$fV�~����{0���U�*�T[%���V>���%
~$��6c�f�@�(��3H��[���:#yH���DUK������*z^I~4����n�2 �t�p��X�r�'#�CuVD�{� c�I��~=?��V�����1���u		m��A���<�Ab�d�C����;��Y�e��1����3B��3b��9g�������y�cf���HlV@ �]�w��]���j�����G���pc��kv5����Pn1��G�$��-<�������w�F��1�F���G��[��Od4wGN��Y�p(g��Ol3�Sx�<���L��A?�tf�������y�Q-�d4��@���3�@3@�<������C�hk2.H��!:6��������{�!�yr�V]����&�4�8pG������N�!�����J��Z3���x���v���3�������#�U��>�HH��A���zv�����
���(�i��()[��`	pd�
5c���.d��h������D�.4�x��&����������0@P�N�y[�	�X�t���u�[ww�d}��oK�������V�6E�[��L�A��O��Q��-������l�y�Tg�)6�	��2��T�e�I�x�a���{�]H�$����Q��1O����gg��c�V�jel�*S0(�Y�`p!�B�I}�rhU%+���]w����)n�=�d�_���-�=l��� Y�z�04!����n�D�Ye*�agG�i6��7���m���%�50���]�M������]�P�au���_ ����
h��Elm���~�ZW�@�'D���i�Q�hww�~�z����Rv�Uo�",�;�������u�?��W�[xd&NMxB;2,��JK}d�P�xS��#��WE�Q�
��a
Dv���R��l�V����������HN�"�����{�[�7��^$Zm3�H���!�bfn���oB��`u�9w�CO�#��G�Ds���p9{j4��9�}�[xz=��K���7`����l����r`Ec��#��~��w���
�EFK���4��u�������.)���[�?6$�_h#��b�]C��'�Wj������E��.�7�����)���X�=�
���mk��5����E����[����!3	sL�n��YJ��.�a������o�ZK��.daf�����L�l��D ���0�,�����
%`<�7:�t�
�|�]���_��j]��[r>9�F��n1�����!1��nqB�B����������6lf��B��]`�-0[�(������p��m�n�k���[_��AE���VBY�g����1,��k8��Xq�9~F�&�����R9�H�D���������E�g�������@����v�E�6>�������a =|�g�L�����8
����������0`�Q�vD��d� *5���7va�G���
8�F5����(���$a���-D��B�^���F���a�o�f��L��!�l�s�4+	�����([>���P`���[X�_���m��=������f0�0����@�|a�"�\���0'R<X�e	m0������iH�?����l����e�����U�AS�����u���s�����1y���fX��8�a[��+�1FP��wn��u�b��T0}�_v�+�i�$�}�rr�F��]� o���wQ2����@f���-��W���l�YfcnN�H��;���[�
z����F�U�l/�0�*�(������{���Cx��@C�D�������d��4D�`�q?E0v\9�I#D�����p�J��	�P���oqBq@�6��M5��i��8�Lu�;���a����i��@��@�1t�szc���M�J����� ����3�����tSd��bW%h�;U����X�Z1t��?����0&>tA-�#{�R��q�[� ���]p,��7x�D������iK�c����D�k`���89��f�� u���a�AN�(�[��z+DLxk�}a
X���H�������|���C��d���|��Qh�c$1����P�eR�!��&��h� �wk��n����E#�]�C��Mi����9OD]�!����goum��P�luP��/�S�,����@
�h�b����6�a6=rH�QM8�G<�*�y�"��L,;��q�������	�u<�;��B,����({I.M-�gd�~q�G����t�2	�[6d���3,��Kx���D*�a���
�!�{�}P[D�Js9����H��(y���6?��VF|���Y�j��d���CpE6D:U\#J�h�i�l<?����������2��"��@�_Q��?I4�3������)�Fw?�����~��yA+|=����n�]����J��4.����C�lF�5W���A����F�Y�����
zU�qG��+*��2�����m��h�b ��]���G\��0�Q
���8��o�Z�h����E��!D��S��y�f	:�7`8�d���4��Jd�7�/�@�_}$� �1B�*D
��Ro�1-���<#��,�l��?�=�Ke*�!P!�)�`@��J��\�a�����4��d�!�/�jd�G��!�a�v|���?"pxd8_W$4�5��a�_��p.�]0�
@�L�������fu�6��k��~�]9z��v�w�
���bs�(�nZ@��/^D�yu5
s�~�fPvb�vH���On����0�����#�����w��'e�
2p@��
��(x�� ��:���U��1�����pU�&���[��m�������p ��������ul��i�}�f��0I.<�;
�y+�D�S�:��\��~�S�^&n�����8�xZ�5���/���=hf�S`��8��O�v����>;=p��x���)La�����Z�N�����|t	[�FS�X&s������"0!������7��[��G��}m�H�6�qoS���t��}�<	w
X�}E��)��&@*��BV����d�����ri��6������'R�M��S�E�G��)�@���I#@g
:p�0%~�l�EZ�m��f��6w�������n��0�l�VwNP�(B({&��D�����%���k�z��[���,����|{���er+_i(nR~��W4+��!X��l"8~:y�5��
�f&:��0����E�L�0�*a
�$���)�_5���~
m@q���'�tL�91~
r�4�Z��Qa?��(�n�.r���"0�@���H�8S����
$$�M4��-B
=��d��[�Q�J��~Z5�"��4� �G�R��4�0���"�m"���a�����f���c:�!<�]�Hk���d�0��Wr�L�N|�������������5���
r��/s��7d�����{�or��x��(�jZ�������v(��[Q�Ax�y�z���l$i����d@J���.���B��\NH/����S����s$L�j[�����0	J��6~��3�f
����"��A��D���X��Zg.�[9���q�*�s�����x��eY�p:����a�RV{�M�xd���(��6��S��\������d��md���
{�����^4HhX�������dDj�is%'pn��D�Zx�<�Q�����tz4�V\�����6�1�
�h����5f����=��7!��G�h�O��;����������v�����~����L~1Tp�G;;�9H:�l��1���	\>���ylqO1g������������I�u=VQ'��<��K.!S�P����,;���g\�x+*���	�b\�2����k�(b�<�������*�����a�7gY�'K(���(�pN|-�XI����f��O��8�������V�E?�����`-���@\{X��ql������(�����Q�p	���g��A�G]�;p���,���\��y������[�C����zT�����d���*��&P�fNt�I���r�h��������r�����d>�l1���XX�!��_���V=n�a��"|lY��Yf�]�1F��ZB.����%���s�������W��&�d���@��h��{��3W���h<��3�j.�����B��::��f����CK�'��n��*���	MfAY�h�bx���k��9��h��� �&���@�@�v�F���{Y��>c3��M4-���(��`<W�F��p�+�����;�E#���HfD�pU02A�F����{)z�B%j�]�!0�n.b�������O����:0��g[�jZ$tZ�q�q�U�� ���QjM���~��	�"drt�]���a�Kx�B��B��Y�	�Q(�!���Sd� O����d'{�;�f�P�%�.�'�goW8�?�e�����YQ�|F��|��14�28U����z�.����x��o^�n�D�����-V	��%�ky�Uk�3o�e7%���A�5����~L��;������i`��'5_���IF/ S�/!0.�7W�N[��|�_�VD[�v^�o����6Sr�Q�SM��%@����k�-!��9'ZhW�����A_�x�*3����j30.a
��m�H���2n��=�YY��Lg���?}�
�l������2��:^��t��z5,�G�j�`����S}z�*�I����C�qP4Z\��FT�-���,�o�k�F�0���$�i��A�7�MQ�eh�Q�w;��nY��~%�h=����(�����
T�[W�+,����>�����~�$Y�j����0pJ�� ���w�eo;1����7��e�\0��p�-LV
PKL���O�EU��W����
jU�G-k�mC3��l�
���
 ���	2X��	D�/�Y��t[p���M�7����c����� :6��� /r�����;;��iA�<�c��"������1�+��R�6���7X�%�po����_-�ma	���`���3���������[�f�H�.�
+L�?�vY����q8�4Y�G���HC����`t�"��Z��M~GO#��Gm�QK|{@r����(���=�A�C�3�}��@��#�z��n����5�H/5jg���[�����a:��1�����Q���]K�s��J��I�C`��_��g����$(bI�_��"�Z��R�x����@���<e�qQCbS��i�-jKo�7���"3-�l�\�j��z��}�`@���n!%��m����`����g�.��E��-�"S�����!%���&���-$���!��G,�"[q�_Q�oL��vZ������Y��#y[�����w^��5#Z��nd*����*�(<��n����}�����Q"$g���.�+��z#�=�5�$���~�V������
���e��F$=��6����W��>>�a�.2�4�^�����>�m:,]�E��,�}�@~��0A����v�"���Q�:_@\C`v������w�����{���qe���!��|�~�xV���r���i)��_�%�.)N��[�B���L�f�+�xOxYv�>�[��Bmw��(����-8�Bg�zhB2��{���0��XQIq�C-����i7g���;�s�`��#Q��{��t��Q}^�D���2Lh��p�����R����6������ 0!Y4�P��5�#���{�/�����D �����������7�=�����S<��U	[g���9�z  ������]p��A$j�gW�A���#��U  ��4@�{3��yZ�>�H?����8D��$:���>�dTd���}��+,|#�P�-���c�R��(��O����6�6�>j�B�Q}&����+�\At`�%2n�1���������k)gL�#�
���������NwA�����q6��Nb.�qJ+��Es��A�|����XAQ��!�1x���}�P� �Sp<���������]]�lvX�f�T��U]d/C����d���*���B�7}y�c!Id�����G0%,A��.����B���o�W�`�<�l���i�w����������nT7�.��0��9Ddg��!
:��"$�
']{��GG[g���
�V�����BXEV���rP�F��A�G��P<Mq�R��x�H+�����r�T��w�� �#d������ci�&xf���o�F��3F�D��O%�����r�JK������l����5������]��[�)�~�n[������b���	ey��>�m����v���LQ���{{�3����(TN c��<B-���XQp�(k��#��;������W,��"�vv�B,�c�����x�U����
�@�.����D��#����D���a�:s�A����mq�'�"�}_���M��u�yo���3��������
H���n�dK���\����o��G���	(l��X�V���id�����g7��V~T�Ea� �0���x�}P�����cG1��6�T��o}� M���US[�#��?]����!�1��qz��nv
\���y��� @N6�A����7�#T���{
���A:�c	*A�q� �{`�yi-�c�V)kt
u�0��+>�������31�q�UT������jG��^H�ck���d�f��XF_�A���-3����Xl[�
���q��s����`�p�����Nw���k�i��m�����>�YR������E���e��~��	���F;����Qme���j�u���N���e�x�$�}�B)0�����[�p�[���Q��
�I����<�0�#�����d���X����K��hc%��	%o���-l���u�����=k������%��C���-x�'���T_�G�r�c_����X�A���v�UD��6�����I��=���2
#����w�m����|��L&���W��.�#+$�;���y�A������yD�����.������ig�//]�hJ�5�����5�q���'G^�g��Hu�5{���c�@H�	���{��I*[���#��X3���*�-�d�!�ktv�A���6�H�������ff�A�#����A�����{�����)����F��;F�:�UB�;�~���M���)p�c���gB��*�i��;[Rc�@�����C�����b�J�-�!����!KH����������K�e}�����~���3���#5��������h�K�e7JI	�O��~��FM���F# _�A^�^
P�*}��o�daVU2��{��g	o���&h����Fn�����j��# z"/�t��v|J��w�[n�V�������a��h9x3�iMQ/f��<��1��HK���T�������0��!M��D�}~F�]�^\md��{!�[�C��f��^�}��D�vG
�*��q	��/�}��~��=�^��Q%�.l��l�	MH�B���a����R���3E`M�����,�i���$^"i��Ay��0�F��lE��&{m������c�\VX�V30~�2_}g��if����FG��bs�h�(�u"Q���Lww��z-���
��G=R���Fw[~�ib�zG��g��;�\����Z�����������(�w�>�u�;�� �l���WT��3Eq�Xz�YK�5|M����=�9d����>P��k���
���m����
2���}Q� 46N�7�c��2�^c����h��!�"�^B���p��p�>d�(]h�$9��BZ�2���8�do �����~�<$���5�.������tu���{
QA���+(������n� �S��yN�w�V�Z2��)�=�M}Y�Mcr�+Y��.`�:z��E<�R�K�l.[��w�����88�8��Az��,.>���{�vG�?h�m��Y�6����9�wFa��DK��t���Q���5V$�5��A���$$���?���x�^H,��P���#�de���������{�
�M����	D�_1$ D{��\���:��?m�[�����^B(�-,��`�`������.i��� �� :�a4w�.q�&�sf9S �L|Z����I�OO�����h��������/�;j�a��q�+|��5��7k�!�����w���"��7F���F��S���s2���Q�3���3n-�����?����hrd�\v�e���q���j��J�@��ZHb�y���%c��X��kP��$,��+��������s����P
�!���%�"�E@I1N�%���V`���4�������'g�����ZT������EM��N�	X�Ds����K�����OA��I�0� �&����-}���@�@���VS���|�XE�9E����R�
6�D�`	2T�n������r��mG����d2T!'z��LL�@5��A�3J�p#����0>�	������F�[����}���������T��Dt�Ha����*8a(G��($���;}���!yNG�T�.�$#��(PU���YB�������C$�G���;���)�����B�
��������+�$��l�2�I&6[w��=tvwK�����������P���5OZ�i��J<��V!F�9J�����	�}��Ov
/�:@4R� �=*��e	�K�o��>f;��4��d��7���8qAQ������g�4O\N�5~��gG��j�!��WA��BTFU���J
G�5��0�rw������`'SS�L�Y�����B����I����P�5�OD�}�@�*�b�'���
������aQ���$m�:��0������H'����+��T�DD��*�B����
�D-�RDl�*��3�R������"}��}iC�l����8�:���F��<U�F�T<�P����`Z	�T{���^�%�Ade��*x�W��O�3��T�F@�ko=!�T4S,�h�G3��v"� &�:�"�T}���:v��1i�������!�Uv���z�K�@'�X��i�.|��@u���?3�HT'J���-S�[F�������_��`XO��%�s��{�������9�j-bh��7���Pgg�!,=5�����t4�����jy|�{[~R�Y]v���XVy/G%F��C������5�RW�#����l�V^�>�;���u������_���{
-xlQx������Wj�[+���ia�7�vJ��yT!!�`�����1�l����E�w����?:N����xI�;�v;���l��=h������ �Q0C9�V�7�Lz��R��*0�=~��$!�^C��Z�U`��g�hg�"	��#����+���c:hwh[y<��dH$bIT!!��������m�H�]� nd�z\���3��t	��������q�Of��r�H}�,��g�d�Ab�B�I��':�7a!4t�q&R��O���PS��f�O�����w���M(I���/(�������n���fV5�O(3��������������q�:�a���g���!��G��@+�"h����&Td��;�yGkj+?_�&�X4	��H���@�2������?�f���"��K�g4c"w�w(�Q�	!� S�4��Y�	� �{��y�������B����l�m��������5����-��mc����M�;~�w��|����8M�Q�w�l-�p�N</17��j��b���*|�d��B����x��^����k�}t
�������}*8�u����Z���]1�G�k������NN|<��(���h��x��j�G��>�� A�w��7���[��~#���i$���:�83f\�1"�h��D�a�&\{)�Vg�%M �]�y��������(�3r���pr�j���X��G�������M�a���#.�������ZO�����L$D"kr6�YG'�f������%�0��H����Y)�p�H"��*du�+�(�~@�;9Y�FV?(���&"�q�j;�(���\��	��^��oGs��Ou9]��wx�sq
55dhZ<Nr�Y�/;u��	����N�7�����{Z�n"0�����f��}����������1����'�BV�Wm�.�r�����&�������^��+�A"�1�@m[K�;�llx�5	h�oR���B�G��n��}��zB��k|�4Hq+���l[Lpl�wb�u�)J��c�	�Xugy�w��#8G�BFIv&��~��fS
��$9:
���MEF�k�'�C�nSk��GNM0TVz9B�����H���O��Lz�.�,iB��j�����!���X�)�jc��"N@B�����2w�;ev!��o��VM������F,h�����{4��k
�Xp�:!S��#�Z$G\A9�"�i7V�hO��t{@Q�|��;��������������6�,wbz�Wv�lY0�X�==|y����wFl��2�Pd�M��/�9ewFA��Nm�B�i�|�f�S}n�w"��CMn��!���a��E#5O5]p�%�&�Z�H����5a�]�
��������yW\:IF�gx��O�2�O��;
^��Jr��O�vAp��h��x�CjA�[�U�9O*��w��3(�iu�
O�a�-��RwZ����#������Cn��v��M&{|��2i��\������qf�Z�]��.��0$��]0���`]���l���R�sXo?�U��0��|�?���>�B@����'K;��m9s�XQ��Z�n��t.f4gt,X������1AX��A���>R�!�0���{-*1�m�o�%��D�A��EH|&���Sp��^�1#wG
�n=�`���ew��{����������>]8��wA @�rO4��GI�������Vb`u���@��
}�����F(��9�� �0;�:�ZO]�LU�%��Qr�E7R��
�I���xxw��_e�����q�s�
I	�V���m��F��-����l�:�r96�wO�)����S��D#��8
P��
 �:�4|��$�t���.`��i4����5J�����H��I�l�����}^���P;��v��M����.t#c,w;O�s�������E�����`���
s>k
wPIX��iq�yV��,a������(K��c���������O�V��M�m��l�xde��,"����}��q�L���i0�83�����@�.xCFY}q��E����x8�����b�w��Y�@,IY�k���`R?6��^��d�]����D?�=Su�[s+2����l{j��DCpF�������u[��Q�������������xl�������^!=���p���8�[�;�f���_���1��W�����h�B*J$l���J�Q~��E��CFx!�q8t�(�]A���)*w���3J�m�`E47�m�)�tF�����B5�������}��SIT�
��8e��!�"���2EYq���#�Z����@���5�'����8zw�$�Hc�w0����?��ItSD��`����b�����K�:PHd;�0
b�jT9�j�V���;)�(F�/��-�K��+��|�cvM�Bd�8M�Z��D0�
[S!|�^wu�l�s�6����(Bd���������*�i�<��F4��F���{����J���ZdC������PEv{�&�2�yh��'*l|��gC��HU2��^m���"}�0Lq�2������2�|tSX�k���)1[4u�%Awg��e�p3��	�-T`��J��������c����0�f,6���Ic"�0��^��d��p��Un;;��������ng����eB:�-�a���q��D6X.�Px��Y�SC����:���0D������c��Mv�-j;[IQt��[+5��6�����h���������P��N��sXG;m#|pBiNq�1�"�!P���S�)@3���/���=��D���MB��\��E�Y�n c;�9����6���5�����g���9hx�aCRz6or��V����`
���`���{��?w������,q��	�~��f{�����>�c���8�!3]���/��9��"��,���}���mrJ���6X�:8Z�i����?&��Z�! kZ��=5f���f)s���8��Zu����
J��>��0gp�������a������D�_������5��c�
,�8&m^Rt
�?V��"�R-���o�Y��e
�8�9��Yz���"Z\��[�h��h-��Z����4��NGe�:�SL���8C��'qu�]�=��TDoH�+?wNp;���w3� l�=:�b��%d��5���x����q�j����U�sW��0���<�����:-�S*�����,���V�Y���f����}�oF��l��ZONgp�����<\�D ������Se
p 3�
Rn:k;jhMa
�:�*�k*%�B&��U�:���<�4�[ ���f
[��r��/�&�m��������e
R�b*���:��4��0�����t���:b�O
;:8L�"zy-������)hA���Ab:�����
_���9b��|-�P-����!�N����R&��;s��(e��(�,��
7D��)h���\>�gJ�)T�?fI���%W�B����tA"��t���C1���9��R�I�������K0�^&�����|��~@�8\e����q�#��h�/<��W-���a#���zz��(��l�Q�t$����v|K��H��*��������yb�)Mh�S^cI�yQ�w
8X*�T8��������x�9��xl��k����	�L����!�d�s��Nre4P-5|?Fo�����e�v4P���������S	k�Fj.�yb?�G)�H�l��P,�N=~�s*p��9
.��'l�D�[)L`cU���l)��G�A>3oE_�!���|�8B�~�g$a���(
q:��l4X�;	��h�N��.�C!C>��}V+���H{=����9��"3[��W����N�%��T����4���B
p� O�ED,���D�)���
*+�;Q�G�o���cS���jC9,��K8�,L6<jz�\X�=��o$����(�K��L�^����fD-�%�`}It�b=�;s���`M�SQ�������tYA�M�����l���>������qAG'�E'�%\!�,�3���}rKx8��'��-�	��f����%���uu�6�U������m����|�[Q:�*o��SZ �"����� N�+*4� �{��-���Bs�#�2�0P6�}��g��'"J�[��%�D���p�k�M; [T,a��]�G������7�K�'*2���}!X?H�u���;�q1��,j/d	>t
k��T�V����G����������
�,��bK��iB�(�x����":�P�N�|�m���n�e�$8u���#Df	���9���PD,����)s�Xvi�/��K@�pN�88��f�C���]��.���j���"��?�N|��|���jp����V\|1�7���gP�*�~3Y�~��i�h�=���V�iQ�f>��{J����Y�Br��.4lxBQ\C�e���]�Cx�-�	m��@�BWz����9����m[��u
��:Z	��B="��b��8�ba[��Nv6_�8�{#�|Y���E���h	��y��z-���\�T	�B������$[�����vu��N�����k�L�>�Dl�������������B1HyU%C�c�6���m�
�c[����^�����hN
�����Z�E����{�����l��n�y��L�`���mYqW�l���;��M(��m!�(��u��
�R�R��d��qGPH�(��E�\�\�W�&Z.0�'�;b�,�8m�i����@;&��d��f���9���nz���Y5�pm<�)$�s���#kYqg��l�k�}(vq�v2gR���7�l�AK0E����Yz�:n:fR!��\�������kj8��^}���X��(M�y�wl���M��q��s3�f��;���b?���;'x5�D�����G��������G����Y�2�&�.���~�2i��"�>i��~�����@�G=���]w��q�Z�
�����Sm4P"V�����.Q�����$.�&O���Q�`�>������Q6:5n��6�%+�V�v@��:���"��h�k�l�r�6r����m��JDo6�-�XrN�{t����qv&���X�P6D
��X���s_4�w�E|3tu$���'�L`� �����0�$���3�v����tc2z��1�C�������{��w���I6Rs��W\��������6NJ�(a-�R2?�-�W��&���":�l�.uw	���Mh�d�<8�\��+D��m�TR�l��?&2$���&�Sn��`0S=�n��P��1#P,��D����(��� �$�����X����m��f��F���&fj��?��R�6k���j���Cx��B2�N��Anwc�e��w}F�+[�m�$�{���Z��N���g��bP�! ��4������D��-�t�z���s�5Z~`��@�};�o��$W�n��(�b��#�<��%t����=�1Y9/��"��Bu�5!������o&0�YS�����m�4"tO�G��|���X��>}k=���)oLco3d�B�]v4�1�7<��i�rO/r��Q'�So�=J>��3��p�jDb{4�-��k�ypP����J���r/��*�E��3��48��v�@z�4������e[���G4r��bV��)`[t������Q�j�i���M�����k�p����#8��9�yc&t�����m���2h�`��Q#���)1��|�>=���q�� ��!��m�#Hi;���r�	q��$C�<?��_�Q���6(��5����6D����������H$��O�P�e�V{mr$��+��DaK[��U�����>���KUg��l�����D����fKj��m�'/�����T���A��3v��������6�#0����@����c�S�E��#<�vA�$)w���:&�9\�(x��X����xzzL>���5��0����hqJFY���WS2�����h�8���{&R$D�8G�E�Z�6d�a<�����;�<�:
��%1���0
��������(Vd�wJ���
R��S�����
6S�����2�����)$�����H��*'K�c2m��c%E��8� �����w@�"u�i�B���&���<�#H?']J._�%t�*(�a4�"*������Q%�(9N���Z�����������< {c:6H���fU�|�����2�8T�)�����1�0d/���]BW�����y�D�����^*���1�����?��};7���Zx�w�=.2��q��'���#��C�P�S��\�oN����=+-l��gB!Hk�q@�L���lG�`Jzd]�>%t�/C�����M����I�����y8���r1t�GpU�rxe��/���������q������Hd{��@jFq�b��#���`���1b
�i�h��^�hb>�]�
��W�B�7+�,�����	�����!�f��(�I���@cV����bc�*��&[v�N@,������{�.d��cE����l�
	TO�VB�|�'�:��N��"CD#����)����+b���&�mI��y�a��W��G8n��HM2�6d�mMMmv�6np�]/!�<�����6G<������2�!�'���9q��[q�K�e�|��Aj�1O#��,���F�@��cd��h�f^5�b�2�&���i��qx�Q�b��t6��Uu�����U�>Ez��w����Y�s���k����J���HM�(�~���r4g��d�����%��w��L�5����k���?�?/����0+�X~�5��[��h�����v� )^"�}��,���tX�K�F.�������b��~/$@���-8t5{��,.�}�#M:��5���L���~5�s�;R�	���x�V�(n�?n&�w}�aC�h����-��w%����������6�G���8�&��{	)IN�E)��;i���P�b�����zFh�{�?�>��Q{�<��v��o�K�!��^G��k=������f� a�I��R;��������c�-��N���^��+jV�4�I��u��.�~Xv��$�w�-o�Z�Q]X;1��6�&M�H��^C�6F��;�����H���D�Xpi���"y�jNP������X�g_�����.)%�.o����r%�'���������`O��H<J�1����������m�"���h���qP{"+x�a�������a�J�A�E.��,F�-L@��9���
J(A�o��>{�S��h�X�3�U}��5�����Xv��.	p�U&tv|r>�4R�z�J�w�uL����)c��c{�lc`��o�1��wS6���@	c���6��e[!���`%����F��J��1���#~/T�����	��;���\�<![O��w'&��"����6AYx�I�N��+�}{G:�+Ze
D�(�h�r>��k��H��p�����c{���1��u�k�h�-W��K�@K��� mG�h[��[�D��H~_Lo��<B����	�;M����.���"��J�x=��@Zy�it	M*l��DH��w����A�^h���_�1Y9��6����s�<��/`(~���F+{q���6X)��VY�(�����������:>V&�Xq4�}?��=���=���@���R�D-��|D�{�~2}s)�m�-k��^k�.�"�<)�1N�F��2�p���Q>��(���|�VB@|G������0�J���� ���'�y/ap`�\�R��pK/��Ys�����
�<5m��(��{�DN�'��k�o�7>�2����G���*3�Q:�Q"����� �.�
���a�"�`��#{���f�`��)G���0�R�	���/A�����"L���J�cJ�������q�B����u�*�36��:Q�b��� �#z�n�K"w�Q:z���V?G�����w��!`b�����w���O�%�,T�������(T�����O7�����w�e�H/����������^���?r�oSS���S��?�#���.��1�%5�+8aa�tH�k�#�������%?,��pT����A��Z���o0Z������s����"���d�V�H�R���Yu������gY�a�E�{!��/���E��������#�a#���Z���V�Df��L�eYa`�K�Y�>��l�����4^�",��#&�R���s�R�Otae7���b�J�IQ�+�&�%G������O�U-O������I���lZ��hA�Q��,3$k�6�����_���G�v������MGa�� i
�g���-)�?�g�AaA�N��a��~D�t�[5���dE�a���d���6;T
:�rS_a$�;\��S8���8���t4M4�����������#W�����p��8�j�{������
`g�A�l2Xmp����l�0#�l�0��uH6��1S����������O�^E���C���E>U�s���.>�(�����#[I�ZD��NZ�s������:?������������XGl����Q���R�?�������Rk���B#F���������B�W!F���X�@>�f�gT��	��0�6�Q���������P�STR���Q6�����.��S������J�9"&CpQ��U���H����,x�o�"�R
Y��ac)u����8�z8�j�"*D��
��������S����UHE���4���|��Q4���Y��	�I>��Vu��Au���q����I������z4��}��6��Ln��oQ��V�tY��J���W�E�3Z��
�+]�F������C��R�T���i��� �k��cxYw��UG�&�3����]�e����R��`lI�*�DxVm����5!t�~��/��wP���I�MC�nva���)���k(��{
'@���{6�|��gEz���(q0���F`T�/�w2�L"�&2�+�J�{
P0^|��LdJq��N����Tu�mDk�p�V��Eo���� I���n�3��UC���-:�2l�
D������m�O�g���*� {6�
h|������@���#���0@�v���]�!U�{�'W	��|����
JX���z�FC�������$�q��
f��a�'���Y������jQ���x��2�`1@������6���A[��+�2-U�������G�5��n���B���1L���a���=q��=�E�Z��l1���r��N��v�_�F4�Z�Ko���hr8��[4N
�������
_�*0�� ���m���RO�R���r��a����'�����X��WyW���W�`��X��"����!3�>�(�4;�;����6��a�XK�=0���x*L`G:����Gij�c�?�!�����)��r��D�z���?0
z�p�F��i���=��������������Bs�?���u}8�*n]t���)�n����W�j�ez���>�������w6��Sw�t�w��Z���*��
DY-�p���[����\������T�X���}��j>����m����&.{MWt
�L���/�8��<����=�����>b�d8�U�3�!R@7a�RP���m�f�/�~Q/������6�f��;�10�~��*I1���9���������������o���W{4sk�7���CO'nS#>��K,@w#
�zGV�A>��|��|�B�Kk6��T���_�_k��p�&0������1��Ww��O��m���u��?���dt�	����U&�]5�]���IH��
2�2SB4,z�2��ar��)�mp������0!��2��-{��o��_k�	��z�Q	$��qP����-IB��e��,N�7g�@n�+�h��y��� �G=��I�y�le��]G+�:����ic#�{���J5�e����=H*��
���Y�*�=��v�����	�X�CE������C�p��i'������G���9+���I0Q[D�k�%p��m�9#�w��?�[Aa�����Sn�i�5O��P����B�;f��]�(l6E��E�IS\X��^��-%���������h���h����� z��O] �"2kB0�c���:./;Q�l|B�;�8���3R(�9xa~������f���fhs��Z?�h��!#n�l{��,��_��U��iJ�����h���9c!�����&\�����������RT����	A�QP���3����b�o����Ij�X�����hE]���-\3TQ .o�Do�H�����)T���D����W�E��j~�"NS�d���|���0��|Z5�J����~-ux���5��OV�.���2������n�1"R���Z��di�2��XX�v��n\#9Kt�����'��fD��?�6�rD�6��J/�����^�8%����&x~D��.c6�����[4�M������QO��N6q@�Ha�FCUl/6�������c�15�'�����dKL5�z���,����.��'�����V&�����I��g�C�����A��0�?,��E��h�����1���\�p���A�����;���hl��2������^�3K6��s�����X�(���N�V�#&�������m�� �*�1���;�[��2�VaQ�w���dL4����.�u�.y�o�Z�|��P	f�^41�I3��`	5EhS��gk��"�Z"�
{������H��V�u��k���LP��b����c��+!�� dd��L��
�B��h��0��?�r���R�sD��3���;��EP��0�y��I��
��w>_�����c���!NoR�EoX���*�az�B�nw�p'���{�����k�m��Ggt�~[�V�!�@�v�3�/�+st���]��W�h�]P�k�����\X�3��=���:���M���!$��%�Qc���iPR4e�&����F�����@���6�),�����U��aL�F����$��t�1
������������f�~�-�)q�N_���	���d��$���S>?����Pl��8��X22�,��n���.��qIh�A��O�s:�Y=��nr��V(��Wb"�\t���
7#�qFa�]���ix�tg�fZ�.0�dgAsA��� vX���e�F'� �h���.Aa�����g����b�:b���#�%L�U�-Zd0�]���������D�P��%%���y���#Ur[.47|c9]�e}���������'k�5x�?�="C���9)��XG���h���:����Mt��%�e�������xl������n���fi�

CT��������ul{ Gn�����!�����v�d!�IE���J��
a=��jF��Q,������w�^-��<�1~F���d����x��e�{�>l� M"�o��
�t2��d��Q����1��1!�����p����C��\N"���v��)Ik8*����V��|T����!���U������+��}�����Qmn������VK \Q�z�X�N�����!�b�9�pE��a7%H�(����-���pP�#k��,���s{}s|���*k��(�l�����T�}��� �D��m�1�;��H�R���k��'�����N3F7���
����`X�n��fF���������(bl|�����NY��&(U[���>��)(�����>��&��1T~x�4�5^��@���g�������G0�������)������;�#5�+��J�HK�J����+C�����C�/%KZ,�\K� ��6��KBS��	�*��cw���&��m��E�k�����$�����=����r[�En
��.�F�A3��B"���Jq,���X��������=Y"u,3�	)G\��g���@q�P���egC�V��0�Al�J0����h���c��jb�82:KF���9C�������X��'�������-�>�g!@Y���9?}Q�:�N(�����}l��[�|k�������;o�N���$�ty���}�l~KZ�5�����:�^�}����N/��;?F��A���m��8U�M2�?��g� �8&G��1��'T+�a�!�D�����j�&j��a:|�g��0o��i :	MKj�QA��N�K�#��&2(����A���68\t	�n��:����|�^�$��nbv`c�����X��D���'�����Zi�'
ED_�4���x�{�������^,�:)ef~2��#(����4�0T�80�Z]H��=5HRo6g��`��2��9X�eD33d0B�HG�Z�����Q�;6s���V%�jDk��S���4��P��W��3�:���+��N�ndv\�q�T53�:l�q��JEj��zPz�����N�S�L�4�_�~3AP�"��PXiS8�H����QA=�Q�k��O&��N�jZ�����XA��i=:p�fp,���&�����On��i�'*���rh*����H�~p���O��c
�h�i���C�},���4!k
������ax��}�~�V�_D;��M�5��,����[��������D��D��D��)D���d������H�1�G@��4�Gi�u'�0
�2j�AD�i��-BW6�h����%$y������D�9�l�����f�)t�=���}bZ��Y������� ��I���i�4nt:t"b�M{<���N��&g�mt6���&�F����	��������Z�����M�?,�:�j���Sx��E��)3����I��wV����vt�8 ��� �>�S��C�XY"�bf�@����!�9�#$���.xw��#�{��j����KW�6>���U�>#[Q��t�����WK.d�b��i��:7~n/q�bj��:g��i�_�b��AwC�J����a-�y��	�����nn����=-�p�O�QG��)H�P,bW����I��X�i����/���*	�����#F$���&��x��-��>�{�i�������j��C�����A�����XB(0������N���QO�)nsA�Z��,[4����19j$?c	��`2-G{""��2v��RF�wk��^D�]�Mp�BI-����`��B�N&���;k�.������M���Z~9��}�YF�_�m��]$G4�������

m���~2�����*v:%�W.C�f�L3S����Hx�7��B����h�h�O���Ic�D'���'*W�p��W��,gR�EX�{��VO��5�}y����i)�D��:P����������WH4a�h��YrU7���wS���8�1�tD����	g�����q>J�t�?#=,GS<-
�X2�|<���?};e�wJ9��y)�_� ���w9����R��N�0"&�rd���-�-�5�=�ul}PN���r@���@M���X:����"}9��%)�._m�^%�2Z�wMo��]���.k�����2���K��ka��=��}6���g�2�q��Z�4�q�0*j�.�Qh	�������K��4h��o�=X�+�<��O��	�l�����-%�$$�=_,���f��9��Hx�S�f~�3k��b������u�>��������d��m�H�c]��=��	u��(��L�$��Md6�K�����Cg��
Dzl!�d������,#��Fm�5�Q��qB�|dg��n�p�,��e��e��+�� �����[�l������oG1�Zb�����L�eP�D�����+��c�,$g��������.������0�}������e�P��F���V,�-0���o|G��g��mTgYI��	����r�\����<'fc�'������M�O�C�-S��mw������'��c`���m��}� ��5@�5b�4R���]��vz�re��}go*;�R��qnd���� ��!��J���&� 
u})��V����Y�"�(������=%'eS~����<)���Z�O-����j�����-����)���D�����C!��Q�����/��h���$��u���s+�-F��{^�
���:{l�������$����N2���.����1�|�r��"Hn{�o�7��Y���oG��(F������ 1Q��
=�iL3{��K�>&K&�2bm@��"���2�lKdT�����#_�����9�Qdc�_�;4���"����'��X���?'J��kD]�m�y�V?����X2���[��q%)vc=��m+ �Jn4`��%
���/�`�a���m��n	{;&��
( ��F&�.��:e;\b�����j��`
h[��k6P�u�9\�%��?������	p�F�p������j��H�y���,�{w������\R�����$[�B������vS���.rA�J�(:�f^1�����]�Ql^��v���H���3:�� HP�
�B
�������2�S>D���b	-������hb{�~���w�J�7N�Y�h��M�a�>���
����A��|�r���Lw������qB����i�ai}���iH��>������q�#��885�4Hr5 �r���Y��f@�\	�x���a;"�mcd���I����Y���GNS���WO.$R�^y�)0!g��`���#j����m� �bl���	�4�1�.���|�Z�[�����[0��JPK4��^�����������K1/-s[�����C�Ac)�}�v��.'�L�a�CH>P��q����-P�d{��g�IL�P�[�#����-xfO�Z0B��'s0�0S#o�z�a���r��Y��P�s��������UK�|���9����eCT'����n���?�,��^�	�1���h�
2���Ek�a��h^��g�]�=����[w�ogG�c��]���7����N�i�����T�l��6�hK9�z���$1����=��D��32�<��P�2�O2��`2�q�9�,�I�Y�y�LJp�C��)58F.��`��G��KKo�"��r������:skJ��!	�X����kF=�S,�����u����8��ltx<�@�<	����Ao�:���Y�
y�����h��-Zn�ag�A
S��UM��h-�`CNa
���������{���i�qKP�Fu�,aU�bq��������8���4��m���|�M�l�6��GtDz�^�M�����&<2�`B!
 nD�:�O�;��A@�����'���N[��TN��`[
gOY�Wt�:�HW4����-a~��g��':���C�����I����-�OusW�|���W��������"��8r��a�s�0|���gE�(�c_����$bAt������3L���.u��Sc�#�aKK5���3l��4�Xi�s��)��<������?H���A���=�5��h������5�0�P�r�F��#���T�xM`/�"�� A�P�
�m�B%N��;��;���2��Sw<u�����eVy�������������������G�b��%{�Bz��t?Y�Y���q@��R���P-�������k�K;%N$]9vaji���'�c�w�����8�Z�2%>r8�5� F��#���n�9��������T����:�Z����y�?��F=:�D��z���>)g��G�E���C���rGhG�����j��~�g�7�@d%���3�}�%�T{2ZIdp*^�o���oC�f��80���{���,Kv8���(���.c�;���z�*���������X���6l:�Y]������������GT���H>��8Bb�������$�Yo��;\�������u��i��%d+BC���D���=}�P=�^B�����R��|����a���q���\1����V'��`�����8?���`"9�<E���%�gIN���?[:��;����fQF�V\����	Z�2#�f��S��{!�YO�X����^�5�ab�`����vq�a�����P�,���������0��~&��w�i���XH�#����\Sn����-r�y�!~�~�"n)Z	����s�Aj���x+
8CT<%����@dw=��]��C6\S����}Ex������
��&'xAmq~�����!����� ����������Q3}�;�%a�'��
�����������^	M79Z��������g��6o��)��pZ�:������%��;��������Z�$19VD��������k��'I�I��|/$���v�H�}j�;HZ��A���`�l���j��6�'��gMH9T�l�7�q�!�)]�+<)�����l�r�o~B�����u��S����e��t��X5J��~��U�L���N	����L$��yG�)�.����������[q{WE�E&f��z/dF2n�4��E�B@�&��e�E�6����X�%���<$aL�!Q��{���:��r�j�pQ��{�[)4���V����n/��I���	t�����������G��������/z��x��	;�D�&rd�<;9A�)O��w�]w��H�����.?tv�|�|�p��V�eC��������L���ICCCp��[p��.�^Hk)�Q	���C�{!m����/�6`�'�X�!��	��^���[�
�L%9������
�'F��AR���%��a�-=o!I2�����nJ`:�TZen�5l��mx����i%����dno���^���h���kZ���Y��|,,���H-���)t9�%���>�l�A�	E|��B����_������2��hX.q�����d[���X���lG�W��X�����A��zy�ny@����-�h�"&��V�"��8���4:@�4�n��<�����Z��a&���i�L�=�8]�24���^t���F	�I�x��%��%��!�ID����OPb L�e���E�G�K�m<l�]B��[Y�����w����,n/g��O������kq`�\N��u�3"H��������R`���QK����l�?�|��Du����C����t<wQ���g���m�c�#�Zg�rd.�V�F��B&�a~|��Y#h�8`-S�W.��������~>��'*�&�}�v�
��?�������I���KZ-����wCAk��g�tq_������Q>,�:$��K��]I���fO(�p�O�zj�r��OO*�H�I���8���>��f-�" c�
l�m4zN���e�?�3�]�#��t;L�����P��\ 2�[8�]�k��l7���'v��;_�l�0��-�u>�V��}�X��0o�q�
��3g�-v��yg5L�&��J�����O��Y�!�
O�
h]v!��"���`~T���:e#)���
��h��A�=�
�V��>�b��R�����gG��2m�w��h�����_L���B���.�~�-�Q/��� ��i�Gm�2�w<�y�d�k^�
�vJAndM,��\-���/�b.�#k�{L���<����l���Pl*�+V�3�������$����-C��r��'J�Lx�k��(�9�d%���);����w�L��QH�a8ExEQ�������*z���06�b�b���:U�L��Y�I�o��o�_��^��,�O�*lF#;�o�o��F����8,�"�b�~�����)�����h�a�5]��z(_�V���Q�p��+#(��@�����w(���D;AEahe�qd�tN���U,�����,�C�o":VR^��S�Y�z��b�R�`�����K����Pt!;�%3�Z�A�N�PA�o�~�g~
r�1�?]8d�����B����R:1$���>0��Q!Z�j�
�����Z���_���T6��<$���j�\2c���Z����k�R���8��`��Z�8"lT,��"�;��Wh��d�=�,��P����v:��C�=�p��>p�Y"���<�CS����Qc�������nd>�^B&��3_9;��k������
T�lM��>Z���"��1�h<a��9jD;b��2�]�:,#[��xDaY�Z��F�:�Ej���:�~f{o��m6����j�$T�$.��bH4#��6!�c���)�����N���Ne+�'Tc���]ek�5��5"��nGxlE;.8�p�_,���3������*�#���
Xr�����s�l�	�XYU�������+�/{�Z��-�f/��-$��da����H�cK���[���
��U��-�-{h�'�(a�B�*x���������{	�i���8����J�����Y��>5c�z�������M�a���;����?gIF�N���;}�[��lk$A��Q���Wt
Ae�M��P��%*j���g�G(U;+%SUC��J+����Y�u5L����z�:�����-�����l�6��K��Tb�Z���6IIE��mSv����u�x��%aY�����3�r�X�8Ch+s��Y�8�'���W��S�a�0��4\�{6��D���L�8��9��������cgwl[��q	ahzm���0�{t���y�aUh�z`"R�6��6�0����&�����c��}���Zoq�L���-�[@!��\��:���z=,=
5@�D��������t������Q�,�#R4����}�\ �j��{l�Yg�|z��&��.�-*�c��btma���^H�������{-eM�4
D������9#����p.5B�7u R��-M�%v�47{BEk[+FN�1,��JD�hF@�A1�������	h��Us��|��jBf6Q�5���f!H��cg?C�*3>|�������B�U�Wr�s����=�h
k'������(�k����S0)t�![F�u:�p��C�=gPk�	������qb������1"�����D�����&T���S��;r��6,/#�@lp������f���U��[��&+�H�l���e�O�����p�c$�g�g��B�"���! �!�c,���
�Ct"nd���n�O�#Z��#��& !��
<�kuE�f��@��"������C�BA
CUV��U�T�]H��5[�8u~���8a���y���oP�B��[��$�mN7Z��s��	dh`�-P���8�M��r���`M����n�.�&����^�������.�KB����H��}�[��y�&��%a-� ��pi����>���A`\V���6���U��M$�EpJ:�|B�L{f��������f�����T��l�r6E��j@�	\�"�>�w7!�KA����0��6����3S�&�'B�]2��Y�p��X����7c�4�e��F
��>��h������s�����6L�~�8C��C���� ��l���A<�n�Qcr@P�^p�V���@3t�bC�Fv����4tz�w����0c�+I�������L����_��u@`R�"�g�����M�Sh����:7��*��u���������}������35�k�"vvN����4�Iv���|9rV�P�v�����l�� �D��`�H�h�b�zO�A���H����������^�-
O�"�IqN���B��Bw�6�a��'��O�IE|sf��m��!���:��rDk����F���x�S�6�Tn���7@���w����t�]����:�~5������!�by��m���
��i����	�*��t!d���1bw�67eO�����x��9|��e
���F�e�U��L�� �^l�JQ���8�33���>������e	C��`8'N^C����mw��U�i�0���������`���D�����L����r�r0�v�5���:����:z�H{j.P�\1���������~�c�qM<T(��v':�wA��i����6u�Q+���L�a9"�w�T�����e�L����F]������o4P�g�9;g�����2��.��F���Y3=6L-Y��m.u h�������O�09��4��(�����\�)�%�� �����w)��$@���l��h���(��Czeua
�"�HJ4LX���+��F�F���}��4�'UD
��u�*�>�R��c�w&�F"�]*{�O3?��������I�o�:���n��$�FV���Y��}����g��R�>m�98"8�OC�|��M��2�_�f]>��G'�������h',���!���i�m0{�v��hQDANJ��Y���t�|��&�; ��n������X��B�[������#���/�Y�P�.lbD��nX�|4C���hb�4�	v���{��'���.\a8�Y���G��a���D��}���7���E������d��-7�_����#
5�7�_k�9�q~����J=�h�B����@��p�����h�%;d8���t#zP?�XgF�p����!D�"�O�e_�q�l��B� ����!�������@�����"�OQ#AB���=�t�mof���e��s&���!bE��x���`���|<�T��iW4�����K�)�x��<7`&��F�F��ou��c��B,�����S�
nO���p����=�d�p4X��F+�����Y]�����7���xZ�'V5���{��[��13�lM"	o����0�8��mvF��!��D&�C��������������������$Tvz*�l������v�Q��������������A:=%���$(�������y��Z�A`�`5#��C��?������RZR,���p����i���}�P<�Z�)~4g���Q��s�vEa�1g<�ak%���R�  ��l�9
cQ�:>k�{��,F�I��Z��k�0:p��%"�H� V��:DR�!��h>�4�~�,DO�D��P?
4�hRX�������l�DD��!��9G��P83 7b�J��GO��;��J,�L
��eB��*��
6�b��p�5��-��n��$�����A���Q��21����ce�SV��B��h

��:SCH��,�c�8���/��> f�����
"N�:�![I�3����M
/`��H{����W�
�h��[�L7y����%���B��j4���bq�)���k��98^cJ���
�5p�����sy��8��k�^%����x�h���'b���8"�Ck�N_�����CP�� ����f�t5��w~�o0�C�����%zO��\�������Q;�aI����6P=>h)-���;+�����<�7�-"B������R�!�aD����3<����d���-|�
$�I���X\�����h��0�/�!;9[�P��'c-Q9�p�����T�-YO�E8VH��q���O�"��0��Ru��XY6\4&ZB�69d�4�r.���x��#`����N���Hr��E�� �]������!�AN'O��b��"]�h���z������h��vN�V�i������2j�����-D3����}74�h�������,���F���>�����tn�_9�]�n�+�8M�
��C$��V�J�Yl�P�7��$Z �@��(��B;{��^[�`�������>�"��e��V���HE��"8�U���+)*J�`����pntKu{��2�A�b��(�s
?@����VF��vQ����OK9����5����qvV�R?
�?vpY+pZ���7) �F>��_"�_�lm~0�����T,R��%8*�2���l�8�#�j�i���8���?�B@���oq�e�Kd��08�eya�
�C0��:�go�6Q5��g7j�A>��h���;x�K�zl��0d]����I��&���5lCwI�{���Q����*�����8��4+{Z������l��MV�6�a�K4��<���l'��A���7� ��4!@H��;��`��6K'��6A%��l�t��~�Sw�i��fII	:S�_�?/�X�Ned�����%E+�
�4(G;�rMGF��
�=�`A2=v�=Y�@���-��E4�c�"XI&i
4�J����:Z�^��5"��/���l������Ft0m���l���H����5N�_�$��t��:����t��%Na'"�O#;"/�YY):~%��u
�@S�1���D��*�B�m��"�N�=1(�O��V�hJ�;@�3jd�0���|��!-,�,K(��;��������N�=���PH�K+v��:S�N�|�|l��d����I��	�!��E��)�ag��EZW���F�{u�����%�B����x>�VU�7
?dmY'F{�D#�q����K���t2}�z��
0��r���z���;w�S����Y!�q�IQ��JV�%bD�r��]��CJ��LI�Y��IUv��/-E���b=��A�|�k����U~D�y�^Jw�`&d�%`�6Ya�p�*5��h�Q�C9)4|�D�f[B@�)���5�lD��d��;84�J$��@TJ��(4��.�o��RS�rR��b	�(f����S��V�G_]5����v�~z��)��I��������G{=7+����Y�D�2V��t�"���q
�FwN���^�t,�{�T�K@�\�8��>��K���8;�9��4�C3D����.:��0�w����T,��q88�������/���59�z�O�;�����~|h���%�b���V8w�gT�%�bEg��������lb��*�f~O�{������f6.���������%�Vq�
�j�X-g����i`����-[�8���,_�2��0�;�I^���eD�~Hr8�����W&C�SYN�.^�7�U��+�����i���6Le��T�g���KP���Q�U�:�u'&l�f�k�_E��$�Z�����H	�b��/�S���G��j���Kp�����K�N<��rs?\u����g3u���	�����jQ�q�<��r'A�<���}	�(Y���$�_����E:��@
��2�fY0q/���9]c�6b�O����dK�����-��K�u��`����d����G�GX��B#���@��=e�,!`�Y8�\Qi�`/���:�~���"�1�tPY2�����]�d%�������}�0���
���'�l��<���~
�u�� �%d��"&�Q���}��J'5mfG�*n1�sT��4�n���#�q	�`O��	�n�9S`�@�"7��fdi�K@F�mY1�����w,"�VyA9��X���`�(�O�lY?q�W���((w�?�5����3�O_7@1w#�'�4��R�
G��APr�����R��E�s��,XZ��}��)Y��Ql�AM��[8���q\��c�~�����
?*���e���&�2�P��G*�N��1x4�lO,�GJd��O�H5��[���D��:���[��c:D=jrn;5��l��O��W��c���e��Z�y��>�mm�gc��-c�d�G��]=%�F���/��� 8cg��P:
3"l�P��c���:!�v�?���H�g���`f��[X����w�gp�u"����C��,�|"(���FMM�w3��B�
\v����fJ�	gIy����sD����
��d�X�����z���m�]g���}hE�����]��Xu��]A<��LU����:�2jmF3[��\Y��J@���zZ[H�MN��6���U����gv�[���@��(��;�-���5���x��Y�X���
��&���m���&q�0��y�[��AM	;��l�=r����e��=�P�%�F��m��>��]	��lX�����h��hUV�l�X�Qi�d�Y����-�?o#��[�L2|>?X����"{�m�����f�����S��=;�2N�?�VW�6�>&[��`��}�B*��t������������g���q������&�21 z?���sS!t��eX����F4�m%6=H`8:E�!�<n����>�(Ge��	��ZV��?���PLDHL��G��$��;�eRo��sK$�4���kM%BM��$������`4��[D��m��o�B��Sk����z�h*��^V�����R�������q�����[�W��)�q	��mc���^��G[�E�����;��lAP��]�[+����� P�*#��}����������R��
�����-���`
Dv�f�������A��~h%�r���q�����
��bu��'��#CoN���<��+�����x�������6G��Yxp	a��*�h<F8�d�a�������	WC�0Y����ylH�T��Pd�q<�H�GKp��� ��~N��=6�������j.[$N�Y�]m0���mGG��_l��1G��
@������BDS������3����([����wu:�}��J���)�|�$4��YUt>�M�h9�"{��j1]���Du������A���rd�p���f�w�����Ze�#kl)y>C(
�FT�g$��� �+������R"�q�5=��}�i4Q���8Rt{�-���'��Dg�c����q�Wz�Hr����J�Ug�[�����u���q� �<�l�������9��=j��a�"�bC���,��P�L�/���0��:�\y�98�V��B�����l\�jH�>�22����
6y�w"����;�����J���{2�����3�V{�������2M����L�a�����a'c���_��(���ql5I���y�XV���"���aI;n}z�,��{�|���z���G@��+[�%'���/����\TkF����|�69j	�������3F�]LIB�J6��%����4�����yG����k9f��g�Z�%�F���1�e��hE
�#�j-1J�H=�����>tE��#��Kk�@rn!w4�;Y##j|�A�2G�#���dZ�{u�q#�j:��I�gX��Pc�!>���pE^�!�a��h�g��)�U���,�����f�a���2r�8�oG>-�|���
��h��?"K�V2�b�z����e%��,��a���_�z�c;'��O�2�8�K_GV�	��#����:z|��2+���3�����01�?��&��X{�:a-��
�Gd��;���-���@`C�e��>B82X��HN��O�Rwpa����D��t[�nEPm�����{����H�u�>��*���$���B��n�*�"�N��d���(�����}w���#���,�������{"�y����29A�#<��-lM�H	�Jw�Ed������f����������;��j[h��M%{]0��3�y��>6yf������.4d��MS-)I�	;c�YE�<���x�E_d�BW��@C�g����0�dS����	����u�{!��H-���IzR�p*Q��DdG�^b�vc������D��^�6��q�Q]�w�E��L�������I@�����;5��&����GCy1��I������������J1��-a3����%� amr@~/�E�\��������l����
�e�y��D��^�\������L>����V��N�%{yB.�{!��g��`�"��������>��([Q%'��:]�H4�>tk�������1 _%|�:��F��s'����v�����x>-�h1�a��]FG��x���_
�!�p���=��:!����h�+��;Z}��(%�#����tp�`]K4}�p�f�W�F3��-��G��
�eC��~�q��U����d�^���I������gz��������-l�
�Wv/��8|�?�6����Yq�R':{w�����J�c&������/Jp
����-,IO����O�HL��D����Qr_�/����������
�/�'�w�5@�����c���u�_G��:6�\'{�:K$J�w�R���;��l�u��l���G�{
�d����I���p�cl�w�������@b�Hm�o���X���N� iL~~����@k4����R ��h�V���f�~��X+1��G�����GS������g��o�H�����Y��a����J$��;H���/i�}���#9w�u����	��'��~�c�Z4c�I@kP2��;\��[.���K��,�Nfuq��,6s�u����-#��D4���Ft+�5���E1:�?JI���;�2{c��$UXn��I��b�-����f�r��i����c�;����n+B+8�W�w��kV�Z �"g/:(C�����NS]�B��:����d(�Q���h��Df)������.���q����0�.�@��f-����R�/��
s�,�[�U,Z�$:�����E��|����;��:����Y�A�e8�E��w�����^+�%8h��4�[t�)����w?s'����f->��Z������\s!j���IQJ�����X�"tbd����I�R4Pb
9_b��E;������6����������_��,�N�[�,����MC��!V���~C/_�d�G]�"`�D�M���:\�(��'��V�?��g��"��!�s��:A��PY
c[(,���Q��� �d5�����0��cZ' ��\-����U2��jE�>B%�<a����I�QO��)B%��r�h8!Z��(�����*��B����d89����:���$����@1,�n��{6)��������~���E;6��N����xYn��[1���?�"\C��~��^<D��x� k��`�����Af[��x�!���>i}Q���(��d{� &}���[j��E�Z�E�p�c�#����� �AVo��*����$+/�h�8�"Z��"�!@�b��:W�bXB9C�UA��z�E���N	Fd�6{������h����&���]��A+����Z��(2��r�E^��LI��?��N�H�u�A��:#|�&��V�d�h���Y�����
��?�VuaX�E�(��c�t�m_h�(������+��@��/W������9�lapK+�����[�a�z���;pZ��	4��H�4��K��Q�Z�\�t�mTC	t��Fu$���j[�����;�����^?Q�������.n�E��V�?�L"��n��]�m|��4j�U�hc��d��[�\S�i���%eL5pP�����=19o���>�h��P��,���}�����Z�j���q��d��-��-g�����D���""=�{!������b�C��U�
�,�[�_FWE$jFT[6��w��S�}a���w
����=;$f����Z-�[r�X�Bf�j���
@P�OA�pR�Ym�Ft�Ad�������xE�-���u�N:,�3�V+�����Svfq���5*^T�%�
�a��w��>��u�o!qh�����F9��h�:��#f��*�����x�q��hc�y&9��
]�L}�A�W��J+RME�S�����q/���e�m����},����\���F���
�C�
$�����
��"`�eS�@�_����uY�a���Fj�{��{{���p���Q���l��@8��&�P3$���#��w���#�h	�>�H�{?�h��7w�����HD��B�L�����-8����2k������/�/�U�T�d�DQ�:�C4|h�#�t��,���3��xd��t��g����euas��II	1(��Kn��\A�B]-��TA
�������KEau������E�a`���$�b�gw��zR8�
-`RT�w"��V������%iC������[�
w�����=��CD3~��XV�����VsA���)i�A]�&����;*�h���.1�I��u�l��O���/��a��
s�rVls�Um�wl�y���(���Q�k-��>�\3�#��#�����eK��b�U!H1�����0	Y�X��1���������HD��R�G ���O.�#k�0q�������/N�d��(�C+�5�py*���m�+���*5�xT��8q�'Xn=����&D������H��`���5�`F���b���DR���N���LQ��d�%��g�@�a$�m���YD��p��M�u`��(r+�0�-g4�������,��(F���@���Q+�9s�(���l�|��&�
E�]Rxh1+D�{b���V������hx��f8���n��U��g6�~�;��}����3H�1i�A��yN�$�����v�e�!�jD��&C�����.z3��Z���GnI����g�d���c=Ms�6RM�|���	����pQ"�K��!��i������|e�F�k��l�"j]�Z��A���5�u�t�h��0�B"����)���9��5�!eS���+�F�:����f��f���V�'�'kBv����YMe���Ms"��q;�
3��#��)bu[���n�����r�����4��y;�$�������Z=8:���M�{6A
5"��aC���
�B�Du���6�(�-.S,6!
���|�w��H����G=�f��:l���8�`���CL�k�_�r����VZ�x!�pm��4�h�8"�����a�Y2�:��m�
�8w���\�����Mv�R"�gZC����p�� Pm���
�~������P�]4�-jx��C���)�w��0�f���oc����H��-.����|%���7��O�%�Q }���-K	�.g���0�s��'�.��c��6�h���d����\�(P���-��jp�p�����������{�����g��I����p��eJ����XL8��L��e���!"[�m�D�mP�"�����.�l�D\�]&"H�	��#�����!�%�8i�D��K���*��tw�W��������
����|T�i����O�B���<��s ��X�6�w$�Ofn7���(���dm����4�X�D#��&�Z�1v��?���rx��vF���X�Um�����B.{�:��],	[�L����(3Sz1�nt,��b����
��V`H����~{i����]�r�n��s��~��Hz��d�G[DG���|��v����qd4Rb����ev]P�}�-I�k�q���W[?<a(V�F���E�t{,�N�]P��K�V�� !oF��^��[��X�
�?����Oa�����^-<�,�S�e��%�w�
��7��F�,��Epa7x'�%�����b�f��������1]������;YD���4���L�����D�d�Bl]��b����6������<����<�����5���y#�4�����C1Hr����QbI�Js"�P�
�;w�2
?��'�^Y�%4�F�]��<��$0)��?�|��J��!D�������{������<
_���(�Aa������#L���k������������/k�t����v���T��u��4U"zn>T��,�)�?��c�V�������Q��O�}������9�DJ�.��JO����x2�/z���k�J������n5D�I��rG�n�.���S^E��.PCB��Yl�E�A��xD���PZ>��!���aX�\([������Q��{!�t�1�0�EK3�2����jR33+���c���s�N	��J��O�EKL��k�{v�?3N���s��du��j�o�(Y�a_�}�J���A�������������'e�Rot	��g�t��3A�n��ww����s<�!��h�����[wA
qK( �L7�?�����y���T0���d��������^�)��������!��}A
�6��\��,�F5�q������9�D.�]����wf��:z��jD���$��sb%���.0D�0�D���s6�����lc�ST���0����z�B>2r����	q��$�O^���#j8�:�������pY&7����A\�h���,���O"�5���H��?:�s����!��X������!$N��(i��x�d5�?�2�3�G��M���fmh�3�!�C
X�������y�r"[����nPs��	C���5�} U�Qu4{�1��Sb��p<�_��DK���&�d����	���^dr������nt�R��F��		!!;��)(I��xGC(
��9�e��
=�c�V�2�u�Z-:H� �I�d��j�H�<�d�� ��a��(N����h��%5����p��gZ��`��la��RQ��H�2
W*��ZD'�ao'-g�A�;q��	�G�P�]�.Ow1m�n�H�z\�nr���#����I���A�e���j��	�����4�G�%`O:l���5�yd���.N�a|q�$�4^��#r���c�_���h�df%����qh�����*�l�D�H�G���h72�qw#�NVsS��N���5����Xk��p\�<e�P��=��E/|�����qdiX�
�X�����y;���q���>��$Zl���6[�������l��'m��-�
��ED������8�%H
�8e��@���+=V������S��
���:�20��7I��#����a��
 +��gO�k��:vXn%�
7�x�K�,U!��\5+�9��"�����oYi���6I�kA��9L��{+���7����Esq��"�/)F���
���R/_�������8���
��� V@��M���!���S�1���,@�-��wJ��G=%@�?:az���^BYd�����@~:��f{������a��c&�445��40��h&0?�y?3^���U��N�:=H+��n���],�u?Z5����iDn>^��1�O�����)�!������8#W,��Lk*n�pn����/:����_�W�� �4�NR��M�i��.�M��v�	??�!�8�a�^����nk��7�7�����87���9?�&�������)��F`�4�������!�<��<�r�2?�&L���$,a�V��M'W�X�8�#�>�h��;T�N@4���w�0��Q
�!4����,{^:4��d�gAp�E�����L&����=�*�:R>[��&?�R%(6��"4A�|)�f�(f�V��l*P�ziF��iF4k0�e��r�7��X�3r��Cg��)p�u�G���!6���e�L�=���I��y�#�@�\���^�t5�����E�N	L�e}�)!S)L���l���P7�:
���0�#!�Q�
�i��$���IyCQ7:���/�����k�Z�>��k�=�v'U���8#����`SX�
��
t�������:>�:=���Pk�G��)8���u{ %[a%������E`�"��������`8�;���3��G�r�F��6N`��%P,������R�au����]tKv^�&��U|��9�����z�D��i��V�� 3��4���D��)��w	;x��5t���0!Gf�����4�L��&���|
���3�%�6����1��KhM���|���
������M�����H����H8W`9������u:����:��7�-�F�|=���-O����
�A�&�"cVL�=
�3������9���)����?0���=+���E���[���uN����CWVhn��3`�D��\�hsJ���KI��:���[�E��i��&%p�#0&��Oegc���~�8������1�p��h����5�A����\G����=�H��	
������Z'7�K����$����z��'���STl/��P����]��/�$v���)����\���r��_��.��c}@��-6��.;;����)|.�����A�2r	x�����DH������(M���&���v��X�6�����3��a�YU�����OG��o����f����:����a.��3|9*"�g�q���(�0����������T�h8��-���p�AZ��w��*�<���Q1�Ap|Q"�J��Y� ���R�����e8����N^x�Wd������5�]�0�����������9�E����{�gk�QEX�)���Gp.�&g��];G���l��>��AVuu�@��;��
0D����#*K�D�N�FD�Av���-���-G3���?�X6h��/��G�w�E��D�%��7i��n$�A�^8D4�+�-�hY�D�5��qy�`���p�5�=|�����j��pK��D���v�����M�)����yG��%p�e���nXH��������'�%�aDq����EK�}K`Fer���M:�5�M�����nf�K5��A�{��/������%IXDU^�6�8�Bd�/���[�K��}���4%zj�Fd�"�"�E�|<�0�����Z�����,����Q�T��
��J�������;�w-A��;�M�?�EY�6�.�~_d3�I��F���,�;[@��tksx0�	L�������VC4|���?��h�0$
R=a����b��=��[��n������~Y��'�� ��R(R�-�U�����E�*	���]��^������,ry9B��:4)nl��(��&�D�pD�����(���P�A-������*�u��*HyS�5�c��d	����p{�Oatv	M9�X��h~��Q������q"�%�w]x��|"TcQ���}�-e6i�Q�$��)������7��u~8w�c���T����=���g����.��F��m%H�)m[�������Fa	�c�t�]�g"p����OV��lC&��Lu/���
H#�����OB@��'|���[���by�U�H4z��K����+}<��`��'
Mt�������	�|��*������	�:y��,BD�AQ$4&�dv���������

�L��2%��=H�q�NJ8e�f��!Q#���O
��)���hF����>L8X��hVxC��L�k��=�,��c����A���C��0�Ql�`N��Fz��I�l+���{�����9���tfK�;��
��<������o'
�.`T�oC��f��	{����[���,���	��tY�'��������
�6�t�bUB�[�G��m��[*���7��+����b}����CF!�(�ro!�pN�[U����`b5��=e������n��#���Y�[��lCf�95��0 Z8,����l���m��=n��%���8GI@b%�yv������j!��k�����pD������'�gh�`�-<��	��f�~t
uX"���J*3:+���l��J^F72~�F�'<wr�4�}/�F�@@EuXC����"���JE���fo��w��N��H#���l�Yv�n�-���g�
���{"�y��	��l<�!G�� �("�zS��2��{`����>i3y���:[���]�H����}�Y�%����o�{�d�����S����q�T�~�����F��r���M�|�n�[v	�p�A
�/\�"�����	#���o������eBR���=��������:cnAxzg��[�G!uM1!����AT��'Bo!{9.�����u��������:1�VW�(��*$�)[����c���yl
;���H�t�~D}�cc�pP�+A��2��m����|&O����3��/�<R������	}F@?B:��NOcFL�S>3��S�3�m��GpG�Nm��;����
�#���q
�E���{?�����G��U��
h�02(����8Yz��?��Pz������6��FH��#��*/#��{��R)5kF��z��@x�w����);F>H��#r���B�5��L��L~�r�.���}w��U����'�%�W��g��@�S�g����
0����R� rF@L��8��TW�*&�����bDu��A�� ��F������QPc�����$���[_������T��gh����#��{R�}G�FU��ra�1p�o��!{^��l���`F4����"��F�c4C�e2I�}3=�U�������&��X�����M�t�gj��-j<?�:Zv�=y�'� ���{^��b����c�K�pW��
�n��F/Ip�W�hubxp��V�==vwfg������p.	��ww�<���+0I�!qDK{�g���>������]K���:����p��Cy���^S��#����-��^w�p`�0�����}��y�g�E�v��
Y�@>%q<��9�9��q������g���\k�����C<;�|6N��]���x]���-B>�N2{�6�YNhb*�X�����	�%�����Q�2��wO��)�b(�uZfaVg����k�F������s��\�b����?�2�|#��_�r�j���1�~q`W�v�O%�g��P��cC���?,��63���������A�L�w�p	��L�7��<;�����r�_v�10Qtj��pP����j9�9%�j�N|����P"	�Op!1�������b0b"��9N�r�R���������h�XH�1!�&c��b
�>��w�1���^�\%L�w��#�i���*7G�O�^���������U=���{!/n��w�SL���Dr�^(4���R�r�A4����#��iv�#({�Q���I����d�z�b&�#?
��������c���n���dD����]#������}�&�;2���L�z���dV'������0[HC���9��0��T����*�R�O�h�����5�)���"6�4��3��J�ET�wx�rhm001��AS-I�����;r|�)���I����g�L�Ze�B"'D����m4�_-Ug�_B�	EO�V����8��C�D.l�+:��N�����5|~P����O0��vj7[�N��c\��f{�Z�IPl��X��Cv�N���$u�9�����Pw����4�� �������F�n��H������Dg�����v"��w����64�7�����n��;����2�e���� ����S����H+Dk~�[����yK�Q�mY�.�_����E�bh����|���~��S5@��}
n�Fl�uR��)g(���Z�$u*�Lb�?�O���-*�"�{�M�%��}��K���w/T��z���Kx�����H������g9�����@�Q7��;�2�g���QT���&��~#�p��&d`��0K��w��t�]"�yG�Bw��;��F9B1��XZ�D�e��8��jy����|�l�W���3jUJ�K���u�tNO�5��AA�����x���$:j'�I��	�5V*G4�{�N�*X��e[W����("��R
�A<���6=�_���gQ�A?i��#���b�1M�;�>'����S�9��%����8R��_v�/�P����]��:f�A�@u�'�Y~��L%�C�P
�kt/B�R�,PM�^��P������I��(?���#s�hI;Tz�t���d��"O��TN����~@D�[��I�I[�'V<h
~�����?!��B�2�������K�ZL�I�2g��	�?E�E#��D�h1� �;S�	�c
�����i��]��r�Fj��B����!�V��I����D���AyY�BR����k����[��JF��3��:wNZ/�����
 1J#�e/!�a�;�Bkf1��O�St/�O�-8����m@��|_]�i�������~T9����Q
u�,$�
-=%�X��x
@/���3}�������J���~���
#�d/�]�$��v�b�A�o
�`�|�!��Z����a���H�����MtZ*����#R���}������ze4��2�;(�_P���|�F�M�R
�O��Ac_�Q�I�������/�Ua�����
M*~1N��
���M�nl�'�}��x��x�3�V��+���4H�� G��+�3HTB�z����oybN�:���%0���B$�����:1��-g��XQ���������{�}b���
w�� Y�������#��`���%2�����Q��44�H�����'�Z��|=Y��SQF�Mk��:���(!��U�0�=��5��B$Z��=��5���V/$�f�`I��rU\��_�����T���95�AI7��$�
��%�L%�������KxaC��2C��~-|=�C���n����i�	�D19T�e�XB��UE��oXV�hOd5[� LV�A(lJ������,��-�Tp�Si<���h���hD�'l
5j��t�����\p����0�-hpl���?M�2(	Y���H��I�NC d����u�6����C�TA^|R�t���K2�uJ){^#��=��e&*
��M"9�#�V/1Ub�_����Jf�����.q�:��#
�+i)�����%�l�>Q
���~-[��l���6���h�+���@�8��-�_&����(�Z�������s��JOP�	���;�`���T�!4x�J��65}�oB
����>���RI����5��Nq�O1:e��o�)�X�f5��������cw�<�W��%c2t��RG���j�!��>1�����x/�V��4����jH@MM�}�O,���`D"��?z�R��Q�`![-��N&F��J�T�ZC���IO-Wtc
n���Z�����P�d�uD��v�j�#��Q��k@�=�{;�X�5�������?�JGy5�LM}/��P�"y��'\B���*[
4,t6��o��S��(��0� �X�m4���W5�,���*��������W
�]���%��j�a�S]�����2)����1��][6�t�`#��E(Yhu���{��&�6�%�lm+[����ar��U����j�j��0�pj@�	0���g�'�&��~�x�>��'�K(�����AWc�J����JM�dW�}4sZ�P���&����HP���"���^���Km��t'�h������$�s��g�X}GN�
,���jpA��:_mk1���.4C�C�"���4,z/a*���GD��=Z��2t�0�g�����K�*yE���;]
<���<t��Cl����7�~�k9������I�-�����t�}v`��a�,�(D,�����#���I�����-�H�Pk�&����H���3MB;����D!����L�YW�S���4�0���><�
�����������h�y�3��P��rV�z���~q�"���_s^��[�������T�\w�Fa�0�H�9x������Zg���{lGg�D6�j���J�����:�0�"�HfD�F�v�����o����E���\"��}���{=q%|�(G�-Y��p�X�bm�.����~�����[O,kD�!���8����W���m4c�%%w��9��+���lI��4���@DoIih����Zm%�(��E���5���m�M��,�Y+���5��Ea���J�y���@�����jG�`4�3
������(�3�e�2
����.d����;��2~���9�4C�f#~���Z�� R���z�!���0���y��k!��F3� c�uHS�wPqR���X�Tdt��k��`P��C���
�<���� ���n7}%�U@�=j-be�[p�Me��
��JA>��n����}������>��9�������N��A���! x��kQ�K���:B-��Bd{�H)-Jg�����B��M���M�G�z��W�*lV*��J��B	T���M�N�-x����+�����3D1�z�E��[I'M���Ll+�d����d>C��d���j`���h�~��������y[`yV�����F,�d�3���_��2D!Pk����8����
D�l�&Dc��!�cR+�fd��U6��L�>MAe�������L���T+�[��|��L��:���M���Z.q�[�b#r\�9�
�A�@�f4��w��y��b���	���(�N�y��}U�-���'�C�$��U$<����)���hpxwl�{)�3P��E����u�Y���Bl�����kN[�l��A$s�O���e���$i�������)jV�q("���8�!}O)a+yn!%L3���D~���
:�[��SKQ�@���H�T���G��Ke�}��+�_bLb��E��-!�Z�XO�p�b�s��D�X����AG
�����l��$&����~�p���q�b�$�'4�����8|�l!�<������
��R����-Q�O��w���rj���m�?rUD�q���X53�i!2���O�Jl�_�|u:��uC
"%���]����[)��{����F��y��B�Y�?Y�����q�^���?�@
rX����A��w�����n�� �B/IS�)�(Er�P����I��R���!V=����B/.�I2�r���%@�������vu�����.�����B�������������{
�X�=����2�O�F�����w}n������@��Wo�D���]�����%I�+����I��^��9�i{�Ce_7����K�B�m�)��P�|7���������(h�����'��������p�6v����M�<�~^���Ib8=��bO��r �iOL4�.�����x����_��W����"�����/A�������a�Q�:���_���M����So�y�|a�8�r�YnK��;8���'{.3�?�$��wg��A�=8�}��|�c��Ax\�9V<�)s"t���mj7��*�1Mh�����;�Jg
lJ!��I}�x�����9;�v#
���'��Y�������J$f������A�z����=aw�[w����`BGF�}���Y�\7��}J��Md�k��-�:[��#8]Z����bA��[�����g�h����-�h�:Oo��dDP�%�{b���&F*�>�M����s����d.���2�nv��u��z#o�n����[�JA��T�EVG`���}�-���D�D�+]��=������u���&M�	e�H(sK��Z�����yzk6��si���d����JN��OQE���XE>D�"e���~����_��|kG�i�M��I~���^PF�"&7R�w#Z��@(l�����C����E�EG�V��Q0�{r�F��Z�g�����a5H��0��b�����^�
W�v�F�b y��a�a�sS�5�L.D��d�{�	�_D��w��1�����j�����L����P��A�����?#�b��Ul$ZZ6�
M=�IM���e��N�yF ���>2%d���Q�+����QE�Y��&+����|����<r����e@��aZ��.����m���:	���0�0�$e>�.�A����e����CE*�a�Ax�vb,�����a�A�t�������_d,���y���@��Q���{5�0��x�>�8?j:s��@A�M��ozQ����3��Z���l�7X�]�}�*0�w�U�0*!�s���M'Z����J� o������h��wK�r���A�~
�C�O#�v���\@��� ������1e�_'nR��ahA�,Lj$�y������Q`d��5����q��-������ow5�������ci�y��%T9j<���JG��f�����H�1�P1�Q���.�s��/����*�$67�g]����
��.�m��W�1xp��\l��G[:G���5U����� N�3[}�o� ��0f �����#)�N��g�	�K������#��;����"*x>;#�t<�����R�s�?��`�	t=�F%���}��(�N{B��*������jH�<�(�O2�����X�������N����#���9�����F���axd+�\����k+~��v��rt�8��7��w���XY��0(p����z��0�Puq�LV�$�����Ur����=���?d�s����3�H�MG��o���G�n#��.��#vwzA��Hz�|J�@���8j���Zp�������a�@���'>f7��g���3���@�-� 4�������K�m��.4��5��C�c��^�W��"Rsu�n`2���e�&z��1N<-*�����z�_��������A���s:�Hg����`J���d��#��Ny|����*7rT��%f��p:
*�s�x��j�iTAzh-)�5�(0��4�`��
cRh�|i�K�`29f�r�0��y3B���0&���Ab�#:��%��������3
84�Jj�]#U�"��������U:�L�"�eF��%y��a9�����E-������k�c��
�	��$v��1���e0�;k�����f5���&f�6�~����5�3��A27O���^B���(hE� >�4���"gt��D��4�0P��4����g�+y��7����<g����_}��%��|�dwf]R���W�����(.��z�Iz6���G�7
'{d�; ��i$���
E��iA�%�D��=�����H����8p�9�sK��=���0�������p��Pl���p�	
�(�d�hw�&m�M"������eOM��������V.|1G�K�UQnp�I�JE��Lx �����/�z"�C�FV|cup���H
6���%���&0{�'���4��0Y�8B��-�;�|����E$@�����~.�N�E������E�'���(DE[�y�(d��<6=uNQ�h�b'�M`3�3Q��"[��,Cr���1#cP��]�X��LjjYM�*@`����zv�1;G��<����X'��*:���q����\��Z�b���w�e�es�_��Q4�>
Q�;B��z��Y��Q%��m�cnD'�,�k~��Z���wYV��/�J2�F��4~�]j���5-:3w{��S�i���5��[Xh�M�#�������P�@�,t�ez��(�=��TY31%�<���4�{�\��:cg�`�VTf�e���N(LUmj42��f5@��gl�8���=!�����t�	�s�-r�ZF(D�V����������o<d�X����Vr���%�P����~�uI��YGat[	~�������������]��c�@EG������oI<�^�A_�J����R���_��g��C���1{�aF?\�)t^(cQ�2N!��#"�.�.�h+ZF,����Ur�@S.A��ee����j���mK�GA0;J'��w�]xI�MF�X���\��=!*�\�����sMxCO.1�j���C��2j1��b��Yh���!�`�t��1\�fJ�x��`�w�S��b��cdh�*����i�AB���3��]����D(�������h���J��1"�t�s`�A�/+�:������*�*���Q�n�8���������JZ�HGO�W�����`|9"��6�cV����N�������*VC��4���{6i�*�}}��.�����[z�/�{�����~`6kY� �vA��������p�������R�+����P��RLt�@�.��������N����>Tc��@��P�~���F(���K�� ��)�X�8����3(�^�+���R�z@�����*{�FX'eo�~��/�Q%�R�_��]��>S�?WGvQP��(e�Y�����i4�g����aZ�X�c������_dg��{���;�y( ���>�����a��+���k	�?m��&�1Y����8"��e����;�7({��������q~���+FIj��I��������P
J6�sKB���0!bG��etA}�a���7{����rYY��>��V����m9����s.���h%�A��w�5^���Z�����i�)k�^� ��m������u��5J��|b� �T���%����{���q��]DfG�A�0�HVb&�F	O��C����O��l���;j�I#������)wl��S0����dz��6��pG� q�e���)(\N���������3��xm��BG.J���aQ��N`4�����"�u��T����"�����j;�A�-�^���~)�h�����V�T��8�c����]�A��O���������@��]�c��Rx��J9�a��_$Cpi%��.���%��^E���s�$A��r"X?k<� ���WI��6��6np�EK=�N(��^�m��1m����d������N�s��4��o#��l��(�Y.����-Q\�P���'*=����N�}�$�vR
��{�C����{��y���Q+k�JI�[��{���w$[��tZ���./B�wp���7� w:GJI+�1�H���	i��lAxwo�����
n1���s�?�-���~M%y2�
�����K�f��;O/MbX��������92��=n��G: ��1�B�����G��
e���S4F$��S6��oCs]\�n�
���-�?���V���n�k���S��`2�mt�9��If�(�9�o�
�(�'�XO����mFY��f�wF����i��FT�w�b����#U���G*����2����$��9�o
��)�U���lkv�
��d5���{XK�:Fl��P���xa���q���gbAYI�����f�qY$)�A���m��Wbwn4�VGr�y�%���',VJ@(���l�"��_�qGx�����ho�n����t�Btl��w��B�n�d���.�����cX��F��P��NK�����Y��/��~k��X*����BN9/��H��X��p�>|�^E� �&�8z����5���xc�1������R��p6�0�O�!=8'���(������C��c�N44��O0����q���1fPEj��Y��qQWe��v��������O���9��?"9�q�}�����C����Ds�I@����PM�C�i���g(U��Y�)�)�(KY���@��I�Nw��$y ��1�`.��Niz'nJh�?��m����{(�*cY��1���� 24����#H�j���D�W%����C�1�dx����6D�:�j�L���z��Wc���
�c�A������O���$	��>������m��~�5��;��eud�r5��
����P'��x/��~Z�2w2 ��P�>+�U��JL������Ntx;-�� ]��'>K�nAd�c����-�e9-��L���,'�Bs��Y&��T���F�����������y��/���s���s7� �g���8�Eo�$��dO������=��TC��?o/4��^e5�	S�[���$:#����X�	�����k����_���%b���W<��6�u�+(���#A���:
��5H�t������e7�����_3��g�d6()�.�����uCut0�u��� 3�M����&�E"�M9_��4*+fbi2����"�1B���qqO�B�*��[q���g`�����8�������:�8�E$Cd\��������-V��$�^Q��>N�]1J�}>�zK*��ua�����6�rP��d����������������SK���yX3�x��E{W����#���0��n��$�8AL���<z���~PGU��������h�V�.G��c�a ���a�mI:%I�����0J4���hh�~�l~�����[��.��Uy7\�A�n�4��Y�-q�'rN<�'�A�r"a�~�WIn��M�%��
2HqS�l4��x�"���Tu�4SX5U�~k����R�h!���~����{����
i��}��xG����y�d�,TH^�Rl���R{]a`�~G���=-S��W�����K�5?�
�/��3}k*�Ia��N�6��N��z����f�a�Z�6�j�!��po�h�Ai�����J
R	��wc|`�����0Y���T���=by;�S�P.�$��]�I8�'�(����U��t���-V�E�+Is�d���	d����AF�Q��~���&��xG���W�J�
�D�'��[�*�i���n�����(��i��"�H��;���A��s;l�j��T")zC�tL�^���Q�N�'E6��fO�D� ��w�)�
�XR)�Yg@@v�o�m�x�	\��@���`8�52�VX:"�>{�aQQ����gI���ru�BFv�u<���&5b����@����M^�uL������&���nb��
��O��[���J�<�������q�i,J����������������<���'��R�hw.H��;����\�+9�+`B�{�L�Or������ �
}��7��<��B��}���Z������B	0�	��Kv\5��{y7"���n�{
�rn���`A��\���%1DkH,����7Y����FYLxGAX���i�8���t�)q��Jl� ���B����CT
�mG�@`�w�_�� Xd���`�� K�U��xd�*zIF��T��V
����YQ��11��������d�`��-'9ib���'�mG(Q���@4R���W6!����-��'g�@,��"<D.�%���?Zi���:*��x�c��1�z{�r@��-�r��F��t�k�}�V,|�1n 9�:��������{!��+[.Dh�{f>�	���rB0�v�2eN���"p�c���G�����}��KRo�v�X��$��>�}W�:w@8���(|�r�H~G����\����du��7�5|�(5E��Z�Y�o�d��J�DVI��0�\p*��.�J�$j�Q�<(����|�h���05�%!���b<B�A�P��*�?�_����&�
y�2R�/HT�*�_d���|��l�����b�Q�(/��^����Rb�$��s�u�k@���;|�Qunt+�l "����H��]8&{�%T��a�M���b�G1����������0��xV��L�������[�9s��'e�� ���;
r��P4Bp���R��EM��Qr,��-9��b�Cu�D%C1���^]jN�
�R���ws���Z�5��
%VIG����T���P�!��tD��P0����9��A�Q}-Y�0���Ut#���+��mH	��/���Z�a��C��--1H�wC�������\���E��� o��-��C���Mge��'m�Lv~,	^�z��*|�=F#�����19��~�M� ����*��^4q�u:�%@�8�Tyj@��9���<��b��5���S�KA�����F��Q��$�:~CJ�����HX������Ge6��������f #�Q�ft!��"��VB����!�Kr��^���_�ZM"{u��d
�bC�Ng���6���`i��^T ��;�:.��\�����mP�����x:�d�j���8"_��c�s�X�5V'��5�a����An2���sC��C�t����Jq1r��S���B
;G�99��>��}4��5��j�Px���nEF\�F1�!�Qr��6z�o�q��K�^�����>����uA-�AD�	|Fv��p7�U����)�BV������c��t��u�����K^vN%]�E�b�p/�2��j�������:/G�boY4�O��8��N���$�Al�#��[o��:�K��\X��(����������H���D�r�o3e��b�B�Ja���p$��&��?b(T�H(�W�����Y� h[��0vb94j��z����!w�Q�<��Y��JQ��vbX:�1G�!(p�@��� &������F*P���v�@n�S����82�X������N��G�,�$����Q�� ���6��b<���D��D\�qZ���,��������k���A ���vt�$ �1��}�n����;�Q�;2�]:��'��f�.��0J���'�������X.������� �T����8��%F�Q��&��c��q��qV�3tDhvb�����s�~��X��-M�D��[5� +oV?�8'�}qd�
��Fm���=�=/�*�@��}
� ��|IA�����?�}1I����j�A��;jOY��0��_���=��E��v���h�2����������_��>��P7���G}��D�vM����!(ni�a��)�VM�~>�j?hz7���y��4�#�Vg�
�����k�����<��[��	��=��O1*E�7�d�]�H\ko�^<���`�#,�|1�pl�Q�6���[�Qc�$���F�]K����W��B�Y�rB���s`;��0���������j����}��G5� �YK��Y�3�	G]e4:b������Bj������������	>j	v+gRA���[��i�Y���pI���kn��!0��x�aIg���A���R��G������ wr����j�����_�e��(�X��r�$B�C�>ACPQ����`GI��6�O�S]wL=Zh�5Q�"lw[>�G��4���&7g����m��Ub���jt������4z��6�3�M�;
S�C-�2�&�`�m��f{��%Za�@��UB����=�Q��[O��b	}�F�m��:�9j�
�J5���A�v�y�S�<H��t�P�c{���NV����Vc�����A�#��M3j��e6��^����f���&}3L�?7���=��
&PG|����e����)Zy�^���!�&�{�*�F��l�	Df�������?�K�uo�|F��u���������%��R�0A��*����1P*�`@�i�V�������Ot��x,��U�[�	�cUT3������F���(��]S���1z�X8E�����Z����Y�����g���d-���2�[-VOd��WFNl1c�}�����������o�NF��>�=+���4����Rt�����*B3������o�$�D8-������E�p'�a?��.0Z�A!��K��i��o>&L�5�E�p7������$�4�n����4��R18�����J���z)�R['N}�����BY�jz`���099)�a�@$��d-������l���e����:���
��u	
�P�nDRv�Z�`�1cWY��2U��\�������������=)��o��O�sX�+��r�`[<8[������+���`ZV���7��h1Vw�IZT
rrD�����}��fz�e3f��B�����H&`V����F��{��'\�8��L�f�@nQj����-&L�]&��������x���
VZ>������]��)l�f�|���oO|�����A$�&v�^�n+I�`���AA���l�l��RW�f�@��
M�Ra��O���hl����s"��<����A�"���tCD����*�{S���%E�hc��6���g�"]|q�!@��]��j�#5_;�\��8��[Rf��Tv2�W�����/�Kn�(��)N�rl�4���u��;L�-�PV9>�;K�0�������xO�XCC�x7��N��S�0bntC����Zx7a4��^���>����� ������ntAL�WF�������@�E2K�w��-�u7�Ub�N���K�n�A������qPOytt�
jH��s����$�5R�Q�C�%0����7�I�F���w0��y��b��po%
��\7����M/f
���@=Y��(�q�LV�dkA�m�H�h��h������4Hl����%AE��=�����h�=��x�?�B�/Ygk�!x�^���2P���R��:�]p�������3�Q)�G}*b���EL^o��&�>�L&�/��G[+���D���c��Q�����d��������G��E�}1Fl�Wv�x�U13�����s�� �|7xp�x�^���Eu��E���t�	z	�nk�3v�pYc��TO`�{�Z3fv��|W]���!�V��[�#p�Q��j������
�s[�[5<���"�.nI@'g�
�=A�5���R��8�?3���}��)���_g�yow�	CoQ���S�����#����BY����gIy�ZEo��K�A2�}��v��(�*�1��"�fA����g���1�Z��dh����8������]u�N8'��t�	�C����U��7X��`����HL��H��C��}E��-��C�j�Jg�x�{_�Ac���f�!��.������m�Z��2.B�R7��jsW&��6���A�r(��n,�����'��X��Fz�	��C���f�w�<��&5�%k�u����Xc&��}����~�Tw�0�}���(�����Z�=:=���D����������7�v�����x3����=+o�,F{�f���"���5�fG��
H�����Orz���`������q9B�����f�V����`��
m#Gj#o�c��%|�\C=�a�<=7,#pV6�\!}m?�m��~YwD����#q���8J�"����2�Gb`@6�
�W�x@G'�a@�~wZ^�h��S)�6������9~^\-�� �8hK�/�����H��@����TV����K*O4��=���G?D>��tG$	���wF`��'��[�#��I�#��]������+�@U_g��%gl���	Dg��[*j��m���=?�v�_m�@%���C���F���b��cD�C:f#	�yb(��F2����=Do�@���TI���#�

���Y��^^��"m�t�X�m]��!)�~����$*Z��
�{Z������$8F�
#�m�0���#��%�-�F�d�@��C�������,�	��-fz��n�i��������&�a}	��VFF�:��n3Yx�D<r�U��'��=��c���0�����_��Gg#��F�Q�|��]�W]p4�F�E�v~�����6�|0������k��Xc'�gR6�2��&�Fr\�,5vO���<.}����B��R�/���fF\��L'Q��d����A'8��y�<m0=��s��;ii}��C��a(Al��&[�W�h}�
����q�y���^�-�lT���Hj�(src3`�:%2���T�����,?��"��s�<]E��Wlz���.�c����q�����.��W��"����zhL<hv�Df�<k�����m��H,=�T�"4&8b����YcXA��z��Iy�� C��V*�;>��� .��i�R2����R��'���=��C�n��CH@������VF#��a���z}�����^��f6rf�G��|���.#���A�_~�(��>�QI��L���k���q\�O�%���R*���6�iHB���~v�X�<h>����#E,2����s�~���j���l3���xQ��]�I�%+5������H��B��`��#��d���6��4��
2��L���:e�PIas3:i��/��F'��d�a��%�?�ME��Y�}e*�{�;�=������|��f)�F@~�r�@7�~�X��+{R
B����#!k�|��a�v�@��itCP�A��Y�A�x��b���H��`��4�q�M����[��~���Q�f�2�G��Y������N|<3���9���W�����%���utw]��PZ���+�N�(�@}�g�������)�5����_xd��/�3]B+H��t�-�_�4��>PC���NopfB���4����i���
��������P4{�in�q/���(N]��m�k2�F���b7
��=�L�$%M��D'��g��2q�H%=�k�LC��?6~da�����6v���{&Z)/���y0�LD��������.�[��Df�
7e.��p���h�'�g�~u��U��3/�i�CmU���������ag��sU�E0�p�2T�N^^<���1}2A`��x����G4=ygG�ykP���������z��&����F<��������>����\���I���b;��XH�1
hL����K���q�*�����������>��3�[2k�vE�6>�P��Ce8X+���+$=
��D7���Q��-����|7u�uh&�y��0t!�W���q:��t������|�b}���%����2�/��sG�Z"[�����n05�g$�<
6l}E�T�|_,��8Xh*��)�
�sg��n�C�d���qa�&Z��he����g��E�={��z;��bP�.��yg���'�O�����������N���_O�!��.#jH�%�����c�+�Do]F�8��WpR��;����5W�P��2� f�sm��s=���?������q�/I.���|���W�l�XIr�Bm��@�DU�*>����
�����x9Zt�9���"��[����� �J��m��b�"]�w���;#�=+$Wd�[�z�-����x%����l��E<�U��/k���Q�+�#0��2n�$I�;[U(�R��N��DF�JF��I�4\QE���j��������h�
�8����3�T���c�b����P��=��Q
�Z�{���E���MVD��{��)�i���(6P�w�U*�.��}?���|$m)j5,�1�@��Wa�E���M6�H%w�T�M9t�J�28TC�=u)�4��+���*`L��$V�<I����ZM��$4��n���C:P��"�v	@��5�X#4�����+k���V�l���]�8���w����~�:���5��__Js���DQyE� b-����~�F�r�_H�At���-
�������n�K�+��B�����������������:;�'vA@����M�dNgg�m
yQ���f�+����v4��;�P���%5����:V��Cf�!� hz����������m?"I����>J��4e?��+���Co�����sw���TD^��/6"��e��yX��B}�4�F�������R2"��2.�B_7C���ZmX�mp��/��5��t�LL����5
�/����]� ��,��.�Zid
-���l�|�MDY��
~�J�*�u���_5N���ue<�u����t�a{����y��y
��� n�t-�e�jA�`�o����+�-U:rn��w6r�?*����o�����MX#~9@��6^P�����pg�hk�G������������L�����r�"v9PkR���3k��B�C���`�~��58�AD8��+�����m0��������"����jp7��(��>	sP3g'�����_�<\w,�V����#;�Y��Y��E|���N��P�N\	
a�I�����0�J�nZ(������#��g A@�<���Pr�=�F�m���B�/2(���v'Z�����>����]���A���4��{���5�]�+��}�F*���-��eR��;7� [�j��I������[��7���n��74��`���S6IM�2��j,$x�������$�oEes��k��~��K0��0C1��)�
=�d6�Uh
lK/[2���U,�Q�A��N$%�oU�Yv^����T4�#;��:���w^T��j~�� ���~'v��]eG���x��C�{�P[�7����yWJ`%�&:}�g94��=�����p�BP�6��.O �t0�����dJl�'/����8�e.i�-ED�b��W\�13��H$��W;�J���N�~(���Y�o�"���'��HU�{�#>(5Fd�������g��a;�I��e�A�Y�����b�k�/�c��"n{��m�#��M�J��I|	z�+�����2��&�t���.lZ��w���g~�_�.�����}|�>;B%��U�+BfM=U��Dc\��C/1)w�+U�O�h�A�[�9�k�F"�g�J��w���_��|I�T2�bk���A�!����I�4����5+�v6c���&�#�v����D��	�)���B���qN�
��D[�41"f��K���$���T�NT��R�O�Ef�-����0������ouT���,BjXw%����\�I���4cW$V��7��=�<E��P
��*O��
�$�Akqr��������%�,\z_������|.�h�Y�ZZ'��3~�0Q���6�������[d�2�L����P)1��������n5�J�:��J�	������P��Rr�-�	bQ-iD#c��d8yO�����DE ��cC>	=KN���g��ZP��!���z��y���WU�'i�J�OU�W�I�����`�����q�e'��0f~�	���@���Xr�A��c�B�����C�E_�a���j�c�b��Y?�%�"2�If�H*����!k��VQ�O�k��qe#�C�A��g\���%�:�?�b�	�R	��c��U��8<3}�1���H*�pq���O2t�9�:T})9��`��J�.G)�"��
�����l�������A!�7e�^�����%c�9t�sH�%j�v�"��I�y���3s�?8.r�91WR��K���lM��9Uv�l5�!�U����=��rz6b�������6��Zc:��[GN�i'�Zk���F��z�eI�����h-�%X��]��^(�7%RvU���C+����I'����n;�
���+�=;i�
��u��h�Ct�c$D%����[�f�����@M�%����L��p7���������0�����	5�d��.����R��m�I;����E���cD��A�(Z���4���F��������4Y�*�mx�%1�N��� $b�g}>��:I��s�N���{�j6""��v����&Sv�Y�W��G��� KD?H�g-�P$��������h!9�I��#�_�Y�g�������7���0��J)���ZTL�m��������Q�����ebt����yw�`?�����sR��(3���W����}qj�+rcI������X�M���;D ��I��2���1�ae�d���1��lk�zc=+E��f�����P���<�e ��s~Dy�V{6�8�{L�S���.IM�������{!�[���(�a���Z*Y�%�O���[*[�	���[aw��m0���	������R��pt�A�`��{
����y���A��(5D��;���47�An��^�;���"��� ��w�O�R�+���d��c������3s��������_&j��	7���1�+SH����@bY�H����!���3�L��w�7S�{P���.D��Bf����W����62�P�p�"[�SzG�}jT��<��E�@��'�h��{���f��r_�kxv��M[��1	)�����v����K�D/"-���
�MzY�M�� ��n9'o5t~}��z��W�PW��&�����%���>E��w��5����i��MUxFD��x,��E�q���^��	5�d��:��p�I�K�����R�������3�����
�n�h���w�A��w��6_C!��g�2Z����|M�\-�CN���r��'��� ��
@@7`|B�+��J6�� r�A'���B~��>������V���r��Ry����Y�z�����nDB����
7%@�h\,`�����'o�3��c���[��R���{
/nS��R��97c\-3#��n�l���69K�
�u�S�m�����L�CcA��;���H8"��")B��f��o�V#rJ.����L�����T�����������V��w��5`��]���k��$7����t����tr�U�Z&�5�j�[�����t��!P?{>��B�7��I{���6|�����B������1�������VW�E$^���e|
eKC4��I'��]S�-���f���Z[���|V�l=����+RQ<���K�_�P�z(���M�Ya��E���1��%lC��{���N|X����
����[,{����*�U�jh�Ehl	�P�]�'�������1�<��nu��#,�����s�AV�B�,O�_��!A6�$��if1J B@S��|M�
��f1R ��B�_1^ ������U�y��
��X������,%������j
Yag���!v~�����@-�=C
v�!T�w�k6#��u6|g�K��>���o���(2��j��4$����A���C�S���}�Z����p�f1N��%r��d7 ���r��:�7��"��y%BYW�9iP����|�d��}�)��	������I�F�Oi���vi7���rOA�1���<LP�,-T������n>�'��t����d�}�-I[2��6���Nx��VE�����g�r�dB"o�]/���a���"L�}���G�G����v�h�^9q���p�|��O��"����% �R��dC�b�@>U�3��|�>rn%7IQ�F��� ������O��
j�4����HwRS�G�T���gR��Y��R��D�9����E��Vw�jkf��X����if��	����;�7x�v����X9��3����W��^���
�S�;(��=��L��;A����b����O��k%c��������u����H;h15qD�%���Z��|`��,	uF���%V$DOP"=E�_������0�t�4�o�T}g���i&
~5����P?K$�$�������)�g%�>/w�������=K�������D��6�����/Wd���v����'��J�[���=j!��9ze_��u���~d�k�V��h`���,�a%J�������a�P;����}��4�]Q����g��)�G���=?oP�����>
�gi��-�'�e6(Z�d-K.&�A�{�����y+������#��Y��G1j�~6Hd=�O�$� V���
V����)���2|��VS���c��l@��F�I��������}0Znu�_�Q}�5}}�����+�m������
�Zb6��H�
���s

�A�-������	�[�&z�X c�C���}ea�^q����r��C"��
0k��$�=�=")��B�p����B%��Q���k���E�e���la@���
�d�t0�uWk9]k�Yc�tj��NPF�SG�����m�q`f����H�-c��:��w(�|��
n��o!l�&�A�Jy	�Yc�t�A���r�W�����"K�n+���j��\����
�k�)�^�j4��?P
��� ����
"RA5� 3���K��!��UPV��M8:�Y-�.��IC����B�e��l`xd5�p~1���X
,�L�Y�#�p�Y?���PH�W
������������xh����D�d�������B��m��N�g5\������H�\�d���J��i�t����
�&w��_���T�"!]
r0����O:��$
�@�ag����34r��p{ =n��=*t�po/�k�����4�p�5����:�u~�hP y�Ro,���CQ�g���Y���������+B�j$A���@xF����
U�+��?p �<�S�	�����^����������P�B�[�a�5��;3�[��d��v��K��%�A�K���������3���j�����[g��x����-i�Sr���@��jg���c!��s+���/a���V�F&GD��{4|�
��I����D�����hv][)4���S�y�:S�U�2I���jdg�,nF;$;�����M��s��� ��Y��A=���������
����5j��L������H�����S-�M�g5� sK��:8)���<��d���Y��6�y���Hvh��0���{�L�n���fL�5��A	������������!F�h���"-(R��^���r�R�2��?����h@��V��z�O��F�\���V�A�-������n'��h���J�E��"q
D����Q���?{���ZD;^����P�R��$�w�`�1�D�h���!'�Z4C�]E����?�\���*�}��
(�8�`���k�	"N�������D���
=JmE#��e���ve�7U`������0�Dil�	��x���9}R+��h3!��&���g�e���1k���QQO�}�	w�`8NBQ��E�����#���a�{(c<�kdL��+$Z24S���Z��=8�C�;<Ph	*�p�fA�@�X��_G���1��xb1����G4zhw3�0��h�f���2��	GA��%<���'t�3!o�6�P*e�m3��B����e���GjR30�����1(���:8-�	���MR�gKR����V�Z	�%<���#Z3���
h������Ux���x�� }�?ff���m���q	Gc���l0a�q��s#
�g��C�pxr� \z;���i�~}����_7�.���)�[v�L��1<���B��63��Fzb	����O����)L���X��?v�5�P�!�
w#D�
-K@sx�����l���A2(}�2���"���15�Op���f�I���=����~�`�!C_O~��6#����4��7c�n����AN��_���hw��wnGv"� x�Z������i�pT�8�"��zG�
���-�����}��E�}O��=�������C�1e0���}-�;��h�D6e#?z�}���v>%�]��u�]#����@�&B���z�o��k��������,��2?C�Ob%N��#��4B� ���NM�b	���������"���s
[?z�� �O<w%��4P��8?���8�hD��T��>�����f7�e���O��^*]��;@�n\��E�)�P�7��d����2��@�,�0�3K7��Z�"�iO���RiE�
�Wb-*�={Y5�Y�������B �k7
!���'-�b������!�u�5�����,7g�B���ItV���v����}E�p'�<�g?P7����e�����n�A��������
�V��g"fnc{��9L� ��8��<k('�����9�>�*��v�r�������^�DG���m��������#�i�o-zD=8jU��EVFl��iP���[�B��K=h�J�L]�*�o�8u=0�noM����q���0v�f�+��z����Ype�yjH]"F427��37������R��8��}G��n�AKE��������� �������#�|
�Bbo��jKzF����C2{&�����
�H��WWM�E.�����a����e�n���;=�����k	�c���'��@l�p�qO�@�G�<�>ct#wZ~��#s���eVhO^6������	�A�{7�0leC"*��+-`4��i������+zE�����LF�=`7� g�i��4��0C�i���!�3��+M/
����EPu�<��D�U�>����B���Y��(�Y"`!�r$4�e���+;-y9W������6j��=��w^1Z^����d�2	j(�?\���l�1$��Q�����1� �ke;���65��$/W�7~S��7�0���������
;���*V0+#�������t��B{������jfq^��Q��.�7�	c�'��M�"���1Q�'��
#;\K���9G�����p���H�%��W�.��zs�����%�yf�<>��%[A��*1���<fS�����v�B��rM�4b��IBR���o�,���)�{��H�BC![�Z
F������s*�Y
�v���w���=�P��g#/�����F�����J]��:U(�Eh�lY�w�����O�0#���t?j�G�3��k������Jw����B�Z�w0��Cr��F�
��6;i�.�%{�>�"��0r!��)��P�i��
�����cm�HR�D�5kF���}��g�Kp@�L��G������t<-�52BX(-m�R���'#�����f��.3At�f��`x[;9FK��$�Xy�%�C�\���dcA�w�]��d������wD��P[3�D�������_��}~RX�w��wQ������G��s2�!���Aa���r���%��h�Cj8�����8F���LP�m�WV=����|���X���������U�V��#�"z�F7�c_��m/��n����7#&M��*���X3������?��6 �|����$J��L>(,<�k��ArM���f����6b�SX�j�B}��~�����@~�#���I���aH 1�?6��2d���F�7�����.��p#���q�h�H[�h����t���������
�i:��Z����*��q�P�[�[e%^ar.�����a�c"�������h��w,��2t�Z���#b��u��(*��6��w��J�Pp�H���>���z�U�>8U\h&%��HY4���������?��-��}��X��pQ������-0LgDj�:��O
���&���*o��m%~ 0w���'�Z�_��[Y`�U��������>�D?ML��3NVu�'��j������W��RSb�(G�qs2 �if��P�C��38�����d���b��]�����@������c&E�����v���=��@�-�
Ti��G
U�!��K-$%8�
����(:�O�����B>�i�Cd�#8Ro��I/J(��9��f��s���r�
j�����Hg�Kv��{�)p}��4�d��U���3"�	N�
�W8��E�07���] 
�����`�y2�]y� ��4.!�E-�{��(U`��s�"�.H
��'$YE���ht��5a9�'��o���=$��K�d��O��0�� ���� ��l��������8�z1:�?�\5f�n~�x"�6(<�-��J
�G�����f`�������g���b�Lc�1Vw�{dG.�f �;o�U��0�i�A�Ei�`i�E
����� ��i$��g�)�^H��{�vhL�"�wk���i&.b���4�0�`m���Q���F��������+���G��*��w�����/#�MC
[��4�#2k����
�����i%M��U���nN�a��r�&g�����Y�;�~B>QG`���%��Y�XZ39�J`BG��(D���zZeR���.�.��6��f�!����[��D6|(:�.����ti#)��B��tA��-���G�h%Z<L��OC��D����������'���Ks������k}��&������sa���4�������c�����`�
���Z����P�G/'p��>� (1�O��lKVN$B���3*N%<���_@�r��)��p"W��`j�Y�B�sJ�r�A#=�"`ZP%��_��p�IN�}�j�3������AQO���i�
�>�S0
-�����	�hC��#��<��T��e�1�4� 9��2l�9��T��� B5��>�����J0��P���T�-|�4�P��{���g��D1w!;�)rc��*�h�������������2���P�:3��2��x3+fM��������eLAF1u�������$k�N�'�"�QK�e���Xj�I{��@�|r����bB?(�kE'�N{�nS�e���v�����m�	�V�s`9|�p�z�F{�)�*�\��E�t����/���%�U�m}z���1b��w-�&v�R0���2���]V���
[���R����*�6a�_�D@�F��U_�n���-����hcq�<"���\��,����R��b�����2[��9s�ZI�fk\%n����{���~�ROU���2!Z���DJQl�R��Zr��$��O���2!�J��"�1�x����.{6���Oj�C�)�����t�z���h#�����jn(` hy�8)�c���}�]S"�4#�PV��/�T�������
T�����9F�yH^(d�����������s1s![,[��������?lS��e�b����Zp"8�{����'�5��W���>V���m���c�G�>����~}&��Y���]#���w)��jg���u�(�J8��| ��e���@�$��q��o�b��dN�L#�`������HD���2�q���g����+�����E��b���.�hR}�+IO���|�E�2����3��?���f�D�rTe�5;�����p\5+gl��X���%9e7�� �IR��e���)���K�v�
0��
�1c��c�f�+X��e5v�����s(ED���\������+�	Y}
*C�o�C|��Z{
a��%���A�9�/���&��R��rc o��c��9#@rAj���G��Z��RG�d+9�{�D�S���}�W\R:�](��������a��q�A����A�/�v�b������J]'F=w�W$����b���e�C���x�JY����S���B4CV&����"f,�����$c��g���������=d�u�D���;��x���g\�z,�X�h?iQO���&742���������wX4�6 "��_��K�KJ&'�@X�62�����
+T�2�sv�w�L�z�
�Hh"����
)v���F�*m'���FK����/
Ndt�m��C��
c).;�RE�~����A}G%�sO�H?��]Z�����S�uv�^�{�&����=Zw����I�����~n"q^���l}I��B�@R���e���nc;���L�+��1p|b�U��E��]E
��"���C	���0Toa"�6p:���AO3�QjCo�C�4u�?�������L1F��~����K������H�g*�C�
�����nYj47h�M"����������;1dDv�b���k2���VZ�#T�����=C&���'N'�-����L�XjS��Nt�#i��k����������������B�7��&v$#���[J::�O��P���������$q�����A;��}5�w��Q�w/�����8�Pr-QkP��&G�l�hn��~O����o4Y�#>��9�oyfU��~���a�"u�v�?o�������]��o�UP�o�x�����m"$�� ��G���`/���L�X��W�I1���rc� ��P31���������j>�bO
��`�X�>c\�#I0�(e��d%{e:��W|zn�-cNy��#�P"/+�W|����'R�:�GK����Z��~`x��V���������'��Y�������6>����pn�U���$��y�oc�}p�(��c�6��n����E��Y��k�����	�#o���m�vd�--���,D
f������h� �h%-d��C�h�E�8�>B������L#Z���_��g�����1���<���2���|VO�'�=���>�NU�!?O|f�Wtn�V�T����b��Jk�@��y�Zu���FM��V]53�/�	���05���1q������I�
+��t���pQK��'��](,���@o�dY:g��:Y���qX�)�r����'����qZ�j&�>%m
4�
8�-���I��������c�At������T�/���q���:8��4���[����I4{�O���8��fD�E>=o��.��n�����J]��Y�����D�����E�����r�"d3S��9�%*�1=F#����9vZ�UUZvE����������t^��![��@��VtnZ�W��hG�J��4�p����!�!��8#dQ�BO���"���;wt"��Y��|r
)����{�������~������^����(Hos
�1� �C+eGx�1���m
Gm'��)�|�;�K��b�1�Q`����?`���rh����W���$�&F���d��>�������q�-��Y������{���t+%��:p����?��]��H���gQ�����
'tg/�
!B��	���VT���M���o��,?YH�8�>��;I��W!�9~����@^�������R�Y�d�cl��%��E5�'i2�`�C:���,�Nc;��
}������\��P�[�
O0���0���z�,�c@B/Om�����t�'�"��JD���Z�� �B���!	v�OR�x:����SJ��"|��*C���C��5;Y]��@�����P�\��aO�yb�B�~$%<;��R�V���������	����Dl!��N�����|���+��E�8),���P��S�ua,v`��bx_����q����F+���-�D��yT����Z�����mIMt1��$��5�O,�n�#�4�Sq��D�6S����3�m���$L�xgH�*���%D�d�]����tY�LR���}��)�+Y���^[�6���
��wPOu"�����W��'o��_���Oz�R���$E��#��|B;T_eH���	C��������*cU���|�PEK��w�����j�_��5|QI���8���	aL�((����q16�"��!
�����q�S���Qt��V{��g���:���G$O�^�c�]��%����������@��AF�v��/`#y/�b��V�NI+��5K�;zal��	T��/�5�Q�.�"����Hcl�'�B�=�������"�B��pc�B�E���
��#B�xG�_���D_����4(�x%|�F��w�����;<��2��@CB��[��$�!������!2����V���+A^���&����N+�h1����D�M����5"�YA��Z�cA���B�\O���wd�nh��{w����;�p��P��EF��	�@�B� ��:z�P|DWA���u|*U��+r�$D��^��a����������@N��pc�'��w�u�w�t�#�Y�%?�c�(On��)(Y��zf��5>���� ��{s�I��w���E@�Mx�����n'���po�*[����	](E�����Tr
r����	������7JB:}�^d���J�?������X��#}�T_M�oV '��**M??'V�?P�K8��|�����n<������B�kwK�a�\x�g;�I�V�e���~����������@�#0"��;��Vj'�Z�]�7+ $�+_yD�����F7��R������]�i(k�����A���eGQ/��D���%pd�1��$�#��!���B�i��cKCN��~��-Uo�v����3i6d���8��_<�|�A>��S��meQ!���2f���;�0�Xw���l��K���^B�Dj�HE�W�����-V1J��TV18 �8���_��|�%y��������4�2�P.Bd��:�����T%��\������%�����)d'��!E��;���j�O��Q�+D�h�q�.cpJ8�\�A�x�dg����25�)$
Y����`��)���^��qG��o���X9B��b0��zK��}J��C!�uS������X�����P1��Y���-.�C5��gL��)�1>V�9[�I�Fv������D�R�/BOD���8�=��L���������0���>�c_�_���R��mB���3�0p��rPK����Et�yWi�Q�^b���j�P/�����_�	a]%���#[Z��>���%��c&r�5�K`�4%���������v`��*�����1�P�-�4�."�}�qIbU_M��I/���#X�DLz�*}�A�
�P���@Z-�F�N��^��'BI���]�!�2�x�a��~�.-	�B���B�.�T	�QG��l�hM��paT�L��\Fx�+0��L��^�8�����!i������'�&]��+m��P���`�-{�Zv�B��\Ta��jO�XQ�$�m��(q�=��\�F�n��'Y���DI������<��M����|h����)z/���GE'<���B��t+��4�Pe��������(�QcM�b�V��v����d�&�?i
!Q2)J�_��BaE��$[��r�]��AA��b� '=40r�O��p��$�p�Qim������dW�%:�g�?�b/�����:�O�R���_��}�D%��$Og�Z��B����J/x�,S������*j��H�	�������a��
��+/�y':FW��ad	�+qS�^�����X%
�~`!��B�N������6#c	����)�>�,#�|��=s�Im�bq���U!r��g�V����3���e-�D]��Uy�e>��v�'D$Y��6��UW#H���HQYP#HP�RG'&�^�`JY[�8�,|o���~��9��X��@�m��%c�/NZ,h�����i/b5��7�u��F��K��{����RV��?!���������B�T�����h����k��j����T�j�����[e�Q$i?E�1�e�M�5�
�R�`��C�����qh5�%��]�'�,^�>�"���_k���f��?R�K�>��>�k#�8/��ed/���W�q�����������=�h?���h��
�	����#[�U1��$���5�Y���?l|=r#�."�|����v�.�n���
�~k��vyR����V5� ��D��2�e�
5Sj��__���NO3�$�c�'��wi�C��T��������v&�Av��P�Q������M����@�R`t���:j��`�Z0��|+�.�x��(��h�!�Hx��{�[�2,�����#�3V5�����Y���
I�'�������#l���>"��z���-!�XeidA�L1��mm��o'���Mn�Z	�
jR����lPe[����}���5�0E��M�AZV5��TP�X6���n�0�f���C��v��\�3���������Z ��:�5�
:T��-
+m��V��y(av�G|4
���K$y����iK�[�������*��S�tcCj�����/'���Sc�$z��r�)�Zy�pCgG�(TC?!L*����~����d�����d�,�V�������Mq�2�aT�g��a%a�ALO�������Nk��L�X
9��L�����P`SG�z?q��O<������x"�z�m�}P]�X�,p���z�Z��9�j�����oA$E&n�'���J#��9 XY+gSmr@�x�(A�H���� M�|y��I��~�'��������Q	N��u�u���f?12=[��[Wm���[�
�[�^�`I��F�ji�
�p�������B���%�A�����\G���������������m�n��V~�2�����V{O>������a�-�E�C�������2,O2'�
0T�%`A����"����/9�i]-�}��l5���+��g���`��G�����-�'�n *ZMB�D-J�����|=�L��������gI�������4[m������d^���;����]��!vQk�����@iH��e{�c�)t�D���-]c,+�tx��{���_�{�(��%��T>,"|��6��gK���e�
y�skF��,��i���@"��c4�h���J�x��!`�f,�d�p�R����6����)[�<�5����ZsXt-�"��8��1���h��C����!P�j#����$�~:�/�Lk#��/CC�Tc���q��qI�/������(��-�������F}�7�x�����^�������5����k���]3�Pl��_j�n�n�Xk_5#�~c]0�&����S<P��c�%�q��
O���%�C�����{����mFr��Y�h�U���$iT�!��=��e�u_������j�r��%�Y���������pL�=��l��$���q�GZ�{V���H$�q�a A�9��a-�Gj "���?��"��,����jCj&�!Y��=��n9"�G�a����_Z�2<�������x{5����$
���ni���"��f���- {�fA��Kzu�0�k�&�j��.�G}��N��}�T�E(7��4�b���v#��f��6^���=�p��(���8��S��|�@$�f�A*"���s~�'K�P�v��.>�
��k�$���4WF�P�[Q[��(q��[���R7&����B�
I0����
/]����(�;�({��h��n0B9�,S��p��R�����������B����Wg?4z����E�z����lx��{�b�(��#T���O������c�N�;�M��b���%��Zq��;k�'o!����d`�#_TNw�VHu�6�<��T�5{F��^�Q�tU\C�4���4���@����/<P��e80��N�{���k�����������������TM�bu��%rv}�m2BL���YZ��]7l�����A�$S��a�h����#�U�U����8A�@�w7t��E�}��KD��;~�*o����``g�7�v��4���Gg�B�������Z�=eN���z���n���iz��P'����g�k�4B��*t��1V{���G0�3��K��.�V���ph��xB������7<��B=���~�""��_O��L����P�N��$L�K�.&[��m0W^�%~��At�d�7���u"�t�
:o��
�I�
CN#S�G��M�(�������(o=y����
1�N������f�����+B^�N�g����J�����.���N5:����[���@������o	K�
Z\�]�YZ�7�Dx��`���>�@�z2;���S�&�}�
����@�y7!b��x$�qLR&��RCy�g7,�|���
As��a���'�Y���Q/�%�'+)A���I�l���u����Y5b ��A�����
���.�M���yZs�Fl}������D�DU���~�R�C���8���xAQ��0�oP�[��qOZ
q:{��+�(%r~lq8�;�L��H�ED*S�_�ql�1� OG�����qn_��h����U�:#�Wni&��n/�Z�q��:����v�m��y��Y������0�0�k�.\���##Q
�k3�����,�h�a	M��8�A���A���d2 �0��Pcza�s�}�!�(qWE�������`�Y�
qFc����0bP�x�D{��$�dFb�Q�y#�C,:��7��5<��|��*��m�	d���9�}����D�#��
h2��%�I���DG{��$��i����U�����Q��W����0p��RU*��]�&B���i0�d���G����K]"Q����Ay#����Op7^ U�:����}t~a����?��^UP*�-"	s�*Bb���GD
B�����
r�u�
�8�f��������������Gn��<�s�-$+�����]��\�!��a�@�55W��<�7o�����v(o�	�e��at�����f��������p$���>#����9O�*�{�1���tp�lia6.tN��Y)pW�0bG��$��&�����]�7����#���8a�@<���2Y���m��\�"�*����?`�3�-��S����#�h��o
JWC�h���o���F���v$�U��'x4n` t�S����h�/#�Ab��/n �����zIt+Q&��V���o����X����'���;�a�����Rn�*l�m���#V��^�������A0���+�+���4e�*I�]��nB��f�b���{G�s���%z�\����f=O*�����^������F�:�a#�e�����tD��H�����
�a���!�]��wQ�N����?q����?N +*�'������t����t��^�>�#��th�5��������C����>�B���HgD���_�����2�!���f�56��U�}�h6
(k�P�������3��['#���Y�����&1�*`>�AY��.�p�i0��*f�
�71�!�9�!��PY�4� k/�
Ny���<<�}��;P�����W����%���;:N�W���`u������De�O	�7?���gT���Vc��6��{��Z&���F(POp�p������F"���[�D��4&q�v�P�Y��UN�(�!��������>��GX^�����a	-K�,U$W�����fK��
��J��f�_[���g,�D)����M�C�)�QD
5�t�Wf��%N�G�w�3���i�A'��{ors���0s1�=���c���7�gG��j�u��a[��5�����&�p&KQ�g�
�	?R-^��%��nm[g��LVs�4�a�
��|j��#u����Nj�fV�'�Y�5d�:�3)�l�0������|�����R����C=���������A���)������d����U��BC ������??�f����$&����l��� m:`}��#����	|�^��a��X��7������1+k�
#
L��������j�/�u�B��\��"�CW;y�+������������;A<��j
����X?=
���iX@�A��bn4��K���v�g
�C/l��0��#������j,J:7��n�)�F�g�0�Ch�RTX]�PfAN�|R���U�`���o;f��,i��pO:ix�AM����1
��.�_�J#��y��+;R�@�����W�.\������	���FQ�W�!R�Q.dL��v��P���>�PH��99�O5�yJ��N��#&�Au�!�J�JV�����
��X�T~3����P�~_hE\��{b��r��A�D�6�.�t�.���sq"B��rW�����������~���6!a�����vx�/������}y����4�����4u� 32l��8��+|�<(�����W��ak������q��^�A,�d���+�t�Z��O��Y��+�U����	��Xw�����W����=���/�v�&b�+�f��S��}��=����r������*�W2�Q�h����M�l�lj�[��]��g�T��mE@�0���?b�=(���l��;MP��z�%���t��]	�CO-=}t_n�[,�)�a��/������A��0����1�}���%�[=Ruv�1�,�j/�"��r��^������0��~��0:��/��J�ia��I��Aog���-
��$�cv{���:�P�����f�npK�����Z��\�;�&bf��������.�VPX��?+�������:����}&����ia��
�2E%�C��\��K|�s�^�J���������sV��M�_W���F�"�{�������s:����2!-�����,�1@u�Sb_�c�Y�n���Xt�X��>i�2z �EI/c�Us����Zj�@BD_[1��|"E��Z�����>�C+��v}'�t�Z+b�.���i6U����[~'�B��@�K�����8�
+.@�~�u&X�RSA3kg�M�-�!�,Zl^��G� ?o�+,1}.��Yr��el?Y�e�@��2l����	�p���Jm��]+��7��}�a${H�8����M]���.��1P%��c6��gO_u}������K�����!�����f7���J��4�9)w�:d^�.�	I��mx�<%�E���j%�H����[;q����H��������m�A��N
���'�\���o�����;1r���]tE���:n�$����\B��N���7M��1o}���"��6��=;9���hY��E��j�Kwo��P�b�v��)0B�A���*�hF���<$s��3Z�v
�{��������7^#[�-U5��L�����B�@<�,��{cw`���~*���t���kw��V���&�����@�/�klKk�L"��5��*�*�nig8�,vKEb'62�B�o�����8��;�HW�-:�n�2��� 0yGW���{e`�6�P���V�b���h
�R}!�9�t�N�@psB����A��#�MuhJ�d����xs��� ���f�� �m�P2���n�x�KD���/4R�d��d���[�����R��N�����Z������f����c^���\�/�G��f}���b�y������.��0��X){#-%��H�������#*��4L�K�	 <�g~��n\I������x�1������1g�X�6�!���4,�����u�w@F#��6N������C�!h���pF����1�rQ�e��z�M����!������g����i��fw���T;���w��.r�,�|1�vB�~�$��;e��'f��8k�!�N�����}��{�V���%|�X��'��_����$m�b�h��P�|� c�xk��zg�+
9	���r�����6���Rl�|����U�&�TTS��^{�{����U��g�A*q+��B �fqP���*�pA���)O���Q����RI&.�/�rVB�Hez���8	�{f�"+��Ti:e�p?e�M$���. �e�t|m�|���?��mC1�dO�}��wBC�`����K�'��.C��ch������)|�L�0A���~d�cL��a�~�����Gzu�L%�	�~�d�e�C
�hV}Z�7w+�p'*��("�#
��o�XH>�����F��A;�'A	�Gx"�(T�t"y@��I2��NW�}�w���"��%�b����A�F����IL������,@Ul���c4B����e9,^ 
���������'���'����>%aI���]�f~��E�m��	U�����1��6F=�Gq�T��?55���s�D����iB��$$�-�/!�����}�`C��q1=zy�������%�F����8b������'	��[���n����<eK��s@?�H����g����<����d)��V:7��M}.��l����h�M+�{��{:e_����#��D�c�@�nV�{FPyJ�>��2:=����x��=@���\�x��6�W��N�,3����-(J���#�1j��F�8�	��`�����D$���V�����	�x�T������d��q?#��wZ�5��Bo:���}�i�K=+H���%hgF�h�v�6jomS����/��rW<�o�y�_��#9�q��u�M~��%�R�����bC*
�XI
���I�<	}�
����H����ckC��c @�a�*�9)�D(Y��|y�r��gb��rfAo`G�%�A���������g�q��Y6��������v��kn����!;������?���!��f%��J��vHB�cB��T�m�E�t?X��g������;����*�=D����r��gj��(d�=��Db����m[B���P����2������}��P�'=�[��������"���C������[���q�Q�z\�M"�����w�I@��)��k������9p��7�gK�^�
�M���otgB�C��l�D����~��W���m=1zV��/��n�T�����w�3�E��`��6z��P��Mi����fk�M "X�~#]�)��m����L�m�yj�������-;qs�)#��������(����i�]%m�
������,�"�%�|�J�w��a��I��o�i�S���}~WH���������Y(L��[�8k�K�1t����0�\�l�\*<���a�P�������6���O�l�w�_������o�uz����������A��I#��� �l�
IH��.���&�No��:���.d!
������I&����� t��k~z���\��H����)�%`_�A���
r�C�{=^�V�o���6	I�I�.0�����7�������O$�@����UH5��&����ME�%��CNY�K���$�FFF%���pt�q=�U�4V�&��n��]���p;��v�]X�'�@v-lE5:�4��An�),�2�	F��l%����*�}�����N�Il~����:7���.�����t4e��A)�OPg���A���l,v�v���(d��4�7���T��W����D��+�*�d���������>P���Q��4��~��$�JO\��gM��U�2{z�o��f\�i����,���~�b�5b(�q����X��72n�#nGR�F���~��Z>�KUp ��~v�z�z�F��	�mv6Q
��|��h0A*_�����Z��r�L���p�����#�1�~���*���7|�m������C#4GO<��>F4���wk�D>`���m��3X�T��K'k�j����Cq4�=����u��^Ss�5*�/(���X��hcX���k��-H���C��>J��� �
�wy�Ua���s!b�b<Ab�M�*���o�W�d�������[���P~��'r2�5���0�$�r��weN�-��C��]���;d'�b��~�.�-jz�Yh��>��'�|��l+�}��
���w����h�)�W�d.*����J�-gH-(�y#���UW����
:F��*�dHy������f�J��������Hd1��0t�J�tq�����\G�$����]���=�.��M��V���Av1e�S�.M��+(�Y6��YVj��z.�R�a���g�`���J����b�!�jrMaq���o�A^��s4��g�b������h�;m���^A�[m1������h`2�z\�uz�*{��$LY�*��T|���	i'��>����.
-�F d:esm�������������Y�dtB����e�.=zxq�
%��W����� F(����;���G�[A������rQ��.=��)K6K�3"`P�����h���4�r����4H!*o#�x�$t��l27�ks�p��������8����I��4<�G#�O�#�m����H�:�C�]�+���Y���)s|�{��q�8=*�^�1�I+�-d������g���|��������2@�p���
�.�/��o�� U�OK\n�������z&�P�%�
r�wtzC�1[a?��/�����%�;���� �����`�;GE��b�B9nS�[;
X�1�auRWV���{�V0c�r�}�����b�&����d���-�Q<�����p�����n���N�h�X���s�E?:�������zWA+v_M�p��Q��p�w�����#�VZ�Q�q���od���zT�Sa��������6�}�`#�^�i��$�78bUy`*{@>B
�q�g����b�g���"�������j����)
9�r)�.Ij6OZ�*�ya�����i�����.'����#��S������F-����	���I�E��7�a��\FW��J!t��
�2N�.M�����%��`d���V�]��v
SK�=>/z�Ct�D<�nC��<��K���7k)���L3`��/�k;4����=5����
/D��x��W�Zb��PJCCeA�4��I��]Z�&�j���B0��N����W�B,GG��G�L�����3f����0n�
U��@��j�b(��e�>l5Z!�S�e
�)5���P�Pq��1P?�F$!2�*���|�D�b �BMJ���q�)�u����Zq�@c�o������N�m5Zn��Q���v��X�5)���U
L�w������^�q4��9{G�M������G�EF�?�����5��G�0��K�)i7��hl�0�PG�&YA��T��IL#c���+��s�W�f3��y�����2�,���}���le��%��Y������&�
;�^���q��c��cC���K�b�������?����5� �v��t��$���h����7�b����u9��F�������p��!�4�:ik��~���h���*&B���{�~��rW��U:"�U�uO�A�1j�B�)�Q����[
���j�A��8�]����j�A�>IOC����ff����}�,���:�0C�o8/E�5�>�����A���m[�I��p��C,[V��$������$0��r���c����#�]�Ct#U���1zv]�j���������l�\���J�������]���S���p��"�,�� n6����V����������	��)���)�w^�C�������S�����YI���	��;�64���&�q���i���^@��Erj���&g ��;�����>���nfQ���������D�����hx�r���Z�vp�L�j�Ah�]^�����DZM�]]�%�AE�
��U��E{�q�P@��Z[d�EA�&�0���������=!����A�oN��zqh�i� P��n� �\1�^3� ���<�n������n�!,�1����kIc@5T���]oY���X.��D7���k	��e���zH�"Bc�/�cP�Z�`������s�V�f����(o5�H������#�i����Vu3�0�1C�����c��R.0�P��%}A�b1.j�x������JJT���%��r���(DL���40��i�oBRAd{�[�����,���
�F�>���V��{Q��n"�y���I��%:�7��$�e��FO�-y
rIe]������'jG�7�J���+��U���p������xl��WD lF,�����V�r�h�G�sq�!�u�H�����=�y4���1����OZG�."L��z��Bj���:-�L�j�d�!�#�x�Nk����c)���*E(�����)�:5�8���S��`��E�VZ�]P�a�v�`���Zj�_3�`��d��(�8g������B�2l~c@Z�6��0�o�/!�W�����h��yjw����I�c���)��Ua����uU��r�a�U8`B{�LU,����9�Ck��Y`K����m�CO?�ZkR4�]<P��T��GZV�u�/���]�D0�u�\0� �!eS���X�����%�	A�b���.�B��tA�$g���a���Q!K�������5'�!��.c|���$�����-2	{Xv�S`��
���?�!e�kd���Mbl��_�&d�k�)�b[ah��]�do�A�"�N�����&��?�tx�2��3��=�~'	�-������K��"$�:������'k����C@P3"!��e�Y�|}^R���f���[�/3�/�R1S�fZ������=�+��� T���{��r�M�i{T�/�_�HKD�T�=�n���s��@?oGi����h�1nE������"v
�k�����+N�*�=5��F2����OM������&�m��2����X�0�F-T��Z�G2�q��U���G���&�-#��tI�rA�x����������ah_s�X�� �����*��$N$C�{	d;h�G/�Y�_�=O��K>��^��9�����n�}&R�9���3�Qo��)�z\I�����
`���<1�`�E����b��D�p7�!��Jlu��qK7�!�XUU y+�1jG��=����X�u4��1��M!���0�x�����qO����~�W�"���b}�Mkc��ho�/����U���-����u��FZ�-BQ9-P�����N~B��ob���P�[��k�	�P'���U���;AO>�J����t�Bu�������y�;�
/t�C�����4� ��gg��A�k�P�.�����oTd�Ua�w74�����nTD$�A&�����Q#&(��/�:�p�ml�����Z�#��4���P=�����UH#���c�����t�}��m�E�v(����7E�F��X&rk��Y����aHWO��\����Z7Vb���oA�������%���~=��=4�;�x��H6-r#����%���a#�����G5�H��IW�'���
�2��4/�*:mE�$��
}EI��E�l�^�P57b��� D�L�+�f��H��~[:������t�$�G����'�\���BB�����n\D���W>"����1��E��=�a��w���d�C�~��cG`�$�OA_�(������Z�:j�wc#�����H���>
��L�B�,�<H��{>AB9������	S��H5T�"��T�F������6�rB������ni����x�W�V��_�[�-���~O��Pa������r�S��������0����
I�H@a�*���Q��>p��S�$�
&kOh��[��(����_wV�+8�18����"M
��U�5����;=&�S������H��~{L5��s�JED���Q��Z��,T��D[���~�qu���$�B��Q�cn&���d���������:b���/<�n���Q������C�-^�G�"��c�{g�������x��$#[�Pw���C��0�!a��= ]��@��*rv�k��J5k��s
t�Eg���Z���Q=N�bvM����I)���n����41���LE4&��h�m���K[���d���*��p�4�1�at�8�
�lp��a������b����l�
�Q$O���/�R@������~l�����_�.���*���0J1?��F����G�������M���n����t��G l�01eN��/�Db�(:�
�����o#r�������������N=9�9B1E7D��b�8fJ��&OL�7^)�C3+�	���z�%���e5*�Q���<���mt�H3�K�ZcQ��H�����L7Q^&��P+{�p:�L�H;�B�O(�l�&v���8�!?������|@3n��`��M99��ts������������Y���\��p:�����R�������U�x��p��2E�8Vj��&tBRm�9`�����H@��t���n��dg�)��c+�.�w��'d�DD�`A�:�Plt�1���x#R�`��6�0~0�:p5P�K��rI��$������"���m��]��4%.�Ca����;2&'�:��&�Q����������F����Z 2i������Hs��Vg��(�eU���	hzL]`��iaF �l�-wEX�Ex�	k�D1�s�c������6�83���D�D4��������H�R��������/�0f�~ika=����4&��?����iHAb���Uv��i���+K��������0�����K-���\�g��%�R��0��Y��1�0��fsX��4
6��%X� �l�����S�
�����t(�Nk#�a�J��*d� ��?��$e!��X	���g������4��|b{| .�:����!�g[���|B-z�w�9���N�Y�\�T���FX��1��
tN"�Rd�0����M�F�����4v����M;�l��,���`���4j�f_������/�
(�Pn������ ���d�'y���x6(��>���(����������I��� ��,tZ�qpz�����P]&
��
�91�����Sm�u*:���l���I���[t��'{1}���k����7����t!�3���f&zB�������jrP��2��C����I�0c?�(G�8������
B�U�A��'(��:�����ws��kgU�H�I�����N�|t!�@D�����Pu��@�Y�F�O�7�F?����Tn��7K�}��Fd7e�����4�`���DT*�+��r�@}NE��i���/���
}T3�����$���2b���
�|�������L)
HN
L�=�g=��j<I��R@�J�S���\�>��1�q`�����^c����������4JZ��ba����"�2�1�=�X�kha�#Q�
�y���)�n+� ���+�9U�n���q���R��S���K�-�Fl;�F�.,``�`�s��lOk��P������Q����q����DTK������J4:O�h"�?���|���&A�3!�<�.�Yr�f\�y�gb��i8Av��%j�}���Y��WF�XX��z�w0Vs�]�c2�]^	d�.C	�M���b%���X ��S�J��tG=���j)���9�Z��,^O|��H`��e�����x�w�Z|:�;Z?y"��m5��]-x:��V�����e���fT�_�L�>G&�IF�5�!N`w�)HV��I\y��l[��z@���}
�<��d���NV��S�~�h�J{F���GN�c,��=������{��ujU��ts7�%��FE�`�>�l�O�h��w	><d��X��������h�?_���)��:�/�	9��H.!�����V��,Qo%�����%�M�7BFb���e aX�����?x$/��t�)��	��b��k�U[�F��]\}���S���qK���m c�etAp��MEV��r�D�o���twM��Q������(_)p
q��{+��#�n6���A�W�h�]=Qt�P�eV�����:�y&)���%8��:�Vn��`o{D�w���i�����5b�,�d���#�
Vv�(�����h2`~Zkf9C��1xI'W��B��(2s�I&�
������u%�Zs���h[�O�L-M���la�H�y��b��>����X3�Z3"�{TV�x��_
;�G� �}D'[��.�h�>o�	�����h%��}.��I���50Y�2�`s�Z�J`�#G���� ���B�D����@XX�f�@Vf��v�h�!����B�d�{�7�|W�	~L[�m�^K���]���6�u(G.���]���,M�{0�i=��v�>�=��h%5�B�K�=��l��u��qi.��d��6g#

V���#V4�-���w[	!f�2� �KF�����=���Cmw��6ReD/U�w�@�2�p��7���|^���3��	5ep�{��P���?0��6� bG%�~�2}� �����`�m�A���p�m�A�y���4X�io������L��$jyC�#R�&=���'�����I&d�-:�OD
��9j-�,nD�E�2�7���
)������@�.�F�}�D(�IOj���8���aZ���a-�j�	���>){��I(-��K��n�:�U>T������&�k�3��E��
��W�����{=���UZ�������}��Y5�:P�/�y��������$�QUxA���j�H��k����;Y�A�5��?6���I��x�D�1*���;������$�uv`	���P[S:9���!u'���p�Y��6Ba:^����s�pees���"� 9�T�z��(���Z�+pX�{�+�8��ax�6:q��%XM��5T�q�c��(tN��"�l.a��T���'Ie�����#�Q{^���v'����aO;�V�J�C���A�%�����5���%b!g'��s;���zb������g���;@��e�Wk�A���+�R����xb=����"�Ov��}���x#I���-�6����W��x)�&�D�:dZ������a��I��{&l��r��\O��<����6�P���5�R�e��?4�v���?��(���f��q������/4�~���;��W������H �	\v?���F����?��"�8�]h��}���#o���}�6�pA$�^�0����m�;��}wp������J� 
�����$�0����7����M�o5>[F����e�������
��T���,(�Sp�f�+|Jy��1��6��3�b���?r�e�]v�m��9�����`Bi�A����4�
O�}��x�$��`5�R����B��_A�<AM�Q�K�8a#��O��0�SCO�_9�3H7#��}2��OD
��B��=����1���$y��D�=���<���D� 8����r�/(�m�
�$O},���RDu���1���u�Nr�;��c�J�?��eO_��p�F<���Z��������f��b�O�D3Y�9Gth�;��Ru�<*�'�	c��Tr"V�����'j����J	����v����c2�>9*[A
D`t���������D��c�@	��'	���6��zt���y� �}���l���x�c���`������m��Y��F���;��DC%0��c�@t��:'�(�@��z��CE_�am(Ycb��0,���i��c��~����M)���l�2�<�=1����(���	�q�W��
x�	e���4���'�����D� ��
���FM�N��f��E�):��$��'�H
C�W�P	f��b�E��_�T����4��N��tP�JBm��yF�6@)��9+=�EK%w��I-��<����
7�8%}��p4Z�b�$��[��3�wO��Oh����[EM�3���1�U�� ��	 ���Q��<a��
�5�-��!G?9�v)f{h"���thc�T�c�A������1��I4��
7(S�J7}���
M#
�������H���B��c<Y53�k:Q< p�sPq�d6�h�':�{��K.�2@�-)�5��u��?��swE:�;����;{V
��9��$�Zt�``'��l���n��3{������������F� �o���v�JV7���$:F�< �����'H���if����A�m��[��_kb�)�&e������B�%�<��h�f>���aG�PC�E��dc�*�3��:[8����-0��_�wk�$����N%�~��1��<� �G'_S{����2q$�.�F���L�������~���9���K��{
y��e�w
3�E������f�9C�x3���m���zT��s��x$��yb�D�&�A^�Hk�7�����o��rv�
M�
��fW�2��]c~��R����+�5�3&i��yq�kQI�q������\�G��i�w!��5b�*��HP���.d���	��7��\����d��qA�P�$ ������ �Iir�����o���G�
-��"yhd���tD{c��I�*�AAP�j��B��
cV�
=���Vh��}}.���/�A������,���������Bq�aO�Q�����hz��g��-����
d@��P��l]�S����U&�$��ox{KF�X	���b0�0��d�)����B�y5v�(B~���x�~�����e�[��(��i/�kD�"U�h�F�p�.���V�����P���rM+)��h_�N:a�2�!���u���&�G��������X������g�f)���q1C{�w�_�N"��!�K
).zz3E[��qZm��P�;
������ ���7��
���~.+5;��0�o}(6���1��;kE� �n��S~
Q��R
;��k��[h�k7!�j�
��a�F��v������n<��������sYae���Kx��)��_�����tH�7��\��7�����u�a5p�	�v�}�:|���B���^�q�jD�@z��	f��]_�\t���������mb���)_^;n��g�H8�]��^4;
T��\�I�d;���$b���Q��	;���/�}��M�in��u��be�w���Z��JH8���k��,���Lxe���x��@Z��A�d��7����d&�!��A�i�|@2����.#Z�J���.V���
�#��{�6�Z<��{���q	��7<�U��"!)�;#y	�"�D�9�}|��l�(���~�8�>&C���_#�	w���E[uy������7�Rt�R�>��x�]��Z2bsx){Lqc�k�y��l���/�"�A�
�9R�A���]��P����s��%b�lZ�=(�D$W������D$K�p\�7�w��(�ju�gn�
B�KDRH��>���]w?3��NJ�F���1���=s����� ��H�P���Q�>h��)�������%�#:����k���BE�4NI/�$��^�P*�?����{����S�����s������?�i���ox��p�m=��R��Y��Oz�:���o����_Q���/9�p����NI��X�\������[#4�|���i�$����Jo-u����@��������}���m�/���V�I�����YpG�fWI[��3F��z���z�j�}�]���V�����-&{"�!a�����
�,�~#[>)4�������c����R`��2#;W������c���/�;uT$�3n��Ds���M�-	Af���X�57��J�v��)�V������oPj��}�@R�u�V�S�w<�XK��/u������
y�U+n�k��&�����~%$~vZ���r���j,��� \q�����Xv��e_�*E%���2�La��yY�&�1�������E�~���n2yc�T�X�������n��v[��|�1E���~V
�Z|���t*	G����Q���=���2	r��S��0����ZV����?��t�+����P�bI�1��>�m�)�SQH_�Zd�{�u�������'��"�;j5,�V�K������cI����pWku�95�� �i�v��E�1��=��V�p|��H���We�#�Ju�^�,AI�����y�SbZ�i�����2�*���]���y"����Q���SG0b�P����
���Z���OC]g����| ��n�4�o�
�{85�}8������&������+Ou/_x�wJB���__,/	9�J���%n������d��A^���W�:&�*O�������V��G���^�`<%l1�LuW_�k9w0�����Pr��n��wK�iw8��U����oj-h�{j�����*�? �rH��|��dL�u�Wx.*dk���
����q�1�uO�������m��2���D�0�������S���NP5	��S{\���j����v+1`�](���3r���w�`E�H�L�����Gju���R��j{��@��I��D�]r�G�p�_#�����P�Y,$�B�S����������f/�|
������NR�.lq�_������NU��+�I+
c�W7��s=�����V.&�n��Iw�%��i�X5���gr���90��w!7/D���m����e*����@��k�{��p���r�����!���q(b�����o6���}�++J$S�'R_�\�&���,qE/GM����tLh��.�
��Uc�	
S���(-#��S�[����/��^�=���e)�S1%_5n�UIbl��j��$+���)C�=�V� t����0D�8`��'�������?yY
	w�������VX}A�}�w
t��
d��Wj����aP���<���Wu�d�!d��!�n,�<h���/�H�4nO��|F�j�����^�8�kd%�U����������v�8z�������������������r��En4��~�0�,�QA�b�����d%B?�=���V�2%��0��xn�o�q�����Q��X����v����:MY��F{��}��={����/�(��WV
C�[-�~��y82�kl��������Z�u��HJ�����B�WJ���:���t4Lr���/��>J�Cr������������Fv9��V���g�g=���P�"]��i��M��z����"�^���=vd2�����pI���]<�:�;����]�Ns�������z}����(�E��Os��^�9q�aU~s�_��6y�xp*�]���v��q��fy���x�
��b���|DEi���3�1hZ��e��x��u�Z�g�
�N�J�!i=������C�m=!V���<���{F@W���N��\��5�in��������R'���i����I�����:�0������������2D��h�������}m'��F1�G�m���1�������>�x� ��{RM�O��� ?�����!p��I���B��V�vq/%0����RF�r���������#,�mZ+*]A�Z���Drg��'���HR��?->�
L@���v�����.o1�������K���3c������6���i�>�R0��8��y,�iq�W�'�f�h���~������{������x������Hg^�w�F���%��A���}4�6i����j6�������]�UBAK���=��{��n����v�}����yo	q�u��U2���R1�$r����x�A-��{�[
C����8���{�&f#��y�h�g���,�_l��N<_��P������n8�OY����
��Mw�_)1��x��w�� �W�����`�1
��?��|�|��{{{�����W��>�!VY#{<z�����#K�����Fg�;6�O�`�c7&�������u�$�P��^B��	a;$����'��/�,o��;�`�H����u��d�<��K<���.q*������bwA��na#�J����<��L��
�M��Wr.A��n�5 ������=��
���KS�`c�^���j���H�!�$��o���,^�, ��7���h�����P��[�^��	d{�I�y=f�pkL���V�W�YR�c�J���c�����f��P���vF��0A�1<�:�
b�`&��m�S�]������p>=�������@S�5��&��g�@�prk�@��&�I�{"$���&�D&���=0v�w
�=���2rf�7��a�]=�����v���*tk���������0U�}%��a�Ak9^V��w�\��/�mC��	0��n�R1��GP���=���K�������{d�S������f�9����b4d�y�O�������y�}��n�1U�*=7+��p��6��5	�u��c6���'�F��mQ���xT����
� �3�8lP�u2�E3j&�P�4wB�k0��nD����8��1�R3�P�L��������XY'���yzD
Ke+=�2�"�#��X��Pv=;)�$��PF�-p�"�<O���u,P���uc������=t�7�^��B�K�.`���pw����?���b��H�(f��6���joi4:���1��L%���hQ�r7���wD��;�;�q���� �?�Vd��*��]P�GQ���Qt�?_=�R#C�0����j1��[�#CP�s��o���2�r����CJ��m������ �D���(Y(�:7�K���0�}k������7��j��v?��	?B�=]��:�~�T�dn���������.��j����A�=:���@���
���u��v�%�oo�"��p�_�Us�D�v�o����������1 �"~�����F�s.`E��i9�G��M�|�(_tF�E�B���`Y�w�x������>(�����LP������P��`�0u�u���W�����J�Q������E�� �=J�'S%i�I���8�6������#X����(x#F@�G<�+TS��w�H75b��������S6r�i�S���45)F�$C/2�z��
�)�V�� y�H��>�����
~|�2N���3����KFR{���-�V���3��b��rBe[F���MR�5�:���M%��i�����s�Hj��L�2���p_������&cD|�B�{�nX%��8���J��.�"�vvj�[��/H�?�$�r�n�����	�u �D����x�^�X3��L��D�P!�Den����+2��;����@d�����9�.��V��b��4?!��J�|�g�,y��Z�b't��`�1���&��z
��B���G���W�-�@}e
v�Z=b$��q*���feT(��l����������x	B(��ST���g��Ul7��b���� �-�`����(�q��/}�a��S�kx
������c��Q�=�JF�����M�u���{�A��N�qb���\jq0!K]��X c�MM��=^ @�*������(�4I��%@@������A���������8Z����#�/����k��%��q	�E���AC4�q���h�0( �7��,��g�~U�!j�L:���5�hk��k�`�����RN����m�q������4�K��i$��r� 	��������ET4��KhdD�9�)��3���rA��4�`��2 n�gG%�������xCk�� ����jl2b�,��s�Z���K�����-.a�u��L��j����mU!3(C���]��Ck��f	l���C�,�j��T�$"78:���.�D�k"��7��~�g��
���5��.2�?Kh��^�����5v�#�d�6���=�gY��G�4���$�qYv%����G���"X�U�1�+���@M���i���]���]����!�3D�Z`O��i��t��5f����jhd���w�s�����lX�-W��h&�@k��B��7���}�i��u�f�jl����3`�:������4"a������ ��c=��?-�Jk���.���X���l�*���V������]�>B���O 1������y��x8h�01E�����F�e��"2��e�&��	����-�H���k�z(sDCJ1�i�A��:�����$��N4����g��9� ��e�hW]�QMv����4�p)��U�v�����������g��t?�)�����V�I,Y���[�Eu�"�����2��u�c�RUR�����]`������Sc
����+��h�����������b&(�Z:��D���$O��~q@{�����Q��Qw�dQ��0���e�������#j��bP�[e��S����uG'ziS�)�w���p0�q�����_�2�KyF| �� ��������}���@d���E$�d�4a��u��$��"i~P�q�G���x���{���	�
��O�x;��J���3�H�e�����%I2x�F)�M�<���KU����Wpb�+����J�A�C��<�V���t�����l�b~�(���mZ��1�Y�uOP;]O|��G�Q�������	d�nph{X�>���������(��U��O�p���n,�(Y��o@��N+x���x����P��z���
{�5h;��<�YK���c/Tc����^u�	$�\�!�\TB�ze�q�"{��Z�;�d4��4���S_K�	�f���������m�e,��h���DOC34��:���R���������
.a-1VA.�B��X����P�X����n����s�J���q�����M�?9�p,C�*e+���epB�WZ9�����epb!��HB�J�*Yjk�@������.b��~�zT��77�6��j^��|����*���}���6m�U�������8 i1U�-H�P8���B���Dg�e�B�mk����-X�M��B�l+���{P���l����o������;���1��r�P�[.�K���}�W���F�����@��5����z��N�+Y|9�N��0��$�*�*8������2,��R����M�	�!��5���Jv�C�?����t{iJS�o��?�F:z��!��|eyD�z=]�[�|u����h�4|��R�����W|����}%y0��hmHC}iu��BcD����k����X�g4���vt(E���^�$������7c���������!��}�@/7p���_j�-#������d��r�P	h�B�%mw�\������L��d���%��j�UKMsv+�T���:vlz���	{��1EKN�y_*5)A�c��M>h�Y�a���J��HKF�:����x�2�Fe����*�'��\�eC)K*��/������g�*������;���p�]8��
O
�n�<�8�ni���+2����/�u��xW��Yb����6a�
���9��S�"�N�>�����{��n3<6����(+�HL[�i��-
5l�����C���6�e�|��@S$�82�^F�.T�x3���f<�<����.��t�po�����������������A�}���C#b�m�j�!��6d������
�v��Z�;��������#�Xj��;y
���-�;�M	��(&B��1
Y�����9o��
C,R5x�i{G4�0�m�B1z����p��������U�t&$�Ar��&����/��,���`����,�_��h���.n�#BK���]�@�|��'�_�������i�I!U�N��\�Q�w��c��`K��*QR�o�����
X�d���]
aD����^���:��e�T���=�%p�g�<���*%������4	6�e�S�A8J�D��m�B�G����68qD?t�J�U�pz��-'�z�gZ�Y��Nb���A &����������50tV������P���v{����9�v�4���x�(���3BUw�rw�tSXu��qy�&t��M����]f�����B%����pc���Blpu�Yqa�B'�
��v��+n,�������t��'}�������x�;*6&qp5�,Q��=�6h����q
��nU���tI���2��'D���m��e�m��I��JT�������Ah�6R�Qvh6F!�fe;L����]�$�	���	�����+qC\������A�j4[>�T
�@���`�,i�9�`9]��E�F&��3C�m(B.hl\;Z���o�b����iU�,�d~hb�	�g����;��h���u�����WiFo�
�_�~�o.�R���7-�!�}�����m$A{pkK�3b�����B����*yP�K�4x��aHN��� Y�6��xJ����)
����!<�
l�c�ON�5��J`��E��c�@A�bU�"��o>F
���1�H�x
8F����?O��g����W}�'�u3�����p"�X5h�pD-;"����<����C����)����������w�|' ���Hb}J�0?/<���xJ�B�$B��L��?�D�)�8('��%�}'	�;���buj�9�da0��1�p��i3m4�|E�f�%c��cg�c�A0AU���9MHr0�.�1� ���d�����b�	r;�'���]�<vn���l��� ��&��:�|�H �PC������d\p����������AQ!-v����Q�Y�D�"���1Si�������I
����5{$���z����<}�I|��x���cB�A$�bmm�.8F!d�^z��:4���R�7'���N�'�N�+Y��_G��&���=�����}�F(������;I��43'�r�8���;���:��q�|�+�'��F�����a��+�����
�&���b���(�v�����jhK<�,�Tr���n��O"����yaM�iy@~��Pkt��E+�G���f��$�D?N�U���V�����l�o��:H��C@���w:3x�qQE������v��\��w�)V�'8B����Ze���a��H��|�U"v����z�^E����$�j�'Z��<F%$���kaG}�b���x����TR��b��`�hEQ��|<��U�La������N�`��@!b���bl�;p\�=�^�#4��'�K��F4�ek>e��(j%$���\�16u������8���a��)�~|3�����'=i��1ra���P���XB!@pd�(�0�������!���%a��������.Rd ���'��=���cb��`Z6�f��	�����(������8>���D��^���s���)����w'L@��y��I�������?�w�B�?X��H"d.��~���_��5,�)b�v4������A=	v�^��4��'�7P������;|D���'�nDc�
����	��n}/d���Av���P]���}�����w����*�6����[���W����	e,�k��~/c>��YbFn��I��x�5&����������6W�M4�n|_i<����{��Ua�0�	K�w
��["�;��;�?���w��)|sX1ze5���h`���@��w�'��������p�5^dM����~�U���7\M?@�#�W�KTF��w�IQ:@~v=l�2�!�w�#-|�[�:c��
��d��V���F���u�>.U�m]A��^(���nhR�;�6�����G����#����������y/���hP �<�v�{������@=�������.�w�M�������U�V�.�"����*����^e|`�;�8��� �O��Q � �s�M��C##����������7�;��C�=�6S����#�d����6���(&�����4��t��n=z���n3���>Kv�p��C�Xj��:rw���
�b�,h�x���M�;<��=��g���moD�Jp�fg�
)V_S��:r��w!cj�;�0��P��#7�wo%�T�B��=I������l� �
ZV�	p2��M�9����RG�5���e�f�0�#�6��w4������Ac\JV�ys�����y��[<����
�d�Vv�^����������k�D|q�n6;_�Z��XY�F
"�NeG����v��4����2D�l�}���eH0
$���;�wr�n/������b�{vl����#�+�_4V��pI�,nUs�idTC��aM��h'�j5��I���R�C�&)vw�?2VF����lD{��fD�3������/���8<�s�h��y��������?+�������\p�d���g���G{��C.��3��{�A�M� �w�7Y9���_�_�j]�����c��J4v\I>�|J���V��m4���J��
,��)	�.�d������}��{�^mz��������dh����
�A��[����:�%���<�|�;:3o�t��~�32��A
���������n��(
J��Is����KI����%�P���yD�3��J�
��*I�#�����Kd�,e��5
��-�ft�{!|&��x7�^������n���~��Qyk���^�,;��a��F�a���������^�}P5;aC ma����R��u�<a�U�s�?�An���B7���,���s�
%�.T� 0F~�ZL�W�����I�VC��%�GlY��������ca������[Z����k��]#y��Bh�LbP����]��+@�[��Far]��];Zo��-�T��Y�g�C�tB[�#q�p�9�f5���y�=q}�������2�)J���}��`S����U�&����"������(���@m'F�$���F�������KSN��f(E�� 2�;(d���JL���j�����+�a_
��mTJ�)�8��4��[�
��2����\�]#�P[��-@�N?�P�fj
n$C{�Z��o:z�����v�ic�dZ-�df���L%2���KX����.$�����mJ��2H�����V�
��*-������?_����<C�������	��ndY^MtX�������CW�����Z�����^�=b�[��l}��%z�
�2X�����U���AF$�P��V�h��)���T!"^V1$!�v;"j���<��[v��byG�6+*�f�U6��
O�����Ah��(�}�Z��7�J�[1��r��B�r���1�KB���G��I�Q��O�r���l;���vruX����	yW��lS��,y��x{]�+�c-�jS����(l_	0!J��h��n�_�����f���lUCC.b����� ���0�t����8���"Kg�#�3�jCL������I����O���J��O&�Z�	K�V5� �!��DP#.S�ku�N~������v��b�-N���Y��YL�z�?��m��A�
@c��U���C]�P�^'
n�r��Z2��ds@��%r5:4(�^�5����#�������(-�5nR�tJ���&W[x�V��i����9��w[6+:��lc���bh�cP�����y��� T���VBy��7� ��}�u����i~�����5�2A��Uoj��h�A)!uN�A�"%�t��R�$1����!x>'F�����T��&��):L-��AP�Z
-�vlh����ixJr D��I�@��j,�X�1���GLI��?���Fy�h��f�*�qhk��U��Y�I�W�}�E'x�5���������W*+2Hq����#���@�?iA�tb�qG��t�v�G����5|l�vE�`�p��A�C�=���@/�rN��������!�5��x����~K����GL�j����qbl� �j�A��������S�������T�
r���NQ
�p�s1��r���j�����I��Z����^'l'5�J�����K�LI�k��$�IQH�	�p;���'��g�	���c�����*

���1�R4��$�&�����
a��x�v{5G�v]m	���1�����O�,{����S�{���nt���j![����E'At�I2��Z,_bs���}�)�tF��!v�������f$����
����!�#^�'��'nQj��y�d��V.��V���Q
Z�[|o��h�;��b�k�]6
�T#�:�����]���$���p���	�Z�����ry�W���;xDO!����|�HX%�B!:�#�s
\!�!V�����Rd[�F%s�F��1�y�.}�h&��_h{�Z�/Wx��-!�2n�{
���;d�����(D����N��ou��pWv����T,��w�H��-H�y�&������m�m�_"M��$��:&v6fp~����X�!�����D�t����I�����V7�O��>m8���4�V��
���Z�-�Ow���z�"|(+��rvT�X*���)�MOw��$������P���#������U4���j�6��j���]	~�	�t�b�%8����~O?��A9B���T2-�O���7 �%�'�����UXV���N�%$�i-,`6�[����}��
���!���P9'�b���aF!���R�~���rh�"�,�pj6��=��bt��"d
7������n?R���g���������['a�S�����_h��#�G���������a�!���hoR���%��`���Ll��M_F%��
�CU!�����Eqo�9l%7!@%�l�D�%��U���
AH�#�<�i��������AV�����>����A����T/�V��{	k�n���WG��=����YY����b��N��f��!@�q�vk%1�n*�s�e5������LM�h���z�������hK�E�}��uk�����6�J���jF�eTsM��
��b'�W������3	S�GzE������Xt�q�/��'�~X�����c�)��bC�5<��&�em��$��\^-��R[��s�?kiD1�H������[�����7
�u%v��'tf���"�P3�E� �<��`�F�(����X5�4�;��1�f����F�������F��k_kc
P@�>�jh�Y�VjL�-H.����	He��6q[�S�YVo$W��g��|���v<�
�T��H��-�n�5#F��w���T�A(�	z�GuEe�G�L@D��� ��
��@�n\ATOu�w����f[O��*����6+P0��J���-[�o���G�z���J��`�]�|����;*JzP���:������������=�&��`
�Wi
cw�y&7�G�Qh�&L�N6����Z%�$����G����I��6C�$���/���-��d#}[�����]��Z�.����Lm�8���v���,[���?`���>��{��\��5q]����m����o��>%�=�o��q�*Z�����g� ]��-���"`A��g_���+�a���CT������M��7��Q�2l�pF�=����p�.��\S
�lk��M���jQ���4��4~Sw�'*C�������h�����J��:X"*:��$��N8��o!�3[+��1���](�r6�k'���/��QGta�5,�NN��=@��s�!(4z�����@pT�voty)`�a�G�.�z_�aJ�#��E��F������$~�J��3���]��Si�d.�����Y����;��P�.��cH��H���=�fj���t�����6RB�@�-43kP�w�4��r�
�;����OC��b���>�va?D?�3�m�
!o��~�-nX$�-�P��D��:�	M����
��:5��u�E��O`x��h6�
K����x���.HBb*L��qg��1�wr���8	��g]�x��%��
���\cp������E�e����v����~�]H������T1�G��WZ��#���y_�p��()]hD6K����sg�/�>+��Y$���L��m���NV�	w�������%�M��z�Z�F�����Q�K�I�����;�������t!
'��taU1;(�� ����s AA1?��f�\�����N�g��	oX��5���l����
0��y	:H���P��e<�������3,^�~�a����jS82������X2�����;�( ��^�aT!�k&�'��zY�gR������3S�_1�����f�0��Q�>�p�r@I�Gf�� ��(�	]��UC@���ST��w*���2y�9����4&4��	��&��k��K�Tr���+f�	Q7�'��c<���aO�[-0��5��j�a�Ed�����X�CU/���j���Q�'5�eHq�%:E�8��&������>1����C�A��NC����
����9^+��� �|@��_iFr�!DQt������#�h_�i
�RVI���@q�v
A	�����3l��`����dvl���!Z��Z4�vT�v�$(�*-*��M���x�u2�=�����6-�>��2�!�`4�
�
+�������	��2�qt����w_��s:�3��f��G��������p�
^�~�)h!��/(�)i
�
�X�}�8�Y�0�U��8��D.��ho�����#��
����xO��
w����!�.9t�	���0���A
�M`�8#������vg-��/|�U#m$�!�Yq;�cD��
�����~2Cw�"����Ae�v@a���V��"Py\�=��3���<�4'��=��,Y�e�c�K��6�Ca���Yv#�����"���I����a�I�
��)��E�'=o(l�C��#f,[������F9�C����rK Q�)v%���m3��"mxw���)Ze�8D�����]�6�������5Z���4�?����/�LN�����l�+(�m{����������A��e����p/U�����L2���w4&�k�����uc�$���E�/C�S�L�2(F-��������'<�(S��!tK-���z6�#��j�$aU�P�������?�0T;�Gl��x���+����#=�W�	��x�I����t�4���~�G��jRNgK3����)��u8C�1�����i�V�k�=�N�$\��q
�`��_7s�������
������R/�w
�8���L������q�����>�G��Y��in��������|Q�5�"�B `<*�����k�C��Fu����X�0�H��3�H,
�>d��M%�����gj��
�B)�����:S��t��`�
�`���L�Kc�<���D����#�%��LA;
_�N���2E�t�C�t/E70�q��A2�b��j���&��5����&���v��F����r�h�v�C�.���6_�"�Cx�$[�y�Rv�lK�a,S�X�((k�4}[	(�r;��;z"�bbYRD��)��EJ�@�V�c!�����-���R�z����B�[b�
n��D�'
���*�����ZxE�45�P(�5Z��?G�D�6���o�������S��.A0Ky��z���>��
�^#G�r���c����B:��fU�c F���B%f�f4^)�qN[�D������r����Q�t��=BI�h������y���FR�����%w?l3�{���[��e	9�Y.�������4��-*���l;�	.;�� }���zv�c�����+x�d���1X��9"Do����`�q�<�+�������pb�����p��(Bda������l}���.��j��,�Sk���Nb�������M#��x:{����v�J4�=
�)Lh2=����.(s�p��h/��0;�����x�/	p��Ea�6�k�=u���3�E����C� ��������a�e������(1���\�D���22����h��������S������&I
�h�A��!����T&�����@�l&IX�V4[_�F�H�<�_�E�����#����O����h���#��/�E����R�r�t�������q���9���t�>O/��l���E��#�hY��[�E�`�*�����j/�;+�A�J�e1C�.�pF
eS��?g� j��3���ENvC���� =)!`	�[W��E�����!��"��n��_F����M�AW�}K��.WZR-{"�=�����!K��"}#��.��1f���Y�]#L���cg�U����c���/;!�U3p��>��T�y�?X�����lm�/_~R��,J(�@q5������ip�����P��_!�+�^�G��NQ����<�[�N�Yh�[���1��IZ�v/!pk�s�n#�f�X�kK0���'K��o�j4[�X�D�Ms����7������������0���Y�`m}���(k�Z��
�d���ap�!��Gv#[>N6����C�����0d���@0��Z\��d�����a}���p#�"t��0F@�mQ� Ta~9�aaa�>���H;�����������
N0-a���(gbM������3H�����Q������0��&����b�H����7�l\q]��A?�^k�m�m�������(��_�i�D6�_�q�����p�+��6�-*���S8 ���D�����w��/�*D��2���Y},P@���wm�����+C8��|���%p�
[�m�r���8�UB�	Y��Q������=>q��*V�~,G�czn��[�p(���X<�2h�@�_Z��'����4�CU�n���^�[����h������ik}�YL���R
%+m���w�2���dt��{aiF�b��F�n�>
k������}�Ro>�&��~���h�l����0�Yf���g?�)�1�����h�G�Q���������-�@��U�RPZ��m!a�~��F����D(�P�-I?23Da�l1��,N�q�.��	
���r���qX(|"q9
��4���U���z���7��A���&�����0�#y�,��M���E��~�����wv�g�f��k�h�B5i�Q{���o
�-���/���[�h���-�Qj��=����&j��Fj��L������x�+���
��p��mt�tUp_�i�����Y�����X�]�v~ayb��_���E������|{��	�v=���T��Es�-X�&�PeB8GvD���Q�-����[�T�C�������!���B]7.Vo���<���3����v!G8�iD�0v�}_����Z:|�Bjcc33��v5�N�/j��.�R����)�`s�����c���E�o8�-Z�6K�6�#Q���Ryp�d�M�^Bi�JC��^�rk�AK[�P<��:�o��� q�]E�m�5{��.��o�73������,�3d�p�h<IF����a���m��B�������M��;�\a�e_S�1�
7a;2��g��"5;J�4h������E��F.���?�X����������x�"��j��cm�
�p����vx��0���7 ����K��������c��t�$�B��q��+����_����\R����m�v��,r��w�N������T#��n�$�����gHG�]h������[q��H���7d��`Xv��Od~e��0
�7� !��w�E4���8l���$fd�-���&�9����GZ6�v��}��m���a�X �=����7��3���������6|���d���8i�/�3�F�8��S���E �6���#�#D�g{� �SH������LJ����1������Hg�s�L��
&���C�s�i�;��l"���������j'��/_����	&��9�SYX�8Bk�,<�I]��67��X3$�a��q�����[��!$+"o�#��m%�wOK��>B� x~K�l9iz~�6|$LQ�s��b!f-�|��O�`x��hj}����+���$+R��1�*"��!��n�]��4���
k�y�(�(��.H����Vo�I;�a;|R���?sM:,rhk���b&���O�f����Vgo���o�>K��[D�P3�>'4�����oD]$����d�8��F��,I��d)�b��Q�s�DZ�c%��{�3��Z���M���R��t��O�g�b���������K4�8�����n���5Bd����N����_;��
�d4�?����_"���?l.3��'�'�QP�I���M�g�$F�;eGL�#������������q����D�0��%i�r�w����4������g��������,�>����
����i��������� ��I/��)���Q�*:e0���i
�-��3���<���=�����a5{1������[h�c2v�yw�'<�����c�T������;��~�wL����Q9"��8h�3D1���'������J�r�a�/�X�� RL��i����o���N[5a�Y��}=k�^����${3)<b9�1��,��&u���%E��6S9�F��U�e���G�Lmdc+���6�%�F�[�d��:.#���&�p�D����lE��/(2��'��6%��2!| ��n!�����n��:�!F��5�����n�yw����� �����"|n�w'���$�H._5
�8����6@�%��)��;$[���B'������D���:^�{�yOw��}��5�H�;��I��^��qQ{�� ��z������f�h'������gv���>X����A{M�%�[���t-��������t<"��1������{��}/�R��h���I~����FM����������N��]Kx��-Dq

����P�g/s5��..�%n<#B�{#���;&t���D���(WV�YY�X�	p���j�+U�q������\���p�;�"@D�Q�}tl��o�+�\��K��������������7�����sBc��N��o�c���|�Q�:F���^����'c��J�f����ggvJ
E�w�m�L����:���� ��+�,�d@��H�(���d��R����C��	c`���Z�H��=T�=Dfd�3�.�s+~x���	��n����=d������)5�/�K*�~o�
QD�e��ky���G�Q����."�	�����;���a�(���T�^��#����u�?�+$���0i��?������s�d��/0_	6���`s���"���z��Jmi�5�1J�^��$��9�]��}G����!h�n�l
�G���5y�,3;T��D�	M;������~IA�Fh
Ky�}�?fg�/�^��]b��^���j��.�X)����H�������E���# n���_��c����H#��'`��m �D�
8�(�[����F�D�
��J��i�r�_3��nK�e�w�������Od��@8�p +y�y���k��,��Y�+�>��6�mG���7r>���4_u��lu�,�w"3y/�fv���/�~���Lk6p2!�yLm;��rz����g��6�O�of�?ZlBYy/��C�9��G�k��H�~���>���KV[��E3�n�C����-:�G����!mu��	��6C�C�'�)�W�h���6�"(�����H#b�{O��W�vh���8�a���;z'���>���/m�P��Y�>����]�#P1�f=J4n,�!�)�#����b^��L����|Y��v�t>�,!������?�P;�k���#���WZ�p�	0o;�e#�"�A��M�������jl�eS��{���?l���d��8B����W��1�iIP�W�/?��TI��xB�Tg[~"��+���������[8��	�sKq:����<!����#m��';�S�"$�6p�S(�;ziGT�OBg���B�Q�x��\yKi�o���P���~��.�����8G�NK�����w�b�4��~o)����0+^�>����E��6��87�"�a%������<�GD�U��['s�	��'�z�a�~t�)����HX ��$����Y�D�X�C�#��tC�#d}�W��`�Y�K���Ee)�"X�����R |���N*~;��S&j���E��0�]#"0.z�H�Kp@��t�Q�1Lt���/DBDF ����b3��	��H5��	)���,�nA�X8�Ds��)�?.t`$J��"K��w��4�H�����^�B]������{5J���r&4J�
�=ig>�m�*��#��R���z�(��e���g���0��%��<��=���%�H�#	+�~u���O����&K$�f��U��E�V����D%��Y��9"�FM��]����)B
�p����o%�V���ye�"(B�]�����}����@%���m�~��N���2��� |�����y���:[6�2#��-M�i^�{�M����@�QPU)�O6����r���M�*�lo�F��m�G4��UH) ���w���!$�E������e"I�4H��]f(>-E@�������k�0��A�#�����"x`�~u1{��
��gF�����1�i�/�������[�OA>�R�	d�C|ptq�����h����:
:)���\h�3���I��>��|-�2:=)�;������ou<����/�~���.�i�|w�w���B��~���-��?�Ug^�b5�T"��y��~�]�������QUY�+H�wG�p�8�3��
_�\�J-n!�t���wU����F+�K�H��*P�����T����6g��*(�
f@f]�h��g��}�6Sh��.��i9e{��g��[�p�g��L#��R�-����M�.?Xb�-���b�F����H7K� �{z��R�B
u)��l���Cm�7�]gp4������Q��>;=�G��Z;��������J	����{Z����o�|���z\��N4����I�6E&��
m@H5=p,~0��Vk�e#��u4���!�1������a��(v<3[a�S���G
��s5���CH�b�F�v7��1)nG��*�����N���:?���S�R<�<��VF���$7��c�*E��##���%���k�w�Q��{�Q�Y��6<��.�9f��V�G�Z�!
�0��/�0��T�G�O9��j�s}R��
��9��W�,��F;����*ct�^=^9���qD���a�<�L�
�P-p�]{;���F�	��JU@�����x���Dr�������R�-������!�������`�$t���V����>Z�sv
>��>�����t��K�����p?z����R�W8�|�g�
��>Q%a�JW��T�e��`A�z�E���p�S�v~����6k�����2,�HBZ-n��B�rA<���mB�8���K�k�]_��Z����h�.����!��V4Sv^��F<�����K�����U8F�(��!w�o�n9fl�*P����g���
@��I�2V���F0"���^	����4+������^-��uM�E��
?��j��H��d���K�2�����z'�)b4#�%�WJ��1�5[���-���])\�:��DMi+�_c��v���E���K
��c���t� ��G��l�/��L��U����	�X�x��"D9r!-M�E��n-��	�`t���W�p��4r��q<�:,� Y�G��}��y��]dgZ3vq�C{{����� >��4k "t�U�u���Q����Vc��&��>&�����U�@C��Co��Q��j��u�o�v@�V)��5�N�K����&?�7��7�����`
�w��g��S�P�~������u?M0&�Y���x�����C�#"b3����'���	��QFK���e8D�h#�����G1��@�f��X���ElB�d���S5�Mx�B��)���?��������f�v?�lo���K����x�&������L���CD0��e~`U����H����J�M�B����CN�D�{�@����H��.��A�+L�,������qmx-V7��_�`�f�h<����~:a@";[�H@3�6�iK���5J�/����a���Y�n]�^Q�q����$��x����w�9�6C��,7���e��@�T��"�q*�'N��X^�=
�����ZQ=$��[�(+�[M�@:.|w���� <b��d1q�a���	��h ���3�P3��	�XYi&��%�����fG7�(e���P�R����6�-
����~1�ds�	d���f b>&��}|�g����r� �fJ�&X�#��)��Q��{#k�n�=�-�������F��*+K�]������j��-��e�����gA�&��Y���(��X�KI�������k.n��9�@���(����|R��"yo��xw�g��;���
E�g�0������r�P�����R�F@P���b�D
qD[nN�X�sQ�T���x��]������������_{FA��"mcB�a�U6]��s/����FM������j{Z��lff�����w���k��0�9�m����?����](��>c���C��������L���;#��^L��n�w4���mD�g���*��w��l�;����5�d��,;5���dCr�@-Z���rr��
�����:3��XHGv>�O�q���>Z�����/��a�'��cu���^����B<�B�[Z�vA���C�:��"�g'P�kS����������.<cI�q_�{�t�MX�p��/#�w�hYg�������uU�:��a�0���?�������-w�KHz�{��*�$��G����|�� 95���{�i�+
��Mb,K�
J����B2�^�1��F����6�8	fw�x��;���R�w�I��q����}��/	>�0�n�#�et'E��y 8E
�nl#��u!;�K*�1���<���j�8=n��������9��G�h���������������[��"���C����cw!��p�t���`�dS�n��~�iM
�
R�~x#��-����
�p�15�`�YQw;�����XCp�J����������f~])�\$������]�uYu&�����u��f�s\���2\3��d�����f?�N��{�&���E���s4���nc������9S��j�.��	�T�&O���{]��������v8������Z
��h�3\ ^Xt����#�l3�[�����g�C��%<�T�|���K�G�����.�?�;�xs�����W	�w��;=���UG�h��������v�@��6���$|�3eT?��ja�z��� �1������a+�{�Ni�sU�^c�r�34��lh�����3_���
0 �P�Ah���dh��{�����
5vT�M����JVL��!@��w7�a����e�q$���2F���!(`��=����O�����.���;p����v�
�(N�`"Q�E����w3a�Z��|���$�!h��F���@�R����I�������AD
��w�a\����!pC ����
V�{;��D���5�=1n
��G���H���q���9�����e�_2F@����A�#�!���c��N'O�Zg�b��	�2���l3W����j���C8AQ�+��r: �~T"�P�����'A�q��=��F��fs�E���CF�(�n�=i�g�
!z5��H�Oo�C��3���
G�a|�5w���>M F7e��q��}q���D%��O���v���h������@�"���"��c�N�=a	�?���O8	lY4��01��N�ac�{����w�L���	���@�`"8RR�`!��mJ��O�7����^PtI��n�:.����3�~R���8b:��DS�1-���7��}����jU�u��MX��iea�w�-��r�S������N�@��������(��;�
�	�z���X���P�
�-���>��C��*�tp������{��q�x�g��=��L!�,�����lC`8���e�P�p��
E�6�8�sf'���~��a�e����D��4�g���	2�6����;�P�g#����7
��G���,�s�����#W�!��
��P��{�v����B"4&Zp&Z/���Z�O�0H�-������� ��J�8DCS"��px4Z�;E�+;�;4y�O8��?�8�Wbb,p
������. ���{�7��:�������eZh�c�P:�g&����(��t�I��f���������<�5��j�����E��&n��I�]�����:��?��������D3���%d�N�Q����:��Na8�0�|�L#Q��0#
��P$�h������"��t�4 �{��3�b�^�w�3���|���mO9Y#���c�4l���j;.�e�p��==�m�F=Z;����3�w0�Fg��U^��=����H��a�V��gI��*�h>1m��O'tq�h�SM��T��$��W;�>M�_ ��LA�$�i����ggQ�Ym�a�f�OtEDR:����`�;�����?��fs���!���pP�o���V����Ta����$�w��e��)X\S�hN1m����M��F-�>q���_J5��%�>|�4��w��ug{�S ���L���eH��t�>b'�p�G�����3H�R�NV���1WT����<�i�&h�wk�#��	lxZ������0��_�d�4�����c*jHX{��G��i�~W=TL[7MN��bt���(�i���IS�c2rh�h�0Q`�>'��2��B��Gs����h�<-���GOChV�@����,:�t
�+������56w���%�Lf
� ���?��(;�s�$:iK%u��}��N��k��,�j�gg��iYD6vY���{Zv�\$2d���^
o�cY���C��� kw�4�a�������e���Y}��U��[��������g+�E;et�:��n�QF��gi�x����@�d�c?�X�������C3;�w5�aF�2����s�>|��)�����dM���)7������
�\��T����5�8g��N����fX��bF���9���9ma�%���9@�E��y���H���.�E�A���
k��$O=����g��2*��k�,fo	�X����E��qrH,!��e�E����d�+��;2�����&���h��h��rn\` JG����2[�A�������W��[z�D�P�iFR#C�%������9���x$����O��,��,D�!eoE�1���!^�=X20J�l���4:����$�b�	4z:�X�}R��
Td���!�*g��+����U7�J��Qc��I`������f�@?Xif��b"���t�1��nd#`�O\�9�2HE�D��b���H-���k��������:�P�\);�e�|2�L�>}DI�g�"���X� �����OL�_m~� �Ij:���������C�e8��8���O�:�X��-�AL�u�EQ�����<�'�=��-�����+z��?�9Y�RG�������	L�3$p��j�n,{����'���dcxY�@�6cK��R+#l{
��w�6O:���:}��"ejI�kK@�7-��ZB�0�����a�+Z�B��4k(��f�=?�k��~����n#��4�9���.���#��&�3?�0l��W��=�2��%\3D,Gk4�_���L��s�^�i����p/�
��=n��`���G��OV�;���%��D���1���#
E]��9W@q����UX#�]���Q�*�-�d�:*~����x�+a'|v��
�?)h���FY��r�td2��9��3
n )<��Y�z�/����.��H�=I�>�v����g)��O��}G��e�����F��e������?G_EPl�B���&������8��$`�t+�yT�c�e1��)���f�Du}fK%�<���-�����E6�9�5��wi��i���l�9�u�����,q��Q[n�=���%�oa
����V ��r��L8J���0�r��)�u��n!	3�!��\�h���o4�}�H�*��[�Ao)�����h��������
$��h�8\���&y���}�L){��72a�?���-jX�C�cVA�m',�����5Q[pAfN��
�W
!_���.�7��[�����B>U$K����]v�>!�����Y%��v�#+��;{D���93mA	z�2�����`0#����^@X����b�]m���_���mb�����m�������M@��F��-���x���,�q3��K�?�m�3�m�H�b�����p5[}Nb(����PQ�Ab�@���i|���c�;������C�����vK��)�UJ���Gl!S����d�M��X[����E,���&����[���{�ZV#9����|��ci��.q����'{��T�yxhqz8���@�)K�h�v{}�>������+�,�b[���qypQ%�P^]���LxvK�C������Y�d��>_F�������b���
9�Vw��.v����:���1KY����c�}?�����$��3�������%nm;1�NU_G��5!2��������33c��e��1e��s��:4�xWE{���`����jj��"u8ms��Y��������@`�	��6�4�b�����X�T�m� ���������>N%��o!�A��b���u���h��MT������[ D�i��r'|'�����y��L����kC���ay�VM}i@[2��m�Iu�����	�(Y� ����? ����c�������woO��O,��3�E-��$R
D�8�g=���E� ��0$���%�s��X0'�����C�������l����AdJ� S�o�"�#�����Dl�?�D,����G`E���S����Q�3��Gu�>sj6��(��y�~����������)�O�,�H�}�` ��\���#c�����`���.��E��I+'?P����X�p{H��H��S��v�f)O
�S���aD��#$#c�����Z1^A�!=���;����S���p)�|�D�S�Jm;^|����<���g��������c�~������x�-&DE\d�uZM��0�j�u}E��#��V2D����vWc���`�^�|=��c�P#w���C�����~_�U/J��t���M�l�P\g�+Gp��
4����Bv�
��
FM��0
\r"����%o@T���2B��G���� iGl��}T93m�B�+�@���#�G8�a=��G��c4#|�b
cq���"���@n���r�M��]�c���������?�y�Yu"���LP�����������3�-�1��Z�����H�%�G���~|��{�*�JW0���L�x{��K�@�7��[�����$�	]4�<����9�E���[X%aQ*��S�j�p&9-(Z�/6�~��-u�Y4��'���9�E�5����H���i���w�CWK�7i�g=�0>B*h1�.$X�&�g�
q;�/���w�����3'I�����:-�>q������VO��%��Vg�J�2���1�����LI���
��zx��i��fGpEU��3��zG��c�EC4�<�����.�+�h�d�����F��|_�lb`���-�FVR��I���F���)����nz��������V������9�S���5�-���K'���6`g`�
M���l��M3e���j�3����?:8{4��F;����f��7�k��(!p�|��lVe��N);���q%��������D��9�e���@(�-K2�"��X����3���X�H]��Q��H�,��X��!�'��w��O��5��h�N�g��lva��
�yO��q�HF���i[~FS��|o��=�a�x����)�y��|n5�����Q�}R��W���~�h�^�%]bQ7D�w��M)���"�u[��K���M}�tI!����f�_��3�b�{�>_=�j�pRD�����6����� ��P�z�M|�{�.dO��_�)|�V�����E��Q�{�)U�7��"+g�r����>�?��^�j����k��\�G����R����i�j���{�-N�����d0�^�~%��*�p("x�cF���q%�R}>h"z���"�x� T8�P��^��z�S��c��^���I���m^B��O<��+�_=�p���'��T=�!o�x�^��J��6��/0�������3z��Tq�x~
M�;8?B��a$Q�{��G+I��;������\+?��9z~2��*RJ�Oy/��S�BM�����',��"�4�����D�������y��`�l�6����s�3�{�?@<2�6�[�������j!o���VM�U��-�]"��}�a;��[;�T����t������>#�b�n!�i�������8p����y����H	��'45{oaG��["��2�)��d�(��3���4;Z�:��7�X"���G�kY�#0!���i%�p�E�WA@O��]O�9[��������,������lc����nJ�y>�:�Xv8}���6�(�.����+|���B��]@{��&	��Cn�_5	;y��~5t����#.�{��}�d����Y���x�F�Gy/����d#q$������	������1��?qC���Mo�fo�&��T,��b����{����2����j�-�o�xx�����~���P>�+�6'SJiB����=xXB�{����������>���F��:�%f�/���C����d�[�P�S4���-mVB��Es�����X�o���|���u�<&�^�$W"���8�~uV1�i����<�A{od����qB�\-����������nS
�����F�D$��%XY-��Q��i��)=u!�.���m."����cp{�S3w���#i��{���fm���Z4��5�KO����wr�
�;�L�hk/��#���k@1%��S
��.�����
�R��?folO�"��8�����	ZA4	.�8�0���������9lq����(�3��"��:���d��9�d�Ci6
f���f�]����bq/X"�z��?d�7uI���Ex��������]��]&DX�PM��`�b�C�m�N�f	]�$Z�+��Xt���>����6��N��,yh�B��,��5i���Y�f�&l��j�	��z=`'���j�������%�=J��e��2�e����U���g��I-8\���zz@J��h���S��F�o9��W���K�	#;��E���������z�v����\q��}�YY�"@����:��P��o�����/B��H[��D�Y�����"B��M��z������g��"(;z��x���"k�@���^�O��+2N~*��i�1���X��h�W�5]���8J"��!�jD�)vc���"�V�Q�2��EHw	�������#D��_{U�D��p����b�Nf�V�P��2L��������yJ��B����VP�;Q��}T�_BA�����������V���~��IF]-B%@�i@J��C
�'�x=�8}�!8C�����Z�&Adl3����(�k�FXA+8�>7�l'��|�.#4U�b�~uO���l4k}����s�[h%��x�r���7I��a�{���+���_�8�PeGbCV����mgt�M�������;�����<���Q���/�02�����>4�vS�n�e@��=��DFW��
����(������ZK���#+�Fm�,���	����B�V�O��`��
���9�����$�Q}L�D����j�B���A��7��h���"R(�*���"d%�y���I�uOg�����V[ P:��X ���ku�u������l�./���`����!��0�V����
��UX�����0�Le[@\1�����.����Vt�oKTnU6��(�
��������m��-p����0'�}�����y=�H.e�g�����/"�����k89�0	�&0J5�������� >�-�3!��bIj�j��Y���.������Q�@CM���Y�g���(pFPZ������5�t��'���h�ku���4��Z�/���^{:��Wa��q6���j5����F�P�N`l{�a���B���AD�Uz�tV	�w�=.�%[�.��C�=b�=�
��_`mF��B������B����#��Z�[Dz�:,���&���ay�7�FFON����Hr�/	��v%�K�
�F4��RO
�W+$`a��;t��-�1�U�*�Q�|������]=��Y����
2J��UG�;��L�����y�������v���i�H��o���#��5��u�m$���.UJd���'���:��~	"��[�:��d4qR/�����g�j=������������t�(�&\�z�
� ��c�^��c�B=N6�0��,��-�����<�	Q.^�:Z�m�6fb�6�m�W���u�(��|C���%���j�%�}�F
�/���{u=��OV
�����(	�hp���0�d��0\��at�G[�.���u6��L�8q���l�e��PS���1�Fb���_����Y;);{��.���Cc|6"^vjQ~!t�e�
��u��V�w79�]eCF��B	���G�s�'O��T�q}�JX?eJ���l���b��=*�����jB+2��	���>�H��-l�Y���&���s�D��&4��0�$|/�������J�'^�����a�zm���b��l����I	D/�y�C���eW����M���6���J� @0�o1����=q����#�\#��P�H��E������3��fd":w�c�q������N�J@I���'��H��Jd�f_]8t��$�	�DY���A��^v\��F��h�D�I��&����08^w�/����(��N�"G��S��90�n���	�`T8��KhD�5K) �Pe�w=[r��Z��h�s�o��1�d�=����1�j������Wx��=�{z�K�H�fUb�$O�6����97�����[(]�~9��4�0�������c�bs��m�:b�E�����i`������	�����n�1�����%6���Ab'�y����@������*�p���J
�>���<HGR�g5�3{|��E���5�a�@
$
��hv��jB5��6��R��mY��m�87-@p�����A�p�|��s��������T"8�D8�&O���G��;$����L����x� }��l����u�V�t��p
D�f&ri�2�q�0�[��i���B�	�;��6c�u.d?����M.���E�usF�}~Dl�����	�h8[���q�C���?i�Z����2	Q<`�jN����g�S"�Es,�=���A�����_����e�T7�
����w������Wd��Qd��9��{��\m'Z�	�X��n3����	�<>������#�����4FJ���:�|�F�����Z=�G�8Md��(��n���dCY�5������m�y7����t[G�kv�6#l��`��"{�:����&b�%�b����4�	�TAE���Fuzw�t�5-��}��������.Jz���G�v�9�����z�3�v�s&����~�Y��5j6�wuN��g7�j2���������R�����j���':z���=l��wabs����J���D���g<��F.X:�����p5:������o4��)`�kX%�����,��{����T���@��G@�$��Mf1���S�&�8�Oo�3�g{�X�qv!�@������8�vbPb����!;���;�F�.h�������e��^���&J����Q�P�?����J�{HNAY�w�%5�����n���h��:�X�������������X�b9G��y�F�����:d{����.����L���������D�E�������b9�C�6v�+��t����������n7��Ye���
'�(��n�=rw��Z��EvE�y�Q��� tH	v��������<��^�c#����}�@Esu���rn�0p4g�]����DD�.a�kE#�ne\T��h����yQ��|�1	��n�a�O,�8l�2�}4f��������� �B�������iQ���e���A��^~��lP�m�TQ�Ej��f��z��eNs�;��E4��s�J�;x�J=���Zl��lY-/�%dpx7| ���f�e�7l$���-|@Dt����C��DF�Aj�����"3���'��Z���@������w�?�z�:��s�`@�z���5��v�8tAl�86����[���Z��!q���v�}5O�?}[�O�H��)d�n��j(kU������4�pO�9�P��U�y�N���.'C��cp����PF�j�FG*���l������� ��.��ft����5V�55���y"R��T	C%�`�,GO�]-!8�w�@~�)[�C0�%�P�IE��)����=`h���a8�Jp�#4lX���Cs~���0,X��r�ff;:���\�A�p���?X>F+r��K�t���g$@3�
e	`��U���5�3��U
S�-���]u+4N�C4�R�%\�8�{5�4|3��Gd���fA�L�e|��f
�3����`2����L��)��2���44��'/

�KK����>s��Eobs�MK���}17�E-���a�l���k4���H;�g'�\�S��e��3�>4��P�]^�|�/vF�����<$P��5��'�P�hV'h��Y����C�~e�@CC7��Do��@���amZQ����_����E��(t��6�Hc74���^�'j�����5.�n�f4]�GbpK�YRXx��M#��Y<����9ZS�X��/7�B��a�Hs=����"��?��V�~\�����2t{�?]�+��e������{� ��>������T����:d����J�&�W6�����.f����C�(�gh�OI�;+X>A@�wi���<��W	�"
'��v3��U;���1|��<��I+;a5�gI��H01�W��b}����Q>�m�Br��4�|,3.�C�WV+9,Z��� ��`����(N;��O�u�b8q���9����+,*�0�cL_p�����
����MQ��L��CP���&���5��RA+M���S{�c��D��a$���J}
���vF��J4��Vd�<la��
�E!����'�V��NS�+5D��� S$��A�pLm�]�W�l�i�
����l���C�xt�49l:��U�n.�e!=�qw8��+�'���#����|��A�����K8������Y8(���'���}aD��iT����Udv#]f?�������Fh��wa:�!;�d�xUa
}X��9#�t����)�����&������� ���s��<�{5Oo��������1m�t����ih"�n�������)����tn9�f�)��.����!c����B"p\�����D���F���K��
�dt(��B=?�]���Y�&u�
4:/���������o��J���f|;��-d�+�Z�B2���<	�',B��R���<6��N�E(�� DbGl�)0�~�i"�tM�YP�����@��Z?J���vX������������U�.�h�Q���&G�S�+�%X�����������������r�;�\����5���a��q�������xK-W��(�q@i�q��>�v�l��P�>e
B��%Gc�ft�@�7q��9��v����`�}���]SX��SY�H�R�V���������Q�2����~�T������[�1�	������J�����g6����)��C�D�m0S�H|?�$�`����D{R���X�a��9����������4zY8��@�-�
A
�����F�2x~�.���HU>�>g����� dd���.�?|<�p��L���MU0]1�������9��"�N`�G1i&�bX���Oy:Z=b�Y��Z3+�����y�B�����0������_��myAD��_>�-t�y�{�O����0��T����o
X���o����=.P��U������ {�>�������
!w���%�"��([� ���v�7m�{�HF��D�l����G�iU�e{���o��E^N���w*�����X�2,�cc�|���+�O��s!f8B��������w���F�����0���ywRu.!%B���u�Q������
g	C`��G�p�f[���.I�����cY�4H�w��|	>���8k�����6p	>����C���0�%agoa����_zu�����Q��'}7��5�
����H����G�r��
����^nO(\�/���%w��_����F��O�p�m���y}���Q�OK$� ��]�������rh	-� )}�d�h�;���%�`g;q��p��������a9;�	�hR����=9#�.���f��r�3�;w�vQ������ �7���W�2�p:��c��r�3���F1`�����
�F�}�58��"sY�p74L���"�I�Rr`���0z8(�!��7�=�������D��0����c���Y�9��u�GS��B;��/7^qg�&����16��S����3��� � �
�~dQD$1�~�7n9�p��s+����`�%�BcRN��1i��}X��}����!����2��]��]�7c��Pnq��K8<(��Gx�������v���n�U��kY�D���t��U������S/�)�K���{c�`	���D����s����8��1� ��2�|`?wF������,�����57�5R�,��2��t{��\�7��q�l03���l�v����L�gfX�,������������9�qB�����6I�)h��;�����}�&'���A����\�E�_}��T����I:D������ �%#��5�����Be�~���Hb�`���xb��5���O��@c�}w#j�����>y�a�#����l��!=��@>�R��%�����,Q����� r�Z�80���d��"�Hk��d��S��_`�<����%"�F[YT>��q�t�h����r�4/���c[.����n�*��B��������Y4 c�(R[�Em���Y�F
[`�E���4���.��{M*B�)Mv?�o�;�P��5�I����Ei�L�]M5���������=���h&���&wzG��[�6D1����B�����
*�8�>�����-n9�m1$+��a��E�,aO�
a�@mG����#��-4#c��O��A�}����59�w�qz��0���o��B��:�����
����K�����MLZr�����
��;����{�e�d����^U	px0E�����2WC=��U�x�Y���@�;��Ra�_�G�$�r��D<"�n���A�]#Q��w���#��C�@�9,gG���9��'�`�W��PPoq6�G�/2��	B+�ua��"=���n�/�k��-�[n�)��6J�hA9�!�O���r�Q��0V3��vzCt���vKzxO��u�A�������a!�8F��D<�mXL���`���m�,hI��g����:�G'���4��Lt� �� ���h��5��l�H��
clr'��4�yoA����R��eh���_G9����G8��T�������!Dsgt�=�o4�����xq"a���-a���gx��;���a���D����I�4�l��B4�QW�
��i� �m$Cd�@
��N����TVI;��I��������eo���)t���h��J
���o(��`b!�����7t44gE+1�\�_��I3��Y��,=+0�t;��h@�������������D�-���2i���6G[Gq.<)#s��w��R�: *{&4S�
���H�J	��"�l��9�B��c������M(�h0��/k�z4�B9P�cp�\��a�[P����{��3{^j��jq����gS����~"�>�.�^���f������Ttq��������Ia?��yx�&�<V�m	�`��=�e�dg���0�?��ZV��8w�]�>N~�#�C�8�f�<����J�N���1iC���Y��E��"C���2�����8�G�����c�v�M���z>b6�����QY��7Wt���hFr�c@>��������lpM����^�S��s���9 �f���I�VG���|�����Je�
oy�iX��
�����yG�E�f����:p,��;�$�K.@AU/w�[�;5����ZDtG�Z�`�6��:J�>V]�R`VJvk���y��vU�a}F70��a��'�#�!l�-1��5�==�Bb��y�,qw |���@}����q�D��=�O�8}��.!U�#*��p
�u 3�H�t,���H��)��l#l�loK�yo�u�GpE����������jt�?gv~
����(����D��h�c�B��m��@���
�F���YI�(��X�1!�d�_��ZPh�(��W0�B
�� ���d;`7�=����F��;{9+0V�U4�9���jNA�]e��y����%�����r�����������'PDF���Q4��&e���azIpB���rG4��*�����B'���D�����"���cT��eo�!�1��"�
���AFg���a�5�
az�m�������B��`�����C��i�lnE������v��?�!zkW��

g��#[�S
/�S?�Z��&F��zk�4�8�����������S8��tY:����F�x����B��`BA���<�{�9��!w� :��8hL�Eu���
��fGOD�����&�J�yOk-�]�������J�#��O���'�����!*����������G�-p����nc��59)�4�����*5��S�v�a�/.��D��.���~�0�Em.#�|&R�����H�qG�X�G0�+��<���Y'�H� �#p��A�&o%��*)}��J(���+3��J|/���V��x���L2������Zsc���(�E���>���"�%+�����a��=E0��p;��E�X�H���IU��Gh\h�|��E�=���"3�I������]Kz��JaT]�Ox���7�+j ��{*]d~{P���Yd%��d(��Cs9�]��S�����i�I����RV��~?j���Tf��I`�&
�H&,�}��
A Q2�{��Nx\J^���[����I9xE�����E��9�����%�����HJ��"�02�Do_�Q���R�*��E��
TO	W��R�d��^���NyFF_V���%�
����5c��j1�0��kQ���j���
2dd��k[<��V~�*�dX���X�?�T{(0���|�+5��HzL���=$QDb����{k%��>�s���5!c��kK���"�����5�{�����HyNR�����c�y���E����mT�I�y;��;���.t�a��7���bi&Ow+	�������b��y8m�I5��v��"�j���7����BIo�^���F��|�;{��\1��`h-����
�yl����\�������}X���0����&�h�7Rc�E�is���-�_�Q�����!�k4J�?9i����{���d�^$a���G����{y�m���������T�~��<X:�5s_���;Gh3u��05�s��	(�����c���q�
�g�a��*	T����	d�^$6�8��+��� e�,����87���\���N�_0F�_|od������-d�A������:�;n��S���~����@�p����<`V�m?q�l��Ya! �d4X���{y�}��������-������r
�������1{
��)��n��6Z��.���s�bL]y���\�m��8�f���	w��E��At�B��~�C�lD�|o$����1%)��d�F��Z�F^r��.�3-\��u���$F����'����>L��.�������<6b��=���a%�Z���O:�,��L^����*B02���2�w|��A����b�EM����O�l����/���yUF�@��"��\$r�V>��v�oaS���R��0�6pxB�Z�agqJv��������>)�2�0�;F�O�S��C$)zj�$6��|����T/���/�����+�3���k\������"q���V,���}_����0��e�������m��abq����[AW]�����9!�����{Q�]�v`m�R{�V����9�J���qT���>�V[����������J�?�3�H��^n:�#�D��I�3�}t����u� dR�g��3���G��z$������u�0��\g���"���&j��`�]VB�k�;c`dQC����E]l����1��r�^BPP�2����a��f���I'v��oE��B!���,D�7p`�(z����s����U�W��e����(5��&��_=X�W��p�q�h���$�T����������%�aIk��
Z1��{��Q������"d���
>��h���p�={�("�V���?d�l+@�� ��lj���$
��J�w������-���	OED�oEh��$��s���������r�6`6�gk�y����8E;��:!����FV�:f���8Y1���*\�	��\�"�,D1�VrF�-���seZ���'�`�l��oj9Q�~���E�^ �X���m2~����G���U�?&T�QM��^&D._�E����vS�����C��L7���Q]l�|��4%�q�����v�~���0��#���??0,C�<�����fo��� #���d�(b0���Ty�Q�#��~G�{(�o��Q�	j��,�H���H�����S:E�����X�5�#��[~�E���+~&�(��-�
K@T�.C��M��E�,�*0�V�%~���2�+�,?�8��_-��Cc���P[��puF�mu(E��K�53��*D! g|�����_�y���v��o�����f�G&���� {O��'fDW�
���	u7��i�l�|�N�^��P�
]@�H�-K%n�t���3�U�	�b���"��>E�0'��������6+:d�-�v�d�j��t���Gj���t�6kb��*b�Ta��KH�a�������F����z����(�����
���'���XW�4��<��m������I
(U�N�g��nU�"���$���\#��HN��p��'�H4�4)j����
�4�'[��WPN����0:�.�l	�N���x�~��W�M�����a�*
D(%�~	���1�����'q�z{
IJ
��a1k�/����vw��]��0���w$%�-�D��
2�QW_r=
~��]m�ttjKnp���p���D�P� �����dk�2
4�.7��C���!`�B�q������N��[(���aD�2����>a:�~]�E�B0��FIU��?S�#05�8�F��j4�[�ao(X�U�?��(��/ `��wwG����a�3%k�0�����@���LX�1�=��fR��y6!��K�\��#��y����_���f�����o�	�B�L���
��Jg#Y�#�u
�,�Q�Z�F �)���S�g]���i\����nk�53�a�,d������-f_KS\���8�vG>D�}u������L�N�_@�B&]��C��#�����������RFjwx���/���B�XT�=�����
����!�U����������8
DnM����:�b�5P�n$�ZD�j�Gj�1l� 2C�fC�����?C�lp���F\�f%y ?�Mj���a��9����H���P�D�M����l�R�Ys���w�edl�n��d�`suT77!�\��B����w���dp����&��;A�.��������_�3[�����{���Q�_?"�6��D5-6m����l����������R�.��YP@H������b������
�&p��e&yo��&q�.d��	 l@�e��Q����n�g�@1Z�p�/����o�%���� L�GP��"
���8��D`��R$Jh�����7=����o�;��'rlF`jf��LAG3�<��B�%j�3R�x�����C�J��o6W��wA5�>~�)�/F p����[�r��X4�
4��0*�3������7
�1��4��-�j#�7�2�^���3�������9���������*z,I@��YT�h���K�u#Cx���t���o��������a#M��P�n3��}���"���$5#0Z��
~
�+��� �%�b�F�C����S�9�0�����2R��A������M�	sf�[���4?${�R��D=>�vF�l/`�Wx������;Nj5��:fJpnS7+��5�|E�&�!JDh�������hX�l��/�MV�����L�\G�}��H$w�g���}M��T8C��^$��;Z-��3
q�}F@B	Z����rX�����dM����^1�W�qH�2�|����!��U�G�MQ6V��R�e�Y!4�U��E��B����;�
epI��#��f?��S���	4��l�%�IO��g���Do���p���o���(�5��*�/]�5k��1c���B(R���3�`���o�#	J�.��L~�.������{2��8���z��+k���6A�}\�@����8)L��Y�v�.��k��v��;��Z�-�h���P�D
c�Z\�w�]�#�-Q������,���x�F���Q3�����HD�'����=��� �Dt��Z��F$0���@]8��[�p�h���1�5����ej�Q��`�(Z�����#�nF[Jk�~^�8Q���&��V:�>(�v;e[��hA����M�IG]w~C4����A�{����f�@%P��p�gY�����\��w*�v!
duo%��O����]�8�cF0���z3�]��r��)�0�����{����I�k���Z�,��Y`A��gQ5c����wKv��=D�NaK
����Z=��vA$-)��~��i�w���
V�x(�H<�6��+�++��a�F,�����d�M�Sj7�p�()	'���V1��fU�#�?�����44
Q?��C�zC��l���b7+�R�1���&����FP]���-�n�rF���O�u�N:��~����&��T����	!�n��fkHT����]�����]���k4���1hl�R�M��,'J�OK�j����DKcs�M��p�M���!�5��7�l������?�r�	��#�����x���"�l7�p�V�D]diY�gX!��C�D^YI+���w"�WG��������h��?������������4���C��O,���4�P����v�S}������� ����F��-�G��]9~3?�pjV%;p�i�}WN�0����o�td��C]�e��*��������]b����q��5�\w'E�����f�"��S1[��$��4;�"��Y�a����=BH7[���E��]����g�.��{�����S&+��G�+��:2Z��+4{��������r���y� py4+!���`@���}�k4���[��Dz������w_���!0��O����4EB��l��	
��������hJ>�rZJM#�$��U��
�gFu��"���`���k
�������#���J1e$���gi}G$��Pd�H�����l5�����
YY;���$fT��z������;�O���>y��-��!��"f��.��N6C�/$�D���6���V�l�t�:j�f���*��}�'Ds�!�I(pK��3&t�����v���(�f8�qx���-#��U��ZK���$�F�G-��\�[���\DdG���,���2��aM�hN��v�|�G���-@`�fo�0�����F?�"5+���d�=5��`|�	�.�+��G�Q�I�?��	w�P<�"`�=+���"<ZR�����9��,�a��tm)����wJ��0��z�q	�q#�<{�vt��@�'&"�,D��U3l�9�B����ND*B�V�'F"^�~��|<�2��!�����/B$Y+a��
������z���D������?,:HV�&����w���VP���G�;e��nF
���[D���/���6G/�s��y��]����=^�hr�#�KU����-4�����'����$�����������,Eu��/�R�Y�7��B2����o>�>+65��@}D�0X��[\�g���^d�.3\�5�T�4�\�F���%;Z^�c�tge�"�ld��?�~�;�y?�3�E����i�x�h�O3���d���Y����Q�;��1�H�Q�j�0%�iw���Q���>M���*�c�|�jM')����x�`>D�15�����<�K��qCC�r�����3�Ox�D��|��'��|<nN����������9�y�e,����>���qv&���X���a��8����A��zJ	��F�1�=D.��D|G%�tN�18Q��l=���h���0�mD��T���p��D�R��T��US�a�oL�#E��T�?kL'/G[�,�~9��h�9s���mS=~Gw�L��w�i����D���
���b����g��r2���hRaq��U����y:c�n���d�S������{��O�C"�h�XXw�,�.R�4@�N
�zf�7� 9+��M��F�h:�����Ow�^��f!]�@OK@�����w�C&�6?:�0������1��Q�Z��(AW�� �)4��w����q&)��*��LA�|X ���}v4���Yr�n����ig�`�����}���@���Yc=�`���(�������BZ�Pj�/�y0���J�nQ#j~��[��B���m����:�S`B������v2��)����.��?.���u�T��M���j~D�_�2�Yb���2}:S��p����.����;�@��0��������v��YVnY��df�oi�N�S��������m4�7�u�����J������eh����A:Z�;���2�1������~�h:	L��HE�����`GO��WN�#�'�/����f�:�N[w��7s����,W������*D:}��=�R�S�?$=[�-`�;"��C`�({2�vJ���:�6�m��+B��m@5�G@�Q�w:K&1�d��n�S�Df';�L�I���f{#T��0.i��6Yi��qp,����R��!�'�����Y�R���=��#2�)�aD��i��J�W��$���5��GP�����~o��1���A����f�w�Q���A�M�<��<ms�LS���2M�<��I���|�t������d����Q2�R�rO����,��9������:�iA�k�E�%���m/���������I��%�����b�H�����bR�_`��C��{!Y�F
�e��C�;K�WP,�I��e��f�Hd�K��>��F��[����-�2q��L���Z6K�L�Bxbv�:������	B�0�C��	8k�����#s����=
�7j��=T�j��X�$��jRo��<�����r��A��l�_�-.G����LU������V��G��%d"S������ ����Q�>Z)������,&7�&���%��-�+�K�jvM]6���j�f6�}WL�v�������.������WfE��%d�P���C������E�[pu7��:�/g1D���wa]����=����2�W��3@~amH2Q!-L"�X
?���r��M�����G3x��fb��%D����?�=Z����/%{$�%��J��B�&���)���L���I���-���3�at�����t�3��w�������k���6SW�5��K,���U+��e\���h��Qa	��@�	����J���p�3�V�������Q�T���up0%�/h-������5����2pC���S4C�W�J����(���Q4�2���������m53+���?�9�-=��D-�%d
~
G�=n\s����P��lUr��� 2�E��:F���������+�HUSK�]���4|l9�!b.-�}�l4#*�L���
2��e'�I���yg-%��-+)*b�`���d��0����/�����%���u/���������#n	����A�;k����+�#�F��c�l��?��rgo�5'DC��[�.��zYK�O�]O��X6 �CcY�e��;�FVm	�9bO6�g�}R���-<���w�������4T��(�e�{&�,�`z��|��r�I+�-p��}O����6���9��{��KW�C��}i��-r����VR8������d� ��hp���x�F��7��p�X��MEt�-�b+%>�M��;��������b�Mfy�-��������% �E'�����7�O�o��W��j�@5F"hq��������o[�Q9�����r!�UB4��tWKdKJ���X����-��������[�=	R2%t��W��i��J��&|;r��b�cT�o��*��B!�0S#
���K������#�}o������&<�8�����._���b�U�D��<+������y����0�������q�������X���N���tW?�uy��T����&(6��)���D��-���,p� ��N-���n�:����X�E���a'����`����3s�m�p� ��s!8_
O���0�����
�oQh���
��[g[����n�`W%:^oA�D���X�X�hnDK�p�C8[-(�h���W�B]hz�0qZl�n�/�5�'u�� �,�m;"�n�n�`��9b�82<�G��w�J���y�v�C�u�%TM����$�=��u�KW���G7��C
���n���U�"!��Xb[F������a�&�����3��H�i�&��������W�m��$�0	�:�����M�bt!-e��g����%Da���`�3���<u��T0�q*k��m����0����h�-��#��L�����JU7>6���[�E�/�J���,���y_o#"\w��YDH~O(3��-��G=������Z�Kk�k���0���j[n1�������Q��D�����(��	�U���sG��Yx��
S��[B�6@F%�g�u��u���`���n�95�5���A��1���vH�[�L�f��0����G�t���Gso��i� K�_�q�t�m�H�c�B��C�St4;�)(Ie������p�������]��eGU��8nUQAv,���z� %��,Qq��oqG�\���Gh�sG��m+���]�{#�_Oq4;k�O}5�w����?B!Z��K)���3G�����N<������u4��A�Q�����pT����&�!���5�T��:�w��x�������`=���j����2�z�N	�Z{K<*"��#xA*8z��r*��8H3�N�Q�e��;z7���J�h��~�����]�T=J��%�~�@�g{�L�#��i?��|�zq�s��������B�������s��gBZ����t���E���_�~h&�6%�����4Z:4�6��WP��v��m0��Jg����m���:&�nyV�p6���z�\���a$���`���?^{�v:�JV��Au������Q������W��:�}�z�g�_���F!�g��"���E��E_����q���;�����(;��;�fv4�P����pB�q�8�u����MaCH�E�v��D��3���_�Q� ;%B����*��f�DsE:�3�tq���q�4�.����*�����l^����>�3��:@�#��a4S#�����l�{�i��Q�0>N��zf��n��"y�s2�������F��G�C������$���*�rC�Nv^���v*4?N��VH!�b�h�D��#<���.���G���+����T�
gHg���d�x[�o�X��&����3U�1b@��]�2�#����]h�49����g�u�PA�J�;l�eN�Gp��P�c$��j~��Fp>����"?�G�!=1�i;�(t�s&.������(r����#e���:�y~^��Oh��^Ct"ER��?R;��B�{���!�M���%�o7� y���{�!F��H�/D��p�8����*,���o|���3�p���m�`i�R�9!y���isCa<��{!����;���y0LK�zI��������[^��w84e)�/{����nYE�-_�Jx���W��,�}d��P(7�_@i�(k�k�V���s`��t��)�^H�jR�����[4�����G��w�V�u}�_�>��zGj����� ��X*�s5�?:����������c��;_���?�A��qpD��e���m�
�������k4��,��&<�����@C=����k�����+P�w��:G2����;Nk��B>�F�K}�[�7��t��*^S#��o�e� �^��e�;�� ������X��i��]"����_I�*��a���i�d��}�h�b��0���:}�m���K�O�?W���7�[1������r��i�M\��A�[y��.'(A�_��g��Y�r`��z;�����Fj��6��h���p�;[�R�����p�$���[���r�4TB�ex2>�{-gY�����`d�d����.E �;� ���w�gtq��y���-�t���#]��_�>�	��/��J(M��
^@�����X��cb�N�0�&�x1��"����U9Z��^����7(
��5��	���JJ�}�#v9+9���p�{���#�4b��Wd������#��{	����3�f��}/t��%��E �-�y)��Y����};�II��s9UG�o;1��&�t����)�p�����%��:jjdFA��?�-w@�q`���-����;H�������A��Z�xC%�;\�<��&������	�w���4�� zr�qa��zA�� ��,���	����KxZR�7�K�w�U�6a��gL�F�Bk�j����R,q4���	Ok�g�{!�-�30K�Dz��������z#��^�g����E������x��+�.�BeKQqP����!w����~X��^[D=���j���P��D;bL��$��$-sJ1��Z��������k���33�qDl�^�p�;��Yt;������L���`^R��[���#�*�"C�d�����/{�N"�D�d��U�Y�4���Y6=���Q�*%f��f<N������f���XHq*������S�j�d1�l;��u"��q��@�X4w��F\�H�����A�������g�t��t������(������f�0�I�X>)E��<+*kJ��Mr��V�
��{��"��a���q/������������@��J8k�p��D��52V�(����^W�������X����nd�8O�H���A���~�cRAf�$��eb}��2lA��A������ Z�����Y5"��/=[\�B/VN�R1�b?o&m
ahJ/�e���#���T��(�i"O6b�ar�K���b�+��UXD��A�-I�;8����>E�~����p#��}��mD��Cs�5gt�b7'�f��Yv����������`I���K��.E�>f��0>��n�A�G���|gzqX6��Y����&����z��Q����uq��3M�_����q�o�`��P�l�L[g;��q-�Jh����bt	�&o��;S�`qB����;������/]V��^:M�E�B�-��y��#�r�"�#J�DzY�\��w'�.�F�w���`�a�v��*zS�@�=5=e3���;'��H�NU�gK2"zt1�b�P��#1�G��}�p��8mbc�
��I'���u1��5'���d'��Q�G�����YS�:B���f?��)�4�cyOwA����3�`�HU��6���),�����60�������9�'��4#t� 
l�#k�^��"���Sg(Xz����C!�wR�Tk5P��=]rH~}L-���^�q������=�c����P��RF;}���@�-X`���3lJ��;"��^l���
�0��T���"��w��������F���E�f���W�,"Gu�5����1�������;�M$��WN�"mieK�����%����h�"��wt��1d��n�� �W�^����C?�����]g?V����	:��"VY��+)&����k�&�=�!v^�x��{�u�I����!`���B =���U��p�D��f_����2���~r�x�m�)����AQ��w�-��V�w�A�	ef!��nF�Y������J�g��L����VDG_��a���k7������
}��UH�"���l����l�F�s�����G�
D�>�n;0��J\�Y/{��8��/��a���������=�&���e
����&�
^@��#�Cu��L��O����W����6h8"��
J�?KK[��9
���F�q�
:�B��o��&�`���Cr�������hPQ�����[l�h��G�uD)�T� ���U�����p���Xu~��� AZY-c���\V�N��8F�=�T�P
��^�h��3`<����m�O�I�G�d]&�\�Q�����=]H"D��:�����D�-�W�H�[q@����,������:q�)����k�74�OV�-�A���2�x5��?�4^�Y����������7�fS��U��{P��?��BV�
_����nCV)�u$lK��������������/��"�/b����?���s������#eF���?6I�&D���m��y'I�(g�L�{�?�S�|�Et�f�Q�u�6T�tG�V�Yw��iD������i,�'��g�n����ij
�]�bX$d�f���	�0H��"��@���N�'��4�t���U���f������JM��<�"�&rNh�7�f�>|X�Fpl�>#:�g�u�"����T��'|�h{i��R���Y�����{E��|�)��	�h��8rZ���GM����Ml�ls{P>2�|G��l�>6���MxY�#jG7���rH����4���1����t�6+"d�9.�]���]��!����=�6������M�@Y���?�7�)��T�?G�e�zM��Z?G!/���������%6�FE��f�(��;�%d��i���h�/`oa�5��0�S-*+Z�2w0���Y�=Y���N�����l����K�'b7����\�|kB2�q:&�nDk�1� ��8k����M@��kZx]����gdT�f�'�Y�f	it(�"��9�z�<��Z�7GL���9F����F� F�#mB1����S��-d"�q��"@����������q����{=�|u>I��TiM�E&1jv}�xkm�c7���p��������GD@k�+j��o( k�O��������P�8?���>E����
1��'�-9)�	�����k|��3�
B�#����A��V<��������u��Ov@���#C#hR
d+��7A;b����a�����i��d����hP���������?���o�R2��g�������+���7����s�!�W�N��;,R������p�G�V�r�s��C�����&�������`�d��&,��
0;�
������M����ef�M�'�~�ItQ��aM�6�d,�;L����W�P�-��;2}]������m��J1�fE�]1�+����[>��E���'���:M��H��r�{������*l��o����1�	�{��7����f���v�[������|���\v�����a�e�y����-��s,�3L����y�$��I��KE�\� ��=0� �(J��]�R���]�6C#*��9`��y��h*0{k���t1���7���<~zEj�&�QQ�������������]e���2�w�@�t!^���bK�/9~�M����.���J�t���bK��P������4�)�+t!�6X�ND���vv<��������d�4�p��pw����AA=H!��u�3AR���6/Q��6�����`7E�P�����#�-jX�ND��N���u���?���9�N?������I�#%�2tAr�-P��]J@�?����f�p��+���������q9`���!��J>0�l�i>9 z����*�Ik�.$b�b5c�v;8!o��R�w�@��b9x
���Cw�5*h��\�("�j���u�n�8bg�s*:D�O8��n�����<�)�k��d�V4�d���Z��������[�#b4P�����_����u���F��������]����0��5�������j�������[���0�E�~�md/��M�����[��7��>�&N��`�i`8ngY�$d���{�ta�'�u�-����Rv�A9K��d{�4�s851��#"�v���[��A��5<�1������85P��\�����q}��N�i�.���M���!�c�<����Cqw�sE�A]X��*�����	%.�2�zl�6A�z�!��%�1���7h�����O���4|��r��uh���i��k��E�
`bV�����2����+#o���p�h��6@�	�-�\��G�/��+r}�B6z�
����}�50ND��B1���E�:�}�L01W��
Y��^A�>��&�*K��D��4�oV|��m���tqx/{�B;���X��I�M=��S�e�={m�z/o��`G�A]��i�������#;�l(����=�!P�$jZ�$��3�j����Xah���{;����X���0�Q���n�o�����~��;=�P���b�[�U�>'_��#����Q$r�e�����@
J�{2�Qe6l���g��K��:����6$X��OMw�a6���l������|�h;����`"�(�foqC����.5W�G[T`-��
�tH8.SG(��1LK�F����
�)�c��t�#�-[m��>�/P��V%*0�p��fC �g�4cd�%���n3��|U�C�	���Fu|�0�d��;��`/5+��F3?O���a��"��M��3���6�gDG�a	E����.�Y���r��4�i��:&���gR��i�f��xN��2o�|���C�q�\T'��7He�*�a0K�;�G����\��I/�6����uqp#���7TGV
4n�Y��C����b�$�I�<K��+8u���2R�j)����G�)fS��)������0�
9
�J�.7vx	�G��?7u�����\6����3��+{V�}��b��KG��!�,;Xb*I�*�9���QL�V����n����{����(C�C4��U���q8�v['���F�G,[?e��t��Xh�D���a.J���)O�~v���t*%����T�SgF�C8|7�W���8eO���Xpe�C�"-��&�T/����F��rd�2kJ��S�&��
uf�����O�*<s9����#�qn@������&M�gD�a]E��2��2��a�M�z*����fF���fwU���f�a	��!�H�"����O{TP�E���j��2�D�%�c�1����~v?��4���v8\�r�'X!x��������	L#�/B��
���F5
}�YdOIM6��	���]pM�'_�d�����S6���c�c�@5�0��2�9N�h�>���)�a����!�\��#������Fn�>-���p�������`�d�����dY��q��"&S�C����3�p�]�����R<�y�@!�����G;����N��za
k�~s���9�����-`A�]����Z�����[����f��O�L�r=c�d�c	����u]����6�~�f
T'zp�|���oZ��m��CF1�Y8VEp��`���U�]����a��Aha�ZS��a�m�`3��� ?��?�HE18��3��>9������/��L�T4'�v
�0mF��?���8�.�������l�K��`���*�:����YSF��K�NO�����h^T��7���@0LZ��+���	��m��$��1�h����Z����XN�zNK �����Y�#�v��`�x����K�]Hs��#���I.��2�yc��u4��d:��H 'jn�����G���H4Z��yw ��^#��?q���^��������@�1w�����:�;q;
=byL�����v����g�W#��!����'dR6�p�������l�e.��(����YD �4� ������CQ��������?$���E}�)�A�(!caN!�Fd����a/���z��XSHD�j;�,��6b�m��u�y�/��Y���F��cO6\M_�L�<�
YS@D1�NL�3��iW�;����X�S0DF����E����V1a���d�8�������ed
u���{(|�{�E�]Bs����i��{W�1��P���~��,d�
#	�H+*���DoJhB�^�9���]u�A���)���<�d�O��0O{8e+���%.�r�����x8e��+t�O��)��q_�<�������$0�F��%�!��-'@�'�|K�B�NK�����h�0SHP�8��m���������c��q�H�Z���|�FW$v6�.d�Da����/K([
��u����	����_W��\�E����*�'V��!�p��}Lv_���z�Lg�{n����&���v�u��c�k��p��Zh	D������W������r>��:r��:}K�����!�R�`C����7�!�i���p�!QT4��5�4%�U^nP	q�F
�9�t���b��N����>Q+}���fX��L����+���=���j	<�\"��j6�����lNwdx�r&j�\�]�o����M����+�Z�1O��6���+�]�g��Z��6��|/�[�e�liZ�����?%e��X}�$���?X=�H���2`>�����#�ju'*A;�z����
����pk ��O~J�� �3������)aI�we�B��<�uzF�[�L_�<�E*�IV>�s��ESf�Q�.�w{�p��T�l�p��A%�N�_
������%"rT����pj��Y�%���2!x	R��qQmQk9�Z���'-
���5d��kz+-���:�K�B��K�k��������h��.���26��92�Z�<\�\��V�k$�[�
����	�"K�%H`�BNA��E�|��D�:<B�s�3\fY���H�[�A��/�
�+#��@�<~y��F
�eP������e\�%x����/LA$�_�0��$����RN���bZ��[���{��_^�*���m� �t/GIC�'0��\��D��%t`+2���o��IA��*�������rzt���[�>9�
��mX�O�� �(b ��	���X�wR��B�)B� �,;a[n@�9�n9����)q�|�l��H��
D���������V���8�����f�68���~|�n[��t���TD��= y�>2��d}�����%*��D.?
�����V�#v��`w^����,pe[zp���] 3��9�;F����h&
Y��\
��{Mt
���
����_��.�J�w���!k#l����gY�����rX�H�!�f����m�BT�o�m���&U;[A��0�K�Ue���=�G�������[��#�YHf�I��-�AAqT���D�AX��}x�;��GEX'4+�q��������_�S��F~e2�rS �Q�8�)e�~[���u���	�T�_������~�g&P�6�������z�[)��-���~�v�>Z�
�#��Q$�����$���~��+>��~�#S�M.6��"�"{��O���8�\@�p�i�TpBbNE�� �NxTF-�-x�b��|��������8SF��=l+�5��Hd���	�����`v^����`�R��)�mn�t��$&R���m�<����v��]~���� aN'��Q�OM��h[�%IE��&���.�0{j����X3D<�s:����R.����\4H��������n�D0�d���<�v^�4d�`[@������
4,��9�s���iC8�!M�����F@��OY�^:;���������fk=���pg+�
����q��n����	-�;��.!��q4�E���tF��gw`R��/�pV)=_�B�p�F���>N&���"LJ�t������s�Kvxu���"�h�iJ,���<�����U-H����.������G��c����D���4&�gAX��a������b�yR�I���k{&akp0�� ���9���z'�INx�5��"I�q5���T��x����XGHF�rG����9��`��6�#�b�������*�L0Y����k>f<�>s�1�g$M*S����~T��G~xx�F>#��{;�j �)���0Z8��l��XL��a�:�{F��#����>�YM�Q
s�W`*
Dx�J�s?���d���&���4&�8��d���8��k��8U���$b��Wdd�S=x�Jt��RC&�1f��1����pG8F�BrO5t��g�c��L>y�^��>.j�/�Eo2��,�x> �1������2��J���t�?�E�#Cy�wy��Y���f���$�+�������%���6~���Q�%�>K��J�c���-b��f�z��kd6u����,?��T<~,����,hXD��#TO����V��:��l?���9�a<)��|I���7�z����}���b�C@4��Z�<�U8t��b~���8��.5������'��L�����A(�E^���"�8�Z�v�����V���H��1"�����_?�
�5�*c���ww{Q�Bv!��-<?o��a�E���=��=��\���3L(~2+[������(�	��)s<�o�y��"�}�
B��P�=}xH�
;$K)s�oOPH�����jm_�-���y��K�}����bwJC2���-��W�H���@u�"���VcA��Ew����hGB��l�sD��Z^l[v�s�DV�	A=F?�d�����	I�MO�,?F(Uo���(=��2n/$[��hC�!S��r
�[x������B�g52��U�����R������3vv��5��������5qzt�������^�����3NM��gN�'�/�mf�>��@�5LE+=�8�Z�0x��.��%A�w�����|j!);��� k=N(5;���k8P�`��IY�A.����!1C�@N]�v1����i	��^H� �������,�t�2��n��,i��#����ru�zi��{�������	��w��X����&������X\bo��W�������D�s>11zOn�U9^9�<��m02���-� �;e�$�VVf�A)������#��$;]�����[SL�`��?d��P�&��w���"����"������2�uh�#�����K����������ux�����V$���7������-��7h�a�������������9�~Vr�z/�s���v8�<7�.��X�1�m���_m��dX.���-�g�x�x;4��S���j��
����:G�~��7�wM���<�{�ja:�{{��W�|$(j����^G�#��[�{gv�j�@�N�:�h�����D~�;���9
6Ix�xp��L������{/$4xV'���\����(�"�h���Y��L�OO�����-	�����U����y^�5��!R�5"Z'f�l��n#iE�G�1�';A��4�4��a������	��\Zu�����2�Nw&JN�mg��h[������\�Ec4��.8��x��;����VV�t�dH��w����*c����A�^CSL��[G��EW����zg�u��.$}-]:�5����6�D4oGX�� >�}�h]��+�����(	,���s<_��c]7��V��F�����y�h0��f�{
�S0�Ga
vr��{���e�"k���3T!�2�/��Ez�l�a�h�J3�'�8=���������J�J
��-�O�������������Eu�;e��?����v���#N�{
�����l��t�����}_2<�>G!8d���g��R��AM�@��������h�:��na�o�!a9����e_����d �;����~�3��YRE8�P�#�a�/B��9���^x/��_�|-c��b`���m'�Q�&�v��yEh�Rb1l6���#[���a0)��Y�[�2�*YQ�����`b���
�3(Q�])�\5��	%Z(���1p��L�.;$�-~/��'�R����S��pRk	~;J��sz�.,�Jq�
��aS�������,9p�R�o��mG��=���]��<����V�[���:�|��%4���m+�h?���D�;�;FE[�c�HB-b�3F6��C�'tinf���
�����5PN���?��.�G}���3���u���64���(B!�:��qv�y.���T6RG���0�(Q�Z�I�F�,��N1�b��\�8��I]A�����lXb&�;������_T��.�`���c���\]���)���
���0�{���w�	u`S�d�j����	�N�oA�B���P��$b��'|��/����[E�B�B�KD�Qz;�D>��{*�(#��;PS��x�:�P�m����\�9��!*�c5�.�O��)�����Q�'������)����teS�K����ew4e�)s���w�f�nTH�f!�A�L��{ �.!�A���F[CA�{
kr���N+��|������&��0�Q�2��n
Dq���^�5<mI�1z����#���\�m1������@���Evz��jM�Gn���.
o���W,���rfA
�[o�������8S���@f�����Da�2j?mw���/�a�E�n���W�v}F�� m�X17��%�!�X�s����"� g��x��mG�^q54�{"Z��5�p+�1DyG���54� ��� ��OCm:(L��� �Nn��P�3�QG`�:1��( ��W9�W���Y�r��#�vXR��;���4�U�"�.��p9Y3��RW�_�;��o��=��:DD��"��C��:�%�H�I(�B��Iy����r*G1t��R`�����%��`PV������-BO^ClAs�F{{}�=�
���p���Gu�5�q�iT����>�jd��t�Zy������=U�z&�l���I�,��ti�/����~d]����E�g/0B8r������c��$�0B��H��a"��V!tX�e��������]^@��������tL5����`��^�JJ��9���3����.����H����Tt�B���&��<�DN����!���K�LF��p��>�]�����W�<�����;���'�(:#��s�tUU��x>�k��7�������w�'�L� �h/�,o��,��MD{�8��%"�C���)��q{'����^�}����*���C��:����B�����D��Q���
KxX&1��e�B0cU������,X���xQ�
YU�-��%I4N���3 P��/Ar�Y�6�qS��8���b���R4P
@���L���Y����F1n'v����vo#{�:qD��j�q�MG��:\�E��1�l1sN�3����*anMD��Fc�t�)�L9o�����]�#"fV��Q������,;>����_�e['�}u\�)lX�����"�b
-��Z�{.d��q���`�*�A���Ghp�E:�:��<W�uH����
&�u .��YW�����i)��
�q4_�\�#��
4�'����_���b��mJ������K������
DX4]?aX�O�Fo��IQ��]D��}:�j�����8K����X�H�[<�3�u[9�����x�~���:	����hD���UP�0Yvt'I��u,�����v����FJ=*����1�I�����H���0����k�c��}ww6������l��`���-�Q|/��
�	�S`Q%��C�
������
������*�h�nB
�oc�
a/C��M�����/�>�Q��U�	���i�3����f��"���#)b%7gE��8A�����%��`�JX�o�$��r"~};%��b����s���,�i�L�l��3j�6���z$�mBp
��3s�j
y������=��l�%e��w��h���n���?[�_�����;����	����v!�P�&�\��<B �*D�Ba%B����9S]%��6��6h���J5�����XcK}���cc������=�������M�~�#��5G�,Sg`���i��g������oZ��%8EL���~��2g<ZD���^2q��$�@����C5���Uy�[Wu��lq'�X�&��>gKM��5x���gOi�F���4�����1��}�������"�L����V�n�W�d�������L����'u�#��w����9��X�n��������nC�����T/vO'_e�hSw��;m�������e3�(����� m�O�5���(02��f�A�����m�N[ ��>/H(��VI�������?*gt��f�F�D�>��U�v>���&`DI����G�������	�-%&mvd*���Hm��w�g~F
����0mL�X��A��1������l=u���9�x��(ya4�hiW�tl��5r���&;����7t~��F��}�::��7���e���d��WQ�	�.ak�{P��*z��d@�_1I����I;'�H�<P�.���� �7C
��B��b�G�����Z��m�N���L,����/�@���C�������z4����G�|'���!���G[��e���B��f�����A��HH^�?ix=����7NG��0T���nMa����uM�F��w�D�RCov�$�et���	v��+�B�-j��>B����1�Y�2�;Y�����,�v�L�������n���%iT�?���?,t��=%�E��.T�I��7�u�H��'�3�����j	�%�+t���V��jz�����Vh��v�
���^�����u��T�\2�	T��[��gW_
G��v������X���Ws����:��xRs����/!��
j*�� 3���D����_�C��L	��������M�t��^���Zd�|^�w#�2�0������%��l
��7U����7�������1��������vA����5��gOA'
j����6���z��&m8_�	G�hKn]�����:X�E��58Q��A�����}��hJ	������m`������w��N<]��[w�g��jA�Ng`���S�nmp-�G��*24�;�Aq���[E���F���#��u�/�(�����r;qE�rP��J#�w�^�k��Vt?�M�%���3�U�����������h��`������-�B32P���D���h�;�2C�>�0,�Z2(\�����o�f7�����]dn�]8]AZs���]�
�q?���r��$:?o�h�#�P!G�����]'�?�����_�w���|�D}��p�;G�����M�m�6J�".-[-W������n}��_7�U��,;����T_D(�5��#%�X6��y�M!�#���|��c�}�vPB�D��-z�i!�1�n�T&\=?K%�w:��F���
h�&���	2�A��A��Y���@��� �.TC=�8M;�&��BL�������WU����nH#$_�m������pL���?��-g����=�����
i�q�f���^�@����h�d+J��;�avgKg_����7(V`����L����������-���_�����������!dc:���z&�74_#I�������v��a�p6��!���"
��f�F9k�g��3��smU�Xh|_-U����l��s�9Z���88��69���R��I��������
'5��1�n�W#��0�A-Z#���`7��og��X&�F4=l�S�G%��1�e�K�V��(�d���>m�5�k�����f�8�;brX�L��0�X�p������G��`p�������2,7w?����c�q�>�3��f��
�*�����n;����h�h��'�
�������w���)������i~� P�E(�0JM-�����
�w���a�DM�`F3/��Fk��do-� qYi�%��xc�=�O ��*`%��Iitc�Q��B#hmjdM�!\"�_� 2'�!�0��� ������&GYu*�!Kd�,��#st��g�h����Q����e���Q����-S�����������#�s�����2s��?�+���7��l��Ad�o	P��r����!�;T����E����2�
�m�_*��O� ��F`$@���sd��4��M���#��)��&]Uv8��M�|Fm�!��e��5<�~��:"b��@��G���&�k}_9�]�[X[�@��f���
�*5>T�}�,��J�P���{�I>#N�h���B��RV5l;? ��<�-y���{,^�������=i[bx��=���^f�>�!�����9��m	�=JC�����,�xC�S�N���i.���T����h���9�E���@��dmX��	��H��
���� )�����C A�c	p�<�M#H�>B
��A����0$��+z{�v$� ;YL��U7yG�P�K�BlO6ye�9���4�q>f�'��:��� l�'����
��P�[��i��_l�o6/����@�m>Ld�S���|\�h9��iq�'1`�J�o��Nw�A?��6��P��f
6���$�<~���=4��L*���l�7��NuOk"����T+��tE>��::q�����C2��AX)�n:�9�2B���a�=�L�2m�D* F��Bc��l�:��!/��p�X�p���-�B���~Q��X6��:R��)l��`��Q'�	?��$��ifEx�*t��/��Nu����>�\������ifX��AxSp��!_�d��x2���3�z�Bpy5C���ijiM�mK��R2���iy��zR�y
���%�"{:F=�il��E)kbOk�z�+GG�)�&E������  V���p���`F'y��8z�D���h����+���������.�������a	�Sp�?���������*lh�.X{8{��j�0���!��6�}E����.�j��<��~��g=}�����k���g�8�.(B��-��mK�=�i"
U���f:�L������H�@+��E5�QB��@+\m�H*?���@�-4�nER�����#����u���b��)���<r~f��i��� �����u�9q��hx��rR���D���@�k���f��)+	�@��TU6��r��d�R���.�;���6��v8H��_���,�o����vgx��b����Z�A������c���b?���K����)�Z��x����zX�	���Gv��)����$�yOG;�w$ �h>���pt
��-zp�1@JR�Lv�zI��m���L��,mv�(���)�4H�BO*���.��f����v8q�^���m����})�F�-YT���t��-,�C7���]d}���cQ>(<{����^B2f��.!Ps�DYI��b�������-!%���]�NS#Z��A�L�-��1�O5���m�C��E�\�VH��Y��be������O%�jj[��,!L�k�i��Z8����P_�5 4F����r�b�86�Z��?R��0�=i�vM��K8�s��e��ex#�s���Jw	�����l�Z�9Y�7��1���*,�uq���*Gt�[_���K�9�
A��6z�;�
�>&O�
� �)��X6n�z�KP�VJ�6nK����zK��5��e����6eK8HD��ek����_y�8��U�.{���'��fm�IZ#p���?$~z�);"#�\tB[�0<�O��!$�)�"������-!� R�������9�gm����:Z�n��*�?���.Z�w��~/����'�ZY}*��jdT��:	'���"Q�R������0%�.a�+��W����a��������I��K��4��woY����
C����r����������a��^�t��Z(��6W�����8e\�%D��Q���}�"��r&<7dK�oW+dM�B�I1�>-�C������Z=�R>���&k-{����K@�,Pj���S1�,Q"�x	�����K2��2������G�c7����DV�
���� kF�Y�Y��jY
�9@/4�J�?,ED�eH��H��h��F��pe�9����U���T���]O���3$�
��M�?L��I�>�(��I-��������'�k�t�i&�&�4j/!��@�HQ"�2H�}}���j�z�;�_'~��'��Np)r�O�i��d9�d�����e8"���=t����s(����7�!�S�:
��%<��a�����[p�ab�iz�8���h���O��D6�[@E�<)dt���h7�N��	y�-��-�`n�/�c�k{RdD��-��)>����f�=���%�;�nAP���"�Qn����}p[X
B�&�_w��l�5ECDT��c������r���<=vq9���-���y�S�~��u[i�+�h�P��Q�r�P���H���&���a����[x/�� \��:����v������:��h�v�qw�v2��P���{���v����z��	����m �a+�VHD��vL�=��f���#���Y2��p�<n��n)�z@Q��[�U�	��1^C<��Lv7W}���5m`V�-��cn�U����n�f�\+Z��|a���P����p�N�$���yY��u�<��h�&�-X8fc
��DD��������bMc���b
{t�pwq���Y����l8��p���RC�9R��-<#[��bd8�V+F�D�
��S�[���������^�����1C���3��-���f���3�vL5���������K�k[� ��,�i�@*�6��4D���hk22a	[�Dwm4R3����-�3DoO#���JA!���Gk����[hD������B�d%& k�XRD�|�)+L#%$le��0���o�BP����ly�q���N�>�_v����PC�Qq����x�N�X�xCA�������v\8��}?��%����ZvOt�aD�m]B�S4��]
������_�#����1RX|9��(��qX%���5����tN����uD���"��vlCVI�o
�p��!�	�q�R��
$ S���Q�Z�1D�s"��-� c@��G��~���&�B
`�(|9��@�G�@� �����G�����6�����<6��Jq��K�al�Q�����}^�H!����#ZQ���CQ���f���)k�~��Y�q��^��<\y����F45��}!���������j����cB69>[�d�9j���=��l�m�F~��?O��m�Ys�O��i�=V%
>��A�P2��q��vd�.�j��J�p$`����4i��u/o����v��n���-�q��u?���k��GY�aV4V�-|k��M�Os*�gZ��@�Z��Y?O��%��:/��)S�����l}~at���Q����Q���\�V���dr���=V1p?���~[�v�fiKI�GM|!�����N�`{�����KW<��?����D���F~\��i�D}���}�������x>�����G$i8Ny�_��W��9������m�;�>��S[,L�Pex�QK�_L�������H�j�=����G?�'���3j$w����:��fD�%[��p��i]([��	4:�"�[�f�-�6K�8��-Q*���u,m�������L6~� _�iW%L�&��L�zj�s��DF���Ig��|�)7��[3S��OxC!�:�������x�?R?|DPU�H���]lF�N|l����A�^8B
v�����8���$��>�]�v��r��_�r��4eI]�#��q�?;�|
����a�r�,s~^��bs�4H�XP����V�������v[�Na
T��2%;����A�g�_#iD\���>�t���5F�����WBl���
�2�����
��g���c�@v�P��*����fVCIL�[g2��F?b��������Q�_��P&�b+��&��h�%��6g[��8����0��1(���M}�����m��#������:���������Y0��i���<���;���kh���m���	
�^Ge?�C�������:�������{Ff�D���>.>>����:��"�f�s7<[��0B69�����g��C���7{}L��,��p�o����]�����������_�����5f0/��p�sh}i��/�A�v�<yIu�$�c�}�Z�=�k��I;�����(=d�����r�6���z��G��B^��_|������^���&�rb�O��u�+A����\���h����������K���H�y��f����r6�;p��9��}�x�V~�;�#����*���:����b'���<_�UI��p�#�B�A*�[�G1
����@�����>�{!M��+:A
tpNR��#��x vS<�3�{	m�����:_�br�}/d�#_���
�N'
����6]��gq���rw�L6H���_��[����{���m$]�w�������I@
�vH�{��A%�j.8\��u��!����L2J�Z��(a2��4��p��N[���{!������;z��
��BV �����^B ���)&�U�g:��E�v�l����MX��:�1dD�y�!zY�b,�l�U��)`�4�@� w�v}����������>[�n�,���#���5R%�;Zs1AV�AZ��OE�� ���;��6^�m���-�^B��Tj� a����e�P��h�Y.��*[���3�iy������=�`���~�k���k5��'���:K�O�����!g_�ph�����ChB�{���D(��������8C����DR��L�g��V�����S�7�������B�Hx���I�	-�����a.',�w�;���$����9�����F�R�1p��F�$�����a������������ra����8�&D��J�����+[m���� ;�	~��,�����n�&�t8��-��P2�� �{F������^0rZ@�(�o�Q�U��+��K��~��51�c�d+(Ht�I��,NB��'qO�gvy��R�|�����d3DM�"(q<�������{��"����)�t~��D#U�G�d���R��5,���[��BJ�][BQz/�n��5:w�O������![.�%�9.;u"������� ���R�����)H��
w�����^�+[�MPbhR��
w!�@E����d��l��y\���Z�I�+a>��t��_T����T����0���Z��Piv�J��"� �G��1��v9J����{G�5����7E���(nh��O��
�U�[2�P������uWb��;�.wc�:[d
��"G �$��HpfQ���^a��,������u���p��dH�!�,!����7��b� D�u���&��ha6����
�M���A�����y*�h,^�E|
���f��T�Ymi�G��,��s�dU�7eD��F~"��o����of)A~��P%�e��-jT��� ���>@�%���s�cJta�
����vc-��������I�����>x�E��4�r���Y�0qQ�D�
�p5?""J>���i/�|���&s2��S���Hq����0��<.����P>��vd�$��i;w��;�)S(KDT�,K���@���%�Y�.D��XP,!D���^v�=J�[���h�C�L�q�*,�O*?�*�P��r�7���KS�qQ��TB��w�� �"������-������!����X���"��G+��a�N��H�= @�:y�DK�����`g�lQ`:�����6b}�F ���ZS"lq 3����]��"p��(���T�=T��qQ���r�
�B�U��}"��LP�v�<3:�V
�M*,R;�Y�VP�<���A�ndQ{�����
�#��~�E��syV�58ot!GZ���Y-�8�wvL� E���]a5R�����]��M!x�Iwv`)3�
U������^���^G��A/�A�b}�c[�l�y>+����q�q����N�A��hG�4���]zd���B�a�C���0wW�������%���	���S~�����&�>��8L���H����c��u�b���H^T/��'��U����Y�,T�����x��1DU$&a�HuL��J�f�F7���Z��}��(@N8���LTg�8��J-h����Y��v����i����o�s��E���
��CF�k������Y~�Q�q"���9���U�	Xc�2G�aw�q�X�Pq����;Z�
Q:
��GK��B2����$���\?�E�F"�:oI������$�������j�_����Y���l�@�I��j��	z����nF���fK�s��F��E�vj����:8<t��cB��N�s7z*�^@;jEV�����$�����_��1#�Va
�C��-��	�^�d�)���Z�����tg�0!��T0�:W��U��8?���u�Asb1GO�J3��
~r�"����P��z�{�0 ��E�bD��;@l���C4H��~����9�=���/d��/C�V":������*Ta+���V��<�Y�'�Xr0@��NE�R��J%��j�BV�l+a��%�����aL`Bd�=�@���C&h��;,�H�l���2��d�-�d����y��@�*��i,)S�@.���D��z<���A�� �H6O��S���Y���>{�� �p=�:�`�TBQ����\8�v�����	�����)�[�D��&!���gz�
�n�f��o��"�����R���&���)��:��[�0hV%
��vf�<��l������
���d�����v�#zq�8�X�8[�������*����m6#L����P����x
K��Z1��_g6Q4F��M�&��Z�s�'BqD�n0�"H��W8���f�X-���[��[JB���b�h�GOZM~ L�%)��9��[�j��:J��[��>n�$��`{�o�
Zl��B�?*�0��|��7h	5�E��Y� ��T���Zy�Q��Y�5�����bc�N��nF����������f����h��E,�&�@}4�!yUD�����DJ[nZ�%7��N�7��.�������
����Z��Y��FF3<@���Z�mVq�����S�vexl�����HM����|�8��� ���`�2�![��-���������1����D��6,�������v���n��I���AV��?��0�@�m�d;�>�
!�h�CC;�>����=2k_8r����@��^��N���V9cdu� ��b|W1,5�Os��{���"$(z,���
��~�VI��hf��E����eX1������=��B��mB�Ti�J$�3?���q���MTC��N�[�n�De���pO^]d4�f$���Q���!<f,C��C:�4�k�z3��h�"&�Ni�!�oQ�F$�iB$:����:B*#���Y�F������&;�� D>�I�u60�-��H��N�:������H��,t��{�������8���>�l�>�3�b�Q��I��T��J�G��3�m���A�|;Z$-r�h�-&�����]�x�R�y����#��9����?��]�V���U�~���8�8D��v�d���:�d����PR�rJ�{v�:Zp��Ll@�����#��?�Td:���9��X���<�:�<YC������A:�*���fe�&�U�p����?����R��kb2��~x\��b]�+v�ww��r��~T�vA
���������A�s�;�������	��hj���~&���n����!�
����YS"p�����u��@�2�^��RT�t��k�t�H�d�D����k����A�F�rw!�a�����]�EEG�n���n��lx�5[�"���-N���r�["aa�AKSI����[�@5�<W��G���RD�w<�z��M�P�ID|�.��=�:l����>�C��G����?c{xBQ1��B m����a�yLf���-����I�N�,*��8�B"$b�FT�/�&�#�R�eE�.t$:���cs�*#G��G���Dl��a�������~��3Lj�^Y���@��gXS+�.�?�q�����������_R�n9ea+��~E��n\�@��v�;b�wc�j/�Z�?�"1"�n��D����b���m�l�:ax�3�i�R��>���2�����S ���[(�w�����4����t���B&����&^#�P,�v�C�.`%����
8�L;�]o�p8�q���B���}8jUe�]���� l�2��n���.�}Y��5�<N��0�����Z��v�LY�/T�&�8���9���s@4�P�RoT_PfS����v9��F�5�O�~�~~���8*}����G?�)�8G1(��H����W��������+�`�>"��<J���pU�6��~�=k0�L���'2���@|'fv ����.���d�@�I=� ���q��{�(c�*�6I{�h������jo�pc=�m��9���&�q����
Da�#9G�H:l���-��$���F�mQ��$�Y?���.&���ka<�<0�:���*4
�,�h�J)�/
�	��;��c�R2g���E�*�4G|g�@������c�N���5�9f��&���u�&?�,#���[������Vu'��	#[�P�s�WXp49����QA9�#���y�L)ds&��jf���@����T0� (����tQ�����/��2�R�����uz��p�h�}��~>��h{6IB�����hkU1F��p�y�����J;/dy%C���(����q�eQ�kg�,������
T��\����f�]���M�^u�m�5��e��[����:�����U���VL���c����(q?\��q|����;�?`@u�y�k"*FQ���=���x�p=�����]a��!�M!���9;�FHSl��#����R��I	���������*��@&;����3��p>KP<�vV�f�~�&��*��s8I������:�a|��do�����[��lH�����Rw���"q������>�@�	'�;>E���'e���?�Kd����&��
��'6�6O�������(],��}���aX����EL�1�t��g����
�m������
���VGi-��PB���T�[��[6�NY�;���1,}�v<g9�����s����j���9����g�
�W�XI�;;L:�!�����)fM���~>���Z�l9��F����>g��d���6�<c�6m�F8&��$�
�6�"7�V.�O��j��l�4�����#I6c4�"s|���R*�z?�ic����w����k�A;,���?:��}r�bY�����c/������Y����h�h����l��(iF�q|r�6$9
6�����9��V.(%�j'�D��'�Z��-�S$��]����6;���k����]����M�v`�D���\�����������t�? �>�����(M>�iC�IN�es����1�*]�����xm�%DIC����:�w�Rje�,Z�l����j>jg0��8�2<��=��Bm�Kr���,�U���~N�w����x���3CP+Sx���4�A�Hb����t,tv�v�f�D�������	�4�C�>m�_-jVM�		J���%3|���c+�)��}-{k7�:2��NK<��y6+Nq���9S�s��:��PF�����������cF����?l������02{	�����F2���%T8��I0�������5-���sY�.���vv��n�����iU�Q����<J$���&�U��������)�h��d�@N!V.������5�h,8.���10���D)���4-���s���N!	�/8��WB�uf����}: ��H��}T�D�\�"`h������:x��e:�!������g���/kD�������.�8 a�Y0��x-x8���5��1:s�+�����:KSh��zgs��Mc�u�JUse���u��g�V@�00�������O1Z<>��hF�I��.���uNgAw+��8�����Ns<S�MA
"��4�|
L���>wm���� �[]�h����>��Kx��K.!�ae�O���"��tJ�����/B�h8�4��<��a���
2aI���I#@g��*�Y+h�w�$����1��Q��ew���6MK��vDN�1
�3���TU0���S���X��c���iE�Q���j��%����`p�'��Z���5���%�(,l��t(����{r�� �-7�)x����a�������
qY�P����������a��{��IQ�%���U:^0��U/�H��U���}_K�B���r�[$o�VG����'`��ba�; �Lfs4\�<kWk��v���	P�[�3�7u���������,b	a`���M����!oV{�4����x�����n	o8wQPn�������������� ���*
�	��~X�D�K�z��N�����no�u��� "t	bh zH2x��(�!sL_B`leJ�%L���,�t	I�DQK#��5_���l,�0�[��C'���,��~�$y��;�-��Fv�9�DS���J]�;Pv�}�	��BYe��-d��*��pY^@$Z����4k\�������h��q������lmq4�\�%xv�u	2H�V�Z��Z� 11 ��U��)�h���C�|�w��e��P�B?;��-��T�G��eF��	:��Z�O�G=������I�(��gD�X��
�	���pX����?�IM�#��_��������u	J���{��d�����V_G;��t�-'jS/+���7Q���p�"�y���P����t���`|h��r����]H�&m���~��9gQdY��A�.TA�e�e�����������t���J��'����A������.�&���8������v���v��i7�C�I_�<�%��dj�1�X���Nv�����f=&�"��6����n"k�YaV 2E��v������u�������|2�jY�@E���}�7P���� xbb��0�[[;/aS��T����m�e�������;�yF�j5:��h��l����U/�>�p&���FK���0�aY�����5Z\,r �F���><%�W�~_5^y��q��P�e�f����:��?���	m�'H�~L���3I�����j z���J3��5+�AFD��K.�����;�Ni��[pC����|,s�(H�v�rn�24��l�&�=I)�U�m���C�W�}�'l�E���1�h��f���m���-Xb����[32��)��
n����],Q��-u�<Z����������4,j;x��B���}��) m�h�6S�eVK�[�=�&��dt�
�-�I\�(��7d&����]�	��+�4�t�A����]k��X�#XQ�������������e1J[0C}����zQ���7� �������n>�������P�-�p	���0���=H��QV������v���@a}q[�p���u��(�2���yU`uU|��nw��$��r��h���S�Al�N���3�3�SK�O�:�u��/��"����uvv�j���?��F�
�F`j@���(BH=��4%��x~�6	0_�c2��^���*�!�e���D�=�I�\����~{���L	L�h�dOM���0��8����YQ,�Aq*8��O���h���J�J<��n+ZO��U�9K<s��,�0{?Z%��0�H��2��*��>)��4���9�[�����>t<,�����H���{[��T�h�8�����K$������Oa
���b�����E�B���.3?u-�B08���B!��Nk���Fna�����������7^��jd��@���N=��h[�a�[����%�f����j���qIngw��8K�>WV�	}����t�;�+�,QOvi�
O�C�ZfZ[���\��}����&��&����h�b@[�1uY���[f��
&J���DPC���2af���y	n���f�/�a��F����P�,�lP�O�D8�>�p!���F�X:�W�h�o�PnI����HB��e,x)����v��+b2����{~�{Vfmw�3,�$��-�`
�L�#�a(��ic��Q���Dx=
�:vV���{�cp���#�a���-"��#�!�j�c:��X��^��t3p$����1��3��*�`�0�FJ��W��vDM8��1����������~������;Ny�������2��� 42b�+ �9"x�c����	�I�eT��]�K,� �<"�a���v<Z��V8��)|`��U��z��jp$����9�"�|����	:m$�F��#,#��;��_6[m�N�T4��L�kT�#p�$;B,������������o�5$[9��� 1{J��/�{�h��{,�\ ��Ns^����V�}@hE��9B+��p�mZ@j�k�9�SR'a��K��kz\){�t�f�5�H��L��}b�&0���ts�P��4��t����_*��x~GP�q��x�^��^���������_�t6H6J��8�����ztv<�m��F��FD��,�m)wvH?��[6H�K��XKF/�1Q�r�1G�K*�Y��Wv�0�����Q�G�C���=c�Y~�1��!�]}���d�#�.�(a�Et��[�����c�f'���?l���������
�A��]�������/(���	�����h��P�!�~��!%������F�X�p8�M�	�:Q��q�3V���hY��e��(�b�:��FG��l����l��!�E� ���3M)gG�����y���BF�=�Kz�G��5�~�?(�8��/�����f�
���#���X���_*/�p0~���|�.�c�AQ��T�����Z[X�|�eX$[����|6��6�O+>��<)k�	J �	�E�r���t�7�y$�O���?x=)�y�� 5;����nC����w��W7���K��0s�Y
��WQ��@A��Q��;\U\i��)�
Q[�xG�eL�w����$�������z[�N*�w�@�x��;9������
������5-���(��nT)�9��M����l�Kh�L8�� [?�0@�i��'��;R*���kkP��uLY���;RM��@�����4EWm��F��M��w�N����\�����A]��p��A�^=
$�h����5Ik��`#=��-�����h�9S!1�y��!a���$;�f���MA���""5i-������0M�#�,�����(�������*��������
Pu����vo�zgY�P]C�N=hb"�XO�UH3��{fr|/!~8���xH������p����R���U<Z1H:�����H���A����l��NhTw^�4� ��6������<[t��/s;�!�����af��p�L6H{j�������:�<��~���cmJ��Q��m����F�D���m&��%
��J���54�|1n��-��?�i`;�$rDY�g�=j����=�p�wxu$d-�F���+�=��-��FHp�IX�@�C�N`Xa��@�/�N#��w��D\�r3x�y���r�^��,Y��.�C����U~=�G������W�j�qx-�V���|�+
8�����"aH����+��D~!��������{w�&��4������0��D���/�y����H�<��gSEY"|�_G�*)ird]=3�S�	�w�*3"i��e������ ��Hu����w�6�
��B�G	@��
���o�����av�j����l<�k�Y6q\�t""�{�����0�S������(�/����pI���(�tngk��sG�]I��!�<�}�����2����@�%����z�����V��U�"`d��j���4�A�U	�c-�0bN�x^���8�Yk�<6h�?��<`pz�*���7�g�pO�{��e9�8X�EpH1���"���&�*]�5 �(5�W�rvH_��C$��B��t>��`,�"��+�6������4�C���;7gt	���U����_���.p����W���)E�{��Q�U�.�I��t��*Ns��bt�a��&������I<'W1�p7�(}�9>f\�[(��]��3:+���{�n��^Y�`����e4?*7�C��!wg�~���p��6Dg-��kFXX1��-�B�Huk��t��M���x�"��D�Oq���r����<��|k�! �i�������@���iTeST@C�p�b���O��#���*;�y�0rs��M�C�N���
	1����r���N���DD�Z�G�i�/��	-��(���j%T������j�dD��2\�E��=�`\�46l���C
�*��v{�
Z*�,-_�B4��"���[�%�w��'e:XX��(����:#O���g$��bC*Y��J�|q�A�F���E ���5�����{
���L�I�R\�"��|���P�M�8�_�������-UcX�&�(�Hus����4��[�� 
��'�i� ��*6-z6ZV�
#���V(���Ne�_�~*
���_�?L4�/yTj���C62��#�m��w@a��XKE��ZVM��^�	��Y����-�p���sL�k�#�
��w�����������nA�g�5��{q�r��:�>es���B,
�l�qud�);QR�rL������l11@z![q����	��F��zwB����R����R0���PU�^H�}����L��������<����z��)+C���=j
U����jUO�����"����T[������|���/���z�-*��c��N�0��\U�{�Q���j�O�[XQEM����1���t�CM�����
���FN������f%{�n��D2����w������	�Q������R@9�6����^��owAca��fA�����*��T�n�'9�� -h�8���eS�1��?1�"l�:����NzU��)r�I����!�#��U��g���?�c��UE���?��X�s@���B��
����������u��Q=[���<��p�$����0U@�������9���!D2�*8���e�s
��nF��Y�h�U���95������<�3��������=,�
�58�E���p�I����$U��`�Z������Z���6��h�f"�F2�/����e4�b�g��	��Y1$� �+TA0����<�W����;���*����s��O��]r�.��?�+���{b/�����v�%��w��0�]������P�� {�_�vv�3��8?�9|����v.��G+��Ruy����
T��jK�.�H2����l[���v��0�V�N���x'�2�gv��V�73�0����.h�
����.���i%�F���oSJ��}2i����3����~v����������=vh���	z�pj2
n*��C}���
4�"��
��ou7d{�
�s��Fb��8y+b�	Q��_�MX|85�:��;��MA����x�
	�X.Fa(����I��dg-�m�V���U';�~`Fw�eg���f<EM4��~4�� 1^YZ����)U�=,�C�(k�
�`�P4/<�������r����Q�{�����|�;l���os��L�9	���H��Ev�����
�h�c��Z���������6#H�k�=5r���V6G���0�!��O���MP����f�#d��G�G��D�h�42c������AyM�E����
y����v*@���_��Ws��S�����w�l��w��f���QZ�W�������]d��Vl@��+z��)����E�P`E�Lh�)�:^���J���s3B�J��^'��������K@5m���}�����C�Y�4#��q��]���Wh����,7 �T�o���E�����y]�itgZ�&�����
����*�R�Ss�r��/H��I�SS�k�@n�v3�������z�%�8^m��J���]k7=�U�p��Qg�	_�*�����p�
_�1R5�	H�&%��z���}G�������U���+%:�5�
}"��O��iN2�!M-��C�f��Q��
F #'C��aN�����o����B�������;�Y��F:�Z�a��
�WG
���*�(�b"����a�j���l�� ��i���i�j�`i�����f��0��=[V�X���y�e��M�����#��6��-�������\�k�nY2mB�y�H��������.8`V73B��}����*z��V�����:$��p�C���_���%�'��5�V��,O/�x\��5��gbr�p+X&dF�!��lV�?����5��#�����"���>>��6_~L�(�>�e����5>�[4��m#�(�h55��Ue��=�P�n����6��e}7�����������9D��
����C^1���99;_9�����R���~�"4�m�\����s���I�|����d�j��8����������������K�:	����\���c���uw�����4�35{]m~��:@&�����Xs��8�;�Auu�Yj����'�d�����oL,	�Y�@�a8�����
����h��������nM�����������'�oW�����cs!d&C8��?�������9�{�s[�.D�������n��hs�j�gG�n7��`K����O*���>,�5�zu�i~��QK.~S����A:�VYQ�{�d-���"�>�C�^��A�z�}�7O��������z�t{��u����-��O����i�b����;����Ma���.���"g��:�;������~}69���z���#��hb�U*���__|6��������I1
z�:�� ���GP]B����P�1��.c��f��7q�)b�w�������,eG����G���'����������D��r�?z�����A�*��w A���E����=Y���!5]v
����o���.�G2����������]]�����������q�O�F�FqOG7�S�'5x������<�,�{�x��S�$�{�l�M��=�� Y�Y�b;��=�����p-�V~[���gFwG?j(��wp�+@���h]��	[��������!�f3����2���m��f����������U�Xh�-�l;7�������{���:���g��&	���������F`�> ^�#��
���]�Z$��S�z�Fj��|��~�i�-�n�s����}������:����e1���n%�W����'\T�c}�#Xi8���.���Wl��������&bH����@�^��������_O��'� �T����IKX$o��&����O���
4@��A����>2�U�����'��d���oQG�~�������K���N`C�>���~�������Z*�j��hv��O�E���.��s�}�Y�6�"�/�1��_S?�s2K��G1hi�.��r9��0������7P�[��3g��J���:F��;ul>i��p�'�_���H�7�������z�����������?"G�aD�|�h�����V���������PU���a�������H��c1O�cb���
�|�����b�
���!��56�� �@q��3�
�SoF��a�!�D.���j����@���L�#�����C�|�pY"�a8��z�kf ����e�l�6�Ff���Q
K�CY��U�2f��4�"Hc1;�
�`�F
�!��}=j��_�58�P��a&��
P8�V�C_������%��F_��]��%;����@��B
����a�r|��#'��K=��A-H���1���%d@��J�c��taL��;�a���l�/�g;��p�+Q�b��+4L�'V����O
5 �����0jp���0��O�(��_'���i>B�;<jp��L1-n���;P�&u�����EM�� ��"��T �5���_|���������?��������t�Q�| v�6��~���(����~cy�z��J|�i�o��a �=�Q��z��^�<x����a��A%�O���L�)�v�	�*�gQ��/��MD;����������1����h��_BV��?��	@}���0xGP4l�t�-��8���l���#$J�����F�|+�������@���@s�/<�6h�Lo:�������N>|��;��f���nq��K�t��b��D����ch)E Z��5@��x�C�RJ�3V���"�����e��|��Aw-�����\S���su'�������B��N�iA�����'�lo�����#�l>��b���$������"�/BJ�0����@h���g��)l;��9?B��Q����,�h:;���-D<L���J��$5����qb#�i!D��r6��R4B�f��"Yr��
�����#��iP��g��l������j"Z��P�[��l�	Z�m��B4�
y��"�����u�cf3R@B�!	58wm��1y�#2����')@i��tV��*3�F�)0�H;����q�S����>��:���J��d���-R�4n�����3��L�x�����p�Nx�0/�_��0�Wp���u��C�#s��P������.�����*�i�
�B!=�Rn/5{t��adSC�xS���+@�������?i��4��&����U`�!�s�4-������n���!w���P�O����;�#;hX��{�-��7{I��{]�i$�~u6">5���B���	Q3.|ua������)������Vx��Vv�#�N��4?�����P���=�0��`Ot���4|��X��}8���;���A�����\��G��YE���(d�������v|.�_�����e
�PhJV%��
�)��hq��#�����-�@�5{[�%�$�P��&)4���M�Q��is�����8em�K������_����DF�j[�};�qTlQ��F#;;��*3��6\��2�r::��1�:4�"�������pJ�>I8�@U���n��*2�������W
����E]�iTveV[�PZ�]��.��)@��29<�X��(�)@�YL���>1?L�g8�M�,���s"���sv>�bQ�����;g�S�������L�����;��=qL�*#����M6���n���vh�[[%F������������_��(G0��Ka=�W�e1��Q�������\��H�q����J�K8PvT�/�d	�`��>$
#f7�N����%
9^�)9�{/0��>�*�Ps<)�i	��01���*�R��lE��U,����ok������*��b�,����'�E���B�wk���3�rq:��n�}�Z�1���2�1?A����%���=��������A���;L���j9�45**V��~5��\8������&�5�yF���j-�*kM������ZM�����A���a�����������9�|]��-��|��5�V�*m����W�?\@mJ�	�J&<���@��3"?����s���FK@FQ�t�������8�g��KhF��_����Ww_��Nx���#��r�r6����`l���UC@]h�!�@����.�2�q��>D�l���`�����[*���@�l����i���;��28
��#B'3�ZNTn_�6k�-g+�Q.{`:THau	����������hu����-�Tb5b-�(�.�rzr���V0�2��bQ������
�/�77�`q�T����Q*5{f���R���C����� JI���6N"�������H���d��F��Q��]
�:���L��\�'�����D�8��2"AT�ii"�2*�v'd��6u���1 �$4l�&��Zh��,�gY�p��L1�7F��Usiw�	���)Q C�����L3���.~��k9���	C�)����%T������,�g�X�5�������� �Uq�4�g}�I�@NH�kp�=D�m�2��#t�B�����.M��,k@q7���{,����B9n��2��������#N�������7	���$�:.��F��m�����L[�(Lp��|�-t!���J�l�C�vT���������n����3�#�mAX�P%e��`�e��r�2{D6�����hr	B��g�
��"f[8f�)~;<y�)���v��b��4b+n	���_:���������C��#e\� �+ylaC���q�j�-���
����}���0�{
pWv���8[�hW7���b���`[9��k;0�2N��F��sj��u"��vz�S>a3g����*�S�~o��dt��-�� ���.�����]Al��c�/bW���EVg������b�E����J�����l�oF�:�)�Hw������v����s��Ymf4�A��F
J ���S���)yjw�����Pf��m���T�C��f?J�����m�>2!|!�8��F�pW'��9p;��2�q�hd��r��8b��w�;R��}fX��9#�f��_'��*nT����&i�if�?NNt2��Q4�b�n�fE���<5j�Tn�P�7$O��ls"� ��*�������+}�hK1�}`�q�=�N��[�V0p>��+|MG����_H����O�:�Y���|���]G��l���%��f��|"�mP(�?�~���z���r�*~��!#B��t~�bSLF~F������muD��,���v�6����-:�2p��c�5#5n�%jV�e�W���s���P���Y`�B�Fd��mO�i��=�Hdr&�����;���H�C����i>G�
��x����+�C� X!������hN"������@���W��B�'n#��O[���*�Vl��Q���"����9 ���-`�O�X��U�
��+�����4������L���Y����N�XfO������>E�iOb��s0T����d-g�c7�����c����d�6�0J6��5:�����<��A��ND�:�?4v���RFU������h�$���@G��%����TY���Q�5������Y!Q�n�qT�"�8����	[��3|�=���F3O�Sr���va���3X6����mr{��vr��H�W��
/��3�,��l"��#��cW'X�
q�~�v��6�GSg�Fj�#��>M?�;3��S��
�7�~P������{��o��OQ���cV�D��1|Q�:�X$���`>�D��T{�Rt ��FfCu�u��[E��"�����r!��Q+(8Pd�.8��M�Gy?�RS��c�C����FG�#��L6&'�}������������C�Ju^M����8p���na��I�@KS���������Q���{�/�(�E:��IS���h�};��@�B��y~�O�t����C�Ck�{����gG�����	&��+'���b��6��U;�r��UD��:I;�G�����~��k����d-�c��5O�gt=��}������e���I(�W���,��� �},S�Hw����c)�c������c�f$�c�����;�V��dt�_I�pK�[sd��~���/�_-�����[�,��S��w`$���?�-[A���X��6
��
q�}��1�,����A��4"qD�:��_vU�:KG�8�w��@�.�o�l����~�^��B*��#IP����6�4�m�4�"!�q�5x=}��#0#���[���q�Ja����[�Q�>���|�fj����q6�I6e����Lg<�>�rb�%Y����3�}gP�������,������VM�^��&}�I��z0>tr~���4���'K�������
6����g���C�9&
@������c`N�I����
����u���@w<a�Y���{��)C�8����=�at,��q4�#�h��+�_[��W
��Q��U���~�wU��r+�����z��sb�C�;\[-�]���#��V�w��w��!�P5��������h��Gr�{���<	������n[je���5�EEL�w���dIC�K(�p�%n?��
��w������p�j���2k�8"2w~/��P��	�V	����������G[?5@
�u��*Q����W���j|	�����*�R���7#��F�
Gj��C��fR����$D�0�)z���I1mY��@Q�_c���^�o*
*��N�\���Mc���IJ��h�m��;<��������� Q������Z�I�G!�����3����k������	a�����I��d������:�&��w�����a�2�oq�t��c�".�A�gd�R���39��#U�
��j�����^H�l������:���<��S��{A0�����Ef���Pw�&'�w��Q��<��G�v������f�������g$+}I��~����9�VuD�|��u�S�
��}"
K^c�F�d�P��|�*�(F5�1I������^Fk������������g�[���PB	~/��-0~Vu�(I��dl��$N��p�v<vH����;\�,�*��[<�r�O��{
�hJ�����2%�b��4�Z�[j��	�����-��.�R�%�����k��^B�a%�w�x�pO�;|����z�:��q��'������7�.i]��o��]���<:A�m���%���K�2��N��S��B=)q�~G:�"d��Jd�;�f��+�f�ll�o�����OD�=�pc�w*%=�w�vO��i$�
���������P�>�&"2�<��,��|Y��������$FH9����s�<-�KcD���J����D�Ed���KuM.�K=\g��'	&l�8
���#���m{�_�"�l���"�q���p� Uo���`�;\4(W�'��.S���By�S��0�b�H�q��w?g�~"��.�����sPQu_�Wh&���	6+���"���_�c*F3x��h�,�k�l����h���+$G�mY�1���&���lW�����Fc����m)Bv��!��*�"����yP!#q5�Q�2m!rQ�E��(w���X�?�'��2��RE�I��[p��}����|���h�Z���L����E�D��(_D�XP4�mL��W��Ak�z��.Y���g,��P�Hv�@}A�+�^��AQ|N��>��pji����#�v ��m�G���J4H���u %HL~��R*�2�>�.�<t�f�<h5L�����7+���{%�v>����� "���DZ�;�X�-h?	H��u����)`'p�
��"2�.�n���
S��+p�vV�:�����i!�~���oN��Q��.B �
�d���{+���9lO�^-�v�
)���P��D�]�Ir~�n���.���:��l6�!u��9��O�Q��:
�
�������D��@�A�IC��=o��NM;[����DB�2���� ��o/N�����Bk�]�-M6�I�����dN���B
�'���Cf}��I��Fa������[���]N	*�HOv#�h�f�l���<g��lz�
q�a=+QG�X,u����X�_�l?r��EX1)]�c���g\>�[i��P�m���Rb�U�M�F���`��r��l����`����QA�i��,�$�6��c�?2��e����?��h���	��l�msN�]����7��vWC��]P��F�CaM�e�#��U���}1*�"�?�)�X��"T�.���u;�g�K���:��T]�l�i�S�|�N�3�������S���;���w���iMcO��.B���l-���*M���p����@l�K�hv��a������[�o����C���e7���A�
tC�cM����elP"L5D�����T�doG�6BO/���p��x&��;)�fK�4V�"d��*���i�E�B����I�t�G�| v-�:t\������BL��2���&=~����q,���{a���R?9��Kp+��L�����A������&���Z�@��'�a�I��o	��k��h�{�I�3c��&���T�Ze���������P"�J�����,\�+�c���:t"�����<f�V~K��W:����sp��T�w�e���j>�n}��~����xJf�F���p��*����z��}b�u�Z �A1�w�nz��5���{l��W�3jcV�[��:O
��Z�P�a�������8�fj��y41�����}�T+����bJK��B(g�^5��+G����[x�e�N�������#����;�>`���U�82,�f`���77�V�:_�fi��:Y�.=��S@D��0��Ah�#RL������=t��U�C����G'=������v�T�]����Jv�&�������l�$��Za��3���y���������*|���~��ABu�9��8s
�A�R���l-���]G�X�X�D���>�����P�jUDv� �X���'��RkI��Vs������_�,���U�_�D��}p���:VB������\���b��Z�ep�7���+[�5�������F�@�~��,f{�vR��9Ww�,����:.Du� s���w�'�3r��u��� l�Fj!�G����h��9x�(��N�3���t�|�q����c3l	��2� n���z\�e7��*�$���
V�+m�W[,��D���nb��	_�����{V�#��U�E���f�*����C��-���B������$����}X����;�������J(���_�~EWh�������L���[D,@�|������A0&��]H[.���)�[���!7��|d������P���'|+����6�t$���	��{E���A��������7��Iu5�4k�#6������V���zf�zJ�@G�VV"�C8������=_�d&��OMv!8W��m���`��|��0�(������d{h�$f���O���
�9������P��|������{IK�fg�{�*�Nx�j�hJ�ws����|O�OJ�o�/F�__�E����)�F���6��)�	�����?Q�����$�%BHE��%�&���hR�b���@LN$�h�)�4�K�H��OD��f����U4\:���	�@lh��hBu'��h������#�f'&��=5���PD�|�������#;�l���a?�Y8�d������������pDE�y�TCq�X9M�����������u�}��md�R������5%�~����Ye+��2c��t��L��K��y������P��Y���q=����i�~��?��B��+�F)��GD}kBz�\m��X�w� ��Y)�Y(��YS�Hv�:��S�q���S<�ei��D?W��<��l�_�t�O�'	NvwJ���������X��!��
�dC��=U�6��C��K�����+�������`��B�����B�?|;D�&g yG6��A@����L�Y�p�-?F�H;�l8����VNp�W�T�r�����!������4k��a�E�E��o-0.�3��Ic���nr�>�6�BYV�t�U`��6��k��c*�"3h�?�O��k�tq�
q������P
�7����1���k��������)�}�_���e|��=k���G��v�8Nr��es���c#;@���&"�6�!0,��sap�G� ��|�$�Q�����'
�����e����������1m85?�L �'�"j!����6�m�G�|71t^�F:�)N����e����t�]��N9Y]�������F�'u�����������D�sU������������R��.x�o*��Q{��H����w> �l�/V�F�-}���Y�Q�J��Ns�N(���<���u������z3H�K�w���?��4��o��6����"�)����Y��f[��� X������i�l���>��gKBhJ4�.ko��&���llT�DEv����e�d;�����D��H����_u����?7D��*���]��nQ�K�| ������
�Lp��0�n���
�x]��Z�=:�w!�hG����y �SI�m�T���VpDVf	{�������V
�qO�3B����|{��Cjp����E��L��R�����Q�*�����A�_�r�����JF)JA�4pL�E�Y���:~��g5��E:�.X����2�����[`n�����d���J�����I�p�Q_h����2`��]p[�
����`j6��_������e��d�]�n��3������J�d�W�#�{���P��t}�4�l�8jv�Z>0Dk��9��P�!������i{DvT����n�����e�r_Q�^�r����g2������|��T���f��h�<�I����$F��.�a����@�/2)�B"��V�qw�TK=f�w�pneg-<�&�����&L����jVro�.�O�{�!��L!��J��%G�m�R6}��)��Y����zw��x�'%��c�iB+��/\�[.�S��?V�(r��r��x*2^JE�]0����[0_�;��.H#�`�2y�fo�����o�����%�|�n!�����+;����o)��	��^�G��aED���
�v.j�l�u9��g��Bp�e�K��a�K�
���)E�����7;b`�]�5�
�]e���$�F���Aw}����Y�-5���3R��p������v!���UCX���#�I��G�K�Q }���jX��!��D�X����I���d�.����@e�%����<�c�^��f��4��+{�'��k�@f��a��������^lX-Q���>N;8e3����S>N��+�^������J�;S1�Q�4�Y �����
���L��E���
�&�.)Z=�W�hf�d����[F�6�fv����^���d��������'����x%w��o���+j�e)6��[#�W������M�5�=xh�=j����9��k8��J[1
P����=�Y�$�1EM�F7�����d����p�?e���\Vy���g�����]b�mO�9M'.r��|����w$g��=cIo�ew3�r�mk�;���0�0f������eG*��/+(z���=��:��/���9��}�_�n�^�*��lE����
��4�3���a�J������)hH$����| �U�������4x�4�x)}���GH����aEb�!��b�� �1]�ewk��h"X7�1V�~�b+�{�����Y���0�gi9����u�O��4E��yR�Q�X������uu|��(�C��w9BU�������/���f�-�D}�Ix��We�&��"��am�m�f_�.��n`�Qj�����Mb�&��M�����c{Y���]��&���e'���!��

����&g5z�B�����cd�#��q�g��v��:)�-�\B�Ykq�k�a�Q�`P��3-�
��Cz�\<�8�kEwf��	���~���d�M�
2�����N
M���>��X��(�z
a�`���:
/�e�,����|[����8���-84��4Z�����x���7����@O#�E[�|L5�����J?�%L�E��i�a?i*��0e�
���<���u
[�62�_d�2��F���y���9� ���n
A�2t���6�4
S���=2���	��c��#��:��Y�6V{�*RQ�5�����B"O��v��������&��\��mS��i=��N#0u��2k�N�&�%�DL��iC��e�����PI���;3(�8�a�{�;�-�PR�S����%?@Z��c�U(
�h�/�l�K`�������qv���"����Aq_�o1���� �����B�V[�����'?<������NK�]E��i���d�������B;.��rKq��D5"<��'���j��Xs�x
*k����X
�!�D ��6�������,�i
"5;�z�
�#t����s*���}���P���:f���a
, �[�dQ�q
6�q/�����E"�i�`|���y
>Qg~
*��A��5py�l	*X�o��%���������q
+�K#���X�s���,�����9��C��M[��g���������G�":C����;��
���V�n���LC���E����5��8�9������oF���Y��dz
T�$+�@F����zC#��6Zi'U�N'>�F���#�����=�.9D4�]�.8N:+����>�g��FbDvv����E��b�1Lg@�W�Uu�v�����F`P���2N!
g��'����gP*Nv��� ������8��s� �_�,c`�ei����m
�(��FJ�H��5��V�6Y�|����FQ�uV8D��:k���;�1y�G����Y��o=���fK���^��Zd��;Bd9""�e4��S]{<&P)d\�����k3��%�*��vv�3Y���>}�����%�Dx����4jU�`\"��z��w�z�L49JgD�%������g$�_� 86�h�^�3�uv?��\�XR�^�g�y�0���/�����8D�~!DU���v	������-��` $Rk.�}e�3�L�o�D�}o���l�"Q����n�d�4��0��=�`"��*����;5�(����l���RJD �h�U��{k��.�Ug�h-v5�;��9�D���9��P�Z����U�K��g��	U4=��XB'�G�Q5��L0�6�����A	,�XB�{2�Qe$=\m�V0��E���\���rOUt���N��9isp9��T�UY&�E��T��=�����w�;�O`"ur���.�	��H��F�}h$�|�V7s<cN/����)-a-)�#���P��D��2d�uX��p�����#�nz��s?�,���6�[�E�.KP���k��4}�S���k��g�O����GrY���1������F��d	�&����-�M��������J��PI�wD�����p��B![���k�e���X[gZ��i��h�c��Ii?
j��-@E�_��/"�-aa�e��o�m������e�Dz:��D���	���v�s�����+��s�iQ{Y�@}d���4�����X���H������yoCZ�zE8�@~5�2-gP��"2�q���@���#>��! k�_���l	1�@���h�#`x	~X�#����O�u��"�E��%���}�fR9���e��p���6z�)^�h4�x�����,�a	�PTB{,{~�-����T>2�AdCtf"��SN��{����e�b�)��3	��+4B��Y[I�{gfT���&�[X_������#��O[L�Z��}���kKC9b7�m�Dt��&��O{��a�����1M'����m��x��$naoAD)���_a��ebp�~E�k"K\2��v����g
q�t���;"�ogRG%�v5������D�x��}����/^���-��j�1�@�����m�p��}j�J-]Hm;2)����(r��22���eF`{u����u����� \�$����_xG����hQ3��X��������J�#:oS$���1�q��l�N3�~�
B�?A�dYD�8����^��X�m��D����u�����VS���A����l����C�i$����83Y0�;2u��q:�P�-�E��H�������SiV{lI�@� �?��e�����y ���K�\@���'sTjP4
�,q���@�j�(Kd���6�������.���K([��9�
=����EH�����*������=���M9����[���!�[p��������VV��������"��M��x){������#d������������1g�{�B�d6R�0���I�x��������*x���UGn�WV{M3��:w�\	�`�y�7�"~��!i�v`�M�Vk�3E�����\�����Ea �e���l(#N��)�Rd����d��3rM�T8�\��F�h�"{%[�D��o��� �Q�l/ V�����zk.n�z�'o��8�Z��� [\�e��C�������jHA� ����p�=�<�uPQM%b�_��G��`=F��[)=`� f-�l���w�����xTtMw�\�W��!:���7����	�S�?dF1i��oC�o�y�g�TP���bc�{��
�P�X�1���v��
]u�3DN�����l�����)���`4" y�(��t��^����A��R�Rv
M����v�#���7�zM>��z�@A$��zl+3D���z����^s��
���K�����\����p��}��Y��q�u���<N��P����F�����)N��q�����}���Gh��H�}��@��Q��|:
|�lZygW���}
��[t,9�{�:��H����{������#T�a[��I�&"����H��C��-��FKq�����GhH��
$�#�!w0��6Q=y
����^O���+����:���k�_� S##��Q�=�\G�HDO:@�[B��Q����.���WYVI�n [�����x�# ����=�yO��&Y��1��*��6�Lcv�!^���R��1��������cD��c��k��4�[��Y�z��s
�0H�+�t���3�cl%E$~�p�8��Q�t�����N������=Ca�1���m�i�(*�� @OTqD�e���#����l�
�[���5C��M��Ku�&��������1�����y��=�9���B��
G���LZ����@�����x��3��nP�sT�Do�xF���&�]�h�g�����k���)k�h��X39M��Nt�9h�Hx����5�#��i����+���0
d����s��MK�6� �����7U:>��������(���V����
-"1:X�@�i�d�p
��?^=���ZF���t�B��%�+N���h���a�Y��1�q�������Y&K�.�g�!ug42�����P�c�(��
mn������o�	����7�rN���%F������vd�y>P��3d�����mxqR����o��k�]v`�&����d����v���y�gT��il�3+'l"����I�+:N���q
g?aJ����Le�p���A�5\��D�#C~	��(��2�C1j
��g�;���d}����A,X�J+gZDY.����1��"���<�=id�#�����H@�w��
������/�l����%�-X����&����H��w�rt����]B���}G~����u���pc
ht�r�����E2�,�?��2���BZ�n�����}G�Q��k/�v��5L��^w19��c�g���Z��IQ�7; �@U��|jn��}����']���&��B_��B
G����f��f�)�VR	��i�g����&��{!�]�p"�*(������ ��xD����|��:�����=4��x�2lPM�D�p}�af��0,n`�����c�S
^fx��29J�~/��I2v~�#u��^�1��
���u������������7����i&�w�&>r����i�8JB�y/!�+Z.�5@XL@�w`����G!XL��4��k��s�84����Z��?�w���h'8P����H�Bkkr&��U����_���d"���B�|c.���v�54�X�n�y9����h��zN���I�����0���
��^�T|�a���n����N�@�Q�E�V��J(3� A����L�-]~�L}��m?��Rg��|j���H�rt�#v�k��������T-�c}/����GG3��7$��w��������H��d����*��;e"�{��;UJ�v�&5���qM����D(�$�SF m�������;�S��t ��$���^���q���r69����z�E�S(^���
�?����.��ZY8�y�+D��wP����8^|������&[�'�E��k���\��I��� �`��������c�md�Wm�'���-�)�����5���P�ov�j0��S��&�@������G����d�W��i��P=�4]�c4�@xGBB{G:J1�e�j���T�����6��������[�"~�>������X��"����N!_����-�����P��*���]K��6�N\��N���B�S� ��$�z�p�!��a	����Q�N��!;U�P����^���d���/��$F��>���p��������kk�-=W�(����8H���H��7(�BYQ4�"h���l�EP�4��	��;es��N&9�C@@��vJ���h���n[�V�>�����������N�?x~(y��������}@����p�R���,�}�^�av�������`�]?�+���d�Ac��Qq^4�I����~��o��Z�	_m�j�{�����J���[�E��R�ET��S1`UD ��+�p�hA�|��L�b'���9��h':"�|�Cw�������[�aK$��U�)_P�;�'�f��'��X�#;�J�"TBt���	���Y�Aj���f�F����"��� ��	.��8�����5^����],����G&�t;�D��p����E����a�����-B��\O]�`x���9����3.��9���%�>qD=�P��x�'����r���!`����6���#?���jg+����&�-sxX�G�I9e�_�D����Ug�p�2k�d/��_��6{��r�t?���E#{'�)���Z��5��Tqw=R����R�0�&;\����F����
_�
<�=�i�:���EP�-�zVPw!a��@&��^�%~qv�>	���3�>�����ARm$�~G���3���pA��p����f%��H�Da�����^\D���T���
�3���Jg|�`����C-+�����q��~j|��L�����8V'\)���N{�UTvQs�� Vw��VR�P���~�e�g}B�]���e���9��C�M?!��O�q>�F��x�+z�@��[�������E��+b�Aa;Z�F�q���m��Z������r������N�U�@F�����.GCt�@d�R��>^������U��\X���b,V#T�:'��h��)���=�����h���uD�h��*QW�~�K���!r�	3�C->?�YK���D�*$c%.�������_�^%��v�j�j��
���SX mbEi��3�Mw�E��j)D��5����zU���Xl�9�WN����a@XR�wx�;-���*P"��5�e�W��T���,>��v���5f����Bg�S�9r��4�>��7���q0iL����;�[������NQm�oa�f�����	hx
����I������g�������D�x�������S�>��������Z���0�X�M���#:_hu�@|-��l���X-����;���g����L��o�5=\���,���P���"�vuRD��	d��K��}��NU(C�x�
H��S
5���o7��8��4�"@�@Z"���X����vy��
�Gtl8
~������a��h��������U����K��b;���/{������f[%��Q�����OFC���P4�;������c��#�~|�t^6�J���C���f�EghG��j�->J���`4��/��N������Z���:�TGG������n@�����C5���%d:����\�����{�%�~���,5~ ��h�����e�@A��<�p3�`V[+�����F-;X
I s)V�	:�G7/A^�w� _;���'p���0���2��[4H��P��j�����1�����0�@�	x{�u�i��V+!��h��I/�u� �V#	t�jj<��������ab6h)R�c��}��V���;�4>U��d;��W�
�C�p��7-�6PzB�O�����a_�|�`P���}���X����+	��nH�AV�7K$&��G��Q��?�~�L����w�88��3��+��4����	�P��R2����Q8����D�>�.K{�+�si2R [45�|���^���b[�#���=N���rH,�z�9b��p3n(����`�52���:j�,po���Q��T���f)lBR[��w><���,����W0:Q' z0V=�SU��y]������NgfG�K��MQs�	��u�Tz���' �����Qi��{z�M��h���k�R�n�k�3�1M�D����?k�5������lV5/y�<h`��l�ifrF��6'��n��b.4NS��5{UG3�^Lp=��i��	��x�-��h5��	nx��w��[�~����1y�w[c>M��6�J'M��nSrI5P��M���������[
�7C���<%l�7Q�IK�=��k?��<���H��wI��t����	��_�t������O����bS!T-��l���Z��QOt�l�E3����Hx��1�^d#�@J�=�?��?ll�I�S�M�
�W��1|�l���9�3U7GB�a@�}Q��i� �yC���,���+5zCXM�3��iN� ���Gvv��pa���vg@�,O���e�y?����R��qL -�[��d`� s��������h�S �~`q��M����+R�6����-8���A�y�.Oj��c�M��`��lq�����*&Eq.j�~�����~��e�Ep%S��oB3Z�i��_,�2�3�r ���
�N��3�Db�ZR��B8E�>7�O�m*z4�����
��v��S	k�_ ^d���u���b.�79�^M���e�Ra���3�l�$���W����y+�cw����
N�YwV@�&�
;����4�#2]nB+JT�tg<�m��V��'�]��NH70A��-�KD��%`[�65�pGo�?n����l�����DL��U���;!3��|����08"JP�� �~����������jE�cw,u4I �.��������O��v;:a�A��V��mf\��a��?HW���e!������e�T���^i'�rX5��8�_g����6Os�eV��U�S5���������
m�'uPP:a���'��WE'+
�<������;
0=]��P�`�_�F;Z��n��K��<����T,�(����iJ1H}UL[v��=��y���-�x�H�2�������
�L�M�%-_��l�/�Bv���Bf$���XDQ�_�6=a����d5q}���P"ij�>�/DA�5Qg�w[m�"����r�t���B ���
�J�d*�vK��]P
4��pN(��N��U����5���OK��]�vv�:`���Cs���A ���p�"
=UwAh"W���--�<����
��BVFl2���
.��Cu
�d,.(�j����3]p�������[
f����i�q�8�F�G�P{C��l�����g}����ZG�{?��9�eU� l������(�wd4P�������A=�S���������6��3�z�����P��������.��#�ob6�����t!@���t����!�����b�����:�I�GR�}�C4��<����������Ct�N�������� m'L����nwH|�l�bh���H7$��v�O$���u��,g9��	�rw:��>�]Wd�][�;H<���v_�i{r��!j�w��r��[1�uO��(������}R�O���3Efv�R�q��[�s'����J����zb8�n��{�V�/�w�J����WbS+�oZ���3qk
&8NF��~L�[��*�8��Q�."��aY$�Jck�A'by�Yq��3M���8��G%��H�h�e�A���a��!��hh�C��-������~�|�Y�1>����^�N$�Q�iX+1�?�.~�m�D��P�@b���E�!�"K�B(N��5�>.(m��C��F�5�c/%���w����!�H�L�����F8L�%���S�A
k�
��U�w�l���wT>�%~6��JY�qT[m��,��U��s��t�5��2��{81�h�
� �`G*�NM�.^i��r��3�0^b��������"$w4{dV���/	(�(�Q�`� �Uq%5H@��+H����������2�������'+o�_����Q��q��"��!�B����v�\����p\�^�����c�DD{���* "���%T�>���
��n�����7>���z��6�	t�L��B(N$��.����S���a&��2�T��(�M/���1���b���Ti�e�CN����D7�wT#�A�����9�������_[�=�p�<O@L}���a�B9h+u�6q�� a-���]�h�4<��n�2~���Nv&6?yC4H����N;1���{�~]_u�u	}p=����15j����� ��.�9��u�v�j��������
��� �?������,��7~���a	���e�M�4�7�[�n�V�B#��V��2���0�3����A���N}����y�
�a=i�D��Q�T\��%o�
r��fD��v�8	�#���P��I�jK98c��
������a:�:+��9(�P�wVc��0�@�1�����I�aFDFB��N���WGk�������U���Q%�6�W���hn��m$�0=e?+k�
������L�%/#:�N�(Plj�h�O81m4�m�x�vt
�]�[����?:3$~�������z4��
�>+5;#&�|�a�
��C����_��}p���q7�����ki��K�0
=d���C���#5���>U
��f����t�`�Ef���_�������(�H S���r��N�S�D�TSX��	
A{��46o
�`�����9�L�8�A�\�1M���;���S��4<q�R����>1���C�7bHsV�6'�h�X��������s�h1����H�+[����N!xse��4jA��>0yD��i#'���)(8�/��-��!,��� ��;��;"���h��@)�u�����e�s��W�+E�)`����8M��N|�g
d�+
�����1qZ$2J���9m��9�a�%^jr
�x�0���X�)lc+-�f��=�%e|M!#"A�n�q��P��|��z){L�r����������Iy&��.�w���,�q�j����a;v\���V\��sZcq��%��!$!�����!It	�:�1�}����E��)�|*+��'|�&?mS����K	j����3M�4�Q��1
�O�����0
�������;�Y�iW��>;L�p�,/���o��z��d���l��q�j������H��Q����������,Y�M`�H��*���~-����6����W�YNK1n�M^6�!�_�>A+3�f��q��q  ����H$����>��B&�����S��1tF
�)��dE�P��,jz
��[Dd��*;����[��Fl]��Y4�z(��N�������H(�F�u�E��) �8�q�'�>Ba����L	��6�"��l��[�X�S���GiC�\�V�N��e1s��P��]����i��J�����L������s��;�b�|d������YO��H�����������D��l������s)����d�U@	�Y(�<��-~��h�
	���m��G����M�r�(o�i]BG$�F�&��$c�D�S��e�A%Q��l&��IY��r�D'����J��GE���T����k���~��VE�7,�#YT��������f`z��5F����6s��`4����p�����[N���7B'�%Dt��Y%+�*���!fI�g���h^����*�r{
=�M�������������%�����](�$�%��*�1'��ZBAH���B�MA5 J��8��@��]�2kZQ.�!9W�3���,��(��V�?`� h|${���y�������Q�l9��~h[�N�����#2B�lFmY������G{���KxmR��A/|	������^��V����S�1�*O��\�D���i�E?X���!K��Vl"��MlF��v��N	�HK �'����|���w�N�:�
���"�P|bQ����qk����c�d�%tD�o$el-�������(��$K�F�,�_��V`2C��{�6U�\��\9$��b��
1)f��eh$�n.�!;��|��������"�[H$B�?{�"(��[O�y�.h��Z����m�E�s![�uZBD(����*���l?��t����K�����6
���7�u�v�
?� CDHz�=��Z����[���f�3/d_~�i����"<H ������j��{d~S��U|w���
�������P�ep�9��Fa	!�f���e#y wJ�h��|��o�FFsP���~����`���y=ao%��X&�R�_]�����$z��o�1j������&��O������R�&������a�* B�6��� h ����B��kg��NmS@�A���Tw���Kh��Ym�,o�8�6
0z�N���g��5����n����zs/��O�A��m�*��M~u@�����
�$o�\���C����pP��S��:��$S|�w�6;pDF+��[ H�!$�;�=<$Si������o �G����|y�Q����o��G��p<������?���x��~��C���������zP���`����[�c3��������4�x;;�c�
~D?�����mm���Ej�����������9Q���������Iv�=j���=�,B�[x�����?���v��6��O��]�S��L)��m�y�g�_[��<`3��w�#���Y7����t��/�nA��i��G�uQ�a[���[@�����-�j��0�*D_i��Y��G��m�*�0Z��<Q�+������O�v
���}��BO�F4X����9�
l(&=�������WO����t��{�h��QV�n��u��JHI���1"|�?��\���~	� ��>��Z�h�
�������t;��-���CR��vv�*���l���:�)�!�w�`�cqP���_L�Jx�s5�������f�m#f#���� ,�����H��KVtl�OH���v�,��g���HV�l��"r�F2�O.�#VH��h88r"���q9XHG#Mc�6H��v��g�r��Z0}�8i��������Dq�J��O���O��p����dO�m�X�;�PhD��Q�J�
V�m�!���U�l������� �E(��4#����("
#C.j�o!�#���4�KH��)eq����������.9mE�}����6c������#��-��jo���u�p�L����-�:L��V�1�^��~: |G#��+3����T��hM��C+��gw�u��T������GTx�C���e~����d+�`z�2�	�����:���KH��VR�1QZ�T�R-��i���^�*R!l��1/�"$<�Az������B�sV�[m�b{��Br_�\���<�^����{�D�G����1�u��O�~w�������`���L	�A*��E�����6x$C>����U>���l���N"���T'u���d'��zK.���do�FM�#��W�~s�=`����3���g��#J5:
��=f���s<��L!��td�Z."���"7�#Gc4]$�6����?�ST2�ch��ya�G
�#��C�����`D����D�E8M�3��`�0~�.u>���������
5��b�a�u�A�����:��du3��[����E����Ttd?��	8!�@���A�L����aw��BZ��aVsH�
#�� ��-���n3��9pt������I�<���������1A(�bX�c=�0A)��a0O	��,��|���������y]C�Z�l�����d�E#����r�	��0��-~��G��P9���^������#!����LFm�cE��>B$2�~(w��"������[�pgX���Q���-��$P��|���� ��Vsb�g��\���0��� �#��9X ���9��UP��)�o�!��.��%��a�GP��r�������XGY��`X����p�Fv8TAzv��������@�O��J��,2{�t��	3/�5{�fBE��Sw�jQk���g����}����8���4P�is�s6���~_����6����K�����;��xC�;vEfj����?W�O8-M	�`�����>+^{-i�r�d�K��Q'��UJi6c.��;����tn�1��o��B2�����jI�������6��<��5���������;��_��i���cdCI����8;jpc,������J��U��H9um�I�q���9�NW;�|.K���N���� ���a$�r�U@���
�@��s�����Tq0�c�b���F��)��&���}L~O1�N,�9���Sg=O$ri2\T�B�8���3�*G���po�j#+1�w�������k�6�g��������]�z����_?X-�������������lw�:����
����s,���������+��7L�{G{���=+1dr�9`/�r���5��}G�,�w�&�dzh*��;��{�l�2��(%P���HUR�X	��X�-(�R��%2�VtrE�c��EX	6#}�{��5�����=VVO:B����C�6Z�����{
3������	s7�%������)y�D�;�}��������&�h����.�nP���\qw��,�
|����������w/�����	��tG�%����Z�M[��^@h���NsX��zs���Ph�DA��^b�><������$�wut�w�����&��?K
[����?.��1#�;��N�Q�I�xr��%o��D��w�}�$������w�;'�q'�[mYx������5bFVLc�sx
�w[������������;�����B�-��#�;���|.x�]������������5h�{��Q��8��1����C��XgM�{���2h�I�-6~�RvG�	E��d�p�{!{�X��z���9��"��^����+N,�����1����V������T�~���7d���P�3�q���������.��r��^�[uj\���f��>P�d`�|}�0�����,^�8P~\�$DD���	)�&k��?�w_�8Y]�-��	�[qVV��������{!sC�J��\l�KD����������K\!��D5���(����P�@����w�������8p���.�������}*���a�2����P���������>u�`��wx�xd�V�2 $�;2��Y����n�;����P`w��5@��8��X����/\Pc"d���D����Z��5X��A�Lj��@�{
�@���^w���}X�Gj�N�I�����
?�g�	m25A�������.��9r������$��D^���;g��1���^��
D���*2�!�p�#���9��#��X���G\Wv��w��Z��-�;��z��������x;��z�rq��������[>�����q��8��>U�:�$��r�����?_��P_}��=��\���gOw[�<�^"U��
�Bkl1h!#�A��/�8.F.T>Z���wxf�����{G��c���j��q���V�U�
�b�b������-�5��&SW_�.r�f(�\G�
*�{!S��\Nhy� ���t�DW@��#c����!o14�����dm�Q����n;4������9=��]��[�+�Q	��%bS�����}v��80��^���=r��j#H�
�������7`t�����:�����N�����j+�g��Y�F�g{���Yie�BQ������	��2V7V'�Zq�)�P���]��@`k����J2,�vF�j���x���|s������(���3���<B"m��B�>�x=��f1��y'����Ic%��]��������o1Q$Wf���"��fI17� LF���&�bhf��E���j�Be�j~�s<��T�!�Q���w�,�|���Jt=�:�w�w��b��������A��#���cOn}��aUC���n��H��QC�|	���{G��������B����gaia��#B���6Oy������C#
�9YD�����.e��QD����������#�){hV���\\_�l1������<�O���cU��h���xg��.!�8��F��B�����^(*�����j��=���z��Y�(��D3����,��L���5R���"��"�)LnLj�����q��P�\XhEF�(��.[AF��9�Jn({Z�OpX��lf������|
�D}�r�R�=���x��
���$*�>���`a�[5�����
�z���b��y����=���(V��������t��9�ou6k`!�:m����r:�_�E�6�~���bW�F�=z�o����^T�������gCQ����H����L�tf�V���(�63��������@$���I~Gzz����l�:�5�|��-\����t������#����jT���&�������(���#+Z->��
����I�k�	�����t	`�����>����/����p���\
#t)��_
�Xk��k�&�G5��=��9���<`�um�k�
��c���'P������>:Jo�of�I+_��S.j�I��P�����
D����+�nJ$�*M�q�
�7h����A�Z�~�f[��1�Pv�l�Jn��&��j����M��r���`F�=�=�}��3'��-&�r��>��	t�F	Tg��|��;��6IE�r�z��X��-�)�o��qn}��Q�K�#'��G�����B���%��O	�F,_��T���Q
	0Y^u�_����1=���/w���o�_��\D����f��I}�3�|��.iS=��������X/�����*�6��{�M�DQ��z��&\c����x�@�n�5�j�e��`��n3����(�o���&���D�
�XWk'�mr�!������1�<|��G��dD�g�������+M������W��a�>�������/�^c�i����j�jd�J��E9���q�]wf��-S���8�P���)0�\����5���zX���F��M����F��-~1c�]�>��NKY�`
�b��;��	�k'�w���}���/2��r����'���B�i�Kv�������Qj����>_�
�K@�a4C�%���;2�z.* h��GRz�H���������o��H�{���mT�57�{_T��$L�i
����"<�z��cs���c_����j_�t���\�T��7a8�r�,�b�UGL����[�'����%i�
����h��\����M��t����
w6������������aMu�Z"��y��������f��K�r�~a:���B��,ZG���_� � �V3l�l#����o����������~�0t��2Y�'��n-��E� �)rZ�������������������C�}|��wPX�+��+$�^�|�!x��l}�R}��@�~t�y{���E� ���^��h�_�,C��f�A\:����&���:%-�w���+�vi�A��G~���QOij"��-"t4h����3����d�O��c[7���j�O��������ZO�G��-��lS�$	����\���V��6�J}y">e������2o��C��}��~��m�����U�-��P��<Z��UUb�Jr4�;(���JT��+~r�/���X%5]���kTm��\|P�2���0�a�Zw�g!j�5�SV*]K2���A�d�v�%�� F@,��"��&�~���5H1p���F�6�A�r3<��1�P���E>��Z~� Yd6%��V3�h�ti!Z�z4��1(��)��]Q���j��|�>��D�����7��
�u�e
N�!���:1�9qo��@���k���+@����7��f��k����x^��V?�`�eO�n�B�T�+0F�f�������f^
^#F��K�g��Vf���o�� ��xPGBh�&� ��a�S���ef��������3D�\�� ��&�8�r�@�����Rj��7���j,I��;���|c�@��e���3��)�Bq�w��t���*���d�h���w�f>4����������xD����0�T��O��@L��a~T�s9����{��t:������z��������n�=��KK����Q�z��l��
;���J���36M����S|+�
1V�!}�Zj���
;�D�D6{�}�.c.0��dL;�c:S]����n����d�sw�����{��DQ����qC�d)����Bs�(����Q���Q0 �C�����������'��/�2�`��euJ�]�8�����~��R87�u��_5�h�]�:E������&�a���Z��� Wd4n��
yLMx������h�U7�p��`���k�����������1/G\�n�a�*�ec%�=�dO�^r�r��_����a��q��	�����f=����2h ����L���$=� L��	�������=�
���{�Dw�0zy	�~P��F����M�nM�%|�����-���#�e4�= ������T�J�7�|���c�UV~��oFD��Gg}��"k=��b�+�i!���A2�Q��n�a�����-�*;��XP��o#	�S/��3�[��w�U�
4�~�/���d�o�'IZP�����5�0�s�e�������s!���%MC��g�A�w�c$�Fv$LT����|��'�C���>A����rh�������/ez&���Pt#]8!����X]V���?A�z��+1��n�bHe�����=�wlD�	D�N����9>��U��Q��x�/uO��}o�,�0i���G,}�r�S��� z�����=�������;�4'Q>���O�OZ�}�'��Mn5hd(��2*!,O-�rr�d��!
����G��2�=2�B�G���G���:�V\�����]�����$��I�l���1��=��$�����6�B����;	{�*��!S���D������DC��9
	
�f`�[������Jh�3���B���U'�XEqo��Mkwx{��y��4>���+�0<��<#�j�)��:K��F&�i#�+%���"�P�H�lI��	}�B�5�D9@��a�b�W�d#���i���������bF&�p�4�/K���"o��{����
CS����0�B�i�����h/k��7��N.���[��]���zc��&��>��hFl1%���H,����m7B)Ul��[(o$'�5��)}-��O�V.IF������+�#�����&)�����)2��0G\��`�5�����%�E=�k&d<ZLq

��*v��0�l����'#Z����1"~��i�X�#(g�X����D�F&t~S��5G���`?�`�t��f��:Ov�FN�r��l��9��ET�����������I������)�������db��H��#��k?Q��W��G���������9v���\'�U��*�`���j�qE�D����T���]�0z����K���7��,;'G!#+�PIYp�����������f`�=������q�c([��`�D4�P�5?�V�����/G�Q�6����t	O8�!T�,�:Sz\��WL��P�sO�8d����,"���0 "D�C#����S�?{M��?��C&�-��S${t�AQN�^��3�!���c�&��L��r���d�0(`\�a��IC�m���o/�E(LOA�)x��^����������f,&M������0�aBS@H[V��E����G���Np��8q�Ac��Qs�\E�����~G�5=��}`�yN�d����+������s��!�R�j�5;�����8���5���O|4�t��T�h`T�w�Y�4���Fr���;"��'�$�"c����Mc
�G;��L��@��y��~���:�s���$%/���d�$��v�������AJ�Y�0}?y���F=�$��%��O�}rf-hU��
���pK�D���,U-V��@���
,�����6��5s�x+��T3&J���&�hU�]�}=S9J7�����m�5�7[��C����r�<k�;Gu�j�L�
��b=R��d��~���;��L�9
;��3=3��lq��V�wO��-iF,�W��%�d0�0(�C5���V{�k�}dQF���_#G��hT��*{���$�n`��v&��������n�����jE����K�h��z7P��B�K��Lv��;5���d�l2{��������f��J:��B��%"@N��:
�Ox����s��9��hr�9�2���5��i6#d@��i�@a�B���n�qQ������</�+��G�����	i�l�5P � S��@��xcS}�I)Xw���2=#g�'����Jl\����4�F���Fg����h�hw4$�s����T���$���&�h�%��5��I�sE�%0Mu;�g5�S��MC��X~�46 �=r������4,�t��`�|����T�����~����k��������d���Tu�0bN�zQ��s�5��f�G3x���
l�#,�J�,�#��F1K��z�w��W"B��5|����^n����>��G��{^sf����W�W�����.	3A�l�W�L��2��d�u[�
���+������3!�����#�������N��7R(�Err��It��gb��������S�����y�����%k:�V�"L@��@��-/^�$���L��7["�����eXaR�=Nq�5�xg ��2� _�1�%�YN����O��Y�^�b���Gm�](�#���8<�)��mi���������*����Gn+i�W5sW4R�#��2��n�0���%�`
�U���$6gb����eB�M����>�����W�
w�Jx ���Uq�W�%�%��Cu2�]����1�?V��7�Q�^���X��I�D�~�+A�h�3����W]�f���@��De���A�:��QX���"?�!��6(D�-.���w�Khd�������w�AQ��{���%�*#�i��e�4lp_��Z�R{k=5'|-���1*]hRt��T�.������t4
u|�v��[Q*H���W���
��*{T���{D��e`�����J�����<N�%�$��5a��h����#���S ��{�La���E;��p������]8�`@l�5�1�t	v���}�1Jr��n�Pk��$h���*(�X$vZ_�T�����";L�*i��f�
�������lX�(�QQAc�m��K��h��0Di�X�2����t�1�t��lU3� ��@��xD�`����%������$E�#G�M��ie���H0����C@�e\A&B�!���2�`�-�����A����Jj%'Zu��Y�r���1~�8�+�����.(�l4�P��X�J ��VX�gtA{��[�b�8�a^�O�fv�Q�>��,w^l��]��y����}�������{�N�@��!��nj��������}F� 8`�N�T��w56��Y
q6y�$��	l #��TS�H\��Q���$��-S�Orgz�
�����@��ahA�:��'�Q~���*��(L������S"��,�;�W I!�?����G1G�$�~'���;������D��mT��#���f���am>=O9j��m����8�jM'���pA5����������'�����v��X�;�����o��N�m�`@/��A	�E�����0�:�z��?��B�wL���^w��
�G�Q:4iI�@C
r��M"Y�������X���g�4�[�I``�O�%�n1����uK��UC�[�������0NI
h@M�mP���"�e��	h���s1IB'�����l#
�9k}���*T��rZ���s25��S;P���B�n�������������^�|�^����������k�������S��(����U��t���(���� �������DD#��6����6�P�������V�Y��p�?1�
B�wd����sQ�6� �e���jS�^'�lP�y}�d�q�:���V���
4��\����0�>:����k�xm3���(	��g'�O/�=�������0�5k�rv�@]�=b���W*M/���
2!��@f8�����&wx��?k�c�X�W5�S�`A���>n�
 n����B������=��Iu�w�\����%���3
���Q�pWh�)C��&eV!~����.v!a�t�m�W1r�V:��) ������l#
�����������3D��9��{��&�#:8HH�j�n	[qWB�U-�E��HP���!8����&Sr����;^E��@����_�K���b��Nd���s��L�fh��u��F	%�����)�N�b�&tg���?��b��T��FD�m0a��3�����S���U������b2d����]���`L��Q]+�R���Q��4�u�2O-���K-��F����P�,b��B#}��ZVU���E;A���,�E��Id��m�@G��A3b(
wc���NM8��)]#��?�N��Z�����T9�K�d�'�����W��h\�#��)�o�_���iN��{�-@F��r=�����L���(3l���Y3����Q�J
��w�;:)��
�4���,P�1����I'�~q����#7�;��N��u����I�jT��d"�r���o�.������0���U����N��)K�i�7���
4��;�Y��%�[�� ���s1_Mkf�x���'���s���!t��EP��PlI�IiN���g��L�NL~����o1��gt�����U��/:_E]��������)��=<23A��~D'���e�����lmNB�g,�ChA���f��?��h:P�|���/mj�z�����(?�JXI������>��*���X���O5p;�Z��`�0N`6j@����~����B�'�_���%M�%�&D���L�r���/���,���Ta�����/�K�9����s7�e��zrg�Q1#�V�o�1�.��,�Kl������3�%�R��QkJ�/�@���g��{�`l�O~b���+W�h-���Z~�'?��;8��Vpr������`U�{�u<T�|V��E	���J������Q+�t[V&`�$M���NR��ZM��dh�v�_*��Lr�D���f�qJ���e4���]�+2���?�5��d0X���I6e9� �������O������@�l���������/�Do
K����Sp)��$:�>B}r�$Rr]e����v���Pg.iS��:��|"@k�U��`�����v?qL*���.�eoE��w��
?�O�Mt?fB�������o�l�������+y���:%���;�we����T��5����u���w��,q�����0���<��c�zG���;���ZS�V�64?��W'����
L��T/{R�-*>�o@��{
o��X�F����hW���v�W���I����UJ���790��H��������!/N�������7b�gD?67���;�}���4��|������)h
}�n��O*}|��(`����M�N�g��^$c��W�9��#�� `�;�U�Q�T���-�_��E�cy���_�k$_QL���h�%���n���$pe�X�#.�{!cJK��]�\�|�~5�d��fvK��&�C6�e������z�%�`U����%b�C$;���{��cC�R���E�B�-G��2ckw�������)�9}/dc!V���V)��>dr8y����vH��� �#J����������0�ru�`�!��"&��_o�#C�.�UI#n�h�	���v*�
�y�h�[�Ct�.'�8y��/|H������8�#�Rb��!������t��W	�R�����{���6�~��zfb���/�� ��H���tJ���k�?|��.�!�����:��!VF�P��B�H�k%�VIg����D��.=#P���[4�*����/h�4i@��S5z��6.�����D�bQ������Yh��T���(AI��\������BO��p<>"_�����huE�Y���0M�O*��5�_hJ�}G��;q�a�G�2n��Q$}8�
/�~J������?�
Xf<�'���6J�{�G,	gO�������h5�A�W�<���o=���y�@WvZ����#�b%��������7��{�_�{3�l~��^��9v2��l��b��h;�5��}�NU�m�hJ�?��6(�rCj����5 "�;���xlP�>��m����q�pm������S��������=��<�{M)F	�x��a�#2�JR���q)��=����j�wFX ���tA�l��@K,�%��8d�C�c)q���K)�W�,���
�0��A��D�i?:+��KR���SJ"��W�#3����/r����5<��O_���b�n|�Z�Kl�e�}nU&a���K����n���9��\����PJ�����\L@�!��:��J�=�)S���,%��V-��7���;���'\���] �S*&N2'��]�1DQz��v[�2`��q�Pt���������`H�J������nC?a��)��Q��y�zKAY�0����)����_>���Ec���!���;����x��B�"D���T"Gh%��C�"�U	��i����R�M�_�����epn1�����z�PbI�A�t�������P�Q���|_����w
������X�WH}��_)1'���&���|��#�h:��]#�w���c9j}�(T��Ky��B1��m-F/dD g�ee�=�8���
4y��i4��:7��K��2�1��8�P��f��j�����;+d�(�1;���4��^���0��������Q1<���6����������N_�}�M�y��m6Q]75�.�`�*Y���W�1vC+D`����8��4�������
�Z��xi�DQ_�hC#���Df��%��62QV2o��t0�l���H;��
s����x����a}�/������c0yA��{8�.,��a�0%�#]����h��� ,��P55Y5�<�!���U�s����]����}�
:�66%l8�����
���8�����6��oy���{�������`������S���o7����T�z{"�[+H����Zj�G$�����hxJu2p�`��"��U�@���7ji����Z���fWg��E�����wQ;����M�[����-����M����Vt=�����(��]B�\T
p��@�4���1I��Q�p+�O�ew:����P�R��c=�Ls~|����mV����=C��<�6��v������������a8D�*�Q���������d�;�t���FHt�R0�8Yl;�FH6��jR���i�/����� ��K\�'�Y��j���5����}AM�	�f���;�o���%.�
���)R��!��nc������ ��A�C5�		�,5�
����B�f�?8�a�n
|y>#?����6\"��!��P0���	q:�����6�s�!/�l�0H����W;�-1���K&�,�B����zJ	���{HF�����(E3�`�#(e5��	�~�d
I4���"
DE}Q`��?V���tXyIF��G[b�X�e��L��`��C�b�;P4A
jtt��#���5������������3bJ�O�.�7(V#;6�2��PD�G��?"�J
n��]���Y���/P�Q
J�v����� 42i�������~�A3]��X�B=��p���ST�dGa��-����goy�_�\�B�=�Xc�T�&Fs{�����m�x��3��������?��$����On���&��
�&
���T�&X-����������0[�B��RWj�mss�U��2�K"���P�q��JO�>�
�s��� �L
(�(�ey���i�L	Y��������0�|���C7chB����������R
ML���J�j�B8��[f�Pw����:���U
��� �����.Vt���-���:���,��j��t.d����A%��
�@��������I��3�������������}�h�5��I)3����2V
P����b;�M<w�RdR4��Fv��B:�e�ho��5�S���g
�����N����s�<%��I3N!k@����x�O��z}-��T��|�uGW���L��*���C�e{>�3��P��*���N�gA���:�66<�������c��f���4<A����g
�?,������K�����
s��I��|b��A��A
D�i�$�-_%���5�����0��'-w�R	�\Z	6�KH��/}���i�~Z����3����N�'�ind%yP����=N�2��n5}���vh�Eg�V�q�+
T-0���F��x
���Kx.>�Y8��_Bh�jKA��:�M%��VV�F��F}c�R��������@���l"���xW\��vy�X�z��"�9����v�Av�kF#������P���9�m��D!��#�0W�fT��j[�+������u���`��%t�z�4�9l��[]kg�h����^cB�dO�}$hE��p�La'���I��|�� �tBy���d��q
�a���$��8�-�P�V���5d&�=��c����3(,�G������D�f����3�x��;�C�Y�f��(�'3r|��yG����+�
b����%���[�kDXm�5Pg��p�5a��d<r��Q�,x�eR������3���sd|��9DA�h�g]�]�@��5��d�_���K\1��W�.&w�gm�������)��})������Wv^�+U���9��J!"3����0^�I��2b����<dw_����}���{���>����IH=��7���H�V��[j��e?����>��/�ZA�_�B�n��/-��9��s���k1�/�K����,P��b qG�"�j�G��(g����ohm)�o��_��
)T&��apv;�}���p���������H��K����P����l!2�!j~������XIm$C�k�E���l�a+�����`�@����:�y���.��3���]3��T�dGiF�9��?k}W���q�� �������'���)4AQ���P��F&=@���)>;�g��(����c�{*���Q��X7������A�����=���1�1��������'����*���=h�0�U�)��j�C�^R&�C(� x�Dw���y��
�Kb&\~��
I�� [8��]��D�n��!Z�z�9�1�Gb�%�Ft8�>�-jUb��^ce+�[���������nX�qy�o����I|�	�s'2^�1�>9����'Q�
a��%�����F���dNf���4�����P�JMVig����m����e�z�;���9�}�<�K{K�x7U���RP�Q�#Q�������B����'1�:�H"
_�A����yjwG#��AvL��Et�(������7�fN �{z���Ow#1�G��Gj6��
��H���]MUt
/y�����G*��)Omo�����'\�N�dtb���'���m����r�&GN��f?9���f�AT��{7@��UK�J���ZQ�y���=W�)���#%���v}P���Xx�(S'��uc ��d���<�~H�����;��e	����t����m������1�1����8i�O���e����=����z��!�V72����:��7T����O�Aq:�9�5�������w�����L$z�n������|��
�`����F��6��Pl��`�2^f��|�?�(��3���G!��B-��J������wg�����d��#�~/�[��_o�-���������D���S�}�E+�y���
X(%\Jz������
q�Xk��E;q,�v��
�)��q����d<6<~���kf�#�)�_������Z��*����[���?=��/�m��zP
i>�����/�
rOXn����W����ahB���f�H����Y�n���'I��I}�����t�DO���]��%���#���@0��M�������F��,�iF������V5ZE�?�=w�%Tl	`��&:���_��z�P\qsL����v�|B�c#S��Y�E����H�[�2��H��]w��z��5P�`�p�%"�C,�znPS�����%��9�L�F
���<�XX���GJ�s#A���`��k��?nf�9kLA�>������mkw�#>m��C���_�4Rz��`H|��v����+]����-������?����{v�+��O�l	1� ���v�aw�w���0����>�R#���q�W[��E;�}�(3Pseo�N��H6�.��'�e��0�����M�3���k��/n]/���9�3'�?([����(8
S@��1�/��/:�!��L��m4�>h�������P&����d���CfP<��n4}GN�u�9�������Y���#��lF�S��e��0�h�3	��~;���)��4�
B�����B�. 3���W��ZHETP�������G���q�rE������L���u�]����h����R��(+��NF���� W�&�my�=l��!�5S���Zh����H##!�*���dh�����2#
�3�_6�Wl���*r����9��>�I��y�8�Ni���6�([j�P7g�
u.��f���'jJ��m�WP�l��f��5!.��T��5"�X_4Y?Qg������������h������<"f�`�V)Y@^��H�S��W?���	�$t��l���3��88��K�����_f�R�l��F��s!cI�#����%�m��W#D�b#�O��-% �5�}^'������v�s~G��0��|s
*���R�Z�f���B��ix�����Mw�����J���@�|����nx��G�RjY2�������{�l�A��Dg>)���7�F�Q����a���3��1K0�o�$���\2
9HvQL��f�3���_�I^'�ny��vCX�����*B��'��4����=�0�L0�me�����0K����zR�	;���a���D�O�a	��=���MH�+,B7_��2(!�Zf�:
H��}��q��:A392EJ�C��<+hC�@,�i�j�G	�)�#�'I�K]��E�@%�l�9iS�������E�RK�5�������������G
��a;�M��Q�j0�Tb!�+�]�>�S���&
�gK3oF���`��b����h��OU[�����_�U����]���<��*�$��`��,3��L�Um������R!
���dV�A�����[!�lW2,��A���:s��D��7n���(��Vd���:
Ly�I
�az,g���|1�a���.�-#��_����hC�i�B�fw�(��#��N��I
f���	�����d���g�l����4Z�U���Myc!����������hC����3~!�@<s �o`��a�8c�W?�
6��x��H�R��<�c��������Z5�9�M����w	G�%�YN"�N��>��H�['���0�Vu6�:�a,5D���)da������h�#���x����F�l�16��dF;��2�U6{b���t�a����6K!�dv
�rl�'�=d�JD��S�������s�X�8��vO�����H�����+�+a��&R8��J��E����B�w�B+�(�1R�u�B�������iPBL��@�iPb
���R��e�+R��`����b��yI�V]��wec��J&Tc7�p�qCd��&�5,cR�2j�zb�8�����P���lI��,��N���
��:"B�2�a�i�$�����)��w5��eLV���R��Pm�Jd���9�'B5�8p.}����T<$��a
�'"=����\(	j��f���>�����B	
Ad��D�X��/�D�,�j�@��
{�����Y3��p_�]�����+���"��#z��p�U���C���i~�n>����BS��DQ`�3���~��<��	a��y���HH$[�%�6i�E ���(�BX�l����0��N�+�������;H����dP��M+^K��f���CC����	u�Nv��[�-�����������
D�_qX��Xl,�sZPk@n�[��%`]'h�������y�6�������+I�M���6��E�����)��������@/%�t�-���%��a+�FM5�6��b#n���A�;�X^Fd@�U{�Q����elA��,�iMP���e�4Hx�s��l�#xx}�K��f�����C�,�;�zZ1YBG�e����d�|�^D��[�i����+��"\�[���k=P�����������s�P=�l4A�8���<LM��A��e%)]�A\�5���19������4Y���6�
Nh��if��l#%�J>v[�n��Y+p�>�`i���cJ+�q�^�2�`jB.
j#��\F������D����C���'����&�Q�jG[�q%ZB�ha��Pc,�.�J����
�$h���$sK�f������`�a�zg,���ji]���F��N��|�����N�?�zY	�8X'���-���%[��Q�~����=�Re����OM*_��#}�@��u���������`��e����"!Xue�ASIb������FX����Q�g��~�5m�����`���h�>�YD��j��,�6y��8�h'b����q7X��W\�b��'��r�
WQ����	������yGQ!A���.v���T~:qh[�1q��l��?,�"���i-b;��Lh���
8}Q�L�7�?l���2[���I���$�#�~��_h`4�h���
���������]�CS� �$z�%�#{OAf�w`��� ������8�������	V���e�wF��dd����N��"�Vt���6��q'�A>8j9f[K����w�H�h�7S��Q�`	���if�m�XF�m�����O����e�o�f�N�b�|�gt��+�J���F�3"�vr�'�S�=@7|��f�j���s`;�J�D����yA\�mTAq`��G\4:�������P*�������Hh�6v�	��S��[w���	yk��,v��~u�x�*bU���T*�c� �m<A�)��5j%�/4��������*����)���*�P��/�q�����:��s��u����#��J����e���9ib����M$�h-�d�qh���P������
��E��m�����HY�lA�h�
����z�K1
8�$:�VD��Pc��Ns�n���sC300�z���A�T=��k��+���T�ax�yGY���Lc�Zm7�|,No;D:O4�����}���?�o;����$IJ��,,���U�?���DhS\	7e�M��������$��ge����!���
G�4��89���d��-S��X���C=Z�����X)�<0��N���L]Yi�%�E��f1,{O���o������@�Ww@W�m�A�Hy��N(�D��6�0�q�>9��l �Z3��r�+����=k��v����������L;x#����	|P���?iAC��N�2���!�'�S.$2Y)��{�y����D/H~�y��{���OD�N�'A�,|�x��9��F;�1x�l��t
���~It&�^E�<��K���{�r��q�-H����������$B�����f"�ID���}�h�8%k�<6jv��

�y��D�c�A�M2F�n�n���W>d/yJ6Z6�E��!�O�\��S���v����R��3L�>��y��*P��q��]��m�y~S���#<j]�Z�X{:��?���1�>�/�.5�����Y��MP��Y���['
["�6��@����wh3tm�|�@hyV����A��I����,��$IZRO4n������6WF���dy��8F�)@An
����'�Zn�(��Jk�����&�3_���X��-��Zc�#G��;(:[�I�5%H�Z����X�^��q	9��_�M��#RX���48@���8�l��e��I"�Q
���~�����J�?k������p�c���O ���V�� �����<W�e	��%�<��g�&�}qUb���xf���8�'�C��E
�q
��9F'�b���o�/iZ�xI�Q�����D�+��*��*OB$1�L=�'X=f,B����3/�cB�����*]!�#�]&R�D��������U�XZup��z�F���b&�����zF�x_]@��X-��aB
�����4�AQ�"���� ��P�u�L����^Fk��.���CHi~�E��R�����]����W�!�L����[Bt�c�B�*r�c��N�6��R���K:��'�����.*B)��T��������c���t�tt��� #��$B��j�Je�'��!�&f����n��x�9��6�;5n] �~i-����4b�Ox
�3��_��ao��^��
��4<��P���o1�62�8C v����:R����C�;���5��>�_4��z,���$�2��k�r�&8~@��G=���p#��'��<��"��;������W�<_E�;�;�^�+���2�AC�,b���XuE=�������^~�S����[�������	�	�$��wx@�7�D}VW"�E��������L���5�O��^��$�[�/���J<(�ElR4�bp�'mRi����{�?O����O�/v���%���hzJ8�����[�{�����M�q�t}���G��B�~G���D�i���>���]�M�}�p��h`@�`���(.����}-��p�� W�ra#M��
�A�������@W�M�d13�pwpI��.>IJ`��B?�O��<c���D���l_{UtXF2���O���O'R���1�I����;��������;�V�~�N��t��k��!�B�X�O����������n���J%��w����5I����kd.��o��Ut-��T�EQ6�<�^������2���(�]��!��������=i�#Kt��� ?��+P�au��{��_�_�.�Z�_o�@Y�reUS+B=��?�����T���&�����@���\a��	"e�n���~�A�����ZhPq�^�-�;����|�(��>�To��"�Z�M����b\�v�A>+��w��\��{�G�O�Pbh"�W�7ZA�|�{�Q^6l�Y�LC"}GFH���F�I�[S���� +}wL��W�$�	�?C6IkQ����������Y!*���{�1~����b�"����N��#]��?#e�;��^�C~����9Q��yjIc���2�}���&���
�O
#�y���L�y.�M	�b�#��^j�O�;���Lh���^(���'�9�K%������<i��8�n�$������|�54(�2����Z��w:��A23����gQl���|����[K�T��$ >���K����������`���h*zoj�	��g�-�Y��P.�����T����0����%�>�,�*�OT��Y����1�
�Dr����NY�@h��o�DhW��X�}�
��y#��x*���'� #	(���HT�� ��U���P�[�#��Z��������f���f��`�T�`���^����������I�V;�{�9B5\PdI�"�������%P����m��U7L��%I2=�_�N�H�^�A�ihnV*[~/�w:mU�wq�a-��J�?hM�5�	e�5����L��"c�Z7�o5rK�F�Q�����ld���dd2��y�#���|Qe~��*����b�a!���?)�� .���?�7A�
��+JceD��%���
��ph���+��;K������QS��2e����`��T�M��o�%��{�sy��B����M�#�f����u>��&��9|���ra�:?"���
6sG����KT������iT^g"U�w
(d��.�I����M��b1�{�^��o��P��
`��1����2H�~�p�":�������(�]����iO��o*qX�e�����We�f'��@Co�Z�p��fsh����O.�(r����!�������_�d���Zk�sS^aI��'>�~�P2ZK4MnJ���7����G��)U�]PZbWZ�c�wa�^9���Z�������x�����F����y'9n��d�h�{+����nJ�*�oPY�W\*��(���C:���@��QT	$"����~p0g����57-�a���cd'�X')=���:i�_``�%�iF	����N3�w�e����4�0�Z��������{&fu�+X���P������(���#�t�F.��f�������Hk5��$6����V�6�yzF3���$D+��)����h)��4$Prn�2H��I���2�>������w
E��[%����3D�WJs�U	��F7���h�����3��B�5L:S;X�}h����FkGM(4	�~y_E����G�E���5LkB���=�j�?��R��-���;��`����#���jhY0D����A5�+��#���������3d��_�D0�D�9.���z)P�i�
r��!�f�jr�#�-��"^k��4n��p5���~PTk���P�rM4z�1DZoIQ]�a�y��.c�)]����o���A���p����T?}�-?Ir,���!x�~m�A"@���-9<���|m��p�jb�zm��T�� ��%��}+��@���_���(s���`�v�A��C�� '��P�B?��a���EJ<���VC�Iq���}P�����)��]v�|� H��6��\�%`��*�E��Z�R��l��Vf{����>\���N���jh��vP5!�%��TC����\���C�^��=������jMr�6{����Z��.��K��m��WdYU�o��ZG��yW)�J��mT�C�+|�����R��j���G5,�=B��?CQ,�6�%�	������E�BW["���9����bqn�j���7(���8�m�*�zF*�%�l�Q�������$/qiS%S]�j"���U��
9ZvVe'=Z��������g%�q��`����CS�x����/d������A�]���e������t$^�o�Fa�Z��@\ej5� �I��H]�;�*G�)crD��!tV�v�C��Q��1�c���hu�t*����n����/Q��k�AY�(��E�+I�{���/h����B1���g,��[�aQ0�;�G�G#���Pl[��5�����J��dz�oL�F�%�SO>���~-�0P���'���y��YQ%g��(���v���%|m���Q�������C���Z����m���9�!6c
���pP���������������6����:(�I��Ut�?1���������I�IdPw(��EY�8b���l�Z�����f8��4$J.Z��p0mV
���Gt'VR:�U��\[��`�rD�;rln0*�Z5��[`m�bd��u������\����t��>�:���(�G@��V?'94�-Y�V	l)P��S�� >����;[��~�����~R�~3�a9bv��K��]��������h�YK��#c��]*B���-�O5�6�]_��>�U%�$��i������]&�?����=�<����E?ql>p�j;.S�7�z8���pE�v3h�@K��2�p�f�i�i�c��5c� 	Z2��P�x���� �Qi+q!��F3�2�T��*�����Pe,m���N�����|�c�>��p�����F�f��@J�|C��:�"��U�H���j�3S�6�%�c�F�xE-qE\;�g����e��f�C�5�����;�yn8$��8-��;](t�6#!���u��C�q@u��^���qtR*���^��Tvv���,����:��R�x���r�B�:�����Q-:|o.����r>�v���~|HA�f�C�����A6�-?i�+^y���?���D-nO�.1��}r�t���5C"d�Y� ���X��G*#	�dB��mC���>�O/�{&Ai�_�R��7�q�%+�O���2�FS� ��Zj�v��cTq���K�����ZF>6�h;18j��'����Hi��^�Ov�V=B2f�����*5�uP�.�v&��^�]P6�"v:I��'�k
2bIZ���(�Gg,��QZ�OO��q���
�
2���xI���{J��3�������*��D2�����~Hj�d|>���>�$�N4����%���L7�������c�����Ba����#����A�/�ZwK����j�.��.�@V�n�c������cU��"�"/*���L�e�(M{�r�����&G�Q\H0g���7�E��o�a���eVo�(#6H7����f�tzv>f��&`���Lq'���,�B&�3s3E��-o��SD���������G��2e,AG�ntc�_q,�F���-�LY����S���*�0���4d^�=R�@k7���E�A�����C���^�����<����c%SY��PF=��`k	-��k�C��TH�lVy���i�@@eO��j���R�����kO����T�:��F Z��L�j:��G�����8E�,��I�(�����{����[p_��NbK��c!%����������g����A�Vr�"����dX ��@��/��W��r���p�8��n-�����xE'���3p9����?F1p7��`}��G����.k_�n��U4j���j�D#O������UJO�f�������u����'�m_#�R������0�{�WjC�����U����xA.D�j-K��/�\g>��fQ�z�qh�EO1��^4x�Re�L��g(��"//5}{���&���a	���(�g��~�-��Q��&V�&��'d�	���Q��I��NP�B�N78qW?Pe��HA�q'
��zR�m`+5�3��}q���G�>)7k��!J�Mjw1��5���8�Vll|�5:!\�.c��,T��N����|G�6>���@zg��)�� ��'���~`�~*�O�=~;�b�I#�k��9�
U�dm1��n�B�!j�kv�bKm!��:�b�G���v�������3�Q78!����G@4oN��%*,?O�h��{���/������=E�����u�����<�1?'���� 2��rv���[��H��N�m����\{�x]:N!��0�!�2�}��s�'g�O����e�K���0��l�of�`yD���K���+��(�,��� �
L(��<�KX�o/����	y�3��0:!�����a�������h�O���;���2k����J�F��J��aL"���.����'{O�������F���w��_D�a`B��r�X��b���	dK@-M��D��#��)J���������{�8��	�� "�	�Y�����y��53���h�fh�XC��E���&Te}6����G����z��M/�(8�������EP��D�^)��F	�L'�SWC�?�Y+��x=t����/��Cl�[
��#��nD�3�G���#M���E4��M�X=��Ve�G��{�d|�aPB}Ec����,�Rw�J�.�j�1��p���D]������������g��D"���`�]����$������]�ZNIF_�a���k�)�������}���!���o���]Mz�\�b�����
��*�'�������a�B*��������9����s�]�T�N\����<"�����}���D���</^b:U��>�"X{����o���������a)���8�"���s�#� F����M��izK�{m>�>;�P���>:�+�z��6��(7����2)�:���+�+��Y��Acb�|���u�:0X��0���%Y��q��YE�vDq����0X���r�<����;.�wl���8����V���i�c����i�-�	��Kf�����
e��o�o��ahB�6��7����q������TW�&��K�#vP	�W��4���z��E�F����F����������pC���M���xR��O�+P��T���-'f�����C&Z��Q	YD�Jl#Hp��+�F��c)Y���
����0�N��B(�4$1��em����� �*'nUE��f������'�wEG�����i������r���W*��B���B��#��L2h!G���A�{�><���v3y�R����+�������Qk&�[D�u`,�4d����~>>*�*�f�=�m)�^K3��n�M;I*�:
_�U#U:�L#�Tr��4�s&�1���	���j��&D����N����
I+����m f�	y�� g�A�7�(�RMc��5�H�1��6���Dmn���O<=uu%���l��H��I��l�8
UJU��c��|�a	�1+GZ���������ZLT���mNpyd�$t}ZA�k��u�-�_�����1����]�?�I�|�������u��3
?��t&vp������5��t&�����bO���c����\�������K����H����@�>�������$����L���3�(B��%U���bg���c����zzX�	8G�>6���i�Z��4z�����XJ�:3y���n��������{m��p3��d!ONJ�f������*k��'gu��a��D��8{~��;U}3X�c��Fi��o&k���l&��!�w&��
�>���]���ce1y&���Z�6��3z
�q�So�����c�<W(&�c���������4 !�S�[,7�(�1���se����;����j���DBX;s��h��H\�jcZ�&B[f����dm�����W��>w�w�����X4�`C���	�$����4�Q�5�*��f5���'[����GH0<a'���W�>�����'�����v�NbU>Z��t��$C��+�]7�����a�J�G�^b&�������i���<�m���N���guW���
���s��9XO�|�G4��~l�ujZ�3P%��D������<� [�(��
W�M������D��%b%��X���g�t7m���h�BI��x7�-��%�h��:h��_h�DX�
N!�zgOz�M�\W�0���%���h{YA,f����ue�����������W�����?�����@�.J��uY�}%C���EW.��.�J;h'��� ��2�!:�h�upW�����&4<aH!��p��Zr����ll��PD��X������v,Kd����W|��I�!m��Qy�!{�������������DaF��O(eb��X*_�EX-�'�~-��k�9n���d}�Ph�����I�h�W9-%2d�d�(,���?(m��s�VK�4��������N��^BD��Y���q�X+�����	B���/8q�R������`br �e��]�s!S	��*\}�x���L��^�x��E_��Bz�xH��>�/����z;��P[���wd]���2��mQ����1��D�������"��\F7,����q�
�{��X,5�������'��$�p���2�QP�2�!'�T�m��'~����c���[�h�DN!���6��l��
uW�%�"����P�` }�P�mD��Xy���b��w ua��=���P���Dl"*�j?�U�=[M99�{{T��Gd����1X�J��G�]���+Q9�-�����+J�|�2������d}��h�0���O�
�n����6��v+��R��l�����P���.�M�[F�VA�C��C��B2EK@p��CDa�"�	`DS�HFG�����E�)�������@w��-B���,<x}!��q~�b����� A�2zai���j#m���(:�$L&l�Vb�l���%a�S0����+��[1��O�
R*��=�8G�	���g��'8�s^��]gt��!n%�����i���{��I�	F�'f��
}��{�`��N��2'�6��9�x�O��g��Pj��k*}v qh�#Z�6�a�x5$�0%�&|���#[��~�������_����v�����m}?����#I�+��o �Z1\{����o�_�+���6�Dv�;�V�9>���R��a�TdC9D���6�N!�*����v��@v���T���l���m�1�X�����dI��������:
�)D*�]c�8	)BVp3����7�0������������Eqh�{12XhkOu#��$�;�.��&��9��=�j=cV�����r����|��g���m�� ���1W���t0l0����:��;��h��w�����GAG�m�C�gM����=/nu������dHQ��m�$�U��CB�wD��K��v�Di>�G(��]���s�z�l
��k4o�q�`eS�����3z��3&@���jg��X�\�Q
���_���.�JN�;`�f���-����#�g���E/�����p�4d�b�w6�������
T�����%;���g,|uxA���� 3��(f�/r
������B������kw��WoA������H����or+F�X�6F�^;:7�b�0�S��F"���zQo�m �N�2���+���,Uap-���0�����c/va������ �F�"����wa���x��Z;chV�T�e�6N!�C����l
B#"c��/��.�����,��F.D1U�0,ho���N^B�=j�=*����Q����:����R!*� �4z����2���%����F�t�
���p��]��l�
in�vo���W�(���kGl�Z|<d�
��*�y�66Q�* ��$�:wVM�O�u����N$d��IL�7mc!�����{�x��W�5�;G'���>���K�N"W�.|���6��~��@�0n�����#���;h�<�  $�+��<���wr�������Z�nr8Fb����rK\���y�FAh�1��$�,%�Y�	�<����hIf��:Q_�&	��N�2's�*����p�__2��q�V����g��Tt�)��GwV1�'P4�5��d���/���J?	c��c��>w~���U<i6Y>�
�7�D��a_8����;H}j�����1g���.�,���&j&����X�{��-�A#�0����~�A�'VQ���*X�:�����#�
]���=��l��uTO��.��|G]��b`�c}�xm����7��-
�62<->=�X'�Q�)����1�����/Z-Q8���[�X~������VP��#P����	W�|�a�{���������4#�W��$�����BU�K��<��O��R!���W2]�I��Hb-�y�MO���?i�]�\xj�^AG$�cLB9,:��Q��0P!�Ye�t�<q��8���c2%�F�u���xs�v�����=[jgs�X�\%z�f�"�>���x"��Q������O���i�1����Rc+��e���I�Gv@��\c�K+V5x�����������lu1�QN�%�e��h�=y(�Fr U���5�>
����v�Ki-��Nx�|cO��� �����C��d���������"B��ctC���[�G�w��t���0�S�4����K�['+������1��W&v�`�h<����1n�`nU�:	0m�I�E�.����%�����WYQn�B��>w�g��Q��RKz���j��U>����~L�g;;����Y��
�.�Z�����!���pt$$;QW��������}GV82���t13�t[	�(�eg��w��������=�{
���N�h7��*����?�6c��EI!�%r�X�=�-P��J�������s:X���b/�]9	��c7�YH�A�mug����i����a""���Bi��1i��(�~���
)���^��,S�}P{�T��
�4���C��T�IVY��%�A�	a=��$��)��yG��"Y����T��p�c���w�VC-��~/�0X�A!F}(�ay������>�2D���|E��yK���1(9�A*��!���J���J������������,���}�lv������R4&�����F��h|GzA���v�@���`�E/�F@�b��q��Y�����B^��>����� 6�5L
�@S���E`��g�=����.�e��S�>����.6;�nlw-���M��f����v���Ab��L�Jh������/�F5
H%����
Q���������F#}�e3��EQf�N����y��"k�
u*o�����-  JN����.C��+H��m���6"Q}G�*p���}�T���2@�F�p���d�:�[V��C���{����*�xg����fg����q��>��*"���Ij'����c�����:"nAl��B�w��Db�w�I��2<����Eb�^�Pm��.�>U#��i[�#=�3���z��v��P�.;\&�X�������Rw�����I�&^"����������_c���*!�g��g�l,Y��B����@�>� �5�>�����Z��W:'_�x��2Y�;i�F��{����tMY3�)��]�e"�DO>�$<2������N$e���'�P2R"��wd�������M������E��MC����^�C>�x������J(��N=���I���:Ng/#*G�T��W�{�b�4�,y/��NA1�d� ������;��=�dw_�\���5?����=�;(-�R����
������?2)�x?
�!����%�eUU�yZB}���LhS� uEc��#
3x�{&���%�]���u��F]
�"A1��F�U�4t�oC�{!i�sY���*��v��8���n�r�7$��$����2���t5d�$C��	c��P�������Jr���NJ�x������){�%�����RL	����
�wC��t?��y�"�n����&�(��[)i5o�,4::��"1(�k��eC}+�gi�)S�`�(�V�����3X��S��V���xj�wZ�gT��W�5p��!I|5r�\0����O���TQ�Pj��.8��A����;���{�u(b	\!�T��mU�e���-���Yw��-	�@k�h� k.��<���dm�h�P|�J��b��J�q�q�e�����_S��%x�(cj��/��U+�d�������*�Q��.�mt	[Z��,���t0/=����E?�P�~?������aS���w.74��#^�4���V�/C�4�c�}K]�I�l�J�k�i���C�FCQ~�`�JL�Tj� B"����z���]�	�h�s�f��b��L���#t�$�{�ca]��,�G�S>?~�a�)�J�/�"P�4����N���I����D/����bM���W����!� ��6�����x���� *X	P��$�4
-�*��	�����Bn�}�'���V#�����j�z��]���J<����"w�D�,�������Z4�����\a���ah�R��I,1(x�^��s���	*�����Y����c�~�����lI�7b�#���Y���)h����"uZ+�4s"Cd$%j%�Q�1\b���>KtQ����
[1���s�`���	�:)��9��������M�Ey����\��6��~S&d����-�v�tJ����+�
I(�5��&r�oe�������#&���6�a�v��?��v�%�
�I����^.T�����D�g�������P�z��:[0i���Y�.0� �3y�!��V"�PEq�	�&�����$X�(F#���4z�q�B�|���H�
�'��l�{��7�v���f���������lV]���b�"�{����GW�@�:��2������O���� �l5$!�����j4b���"K��i%/�N��Z>)O$���E�(�FaQ�>W�F,��Uc�e�E�,��K>t�����6
!�%x�������P�e����7 ���
��j�jxB���r�]���v��s��x��*��U@:#��
������P`�i\��d`�<�;���	�����Q��B�j"m5R�Ie������E���=��0���A/�<����C��A��^*�#����UQ�$*���	�o������Hu
IY�5���C�Zh�Y�Gl���_�.ZA?�E���_�
���,�`eA�s	Z����u������*0��da�Rv|}�,����3U��]��'��e2� �Hgg���*�Ry�C��r;c;�����������7� sUV�_h�EjB%�Fh��������5b!�b�,6S���d����
�Yoh�"~n5� �������W�3_��2����o"ii��l4���h2����4�L��U
#���
y	��h?DQ�jt����T#�v��_����
���	����6UT�)��-U��$d��jR������\�V������3!���a�'k�UC��XM�
B��V��d����Z�^�^>@B�����{�M5���������5�c|/2Yi�x���k��7������s=�{�,?���������
��� ���k5�0l��0�I��5����W$Zf����G�A��l���p����[�,�Q�t�)y�pF�Vh&����%��U�?�$	5��fb���,4���LF�w�{������W(D�U���'.a�3�q��vFJ�.G�[M��<>���~SS�����c�	/
��*�g���$?���w�,����^�%����^?���D_��Fv�	]I^��Tp1���Z�h[
j���0��'
,���".���= ����d��u�L����`��%������4���������g���E��(�*!2L3�P���E�P��#�T3���X����j��~��M����N>l���+!��ntX7#	�-�bY�Qz3~ v���C;���la��Lp{�h���fA=�&3���#(U9o�W��|�#�� �-J${�c���B:�e!zF����N\a8.Mr!E�q��E�dNK$*H����f���_	�H��{e|����4�E��f�@P;�Bi-p��Z�;�h�����������A���6�����a��I��%�Q]�g���z�kE�m�3���������Y�wwG���t4����}�{�r�������yX�����m���I��F�4�r��
ra�o����[#
�>&��C�3�� 4�VP���]���QP���:���"��6B��.�o$�RE����5mI��9A����P�F%Sa#���d���A.��'3=�C��Z��e����V�x����I���R�Ito�����}{�>�Z��F��+��|tv��� ���?%5�x�	(������0��9�4#"�od��b�$@��yR�����TNB����V�E��}2�b3� �������j�5y+k�I�����)��|
g[v�G�����RM�T�3X�VD��{;����.r#�J��>�:-��������+<'��PD�BU[�C���2-bg�x���}�
���2��/S����YMr�W���kKv&W�f�@,�*��:��%x�fPK�=6�5����%R� 9x��$�Iw!jV���y3���]��`y�%N}���8a������F��	��3�9�<���������EI�Z����Z�P�WL1U+B�������K��W�z��S��C�y"���@��)�
U���������uXz������z�#��@���Ir�����%T�f��(.��
;He!�a��
@�;�����F��c��P32�G�qO��`wC�s�k[�o����B�^"~F{��mw�%��d�m�'3���#�%�7���~�@G��]E�Z(���(�W�!2s���)T	-T~�(�g�f[#���)������%s��5�%�9
J���?v����B��X�'5���2"�����sI�*p�a�NoYn'R����)��C4;N,,|wC��t���������|�)sl��5d�$�s[�=4%���Joy�`���PE��#�;�����
���dP����������mD��FI�tCs�nd�6����)�� �;�EBsC����I��<��'25�����a��������?����~���!����8�w�;�A����F��U5t�{���3�]F8��'�v�'��e����dB������V�b�y1�����Q����zwV�D���	������zH����%!����d�������A����Iz+s@�3������l���n$h�_���--���
�^� 
V�`~�}�G2)���+��w4�b&=���<�QL�i��X�-��f�Q:�"z�jp�gCIV�&�j�Q�f(���:��p�Oi2�H�=���E��[�r�D\?��N%���#��?�}����b���Ne)Z%�/�I]>T"���/�`�~��w�Y��(��������{��y�9K2��'J�[RU�w�t,�hh�=]�JT������[�W�w,x�6Lc��J�V���U.�X��O�5���+�kH�1W��{���wNZ
��t���v�!zQj�Q�-&�
��������C�������0��g�P�6>�N!���Uq��b�&Q�wu;Kv�axB�����������a��06q��sP/��<1�+1J�F&�F�	�F�":b�[�	�p�V������A�QO1E�N@qww��0[���������4q*:�
G��+[������5G�V��5b�t'�B��S�fB����,p���,TY�IVPa6��(��Re��!����$�;��*���G����gq��&��[����>�U�����c����lM������`GL��q:�daG����\�E`��F�	;g[<j��G6��
eF��1[�6,e����E �=��n|'$���6�^��&V|c�j
U���<���y�W�����hP8g-1�#&nw�FM#��K"�:S����1�}�G}������n�:�a�B��A�<�����������#���o��+Y�iM��{���a�B�QO�-�s�:C>�w7g&wc��,w��p�5��d�Abh�H(I6��#LE<�Q��*8@S��h�4T�������zu��r��$�] �x�`����d��}�t	����H�y�0���
{�#�<T�.B����Y�gHd�\��4h@(���h/�v
�FB��"��C/�������{c��������`��q��
����	��i� !�Hl5k5V�����!�����%n�X�h�]Q�hd�v��s���[�����-b�*�!��Z
��B������A	)��i
OS4g�'�H�8�B��
���c6-{28e�+�P���FB�-q$��	��sF��������!��Xj��l���l��V�V�>�34h0*������X�#�A��CA��0��	�@�+�������{�!l����d��	�����>�.oG#��9*->���F���|2��i�3
8l���(%������D�#��L��|�����H�������!�].1�D����D��,���'�����@��Y�4;Ix�������\����`�Y"�����e�
v&B3�c���iXB8������#����s�t�?I�@S3�v�' �����;J����)Y��42Q�s�^��W����F$��jxn��df3��[�bR��)�n{~�w����RM���(l��9��_��PT8E�f�ET+�]>bHD3K�
���u�?*{C����f�������rd��|�f�"�/#����ug�"n	���i�a)�S��q)�#fv"�v���6��8� !]�tr�5�-��o�=�caf=3"
����������Nh��~!��g��l4y�QH��U�fb,������O��FT��
�*�����\H�;�?^�Ej�;�$w����H��i�Lrh�M���Q�ZF��^uG�<ryg������y�M�
��h5�4%qW�Q��ud���D"=�<R��Z��AX2��'VBF,c&VB���'�3���_-�S�������?����V�s�X�)f@���
=#
���J��3���t-������/a���[�+������Uu�_�����2$_R�A,�a�^7�_��F]�|�=�NO��3�
�7�F%�fP������,���U+�!�/ m����D+��CC�3h�k���L������'�;U�2G*N0O��V�=�����~[85#��Q�4���r Z�4�`k{�'����k�(L��?E���g�8d-A���d����4�
2����yT�5�=<Ozt��~q4�Y�GwD��U1��Ey��,K��F�e��1s�B5��Q�&�V,�����e�����$�`����mk=���y�W�,#����"�_`���!�z��&��2��$�+yG�
ve�rR�>��<�f%���lP��"a�����i���������g��c>'+�����3��*1��U�������=>�tt���8uXh��-p��Su��Nt���5[t'��-�;��DF��B�N��������/�!K�,�W�kh0��e�@Y���o ������,Kv��-Kc�U����\�
�����+L��_t.�aV�*�V�����v�DC���� �jA����!��TA������G�js5Y��+�=eO���������P�����SC&�'HBZt����
�|��hA��
V ��;d�\75G��Lt��E�>��.�X�j2���LEn��;Ps�"WC\�)#�����)���H��������e� ��T����^�ZO��e����-'z�#Y��}�j��~X%�WL:��+H���T�U���f�����3>-Jg�Q����ED�X����v~L(�S��eAc)��!�|Tx��[������/�_����+��RVl����n��s�	k����%������2h�����[�9%W��(����m��������+J?�aR������h�_S>�z��&u�X�Rzbq�� 9uC�J6���o�,�����������}�%��E�P(%�!)�q��i�+d4a��������Gp�H����ql�����3n�jY�~k�=�jE� m�&PZ��{j����;9K�{��]tW�m�(J�N�T(^��?�q��������[~:K��d+�I*����Q��G���b�*�%�������%��)�b��p�i��H���A^s�#lc���I��
R�����p��D�6X@����j����%i��z	�o;:��3m����ee?b�3��C��������(�gY���2��8� ��mT�J�������|�e�������ON9����#F�h���"��8@R����Ju��D����~o�����.�P)�a#"��}PK}���g7 ���^�!'G�',o�
8����@�b�s7��(���CE��]�tQ���Nxw�����{������d@@���Z�`�GK���3�)�����*��(���Cn��Q��M��BS���0Z8��-�I	�4]�o7+B.D��-�={j��d�/VTS�$7����	bE��������I�>��b�#W�?F���$w�����{G�{l����c�=a��}��,M��>~p���T�I����8�N��v_����Q���\��	-�E*����j�>��D�����%�k\��s�`�*��+�!�#;]��
��X��P"�e�#M���4
cn�;��X��E���	%�?'$p���Gh%Oe��������s�L
2^�A�gU��6���g��SCL�m���`�q��Q����j-�Q������[	\V�:t����h�(��>���$�����k�^�(��Qt�����ejL:�F���[��"�L�&�������/L�
G��)����g��'�JsF�X����������nbJ��+q����%Y28�-��U#�m�RI?��I�����p-`o�y������(����(d;������m�qR��K�i�k��y��Dc�w�$.���N����P����bu"|`�P���s�v�������@r�Ih!�(�������=��~��~m9��0�-�4�G��$��������0�����t�78��lc2��i��:��W��e�����L�|��J�����L�zL �����[X/M,�C�����	�oC�
������0�F�b�I~�R���M�����;OJ�&���[!���<�!��� 5��P����
QR}�G��6B��Q��^�S��Do���.��Q��_T����PC��Sbt.������[��; ��z}�[�����MN�:�������(���?��P�*R���`�����SS
����j�k��S�\�d�u����Z�����,ID����[npC�G������Xj�@��zQ�q�	���t�0�@��xb'�J�5��@Z�cC~n�m���OX��B��P��1lQib�I��XE�g^����B ����K�i#DV`?�O�;��#e"��"�7��j_�/�A/��3r!�UU�$3uN�������.u��;=~��0���F�����]�]�tR����1�q���P���yM�O������:QE�a�1���/g�|��$3`!��������]3�&��`dL�p[��H����$_���+�������qE'i
C;-�
LT��o8B�x?!�&�wXdt������D{�IHEl��P������'F��Lb~:s�32��c`B��F�Yi�������r"}@n*���O$�~�U�]~��+Yi]o�-�qa��S\1&��]�����@��Q[�������@�c�A]5�V�<�t����I�</��"��^I(%�(`h���n�mO����b�������s��1Q
�	j�`����0:��gXB��C�~,��d�R��YW���2�*����i�M��+h�2���p[��Ld�pF!Y�:�5U?��S���|��2<l�J���2�H��?2��=kYu��%z����`���0��14�?�(���������twN��9'���M3>�H"a��r4��?"U7�n�W����"������:�W��(�:��bL�:@�4�{o��$X���*�q�#H�z�����\��4�%[�{�����&��@3�Ea����;n5�m�[)�X�����{��w�L	.��"�%�5D����/�F�)��i�{��./y������U������#2�z��9\M��"��{y���/�Di�M{/��#�����Ve��~[������NR8��#�B���Z�����4-82U{���u&k�L��C�cv�&�}��/eY8�x���77"��O��4\~(�^M�c��5�6(�������N4G���A3�4�/��K�����Sq����">� 4��Ax����M��$	������T ��t���vws���^^?�r�����a��*���^���~����7H�}���;_���lSJ&�]@eC��{u�����1�-������{��'�PV�����#�$A��i%��2����u���G�������4#�����
j_>*Z]��!4K�c-y�bHKyMb�[[����hy�)x�pL��#
���	K�46���q�*���
����]w�)�$�����$��Q�o���7-�/�����W%����>�����a�{#d
�^�!����o�[?�"<�5� T���vC�mw���[P��a��D;�����eT
�E8$����_��p[zVV����\�7�CU��p'Bp�����n_�@K�p���E��Q����K�������Q�z��2�k��+w����/%�����[�<B�6ve�Jw��{������2�H��ad����@�rz��t�HK���b��!��{y�pvpM�{�L(���g��}k
v~B����D��5�Z��Q��36�4������	v�^��dJ��������E�����H��Z��
�>�3!�Pw��Fq-��"����JD������^�����O���;z2�I�����{�t�� ��y�hTX�~ |����k��UQ��������O���B{\1�`S�[�M���>h����b��e�����C���BPGR1ca/]E��b�a�D��"�L��Z�/,b���Q�Lv�"�z)2<��J�b@AtQrI��%1D��^���V�G�6�8�J�a�H�6PVj|�OH�m����M>�AC����W�d��"�i�oI���?IbO�Y'�A����b�$ BT	���Uv�_�Eg'����)y��������$O/Q����k���$�a~v$�/ �J����=V���.����Gy�����nf��bXB�7�{��`6Z/�&����(F��9�+m<v����8l���A�::�FH7��f�x����!�e�R���������_b����E�ZaY:Z���w�<U�������D��6<����-����bB�T��u�6M��1m[M
�,�{�����w�F��O|4�.C�H`�1� 2`sro����{��AvJ�dU������y�t�`UI%��F�j1�0���{Q���y��C4H����v���&M[��I<��vpr���8����!��o����e��2C�:�.��.��F��N
��<��������5�q^�����F�vL6�)F$k�$���O��a�J�[���vn�6��t�Ir]>Y��2�=�$=��Q�7h;������i��ax�����=�td�5�������h����q?�R�5�����������}N��v�������$?�!��$By32_3Z����urA�,YNPK4������w��x! -s/F)��!>P�������z	,!l��c�K�!�U��B����4��(�*t����,�-���
J�z����ed_�^��VB1�r"�_9���/�������v�1!�Z9Yj��\�I�����D(-�2}i(��RC���}���K�J��jB!����UCG�r}�\���F��^�L�._�A(	�8j���&��x�������/�-=���s�bE;j8�Q?���������-C��hE����
��-|�����3���&�/UU�G���������)^{%~���Q�F����mj��5��0PQ^������)isk���}�/���}�L��{���jQ����x^�d�4TW#�e��$+_t�w?E	!.iM���PW\����������M�\!4�"T��^r����O��V���|=��&��������5@��A*�]���y'�ZgL�V�^�DkJj����-���i�E�E5x�~ca��~/���H�����I�ys��DMX���1z��c���N����@"�j4� 9@5��U�k��^�81�����HQB�2��f4��#�8�$���<cj��~:�7���J8i������(P�\
V���Ukn���:"�������{�����
��z���}Q��oY��pB�Z����z�'�vM
c�RG8����I�����F���i	I��?�����E�q"����y�q���s��2�gE���\�E��D��������d�CT}�d>A��8��`�
�G;�O�GHo��O%�jL�$,5X���H�S#��!��R����yX����a
�q�E�I���
�H�+�htB�����J�.)����l*����I�N�+�7wi�J�rogr�G�uqSbc��	�p_�ZLv��H�FO�6N4����-&rbM+���k5��M�s�l�Z*r?�}��D��N�p"9c?��Q�b��g��Y����[�CH�^B��<���-6B�[v����?�&�I�1^����Lj��`i��AW���|:��]�s35��,�����b����%��&Z/���p�9j�H�6�<�s�=q�'��a�)��h����=D��k��M�]�E<�������AD"3`����c5C
��o����������u���!��X����?`��Z�nKp+��}�>����Q���(4��-1�SA_+Y\;����}�w���l�E�!�f(AN��_<0DD�f(Ap�;�R�9c	

���&��jQPHR*�P�eP��-8����G���R��U$!���$�����}�iE�l���R}�t���!���0#)*Z
Y��=��wm?
#������9<[�I����?(n]<<5���UJ������;��||#�Qk�����hq{�	z��GH�%�e�mK���5��$�:]�#��[T��1���PP!b��:)0V��<�i��x��F�%�Z����?(qn��B.��5��$�,=Sa��wKT5;'�7HT4��H�Wa�Y��E_�Ch����Q6�@pN,o#�������~J����l�k��K�=�bi�6dp�Y���\,�c�����C����>�&e�,�)���z���M��-����mf@���F����T*����n�������.��pj�b���<��a�B~~�y��f��63]a7���-������q��jlM�����[�H�`�>I��\���1erd7������'um�-,��=;�qd������^
0[iF+d��e����������-�f��=XU����b�I�����Q�%�[L��u����������/jx>��g-����
�}�����	-Y�e���ju��v6��!�6C��+��+�YV�LZ����>�H�(��C���5�a$�f�>�\�������i�Z<�v���U�L���Q��	����}M��s2�����f�BF���[yX�����!����j���
�OT���oz���R��1�yE�u���U$�A/�#����n�u�]����E�=z��S����!�X:���*]mI���.h�V�E�����pG��^�����w������j+�
;[z$�"E2�^�op��e
�������?�d5��M{��j�^�����U��!�����o�LYB�7���._s�����T��_���{.m<�O�Q���yhO@������p�������V��
��J���������i����{�A,F�z�q.�B�e_�V�����5��#��-����J�hP%�D���5�-��'��r2�#3z%^(�]q!b5T<�xC!II�������p�:I���RB��_�T#Y�t���
�)��V;X��=�(�s�	�=X�������`D�����������`��q��5="W�1��[���J.����
c��{~��Hy�?����E�_Q�'�u�
�T��j���Ix��a�������EC��''���j�$�}�,��F�.��qCm�iX��[�H��1�{{P	�����?��@Mq7*���=�MMV@��Q��]P��{�l]�v�#�N��1�m����<>�!�Bt����qRg��)%0v���t;#�$w�
{l�D%��vp#����
�_Dn���O�>�'�A��T�9�p����������Ap?�2B�@����^ �$�
��;���B�����n4A���)i����:�����i��S���;>����$��b��
�K���nC�=6
5�0��Uo<�TJ�r[a'���J��T�/�����N��dK�:�j^�
V�yE�n�ACK�-U1��~�Wo0����#����Ew������DDu���J�r��:�Q�Ep��Ld�	�1"���T�|��`<nS�L#�HfL4��C�!M���N����0��X�.�cGz��CqX�87��]N2�1x����.KU�&����'��f�D}"�+��rj��3I��x7@h
+c�n�P:��C�B��0���
�������
��l��r�[5[#	��!Wm�D~�tQ�s�����v|�M3�)����j��(-����d��Z�Q�<;Yv�0!�s��g���5�>��U����0j��h�������'kxa�����^�{�<������q��	��#�eQ�q�\���pR��0� 6��;YF��I�j�����b������W��e����*�a���jG�vT�bKP���1!��;�=d��h�#b�G��H�fC�&��3C	��!��`����{R{��c���m�lYbT4���Pw���.-��];��ai�L�a�����D\/���
U�g�d�t��x�|d�&*;:r����9��gW�O��%���ahvP��v=D����
;�����e2"��K�����B�j<
4�Q�����V��	��Y~Cd�$�2��6�AXY��[�
r����;+"����I$zta���{��6���
��@�:U3VZt&�U/���b�����`�^g�	���V������8"��g�$����tu`���y
�����q��LY�?�K�VJAb,�a��O������ �������0*vXG�����d��l�?~����P��aD�"��0����1��8>#���UP"����V�)�D��UA@c�D����2vv�����R3��=�G�28�x,�$�Z��������	m�'f9�W������n�A�V\z!���)Tj�������_����[�������C
�~b[��B��:����C�P�7)���%�����F�`���������<���3Y�O����|2�%�tHL��l��q>�#T��d�����DCV,LG��i�@$�i�6���c_�����"K���?S���i���(�f:���T����4����(Fb�2]�� ���NT����'E���,&�/�����������C���`4A\�g#ty�����#��h��h�O�
�Y���a������������T�3^L2t[=�yl29�<%��b(�.r��������q��5c��?�2`����Kd��B"�����lic?��F����[��n}kJ#)��d���F�f.{�[O���}�����Gc�i(B��j���Br����a�$dH{:-/`?�wC��T9
J��No����=u�(�����<��������q������k$���<y��aR/��E@|9*��?���D'R��7.i��Q��]��a����5x�2-<��i|8��;
�5����M��4|V��|�����Cf�
3����{�e�,�;���Xms��y�V�f���_"��G��1!��\����3���(L���3<N�{�Bw��&���p��F!T�2��i(B�1��E������Ex`�L��]�3M�\m!��iHB@���Eh�7�em������
VdN7)�4�Kl$k��$�fR+�fHg4e����
��k9d�<Y����6��0!.�40Q�>e��N&���=*���	\7
L���_���,`�]i�L$��3�kaMq�����G�4�+�;�D���H�B��0f�Ds��]z��m��L�D}����	�"��l4�xGt��U8&�d��h~�u��l?w����`��B��9�������*UwL6���\@�s������E��F������J��oE(�4�Q?n�����0�	��1��5��EA(�C�-{&qc���F34��(k���mZ�4�LO��]��D��Hl�+b��x4����"�,cv������������������_3r�����*����lo}.��������rE!���\>�������f]���C�A���w��F
g��mT�D!�~q�S(�za��*ig�y/�)�V	k�}��+���V�$�J��,V����jtM���J���qy���<�C����8�RR`8z�#����Y���cj�e�A�O������c,�
��+�T�-�
�=�/y��F��+�&���t�W���U��dMk��-�C�XP?��U+��������lX��2XP�Z7F��p+�Gw�������P������F�]
*8��R����������H��+��\�vo�S�_*XY��� ��! WW��]P�cQ���bCV�
hD��t�#r�2�FYk��qE�+� 6|0cM�U��]�o	IR���Q�j�O��7��E8����=��	C�rA2Ut�������R����(t��g&l�E�z�4��?��Vp�z����L�e���Gc��EA ��J���b��-C	G���c���o����]����$h.��(��ueI�����Ze�S���b�(�t���.wA��eV1F�&h���hv�f�������E������]Y�~�/�Y��8-U�BF^���U+�m���wk�����|�hX]����/�/�@wU�r,�Gu z��:��f@��	@�l�iz%Vz��9�B��_n������f��k��=����d@�.�i�m��Y�l4��Gw*�X��3�!����a��`�f7��&��>�"�����6XuR�i��������e�H���E~ya`?Qm�����[v��|�
��='l#	����	T��mBc���	W�M����

���*���f�}����e���&7lb���g
�8��4��L8h������D"����_�UN�2��Z�1B*�b"9�F'��9��4L���w�;6c�!VqU�t��T1���Ss{�@�8a;���(T��t�{2�+{-j
4I�;-�S�]hJ�
�h�����Ihq{r��P����������;�Qnc"�J��@C1D'���Y�mQ��c��0�%��e���vx�\F��#�Nd�I�Q���dG� t�h�u=v���|'t��Er�C���"��M#z��!��y� ��&�;.H;y,
C0���mTA.�z\�.���6��m�A��Q�$�I�2(�w�hS5i�[&��4 ��6�P��+	��;H[��;���}�|�I`�;����}hP����ncA�����rls/�C���k���������0� V�(����kjpn�x�zU>������t{�9�������/+>�$�[>W�:�?�A#�nb�>��iPT�^��!e����M�wB�u[�"���K�q�
��B��!�b��J�;E3�Q������!:��D��f.��Z��zy.�q9�
��I�0"&���:�.�P���M�������������K��>�UQ<���o4��F�/$RWe���@����������;�����=+���|6�!�ZT�h� �mH�(��>6�e0Y�6�!D��U`CX�!J���\$��LQ�atC
����a�!�<	s k�wX���������>��#%�D�������G��-��>bTDq��~������DR�	�1'&�Z�z�Yi��&�zd����� ^�F@������)��?E�X��Z���Fd���; =��A����b4���Y�
����o�@��|�|�y�X�
����P��f`�{x�C"�K�Vcm�f�)�v�$����M+O���p�,��*�d�<�c4D�	,�)�8Y�'��������x��m
��e�(LdMU������U�w'*	Q��f�����j��N�S{q�z��/VOJz�M7�����HI?��uJX��#G��>�E�yc�w��@@�1�Q��/
���%f���]Q���0a�}���$�;�C�����N'h��D�W�1���u$��i�G��16Re�$�':O����7�z�D*!B�<)���F�IO�RI��D���D�����/A��D��
�m9
�]O���E���B<d��W�pH�#���=FA4����6O��A���$h�UO��kR�>������ds�����HxQ����Hgu�����7�Kb8'5�A���VR(��y�;�	dr��Z�O�$Lb�c��#�wv�FN�����uAh����ox����P��oU��'�c-��fx���N6���f�h[@d�}F��
�p�Y�4�}�b��s�PWnI�2v�Aeb���2t3��9Q���� ��1^"��F����j)�E����'��t$��b/�%���l�Z���r�X;�q��i-��0��dk4�;�G���D�D��Q���w�5�G���C�GH3}�^-
������e"c��JN#�\�c5�E1$���X����B�[g�y�p�f���6��V����~��:aVh�`i"'����T�/��3y��M0��1"��S�G'�����������"������e���������nD*��c��\X�c�A$��v�$Z�f^r����c������d]g�q��72�����o�L@������CQ���F��Ha�J���T�@,mN��{0�n����aC��;�*����4���1���x	{S�"��e���;�����/�-y��� �9�&t���x7O��X�t�i�4���K��:{��O�	���k�,�,��>]�g�O��j���	�0u&y�-L�#d��"O���^4~������P�{o~��Uw��{���{*DU�j:�{o���T;���� �ZT��7��(u��uO��@���E���	.0Z%��-��zo�5xKZ����}�{�{������c��<������D��!��m8@/����g?a��{���2YE/�'�@���IujST/��&�}������E��^�~i�B(��:t�o��d��������$���@l��r~DN�^?�
��������WZ�=U�6�kw�F��~�F!,�b��'VO���sF)����Z��g��{y:W�j�L��HsQz���>n�����>eIB�{Q��o�n[���C����E��#��2��>��^Is�]�'Y��	���D*��.�-����5���m�T��h���5��~���������|l���������yD�-R�"���F�����x�f�}�w2�*	>����}�����,��Z2"�	�^T�j��~�����`o��������D�I^�c��n($�S���=��M����=��I�dP���v����|�D#�.���"g�l�}
��N�C3�k��;5�{��9�'-\�+��q����4�����i���y?�'
'��7��.����(
���)�5q.�h0qL���
�l>8d���N�A?��������b���{��B�I����ng{
�l���cb&��^���P�?g���Ef?��	������D����r�\P�:`���3�G�	tV�@���1RQ'��y/���n��3���+��g�T��&wB!{u�����u�@����������e6!x��C�|~
�p[����e-��
��h�@����0�������#������z2�W��W���G�5�Q*&	
�����������luO�t���R�����n���t�!8�0@�[���V�����W|�Q[����
��\�{TK?Ib�XH������}4J�#�����w��h"A�bM�d����c����)4�+O8t����2���A5f1.A/��o(�
�������2Lv1��%��=�����p��UE�E�T��y�#���n�3�{�8{���J�l��$L�A��A{r1� �2��.����-(�$f��|	�/V\)#��(5��F�����AS�� 	���|j�M��/��
�C��HU`��qM�8}o��YI����b4;�J��t��m@�R�,tZ{��.��}�O'6�h�>��rnY�-��rw�2+�Jb(��2;����	�:��/'�R1.1��t��:Q1]��j��F�[�D@�
�b\BH���@�XI�u�,�����'D�$�Qz��.��BY�<:����$�bkDhG
ty�������&�29kq�D��.��x��&'%&S�p�_�;)�|,���`�t,�s��CK�QD4F��2BF���YQ(���qR�e��g{�8M6���:�>�R*�o/���L�Z�	�m��!��2����m�QC�Tx�<cX�!�V�\I���D��'��4��G�z��P���L��DU�/�d���z� N;q�;��
^b4�bV�bV���%���Lg�$��!����
u�$����A.f����JI��$�B�����@
\���kV5�He��%N��Z���J�����b��A-��4J�
��y/�f�}Fw��N3@1)0Vb�$�6���9�F����g��FQ�d���
������_j�B!��P�8��
*b���e�{�Ef�����r�k�Hs�h,V����Y	;|����]7��*8����g;��N��v�{�%P]��Y��d<���hUiCl�b�Bv��=@��i����O���(x�d������=Y$����0
`�H-�"���o��.��-Z��P���S�v%�~aW���h��('u�-W��J6�E�nQ����PH���R�g�S�'&v������O�������44��QR|(
;������'���[r�4��q����:�j�B'������R1|���2�jC�wz����\Wv-T����FR�^��������i�s5V���� ���>���/�������|�dk�7��=^��fC��Z�����|k�
������G�u�E����&��j����Z5VM�+�7P��I�38 r�|o�j������Q#�P��kR�B&����|}��*���vhN@aW&L@����F1T�R�Y5� �4�&�z��L��N��|��n����!C�Q#�(��������A~8.�;��%��6����y��:��%�	#��Q{�Z
����6�@�0���Ea��%�H
a�1�L��O5�0Rd[0j i4�������"�no�$]��=�0X�i?�*V�1�+��
�7��<Y�7���UD~�5g��y����=Y���5^�����G�
������&��������Q��=��5�	���V	+3>q���(�N�m�Fd�nHZ�7[.�D�dg��M�U�(wFH�����$>��&�������V���81Q� d�c���.rk�`��vu*���9��b������a�e}��_S3;�W\3;�%5�e��v��dc3�sM�u�*@yi����9lJx�n	��|��%���o�����X�3���C3G
��.Z����8���l� �����X9������.� �o5,���`o���o0@�i����"A�+[�u2�F+�w����A6o��_��<%qk�
��#���[	�Q��n��N#%����;k%�Au��7��f�sXg��UC���f����-����G��h�U*Jh��
�=�{�k���w�0�TFiOh�wW�L�����d�v�X����(O�>e��h�x�vS�&���A��M�s;Z�S�v��K��Y(r4�o�(y���.v�AMM������'�[v��	����S'���	�}x��iW
�l���@3(���r>�/:�[M{�az)�
 +�fT@C�������������N�����V#0����]�q����$��W{7�D����[�����U�=R���Q�:������;����u��DNC���B��;q����}�I�"/�"z�m+���h����5vf1�S�EN�?���;�&�!@�������;��F��<����H�zN���6Z�����)LYK��tMk��-j��b!���7T0�\�?B�kmj�����u#�3�9�wx�����Vl�G;����o${liF�HT�mLX�#��q/*�����x�\��zQbL3|������m��{<��}��7^�$����R�<XC w3��-Q��q�X!�	f3|�&�����m�JC<�WV(y���+i)������\�%�=�����e���@�;nl4����%�=�w(���It�{ t�Rh�d��O�����(?���*G��$t����V�Fv��D���4('�|:��~3����V��k�#��*!��o���6n`���%�����TsV�'���&�J�V����B������H���1����{��\�Z�����p�y������5�Z��3�p��*U��D��fta�i����������}}���:)�)�9�_B����e��X�k���-nI�6����k<� 3��E�p���D0@���+��k!T��>|�S����=d���#4#�m��2{eO��|�g3
!F���[Z	p��D�
����I0����:FR&c����!����\aem�m&2��������@,�E|�>��]���-�*I�h�1���f��#{�&���@�+j���X��Q�<y{���4�fD����/c	}�H���GG?^�
��u+��cXz7z!;��'=r��G~�<�'��]�i22�.�{���$�����T>Y����l����M�4!ih~�k�rh���A��=�:����&Tc���pG�:��?��v�QC�Z��N=��QV��z�����W#B��!����nC-����s��0�^�`a�h�n�B�D�w�o����p'�U2��KG�a�����������0��!e��=1�a
���]�y�1���������v@}�b�T���A9��\'S�zV%���
x�����hSw)��K�m0�1�S�Q?�����C��)u�r�9�� ���"@6��xGs�L���n�C�������:`�m����oVT��=��cJ�����wu �W_�j�� G"t���v��jN@^��t|�D���
�\Yx�Y�������s�!9���d����h�&����Hh����[�Nx����^1�-�	�VxM�A4��%K;�f�M���\x��d�H�����O�b�/V
Y�[z���6�[��A�M�:�����qf_!�@[�{
��jim'��+��'&j���W]e��*J����=�%�d�;EQ�}��=a��f%w$��F?�9��m�Qa_�5&~�We3&���dmB��{��K��L��=�
�Lv�O�@o�^�d�p�����Vh�sC7��X����1'����{��(�z�F:�P������P��
vV���},
G/ON��ZR�#����~�����^��,?��_I���TQ������X:��T
���C���� �����$���2�_hGw��N�9S���f�������!L���3:�>��$^U��d%~ �8D��[�4T?���r��0�1f��!���tw�Q1\h�.&S��j�p,���1
�����7��U;�Z�9=�N��������fc���LnW'<"�1�b��p���Z�a��A�#	F��H���F	�*���j�a�b�:n�����k|Y-��\�m��n����dm;�N�Q��{rZ���a8BJ7��%���7��Kfa��G����J��\�Ke'����
U���tD4-�Z_W >������q�X����t�����*�����l"�������U���C���}�yrQFd�B.��\������j����6<H|��G
84[�!�O����F������Y#���	y�)�#Mw��,"k5��f��A�F�	a�w �4���Y1jBx����3>H����c�����j�1:�l��~|o����j�:i\���G-i~� ��M)=���VH��V��g$g�mh��.����0� W�A�,u�{ah���C��������S�X�"����
�JgJ#gt���36�wG��7BoN�4:Q�����zl��{�)��<��U����S�Kz'>���l���I��S�FwdXV���(��2F���t*<J�s����I���Ju
8"�8�C����#�bA#r�X��b��<�n������8����D�y:GOF���#i��������%�&o	�((</H]v_E�$#���UnZ����o�U�-*9��DG�����HZ�</X�fdAD��Y�-b�Z�^Bg��v&��IVb���'
�w���\.'"�����W{mj�1-8�]�)�(C]�K�%�~��?m4�r�?��ll�
2��M�
�����7�����EO�F��0`w����x {�����PD��;�feO��y���@�s�������*�i�������f-�,�����2�S�)�G��bBnm��(��%n`S��X�d�Z�)����f63fMb(I]�k�E�i���ay2����&�N��Wa��i$�8AVt���j���C�rXT�0
44��F�IBL�Y3W������f��������(w,[{�����dd��`��A{�����l�=����5���[
����yt���v�O� -����&g������nS�kB
�����n]gb�� ����6�Q&bzO�	2�+������Q�4��l�q7p���$=����R������"f1;�{�����@$���RXEX��,t�y���^��{&��P������M������m:�=z����(�d��lW��)�BT������W��Pi��DEB=�4� /���O�[�ni�c��ilA�<�����b[����z�kpA��rw\w2�"��a����X9'$���h������	cWz7�[*l�>���lE4(hz8�h��^fFt{G�hO���`	�3�5�:qL��9�C�F6yX��p�Qi!$DD�L���u�#$���X���P3��wrQkoF| 7��RaFL��s����jc��&����]���4�w���B�1��~	�����A5/����
4��� ��i�@.����+=.L�w�����2�_z��=�7��6��M�����kX"(^���:���g�'Nf�RA��L���{n9>~4
*,+��$����2r'�!�NQ��;���^*��f@� ��4!��B6���:����'J. �<���76�9	�cEc,t��!����"��#�I��
�F�����1q�w�Q\�4�P���|	��0�:uKX1Y�4Q��n6���������t��@�b����T��Y)�Edv�|�5���X��h���<��X��P����U���D�O�����cs#FhY��o��|-�U,��N��2Ps�J|�����J��J������J���-� ����i^�	��(�EW�K@�-r��Y!���0�eb#��2
!��<�U�L4c]�#S,�/���`�MY������C���,t��(��(v������dV�~6���P_�.��T(�K'@�n��2��j����5��������>14_��]%b��[�U�����K�����ew;�,|}�e�<��.#�X|�����=--���z+�>��H ��2����kB ���
.�]��Y�F+��3"W�	�J��QT���K�$�����{C��coxw��*�+��6�&ik����b*V��f��e`Bf���qJ.��^�0������}�}/�`�9��\������*��r��'��d���G������a_�=mz2Q`}nPb�5�
��@2�d��q��8?���� ������E��6ieH����Ek��)���@+%`���*X3�����N��j�a����ac����l���+f}
��F[+����hki���WH��.�?�[�l�Y��2f1�6�$����X�2R����`b��$i�����6u_dS��O-��Efn�7y��#���Y
z�*q���;���P�����4Y��F(����TM�5l!�1QV���_�����b�z>��f
�e����l�]��)�������Ek���+FJ���P?4bhE�0�������n����<��~�li�P�����,�,��X(m���`��}��H����>��(;0E[�Tf�{�@��8bW���[�&�Zwr����D;�)��m?��q\$�6�������C�������P��n!���5�\f*5���5T��kX��e`�����������9�s>#3"�����B�+,�J���e����#tB��5(��b
�@"X�����4��X�\�>a�?�E��nz'bZ�JY����g�}��V)m���������;�Gm~����?$�G(F���������=�-��'j�BNwD
�J?h�
)4[��onH�8=z�	b1����%���FK�H��3���i�?XlinA�����M+���v��\�l���8�Y�6~ 6��i����AA<�����"�PG�������AF�lw6^���#�o�xp�$�i*i���m��A�V����8=����G�3������nC�S;��c�%���&���/�Z�!�/nu�H��#Pn���/�a��*��'�7�~G�T�I�H� &e�cK��7���#��4��r�D�0/N���5��@��U���|<�bc���z�nJ���;�.�3����DX�Z0#����0��:$���	�F�1(�������X�#�t[����M�1v���7��0��4Oc�i���J����l�����p���~�m51T�QlUf4�s��Q|��v���'���tdn����XK��p�Mm��a	���N��W�������.�a�"k$.K[��'����J1C�.v����W�w����=dGQq''�9����'1�z���-<@��pM{t�l��8w��1���&$��;�����d�2H~��E�]��/�ml1kJ �2��_P��4v"��|9r/�����/&��P����m�{���I��	Nw����H�>Am�����>��j�u��^��[�I��$���T�J+ll��ky�<;�6	W�<&�N�|'��ar�c�KL����J�����@�}>��3H� �$p�c�����|a@�� ;�I������nwY�ZhK:�B��5��&�k##���
E����(2��cx��EFeTKV�I��~���6K��c�Dq+�XcNg���0�,�+��\�[�
���k��9�$��5V�XQ�:Q�q��������f
9O��#���'x�V��pd�v���,��#���������i��y��I('B��GQ�� c���G���a�cte�����4��%p�0���4k4;�M���6�k��&��s�����Q������;������}�����Z�$�v�l5%����K^���~^�,�8I�����9�1!zV�Y(���'�������������
m7I�ySS��nL�d:��bl��+�{)�;	�^asj#�Bf/���c����c�D�������'�B(bv� a9p�S���	�c�!�	j"��=>�B�+���
���/��e��)�v�=5e'�H�|����������p��K�x�����+��	��b���'�H���q�.��t��NS��A���	�O���������bG})a�����Tg��=��]E?_R��V�9��v����R3$w�J�K�<q�}�.��'e"�f�'�J�����@LjzyV4�'yJ�g������WO#@X��`|�(Bds�5FG�p}�9�'L���Wie�����#�c$B�
�;j���G�P�`-e� X�9 �c��;�q){��p[r��8����f[c��1�P������q�A���(�uQ����9�����D
q7l�4����dGu��F���G\��mY�W��F���T�"�� ��v0���4VPl����GX�c�.P\wC����i�<=�������uKx��H�D����s"z��+@����T����yP�)���{e��G�T�g�@B`�Z�]��R�v����J�A7��������������wTghT����}�H6�^y~�B����12����B@�3������[a;2!-�{���),�>E�������OE���N�AE�#�7JmWB����k�Xl�72�/1$�j�W�]�N@��^hv^�6[g���������1���`z�.Q��S2��O����h���K)���_��')G8RA��p�Gf�E�����;����+�;N]9S�~��_�	�t�E��b\VA��-#z�����d>�a� |��X�v=�1�}��n������];2R��Y������Gs75��q�d{h�^��{/��G+������S$�VEU�������6��_z/4Zh�{e�[����^�cS;�]i��fu]4���d��^�E����E�w�����@xx<�+5� �fM*z7"������Q��,�$��k�`������>p�n1�PB�{�[�#|����k���GNG|�b��S�0�F��=���}�1������
� Mm
��M��E�Gk���2��Q�_���/wD���h�^��B����:&��)@�]�+<�HDrI����6\ �	��z��?}��
D�$��{ebO��Z��q�����;D�j��.bA84�#|�L]�.2�~g�"V����'����c�0	����ICE��)"e8b<�	��ENR���|���
+�1��=�W���
$��f�4!�����H)�������lgAs��>8����[��������6�6;�:1����G$_��� 8`2�PY�c��`�'�Qe�%G���%�e'������!}�{�[��8��^���
�(��M���[,+
m������^����6e��iT����u�X�`����������@<1��?�QzMJ����L_1���D�%��Uh����2��V�������	PC8J1|��o�X�P��GO}Z�t�
��Q�D���'�QVx���0Mz�V�9:���F�K�����	f�>�w:5b��@]sI�z7c���p�+��4b��T;l���}�����3��0.G�}6�j�/=z�f���o��z�%������V�;t#��V�������	-5iI��Y����)��I����Ad��
]p��*��GR����R�:D��3�������+B�l�)�y��4�HM���$�A����$�,
(3��7������$x�!��9�W�/���%H5k���)��Rb��)�]���T6h�r����{��������,�,Fce�VD
�f����|��17����eh��n�@���T�]�yt���I�*��{@{��:���*W� �e�%�9�#�F��������[��QC'V�'���
�6��oMBEa{��%^�2^����=����]43�O� ��`��a�*:�/
�a�Yp��z�D^b?Z4.��1��0��%y��yD��<
}���|�.��
=&#
2����%�{yL�k�cvHMp�nL
),y-&���e��rRX��Q��-K�k^C4��������1BV���{��l�%F��������hNW����GW���?X������#@�����L,�S��.��&�A���*�:�[�!�H���=�1��n�@��:^?���IJ��]���a������
��=���v!��Zt�d��MvM�B�m��9�<���������~{��9-���H�L�Q��{�U1�}`
�i`�F@��o�<�XMw"�j8|��og	� 
�tOy`K��rPci���
�����>��m���4���Ab"R����^?L��M�f��YkHSP
0c��c���E�p��#��H�q���&�v+fk�7��n}�
�E��j����&}���R
@t)�)bP�:�.����wOT~��7ro��U{h$R
;��^/���&��T#�����mm��{5:� XK�%��3(���B��jdBio��������O_���8�\~�T�X]5��a$ogV�w���p�ghh(\
/t�Ew��B#!f5����YP��R�:k���gt[�s'Q[���$3�K���4�Y�m�����^����(M�4��	@���i��z�[8��/pV�C��ZH;������G;���$�������~)�'������1�0�&Qz?q����$��Rh"���]�g]�M��=�S�'!������tQR�{��+��XNY�(��8�7j������cC@�E������j��������|��A�G��V�E��c@�"��F� �X���ui�����*_*��
-�!`U��`=�C�������T�RG��r-FK�p�a��XTn�vQ�p���)�H���AC�j��:�mh�m�i��?kR���k;�1�>����l�����K��E�:1�ufB���d<H� �|�A#�{5������j���)�L�a�<hT�LzK[4���5(�OG#�Wc���*kB�\���5�H[���r����rF��?m���+[[	YG�r�|�H���@�Y�Kd��>v�J�R��AG���r�i��F��r��b����
���5�����2�g����-���;�iW���5���rv�[�&0������������7������QQ68��h��.�x�
T��[BbL�����&�����j��'`��npp��bw���z2��o%���c���U72�h�"�f5�05X.����G�J6�����fda�k{�v�)%w*�q1x3�p���W/T	�/,���O���UV�fD�����%dL�rh+ht^���������'��i�, �L�HA^��j%B���dr�������k��W�4�i	FP#��R�J� 7C�&�*S[�
�7�)Y,����p�����U�7h+9�G}��@�&�.*?[�D���rd;���aY�
��P�� }�\����~�E�eo�"�+�{�gyO�{ZL���.qgU��i>zf%�I�>��p��?_@�Q���e6OO��?��$Ar������kaf����Mv��KB��6����"w�?R�E!�C����:X�P���dQ���)Z�
�-`/�p���Fa�W���K�WN^T����<
���1�+�?h��V.k\����+	)��1Z6�@?�������K:�*z��B0���(��>bC�[,��s������[�~LG���#2)v�&e��^�
���?������q�q��{���l�2�D����=��A��}`���C��Z�~����{�f?#6����sfU|��16Q�b��m���������.�]X-���w������Q�%0��$VX6���r�}]��>��U��;0B!��xa����-ZP��r����Em�oZ�.�K�O�g�&.��X�ue�����w���3[1{L+')4����t_�8���-X��?m
?xG���;��o�Y���*�74&�j�|L������*b6��6�D|����b��
��kK���-!
E"�{��������%
{�"��/�b�1�>��%}�D��&��")��`���X��������S������#�~K��es�z�m����l4��~G��h�Bi��m|(�5�H��������
"�������{W�zk�$���:H��{L^�> �[3����g�KS�Y�.HLv	5�Q���NH������5b��=)NH����������
jH�$.c�����������	��xWP���@��nC�����n�����
hT2����	�.{���Ce�������-�g���
�dQ��3*8�a�s����#���iW����	GF^��%����<�q�:���c@C��F<�^�q��C#��!������a���i�xe	*�
�B�����EHaO
�VE����&��i�Pc���H����%��u�hb�lt.�T��jI�}h��c��@�Vs��2t��KBBTJ���������Fi�VF��k�,���P��45���ce��
i{�����nhb���w�g���
{V��X4f�Vy!5�z�F *[�
>��7XC�p7�����H�{<�E`.��
�2i��XC
���pD�>�s�D����J�A=�
��B�����4��(E��
5z�O�-��<�e3����YMr��N8����	}��<2�F�pI�Ez@���l���7���}_9��i� ��q�A��>��~�_�u|��
9���>� R*)����������T/������[c+n���,��� 9��������PG�G���d>Kk:g�#���'�a�}���
CYE����������?e�Z�G�i�S�`X"��ot���~rp�;�Y�_O,�|E�4�:��l�-��w�<�����4u�����7t;��gg�m1���[O���h|���H��#|P���v[0.�>��:X5���N=D���x�������|��95�����J�mX;���!h�oiG��6cn ���^�Y��U���"e��[1�H�?O�g=iyP��T������A�������?!i�������Jvim��P�i7!$C��Dd�F$�������	AC���q�8�S�1�����^'�N����yV�5�%�.�%�/�I�7?	 "G
b_�/m���E
C��Fd�e1�?VgA��H�`�;�Ebn��.[V5��S����"D�g���Ba������&������xGD��'���DA�Q�_��~���}���1q��	���=�	����=�J�E��|��l:}Q���$�`O!�q�d�A�j�A��A��D��h��M��P�)WS���bq��n�Zq-�@_�������8��������R���4�S@t�a�Bq?v�oE��a���m���7[��@�m��l~Q��w����-���U�r�xh�B�Y�n z
Ee�$s���Tfa<�a�@���mDY�n�(��_�,�DL��r"w�x�8"}��G�������U{U�#)H>�c���5bI�P�/���V��dN+�U��G)���6H9��k�2l�|��� +"cR�	��� ���!�R�3
�H"�l���r���]�SP����W�#�W��w5F����8����I)J��w���e�H��������k�0����}�#��[{��������N��c��T�H�����&B0e�l����1XD�N�
$��6:�1d��[�#rEg~c�"��EB$��p��@���6�!�J�|��ak �����8�#�	�1�B�y��������Zg�?�h��jbo-���W������SZ��������y~���]����h-Z���aLDr�Db�/�h5I4���-����c�������v|�|���])�P[O�n�Vz����&��c��?��yKi���p�a���K��o;����A`�����]wa�2f3XGI)�lF�r�e[�Q����
�d�w�r�v����b��'\8��2��K�[��5��:��P���W�2�X6�������D#"��H
9��������������3������9�wh{*rO��}�+��oXD���h��(��jfl�:��4����1e������d|&$[��VS��L��d)h6OC!����N��U$3�Z������>�HHAf�����<R��O�Od�OJ����f�P���lu��_r2�L�8�����=g�;�L;�6j;�_&JG]�i`CiL�5�i��Z"U���E �,�0�8GQ��G��'��l���o��k�8�'�������5�FY�f���.���������h������:Q�]`&�9�����qs�h3�k��`��S,-����������	�V�|6PCp��g�nG��C��3��8�&���11�I����#�g����T������9�>�����R����
��h)�2�@�����4(����[df��}X��&"Z�b���s�&!lq&�B�����|��z�rf5�
������(��Q�GB��itC��dStX���f�f�]���U~�P��������Tu�=��n2h|f�h�I|�
��K�8������3��\��Y��u����pU���J��]���"�����I��JB���`���$a���<�%�
1! K-<`��1��#���N%!d��.�`E9�A_�D���N$��3�d�@�c��u"C4�O}�p�[����
�-WW�=��rQ��'��zJ�d$+��>b	��hF�!���$<"F�_d2<�����-�����IN������gR'$�D�1�s��]=��'��X�������}K �N z�4� ����Y����c�Yq�d�{;b�'��H1��F���/z��dN��fW����'�����A��ne1�#�4v ����(�m6�[KA��L��8�P����%�����Rl����D���;�����!����V����3��F��Zv����f&HF~�@S7~IF.��&�$$dJ�#�-�	A�+y��l�Z��q%��5�$T��\Ozq�w[Vv����,�`=��<�7(US�����N��YC��:b����@lt(\U��I�K9=����-w�J{���G��2��:�+�����Ro���&z_������Z����z�I���(m;J�YS�]	3�X��T���b��v��	JW���k���o������S��\>��
:�iz����b��}k5"�����F����w�p��tlaK��U��/��joxK���v.v�1�Z�r�c��av��;=w�A:�eB���,�	{�cQ����������:�7��}�����e���y�b-����9��_$�������o���*�%���m�,���j@���QRW����;�x`Qx�ims�P������)��vi��Q1��FC"��c��q�w�4Sq�,�%�U����a����BTZ�2?�h�;9��r�B�L�S���r+
^n��z����bs����q��(c�I}�������e�H
�tp����������~�GR�3b��bo�_�1����e��.���s�'���5���Y��(d���0���x&�SdM8]��<�U4�����s: ����p�~,[f�=Z���A�5�v�%n��G�k4��M�E#�`���?@�%9)]]%���$�0z���#+v����J64�W�Tt|�;JA_+\���g��LSO����c}�R5��r/�B�:]�2�j<��4lX��nI���l��~L��{!�F9�s{]y�,~��J�<�T����6��x>�!q8hf�X��S�!lb�(����Vg�F����q4������M��
n����c��g�[�$A�����\����L��,�G�������?V=�eB)�F�P�
���#�w��Z�������
�Q��:!GV�l�eDd�����fm.#"p�}���~n,�y�P�:��I�O��x�E�:�t8G^"�3���������%vr�#��m�y��H(��S�RT���uKA.G$S��?�a��Mf��o�>���K-`��\;t��T��Y�orXVu�K���8X�6�!l��{n���k�C����D���'�����I�[6>q��+�Pn������+P���b�P���=�b�B���%�1Um���PJF��C+�M�1������AA7P����-8��,�Af�'�g���a���I!����%
KT�	�(�J�;l��!���U1b�g��.d��>(���{��/����{H�U~F;�[4%~l��}�G��m{��B
����[YnT�m�R��`��Yd�<J��vvG�-���I���=�r��q�[�x�O�E�0662@:���)dq���:9D�j#��O�������;��3�1�bX"���C�����������9w�Q�:�O�h%�n�6/���N�]�d�Y6���M>�"����P���'�[:�m�c4�b�n5[YGJ�}�jB%4��@�,��n�l���<���Y�(D�#�^�|��J����{DT�~r���g�w_��E�`�0�p�@"�mhC`�Z�5}8t�/���h`�=:��F��T}������4R�Ac"��HO��?,s��}l(�`��l�0|����1f�W�wDy�I�5�	�t����3�e����m�%�}�u)���N����K��WR0$���!Z���w%b�
����FN�+��c|BPG]5�P����f��`���t���:F|��{'p�����s�j�8��x���
I�w	����!���"�&�x��-XF�b�mXBM���@��d�0�V����1c���3�F���>#��c�����mh���"�[����,�����w���6c��Cz���B�����z�s"\�|�F+T�1*�D����'������I"��1z� y���D�!�B�R�9.��pR���%&c��/����~#k���`��\M6aA��c�B���5������L'����s�%Su�����5"���vE
�C�[��|>��n��91�n�	jP��%M���c��Q��1l�H��� <{X������&�qS������t>���� R�1T!'��462�x��eMt�RHw/�3�?5}<4G�N}�242�;4��cr��m*���#�M�O��g���.�'��f����D���|��#^����%��z��.�|���*N�����z�G�����L���V�5���>�W�����O[O����%'��yh.�i��oZ�]�h�-m�
C�K�`w�Kt7ze��^F�	},'��;H�|���Gm\�Rt>�z�=|������/���`�:���$�[�����P�jE��h�����2���6*Z����gw��T�Tdgx�4h,����ksP:� n�*�����dn)�n��P��3�-�^��{�����8'~O��;������O�����[>u�>Q[���8_}P��7�v�<��"��V����-f��|J!?w��,���@@�	0!e�T��,LJ����9�N�K��	���B�h2�8"�j��b��w��1���@H�Ij�8&��`�j'!����*	�QX�u|�T��NB*n��+�V��#�c(CF����U����|fk��	�N�l�EZ�?��������\���D�.%L�|�g^�%�U�O�B�am:
i+b��_��5}�*{�Xl?��M?&�81�B����EA�E'~Rn-�st\���.40�)[}u2����ogv9'�[�N\��9��Z6^�H��,0��5�����K���dl���"�t��ln���|kP\��P�^��@�=��y���#w_� �z9�	�2��9�v���>�j�$[�;����Q���:zR��{��5�VO����P��,z��i��1�Y�HO2��2�n�^g�����|��I�����p-x��M�d�����;�����)����]��P8�5�A����q+������M*{�0�#����ma��w����z�T�K�AP��uf"3�{
����5��m���e�,�^��{NF��U��eL�@94=/��!�������{��+*[:*���Q���&�KyE`���=�dF�G�j��R���d��o$�y�c�*�+������:��w"��;���D"sY������)�;v������i���ph�f�����n0� �`a�y�"������zz���	�ihA��u`b�;����U��EdA�%"d�t��u����@��wxrLN>�J���p�7��h�Z�4N�;�����z�%���>�
��a!�����%���$SB<�#���3��I��=�]��-� ���%02���_���/X�:���������@�)�?&��� ��{��_�P�L�P�%����V}Mpt	����������k�A�[��m5��6� ��=eL���I��)�E�+���{/�~��g+�����
�a�mFv��������K�p#���:>��5x������
U��5�F���O'��Y�i�w~�����^P��}"� ���AJ��P�'j��
�U�D )d��P?���Y�;PKT���aw�J��@�<�3����&�J�}y����=������f����I%.��J��[f�pBkq=e��@~�{!SNd�#�+$�@����������j�k���B^o%�xE4�S�-`F"X�lB�0�6=P����'�V"�!s��c�����F�P�������k�!Gf@h�Q�&s��`	�������+>�v��P��6�����������aO�{����x�� �T�b�����L1F�fS���|����$n�"�2�Jr,����!����
�����I���;h��^��������_(��v�����l�Z�jY~}&����:�#�bO�}��R��0)��\�p��*��jW1�![�t���Zdh�g+P�����V� ��{	��	�g�%y �T��W	�q'��@%�X�UXJ�u���J��88�O�l6��"�*��!�e}%:1d^%VNV����F{��c�=�R��*��Cf	��P�}c�0�W���74dRx�Dw���������Gx���4�Y%�X��$U>������*�3��{�4�j�����?��*z��m����������-I��g��}��h�B���~�F��s������q�.�A|���dy��[�#(�/�H�����b����Un ��*�4���c��N�'�=�-�{!�tw����sQ�h�Q���8h��W1�!�s����U�hx�C��b�;�i���U��TE����6�\��������'x01�1+��GHw����������#b�I"�d���"�/�1^-�BBK�b�x4��X�K����A���/�P"�F�S�D���j#M�;*�����j��S�d��(U���~3�'d*�f�Z(�$l�e={�>Tx����rB
�2���j����w����,AP@�:�����������V��(�{Z�5zJ�w�!�P�W1�!v�]����9�*h��0�I���pKy��R�-��8A)��:$p�95Z���sI#�qY%p�q��6���JAc���{=�	��U�>�Tu��##�X�RXL��Jd������^hmGM��C�����^�-]�&���\V�����m������r��p��n�laeLb��
�]W����5cU�J���!��5��`����u�@��\5��I��J�x��h��U��
~�6('�[P�_������iB���%��4m���(��
��MDnx���0k9��l������[$�1�[x/S�~�d�Jm`�H��.��.VKo��	����b���z���F1��n��)D��2���IQ��P��G>p���{��	�l��]�|L�+Vc�h��>�������6���H��)��^�mD��%�?���~MV�(4]�h��/��Y^(����~����}h�k�
���b���Cuf5�!A���Q����It���4P�������5�z,5����(o��N�5�����?BWk*�7�V��yy={����Z�����4d�"s����N�S���,�������~Ka~Q�`�����aC�]�vV�
*�k��6�
*y:��j)���'b��jL�������[�/�7#2;?!�$P�N���,d�����0������P�~�j�j���|k@y����$me��p~}&��&H[1�����.���-b�������������V5Z!7�j��-��g��5�E�Nf����P�;�;�h/�����7X!B���$@,��I0��JA���,����hrrE��jtB�4�|:��H*�~���I�9���X[b%����0d!7�b6�Y��(A�5����v��"OJ��KU=��Vg�O�5����B���j�B�#�G������?�^�N(Z��Yb�%��������BC��w��&��B<*b�����$Q5VN�wkb��m(;+t�?��-�;�[Yu��p�0�PY���q��'�� ��W���I ��{ol[HH��'d����)��-u_Rv��"�I�L]6���uL�[�(h���6,�
}���F���g�����{�7�
���a��.l�I���+�����LJ����<4YO���F�kb���L��]+.L,)��0c5Z 
[�N���c�Z]N�Z�_�
U������%���B�yK�����|&��%�k��uh��'�Y�=4�j��l!c�f @��� � @��a�;l1f�
$0pE�wgwoR��o��o��W:��D:��-i�vk �[����"�Ur���3:[�����
��3���u�`�fX@1�Mt$Fm����A���4/���kx�d��g�����u�k��j�q"6��%��~*��o#Gw��wfp�U��������vV���{��dbk���[���m6T��m5�.���OF�4�l`,5Op��}&5������	u���tX�'*�Z��o,�4��ID��h�v�������7n�@A��m�9���[K;��m�8�:��=��V��6�A����X��$"��U��H�zub�(�x�FcKN�b���TcwzmQCH��>�X���_S69���pOrc�|�����<>�Q>�]l���b�(�����WV�������qH�v�?��Q\�r�^�x��15�'���Oa
��	�66�
V��/�B�
[m����*KuzjW������R�a|e��f�A�lA��0<�2�7L�o2tD��1��ve�/�,Y�5��q��Q��cD�V���L6}gt`��k��%�Z<�;sdj��Sm��������ok�����4��L�S{n�yw�d�����h��6��n�;�%��d+���ka����	��r��gmE��X�Oa���Q:H>X�a��v[�}��G������8�J���i��\U�?�y� �s���}��=�
v~��� �n�Nr��F$�Ul�Mht�g��3��X5��u ��@�K���S�}^��zt	�F4;������J�eG<_����u��PV�pib��C�]�������h%R�E�(�=���@��w��3��6�s��nlb��������f������*$*BG�:��L�&��`@�_�nA;����z�
*`�"����d��T�j@Lq�_f�
El4	��y$IIO?[�J����'�Ss�<A6����>����GB��+`���:�tCj�0Y��R����d:�#S7 qQ�.s������8�X���;o�6��tU=�����
JI��4E3�uX���	�rEF���"��'���T���[���{�b��f���������McC�C7P���k8Z+
T(c^mV�t�k�X�o�a�?�����hgD��F{�fk��kQ�Eq��](�}��i�2���P��Ez��.�zL�$�����)�zP5r�b�2ex�V����>E%����`���S�]�6t9� ��������������A�"��84��C����<��/����}�$�=NM�$�^�����*�n����
}��%�D�[31�5D�7�����:Y�?���*v����<����6gO�[qC��7�Lwa�A��>~����C;K��B�d<,�$zTF!���+
����=~LFV���_���:.���)��P	�����$X���� ��>r+C�J��|9��{L?���6z(�C�l
�k�1Mdc�=:�d}���B��P�����f!(����)��P�>�xw��=�LQ���������Ki�]��;���lGf�'eA��������k����M���O�������]�`��3��r�aS=�1��tl��oA��Bf��� VKj�VK��p��u({�����AI��v��t���P����_1B&�%j~LS���#������{4vH�q:q�+j�����Xi�Y/��}�I�@�!	-����
D���ho=��-�nS����O0
��DO��2�(g]n#���x�fR�#h7��3tI&~��������!t�w@h��������Bzi�c�E�`D.��yh�	oN��/c� P~�@����������F�	u���,�S&ZM�0�NZ��
���� �����`���w�P���1#H�q%�(.�u�N��E�g�/F,���`����R�9�"�)��Q���y��;�4+�P%�����*�QB6��c1��w#
�e[I�	Z8R��N���|rh����d'�+(`i�hHZ5"�P$����,M��[�
��+�V
X�5�,zE5�����>����I��Q���N�#*	I��I}��_�e�=I'0(�75(�F3=�dY+���#�Am����P�s������F��F��P�6)����:��vG�w�q~T�*�lUG`��3`TOL� �||1��kQ���������4��] � ���y|,F��4�8��\���jh���h�a�`�M*�8��=����8;���I�/�aU���	Q������M��Q��%��",(F����e'�5G\�V��!���'c�-��ne�fF���8D=�a�`#�a�`���&������+��`��u���%W��)����D������
�"��1�0v}�
���b ����i�FX���*]h�VH��2�R�"K��3��s���:a�:�E� F���l :���4T����!�&�������r,��UF����8� @P<��2~ ���m����N�_ZC�	����������z����$�����1(��Jm�����
l�"Y�U�j6�^���1>=����{��V8n���h�@�^ckc��Yo�p����5.�-�eB@Hr��4J�:��8%�"��23�1Xb���L���PE�:�aIf��'<_AY�~_���G�)a�RH��y#���3�+��eY#?0��.���~�;�4�MwR��8,	K�!�V���O(m=<[�^
�f���o��3��Mx�
�l�N������1��GTn�3 ��|B��i��f���K��j���.��Bk�iA��y^��
F��4� 4Q���(�M��!~sT9M�������	����l8? }�_L���q�^�4� $Jg��N�3NL��������8{{j>/l�8��������#-'�fth��_�������Q���Cq���4�)����*�g��"��m�AB�!���<�6�J�Q�ocj+�k�X�>�4� %�B�i�a��LV�z�4�������No��hd�������a��Xs3
l0��.�D�����Z$���N ���g��~���,�� �Yeg���U��'�V�mc��P���w��N�+uN��|���@�����3i��3�����.��1�Bcvp]�k����������%e�e����;����zj14/40��P��{PXrA?�z�L
�0���LA&3���	����iP��^����;K�����������J�|��S!�A.��^Y������h���V��d�5�
A�A����p����Es&�>!�q!"�� N�]G�O���OC
��~MP��6���1ZA�&L�`��0
�tSP3l���${��r���L��6+!g���L��/i.��E�>B.���'�x�y)��JQ,�.>��]�%����a��&6hj��������(T?w�/b(�O�������������O[@i�j,!Hw�N������i�x?;���*����^n�����#I�z��6Q����Be���l�B���W�0%��A��Qb�ZDG���)��d��8���$nf�\��5���y}�Jn�������g���#f��3���O�v�5P��qP�{#u�2�0�S��ay7D�����P�����NZmjv��pm�=�E9h2}h�������?�8�b�ib~�����j���/
*�W�K���Q�\�;��"f6z�1Y��.�(Z���\Vh���A�hRa(�����3�C���������{��I�zg)Z��1u������YhE��2�UKL9���1���*�U��=�
v/E#��v�U����P!H���^��F���i���4<,<�C��i��h�Yom%^Z�=�H�-Zu�6�n�����]�*�T6�����_�M���/'*���v��~��p����;[���jJ��"1z%[��q�*z�+�{+�Kw�HYf� j"-�*�j�-C�������)�V����[������4-����6��H'��f�PK�e��`r7SvQ-�:_��@��������rW2�|��G4��$zXW08��Ba�^b$d���`�)�Zl��hq{�Y�b��,������V���Q$����k��|��!�C��!h��FC��5R��JuDVP�:E1���`Fak��C3'�KZ_�L���a��k�y����J��Nt�^�5�*�
���N<���	j��Z�����zi�/Lh�-@3�����S�-�F:t:(�
��~twL5��n�wx����l�8}��3��sS�N�yG1o��<����U�rEM��M�v�������0��
4�{g�`�x2��R�?B6kl�_?I7�G���%�G��X��R�v��Bx�����KY��N���D�e���?8?}d	�f����Ni1���h2��sW����t�����s��*���z��1�!�;�%{��v�M6u�wlvh7��3h��au� m[
���.d`C�[���5�Q��U������]�8��[��g1��2����(�:;���I�l#�����@G����&{��I���c94��i���6~!���g�;-���y�1��m(���m��06��6��U�FCp����cl��Cr��\���S�����;��1Us��p��F|X��6.���>�{M����k��H�]D�%1q��
I���.K�Sf��#PK�����1���[Bm�&i��6![�:��@�g����H��\�����%l#Ny�4*mx8��U{G�H��>�:������"L�T�C"$E���Q�w������D�x �ei�N���=0����X��sf�q�������6��;T��������)��@ ���A.�������'���-c�F��?D]�-l��}�eu��FF&�e���w��
Z��'dB���s"�V���B��I;����[��}�w�a;w2��,�U�j�Yu�vO�NVsh�5���G���sbE�Zp�����h'
h��\�#�����^iVW��m�Q�=�;
�p�"������C���gF}[[5�
tO2�=�I|�K�u&"����� �8e
���� ��QojsP��2�dL����-n�'%������v2��b�^��1s�G�-�D�����A�����qp�%������I��&g&�Q��6QPWr��ID>v����;Z�
b'�AAPw����oVx�IJM��S!c�����0�0�#?�v�����Y��^���Q�M�0��8I/�����2�,��@H������O����`���e��v�#v������������B�/�O����b_r"J����o�����2��E�5bq�u����W ;�D�����6�!2����Wg,��'e4�/&W}��H{��xl-)��1X}�;E�8i�u�h(�m�`�`Ea��3m���Q+�����^����'D������kb}{C
��k�U�����z:�`�1�pdRp�n�'b�.�@�h��"��t2L�g��$����F�>Ck��4B0�,I�0�<�!��MFC[�et
u��hP���^a-�����}m�����Om�>���_��x��Q��x@-�c�A��BM�cha#��K���	�l�W���
�Y���3��#rD��a��'^K��(�������c��#i�1� ���| P�����>5����ZP'��l��l����\]�=���Eo�-�$����F�-���Q +��;�6���$;(�V�Y+�����u����b#
��`T���l��B,��
���0�6l�R��i�W�'9�;��~����I_>����N�]��m�*fU8�o�-��������-67�4�@>F�����Z)S�M�:{���P��	�0�IK��b�I�9��(�1��Y��s�T���k�	Q�V���������g���O��Ij`��6�DBN����g�:��~��c>�����w��+?V���iSc�����$\�~��-��p7k	?2w*�kZkL�v�+�\��D,�#�Z>#-����;���u�Q�!>�>l��;���cK\�$�'YO
�|"B�1���#�����
M�"�):F�]���z�����B����j�o
5����w����5��;+���(-��9�C
�����K}p����R���c�A���~m@E<Q9��|��cT�iNE� O�"�iY�����4c�c�`�I.P-������'��'}5Q�-PA�����'	��'��w�=��w7
h�l9A�V!&��3������3!/�=�_��� l����=��9�Q�5��i��75�=Q:�2��#�s�*�42�������P�������Y�-X���Gq;���c
vP�w�S��k�Cw���X�{CZ#��^���"\��1c��V�G0���(���L�J����iU#|��5��uYK����F����O�G���1�9|/d[)��=`~�{	^��]4%M�����f?I�Vd��d�wx�w��K�e�s�������Cd��?9���c�����q8�������p��H��^#=��y���;�K$���A;�g�j�H'l�J��(99�#K�u4(�K%��N:����-}�;t�{��_A ��r������2�4��@�!&73���{�i7���	!�}G��@^P��(y?�*����.��*6i[T�����q�8��&��m�J0������}y�^��j���;(��!1� ��;<�L��|Z>-��4���H�����S���jw�7�'�K�C��;2��	%�H/w���4���P,�;�L$V\gWN���}/���N���"��
���Ga����ztO���o�����A�m��lXA8�lH��YB3z���o����X����YI���Fz��u��0���~�����
��U;SDk�a��X$����4��;���Z���A^����*���������b���,t�k�ai�a���+��48��r;��9-[(�,�g������]�_{�68��x�w���%
���ww������^V��4�^&�4�}^_�Om��j��0�fy%�|����*�������&��F�V'^�&:��K$c	�N��>u�|���B�N���B
�@������P��;�,����&�x�o��Z��Fc�oAU,,�Yx�'��!J�yG��9��6�=����5>���~+Z��i�z���T�,6��?�8�h]���lx�z��������N������JUi��,��c�na���w`X#;�[���y�yg.��cdws��~F�-��Ng?�Ne'��\�8���;��
�
�&���if�pk���1�I_� �&D��H<14Y�AS���e�x*�]�D����|BBk����W����D��&���/��{���|�%H���7��RR�����Q�")�����X���8�bF�����K	�\���F�����R��������i��tD���6����U{%�����Z=F�M�b�@�r�N*����$�������"��.I����a�
�"�<mU�2(m��$
v���Z��(��	����aQ��9h}A��] �d�I�H�In�K�!M����������9���@�g��-D����g1������K&��k��9{*:�y���S!�����U�q]�&t�?Q�w�A0���F���h�����h�W��c�`t�.}�uEx��h��^(VI�'�����`4�I����� 0�W8�g������,n5���-(my��g�z�A�Pd�����k�tU.���������I;e��bhAMq$u�e�h����u���:%QD�W���"��������2��7�/�<x4�$
44v4�0�d��]���$�Tr��.*1S���4b�e����������m�'�dW�yNW�����&��5�E�Zl�5��4k��O�po�`����T��-����.�g��F4=g� t�b�a�b�*��F�.F��+cLY����(,&�Y�������I��!lW��
�D���w�%j.���v5�����&F{�-��>Sh1 ���O�	O:��������A�����x����6�f���v�+Y���:ru���OO���Z�]�O�>���H*���O�f�%i�����h"�1Ig!V�$�A�	���`[�C��b����Qfl�IR�=6w�?i��<j�=*F���Q�{
�`�Jg��q%mu����qX��{Ut,l"z�5�J����p24d%�Z���2�zu82]���,��5��Q3(�S���	JY��7��I
���k5��V��$7����L��T=�3�i��,�0�pqZ�{�h�+�]c������h2��&~�dm����p+v[5����@�y5!�H�U�v�c]P=Y�M����QX�4jK��H�}56!Ws����%jW�
�����F	��F�*#�{���(��2=�
2I��z�5.7M�����*��}�i�����?�a��{
O7��n5��9/+����3��r�N��/9���F���c�
bV�k���2T����-
-�/�N�eJ~�(b��T�LaX��t��$�.zm���a�VcSCk���O��`q+%
�������M����|���*D�������H�2#P0���)O�����*����R]��[1�$-�y���l��O�:"C�YW����������}<��BAn��0Z�Pk���Y�+�	=6��u53]���K�#X=�����t{���j�f��Z]���vMp�}�J�Cn��V�������85��E*�:���{	��������=2�U��{je��jPB�.���� ��r�K����{��^<��h%���A\��F�0}��\VG����g���������NktB���*SW��Tb�[��01��6��.d������> �`ev�_E?>U�mU������N�2�@2e��.��'�)[�E���Z
��I����
��"����7Qp����6�X}
u��a�����0�P��{PM� �����������]c��f��~$�KDA/�~)w�������LAQO�'O�?�)DO�8����6w��TM�&j"d�����6�������u�<J��]'�V�����#���D���R��z~"/9��X��_��a�M;Z���KoT��'� �5r��j:?��m|}#t�hI{P�������F����Y�[��V�m�c>���y��ej���L�fCe�m��2!A-z�_��$��zF��@��]�n�_������@�&M��<��q[���u�Yjb#�}Q*V'L�~��_�,'�b�v
�T�`������w$BZ�md-o�T%����8�"��.�(��i`,���hUw#A�z�l�7����{d�����B6"�
m����� t&l��f��+�	�Mo;3nI��.�G��!��s� �f�a���E�E��q�Gn�a��U�&�8��
�����D��1�PB�;r������a���a��`?�'Q\��6�Ng��tUf�w}Ss�-�FT�1�D3�����a=���������Hc��qE���4�7��/=�$�[�ydC��?�}�u�!�Jv�������;08����@FG��<i��h	u�W�0$���p'���� 6�4�/�ggX���B�����������
7�)�\���`��;<>O�xpJi�k��������bG�hE�Pvy/#���l�2�}�wuG�h�Z���F���4���<����ev�����Q3�p��6
*��@4���
���n���_��d�������L��Ml���>��lQ?��5R~�C�V��W�.�w*0��v���������v���I�h�g�������NJ��IR�nQ:X+��vT_h������G�Gi��5����p�{#����������j���>���&9�1��!�f>�jj::�:�v�.��m�����B �����Vt���N�(Z��������v~�
��W,#y���c+��tL|���&�P��?�`��Id��%�����NsGv��w
�B�u2]�/��uzt�����������W��@�J7�&�}��>�����8�_��3�#�O����t"c�B��=B��h��"
��!�]�a�"��A��}�=�o�G Q���^=���D�J7!������y2�(����KLe�i�������"j/�J�d����6�'%�@�?��ZQ��!B w/���o�������L+�������5q��p(��y%kE@m���$�N���*�n�B�T�V���.��-������a�����&���
$8����n��	���q��*����C����/H7(!�$;zv��i�U�2	1���D��fx�b_:�����ax_AcH��c��$�V���
�>����E��=���c=N&x��Q�i��������0 U�)f�q���{����b/$����Q+����?��6��v��J�V��V�g��
Q��� ����L�$?���2hdF�d����U�/nU^���+xB�_n��H���~p\����d���\�eQ$��c��>�1a��K�D���D����@��}�3�%��i\�,H�Vqz�
h4�$�X��k����#���^�m!������������������b������N/��9���������k����pX�%l���c�$���F$������m�)�����Cw��CcqzP��x(����6����t4����d����w`O�C�J�����������������u3���vX��^��-=VK����>��5������Z��,�2k��G�w�!�x ����&:�Qa����C��<��z��y�/}X8,�����ov���<��4�k;�sy�lu�d��L��FC����#� �{Zj(���qI��{���&dc�"c"�ny� �w(�4�l��!���k������^�|�+z�Vw��$�YAX�0��X�{z��=��;�x���MRgr#y��R��P����AhC��V�b�q��7�0�Pc'�HY�ny���E1d���]TO�O!4K��>�E��aXB��u���P��D�/�������#(��r9;=	���5J���4a�3�/}���<iM�F;b����aC�b_,�A1pB��a�B����%��u���Q"PT��~���Z�Qb���?�C����
���Wd+=t�8dI0��%�R������ta�#��r������(�h���V����SI��x,�J�#��
�����`*�P52�]��o
�F|��o^J(Bm��b�-eJ�oF�1��*~K��V�Bf�����i�z�?�]����>X+b�PG~��K}|��'�0��`���/�&d��R#�i$�������h13T��I�H���x�)@H�6U������gTK#s��EW�����O ��p����\]�c8�^,����>a������������^�p*�'!t�M7b����|��/���"�G@��5�#	K�Z�o&����O�����zO��l�����{��������3^1��b��Hp5�Z����8�]����J����3�����`A���&�}�'����������H(v����>ZS��#yH�8��x~�Y�`|.M-�s/F/*r@�i�����������55e~�f���5IJ4�h@�q+�6f���v��]�DD�nH)��3f�HWY?�/�qgbK���R5�
#��a\������L��6�6�}Qh�a2vV�1���k#�*����. 9s�( �$��(������������%"���uuA$
���@����6&���q�mvQ������=������@���M��!d�(��t1vme�r�v�|�]�[F�yvvy������[����
Y�Q�)[�jT��'}�rv]��<���':
Q��S��%Y����L����X��4b��N�<��)L�FB�di�g��#�O����$qj�pC�%K�,xR�XLc�8W�����xx��k��h�3�����1GR7�E��h)6���`K���l���H��8c�����	���%�M������I�f
��S���.�og?��_u���	b�8<k���C7��Q�5�6����+x��n�A��|�\1�p4����j�Y����Nd3�q�8��fl�����0��������yN�Z��
��|�4���(�-3	�����D��j��F����<
E���lg��2�������fl�$�_��.�DM��p�[/��rr8
H�) �}��'0#����?�4���S��@��`������eE�/��N��l���I�t�_���X��&)?�ydy�3XD"��H�z�H�h�w�������V�P��^Z7�V�z��Ew�J���g&jB���@�.���^�[��]�f�Vc�:�NDK��/����~�Q]H�!6��_(��M��.�������b�I�����b�$O�>BE������	��?gz0���B0�C-S�#�nmj�vL���_/}�<��X�\�%���Y]��!#u���� �����-c�2��+�
��t�s�1Q�������!���f��-����i;@4c����v��Qo�c_��C���]��T0X1����*�Qj�#=�%LtF~1�7����������0
d4�O�fw����U�8H8�^-j�#k�!����4���[(B@������0��#)�m'����uR�������>o���akz
�rJ��,�4�UH�>�@t�i0C-G%%X�%p��}!��\����&�r��\�(��e�9���f���yE?�.�L���2�*W��BU�"�q�����b\W�@��N�e��+vM�q��&R_H��n���s��]�����K���D_��s�^"��Y(d��t��!��J���+���x��0o���*����U�"�e�B�[�i��b�PQ��Ao���z E���N;�h_%���W{'��.���+��
n�=�,��.�gir�yp�P��@6�m��x�V�2�!���u������bE4�L�V��(���Lo���b�i�gE<��'n�*Tai+D��+Z
��/��6`�$�w���B0,���m����%�x�T�2��Q��,�p�P��RHY[x}������tRc9'�8��3�h6�
Z��IA�b3{OKC�w�B�@R+J���n���W�&P
���n�������E$&�}��*��1�+�	I��)E+Q�.Z��D��/f�B�]�������&m��I����CD�e�B��R�Nd)�����>�-&�-ZX.�2v!>��2����g�����0A��y���5�V�(�&d�3�L�B�q>�8C9���#�7��[���J���w��]�A^�����Jq�5""C��
�X��"3Z��X�P���A�5����q���PNZc����O<W������%��|�\3�v������Z��D�i��C���1��@��h���|@��(��
��@|(Yv��M��:�J�?�h��a�1[@���q�C���:���O�����������+xb�4�Z��w�K$g
���=I�ji�Y��+�b�*c�}"�~���N<������A��u�����d�9+�U��+�w������V�}~e�}�G�\f�>��$�T�9,�elP9 ��\��0�{b�B��S�OjzgP u�:�a�kde��-	N^�]�[I�bJ�um��%�S�����P���|����$0���1b��K,���I���@���7���@����/v���k���9����G��F��>h��3n�ulC�h�~���E4��6�%:bU������:'�OQ������zc;����������<���x�Y*��zK�TE]�m������!d�)�S���dJ xoEX�.a��{��a�P�#~�HJ\n��?�����m�@5���d�f�������
1����h��Q�>�A�S�(��i�����t��u'Br�����Qz
3��mw�e���C��;)�Hd����A���s1�n�Lj4�yG� �F�I�-�V�%Fp�i����<I�]l��H�t��3�����vE������-����������C0���d=�?���@#G�)4(��*�qx�v�_����	;����g%�S���>I�Ki������^��E����,~�=�X(�N�D���7�}���������B�=Z�WO��[�2_P��~�G��brOc��L���R�<B�:���
����{&�F�;K�B����~g1����8%9y�������������c���\t6Sgj�F�����-w5�${�j���d�zGn���H\)�%��������~�=l#z���&��E�hx�-�R�������Q���g�w��	2���/wa���`��-���L��[YM���;����{����'��U�'�^D2�En��O79�+(.�Y,�q�RI����DT��$v��{���g���8AU
�f�N��S��6B ��V�/v����j�G<%����������Hb�mC���
(l�#������Rx�.@����q�D�mw��N�i|�	$�~�J'

�Y���$9�WY����a��������/=��:,��$8��X����J�Q�����Os��P�3��'�]����_�7�����B�������x���f���t�_]�*��~|:`����t8��Z�S�n�v���9�=��A[�m����
�q�Wo�'Uo���R�i]��10��������_���N@�;������4mBRk��k�j���e������bJM'��N�Q
���PK�`6�'�G��K��z\'.HB��9�D5���7w�
^���^q�Dq?F
&J@;QH{���t�f���s���p�i�3"����\�>�$/�J��C�i��)�F��%-�y3X�����q��4�s1���c8�I����@����,T��2(��s��2���`������q���*��Fb���_E@o��<z�-"�����r1B�9��?|!v�	�0?2��k�@kY�*�u�f�	��g��3�v<)dQ��${�����'�
w��)
s^<#X�dO�$��vF�t�-{�� �3�(F�b�o|8��}dQw����
��(���k�:��U�F'��.�c����-�#"��@{U �IyB�h���h��P�����F����@}�j��p�L�7�0j���jLB*Y)
�89Q�~�ho����h��s�9m�-�'��i<���PW�Fx�I��8��
�.��n �`��aJ�cP���r��h����>���7����1��Ply/��8':�B:Q"4�*
7��F�8� *�<Np�Z�?��a�h�������H,�y$cQ$��Pt�����..�(v�5�t$�:��	��mQO���aq�O����vK�
��hjJ�����'}��&��:�EH�Vm�V$��P���������ul�3���t ��1��8�'�����hRJf����pC#V�1����Sx��4������2Q�d1J�w��'2����v��x���m������������J �N6��B�o����(����<_�KV1
c"���B.��H��2!��:Y�v�+�|M��? U�P���K$���w�}j��'����1NA��w���A�I!#�������3�&�����	�y�#r�wP�&���@��w�����^c����jm|.��K�^����LF�(���D�gA1��E�^A����x��X))�GN}��,��;����`C4���<�H��i����4���Mz������
�)2����J���nmY�2B;�E�b�74�5"�b?�S���K�0�K$��$�Y�/����k�>B�� ���I��~5�~*e��~�N3�x(����'���2���-�p!��wp�}m����z�Q���E����2�y�����3C:e�/$�F��[�.����'�F*�#����{���(��7��90�FY��5L�CD��L�����&fN� ��do��IMr�<'~A'u�#]���'������`�9��V�����L�5P��O�{�C����f�e��$�k�T#�����	%���h��0��P'�n{�����{
�dd������8�m��9����

�I��}�F��=��������>����Zs��|�z��@n.�1x��r�?���_�kl�	\PK�f=	E����#)(���L�.�	��z�i8X�d�`���*���g>	u����)`���?��?����+Z�d����(�0c#�v�Y1��:�^�98�g�)�0zr;v�lP�y��^�1����:��*L/�{���^�����2K|�F����4h�{k���?g4A.�"h�W��P� ���<��]g+Q �!N��JP��v�:�e{5����g�������hJ���Ja�u7�5%�l�Rh����N1� ,�y:��cP�������!�<1�e���1B�8�#�x��
5#K��k�����N+�vOy��Z:|���Ge�����>����b��Y�hU-%vm6- ��l�8�&:q�O����7�e:�`��	��i��|���q�;P�0~I��Y�?�IK����d #Qvq���TG�h1~�h}�:@:�S�h��&n1L�@����������^h�/FH_�	���>�z�lL�����[�[�0�sH<m�+r���Y�a��Z&��6<��Q�]H��*�b��n�;(j?v�1lxh������x#�s)��q�)Ii�s�fk1R��e�H���S�t�A�owFc{���K���^���@Rj�#u=Jr�����~wL�l��y���:js�(�I]��u�J��&.���c)��%hG�?4p���������L6���,�(=%.GJQ��8���d�����gnt;���y��o���G�i���V)�`��A�j�+J�^�!�2r��?
~�������k�q�<%qV���.J[��L2��A��v���d���x�nA�����~h��)���pV�����n8a�u�p�`[q�e�����P�&lD�)��X/�1�����4I��s�����T�+Im����Z�)Z�*"A��������7+������1���;b�t!�F��v�e	/���<}���$���,+��4����fJ�	l��2AI����<�{~��%�+�
������5�W�fM�:��^��.���|�-$;�%!A	m���)��8��La���W�����=$C���������R���TY���0��t��@��Sb��6�����2s�E��X
9�p����_���`Ih���������5t�h������7Ij$tm}J�C�j��.j��a���(��!�5��p�'�,6(P�]�5_�;�T�zi��<>!�y����|H�Q�:L4��Q��,���@_hMd�2�$\�X����x�Ff@��Y��\l�������u�j$R���"�������J����k<�X��k����%�S�OM8b"����@h��%%�F,���{H�_�BVu�u����j�}�s�<�����5�;����H��B�_������j4��w>�E�]��J�~�P5���-KT�#��tP��}{�"�{�A�M�n���D�P>����(W����&w3A���AGm9��K;`*�{��7��;������~C���Pe4�"N�*N�����31�~E�w7)�d��!�2�=��B��MIj�a�n�s���^�8����"
zEb
+VC�H�X
7����m�� d�F���p5���Kw!?��P{��o��Ht�5CZY�-%1y�(�{?����3�� H+>�S�N5� A���t8���h����+t�~�{�)���-� �w:�op�O�����#��N�m��V���1!+��zW5�[,f�V�X�������%��ma�hd��������D��"Sdt/olo7�0�&�Z0�x'\CXL�ij��D��U��jr��.P���'��JwaD���e����JW�}+��h�2J��N�~�	�MNSk\hj�XK6���)���1G�L���X������"(�E�@���n�)��y��t4�j���y:�����#�1�dm��;�
3PB�������'���" �ou�_��%�l�'=Y�cEs	qqo$�E��d��9���������<�'F���o�+l=7 �:
;��w�n��j(`�����~O�����X�r�{���;��R�([�X��f@��Mx�}l���s#e�|>����Z�(�_="_����|cZ�f}T�HsZ�t�hFt*R������S%��9{�'SN�d'��(��4��C[���=�"f&�t�
�2�������@Z�]��\�����v<��'��e-�����\j����EP=;��$,���%����F����{`*�iZ���e2�Vr|���������g�r�GX�3JT�8Y�G����g�d+v�a�-u.n��fJ�����������f�`��h�u<��\3z �������k�+-�-����
��y`��iF�����	0?���
�?�:��2��X�%@��Ml�i9��1Y�>�t�{Y�����L�b��4@���E�0s��0�U�4����:67�����n�l��&?A��Q`VT���0�1��!���>��=@��%6��=��$�Y�f��=G�'��
!��{3d ��8-��2�dUD�Dee���L���P��� �
�af�	�b�t����'�B��f��M�E	��i$�E����T2<>E�*��K�q�
Ye6��������f�E�,3���i���-������������/p��4��J�r�p
PO�����1�&�e[��7��ZB���ZQ�1nS�6i�7��vc@���VD�n&h� 7��?������P����O�s��7j)l}�
?0�Y	��3,OO�^��&������,[�����
�$*t��h��!���a ��%� {�(=��vd�����.��L���XB�H��+��&����
$�����@a�*��b�3q*�m��APK\�f�|d���������}f�������x�$�������p6x9���V��Bo������!��=��K��O���:��fw0���)���Q��B}����<EWgIA�L���dg��N|�{@4��[�*�:�3�'�i]�hd��������BV�l?����e�;�p#Jw���JwZ&�B8�%[������4]��u���h	R|)���/BY�!��y�(� \��-A��5�{\���/b;���F��D�����*[�����~�H]���G�����f��<z�����e6�c���gF���l6�Ve����k$��N�K=;��dA���F���.N>72��}�G��(�t����88�5D�f�;��t��0�RO��������?S�Ne��~Qo�n������[�~�[^�5�m���MQe>��a?(&�S	���x��6D7�V�t�/{�1�|����F r`%5h�I>�uR���s6��"z�Q
���G����� �}/)!te]����x#l�JN�K�3��4�}<�F/���?���0d}�*^d��p`rIn��>e��PbC7<��I����=	�� RjOp�t1J9E|�>6����(U0
��� �����_��K(�����	����L�	����e~�k�j��c@4uB�U�,����u~o�Q�3���e�?����||R��M4ZpW�jo4%
��a*���*��X���}E���+����8N�����B����!%��\��EF[
4�������������{`��C'"��C+t�;<�)[74��@J	��b`G�af�ok��[A3�f6^�?7!���5:PE3Rn��H2�����9��� ��8��f���:���p'�=��O�1k���UKF	�uM�f,��Z�s�he������t�X.,r��F*B}����?�D��e[�xcKvp�a�d�P��2�b=��vDp�-S=y
l���+S�����F��[�11�x����Y����0X0L���>�\rK����-$�t�R%����#B�.��|���������QF)��Z���oh@�HD��a�@{��XbsF�	*P&�-bb���Q�_��,����V_�k$�0r ���v�a��v�����e��ZK�K�
���EDh������z\������$�IP?{D�-�8�l�X6j��3��#�k��'�@�����JI������-��PK� 
�	����|�%4��v`���G3�����_7����0v�P�:j�������4�������$��u/�O�g�ym�2H-dw4�4{TFE�E�ZI���{�����n�<L��y���A�����uu������������i��c�=�1?.�RD4�g6$�M]cl)6<����T��q�4Wh�m	Kv��n|`������������y�����e���x;�0c���d��/
mA
9��#,�g�]����*�G$"����1��7�f�!�K�]�I/�������
���e�~[j4�������&����3��@�li�G��X���~��/�$K*��%�!��D�$#-$���J�UF�>
B�G�G�O#z�S1Q$�y�������,�)����g�d&���5�6$��.��	��I[�+XPP!�m�?h*���E�kI1�����/�D�k���I�����]	n���&�
�����wINqa���n��Q��{3SMtC	�����1>��%��-.��A+v �8��{u\5���*,	�y�b���/��7�x�S����c�<����]
?��e5���	��}���{7�v��4�R����"X�k�w�md� 7��!U��%�p7\"|����;�f�] �Ui��0����I��}h���0��y�U�8w�C_��'C�Bt\5�f`	�T��r�����.��b�4����1v�`������f��U�KM��)�:����ygL�
�e���"�"l������d>���/�gV�cu����D�Z��"����4Q�7�L���z6J��%���/-��u}�?�yK�W�<�	LvS�b+v�X�W9^}>���"�W����I�,��������@S��
1Cg�%��:�����3L����	zz5�}h�X���t��M��k�������A����2��Y��p�����)e��������MvJo�F!�}���8K����u��Ne�q$�P����
�������S9Z0�4F�Q�3[���(g����,�~� �Gb�[����-��\�p�!�g`�J	"3��w����d��G�d��$qt!o����J]T�qp���I��������e���56����;����mdQT\y���8����pd�����PJ{t.��%d��0�i�����;��D���w�B�v��.�%��4��y�P�z��L�cs7��C:�7F3��vD5����85?��{�-*��!�jR�JE��lDC��J�[�v22�!y���F5�������i���yL�1�j��UV�$5
h��9��$���,,h���81�a�ig��z�D��$�L�%9N���n�����l�%3A]l^$+A��w�p��m)6�f�_(f[�m�;�8b��S�0���]d����>|u��!���#�Ez4�����+X~�6[e�yA�x�G��+F���(��-yq&g���������P��Cx���g�.�B������@���N���,�'�J#�p*���4��	?�fXw�]
���&���'\�����P����,c����E��8���i���e�7LCz�L�;?���.K��F*X�������Y!�w���E���"d!J�b�8�B�I��?h+�s�F[�z�)����RI��+[��	d�X���CZ?��0{���m"R�2~��z=�����qhY����eDB��Yd���9�;�V%�:�#�c���2 ���J�B%V������Mt�\QD�tM��:0 ,n}pD@���HE��H�%��5q�
"q7ey���N��B;k(���,�:9��E���a��?0e��Y�6MLY!��k�R���]IN@��U��4Xf�h>������( ���T=�����Z����W/�##��$���I�*�Q���������V���_pW������n(���>2�4|Xp�c���]������0���5���H$�n����$H
�-�a��3��26�f��:���2�
Ca)%�c,c�/P����-��s����e$��s������/���B^E5_�B��������;�
������+y������eHB����{k�g|'����w�pI_�}���|�W��z�h`����Tv�G4s�OI��n��mH��W5�6U�������I$
�f[k�w��'&�[c�V4+0Q�r��bPF�R!���2N����+6L��\�c�����`����Y$��}�'Ztu��L�'1{�>\�t��$����&;�w���Nq1d�o�v4�X^��ZBDg���6�_u�w�^6�Do���R.�PL~��b��pv����R�&f��V���O��6���TGUM�y]���S����s��������������YK��Z���i,�������$�I������r	}/�PH��NT�����HS��g�A�2Y;H���8�k����<}tC�Z,����9�C���d�Z���[������S]�2���qb���K�:4�����BM$��b�d�{^�0��������,"��~�N��d��T`�}F]�����0!l[7�D����	���Hr9�X���X��P�a�	K�P�U1��s&y�����m����e��xw��;9���xZ1C�.��n���SG���#-@}�m<� Ty��&I���MT�*�v�A�=���$�el�Kd�����qJ�.�L�B����$0�����0�l)Xi�
5l�����}6=�l:(��c'�����-���4�b����6�����\Fw����F��E=��y,��,�>�A�B�����U��%�t+u��n({������1s<����&�L$��1�u�x�)���i��MS�4:	\���wB��%n'��(����V��%�C�?�0��I^���F,�/�e����!Q����BA�A��sa	X��^�C���|+�i2`�����*��b(@2nv����1�o�Y����B�^��uT���D�u�M�Y�l����oYd2���Xp��#�]�D�G����W��bi�Ir7�k���;M������1�;�N?��B �v[_���;��/O�BP��}���tJ��J;1�"�H��DH����G������{�]����zN����d������g�Y���fY����G��do�����y".T6��L
���+�����GL���v�C(4n	���/)
E�Y�7��f�#~!�l���
 <q@/9�J���u0�[�F������,�?4��g���t�F�\L�t���=�.�O#)�C�#wb�<mc�ma����7vxKp�2[����Z�E�q�����/�	��lw������S���,`w��/��p�LBh�v�_H�x�����/�q���o"M�	y������'�9-K�4�~h�O{��g����+��6����#���d����R��t�e�TLJ�=��kOWk� ���n�j��������5�@7�e�)`�%m7��ln�~r$�U����N�~X!Zu��FxWG�#v�������t[���}���� ����^�������S��0��I��������'�6�]�U��uR$jv�����L�
��Yg����!��@^<����,���bt>;54�"�VqP�2�VN�rX*!6�#�Q�(B�1��� C2b����*�x������ �c0A���r����7�3E�@�[����Bq_��pZ��?�6�u�g���/RV�6�V��������H'8A��z1��q4���!/��7(S�8����a����H��������X����!�8�p+�CV$s������#
�nN�cr+��Wl`�vN�������`�k��F;B�Q]M�D3����d4�����Z,��$����W#�a��cTA"��%�Y!ml�a��1.Z����U&7�TOL��]���;�bZ��2������'&F��f��I��e@�F�����Esk�_,��D`��!t+�=3��93�Z����%�Dwg���I�[�#	��W����ik'�1<Ih��&+�b��l��iT�

���[^��w��\���Y�o��s�_S��O��M%Al�����Y���u*�����\���~����X��u�aei��������$��4��P%�r�������:�����gkp@^,��$�AG'��f�27��:���i�Z����?j�B�d-�N��d��yxp?�j����$�s�Cc>'�'�Bg�c��#�����P�sc�Qk�_�{<3p �DV:��wx�5�\��p��0�pt��(�����6�7����;�e�#��d�w��5��?�v8w/d��:��wsG�@Nw��M�1�j���`�z/��fpZ��\�p������s�z��u��u|����'#��m0�B���3T��
��{!�v����>�d���$�E%��J
_�C�.�j����rE����=��d ��;��E������L��>iv�~��HH
� N��B��n�*���7`|�k��{W=`�xGZH O]���#��
G�d�x�0��v��4��j+9*q$�;���^(y�*O[|Z$���|`�]�K�)���{����<m}���#�o�K���-*P�*jXgK]T���f�`���|����&ex�h��;i�X����Z�
���po�2���;�t��A.�nE��^u@��������*r���>MI��sGz=����[�@��:>������u���%(�j���8����%�	�6���fe��;�m9i�A���zh�O�����h�#��M
�-�(�{�V��&�+������sK�~L����&����n���w����*�M���B	��[��R��N��N��hL��w�r(Cs�`�a�������H)I0�{�=,_h�{}�@v2��7��\�{�4J���	~9I4�"�h�Kl�~��
&*�P�B��B�������]?j��1$���6r����]p����@���w�;���n��|G�����%lQ|5���+U{ 	�T=w
.[�'45�4$�y�(�#?�44�<��V|����w��Q���fc��(f�B�;�X�vf�!Yn�:���)(VMJYl�V~/�q���J��&~�v�=���ghBwP4{��V����r�.��4AX���`E��������P,�s}�#s���Sgg�@2��%�H"����+�$�����^)k%2���������f��U�@�<���z�
�������r�"@c�W�o�N�%�3��#QRv�%��
��T�K������i���A����s+�����(�R/Ma����0��0��
�3���6B���md7�Y�LA����1�Q�Y~�4���A���oG�NI���,��W.�T���(j��T�;�<1�6D��b��Kit��6�D�r1���*����\����H%w��w��@��k�����W��n����u�B!Uw�g����[�}����p���	t���h$�S�Euu���Lf��$�EX��@��-)M���d#H�K�('��R��������	tVzUP�����s#��:Ye��&w�+�u��� i����y�����q����Bg��A�f2�pou�63��Js�J�F�,{w3�&�K��0��$O�I�R���-k�[����E	�Q����{I$�}��E����f7�������8�w����@p����"b���.�G�����;�G[q=���
"����<�*3�c��
�Q�3�`���P����}�FD}�Fe���AmD�zk'I���W�
����������%��T��sC}�������j���9�?���C��7�+B���s����|
��wx��M}=�2��n3P"l~ah�5�q.��D�`�(�W	ZFyY��b����������k�O��^��PW�O,����<[������CS��,V��B���RF�z�_�rKx!+��/HR���Ge�A�w����{�W
OuG�.�����6It-����y����������<����L;�%g�#?�Be��;�eX���bx�
�B���)rO�m[Tw\PX�R��M��v���/���6[G���.Q��������&|h�PJ�,��w}�� �A����{��=�u�l���'FJ>���>1�#eL
���$y�A�pG�.����K2�8j�o53Q��>!}��u�j"��l���Y�%�{OQ\h�%7y�-�LORK*2�b�P�_K�h.���)�*`��L+�������Q�1��V��/��k�	�WS�<������'��;�6���\�B0E�R�"�bG�3_�=��#��?����5<��7B��/"�BP�FP�(:���s�������E2�@�]���������l�2�?}�-����mG24�&y�����+���(P7Nt9��T��J0(���?�s����>nM�_z�>�%�^���;��ds9��[�/%�����5�[��s!�z�K�C��e�8Y��M�N������U�z� g�O~�-�g�*bgr/���w��C
���������P��$��2��[V��j;2���*`FS�A��k@@|b�G���^[��D��������m �����(_���S����m�#>�����.����W�x��]6��������H�����]����)���n��J�J����S�=����xD�11��+�
�,�Ap�n	
�#�]5D��`y�wtL���NY�K����@�:wv��/��-��
��]�mF��#�qC$��e!�=�dy���k[e\�P�#��U��gA��!��ib��� ��@���S����/��z]i���n�� IZ]��L@W�]7�	��rD���p��b���^B� �<�:��h5Wd"B��!��wI�v�&����<��M��=Ws>����[qA(����8���&F��a���&b�!
Q=q5��5"�R5��-i�e[�qxz1��N��%�d`v"5NGK��m���5�����y�*�����1
�����d�Q~���z"��v�����g����-��]����I�	��~<:\����~"U&&k����d����#���2�{nIL���x4������x��^(h�7�
�^?���[���r��p�������@�b�t�����-m2��e�����d�L������u�f	��� �XK�|j��[B��T�%EA�gw��H-�br�s���(�C���D&(Jj���V�l�n ��1R&wrt�i_H�m
��B3
�{O�&��!��l��)Aeu3&1����������Mh����QX��F@�����l��C#�B���d��&$��@n��K�Z��W�����>��h�OV'����f8���$��0��OR����p��f4B/��F��^�T����]���h5h��=��������"&���r{���X�������
f@�4
�����/�A������:A5�-�[��`��5i$~��[���������a���C_���A���@�\��^�,`�7vG
�P��uC�a�c��[������#7H��}Z�G�S�RzX4��F�����X���;���K�HZ�b|��z-��]3�J��'(Q^b��Fl���\��`��E_`{cq�vB��Uc��4km&`Mnm�����n]�GX��� Q�e����_�G���@^�_�:jFl��88���o��c�mC�.����)��h��>������� ���!FAj����c*�1����M�n7cV�0���-���q�;������V<�������t����&�-�[4C�<����������u����;�tv��No3M��[aV���H^�b�"NC�����!�z8Lr���W:<�Y����L	��&�V��h��<�KVV!�uX��$�`i�U3U
	e�5�z�w��e������h����/��)W#�����1J�*���G^A�rf�Pf�=)�o��BO����<\� :C7�U���N+����#�O@m����d��6�utc���e�'x���U���F��#w����vk��*��	t��[�w���{�	���K��[�be��^b�$����B72ql�����%\�Z5k/��0:!�[�{���uE]����F���M��S�0�n�BD�c:GK��h���Ic�l	-F,������(�l���4���'�q��F��^ �$�����yL�[�����~�+u���P�����m${����w�{[gn�����_t�O'���Sh��R���bz������Q����'zt�W{�����Og{zK�L��=6H���	�hcrU�6�P-�#�P�<@��q.�a�6���*=qhH,���ntA�AQ?��X��gP.�tW�@���
t�
*oe��~�O������h�%���[�u���6��.+:����HC$�nlA������x����?�������f���*�@T�cVXn��)�
r���P(��T�n�AGAi�{��:j���3�6:���=�T�	����$�O�wLz������}F1����F�!�v���qD��_#���	gV���>?�.���@�b��W=��E����������>�17�{u#���hI\�#����A�d4;�U� ��]	��F)p�������(�x��	������Sk�_��_�]�N�F��Y�����AL��Fd�2��3�EZU��tU&0�����vh��Q������Cws���DA(��hI7b0�E���b�"��M2z��O�(Z���<380-�
XR��(�	G'�!+�"�<f����d�'���������~�a3>�#A!'s�"��0: �K\N��F�"���UD��0����Y��1�o-�<���1�4`g2���d��al`��_!��-�~�Q�g�CI[d�(]&;t�1� ��0D0�e�	*��a=��A���e�*X"{`�00��Z:x��00�L���|��!S��x(�Jo�(f���\;���U�m�AY����	)�G������F�����|�"ar���ah��m�g
C�)�� �Eg��A}�R�����I����)$�RF[C��������5b��X+m��5��F��y���h�K���������{&�����DEc*\MH�D�����VSL�x�a�@5J�C�1~JSD�g=��,���Q����x�
�+0��x&��k���`
"��?g,�f&UA�3���ud�O����*2��BS3�	��#�	:���-a
����RY]�9{j���%Q+��e����a37t!7R���Iy����e����0���#^IwG��$	�Ag�1bXs�i����PcGXw��o'x�%��d)�#�l^E*["������b�\v���5<!�^3�����4DTF4��I���6-� my�$f��a�A��H��[=�=��v�o��F2d�E#;M��(-����#a��V��,�#]��U���R���$��
��w���
����I# �=p�(���g�dj���o2�%���l�K)��Y�C�����N��DPG$�AF���*;[��w������ C[����f���3�*b��s������2<�r�G�Z�[~\:M�'2��4(I����isvG>j����_�A�
c�Hr�OY�<R��-0���L��K�d�G>{�����u�"��3��R).�@;[5��
{(����,�L��,���>��:<OL:����y3=����z�{����)�L��8��f��H�:��A��#��������}��b%G�����Z��p�Y�N=+F,�c�������K��@�NP����(	c]L�"���/]��@#�pmc��G��x5�2B��id .�L���V���?o������Ou��M�1E.��
��n�U���|�}�y:K��%��K<Dt���=��-t��F�����/u��^��W;��(4�#�g�"dB���&q��vd�`���&t��I�P��T�wG��0����a���FC�����l��	�@���aBS4!����ZA�]�V���/\����9��!�����"��tc0���R:
��!/�3�/�	���DD��R�����!�d#�r�����z����~���D�i<�_�_/����i�B�
�Qw|��;�lT�^'����t'��l2�YHW4?�
��a=��l�oXP�c&�fL�������X+I1��~��o�_���������}�J#�����b��c��"��U�L���+���oH6=��������#`��!���f�U?Z���dU�(�>M��R'1�n&��=3�g��a�)�b��U��
�Oc�E������	!�l��%��.�KvFc������*v�Y	M�l!��<�Av���*TfP���3�����i�s%��q����O�sE��seW�'ai�p�.�����w���l�N�s��GrcN�"$�y�P=�����m�V��n�K:P����TZ������������i;�xhd�L�[������p���"���Bcc�1�r�����Q���������5��/��f�����#�b����t��G[P���u�����83h"�����4���e
��������?
���^{@2�����`���D���g����m����a9'��� ��!�"�b%h��I�������YK(���jh��bIV�+����B
�&���WpT��$G�Oh���2���Nlr��>� ���,enEH��g+fJ
G�}k&KP���[�`+��{�(~�5�V"���w'���x���H%��	��t�KOE��8YZ�2����w$���q��{�C����������D�>��&M��e`@O]9{P:��,��Rg��+I�����~p�T�#�j%�u(V4���G�-�����l����}�5.�����%vP�v%=������b+(��#�l�h'Vf��$�*U��[-!GX{���$A]S��v�J�����Ys����_� �j�7KhN���p�bl����w���h����dhY�y�kQP~�=}�m������������F+����%���c�0]����y`G�eTAY��+#T6��/����u$7�>B�����C��Af�"��O���H���w���z�:��m��w��� 	�����2� �*�0tJ_�d@!.��_���-c	�'c[���z�F���_f�](�w1b8]����e$��������c��T�����
�����bE��~���-�M��*	�Dt�elAQe��aC$��X���4 LdjPT���2�`|�e�A�r�^�}��p������t������=V��Ta�I���B�������{��p_"�����mj!v�����'}���|����������m��k��A��(�V����{���K}c+������.��Bt�����������$;(Q�a��e�a!��2�p���WD����8�wcHA!��a
���`D���U�n=��pu����+L����������[��\����d�.�)����2�������m,A�s%�Lmv�1�p�Wt��+�E�[��j�A��?�#nd����t��j[&2[��-u*��,�G��vJP����m8a��l:�h�O�W�>�������rI��^�X����\���5nD�������yN������B����$D��]����P��KN���~������Q8�D����(�@��Gy�s���������Y�)$P/{`�D���J�]�"i�e�����#��5����<��������.�%��E��h��?�~��������T�����	�gWx+���6�������������``Q���K���m�X������oH	�� c����	�������i)	�S�4�}�?i�N�����Fq��
���~b��;9Z��HyhtP��;�b�-l&�,��_��:�G-S���'X��Kb���!9��!Ie��v/?h�f�p�����Mc�f
�`��������%����1�Q8�������v�=l% ���mBk��$*���q����A,���
?H���@��'Acr���������ww���l�%������s %hG��6@Q�7�,w��6{G��Kg7"[nk����J�������yI��>|��0>������B�H��M����{FF�"�A ����<_�?���y�8�4������iz���4vu'oz=	�d!0;Kj�(��W������~E�	�� �bV�l��x�#Z8"��+��B�E��
&��H��VTF�F'���n%�'B�v	��i��i�m#�����
K�������E�>l�2L��H`��S��Y��w(O��t����'��T��!�`�X�	�a���~��!E`�Q^��[�
����ZU�
�D�a?�{���C*��:B�.�O���#�E�e�bC�l���P(�j��e�PQ<�|W�Gt���O9x_D�N�}���]��]�������������y�
���[�������J��S�C�����]"�`���}��tg8%
�u�C��d�:6����#-�E��'���{���6P+":K���|�'�I�8��	`G_�)@�B�	v�����������uJ�m��hd4	1�S.Y�*�N���JG�'7�f��
�'�QA'�S���n`o�'
V�vr>y�]�:~�5���`&y0�35��'�<�ea�'�J�y��R-��
"j���I��
5_d&('mf�rS�s�s�M����I�4�K���m��=�����ph��E)����#�(�$�A�	�7&����1`�7�]��K���h�a����G�y6r��X�}�-��r�UX5z^��^�������w��@��j��H����q<�<}qw������"b�c���BR^Q+�e���LoOB���;�$1���c�a#�������E���n�a�Ba�]�"�Jp�p�e�"iP��$2�-���$2z���i���K�mRK������F�m���>?�L�
�bg�b��/U��`ey$�=)��n�L;�08����F���a���NtwM�q6���( �k7��3=�xF�#�L��TN������I�P��hY1� �_���s���c���>��`���L�-����OINT��E����L�%.\i�'t��p���t�A���9����Yq�co�8B��(S���n�%����H�r��J$E-Aj������������a�gU*;�U�4�+��+H�(�f�c{>S%��?��{��dL��
��c�@�uw����9F�g��2��Wh=��
�;_��L*�+������G�&�p���Q6+O�m�YyZ��,e������m
�_H����A,�`��{O0Y�t##tW`}/d>)0�A�f2��?�����sd�.i
����[d�|�;G������8J: ��^(�<�#���o82�%�<�����	������+Sw�*aB��{!R�	�;���(W:�+c�0���2��J���QR���/7�P����K���	j��R��F��������DHK/L�+����i��Y���^!F�h^�8��=XC�v��$%
�G�����>��[���y~k�L��
\��b0"���B���lP,��I�������!�&�|�h��U���Z��^~S����?7�����<���B�H�^��r2��i���5�>�{	o�w��o
`z����r>���������BX��%<��%$���B��hC'T�w�[#���I����LY�j�F�m�u�elDu��4N�r��TAJ���Z����lh,�^�F����1_n�sH?�����O���w�����0��'[-A��A9P��d��A��xG���2-%��6��B�\�������OT�3��)��m���M�G�
U��lVm��6�P��w?���h[���<�����A��wx2�K�������KZ,�*�`���r]�e��i=�z��
����$�Q���S����0�	aBK`���d�p������k
>��<�I
�D����f���.��Q��d�o�!�����G�3�^�{��m�CdYo��{v���a�a��0jzH�����.h���$���	��^�@��[��������Mt�)��8����/�n��,����!�nB�-/w�YP��^��>a)����P�~]��KO}\�Km�w���j�a�:�Z
D���=WxG^�"%l�D<�y�����+;F��	 �{
K	��2E�����&
���;�B����i2	_���7`���A�3t	���������Kz"�|���k"��^�S4����`I���P� ����+b�	8V��r_+�b�~	cR��|~���DK��)�*�I��s)(�O��R�H��)��{��"�������VK�WT����U	
�(k�X�-��`�$)�4����������bG���g��WJ�6�
�i���A����p�x�Z���nE�Q�q�:��z��6K�B@	��)�������
�e�8�W(8)���x9���o�����IIz��Y�9(�Mo�U��#����I�x/���KlE��$%Z�6����Q�b<BR���������$�m�F$��@�TiQ�����Y�=C!,�����B������P)ZQ�{���;a-F��.2o�<�E$�A�	/�3�[��LL�F,�{@O�x�d��"ZJ�5��Y)Q9�Tg���*���� �S'sd\J�����C�R�6���
�U�]%���6������BB@I~��b1��%��M��Qzzn��V�1~'����L�Y����"����7��7h�DM�b�A��J�y+F�j?�m�q)F�z��I�XN��Y�2���V�����@�2<��>���'pF6X�D� ��a�"T/��D&<�H�/QfI���'�U{E	�>�:�x�h`����f ��%�,��r�a����4�qU��#RD1� ���D0�u!6HZ��h%++*���^�/��Ga%�1�*1)k���;`�p���E/�:J|�Q~����r�Z�H���U�FD�(����aB�9��u�0�w��$�"�r1WJT
���
�S�+#Z����*|F���|�V)�U�]6i���{>��z
�b�`���p�i)�i��n�>/(�	�(
����-
�J���r�"%��j,@l4F�������0����O�����[����@��"w8�������Q&�	X��	��5�;��5��e�0w	����(�	!6{u�_�2��k�X��:*�8�����F��F��4ch�M4&�^��&�9iz����y
9�j4@f�-c��YT��P�8�x�����?l��A��R��F�P���Fz���/�k<����:��H6�����A"5�R%�VV�������G����6R���}����]c\d���e�At��5��{p�U!7JE%^M���M�C5R��Gg�E�����5��q���/����os
���������Z��N(�o�ly?9u�m���!�fm��=���I����X����T����e����f�!�����}@�a/����n�SH%�8S
�SC�X��Z������>���H��hZ��/dCJ0�����R���!Kk�51G�[�T������R��j�����~;�+���
�5������=u���FX����`.\�#�l��.��Y����r_��Zg����PT'����n������0�HUR&�F����@y���������X������gQ��*����K�j�{8c����Bzs2�U���eK5:� h}�317��Q���+���f���Z�k�;�R>�F*@f)��?U�`���d8\�q������a4�����)3D9L���hk���dn����������B����s�����o�����4��1�/(��~I�	c��:�5��
rG������>����f�.����Z7w��#��Q��
��0�q����"%+�����T#OM�"���G�>l/s��a[bt�O� �W=�ezs�z��f[�R]�7����/������?�?7������]��T �B�)�����q��}]2�B�k�����e?'����������(�=���
����G1�}����}����Z��U9 ���&�o�ea�;:��Zd
����E�����_B�@��Z��k`~'-��zR���L+�?��2J_+	���+��C��V��A�f4@gW���tk�gW"_,F�h�dRT�?Y��Gk�����`*��B��f�.�v�C�z�"�5�%ku����8�|H#�"��L�H�,y�N���KM�2*�Z��QW>Qh�
P4�������?PG�D3 A���P+!�9�����$cn�y�����������~:%gDQ�7u��Q�Uv�P(@����4��i���g���@Gve��w��+�n"P�(�
���'���r���]���]�{��P�j�.�|a�����-	J����sPh�q)q��J=�Z��B#�`!s���F��yQ��cB��6R���_t����.����N2#��6-��>h�����h$�e�05��&V�Cv�mIAP��]|g-	�A��/n
*?�W�s��*��oF	�,2\<�b�����%�#C_Y��n�K>A]:$�5bV�{=nac
��
V���-��fl�V�2&�i_��]X���-�F	���|h�i�UA
��)������� �f$a��2��(�Lg�X���	��5t�d��f����`
^T��m���B6�D�d�z�4�.-��M�����i�1������K"n���hpo�A#���;�X�7��k �y��r[��>|�����@����{��_ �@"���y�"M�@�dK���+d���)����#�	b���������"���^�'E��}�'h=z�A$t�P0�������{}������;
U�[h3vgK��L�Z@:����H@;c��O9��L��lZ+S*=i
Ez��hG�~�FAk��Y��������nX�.���'��yE���$����n���s���!�U�E���`���W���R^WO~�d�"�H���=B�{j�E�44s�T�5��������E�#��2������nlb��'A*mcJ�D�,(
%��X������'!��(��~h����<)"`��B��`�H��������!k���e��Q������h� "���F6��{�So��&=�QJO���F��p�x�V= r��	c���
������f��BY�=r�{4E�����w")�JSB�*�{K��>
7r������I�*�@T�t#����	��Uz2JS�������ZH8�
��5�oSGL��L���g����!��v����
juUv�����1�cO�3�+��,���*7�%��P����QW�G!��{]�[�z��-tf����|/b����=�.���hQ��aN��be\ �.���}h`N���t���@b|�
��m����:���,�wd��$[~yh'�A��+DC`�o$������f��$������(��t� :����C�K�QeWK@�v7x+����AS;6Jbri�����t��������_�tv�LD�,1�4�������$<Q�.�O�#%+z
�T<g+�quU���wXylHD��<;l�8��W4�A���LN
�����WV�b���8��W�C�\�eq�{u��^
mf���~��^���t���5��v��EWwP< |�K#�[�cv�72X���Wb�8U���e��XC ���Q�h$�����|4���t�j�/���������p�nC�,,A��WI��+2�!'�����8��;�Q�����q��������4:���F2��Tw��
gl�t�����
]��J8.�U�����������mF,������'>23����A/��y�O\E����B	UH`;�t�T���|;�j��9��t'�HZ����+z����Y��kX�(��x�wR{���x2��`TC�CY�*��x��F�7�	��H�����0c/�]A+�xb��R:i�D3{��~�C@+���EYc�;�h����b�m&2I%��$�-4�	'F���6�BS93�A��aCj<0'�a�b���p�Y��_��w�����ej����i�De��k)��,[]f2c$�^k��5T��)$��Q�9����vf������)����/��t���&�8��n��
����MB�"�K�f�����h��r>I��g�����O��0%�c�Uv��G����(��<p��{�����]�p:3[��m���X����@��^��X
o�+*�6�4����0���a����
CFG����R�}�0��n�Km=z��Q��u1��aT�$?}Z�������_��m4c�l�u��F�
Qn�|v�P4R��;7j���=&P���R��0�q�&�,�b#�:���6|�%j��6�@�t7�o�]<��4b��*��F���'x�V�B�@�a����axb)�!Ec�	E#�yG{+�pDA��0��|;�v~��5=$E�B�:��vj)�d!�z�����@��rEO���#���r$3�5t�G������1�V��8�lC�F���Z��@��hK���N��B�6�G��3:>q�a[����H6#�O�x����;�<��0F5r����9(0�`�O�H��I�i���h����?�b�����h
nI�%g�
�V2�R
��*2��~��bDF�P��0anR�J���	�����0p�P��?�
"2�# @A�L���������#9�2����\�?�i |��18����%���~���.a�yg���3�	I����*]����q|I��Z2L�9�?oW�94��,�g��{2)DN9���b���j44��^���F��n?xf�=������h�2�$L����f��v����'H�=KP-�p��I��R���g��sg�f�-�Y>"�E#��������9�O��������S�\l�`?���������e!&�o�h D6
tt6�����883x�����#^�x������v<C�^��t
�jF�]R��@"7!*�4�o'�����f�+��������E�c������l���P��[	��-�-�?�esCmg����xFo��wSp�p'�M���l�������c(��hr�g?%q[w�+����;��C[��`g�F�F�G��)��	h�n_H;Z���d������g��\_(��h�y�S)0�"��L���mjv���.i4�+;1
c�_s�S�����"*��8G�K���6�#F�GB����o���Ls0�����\4+C�?`�3ms!�p�c���[%�#� <x`���Y5�}�-%���Y6�Kw��y�"��4 o�-��0�q�n���e���[��C��������������i�p�i����4T��5����m�.�R�2��f����y�����z��EI��v=��?2�`+J���S�����Z���({����U���M�w';b#y�4A�S������U�+D�y�4,�����W'/iA�\6�)�6
��%��P���������i	u?���2>��}
��������\�&��<x�����2�i����=���E>r��<1����#����f��a�@p��q��%�Y	�:,:�r���LL����2f�X35	�"��3"C��Q][o��&�L�mX�t)�.��	[���<�\@i��W@���DNE&���#@�D�
pO�G�)��\��������
M�[v�k)�z�����dq^_���&��QG;�J��=16���x&	�������9�}�����f���$%Z(���c����b�$.��4�d�0�}{4���{�l{^�������n�^���$:��=�{[���i�n��b�d%�l���h����<����+@�"�}���Dgf����X���������e�	�������(%�V�5�]���?J�XFD�P�q��a���{��t�M� ����y?!(�B��L�������=�0��0j�Vl&�I-��M�x������eh�Za7�{�,��J�t����>�$4���a%W���V27j5��?�5W*]������h���+F��6��`�=�^���#����,Fdu5����qy����Y��x#I��)*3��YA���SI�)d������1��2���D��������+&H��"��jo �D>p:F.W �hdW8������8���[�04���EI�S���n[�BE�2�p�"�j���,Y��L"�����}�6gM����

5XVr�Q�}1�{�����1�a�����`Cx\N��}G�.2`f��DK�$�T���@��e@�8�`�8i�����FQ��I����i�9�C�;M��M��^L�YV-�
,�x��H���O�$�s����
Vr��h�dW�B�+�GrL�������P�������3b��I[�/TVC��X��2� �N�;�"�.����3��6����������e8[��)�cF�����x��x1��P�K��t�����Uq1�W��Q�2� ���>��4�7��$�+p�]��!r�6����4��2�
1tus��8����:��'s�L�mt��������>�����-�h`x�����6�;�g�L����S�m�6�����qAN26��jS�(fj��N���-T>nc�}�Z��!UC"R���%cM���������z"tfM��C��!�:gn�j"���}�Q��kmc
����nCU�6r �I(��>���N\���S��O\�yP`�����}�������m3���*xK����&r��/iPt.�&��
-I[`_�?��U��l�G��:�oc��l7h�����
7�}�	�~�l���|�u\���� �y�JA��mh@�Y�+R�#��64P�uw5����C;j;nC�kS�����[�������������r?K[y��}'!�n'6�Z�M���:�;�	r������d����R��d�w:2�j����G��m��<�
���Y�Wa����]'���m$��H���<#:�	� ���ozs]�
�sQ���CB�Ye���QtN�_z�-=�R�4~G��$��	�w���A��A����i<�2-��d{���kqE�^�A'{FC�M7#	2J�]��H>Q�:3���
]�G���M��! I�^��i4/cG�0�v}G1�Be���=���`@;W�[�7��f���L���TX�9�J�l{[��n�+�-V���/+f������iS$��L�M�
I�-�9�&��������kf���������L�r�����$�Q�;!���LOa,������:Gn�K����X��2^�v�_�1�JE:p
��3��W��D��b�����d��F���d*��BL��!,����H^Z�=4�k'��mI����������/PF��CS�@��Id�(���������i����N�����{C��1 ��M��D7�|�����6����B�U���L������O�T��&RVzj:�� S}�I��Z���������'�� �g��c�@�^������zbU�:�8>Q$T��l��c�`:������l����/{zaF��AC�}h=sj|����(�N&��:���9V���S��Q�����cD��I`��S�J+nWgw��j\�{���=Ax���������W�?��e 2t���l�Z7'��]���1� S�3?��5��{0��\���dx�c�H'���h�)G&u�^�o�a�Db
�bpA1�
�ux��c�����7�V\�|7`��=-]�O��_�������q�]�L�;F}��?��������eE�U�����I}��"OPD������fO�	l��(A������c�A�=L�s��4&Q�g�����M�lT�B6}Q���<��M�j>�
Z+k�����d4.�/���/b�����s�_`m�3Bgk)q*j+���x�G�M9�4����6G���?����e����v.ZZc}�4���v�2i��^��v=�N�	f�����E���g�T�t�Fz
^��61%��-��g�vh�UZEQ��2���4�7�hb5(�`������+(�
hJ�B�pWy<���D��������38�5,���r��d�y[M�MCtOP1�o�"�c��d�b�`������������>�O�0hL�IP3����i(��t�O�bl��}og[Z
���8;��D��c�b����
����������{y�����'V��_i��~���+*IZ��2�X�B��	n��E�o���" ��:��}��k����<
�Hj"�`�8F������We�X���)�{
�cjJ�&�.��c����#���c�v�}G��;���G�?g�z����&���N��"��{
w��c����ENn�HO32��Av����e��*�$0����8"�`�m�#?����i�L��v��	8!v�=��]b�!���Q��QG��&���k��`H	M.c�8���b�tO���fwf���M�r���������bY��[H,��fO�W"���:�r�_Cry����W���I��������&���C�����<z/�����"-�wd,��j,B�����]�IP e��@�c���/m�J�j���{!�nw�ZE��_��F�t@��+��z����C�/h�4�����l?%A�#���'�/MB'H��|/�q5���3� ���S������Fh����4�t�B�l����4U�3l�qG�:)��������;�-
\V{8���\I
�(���^�;r�f�e}�[r_%r��j�f�{��Kf��Ky�r
��~/d�B�\��xG�_���9)��C�,��zG:	�K��~�l	�����`��1JB���+�I+�f�wM�Jz/���U:�B�wt2:;������}G�zwO���r���+����y��U��5������B��wt<������,'@
�U�^#���)��������M�/�y|;���=������: io�5~���{��V�H6�X�������v��c������t����Ry������U�d?:t�io�A=����S���5`�:�����"����P��0�X�7;/�����{�*[��R�B��{�D2�U���1,:a��~�mY����#�a}����y�eKe�U��j�]E���u�@O*FIw{/"�/�w�w�[ ��wd�����&�I������W�od��T-��d�;��)S�nur��M�X���Z'X���I:�r��y����t������
k(]��������u<%���&��>��7"��\&��^��w�H��;�%h����WK8�&�Bh�W�b�B��{#��D���X����\��'>�U��<�b�B-�v���
��/��V��bB
���E�jo*A�|8���p:Q�����9v�T�%�A��A^�����]i���/�_:G���"��K��*��,%E����Pjf}�N����6������.r1�1}���}v%�{���:�����n��8�T�e ��Z�����	C�j1��|��4Cj�J��e�B��>�c�A�-���z�hYK����O��pSk1pq��������j315���< jI�������!1M+�{T���bCb,��UV��ZZ��"w�Bm�b�B_^C8q1t!���_���-�����5lR���}=�,�1�V��y�F{:>6��P��"�&��|��'�� �bC�8��X�����H�
���[��{��[2��C���>X����PR�Dx���]�I:��:����|�.������^����oJ_���������e�/6<��-�#�v�d���dj	8�^��c	�U@Ht*.��F��2�?�H?�{e��/F*�����f�����S�I~������C�6$qB��qi��)0��7�?���K�b��*� �R+u�-E�2�v?�&}�� H(��������rk��`C�<�$"�x�b�1���h����.����>��/�@���Z8��z����:dM��J��bq������f��z����*��mc�.3~4����!�S|�c��-
�KVHl����P�T�����M��b��"NI1Ta��=������$Bz>������>���_00�V��@?��EU<�LF�J�C�|��BBa=�]��/h4����������1<Uv��%����G�a�vvnG�e#
��X,�P�{;�K�lsX+1�l��8>meq���@3-P�����O��]��_���[J���5Q2`�1�	�P��	�$ �W�=�lv�>cw�[������>�E����
/��^��([;�)5�P��B2&f}����(��$��j��5b�O(�������j:�����<���(�v;jL�n���q��m�vk��Z�C-E	��U�c<h�%a6;�w�)�GX��xT���CHFs� &F�&d��o�"�BlF��Dq��w���	����!��toD(������,t�/�?+��jo�B>���>Q�����(�j����;O�s��������I��&5B-��i��&���j���2X�5�������"����luka��Q�V�J��=3��"�nLmE�(����x:�y��*�)�!�@A� �/��gm���	}9F&&�S[�d��eB_-�t����'����� b!���^�0�Nk���.��6�W��>��#d�h���&��V���S��V"���mb#��F!��B��d�A��|�����:	���(:QWCu�P��.�+�GLd�z�����*�Kp=�[�^^�-z��n��,*�y����8_��5y�����l����W����p�0�Y���Z5��>���k>�J���k4�PmyM��p���
�^#��	���e��9-w���m�u�n8���i����I�����2� ����Q59�����	�Y����Gf�r��q�%Q	�L������~�lL��E������+�4���P���6��j"��=��=�Qz��M��H�?dA��03�3Y���+��!�AW��?[:E����#������������\�k5� U���Y��j�A�,���sS�����D�F��`�������$i����M�y����PH�)]�-�n���(j���F&�[�������uqw ��z8Z��'�f{�QuSe'�Z�Y�@�hQ�R������;�O���N}BY����ak�~(��� �[��:B5CJ�Fj3� c`�ukF6bD�'�:=rn���iO����{�u��G�M�.���?�,����'����
�7#��Ob
��������z3� ��uOS'|0V�6�

���!�<��w6S,����f�=#�_3�p����m@[��>*�iX���`�s�G<At[���IV��� �@�v3�P�f�(��-Y��[����$���h�U���)_Oz���gL-�������F1�]��P�j��S��{���d�rKQ���:9-��X���A,g��c���*c���K�A�R-�N��I��J�c'���������l����5{��������n$�~Z�����XG@h3���I,D�a�%�x�X:h�����*z�F����6�X��mv��kJ�0_���W?�'���p��mF!d����R���B�&�����H���gx�O�B����/�!
��D?C��6�*1?/eq��B6v-@�����tC��N���6�C��P�ilL7��5���PA����u�UQ�(F��6>���7�'��f!�I�ZL�$^�@l���n���=���YC7�*gN$hcI����������`�~.qW35�j��Lc�D	�uW�l��p�y;�:3"�F3B��LWJQ����L�6��+�?��>'Y
T��p�0v�M���\T���c��MH,��)���q�M;��&uD��L-2$ah("3��Q���\����~/:�vE.�
�Dh���IT�a���$�����U��v�9qeD�w�=����j�%X��HS���&����4	�W�i_<�O�l�wP\��.,�~Zb�Je)�;�S���-I�j	U2���b"[�)n�:�����~���*�l'�'����-�PSm-f/!�
�Dc�����N����������H�7(����QE�HN��s|�*�n�B�H�����
�����O��h�W;����-��td����s��O�a�J�G&dA��u'�������'ps�'�B�*�"|������F��OH�Q��c%d�I�j7��������K�����x�(�t���~N''j�X{L��!����i�
u>Ei�TI]�N��(
�I����0��Ed}�qv����X;!�J��0��v#Jp@yx���+�'�Zrd�$OH ��KY*��}��J��S�Bw�d?�NS#BzG�B=�N2v��Z��/��z�K=b���c��D���{��	`�����z����)�&�/�
2���Jr���]�
t
��,�>c��W�Oq�
��a����S7z��Cj��.n��oj"�N7n!*�LF��d�fg��B[�����E���qS�R��ndbG��s�$=�tC��o�lC��`�~�j���'�����.��	�~$4�9{���^�1	�]������PE4�o�����w�������:"�
5}��t��|^�Z��v�Og@U�/![M�{����_����Q��'/[���/#��>b��L�s���r��i����:��l=5Jq���G��,�>�-����VqV�Q�G�^@��Z��}��'�|�51�7���O\��L��3����l���������b���D�n�����R]h��_�u���'��6�l?1�!n�JV��k���v��}�A+�wT��pv�&���l�B6hH��_���}N����o#z�rLT#������&��QV��|W���%�����\������f��MX�L6ZA�J�e$Z�����+�K'Vs�*?F!��n��n�X��?�aX����N�@�.u�V�2�a��I0��U��`.���R�<>��L$z$�	u?���DI,�W��2e�0����|KU-3���TB5�,PP4>[���,wFP;g$H��dOH)'a����h���
�W����n+b��a����:O�';����Qy�Mw�GdwU��mz�0������l�F�-�K��;?�z|h����7?e��L���7��#�Eo��:JX.x�����������D�H��c�������R���V�!G54���U�-9����A�Q��FG����=p;>S_&:�G�-�O$"�/��>�n�#T4-nw�D���T	)^��YrrFE�0�0��������Wi�A��:�K��DI#��[�w�����h������jl��a��sDw��@�0!A#�
��Y7Q}F������-`��+_�����7$���w��-I��U�0B!��6�6T!����[����Q���9��(��D��G'q���n�B���#D>��`�Hyj��rc��0�Q�9[��!/f76�Y������F}�>�$]O,�K�@�)^:�Fhi�-� t�qqj����"(l��	�#��CA����?����E ��0�����a�����	0�t�S���-<�����T���.T~Dc�����m:vwH�3%���@	�I��|g[�b�t���P��
����Ze�0���m��c$���I�:���`�n�q
F���1V���?���-����ma��E�0�q>}V3�X��]^�h�{��"��~Q�>Vvvs�v�2C
����Ej?��;?0W����q�#H�|�5��qR�.��N������d/=��~0��v��� |�fhJfV�1+��U{�N���U=D��=D�RS'E;4�k��'��h��p���N"��?X �f�(�p5:���8������<�
f74K��!PD�������F��a$b��e��6����F������S�K���>
Lh�TQn������:�����0mm3��|�]"��|�a�sMMP��uj�9��:F��Q-fb"�&���K�5��/���(�|bi�#�?h������Y���UF��$�������23�R��5���T�f�=�,��Q�����������6�
jA��_��-]���E[o%�x�2�,�^C����Bm&O�.��X���X2@����m3�}r�XI�_k�����W 9&j#NCn�(�A�
���u�Z�P��'p�R����I�j�j��<�A!4�;X����;���X �G�h]������4,g����A����
���:���#G��Y�)�B#/�:���?{�I0A_j�����EH
)��KD���$
Y���M�0f���1���L�
R�!�x&�Zn���-����!�,s_@��!�qF~�3G~��5� @�a/����S�=�Q��7����!&�!��O�-���qk�d1��������nt�����\Da��/ ���`5�fbv\��YN�`�A��"V�0u�Q�4��$9����6j��Y
�B)��C����W�7���3t���t���fr �����P�b^���@���0�e_�b��-�^~D���
2,V�Z������\�����BE���L��&�����[c��-��7k���}U��E��=&0�Z�3R�M��dB��~d'��<��HfJ��I�@�"v8H�1����3��2�-OL����a�`�1�E�65
z��-�X�-D������~�3*���:Y�����z	��Jug
l38�o
��	,�A
�����a�@���vst���d�e�w�
�����`��>��>��2���
����<O��F�g2M���	�\��c������-
����e��2�pP�b���������|�\�E*��M��!�������c��z��������$Q$sU��_��4�������R��U��	��	;	/c��$�e�@�`w�
"�/�-U����L��~�o��o%B�*Z��)��$+@�y��9*w}�I�F��J���s���?;tA�,�n����jRkE&���uRU�5c���A�!s��
��A��%���J1/�;������:���@L�e�������X	���]F����R�d����qA��]�����=��E��	~`cN��+i�Zh�49�]#tl@��eH@���djB��(�W���v�s���X�������qv.Y��������'Vb��#�V����z(\���_��YB	p*��0�����l�G�5^C�)b	/ 6)|o0���1"Qd%�#�����������'�E�/\1��N��M���cw��Q�C�{|\Fn���p��k9�GG��5��zRv����-t�n��eP!R,�
���!�/!
�o���FN�r 0J��]G�jD�X���R�L��,��-a�$�'�=�E�� �����;�\#���e-�%|�<dJ
z�,k�����0��	��:L`�?�[43��%�!�r[��u0'.����*�4��V�3�3Y7D��%�a?_���%'�h��$�~18l����'���A]�^I����M*<L.K����H��3��^� �Nf
#��*���Q���w��.�I�y��h��pVjv�=��@sO�~�8�RBt�1��TzKX�$��(�dY�P�����|�����*�}�H8��d�zM�t��=�_�"3�\B2���%9��k;�H��<6����Pv�����`��K��=A���]�A 9n���^�@\��+A���d�m���R�1�-�^�nI�9A��e�m��B������jm�.�YF���)K��+b�na�+D���X�|(����� UeDG��" �C�~��g��m�!����g'}�N��a�����cw��DE������c�������=������Wzt�������L b�#
����mx�m
��G�]|��-j;�!:?lA<}��n����d������@��;b9��������i/06!Rif�`���������u"��Nu�7�����d_���i�gfp��u��kt������[H�wsF���tD���$;FD�=�6�I�}�`���\v�?���o�����0�-,"�K���-P{����	����&�\���j��~�I��M���C���z� ��T�H���z�����M���Y�/@R��2�r�����w_��lo5!�nKm~w�S�C�*��e�����@��Q`u���[�{�����{�����!�Fp�&t���������*8�=��	�&_�%N6e��p�����,[%�G`�0���)��m#|BY9gW���2AZ'��Y9&D��F����������m�!�����hf	t���NIyN[��pD���4�[R$������V�`�9�e��[���Q7l;9ZN�t���Nw�9s�H2�m��c_6��m�
!�lA"��TG��[`B���[�����B0��h[����}F6���<��[��v�B�5o���/���p
h�u�hH���'�.d�K(�M�V�/���zge��s�=�� ���%��R�~�Y�>�{���[�L�h���[���@�Z�]B��F�6��yWS��3���R��l�=�B��'��������}!����E�� �m5Cu���Z6C���=7��H{
G
��A�2����Zfi$�=�}(����S���s���z)���
,j�������w���sz��N�v���#�.povV�'��������3��[?��a;
����#�!C�����G��#x![������Z_.��0�SL6�O+~bO"��)FP�?���~(=�k�����j�D��0�7�i�yAe�QGX�����Fe�q����Vsj�=j�h�J;g��$�/����s����HMP� Jw��=8w��Q�r,P ��������"�T�f����N��g��c���!4���c���<Qk�|����7c����t������LMy#�Hq�-2��N[������F�����_���	��7:���D�;��M��9�I�+���X�`(>#e�$1}OwzG4���jk��}��2��V������Qr
P#gQ�GE����l�p��2��[����~��:����-RMu��
�������u��1v�Z&*,-��H��Gls6H�"��6��3���671Q[�^�L����v����je���9f(z4��uA+�M��g�~���Apg4�l��\��b�o�=d-U�
�8�'���}��c��#W��~Q�6^O�8��B*a�P�q���.Bl���F_��o�U����f�}G(�Y9�i#��1�������x4�H��#�:����]��_��	]S�=�����g�{t�����v�Gu�[�&���An[(Z�w��<_�gv�YC���z�O�e���vX���^v����5��|8����^eT���'�e![��������������M�s�<����E/ShB�6�c"Q��cq���F@f�zN��T
2;���e#��F�o���#�w������Ov�%�1���Nx�+��we�Ys_��JH�����Zh�-�;\:?������^A
�D��R���x0g�����w{[�������|�4$EQ�p�L ��B�v��2s�;%����3�Y�'����u����]X�I��=��� �n`���^��K9[e	��3,������~/Z��o�p5KIZH�H�aE+�{c4S����+���9
W}/�r/)|�A�M��UF`��
l��N����Cm���$�����#���������
W8��-<�����F�FPC�����
\>jF�>�_4�����/�|~L�������<@����� �N�A�&q�������%��d����5��iR�����	f��)��Z���,�GHrW�P/d�U���ec�(x��
����"�D{�`B��#i����8��(+�Z @�>��O�����f����%��G�B�5�����/�?�{
�Y���{�Qy��*�%�O>�#����x�?�����^C.F{���KV+��B��G	�������_��u���y��.l�#"I���5��X�o��ay@�fp�i�v�lM��[	����Z������w���������#���$��$���:�b��a<D��F����~�*,����8�	��N���z��#��3d7�`���?�?��Tv
���'�p�H��[7O��;]�1����h��^���gk�u��7�����������g
�����ggg1����O�f��=
�PV�h��!���}��2�i�%�5���G0f�-���#���2�)B�P6P����UY���1���U������K�0�{��!�N7�q���q�9n-��H����e����`�� S���"H�~�����3�-+�������tk(8�E���8�Ih��H� eLF���|�h�;��N6Rt!+���������@���^�rP�'��W@���1�cq��p��������gylS�`Bo���j�k��.���${0Z� }��ES�|�H�[�dOs�`�A�}���jT�a��:�9��rb&�V�[��+%�W�@��W����3-:���B���-��+{~����s���z�A�aQ}W�-�c�%�������z�[l�����U��\�����7\��Q��	J}~���^���ur~V�j��_��=�;�4�����M�8�aQ�v����:�&���t�3n.�������������
F�f�������^�#��yJ�k��
��t���3��K���5��]�8�D�|�0Z�m��������i	���
8��n{4��n���(A�
�	���pZ/��M.��"2#A�{!�>HV�-+f��j��'<�[~do����%0}K:����Ho�Z��1�zf+�8B^��>����f�[�v���M4��(��:���A��{�_"���:e����������HE�.�m4�P5�C�tl�/�9�`
2L�n�HI��j�x1Y�3�����`��f�R�v���cq��Q���O`�`���?-d��Y%����2�RL����Z� ]�2��'$>�"d�C&
l�������Sl�D"���s��QY�+L�N���������!l�?�p`�z���i���>fQ���C���@e^EXY�P��� �fO�}�0���
�$���#����xr������{0���@���R��b���	������m1�
*n�F�, t�~7b4Q=�;�����������k�����g�F����!!��K/�(�����Te��8����Q���e�� v�aD�)N��OM���}�����]@2vm�
��
�����zh�.�B��@���X�D���p�����b��F��
�5�,z��~�x������B�4��)[�����>�FFv	��� ��h�����$
�N�U�'A>��U"�a��I�O'/��,�$l��I}��
�����[����HtZ-��'��
N��s���w�wj��jq�$���%���qC�
b����iV����5w���W��H�@-����2��8�G'�*�q#&��-���
�*����3_�aX�����b�[���Krn��1�V��U��2W���-�����l�W�'�������h��2��I\
:�:�adQ�)hK�7|G�[����$�]�YR3�����gS�'��Wa��[�_�c��@9��fW�|X�p{��lv����U.$�a� p�V?+{d�����s[�EDV��:R�r8R��������j7o�X�Ob�#"R��l����[���>�%H������7�������3�h�8��&�J�'�������P������&)�&�+��e$Sp�%.�=-D�����2 C�~����T��	��J��F��G��j������C3p���g��?�������U�X��n|wldk�M����� 	����\��G,�*��D�ju����S�>Dv� ��3H�U�����AEV�������v��h
��G�57�tvL540�q����(e�����"�������l��C?�V��0X�CC�V pf$�4=���L���}OVI,���$o��9k�}-6[��cUje!��������P?��a(��l��s�D�U�����u���%�������6U�6��3�"P�B�A[����`��Wk5���j�����
��A�5WJo��d��U�!��>ZuH��-�2��~�&� ���Z���&�����cr�����UA|>[��h�v��S{ns)l}���~T��/���/���#l������F
`���h�8�Q����h/���c�������d���A�G���?������
s��ud�����6�& `��}a�F�g������4W��lb
��������@a@E':�4!��d�~����Wm>G9�����{/G��,,�Pf�/�$�P����ZN{(�D��uF��&�`�/
�)s�T���>"�vLXH�U6�����?������f���;f�:�L�����h��*2�Y��Gr@�=�����*:4;%�]��i�����G1�U��o�h3G�&���k�\b��7���Jp�/�	H�f��������f��^C��*�9�Y�����9M�������A��^k�7� �����P�i���nA��#�F� �Hw�����	x�8D����\3q��6P@�#n��Z09K*[h ��O*�[�O��lB��p7QEd�yewE���?�C���f��=�s����Tt�O�
R�7���24��=�j�:�$������p/�	�|[�������������E9���=��Z�I�����"G=dG�a��p���94��'
�7��`���$[2?��W`r�g�F�~ABA�����@
���|���C�B�Y�l�n��������2$�?����O��������(`��/"��g�p�>���.J��T���jX�].�[�#���m����aM*����Y%4�$eg�ec��.	�����%u�/���3Os��F8��d�I�o%iS����!hR��q��2)�����}��s�l����HV	��`E�F����p����f;%N���^w���)�)�����P��CF�o�-�1�m}W��a���yg���3h��(4AG:�f�D���Q!{J�i��	��u2�~D����v���l�t�e�%"�7���#�/�p=�S�/�!��������&������Dh7	x��uNV�nH���w�w��e���P|�Q��{
�8yvB��m�z�[��r�~���?v�����h�h������fM+j��t�nINr���r����u�����FL�n���I��h�H�I4�.%�#@2��.���z(���w��t?�X�b.�=�����[
���A��w ���3��n�����:'G@s���G�v�>gXFj�I�
�����?`wv~�t1D�E�e��5Fg�.8�S7����^1J��W�t]J4~@���'����-���=�HB�?�M{D�����L�m�D�s��z�m!]�����L�S���Y�yR���L�(��|�;�0�g.�
���+����x��
��< �;���r��^t��n_����<�.@b����)"�38������=��A����#��w����i�ax��4����j��Z���=@���4����/ bGM�n �g�%n������:E���ti����\��\���[���
��Z�}XxO����v���(��k�����32�=�|�����W�J��������Z��Y"�wVyi�������D�I��Sw�nS%(�����������Tf��%���Ep�G��4�3#|adU�?�I+,���DE�C�n�Y��[���
w�9)!�iXm�6@[�GN�}�,3�hB)d,������������	=�%������@������(�e~��DxF��#�|����v<��
���%1<���������8��������'�Y8\d���-��^������\�h��T��y�i�c7tLs��t��w��b5�]f�C|����
 �t"`f�{��r������=��*���(u �#�:�_h�����������m��g~o�$��)��1>��A�F��/�������%���'� �����P
�����C#d��Jv�aw$��8��r;s�G��~]2�PA���#��`�#�br�VAD]����$�l���|6��@]de9����<V��AbXQm�2��%�nGr/�����MZ�#p��8r=�n��67�G�Q,��}���5 0�X�������^��f���H#���7UD6�j �
��������4�;f

�+b
a�������s �� 	;�a����! -��V}��.�hV��4"c�4����`�>�By����u��FC���L�4>}�q7#�����Tq�}J�l�lV���*ur�3t�����/�X�(�]��!�����Q|De�0�u�GwM�D�G�\3$���ZiJF����s��$��!����o�	����)�Z���e�����V���|��q�
0A`d�@�������fI���`���D�aZp�?���~���G���ITm�K1��y����yh�BY���gn_��w����Ad�%�nEf�C��6��i,!���]~2����
�kDoq����Md�C�C���R���@3��'���JK��[����fL�!P"#G
��h�����6E��H�u1+Z��Oc�X�����O_t!�/��`��7��H�d���>�����B3�jQ��NY�:$p���L7N���b�&�hI�e��?����&�����8�������������2�\��f�%mZ=�	��YL3��\qz���-���bC�c��?k���B��
���J��������m%FWP#C|��
Z���qo�������
z������_F��-���,�\��MP��s����#����	�y6m�4������
��N�
�hW���[�.N�����&�La���	G��|����'�Ua$,��/���T�oE����CW���2SN�]-�[���O������Kt1��_���66�I�_�bg�{����-����Y�$�4��`��������s
�P����"&�����5�m�������G��g�;��6j|OGB ���>j�{��b*
�6B�a�g�1=�)?8B$u���M�P���D���h��������e�����2S��"�SF����l+%��g���I �p��d�D��2p+��dk�����A5K������S`\�h��.�,i�]�����J<��u�Shx���+���w�1:�F����|���!�a��K6��������w�����=����[;R�O�<�ZVZ[�x
��8A�Qko
���U!B";� zf8!}G���C-W�#FT��n���ct`��hhz�9�!�� h���&(1��(��
�jG���-�}����� �
uFb�iC����*D��$��eeJ�kv�qv~��1�^��ef��4�
��5 ������,�L��5�P�L�b�AF��)���3��f�)����}�?W�/H3K������.9�,�R
�fXV�
jh�����g������:��.B��C�`����wq
U\�f��9��������@���fN��?����~f
S�Y�j��&��l����:�-TKa�i;np�~'l�X�([Gl�$Bo43��MJYJ0�����1��2�CFs��������d�7�������T-��#BD����01��D�����*-�5�F���lYr����"�s:�������GL�
L8�#���|
Y�������=�*���{\��6������?���i���L�`-�B�qO�b2���ws���itw	��{]�t1�E�=�����@�[�%��z���h�V8�������!X)l*-�
��h{F��%@�
nA���������B
�]`�Y�/�E�N>Qs�'P��cY/���A���a�����K�]
�A��,Y�V�"�N��7?s���Lb����r�T#2����7:�,�0�5���!'��0�06�Jo	8����$D���5���>�L@����MS�����}|�����d��e�������^8;�H��>������F
����=�^s��+zOB�`�J��vv	O��q9!Z�hb6{�+�Nt�X�
��s	7��J#�@.+��Z�b����J��
yz�`�����'h�i8�� ���h�,G|@�m"+5��������d�����N{�u;���M	�$D���T�	J��?f*����FpF3w;S�,�
Y�$���nq��r04��;���Vl�����p?y�[H������OdZ��8pd��T���=��/,�
�v��4��qm��bb	c������h9VSW[�Pc	��5Q����k"�a	l�#��S����q���m�[�1^��Z����N�ZQ�cM���wF��\����3�p���t	m(��I���v�a�c���vY��D����
����G��&,����b����'�%�	G;�T�����F7�U����u�]cy��{-�����*;�8a���)���d
�%�bDR�%���w%�A���V��F�0�����X�]���)�����[�x4UN5n�	�h��d�by�\�L���i!��K�=t��?�y�HFE�H5�O
},�'���p#F�0b�:n���lX�H}E��%�"�Y����,��M���g�����p����k�duJ-����l��<D��8���AVK��m�d���B$��S�db���"�l�������DE��"��|&t�h�,n��Gd�7O�~�Qi�?���"�t��cY���e�?�Ft�X�%so����Xe\0�#�d��m�����-�B)�\���)X�'e
���(������<��,����C�������tO�Q�����0�N!��h5���Z�w�rK����
V
E�JI�[�q2%"!m#Q���%F*3��&��hE�;2�Rh8,$k�og>D-�-��`��m�'��������mb�
UG��Gu�MO������p
Nt�m��"��t;Kem�m���
6�n���go�q���n�����D0P�j����6��K�;t�%����|���:_�R4h����A�zG��-�X<�F$��xX�j}��4�fd^���/��+�q�b��w���^vx�GM������G��St�������}�L��~,��g�Z�}�T3�Z�4�l��&@![�L`g�p=���_��63;3�%����
M@����������
knaO{Z�(�{���}��,,}�M�����Cty��Iv��{��*h�./�~2UkVE8[�Ptq�n����}�����+��V�x6'�#�����n���"A{�Fh��K�BJ��!+|��q3��l�t�-�������@�$�I��H�J(��<F-�mo������Q2���X�&Nt�_�Bl;�/��CQ|R��v��LM������C���&�'������4�a+)��#��/���i����uW�[���S����l�$j.�-�-9~4R����������Ou�_�}�*/�"��%���Mz���d����l���#��� �H����
�j'�9'"�c|53������@�y�#M�]�BV��c�TM���G�BQ4U���p��4�1_��V|Gh��0Q3�<?�i��8]c����cN�:w���Z�u���?�7������yl������d4��c����5i��d:�(�R�3�����R������S���a=n+`���X����=9gE��n����<zG�i���>>�����O�E��]9��G�P_
}"����&jt����7i�@�H�*�>�H�M���M
NQ��~�����!��du���l�:V<����[G n:r��/r@�L�~��\Tu��7d�����A�G������v�%�3���B��.������o��	T�C�	��cF>B����������|�!�����Yr�t#!K�:�8��G%�������q��� Us�Nq|�EDC`RXE��[3xO�X�@d���]Z����i�0����>��"�G�}� �����������/Vd4�>d�q�
�P�?�p6b�q��e��������0�b�V�v�U��j]�y�	�8��xc�"��bS�����^M�O�`�{�0��C0Ff�}����g��6�TI���1�fw�R����xy�H�u��s#�s���C%'s+:'0>��"��!n5][qQB�[�qJu���6�(�u�����p��YC����g�D:I����%�.l����&�l�6�R����G!Vx�X��)*�Bn|�[����g�Y
�l*��^�d��nc���sj������=��1��R2��~��~�ve�����I+�@�H�s�v4�~jU@�����q�5������?0�UX`2z�~}�<��M�lZ
iY��D�lE3��}o�V'����u���{R�����/n�ae�M��%����&�@��~�]��c��s�
f���
�@Z��u�"9�Pdctt����F�||�a������B�5���"{^�-��l�N�M9�^W6Y�sP1'$����q3�]����!;2�����^HM����9�����h��.�����~Gk]C����>�w����B��m��s"Q{�#h-a���t�M�{� a�`+�9�F���7������"����(���<;�K�d"A(�A���~�d:$���OP�w�~w����i�<!��������>�.;����{9�F�}��n�������/ Q��:��>*o�?�G2z?�O�MWI���W�u>���6�����p��U��h�Lb����AD��y��Y	�T���sd(�^����v������p�^G���KuJ�_��q�����5��!��e�)E��|���� (�������k�^��e����T���{!S���dT�D@�T|��'7~�J���HC!�~�L�����^H����q�DR_��dp� b	##��XT
r����B����%��@�����F���U[�j����vO$,�-�H�l� �E����iRB+�w�-�8\�S�H������4���Dq��I6[V���B M+z�����vx�G~��2�6�khn���=�F��zvG����>���cG�Lg��&p���G��5�~T�HL��1����]�w�}�����k�E���_$�A�����5>��h�6��2�������l
V�6�;H~�	O��#�}����f�8��5lc��VN�q�?�k��n@r�D��a&)/����X�7���<(Z���Hx� K(Rj�;�d��������0������&��=�f�����m�6l�v8a	+����T����?\9;F���"�����g� 7&��O�h�����}��VB�xig�^���-M��
-�(}/��tRV�;R��]���;���������&�c�`�=�w�f�m��wF������g�m�c����/=�-�?;���I�e
iJ�p��{�D�^��&�����D�����B��,';�����,�� 9�}����W�D�����vo 
��OQi_,������y5Q�b��B�@����D��qDTL�g��R����Ddc������
E/�PD�"l�D��k56���D��~v�������O�V�	��d���DKX�_t:-��R�@K`���y�RL��d����P/"�@HrW�1B�z����`
e����zBP@9+�w�1pU�J�X5��� ]D/N�����	�"'L@��h�*������HQ��L�C6CAd/���D���D����(�4���9�������O�\Kx��������I���Q����3�FK�������,!V������\�#�{�|�^��TIM�=(*����4�l�Z�=�	04�n�Yz�����sKQ�������r��"�R��^�������;B�s�yB��;\�6xogH��������/�a�����CFw.���<�"�^,]�E�ky���s����&:k�(��-(`t��+j��{�$U��JV:�e�#\���1������(�^l��EPP@�^d�������t8Y�.7�k��N�X��Pe{�&E���?�B���{'��������X�N��[4C�T�w#p� p&	h�|�I�r��"������zk����^�q��]Y��8�AF�`[�h���w�f��h��\]vY�b{B�������F?����RA8B�M@t<;�/�Np����1���":k�#JR]���2$��Nv/���Q�!�`���2�������g�tY���5qGXB����������
�G�i��
F�x�:��Aq]Hk!
�=B{�w��_E�u?��OV#mh�N��ba1�-�W��� ��5��50� ��%Y4����n�'�e���w���1<�����5��w�TX��
��X!��`8���*�`��\�����*�R��VQBk��Z5��C���moUpA�T��?�n�P�b@|^�?���=�y��h=f����D����g��(5#��Qn��������JS���:���V�����8;�$�d-��a��0���*��[�%�<��(o�'���
`�_��%O������]�^��FC���!�B2��
A��5{�@�<�-���>Fo���W�U��
Z`Q-���v/���M�U�t�IC)[@>5��9|aT�-[�4���k��O`�55���J��.�A����fw�#C6i�p����,���7K����uR�����(vU��D�l���u���n5���V5h&z.��li������G?��C?(��mD�w����Y����E��j��G��;�����x������)R����}��Y�
�����T�d�*/�nU=���[Y��z�
C�N��15Q�-�a�p����b��s�`J�����X0��d�h���Q����OF��B ��r�����A�vIbc��`F���� zMqP��Ku�4��Y�Y�%�u9T	�U_�Pd��� ���)���]�h�
���{�����Q��B8��#�Z���g��-�#z��<J\�Zge�.!�������\�6`�!j�V�U�E�*�F4`�B�oV=l����"���u��P�)��g.05���$���^�)B	���m���!!����5��{��.���&	2{N���^�� �LER�%����E/2����L�^
6[n�9�r\�������w��F_Pqjv ��%&
�-�B��E�+|k�p�J9zi�A���e8R����Z8d�W;!q\Xpd�����-t��NU�D��h�@����	��;NW�K���~c��$;�7
N����{6d�t��o�(��90Q�j�%V��6#����&XbEn�RM��R����9cz��.���h�kB"26l������)�B�����7|����=���`����So��PM��
�hNl�� �D�0�����9:��%:�4'FGEH+vw�k���J�����&��m �
�3�1�]�G���f�!����c�N/�<�l�8�!bM5�wfG�Z~�h����1���8G�n�������EAG������ ���w���i ]��T�lQ40\eK�����"�|��������O���3+b���r���-�'�mB�`s��f����"e��bv��:����(I�7��)jEE�WK�2oV;�|���4 �d�#�!A��x�jq�����wM��nF0��ci��6iy�E�[S�3��1���G5|����MV�-:94!
Q��	T�����u+y�k��M�B���M���~�c,re���V��79feOA���X���h���cuH��1M�j�0���achV��P���l��w���2����W�FK��~�#���l5������SgC�a�,�����M[9tjY�M7������BJ�)J��=��|�����:c
X�� 1��N��Z��h����{o'"86�� ���h	|�J�Y�K�l�u��Fc4�p}�Z=���bW�@���`5�)��O���8���A��;�aa�����:H�yb�O���o�2-8�'E��%�*������F*�n�@e�FX�Y�p��9��l�f�M)AM)��qy-+S��'�Z|B��Y�@$��X���G��
l��g@�.��ND	��	��]�^���,;�{A��^k���&�����?3��8����
��	��=��!�@D����l�1���#�a�k��3u2�o;vW����ehV(|*�`L�<�."�@��y������MgGF����������O	
��� o�g��T�_"�R���q���������a~��5j�wAY��I�2�5��P�{V4X-��Kp4C�l�
?D��n�C��|�(
��I�R���/�p���+��_�*���S�_Q���`~c	HC����u�x�����B�����I���
��pm6��2
�e�t
$c����*� 6���Xq"���i��\Q���a�2�v�2\���!�I���/R�:?����N��,F��O1]�_-�C��6���	e(Bi~%T��f�{4��6�����@;'\45l�$��J��n�f/�A�cP,32?"LFL����������P�y:F���f��>��p�����N��H�"L�w|�x���������� �����0z;����65&u�{wm}�%��Wt����jQk�xG���j�9$������Wv���f�+U�vQ��h`=�������'D��.<��|���]IN������u���RQ]����I��wa9�dw)�Q��=��6�����aW}~��h����z���V)�)�vx�pfs��6z�����	�:Y�9	�t�55[��� ��,�K7T�����w�[�
��bR�L���y%]�m��oq|�5LxB�`�����1���e;V{w���4J���)���]H���&,�<��e��3�u��(�Ju-�?�.$�����k4Z���;��<�,7�#8*38�D������dx]B��`�]R��O/������.@�����2�p��]�c����&��uu��$-\��Rx�	���4}�5�����<�;����<xR��.�;��{���f2��nu�N�c�|K�i<�AC���������0|��>:����(��b�CP�#^��Y��rP��GU��c���v�!��W��s��@�����X�5��;��|��)u���l@���h�.����)���D�Xx/�p���T4�+�w!���Rqk��j�}�\4���m3b
A
������Jf����>���
2o?�A�akX'MB8d���`���J�a`��7����7'd���9
Gd�pup`3s����%��	@��8����,p���C4�������=�	
�	'B]F�oWM}����~D���l���ZM�
�m4Z���t�������&m4�q��< ���5�;�j�!X��,NxQ�:<h�$6����=�E����<�J��������B�a1l����r��,yXq^��2�i����0`�-��~������p0C��	�]�\q*�m���j|�h��S��d���$-f�e�{�t�+23�	���&�coeu���
�g��pgp@�7#C���+�nN�(9�F��!�`Gz�!� �����K3����O~
���4�>���!��NZPv�xu�T�w�}1���f�A�iB��������e~��
����4f��0Z����d�����z}�8�"�@�nL��#��:!G=y�H�P��Q_:{��7qq�FY>S����,�h��,X@q)���oE�H��EQz�<���N�����!`*����C@*�E��
Z�����~x�M�1����_\��N{��q	���x|Z,4�������-�����,`�m�U�]] �E<�q��:���9���<.��������oX����<�B��~��s����* �����ci�D��:��D���O�& a�6���$f[��{����]0��e0v��d��j��]���;���5�Y$1^��t���g�io��3��?�A4����x
�HObt�*�����~���-tq���������m��`�@�*�� ���=�u#���i"I���T{�jS�^J�p���h��	Q���j����5��C���%"��?��5��m�n��d���r_0%3M5��D��m�GF0�t�rTkM�*w\�-�7+k�H6�0��!��	[S}{��=���Z�����t3��t�~������"J��������/
��v)Z3�M�����R�����=�/�=������T'��k� �>��J��0�����J^��>����V?�+�2���r�r����=[�mP�"!Bb����E�vDQcg���y����ar"�����v��$�U\����#��:�-j��ap4���?�N8��/<5�h�N7P@T�OI��#��8sx-��l|VD�d���-;�����,���v�[�D���J!u�iDa�����7-@�j�:�3�0X� ��g?���w�y`M��E��M���S8�vQ�C���&p��o�S��wX�R���)�&v�u���4z:!"eM`�Y9h�}L�/��C�]go������9m?��U�<�u�IUML��j���2a1{8B��bTY3Ky��D@{ ���v�[|t�2��4��*�8m�L���X��d�5),�\���e*��E+�A������S��2���
��?Q2�T��2�~�T�>�t�@3k����)7��	�O��?�q�v��=�`�Q|����}n�������V��|n����W��4�����ia�]������"-
ht ���
���CK��,�r	��_����h�^�%P���Y�����s^��N������bq�2�.���E�������A����E�"���D�����'���B�HC�,�;|�Y��`��t�����,�}	:����r�6��GL�%�����%������82�Y'�����\3�������.�Dm�%��e�cw��^h	J�[�.+!|+U/GD'���	;W/C
�F82cl��d�K�'7��8,AXp���N���
\��,��@d'/���Jm	n �&����jnGwB�2\Ft�Y�2��2����f���lM����e��1f9Wy�l�������� �3
�h/5���fd!b��tF=qM"X�<pO�Z�2���6����{������l��nu4#��H��z�Ej�����U��8�l��jY0���|@s��B��K@�5������db@�iC�����P�5X�pI���0�;Z��(�%K8�:��}�D��5�h�&����@��#DAa]=�0\D��%����NX
�a�c��%�,A��iwt��G���j�n���%��
n�e��e8�e����I%�X[��6@i��^P��o! G.�Kx��rG�d";
9�&]-A;B6��(g'�EL��F#����}B��~FZ�%���Yf�����W�,�6�E�I��28������|��E��M6������`d?C����#k�l���*�16��,@���(�t����g���#��x������iSXD�d�^3���?-���-�p�AL�FcV#�������I���faC){y��U���Ry����5�������@��]Nh����h�����Dd�����~z�:�|���&]>!�k���$8�������yN�iF���jt���Dm�-(����Pd��~L�����jzP�C�U����������2��B1�W]�����������"������#LlZ�rO^i>�6����

�F
���+a��?I��,�B{�������=9v*��B8�p\����dI��Kt���p���mFH��p GR��	n�X5��W�r�BX������Q��j���0}��3���>�/E9��v���G�,�ge��@[�G{�d�����/mNH��� |)�k����o*�O*f�����T��)�@?�cU^�X����U���o_�,JeN8H�9;����!�?�>���qHA����X�����<)�7s����M$D�NS��#��z!N�_V2�4���.��<��]�}��3���$�c��SI��J#�t��/^Md��2:����F3��m0�g����DP���"l�Y�d-CnaJ����J3�@�����9��zp��7~3���Dk���4��Z�pA4Pk\V�98�C�|����v}��0�3���|l�E-^���6�����}v%:�-=��#��=�>���|��WkbE=�mtaN;��BZ���L{��Iz�AX��?�l�w��e�Z\��d?CKjvE,�"6��@���^N�����6��X���N�Y��(blA�������8W3�moC}/����b�]��'�����o7k�;E�����B�&&�m�/�c����`�/i�]��5\�����FT�n"@}���_A���e��j�|V>���{������"�~p�0���jSBv�w�����@Bl #mE2�E���
�S����y	�K�8��I�|�$Q�o�;���?����rl�l5��?�2=
�TS:���
���x��7���f�l�8����Q�KtO�`���Q��;��v�yq���w�6�.�~�p�0�������!����FcD��b���wJ�C�@�:��5��/}0�za
%���A�\��c����)5�qtD��)�+0�?���>��{n���9hmCe��|����X��d�:lG@������:0"�K�mWE5��0���TR!������D�D��q����)��!7Kq9����a��_�D_?�FZ�\��I{�.li�.$t�%��B0�����*�����b7�c$v��_~>W��^���'����c@l��gjH�mfBq��8m�'�����p8Q�4{Q��q�~�+������,R@^R���?����l33��;� Ke4P-���4d:4�����"8�dD�nt	������l���"(��S!���'=��f��E�:{�6t �����^���Lg��9��\%��E�H�<K<������!����E�N������&u����l��:����R*T2+.��Db�]��T�#�!���������Q�]Btx�YA���Q?(M��0��.�A��n�]�����D��#`�D��#<�$]��m�T_�l�*5�� (���:4��%���]�X<�?C~	���;P37kl8
A�D4�����ww"c�#��d�	�9=66�d��dg9^j�PfD]����l3������|��� ����������`���v��n/Q��0Y�������Bt��dE���Q��E���qG;|�;<O-s8�8�xr�T�����lT�3����aAL���
(��'#���)�����(��?�b��~�v8���:&F�nv���������y����9N;��l�����Z>���l���I>�q�b�[���E,bS���s��d�|/�"��{#��;R��D��2���:�w���=����0<
o{�����kR�����ez� ��������,�Q��{���sA�S����N�e��!��p��n<�3R�-(�v����60�e��#��	y����O����&����%��w��M<B.Z��*��'��w������q�#�;\�Y��O�{i��X�����ff����:k$��{���������z�������B`"&��'���h�-jj���4�d?^-X���t�7h�� ���clc�U�'���L�7��+�
�F�?i��
���!�;�i���6�>8!ZST���N�%�W:B	�8 �@��P����@�>�{��Wz�xGjN4���������S	h<B��:�i�id$�k	����.��)����$T��B��4����4)?�� ,{�[�����"�t�A66:�X�I�nf����s��"'��t8�m�FL_�g5���PW��TDN�5ld��m0�
���]�*����gu��s��{��HHTl��?�-����U�d_����
���J�;#��r��+�������j��"���n
���
aed���P���
�|?�����a��2�������D3x����ei)fqO�L����"�a�m�T�	�^gv�pL�E%�O]E�h������;���U�!�������W��o�X�
6�b�	�����?�����mf](Pl�3h$$���?��P�B��-�k6��������3���>T������xA�����#����q����m�C���k�,�����L�2!�v&!��TX���I�=�9\B]�w���Y�q�������c"Xr$�y�!�%��P�n����'��{!u^��-�ML�jr����"��L����� �h�`*q4O��n����=�����<��wr3�$��M�y�^��45HO��6,������j�nZ�l�����u�xj�e�qC����%���a��{���7��$_@qx���\9��7�[$���E��4s���w57����X�p+��D)B8���Qi�S�nvO�Ql��0G�i���H�!L������K��uH��G���q���-�PVi�q�P�� ����4�����~B���0��E�Z������P��k��G�9�����%i'=���xj�"�����b�aB���Vt-�::���9�d�]��`����1�=�PJ��:���|�����[�!s,4�#���d���YD,�Q��p��uIgG��l��Dn�����po�`�%�#A�b�VP[--3���xS�����F��pu�rH�+��}���K��DRB\Vf������'��[E������C���+� �O��(zd�>�������6���������X:!�������KA��������[������$�z��
���I^���j"��J;[V��Dz�w�����g���"��i���	y���l�w^tB��@��~B��(�D������Cl���C+���pW��{����YG1:�p��A����b�'����h���R��88z`�=s�/e��QX�F�)����1�Iz����eF��p1G���>W?.{9Z�DZp�R��L��Fk�4���V�R
�(�\eLrpHP����$��Q���^�|��,ya�:i)w���)5
	�w�mS)�<���������ump� �ew��E�-��-I�EXG��5�p
������9f���#�	�cbs�xY�I@���9����8�$��h��5E�kM=.�`b�F	r�Xk�B_���^�`�e��	�LR|F���)��gI��Z��2�y����i������v�%��6���t�����tL���&��R��:�� ��6
���"f�����Z�2��p�{w��N�4�h�@Ao����aW��4�e�u����T?|�1u/�m;�VL��w����GB��U���j�* ��.��=�^M��m���F4P�N���v�A
J��k�Q`!�A����+�wJ�L����]����Ux��sQgG��w����O�,�>���g�X�Mn�9D�`-�����Um���X�=[�%���q�9�@ u�z�:�!{Gva�eG�w���>*��t�7����C�&�Z��NI�����PCL2�p]��1U������	���Sf��h�b��)G�h�v��4�f|��g������wT�0a����e�������wE�%�b<�.|B�U4�
AD������7b��~�lG�����S|���Q���|ig�
��r��,[�$}�%2���p���6�m=[k������n�����U��:�S�G��gU�G��yZQ?���I���#������Ok7
 ���n	m%W���y�Q��Z{��|�rs7^�����CDa�Bh"���F��26������.B��C�[�����Ip�d���MQ����&4��[M:4�B[�:��.���FL{�z6a��Id�����p��}o�0?�;�#P�NS7{�H�F 8���7nK�[���&K6m�O`P�` wGS5�
,I�\V�00B��j���Qx�k��X�W�t���.t�|VV��7v{9��q?��c�hb���R>�p��6�2}q+������
��i}>;� k��s�4[5�t�@2�L�#��3�*��i�E~��~!��eH��v���EC��$�aIZ�7����>��
����9������Z0�����4�`�r���.��+����#k�Q�;������E�@���!���%;>e��Q�c��j��?n��x��;U�TK#H�Z��Z��3��-9t���
;uV�����J{�0�ww71�3��j���J��kO�u^9�Vj��l��t��h�+�w����4j�J�[5AQ@�h6l"�Z���@Q�G��f�>W�c��������n�G3��a0s~i�=��V�)5BGZ�������^��F�����h�K�hNzH�/�A��>����>�� ��B�M\_r� ���e=�X��F�MO��;���4�?�%�&t�9+�?	�����H(��cm���R4�K4�#������� �N�����.w���F�&�b�[����N��mu�:�L�h;k�.8��Z�!����Q��
�`�A��j�f��:e�m�g��&�b���"��?)"4��/��I��Ig6{���y����\�Q���dv�y:�h�vdw���|;+_Fl}�w�0O��Ga���4��$�aJc�=��CRs@.�}X��Y�d���PG�e��I
�Apk�]���[>����lu�x��G��+��6[E���L[EE���D-s���q����Y���_X����c�c���R����m���J��nB$Fd���H��wh��h-a��'��LG��i�44����D��M��B��[B'2�f8������x��}P�����
����E�;���g
B5�PG��fb�q�^CvHt
���3�����������H�k��^�N������-��/�#n5z�v}��H4P�`�L+a
����������DL�fm��JP�N|zp��]$JD,i��pc4�ID�t��SD�oB#J�
�e����9�'3)?�j�p�]y0�Kp�"[�d��g3'>�R}�4m����,�9�����Gk��(C��XDS#y3��Vy����v��n �1Z�hzt����]��^2�����l����87����4Q1f�nU��D/�-� 0����c?v���Kww��������-yA4�gv"� ��2��R��Q4w�8���sj��U�C_7�m	�H���oJ��G�n���FhQ&!��3S��.tV�E#�T����+��P�B�/`�"9�����e��."M�������C#Jv	�%"N� 
����$kE�Q;|t|��$�/1r�7V|<�f��&0����x�@��Y���5����V-�������p��t/-�]8,?P��})�A��^&UQ��������Q���`�C
nh�+h{-�;7�?@���J��F��v�Tp]��H��4��
.@�U�xv
o������C"B���*Q��7��?w����7g��M��&zo����m;Y~t��blq����7���h������(M�>�����?�|���#|����_�l�Zj
���+kFTqw�MD�R��]�;*��'��rp@����G���-�6,�t[H�X�b�[�����+"�<�w��^��DZ�-���������O������%
�i�	��b�"�&�-��q�!Y<^��R6f��xY����5,b�9A8P�h}�&D������a�%����yy}�����4����CoG�hO�0��b��p'-e)���G}�n��|f�Na����/�H3[�05��K����i�2���T" B�pu����>��5����]l53�t��hZK�5�nt��'��t�D��]���*�����Y?F�.W0B2�|2�=��}�b7m��	���yZQ����Hi��0	�FT�.`�du�e��@w�D���r����@T�:tW�M�H�p'�����=���d�~���x�.���fd3]��+[op:�']�&Oa�% ��XC������	���@��h�I��(���n��}��6����J]HHQw�&��������z�v�'h��e�je�=��)����D0��;e{7�bG����doYy#Tc�����6q����������V0�
zjt2��O�+�5@�#���8������J���h�a��>���(������������c����1��N�Z���EK���%l���db��|����G�{�{[c$�=�r�1k)5`���R|��2�h���+[7�!��e���n�����(��A$������^y�J����(3*��A�hIpJg����KZ[��?���|>��������l��N2�}���O��g^�G{TN��f�������j�"�S�7-L�V�/�B��h��,� ��<3��AhD�!�c�����Y���a,$�K+��#�o��?�v<������e�$#n_J�h���b���<����+|�����i�k���0��QK):��h� �����}��/����%��O���|v�Z������8pF��?���K<����E��F��2�	�A�����wz<��������W��1��U���c��d���2���E��~���{q-0���4�a"jE�JvO��5���� �M��0����_r�oZ��=[C�W�'5��?6y��?�0�}b�;&Db���5f��!���G8�����R@����t�6.��~Q�l���l#]���f���<F���8��&�����-4�:8 �>d���'�:�)�1����p0���%��`xd��������g���5�����	�m,��7��Q���Av6�n�O����&J7����w� /	�U3-"
�L�`�,�=*Ax%�B�.[��l��������b�~B���6]�I��~�;��}��lRvX��\>���')�B���c<�W0�2q>���Bb���yQ����>�D�q�Z�4���dXhQ1Li��8��	�r�����r�$�m�#zw��� �a���5���)Y�r�+�r	��d�|��:Y$��='���k�\b:HbA��F�jL�K[�������)�
��>�g�d����b��=�I&B`����~���d>�'K�4���SB���Sx����w�K��BN����	�2�5v+������w���PKUe
$+�,^�hRdw��r}��5��(!�)f��:�&6i�aw����H�;��&���#o��R�*�Y��U?Vx�hW��0B(��]5jo�jJ�/�.crf��'qp��p�6u���<���C�TA<�	��f�:2� ���/J�R�*�"Pj
��g*��N����fcuZ
������Y�SA3c�,�hS@�s_��)n����bMd'��pim�V�x�-�9�e�
�{�m@J����Td��A�=��'�Z�����1�=L�yj����g.Xf�e|���i�|�L?F���0Av�Bv$��Fp}N�5
 ���1��wC���������������f��)6��Z=����SWO��p)b:/s��#�c"v���Jl�T�8�K�,���t����������y������Y(�"%�4��	����J�q����v��3�/���9m�����O8������,L{N��,�4��x�4�P�[�H
"^��s{�	�l�lZ:����x8��v.k�K�N(��'��M
CfT�)xX����iY�'���K����-����!�K����v�
��0����O9"��g�^n
�W�3% u"����e
����s[L�����Z�1�N���#��1���
&V�l������+aE8�����^.5��}R��)�!��������~i�u����#F	�P�E/�<V��]�c�� k��	D�@  �0��4�R��n�x�e&��P�7����X�Sj�m)Q���������
���[��o9�:�gX�H`"��~����%����<�'���=�d,��F�o����X�(;�����&�	����
�����yf&d�9�;>�-�B�nyC3�.�cJzL?XB1��HK�e���j�%8C2�{��8)aF��K������*vT��Q4R���utZ1�� ��X��f)6��P�6��a!��[��-;��b����j����^V:�r���jO�����$�$b���bY�Pq�*f�FE�~a�0*ij�QS����E��d�ejF�;������]���g�/GID��%��Zt?�7\�����v;���9r-���`�C%2�G+�1����09,cN�/s�w�c9o�0����%A����}��Z�2�����Cq4�KH�<s�aYm6O9q����[���������r�5+(��&V��,GI�%�����cQV�	��y��7��F*�-l�32�X��r��7&�C����"j���e��d<Y�F��`4��5��RV��Jn���|5k��QPHt6_�>���b�
���z�U���#��2����A�/jt/a kX���5+�������XA������`	�F���VNL;�%����@���1��B&�mY�?�
:`7h���P�G�K[s�Nt/�=���k�����#���uV]MwV.�V���nm�������|��V|����t�&���|#[�l
�l��}�A���@�����9���!U�"���@�����3�����%x��{��� �Dh���SO�t	��+���,<s	�X��Qkt	���Y�1����+���DK�Y=;�|!��K��b���5cV=n�Kt���\.��FS����@�X��e�(����4{	��������{�/��^�����������H����r&�%n���qaq��Z:������a��$���DL����y�u&�]B=oD���n�rlN�-.�r-w���m#�+�������p���������0�_�o���BD���������vTF���F���m�]��"�x?&�v��H^�	"*��@�<">��|����tR�nA=*mw�A�����:��"59�M�3��B83������v��!���M�a�������vhw4a�q��2������$�/�m��{d+�^������B��6f�����ZS4Pm@�k���S8Yt>�����j�@=&Dm�!g~��uS�GU�H���-�d����
*�.o��l�$X�jFU��S��,���s;b;����U��Q��4�f;T;��?�f�E���/��r��i�q�@,Ync
B���v;9��y�]�}�
F���7�A &Y�������Q�+�:��q��p'f�s�o%%lga(���9�����P��8���Hw�-���r:�(,���!pG3�Bj��!�D������	��e|�=��^F�!\��fl�������2�����J�W*��*�J=���E2��*A��FV{���	y��m���V|���3������.d'��n�D�5���Z��&�Pj���	�wA����.�a�F��p?8�[Em�-��7�N��X�Qq���6��{��2�*�g`r9��D�l@�v~��P9X� �f�D�F���e��H��G��8t���t$�]�����2�U�����$(�5l��uT*��K)�����e��� �QlE+eum�2��)�$�2�4����!��:Z��j��;�h��b��'0vD����F4"�eQ�+��A��'�:<,��bd���HZ���P�D'�q��DX�H��V*��F)�����H��-�@��K:�F(1���L���)��&�m�d�q���~ -e]�drv��i-��R �	(L/Y0*o��N�Y�y��
2���-
��L6�X�����bk�|���G8\I��F�G@��,@�<n�&��d�_d��`4:����e�NG`�p�S�n%={G�����K���>.��;��H4�-���]��������q��Qg�7F�������I
-�q��OB
�bv�v2���Nu��O!��h9��6���Ut�Wr�$~��������|a�3�mZv7(�$����#	���j?t����{�Q��d�����S�<���Qq���p�4<`�����Z�j'�����'jBz��w���L�D]�������}�W4���s�uw�RE��F4�~����&��h2}H��'�2+#A��}�������V��6E
��m����g��-�j-�.�?��cO��>����c���,V��&ut!����]Y��q�v��a���c�(*�������� &�#��!�*C�������xC�k<������m��9��u�0N;��m@��I��S'���9����5�=�������Pd��P�#�W��-��E��h��G�wx���g��#��6:
������Hc�
0�Z�5
��\���e[�e���`�E�6��h��@�At��.���-�^S��U������E!Gg���uA�k�h(��J�	���D��,����h0�-t�j���6@�YUd��x�d����������m������RS��b>	+�J1�c��$��1�q��2W
�!�V�W(��cb_��[��1rQ)�. �1��PY�*��~������@#�<���0���t��
�DD�#bGk�����@��d�?>����Hg|�51w�}Rm��^���S��&��C�!��Dp�[�ei��1�@���������(�Y���r+������Z{��:����Q�]���+8�.,8�*������2l��jY�/�����{�"I���"���A�G�n:x�#u^(������/�g�d�y�k���z�;�#������[�EW0�Z�������������`�)g�hjX��<����Y��B� ��� "��	�	;4�uD!5`�8���$v������
��]#Zb�������n���;���B��		�~~
]��H�K����|l�T��qJ6��6�^�AO�8�0��^�]�t��"j\�Z�s���3����k����4%Uz���h�z/$U!gX�� ,�%��	��m�z�������E���f�DR��GP����l9iF��?*N���� ��$:�w�L(
S���V���^H:	W���#�^5�9�'�C��j��*���.�%�4|"��{
5�8��;R�y�%�|Q���wU^�aJ�{!���-PC$x�;��N.������|����^����L�5|���s'#1�;\��!A�}�5$?�q�}��*�8y��p�F*^��vCe3����Y�'tZ;u���tv�kH	���A�w�
7}�`H0�=!�I��������E�X�H������_f��*'X�b8���HP8����!R�g��XK��(��:sH`{�=C�[�(>�����|Q�0�B���'0�m�a����o-�uG��{/�en�}G���v*;�;�&u]�S{/$�1V����>l9��*H�g{������
�m-?�p+.�v���;������
�eI�9�=��������/@��Lu`%��w�_���7�X��Eb��2�����W1�{�P�
/'%|��%�����'��Z�D���T�n�lh�/6�����,�
.��J
��
�t���r+�?�C*��a��v?����G0�����gl��^HG����}�V�U@���,�n��m�����
�}j+%3;�
��L���#R�����0�**���V����l���D_��lJ�AEPl�\a��,!� *�
���l�����%�zrk�K.a� yi��rw����@�I��b9D�9yi�
���X�2�c"���%T�Y�K���L�f��>��Na��F�c����2Y�N�5��\<�sK�	���Qu��#
�,�/(.�oF�tj�����2K������b��C�����E���"��'�����c2d�����/--V��D�Qi�f����J ��]$9����(��O*���lX��� �A�����=�R
��V�ii\JLa]���(��k�3����V�P�0�@�JS6(`�`�E��}��G��h��=������y���`J�'�c���J3�8Zs�L��&T�Y�����5Cw8R��������C�K,B��
C���b�}����t(�
,Q&\�hx��;�Q`�"6����@0 D�"����6{
3��/���k��KU�r�48y�����f5*zV�}�h�����]������vKk�2[�Y�8���k���/��I�����-�=�r��%��l��Q������i�#��Y�;�H��(K���Y�@ ���g�@IES,&�b���h ����]G
b��	��|�~=�K�r
��l�&"����],���.��#����K���/��j��x�z*�[���zw8I�06��%��=�eJ�����3&?���FL[��������%8�f���a��B��y��������/HC���V�@�D�1��S#9�,�1%���81b������]�#M�{In��w�6O��j7k�E���Ll�r���b��s������m �T�"�#�q� E�m��B��Y���M�j��������u�P��;}��f;vA��=�q�-�-��$��s�����?ED��9���c�Mp6�<`hH�:�q���^�����Unf��@����wVKF*�G�*S���
gu�Qy��@N�b�[��@<�#�i��~q���P��W�AD]�����E{|������:X�#�3S�T� ��FD�����4����:
�P�TA�y�0�Z2qB{��BN��n���W�TW�'*����N��J"�pG`L-�"���{���%�#���Kdc,��O;:U�
-*���"+�Z~���L�i�'��g�
[�����?����/��N�f;�Zi#rK�Uh�
YV�0��W�����h�&Y�d������'1�A�1�*PaE��*��F�=��gl(k�\6�����j����#z�+���N+Zj
� ��Z�}�~��w$���pm��6�+��
)�����J�:U�F�P==k�[��|J�+�PUYdS���R�0d]�j9������
?w�/E����������tj7�u����VF����Xb�\djh�4�@����:�����;�]A��|i�� ���Q&�N�H��0�� ="�a�����u
������$J�u��/��
��D)������m����8��[a��U�^���r�0`C���^-d s�o�e���,���>_n����Y�a,�a���6%�;����?�=D�o�@��w�x+���y����j��78��_�,,s/)d���s���Hfu��\c?�j�����F���E+
��$>��o�<�������w��^���eB���G�k���o���own'~J�
z�����U�H�~g�P�����g;,�K����R-�����@}K��U����p�D�����)%	�%]I�9��
������^�a��<?�����u��'�2-f�����l�i^.�A.���������[�|�c�����2��*,�V�d��������["l�%:bAT�n1�N��MxC[��C��7A4�W��6K$ I�v{��59������������3*���#;��#�(�z�}	���&XA���Y�p�����4�.c����I����$����������O��~��e�d���d�QX�l���=s�b(����ec�djB��!U� �"`�	Z����a��(1�������,�x����C��i�<n�[Z��n� DEA�����!�%9-z����p�m�j��}�QK�	w@���/Z��\���o��GA8�U���[,7��C������������1�����1t���H1�f�N2����JT5�)Q��!G<���z ��x��Rd�M���Y��{c��=����u6��	Q������A��B��<�m��t�p�'s���n/~�'��t��.K��`as�Z��6�-A������a���y.�B����U�^�����!���@��'a�%�aTc�[���ItQw��"��� ����v3����;E��vdK$�A��y�X������S�=o�M���z�L;L����L�A�}aO*lVB�f:?���m����PF�����f�M�����e8���
�8����=h�3Z�:h�b8��������6
�=V�����X��F�	����k�/(�	MP{���o�0J����	O$��i`u+��l��� b7���n�9<�'��5�����	�� ��4.ZW��'��+%�56�I����r�������M�\��lF4Zw�
�*��m�ODD�f�DG�m���nt���/�)-�Y1Yv�mqW�A��	eb#��a����k�����L����������w[�>B��l��.p�z0V#��m8[j��Wp�8�mF�����w-|�����&��U���l�8>���f�	���A�HH�$j�`�e����k=�������
�JZ�����M��h�c�w]��w������*�2�����;d�t�"��?�]H�:��YA�0���_�2�}�;�,��0f�]v���wT�v�#B�����0�(A|vC�����Op�	���va��1�����?�a����g������eKua��V�?H���h;*�3����9"�gR�����OX(�2(��r��M ��*a����������O�pe��]]���A?N
�G|���9��,^��l��#�jk�'����	��53�ZT������
���z��D�Qd~
��}AB)2)\J1#UAw��}y�F��uEz�.,t�C��cOK	��I������]0p���>���-"��#��u�0C��	R�L��0�SZ�k��C|��%u�%u����C�R��[�@�Pt ��2RC@��(��0���%����x=����'�<�.D,�������&�(I2��������i��5	��]�~���b����P#�M�"?��3d���|��@��M������ZD+�6C�*�i�b9y�`�n��������_����������'��L���t�
bUn�t�r�n���c,���lgV��J�'r��vZ�%�X�p5\OO�3]-9H�-[P����y9�!�������� �R��(zN������0{TjSDzW?3#���D��]W��u�nVQ��;�� ��E�>u�im�)��0ZL��W3�^A������~�doW_������:��~�fRmt�|z��K��	Z�$� 
��F����Y;�=~2�
���������w���g�����f�����bB�/���:f�
0u�#8�[���2�i�����<����qF�~lS�R(�����?���;��4��`�hsNt���6�1��7�#�z<n��"	+�����-en'$��*��H����E�����p\w�$���4m���j���i���[=����m��1�*�W1��������Mqw�!�!����pK�
�~d��0��|�f4����&��q2�P��&K�j�g�������RB���}��?��x{�L��,<��_w�D���j����8��v/g����>i��������0���h5�^��V��	]��:���i����	��!�CM}$��Y.�P3_��DZ�iW���8����S��T�=�~5�3$e8��X���?���p�;����a�#�$8�)�����A�^�D:��.��������sL�L��"S�
5��������Y1�����-�k&�a������D�Zs�Vj����GXj������!p/A?zx
�/���df��w��=r�E]F[�����Y�����g���i�>(���������'~���n#�#���ZxQ�v8��~5�P[4�*�N{����m�){�����������\��du�3��@��-�F	���+�l�\���2�FO����`�}������a��F?Z���<]���A[)G#M�pn��O[.zEv���		�U��}D����)���G�uJV�H@c6���S����VH��[6��(�~�1�'�4ED\k_:��{�r����(�eH`C�J:��		=�H�,tx{�Q��� qWv���G��*�f�>��2���^�������0�������f?E�`<�k�T&�SB$Z�����-Q�aK^C0V��ol[A?�f��CX���3Z����-����a�zh�_"���h*�y���
����]	xXN������mg�7��H�Ot�����r������jrb��h��*���������������4��QfY���I����n:X�N`�����|4�������d�'k�(t��Y�����)H"3����!�A�l�����m�������v��Q�1=��Fz1�}3bZN���E��tz�-���%�E������KA
���]�/mD(�4�����w���'���S�C�6�� ,��-�J�
���is�LE�]d
����r
}�v����8���d2��u{��M�3G��i�@I����1�~����'�{|�i�����]�G�z��f1���&�g���x��#[9)��T�U'�Sfs�������)4A_$����i��������oM���hm2��<B�� �����h���kj^<�2�M���<?i%����g��*_��� _D3�&E����.���x��VYMPfM�����n�U�|����un�~D0��@�=f�|�Z$���}��8��;���F�u�d�d���)fx�L�@�lEr��j��0�q�� }���_�[���;���I-���:���6{v&\~j���"NX�_��4<���G�jw��wc��5�-��p4��7:������T�D��cgp�����<b�G���	������4����T�����aZ����7��Z]�����J��o7���������""E�/t�Z��f��Ex��g
�h>:��#z�N�X�N����}�}-g�l�rtv����XS8D��VO��|EK�'w`Jg#�	��@�!���"�h��)o�I�2���Bj�L!
#[��i �2�T-eh���L��"��E���:n�!;k:]�x/�?��@�f����0��
2��<�i
�������w
u���i���%���`�}�L�4mh��S� Ad+S �I�)�9�u5��1�%��������8��t���S�r�3�-�'��:����	��O-H�Y��"��N�Y���Cd��e���=Z�9����o	����F�Y���������x����i4/�JD��2q��b���b����w��[8s�_Q�>�"	�~��mn�M�"|M�Zs�6z������?�6(��"\d9k��-���(�G�s,�3���bL�����i�<��.�Y�2Xqw�hq������i���d����0�2�
-� �O4���KhEf��T@���C�Q�'���Y_����#{��a�%������;�5:l.{E�%<n&r���X�6��
{��K@'(s���l�!
�k��ZV3Z}�B5h
e`��xRR��&0�GX�X�Fu��<�d���N���-�I�g	K�}V�t��G��.IIn	���u��HQ�cYc)[����@�P���:��J��|��QX�F��[�����K�������&�"�jZ�&���2W�YUS�~�}�N��\!�:���|d��5��gwr�T���<��I�u���O��c8����l!���;H���S?��.\�����_�t��T�G�E�
h-D�,G#,m_thf=��S9X�/=.;N{�DE�������.���gb`���#f�i�t	T���}�]�}�e��������#��.T���2����F�@��hU�����P�a}�����'S�.�
� Sa�������3�h�n�*�Z�H��2���j
���	P�iB��|p3��\R1�j
',#{� �-D�=��A#|�~��l�7�0x��P���Kf���rz������L�kde���k���%hK1����`�%T�l�Yc�8��x����n���l����Ty�����)�`}�KO|�?�w�V}�����B&@u/�#��_Jt�R:a�w��"{V>IL`95������]W+�N��m�
p�����b��4�dq���m��=Q���6y����*�X}#�$�(�Y��H}q�����������a��a�]Y�����Z4i�AY8P�d��3|*��Z�0�/�"�`x����vq@�G&�lFp�q�/����/*��[��W��6Y[�D��;����HpN�3�.>����I4��%� �'�����l��/S��_Q�g������3�������Vt�VGD���7���@lX��k��^�s\$|��`�������K���x0��)����a+����v�3��x��-z��P���w�P���e�wc��i��H��lM�%�{�DP�����L�������Ky��5L�~���=:�oa
3����zD���g��Qx�{	>��S�BG��������1*��$�n>��22��ki5��|p�zY��{�1p����m5�EO&]����o����-�Jl��\�"Q�Jr:��!� 3�=\��W`��n^����	p8����)��]����w���
�cQ��Z2{8;+��4�CS��v^~��+g��0����Do��
��E�>h���?5�,��:������>}l}�V���u�������i[�5���>��j��0p�e3�/��� �t�m;
�E!��P��l�~��e�������C5�z�B����;����������fOIC��g�t���������f������P}B���h2����-�qo�l�t+���v�.���
a��jg��^K�t��\4x�2�v�����=����������k)�aw�p��h����5f9��(��:��K^_O�va������.��Rd���6�uvp+�&���ZEB�������<�2)�����p�_i����!#��8�w|6�I1w�6�Jp�g7������'����G�=���pC�_��k
�����N�t�l���k��rEE����J�����;sB2���^��XT�gD	Gx�.�#����)�����?g���	y�&A�vxxg{�)��%{���
4��	������r��>��9 46�������x�f��s�i�SZg��4$�����������dv	(�����=v-�K�>DD��`��gv�-���,r�i�U6r(9�a��a@pO[+58>�}�-�PK����~x|
<�V�e?dpJ��mUF���1
�����jx?�3�����SD��#���l�Th����H.t��<��O#e����-m��]jrRn�������n��1�e���U����O?���D�����n;�J��������`��
P@+��G���H�z8(�rGV����EH��n�D�v����"e���|��p���������?�5�����+��T�����~Y�8"j[.�vO�����x���Q����
��W4��3D/�!���X��IB4
$�4���_�"���e7����p�����!2����4��S���1�9���������z��Yat!I��O9�f�z�J����!pk�:��j����ip��@�`��&�uUt)N#��Y�
�_[6������E~����r�$`�pn��`�}����p�-N�'�j��9!M<��%+���
j�|����F����i@l���U	��������e�S�>U�x�v�;BL������j��Pe�T@yC
�x$D��@B� 	7�����f����UN/DL�s��Z���y���XA	D) 
F��m��P�r� �%�
p����~ovv�4~>T� �b`D��1q�1�	d?S�����z�z�8�f����
y�����4\o��$8�{
��Y"t��x�[}/d\���m���a���.�d��0��F�?n)+L=�O��H<	�k��?=ij�#m��>� #��=8���.���Z
���9G��Fu����!���t�p����w����%y�Z����H���H����p�l�b������f�/���<��Y�ZC��;�����0\u>��n�T��G��~��U�nA�	H�D���>�hk���=!n�#�\��������{����C��X�$�?�5���~���r��5�L�k��Z���f/VUb���r��k��#��$U&���j�Y�L���\��xfRsg�0ED�
���E�F���e����~��dr�{�"�G�p/��t
M>���sN,�os�	�2�54�k;��.,o��1����D��v�A0��������>�C�����_�l���j�D��~�w,����L�7A�{���[�[s��Z��u��w�$�(4��P���?>u7)"wC\5Z���eu��X����s`|����+��hmrN��OA�8^��4�^��3�6����iKw`>O����U��T��!����{����v����^�N������3
�W`/ ���cP�����H���`��=�	D��b=�px���������{�����;��a�Z�#�����a�w���	�����3��zG��������c��z�K�y�����}���i��a�
�(����������5,M�^�P��5	�;|l���xd��^c�;qyF�V�\�=6�"��f
�ek��8BD����/4(W)����N���l������.��wRE����
������w��mH<.R�+�~v�����nO	�6��X�D�)\x4��x�g�X5���6G:QG_����m�`�3B���(��Sp~��`�D�7�R��>�����f�~~#+��j��W��[��D[�^C�n��:��~f���A?x+
1�^�� �+
9�Dq4�]����+�$��U�n��������@
��p���8k���q������2:�����-���[�����oPq����r����#��z2E�F����l��aO(&YE��9������){W���2�u`G����k������$��Ukt1|�QE5y�/����+(�I"=�*;��Z��O�V������Q� �z� a[�.���:��"@rE�#��������!���C8�=a����jG���[n�<���
���7���aW��sV��rO�}�%B���	�v�f���g`Kq:D��	��`&Td;�� 
��[4��FJ�U�'O(�ZE0�]ZV��R*�P���@F���_�lY,� ��S;�fd�����;H�}o-:G������-����:��9�����5��A,��b(Hv�*�)X��r�����a�r�h-s���*B#j�,B#������X-��mD�)��������W�E$��w��[��E���u["Ze�='�S�,�n��+B[)�oC
JZ����)�Vq�5I�e�}b�p�lB�����D������U���f*J����D���H����X���MIY��At~/�rR{�n������9��[4�o����;R���%-�p�TeO�]��L�A�����s�*V\d?����d������6SP���~��u��6s&C��0�q��:��E���
]�A��4�D�2���:�Vx�*��n]���Ee�����}P0C�mK��r���L &l0k�c����/*����=lN��7=�p���
�:���;�f��;��6^9!��2���@ZO�d*�� !	�~'D�/����
�'-�!R������pA��E�J�5��#�y`�~7O4�Y���2���']d���
�H}cV��R�|
�Bv�3L>���3���O����t|���*��W
=������`�����*$������x�U-����P��__V��:%�n������c��0��[��J$U�c�/N��j��0��a�$�Y�0a��"��r
@<��*�A�0��h�%�z ��D�(����t������3��lw��d��:SE�?�h��_�������;����(��f��j�{��Q;�u�~i�.�lU8D����M���n�Y��n��!P����m��O�G���8	}���'<"�����	'�eo�����:~�Qj�
��Vc�� u������X�''c�EWA'��-��m�Nn��aHf}����D�]5��~�l��kA����(�W�M�}V;��������UP����!�	��=��E�P��)B���B�� ��k�=GD�Xu5Zp���<k7r��hu����wzR���r<��K,�v�����\�T�6��QU�6�i��+�*�$3\A�6��
jUat2p�
i��0�
@���x�}����kh�B���G��:jU(C���oA�Y"�q�a��l9�P�
�Y{���Z�@�&'3W[U ����j�&@N2W_Fb��iJ6��T�7[��,�Q��B�p�����_���a.��Mii���
��C	� �88hb���d���p�^�R[]>sn������CY��LB���dVu0Q ������	e.u|^���w�?e{�!�����G�5�`�$G��nY��js}�WS� l�$�s���Y]v��P2�9?o���|G����P�*H�e�3{�S|Q �w�-�I�����G��l������yC�
��;,�������3)ku.5���u�sq�&�0�/wv�����j1��EPo=6��	����-�����l�U
Ld��@r�����Q�&x�_���8���B�H�U;�a�r-���R?>R�J��XS�j[�������5�����fC��5��8��4[�D�J�9�:j�7�
�'��Q
�j�l��+����D�I��!�e����������R`�9����1�M����w���'-���`��,G�lvg�$���%��-2"i��F��V,T�vr��0��}�X}��{v��)����@��r���&h�����uP�z
��Mwd���,��U|��2�F}�������j�}��B��CR��"�7(\�DP3� /���9�����{�R�V���������:p$z��}^L���=b�5�=�F��z5�X������Q����1A�.���k?�b���;j���]�L����Z��	��Z^��(��C���9�.�z5����{��Nh��E�l���!���^v�����P�79M�����8������|k�����ED��f���U��v8��qT
vP�F6��6�����H���i��;g>z��H��@
��|���_~5���*E/agE�@Qa�ml�'���:>.D�Y�9�if�
6�+Ir=RU�����D	Y�}y��G#Bd�lm����iM���>*A�Dp=�Qp3��&L"����h������K��nTl#�"�����������
4�-hp���6����-j"��	z@kW��c3b�4#��������� ��
v[��Lg������7��(����f�EYG��o�Pq��2���r�����
|���u�;"�7��s�;��`��k����k�@fG�R�e��p��xm��zz�G���^�jB)H���=���������K��"}�*�";��]��T*�G�m,$��}��0�{*i����?���Wo�}"Etf��P���y��yM���A�8���4�=��mw��cs*���:�7���M����(R��t�c�t��������5�pXl����;-B^������,Q�-b����,��_�����-t���yic�������
� 5�H�h����]6{�
�������2Nl/6)���gf�?�%V4��4���vfD=f���X����U4�*�?
��bA��@�n#�h��������}b���+���p��1��!���^������x�3Q7� 	�P4�aM��2��}K�P�9�M�����x�M��ud ;1��������U���$�������%�4!�Fi��5�&yh�D��10��"[G��ZR8�(����%���$z������z�L��A�bJ�TF�4��,�e�x��q��z;y���;)*
�����h��]XBt^�-qgK���(���-Z:���K���p�k^b0��Zn]��8e���;��w����D���c%�K�X��;��s^��y��D��L5��������Iw�c8's&�v ��>na��K�Z�&���eA]������"|^b=�+�t>���,���@��2k�.�A���H�B���|&YM��jqI����[�a��A
���!�����	����^^�f�Dct$�gG�4[�7L�3f?]����4
��'yV�	t���B���:L�����d��e�����������bf���J�����u�X�Y���^O*����^_�������� ������d��I������]P�b�"���;����4��6@J��kv�H�7�|���ma�*+Z��pf��6n�@��3�h��U��?S��4�����Ept��}>�������3Qm7j����Z|����t�O��`d�j �~&d
�����3 \E3��H2v�7V,;+�H��k�w~���s�����H1�_
� �f����� *$o|@���h�0����G�JC0G���|8v:;�st��l��]����2�d��C(A&7�� NM�\�G�n��s Fx�`����@J����e����������|F�D�	G���h��>�;�+b�b�iv�"RF����h��(����f-?p�'�,�l�����/L��ht�������������af/5�M���������$#A *���dSQ��pM�>����
+e&:���QDw �FG�������:�k���5S�h��3S���2�9��8�H@6�(%>��:a�l�����$\`o���))z�����8��F���6l0��
����G���&I
�q�B������N�&mm���7��u_0}�?�D'�a1����n��
����gB:�����4�otg�������C��7l��RB�0j�V���M�y7���V" v|����Y�����lz�Y%���0u||�N�T�D������_���~��%7����hX�xB�_�<��rT0��HG����VDC���NC�X�����P�e���V���Cw����
aK��"�Cp4��	qI��Y
qL����Yt����>(k,8�P���7��hY�p?h5��r�)�����*K��KYY�5������3����g5w+�R���������F����Z��C�����)f��a`��po8x�a��el�a�����$�7���#����&��v2��at!k�S���q9h�g���!`�L�d�f*�nIBO��S��Z��&*f���i
X�gm6
�;��-�R���+�@��MH}�hy1�p�:���}�v�������:�y�|zR��r�{�X��I`�G��E6���}Ac�F��8�~�������u%��-TSDVO�
�6���u��c����!i;=���������Q�m>&�����/������X2���Y���b:���-���?�0�w���#&�4P8�
����������6v�9� ��bv�����y��m��8�ig%���s?����
Z���HXEf�=��t_�J��3���+�%���=b�P��Uw�4�`:|����c&�����SHE���Y������U!�'@"�*��.���;>�E�
"~$Q�B8��^�&K3��xB���7;����w��-@�^�g��s�7�zE������+��eXA��j�0d���[���P�xY\�4"����
Q3vv�@���B.�H���8�5���� �^��(�������V]�,�&pV�d������2�x$���']���n�84��eku7?��5t����8�5�������Ne�KR�&���Lr<�����5j�O�
+��V�Gc4��5c8�"Px�D�����V��3?��[����sZ�@����(�d��3��?�<so_l
F�w�l������Q���}�{�fQ��=�)
�I���C?/�y��E7��N$E}�9���99����lZ�3~�-�t���(�e
b���u���1HBj����|H%�*����x
U@arDD���2ci�<�R�\�iq�'H?"x��.�e��w`�������e��u��o���(��r��-��0���ms[W��u�w�gJ��1OgE7��4v
b8��e; ���t}AX��/�
q����xe
Ck��L�.!Bv��������'��{t�wj�@2�h�����
��:��LaPb������hr4i�-d��?y�(7H����rQ�o�^?�3��F�#��t�P�]Hr~���]BG��.�0��L�%�A���a��z����Es�_q6/�������v�V�%�3����l��?��5��������}��D-Q���(lhd�#����� tg	PK���!S�TK�,��(@�sD�;4y=h��PL�����V�)^l��������]%&�?�5t���_�Y6��S���01�O�X_d���%��f����"�r	w�<�����{V5����A`$�����1�gE�����t��J�ED��U�o��w>�l.T�z�)<Tp��}	��+z����hr	�@���Y8<�es�,�n9��XY��K�eK%�A���a�gns%\-l[�CMS.��
��dq��xED�_���&=�����!����T��E_H���RF�\B'_�����Qa��U�B���4� �n����%��Z*�	�3+*�Vp����b�����rY%AY?Lw�4Z��o���$���zy���y-��:��d]b�������$-Ad��6Djm�K^��Y��1�ed�J��2`���
�+M��+�x#G�X�]
x�g�4a
����[�i"4|�?yu�^c��$'Y��sS4/�{�?!����O��m�[���Y�4-L��pN�.z�����r�m'�@5������k1o6��93d��3z�F8�/���������h����k^iks	� ��H���}E�80��%|KLX��@2��r�4G�P_�L@���=x�#{�Nz���Oo�=mU}�g��Y�~���]q�5�Bu�s�)_���s���VjvD�)���&��e�����QS��r�����������	%���5�*���g��;����H9�:���%@C	vX�foM�.��6��-H��y$�6����Z��H�"��e�&,������ �CN��>aTp��N��?���8/`��3
���R�h�,�jY?�WO��s�8��$���6p�as�X��L�-@�D���` ���N��n�'6��j�P`���-4c����H
����O������/.�gTdnG=�������	n���@�m�DK�~����1��hO��0������$����43D]H"�Ra�.�����l��g�E�3�~NOk;�5�]�� �����[+��ZFnA�x46����D�q�w\!����T&�l e���U>c��/"Y��s ��������9�be��)h�'x��>�\���dO]�;�4����fS���+m"�����a��i������p;��r"zdM�-����[�F�8jc�E$n���/�m0�������GI��+'n>�HkaW�v������������5��@:� �����A���#Z6M��55:�la���'r�6���� �&�Se4�1���,� �F�����Im��C5+*�c�E��N�����g���!���63i���7�,2�F�>�F� 
���������@��e�bgV�[�P�|��m�tz��"������	���4�/ �"������Q��Z���B%�]�
Q��//���`n��5k��	V]����e���pEV��DJ{���T\�r.�*�-B!�z�l�o��R��e���(j�'{�q�Y�xt[x���f�@��I���4gA`a�-��$v�8
� I�.n���H���K(����7[�D�)�D�lQ�_�=b�NX_B��?�8���]�F�
�!Nv��U<�	����Q��DoB��S{7�.V ���-�N��O/|��7(fx��{�K�A�qU���q��{F�wY��^	�A�]G���w�0��x@�w?�l��
!�30\e+��B������@,�8��y�����:�Us�$p�3��}l�sw( �_��C����E,����FqTT\XXA!�ITw�/SX�8q�A���#��3r����,G=i��F���#t"�A{:E��c�f����c'��pG���{�t,��O�|�p��^�_!0���Q��9z������M�8���k�q��l�Q��)�k��w�F��&�P���8�A;�J�5��������{�l�h}�	��S&f&�<����B������)����*P9����e��Mrws�gl�z�g�
���7��Yt�k8����5w7��Gx����:���:(#������\(����t�#���IpDu�U�D;�
����,��GL��6���Z��_h2�q*5g�i?��	v�@���p�Q�"G�c��;�#��-{��pP�I5
Gh�bi:E���O�X���,�'B��-���g?�P��h������>�H6����Z���nYfas�Lp*�����9#N��_�	�p��WC�-��\�O!���R��8�B�������=+]�����2��&�{*��v��!��:��k�GE	�g|��������������/XE�@���'�Y!\��k�����O������Kx?��*i� ���L(,���h���rp�s&��gk��hlyg
��������#,�J����`������F�?��@�����v����8�b��Jd��q���4�G��a�ep����N�&	�_�sW�R�8�Z*��Dq�O�A��������B'�Y&4p���e�	��B"4be����JV�Y�-�!�*����6C�9�MQ��%6Y4�qh���e�
���"$����a!����;U�%:��Ec��������c;'�: Ud���p�P�c?�������VJ8�=V��3�~�&L5L���|��������`a4��Q�v��<n�@�\6���p��>�i
#��j���*b��#]�]&�t�'���b*=X�o�i�[���I
���s�po7q%D�w��-����n�6:����s���������H�QlV-��}{�/$ek�k��C'm������'m�,~��8��
���{
�I5f]hR���t�s�(Ox@w>%���:�W6�����b���#%�{	�����u�Q���|i�?NN��x���#����+w����������>G� �*����H\|�(��
��<��I�w�j�e�(���S"�{a�t����":������Di&�1RQ�����
��8���x09<��Q�
�io��'��)��h�"8����o#Z�N��n5�x��f#"����D�D%F��a��.�T�������S�96"r�|/$����w]��awq�=l���i?(����T���vO2���JD��%,�!�){��$��w�������k\:9O7�,�3����������;�Y�-�rM��5L����0������w�?��]w��;��|�%�oU���\f��A}�^C���3:�E���#��n��:���o��	7
��e�5c
��R�����
�t��W��R��,�A��`'Q���"��u����,������?9�9L����el���oA�XIc�.+k4U���]��w�{����e����L�$�1�4�2v_M�����;\�l����	���_/9��#�������,��o�6�G.�-���Snh�m'�Ec�zK$� U�p���KpB�!2� �b������)I���f�WS	ZV���lB;k������n��#x4���@A�Z���3{N� 1�>�������D��A�����|+�y�!�����i��_7�Vd��^��(' �v�aN�{!q?������xlpaI�HIkg�
�"t[�'�O�$(BjB/��1X�D�M���c�����X��6�9r�\�t�+�N�������l��[OfN��X)�H�s!�j�o�B����@$�rq��]G���_s�b�E@'�(�h�b������<����U���W8*��`��	+z�0�e�$$�=��&���R,U���'kq�]�j�K�faLM{A:�&>.�d��@�>��!�EGB�P���X�����#}�dk.B���xt,+���A����5(�N�������mF"�]����<:"�����������������Z9	ah�n���GX}��
�';��r���*�A��!���]W�3F_�����U�O��"�58���O>��+jT�n���T�8F��"������6��2�=�
x�3�����
��vb	��Y��^A�1@�d�P�w�J��*��q���y�������g�t<���]`B���Fj
6�r�Q2���],D�?����C�`T��4S�/j�g?dS���{����v�:�R2� p*..*.��,���9B���4��"���N�Y�$l�Q�WN6w������T���QVAX��F�[�e��U�V��1_��4eO����-��$e'[!t����]�I�>d�[����47@4'O*�9����iy�'���ob>�gd����|�f�0+��$���S"L��x��&p-��Fk�� ]'Z��0��C�w}�,`[5�Md_����Bvw��;�0#JpqZC+���E0�.4�+3�l�"����������6�(��
��[�D�Y�N��l�t��"F�9�8r��E��)��
���w���0z�������p��Dh�A�_Y-j$mX��9������$%����l�c��{��O�e���>���s�����F�!�Q��-�S��g�1�`�bW�d�V;(�{'�!�H9�����N�+������0x�%�
����uFKG�ifGg�*<6�|>z��N0Ux��K�0�����j�>`��>>��K�N�i����MFA6D���� �jq��-<��_����o�
U#����tA�;]�����(�F6!�_}��K*���;��^�p��q���E�Z���&��	;|F���;�{n��J�Y��
Q��VGu7�eWQ/�U[-!-�v�jEG�|����-}J�&o���
�|�jw�����
N�.[��C�~7m=_�H6��S(��������\Fv���q���;��:��'{���?�s���MRU�����S�����iW+�E�
��S�=���Sud�}<��������m 0����*��Q�
�����ROt��l�0�>���}?[���dd��
���N�3]� �g8��HvvAwW��������e�W��@��T#��
���Q������5('O�x����N�~����d��5�v�I�M�3h�qr'�qfK�0
t����;R�(�w��X��N<HYV�	���Goi�]iLcv�qm��a�������EQ���2��d�"� �i��:3�#�#�W��qg�!?�aU\F���|��s�L�v������ �k��R���zaU�i/U����}QF2��'�2�4��9����j�%��Q#�
�P3�O�}ih������N�wC�~�;y���2P�
�� �;�"H�ZA;�O�f���_.uv��u��;"=V�����h�l�	a%<������V{AM&,�i��"d�C5��>�vL���u���-��|��}��#lZ8��-T������2
�U�F��
5�8�)����;};)����pfRP�
"
��w��h*Yo�`����y����s�c���_TK�T�dq>5�<	,,��2G�Q[�8�H�g;��
��,d�`�Qg�����mX�0�jW�.������!�Ws���L2�v��":a5c�N����{D�!SM�'��Nn�Y$��Ya�E��B���f�q&��?�0�e���n<*\��!�/�a�rG����3�-���v�O�	���4�������
d1^R�9��sT����D������\����<�2s��"�ws�5�
R
�r���u�`&)�}�����Y|�mk}B��w��#���VRsb5�������v��k7hh�$Ux���
���'XV���=q�2���|�~�%�f�k���7�D�j3�AG��ZRJ�v^?"^�%�]�J�	@t�a��_��
��
DxRr�3���	��1r��_��f��8�H�����5P��~[l����T�f�A������xpr�����c
�V�/��8������Y�����za��=������(`{�"YE��
b!"]L��nJ���[�"�2�#N@sj�~�
0j?5ZS��WFHl_N�H�M q6��Qt�n����0�<��Y����k�<Y�?\�e��������'���X_�dq��@��;������>Hk/"��&��g������9�:j�7c��B���f�� ��P��fJ�f3'H�Qs�M������w��5����l�+u}m�p�V�,�x��"0����uDD$�lB,���S\�N[l��(ibU���������Z�y�-[�������5���h�����
o�F&�&�b?h���(&gd���Qb�uN�ief����vA��EE����(���G��rP��:�^T�j�\;��l�'�]q]b��`�a�s�f_��	���B����.���`���d�b�a�%A2���F��vl��M8k��DY���4�"H�	��DM��x^Y%�
���9X��#$�	w_���A�
N��.�P4�EHB\S��	��&y���3��5�,(&u�c��GG���
���d�����V�$�F&��<%��?�t���
JD;\*��.��u�H�����n,"�?���L�]H>��`����L�i�u�d����A���uQ���_���m������ ]8���c;�n�Ak��B<�J�;1�VE���| �����cXt	��@f�&�c�oA�\��MDV�Br�}�����;%�N�����F�G��?�
I�6T��k��ZD�����-{lj�i��l�.��5�<C��w�$�6��hh���i��f�X�0)���I�����?)��oF3������:��D,f4�.�!���X���������Cnw:5�]������(�����[4
D"��M���@e_d���f^�$�]x!��}D�E��/����oT&�=�����5��ow�C���n��"6����,
���be�G*�����uv�`����+�Q��&��Z��Sd� ���s����G~tp"4�;���l���������"��� �n�G���@de���1��]`f;�� ���"RG����z�ZWj�����Q�E���M�cD
�����-Y^���a���6�
��r�����>)'�O�Hl0{�b�����(��1�w����Y�"T�:�76yw��<���0���s�:�es�A����_Tt	A�1� ��,S�M�������#x5+����#���BFV�X!f]8:�T�>4����[qwV��OI{0E�"���E���k4�������jM���F}������E@mN3[^4������|���pg����@.�[��8MB�X���|p}4H���e�N�|��<���n������������p(a�1&�o� �a�������V9�
G�ec��*�0��#�c��4��
�VG��!0aF��aq��1�n�
������>E�\�]?R�A
KxT6����S��/n4j_���77p��!b���f~`\�|����iC�C�2�6�.�;���Dx���&�1p
��R�i���~���3��n<��;�2��a���S����������87-@��w�I���p3�H������&NV�Q�2��o����n��YVT�
+������=E�������������W���kB����������s����N�8���"��amCT`
�
Hm��������M*�u�������0�;UD�M�\��Q�=m�rD����D�0���j�a�@��xOQslq�3����6����BT~:5:Y
�(`�>?�'�u��?�0��������PC$F�]��h
}�h�,A�pF��^��Z#���m�|�1C�7��;4�p�	 �����4V�F/����i����Ve�Ky ���!$�'�!��2���!t�^�Y�x8`�����M)f�-��g�!1u�b��v@�� ������r��*|���A�E��!!��4[},�t�)���mF���&����B�lX�������z���%�B�Z4p�����f@��
A'��WwN3QY�������Y�.�-1z*4@���8�1�����h�I�M��}����_����}!�>X�f	���sY�.�0��?��#�:����M/gVgM�/P�;	���]B��lzn���
k(
���c���[��iN���i��a�vl/���hB�4�>��� �*
�!v%�\����|�%
�;��kvBv~��l�������U����0�Knk���5C@�9�{e�d���<���n���~4����Q��_k�tRO'IH�Y����el�+"�$��gi,Sp�1�KO���&2+����!��K�'��� ��?����m�L���L������i �����]Wt
�P0�I��)4�x�D�F#��cL[�If��nk�M��!����9mrV#'�Y<�7
jZ�Nk!����x!0>����i�%X[�j�YlA��6��qS8��LQ>q����)��D��)P�)<�0"�e
����&:����%��H6�'�nG=�)X�v�O[0�<���M!��e���������N�B�:��0����P
���������Y��|�����!7{L������K��?Cv����4��H�M�_��o��}hFg?ET<-f�����D<�A�lh����s�Y���4������W
n�����H��7�U����0+EF?SE�j4P�n��O������5�(`&G$�����h{8QnQ@ES�]��	�y�q�F�J���S�)���hsSXE�m7S V]�q
�`RG��)l�L���6�� N+"
}�l���~��S��c�=f������[�`7�1X�.��O�FK�|�,d
f��T������4�p���t�5�v��n}r�P}b/�����M�[�S���&�m�����0��[3q�*a���Z���3����S�D�u�B#`4����
D
�����$�^�����\��rpI�R
� �F9�#i�%;;�����-�i��3�}���l��d��a;D��)�"��M$0���}�6L�h����c`$��Hf=V��w��l�i�������S=�xx�ei���E4��T���"Y8��������������E���/G�{�t�V8!��G,�y,8�~����Z�;�Z�.�2��.���Z�o�
���lV��UX�=����������`�Z��s��'K��R���D���e��^������H\��A��Y�&A��"�F�������0�C�s���R��;l�f��;Q�p	m���et������[�g�����ygW�lc8�DS�SB8�gc���V1��z(X�=Z�������/�9�ZB����_�o>�.Y�Vq���i��4��G��S�|��I��at}����������w9�A�Mx@U	��v1a��yo-0��6������l����R�@��d��H��PqC1#���P?�0	��':F-�X�A���	Ax��3Kp����e�<�l"}��}���DW�
<�V����8f-�QX����U�(FG�eo&�"�q	r`GedO��zK��r����o���,Ba	��0���L�qn��\4w�q�n]hF%YN�^|��@s<�yk���>�t�����=i����{f������wD-��%[c�w�j���a_�])��f�K���e�j*�����{v���w�1\�����K�YR{�@\�)�m�������{$]\*2��P�����l�b������J��-'>���
�����EY+Vv�>����������h�GIk�i�k��h"��%��X/m�17SW�5�tb'��io�{��%d���8���8�dy@�������hqRG�epfbv�Za^3j(-�Bd�&a5��o�Bo�=��}� �����`� ���d������V�<�W�.����Z%<p��v�~F�����X+������d�%H���_�k�s�D�����4�,k1/a�:�f��g�t?��"%�!�6m��-b�!2'�%��a3|h+e�m[(�a<)p�$	y�L�����K8��D/#��.�4e�V��;�,����@Otw���t�Cv�q�tv���!�K�&K�qP���!��}�o$z�����Q
�0Yl���t<{fT�n�8�����S�
�T�����1���&�[�H���,6Y�'����������h��6Z�
���J��:�]�����wjt;��X��<:�%:��/v�iJ��\���Epv��BZT�m�L�-���]>�h�55����^���]�����e
Q���.dD����;Vv��UaR��d7�y�Kp���f��v�#����t��KzjW�5d�o�Iu}�F�p�����r;�����X�:"��-x�D%��@S�����gf*�
0��}jw��5�("`���4���.����qlw3=�;���7�;����$)����6��wh����[D�@���-^�*D������������T!���)j�vd�y'j�"�kt;[�0��XV�W��C���:���~���-��v(�V���-|a�_�Q2Z�2�������H��=:����;9d�3
 �!+@�O�md4�����
�d��J����ji �W���9�0�w!���~���(���)��T��pm���^��X���1��^�r���{�T��$�&Y�qw`���a�)w[XY���j����S������na���x�9����}0��B��*���-����(S������y�i��h+�����j����t^g�n�B%S�d�j	�`r����1,����E��ot	x��}�^���w���� ��E`�SL��lIt!�����_u/Cc'*\�h�&!���rk�@6#��-<�F����j<�PE������D[�vf���d����B0�/2�z�;�:l!��P���]Y7AXF%���pv�v��(���%���F3"}�v~5�Bg1%�~�30-�Y���_/��vV���pP�c���Vt�����L�#��
�~�3����'��q���N�e`�cf'��� ������=��q!���a��i<�B��y�^4"���"2�����]CM����HXu���������!2f:�����i�Y|Z#�8������g�L;��&fC�h%�5���h��~8bO�Ob4k��������c���Q�A��p��GG�r�� �
��-�e
^��4����4g��QNPgXC����G��=h�D���mP�����0���p�^�C�c���F���y���X"1��1En����O�l�*}^���v|l��{��mb#Xf��	�����������,������O�<�l4A
U���V�W>+�R�/Q�-�Yt�*
�6bH��P�R��w�,�{�� ����"wK��\���I�������B�N_�saj��<G8��0�Z3mcP
��dfw��)�����`M�xZE��c���[��ESM�����YP#�A�N��g?�%,�liC�g(������2D!Ec��!q�\��������d�9��i�C�rg�������E��c�BZ
zQ��6:�,�tG�Df�v�DDc?HC�������A�^.1�����ap~
��PwVh�o�](�}1���*��:���p��l�	*.�Y�~Mt�8/,|��]��:����C������m��^d�q!��R�2�}�yz�
��"{���e������b��m������&�]&^���~b��P$��^�)�?�WpeD�V�8GpDSp4�DD}���D������3��#$B�MX���"������(�I�������n�\�6���/�(�����.-bv����}��,�p�Z��l��D�
��2�#("��<�";���,A=;�;�:[��4�HF|���nQ-7Z+Xc�au$`�<b�%�{�^�'�#6��S��9`+Aca��l��-��v���������<F��K
\Zzr:z�!���py��H��/����
k���-+����itA�D�l����A
�w�+��I��|"���::u�R��o/�`�yY����u���Zt�b	4���4�����
���a�8��;������L�g��U�a��������&��;H&���`��5�}��������v�nH��j�p�|���L�G��X�;�%]�������&������D��wxs������g��Yx���P}Fo�X]�=�;PX����f6\�����r�$�����OA(��'��9�%IO�$�:k���%DE���!�A���XI��w����K��F{����t�j�N���-v�Hh�� +���J�w�U]GVL0����i�R4a�#d��#
q�	�9��_=�V`��e���!*��Fl�4����)r����B ����C^)�{�{!u�;H�*-i��������@z���:��3�E��F�_���tr��>�b��1z������[gg;�@�r�����;��l�o�<3D#���9� ��(����;R��}�TL�&���{3.W.yiAr
�� Vo)S��B�wr�Y
���QkvH3`�D7-*nGh;�^F�o~2����O��,�	5�@���Q�{
{RD3B���n���WB����;�v+�"x���:�,��!���x��e1u�yGj&&��wP���jDQ�pO�����%1�=���[W'����H$L��Lx���y4H�
]<	<	��.Y,,�����m������V�h�����!�/B8C]������l��h���;�aUD����W�*������5tbe!��`,��#*�P�3-q�~Gk��a��uK�D���>�^8[�,��(3�b��f��d�N�>���
=����P��5��`��p�Mn��R����K�A���l0
�=�f�^Ge�+��^XD�|�����??$`&�S�C ��D9�"����z���SA���Z\j�_v!�P8'�����.�Q��)�!�JW��
F/��
?�<���
��S�q��!��UP%g?@����q�h������W$��ST ;&���Wtd/�-�
_Qc��(�e�Zl�A��R�3����bq��4=��P����h���BbRa���R�(
',��������0�PCg#����#BV��5�	{�J�S�7�3�����#���r�h�N�V�a�����!�_{/4�Bd+�8{��#��X/��\Oq�55���$D��:��Aw�]������KYO�54�`������.�����$��XY���ld�:Y�������])�6�Mf��47�)�Zu�_d)y��o����������mG�#�%���w�bFh�s��S>�0�K�$�e�>h��mS����X4�>����]a��oD7:Ex��g2\�Xd�F��P�����U
�48"i�w�h�������l�
�p� v6��ZPY�����#,�Xd!���6�J�\���>@W������"�?��+�;��bt��}�t�"��D�f1�q��'T��
�)�<N�8(B:��JW���=ex�U��"x��:�������5<��}�B+�-�"|��{J?E�Fg����=Z��H�S��i�f���
��P�.�g���;<�%+5p}BJ?���\$N1����h���Hu����EZ�S�}���LmO���0�[�a���P}�l�_�������<)�����$�����r$F����l�An�M'�q���x1�A�jvX.���h��S����m�j��);.���+�l�V��C�����C(���x��1���	�qN���y�H0N1�1qqa:�;\v�������!����|l�Z��.�DB��(��D�������g�hd�*�m�=�w�����m9�d�;!�Jd�x����M�R����
�>�:##![=.b������=�����h1��*Cdt�%�.�ZN��#��z��M#jV:��T�c����lTT�J*�#=A����!�N����
U0!�8
e���[��BD�d��s�c���O��B�i�����!�L��.���2�ZrA)~������*���j�7s� ��o��0��G�F��Q�j1�o�S����
����)�0BL�Ob.�^��*��<YRp��nG,���i'�o�O���������������h���������������������*�����s�<�<j�pdc����:��Y�[����6�bU�1��	t���Smu>��.�8{r���p:���l�(���;�d���x�^(������������,Nm���7�l���]���A�������/���7)���SV��0x������f����Y���L�9��<o�:`�@8�F�r*1'<��R�� :�Q����?���;8a���u��������;�KP���]��>ER���f�51��dCDD��M:�8`��u��|@vU��du��'&�U;J���P�jG��*��_����H#���B�eoe�c5�1H�����j���T;JE}�*tc�F����2:�7��{����,���$P�G_����=�����A�(�u�����J�<~���9)�@1�;��G�wT�UK20I�iU�n�����th�����.3���?q��?n!F���B*F�E��4�����*��y6�E�1(�h�!���p��Wh�B�F��~����6�U�Ch	\�l����]�O��;�'�����m��k������>!��" �n�c����4���m#fv�6a�X8mCW#�M���Nu��O�?�Y��)�J���!��r�������~������f��(F49�_ �a�o%z��/p����t�$����0����*�,�DluW7:�j�ej{Ce�gP_d��������*�m<Mh����e��(��������fbK������Gv��U�������L�f+�shvA7��c>��F4���Qd]�NBh���S�$��b�dyk���(�Z1zf�2��MY�`�w��������hd�6�Q����FFRl!���LFY&�/C be�D����69;tyz��D2�s��s�Hy�	�8ad�idE������&0����-#y�E;V�Fo1�����X9��<����V��t��6js"�]�1�T�+K���Q��'�{�h+�Ggg�&��Md�hL����w�tAJ�P�>gs��l|�/��OK��FVJ�k�*F8H�`�Cl�#�] �W ������2S��/�]v�N���$S�P��-��@PGv�K���~'[�>��qh1��j�f=F��� �(� �����)K�F�]_hwR	e^�����R�M���zE+S����G#�����mS�*�u�G�s�[�����@��8�,|����h[H�{�v�N]�g���	�!+��=�<�L>{A� u���A����3�6����m��!�gS@���g�_�j[���G]ts����Q�G��|�SN;����7F����>TQ?�	�X�!C��B�O�C|���U�Hg�gl�&�t@
����������qaL�26`PA��d�����N ��Q��	� �1s�9������	�e��i����+D�uI�@�f���wy�Q��;��Q��\yW�	������p[n
GK���;�w8�����JC�}O�Y��0uq�Rm�E�&~�$:��Y��Q���]M��p�o.w,��J�|�����yN����r��>\+<p2�g�it��� 8����|�p�h)r\����Z4�x���w�����	���(����hY�H+D�p�gi��G3�O�����e���	�V="�7GV�+��b4{�vwO~q|�K�c�cv�����~6��;��&+C��x��.�?�a�~���w��	�����ED������]��V9��0E�L>�nuE�<���O1����=�E��*�*u;BAL�?�-V/�p�d��%{6���i]@	��{����!�e�a$�Z]����C�������.h"�Bu;<=V�D�s���J�n[�Hg�
9�MF��4��������
��4�Pf�����>�b;v�����e��4�����.O�l�*h�Y���?_w�H{IN]c�1O���rB�uD���&���:jv�;��t� Zs\+�h9��������5D�T7�p��q�L��a)^��������Y4�!H� ����j��hI�'7�)tP5z��/W5$G�����wb������p>)���4p�R��)`�D�.Xa��C+�z��I4f����.�uNCy|u�	D
�n�����[��X|9ZJ�����8�p��:�]@ze�S���g]�>� ���.i��R��N{-$���=Z�9DC�����Yc�������.Q�����;����jG��.����G��0P1Q�e{�q�FN��h�54��6�n����U��P�d����ac��~
p��w�.���|�7@d�����At��	���|J*��Fp
�,/�p�%��hJ#8����~;��sPf\��a ��N�y����h�Z<��:gI��� ���RPy����J`�� F��^L���N�����A���~g��~��l�� 
1"w��
��O����O^0+��������W��U�����/!�VJv
��0���H�d���>����y7�p�9�t��=�����.�=�u[7q�"x�aI������K��'��t� �9�w����3���,�m�I����&[��;D��.��nj���k]Q6���V,�~�{"O*L������Y:������d���lX�b�6�w]��C��,�C'�c��,lwY��X��3���u��s�-�C8�kx`�-��Cf>����7�3|�
a
;"\
�O���)G������USC o&}��9�5D$���	��X������b��������Vp��Y��A���Q�
�Q�&[�|��Vrwn��`��B�"${o��P����1�A��X5����H���5��-_A<�FX��>&�!��ZC��#Ef�2�2dA�����oY�}�G,?���V3�49QT��w�������9�i�]����y-+c�'\��
|��7���pDXN���gnC�C����T���2�	q����f�"������	������V�k���G ���h��q0�[�H������o���S��Gc�=��?���G86�kz0~�H�>G#U{������d�0kO���Pg1���m>i��2uT@���Gt�!(���6(8�+p���^a
��=��a
6����+bc�1����5ILkY7l�t>��,�jQy�s ��\@C��B���k~}������4����E�jpc
�YfCx$$L�v��z��	CX�L?y��%#2�*kA��a&/�Y�F"e����G������s�;�� �Y�j9�$������!Sdx�����<���vN�2��`�$gv�(�q
�Y�i��c ��B����M��X�����aP�@���S�M����Sk�!(!+���4��w��i]]eE�)���S�N��;>}���>f	��v-����tC��E�1�Z��-�tj8yE��![��������������:��2C��X�>l�����H �'���0��f
H0�7��������%t�b#�z���X��l���l:L�Y����q���=>��!*��Yd/X���I?��>gq!w�V�Y�i�
g$jM��'���i�?��5t~������|�����)��'fX���&���Bj���!::O�	<��}�q��
�]N�Q�cK��_�9:{O	���������3�{3:�M��Q�2w�D���#�
�
������j0{j�D��)�Z�B�S�����>VtkX�h�g.����Nv�Y}���]\�Q����f�	3���d+�������0������I��(w���9#�4�_/��6���1;�X�$o����������\��/j1[�5��iu�\lQ������e���0�De���%���N��~$��� Lq-�"��iR��q�
l�����>JJGg�)\����C����0�����=�8r�A��������Vk����:#����8?	=T4c�Q@8�3����
�2'��	:��a�Qxd��p�nY�w���K0��h��U����XF��i��-13���>�F��t�H;5>���O����L��������WVzs��,�7D��9-�i��@�|cJ�ur!A
��������U;F��vH���B�;3k�)�ANn�p�},	Ot5�p7:�u���d
x�s���,�����CNi}��`�����p�h��h�(��c�e���(�l���>�Fc�%��"h(��D��i����8#�����#?�)��&[i'n:}Y#��N�5[����t�~*_�nH�6��-������y<�<�����<�������Mt�� �=���,e
y�e�]��q������2�����B��q.��j���+��6��_T�.'6D��zLHj)��3���-��e���D2��G| z"s
Y�c��m��tH��%�o���M��t�%��b��Z��b\�8�H&
6�5M�]Q�m	d���(����Bt�:���LIFKD�p[�B��v�6���}([����l�Y�A���������9B��������B����RWu��-�x�����yL,�Egw���[C,�2\T.�3���sx���V����
�h_����Sd���W����+���9u�M`s��$���o��UBo��9"��<����;�^X����t<�8/��I������k�e�D�2���T������wd��9���
�9?����SK��G���S��m�a�����^c���f���p�&As-����5��!Dn��{D�\�"���M	�'�yP���KXD�g:���.}�N-+��J�=S��e��*E]4RG��>A87�t�9�.�8������}��z;	c�~�K����E��z�k�=���:�C ��g���j�;|��UX#h�B{�E�	E�<)���e�w�7,��e��D1(2"�r�����"�:�[�+.Oor�Y;l�P<���u59�wO��W�f}6L��U0&��#�2V�-+�)J$]�%0z�h��������5�zvQ/iY#���i&�D����,a�7UVP��-�?���m�E��n�MS�/���U�d����A:���S�W��6l��y����:�����P�����D�~2����,�'�w/3[Z�nGk�F��e�4?���hJH4:Tm3�i^�-�/Z�i��<g��e�Br����%���v������'�s_�G�N�0J�'_�������\����QPrH���WZ:B�c:^&�_�/�c�}��[]��m}�Kx<���>��] ��B(��g��
[�~	���9��1?n	����B����;��	'��!5z����n�cnD}�������8�%ZP��0B�&D#������V��oC�{D��v�t�?��O�-4Z\��$�dno��$�6b!p���������5%y83�Nn@��h
���~���[y�
�����J�/�����t����X���c}f,����I&�}�':�m!��QE���p�5+Z�h����|��EU���<��C�<$������x~�Qs����w�8$[�2�>?5����C�>#���d�����	��Ht9�H���0�ao����6*UZ[0>��FG����F������g�*b�y5�����|�O�K��V1��
[����+�e��_�u�B����w>E��6�Ny�^����Y�������S��hj������~P6���u�)��� �)�4-�h��I|������Si��g��mm!}sw[������g�L{������v�+�Mm[��gx��ga�z�\�a���
E�����
���Yi��4���]kZ���d�����-jQm!��Ue�s���������Gb��%=����0���k������LQ�tk����j�JG�;�:>Y-U��X�5j�l�D����=jtlD�r��8���DP��9}�^F���)p�T�+z�B�o���KQ��T��z4�0�4�kx�G*���V��Mv�'�������
n�.�Rl(�#m�v"��V���@g;]z��p���w/D����M��Yh!�3��#�!<9g��R����A�����~��������'�9Qx]XY��VM�%6f8D���4 �G�bG��-��e�)GL��b��6�'6j�G=R�v�tD���f8�;������n�
-;o�?�M�Xx��P�=����B"[M�#T6����l�`�Oc�) ������������e@�,@%���:D����R$�;B�~=�S�>�#XAL���#���S���2��1��qC��IE��A�w�4����^���8fS��������i8�o�Fk��3�{�_:Y��m[��9�0=_�_��3��8����c�����:o�p�� -l��%��l	L��#��l��'k���T��JjS�/����qU�TgR��bz���
B�o��e3��z���x���8��� �'���#�`d��hc�oLhWTa��X`� ~�e��g�4���`����9���,x&9�'��;��p�`����c�$Y;��z�l`���\bD;��	���q�����'�l�
8Q��X�I�5:���2�&�/�l�[���w�9��w��f��v�����kK
C����F��a�4���ZD�9��?�����n�)�)��?}�5�� N(�3�����7-����5��� ���I'��'k�8@�t���RG��c��0�B��|TwTF�#}�'!^3�W4�,��b�G��rK(��g&�@[��op��V�i�h2OWj|@������!���M�z�T���������#� �.W����p��Z������z��������$���D ���e�y���%z8�
=�������VC����Y�B�vZ~�;�������-Xw��j���H�~	��kF=;enwf�����/�ev!M�hz�	�l�v�s�d����@����>�.����|�`�����?UnV'���_�S�����K���I8�AK�q(',{�Ju�+���E~��H�Z��w�$xh�4F�P���=��E��~��<U^����Z���H��r��y���J��ix�������4���[w����!Z�����=r�|j�*��9y��>?;VGx����k�^G�dj���C������j�Fw�&_PG��`���H��3��( ��4������f�]�g�Y�i������H[��y��A�`��]�T|��H���{���hp$Cw��b�b��Tk�~_�:�Y���Y��p���0L3�5���fY��:>���s7v�[�<2����}��*�Nbv��[�$B��;���S/D�Z��X�c.�]��AV��U����P�GR�5�����"+������`}2r����oo������R`��kQd��,�A��r�R��y�,^���d���x�\�C� �T�nS`�<�D+���3@������p-o�d�237��r�h��@W �$��n���wNL������&Ib�}������&i��k'
,'�A_�B��z���w/�����E���^�����xY��"I���wd�;��;RgY5�}W=$���'x�6*}�;�������Sr.��EO.{��kz4���A ���+*6�rF�9?��#�qD�v971�21���<3�H>,a����Y��4�&��h�r�G��Z�+p���
/�p�W�	�����F��l������n�#�S��+�������0�a��\&�-{0%��;\�OQG�Z�Ido�a����Wu
��>�y�����>~1HD��Fjn�'+K�z�j�^	z�w��l��>;Zk:<t�-�Z������N��s|hG����f�6m�e���n����|t���e��-p���T�e�Z{a���g��������������^H
�l=�e���eC�w1�C�0�n�
%�w��*��h��>w���0!-��m{�1^���4��9�����\���$9a!5��� �v�1��s�j�����g�������V�gb�;P���O�3xG�hSJY�Z�g��4FA��n���8�v~>A��
�j��y��V�������q��\nw2ZVJq�-zeV�bje�-���������h�p����=��#�Gw��rgg_������X}���A�7�kt�+B�=��������������C��O�)��t����}����ld�F�Tx������u���G
���_�Nf��;sdK�`���j���Al�Q��6*�
��E����Oh@���)�gV��:���HG}��l�p7Yg7`�BM}��
s�+�p���M�����)�������]�������5
8
�OB�Kx�,_�y�M.�*��/��"���O�F�w��+~�I_����;�O���"P�H`��#�J���Z���.`?e�v�X!2���H"R�E�����o
'��AI�9
p~�zY(�+f�'����e�}�w�Zm���c��GU�_Gm*�({z�����?���h_���u$p��*�j�D�����\�(C�<*�d(`�9�._���&F"�f}"��N�?tA�P�~���"E�#+K��Y����@y�e�@���Xv��'�o�#���M�J��_5���:���Gm�I��-�AR�F�r���������8[�>��,�����l
_��7i5��������d_&�nf��C���-Jh�N6+�A�[UTT)i�{��<j[%#���b{�c1�47�N;��$0�^HaD})��������Z����9�>�#��h�:�����;��$Fc@����I� �zd�p$}��iWr��Iin���NL��_�}��}P*�J"y�D��y��������SN`v/db0uPK�������y7�-����f}#�1��f5�
���P��A�1�8���}��j�h�&&�|2����ok�A{��T_���>>'Pc'�`���4qw	����3���:x�H��h��mV`���b`T#�Q��av�����j
L!�4��-VTA���r���]�v�jd�d�:Vc8W0M�0zi��[?|O����A�!����&������;r���iF�x����������l��|��"�P��l�'���O'q��6�	C��uV�cN������H�����.��5k=�C\5�b����|�Z�%7c��O9���o�M!�������L�X�k�����.>B��	�sF��j�c;��>������I�)_�,�����Y��������z�����$����[�������n]���d�����A��}BG��8WZR�	�!��KG���_����F_�@���H�uNb4���b�!�U�H������h�N�Q�
��K0K+���>KT�u��-X�=+��u`���
��zcU ����
�
��
�q�D���k��;RGY��9���^C\(e��T�R�������;s�W*+X�_�
!5���g����^���;Ps,���}>���,�2:2
�*O�G}/$M�m��������Rx�<��a�G�n��%xX�K�
�E�c��R����*#�bd��e�����cP���B������3����G�����kd����!T��������=6��eBgo[��T��p`����#��D��j�b�,A��,�a�
��������)X��
��(�h������C��>��lG�Vf�F��� P�.������0
N�d�G��*`����n�|��hP5
j��'5yi�WF�"�jY����*����N��XFL3��z��3��l��6X�HA�'>�����y�mW����'��&x�l��9���|O�������F���I'��t��5j�/:����$��3{�6����qpcFjm��15d�LH��6<��(�	��Hl��) �����N�us4CGrvR�R�X%Mm6��$p�����@���
�-�	Dic}�Q�	I(Q��Y1c%O�$�����3��4K"��DPl�$"�CB��)T�V�+5�����9�e�X�	V��h�AD�\����98VD�iVD��2��,�2� ���R=�&�p�3�R�&EDt��k��m���mN������'�Of\�|	8A�d������Q��:�3��Q_$)����u�]�{����f��;����77�6�5���B�d�.B�������kh�}�������?�?"~�o�]C�f�����,Z���g�"@�i���d;�m��y������A ��n�=���k W�y�o@����D=��e9DcT��c�����7�V��u��������E��>y��:<"������e�7��}r���*{
b���Z�)g�t�����lsX����J�iT���a��}a�R�Y�D�\��0����	�Z�d6�l���rK�N9��i������N�~�K}�t�~�xRDxMh��p!;�a���Q 0�~�?���V�93��f{$���������'Z�V3&y�w��5�{R��������M�@��hFFM)�M�@�8��sD��{Q���������D��C�.���V��.��N���	`����N���+���z�cM��"�l":���`��@P�����F��q;#QP(�U�4�
+���#U�q��x_t��mV%d{��n�
9zV_��/#�M��������m��t��<~R�?V��T����G�������t5��9i����:Q#�nBv��*�.LW��|Y/���|5�����c�J���.��	��t�3{�6M���]09�H���k���f`�=�a���n{�/�m��\F��n������S���W���D%U/�i%f��H[E.�=&�zD�g���>���;R�3���XRE8vwF���kwP3T��w#d�;_!��vG+@��nl��9s��vF���pLG�"�>�����i�w�����=��
�>�c�\��;�������;����xIO���=�Y�����0b�J�����.d��R�?1pT��f�Ad���i����_���V���������PCo���
������S������?�XWF���tHj��#����e���~ofgD���
J�9"T'��:��w�1�j�+r����GSz�H0#�z�� [������Y{������������Pwm�s��d	o��)5[�+�H���WH`������9�VCq'"=vg6d������
�Y2����%�H��C��
�
�n���C��f���8�_��l�	O(�������p��S�9�jF����ay}����O�!P0�����q���`\t�7��:3������� u2�#�w_gT\�d9���B@�-�:�b��]�n
����Y�#.��3�pwX`m�U�t'|��c�)Q��i�[Z�)/wnEs\2���4}�u��a;�����M�m���E��T������q���7�4H���������m�w����$x_�8n�>��jGl�.�����Y��Q}���u�-MZEc���Kt�$8i���������$����&39���\�?3�������7��O�M��_�[� uZ���KO;mb��u�y4��oTp���5j=�@��I�r���m�8%��hB���'����B#���! ��(��$��7�K�+�4����O*�!������7W����M����'��08���1�`EP�,!�/�2�����
����Fm��t���g��x�c��[�.������\X>�-d&���|����x.�y|�Pw~Yw9���Bxgkv�]��(%�y��������d���8�v�
�>�dDC�oVM�������kE�k
\�C��'��mD.��q��-da
S���_}H�oUE$<#�m�HI���L�{<��$�������������AN^$pH��Vn8��

8����nA%� ����������R)�T2ee������y ��>\���:�/)J��C�E�'!�,��W�2Y���M���8��a�GO ��FJ���;�&_��\2"������e4\1���q�%�������&�'�!����p���THK ZFg�!��a,� ���n����dfv����<R����x,����u�{(����������&�~BHx@��p����m��u��%�}��,f~iQ�{�vO46������O�p��m��/�I�������=Rda#$�:�7�+�E�u�h��eD��svh,a�Ye\��6��V-��l�l��b���W�vX!&�)2��L�	�E33jK!&��Y����^��e��D	b���3v����V�_K��C����->�z
�"���������6N4�}�Z�6.�`� T#�O����}j�=�Qw��E�	>pt����Qw}���6� �R�gf�c[�z���(��?iGvt���p$��w����p�?���
|��q	f�"��������^�������S�h���Z��D�*T##/��wi@��F��C����g������h�N6�����Q���I}����OF:8�����_���&� fp�R��aw��mf!�X�$�2�~��'"�X����a@��0�)�#s&��:N�TMax�g�p�N���f��)�cG���`���y'��,�J�y�D�����~��H���
���d�x���P�^��
(K�vM!Ga�a4�t�C����.���4PAhS�������E]�.����D���Pm���|
v��p�4��H��	Z?�'���yfx���������D�zS�C��vf��cJ�^lf��/��ed��*47n�AI5�<��yY��nk3"�eo���4�w�����*y]��e����&N�`25�X�I��"����</�����||��� ����f���C�z�G��tv5����Acs�&����NNA	������F?�������:������s�?�]��
8 ���S�4��-C�S$E����HQ1��"(2���L�0��X�lmr@����N����$.�f[V]6��c�:L����Y���t��'��}������i:��+Kav
�T��A������)l;���!��(��@�FR��
��7���P�@[������P�E��XVZN[�tcvp�����/��-f����t���(e������}�`U �Fd�v���:�f~)4�/����7�����5�w�\�Ei�������D4EW�MQ���$����L����:���t���D���}8=;�h��3��t�CV&m�z�n����6�A�ZIm
wXY/e[�
���j��z�'m
2x��`C�r+���Q���'�%�q��"�`F�(�*�������Vd<�	����Y��4�p��M���E���W�����~ZG�(�`��w����:���#~ �l�w�;P�����|~�j��X�0���;�l��%��M{>M�y#
�����B�\b9��-'�
K���_���g���p�G#j����V0'�k�xR��H��~��n{h`N���u��)�3��k.�K�+3��:K�=���r9�Fx�R��<�l-^_����9�BYB.������?�����,�����lp���;A[����mYz�i��N*�e�����[����%���dg�O��l%1t�1��T�>�t��������c���L��/�$���lqP�V�e�1�l�N�%������K�1�4{�^��~D�%4(�-���j��D�}��Zu��,�`}9���v����#q��O'
�A��V~e��Y$A PDh]��n�*��N.K��n�����%$���-�����'�
����iV��J$EU�s
�����	 �pt�Y�/��hRfU�%g��Y#�eD���-aL�w�/^�����|�,�+R��rdY�K�=�Rf���FX���M�~���.2���r4�a����+p��0��2��t
K��~�����;-aR�������p6�K��E�-���D�Y�|	�pb��h��@�s��>���.4*|T+������nP�Ba+,�q������c�q���/��I;e�i��I��&�4����,K(0K�����vRw�rD�����W0.83m����fg��V_4����-!t$�mi��KJ;�z����n_4F,Qwz������v1A��{�����n�(@��,��5C��5�������qT-���>x^d��U�gP�G��]�E��c�+����{�y�,A��TO��g��.GT�o
"�les^5������r4F�Fj��"#�/�%0���P�*<!��/ c)#"�b�aP�����*��2��2�M#<�q����(N�B`|K	�����h�8n�e�s�jv������W�/�T�V�W!{e�h��px��4�������B���/���df[���>�-��;F�5Z���Y6�_�����qg.�����5�����@�m����/�u���l>�hy���s���2*����ka��h��
J����e�_�����~���*!�B&��q��5� 	�������6�.��[
qT%��\n��A��3Img\w�3S�m���\��*d���!�D!m��8�
L���\tv�^���k	� �qh�]�XQ��;R�>��\*�T6!�fq'���^����C;
����������.��R�����;}j�L�
��Xo�3�8�)�ah8ED����kE���K������ ��])MQ�.t~�X&�����D��v�M�k�*d�a���q	��a���w6q��g����a��/O���/FV�Y���g�$�z��F�,
r��0l���?�=d�����Z���b����m�
E��O3�=@�`G�9���L��'�mpH�CN�et���}�-��'�lar.��m������6A�a��	���	W�a�������2��=]B����Y%W������v(g${�H�v�&x��}�J!�f���)n��$�,�y;�"�5nK�K��YH�6ZP �F���A�W�B
h�����-!YXI30���i�N����V 2���
�Uy��r���� �}&�����y>�M�AQt	Uc8d\�%�2m�P
��fm��7��������Tv�4�`o��d�Z�x�qb59���Ru�s�	W��J�����F�>�������� �"�`����A��!]z	�xo�,�2��lev��N�p
D���	�]G3 �IY;F(Af���cM"otR>���w`�;�����2ov
I�0���=(p_5�{J8I>�cKT�7?�"~���sT���1��8��}�)[��-�0H�+�����W������P�G�����
C��.�"����}�G�T$��`A���~�\���~{����	�vz��t��]�O�q��U>>���i�,��2��8���4Y�8��Y�����Q�vl����4�T�Bo�+k����D�j5�?.f��?N����c�$H�U�����3*�N�"6��F�+[A�3�(FG��&/�l��/RY����#��.���|��ut���8s�G��Q���Y&*9���H9�*�N�(����dtwV�oSFRG��v���,������~?�zv�=��8CxL��I#���&���s��^���>���'|z��`4�����yr��o
��N2G�N_�3���lw�]i0)���8S��@�����Tds��"��c���cw� �\O��#��qVn30����|H�%��"���6qbW����/N8"�3���������p9��L�v���Q�����)���& jd5��W��|���K����U��$G-~�������#z��L�j\����nJ��bFc=������������:�x	��5X����z�����bY���6U���	0!hw���xl~� ���[p+��ZUw�� !Ae�p�l�V�F�O`AvH:���NO���F�M�]���"�������j^�����b�-�9B��\�hy�03x1��]H(�r]��f��P�a�G���p�����	
Q	~wuQ�|�G�PWI}3��O�`4����3��#T`d���FG����q9�f�{:��t��;ANI�������D;����]��D|>}�hM��;H����
7&�A�f�L1��6�e/�@����Dm>����$&
:��~/Q��4sIA�7��
z�����H�TI%�����]3����^a���M���}��6
S$��{�at�	��i��{
����G%���c~�q�Y�����%����L��[sB�zG�1�XuU'`$���A�x\���M��u������#��z{g-���R�}k�aK�n��e��"����T�t${lT*�����^������,���~JD���YI���:v�����������P���A�({��I����/��;����������W�B�
�c���[���N�Tx!u�u|�a3��V09������t�~Ap���(�2�t�6��������%1	|G��N��g���tn�$��X,����^���'4�zG��rP��)�5b���q{�a��<F��A�����r���������3@
�TJ���p�|l������O�z�����&u4o�Hh�L�@��4����dq��R��LT�[<nd���Y�C����A�Yi/pIaH���+r��<�� ���37�p���h3M��f������������@?8���#5�6;3�������
6�K�5��[d�Y�
��
�.54�x/�IGj���p�a���w��2T�~�;RXB4��\CK�w�	����"	��Xt�v69�@ii��i���q�#h``}�#3�o7ZP���0�H"�������-U�	HB�Z��H��L�e�[��-_�
�J�=xD{����R�������j��G�l��P�����u5<�	E �)�����w��������yTht�Q<F��x
5���#�b�8<�Z:�t%t
E^d�}�Z���|'[	�'�I�w7���;�?����4ymlm�t��:�fQ)5g�D1]�<Am%z���"J�eqn�r�7��w�����lvt�(F�e7q1�m�h�,B���g��RKq�-Bkw��S��mu|���-���bh����"2d��B�$�VvY���`�GER1i�;�XDwL-��C��������Y��������Ckft�*&��(��()Q��� �����t��-HXE��3�og��bA��L�l
}�!hc���)"\P�k�/�PG���FJq�sbY��{C7�,U�<�i�.��P�G&:��l��C�_)B#P��4?e�����`�@
=��]w�p�b�"t�H��i]B-��	i�}(���2&B��D�lm�����n�D����zzp(��i	�$������=v�%��ge�@���	��a�:��z�5)	�"�Nm����������c5;��$�Q,ePn�t����,��&>�h�8�_y���r��Y����`�`�����]h9��H��q��#�aJ����2j�K����;��s��f�`�+[N�5�&�����[�CV���Q"�Wq�3�k61�}���)��gE2�x�/G�?-+d@�0B��* P|�o[;�3�\M#c�w�,hhB`2��/�0�6�"<��R�A�Y���������������^���E��(�����H�a�����A��E�)��e��(;?[�@UCrUv�w�3\�h����5�'T�R��8+�@���C�G��i�Y+""Z��qX��r�KqZ��o�
=�Jq�s�m	�@z??cX)������v��[�I�}��/���N���K�v�]�#F�����y�,=.&�	K�����.��������((�p��#G�{�P�J�74d��w�VCY�M���|pX���a"��9� 2��s"�Hq�m�d��r~��l��U��#{)�JD�.�:�d���6��
t�9��s����j���A�q��}�9��j9@�}�����S]$z	�w��l��h�
������SHg���j���b�#B[�P���ts���.@���6�*�Aq6�-����T�E�H���G�Hc�����{U�CS�b��L�;J5� =D�Q�`�3��E7��U�CQ�E���|d95"������o�G�N�B18��'t�*Uh�,�Pc��U1�C�j�p���
����#U�Cc���XU8�����;�c*�W���8[F�L�
o���Y�J���*�+���J�qN�W��"�G����"88*g����[��=���{����Y������YX"��X�:������Pd;W����=�j�9JU�9��YdXj�:�����v����j���������g?�u�k�$���������*l�W��~���*�����yk��b��������e.B�w�^GE-|I�E����+>�w�^&H�cJq�Hl{##��B�Wrn��q"I���'�����2�0
6��Thx&GT�j�D�;T!���8�*���C	l5�T�$ Ad�c���a���q���t���Z�U�u\`^��X1��rY�����s���%m���^FG�6��q���Z�u�
"}��y�u�RdM5S6Z�9�#K�4�M�i��RU��B:�:����N�l���\L��'#m��`�8���;L����)jVa��f��,Fo�m�X����CY���~��QwW�/_�W6�kD4���g�8����u����Pa�������<	7H.d4c�D5����B������-L#2�/�*��9!s�s�f��~��-���r�"�L�������=��,U�E�TT�6�8��(���5(#>C=6:��\e=������F!��~�^w�m~��[�m%������fj
(�����1�0�r�����]V����Z�*$#���ck��W�z���`qF�D$�5j6�����E�p�����^o�,Y�;��� ��Qs���-FZ�X5F���=�d������+�=Fc����~�'.�r�C%�|/s�c��g"�����X"V�A� k%�?i�������w������P���x��}��f{+n�a������{�.�~@3���������5���2
xQ���in; �����}���?�O��(U�4��Z��6�������qA�5x�vP�[�`��OJThN~X`���|��O�L�j�\�`�)z��	8	��f�}y���iH��8��):���vv%�*�1�z��}����h�4SS�H�j��0]����	_
�zb��d���q���D��&�Cj���Fq��	�(2����N��Q5���	��I�����6���H��V�]��k�f��&|c���7��^Q���������f���m��8��s����9=&�j/������^T�+��6�w�i�����(?�}���v���"jl������HO�L��L�L�C@di�N ��Y0:J6���(2s�&�"��
I�chlKT�����S�A. �`Dm�&��Q/3��A:5:;�NU���.0b "))�� pC�l�N
cc���T�h1�V�=l�w�vX���
�[!�A�	�eG�b3!������~:z�_�Dt��g[>�����6�	y�C�"�v3���V�A���L�E�������i.��������{�w��pg��ia��,������]n��f��~�g�� �1��$��GX�����AR�f5�UY��
���-���:��d':�CL*vj��l�����zD5l�hg t��pGG�NRKg�����F��.N8�v~����W\s�V�; bc��#����	����tV�/�9Qvi�$��g������d�'�c"SIR��Bg�d�u�'�s�%��j�[U?�����1��!��e_��V����dVt�d��d�n�d���i(�=�0��,���x[��w��f�q��*�v���w.P�DJ�^lF�t�["v�.����;d�e/�v��y�U���:�^��Qz&�J3����c1������Zx��L$�)�!Z�5��������b���nv�_��H�xMC�Q�;���$;����6p�g���2Jk�D�pC���C�I�W�����&�V>xa[����n��� �<���^m��[���&�8�C{'Z6��d��J��;E�������v7H�e�F�uo��b�������SOd��~�i��� vt�vkB$y;)�!����{�p�A��Tw@<����!�e�n1�a$+B��
�n��������8l�)����[��S�v��7D�_��&��mMF!8�LzYe��OS3��������pt� 3�����l�6^_����� 4|���eS�8�]��~�#�;���F�����g�����P	�)0�1_fi�c�	���N|�%�$Z�OX��RIlw�5�����o�nOPV���/Bo��FA����������
\������F{����T,��~��/AT��F2�n�"2~�^DY4Ow�5.�8��������)p���{�II��r�&���MDm�[_��D�J�u4�Y��[����5T���D��P���y��.��4>�
v������������y��MAn���������nm�bp�!G�X�[	���E�c��k�[�6�vG����������I����������"bD�A��d�A�'����0d�����H,��
���ED���xI�L�.����z�vF���\�*�>?�IVS����-�z�`��e�-��c&�r.���+�Ip�)d����������E�[`Q����^��a
�@Jq0�����K�_�h����Z
��e�&sa<%����d��sOe��D���<���*��: ��t�������Sa�2D��0FR��7�s:�${Rd<����$e<���/�����1?��p'Ct���g<�� �g�0��Lm����Sr����!k/�l�_E�G������g���E��Q\'>�=B�MC0�D�'A������������~$���F��%��e��6����]�����`T��d�Ff������w��`������>�b�m��8�~���7X_��
���a5�Dw4U���%S�5}����u�u
���C&��6���:'��5�Q�gz��~$vL��=���,�zb^A�-���V:��1��k��h�\P��|��F���-�J�\|�	�����~P4��*�A5�A{B�n����i�Z1��!�bc2��V6>�.$��r��T��9����\�gFt�!�c?��8����e(b��Q��c�p����BR6���<��B;v
A��� �&�C�p32sNv���������o�����0��D-8���Q�u�G�q���"�����nVpE��L�f��;:?zL�~���&fS�����d�����1�����z�-�&���/��e���g;�\�Xd�C�n��m�*��(\�X����,����l���6�C����Ha'���u����mN4P���N;R�
�fO9B���dv^6'�l���I������j�=����:)������R��DoM�#j�k):�y��E����_��I�}�!]�HY<����{�����%�p��F�~�iN���������<l�!��%��:�Q3���s�����7~
��G~N8B��g����dWFPl�O�`��M��������I'w�]z)|��F������h�t;T5�S��7��5��y|xjQ=�����Z��'1���(0;�N[9An��%3!�+L'T��c�CX�x�_6����������D3��,>\ zsx�<�/���_�	DP�:�?d~F���A�S��t��F	�7W�O�QxRF����Y!$��j9�jxE�/��D�����]4= $�n+}.�c#h
1 �fe������T#S@���t�������l���j�Y��1������L�
z���j�?���3-l@j����X��1�3������`
g�f	z�����������K������@�|7*�jl<���Ivl�?9�Bdr���\������h3N�����h1B��S���.#lw��8B��C�k�B���G��Q����.�h�=BUz�4�B���U�	�ec?�Y�i�-R7MC�OE��m��-���B"C�����}q
n@F��OMgaG��),A�����vo�J��VE����Y=;X	d��Xd<����S ���awS�������B$���`�r8!W`�������/	|�>�_IeFVKe�s��in�0�<(����zS�sT�%&N�*��	L�����E��f���#���l������}YCi
{�IJ@�'n�<R(�$'L.�����?��6��/�B��w��M���N�.�#F�b�N��<���S����	��n3�ZN�$��1�QK�nJ�B6����?����"I���jQ
�3�AG��ji��Fk
fG��O���IW~Bt�R.�b��t�wI����Z)�3�E^����=g�O���4�;�V@<���5blN!M^��_��'���ESF�wt�������T.
I�h]��cC(:�2���FWP����f+��u?�~B��5A#k�
�I���a�F���p�!<K8��0������)��NZ3���\N������s~��F4��x���>716�^�3=c]�g�x�"��VY4�fI�U�C���h��v�<{	�����4V1aDR�h�pI����^hD��%��������(�%�)�:g�RK��2�XR�i# �D�D�z��� IUKo!��"��)�`��l�s����#�/�dE��O�p(�FJ_}OX������$	�[�bZ�4@.�(����%TZwa���,A�<s����e5O�l�%��3y�f��<$��h����YX�ce����������R4���)8Ax�����e�!��'@1Sl$���a}Y�3hIe�������x���	� �s/��|�,�uug2�Z�E������W��K��!������B�}�6f*�)yE��%���h�+�Y�8��	83�=\����
���T���p���	C����$��4L+����q�������]�v��!��=}���[=@���o{1Q����6�/��e{�Lu���FL�t���[�6�L��a�h���4Mi�d��5x��B��q�qY�(ZKX������G(QO{	H��KH���
.�l�c`��>�9>be~9�>L�;u-�����68��?!SeAi��������BJ��|�KO�r��U}�i����#������>�=��3���q
{���������3�^���NT���.
�^�?3�b�:w�A,!	�l�'w/	�|\�,�`��;�0��g��!����o���1;L��(���dh���w'�Fm�u��}�f��
���FG?�m�u,}h��t�6>���3r�:_��;1	�k#	���Ef$��B�������$��� ���cw�}��8`���(���h1����z�n�����r
��������3S������/�B�
p-Q�Pq��3#��6�	Yig����ZL�����0"��-X�d:��37�]��FA8B��[�����-� #�l�>��~�����U�
�����l�_���{��u2���hd�ai�-�4�{'����a�Z��	�@�����q�qF�����j��8i0����B�di3�>���������XWQ>�J��'*?����J��-����D�n�m�]�?�{@7{k�hv7��D�h�[�A����x����0���������jP"To�����s8����N��Z�mv3�os�j_&��H�����h�:�F�mE�(�he���U��"���_�'����$q9���v4��a�k8�GL�=�h�W[>����QqQ�Fj�$����p�?���K`fVa;��i�� �����������7������ue���g�Y#���v�b�[a+�Dow�#v�v��6��d���V?<�I�/'�]�-�60�?�D���~�Mt`��{��O�
�'{h����7��������3RK���Y�/RE�.���$��0��O$���z&�����@*T�*��Q[}��?�����6�������:�Yj��6��jlYw�����E���:�����&�4)�Sc#���E&J�j������/?�lNo���%����J*Y�����pN��L�����Z��6���?�gx�_��C��.�%���`t�HP�	���&���Gaw�9y�&z�e9���`�3}Z�����8��{w���:���\P�q�X�G�}��EQIYv�
r���%�c���81�����=j��h�<V����
����O5����������Rr�g�V���h��1�K��:�uQ��J%�7������u��/�D��c���R��j�w�@�:�4�;��$�-SG��%C���P���
���&Xq��N�r��~������t��
�����?��tWZ��;����CN5�D�y�/�Z.K�8�2��8�%��'�~9���%y��&�?�d#��,(�����l�]���zq�$�:�G�^�d��bl��m��l��	���b����
fa.{}��O�����p8��nE�������Q�k	�sz�=���l������wA
��w��,��L��[����:�������GJR<���4$iPq����g�#�g��lqy�B{�5l���
�vn=�N�n��P���Z��P;e+��x��y�}�X��������%�7��6��FLEt
��P�h�1�0���Rv�p6j������������G��#�aF����]��"����u��A����6���p�pw(
8f�/^|��XE�����@����iG�k
�^$�o�� b��<{,����� v��=NU��$j�[e%�C��t9��`CY@D�z8���
�FU�\��	z��&��~����f�<-���G@,���%��dn��R����-G�{����I����^���c_��������rD��#8�kQ#8z�B&����
W������]V�|����Z����g.�g�|��l3�ND8��m�H�q������{,M�]B���$��MgZ�crW+^v��~i@����D�����??C��\"��O�	���l����B����=\F/�vGY�|�_S�2v�!��W6<:n��IA�VG����x����9��i|4Z��	]�>�-���~�;\u��F�@Q�i�6�|��pam�k+�;��p��-�9~���~���r�G��q��������j_�����"���Yi$�m}���/�3�;f�I;���_��H�l��1��D�5�	�e�����khkN|$�Av��;���4��������������b����c�_���U��Wr�x�k�E?���m�fx6\5���M�%�w�s���y7E��4S��4���k(n+9<��$��w'��w��I����$����E�{
%pg�c_�{��	�{��������z�����6���
�N��!&�D��^HK�g)v8�2��k���l	.���A����8]G_ise���
�FqvpMl���g���
@ ���C�����<���i(!���TY����`��.!�+Z�g4��[�����R�����E@F��>!rE��F�A����{�s(/	�=�|��Oj��W���5��>`�����������#5�t�d#���-��fG-�
8<�{��4��p-^�R6���D�'���X�p�Z'i������j���h�9@@q�������p0�I�'�$}��Z
�9�3u�Y��5l������K�r%��{!���a��u�H����_��:�fY�#u*x���J�O#�����e/a?���@���C�m,�&��p�V��
C�r��f���B* K �+�;�DK\��i1��������=N�Q;�@
��pK$�RCH� ���F�[&�S��>�>�����!�#+��a���l��'�>�k��z'����j��2"���G�p~���#��~3��I`��TS}�U}��M9�V�B$*�w����9�;�4�`:����<���(��'u��0��jO\�e��EX�g�E \��m�M.�
<�|G��~k��k� V�^�'�;\��2�_�w	^X��&�Y�P���v~K��"!jX��GQ���B�B��Z�o��P����G�k�����"�$[�<��X��b,����������^���6����T�=��E,C�!��h�B�M��L����?r0|-�d���[+�wf�!�9jF��Z��|W'�7S%W������x��n�B�Z�7T1���*5���:�
�!{vR�k�`�|�Db��^H�N&��� �Rt+�S�j
�r'(]���/_�B6H��>t�Q�|vJp�����S��t�w�vW\.��G�@q&4Z�������jq$t6��=�f���I�����f���N\4\G��IQl�$mu��
S@�������$j=�00M`u��!�d�.*��M�����W�{BO�Z�%:X�,G`�����Y�@@���[����p�[N�H
��Z5E�u	q�;�?�U��L�k����7	���Q9j����`���A�'2"�EE�S��"��|���k��&I��p�[�������0�����&g�J���`�����#DB���9~Q�������P�^�
�����LE8�2�D#.��\Df� �M��������{���M�`V*�hpI�wp�W�@�������L���U^�=�=M�1��a�������~iW�X�
����9R��B���i����i�2M�=��Nl�A�e����$#4����@���jq���i���0f�)W�|8D5��8}�� ?�ao��'��XYu��=�}&�Z��<�����5UH�o�Ot���F_��	LS�������Q�D�������������o���R�`�
���O�v���v%����+e;�h�]�E�X�������{
���vp6���	P#�j��,�p���%��a�@�i���@m�*�uE��u(X����se�U�8?�Z��Tx���SV���5<�j�K�������	����
-:QT�yu�����j�"B��c�	������k0M���;c���J��J��"��<�ju�s�a�.��^�;��f���������\�=��`����H�j�A���z���J�.^��U%/���U8F�'e�}����)5�|��PC�TC��{!uW&�'-�'��-�{�E��u6���[W�����X�8`���������O)�
IV9��������
���@���_��O4�!4ae5�
� `��������F����w3��V����R�F�&���E�Nw����i��
���CO�F$���<sT=V�7����MUK"�Y�=��@����I2z���{�������E���$�l�XM�9��ziD8j�X�����w�_�V�<}�p���������7���h)�V��>d���Z$Y�^
��Mu�@<P��'%Hu�bv�T�T-��wa`���`�FM@���bL+3���-�\��.�TA}bI�$z��,���MbX��j�&U~�����}�)Hb�8R�P�5��!��Z��U'���r�A}R������a��{���0�*"�~����c*Ix<
���e��M����(Zu���_#�
�@x}:�
��;
H!��l>
�@������=%Zc�4��p��tP
	��\�j]���2	M���!��;
�F$�*��v��43e��D����A�}�:�f���W���u)�B.��d����Ug� @���+by�e���R��	g�r�$@�o%WI/�VLA$�p�� �$0>_iY�G�Db�V��	���m�#��\���f�e��N���gE�vG${H��v��\�@
<�pt�`U��,-|��U�D��`���)P�Dl��%K�G���%��h����$�����Lk�Y5���&d��*Y�N.����D���h�Q�9p��3��n��#X����>]�t`^�NL>k
��.�3�����9Z]|���aq'���0�)�6y���3��ci��1Ed��\r��h�]8��o�R��%2q������S<?
oI!�f��l.ZFq����A�AL����o��b��e.nd�7]�>�����p���!���?-Pv�6�\��h�h|D�V�* v�p0���:? 6gM��^��W����!�I2��#BC�g���Zm��r��6t[�;g`8����s���[���J)�� (���NJ�lN���[-��&�w��\���zP�O���0$gT655B	���$LfV���wg'{�2� �(?�����;Y/PZ��"{��cV>7�}#j�7C�������C����f��m�	���?�).��o�b�>=z<��w'�=df�_�s�I4��
�,tz��ZQc�u��,����m������,G�:%���O��$����?u;n�c�f��S����P�f�Bx�7<���
.�V�J\[J���om��Cc�|r�/K����UO	�P���W��e[p�H��-+�[��2�P�_��fC�K8)=a#j��=#�����pD�}������u���������	���t|�4��y8a.fm��/�-!�l-2�!�#13� �:r!-e3������jF;�]+[�3�P,�f���]�L{-��ckq4�����������Io�n���X���W�����`�h������?�������%IZ�nQ8���QW���%.6nh�6��Wh�`����#�%�6�kH*����*m��':�poA2�S��FE�j�`���5l�x�����Hac|6���|�a5���`�=a�q`}�c�)W���(��m7��UY�����{��{�5��o3�����paHmQU,�crf����9��=����0�qL;*�'k���[��2j���8>�TB�}r���/+��4��/��3�!{;�U�qT�'zm��wc����
�h��Xo�'8��W�E����D�-O]i�F�@b��AI3����
!6A74�l����="	I:�|A�0��j
%w�����I�'7�z�:��jO��|z�	$C�'�� ve��������t�WZ�Q7N�|��1
qztdD�
L(p�jMH���:��8Hm���t5�v"�L70���1�X�i����
S��O�p���;��b�\��kO����:�Z���	�+��ex��_���7���F�Px����i�$���l�j���p��N���5���tg����x<�5(5���&�����}��(A_�9���b��
o��Md ��%�����2�W%�Z���]������(:\`�g�BL���	��
V�����z�V,�q�����P����`���nxB���<:>��(X]�Lk5�2"6��+�#��Z;�@��kZ�5��I"S~K���"�����&�������n��}�I�#i|z"��2�P�A�����DQ����d	'/����G,t
�����v\������o�x��S���G ��0�J��$�[�D��o�i�E�Z��I�����:+2q{���
��\,�\������.��*#Yi_��g�!�����k7���Z0�
�X��OB��L<�u����D���.�W�l]���H"{'BG&��B7U}�+a%��$W��o����i��WL�U�F�������4B�C��n4`����EUC�
�
�/y��n��2	�}�-�(A}����P�������s
�W��0�CO
,�+G7��#}E:��d�RGh�e���9�3V(J��=��N������I1���������h�e?�
���luO	l����~T����jF�8�Y��j����:��
��?�KZ�l�[��@���&��#��F9#1��B�.�#�t*	�F����o��%�b�x��a���>GX�e�K���?�R6�

�1e�J+�.�_`c~v�,�n�Prx����O1�}�1Jz���hT��8%����1e�H�_��C�9ht��)��|oT`�S�mG�	��
�P;�[zin���y����r#"��b�|�w����'�P
����08`�?[���p�����@��d�3�**Fr���y`��a$��wGS�l84�	(/��f�_�Qk��"��QE�@M��	V��j�tw��w��"�p���5����[��������t��;�w����[E>��2��W(�RW�hp�0I�q2����[4�j���4���W�x����~�������~ij�eED	��J%���H���������H��=j����G��/K�x����@������c$����50�U�����z���a+���\�g�UU�h�J���Cr����7
IO���O���Cw�`��D�)��|.D����kK�kG/�X�(!l{J��8��O���o��s����!����bu	cg���%-s��#4i���I��E��b��X��X��)�$���c4��#�1��L��}"Q�!Q& G��@������I�z�q��rf|Y�5�#G:r�H�f���2/���dc�
B�D4���E]����c���UJN��J#�v��N���,��%�6J�$/AV�8Q�!�����w�ul��]!%��������"�|����.lO�hA���z�^�f�x���b~��H�1�_@��a��!����u�N��ic����U%�)�i�0:�C�����q	�Q:�0�����o	utx���q�����k���NQ��H�83���td�,��\�����i�A��������{�nR%!/{&�Z��G�8jJJ@����9QqVZP�3
K,�QM��AI}+�����i>����[=;���@������V���4X����6�i�B���FLQ1K�����S���w#.�4|!/�������7�i�
%��|���fz�����f"�B�����Oy�@u��'\&��S�
�%d�2vE{��1��i5L$��	�@��_�Wt�j�W��B�f��R���;���$i�:k����I�����f����^�~�]�4���R[��L1�{��H�H�<���L���d:)
a�0�O�F��m�Bd4��&�����'���e�3[���E�@�����n�qm���
r���(��*4�����z��k�����H_39:�I�����r%u&:�^P�a1)�sHW�)y`:�5���yy>1�Fr�}L�'r���TB��	�w���"G�=���h��2I
�cMIR�O�&�qe% m�V��vGC'�buW2&&����
�+#��hL��[UO��#�l*�#�r}�a��	���Q��kj��c�^V2%T����
X�V\�s�M�-[#��H�cC&�3i(,{�_7��B:�	�F����	i\���2g[_���&78vj��B��CQ#�� ���5k�BcY��;43��i��~|�a��CM�u��x?X[�=?hd&���M�:FF$V��r�L��x
v�0.�����V4z�AD��M�n�	� �t�{F<����Ua[���	�s�n�;�B�\_��<Ive��i�(Ed��q���k��IF)�6e_kb�sW���d4�Y��p���g����i��i�h
�{�@NS{O�:M	�r@��l��K��J�/��19p��GG�i�C���u'���v"�s���JPv)�rC���f�1O~���7�'X;��������0{f#�s�1�4�I�
f�������[Gl6�
n�uXA8��|���6)&Ru��H�>��-�rc���	#���M����Z�;:Z����B���@N���;1(]D���Qb�P�,B�Z�o�=������X�+I���cq��%E	nD�X4�=�tq�S��yp*}�q��K�J[&����e��e�B�:��cNR��#Z�%uRW	l��u�2,�cqEV+���������S�26a�	��w��h�����UM��3�^A��U���Xd9U���b�`�fV�C�V0yX�@A^��h�����s�x�/F+
�K\�k���a�%T���������^�#��&�P��n�b��/p�N���5
�S��)�A
��:��b��n+�����dB������t��X�`����R5m�����7IC"�l�u4	x������N�E��n�B��K��*�y>xi�a��[�=������u��h!��eC���Zqu��z	�P�A��eX������a���3o����A����q�FeE@dr$5��n`�jzjnr������m�#��������8#vH18!i���;"D�D_��2$�Q��2@�e�s��l�>�>f���2k��W���2!���h���J�\���>�'�����-YI�.��WD�X��fG��
_�Xl�2�����SX1���(}� Wdk�\X#v;�=MOF�{�l/1v �a#o����?���W
F��"-�Z?m��X���! ����gC�v�����9%A��#*�Y����pm��6M'�H�ZX{���~X��-}�t������=��j}������,�V��$�Q��T��f�a�}����H��)-�bg����khP:�����.��$ =�H���w���k[��H.�Dp���bK��p75 �����m���T��l�b-�Y�OA>��3l�U���!i���RI�O���p�H@�44�m���Zls(3m2�w������S�����m(@�"l��b���fb����H#
���Ad�GIn�Xo�����l���h�Z���F-�E��m�@��D���R���a/>�AmR��uv4�v����@m�]C�8:P�d�]�o�5S�*�i�m������!��68PE�����~�>]�+����n��x���^@c��AE
�.�
���x4E� K�[i�W�F��n!�p���	n`g�@A��'���_3Z)D{�-�z�-��g{#u�
�����Xz�����6�J�
�`���G}��������7R�m���Au�0���=_��jw��N�b#�be�h�����@->�����?�=s��qa��b���
MQ�h�{�N���z�^L���1��i��T�l�v4r�����\7�Wv�|,g#�1�g:ih�N�^B(�v�4Q{�t	���	)`7lR#[�G�����.�1!k6��G��["��y�l���!mw��>E���������,��z�?���n���J���j�-��&��������)�	�����^����r���<Q������B�6���t�V�Q����\����>���s��?}�s4`{���������b[�?�J���#X���������Om��}���mu+�[��|(������2�Nd3ea�l���a��rOR���c��!6�l�U~�;�)�f,�|��#;��r�m�*���,������~����pNO��a[��~t�'��b^H������:�Z���Sv!��X�u�����kG��}bu=�h���=�|���_�tJB��/A�<������w �����F[H�������������lW1�p4I�����1�0kB[4C�o8O,on�e���AaQR3��{�|��q���+,��������'K�1&q��������wu>1�2F�/hC:�! V��a��+/�k#������M�1q�&!'��O��T�]2�B�?%)d�K���l��ho���V�Jy��pu���'��@-�c�AF��:J�*���1� ���D�'}!G��/�9>��f���|Dfu-e��h��H?���U���j��
��?O����y`c<��p��R^#:e����BB�S�#Q�$C�VBP�1����=����<D�8�E��r�(�[r
��6���I���'�
?g�<���V��?GV���"Cy(��C"W�M�����`��hJ��[t�D��tk&��Q+�O����	��t�������c��pH^�d����^������������r�v��-��������2$��Bt�=#��|��^~;�h�^�Ir��1R���=��B}ex���$DIp�q�l��3��1E�Ep��c�)��O$��r�b������fQ��a��15��C��N�D#j�(g��DE����b~�C������ Q��ii<�"�v4f���2�5�|2�!O_.E����C!����]]��(�}�E\��,,-��Fm���
C!�k��#RH�g&��+6�:E�BH�2w� ��Y��*6t�����j����{�|�����'����c���[�CQ?N����%�K�6��������8yGb'�S�[��������Ym����2Qk<�?9�G�Y�����9�VV���6�!���2�������Y�f�g8;Fqh��K��i1\�l������_�����x*
�0��'� �.,=2���V��c��z2�(�{�	F�>�e��3�;'�6h�s������@�g����`���4P�+�m{G��L7�*5��^#��#�j���z���-@��g��=�������D�wd2!��{7v��45��x��fL�w wY}y-C��pD'�(� �vN�`bQP����]=|�N�;�G�(���d���$y��s�k��^�{�R	���[���n���!NC����7N���O���=�UH7xOB�A����1����Q��_d��^�P���9����I/�o�L�J�SK�wx�w;��������&"GH�J�N��4���3U�Y1`����T���F�P>��:��F.�S-G?�t�fh��tM�rk��?�d��c�Y�{��u�v��vy�b8{
VLRl����)����P���8�^��vi��*MNa��=�V�t��R�J��������;m�*��&����:,�?�^��S�������{��|�=��,c��� G�w�a	!$��y��2��z�����#=��_����6�}}/d�;�[����b���e���	5b������B�����m����$�>~����)L��pzDK|��MWpo[i{KaO���u<��r��j0�rR���~��������~���EjM�Y��{"�/����D1�_�o"�`{���1�N����K�EZc����`Ps����g(��4���F�FI���	�B�g�xA
�;���=����8��E���'���
�}aW���^#d���A3$���>�v��Fx��5�"�RSJ�MO�p�7�y�����3����;2��[t���:��Z��#���n7���HO5�MbT���� {�F�Eww�T�����|
eGQ �����q<��8z�Y�n!kVd$��-'�Q,S��TB����sS06j�����v?k��U��	�����!�w�yw�NT��7����m�
��e�K����3Dj{��PuB/�1E�R�����=q�N��v������Ezl�Q��\���k`?;��+^YD��8�t�&��}"�����(�����e���Dv��[M+)$��[R,Y}�.B���P��f�5��X���,����&���x�������0/��~�FYKl�r+�$�A��Wn:E>#L����b�B�%�7d����2��z�"p[�l�O�A��\�?t�/������aD�����
��AQI����A.�����������Q����'("Z	R�V��q�$w:�_P�����Spw����F+	z@�M1PA��1���?�H<x���k�SW[��(T�����$��"�����M�����)K�W��
j�Z	<!o����G�v�e2�4���E�����%�o�E���Dm���pE��������:?����''@�d��� _���8��oV�^�4��r	q�Zi�MA������oJ<+%�x���(�O�����:G(��\Z�x�'�!��H��������m�,���y�D1�p����T��l>x2�!�;�����:9����F�l%~_uiJR��N���mq��_3���t@���
�Ht+#d����25�rW(wI�a>�?A�6��@-Bx{�a|B�;�((t����:�>�t��Bk�9f0���b��� ���������&�*=��j+It�CC�=�	��a&`�]�%F�7���������O�P�:����DF,��F�I�0��
u�~��7��"����p%	�2G��V�0�KA�t	q�S|6�E��bB�V	��K��p���U����x�����5� E�	M�:
��������@�Zh�!�G����5����Z1��%N-��B�����V5�$���r}�]V��_��/p��^����F����2�P�-�	wXw�"��!FA1�������uE�D��O0�������rb[��x����y��b�@w��J}���'{�V>/��Y� �Y+��y��y~�F�r���������rN����/C���sPPv��;,��O>w����hB����WAtAh���=�>�W^��JR��z���0�H2sQ��vT���!n��8e�uE�d?���v2�qm������GP?���x�C�D�F���3���f��}W���L��"��G�w���^�
i�QL��*�
)/P��FC�)���d;J��Hr��Q	m�"4#bqM��#�B�t.�V��p	����#�Y�l^TI�I(K&�h���#%+�ly=�Ih|B@����Qc���Y��� m���~�������X�y}Sl�l�7��@���VLJ��R�{���0����:�p}@
�V#�X�{�U�
�S�s��n�9��``��PE���b�x�Zg��������*�9[`�9��Z\��c2�D5��B�\�����P��z��o�;����Z��o���p�f��#�be+�a��@�j�a:Y��9�\�S�,���g�$�)�&2Z��>8�����v��x���
�W#^���9�~��]'
�����Uc��y�Lx��F��������
���~��}G�+V-�+T#"c�Eg|<N4��*��t���kN'Uv�����C�}�_Uve���B���A~����a0��
������	sNZ�7��?��d�K�0;)�8���V-�PrG�_�t�H���S���6�e�!��"��RF��Z�=�]j�3���}
5����`l����
����e��a�\���h���'\����\!�
�*?��N��~��z�v�\>	�*���������R��W(ElA}�j���#j���d1>�
u�o9�Y%�����{eE���Q�Ax�;]��v�E$2��9;�Dq+QD���)��<*\}�{D"��Tj)2��R�V��m��'c)�He�#�K�c����"d��P������{/e]�������b'�u��`�m$_k� �ePK����d��&~3� ��F��=9u6���l�����h����(���J�f�A�0�\��-[���0�U�fC��f�A.��8l��0����fHaX�F��r@K���@j9�\
	�w�.�'�=m� ���T���(T�ZT���/��mI~�����A%n�%��>�w���f/���[����y�E��o���U�b�������t�^�.����b�r3kI�n	AXl��X�B��w��Q��Hs�_uNu�%;�B�5Z
���`�e��H�[f���t�<��q�Zi_�E�`y�]����wj��-Nv$L��������A��-VJlc&�yRz|��U����
r1��}[�}�V�w��3���R�����	a�8�	�Nbna�<���Z��!�x&��(�
���H�M)s����h-2�Is#Z3 G9d�F�����R[�f`��_mQ$�m��v�#��K�#m����%���z�-i��,�1l	u@m�����/DIK���$����gx����;dk�Z�������fD@��SNew26�Mo�u���-�@Ww�r�s�!9�GX3&������q����q� {X|�U�F��Wc�5���>	�%"�x3P�F����V�i7r!#��!����U��z"�j�6[�V@(��/�0�l	�-���3 �Yo�@���Zc����r�@������#���������t��"�����������b[�����E�p�W�(cU�Z���v�W�h���F������Jj_�����$M[�ny �<4c�E�S��W#����lY1 /���X ����Q4��$S���^�S�W�0m/��TA�J����Z���^b�� eJ3F���%=PYgo=;+{`a���C-h2���)]��]�|U�5��uC����a^0�����:]2�%���?������d�tC
{�{���iD������� S�6! �0���vr�_&�@����b6�����n@,�^���?�~rR���O���Dp�vt���~�vC^����������Y��K|e*��V���{����"S��uN��O"\O��J����Vm�#�kzt��%��Vs"�N�"�?���}R����XCui@*�n�A;�(a������t����ni���}��]RO���2���D�k�������nS"%PVR7����O���zhE1.�R�Z.�����{ ��	/{�3qP�����8����GeW78��Fl���p���D�@s��x8�H�(���N�=`�b}������%�����F�=:��'!�_7ba��d�l������?�6��+a1�3�fb��������������$`���u?C�|�M����
G	M_r��u�a_�^:<���m���Ij��O�g9#�8���4�4��E7����=�g�#��hN$�i���������L�$�����}>�K�Wv[���7��Ah��dG��!-����~�������1����J�5�����I*o�vc:�,�T�A T��)o��v@�����H��{A�Q������-G���T7�0�L���\����mk�GB#|��b��G"l���"�d���#J�=F������V�gK��������s�J�ng��nB5��t��3��/ x�w@��n����vcj"�z�l��W���[�s>��|����G� u	[	�.�.fe��wR�����SC���CF�`d�����F�j������C�VP/c�[�d��R+C��Tn��u"�Gc2��,��:_��tO��*+fR^�{�7������M��������dk<�����w���d�s�0J!Ea�A��?���H�*�aXBg\)�*�BF�P�wD��(L#J��kD��|AF��!���0�P�jp(��84������F�����y;Le��&�H:�
����?vDc�;����S���.a �.���2
uP���0�v���Q���]'�,9����3�0��"o�Q�
j�!����PjT�R�'s-�����2�D;X� �#7Qi�������s~���=��-1-�0UU48�>�P
���Sa%#�[Tl6G�g��sT�A�������
�e�v�l��G� *�,I'�TT�����P��X���H�sQ_G~_�-��B����	�p�X)��FT�2^�<���;#�}��V���
���T	�e[Y���D�)��~]���2��������)�wa���{4������
Q�BGB��U���T���L�]cA�fD��X��S8�{���j~�Oj�DQ�g�?L��'{���q�6>���d5��;�q4��#���B��Y��0�P�d��f(��0����32���,)}�H��~���aA��J����*����j���������	K�
��f���,�E���P1�����*��fv��"�#�F[d6�&��G�\���Nx9>g�'Q��6l�FT���
;U������~���L���/�
��h�K\���D��JE��X�6�/��,��x�������&~>;�X��Q!��#Lf$~��}�hF�_�WY���!�`���
n,o�TQX�E���6��������K=R	�X�����Fe��g#i���,��_�I�0���t�`]�8��s����nkx���w�f8�88�T��8��������3�u�H<�82=�25F���pP6�-8��,)Q�x�D��
��<����;�sPm&E����1~�\��4�d����8y4���<:������(����,�TU'dQ�q@B�xHP	���,�IY����L��q~���0|,�.�STDE�\S��\M;��SB�A.���U$@�
3�Hw1T)b�4d�2K�lj,�2�v�i�a�I!�O��4(�6�3�<J=��z��x�M2d��i�A\r%W����5D�e6i�N(�2�I�k�c�}Gr'a
�Ys�h�2=��8
Q�%n�
��	)��}�8�c42�{��9
Lh9�)Y���,
Z�L�6gVyt5�}C���R�Df��(�:�{N=q#Cr���%D3,Zy�"����x��5X������������~���Zs�p?a�_NC������?�!
��E��cQ�vv�ph���P����2f����??+�2/VE�3L�H8{��b���7�Y�{��Z���@�o��yY���|c�$�9�0��	5��Z�!1��\'���#f2��fh���W����q��������e`&�Y��[��f�l�K�����@�C����t���&��a�#$O�����`��@��0cNG��9svE�)��BfH�2o������&���`RU��L�N��3
B�{�V����sG>���DCm����6�DX�����3��o��y��Zv�c��1	9B��uo���3x� @�o�C��P�R>
6��2��]�X���<����a�����T���� ���l��wl���-�0�� O/��YS!�I��c�@
E2��)��"y	(5`9�Ya�TBlJ6�v��'�m��9�&�o�����t9"}��+��B
`I�:4�V������Jd$���,��|f?9��P��Z��
'|q��� ���������c&���Q����H��&>I
�&F
L�Gov=a��������x����
�T���.����wl��[�Au;�d+�H����k�������*8��v!""�:������c��b'�������L*�b��d$�83�__z��C X`�el��n� Y62�Z%�����oU�o�m��4W��wFM��Z%&�������FK�*A�o7�n��q���k��\WV|��#1H�3F[�2$�|1�1b��C����������.�
����0�����-��<2g�������=�q��t �!�[����P� �{�!�+���,���5z�r�W�,���G���N��F����"��)���!����%��&R�FQ�M����j��/��c��(���PC�
+~G��l���q������Y_+c�I�W�t]�8��P�r]�#��}�F��m&,�=�(������z����{92���cPSl�m9�����+P��;��m`�"[��H�a#��\A���P2��\A�����#df�O`D��5�-�J��=�N�^#f4�i,��(�pi�������`���c�(������eC�Ed9������&�����0�E5�L<���[�(
AB7��=��j�,�V`�-ov��
�5(��]5��g��������zv������X��2�t��0�hE�p�
���,�*3��G6d��>�*��,�h�Rehq���K/C	js�� �NX���Z�v�W�d+$��mV��X�u��B*�Bv�`��&�E��AM��Q�n�t40��%���l��fw�Y.c
qJV�T�����#V�(�'(q�l�;Y��_VK]�=��}%F��b����������?���k���!Z�sD��ew�kM[�/
D���J�X�.�&C$��e3��=
���BU��l�=���Q��E���s���B�����{C2�DZ�mX�'��Nt�n������SZO���9���d#�2��N����6<���8��������%�����~�L��;��=-��}:%Sy`�;;q��������N�8�9��k��|��Kz��y��2��&K���Ah0���)����=����)��<$�A���se<21�����s:�]�F(Dz��V���R�_��8$L*r)D���A�������o#���?I:���u��g_~��$�F��b��^`b�����0[��dMx���]��6Vw�W�0�W���jP��|��N_�����D���hA�I��w��Q��X�4��V�cK�=)%n'�A"ziYK�|L���E���),�[N=5Q�D�?]�z����zzZ��H01�6"!oR;3�����Q
�v��3���h�+��m�(�`oYn�L���Vh��0�gD*�����P Mdq�j>o)�v���v�6DQ�;�vR��c>�Pl�(w��_�3��6�j
[���^�?�y{��w�T�m�b"���(�S������[������-���]'��C�3�:�#h������4`���rD|:��� �/z�,$
QS���\p�i'��<����!����/d������#�����v�+�V��IK���"w��/}})�m�Z2e���JA��;	�}����Z7U�����;A�c����I�$9h�Z�������x��A`C��M���!����{�_'~{����
f��`�;.*�c�tW�6�@o�����)�VI�i(;i�No����e/'@��G�����I����!����#��?�F��X��.�q�!a,��0l��}��v��+B)��oCb$��F&��cW�������
"�F�q�v
���B������?>T4f�����B[�yb@}���7O�������1�  QbU8j`�*kj���)���<�C�u��0����;�2�a��j�;
������=2�)Z��5�j�'���e���_�J~lvd�n������I�:�'�Z�Ob�e3���n�w�fl�S��l@b�cH�H�4�D�p�8�%�wZV���6�t?5��Gm4�)=l�4V k`e+	���s�s�d���Gg�@��
o��8���H3D�C�>�Kz��zK%����.bLA�IeKrMwC=y�4hrj�)w�zH���B���A�'��O�*��8<���t?1ZD�ek����U%��N�i;-<�#
E��K�_������q��t���Q.�-�� ��$�ANUrcf��h>���������Nj�������q*�=<�
r+��;W~��!���YR�e\���C�0Y�����bq;���N�l!I��d�+{�/��)�Pr"�`�Q���D�cP���^�
�}��lX-��Kgdb�����������B���`�,Tb��Pm���-HW%u}a����y���L
x�����7��dnuj}w�m&�����"�;)U��
&XY.�!��T �^I"���;k�D�w��B��dF�dB���4[W
)t*n��6���<���g�}�";�����bQ���D��V�*��1� A.�/���������.���P.�}FD�,�]������:��b��VY�	JgR�Fbp���ioH���(4i��by����fM#���8ON���Bn���;$.EK�'�@o��B��pS��>9hak��T�2��	��
\A7���qhN��6��i��F�h���BH���QF!N�����&��Hr���6�S>���'G9��%��P�M���XI���f,��2� ��_�6[]E��g1���+td�+�1�99����A���1"qW?Q[!�����?���v-��[����^"J�=;����{!5����_4�A��xf���@�
�������S��&�{	�Q����r�
�i����%�n�[�8#��;�m<�7��5RQEQT3��_�N����B�[I��������O��w(�x/RY����>9I���F�5��������-N��u��p� O�v�o��W��u��BF��1����kQg,b��^����$g�w��s����$��������^��P�6$�e�o�Z�G�[zF}/1��Qv�n�(U�N��\u��|/c�p��N�D��5���a���E�x�(6uD��Pdm����M�S��>{y�H���6��P��/yLu���]"&b5O�<�N�0��,�k��	M���
����,H��t~����
O�h�4c�=���6�������������$U���2�0M(nZ�8����_����x�&��-3��^h��%�T������
t�@��;RsNmL�:IE8H��-��W�Z�wCA�{
��]���������8�w�����{!o���J��|����������������������M�^c�:����L�`�[�^���[�������csu��5�-5[��kTv$�b��*��z�>�D>�������
Y����YgG%�h/�/3�JL;{G�-�H=���L��e)}���&Mr���y���I��s�b<�<hK�A����;��RN]�e5�r�\X�q��a
7{t�}�{I 5�%�+�Y!��w�J��CRv2r������������u���N�F)��SD���h���s��
�^'����5
y����t��$g�1A�GYt��L.��U�_��vF����99Mk���>�Y�\5���wi��q��o4 ��F�LJ���+�s��{����T
V�W�����Xy�����s"f�nQ!�(/���g��2t
;��6�.Z�&��8?�im{	t!�q���a�|�9@/_�`+����
�a���#�J�#hy"��1���c��{�����o���w�xI���(��O�����n�f�����j&6n�B��n 
�p�X��6d�\P-TJ�;r'%f1B�Os$)�]y/��]���]D�����)��tJ��r�����z1f!j����W�3lC5e)���/����I��x9r�D;oa�"����>�����S#��^b��0bR/���U8_a�X"���k4���3�H����s�����~���C>@��4T�hx�-�5�a5t�{MTs�G��Bt����xW�m>	�@�@D�:)-)th�j��/� ��'S'���P�����V�|�@�^��E���Ib+����N(�*���
����T9���w�&w�<v���(:9�0JN�9X�T>-�����4���������O�OJ&����f]�	�����������8c���L���M���:t��eD�3���U]�;��(,�n��iYK�~����F!j���I��%yj��\2� ��R4��L/�d�y�	����@����dkR�$�w����AK���i�c��!��O��[��ZK����{P�"�
����(�&X��n���}:4M�ep���hC�n�$\����������
�Axbo,���k�9'�rkX}�Hj�,y��T��%*�D��k���q�{�.#4����\�^���'gmS����t��R4K��%MC��&"�bHB����[CK4���X8�V/(T���6H!.���D/	��T��RV�����{�q�86R=J���;��|�Q��w����C������Q�Z��'�u,������� U�KP����A@6L:���kZ��`����rr
E�'�����r��-����w
��]�>q���-�?.��h$�[��e?�$!�������nP����&y���}MaZ� U�x��n�1�jb�oAk��P���C�8��~�{����n��yi�a��jDA�6z���*r���I 4��@����n�Q����Ow�K��s�qnB�u5�`rb:T#	�(�U��$C@4r�0�nw�
]Rz
pp�u�>M!�X75A�#U�z|l�����~=��*�q1k���(Y�#�k?��5�NJ��aI�:{25��0p5� C���0�
�+�����?VN���p��!�5VNp�_C��t����q�$�$�j�Xt��
���LP�B��X���E��#%e���r`@c�F�<P�>W1��lA+�q��}�Ki6����a."�,��lvb�h��P^
-��T)�:�w���u>n��������_�d�MI�����^
9�N��b�V
�P�g�k\�$��/�N���:j�"4��RV���B-k����$D��\����o�A���r���r���|���+'�����Ho�Z�m��c�W���+�Q42�.��TGz�=s������F 6M5� �=>��W�@�Uz�;�G���"gg��CH���#������j�Bh�=�p�:��Uc�l�7�3K����cj���_�%4�Q������_|�������k��nQ���3O4��a���F$P�E����S���vw*��5
I�k���!S���-�X�+&����������
�E������}3��l��ZaJ
��]����`g}c��l]�C�#�k�j��j>�N2�E��j�A�N����l?�D'C���z`K���p�+S/�t�D#������i0��N�&�����*��w�[>Sh]�`�}\;���|��L��S:1����7�B�h��P��}�����j�b�j����T���	&��=C��2&OVa�l����
T
[�7�O���~�v�t�.���8p���� ���w+V�7LX��]0�^\a������n?Z�����O}�u��mI�Fb��D��^��$��dY���{����=��D�OZyP��{�p�T��
�8�Q�m�)���;�VBw[�3���r{3����'zf�����Z��&��YRd�5`Ie�J�fPB�����yW��021b�$
���f`�>\���xutd��K��(�O��]�S���h`8s:���1�:z�����? l��h}�5{K}v	OL5$�,B�L �Z����!�bK|���A�k-��"�T�+�A����-'j(�dK�� q�I@����a���(�<��Z����a��D�����_7���&������KbJzG�|0%�E#��C�-�KE��'���cM3Q��D������qpA�*�}8EO�`��D��9$"B=�����D��c��g��ri���-���9b
��5C~����9b^��i�<d��6b��~�Jd��L�JL����'[Hdb��_-\u���Q��8�(/;H"V3>���F:��%����P��=�8 V������w�SC������v�����B��:�����j+������%�o1?�'����gcm~r,u�[���P��N��G��MU-R?4(����N���j�fBV����D7=�M�o���p��x�flB���:�M�%dJrw%u:� ����W#����8��R0Q�]�]d�
��fPB�ca}#��)��w�V����j������`�,"��%�������W/�����n�������hv�L��Y�4����f����6��H�����v�z��8�}���}D&qw��5ei_��e�$���a	�}����lBL4.�D�ak�}����G���^���[[��;XIU�{��Z(�s�
!z�
s�zK�5Z�K��U��Z�%���`E��]�����\7�m����
$�Ir��6�nT�����o-zc�&��I�&�"�t���{�E��]	
��uw�)�N��2�'a�����,]d^�h'$l��d�h�uC���U��������I�s�rH;$g%���35{�����kX�o��F�`(y�%�	���a�&h:���)������>b:tCJ���������K,J���3�����!"'� ��#�����Z�uc������X70�j�v�+��81i�^��0�n�B�!����'$j	��(P���?�$�e����'�L���z�A��~G���B+X��D��y-�V��L)��d��4�%�X�k8���
Z��QP��
U4�����x��YIb�B�<����NL%���JRv4W�S,�z���Q8V�U(�(���(������tc^��Y���ji��T���.�������oh(�h������z�:6:"~4��K����T{�ka��e������:��h�m	��M��nC����z{,�t��}�(#:�'�LGd�M�l:�j��}P�[���qz"�$S�a+��Ahi4tPo���+&�%����[��$�IM��"d�w�F�v��:=����v��5E#�Nw�PS�' B?Vl��W+��FT�K`*�Xc���c�0�x�E^�A�������+����
�OE���&�q�(Z-W�6�����������=Q�*���O}��t%e{,}��	���|�&�btc�ra����Y2��C]4������_@��wd^���0\lf�n������%,D����E�z�Ef��0GO�;%MB�'a0�lc�#��(����f�$�_?�$1�n�uP;��?�%=D9�;n�'�t"��H�����%�z�E#
x�������#�q�.�V_w�d>'���p���z�&b�������d*����]�����ju`�V�/i�C�0����g�$+u��	�@-��|.`�p/�9O��bz&w������^�y�� ��=�1W�a�A}���pQ)�k<���	��q�}����`c���1��e�+f1i����4P%4�(���a����'������>��
eW�
�lA���?-{zq1��R������ g�����H��z(z]��TD�&at��R��E�����'���dPKw�\s�J��=��G[vrh`��l�F�����DL+,]!�:_�'m�X�jc�D��O�pkuQ�*h����<i��,
���*��	�/�'J�%�:/� ��3��H��[�4��P�<�gyN�_�'�U��b��o#�����%�x��u��R�j5���+D�hO_TF=l3�e|���a�:g��}��3���q#)�G\�d�l�G&~��dt<;!���0�aA��H�,bwE0�(b���	�����0��aA3����!j�!��b�3T'��r�fV2�@A7Gt�+�=�l�=F��}3�V�?�}����b��H����5�0�MS�*��3�#�=��t�X�z��j��8�����Kv��9�k	g%k2���A1�����Ff�����U�m�0@p���n/�t+�2/�hdtY�( L���X�l��T+��)6��C�{����>P�x$P��B����Q�,��
�g��0H>��e�*�F��+�Il�Gymf�b��]�[���_��kD3q����lz�V�������Ca=�d7 ��Hv���$*��U�O���,�_��S�(��Pd�����bM6q����.h�@��)L��(�n�����}_I�a	������D�f����r�f�}���oJ9Y{!�4�a�x�V!i�]����rAoP�����O#�8��:���o�C��� scK��7��&�4����������l��@�Q{TQ�b��B�����	��|B���yn���,A@?&�"Ezd��i�aw^��9K4X��9�34G��_k�����g�T���	p��m"����G�t��r_�auVd�P�qA�8�%�N�B��s��>��D+n\6o������3�I�uB�������{z$�~�������r������d��`h��,���Q!��x@�	N�#]K�q@@m��$��j��i���t����i�@9�B��U��6��p���)��������)�������dh4�`�����b��cgI�#\v?s$n���Ax����YJ��`�t�'b��}d�q��=� F�4���Ec5�1{\IC�����L�.m[t��
��f���N�����}�A
��/���d�^o]�!Z_�	%jY�����|��_��1H1�s$vmZ�QVS��(h%��JE�VL=��`
4�x��O�s��R���6C�fb�S�fp��;_�l���U����,�l�7T�@�X@����W����	�V6�����G��9cg��Y���i��T�p�G��Sm;)&e�B��g����!]�\�U��8H�w�����d����+(�s?�S�����i2#
�\�ll+p<Z���N��A�������Ph���!���#�
��`�)�Ld�����$����yV��8ht:�w��z|F	t��=y��N�j���9u�X�>�H$K;����.bp@�]��)FN��]M�2�d^�3�EO(�l�/�%gtB�\����O��]�����2�D���`�%����r�h>��D!�
4T�~�z���5�GGN�f��X�c�2J�F3���(����2����,o�����t��i�������g]�����o5(�n@��JR�}0��2�C*������7��"�2��Ag*�B�Zv�D�N�J���Y�I	GP��O��9P�<N�%��B.�2����F��e��1*��Q�]-7z����O,�.����\�����1Q{b�������C���@���X�����6�ePB��2Bb�����*�V���H�+�I*W�h���l��M���� ��\5slPW�U���i,2Po&�����IM��F�U�"�a���CG��e�a���j�\�l�S��u^�!�G�
�w�P�<�8��@��K��J������������u���%z{�j&�t�\5V�"}���G�M�'l���3	z=F+D ���fk��
1�Qw��+;�v0���_f1��Eh/�b���Bk��-�CC�V\�d} �2�]F(���I���q��4*��H���� Y~�D�-<��Q����,�@�����+����h��6��X��?�-�%�~G�}���p�e(�#I�2�������
_�����Vw���+�j�,c� WP����M���1���"(����S2��?o�T^����[��(���4�n%�oB������a���E�OXj�i]3D���2FB�;j&�A�����t��!G��EGV,+����V�I_~��w���v�� �=�h���awd��tk&v(2&!S�����T���;����qZA�
�Vp
����em����������J�a"�e����;���/���F$�t��D�H��^F$
|�^�,�'cY�*�D%X	��<���p�9H
q�p�a(6f#��Jf��E���.\L��7D0�����i���v��C��)�� �8O��'���B�eh����E1�;�F$�lAY���o�Sd'�m`�,��rg�m\���~B�u�i���F���8N��l�
vDe�~���)q��������/}����l����$����n��s�s�~rLP}B?PQ�Z�;x���V3@P�C5�S'���x����KN�3Z������1ye�$Oq�]'Q���oKnl����l�0������-�	����}w+������j����m�@�Jed�d�~��!�����[3n0�	���{����"���L�[�5r?�K-�
a9;z���b+�a�ag��x����A��B#�����������%6��h�w��'@�\�}������8 �c�n�5������`��pg�[��Mm��yQ[6V��s 1|�=��3��� ���@�1nE���vI��N	���"T_t�h�m��!z�����R��w�#V+'��~�g���q��d��K���"�"�64�Z�,���>g�@{d�S��n����z�C������@A�BE������v�� �f��/�]��U�P��6�p:�����#f8��}FT23��=�gS?����o��%8C�w����0�b����h2+�~�,v�F��X�37� ���IlF]��@n���n[Q������7�!�i�=�6�S�&�?�
y@��_ �������'����	������o�@�o2��Ah�]����������H����&��w��B����Owaw��)L��W��#��n����'J�������Y9
Ac��	v�V�h-:���t����d�	7f�;"-�
��'D%l{�2I@#�o�Ny�z�w��W��c�~��Y�
]��^�!�����5++������,�fO���X����%j��V�&����X�jY)2�6�0��tfnP�G������.�&n��5����v'c��|b�	%�0�ww��'
��+�/��|�fKrb�����u&��D������Q�Y��	� �Y�b?O��v�R��I�+��K�bN��qA@$
8_��i�
��Z
�C}zN�P��D�0W�0���`	�<�$*���S�T����a�����7j��_Ti��1���*�Dh 3Q�z�<�2�� �>�Z��ht���<`a
'����(8�@EG��!EG=�Sc<~������8���%{f�l�?�^v�L��Bf����U���u�`���6���NK�dTxG=�n[w4�8/a&��	����,��N�=��V��h
����5'�	��N���Im�M��w�0�f��Q,E����u�����9`�A��G[d�������W�UyK�����G�%�����0������V�q�k�&>�y���0&G�w��TU���B��TV,��0�xe���!�B�H�-K��U$%V�Iq4�����w��;H�!�m�����v�����]�Yr��C��z������h�'�b~�'�@����1#�G��t��2g����e����^T���B\~�������h�����8wg��AN���h�t�t`�-.G�7�>����:K�p���V�%� �JzV,Q��W��%!P�+r��T�}���W�q����qU�����=��.��{G�����u����
���A��V����\K5���2i���	�@:@A��������xy���r0�Aqn��4g����~�bE� +T�X~R)�u� Z�1F�8���q�~��m�H_K�f�UcZH��7Xp���y���@���v��]������$-f��C!~���c�@Ob�����+
R�j��M$�:�;��'�eN�x��H�7��M��i�H�k������"�������O�""�xG��Q#X���n�<���4Dd+R�#����w�	=���@6er&��wx�y������&$�R�!���:9��([��h�s��,b��7=�4C�A����t/De�"Gn������e-6z�cp@Z��B9��+�Vh�!�.y���5 G���'<��VK�����^���la����%�D���^#�����	�1�r@�w���r��>���P�{���X)�����������"-�,:�������!��;<x:��^f�C���r�U�����'�b�p�7�N��� �_��VdO��xR�=-�������v���,fq����w�0���B(O�6�m��d��|H{
�G��e�I���F�������U�r����zbY�:���p:rb/v�g`F�����t,t�z����egR�d�d����~��=FCU|�[�!��;��;Oh�{����#U�;�����s`K����{;�����n����ad_��4����D�6C���_�L�t��cHA�n���D���HDw��%6n��^(Fl���#}<`����0�������6C�!�'��(������l'6�p�7RV�~�	�c�^��i�K+��-Bm{����������C};v�Z1�x�G#��`�S��@��*A����7����\�%V��E�s��(���1 ��H��"P�x��!���~�;���
VE�^/�	������V���QK��F�ybm>��M�r���������C��;�;2L��=z3�`B:��:aB6�	�P��P���Q�A�����F�T�p/h���2�C}p9w�o���V��ENh����f���!PgI�S�n4el|�
L 
|-+;�������l`>�(����
����=�T���;2��E/���(Q
��1*i��K�*�Se�*Z���Fy�����G��	�h�!�\]�����W�Rcp��t����)�������;����B��G�"�CsMy��MEQI���i�Q������������� C'^��|A"��9M�n/�cOD���I�n�$WQ��$3���EW.;�,/(0g�_A�h�E�2z�t�r(�h�)5v�d�(���f��lvJ���\����5�,|���0���G��p�
��
������^�o2�S�P���v��SD*�Q�X@G��"\����%�b�������=�N-~GI������j��QqRZV���(���F@6�j����:^%�-������fF18!�+�K
5�D��=Z�=|/��PtO}Z�$mt
Cbb��H�)	h%&I�F��(g���!���:����V���5��{��"��{/:���:���:��i�D��dT�����,
:��Q9�U����tD�D#]�D�/2�����8C�������%Fr�.*}!�i��l�@�va.�u����@�����K6�l�7�!�l�1����!����(I` v"��C��J8	5��.�0F���q~���i��3����U��f��
g0�H	tqv��z]C�j��>���F��r�P}a�{�?z�T
�e X�i������n�����w���B���;,CE�m�T�m�.�T�*{��@d�_X�����M14���v��4=��	��D%�;z� %��j��m�5�X��'�N7��F$����������1F����i�A11wF�=�
�@��������W�,|F1�1��?�h �/6���mA!�{!�:Y�D"����������t(��@��Q"z�������H���<ak`�C�m�'f\��F9���������x�?��3��qR�k���X�"D��
	��p����a�������NR8_�>��:��n�:y�������[hW�����#��U�������	��8i�4/��������e��#r�0��](B�{73<H�����c���8|,c�i�qW�F�[�&�Y0�oF-��7���Fm
���Y �Q#�i�Br_Oy�������P�g�����A8��+�j 3��FQ���j�������i�P�Z~�C�\��9�>x�PZ����g��T�VC��8�4T�v�P3����`;�Q�v��e��;{��<���5�����h�]<��6��>_&�|z%.x��x0�.�����j��5jr����ehG
�A�=2Kg����oC�	��Yu�^g?��Y��7@�����k��=bA�O}�3u5����A�u@;'����Y
`��a=9k2�V5���$5��,$�LB��W���l+�V5�V���W:���]{����k�]����Z
U0Z\�����~����=�-��	w@'�8�~V2������#�IG�j�aH�F�2lF3<���1�����6��(��0l���Ju�m�(�h�73a_���V�$5�!i������uF�z��u��8����W�
2	WH�l�l��5�L�Tyt�>d�i[�l��]b�n��i�-Vw�?�h���35q�b���<k���3�C|���>��3����V�C��-"^a]q�|(���1�-7��{���@n~5�P�m.�5�YW�!6���l���P�����;p���6�ag��Z
/�C�����I�1��d+#K�o`g���l�eZ��`E���@cB�l��}���X?����i;E�P�QL�����:���Q��0�����F�������1N�
���7�D��_��#�e����+����,Z�(t����~�*5�uEpi5�`������n���S��Ns��b�D��e�D�Q���i�&���������������f�@}s9�4$Dn_�*�y��s'j�5�r?������#$���9d�����mM3l�n��i�mc��.B*��������2L��<v�\�y��qJ	z�%�u��������%��,�;���"���b������������0_��r������L���rB���N�L	�[��.?�J�Z
'��o4�e�@���+_T~��8��Qfh32�Qc�p��~���&��V��	��Z#�5����)!������	-���Ya\mFD�bT����&\�����9Z��R9dk!����,�d[ZbP��}�
��dg�A����}*�^ �}s�
%����=!���qCK\�m=�)�IM�g�K���t���v����rt�(j��
r�+�a�����~����z���=��v��
$zQ$��P� XZM�j.���+�P��j"�4cb�
n,�'��(T��[�?Q&���H'W�M����7X ������!%M��ds���mq����
����5���(���Rg!�E�������-�l?�rM�|�OHK�
��37w��Y��j�]B����g����e���JE0h$�q�@	ud�a\�(Ai�A�+�k�1[����E��'n�IP����G;�@��|J���#��2�:A���f�j��QG�����L�E��g9H������9s��/�N�FE�A�x�,$�N�@$�e@8����f������~���Jb�����2��'�����E������ms���+KV�%�Y���L
:gM�S�.+O�P,�F#�7>�(.�~���iB�����A�g-�i�/�CP8����dK��}��]`>)� ���z�w0��<���]�C�HC���LrG��@��rL����8�A$�g��4|��AXRu#,���E�n2�VB��r��a��`�j�� _`��{�d3|�K��G�����H�K�dj(���
mM=�
����5��z<����4��d�?�J�� v^ST��u�����o~�>D7n�|����h�1v0�����;���F��E���Is�����]��f��?g�I��r�m#D���Mvv�?txb�f$�pJ�#+z���:��%��`2��2X��	i�.��Z2���9����%E��n|@�S��3����hERn��F��+l#o�����K%�NU=�����a#t��)U�w�Dj�`U�aml��
�Ow��������z
ju
K��7{�����P�K�pg����~��b�>���o��/8A}h�?3��k�Q������u{�sa�PGo�y����}�j��+��)�M7��p���{@�[�*��:��#E��{f^��-�*��Q:��c�^�lM"��|-���G�����pg���p��"�����5:�
����sa'4f���dH5��-�1i�fP��v��z�
!H���c�?j�v#
����y��91����E���f�O�r����3#�l��L`�k������aUib4�x5$��Z����,X�Y7���d=�A�����=9�����[J+Fhw7� +�jO/4:��wz����������(*����npA����I������=��|�Yf� �W7� 8a#�]7p Z���>��Of� >~}��h*����o����CN.q"����O>�#���Hz $�]�`�{%���'�0��ncb���$q� �XO�3;�c�P�J����������-����#��,M�w�O���|\��4�t�.6".��q�S������9G�g����������(t��b����|�����E�~��U�p���&�;1F��VIj;����������GX�sc��}�/?��f���/��)�x��Wy�]�(�,��{D��&��Q�Bq�hU�?���-��MS�F<��B���Y����G�
jI-y��}n���(�D���6��
e��|��E��)����A5���m#1f�9��	WzC&��-���\6jX����q����_n���5��\�>�T�>Q�|��� A��9�R��4*����2L�%�����t�7��D�2a
�
4��v�>q5��`������F�Gt���PK��b��������	aS.2,2Zxr�E,�|��n��6!�j�
��	`B��:� V�0:���L�]�����|� a���KO����}��#�F�~�_+
}�$�VzK���
"�d*L�r	V�b�l��0���3�`5Xr�0^���
��*(ES��4QJ�Y��,(�J8���H-�RRF�4�`��
���6�P���L�mW�$:�l��?���s_4��<�f�I6���. 0d�
��(o���S$	%q{������:UV�{��H)TUM)��'�9�����X���2E06���.cSoVG���awX��-@e{����
<�����>�NP}GM��A��E9W��a?�P�|~v$^Z�>�m�G�{��c��+��I��#B(�C!��H�4�2���k �e�����Iv�4e��0T!��*

���2�9������at"��h���2���������%9��j$��O�K5�^0;��~�X�M��{�����5���N�Q|�xK���hd�V����IywX�u�
Q����������]'�iT�&s�^$h�:1�R��~�2C*�������D	��<�������=+����G3#��3M�b���DaV~3FJ�,���K'�4�F+�4F�h���������Q��]C�Z��	}�3r	�-x�W<
X�{/2�`Z���9c�^��a>9��xS-$E��$�zVh���q������g��"��#�AMc�������)�;��g���R�PgriXra�w��%���4���'%	s�6,arh��N�q�h`,�K
~�k;2��FX�����xf#�Y�9Q��������T5kt7����^��h�����K�@"���'�&\T�J�j�#���R@��%�O����q/!�X<Z�BT�W�OI ���#�t���[�p��Z��K�Z��3Y2���_h������5,t��vG��,�k�xy},�hL���g�2�s(�C��,BLxt��=g����d�u��������x�z��%u��T�������)���hPB���S�9�9"�i�B��8t�}j={c>[������i�f��~�'1NO���F)�2(|&uA����`� �������R��������$$e��"���s�<ii��w�Ed�i�A���;
�!f<���v�+������w���f��s��6(�����8�s���*?�!��i,*��$Qs��~g��I�� �:�@/cw����������s�eQ�(�N���48�X� B�;���L%��j_f�6#{`Ua��-��_

+�
>L���+�]�^Qb���T%�B���B,�g%O�G|a~[)��`���;;^E![>�������Mc�WP�� ������%j�=�;���UK�������gi���n��U�L�d���������W�?%��4�iHB���c�~�����]���fR�'�����hI0.q���J�����;���>�^Oj`3ORDj�?m�����{ahB�jhIg\�yb	�D�ND�G��h���T��2�m��,�J�R������W��VW����M;k$�'�]h�������IqEQ��(��	���6��n������&h�W8$�\�LA����Iq�Yv����2���"�9H��e{)��a&�:�xe��G�k�)��=��L�a&�[ ��]��9�$C����J��y�����x�C����Xh�(�{�����/&D�h��b�$��j�:������Qe�j�
�C�%�R���V���R+����p8���!�V���80f6���t�T@������	�_�`Ef���J���[v�����h%0��1�fE����]�*��*���_	
ZB�&�C���G�P��~��q��-�
o��
qY�T����*f0A����`�@�����+2��.�GhE���r��H���EE}����T�����j���0�Rx7�����3{�#��I/T6�����;���~{�a�
%��N����i��f��]�����T}:.�3N��PO��^%�&~����~��L�I8|�`R�\�vJeZ-������w��w�3����g(bjIH��a�u�/���,Dd�f������6�=�����Ve������J��r��f�c�6�2����6#�F�a	�QHW�W.K$��
J�~�J��=M(PCMA��]�$��3�L����Ng����\�{�F'��QV��g�B�Q��4�Y��Z1������T�EJ�)t%���[�(t8a����E�0+���'�)\���B�|��M+{J�#���'-����:�n+V�/�Br�)����c��I��~c����jY�k(B>�:�2,m���]����f�������X�@ld-�7 �J|����)W���(,
��x3]���h���r�2��\���iTp�����0�ePa a�N\��@���'������YG;��Q������+�����.�~I��L����u��e�=��Ej��I�;�9�5n{(��'��m��������L�6
�'^7�ZP�+{�F!X��.��?�Ir/"�l��%�=p�O`�z�p�-4~��ws�*_4U�h���$B�H���{'�Il�]��E����l~�O�T5��:��;	��,�� *��w����A�n'��	���E{��`��2�Vd���qa(22����"F���Di��#.�:�������x�M��H��k$���~z@��l(�zv�%\C�`t��#6��v���_��:$��o�����6�����>B:����] ����A4�f4��d������J;�L��5�|��,!����
���U�(F��rLw���������zm������}[ei�#���Q�2�CWf#�{0�����D��j��>�
��A8�O?I�c�=;FNM*�+U��FT�r��B�v�����w�/�?��r(}���
�P;"g��<���	�D�	�P�S�~������%v�i�$��s�&�
;t�����hZ4�����c
�S����t�W�g��h�!���^��S����sbR�76���@������3��JO����GNnuh^&UZ�q�jJ*e�o�t�����&N��Y����7�}C����LAp�ys(�vF%���S*\��d����/6:%�"���}����|��ch����A	�!��0��L��w7�	����w���H.��]Cr�oVZ�P���l���t;!����hSw5�q��	������v�o�'���EKV@�-��8!X����3�UL�dD�F4|��J�X�.���iu���?�V�t�f�~0���_��!X::����>H������<;r���
�dd���y~	����z'�����!�K��9O�Z������E�H(O�����$O���Z�jN>Tzv�t��49���59��c�*�Iu������Q)|3>	�V��)��In�5%��:��:�d�i_;�
��1�/���FN�S�u���������u��K�%Z�@L�cx�,I;v���
-`*�c�@�X.�����kMo�	�L4z��<	4gY2��q����4mUdMD=�
D�r�S�x����3OB�\���\�w�����A��?�	��F�c�@����=�	/�����H��(��`�R���)S��b�O;)�b#4�	�pNV*������$v��P3��Ou���l�=�>Cy�n�����yw��:��;�(�Fb<����fo+r�R������Z�(Y��?�iE�^��4<q����s��$_�,�'gP�N�������M��h�q�_|#F�8n�k�Z�b���}�������'Q�����]"������j9v�=��w	����]��@q�t��Ku�mOQ(�3B��Jo9c���-�D<3v�#��f��8_�z����2�eG<>Y����c�HSL2����c�@���~��M�[C���������������R�dU�2����A~����X��>
��J�M^S��$�A���&�c 4�8(�����j�.ct!o��W�W�r�@c<�d�s�):t�$���'!J�m#�<,c�������v4�v��CO�����	%A�<��Z�.�2��Q�0,��_E
V��T��=��-�h�������8;C�b��Li���N��%����NP�r����JybZSb-,Kq�m:9R�o�h����9������T'�����H����.�.(��7W�o_#>1H�&z����(N�{����x�����/�c����~�[�9�;����_��(�����N��0���8B���%M��<6�����%����S3E}G#���wP8�"��7�T)"�����}���&�;���{�G�b��]������O����f�{��.�;�[0���K�r2A����
�D�Cr�Wj|x���;|��K���(buW`�:�o�j����������7d�xG#���;��C�g���
��)��Ti�mrh^5������Y&�XA��`����^#��w D{��������~�'�������[
�<��e���o�'/����� -�=	�E���%����[��9�/�.�����V���5
�.��$<�������(���A������h=����O��������Z�w�RD�}
4��u�Uw�=���'���-I�;�M`6'5(�`�hE�4�5�/e�*�[��9<�RtI�t%��~/�h�/I���}XC�2s����]��[q��F�<z{�j�(�]���r)��j�A��#�5lj��S�H�"��}�����~�^�
: q��O�zW}��3[]8�tx�_��������r3Hwe�]F��^������]�U���M������'f��7�FP�eHe��\�:A�5�C��Pr�{!/����Q����R����|"N(#���������T���4�
}
� �������N$;C�/I��	A�w���w���CN|�M�P�fh�BP�\����$�l��}G��ARf�����H����SVBC)`�z/�I�V��T����E�l
�$4��8;�n�����O9�%�+�e%�G
����H�$`�;(I!�����"���I�y>X'�����Y�ZyOR>���AUL�
2�a?����s�6"���g��a����A!���F��D���F���<�����nG�����{���'Z���e^�\e��Cx1hP�,,O�������b6t�-�
Q���?���^4�5�JK�.��@g�����%�IcFf1Z0��-���
�E.����&4��~/��`S1n`�����>D�;K���"��w����m���RbP)���b�v����������A3���F{����}�HP[]�����C
C���
��1�I��;����|*IG�mv�+F����c)o9/�HAFC���D��%���z�VJ�����a@�,F*����6����>�)OiR��(�9v�	��������@��l�����R:�kW#�(�Y��.m�����gI�s��#��Li-����
��a��b�@����)Sz�M����~��X/U}����Q�y�@]�/H���X�Z`���������5���+���+�����%Sk�f���$�)>�@,�
���R"^N����@B��`�OD3�g%"��,$*���P"ZPJ���%�A��b��im�I���?����:���v��������m��5�.l	�p0l^>0A�z���Mp^)�/cRVD�s��=��.�<��dd�-��cLY�`����/-k�
U�x���������y���E+W��S`?{�L�_O�t��R��E���B���/��5��H {-��/����BA����{������D�I��,�7�&b��_�d@�]R���.��2��M��R���1�n���LD�1K���\���K�I����"}c,b�K�Gf���v����cO�C�����S-H�����k�@��jR���s	��l��{�j������S.[����jI�f���l��4��4fG�S�bT���fm����**S{c�I;Se�/��x�>1l�������}�V��R�
:��'�w�N#���>��I?M�CM��F���xk��
�����l�h'��^�PU�����jda��Dl��7������-2cm�!�\(�
��UK��:/6���p7���UK�u&*&�1k�D���w�J�4�O,g�u%�/bU?5a�H+S
4�3k����#Y���D���@�<��]����A��Ac"R�

�<�Bv0�����^DM�A��y�#��k��!�j���S#�v1�&��D������>�H�C;��_�������tB���v�H��%W� ��F5`�m�U���M������k�v���9����J�����Z�Q4=
���.��"�V
B�j��V�Z�
t���H�ed��n�������%d�pC'��F���W�.2H���u�1P��FYp����Pf��	�1eVa�\�WD���e}���Q#3�_�C-�g5V�����Dy�m�`_s��Qo�,�����>i�}
L�C��H�P���9�;+}��o��c�9��R�H����>��fM���i�|�5>���h�5!�(���N���|	@@l�g���=i_^Hw^��CGmd �w��G~���t�J��5��;�����	T�a��)�}t>%ue?��]�/�k[

44��_�B��#�nM��~���!3���`��d#����w���WC��������d�i/�o����I���
�����! ;�Yw�RB;�D�3S{�=v���5

��!��x1�T�"xM����2�c�#:��$!�W$����Map20S_�}~-d��dr�r�f5������]Q+�&���N�G3�{1�F�\�dd�����wl{6| ��%z;;�?�k����T���\�d�&��)r-�5������|P��"O�5�Z�	���%�]�U+������
�������8���a-�F�|�����%;!����� �;$�k����7/��Z�t iO�O����AQ��l%���k%�i��>0�t6�<�����c0R
��q�a��
����A�F3V Ro�B)[������������[M7[�������\fD����bZ��0���U�z���Q�v������&������fda "O���bY�������
�Ww��R��H�~��*(D��B�Q`��fDA��r�L�ds���f�A�XC:���m9N�V��f�A{�
��P��zX]��h�U��*�7t�B����`�Es��������[4<�E*����������h�$ 2�l��j>R������L`?�-7�4��E�=	����V#M�Ir�e%UO��'
lG��IB��W�4��N�����T&8h�O�31)?
#��&,��`�zB���q��>Gl��k����C�fx��G��dm�:k*=�;W�FQ����K�H����N��&fY�>Al�������	
��-��"��#����.v�3�0�9���lG#��a8�$�a{E��'�5ld��f�9�_
� �&��b�|?��o�r���8;m�6�
�����h�q�>d�� (����[p��<T��#�*<]~��M���p!�I@#}2P��z}��@���R$���=����l4An`�4�����$3� 
�XK�21����q;��l	Mf�(�R*�Sgp���#3�S��h*���v��ww�G��8�Br����� nI<P�u����-�D����fp���J*�O#��FFeTUC7�V��y`���\���0�+�����k���f�`���~Gq�%Kt`!k+$lY��N�#�5��~���a�1����K�G��n�`��|��_.������v��'/�vF����'+X�j�
���tg���OO����u�%���m��}����v����T�5�P���o ��y��@V���9�g��
ttT�e�����Q4���3��-�
t�$����F�0�������y-�B��
>��|�V��d.?OL����h����@x��O7�0�8�b�.t��S�4�������l�'��Na�����P��K�/S�d���ULCb�I��e���ZB;��2��������o-��3�����K24I=nFJu�&����D[��t����FNZ��������/�NM���vj����]^(�=zM<�����Eg��'�c<[Qz�*K|����9������+�^��o�A��Mj?��O���c���P�n���� �H�Rd
�V�$6���h��m`�������B�B��3�B-�n$��Ct����'Q���������������&mL��g��8s=�G�CG�c�Xq�����P$D�H�q9����N)p���A�{�	����G�0�4EFS���r��f���Y��rJ�(ns�d4���0��t���ue�{�����n��]�\�'.�cr��r�$�V���������r��OQ7�`I2
T�2���f���v�l8.-	!�=��.��-C��21�B�H�=��R](F>4)Y�`��99�4��]O��y�g-�6�`���d��(�������g#�M����jB����9��=�6�<%�e(t�
M&K���8JM��d��������z���c+��=�d ��������U�5~7��Ol���8`�$�j����+{����vB���-���>@AJ����I���L>6(t���*���6F�
Q���5nF<�t.C��x�u�����a�`"��xr�d7�P�c��W+n�O�������~9���A��O,u��u��T��>����rQ4.��l���z�#�d:0<���T����Y~OC|��"�`�uJ�7,Lr����G���P�4�4�4=ho	U��R{p;i�?�p��D�F��G��1��{D�����L��!�$,�.���K��Tz�]`E?0�'�=�O��pgq��4�#�����
*DGb�_���J��@�At}5�`�F"/�;���L�5�8���|���$D'�
�Aq����q��z���:Z�5�7���
�����9H���b	.����u������]f�%���"���eu(�K�h�V�m���%h����{Hc0���x���h�����p��6X���C?m�����+���+���8�l���|��l ��{�����0F U�����g�@|f�0�LD3	IP����e�i;>���-����
�B��a���%���Z��Z4��+f�9� �zA��47�$�}�����Z.��B~/gp%�� ������/UD�
�+5Q�t$.�j���������D�U9v��5k�
wBX8b�����Q�������3���,S~�
�go`i�d1���G�
�I�f��cE�l����l�"{>q�o��220dwU��~8:G����5���|�a����j�����l1� W0u�6bZ�9�J���Um��&��Y�A���M����������QuA&��6��SVv��)/G���?:�N|�����*	�.���N��*���&h���lb#��a�A��Y���=4��6�8�3;c��$���%,���)JD )��$qU���8	b�4�y$��2V�:{$)�5��w���x���L1��a�A���Z���CE�:�60��|b2bn�f��������a�5��
=P�p>��'_Q��F8�|������g����3v1vkh%o=T�4#Y�9*:��8)�]�w�+�L0�&���f��e����B��[H��T1u&_A3r�� "�4�0���&��\�44)�8�Av%��|~`�V �e)�J���gB����F��
dj���i�`��g(x���bJH���s2
v�v�i�@f�����Sg5����UO��lI5D�b#��d�0[�+f'��D
�i��yN#�|_jc��&�/SbZ�=#z�4Z��}�F~��q�}aG|�i��Y#�m<{�>(���4$`gJ!�1/:�ZR�X�bBS"���{(2���<`�/������*w�i��c���+�R����X@1&�F�j�1����q�!]����"���4"�=W���f��K��pW���0����~�0wd�5�	�}&�!���AP9����:�z�#L��~�T[�^���f|�T������h�<������??T��!�c)�������f�Gj4����~��*8f��B��0;�$���F��QM}��V��NN|�B��hC�O
��t��T�i�����I�y1�d4(&�h���Mk'������KL�nq3B����yI|�^zt��8B�����R��
�x�#j#Z����u���l�h�u���u�gz���p�_�:���b�;�{({h���q�E?�k��11���.����	B������D*��S����@�6���������)���@��p�V��"�}�q�����J��:���}���_���M�n�Z�4P8��v|�'�%{T�w�0�];n'���Y-��R.�������\����!�|9`�z��+P��[�3P��T��I0C:Wb���9� ���fP(��#�G�|R:�-�X��2P�����`�*��@n�g����>sW_�|��D~����`�d��D������G��7]����L�)
�\�	_�\��m��
( x�fY�6Pf�H&�����O~�����t��������
C��2X �
�$�)Z$�Vq���5�V���=AqW�T`P��=���q��$��
t���+1��mE�w��'�e,�O�u~V���S��`�mh�'��w{@c�����)��@2���Y�q;�h�L��5�w*e�����Wb��Yx�'��+Q���>��mO
�-�"��jm�����V0s� �K#T���S�<$B�o����D"(j]��]����"��]F��	��T��@2Q��	������G���B[��4Z�FM���e���<��[�o��K"�%{�&5�_�P�q>h�L��$@�e��:�B�k������
P J�|��M�h��h�i�6��LT��%O�=\��E8����~�B\����@D_VP$�������-I����\[Ea�����;S�0R�2 u�Hy�����+
����fR�fv�DU�|��!z����=������z������F�W�����y��o��5������y���	M�$�c�st�?Z�4V�K/���?������#j
J]��YH���s�t��*��sq����X�u1���0%�2���!)�"J��#P�$�l�F���,c	����eQP��{N=��3�tA~0�^;}QZ',u���nE@�������+�������54���x��B��(��w
j,c2b�������EW��(�85�`��{P����T������a���%<k|7����w�����|P�tg-��;4��OX�����,���l?���xg������#<����nu%3��*ua���w{	M�	e}PSSLD���:v?���]�k�	W���6^d(��J@��m�A��J�^X�x�P�<y��.��<6�(wB�v����m�����Kd:���������T���F&z���ntr>V`�bY*����|��.#���F%�A�.��f'L
�������M��mh;�
��&p�b"��t��j�/�
�7�o�	YP����hf'Z��0e����a����}��5 *�66q�]��UGg�n�$*l{���9��h8�b�t`��mi�����U,;���Ec����
G�������$�C�������l�6Z�m���m��P7~��hI���A�
2VT@�H�Z:{�� ���k�zQ���a�H0~�Y����w��)A�X�~'��|vW2��	�}���F�����1h������j-���6���j��|=�1����>��
D���'�p�J���+����E?���A���a�7bf{�L��a�N�r����r���`�}V�����b�����\�X1}�-���i����;|��F4���"��="*�6����{6B��m@��;�27Cv�;�����g)[EgV�'|,)����1)`Y�m�p�Qa��\4�+�F-J��F�'~�hgJ��zXT�=3����e�
6i�^X�%� �����g�{?���dT�.���V���5|����P�`����Iq�n1�h��@���������v�$2�B}�w"�|��i1a�'
���"�d#4X3*�)����d���=��O}��%����
9���6+D�Bp��#r���h	i������a���HL��4!���*�O�����b���m�/;��7����;����)nO���'\�����8���N����;�"�%T�1.N$r�������\���{�@vh�Iq>,��j42� y�'��C9OpV�\�����������c���2f���<���_�,�6��OR�R)9Z�O����#'�_^�=()�����Q��j�c�A��XV%�����c�A�]�:�p(�xD�WJBS.{n�
����)1!/	�+��)�l�x&��N�N%m�����kP�{��J-NM�����UQ���N��l�p� �T���N���������6v�P��d��n;n�
o�������'<�"]TP���i���>z���~���AJ���p���}c���${$�TvK��?����<�w�N����il�A���`�c�A�t�u�����C7��l�)k�����'��HQ{�<��|�
���2� �We23���$,�P� ��M�aZl(���'YbeI��V0
�@���@��q~����8�����dv?�����_�R���$�Ys���J��g$^��sB��#��
{�A����}#)�4����Y[Jc1A�Kd.'��]k�[���~:��f��w%��6+W;�thH<3�b�,�:;��?I����#T1~��lB�\Z�^�����3QK�k�ZGg�m�:P3	�1��]Z�w��G9�vW#�@�U���~A|�m�q��e##����
gK�2�@�	��{Ta'�JJ{�o���"�!�1!%�@��	!�|Y��c�a	���o�c(���
P�,�I�p����G:��T��PEk��SN�]�Au���I3V1L�����P�Q����U'��L}~-k�A*�c���������2�2��b�U8�>�%���:cR��!K�Dv"P��`�H����j3���i�r�<'�?��aR�����qD�8�/D�P�C��l�O0t�q����1��c4�d�c���	k+E�M7�'!��><��.��_�
��3���zt�Xc7`���>D~�������w��~;���K��kx�=J82^��at	��+Ga�OM>������ayk��8<�[ ��;���:���;��t�`x��S3�E�-�����2�o��!Y$������v�E�Ex�����+I�Iy�wK���1�N��&��{	3�L����10���a����*��$vk�{�$�(��}�@(��u�Mt�E��%����W����6��^��I����U����DDar�Z���u9��F+GVR��#��>?�V-�C�V2�������:�x���j�v���%��f��
�K�K/�&sP�����,:��-R�Mx�H�|�>���(�r��4����=��#�c�)��t������Z��1|�M
�p����^4��#=�.zD����]�I�z�"��"��{
��|�p���<q�M���P\O�v�{�S���5���+S��I��p�C6��<	'��FPH@xz���������c8������� �4�b�����F�LT}�/�>�8�[4Cxt�����=�*g&����$o��^>� ����6�c��x�����n_�s^��\�����5���6ne7����r-��JHk������0/D��^(�6��j��������+���?��>+
���zq#�n���om�f#I�h�l�����DW.���!�H�����b�7��."������w��"sd�b��=�c������o�����A����wR���;����]��]6P6�{�x	�h�b#����e�����@=�;��U#����h10!:,���`�K���II�,�&���A�_wj����fnn�P��pH������P��-Q'���.�#sR�Z����E^��0�^&���:�|���Wy��S��hQ�C�>��:����NR	�k��Xmx����P���5�<[�����:�_C�\�I�������||����������H���2>�y��b(�(8��%�M��	G�_�������L�5CV�����VJ�3>M
���9�\KMG&h12q�zXJ�1����[�"�fZM�d8���-���F[K��:�k����U;w�E��U�=�g�v5le��d�"�O%kF���7fF{!�I�������R#��i�������&����t�[��K��=T��(u�g�{�"Ek���2�>Y��j��C�q��1�ewUE��H����Cyu����2�P��i�t$DzA����*-��[��#
�{!��P�X�%�:����9�r$e�Z��pW 85�b�)�F+��g�O�e���F5{	�������D���&Z{!:g�T��6��?<
�AqO�W�����`_fb�Z�Q��>����St���������`�,A�PDG*���q!��#}���U��:���$A�(o��B#��x�(����*�����A��D*DZ���%���Dw	g�3�Z�_d��6;��U�h	e�M��8���}���Q�Xc��
�[%��(��M/a]GD4�g��x���#h}�33�����D��A�M���A!��gt~%k"��v+��6�(�&������vQv�)(;r�By�n�$���A=i���ET%#1�$d�U�����KP��R(�qC2�rd�2�������=�e�s'����W>����(��m�;����rc;�qG]���v��9LsK�H�v��`��?�n}�l��8����)�W���E����>�
s�@�l�l��c2:"��U�-���b��d���px�1d��id��{%�A3)<�5���7}����V?m�Z�~�8��ne�A�����n��y�Ml��W`����m\(I��"54������j�`�L�:i��+�����n��Q����8�7�D����PfUc�d��������a���V
2�z
�0�a�{y15D�	��)����q�&�A��;K�����Q���B���H���v�V"��w`����m��L5d`��"������:������}>E�j����2j��������
[�����n�a���IB�������Zc���q�}AO.�K��{yK�W]����vK�
gt�7��%���t_�:��
���R�������N���'�j(���q��
l���[��k�
��$���g:����5)���(�^�}_�,J��6�(D!,��M�"��B^��<����Yb"dM�j�#�6c�d�LU��r����"���X"���`T�"�d[5.Mb�5*��I�H@j�.�����2�}�i����p���1{}���V����okr�R�5��}/49]��S�-�R�?0�����d��,�GV�V���m�0�X��;�����V���c���W��w�K?����(0����������Z�u����mY�HR\���fe�kw�nl�4&��B��1�;�����F#��B���jb���qBM�/�zE�!#u_����YM�z��_EM#�j�c�{�1���O�4����
�8�XmF���(��0������`m�3����TL����7b�����]T��[��s,�._�7���y����28��w���F������� H��2�h��$l�JV5�r���%4��L���/$V�B�-bz��A	���a����?	��_���L�n����%|�������f�"�d�:���E���&��	��"��Q��1I��WS��^|�nc���*��=x/d��y�W��i����$v�4r�M?�no�L`��z���i��F���F��j�B�A�.����1�]���U�+5"�����I���O�jF0�B��E�xK��K=
����������W�w��������)T'kE3�S3����f���n�jD5iKt5:��X0	z�����������Z�����W��C!����;�{��� �C���Hh$B`�Q
�0��5���P?\�5�Y-�����������������}j� ���B^�2��hh�^���e� h���I
��k��N�#���B��*��C��6��A���P���_�$<j�h���EIP)�o���Hr��#�;-m�-��#S�JK�VC^oJ\�x��L���������#h��?~�����z��b����V���y�"�I��{���k��������e
��-��|I6�#��������Y��p��{����������N�}����e���s$n��O��g���������#�J����6I���2t�}�N+�j��y�}1�aH0U�t����1]4�C�H[�x��h�?�����������B4W3����:iC���
Da#�z�{��X���:�6���f�x4c���i��>:>��5������L��������F3��G����,�h��{5# #n���`*�f$d7��Hd��as`�L���6�:�5�@!�����f�� ��%[jH$�j	���Np2����Z��|�����|�F}B�8O�h�J5�d�D	-�������p�dA�E���5}����u,_����L����TI�
���m�����������a�Iv�\T7�~��G��*s�����QU�V����f�������i,��������A����zw�����jL�lT$ R���\t��0�"�/����>��r�1�`'�8�4�J@Y�=�3��gDE8n�'�m�c��������M�c���-�OI�P����O(�d�dn��5x"'�����3����3��n�<��(��P�?q��G[�!�v)a��a���Z 1��v0�'�B�}�i������O�H���O���<���]�g�{�U��D_>�.�'Y�e��j�9�os���#:m2-��CB�����
��4�wP�
�����y(y6J�E��n4���&�6����n�����b����'c;O7,��{����#�h_�`sT6���h���Z���sn���������	�r��5r;:��h9�P�G�fy��{�6�~(�m����q����i��W
;�Y�u�R�n��"(��P���U������F4i����b}�@�|
�7Qmr�9Q����VG/���-U��x�v��f|�'�X��Eo����c�������(4�"�@=��	5�m�$s����B�I�1�T��JD�8�������8imz�s����<�P��@��n������F{x���=�/�����P��l�N�jQS����D������c$K!�nXb+`�n��}D�[?���g� �N��H���X���xn1��k����� 4<�a�����h�nD�y[u��u�K�N�2�u��<>�����u#�yNvr�%�Drl��1�D����?	d��>���4�L���4� 	`O��#k�$�2�>#��x�=iK|�E�?���$u�%;
�+���?f��
$4��P��WJ��N����WLa��z����?���>���'������b�M�/B�=`��bf�V��q��F�_�[;���?������u	Ak������stg�n@5������=����&�
.�V�,O���nvt��B! n����b����1
	��!A ���#3���Vn@@�P2���v�<)�v�5�t���(���B����H{=z��l^)7��_�u������W�@������q�]��P�~��{CF5�S�|,�y$b�L�E� ����C]B^��9t	���.���v7@��0F���#��-ZR��'����
���������D��QR���\��"���t!�'dn9�����h%�iF����/���++%���C�S������)��^�pf�=>w��Gd��� G�b_4���to#���~;X��@Lu�x�!�w��cir��Zl��0���;B�G��"ZQ�	q�[{s��b�������<a��Q�n��$R���M�g�@�8v��o��M(�$7b��.o��������f�e,��%����h�H��?*�F�����h@��>i��0H���\$��J��Y8�E�bF�
"����z��8��-�j;��v.&Z�c���Cjl������?�c�~�oE��0D�FrCa`F��
Z��\�;b��I=@4��6���H"+i	QCx�?e�^���u�q�3Z�Kb
t�I����}���������/�0"e`�Z��5q�����&Yr�0| b�A@���C��1��j2m������^D�����(�#��J���<����h�j$aB�W��Z�P�t$h��Q+�*l�wa��qp�Xzl��S�2��c
�����u��-�s'��9Y��DX�'J�� ���j��wD�S_��5�5����Y��?TJ*g��`Ye�A����a���4�7�:�����R����EV?4�zD���i�=��v�a%�F��J��C�pb�4�����Y���9�J�$
�M���Y�mla�Y�~r�����u����#��A�]���@m2'd�������\�.�f���s���o_v���c$w��1  R�0r����T��p����S!�
OE4�a!3GV��=x�=q;�t0#O�%2P��26�������4� ����]��M���RSD�B&�3��}���;��h&���i���di��I,jQ8�`j��������q�n��$�@�����V��Re�4$�������I�p�O��y�S���G*���fr�-�$��42��F~�GAt	�Od�>���%�QT`MC�rG���W��C��Y����n��2f��	'4^��v�2q������.����f����{�2�@��i�B�����W���^���h�73���18��I��%��T��9��!rKH��Z�#R���������G
XRi���������J�F���U�]�e������{�i�
/��(::�NCR�!Q��#��O��#��#_��s�S�9�O�q�|�9RbHA��ilB�$��J��v�F��*���S���Z j#���4J��E�Q
��m�+�������/<nlGM�D���V��{G�����7�2�!����A�;�$���*'X��X7g$
�
b)�oy������I��>�-���8�����CB��h�|�����@
w}��3y��]���
9���p�i�A���O�}D4��j��Ykke��k�L���V�\5�P{ya�lP���-���u�z����G�i�����\!���[����NV��ngE�q�b*�}���?�~5��n�������!s%���D�V��Xf67
8H`���g�����i��)~g�4���r�\#!b�#��4����%��G.��������M�=c�<G�d����b��L�i�A�="�O��Ij���������c\t��+T����I���?V�����e���*x��lE�C�x��T�[�+��F�X�3��L��<�Y3�0�c�n�#}@B�����'^f��E���0�L�m��"�U�,�M�0���
P�|�N����x��d���!RA)���&�q
���z�5**tVB�����|���C%��E�������X���|�B/`�@[�z�������7������'(�]�G�A)���"�P@���J5�hAZ�(��<�c�Jh�h5Z%�l�sQ&�yq���'q?�&Y��%���i��;�m�7�Q�V�O\�5�J�D�������qQ��i�������f�;�=�������*��@kUR�������a�S	���SB5����G�Z���1V��_�C4�����(_�H�B��H<���%��F���!�5=����c�����c�{���E�
��J��s���:j�/�:����
�"e�����,U���F��[-f%_{V�Q~�zX�2��H���)Z�"��g�sK:Ft2]qfZO�R!VI�A+��I=�_?HM�|�����#a�}��*�/���9Q�����(E�He�'��
���9���%��^>T)K� �Hk>��c�C���;��=��x}I���t|���7@��q���*P�����+.O�)����8�5bZ��.�Fz?OJ����HD�������%#$
��$����+He+s,���7��gu�Yd�D��:yM�\�P��*�G;~!��D�����#�uX����V_�����8}�m�O�J��Yy�'/H+��X5l;6��
�@#�5sFQ}��j��!�OK��mj���e�c��lB������h3�����6��!�� U�LF�Z�e �1�(����V�N~g�;���	�h������E)4����������QeK�AQt���K��<#*_����;
��b����l��Sd�����|��?����{JA�k���zAtj���	A
+�����>���"N#hN�F
y�3&���,�&�o?1F�_���� !G�6�E���,��4�����+�2�`��q��	_R���+N��<�,Uf��	�OvtbX�I��|�����cWw����0EQa���]�K��HvP��|���'�#4�sK��iV�������c��g]B�c-��y��
r�����q�X��?�=Q�HI.�����-����R�X0�6� �NKQ
�c��%�c��6Jc�%Zl��n��88!����OT�4X��������;��>�\j�N~�m�h��I�FFv;��O�\}��z��Bn�*e�Tew��0	/��#����B��En&�������1>��o�P�H����d���V��
�D��68���P�g�?�L�MR�2���~�������FDC��&��������
���"��O�����>���B�T����JL$�@QI;>P���8����������=�=MQ~la��"��4�0N�0�`l��#�E�`�3I�CG��mhA�tU�
u'��c�;���d�P�V����_k��<P�_BD��������Q~����u�����n�8�Z����S����%�%zw�e�XA�h�@�t���~�w��3C�l�!��'�����w1�=��+w%y�__A��6��J-�"�Ft���d�,�I&�����5�0l\=��3:�6�`i��`3��=��=��}3d��u@3#�����H��-	��r�G�Jb����%\���m��[�v`O"�"��/��E(R7��v����b���SG�����h����D@����!��`����:�|#����zUn�&��?~�VH�������?��=�HE�q��-C��Ps
M�Y��`E�44��NU[:R���8�z���{ir�B�q�' ���Y��=X������	��Q	���LdXBNI�.�����P�	��R#����}8/��PMp��������?Q�,�8��#����F�����:�u�n�.�DS���f��S���<�>�K�i���II���F���#�j;�����Td�w�a�N��#L�<	s���������]6���x_�{�hN�'��y�����7�*&1KP=s��V��oY�yB(�j\��M?�3(������UD�����DQ{��$�9���T�zf�a��U|��6t2Q��1����n2R?�V#`���k��PE��):R����1�h�\U��b�!�?���B�@������x
�[��Lp-z�Qz�i2���Tc�����=so�0E���p��w��P\*������k��`N�}�;hP�M6���������6�R����������a�-8#}��`�%?�B�h�
��38[��4�]�i����$�U���Bw���[cI������0?�S=_���,���	D�9=��Rq�Wd�a ���
�!!���Pw�D�pk)�]�"��eOKj�q��H9qs���Co'��C9y'��}��>z��x���OT*�~�u����-]�"U��&�!�������� o�h�~��|�(l$�:�
2V;	�V��~6S�#2n4V����{l�
B�#�����5k�� ��\)���!&��|�I�t������������h����b��}��x����
���o\�U�	�f���n����F�r@���������
c%F��N/���N�xwv�u�l���G�Bb��S�;���t����p�%k������W��jx
/L���.i�#�=/�
E0�ksEM����:���Ik�Q��9���b�R��9!��[$#uTK��of�2F�v�.���O�w3f-��+��������"d���
�*C'�����!��}���C��<��.�:4���>$�<i�����
���o�����F��r��k���
����ph������5��T!�� �����@�Z	���
0��+� ���0��&��;�#��A�N����H7������(Q�N��|/d��P��A�[P;����?a���M�G�n#g��B>*��#�B8��%�����}���O�^�F�Y%���p�M��+~~��{�x�~b�D��w�����A�w��RM���n�I�K8���q/=��E��Q&�9���U�H��Z�����)12}�a
�=2%�D��?�#�"�����/8^�,Q������k
�Y���P����AF�H��r�FP�w�O���-/���o���A�I�������"�#}T�e%��PL�A�]�������@���|K&�Tb')t�i����t���wKC`��Vd&zt1*R���08�����]N���`i�������-'��a����pr����^D��^�o����o<y|y���@�n����������8�oDNs���/�B��=�l��u���JSi�br�����'�]�P����^#�d�Q5��{����x�!�(1���
�l� �ah�{��{W,�$c��g��/����wS!�,@��HB������ h�^��-"w\l�E� ��Mn�f���`�4�����G$�4��%S�Dg"�
q��k�L�t� �����M��I����&i\��������qq�*�!���X1�{�{��c�!�*P�r���>n�'�rB��HD��^�;}��V���w���KQ����G��U&;b|����u#�{b����7hx:-�c����#Q�~vlZwk�p�#X��5��:V�4�%i����'7�${V��^�}>m��L~�8��u)���"�hD��-b tw�&��&�Z��k�rW��m��1>A�
��]���������\����
��I!�P�����b��-1���`e�����r��@����P���`QY��$Q�;����O����#��V��o���9# M5}QuS���.�B�W���].��)�/H����[vy�&,){�s�4��<�j% �c���E%i��)��D�zI��d`j�I�.��P�=�U�v���<���k2�����^y��~4���|����'u�K	�	=��D(0@��x��dWA�������9�������Zs��A�D?��\��4����#����������QJ���=������=8�=��ox�M�$���!������������An�s�]���x.�j��<I�k�gK��$�k��F[1�ywIr����5������HFA��b�B�;���l�I~V�4i�wf��]������yC�>D��%���WDq����)�����Z/�1z��J�y����P�v1p�|51TXy[��$��uQG����G��t	o�l������*�
�JLW-i��<G�^ak�����^�V&�&_���@$T��;x�w0�G�8j�Kp^�;�GL���=�^#�\CVRw��C�������K�i�$v����p~�[h�>�@*���}�dE�A��Qj���}���
�h%��W�v^�	�(��A���b>l�;50�#
�$�Z=�j��$A9��e�P����m���K@Qd�e��s�a������I�[C�����:aT�R+D>t�=8��9r���N-M&��>D�]mg�]�`��������IE
+�g74��j$����E&P��G� ' �)p@�)*,bu$�F�z�Ys������d��ce����4������Bev1b����An��-�p�6����A�8�*?tm���I�l����C�l��j'��&����@D�r������b����v�������Z^V(�j���/w�K����������������E>��I dxK���"�^M&���k���+0C��
hG��8����A�����������$A*�F�����-Q�t��,@���Ysj���G$2� ��n���c@�bMP4�����Ce��Zb�zK�-�{3]����z��vpu�_�d�P����>Q���d��������>Z&�{D��\_�^C��P[�q����I��-I���
N���ZS��d��=B#5�!z�F��]����i]k���[wIM�N\?�[�dB�8�j��������� p��[�P�������@�-�_Zt	�o����Bue�sW��^���H�2��p�&�@�f�	�S	��� u@��]
?tY�(}��^�����"�EDkV��T)Q��k��Y
�E��aP�wd�MQi:e]��\E��jg��D=�G��h��A�,��u�!������|�������_�_�A����f@��}�$��J�g!u�:�G�/��1��Q�d���2��QWc�T��7V��{�mYx�K��A�{����B�?i5�Zdb��z��G#v�:�aE������Dxr��A�M=_t.��WC���e�?��g���p��� FD5�����z��ve��:'2���s����u����[�O�7T�a�k��!�{�~��p�R�$H��}>�{������'����������U���>�����������q[�.��W������j�G�P�	7?�k�o�s��8�����I���1kR�m�M�,���^�W(?�K���6n�����X���q��AY�^��~�8Y���zV��P��:���V��`��NC��%�;vB0@���4���z�5(E��F��P����a\�����-�V��4��%�;������O'��9wB����-���M�a���(������,rw5v��s����A�<�'�V7�b���-�d�u�E����-��%���p��;���}�Mj�Nj���tP&��{���n2�e�����D[�wc
v	�h#m&6�e��������+���:��J[�	���q�vE�3�X3b�$�-�
�veP�����#eC+i�I}��RIdDt���Uu����-��x$���@�q�&Y���G"�	3f��W���Vc`~����E�����`����P�����c����
�V����������3�h�k�[��a�lYw�8��_e,���Z�u�h-:,�v�����?��m�G��U�7�
��59c!ZK�3���6~�k-K���
]'��So�)�T���>��s#�w�T��=���V�i�*Tq���NX��	we�w�����}��J�>��64�J��au���g���zJ}[p����x4��"��2)�M0��,:�4�
_��m~����gtdn�D�T�C{(��FL4�5D�#k��!#��j"��-���Wa�=(�s�B�`��b���k������������#d��}��Gp�z8������e����49BO��VE=�f|A�aV�����`C�������=�R44vf7������[2d��/���*����S�[��.���vB&��
�A�_�1�!K�-�(4�4�.�g�uo8�mN�vV��1}�+�����t�Q=����������������������&#j�6cJgW{����X�cQK�3I�-�j�E����5�0���&��*������<�t7���X�b�T���9P��5�������
I?���������u+��*�dAh��E4?VA�,y���>��$���5��L�����@�Vu|0vy��>K�%��9q�;.I����`�I���>��?��w�]��Z3��v���'R��P��p�
��`�v>?0�f���x�%+t��*LD}���>�d0��20�?���9��"�[��Il�ez����T�8����������ctzV�	�:}wj��!��:&r�C�_OP9�v�[��HP�W�����4�3+�T�/N_n&�F=w��/tP�����C&�aE�j�n�Y��������^�R<���h��	��I
���q�]k����/T�O(!l����H���E��w��"K�O�W)f��X����T�
&��{HE��0b5���4�i�tJ2�F%���ER��"���^	����B(Q���,�4�A)�gS��
�`�n�B>d�9zP
Ia�oG��n�����hB���i�dm�hb�I:>#���+��@��G&�~�[��;K�&���)���<�VX�����I��0�Z9�GgxB�
V&�x/��!x���� J��<YP2�_�a	w�\�{h$�{�d�h�+:9�����U�AX�O(R���H������Q	q�������
H��Y��:�X�b'��A�FGt���{��-� [����U����#�=
������w����d B)�(���>C�+������P�����l�$�A�,�3g�N�*{r�R>B7A�H�shK��d�X�1'�nb�Nd7� �,�:vc���E:F��vR�(g���e���jF�$A�]�XS)`����%���p$�D�Tp��E�\=���M�����os'�]|�����"����"m��;96U�a4��M�O�0�pV/��]{p���r��-�F#�W���[#�dO;�o�-a����	����K�ac�����l�Y����W��1�O�[�*��N�&�	�|Dn��%A?_�WE�<���[�(@�vt��}��OH�(�:6�����,R���O�d�(A=��=�8���m�Q7�S����:�P���r\�J�@��a��#����a�
��mxn�V����Xv����q`r���d���O���1��v[����
�����N����&h#�������h�A]C��R{!�!������q��:M3%T�� ����#)
"	5@���:��Gl�On����{�;�0
���R��d�	oC��S�`#���NV���2�'����1)�V�[��u�FD�#`�`munW������A�9]�����a,�a�A���>D�B�Y@��X)��@3��a"7���r���F������[�n����dB�Q|h��)����J�a$bV��;�A������
r���n4�i��c&�U��������H<�S����f-NQO���zM#�]���U"#�E(!����
H(�T���8��I#���Ah��-��������=G��mi�.I�b���	����������������������fXb��Y��$�?:���]�c#-��p�����)�������Z�U���n����0���5�{�8��4�`l�Q�`DC�����aO��Q������5���D���mh��-wdgc`����0Z��Bj�b� �X<� ��q�n /�6��$� B)��3}�\�>�%"B�D��H��G��Y�Q�-&��#J�2�e���D1���X�5,s��+�	�����,
+���&��<�j2�`�%}8�����{�`V�R�����
������Bg�����e��:�KX������T��D#g^����Q��dR��5�b��d[��h ��K#�(7#��@������:�jo�y�� ����Q�0�cD��qb����C5�&�#�1��	SCa�Es��!��h��n�5~���8�!(�o��X2���n�!4�
������g�/����}����bf ��! `F������lk�b&�a��"l�����������J�-�=N����]��v:��6�Y�:UKO.�%1������,��;�:o�'�Am��0
e��|���,�7k�[��<�6��	�Vs��`���x��b&�ATVdx4
tt��F9sp�P�T������S�i�����q�p
X
�[�bb�
y��%[�W�]3�)I��#��oD@��4!�BY��, c4}�G�M��P���]F;�&�{(5K��F:[o
0��L:�]�**u�;�B��������;[s-
�M��Y�~��/k�����vGg��`U3������#s��N�1�*���]��K}����4F���#+V*;� �	�F<����}�x����t�� !�t�"�t��		���1�����{�I��#>����g��[�JHG�bH�v�X#�sWu�K@���R��J�cC�!n��u��U<�~��)8lK������uB7��'��x:
�O�~���(��bn��5��5�B`�������!v�d5Ll�d���x%!�a&�m�o�)E@ �h��A4	��R3�H�f�E-����M���X�2��4`�K�`�=�H�+7����z������-��+��}��.d�5�T�O��%�]{�k�LL��������<�9#����u�vH����1��K�BA�Jj��n�q�0,z"`��3a
"�?�-h�����f���x��n�>�)�j�1�VR�#]�4V /�)I����F
��������IG�9���_-qfb1��X
�����iz��O���,7��ur��h�(����i5�[�SNc�pU']7���I��*E�zB�`������$e��
��V���B��oEL��!BW�
����0������~���������+�K.
�,��eDA4r�6�"�m%x�b��$l�����(�U+�V��lF��fQ+�Z#��O��/'���eC������G����6X	ax�����!#2�C����n���Z��_�\2�����U��4����!xT�@��'��kC�����mW�x���F�7�
�[�`tJZQ<�v��M���~���E�Z�-�w:��I��g�r��(NX3���/�V�2������5i���5L�J%}�Q�uR�{LP��@��2���Ng/Q�������$��g����0�[��|����_qZ@��ed�R�|��/�+�(�zEN`I�(S�J�W"db�(a9������Og����`{v��R]��p�B+9���eS���	jP��X�����K���������;r�N��i�����Vl�f�\�e"#�#�:b�$_�L�����������4)���,�-�t��9���V��E��jDI��o�]0��2V�UU�%�3|���%dp�JW��,���J�T��M���]ZV2:����4�{ ����;;�$�U,�N��a�k#�'�������������z�e����F�Y�E~���z���s���v��b�����]�$����y�E��e��8P[�����I�V�++�V���"a+���e��V��wZ_�*��+&�wE�����+�-��"R�e�JW���jL��p����%c�= ����e���an+��>VJ~�H�^�K��MM"u��o�
����+��5�OT�;k��|���g�����J]�zf�����'��z�E#�5��e^"�QZ�Jx3rWX���S�F�sa��T^��]&F� +R�`��`���DH�r�YF7�8_�I|�C%������m�����"�O���\)�vSpj���nwb��mLAzpt�?H���(�,K�"C)����)�5G�]���D9K%��{pg���PE#��x�i�g��[;�J��]��Ev��#0����U��$C�#5U�u�	Zg��m�|b�7�v��8i��pA^ ������D�G��y����to�
Y�GLl��������X�w��4��F��]��D����Cm�����������@F����gt�Ny��Y�l�t�R&;+��g@����2�)3 �����i���P������4E&u���[j��4A+[���9�h�DB�}��Y��������i��� ���(A�u������rcD�gO��@�;��#��b�#��62��<��	`�4Cp��H�b�lc���IX��� %��Q���}E@,_Cv���.��K���v����?g����e�<�GsPsc����kf&}������O��<����T�M}#��
5(����S��%��J�X;e��!Y�a�A��J�=^�����:��vr+�;���B�9� ��=r*>���G<W�=���b@�dG���gG-���t�(�`vh����;���z���v4���e���b��t+l����BY;tG���������&2>Xs�.����(����b56"%��h��plXWkf����~�b'������������x��t?l��?��p�9�	#�@�� wfnC
*2}���|%�����/��/����7��Ty_!���[��9���:�S������d�_ dK���Y���
����g�,��9!�+=7}��-X�����u�o����#����N�{V]|{��<*�E�S~]���K���#��0�*b�l�ZJDRT�B����@�
��X����ACf �r�����H�

��"��Oz!O��Ra0Z�N��"x�4<�*��\������R$-3:������g�� ���c��u0N�(���H`��2�������c��N�6����U�6q�H(�5BN ����%1E7�y&}b,�%�H�x���_�����Gd�(��b!L���G�?Y����$���P��q��C�'@D�m�Q<
�=%�4w
:�g����1�P��?-��������;���y�(��y�L����-:���y7�{�@g�c�Aag`���bivCy3��&X�x������TN�m���c�A4����� ]�0-_9�6K��]F
w�G����Y��{r�"3�9-d���L?q���1��������1���������P�1���
��W�� V�p�m�l��
��,�N��5h��l�s6��d��N���8o{��Ut�
Q�������������%���Tl�P�����Xg��w�����zo�"���l�����vO9#N�5�N�y���7��m��`Vo���2�2���G�[%we�Ld��E��<�%q-�q9k��tK�A.a@a#�����-r`�g<A��Hw'����O�����k��
~A�1oDl<A�+�����<�
���Eu���Ca�N�
{�CR�>��^���p����D�9A���3J)���uN�h�h������Y1e�{~]34Y�`���8�4_	�B���������K�?rli����r��f�A-��zk�����&����$�o$*:!�s�w�b����g����������?;M�O��D{�h.��M�0d���������0��]N����	d��[r�
_L8AQ8���EI
�n�dxP
�3=�J f�1��8�wVJ��
$��'�K�����7�N���[_�E��W��h�����$�|"
�h�38�"A��15�	2��Z�"�2&��$�B��t�N!�wd@	U��j#
���k}T��������{x����Dz(�p;HL�;�SO��R������}q�VG��Kzm�����/)T��O��v�*
�A��pc��)
<z�F)$r��������n�����4B�C;k�/a?U����:K����F��M�����3�{�H�v�i�L��	���ar�\W|X��� "��B��y���I�&�wP��W��m������A��4
/�L��Fhl�pOE��$�y��j�b��_�������^���.q�J�����X��iWg��P�E������9������4��[tq �|��7!��4�Q�U�����Fz|�5�@o4�y0H�JD�p;�HI1d�$>Z�	!�	ZQ��^����v��"�\{����4�*tD>OOsyi�����*��X
g_O?E�Y��jG���m�>�{���w����MZ%���*�����k�E� ��z���S��5|��1�!_	t�y���,"%
�wd�w2�������{
K�;��2��2d%.�p+q���|MvT���_N�Q������	HL��vcw4�qg_a4���2K��`s!�r�29&�'������)����v���I}>Qm������dy����K�c��X6�
�N^8||K�Mp�FS�������y�;�e0���T<�/{�{�u��@��h��"���9��#����/&�f�P�t�UJ�CE���������L(�|G�_����Ho�Wo�Cjk�����2&��H+��.�z�������C��W�^#�94�����WW�+|�A4(���]��N���5����qW���CT/q���������3�x��c�����MW��Ek/F#�D�zG�QAnh;�,�(��AFVepa[�)oP'����z�~l@�SE���=�,l=�������L�y��S�����|;%����'���nB�x�
����UnQ��/�k�)�S��5���"�� 3�S����J4C|���\��c��z~bO����!r!�}#N��j#j��Y��Gv�D8�^�~����'<�S"��6x�5����W
��K�3�0�;�"�
���'����'-��AQ.n�`��{�D�����T&a�t)�������N�)*	�1����R�����?9��	9��N��f��r���D!B��B��}��FO�JR#�8���pB�{/ab����	Qt����.Q�!�3��
L���6��l�^��8&.hR��u�pJ����������C�wd����J;�%y[z���/c��!�A���
����3)J[<�(������HK
�x����J2�]<>�B��e���	����7VD�hn���'���6#��F"��S�(������Dm@��Q%kA���Dn�s6g~��yg��������j��$bX�E��)�n��Td���������"7���@��y�l�n4,&4s�'H|y;l�\�W��j����@;%��U�FP�����.R;��#"��l���3���D��Y�A����a��-�
���@�b��P��&���Cf���P����L�����x��\-�#��w�yr�B�S���v��$�;��^Y?�90�s�Pe�VII�/0�����(J[�+(X���Qb����]-�{�W�|��d�����)����T�C������Tq�JR>
DL��=0u����e���m�Y�5��?�~6'�>�J[�%a�l�M��.���T]�1�M}�M�K�"�I����~G�S�H}��>J*��`���G�HVX�5��41-
@���9<��kR�N;�0���P���T�������w��Q���1KN�IY��{)'`+���~������}�qx�`'��!�D������K���*�S�#�-TZv�8��b�5Z��N)<���.6�(������9��hk�b�U��)��|J@{^M���Gw��q^�Y*���`G��hd�MB����Q�ktjM��U|3d��%���A��_��X�&T�_����~G3j���:1�a�QPO����%2���\�B�k4
�uV�g�������&~����@�l�wI������Tk$����l����e��C��N������jS���]���e�!��6��j3�������B���V[V66��^��(�����hP�,�&�e}G�\��9�8�j��p �S�
�{i_ SZT�2��3�6����^�6T}�>R�:�[-���T�p��������K�'���� ����kO���a�O~�T�5�@�\��+�9��E0h�iz�����e�g~���j�
!	��$�hau�������(����G~P}�����]���?W����H��,�Fj6uv
�}�ol�O�s�x�M��ORb9��G�K��������?5H�Z��s�
�$q�&�A�#l��5\e^+ME����U����
�\U��%x��Rd�Z���	.���NZ�U8�QG���iV�Drp���{#���WjB���b|`H��>N]!�k�:�1E-z�BR������r�[�4���,+juY�P�A�J�h�����S�ZR">8�{`C&"���h�$7���F����n����M��Q�%����w���/�o?�pVm�l����/��)����D�F���g64\��� �����+}�!�X��[_a�
QEj	�V�Y�bv�v������;��x^������@���-�H#����/���BGUb������?��B��5b�E�vs���7T�7����P����W��@�as��#4���?HR�i��+Nb-*�������$]�y��z�<J���J��e
�a?��~�G�i\^L:�h����C�-M6���v�Zr��S������m���D���{����%lARK�6Ks?�����u�
C8ws���g�fCKss�_�\?6���t�TeC>�����,BEQ<	�[�j	�����|�E-�j<h�����N@-qZn����QN�K��wZ���1~Q�j@4���P�����mxO�H��
�O���=��,�u����]����bekZ���i-f�z�������d��Rl	D=oIz������S�y��lTe/{�O2�Kg80>����lC�r3D@r��1>$��i�[��6"���.9�vW�|fz��4Uv�fs���2V��i�~i��'�]R��\����)�&�����g�1n�
�"Hw�Qm�����A�uY����x����B,�����<�
�9[�\an�o�p�P+���eK4{�~�(�W�;4&�Y9�eR�r3v0}����-%c+��-~W����������J�F��~0��Ew �e�\i���h�B�{����Y_l[�3�'[=�]���<z�d�����%(3� �X�Df�����f���zjF�'7n�Xk��Qf��:��Z�V#R��f������cU�����x��-�+C#A��:��}�q;�K�n���c��a�A0�P����a�jI%c�V��@|�fB7� ���DS�E�1F]���b�lV�^'�W�����Y;c��{;�hDc'�DG�bu��	EI�1/�F=kIdP�Tu�Ek�Q
�X�@�T�i���I���NhdY:�J��MM�dFYG�g�$�CN��C�ixb��i�En`����9����>����d�����#���������;JC�F!��^����$����R���x�C�����K;�g��p�Y��_�
��������B� ��n�B���:�UT��HT.9r��[��=��J�d���@�p������$��C^&���G(�*S��
^h�W�V�%'T����i�Kw�b
���e���B�NOB�W/9��cE7�!c�u�g:T)���0��P���Pn�-cDi�n\��=FJ�0d�u�}��m�����P�1��(������G��=i
]�y'W���E:�S���P�������MD�������C��=�����`�n��"N��+��>���,��U8�cjOZ��F�}�
Z�o���-
"[����.�
Q�M���?�:�����NMt��A,5�l�>�(4C�H�.	zY17���1����Fb��,�Z��l�	������	�8|��#�`J����@��fm��5��(m������3�f��>��e6t����Vy<NX0"q��MA`����nU�bj���NEe}|�6hP����|��x%����Y���6��P[�'AAv���}F�u�_Q~8'�Q� �I�`S����7w�V��|�C-��������uG����H��w"T��?>����)�j����0�"�G1���|u��`L�Y���=��W�GU��&�������$F����3}E�
���:{]�N���;�����'�����z����W�����:��-6"	�5E�*�]"��Bc��#=�s�'�5����hP�/���,���5[�u�Kj��[��C��
E��6�:����U��[(�����+�P�R=St���]#	�O��m�@C7:������(�P��H�>�� �ig}�&T�9��������v��a��X�j0��F���a���M����f� �nT����`�����/<c�A~�x�J?��������������s����A<��$M�2��r�P����Y���H|��y4p�C��@�1��G���*�scG�ax���t�PD�@-qS*Z�Ft���P�v-�g.�-	�p��Q@u��z�,����4�,�p$�Az��p�9Z�G������P�o�?u"sB�g��,m�����F��F��)5���+x{�#����z,^hDy���q����#�X��F�T���������������:�$����5��`[����vC����k�An��mX��0G`��btb�%�wj �Hq�d�@��#>K����R�fG��E5By�#A����_��?��
cs��8���a��_%����1���H������zC�bs�!�AJ��hI<�F����c%T2�e����{5������a_j��oYQ�����G5��� �X�z�0�7�x�c�_�S��:W,t`F#�z��'��#J�H,�=������
cY�p�������:v�&� t��\y>��e��"�M����z��=�S��Y�I��V��5�#pb�*��\#
���������0�q��J_����5�W\tI��*�{F�uU���u
�-q:�Y��Bl�B)%�c���jh�B=$����Xi������b��c�z�><��\�������:P8|n	f�=���>���l���c�Y�SD4$Ot��g��M��8��>�y1�X;���#�	{�j�G��a
�9oe������>�c
��EL9���mz��v�,�&2��g;�Q���Iq`cb|_�]'EZ\��������u��<|�X���D1�i+��~�s�u<�X�������:@�>#�	��uh������F�00q����Ni
����a�b�+C���E�F*��3�����8S�����l����F�~J*����4��IA��,�n���a��I�g��Q�1�``2�X��=�C(���'��m�G�4!m��U���6K�{�,��~�T!<rFBID31���+
-f3��[��L��D���[�6��$ei��suB�$�Nh��Ft(j�G6�: �����R���I92
%hC�M;k��<f��:�0"�4�p
�B�Q3hGf+d��pc(��$��L*�����T�!"��M����a��iA!t��u8��z$��K�B�1GS1`�L+�
�g,��I���~��)&���!�(���[u
)��A.{�q�T�����s����PC�Ta����'8S����,�c~�L?#S������*�R�@!:�1n����=�1����d��X���5
+d<9
&H`~|V�4�bV`����%:l�C)�s��U��#��
&���7�uj���^Zr�f�
c�
�/��7
)(R\� ����w�Gqb;zW�y�Z����`�o%������?��/0�C�3�9�S
�4�pvf#�
�!�1@��<Ax��^�s���[��]����;���Q�d��Ipt�4�gNh�����G��=�����i5](NSU3����T6������s+Q��a+��:Joe�$�}W�%���A�L�KsW h�����.��j��[�t����b���K ��lV�N�!���1�H��1���!�#�+R>�D��Q������6�zI	�,p�-�Oj���=i�����v�qfJ5�39M�Z�	U�g��_�S���y���[��7� W?�=����BH�Jz��$w�Aq�����O��{/l���A'����pM���m7�+Lks�H/l�+BR*��XX��2r�$��������D�����
�5W �a�qF�!tX��X/�&�*�!]:���'$L���/������V������T�@[�p2�	%xD��$A�knY	�0�_~�"�4�AYq^�[���Z�XX�2���HsJJV0��	z�$������*,�Xn��|�W��n���U�N/#GN�Ro��_|AY+���U�NOh&?Z�-���������D,����2B]�����t��4�{�h���Q��4���K���i����#g�v��R��t�uIRgY��O�����rq���n�{I�8w��'��6�3��vl��xR��}I��-)��6-;7�EX�?����	a1x���#:�������{�-����H�	�~�	ob+"��	�$l���Z�������3�\(�L���t�hx\���G	����a��]��}�o�z�5�1���'&�U�"�8I��c��!�����R���L	E�T��y����yX�����l��J� ���Q���"�/��O�qt���L�;'s�wV 	�����J 	7*�5C���AX�v�_D���X�)�I��W��XZ	�P�ac��e������]'j�,���'�������f6�"�i��Km9g��y�f�p*���;�C�\��'xX�<?1
�U%E�D�@T��@�Z�_\�6���/�������
���zY���^�}q�"1��E�pK�M%�(C��P�g_X��^aZ�*��3�����f�a�" ��Z���i�F7!��%�`+���������I�������=����r���O�A��`��q�������m�#�$�R�U*d\"&BJW����\ �Y@�U���z��8|B�C����6�};a[�� C�C��gF�`1i���������	mS����0��
��>��Q������h��T[��
��a =�l�~aL"���fZ���:p?Q��8r�J��w#���N�a������������I��(�;w�T���()�j�@��eo��l��=�/������ ;��������8v�8����`�e@�`
}GRW����;���3u�LF�q{��O��[
���f�3��Z)���m���Nl����h<�6� 5C�w�k�
��?���$�o�t�{��:��^��C\�!:g�!��[>�:�#C�mpAll�<W@����2$��F4�	:��Mr�\EZ�mD��;��RHk��r��@�k�y�7��j�?��#��%{,y���?�2,������`�P�nl�&��6��)6����v\`l��p����g��e���0����=&��.
��n�`�����[D��d��}�����r�*����I�����D�~<��Y��EGy�5�Z�l��
j�;N;N��{V:������T�����6���7�},�hT`��a��[T�Qw$�e%�AE�0��6� ��>�!U�wg2�`��(8�TJ���?����9B=1��u�r9c}� d�Rl��}�� v���P���$�c%�E*i(k�P���F���y��DMjY��-f�P�oA��=�obic�{}���g|��]|�H���%�Q\R���X|�o�7��I��71���e�����Wxl3P�,��7B0w���1(BM���m�����mc�� �e�mc"In6��D�F�NX��H��m	���mv�FxE����� ��A�����e����N�����U���7q���T*={���p�gP��m\��
G{�CZY�"LjY� ���������(r��7z��2_���S��x��0��q	�X���j	i���>q^�^Wq�����Oe�%b&�F��V�����+3�K�Nn�	�����'9����O
�[VMf�1��d�����T���(���3�
�i����|�g(OT�
�B��cd��;�>`�;6�����e���/`wD�����jeQ��Q'Y]�
��%V:d�?�2��=�G��cPc�v��\u�O� D&�j�cGN4w3�;�(��vJ����U4�D'T���W�U}��@�t�^�����	����U��8����}���M�k'p��J���OP	�>
C�q����)+-�Q	��dK�a��o�W�H��Ecj��xi-���`�'�����`����Dq��>*?�`�.c"pQ����VL�d�$s��N������|5H�]���,wE����
�w� zU�g��$����`y��)(:��?,mG���5x��P?������s����(k����k�`�r����>�*w:����!�8�����'Y�B�eU�`������5�H�����,�[?j!���p�UW��F�Z��Qs�$�AE�N�wb���|)O2 n�M�����z/9>�3����>�/n*�+N��:�/�A�8.P!f�B'����8����D0�������d>�e����'�L"�O��������0z[qe������<�93u�2��b�p����_����:b�e*��
qW��r,�/� R��ng] "6��N��92P/!0�����:32K������w��|!Y+iE�����"V:j���T~��Q���$�a�t�YT����Z�R;0��P���F��P�x�Xpv�+NZU�5��(��D'Q�����V4�����l��{"r�1:!�]�5A���M�=2FQ�]�z)��;%��,��_��Q�"����
f�tN���E��@s���1����'J��h�r�iIL�
�����>�X7-�����/�j(��*NYj���(0��_�\y�lFp�DC�tP����0!��������� ����d��`#�PK�R?R�Yy����{^% test_data/5_10^5_rows/4_many2many.sqlUT
�h`�h`�h`ux����K��:v^�����6P�%��iUN�@!�m�+A�*�i$8H��q�3�$�����jT��{R|%rr^��?��?���������������������o�=���������O����W������������������O���������������Y~����_~�����~������������������������?��O������_��������_��/��/��/���������{���_�����~��f�?�������������������������?����w�����oc���p�����~M�����7j9��������8��o��`������C{2����&��}������������T�^�����-|S����kO���f&bo��7������}~o��#�����.��~s���O��H��������N�Mg���{}?�{���U����A��
����1s�/��\���qB���M/��X��SZ����o�T?�r��<���oDX����I?Z��g����ZyS[Z^wa��;�.���}+�����	��q���gw�S��xR����y�i�x��=����m{3?t����v�`��/���h�p��yC���Kp�,>>W6b3���I���^��U^<�wq�}]9����<O3��`���^6c�����o?�G+K���J6����j�9Jn5>W�Kr�Y�Qu��-k�����|���g.��U~?Z~/a�ex���K1_W�*o��<b��x�g����rVx���[XI��l���xm\/���w�����������/�HxG�[+OH6�\qo��L<�/��b��oP-g���'z��V��0�'�wc&2��[gn���c��p�7�D+��������oOl�a�n�����	8)+	3y8T�m
xM��"��c=[<*�������k�K+������+f^��}���j)gs��D��n?�s@�@X��q���wc��w�	�W��	��o>�8)���C��%-�j58��3�����Y�� �h$!�3�[��_�
��L�F��:��{#6��p]��p&l��^���bV����������E#<e-N����L��L���^5����1�S8��,'|Z*%��l�&}��>E�M���s�������n�+�A#��v2�S>�1�-g2>��Z��:
�)t�8�#ITa%y":��I%�&��Ee
�M��8�w�F��]@��H��G�]�U��g�p���67�
x��c�kJ�>N��
���7�s�7����,1�&Lp������9G2�Y�l��y��v��\Ll=�iBjX4'Q���{�I�~a%��r^�S�"�$<1y�E��-f�23N�l�Y,�������<Z��Xlo��)~�X��S�K(������4��T�l���b��X,��3?A@s�4��wr'�P�c�9��k����sI����7�b%Qt��x�D\����<�)�
8��>�d��D�Xiw��"�UohO���^�~Su��������X�(�s�6�Kn���4���q�*4�Q�����3vRf&��x�5�Z���������jY��oV5�C�����x��/��_��$�9�`��>�l_��rW�R�r��!+K�������l���;���\�p$�n��8�������E5y$:m^�l�f�X��3�����ln������4.��n�r��s��*���+3	7���P�&�\������M�:{g����;ia�b�cZ��G���B	\��8��
+Y�M���j�8��
+I���� �1-2��������v�$�����i+]��4�����wq�"�Ng2�fx�P��/����O��bm�����h�������4	������4����5
+��s��	�+�P�3�[�s]����+iT��_����Zd��������bm�"]t�����?��`������h�����r�j7��+6op3u|����"{���@j�xy�#����8`��J�Olp�>fE���<�m��s��57�������f�����X,��M��b$��T�����%w�7�<lU���k�
Z���p����z9 ����y>�E*�/6e�p�~���w����Y����	pA��<���Mvr�J�%u�������y�9:��$IM�&d]���&l����0R�oC�����U@/�
�����z��yNF����ck����g�2����Wz��F��9U�>Y5�r����=�
�����t�����9A�r;��L��I�49`�^9.h�����c���!�������x��&#����`bv%�����4�2��k��wA7M	��<� d��&*�q��LW��R�
�6��R� ����y������\k-�jB�c����4H����6������"[� ���a�O����l&L<fh��z�P���P���)�!7������<��Clwa�P��j�L`z���i2c���<���V*���v��=H��T��������EWB���AZ]}��]UJ�<�����C�]�����@�������$% WS�6l���\c����g!��	*��&�)��R_y�:�a�����b�� W����O.Za��P���B���aRkC��\�<+�j�y%�\aT%O�q?H�l��fs��6�������r��V�sX"������AnZ��\D]������%C�`jZ��P�zw�a�TI��VB�yB��?Hu��FAD���(PP�\�<*����s��r<��Y�<-q�Lc�2����z�[���{���KH����l_R��R;e�u�Lx�bt�Ju�
se���wr %C�]{Z��M��jj� {������]�Ce
Bn*��R7��le���!�^�����������!�,y��
zu�[�=KKd�U��0Z/�f=����J���F��U��$�l������y��+�,����F�F���|�V��=U��h���Qub�{��T`���n��I�J��R}��Y�#g��q���9d+��,��+�J��'�����-F���3����<%bx��1�U������!��c��S���9���"������W��Y��w����6\H���7��K�uLy������z�2�����_�nx�z#�����^�����[e��!�w�%CY��B�Kd��F�L�Z���f���~N���z#&�(�6dW����x��t�w�����3�s$�g��DoM��0�gc��u����,����M�'"JV/J�d�4�8��`�LX}�����%C�=��\�m�)�(�.�DfL]\�nd}����
�����M���,2�z S�#���0 �r�tX�S�����!�	T�TY�q{c{�������j9�Z�W����R��+�)����B��8��
���@��!��u;mf!��T�<�lgF�����O�pEl�|C�a1��3H���N���!F\lV���4����.�<T�/�m����7�DEM]����D���*2B���ph��u���2��m*�~��l�j
G���MA�|�t~5���C��<�ql�����������rS���	��I�����!��J6�;���",��z�S��z�B����T�_H�4cR��C��/����o/>�S�����O����TMb����'�_�4������ljQ�f������*Z�p@������JW0Z�\a�&O�yB����)��T-<U&�~������i������V���T�&��$N����4�R�()T�@�UD���u�.
��ONk�z84u��v��������q�B6S�n
��x���7
��v�eAH�����,a�W����_���m��9_�w�.F�<��y��w�zN~���P�m�C)�����������P�E����pAv�4l�r+W/���[M����47�������U&b��I#@�S�n��a�xM�P����������iR5�@vS�9lNa��iI�}����UrV����9���r��A]2t�;:s��l�:�5b����������)��<����d9�iH�n�T.9�i�� ���*Y��Y#
���d3�a��	 w�?cS-g!����k�,�����@l��1�6�M<?\����T���>U5��F�r5���45$��)`����r/���HY�M����G���!������M{b�,�)�
��
��0����Wy���WdM�nR�f�Xiu3?t����~H3�!��.+���H�>d�${�n����;CT�YH�l����]u���d/4������6�����:�
��Y����sk�Q~}��=�kA��g!���k�WS�9���I��4�z��Y�yV�m�G��TyAn&3������"
�jMH�BE�m9��"�h"!��p^)GCw<	����j1������L��^?c"��N*!OW@���tA�m��g*v�'x��U�PC^&���G�h�j�(�ZpC���d+��ji:���o��&5������mx�C�6���v�>�cc�!�)�l���65��1Q�y�;�U�bQ�]R}���_�l�*r35d����R�Y��mE0O�nC�)6�lh��E����~�<M����zy���!����ME��&]�>�U��^�v�[P2��|=��H0!B{��P.L�^��aE.OE�Cne��5�u�iQ�rD�So��Mr+�i��[�F�*����S��[M7��!��-d3���T������!�g���������~���i&�}?#���_e@�$y���a�|C���l�G����� ���o��!/��CM7�S9�/�<+�uHCN����&�L��T�+���R'����V�M+*��*����'���XOR���F�r+kI� ����Q{���%Ry��.��<'���|�Nb�|��^��<D�(0[6dyk���+�
���)��j�AYR��<g����0����3���?H��wq������S_�~��f�v�E0+_�S�������y���/�+�rU����MS���f�����~w[I�P�+/�*p�>��Uv���A��U�+�	�����P����b�T	���uB�f����O��
���*�
y)wc?m�N��r�J������)C	������
�o�T�P������jz�!�?h}U�����K�f=O~�d��4�U_+���%�����*7�.�F�rU�7H�	���J��,���F���C�	�gC���@A}g:��j�]�6�UV\#��.���T�CH�S�I��g��R���*6�[}�F�S�B���:����$JT�O��B�U/"���Z�����aSE�Cn*��u���%�j��Y/a����.
y(�>dWe�H�����*� j���Q7��v���U&)UUq����%�������T	{�S9��������sQ']U�9d�t�
��R���N�gC��������}6�����V�����(�T�%���M�d�W���*�|��e>����l~���!2j��|��j���.nM4$z�Fp��~����Fg�n��Y�D�>���V2����VIu:
�b���C�]����<��M%�C��oF[��C����i{U}��S������<���!&��j[��Te�`���"f�������y����B??\����V�
R�k����N� E)t
�>O(�2t�^������[��n���:�A*irH�����R�r4�)��<����,�������z'�[2�����qr�h����vw�r��&O���}NF��h9��/������)���[6�T��d3n���<�]j4@^&���T����q��z�C��_H�Y�l_���A6s�6��Rm6T��W%�I�`�}����	-���A����6�@�GC��T���q�^�nQ�T�k�Jk	��`"�|%������l�jB�����h����������K��2E�g9�E�s3�����H��	��NaH�U��o�~��8`�RKB��c��G����g�^�
%TS����!{�Dj[���P����S8��� �&{����J������,y����"!����yZ�����w��J��rB�%&������A��Y�nRY�T�l�]�~���B���s���������.�_2��1��M�B.j)�f}���jz���4���]��.�6�'�u�}���5;[HU-9F[���PuC<dr��f}�?���d(y�m�T��c���;��j�F��T(�F���(<�:���W�<N(���F��DM��4v@��&Urb���{���� ����6!T2��y��B5�3`�
�����t	6H�
Y�*��&k�����~���L9��!�
��%��� R���P���������!U5)�r7��������Y9l�x�7B�<Z����T�l�u�����zY��PM�y�*z�e�=!�:l����F���1�$�yEB��^��r��}Z����k*� ��@�m���*+e;��(g��v�=�����!OG�U9j��
a[����64fU0���S�l�V5�\�[7��PeB��U����Z���U��<m}Z���3[;ew���&��Y}��n�j�c��w6�b�>
�RO-��jT[!��M�ME�B��
T�Yy�y�(�����wu�������,��?T��s�����]��d�kG�J�)�T����o~��gFWk���5�J'�����m��@^�|"�F���4+>d�V���%�nDQ WF�,k�n	�T��_R�r�T���PMh�z�,���V}Q�	���6�w`l����`%C���<�j�>i ����������|�f}B�+�:����e���V�K�#Y�&#0�iR��-@��J�E-�;���1l'�m������������j�w��&�/�qTDQSu�A���C����<�fQ�"U{�\���7�U�(k�l�}�6YHufx��s��~��L�\|Q1���:�aS%1Cv���ZHD&tS�	������]�-����G�tS����:�!�����������%��Q��\TA*���	�^�r�!U#�
��'�^?VDuS�@�T�]��P���i �XR�r��9����yB����K
���B^���ugv������B��k�3��)l���q�5�?Oh�0��_z�M-���a-�a��VH�9���6����dW]<��x�Pj)��P.� ������1�T��<��*p%C��!Rb>>�z�"J�F����B�����4�U�D�YT�yB�����T��Dc��`�e��-���� N]��� �y�(�n�8�vQ���J�DkvS%!w��6��R��h���������y���l��SI.�Il�-�	�9''6���(�n�'�*������BF!������T����u1=���")"$��9{���!U2$�����N����5[�wyQ����U�!U��s�[����:��.�ruy��������(����Q�u���:�����B��]��Y���\(nUh=^���e!����y%CINn����[C.*ErWM�(������&��M5/�Q��ZTX�V��!����y�3H�`2����!�5
�X�m�M�r�6�1�*�h�6�pA&��j��f����U^�[tj��7lCUW��m���]�d(�	����+vs���a�T?y[��\�����a�s��������5���l(�(�C��%HG��!y~�t����ur
-\�c����@ �9I@^��<lq�A�Z�_����T�6�eN�s�A�<LQ�x�i�x��xR�M\�(��'�bJ��hM��G{���R��r������@��A��HG��N[��|��r?y�{���*@�&+y*�t<gy{F�(2@�G�*Y�(�(��{�!S@3l�gK,lj�~~6+8��� �n�(�I!��f!�"�-���2�6�u%�.q��&
yN-���G���B�2�U��[�o��qZV+*��
�Y�B^e���.�<�T��Z�Ce���re�q8�5?��\k�"���[����e`7�	i�`��������M^�
�D� W#������4�<���m�|I}Q8P�_���KU2�Sm����9����
����.�<�qM�4��\�l��z���a�n1�5���������QkE�Om��xw�uW��8D4����R+"�F�u��7�9������= �r�t"��]D���F��z����PV����^���!����Hu�2�|dz���R����\��i��Uio[��j�$}F���n[�]&��J����t����6baf;GaY���[��y����V?�h�l*?�Q~^�yG@������y6�HC.��������qz|�v��W5��eg�!�h������C�j�y(�f��?�h��T���1��������s�����)R����^fH�-Y�hC��x��15�&���Z��V�o��_�-�6KHui=����<D*���R��r�1=1;��rh9S+�����g(C�w�K6�C���R��C�zuU��W�Ef�����kY��!��fig���t7�����]�t�A��\Ur�r��C���mw
����]���R��nov�<������*�6~��n��������vy#��/�l��Mb�J)R��v:�<?[64��8H�!����*�"%�c�>�N|W���'����"y<_IQ1���z�!Um�U�� ���N��y� �o��H�~���C^���<-:�r����*
��t�'b��d���z4@��l��1����D$�u�;'ue���rVsG�E-'��P���J�rW�T4������!�ZeB.�:�<Dt�$��9Hu9����<�DK�r���xG��u��\U�6U�"���iC����E����A�E�d��a��GA^���<-�T���I����n�A����F��5������
�����!�a�N�A��Y��~�6�-Bu��o����;k�hU(��
�\�+�����C*�U�]��aSeo�Y�A�Vk�(!��S<���1����m�p��oR%�C����X#�y�X����W��J�A�C3�Z�x�z"j�M}�'�m�B�\T����u���0Y��#��T�9�U��0jS=c!W�3�^�vw������X2����U���9[�h�EQ�9�'Zg���M������zJ�T���R�6�����c
W�]E�C�olTmJ�$���'	u�r]��l������+���H�� ����|�!w���n/R��s3���,�p�BM�������j��3��{b6|�V��&'���_U�R���fAA��^[���Qq�T�OC��(!uh	yNo�����B<��I���Iu���k�pl�K��^��	�����E���*G��)w�<-qm�"����
y�� ����D�z�.[M�en!�iD�����_��H�6M���r)����v#���p����Ms��<�hSX	Y�7�#sk�i����� M�r1�b���0��K���M>�a�*�����!\]�;��&ui����ZH%'9��?��uq!����m�	�*9��d/�r��~'X2�;m�9+�<�T����+������@���=?�y�k���,_���.y��TbF����n�Z�ZS9���f*O!��r�������H
�l]�����J�A��*�:m��C��m�c!�l��!/��r1A��*��!vY��n�T;!��&����n=b�s�L��~WA[%�����a��
j��S=[�=F�r�	zb�P���Jb!7��3Z��,�qv�FM�R	�B*�RN�my�bh71]�Y���[���W[dy�%Jz�;������ �T����)��i��~F[�CQ�4
��4%q��.W%�B����cc�F!���W}���f7���s������?.����
!�sq��;H�s�������)/e��o\����L#��~���)yJ�l�L9C�(1�4�Z}�V���/yW��orW��s������*J��rU���W��ma���y6��[���!���[A�N�Y=%H��`�lB���KB�j_H%�	9+=?\vm�������qw�x��!o�\�z��g�h���/�
_yM�*�2���U���N��yZ����iH��
�������>[��
�rD�E��@bR�������A�[K���CC�T����-k`����,[!W���\�G�M9�9M�|�y��v�eS2�l�[LRy*C�,�!���<=b�.�R	�B�*���������W��	�m�,�:l�O/e����M���H���%�J�� w1��u�z8U�/�������
�-_���4M����Y�,7%��U��	y�4d����fW)�N������o�C���\!�=2�J��*�Mu�%�'��TD?����r�m����d�72��J��N5-��X�<T5d=����~!g��*Yn����n
I�EE���/�T-��gY��G�s�,J��(l
��6;�����p���D)�5m�����2�!]����A����^������|�U0B���rxC.j�G.�����@��fy�C��H���/�F
���z=�
��Q+$dY	�G`�+�8��WrQ�$�0��[T-U���Y�����'zWx~����W2��W��U�e��C��65��;�fe(���B�*�rq���g%N�{6�2�O~�{�v���>-���Fj�E�#��� ����P��rU^�A�H�c�`h7R���ZO�F-����F�t�S�����jm
9�����DDJ��7�t!��G��/�����@�oHU*�2Zs�T��/~��N��d(���A�\_|8���R�}[E�)�s�$=?�e���%�URy��tk�����t6x����v�&�,���C��C!/�;�9�r�YTUk}��T�Y�y�qT�J���-�U?zDi�����k����gW���7�EU��		5-ibUN{�8�]��uSu~���D����+�,���B-9������t�<!�)L�l�k+��|�G��cW�����/�Y���J��r)��������KHu�� ��@�]�HH��y���1Z5-�=A���L��&���MH��������������t?�������4J�!�gs�~���<��JJ��F���TGF[���Gw��j^��}I�Y�TyD�0��B���Y\��q�T�i���!��������
�_$���A.�h��������(�l��u,��:4C����V��:��a�A�."�r�����5B�
@U�4LZ��B�3�{�w�|A��c �x
�ZnC�N4���4;	��Op��a���O�K��|���*��T���Y
ru�^�%MTz�P���G�q7zE��	�B��>�,��p�L�B�W}<��Q����*�����1@.���'�&�i�<���rnb(�j_
yL'����ScRb���T����j�Y��J*w�i���L��!U��*�6M l�4�j�����GzsW�rHu��f����gz��e �������s�m���������#F��,y���i�I!�����C�v�h��u;"�&�i�=�Ws�Q��MFrQ>��5U_��B�cG{�-a�~�[i�*��T��%����PU�
��\���h��b*�hM��Y����k��l+����l(���4�1�\?tMM�h*����=z��}�%C�St���@n&�9���g%���A��om���k�Se�����7!M��PQ��j�\��R�	V#�
y��\wDM���������GzV�q�j Ms�,���+7�����]E�Tq&F�������;���5�(_������56�����H�A��%dSg��K�!�H
�����A�R�C��m���RU�B���h������Fjr�N;���=A�*{��
��M5�(�Y�W�.�}�e ����������T���Y>a!6��XY����u��4n�k=��?dS���*�C�Hl�O�!�f%��X0&�a"d���=b�����!���Xu
�=6�����f�8��-;k-��Jc�T2"�������X�g�T!���gC�Nj�.�BM�>$Q��g��G}s7R�?�z���Q�J��
P���`����}a����	�]�8��T�(d=������d�zU�!�]y�V���PzS!y����#g��Z����S�tG��J�r�B|���gF��P����Z�Cn��r�u�yZ��Q�E�A����������4%
R���o�"�N�������a�7w�(u�_.[�*2Cd�,��GCs7Z��s��J�Z��C���2!7�^�t��]�B��yV���OH�3=l�\tG���v/���~yR�C�������r�)Z�rc���e6?W����@�f�1�z!���(��P�J���C���J�w�]/���vdH����������\�I�Hh���%C�
�gB���y�� ���mY�y���V?t��*�����	����N����_6��,�[��Tw���2�n�X^o�4�Ha��"�jA	yNi��!.6�Ry��2�>�B�kr�x�����_�E���o�rH��y��&�Yo����n�B!�gr�x�J�_??\|"��5��
y��������T�<-P�#�&�:M`S9!�KV�.����
���2��=h�(��"3��AN��gCq�����y������h��)E�SUR`S�&�Y^��������g�4E�]�9�h�r��W�`E�]��C*gw�UZ�,�����+*��
���N���K�vkT4�Rp�����T�\�������UV
R�[�~wd���]�dY�|?��0{h���-U��8�$�����r��s!�u��[�>�=B��
�C��P���F�r��:E/tW�!�)R�lh��������!��_��J���e��R���f�	�����H<���yR��+�%V%[��RF�C���bC�*R��j��B��l��yf�ChTD7U�� �J���)���BC����f}5��le'wj����V��J������Dr�������^J-r���$�uYE:tF��6�������4��M��1TF����P�����s��I��r5����I���������yZ6�G~�Q��B���������I/�B�b�\�'��I7�qN�ED��.�����T
�c����\M�r.\x���D���1�)-9�X�GhE��~��QH���������7t����]�����m��j�,"�i�0@�$<���������)��,W���<Lm4�jy �*��!n���4�'���������pM��B���a��mA���a������!�[����b���B���
d�����)������~��� �E9�=\�.F�R0A����*���z��J�NydS������x���T}r��.����@�r��@%R�p�D���A��R��rU����6��>?[�)���C�ou�j���]Az�>+��L��R)��5fG�qJ>�w:�%C]��C��"R�f�Zwy���m�J����Qy�K��/j�G�Q��W$����M*�^t�O���4�����b�w�o���$x4I��H/B��~rnx�"e=!�W��jy��1d�L�@��F@�EKUR]�>le�e:zW��x�y>����T�o���s��T�Ry���W��eh���UO���R4q���l��z�#J}��ru�a�*�
��l���2rl�K��R}7�4�G;ony|~����\���rf�����[Y���6�����sx��P�{SF	�U~�q���oB�5������K������
m6)rSGRl���F|]j6zrU�u�7����`����a� �r��9�F����r�V����JKB�/!���!�� �����PvB�
y���A�YY��>P24C����T����*TZ�jIh�>�Ql<T�6����������DZ_rU~=�Uo(������h=F����/Y���@&R���T8�zp�D3�����w}�L��_	U>0���r����C<������C�����/rU5���C���;T�����d3���*�c�lC����}�O$�T�c�9��l(�J������y����)��$��P�k�9��=�G����
������W��(�@�[�!�>����������3-���]6b{��lE�O�_aS�m*�y~��fFrQ�~H�H�My�XM��QAH�CP�f��:�����$�y���
�TN;�*�A�O���,�i�s�{�����Bi������C�UB���P�3/�wS����f���s]������%�����=!�BZG�3���������~����r�����U�m[��!�n�����9��.���7=��A6T�Z��Tm
tj�=��.��h���1t������F�Rg��k��%�n������*���b�Y�!$���N�:;l����j�l���y�������J�V����;�ME	��!��������P�l�S��y�r<	:�Cj�,�z�\����l��WCIn������W�}C�����*o	RU+��:����<Z���w������Z�sjVg���[�/��b��,Gk�0*}��*DPUi0Z%?r}��x����+�D���D����AnnW�6H����4��Y��x�F#dW��KY%����a�� w�o�MUQu�^+��p]����<���t�����p5�\��~�]jqB��d�T�TP�m�7e� {Y�����|}m�P<���?Q�!/���s���l�!.������4��Y�d@vs<�l��r1":�k�6�3J}���!�2;l�e���U^;y�/�>�`w�z~�fVH�l����*y�`�6�=O'a5�v����Id��jZx1!��X�yB����<!/s��T7@n�����6�R2�l����sO�M����U�1��t���S���y��-:���i�!s���f}���������R��9�-TA�����,NtMT
r����j�^no�z~�x`�G	r�Qz6��{�!�������������e<g9,r��h�!w�*?l��	�e��<?\���b5�!�{[�g���s�Ur+�~�( �F�rN�>�%5�,}�T�[�^���14�����E�\���s9��(�R�������;M(j�&�	���4��|-��r���B�u������%%;Q0*�������>3�+;�Y	�L_���~f���z!M�2��6(TUl�*K���<M�R%��M[�����"�^Kny4d�8�D��(Bnj�9�-�Iu���O��By?]�t1���k���
9w}T��~��h_���l���M�$�I��Wu>?[������\�yiy�����
�T�r�nR��[Y����Kh@N1�gC�Ii���Zf�4
}�f�6�!C����Ux`�K��(����fi���er�����=����D�uB*
�a�Z,������q%��Ew���O��L�iQ6'�y��Mrm:����W8;����\U�b�w�������i~��u���l��
��� �L�6UT
�D7��]���f�W��J��A*�5dW
��JB������c
Hue� �a���m��.��H�:�A�$���K���.�(}�����j*R������Td�5���/J��)ubi��!�mO��Vu������N{�����0��]������/\9���WX1rQ�l��E�����]�:ee��S����d�S,�����I�E��:���l��r�*��N�+�H	�xq�=Q����u>�J�+�.jo��9;j\j�,%dW[%��R�U�&���m+���J"��vVl���m9��	f�/'�en��M�����M���e:��J�
rQ9����z8�;���������SHW����-�[;��y-�����B��;�T�JH����.��|.�;
9k!>�O��>����H����rWq����9��F'e�u/�Ou��z����x�����w{�b�P�Fm�}�)�P'��^�9[�}�z����^s���(w�F�rU!����u�\i����*J:TQ�D\U�rS��TUM6��YT�}8U��F�
��Q������<���D��*zv�1k6�����`��vp���:�B^�����!�z�v�_]S,��nZ��-jZ6[z�h���Cs�,(!�j�B!W��h�����s�����|�����{[���o��\q]�=��V��	�{ldy!/UPrNo=�����M��C.e����rq�C�V�d(���n�����3������uF#��O�%7�J�V�=�t{]�s(��/R���T��
����yZ��(�}�eDQ�u�k!��<2��$R���4��Gk��>H�:lNr���mE�E�1C�����U����^�*���'E�v��Ts�<-$x��)��T
PO�}��v�]�Z2tZ-r�#�+���E�&a�>_6�rV����:��U��%b��
�"��V���O�<�x'*brQ�(��L'�Uy�k�����e%�3"��*(��MQ�DJ����p���@������-����!7U����u~b��$��/�+��Ny\�
\���Ur��K�WJ5�^�P[r�<���}���Q>OK\)��p��{'������-��� �����qHW2Y�����i�|�!�[}��H�^�Nr�<�J.����5{"��<����b��[��\LR��(�A�a��iI���& �s���&��i\5H��	��������&1�<�s�y�6������j�v���� ���+b��c�����:-��C���$i�+�!��>��l����r/w�\���:���B��f�M��@��V��c�yB�-��-�n�P��prVpz~�U��!w��a���Emt�*�IYF���B����!U��Z�j�Z�mW_}-����[>~]��T���s����l�&P�D"i:� ���C�S��yZ�F
���+�	>��������������	��m;��er-�^����:H�	�����.�F��)d7I?HU��� ����}q���|q&B���[!WS;H�l[�if9�y�g���H��
�z
i������v�z��<	�J�Bj`�����z� 2�����������p�,gX�H�^�I~�T��H����;1e��R�*Y�0�"z��Hu'������Z9W$C/#p
������r)_puE��R�R��A��>�V��"Sz�P� ���q��g��*�v-L��?�H�^&���_|�7A�F�R�n!g7�yB�~���t�M$rMQ���v����>N���<LI�\fT%��*���.��[�5�6����d�����k�#��Ev��~��x���r5]W�Tq�
k�����SJaC��Tr3��c���(�h�^F��c:��*�i:��s��4���
�v��"c��.�P%];dS?EC��!�mW��/�*�|"n�M\�4Eq��Hh�7��o6��P�y�6%h��IQ�>�[����'�UU|�l���B�H�;&�F����Bn*������:�w}9��r��_�%���6l��J����[g�yZ�Q�\����']��j�TK�+��+���:����W�n/�
�U�Y^U��Q�3_(d�
�����
u]���J�B�j�
���:��Tb=��i'���E^�2c��,�yEv�2�������:������,�xE�V]�	9W�T�����!rU��B�;��*��t!��W�k�b�+���Q��T���<U��e���S��>�Kv�A�FJ�PQg�z�s�c/#�;H5-��X��JL����^��������Kw�52�s��,q��-0D\W�C���N<��l�.Z����3d�q�uK��@�WR<1��:�<T�v���?�������:�5��G}) 2�Q����Sl*�TEc!��Q^]�`���j�C6#�n��t)���[�/�c���m=uI�K���y5Df=9y+3�\��<-��M�;��������]�C���V���i��\T~��
�*YO4���BV����8Q�t^�B������F/rw_�.o$6U=�Ai�z+�e��'���f�C�j��s����;���!��j��Z��y����pd����������N�er��>>\�M/���t%�
e�V?�P75sq�;i����]���Y���.���@!����.�QT���-F����Fk�2b�����T9�A�W�w��&>PVc���z������AkT� ���!j6���vq����!�tp�t�#�z
4���JS��-��c�z�O����
ZrS
J��}�6�=NK�F/u�FUr�:.��yPbUA���.�<��]Ap�P�����gC��@/TiF@N����b����0"`f1�$�!����M����*���GAqP)�WEIs��Y��k�~��H��Z:����gC���E�������E�P��T���.V��^��R�B��S��������j��=L���U���X-�O���1�*V�1k��u�z'P^&�b���2�n���t3�4?#6�@M�h�e��?��U�&�"6�A�����r��������7C}�=W��N��6��t�����d�~P����Y:�*����&�5��\N���;�t?DD�Y�C4�@��<�X}�� �n��?�	�T��;PU�6Po�\����'���&n�q�z�e���b�n
�b������{��G�)B�<9>�	�VU��4��=�����c�v���#����/����uK�P&�7�n���MI�@g�O�;cTo�{�,���=��	(���@Owdc�&m7��M���O��#�����@W�/��
�;�{�m��0��3��w�/�.��)��R���D-�����{����YUF���:u�=?��&o����RP�7����vN7�Z����{\��%����0J�#x;��C�v�4�_8�+��L�a�����}U��
��u��������N��k���?��%h�5�������%���g�TT�������v��a�f$��Y6�����S��]���(�{����%��6S>P�\�c�4 
��_X��n�B��H�������S@1��c���@��,����C?�=!��j����l��ns�y��@g�����f�+��U��Iv���,v?�z'P�aRq���`�K���|��,�u�m�us	2�y��p�i������z�N���D�O�ojt�/@To��H�`�GD�4j
�ML�/�k��f��z��ox�.��Qa��S�;]����7n��\��2�xz�S�y���~�DW���:-��n����#��F���Q���i��4�i?�i��k�a~�r��������-l]f������1!���B6��m�n��|9����E�o��|HL�	�B�u�����+pD��������$��v/�k���xF�g���TuD��X�i��������p�tX�6Z�����r���������}:�>��l�F�v�2�t�,�0L�L�$7���x���\yXW�U^�������e����e@���@������
[�����awW5tse�A���a�@��>��dtq���:�O|&���u;wC�����]�M�}Z|?�b�3��?lY������\04���Y]����.�����S�������������/������sG%��5��]��.wmn�����ag��2��8D�l��e�V�� ���{����*�������>l�!����n���`�%�]��a��vk�^{�����p�����`]��|u�Z"�/zEn�2�,�U�U�
}Qf�������n���;U��al�FNu��+	�\�������l�.�p�������M��K���lQ9�r=�aO*���jTO����x��?y�S�a���IX����*�����a�P�@��2�ng��[7�]�������8����&p��=CnrR��"�~�E�2���G���F���n�T�=��3x4.��;��[='��	O�!��n��(�m����U�:���>L�����_����3��Sr���H������T~P��3b����"���'N������t����~�����2:A�V�>�������~��w��9_�_9L�|
*���.�w�������sw�>�����{<0�G
���C��bY.�~wT��u��|�W�>�R<Z?�!���L�7v�w.p�X�����~�~����`����75�h�����{<7���/)�n��tI�)�G�_8���QJls�}�u+�@���}��MO����0���N4�V����G�M���/��.�(W+v������d���;-�N-5&'����nr�T�h�K��L/�(�HVf-/|!79���b����Qn�S�C��E���.�����5��|Qzy����?�7�� ����{-pA�zQ2���#m*z�_t���09��������[h)��X�A�*�r���,1/J:v�����Yg@�F��q��������n��T	�@U�x��f�u/B{u�_Pb^����������3L�r��{snE����V������C���K������x����-o��z��`����]a�S�>���I�Ei���=���s@�������
�S������)f��~0]�a^���`��p�������_q���8$��	�Te2���VU��x����S8�2�Q/S\�Cv��,C]�}�1�rG�W�ebA�xqNHX�X3H��������Tj�VX��'4������VU�
h�������P%��a��+���	Ec�T��n�r�2���g�v����*LUo���	C��7�-�(/�K
{L�l�V�OmaU�����UUiz�k�d��J����$*�	z8Oom�\:�{��Ua{*�QP�+:_@��	��T�i�^�z�%�d�>L��U��UYh�O����	��<�>L��|K��s/]Rr�����E~�����9����v��&�O	2��wF]X5��n.�4����s�d~a��a�
7������]\�V����j;����ye��u����E)��6��z���~���H��<���)tU�4u�Q�~]��g��"� ���KXW�z�8�����s%��Jl	���` ����q��M��-<�~;G��hW���� ��^�����yE�wQ������b�-�A/����8w!�k�I��F/� bu*���8a�x8Dw����FK��E���8a��
{�({P�K���r)XX��:_�`�z�n�Y}�����9?:���/�v��j]�jA�xq����6z����n���]+�Y�vA�xQ5��u�F�zu�Md�:�^�gP'^T3���a���[�U��4����)/n�a��!��-�H+#C}�k*���
9��h{�'C�Y����AO���X���"]�BpZ���	�	���n
z�|�+�e���e,�0/.�����4�M��k����tE�Z�YP�^\�S���MY�[N�E�B���4�}������K����o/Z�^�����=���Ky,�r/���S�b��wS:����mf]l%��ghN/._�RR_�z@���A�����=KH�l-w,et�/�mz�><!��c�u�aH73���a$�m	�]�p���XF����)��\(%�
{�F���T_�a��$J�R}���K`����:{19x3�Z�����K��E���6��B������N����5�$���{8-���AgW���C��v�sj�{������������y�z�9����hz�(V���/������cA�|�O����VF�pV�����N�k���)���C�����%�%�h�����n�t�F���|!'���;�#A.��TF�x�"����L��Fn�Si���)
�&����z�����+��o��]r��[���5��m���`_H.��z�U�#�(qX�9�_�h��\��������P%9G`��Z��f>���q�^'���W}��-eaW�;a��n�@
�l�B��E����"�yak?�����D�@���B��W���f��������07l�J�v�.�Ks�qWvYFg�������Z����;�;1�����V5��<f�:��|���j���_��vp��F�h��()��S���7tu�/���@_���`^\Z��E%e�@I��+b����1����V��e*4��<|P�������$��*����;U�|��?���a]��h�#��]e��ba�%E4zq����Q������j�W�J����H�J
G���a���"=���Eu7���|s�	�X �������a���_��y�C��mr��0J��U�R9@�z}��d��2?��
��+[�?�Ea5[	����V��W%�{�b�u�(�����9=]Fg����O��5`�`��<�S�������"�<G�j��;�2z�>�a��V�������������4��A�*�-VhJ���+*����#������:���wex��'t?>������5������z��������|�k ����/{�VU�����H?�n3�B�cE�yu��B����Sq��a����`U�M1���yS����9�A�����������.!/Um	��|A#>����`��@�yUqR�S5'
�^�����z�aO��:���9_���H"�Jv�^{��:����aW��������+Fa����:��]�BA�7�����B�2��s=��a��)ic�KU���[�A�J���z�i��-��moo�*�:7���S�A�q�u$p���m����(@O�	Z/�X�S^UnvwA�������1�)��arp�T�?�*�K^�l(�J�vW�-��$]A�W�h"���5S����7�F�cr���lZ�rG���T���	q�T�vS}��]��
�n��a�"��7o��j��=U�
����������)��ar��B3��������������07��.��qc�[�P<�Vw�c�A�s������2��)�P�c�/B{�?���f���t�L��o��M5��v��w}����&w�xQr�:�.�/�/��W��W%W
���)�U)�VI�TUP���V��}��?���W��]=1���]U���Z��\��5����?�d�a/�Z�Jw����feA�z�����|�����] kG�y��P�098C�7�m��t�R1P'2��^���U26�1w+�n�=d���[$��l��W%;
�2�
�A]�
��Z@���+Z��:AX��z��Vd�W�������U�
q��{�@w��G!�E��������w-�Qw;hwd�����W]z|E\�{:=~�	{�:��:X������7s�YMj�������[��lE�zU2��K� �����n��DS_L��Q�m�����<�\3ZFW���&"�0�R��Yi4��K��7��]y4V���+��7Ln��R:��n^w+z�BxE|���f+m�w	���?v���s�f=\�*�rw=�;&���9:���)��WW�>���O�Yw��O/��'�et�E��5��.�T&�Z��cEJ|uGx���15�S[������b�F��]�;w�}����a]�R���JS��g�9��aV�����w�����
HlN�����rg��NW�T�>��u���]������r����Q&T�����a�D�)9s-R=�� ���<���&eT�m/��!_����;s�S���?���a_�1��^]1X�jc�E�)���>�a5��!^_���^]%��t`�`��Ve�W���x��W��\X���7��m�����afp\/��V;����0L6j��
+K��pC�^]�)���k��N���Izx@���Vf�:(�/����-�k�u>�to���V���������������QX�3�6���L}�@�{U������
:��]���'�
����"reT� $�BI���+��n��`�BIz�n�U h���������n��	z��I�n
��85���<��t�~R0r%=t�y�eq?L+��j���Y�XP��~�8`������9���2���(��^�a�}]�������{�O9hsk��%o�����L_]L5���A�+p�^��#^>7��l��rQ������r
aO]E���@]���%������9�r(����p�\�,������!��
��0��x��i��t��a�7?!.��H��nJ]]T�xX�������������m*��`���������w���bx��e���pC|�����=�;:���������#�������z�A/�(������*C�=�j���m���,�\2���*��& ����������N�`k��{.n8u�^Z�TC�������:�r�a^��,�����f��6��y���CtFE/`g����?C�F��U:f���a�U��_.�1�}����*�`uHm*\
:7�xB�>uL�=T���dAg�O�������;t������q������0�x�K
v���`�}^�la����h�~�*[:��V\�F�����x�	Z��ohz�h:���=Ti�)��N�����\��2X��7HUWz����oL-��
j&/J%�`��T)
��'A=y��J6��777���e<�|�c��V�������(�oJ���m�S%I��_��x�T�v��2*}��s���'��U�f���'�!���FQX'������y��_SU��n�+(7$���Eo�y��+��
1�M�H������_���J�@��+�7%e���9P��d�����k�6��7�	&�$���.k�<L��&��-$�U����[�7�lC�[���v�ym�J�7��]��v/�����J���F�m�7;o�h�C������3��"��T�ky�;f��������(��� ����Q�Q�*��J�Z�G�P~���3lS
���� �9*��	����3�Q��bC�yS������QRV�
�����oq�09l|J�v������`/w�Ue2����	�3���T�"U��������"����3���mT�(a~qLB�ys4�]�	���d�wf���*���7���K�����t������OjC�wS����������D�#��;�����P�����A��Y���Nuh��3�z]u�PV
�&�	���x4JD	��B���C8�	�����Q'�<����D�vn�����h������pu����et�.�N���8:�&��<���u����{s2bW��:�{H�nJvW�Wu�b�����..P����?�+��;�I�_?~�����],)�\W�a�x4�����}��8'3h����'��-�-	{N
�l�!���N������B�4��zK�n/b��p.�O��R�Y_ljH�n�Q;���hW}~���rP�]]�5���)(�� �N���"������55St��� �\�"�k�
*���n����l����]q���_C�t���;��
����vae�=���k(��*�!�����R���l���a�����n��!lw�vP��:����7%h�n.�zP/�I�]������p�vwY�[l�.�pa DV������.q�4���@�uS�
�����.����7��h�B�&WRB�J�>�����uY��~���1�����Y���a����������Cf��A]0��Zg�:=��� ����XW4����/{!��`�anp�\��J�	t~]?wF	���pW��	������	�g\S��*j1+��\=���O:_�a^���6�r������;��O��Z�^r��sO����~W	�arp�\<�$����Dw\+V��4��"X�|�����BJL���<�;������N.t�[�~^�e���\L�s��>�Bhu��/�B���
��w@-���Pwur�w
-~�V�(VG���*��N���ei���������]0*����a�x`J��E����:]�Y���.SL��0�,\�����_���I��������..�������}����j��0�;���
�_4!\��#�E���U����7�>j��6�����������&R�V�<m�j���5[\�k��aV��*k��o��~
RC}��T8�����~��a���T)���$�6��V�'����PZmjc�U�M�V��4�V�*���O���":c�*U9\w�B�Nv�����[n%M��+��=�Z
�����U���z�^C.��������Nx�*���4DZ��4��h�m��6%�
;���Qw��^�wl��6�z�u���Nt�`���!���_�N��
6�:�
���	�a��
������J"��k�i���m���D�RU�s<l=���Z������lPw��Zo�lH����l�����F��^�
k�.��PmJ�
���	��P"�,�TF�P����'L���6����P��5��Y�u������[m�
�R5#U�j��[{�Z��j��6�f�}!���.�o���Z�������5�K����:}nP����i�d���Z�{�k�R�������0#v����;0��kw
�M)����!�����`Ur�t�/Pw�	��L�s`]Dy=��6�0L|7���}�~B/U�J�Ku�uP���\$hq�D�����B�e�R�a�j]��������J��u���^�iu������[�J�v��*��-��;��>L��j��u�����2��V��#XUg	z9!���3�2u�M����`�����Pw��x�������\����g]��g�����q*C4��F��'�1q����%?fU{���uW���������\*�|ax���?x5��(���������f*
V����[�����7�+4���[�%����U=_�0�;�N�~l��)5�]�����w#��)���s���b�������$agQ�:�������	)d~���D�V�6����	$Yr��>< ��j�s�����A�x���\!FX�KY���
�\w�D=W��~'hW����m���?
���Tf�@����0L�
�%����|�9Q�~���j���`�"�&m���;���'���D{�~E��9�^.��Xtw_�� E�T����^<�U���/��h�6W�v�;HtJ��_�E������a�����eX�*>><!>�|�R���~��e�����]��<5�;���]�/{1+hwqA�E����m��+�L��E��_�����@�DtQ	n�S
+S�A���
��&m%�1�~��k�$R`_��7�o����J��}�EA��������Q�m�#���������iK���l|.X��^�SF/WT0�o��"���S��p��A���A]������'��lsu���\OP�h9��X,����&k�V+�z�3�As����N��������=���CA_(�7�d��|>Iq??[�Z.vo�����{)��6dw-)W�h��2��E��&����f8P��u���������~a��#������c�NZP&�Q��I�L]�l�����A��}����^F/�F���uc}�W�~��S�������!����|���z�@_$%��m��7XK���|%�+�:��})Z�w���)P	���5�s�kg>�E�=!w.�7��K@�@�������MXw�:���a�84�%
�n���R�
!��
��u/�+#
z�y�_����k��sa�KE?���p��us�y����@�xO'H�4�PMAt��� �K3u7��u��6�d]�`��>�:������%��oe.���
��R���mS"����#�<U���T��c���/�b&a�d(�,c�a�8%.p����+@t������Z��n����5S��|=�*�������]d�����r��BWv�pu)A�*�7wN{�0;��S��a������l�[��B����a.'�:"�]9��N���ly����z5[i�Q??hW�
�/:~:��]}��NS��c�:�v<����ar6&�=�f��=Ug[R��-��L�U�����5�3���g����/J8:J����)��:}xP����k�t���J�v���n�0��a���m��0��UD:��]~��l���0F���h���P��~�Hw�0X��}��QCv�;XW�����b:���������>Uo}���t�a�~h��E�Q���{���!��d�T�tw�s���wF �]�*��]E@_��u$��������
Pnrh���t8�4�+��4VZ���\r���j�.��r���[�w�t����*)���#V�P���.\����J$vuN&f'���7���N{tsnFPWy7�z��|���#%'g�)J�`
?J�w��wH��	��.A�z�EGow����J�K���
ma��.A��l�����)�?�m������B0�k_=�i�.(�z7jH��W�(%.+�	+�5��D�F�T��s�I�������m=U�@]�.������0�x�*3��o���!w���������7��>��/rs()w��+�3��UAI����\u�fwg�`���[xoJ�U����a�8R�j����	�+�Y����S�3�R�a���@]X2��4�Pv�lX�r3��Q���:{�������|�N{��U�q�#���G`�Y=cU�<��[�;���~�V��A(u51Ag)����J!�.I��A6������0�7-��
a������[�+�	+����;Kb�E�Z���c�e!���RJ�K5R����;�4n<p����!��;��}�RE5�+�\���K�K4��9������@]�����O���v����5-5)�1�y�}���%Z��
�z)A7����xth]����A��,#���w�������0Lvj�V��XsP�%�_8[(������~u/i������Etwz���S�Dwa�t�$����]]z	�/&�x%DM��Mu����Xm�A/�( [-���vwl
�N�!����Q���L����	[m�:
)��o:)�0,��]��Vi��:Qi��EY "��kQ�E�N}%E����p�����D���w��������z4���<6�o]���)�a��B�Nvow�eTVv��J~����%���cT��A��?<���P�BaWw$A%����&�\����F)����.l����OX��z���s	��'�����K��]�5�K��c���V���%�,B^F�T� 0<���l��UP�n�6��:������F�X-���-Cu�/�:�n�
��
������P�A4�.ui�m<M�h�@_�����s��[�.��]���4#�K�t�s��=��}c��o��u�AW����g��v�Q+k�@��|�n^�p)���������JC-�aW����S���������T-�an�g\H�������{���`���?�b�va��N�
T�xXu��bP(��/��h�v���d�@����:�z|xB��
��(�E�V�r����2*���[����&��tn"������8g�;W�l%�����/�;���+,�,-WF����u�������F/j4�����[��mw-!awW�t���a�8�*[w�D���������lm�r?D/N���v�a^�h�� ��v%�
�����������6���k���"j^_������ug����A�0L6'F�zAed�t1~�C���5�]=���GPU!�"���Z�����av4Gw�7�^J���U�;Z��G��
��{������l���'�����������t����-��J���������)l��r����[�n���`�:eG��5h��*�:�>�d�n�?m�s�}1��t���~
���AO������;���J��:m%P���kS>< �������)����|&��
���h�����*��*��x��;���
�5[�\��	�z�@�b�O�s�"`�s���-vx�u�3�����k���%�*���-���a�~���0��2T���!��=�n?P�����v4-wwf
���*�&�5��_WHU��C\���	;��j�	�����%�����g��oG�r�����W�|�%�o��_���K��5[���tR������GN�M�f�
$-��&��b��s�����)Q���s'G�E/����}���#L��0�\�XF�����qXu������������vU�&�5V���xR9_������W���@�o���e���p���&��������0q��*%��TS@e�d�-�x~B�0w���u����;,n���O�N�y���0���.��T�CFS��u��U�zX��*������oO�`WS��a�+f?��us�����U��r{2�.:��|�W�>�0��]��[xB.���oI�9�P�E=�F7ou��Q�Zc�����i�+Q�q��&W��-8V��;����09�B.`v�=�B�swS�]rz��1b�� �Y��`G�sw�Q$8UQh���?����q�nJ4	���Q�T��UU����c�pK��7����AW�. ���� �b^q��4l{�D�sWJ����c�:O1�&��~wn�k��(���G`]�:�`}&���T�=\N�Sw������nN��&�%��M���>��r��	`e%j��~���-Q�v��(��9�AW�Nz��V_�����J]V5"B���F����`Wu+>#����oH�����S����k?�����Qm���s�W�_�����;g��������RNa�����{�&���?@pT���~�iMg���|dNw%N�:^���$�v���S�������3��:��$��[��H�d�������6��]�|Sn��L�\d0#*���u�AVU;:����Y-��h�����C?����x��w�U���!7�lY4N�"��>~F=�@A�*}��*y(��]}��5�yBl�����]�6��&q�\�Q�����o*"�Nx�QJ:��I���dT���w�u�tsVTmV��u�����U��s�v��U��u]�a_��1�s�"@�Lb&���]Q�]rc����uh�����*"�FW�����Zy�E��e�1�s�!^���o��Q)���dh]�b�W^���@[]�I�t�L�t��z���o�k���&�w&�][�<���c���h�V��7��BW�U���V�0l^��"�Z]~�� ��<ju�Q��q����0�-���OZ-WDd����d�?�V%�
{�����B�&��2��|i�U�m���>�@/g��zt��1���pN�����&��MuT��Dn�+Wtm���&g�s�tz��_��:s�n]��]��k~Y�N�:<a��#P�������?���x��bl�k�6E���b�7"*�2���:{F�/��s?z?�����V��C+gtJ�4��l�����`h����:�j'X4��d�N��	+M�9���	��v��S(mN��;�&��@~�8�Q.��[�d���h�������rcE�� ��\�2�S+���p3ML�d�����N������nU���2i`hq{��i��	1.�S4XY/��z����,6�m�z}���4�W�4z����-,�)	���f�����
i����'k6�_�����:3G]
6kSX�;�UIz��&����<����!Rw��

�������:�@Wc3��i��gI�j����2`�*����$�*���n�	g��g�Y�����%
��|��6����v(�k�J����a�3K��fq�&VA^X����/T}T<nNX��u��i�8;m/�KY%�*W�)�5�}�6h8���Rc{)��9��+}�%qNX��A�`�f]1���S���}]�E��r��y�YC��)��K7u�@oU�<Q���n
���6�`�V�Z���&���D�X@�|��b�k
�d�@]"���WA�I�����b��p0l>���W�TTV��B���:�kg:2��6�T��=Y.�"��^uSz������a���
����8`�,:�M)G�:Q!P'�1GuN�9a���+�d���3*��I���W��41�M��M����`�z�4�z��>�L��ss6��qv���]��3�8a�,����p�;Wp��*�U�t��<!���e�u��9��K�Y��B���6T����v�$��;O����I���H�m���u�$eU�T�H���5�uW�@����YU�[��7zo��6%��T�-�S�}����	9��������m�/X�a�4i��%���5�}�;��_z��ir�:����$���hM���miq1�'�7�s�,#���� ���mS2����	��V�����������twaog<�� ���<!�����7�)�kIU�
)�z�2B�w�����%�s�>t�T�8�u��.Yl�U��r.�`�u>H��3u9Fu&���l��M�����>�uU�i�Rd�$�W:vK�3Ml>U|	{9_G�kyLU�i�2���������j`��zh;u�)a���6b�����~�Y�+:�MU������mnw	vUG����u�.���H$z�M)��v��������2��tm�b�*;�F_�n��i ]#��$��}���-�*l���Z	�����@G��JC��)��GI����������&������d�^�s�o���V��}�1�"��'��DSt7�Bt���O��j����4W��D��y��|�u���	�uw�@������4�z]�-����&�|�~���{������O�����`������tm<�Y�>�Es�%�Ul7��8�4*������
}��D%&��z@�*m��:�~E�`��PuN����
cS�����a��o��M��A�������N)��.��_w]D���5>�@"��:��Wuh;�������H�����A	.
��3Xi�����p�v��	�|�A���h�J�e�������rJ}�2&
��5�:7�%;�@������P�8��mJ��rY<���):�Mi�MVmmA������:��fm���Llwq
	@�+���Q�g�Q>Q4nr�&������=��V�'��n5��s��KM�f�QJ����ph���*H������v4��F���6bXy�c.�o���S��q>P��A���Y��7��s��X}r�x�����n�G���r�r�$q��A8���6��U�v�����/����k������ok�nT�*��@��`�����K8E��+�h1�@o��B�[��!7p ��PusI%�����*��c��44�]��!7�j��A/%~:'�c:�y�-�&�I����=�����������Kjh3Ml\��v�d������9��]6*�����R�}����U�
yP���us���r;�a��_?�J��@]/�9���A�����`�t=�&���@���#@�do��3����*7�;�=����Y,U�PE���]���
3^�e7O���d�a��1�2<�n��Q�x��7w��=(@1�9G1��Nb�a]�|��R�	/�w����s[-�>���������a�n1�T:��.3�VY�sX���td������t�4��������M��t��zyW���.K���4;��]��9d�C�K.�}��h�;1��h>���[_��sc��}�^:GUn0����Y���@�`Cl�������1	�	��b<q��,�>��q��jtW6+��V�S�Y������X��p2Ui#�#V���ThE��\d���<�h�1;�}�U�s�K9�@�r&��sud��
���'�U9g&�J���}������`W��f,k%�}��	g�Ia"Xr���FO�($�����M_�;��N
���}������L�*7�O��4z���Of�$!(���sXyF�S�J���|?��;[=���l7�~�`���y�VG��+?:�+�U�I}�F�S	���O�#��e��<�7cq��$X�[�"�v�qbTEu����"p�YW,%V
;�I}�6s���|e�%�k��,+��Jj�uI������it���,�����U1?HW	�jeo{F�l�J����v/N�F9C�	�`�Rk��Y����CD�+�PX��
�*]S���xu�[��R��YV�Ew`�"���&z�@�|�����l�����\��*J�}�������,�]���Q�x	�
��5)y�8X�*E�uq����vJ�k1��	�Q�C��?��7>����O���t�aO�4�w��	7��!�6����J��OI�������o���Ca��>��������`e ��RYLW?9�z���:R�����Ow3��s	<��i���'$��?��xgO[�#� �L%u��Tf@��y���(wW�t��'i3���t��V���R���&�|��8}�9l��Rz�����&�L�����|�|"uG���
lXwL?$���f|����Q��JYvU���5���y��u����a����X�?JyV���TA����"�hc�[�ud����_n��	����|y�.(�u��Kx=��������r�~-z���
�E�-G�&��#����L�G�[���>��C(�4�ArwC����aV�*t���ml� |	f�o|I��Q��:�-�zp=C���(_������p���a��x��B��+9oX~�ty������]$qlg���+�"�^�[�����ea����.�In�6aU�����V�����Q�\tWR��������K�:���{������������3�� 7�Ii(����'����p��w R�]K����z�~#R��S�ZCa�?��I��;���������}���Qg#��o�����J��rn�@e�h�emG��+)��"��L��#��d4�8n�����3�S|�E�j�#�e/L�h=�q6G3z����z?���du[i��+}�Y���sPz�v����u�Q���1����]�?���K�w^�#�,+��u�#AV�veP����T#����#X�TT1cwKt��w$�W�$5��oV�b�;��41���4���j�|��itm��yB�!j	�q>�N��&*PC�W�`9�;�g������	1�\�����<�z�sv�\���,�@�azP���o��C������IbX���`/g�Z]�3>xC1I\t<X�Z�{r�`(�]��� @�R���������: B�[ �������uw	��b�]�����Yw��A���J�~	VfD����@]�����9��$Nn��#�Uwz�j���s�nm8���9�HDE����`]8����:���d�m�L8���N�&��U	2�����lW���cI����Q�.��>��I��ib���4�y1�1�U�I��X&��{�5�~��H���[�3�.)q��O�(�%�3Y����"��:�����y�������E8��&�	��3j����#�U��$�u�J�����D(�:Ed�W�K��bNX���U�?��.��Y����i"��^�v��3��u�K��r���*���&�N��G��
�r�R����V����#���D�P����6����iF����&)����f,��	���D�G�2�Ve���m4��4Pru}�&�����>?IL(%�T�#�S�����}��
X��Q	E�k/�4z)����*Qt���o�����K��f,��-�M�4�Jof�9#���V���.���U�1����������^�n�T�����]��,��f,l��]�J���f��5p���G|n��v����������r�aUe�����������E�����p��P�1,���zl�#����J���
JM�y��J��:8[��J>��
$U���/�k�Q���=������r�����g&���S����:�k���;yV����������yI����p&��Kz�f,Ll�=h�9�)�G}�Q;>b�*S
�)�&���N�P5	��|7g��>.����������%`]��1�Q~CLw�
�%���z������*�h~Y�hT*<ls!�@/�n5���[�����`r����.?�f��B�v����V�e�"�BTde����b��@Z�����p�u�=��(��D��d,�%�
��	��S8U)���r���
V�,{rqE\u(%
�57`3'��R�];�����
����!{9�Z����f��#�6���:A����K���p��E���3N����?�et���G�}����/m��S�y�Qf���
�Y�3��=�jH��#iV�
eX+
tM&O�w>�y �:\xVi�����f��}.�����A�AX����@�S+��%� ��\N<��g�Y�Ka���[@��!�����x��D7Az�|��p�;l3h��*�A�����s`����?�eB��%�1��N�@�S��>�8�8���Z�yBLB���?�.����h�U�h�6�BJ��qD<�����^��7��)��K���I�h9��0��{#����F�z$�*��G]'�A��.�����mTk2����<��������>=l�y�>� i�i��A�
V�R�q����y-��`�����EA/�����{��Y���k�^���$5l��y�:�r(l;8)��.5�Qo���F|���7gP�\�&sC��E	~�6�t���O�M�J�����Gs��eu&�o�:�J8�ue���u����yB����>HOFMs��qh��l_�o]�-�Q�+�$.!��6����lt���ZW���{I�WE���D��	 �6��OILu���<m�ANsvh����	�*�����YW�!w����_��V��������k(��5����R�~�2�^��������<��D�6��������:7m��6�����^sT�
�W��a��U
�o	�m��O���Or��@�<���-z/�����L��b�]�n��%�2��.���1L��
3U�n�t��@o�g�����1aws����7��]-O�`���c!&��4I��*rqjW�����ed��_���@'	[����
�g]���b���:�� 
t�,6���r�v��Ry}�4K��I���ro��U{;�[��+0Ec���j��$N#��6��"��,u��@�B��b��J�`e2s���1���*��2[e���4z�k���;TD��
�a��D�Bw*��i���2�����/k��'�F����L�I7������+j���t��I����q�L�,_�fq�^��t��5�f$z~'l����a��-|��7�*6����D�������4�L�{�G�5��I�t����Y������D_�7�eU7Xy@�=X��/j��'�6��<a�	�b�b�=a���0�G~�6~��uJW���g]���O����?r�F�w���}��1�;j:���W0���?YU�:QU�5����< ��1�lsVT���*OT�j����b������c��:��V��RL���cn�+���&��L����3��n�8�����	��0���<�����2I��}M�u�k�P]�n�;J��(��?�=�!0��e�c�Q'z�M*fl��'���#B��F?��1$���QS�&��+�YbF����F��wX���Qz�5�������g�<������E��z����s�`�f"��fB����K��MT	a����	���@�o~�k�]I�6~�Or���L�D�f��h�H�wO�:���b6A���t2���cH�P�dS�7�������6O�!et�'[�72����f�RFQ��Y������w��UQ��V@�9-�����4��s}�/H�OZ��~�m��=��M��D�	=OT�@�����]�t������q�}�M.N�w����z����=�Vq��o��(qo�����h1�Q]3�7O8�,n�H�r^����z������:������q�u���	hw^��4��E���q���K:�Y������0f\�$X�]��&-�1]\�������c���]	6ca��_�e���|���f������/��<��	�f,L�z�8i��`l�k��bY8?�s}�����ea2�'���K��]`-���]�7��Q�bT�>�:|(�s�h�$���1���d���f,j�}����E����49oM��d_g�:������>���l��;��V���L�`[Z����r�c������PD>0Z^�/��<��V���Ng>��|�@]�d����9���
��}5q�,�����j��l����8��F�p�G�>����#���t;�����3�����:C��H~�U' �.������+��l�.����8m����B��������G2
i������cHN/~����b8�F�}'z��V�wGE�X-&R�'���p��`{�����s��4�`�E���\�;����=�N����
v�����ik4�'[])PUn�;�����.:�;�����9����d�b
�vJe<=���	�r��~��M�D���4z���A����\I��.
aEw',�������i���
���>�M�v	������Y�wW�1:>���g���t��4F���MK��?�\��������r������}���`o��%A>���]���*�n���e4|�nY���w4������v����rgK����P�uG63v�w���g�,V�|����F�{q��{�`TwT���;� ��\�Y���-e������i��'���?�F�R����>0�:����u\%�c�cY���:?l��K!@]��NM��y������dW=��X�B���������G]�*R�e���%�!��\P�����N�(=��?|�8X`.��i��6����7���'���;�����x��[X`��!��`�����B����_�i�=��J��|�|H�cF9��^]�mO1��	1Y�o��5�U��^��7�,��`����^w�Au� �f`����*	��l�;�H�N�Y~��X�Q. �v�3�����f�X4F�v��v�<�
L������?`p����`O�����s�\"�+�������9��hQ����*���i��fa�f��ubWeJ��',_���	/��|���]U&���*�*S<�|��GP
b��{��d��2\'�Oz)�x��zdO�VV$h��E���8a���E2�T�����4DA��������K�b��FLD��@�����)>'��}����u5v	l��45����U��y�R�:�
mK�$���@��oAS�������VQ[��"�s��b���eqfIA�[}��[�L��R�����������YTV�L�E�q�5N���Y����8(p��>�\�=8���,��V5l�Ef�A���Re���a�oL!g�*G!��`��&��J{�=(Q-S�Q~{����7��M�T^T1��N�y$�j��wy��;��V�[yK6�=�(�)�s���k�������4�? ������a�U0��Kl~���yJ9�:;�ze{�;_�TNt���Ce`��|�`A�p����EY��K����`a���+����>�&K������{�`U��A� ���M����DA��Q����}����~������C:�UZ�,�%r-��p��}i��5�����ga��$�tb�:���L���u����u��[u�	������	�z���?��J��]%�7cqT�?X�55��9G]d6O���2<a��Q���L�[��!-�2v _y��p+����m�Rc!����A�sK>��g<r�E�	N��N�	:#9A�����J��Y�m*u�u?ILXey�_����b�8�i�k�CU�N��|�n����U�kt=�`_�8�W��41�\�K���{�t��|T��e���������K-@o�����j������o_��i��%e���������i�4eQ�
���r]��������'L�k��G�smn�+���b�|�uA��(������|]G���?O�����y/9���%d�.��f,�(%R����:gD�K�9��$���K]�4����X�:O���8����E�%l�YL�	�����U����E���]�������Jm����XP�\���X�v.��-
�Y
��3�K�G���z��}T�hu�|&��-h��9
;������@_gcz�uE$��q�HjQ"��NF�;�R����|]\���-�E��(UW�[)������V��|]u��K�l������t�t��A�b����2��P��J�
�*����A�����=h�Q�H-��lV�T���J1�u�|F]�J7�������r��_9�i������Z\�P_#it�i�{������T���������6����_�1Y����Z����.7V��L�T�8z�� ��"lqQ�`e�Q��z
���~����,q�`����b��.G
�����Y�(w�kx���Pu�v�H�r.~D�������e��s�`�c"�*�)z��d��G]n��e��Ur��2>��'��btQH$l��]�aL�:=_w�S4�\� �[\�k�������^��U���"~[�*!lw����K!���v�B�U����[���i���@�p�u���g"L\�01�pFg��>�#��k�Nn�����4P�&f������N��7}��X�J&���N�����K�1?�rI�,&��R.SJY�������A#��m":�w~�f;`N�%����&�����%r�YWl\W8k�!���U��F�Ad���t��,(wV�,�����n����t�@��1G9S�B���4uX�C�
�-
����iA���[b��%<�����t#�.��=�E#�8'�xuh��tU#��%5��?�fU�,�M�|s���qq��`W���X��nr��f%]��4�a�s	:\�r��\�9d'����~�*[
�e����q~!�|�'6_6{�.|��O�Wy�'������]�l���Y���v�MZU� ��R����Z���@��������.�������*m������[lSq�������4����@W����6��-�#���~�:�A]�h�Wu!��"G�U%8�6y}����	O����{I����/d�/g\���������B��F�|�&&������}��DR��}�7���8���YW,F%�<Y���	�L�M�`��hU� s���g��
V��l��3�0���i0��'���|��OX��:���)���	���=��~���Y�m��������yBlM�
�]�q������+����@�����YN���`��,X��]�? ���� .�7�4��v�4���/�yB�7g�����]�Q��kS�Zil�L���>*��T�tU��<!��*i�U5[�k��<�6� t/��W���X�_�.��6������	�
[T�/9bnq�#A�-��%��*�
z��"�G���b��{^(�_J�@��B��r��`g��C�.�����@]�{�S^O�B��������it�B�{���;	���$H�����&��R������K���',�J7N��N����\�7�F�}�.��]^�dU2�����=�p��,�`��~?_��i��`�����Y,UN{�z!~~�J[X�
�9�p�k���	�-��������%w2�4�����H�_�Olu�4���
T~L��q�R��Cd�/7��l������Y����������zs��Z#��G����p�Y��%����z/B�ib\8g����y�����>�����m'O�Y�\������X���@���l~��<����G)�R����	�����������5e�K�������]����9�@��1�������rx�wfT�u9G��&����l	v�����U��kS�Z��[���D��hs?�[�����b����`�����
R��s�z����������
���U5]��A>;���|K����6UE�����>z*���vS�����*y�/�������PJ%�k����b�:�*���J���9%��ON0�?�=���q��;���}���f���J�V��z+%c��"WSd��$����f]���3���D]�I��+�
�,���+�
�]�@w��@�'����G���RN�uJ����p}�`hu���k���#�~�
'X��Q/����z���t�:�T	���d�aW)��X��.���3��qpG:������~������l��]�_.�/��9Ek�|�L�MM�oz�pM�k[�4�:s�g]l���bl���������c�%e|���}.�!������w���J?j�k�-��Z��+��kp?5���>����{�����.�p�j��\��vg��@��r�<�����w�� :�^��K�?�.b�e�sy�����it�]L������M�xh��@���p��o���Mt�O>e�\��k����1�/�o�H�w�~��
Fu��h��l�F����b�:U�`o��G(�����8�]�\�^���7�>����?IL��6m�w���������FLq��/�B�u��N$]�h���
+�l��}�N��57��dt�a�2��__
���t��Q�k������)Fn��s��%�+�	vu/�Q��AP����.o�fq0�\EzG�L��@P-��CKn�����G]�-��u��h��9q���v��@��N�]?��1��F�m���:?j����?{zo�#J> �ZK�	����/{p���V������J��m������u�t�����\(�_.�9���;���'	���D�Z�����2�/����S�]
��yH����Z����Z��K;�u�d���\d�/%c{;?i��Y���N�mP�p�r�+�uX�Wu�L�ir���`��j��x��LW��J�'�����Ox��,Naq�k
�f��QU��,~�����aU�����t��t�s��-"8�`����J`���A���/J��N_�����/�4���=g��W��
7����7z��
�M6�/t�C~+����A]��r�C��� ~s�v�����Y�������������kU;�OD�o�U�.�e�e����K����$$Hy>0h��8k����z�j�^J�6���u�T��h������J�`��t�{�5�	�b�U�v�����K��a�J�*�
tu}o��SD%9��&���@��&�J�m�tm�F�������g=8Qbv���U�#�����?���\7k�q���UI����s.w����=/�~_��]Y�v%c�V6������Kx�8X4��v�xhu�U��*q��x�P���1���R�-r����'���s���O)���.�����L�M�5�ca�9�����Un4�oU�0Y�L
��w@�<-�hq�8�o�,}�*�m�QUt��V��{q�bvz��N�{�K��f��C*�V/�rA����(2�y�����-f���9��@�`��p^��F�v��`����W�8�J�2���x3M�yg>��uu?�k3�@��	��g���.k�����
�7�����Z�YG�o�3������`��c�<����K*��	�i��3�q�2�,����`]�hq�@��n���\����A0]2u?3�@}��"�TQ���������`�9�)��K���Qq���3������O��������1�K<x�0J�c���m�o3M�xg�+�?��'�!g��s=�.��%P�6[Z��a�|�����"/�V�����w**�"�C\>���� ��7a�b^��Rc������&P��7���v�fa��=I��Z�=�)��T``�A���Nk����o��o���N��[��[������$P���$]
��[�h���%�]�`���Gj7����m�������uN�@����C^I��S����v�3�K=�������������g��4����dl],��x�_	���].
��Q���v��v2��47���K��8�-�
IP<����d�b>V�t���yBNy�b+�����������*�=����-u
����;�V����]r:�*�][�o��W����u��gozP�#[z+��������d�}�>�ZL��&��Kpl�9��3������pNTK��&n$5o�8�ht��L�e(���4�|�������u
^��.R��� m����fm�-��7Xy���k�Q�B��b�(eLX����F=�A'������
u�o�[:,���P�E��<!���g�u����=�F��v�S���J�\�Q�
�n4*]����}]�����������-WA��X���QuBy�y��e��C�����������`�s8���-P)�2QM�{�Hc�J��(���/h�UXoy��i�[�3�T��1j=�;G�I�m���"�)��Hc*IFP��UK�tz6jt���YW�M��	���J�2����������`n�7���l��ie0��l$9����W��4*�
}\�
Qy�z�FD�v��`��2Z��&nHo�G
�������Q����DsQ�]�^�u�2l��TUz��u��H�*}HP�/
t�9�,��E���a��U��bw���8�fq08������@�K�u�U���G�,��4����h3F�����*�*���&����jv�t,���	1���8���y@���M��������:l�czP�u�
`�|�������K���uU���z���*�.��f]/��l�����>(�>����r��U������rP�7?�)_+��,��J��*TA��x]{un���R��u�W�G�]A]
�AG���U�97V��T^����V��Z�}�m�m� �5@��,���di]3Z��O�|��}����@�����~@�p���}T/hQ�9��4�KR�fq��T~$�A��	�U�(7VT~�r�!��H��A��qvI�����B<`�3-A�&�sO4/�� ����)]�A�Y����ib (^�!W3Nyg����^��4�{Z�*{�,+��;\J�}� ���d���AM.��fU�I��1lS�A�N0���O�ru��u�)�����~��0�
�C:IUPWeZ���������j�����F�{�.�'����]�`XwkF�WE������<r���Amx����uG����cX�wt��l�{Q%r�J�!��O9~P�}�/�P�U�W�.�tM��,�R��u!�9���u>���k���t�a]�h?9�1��KJr�%���Yb
�l���u��{���
?���.P����@�{�m���u�r7X�2����M�au2�A���G���|������(��u�j�GI�����b[�Z�U�8���7zT�8X4�����]���Q�b���f�*+c�z��a)��gJ
|��.{c �]8��|���^��]���A���i������������<�?*u��%�V����"i�RE�s��+)����-`���K���(����:���?*�q����<��Fk��>��*��]���h��v=�#?�{�2[6c��.e\���@�0������(���2�(���O�.0;��4�[j|6��9���aZ]=�
?�
v7���9�R�a��qJ�_.����'D�w
Q��z�bG��8���&�<5Q�u��Xa����5��N�U�����h�?	V�t���e<o���%�~����@���;��p3���s��S�>	8.��Q�b�A���@��H��U���:�����'��WE���3-_��Ja�r��6+���
�����(kl�cH��=S!�}�������x�8K�G��q�[����+-������'����>�U�^E\rc��tmL�F����j'�{��J�I���<!��3���J�TFtumf��O6�7W�S�7w�|t�e����>�+�������~}�i��&���<!V�|��~�oi���(_?.�j�o��~s�W��b@5[nR]."��ov��������1�*��Fe�i��-��:���p�J�I8�V�&u�+���Y�0��#��.cMw=q�"�(�p���4�4��"n�#�}��Vw�bXW��Z^�yB,)W��A���o
�8�����%��yBw�M�n7��k�]�I7O�M���a��������e���uND��;�����=X�
3�����'��Nzt��������J!p���|}�f�E>�%��L�l�VW��n�K�������.�����Q�78'l�;���A^�q�hn�Dq���K*P��P8��d���`J_���x
X�*�~���uV)��������t�r��s�t�����H_?N�+�q!d��9ls�>����A-���D.6�fq���!��k(�����,!K��*����������`9{mPde�������/}Pe~\���Sk�R���*�����nS��=��N�C���K�Ir�s����`ow�
TZN����M-��������������o1'��%w{/�*��8���2���>o���W���u��_VO-�,`j2��e������^�VvzV��+0Q��c�����/���r#�V��U	cs��J�mdW96Y���J��]���~���q�C�J�
���t��-^�_�
�N]e���WA}Ub}����xX��o��U^d��5�U�����"��
�@����:��2/���J����r�D��2�|I�����Y�u?~�+'����H�Kel�ui][�l�9��{�u�
t5N��&��k�vj�`�����*����>/���; 
�di�����������(V�sT�]l���`X���U@c3�������y*�
����^��_�6[��
tU�L��V]aB6/���1��A ���O@]�7�*l�Fk���-���:p�����#��xQ�}�&8l~;���]S�~BD_%����o���T�I��<��C�g��Z��	[�@��E��u'D��E�B����P����
�����ue�c���i�.������8��O,X��1Q;*�l���i�:��nX%�R�+-P��T+����{/"������}�6c�2h���KX��N'��D�{=Z�ME^�w_���f�=���{5������
,���n�yBl!�
�.����0�}<X��s��(@���������K�V��:���	]Y��������9�����Wi�����B��b
v�d<���J]������|���rT;�	aY�A��6l��)�"C�VU�z+�?���X-�wz�Uq�������$���	��(X��9?x������N]Yg\<���Rg���� I��"��+�f,,�Gm4��oZ�A�����B����-�]U�7ca���3�W����P���M�����0�5���E�����<NgeZ����]cx����s�0����}/���3������a�������yB)�|
��K��mi�D�����W�F�_�w_��{��"��*�]���&�6� ��%z��a^$t_nx�Up=9���}]2���������^X��E�����A��[d���YW�!g�[�P�f,,�\DE��hq�Z�k�w���.�l;�|A�����Z�����}\��|c�wJ��o����L��JUL3Qg
��m�6�.�m
���Q�?��t�o�&������"��.���=���I�*M�wj�Z2_k�"+����
u��IP���u#�h�L�E��i=��n_dX�����A,U��y���u6f}���QM�u;���JTv�wt�]_%�
;\B}��/�L+J������@W�q����}�Cmg�������O���{K	X��.F=�Bgu����
g�|�h����af�����*[��y�����yW���F�������^4Z_��
�J`m��BptK�w
�Uw��5Nm.W�Q��t���%.��;�h]���41\�/�[~���-�����f�l���q�:#?��DK@eBx�3����[B��u�sa'X�.�z�g0�h�;�u�9�z����k����y4�}�����_da_W��.�s|"d��|��}�m��!Qhu^�N��[W�G�����g������u����g?���4����4$Z����������.���������	T&}�O�4z���g=�!G��a��4�T�A���#S)�^B��U���R�b���7����
�M.f�.����z�Q�������/�����"�kA�����*6o+U���K|*��n������k�4YwWu�e��z0D{_���.�]�-"�|��'�^����%����Y����
���!)�f����pU���,�lw�����U2��<����2(���)lu�W�[��+Uy�9�����[����2u7����������hM����Jzv8��^g�E�-�~i;�"G������qPW�;�|�SES��K(lU??��Gu|&��+*�U��ao���J�t�N���w��b!�u�YW�8�Tjy�*QbNXI�A��~��W�:�(������|��E�W��pQ��N����j�kv;T�	�����u�+:�U�y��M#���~f��d�i<��&�vn���~GM��*B�U��`]�)��dm�I,Pm�Trts�|l�"4\U"4�+��h�7G,�*�W�~�!�[�C��!y!��noU��M�G'����H�Vg�L�]�U���!V]�y���TnX�{��{�Qu�]�4Z�	j���$�a��hQAY��N�B�������YW�&;����J�����Z�Me;���w�J4��� Ntp�a�(��.�1�gz��O�su���r��&�cv�k����*q6!��*�
����Q�/Z�,���`����:�e�k��4��J���2��w�+*T���1�@.���=�����h����.R����g^6������c���7�*�
��[W����q�U��R'���L?R��hW�N��@�|����qu��`U�q���wto�< ��Ja���	�W�Z~T�
���IA�EI���F7q.K�J�i�/w��b��F�k��f,Lwq	��%	�P^R�"��V���
���������r2a�Z�D��4�����,��s��]zB�����&�����W�-�*)H���f�m�fV8�������?"iT:��p��xf��z��_�S�V��RQ�}����>�+�Lw,�j�A������zp>��/�LH	�,a��41-\�!XW�3Q�HB�xq;n��DI�sB�����u��8W(�J����D��9>g|��a9�,�.��|f[�GU�c���UD���yBeX�����:����[�E��0z�y��,ru�4��������b�q��]���B%7���.9���zt��m�@)<�:�?������	��]�X��r<l����<�.o�a������Q���~iYl�u��n�j[��v����AwEM�*5eX��@��mm������������m�BN3-��hW������_u�i�u���/�������h��	����5�+�{_�f,����^*���Y��G��'����R���[�Vdw]����U���.3����� �9k2�����nu^�`�k�f,Mw/F����mu�Z���7Q�	i[����l�������"�:��D��u-��{q���7�h�a��Ge�0{P��mu5H��l%��*�6H�'lWE���KN���u�l��D�����b"�hj���(�VW����t�|t�P����!���i�����V�aF�eT��$�L���M����f��E-��u1{nv��V���*��)��S�m��~J�v8���;?wjt�����������bh����
�s`��+���$uj����*)E���7�������_��t�@iT�L� ���iBn�p
�OoDl�+��%G)�g��uj�O��XE����(*v���%���&��@�����:(�V��-�=���f�q
�������'��q�;�YO> �xW]�{�����������9�3`�?���>�?�uZ�)�b���]� �ir��R�A<D������ut2�A�:
��	��[zG���I���5�8�9��dn����-�|���JMv��
4�~�"uZ]x��K~aXg��.���	9��4�TXuo	�(T�0a�
t-���+���V�n;Y��^
�?I?J_C������/����T��P��+S-*�	z��lH�6�����'PW��;�[����~�8�c�l���
�5�����4��`����
=��<����c��<-�?�����sm3Md�U��d�,)�5���66�x@7V�*I��
w���.P�����qC��n���m7cQ>�\��]���T�5d<��n�*>:�o�*E���A�B��e�>PN����z��M��a��L��Mi����SiTN����}�����R�M�O��:��A{>��!;�
S��
V�Y4�X
z����Q~~,�
����X���
����u�a�*�����K7�4��jn�~�����t�������jP�Q��\-�4������Hb6�[������h1c��3j^M�����E�"�T}��wz��{N�`q0h��D*@]�$��<���h^9�M�R� �Vu��N����7$K��,�y=���gs���1�.�6Q�8�Up�h��]C<�i����\�[I#�	������!v�T�
��_p��=sTw�a�8�Y����m* z�k`l��j�U����:m��lW�0���as���fTU�7G��g(�6U@	��� W��4�T�����!�����Wm��|�S��z#u�Z���]�N�G�g�5V�s�+����^��CU�����_4�\�P�m��w�����27@�35U�����!~�:�rcEe����eqX���S������b.��&�}n����nlT� 2�7���mJ�V��(������
�3����Tuu�����N8�~�~�z����U��d��������@�b;n�W�����it��4�~���a�M�9��k��sI;�
����o�:�!��z���m&��9}Ta�|�|Q{C��9��C�F��|�L��.D���5����fY���/�I�z��������z��L%dd�������9
�������K��N��p�@���}��'
	Z'�{�{�K��F�K����H��K������a-�\m��t�|���fY�\��������u�@�K�a�%��Y����}�\Q=�&����+
��~ill�9s����Q���HCv�B���y��]k�7����*V`�	����f��.������,q�\d��5�Z�.��+��]��Gu����y������bF)�
�c�_��w�n�
���"�\�_?��Q7����$�a��zT[��\0���������&V���#�sP)��o�/X\���!P�UG�yX?���U��4�h��9��.us*)�	�.�h�@C����j�.�v]��O�(�(W`���	u��r���-�\�d#/J��SH9ov#i��������-WX$��K��^����8�]� �� ����B���:�}97���v�
ds���a]\�U��Q��Ey�u��������n��c^����.��[�J�O��"&�7c��]5�rC�8��Q"Th�+cv���{,�`�+�D����Wu
`������T����~�c��o��C�E�:wc���*�l��y��D�����E�����p�c�m��6a]�'�rA`UjsL�}L��-y;�v�C�8�W����bZ�T�`�`�}������b����r3M�jw�
�u��@�+
����<!��;n�H��>]���mu-AW=��b����A���!Jh�Yr��m��o^P�!	���������L���v�J���h�uG����'m��cZi����U����7���t^�`��8�K?aP������~�1���X=�{ �*��}]�����:v���
���>��Z�v��@��a����u$a�����
)i�R��W�H�>*Su�yzGM���v�]��6�Dl^����V������?��Rk��y!��mW�>�J&�E����!����Z���[�F���b��q���(��ZR��7�;�]����e+����}�#P9�}
�,?Y�J�v����T��n����N�Y���f]�����%��X��v����������`��vG���,}Xy���^]@�4�D�=�:z�]�a���u��~g�?���*�
�>�f,!�J�d�@]k���ki;��]��v�}��.g���5���#
��y�<��]���ir�;s�p��'�c����*w��CG�+����ksX��	z��:��])��HDuZW]��X���|Z�&��l�k��sc]Vtm"��&�;^�urT�k'��49����%Z��s^)3��jS�G>!!}�C��p�8�*��Q�d�Ui>?��8�������W	����P��>��%'�yBLUb;T�
�����"h�rg$s��a\���d��$�[~�Cn�|�s���A>����|�����K���~��S�)�:�(�������Qw����eez@o��;V%��Q���:j���n��|���[�*��
�El�-U)0�k�`=h_���t������"gw�m�1�f���Zm�p%��m�Rt���Q����E�;���Y�H\�H\vy��2�@��}���(G5��K'i+=-����,?��	1�\j@��<�vgo��s%"�y��A��%���E�Tr�<r���y�i�(�d�E4���2a]�����.������R%��kK��XXC��� `��dW�]�E��MT�p���}U og�I���bwX��� o�������]H�_]����o&|���.gw�Xgy���0hq^S���`����K�=K���FE� �=��v(�<�R-=���a���Q����>���]a���p�@Wu���q�+U>��o��Q�t=�'+���e����"N/}D^4L��	���1��~3M��S	;����;d*�3�a2�Q�\����*�x�~���5���D0r1�7k�Y�Ta]�|%�����|�J/�O�E���	��F<i���F��+���6x���}
q�uwG���Z����1�Zdwu��_1��<Vn�H�p�t�K��f���rl�d)�!��U�G���fq8��E�2��nqB|�9����TG|���d]P�a����DAQ:��}�Q�k�*�K��vd�;;�mt9����F��ZuZ��� 3��w�6Jf�V�+�k_��41J�����8Xy%3	;N���w�K�N*t���L�S^)���9w��6��VJ���R�	���)�h/v����^��|w��lcw�S�Q��z��<!G���-�=��@|��w3�U�3����@��5�j��|\��X��QA����������8���l;H.@�;+}?��*EPgXj?y:w�+��2��>
�=��2t��u�	]I����������j������y7�{�((vg�e�2<}#{3M\9��T��:���Q��[;
���*�}.��(v�A�j��QwrM��< G�Rn����~<�[B/R�'�?�/�=�sc�r"iRV^���(7v�w3��NZ���������R>�u���uq�n��m�r
F��R���N3>(�F��;;f�7����|����r�C�(�*7��o�3�$����@�J�=��j�}��t�,wPw���'i$���T�u��A_���w
�\�lU�>�%�d�Z�GI�����7�$N~�qT��I��*S��'D�	���(K
�u�*d0�|L����q��
��|s�ntoM#�����^��!iOn�K�!��%c��i��8T�vmj��B�/�����X���{+I-����f�����9�"�W�B@��U��o=E���*7�D�b�����N`���f,\���u��s����CSy
a�;�V~���
�yBN>g��f��QU�:����������h�.NZ��q���h I��fj�`�t��X�n5�u:���3^B<�@�$\])��.+�
����>*���z���h(�7�*�����8�J��7�5[1����B7��8q���
�k/���`�(�IX���TE��y b�C�E�w������rUi�����@��U��6w
�u'����	{4/�;��J���;��P�!�.M����9�<�����@�|��@+r8gg�O��d��8�X��?������^R4�|�uy�����z��#�8��V%E�ft���<!��|��r�Z����e�=&��R�*T�'7��������-��r���3�>�j��A�VU9s���n�3J%�������C�Jg�"����A���{��������`,)%�8Y��7�Be~C+�	�:?F�k�O}�������������i�\������$Q��V$�����%�^�m����
�����T����hL%�[�5�)��'>L��;[`�G�~�rM������R�����)�R'��A�@�����������1���OE��\����Fl���Y�0E�s8m���t�������9��<ak��mLMK�ziR�^�@��4�e\$(���]]kJ��m�8�P���x*C,/������k�zn�;j���:x��f��%lq����?;�������2��rq�/r�K�fq0,��R�������'���<x.�>���)�g��Q�A�>g����'z��Z����A������_��J������rYc���FQ���L���FRs���T�tO�G~�A�r��Y��\��>y��2�P���u)1��������]#>i�$� R��6rc�3�R�2
VN3.�{5���?�uw����!�6Ug�$�����m��0��T7��n����6Q_t�4]�&��y���r�p�Y���@}t�|�'�+��N~�v{�V����A�yBNMw����P�Y�Y��� �K�=�@jr�Q�A�@w�!p�.L��iv���,q!P�1���r�{������fhy:��:/s���P	-���:Z�W����}�4����������a��f,L!� dK������F���
�G���\��C)���3���mn��Z���@e6��J��]v������n��m���:�L#�%c�����rzm�rg�Y����?ls���>.���
�O�]�h=p���:\�
�r�����3�tu�����v�8���{s���='Y.s5Z��GJ���l��OI��>�B����f��*IY��t���=�A�u��i��E���O�du��@����1Z'R[�;[w�f�E�a���J�Vf�v�1�Xn������7G��C��m��,��e1A��[�R�����le�[Tn,�s�CaF�K�x���D��=�s���;�}�wn��X`�Q������]Ia]�g���A6�`���q���Z�{�cX����0�l������,�B�u��G��T�OV�MT�*�EM��D�)����
~�����c�l5�������&�7����%�3��X���l5y7U��D���;������ml��a]�4�_4QU����c�?�O��(�NVU7M�z�I���5{�^"��u���0L&��9��c�����IVc�����JZ�������gY�����iiTe�Nt���<��	�X'���Y\-rq�������7s�����F�����M.�D#i0�%��YV�7S�8�jD='�J_m���f��U-n&���'�D&���mk�H�N6]s���`��.XQ5����^5��I�R��e��3�s�m���%d4�'��u��n
�~g�.���'�!���b�l:'���1g���e�����d�f��$&�j�����u���f�2���?i�JK���?��	3O6�����93��l1n���F~q���7!��.����L��lM�%��?�����l7���L��D�+	tM��,G�������e3G��,�l?��^�$��}�%--���%���;��K����h�N�r6��<u�\�L�s�R�nF�CZ���ws��t��V#�4Q���;c�������;�YWN\������@K�5���sX���dUDr��dNTIgNt���Ykw��������gi�v�*�|T���ph�J,l����:os��������0:J�U�U�}L����'_������^��#����MM��{��������s�[�a�n�D���f��r���	o��htq~X�DV~�a4���M`#������o���B�����@�L���`���
��.6hI�n��?�����`������������'�3����r L��?��P���4����]�,/dZ���?��1o�K'�L��z��.�<k��F�����U�[��?#g"�#����O�r��@�����y�;X��	�?_j��6Y��/�	u� |��,����������r��"��^���$����w����K:�����v1�`���)��d�����c��H������e^�,���4pNG�K�w��6Q�{���b�8��[���/�"���hN�qiyLxIw��+����.i=��0,����8���c���������D�2����]��������*g�{,�G��[��t���MF���S��I[9i������=������V.f���qS������&_����|�J�g*�&�:�]���
R�jOt���
G�M�����H���@���Z���u:0�*G���#��m�t����*�������Mm��60��u�� W���g9�Y���d�������u���6�?��+�&�/�f�gt]'{��,���k���
 �q��^�v������1?�A�a��`��+�Xu.X4a��}��U�4X6��!d�]'�]b��X���7�4*s���A�S��r������a!?�O���X�r��I-q��i!P|�����/��-��.���?�����4��m���H�L�=�.wL�o��&T��?P�^D)�����vlV�F�E��{�0����41�y���D������A8)�.�w
�j�vgK���~�����|�9���b��qk5'������%�N-N=��]A��d���r?�R�w�Jz�wTyz�I�����1����7<$K�?�;/9�.�/���rE���{��xN�/?�f,���9�U�$��Y�A����p/Z�.Sb��dAM'�4Q=�|s����r�=�w���j�y�]������r�P�R!P��9��R[���nE���m��~��it�rn�������i5�@����=��� T���_�H>���8������vhQ���.��K��9ZP�,J�V���E��Jw�w�%s�6kc���<U_!�H�t����'t�V`�U��������Z�r(�X��X�Z*�N��U�����1�T��5_V��,�C[�y:T&�U�^��'/���-St����K��`T�^��I?��Y����&?�L9u�E���f���AW�eU��|�|�HAM��T^X'n
z�'���j�
�*�	���*�U�[���DU*�/����C�J}�m�����>�J��]��
����U�����F��Y�+-J�t�n[,��
m*�J&���-�V���6U�=Q��_�b�T\`�yA���iQ^e��O�-����rcETNn���R�.���4R������<�*P:���oA�U�����RN&���@�����U��2�a�*t���
-Y��b�ye����jY:��C�������w8%l��O7��A��a'���@��P�L��m���nkBK���V�����+h����������(h���I��@[�� C[�J'�j�:�Wn������	9���VUu���(���@���
b�E���V~�5�m�@D�W%7��������mQb��+��V�*�=FU����T����
_��*q�j�96��-#���O�@�jR<Y+�1���(U�[U]�VI��}�X`�v�v�@Wy���]&�Y,0����3|e�<���N��Y���e��t�`�v�iT��A^.�r3��y��-J,�}R�������G��} 1�e���bT�H�M���=�W��f���J*v��{,To�*��u*P�E����cAl��L�`O�P������?o:=�$.�(X'
�J�@���.����`������2WP�Z�\�X��M��1�p���9�"��nI��t��@�R����;l�|���Ly:u�[���*m��eU�8y�-�l�O���
;�z���^��	��S�m�"sY�fI��F��(������V���.�hQ��Y�%�Q���TaW
�4z���E�1o�g\����g�^�V���|�eA���������/���o���6��Nn��;���}t��D=��� �\����(��j���*��t���`�*�f����);+>����l�kS	)���N�����7���sf����~�������Tov�4��7��L��{��7��;\��a�Z~T��;��J:�����*�a/W!R�,��G�a��X��JZ]� 3�_��
�3����[uzrYcT�?_ew����p��`��t�U�e}�.�����&���l���e��z�HW�a^��rcE����:y�0�v���AWG�f���.+X
�5��~oF��P�^O��P��)�8�����:x.Nj���(n�����F����o�~��������Q����m6ZPG|��}��n������� Dy�rC�<����N�A����y���pH���`�������&���^AGy-N����Jf�[����m���e���7�[��9����d��k��LAm�8��y����u%<f�5��� q]\�d��RDuI#A6G��%���*d�����]�w�h;8LQ�.�E�Z�T��LI�|����E�'{�)a��j,����:��d����E�N'��6�����*���Cr~���_�N�u�L������Fi=�1�\y$:�.�!P��6�K����|.+!�K�����.��zv�'�]���5U�-y�B�Huqw��!�~�A��z���(v�\�km�f]1�\�����=a�nR��&4:�����R$���D�4=��>H���8�e������r�����wp�DU[���,z��0��o~(�������<�:� �fY1���p�U��a�9_4��eT��m��-'�j��� �Az�����+#����?��]\>����BV�R� lS��U�.����Qe�s��&|������)�m>y�K�k�>j���*�[��o�x�~)%p�.��h��M^��B��RN����������q?�.��0j��q�>~)YoXu>A���k
R}�	o��em�4_k��6%h6G]\a�'�<�����##���}�6nI��dK�2]n��f��>�~	:T8��a�����&6��YW�����Y�����Ak:�i�ot��~�4J���=���r
�v�5:T��D����b�:>X�*U�.��f��1UB��>�@��&�L������T.HW41'���6����^�v�}T�$������rm>j>J{�~)pXy�@��Y�������IE������t�a]K%��L�B��[�����g����<�u��'�,{!\��a�R{��&�����'�m*F0�u����	��j\�_�R���'.d�/w	v���������}��6pF�������� ��at�lL��/�{�|��q_J|�%���Y�Qe&s���k�_��_�/�+����Y�������U��YV�(�������o�Pw��y�O���3�����/�/�����oP�:e���y@�(��}���/d�/g�#[���@����4�h�8l�"^�j_JV�R2!��.�KQ��	1��
ls��v��m3�@�|f�� ��j�`������GUj���=��K�LD�r�A�c��6cq�;G0J���}&��������t�3�}U�/huW��3�mn��[���!���.�P���7�����@��&�*��YWy��/��4�\��Q�9;��A5�.n�+������9��
��z�����}y#��K��vUZ�OQH��0�A���5 �+<Y���l�P'Uz�"�z0�]�$����������`�n�L�y���(�'��s�u���)��;�&V�����w��a������=��7CJUz��	��/��lw���w�g���*z���,0��;\�z�r�L~"1a���N/+
��Kv8�V�.��	��[��W���-w:���{��>����<��������
T.+��{q"�,���B��rG�*i]E�7���Rz>�ub�.�?P���$��=~9��JT�u>�W���Q���fq�]	N����@�z�$|���hw? �����;�%�:���41����L�h�B�	���]i2���7!=�v{�����u���9e�~�D��Y�3r���u��
g�K�Dy��>2��aC*���M�s���YZ��U�d]>k}��1��f��4���,a�)���nq^�L���ys��K)����7��f�X�\D�o��`3hw�3Fuq�z$�u��~9�2�'8f���V�������{I�p�!�����]��eE��r�`�S���5�����J���mJ?f�z������7�^����@_�96b\�I��j���o:��
(Fu�	���`�N��������!��'F=��P�_?��X!�����(�{��
�<!�Kn^��a��f��n.��}�"N����-�5H�_����������L�9��i����g�pCX�����3j�V��'�1H�_JZv=7ca�9;��B�@�J��4���s/�5z��BI�����@_��dT����:��#�~��L��A*4#E��r��`��^u�J��qQ4�/'��������$���=��1C����=>u��@������5�^�"������� ��W��]���+�9�]3��GwB�^�����d�A��%���8���G~y6+������u-wA_��0���l���)����r.���O��;i�� ��L��$�a�&`i�/���ib���_X��6�u�����u>��_�)���SIzgZ�a�����g�_P�����S��G�M��Q����SXk�8X���i_2e��0S�&=�8��!,/�{��F�7�����P�����*�n>�YU�51g���U5f����)I�~�@�
|NX]nA��*��+aD�k����|[��47���
x�6�m���6iN�}��� �������k��f����A��;��n(�5C|��D����yO@�r�4��i��.	���i,�{��xJ�u��6����J������:�8����@[�:s�_�$0a����:��I��V�)=��o����=���IhU7LP�;�;a=����YW���#�\�lWu8����O�m%��p"_�Z�����"Q�@��ro�M�QA6p<(��^��������\Hl�W�>(�WG{�-|�a��lL��|U5.X����;����Sk��DC��Gf����;4��TI�@��|s�D4*�	�L���e\�\&���c���%]P���W�7)>X�7�	�U���f��B�G	�'���=H��3������L��j�����F�����	[U�5hq/_�nm{^���}K�7�J|�����UqhU[sA����*��/g|�k?��
[�����Z8���_����������(�p��u�F]�l5�A{pz?���U��:!
��r���i�9�Q�2#����@�����UPUl
����~�}��t����@�������?�1�������A
�r�)������w6�����!LuS�`���}])��������m:�WIa�����|0�?.���0����>?�����"���,���_r�|�.W��N������`]6Y��
zd2p��}��=�Pd?���?j�h���cU�������A����zm7���z�0s|J1s?.c=E��s�/s��2�h\�:���6����0�w����C��X��{D��]����Y�Z�2�M�EO\�A�v�G���h���"�/aW���-\���Ym@_�rD�.Pt}���jH��+����#��?I?:&��W�N�rm1Vk���A����5�w�����8���@/�������1�o5_��`�~�Zv�������@��=cs��4.\�`��@��!zP;�:�q��`_����2���:s��W�����cY�
h�����m��h�-!�\>p6{�H��`���
������m@	��<���������`���-��q��g����8?n�8X�P}��	{�[N�����Zl��A^��a�1v��[���]�hs!��^>����D<��S��%
S�������`��?X�A��(4�;������xS<�~�%??#�~L��8�N)��'�>Uo�t��G�5�Az�"���`��t���k*w����Ol;A�|F������k��b7c�>��q��D~.��*{Y���-�����#�v�9����$�rOu�n�	r�u�@�A.a��]�Ne��%���2���0z�M'���� z*�����.j�h>�������`�A4�O�i�aG���g*�����9e������:R������,a�n��o��
|�'�&����+��i��`�����Y�'���a�u����U��OI���N���f��.|����K8
��K�'K��!Xg�}�V�@����-���GD��K��%��I��o�"��ja��F/��
�<���!r+���$��L���!��?��AMl?K���Z�\h��5�u.�z����.[�Q��;��+�j�������������;�V���O�LZ�����,\q���i)uiqL�n�<[�����7�J<�J���n��i��E}�Q�������W"���dxIsn�".Q�^��rHS��~�����]�1j��y�g���]��v��'�{����Lb�����4Pw�!������G�H����>�����oH$���H{��?���uID��9/��WmP�u6�7��X{_e��U��]�����X1Q��'���`U��N��F_Uz�Uh;������|���6�<���E����l���|��|.�PYPw��D���Z3���hG}�a�����.)��eV.��U����]9@_U�:/X>t�OK���_�j������A���J�V���zp�5K����e�'-�G�zFP������U9��#��*�uw�yW�����v�������*	���&�����E���)��ZoUE8�]�x�{U�� OfD(�]����[�����XK4�A�E��ZhrmE$��.���:.l=��������i�U;�@U�e�y������1���+�	R���N|p��3�N{p�����%a]hU�>�C������	L�1�JyX��
�����B�������_d���y�6�s����wz�����8�_ew�mj�T~��be�j�|^��{���j;��/D~�)�(��{�8����-�[u	�@G���"'~��Q��Bu���+^���;$Rn��P�(�_7UF��������K@�v�N�M�o4�y��uK��5)�w���u�B���� ������l���l��x��H�K������3Q����wZ�]v��z�r�o0rb�qCN�7,��~_�T#�s�%?./�&8_��	~U��L�Z���|-m���DUM�����	`/����8�;��"�pkEO�V����Q-t2|��]��C��-.�������OWz1���]��
V������1����q��s�_d���v�LR�N��Dw]��M�",+���b���
�EVod����es�D.E������kN��$0q�>��jG����8�O~]��
�����L����{�"��-����"P��������S^��\[��>��lm;������?*�7M��b\��x��+G�k������My�����U�_X�M��W�"��6���t�"��_�����u��@��|����+��2��tQ�[C(�PWC��"�&~��	VN������e
)[�;��j]���e��e���������i�y<A���M�E��e�.�F0�����_��,��*m�"�pI�`�K[���_&a�+y����@�}����C���a�����`�]��I��
{PN���m
��Y�@]x����0����?����������1H�`]�K��Q���GVhh_���C�
�*;Z�[�y�_����Q��.�����s�o�vtP���F]n��8�VFLW=]���}�E>rX��c�}����l-z{�-	������7+��6����j@�����I�^�c�����$�;$s�6�V�
hqi�@�K�a�u����	���|J��;v�q��hu��@��d��^%�tU����;��Wx����|��i	�d���M~�.j_%���!�vF
T�r���4	�r�������Uf��V�q���Rcw����z-k��;$4V."��yi�0�'���_L������B�*�0��ftb>�J[C�����j����`�ix�r7{�M�u�f������v���-Ni��_���Uvb���@�GW5Z�S1�Vc���L���:\h��y�����(g/�u3�@����u����
��[��\�V�X��@����{����sA��@���5/���-T�VG;����7���M�t�q����E�`�{m�8�2t�������4�u��n��8�I�`��{�a���]S|���-\��|���G����,��M���G3���h=H% '~�j�a����� r����k�sEo���r��������W�����n�hw+�^K�r�9}.�'�Q�r�..4qA\T:���/��>��#�VU��U$
��[f�*AZ��P���?�`.�6v�2�F��B�V���5N3�pQs3�u_[��� �-*���4��E�������v'��f����uu
����WAD��`�J=������-*��m*�4�U5x�W����uK�����f�*��n���!Q�Z2�u%�o�*Xl���O6?s-�h���V��T�9���L,dY�ql:��B%�aoZ\���������Vw�����i�uN�j2zpuAc[�.*��$7m�(&�S������b�Im�Pt�%n���Fe�`]�DU]��b�@��^����v���-j��d��2�����VUV�R)E�v0�B2�~8rm�Vq9�vk0�)�K�~@S���*��u��^r`rC������y�=�j�&{����rS���3@��O� ���\��}��$_�NR>Q��T�����f���y������xU����A�����!��ZJ�m��g6�V@����u[|���z@]h~���SvU�?���(�c��Vr*���>
���&������������/UU��$�t�p��n��&J��n���Z4�m�����L�E�����r5���{77H<�~������J�t�T�YP�5��-8��B�{��n�b�t��`�*������D�a�aw2���a��5g�t�qO�X��4�0�f�y#BA�[��&XWU
:�����	`�+����MT��]F��
��z1��������:��C�eM��[�tu�l.�q�%S�����Z��	*���{,/������w����j�����+���p�!���v��)�����	����!lq��o�D���xS��&+v����i���_��A��[�������]\��k|�o0���N�2��u�)��(�`�-n%��F��L�m��������'l�bZ���������ol�b�woP��%.u�y��'�l:��D�d�t���aA��!(�,���r�"_��yp���T��G�]� �[D�~��i�V�AM&Z�����^.�T0q���%:�hW���0l���.�����e|���}��o�[���}�U���?h���-��(����z��.�z�+�
�=HI��-jG(lq5��n�E��*���7�7����4��U
:�G�r8�������
S�+�s"���2���>�����w��������
X�(��7m.������n�������{����q���C����H�PP��h��yuG��Z\�]���(@u�� ���y��z2�u�mZu���k�����f-�k���UuT�E)�`��w���hs�AT�n�:�����6+����vWw���@�+^��l���mb�vz�����aV~+PWY��_����|g+�!���;�^r`�V���/��o+�Qv�������l��O{�a�����c��=�u���l.����:#�tC`��cs��.a��K�f�\<P�k]w9n:�1�e��P�=�1f�m��dq���]W�7m1�)Sd��E�%����4�&�7w���t����\1E�n��8�7���I$��e�������������&��K�����=�;��Zz/A��2��% ������n#� �����2��[=H���,������Zs��LB��-��c���f����*�I�������������L?�2���U���5�@�.�V��8�}�����f��'��H|s�DoJY
�]h�\p�\Ti�/�F��>�T�v�z���-B0'�	�����[=4_�V1����LS�N�?���iEZU��� ���|��k6����w����v���`�tM�m.��2�������UE6�U��<����V��U�F�]�����#jh�������!��.a�����uz���@��?�����*]�i7w��C���C��h�'+&��L��K�����SM�a��Q��Zk]+�6w�H�l��f�#_'X�bV�Y�����X�k)��4e[����ir��6���6��wW���}�16��<f�j�"�;T�.��M�0���?�;�4��W�9Qy�`�e!s�����[�������*�^*O:�I����*���}�;u��y���CF/%������)��������V�K�-�t]K~��;:k^�Rs�����~e�U�����H��R��[�6w�X�
�`�D~�j�,�+����g�����\��+*������nL�U���QU���"������{j��k����a����;Y��
t=�(�����*_����7>"�|*_�qt|K��W�+v�s�i���EO��Te�l�����������nk��S�����G����&����H�����\[����{�~��^��:'�t+a��~�*u���`��nN�Pk���@t���n�6�p�q���N�
�6�C@�B�`���$U���r�F�}�mn-��"�Q���/U;:��"��.����z���[�9�\[����4�����eb��]��p�L�\&q�+�u�{f���� >��X]��H��U%���.�����v��-��C�7��R>����)*�f���-�B�����u���2�]>�����;��t�r���d���v7q������l�Y�����F��'����*	���a�W��a��J�U~�#�#�Sn|�E��|"���~C,��Y���=�������=����i�����*�*U$������������1���,r�~$-�&��)�*S$ls��@���	�����^����|����)��%M|������T�Em.m�s��l��������A6W�����+�Hw��{c�wK�\����� �G�W����Fa������S�19�;���~��w��p�nhu��z}�\��W�/�����8Q���������A��)�'lsK���Sn&��s\����=X�6M�+�]��������VV� ����bU��� ��O����_	S��������.1�3���n.���`e������t�[OUDS93�]�8����Y]*�}p�F��	Rf}���j~��������n'1��1-P'�u>H�iTE;Z������F��f���$�Q����=����m�XK���������x1�2y���G/v�y��EO�^�J��N�\[�?�a�p��\�+i���*!un�^.RkM�PM�l"-u��@W���[	�\
s��-w�,\��J=
��������^��i4O����u�2���Z������6�J0�2-��^�9�;�F�h�J�
��2PG��,P�VW��-m�SJ��J?�u�6���Q��U�L��Bv�K���n9!�����{��(e��t+���Vo����$k7�C��$����\���1=X��+KF`�r��e���2�������,��A��Z�*Y��K
��F�@��-�U%���t��Gd���Sm�\�u��[l��]D�>wy!7�C���|�y����Odb��n8��T;��]V��nf���� ���P�s��9�����)���g:�>o���`i�~�3q��q��'��J�l����m�E�y��~��7�\��	�I��h;��a��n�u�A�����#*������)�,.�4�W�&�����t+Q�+<Td���v���F���t����mj��V�	���`���#o���M����F�|%tCc�n���q�r��:�
�z���_��=/Q���m�j�9��&
����i�u�q�&/��t
�7}C���y��23QU�6QU���R�w>q�������J��)�������`�M<+?��C=�&�4M}�[�j����n
T�z�Q5���*?����w��anj���/��-�/a������\�NG�
�pS����
}]@�j/O�-_���7U��c��Te@/U��
�@��M�~��=2eU����
�S��+P87U��Tz6���5�n�$��#\�������m��U[4!����U��k���A�j�U�P��G�G���M�2a�\������E���l5��!�vB8XgMmj�i��R$����o�����L����������*��V@��P�U�2'��_;l���Z��!
���Vba/7�EgMn�Q������)]�d�L!�7_J��?7�i������B-4��"�I��E��������n*~��)��*m��e���Y���^.#@��<��M3��K�������W�7~>�u��P�k^��
T�C���H���s�W��@��l�z���^��\[��UP7�	��}������s�hT-$lq���Ib9��{���{u�i����.zUj3��^���9���Y�r��l���!���1��[��}��)c���V���E4��t=tr�9��r ��?��"��>���n->��hosDQJ���&�YUAZ\m���`�!���W�y�>���������%R�h��-��nt]C�� ��|�8����WIa}�'�6t��M����O�'��w�z\[�K*�GO^�������G��(W���6$��!T���4��<L!�nJ
+����e��/S��w���)3�*'I���!��ih����w�7�%J
���I�n�!����q]����)�������Dm�b(�n�%{�������|pb��-?��������z��_	��av��l�",qUT����b���+���bkP�:\��,!a�n�xa��C�r�a,��tp]7%���O�E���j7wH0�d��N�*��0O��6SZ���x���v�Y	�T� �>x�q@7����}���u�@=����^�n���DK~;t���\�:��37m1��*������b�u�/���+�� �=��.<�/���-�>7c	VTN�8x��\�����B��MY{'���7���M5���	�v�c�s�q2����`�[g�Y��L477�gY��`/�4J�c�q��4.�u�4�Il��
�;L���&5���=I�#�mnoH��t�i�HI�`]�+�RV��J�.W������f�<��kb��V@����V�ha]BT~*P���9;R��������J��g����Tk���$M�zr�_g�o���B��`��� �#Q��\����?q�a�m�&�����-[�{�A)��6!��3� g�H���:a)�p%��N�[4��2����-[*���d���6e,����u�9�D�N��>v?�O�uNlu��~�&B��g�����s����J
���j���+����#��gP��)���B����@�c���t�D@��~����Fo�����Ax����{=�g��tg���|
gS�I�.;��w��^l��*X�����V��A/��a�^n���'���Aj�8�+A�)?Q�p\&����xt}\�h_Z��;NMwJ���LTU&�^�5��1/x�Zm���_�^V�z)�h�?����M����f`_�:��qs���~��+A�i��-�.E|�^���8���	��Ig�*m����z�'�tl�]�`]�z/[�7�I���[�,��������.6�T�t�D���b'�{Y����<������B�5Q/_�CM\@_UO������G�4�eS��.�4��/i�#/���-�{����������R!��
,@��s��U��A�c��.`��2O�Y��N�k���sK�e��3��������@��t=� ���re�9jqv��Z�E���J����������4����:�JgA�]es��}�+��-���<.����� ��Pg}�t��u�L�#����|�j{)����w��]�Q`�$��&��l��A�U�[T5�Z�ou��7w� �2p�=&r-M�\%�����U��D]�|sR��6��n�v�dl�b�W���U����@7���a&2J�:����dW��������#v����>��nB�g���1>�����,���`YdW�H��*Q@o�y����U�;$*Q�FXW�9�U� P���`"P�2�z�
���]L�{Qm��TAh���D�����2����OUb�����/�"����!^tS��|�}�Fo�t���Z��o��-��p7Y9���w	�7w8=P���\u�A�K�>Z�:��2Y�"��G��)��j�u����Ii4�E�k�le���������a��Rvl���U����%0i�}����{��E��ny�%�����W�^t��N�
;\�%�5+�F]�2�3����|
J��2���|�Nk��dy778kk��y3���$�IH�v��i�t��@�O����i�=(B����x�[S����������*B���^p����yN�j+Xg-u+��*?�A��]r/X�(���}H�Z�=3��; a���(��<�&2����'u4�]�g����|���Q�E
PV��t*1�rpN�%�ug��V�1v����]�h�or��\�������3G��jK�uR,�����TV�*�nY>XY�6
��i���\��e�hV��)�|�n��}��1�aq|����s"��u��J�2�N�%�-y�jG7���X71
t�=����6����M�l��?�u�D]���h~hG������=�~�1����A~}�7���^�������`�K�l�C��]:���:������%4��e=q��������6��n��iQ��d|���������{�f��n�mw���M��K�27_��G�+}-�;Ty�ku���
��A/�M���J��������M'�f���y�o��������[^T�@�j�/�1�v�D��\���nn��j;��~�M������0R"�]w����E'�`�]�X6�I`��`�G��OiT�� ��M=���K�s��O	�:����Z���~�e�*c�j��\&����	i�q,�\g���5p��.��L�>���A4��b��k�]?��$.q�'�^�g����y?*������K�z�l��0����]����b�?X�~���rm��s�f��Xo.�Q�����k�S�.���e2j*�m�&Z��sN�2����C���DA���������Hw�����C�n�UW�E�n��~:0�a	�.�
�u3T�.B0�T=h�]�A��A���A���sbA���@���vW3��^��Dp�~�['���[�"4�.q��=�t!���av�V&�~~{��lt��n���%���]X�\�Ek�~��3.X�$Vh������`o���Y��[����%x(K0��v��)�5)�J���7�L�C�~a�R!�i��-���u��5�p;0�e��u�P�[U/�����<���y�w��{pO����`��%/��k��]���Pv�W
�n�/h�X����x����u0nur(�K�����7���C	�aoe0rh�%'����o p�}����N�3�X�[&*�~$,H�]*��W��C�)a��<g`&*��"RHU+9IU��k��k�Tz���J�N@	z�]��Pr���x��J������������;$(Q���C�A/Uw��7�"��^�H��*��%����A���"��<���*�m����
y="0�V�:L"��
my����l��~T-��^R�� �f���
cJ����=�oTd�IY�!���� _6�!7������P6d�+��������n��X3@����X��<Ncw��d]���&W�����������?�=s���^'�J|�$7�,���5�|��@�<\.��|
c���C���5t�C��a������A����Ax���Q[ 5vK��s�!��A��� �AB�P�
XU�	��w*P�!~��+h����=�Z�4������z���,<m:�����(�]���2�W�F���"���n%�u������e��0�1��_�T%���\V� 9���]��FE�V9hD��Cm���O^&�{^U�iA��8�qA��<�C~i8�4��@<d�p�%���(n��>�/���������f���k��g�5������~%xS>NXw�hs�\��b��	�\"fWl0��`�%r�����4|�����lV����`�������$���|$���PY����@�|��@P�V�����W�nc��b�x���Z������E���G5��	#7>��Dn<�^X��	�>(cEQ<�W�rb�C+2]�
�!vc�I��{�
�T~��x����A*��jO�u���3<\-�_�U{e��p(PY^hY�.�~%r��`��b	���&��J��*��l5?�B�;�������
�|M��:Doj� lQ�$�w7�I������5��a�9������
vPM��w��Wt���(���������)K�X?�"GE��]�"��w*������������W����&������'n:��_(���-���+]�����f_S��#nm��J�:��U�O�id���3�r���A.E�pn�:�1��>���&�3<����?��+����~�Z�n�H�n�h�{8j�����9[�9�g�Vq��m�F��E�|�7�I�b�JU�{^�������<�^�����~��DQ2���;������s��m����V�����������e������!\�'�J(��"Tv[_�J���n������bv����� ���I��r�b^�smE��2/M���*������MNPw�F4�����VdY{���X��^@���h��Zt?�F�B���=���ex(�0�-�����!���w>n6o��>��M���2��=]��9)�-�2��]��
��#�:��D��
���>y�\�W��u���sr�.���h��(���-�u��#H���g�-�[w�!�quM��cA�����@���2����Dq1[�L��8;
:l>{4��J8{-{�6m���1�_���Q7�����p|���w�bv�$M��!�gW/���_.x���t��+��u;�q8�*�@��*����&z����p�P�J�#"f7*r���1�����z��t=/'��2��
�W��l1�2�����D~~b7��D��*�1G�w#�(��zPe��y����V�ZU���F�c|���F�x��S��av�[�\�m�K���>x�S]���h�n�e�7�I�����2���D�������C����?�������lV���S�c>��m&8�5k�Lt��m����eF�e��M����PK������l����?�����k��������s��[��
m��|��$��^f��5i����M�T:G���}���F[b���Fx9Q���dz�������'kf�T2�����D�I��ZM�[����nu�U���3Q���]�nT����������o��L�'�������$�;�m� ]���$�0S����^���hk���}L�l���n��Y�]�����n�����M��	�D/Sf0�����{"\���DBn�8�����Mrs���S_��?����NV��5����&��m�� ���'[M�j�������?�(�x4�u�H]����~A_�B�c��33���7���nt�j�u������{s��3f��d�z�C�"��e����d������'�qy��f��D�6����k�������b��uO5�K���4z/�7��!$1�����������'{�����b|��%P?(7���j��}^���\�6�'����9s�v[��}6�>���]XhK�����_.+�z�p}��������z'��{m�b�r���2c qQ5�\7�
4�����������j�u'Z�����Q���lqsj������3���F�j��D��x������)��]p�����������?��-F\S��cM��D��`�0X�	1[��yX�w?��IFZu�-��)8����M��c�e�V��i�P�t��2������*���f������������uw��|�%�1�Y~��X?Qu��D��Tmn��� ��B��d��`�x	L����.i�M[Df�do�����pp����~��n��������B�f���|�������(����$�p�1�Y�oNl��5�����sP����?��s�k����yl�z�`��l��F��?��`��p���^��;�����.���5}����g�2�����S:����b����Q���3��(2X�������`7s	t5�n�����Ov��m�b�����I`QY�\pmi� {[���V��GX�n�F>*�nB��F�@o���(�M�5�~��E+���4Y�JU{
��P}��I��h�^_'����6��w���b(�#Xu��)IuO�-�;N���s��_j��D}�B���W��l����+u�f$�����D�Z\�V��J��F�Z���U���X��=��2��t��qMv5�n�"�4����S�~��l%�s!F�}�4��E���[\}@�k9O���D��P�F�[�O�Z>QuX�����>����Jq�;�A������9�V�1��U�@��w�����?A�[��>���K�*W����e�F@��'���5Fy�+����!�^�)=�?��]��(Iq�K�:*1��9�F���%L�.��z�T��v����-�����r��`���h��u��`� ��5XWJ������Y]�����[3�d���@���$�7wHH�T��c�&���S������w���7aB��F�NH�~�h���
�vE�xh��J@��;�|@�	h\j
�eW0��u�����z���o,��.���	���4��k�a���	���t���:Q��5���r����k���7��G��{��B��!B(7�u��@�si`�u�@��z�A��V������Z�r������t+����g�?n����`'[�����B(c���jR��E`�&���V~�|J>O���!���C!+uK)���� �p��`�+K��{�M\�����R�h_��4����h����0�������&�?����3��Z�A)�F��
?t���y�:M7������y�l�*�
Z��)���@�G3�o5�G�[*���U��]�a@�L�UA�[]V*7����f���Z]���\��e����M@.�S��,\�{b�&�W����!�k+RT��lVU��*��U���:x�P��OE�TS�������_!�U����\&2MVLV�I�=�O��B���Y+h_�������`��t]n�\&!��f�\��N��� ��/����M�A�_��d�Ku���.5����g'��(]/U��b5<���Q�*PW�7�e�js�DP*	��9��'[~����t���k+�6e�-���2	��������?/U{p,��K�R5���r����R��J
�vcQ�������M�0�+��dUbTx�^j�D�"���|�	��:���j��^��LFMe�u�����A��d�u�RL7j�������d�my�6��X-����5M6�����F�.�V�'�\KW?t������]K/���uKa����	a�:!t�n�/��7uMM�{JY�9x^i�aV��_;���H�����J�f�J���|�G]
!l��sau]+OrmE��-2��?3H]��_��H<��+���'��j���g�E����k�`5z+�h~��B�z�M-�����*�A�D����\v,����Ng9�!�,\�V�_�$����u�`�&(�'&����RNW�� -����i��M'K�2q�^n�l]"�M[�|��F�,�l�b�z�g����+�^F�[]��|�6��G]��6U�5QWhuy�@{^�z!������w�a�o-X�b+�K��:c7����T��E�|���4��
Z���w�S,��$�K���f]2fzY=z��e�����U����]��l����%�&����e7H�eI%�}�e�o��4X��J��)2fU������@�K�%�����y������$X0Lym�*���@ls���gt� m��p��q�����G]��rm[t������
�=��m��m��G���5�'�@[W!���U��*�p���6���.���V
��Q�:zT�J�J�m����;���R��r�>L��At�����7�u�#P�JUF�|2Q���bu�P����,�=XvASz�:�`�Gi��M��;5p�$�1�^.����
�����o��Nr��,l�"�pCh�r	u�+���]�S�� Bz)���a���K���m.J�h%\orD���(�\h
���l����������s�2Q�sPP���R����������@�#E6�CP�D���Te����P����R�Ow\8lw!i�N|4���_������]}c�l��V�8��\�J/W�ls����G���m�v]���8����r��}���hs�(��e���sL\�e�|�C*������p���z��O��<�����.T��K���tk}hJlC/g�����+�T�a� ]�����~�k�;/����|��/���2�]2Le����<^�0�����R��:�n���o���\r��}p��R�������"��)S���}U�o��1�m�GL�r����7������}|�����PV�����q0^.=<8�]uI����@����Fl:����a��[����@$~!z\�3��z�����ArE�����i��b�t�{���%��Oz�����+�C����t�K��E�~Pe�!�r�f���s��@�'o<���?�m�>�U��F��A}O~~Fy7#����7�Gw����]����������O>�s���qVm��T��������������.�4:T���
��bP�%`��i�M��kr8�>�Hf��j���-/32������@�Z��h~��F�x���>�F�x��	�VS����7�E'�u��s2�.�}���ls�{4�������[�����t�V%��N�
z�@
�`�����{�*����F_�%
����{
�U����od�n�/lU���n_9��M��g��PRn��0J�������-Bw[T��P�y��]�v�r����.��*�Ug��LI�;�����'	n�"(Q�����Hd�L%�-������N~��U���CW,�no�'�K�N�����	�g����������@������k�����"�����+v��c���O~c�=��J��|�����k3o������vA�����r6t�s7�{Fgt�o�a��Z�v������[�2�����'�V�@���h7Z��M�1��+P���]�U�i��|H�M�_|O�`�)��<�J�����|������#��A�^>������w�����M�����������]@��pA7�� ���u�d�U�:�f'P����x0��0\�\rm����4*�#���
��P�����������t%��}�7��[ya�����o\���a���*SA��4�:�	��m��[QZ��|������Q�����k5���O5f���J��6��� ���N.x1�m�u�A�:���]�NP2�X>���O��m`�KH���`��u�L��-����9I����������K��u�v�j��Np����j�;��Q���J���
�r���*�N�����"�e��\&q�2�����4���*�"_���{5o��2��:
h���(���\��\�'��z�q��j��z�j���Q������!�}���o?JW�$�*.��!����������^}s��u
y=���H]������ne�W}�
������sT���|��i��O�Ya�|
���U���KrZ����s�\��K���q�R��ys��J�v��`��AE9�ue�)�,�3�Y��;����7�����Wb7WA�j�
��%��������e��VB7�7C��]UX���������
�^����WYa@W���2���$!���	Lo�%����
~�h&����Sa����/��CC{��!�vW&������o�����i���z�[�������w�y��r1������D|������l�pW>�,�]
��S�M�h��H��o���I"I��!���p���
m��@S)�a�A�9r��e��5��y*Q�r����%K�w��%�]R9�������J�/��	�H76���{(so7O���s�O^�wc����q�����0ds��nl���n�c��a����V����C!��_?���
��u[|�����7��ze��]7�5}j!�R,��A�L7U
���Z�j�^W����}$gN���_i�q@��0Pe��|\v4s�^�"O5�,�@I��j�UK���l4�
��,C���)?/D+|�b�`�A>5�����uI�@]�3����4*�f�o!1�+4v��n�"�r���<��������ds�y����W�Z���v����`���:���7��c��3���&�`������g�w���V2�������oo��U�
NRR�� ��w+#����`�i��Zvf��k8
��|��l���F�|�|h��K�*�
��d�6w� /���c�S�t���V�]�D�-�vi5XW2��"gD�n2h�_������+�K{���������6�G��&�SQ�9}`hsA��i�*6�����R���s�b�f�V�i���=?h��H;T��D������6����2�G}A��W�� ����j�a���5�M?�v�Gm?�]Z��^�2�'�P�?���H�k���w�.��
'�Y�����;���{4#W�Bg�G���oYt����e�9��1lU�\@�Z�m���Q�G�����~�DU��J@�J�NT�4�j%��hz��A����sm�nS�r��8:�n ���[�=��>x��r�-�{|��K�S���uS��s��� X��P-����� �^+urmE��o�u�M����\��@�;l��Z��uUz��X��L"F��mj9��
@�*����h_�X�~%NUB-��v���|�����&a{>��`�~���R��@�J���'hQ��G�7a�2���o���[�}�����v����Gm2�]UL�=����w��r��?� LG��j�sm�X���7m1j��'Xwj�l6o�~0\�.�\[���	��fmPw�h���4��<nX��=8����(;6�[IU+�����>(�U�
���A]�
hW�n������g7��x����e���n��;l�.�F~0D��~\���[�K��{g7�9M|��`�������X��3�Y�mu�y�k=��s�����������yu����Dl����n�1[�����'�B<T�������
(E)l_&d�������U���-��U7�z�3�Am��Y3a�'��xP0?J�{�j������@ P'a}�*�M�Z�|_����!�
MP�Gt�.�������i%vs��Qvwx�	���9��K�*�&�V6���@��Au[H�����
fw��d5Y��h<�W�3Y������9x�	��"?^bW�h=(J�K����K��=/Q�����>�v�v7��,;C�o���
���j&���E4���#���%�a���=Hse��K'Hh�&sm�:�{4A]��*���!C�2��6���R�@K�����u23�����&�����2h�|c��2�$�/���}�^��4~�����-������<��u��kKo{����^�s(p_��R�M�2j���Iu�kn��V]D9��������I����M[�.������e��{���.���C�'_5��k�J���#��i�Q�%|Q��� �kY��\&C�������^��������m��ggO?�"�IT��vV4���q3�`/�"��L�v��vW\���`YG���*�s�Fp����*��l(�����z���	iZ���-K�vs��J��.hm�b�U�K����nd��%���C\�''��s���$0\����T�UL�o����[��\_W�����1��vXq������M��(k��~4Q��E�}���!�����u�
\�nWW�x�W�����T!�;�V.+7vH�g1h5�0 X�;u�p���7Zu)/��$|���0��9l����?���i���Y�@���fh�`�+BO�%��+$�����*��-	+G7����~�����q���k����@���i/��i��WBF�$��n�!��-n:���VW���_	7�^V����`�W+��,������������`�K�Z��W��Kz�����0�(Wi�`��w �u�2P���}Q����=RZ)�	�������Ho�@�V�IT���Iv�������.�m6wHX�����'
o�"�u	������{�`��8��j�@�����O�:vk��}�����������U�6�������GWae�{�����u�@��m��H����-���"�\[��n����J�����\[1X�'-2R�������\}�t���TM� �
@��f�7$�TX{)��DUY��<�F�//��u�9��m�q��%���LB%z�5o>���@e|u1��z������U�~`����������#�6�3SJ&��u����J���|a���U�a�*;�~��7����Jy3Y7���hU[�f�j����������!��mI�l���^��������U�S��=i�v�mu���GQL�n�
��p&P�	t�ih�W���O���\ ��/y��L��/S�j��lu�u�\%��J���ui��A��P�Bz-��n%(Qu������)���T��E�+>�CFLe/�u�� �|y������`�$��<���8�Dj+��v��UVZb-����V�������t�k�k�:�P��.=�G��Z7G��V����K��J��mU}��F�@�Qt�����xO]	lU+�����7�����2!�tC��
1���z��������/�SW�4Yw��<4�.i���_
y���.��35����uv2���,���`�����������n�b�T��`��u���5����@������{�A]��_���d�V�TXW)���/��W�p�u�AG~#����U�X�������Uo�F��a�/.���
�]�4���m�0t�a7}Ct �f,-j�������l�UU��n[+����j�4z��V�����+/3�#n	T����_��Fv�Z���J<��?/{��RD���b�k+j���f��4PW�
�9�������'��G't]���
1�K{�P�f�$��{�A��b��o0����\���y��D��L��`�*���
�~%`t�����*j4��+��������l_��4:\,�R�aIw�h���{Q���8`�9��[����5�M�>��{�PS�ha��5�n1�;��I�A�I����p��N�����W�o�|�\�shw�c�u	7wHh,�`]��K0��� �}]^>���Q6m/�]-�uU�s��6�KvNd��GM��w�I_��t
����z����H{_�[�+��s�������Oc��o���O�!���C�������j��C0W���W����U�Z��k��@�CD�U=���t�P�
����u���- \���	��m���A-"Z�u�g���>XV@���:�`�����rOE+i�u}p���`nOe��u��������;$�s+�x�]�7Q�y��P�V�6��e�_9�����!�7*�}O�N���%XW�d����:w��V~h"g'�0vG-7�;$��ad��2����Wu�&��q~������I��z�i�����g�nI`�����VWi�v� �v�u[���]��[p
����)z)�b�^������!p�=K����q����h=(x������`e�I�[���~��?��]�J�
�	�F��6��>�F/�s�n�6�=�����{!��w��hI�z��/lw�@���K��,��T]��$�F
��;d6z�������R�C~��W�k�yk��#[n�^_���v���Q5.���ps��.$��l��*=������|4��2���'�l.�`��)���M[�n3_�mqn�b�u�*h���:��e�j1����0[\H���X�/a������$}���������@/1��������}]���<�!���q�z�h�`h��5�{��E������|�����~���[���������	
�L�>g�)xs_�X�_�zit
v�����/��W�za�+�T���'&��G>��+9���n#�]W���7b���w='!�V����������Jt=�`�94n�y��-\�����|U�j=�����?��:����
����b��Z�uEU54�cY�tGe�����[Lt�9m.��2MH���}��s[���7�n5���E��a��ZHwt!�PS(P�7tvS^3SpU>	��!/�x</X>r�MO{��aNgy
z���7�e����5�j+�DO����qwX��i���?�oQ;ma]u��n���r`��3E
VcWv{���B#�� Z����z&��U�~����p,����#�TA�\����%��q�K����y.����]��8�o5_�Z�0�?��Cj����r]��K����Me��U=h�/\<�E��`����,|.��T��
��p��ms��%n�z0�����J������}�
"�2O�U�F�������=����K���7�s����n���sQ�=XW[��Y=t�G��;����u�����F��$�~:���]U�{�}(�n�������p�O+�����}u;=f�n���}c�v^����h���\�E���k�:��}��;%���x�\[�k�Z��d�V������V�z���K+�\
<��jo�����j���`/2f�< 5��|���/!�[	��Q�3C�K5�Y��f�'����z��q1��,����z0�`k/�'��������O.,(���L2Y�2�Y7K	��h��\/���q���o~���^T�!���5�gu�;�>�."]/.��uQ4���y����*a�(n�"�Q�`���
�K��V���l�*�*���+����]�a���-�|
v��F����E���>s���v����(�9luK,/g������+�u�����������R���e����n
Tfk&�~�(�rA������e���>�fu�nW�A�#�������=r����������B%��.f�%�Q��O*��uD�����%@�����*��V��]-.i��Ls��;}�al:������M�?����S�?I��\
�~���)(��X�K~�p��P�������yuj����d�]�nl�"R�l��L*��E{��\�DfH��}6_���������"P���Q��y��=�/�,�
v�X����`s�D4��=Yu��>�J������:h6���L}�R�]=�h�[/���2�����]�@����}�[u��@Wkq�\�z��]������������e(����N�� ��<]\2�~V#o�b�U����m}\PH�%����N�`]^d��6�t�PntY��t*C�+�����@��(�.-�D�]\rV�au�(�6��*����
���>-�i���������7A������W�/W���Z� @���z��;����r�T�O^�\Pl�G-��*L��
�.���b~���`�vn
��R����hw�z�1�tq54�e.w��:H���.��[����Z������X��s�5�����	�h��
t
U6wH�'��H���0�G�"A/7������sq�a��MM}\�}�Mv�j~V�{�(�4�p%�
u��N$�2���]gF %?�]�U���@
�tqE�����6k�-�0���L�%u�i��������s���^���W�E��a�HA�n&��%���UK�F�u�M��)i5lwE���n����������/���_	��e�r&�@���@��r���p�|�0���5J�n�������bSL��b4���/L��M�����/	r}�����Q���1�zQtX��Gi���������Rq�7n��{;��wW�����k���A^\�����@��c�+�|��E��Ch�����U�T�>n�,r����M�\!D�����.�:�������$sh�]�hu�x����0X	���K��~%�uu(SN�o�����d��/���2�A��U��XX�Wv��X��_��e�L�RO�&^~-��\�����v��s��F�n���#��W�+�X4u}��LA������x�n����2m�v5�m*����nAt=�a���j~CX�/�<�V��UI�'������r��c���=ZoED��M-�����e��oP���9�������U��'l� ����*�4�#�����FT�UM[aU�	"g�j��Z���FL�i�D�*�]S�_&�lw��d�h�%[��������/�������z�4���0�����s��c�+zm���j�ZU�>��or�����&�]�-6m1��2X7�m.�C��D�;$<P3�:%����|�����~!WW��oJ��{��2J�h{���Bj�V2l�S�w���o��������Z��u�P%P�<8��">�J|;���+��[��W�����R������������#_�X�rW�5v��4���@�'�
������b/w��k]z}�\p�*�9o6������`U����>������."�MSDn�#|s����?{K�����6e����Q6�J��v���S�M[`����B�_���!x�������j�wU�	�nIt��.W���>nB����~%dTE-?��k,��������@�xu����xm���]��SX��J��]d��B=��77HL���`��myAF�T]]����a�v�@��A@�b�`o�4y�J��	0�aB��>L��B ��.�B���U��2��v��@W���2��~	�������V]�hS;PA���6�����g|8r�������D�����v���9�@��7�^*�wy�6�JL�6v���[l�"(��E�C���^K�js���*v�0l�">��f�7��6�k�8��J�x%~���;w+6����aW�C�n�T��l�:�Fj��v�.NC����F�����+Z��4��2��R_{��3�����<����qU[a`e\�?�bC�UH��������c}�>�����^�;�~e�U�!a�M_��4]�T���_?��n.�
� ���x=�0�J���W)v`�#�6m1���Q�N�>�!5[uS�@�K�fQ7�:����g]�b�@�6�����h��?���6W��)_��i���S)-���h��+�FK������&U���d�w+	�^��5P�C
t�����_�q�b;��hq�����TE?��@�}�.���:f�����7����<��@Tt�����C�?z$�]Q�kus��3n#E��[��/�
��b�gt=�s�9%.���*,����V�*��_���uXW��i�Uy*Aev�^>��~%s���]�*�u�z]�y��C����������_�bn.�HJ�X�u�f����'����:+�@M\��2�g��n�"0�?���nZ��MT>t��
�5qui�]�>O��*�}������
����"D�
~��!K�nu��H��eF���\iu��7wH$�����F8�Q)����#RY��,�p/S���@��*N���CpR����i��"���`�A�uG����� T��uI����=L0��o\�.7�������c���E������M���*�!h��tf���-�T�;W���N4�z6�IL�r'�w���Z���UZ�[u�\�
m7�J�&_`�ip?�zjH
t����C�7W��Yasw���z���t���Ly�'�M��P�V
w"0�|S��~�������A�����s�����q���r��JM��u��mu|l��e
t���F�`1��=�"0�����=�>�-)��G`��.mls+������n.��ce@�C6�JD��E�Ez����|��\�:l�������� ��l���n�z��s�u�lQ�X���;$��m
�i:��7��k"������T�zT{NT�J~��~�~��6����M���2A6�$���1��E�)�d�P6��7oWk�l�*8�-�jt�	7��r��;{+��#����g������^*��
��<Z����kh{�
�`o5'u��~��i���b<q����h^�����B��./��_;��.3���B`C��*)�-��:}�(�������*9Q�����G07l��L5���
�����rn��������/>�_D��u7x�M�_��
�������@%�`���	G��$r�_M��F�������G�����`�}�yT��u�����S 
�pS[ka��L��<d�IT9
�-
����*�J����c
]pS�`��h�4*��@����!�aw =�Zo�,j���`�
�Te�l5��l���1�U�O��v\�F�5
	nS���2�w�]���&�rs�`�{�uVD�������6�9v�������]���w��{��ht���
[\\�����;	�z.6�C�'���|�QW9*#����5�|�0�E�`o�P
����V�U��k����-?�����C�~r�nC�\b	W�������+��]�C�A�Cqscq�.3���q�m�t����m����OV��]7�l.�H����V� �'ts����������u���s��>�;�����tuM��R�������s�=��)�c�a��Y��*r�_p^U�@������������D�&�H�F�C����is��_.��Z��FW���������%g����>������2���{�HH�������E8��p��K*�zO!�p�@U	�$�	��[��\�vy�6m����R^x�����pY�����3�7o�i�������w�5��������5��jC��6L��J1:\����w�B0P��s�r�"�5���e��^����
���2QG+"��WR6��MY�a�������hH��K��N�j���@7��D�|��@��vX���P17�b�-�����]�"�;d�������
)rs�t���X�qs��
�0���2�������e�����JV��*X�@��]�Z���������6n.��m�V>}����e���U��B��u]�N�4ov�in:��K�@`��A����]����v�)�i�1S�H��U�Iw���&��u���a��o��
�oS�_XwZ<hu�A��
-j_1h�X��:�)�0�#��Y|`�U��C����vQ�����{��������j������y_���U�k+X7�t�nl.sn�U�5�^���P���G���[��n�c����t	~��n��T"��j*��p��"w�-�?5��r��L�(W����h?����A���D4���~h6m1��)d���3"�=���v�U���������0���Q����Hl���1���X��-Vr�	��� >YW�q��~�����!��`/W����h�a���}S���6��S�;d�TNX�G^f��p��@�
���m:����*���p�f�J~�4P��`�����B~JC
��
Xl�s��:+J��"5��v���-���.-P��+V�EP)��h>RD�����Ma���������S+�~�qt�H�D�\�l���@�����f���s��\c��D��*uP,��A����K�@��^��M��*K0��#a�������M��
ZQ������{^I��'��~�p�����@�g��$�77H�����������{9���e�����n%Lu	�`��������\[��BP�4��T��_�*�t!�K�v���4���x����}��-s�m���RG/��c�i�V9
Pw�sr�wh~t���;���!����U�HgF]�����C���V-?@��p���,���G������;����������v�LTy"A�~2���o�����v-l���h�}>���z��}9�7w����%��&]?���\��H �p�K�Y����/
�S����pt�w��L�[���Nu����U�V���t�7�*C����i��V%�`���z�7����E���0��*2�!}mm�D�G�ut�]�da�����5���~��iT�� �Z��+��~�m��A�Ya5��.���2�U
?�;����(��4a�d���%��#�t'����F��F��]8����;:��c,uRt�u4���P�6���w�t���4�unP9��3m������tt=7�V��#h��;v$�]��tb��b�v����w�o^��eK�����0���ss���R6�����f}*&�b�S��`o��r��@�/��ya��]-u�^n�huA����>��2^*{�dU�1��VAJ�:��.�H��}�}�*����dU��f�����`]j8�u>��������������q�ug��>n�~�qs��Xu^n�i��'�C6`��-.K5[=�C����-j�5�K��N#77H8�j[&+�U����l<�C�(��vq%�F7-��G�����y�yCL�n�	��M����=��7�?Y�#|�J�+'��
�y�n���j����m��e_��\[�Hq ����u�%�t�p��6��iuyr6wH�*�����4���`�1����#�@{�R����j��}J�=����Sv��]�1a����t�[�=�_G����i��*�����#����`�:���r�8���3�����D�!N��eW��]U��>�;����H����$�{]���~%BP:NXY�������sy&�>���`u���4.�����@��p��]0��W9u\�NX{��@�K�[,:���,��]mK�K�S�:��S�����]��XLv��m�"����n�3����c�u�7�:�=h�������+s�g��5���m���j
�K�w�b����;��
-�����u�!N�����uZ��s���V�+�l�4���v���u�n�f��hsu��h�_���mW[3a/�����2W�<��;$�q9���u??\��l��,����lt����x��P4�cG���(�?��l��H��e
��H���-�����\~!��v�i���o�s�^�`e��z���T�'Z6~a��J�+wfL���I��7�~n'��O]W�7�I�;�>���W]wu�@��D����H{������F����w]���Z�%��$
���*�Ly��}I]�m�������	�A]�3Hw ��W����.���[	��P�����r^�����-K���s�\��'hs��@/!T>��G��]us����+]�_)�r�:F�����c6^KRm���).f�����H�c�O��bF7�
�:�28�e�ns���J���Z�@�11��R/�^�U
��L���F�@O���?�u��K�'�>���]q5���
�x�������;${����������a�>����,�B����!�[�����4z���2NdY����{�����kius�D`.W�%����-u�_&~�����$��vW�����1����\��r�n�����wioW�^Xic���VugMT>�q��lz��Rn	3X9������4no�]7'��^]��]Y{aW#����r�������e�Nt�2~	��0���������Xp�ZW��e�]�-7W�0����������M����\w	lQ���l���w(	.���j�u>��LNOT�C����?����?��
V�e@��7���U��`U�	������-{s��4/:��n���e� XwP'�*��t?`���}�_��N���D��.��T2n��� �;d�������7m
�2C&lS��_��72�/!"��
aW5eufR��}H�����7��@��y����kf{s��j��Rp�U���.�>'?!��*���J��^����#n���D�����C[���}��1���a<P�U����N������c�w�-.Z�8-����E;���Z�e6m1b��-�p\���u��/�����^���)���b����uc2�����WjU_��6m1������Hb�y��@d;�����X�5���LF/7{�q�9RY���+��~}�\n��z�}�-v����g��+VE'�r6qs�A�[��X{�q����D%g�����w��XwL&�1o.��By�`�������+�.D�fU�l5�B;�������@����D<�0��wO����O�6�2=��p�T�D�6Z���|���b����@��t�Y=h>���x(;�d�rA��R���L�7��-�vL]���XKQz5��EoS�|���)k �;T�����$O4��n�)��a�w\���:��_��R<T!-�;-l6��k�V������\�57p��78��-���o:������3�@�����
�?6e �J){p~�@�;�&m��V|uS(����n���m)����Y����eF���%	�>���,i��u�J`�|����N&��Y3�=y��]��S2���������qm���w����&M6m1���`o�%#U�~���]��rPb���{Ap���>�2����e����I���C���	+W�my��@3<���vY�@��%���UN[��=�^�c�������}f�u�\��.r
TVn���������=w�9�d���	��.�!�����<ks��P�l��o�"�P6Z�����z
D�y���dk���g�sf6���'uSXp�+��G��%L��k�-�J:p��	������K��l�����'�A�;�6}C���;�2���" Zu�@�+��������*.�L*e�l�2.�\�F�+8
��F;�g
�-�M��F�+�
�9@>DQn��~n���E(�4��=X�E�v��^no[%q-nA-P���������
���suZC��`����N�����Kt��4�����"�JF���p�����4*��`�� ���v��{����V]��8d�u+��|�k����8���w*HY~��?�n��n-\��O,Y����u
��_����6y���(�V����_u_i�=���ax���`m�����2�z����5]�'������F�.���[)�`Y��&��H;���Y^
Ni�m�;Q)����D���R�k����|���e�8J]c�A�_M/��m�����+���s�Be�n�����M��P�?��e�
E�h][�������ZN�d�+����L!���J��6Q���r��d�v�tn�����-lwC��*�@P����s�e�<��,9���.}�g�,���`)1Y������R��'����/���<:������C�T��Nd}�
V������<:q�]������j���_������^�/��L.5 �����������<K���
�9�$����h��J���HrB��uGp���%�x�{G��!���.���ts?AOKv��t���^y�������:op��)��v(z;�0[ou�"��:�$X@~i���%a�8�'r��5���:����n�d�ol������u�(���=��&�?4s��Kv�Jt>Qq(%���$zM�bi��=��%~UFoS���,#�x�S�"�cbGK�6��SN��;�3�3F}'QS��;a���;�Q��E�b�?��s�h('�Z���������Ot��;���[���S���sa��P���I�m��?���n�`�6������~t�Mn�aF�L��$&:g�.�aq��o�(J��e�����	_��M����D�O0�aq�5u�����d�?����(��?&���'{%�_�,�����Q��
��`���/�5d.���8@���d��^'�������4&/������w\L�x��U]O���8���/*�5Ce9����0qF��F-�a^Gu;c�I�^�C�d^��jtn�WF�*��b
��_Vn���������5d���U1�Dg�����������u�d\�^��5d�W�U��a�q�������E��������`
���Gm����3
����j�m&c�wT��}�������|�Q�t_a�k��P��K=o��D[��)DNT�%���;�YSv��X}&��N��b,,!�gG�N9��������!t��l���%=og���F��w�e������r��`U6k�s��2zOl?!���L5w���:Iw�R������f~�C���v��E~��j�Q�7�h���������������lMT^$z�s�������c��HD�������04����q�������b���d����LZ\���
��q���d],+��Q<H���ok��Q�)�9����_�XW�T�����[F�5P�������]mJ	�r�Tns�kjUG��f���2�����6z���\��c'/�2�+�r~�����>�&U��J�j��Q��Z�E���j#[��jB����M�qN�@[�����1�'�dm,�/4��WQwB�"�������,��q�@�t�\L���'+��R�^�Js����
,k����a��~Y�����T��1{#i��R������:'P��F�m`��*�_�T����'	�X.��##���vgT���-���9����k�[,�=�K��r�U�v�����1�����U�a��y_f��	1L�l3"����K�h7�l���;�G�n���4F�7Y�����F
��Ic*��U���:�_��Q@�m�h��Ic�[����5|���_��b
����c�ei����0����L���sT��JT�]*>���W{~:�O��`t��=��5�^np��0�8]��FT���lw�K�7�b/�j����:�)������s�97'���������rV<"�.A"�������9I\�#��e�����}����]�	��~����Y���g
 ���9S��v����#p1M0#�������X%�<�uVN�s/�
�}�����)/����>�`�
�����nS�e9���O�A����\n����B.4����K�GO�9���������S�f���C�s���495]5���O���I��)7������^�Y����[� ���H�������9�\$��m�%]>���{s��t5�~7��G�Q�M�r.%�~]����[u2����i4���U(����HQdK����?G���9�2@Pv��@�iYO�aad;�}�c7��,m������\
t��
�F9��9��74�����wP'v�a����?��Y�<���L���"����s+���K;a1K�
M%Z�R�W��m#����pRNh�����"����A���Q72M^L(���;b^���7������-u�s���`/�i��,�@g���b�aDw-��P����&�?%54����2�R"�=a�O.S%���~���2��J��OM��b��d�~���4�{@�Y��~%c,���YP�;���v	n���2hO����/MU�1�6������2~S�y�����_��=Qav��@U�D[Y����Q]n��b�� _��;Q)&������`���z�8�
�a�8���t�u���h���=�+�b,����F�*C�)�<Ps�|����������Uh��������������t 0|�AXW�*K�Qf�+��;q/�-�1��A
:����)v��7O��
���c�*����3��"�)��v��X��2�[���������=��/���V= �*zu��w�.{�j�.]��j��{�D���}���)��^S���	����D@��������aY8+-��`��J����i�����$��YU�F�:e2-��BU��:�H�CE�sTyb\[B�����
�U�m�[�Na�����q�@���wH���;$s�;km��j��nh�H�:�8��"@�sc��41��l�� #�;����W+�:����{�}VN3�7��G5w&X<!'�
4�����g�"}+?����etC��@6�P��G����.�U��]��)~[��S�V���^*���R��~��]�8@Q�u�c`�T�����y�P�u��@�<��/8����p_��{(�<���ufi���YF]�3G�0Q�v����q}���_g@t��������b�9�R���	�q�3vR���t�Sh�T�U������J���mJ#!'\�<��=T4>Y�T�����bKt�:	�����R�N�<G��y�l����`�z2���c�{��j��0}C����s��`���2jw������	�7��-��(�	[��:�u=���������N'�c�m�f����`7`@�����t��T�D������3J��<x�Lw,�:gi��L8g��Aw�PY��J�3�za����!��-���8@��hs��At}Y9��`)��nh�n\C�t���\���{f=�;��~��D��p�����0���Q���X���p������S��*��������^���O`/g��4�T?��Oi)�Z��I=���T6�k���E��u��u�������������-jc���v�/T)�@�������SJGj����?!V��_;U����"4R7R��H��������vB#�9�O�3�!����QQw���nqu���s����~����N6�t�������=����{Y��=T-��yY��e����6w�]�	����x����^��PJ�}�������_����RX\���g�b,�>W��F�3���y�Q��T�.���e��u��`g��:�b�9�[V�l�V!"����.2^���3���u�E�s1k=7������u�I�^�6��N���u��k���8�59�����K	�u�.w�Wu�����������@�����Q?��J��)�zr����������������J0vN�-��\F�t�Z<!f��g��h�J�V�����FF�}�X�?!f��>�uf�}}9J�����v�3.
���s�N���b
9'g��U�����o�����%���p��"�%r~�,+��l%X^WD�w
���sTK�0��t^,
V�3a��������4i�,{����*��a
)	*���}C���C����W�"��~�k#�����E��3W��p�Q���*���y�
s��Y(�6V�}.I�� _����T#�X,F�__��u�=_z6����*���{�,���s���^.��a=z�����7�������f��{@���,#C�.W| �|(��d]$����(N��i��F�>j��+��6�>b>�PH����#���
D��F�|]�FQ/���+V�u�a4����p��F�
�������*���.P�m���mVa0n�{ �}��p������}[F�N
�w�|/�&��<F�z�����	������`����x@�>���9���`
��k��%d
Y��
�`o�����K��A[�$m"��	�K]~@���n1��4�%���$��x���Qm��h��\�Z�s{��Xt�>F���A�~��T��X����iRhW������~�HSFw�nk��
^�����X���1����,���}��
�����fnc$�J�zM�C�e%+J]Ga[����Rnr�@������k�!7gY�U���l�!7�C��9l}�*S�eC�>uuC����:�^�1m��.��3�uR�9�3z��6~[9�8��U�a�8l���e�r&,������.��U������Q���m���Z�i�);}X���]`�pV~��j�nYc�z���sSB��r'��x�Mt:P�!�j�`]���b����1
������{�n�����|a�jG�jmrT��*�-�w�����l����?�1&�R����b��t�^L�M9�a/��m*���(rT����W�!��Tn���i�jA�
m���vpX����X����6�e��@�eh]��!8��?�������9�9�����u�f�������b���z���et��F��lb�����M�����\KYnMN�������,iQ����8e�UbY�*����r�O���a�}���k�:�����z������Qn������e����:����S�!���tn�]F��d
��T�a�;):=��F���*��Lx2������a/����4��Al�9#�>�����������|l�Z�X%���������"6��P5�-��F��nC#��z��v	�������������������&�C{+I$��`@_UC�h]��
�(��
;6����n*��uFn)����������e�O���u��rI*�;��i��u���uQ��.��K�6��]u�^.Y	T��%�BX�;��&�����2
}l�9v�~WF��[[���F�p���m��Hwy���:Z�h(z7��u��@wl��]�������jC_m�ca����	�P�:}�w��)��N��u9��\O�b�oJC��y51h���<�ZG���� u����+)����Hd�y�.�w��QG0��W�Sat�4�3���,��|,���:��]�O��6>e0]�r�L�G�'p�����������xS���2p��@/�JA�|�cF���(;�.o-P�xeP%t����|'g��X��f
�v����4����n��7�m{od#������D`1f�K7
�r�c��vJ���f���J�`���F=(r���3���	=J����r^�`w�zo�GS
����l$���mw��v��.�~}V����]-���
`�"
����ae�^
d�_M�����X�,n,	��W�muM��|ss�pX��a�����cT�����hU7���u������w��Oka��*���r�:�Z�.�<���+.],���x9���
A���::�!_W�BG|g��%n���aiu���s:��	���E7��>�A������C������ ���n����v	 �>���!DV�!���07�\-]F�Y`��j;������|���0���4�p��C�S}C��5�������.�<���7��>������>��s�>���_@��Q�,wT��~�\_jO�u�ro�������eZ����d��3���u����	��4�0����%�;�F��.�<��e�3a�:���e�&q�1/��uUa)s��&\`���
im�B{���ft���U�M�\����O���:�a�+�6��e�T�R%e�Xtl8LQRn����r]��!j�\���������Y[�'�(qu���	����2��T��3lT����^�+V�<x�U�"�N��?g��~����}T�/j�[�����&�O�h���E�@]3�W}��T��X����mv���)���sa/���U�
����#���������,���t���R�MVY4��
s��u���sW�_�[�*A7��z�0�4l��:�f[L�a��@�}��k���[������!
�RR`/u�}UZ����n� �U�	���^��1����N����A�$���3�r��U�>P�BX�"�z��>J��%�����oG_�5B���k1F��$�>noC_[���i,sFes����2��n����*8�������O��2�A�zH���U����������U������u�tS��d7�wh8����i��)�u���A
��5]��h��Sv]�`��=������{�x�z�FG�ynd^+B"����t?IX~TWS��Z7������Q�0��.t����*���:ut�g�6V�p�8�b,,�����cq���y���$����zJ��Q��[G���;2��*a9�������u�]��Jr����=M4p���k���PIZ��3�y������j�a�N����]�L�������J]a�z���|nw!�`�(�CEmA���QU�L����sV;���CqT��xX�Y��5!��.L�nT�u4p����e��A��Nt���:�pSz��l������DI����D�= ����;���Tp�D��c���n��l�u���������a]���SD<�n5|*��������<���u��@ow9u77��(����7hW�I�6�����)k���n_�^J$��U���p��*'�o���S�J�V&]���(1O^��b��������Dv�v���0��	�S�4/�`���n���b]>�{[����q��$�`�
?��M1�������uv*��*�:QM��|�bm0S�;��U���N�~�;P'��3V]������r�0,�N�}��
�qn��D�o��w9��O`Pg1�2��5vw�@��U�XVF��
v��caD�c)X����S�g#���rwGv��wm�����������.�2P��A�xg]1h���d��*���^umA]����2�v��
�;��z�j?S��}>��$K�}�odm�Q]]m�S��QG'�;�T���VF_#B(�^�����}
���t�'D��{1M�(����x�t-^�kqO�I������A���������o����1l������i��,1�\��/k�����S'L����u����ag��2�4�@�Fi������
�R]t�#O�]�7�������U�\(��i��F~�a�l$�#���~�
���!2���a��z�KL�2S7��Q���qw������@w�PE�J��B�@���aT�:]���Y��V`/W��N�@�
�%��s�Wm��������]�P�u>�@/���H�F���<�`��W����G���E�W�t�}�u����@g!��b[(�U�[��Q���/�xnWR��m#2���,�A�vJ1Y��y��m�=\�X����*K[z=��y$p�.���8����u5����<�������u�@p����'� �+S��u�A�u�!]4�l�@��~XG�W�����������&�����F�6���C�b���.g"Xi��k��u���8����~UB����}������.��:��KO@�v3cg�*%0muM��|nw������tj�w7j�P��J��v)�+�5\%."���_R�7�����++r�%����zd��[�m�$F+�����S�������-���a�g���[�S�z�!��7����|Q�qG���hwW���^�V��o���_�6i��-����Qr���(�E���,1X��G�<���������$U�$���x@�9��,���=��*�{+7)��"9��=�)������v��=!�rHm�<W���
V9�A]�Q�K%��N��t����{_�rr_���������__,�FJ��R��V~������o��M3�kr�����`�W%M�����@z(h�G�$A��C`NO�UA���UX�+������X��a���K|���6����T����z�/N]����6V������r 3<����g'������w������`�9;
]d�=�y��z%�@�x����~����$*�5"��f�Y������Y��v��XCJS�P���*�	��]�B��\�����c1M�y��{8k$����_)g���{	:�:�����`�
z�_��e����l�u���
�������A���!e������@_�8�LC%h�����Q����8��J'@����x@,?���r�����D�������2:��u�hTZ���{��v'��nq��*p
��?��[���������w~7�t�ZL�On��2�R!�)��x@lF@�����t�x�V��(e��{�38P�n:_lO����������u�����P�������I5�v}�a�������m*O�]�\�he����t��!�.�)���%�[�8�W������h�@o��=T5=������=��5�[��:��v�n��|B�>�����C���N�DF@U��]/�HlUy��<,�����4���9���4��B����6V��OQ��XSNm�pZh���
�
�:	{�|�D7~8�����|u�\P�%*
�1�j��������J�b,j���
!�������zQTv�R�;�\���8������k�;6\�%�{l��!�;Tu9���@�=m1MN/%�����+�}6~ttg)��X#p�W�l�U����7-��d}`w�l��u�[����C���n����U�����/����D�u�`�Z}7��K.3���s�c���JW�N����p~)��d��}W�C�H�3��wo�@iu8�������T�����G���������������m
��eS����l�f����������a��� �Z��1ZJ5v���ZvPW��F�3�s>Vm,�V5���$f��;A�����??N��]
cH)�%+���w���F/w�NU���������b�Q|6jRQ��{@m����r�,b�w����N�Bm�7N��zo�/P�J=7Y�4��l����]�8�l2,�+��/��U��{��+���e���FW^��mJh�Z%%��:Y<!���Q��2dcaX��k���/(|�J�T�2�)l�8XB.�v�%���7]������Yx���S���	�;��^���9q}\Frj���y�l�;S-;��N8��;>u�]A��M�e�,qH����@�w�4$p]���)a1MNyW���F!���m�Q
7��8/3��
e��������b,\�l]�t �:\�S�.s�V�e��A�x@�L����h���y��rd�����}�-�������4V������k�xFzt�Wv��Dt��v����.m�;��@��
Q��o�h��=
;k�-����?�V��n�^�[������u�4/2u�e��l������C��'[��K�L����Iw�z;)�@�������s.�W�\u��@�s3�I
���9��<��%���n1���L�uaP'�:��)�1���S}���!��c��fg����}��8�u�~��#���k3X����5��SIT:w�_������vn��+3�sE�[�"����;UFl��z�,��f�U�L���]��x*�G�g:xc2Vq.��nN����7��[@o�j�3�{�N$g���X�������V�DX�lz(�)����>�
�Fw��u��u�K���
Z��7:l�{r��Qw���a��d=�D��T���s����Egj>�A�1��S�/�zRe�%��,9]�:��,V{Fn�a����x��#�Q���u
���S)��>��"��G=Th��{�NT&O�+_���(o��%��9FQ*�K%P����b���n��9�F������D��bq�R����|��S�}���};�U���HUB��M�.���,:Q�U�};Y����JU�6�]����X�K���;���K 9�����"�Uz��D�-N$]�6�3���Tht.|^< �%�R�rX�m���*�@wL�E�}?V�
�PI�9c�t-{Qib��)_���P�<��H��A�R�,A�����XF����n���L�J�e��������J_?=����G��T��2,���F��Q7�N$<O�F���+����6�h�Z����P929��3�{qH���n4b>��<�0�=�ca������MS��A��(����bq����D��.�s��y:H��CO�B�D.����{q��<����0}��4�k��A���K����Aa�:�uv�����/���jnq����Q]���z%�9������3���}���P�8�Z
������Si����3ca����d�#a��SOi	�UR�M���r����;��E�$U`o���u����!���W^��c!w�Tael&P�1��K�D)�T)��s�^��	1,ym$���z�HG�.?.�Y�b1KN[Ub{�;����:�XT	�u��'
��#u��yW�S��mrq�������LMX�6���6��[�u�Q7bj���]jc�A������@W h������@p�Tl�o��[L�E�R����Q
�\��"r��
������!R�����z�[R�Jr��x��J=�
!�l�-���v��`'�w1g����p>�@��������.�w���.a��0(��������kH��W$:m/����u9���m�Ra
��L�Y��n$k�Y*C}��������='�).�	o����E����m�����������o)[jI�\�r/���V�D*�T"���u�Q1wgg3���t�@_���c�����;u��aw2�P<=����\���'4�v��������r�}��I/�,ZT�E��'����`0�[h��Z�q����Xx��FV���y<��)TFO�9/A7
-v=�	^����5e�-f�
�����VA��F�M������k�d]$
=Y�m�'��������B��t����u}�Q��]a���N�]O��
��U�D'�t�
(��8}���p��?�v?��a��'{�8�C���a �z�@��:��k�U�M��:�g�}�)XL����������u>�h��'�����{9�,�:�tl]�g��U@��al#�{*	\��3G���u�����^^�0nq����
G�s��E�l�@o��1��E����Gu;���*mm��w8�NJ���5f�<���������_����N^��,�J�����0���G�:w.��SF[h����q�9���C��*��~��^h-�S��$��-���ife����"��);��|)�/��Q�f$��He�25����/��/�7����b����s����e����^�}UL-�����B��R'l�??M��
����
��n|�U5������$m������:�`{�������	����Vo'q��|���+u������M���r^��u��\�u%kGy�a��U�UR�UO���p�� ��BN��n����,�bj�T���3��KE�a_�NT�B�J3!vJO\,���D����!Q~�V})��d���.��]vh���#�zF����X+R�����l-Pg���n�tV�_�+f��a�}���g��:������{��|��)lwqJ�g=j=|!�|)O��I��*�N��	�P�W�������a]21���U��|V�	��/*���1��T�]]H"�B�d�����R%�Ra��-!|)�X�x��lC1N�����>
:��,�SH����W_��^��+O�@���b��9JT%��w�{F����
�ca�]��3�}�Q��n�������,N�)�C�}��*�s��b��J�v>�*�����/�l/��;e��=������e��h�>��49�����g�3��.#p��z��K����A��	��eugi8��A��%�]�=�����Q���R�U%��>*; �u� P�0:����u�>�*����N��6>�]����w��q�!�*��D_�m�1�z�������ha���u�:��s�[��uc���r�`]i��
��a�B��r�`��le/w�JVMYX��"c������}�s����b��}&����B������:P�����@�a�r���zS����m����-��P8z��3��7h��U��9�*��C����Rz����/4a/�\$��#-������C�q���3�*'�������}`������Oa1MNj���uN�@]�;h���~Be/���8�Z�c#L�*��*=a]���>>Pu,����n�6�J6Yw�?�qR_0���
�2�z��dF-��B���v%j�D!@7:�_�������58���
F�����A(�^��l�a�����r^����iW%���J]��^.4����v����g�T�$lsPw�@��y�x�
��������{@��rI��J�Tf[z��n����M��%�{���^h�^�k������P���!n�uc���>�}<��M�����������U9h����49�����u�L%��ir�;;��m
������7�xTR��%���7�����*W[r�bY�9��XW��}�HntO�K[t���B�U^�Ju��u��{Fm���	?�	�Y/�m����"ol!?��!�:��d��:keW��x<�������N�p�u��s^+�h�v���0*��d�m�������JO@��E ��1�B�R���'Al��t��QM�[w����,a��.%'(�jo�Y6�c�\w�FRV.��%s�F+K��S�o1�����u�F4e7NR4e�t��$��j�rm 7��w���+��"x��;F�2����8�Q���-���*z%z����Z�tt��+�����p��p!�{�Z�`����J//z���^.![wX��+�x����cM���z!�{�.��V)��������l�~�����������@�W�N��bq0i�F�!7�W�z�]\��u�3�2�^�7�l�
��jW��2z;�E�E������M��:h^Z6�i:�4�{������a��5����&������NT����w/��+��_�	p�~ZFw,ED{/%�����!�����3���Z���r�����=^"�nw�td���l�-�����Xo�{DP�}V1�G�B���`n����i��.{(�9��xBlF%�;'�9������������FT�����Mkc�Im�H���[�g@_)=�������N�;ue���z�uXW�;�A���:����6����X���1�����D��tNu(������]�[D��*.:�:,�y3M��Em�*��a�>�M�[�����!9R;��4��~Y�uTe�&�D	�\7�s�ti,X�!��V�h�{�oTi]�S��������t��H�*�
��@�~��*���.M8Q�����������.��l|�{�GH"����G�{�4�Bn
��Z�F��V>yX��z��z���
_I�*�F��VnG��*YF�:"7B��R��um�@�
��rY�wt# s�++/����?���U���}�Y?���A��V���M3PW�
:6}�wo�"���bbA9��!��>��u�m�6;H�oa�u�]�R�-�s��E�7M-������Gdp��dm�Hvf>��T�{�gO�)��0�M~K�	�q{EW��)������)���h��s���F7*�s�|m,z ��	����s#�����:=�V���;
���>Oi�`�z���p��
a�o�7�y�lo��;j��8�U6���uZ)��JK�KG�������u��@��&����@������Dp~x�eU�+��u� u��@[����"����`�,�T���N�������*f���u�l���[�Z��0�6�9l!��Ga����T�r�����[����J����
������M�E�}���`UK:;#�����{a����*C��UA�-h����.V+u2kkcE$P������9cw!bTgt���?�c������yr/z���W&���uc������'�C	������6��Xh)��&���������qv?�^�g�N
���A���M���	1o]�%�9k~1�����ur�m�4���s!�`��u�_I�et��.�mJ��{qP���i�k���*��41��< l]l�F�vQ�`e�Iv��Y���b��*����'����}oE��~�����W����1r0���4�J�@�Q�!��b�Um3����'�/�����(@����l��X�J��+��9>��&G���	�]$��6�A7=���;R�YM)f�i_��|e��|-����W� ����zV/w���uN�.�u��<;rkcE����}�d��4�\�%f�@t'�����}7W��okBO�-&�.��D���7�FM�v��`]3CP��mde��|��7���\F�����F��vy	(�'�aU3��mZ<!��K<G����_�y,(��"��b8�u��D����
:]���M�X��2b��a�(���m.���7*0�S���<���d1�;��=\����P7dR�W�O��
�	)��������b�>��
�u�~${�Mj�8X.�
;}B��8��2Y7���������w����o(��.i%�R���)Zw���L�U7�����>���YYK�-N�����m��B��5���'�_Y\�ir��H�3>�����9&������R��I��,��8�u�����1o��(p�7��lPW��������S�b]9�\(�N�����/��{�H���
'�g�m�W���������<������a���4�@��4�\��X����`TG���a7��):�Ka�{�b,�:
;�Cq�+��;U<-y;�[��FI4����y|}}��5S�i�������~�D9�vy�(�N��b,��|o����*|P=���\$<�Wwq�?=_N�2�&j���:�4�'|��}tC���/[>)tCei����c5�2��2�m�6�
�sS��Xq�k0�y�`U�#�F��=�G]�a]�6���#�zs�a�G%��n(?�<>*�;k��S�����,�qI���QA�D��t��[<!�������A����^�l+G�"�/������Un�U&�:y%�Ci�%Zw7<i�����2�@��}�#t���XLw����<���^>� ��(�@�W]�A����#_�O��2z��}�)�aq�S��Q�����9��}�A����"�e�9I�z��a�Gy7`gQ�2�J�@�z���(��:�u%������6%z����cG)��C~��W%�����A6��@�+���
�%���@�oy1����"�KI���K��/�_�����Q���n
-��	����"Y�N\
t�a.��E��4a�Ju����\�p������JO3Ygw��z�CE@�v(h�g�=�x>*Ov>�caG��pX�7�R�<��8�U�3�oR��\��+@\F�:7�(�}��-�M	����xe���m���^��*'��oGvT���v��	:_T��|S���.����������~�I}�N*��I��= �,nYcT�-z�K$a]�i������B��]qQ�uW�@�)1u���������^��,1]�3Xy�t��m,&���I}Rvtc���s��_����(�T�����'�������t<��l�J��+U1U�3�(�������dc��B���r��uD��*�u2���@MN���%r���R�R����}���:�-�C7�S�ExF�,�2���|�$��[*?z�.��)�D��+b�������u��e�t�H�C��q��`]I�����!�Y���f���D��qY'�v�����O������L�b��W�S�����������$v����K)��.c)NgI3�JD���wNP}�(��O��m��r��X3J�(Yw����F��(Q��NI�q>OP�����?gF���r�����-?�!�j�����W�@xT�6��(��i0��P�,�]FUx�h��������`�
o5����Hm,����(W�F��q	#�?m�^����	T��v���:��T�C��)Ow�������q��Z�>JX.Q��N��b\(PX������G{�ej�5��
������=��{!g�LFuIu��<{�S���V��|��^.st��XL��EEQ<����v��x}vU^�
f��/�=�����a)�VX��
j�Ho�'���|�8Xo�@��~�����*�`X���e�������F��qY-�W��2�:6�^��(����X��?�b,�(�R+�{�6�Z��y�X}��lwuL��{��R�C���|�u��Q�;��;vRBYL{��F��9�%������^[^�d���Kf
�U�z����o[����E��se�^�2#�&����.��tY\,�����u���s�L��!�+MP�7�x�	~�����=6�`Tw���k�*�����:�x-�%l��5���
��iIca��O�����Fj�sRum,J������$<���Nt
	,���^r]#���Z��N���'��v�H�v�
7�s]#�������r��sX;�+���<zO���]��ung�uu��i����R��Q�C=�q>�`/s
t�b\L�c�}���/���L���x���������E��8����\w
"e+������+����B{	1�4�����A{�Q����3�A�7u�*��Z�:���=��>J|v��y����F��:�\����b]�.�%�}��_i,�NP��|��u;#��;A���e���n����|��U�,[���B���4�]�WU��:�V��'��49��m�X������)��R�>�
�����t�}X,�`Y��;Os1q�F�����{�~�4��t�a�k�R���g~��~���0���5
z��i>���F���l�������.�C%|����OZ��|Q�~�:7��*���O��We"��(��y��&F��b�u�����
���+k��G��C%����0'��J������`��mU����*�Nt���RZ�����u�����ul����U�Jav��_������a��(h��1�T�������)�J:��|�^J�
�v7ID��A?g�C�
�~B���*�0���g�T�w�~�����g�:�@;�sX�	��\O�~[J���~����@��&�Fj������"`��`l�,��*��ZI����
�O�T~��Q��<:�����}U�5hS�U�B��s���z����h8�*����1�C/��U�$�a��<�a�2��41h���J3�u�������8�~���	�7����N+���_��]
���u���7/����2�}U\T�N��~�~��������W	�(��n�@9���}�G�+����h1M�[U
�U�h��#�*)��X�v U�p�������X�T4SB�M�#�:���5@]��g�P�0�*��d��?��J@oU:�*�����J���A�2sf���B�'	t���"�k��U���RaA�zQ��b��������{��D���f�Kvg�G��U`��Ra�?��4��\|)X'	���!/�
t8Kx|j�,���]�
������@�U��������u������'J��� hsFCj�!�������.�5������s�������+t'��L15V���h��~����r�sX�Fq���>����-=�h�#:��K.8?E����b�.�����^����-��%��3&���;��/�����m�[:?V�L�����~������<x��[8�Q��riB���g&��m����� ��IR���&Pw�t��"���`��QJO�}R�^�5B�sNhm�W���������|Q&~��3X�z*��S����|�V�"(WY�C~U)&�\����>��(B���%P��#j�,o��.��"����>�j0��J����r�caV�(�����:�`���2��u���^���DA](�B�����nD�	~]P����{��3���EG���'Y��������0��B���|����������6
�'�@pe���Y;�������WqR�%8���p�����@7�>��tUB�.�1���]���~w�[������Lt����pw4l]q8���#3�,�@���v�@~���0�c#r���2.������
9@��D����"���]����RP��`��M�4�:O|�cC�����m��/���X�C�� e1��VAL��B�'p�}#����$�=�i�k���K
t��.�K���;��-�Jm|u*�8��@���0c�T���G7�&_4��.�����:��h���@��~�XW0��cE�'${����=#�����2����z��J
8P��������� /�����C�X���U�}\����Vw��i�:����K����@W��+��K���0��n�p�������������\C�yc���.�=��<c16�K�i��:����`��3���	/����a�u�a���P��QF�j�+����e1���Hf7�0i�&"�.��F�1�Wi0�JA'$�]Eu�2�Q7Jj���sc����=�ueR���>u�<��8�?����d�d[�����c��J�6�D��o�J��59p����?��XW��%k�7�������3Ka�$;L-H��8U��/ZnN������}�G�����#/l�O���cp1��t��Q�����X��������q�������k�0�8�~YcO&:��.�IJ����=�Fa�w9<r�;84��m���2%�����������_&k���e�~����Y��&w��L��49�L�G�c��E����vMVy~mn�8���>\F�y�9��#5����F��w�S���	9p��l�J1��������|n�>�UGY�s
L=���
w�8����c��Q�}��}?��Ym�&�m&4�;�q�%ZI���'��}���������8-��Y�v�`o�Kt���Q����r����d��I%Z���wNy�6r54Y�X����;�ne�(7���Nj#���i����n����3�a���@k�Xh������4E�*Y1���P���|r��a%*��H���>���Q��%?��ob������4�E��&����SI������?6Iv�9/��y�R:W�qh�:�4�ZV���� S����vz�X�;�o�m�4E���I\H�v^�@�'�A��E�s�bm0��1�����>������n3�<��F������g�B�W�2W
����&;W��QS	�hw�t~7���gR����L,��T�':�M[<!&��pNv�]�Q����Yn:���X_r�X����t���2�����[�0�`���>X�����d��O���'�r�R�&W&��d��j�5�7BSh�/#��^ods��d��|��?��)�����pZ�q��%�<���9���0g�@X����b,���l�S���c��������sN��dw�T���=��
��F�"�
���e�5��}jet���Q���?������
U�������n<�Sa���7��s�T�%;�6Y��9����UMb�u�Z�wY���9���6��v&Pg'���B~�������*5�DO�c�������l��X���3��SP���2@��p���O��V����C`���)n��~��4����0���N���I�e��0/lwqv�����HK����I�\����'���P����z8�
��;)��?&��ZK�p_p�Jr/Q���h]e�������Q�"	�p7DV7�
L0�k�0�6c����6<
tL��b��.��PLA(�],A�&|}�������XV�����)����,K���?��L]xK6>��	�U�2�m.��]nqz��S�@�uS��%��n���c[��:��|�*���Q�={#-f�1�o,����$;���j\�hs)~�:)�,��%X"��.�������o�JV�w���$?��E���`�}
iW�)p�/c���QF'�����FT�=�����;���oHB�{K/�+1��W��	1���;�������O��}B������f�h��8�0���R��i�V�\������J��D�i;�{]LFW#��<����/�ib2��4��L�@��?��%�'�z3���6wV�k�zg����s�H�n�<%�b�;����V���`Ym�d��xj���H��/u�����
���9�r���~P#y���Qj���F=4Y%<���l����f�N�����bY��_�y�R<�}�7A<����w���t9�h�������;b1M,�~;=�b(�x�������.����*��?k���x1-�&l�}1,�-�pW	�N���?��a��7��>��X�
1��.f��&	t�a^F�����`�8����y���y�=\�(��NjP�7��v2e7v�W^����'	�����:�<T�lS"����^L�,�N����W���MY�������kc��#515z*G���w�����)N�
�c���t?Da�h/k����`q�V
����VPeXB�%���9Y7������b,��]�e�V��D�9����+�m���Q�{�[n��Q!c��������X
��������:"'�L%��yY��D]p]��@%�P�:��������e�.8r�Z�;���HG:P:=��)�S/:�+=�\)l]��@�t6�kCqbj�pF:����Q����i���@6�Py���V���W����/�[W
>�H��������r���_�������_�Y�*;����j����N4�d������KV��%���@�7������[���?V����=�����B��P�����<�Uu���{�Q�
�>���UM�v��7*������i�;������Z����u�>��J�TG�|�J���C��]G�y"}����|:7^�+������`��06�i��/}�2z��8e~7��Qe�6�Jz����z������%�QF��0Z��<P>�Bp��)�-���&��s_�:w����t87-r�������r���saO�?z��?g����QJ���H�QO�;��=TV5����a'���41.�	���2u���������X�'{�Xz�*s9g\W�?����kc��gc51T��)���-�o�;�����O	-�CU��J�)�C)|���V!G������i�^��t������s�1�G�6.@���Y��<�7�dH�:�X��bd��y���uB+����]��l���8�P��VDa��F���Q���etL����ts^�`������65<�z}����B����-a1V��I�z�����\'X+��+J�]�J$�|{����j���."�H�$�]�S1��g��w!E)x�/��(�gZxw��,���@e�p^�`e�!�G%��v��B��Y�<�F�mc�3
{��	�agu�m�N|���u],����]`m���D��m;?�b,�y�4�P��9��X���W-&���������M��������^zv |(�`Xi�:��Qw���m �!�y�2,M�_�b��u9��b��{�-�`�U��L���@����nd'�O<�<JC!2�<���S p1M���'��j����FX<!�+]V~�n?u�@7����Ji����@��@0��a*k-(���>\)��Dq},�%3���@����4�K\
����m1��2J�bu�����.l���
�aW:�Z������(���`E�����}���|yK�����@_�
<_���u��rE��J�t.-��Q$������A�pG��R7I������G�f#���R�����b�X~�DucwQ�t�y��]�*��eb��[��P��{�>�L
�u��@e�]�V��#�s��5�����aU�uq�@W�p#?�~��!i�XV�c����\�(O�K|��Z�g���E=�p�`o��hSr���i�Q�r}��-��\����teP;E){�	1��lw��7�����4�>"��}��[HO�D��~;ByZVO{�$B����<��Z>����XL\�E=�>4��3��Vr�s�mm����2�N[�b��.����:w�)���>�� �
�*��f�C����
����C`��&���AA7R4����>h{;<�������	���~���8�0��.��<i���Cu�7A�)�g�8X`�	���!x}����~���P�>\�@��u-��Qs�j����/�����3a���T��G]C�@��p��7�P��3�kc�I�����;A��p��w���@_��B,{��[<!�����8K�=?�*���wW����:/����b����[%K������m�x�{#5
��y3���l�^8��>�o}�<:�e�%B���{i�� 7D���NV���>*t�P)hW{p��t��>wS��������9�lL�����R
���*|`�*�}�^���tSiM��h��P�8p�n���I��9^`���"�s��%�In�TUo��P�n��j)]�0h�17�zE��[��+}��+�G��55����[�=Ul	����
!g�v�����
u�%��z��nhn5D�]k�d��:T0����Ag���p�+�j��.i�5]
����xag]��X�J���
�%?�%?����PF�6��e�<P�Z�G�?$�\��g�{�P�nJ���{���!����S�IV9}Ag7x}�z��!����$l��4��]��%X���9Ou���{�w�CaC�����K
��
{!��vk�w�jF������kW;Cq�)���a���:�K��E�F����<�����P�������z��\�e����j����7kc�6z�'��8���1�
j���{JA�UEt�C��A��
�w]S-Xy�"��"{����I��m�6�o������������; ��M�������������9�����q��`��"H�>,�z�eC(���>�whw��Nl��Z/�l��:�Y��*ZA���#?e�!����T��������<�?���].�!�A��e�
acM:�
�u���dN}e0mU1RKUc�v�3f�*u;GU����u�u��
`{]���L��21��\O(��~�Du?�S1j����S��}����J�����[<!&�K{A����avV���diH"��Uc������s��`gQ��X�P��tZ��uV�t��zC`�9w��$�dW��R�
i��L�A�h}(���;�-}P�����g,�����}V��y��
a_��
��l��4�,\rc�M��M������2z�M����]&gu1���r�+�`��E��u�~��^9���	����;oQ�����/lw��@_w�aT�2�F|���;��U5���*>�Q�k��	1J\j2������xKSO.���qC��)�\��Y���.2���Y<!��s9"}+����pY��V��P
k����kc���P�}9cy�b�u
�d�����7U�++h�]�35�-�:[tcU����2������M����K����[jcu�Aow���ms��`]�	�����.����G����v���s���XX.P�[�0I��l1IL�J�kZ
��ex �*����X��s�e�kc�:��&����ui�.s&G-/+B���nZ��.$Y�3�a���4�o��������,ls�R)���f���#R:�����?|Me����A�����=�E�������{G����E��9G�N3<�U��2��>���7TJ���D��Yw���	cf#��Pi�"��Jn�������^<!���s�u�Y������R���;5)hR�u=����%A��9��q��{C��	���u5���������:�A��w��	9o]�4�������HKJ�)�{�����������	���b�.�(��b�8�.]!X'��l�>yl����F�!��N��B���f1MN!��|�/����Bo��T!Xg���'����O�)�����.����[L�LI�vW���L�x_8��U,X�y?}�et#���bs���X�6Q>lJ���w�>�[�r���T�Kr�v������/Eu�����a����N+P�8���F�b���&�u�����YcT�c>�`�E��n!L��%ae:8:����X�������A({(��iI���@0���*PW��V�)��t���j�Xw��a��R��/Mci�{��r����Q��J��	+�8'\����~v%�	��T�S%J��r���U�1�z�RGj�+o:��|����D��2A��Z,m��M{��l��4����)�z1��Xn
��J+���K�s���&T��k�����fhWi�����vu��h��u����;AU����~���B��v�._��q�$8a]�t�@�QUl9Ak�� �n��@g�g�4�O�Y����:c$Pw��*�8PW�����~�7���O��
z��/uC�R��u��A� 2���{tJ�Ct�|�R"x��<�p��}<jh���w��u�	O%1�u�����s[jx�4(w�xT����,V{Q����q���&�
�������nmW�o��m����Y���=M�i�.��u��UnpX��)7�v|yn�U�R�`���XX�����Q��to(�/=��k4j�����J�+�u��@_
�Q�NE��z��e�$����
�u����D9`��Z��0�1�)_���Wk��� ���H
�Z��������!��U�4�����n�e_&������~��U��P�������J%t�V[,���#������fjtN`X<!�����}T�L������L;��NYv�X ��t��@]��\���^GU��c&�[��$:m��ib��t{��]d=\�B�C���������rVFJ�����R��(�vg��[f;Av���_E,���R������S��ox������jc���}���f�A��BJ�m7h��a�u�jA�3l��zO��4saeX��{qu��q|�Ok��6�����H@��Q���j�������Sr^�u�<��])w-��Z������[Op�(w�;�R���^�����������1��YUebI�'�w%�+��� ;O*��ND������f��;6��s�� �z�J��{u�M�����u�0��K�t�\�S�+�E�Q@���KG����:wM�c��Y<!�Km=���oH��[�p���u���C�7$Q_�[�������t	(�>���	��kLm�P$RZ]��%U�����v;��]�9����uT8A���`��������{vEF��Ru��O�����No�z�uX;R�s�Am��\��X`.�+�pC��6��.h ww�����@��
	d��
����RJ���tW_��9�B�����@�\��4������@7�
�����
O��\�K�����pX�|���vT��s=+Sv�#x��-�7vR�k�4@�n�e���x�z�����l����lUF�Gu��@�Cq�4�3.K����V���e�B���<=b��o�XWL7�����������F/?�������������D�rX��	T}#�.w�1��e���"J(y�+{��$z*��������4v�W7�nY����&���~��
'��=�b����}�����@�O1MLM��s�z#Mp�C�@��k��nDg���.7
����t��(y��-�a7�K�rc�m/F��IC�ht�����\j�;m����1���Q�p��hwC���c.�[SN��9GA����g��xWJ��R��!���C�\�j{o|��wWj����
���j$��gv������7��N��	��>t��eJ��UR
��w�;��0���k��2K�t�s��������r0�=�;Z���t{�Zs�����:Z�]��j�'�����i"u�]�[��n���M�sykL�s�����������_�n�o�RE��C�%��bh�����
���W��[��jM/a���G`��X��
:]�����c]Z� ������;��Q7rzQI��*�q��������d�@���2����m��z}����K���Yv)���(u��@|(��dU�(�+T��5��C���rmU�:��^�4P�j����������<��{��0������W8���;�T9��s���4����j����@�y��7�Q�J8P@�����?[Q.��0Ms����Z�@=y(y�*:�w�V)���'(�����uE�y(��/������K�@xy��	X���|����d�P�����AU�P��s��������r�*������UT}�N����q�T�F*6��al���s�Um�8n�{
��%�';}OX����d1-����jzU�T�t��d��ZK�]��`���2�*�r�X��A�)!n�8B*��T�M9��5�6i&�TJ����8PJQ8Y�Q�E�2�U�E�;wT�gk�6Z,��n��Y��0�PJ�u�����>�@��)b�k�i������U���<!]�
������t����%�s��2�����6��C g�6�|�V%C����u/&��$C�X�E�1Va�[��@_�����.�i:�����J�`7d���Om�O���c!<TH�T�f���S������������&��{#���CJ������be�{J�XL�C�]C�u2
�m��[L���;G��7U�Q�N (�u#��p��`O��d<�m&�c��n�+�9�����s�3��rw�`�F������O#�,�X�[�)3RV����
�pA�`]zi��>c��0��g��c�K�����c����P�R����XW��N_+����oN������*<��q��*��m."P��z�Y��V@��r�XW�Mw���L����Pb��DM��Z����'��S�I��*%=�[���?F�+��o���}6,[$h�<��OtF=,7�(�	���}\(����T�uG��qD������c������h3���(��@��A��
����Zi����������A��N��^��Y��Ua�����&��K�@pt�3��u� ��j�Z���.����0�bq8o]���~�@]�h���C�������|,���v��6�������Z|=������B}H��c���']�>j����mdN���]J�u|�et#�
m��\���G�#�@[u�DR����C��t�.��@�f����R�.�*��@][s�����r��-a��+D�2)�����@�s.D��u�g,���w)��an���y����R�sX��
�:��Y"�5�s:�Y�b1M�L�XFt���c D8\b�MY�%7���]�6�m���59�0,��s����1���K@>.t�|7n-=wx���C�5���+u����e �8��v}��,������m���nth	���X���w���
�������D���fT�:�,Qw��{(�{���@�K?y�����Wl��GYF����Q9�r�p��`�1����I��-w�/�7��0�E�����2��_j��	�{.�����m!7��SO2g��8��^#��N^�o����?����e���t�F_L��<�W�v�z2�������eu������������h�5���P��K��zs^���:e]�s O9�$��P��J���z����Q�����������s�2t��a�#l9�j�11�t�,��)��)��+�19\Q�{��Z�^��7�)���F:����)��Uu�K�v����K0�g���[w;x�z�$&����uN�@g�N�$��{���8'��N�1�zv�����'�=��e'j��R{�U�����M���'����>�'T:?`}�)�v�6��1����C��3��k�U~E���s{��9oK���/�2z��P�,���[�����;\%J{Ty �z����S�M�����{+��Ds�T��d�����x��Q��~�?�9���kcQ2���W�')���r�u�#�	�����X���Jagi�2:�+��GU[���!�$�XV�E����V�H��Jr��rA�d�/��!���`]/�,��&������������p�z�<X�w��B�������rP���V
�L���u����,�`UY�r��PU����@�wu�����Q�-�J�r�����������r7Q�g�("��q}A��T
����S�T��,GU�+�Z��8[��V�~��}U�j��T'��[A��������%�.����K��G��'���A�
���SU�����_tc�n������s�����w�;�<���0�o��
�D��;�n'}"��=!�R�	��R[���t��o���Qa�����7c��H7�Q��=�:=U�:Y�����u�v���?k���D��T����V��sTg�&��\r���5�S��������"oL��m��6��w+���Cr���q�8�J�Vi�A>��4Q��:+-�{�����UUg�.�7g�a!��{��;��r{+W%_��.�����Z,V��
�Ai�YCu1Il\�2v�������+����	KK%&<������Rz:�gu���D+��+'}���O4l��$�����nM�����uu�~�s�T}��]{`���7�����~��y�u��,'�`jk
V���0��j�	�M	G����Q����E������i�xB�g+������W�a�i����������ASF_�P��=�O���b���*Xg*��)��^:Z-�g}6r�P�=U�2���`��>��n].�LZ;	�)&���Or�6����r����?Q�S??����^��=�/����b�:�v��*O}��d1MU������<��=]��^���.6�����~OX:�Z���aH)�_�������H�����������yu�.3y"�{�7����}\�)h]%�D�w������E����{�������:o�����{/��J�
t'�^'���4#J6%u.��������F��S��r���7�%K0cg�:�F��7
!P�=]m�Ed���Zp�-���9Z��w�:��k���������XTww6&L���n����K�kc����|%�-��I��[Xg'_Hj���|"�{��}X'���B��fk9�
2���	��u���`�	V&�1�����/"�{��H����u���@L�9m�bFF>���e~"�;������F}$�=W(���n��{�-�4
�^��&�5�~��{����Dt���6������p�#�zo�ua��?������ti���q=6�v��=]�h
����a�8b�.�)P�����e�4p��C���P��.����a5zL���rH+�^����:ig�9'o������y��?P��L�^K������"q"I���(���'z�����w������z�	9�]�/����&�-b0u����]����{��cz��0��7�Y7>a�OWF��+���p"R�R7��Uo��E�=�=��Q��.��t��uu�������� i���hO���bF)McX�{���RY�<���
����O$�e����RI�=a��z��Gg����b��l����nYI��! �|*��3E�����R���zR���u�)����s�*�o�~�����D��uw�����,�����C��t�I�7;_��~U��9�
f�"����u)����x��N[���'�������A�t#,w��}��Z�������4GU����|�hR�8.��/%�;T�<h�+�^��zs�I�%]�JNX%�^�t]�.�/�~�_Y�e�I���T1�GV����](]_J��P<9�������9��I�Xz~(�-�z��B����wR��x��T�h��uY��yY�-��&�w���Bu�%a���0et(-S��7�z1��L�%�yX������_ao�n�3h]_*�	;�-�Q��!�zs��m��}'��b,�(�$9U�aP�!TU�|�}�Q�}����T�lS�)�C~���@�U�F���Ki
��^����1���.�������*��
���v���.�t!~�08��8��I��Z��y!b~)��d�#�C)����{�x�4���Lh�_*g����/��/%�;�;eow#b�nct��[,v��Q�U	P��sO��w�lC��.f�J�_����$/ag���X�B�O�N�����u�3&\�]�s_J��5O�R�[�����*A$�[����c������"��>.�_Mp7M�z�������n�x@U;�ZT�6�U9>��*�tN+�{]����������.��-���ag��X�*c	�VyR���-����b[����a��/�i=���v.���:�R�_0�������K��I+��96=6�?�8s�W����.������`_���Y%�������+�J�`��'zn��Pb~Tg���A����u�YfA��%.�b���%�{��D�e�$��"��u�?Xugz������|F�VD-���<��x��I�9	zN?�b^�J.���Tm3���d�]D/���^84J"���ZR��>h8�}7��Vo��`�ui?8�sjZL��R �u���B�D�Vu����a�E�)*����I��'�����$k��V�>W����+�u�2�u���GIG�r�"�&��W�QW#�2��#~�������������u���t����8��0��%��:��,���7�������K���X�pY�@�T��&��;�{)}�?��J���f=��n��6����m4�����Xu=e���,���8��8-O�7���P�����*j�6j����Y.X�fGc��
����H`7���F?�� Xw��IO�����.}�4��Oz��v-���[I�v)nF\_��~�g���;A��g}���p�L�S�#E!���
{:��A�S�p��vW,���Z�$�@���Q������a���Yt{P�~�_���cv��[WH)d���u�Ut�'l���3r6�/'�����Nt��;{�j�@��#0�
�Y�GIz��nQ�%�m.���F	9�G���./�Y�|�.�\<!���^A�[-4��n:P��M������Q��������@/wX�W�D�	E!|�8��rwp������D���t��6Cn]�v����n���.S��5��c����5��s�����u1��}J!vN�����4�OE�����`��@�%ew��~I�-��Ic;��Q�[�Q����wD�������Z	�=\��;�:�Q��O�2�S�HQ{�:��D�Y�Oo�b^qS]mr��m�)j���@_�����^x��������7�z�5�#=[_8������b�j�u!�@�[�ug� ���YL+��K�qo�s��(ZC��qN�mr6���\��S�>%ou�-}w�<�%?�����@_��N����ys>f��c���<J�s1T���g�N����C��F7�MQ�����Z��������D
�q��`_�C��w�U��cA
�q� {����+ ��!��B��Ze��]�*f�az?�������)i����n�����������j�"�%���Cz1J�('�8P�t����[��ws�w�:l|�xn�K�v����i����1�jw��A5�Fg'���r3�?��(�y]*�Ro0��y�z7��s)�?��E��5&�^���������@���-&�`r��p�T��Te��{��,����`g��:Z��~QywYV�>}�[��7�������0o�iv�dU�
������0�w�����:��
2����sS�b^_��}}H`�y��}�GK�c}� �(�-��[S(����y�MUK l����h�����>����-v\����jJuWp��Jhe�RN;�|m�b^���)�jM������U�zQ!���t�0W��C���U����Z�U|!u����t�~����4Y������M�r�j�;��!qW�����*s�������f���M*����s����i9��d��W!i�	���Y*p1L����2H��>G����j��T��iE�Um�����et�����s��`��)��9����/b�.Y�6������(q��B3�p��@�����*�LT�������.{��=�{#������?`����V��-�k#������`�d�<
z����`�����]������	�O	��-|���T>���!��E�|],"���A��U�[X��9���/���K;T�
�;�0`�
������y��E�|.����.=��G����n=�ri�;K���sJ���);.�H������y U�=lw��@�*~R�T��.�b:�Lw:��f1L!U�	{8w�.@pr/���#VW�x[]0�u�wZo�x�K�i������'!�^�[~[�u���Cl����Iv�5����U��sg��.K�`��Rk]-Q�����y���l��@����jA�=]MC��y����:�g��{�b����_��nx�c�.E�h�Kk"U]���Eo�U���ua�A�WU�����V�����8P���E��F�z�������a��A]�t�����9�/���
!i��
��t�a������.$��e����OI�������`�H?�+3�{t�[L��j
��A�@�K{*��u!m��x1�l���	5d��rE���%�}7�c�(�+�`]/����@��W����n]D��}�����0\!�u��H�P�_L+�����X�9����i�u5�����^�u�l��K�:�F���T�brp�TW"�UWzQ`�W���H���j�����@�+;���GY�+N��V���7.�)����)U�D]�1G\�eC�1�`�r��q*#����J���s1�`��E�/���~��.W�Y�\�~��ohRGYi����	@o��F`U)��z��f��������ZF/�G������)/��sCL�V��A�������"�z�S8s1��`�U@����u�O��,@�.*�\c��U�M���dt�����Y��f+0EC2Z�7��Z������������������y��7��$�n��
td]<!���)`���f��>_�9.����B��*��^�X����m�Q8�J�V�"���5���f�xB\7W���F|!���b+k��4���uY/������������_��_W@����
�}���V]�5��������S\Xm����q�z�N���H:��@��b1L<�	VV���H��K>:\.	t���2��z�g�h��K�F:{(����Qz�����@�%���p�k��k���h;2�nr��{��A��i]!N�"Y��x�<F�� ��'5ew�(���*�g$k1L<)��{��0���'v��@������7�C������2z�H�h_������<p��L��>���n$���}��/�<�!��\�D��UK��z�i��r�'��]1���1����v��y�O+�%Y=��p#E������Z(�	v��@������0o��"�+���61hs)�@O�-Cy���99m���=�K��=����#6NUo+��f]L�����A����w��g�����g<:_?���0�o	+�Bn$�:��])���A���,u���:�����2:��$o��d�1t��y�n�X<!u��=�w�vw]Y����M�����T���G�a��������p@O�d�#V�O����`'{�Un���q�\Q���:@]`=G��H��uM��VoW��.]z�u&�z�#�;�9P3�|�CqW����_�~mW���*�9k����

����H��G�\�#S�y��`�tzJ�j�����VA]�����p�����n�+�*y��$��pGO�\�~+6���1�
����h�v��%[�N��u���96�L}�A���T8�,�VFU{|UE����
���_;j�]���:5y�������h������2:j�]�J�����-�(��	��a�F5������lH=v�
mwNz�sUf=���U��u�9iu����S�w�uq�@7����\<l������{�h�v�!{��yO�\�;�t|�&dh�f���(q�h����r���N0v.������
�'�Apy�`]�t��P��@�#L������V��;���=P���MU���2�4�v�@/��G��F�
-��B�(���[������'��Re��C����#eX�3:���R��sWr���0����-�!7�@]x=�kjw��"��U�I��%M�\K�m?P�	9GZ���
_�u]G��=��.&������r�A!mU��zlX/�>�{�n��}�a�D�F}X�,x�w1=�^�\�(��g��j�uN_�s���q�T�:���u����m�Xu��Z���W�H���ho���"�<���leS���a�mJi�v�R��7�8�0w%�{�F�D�c�b��.
���QGI����n�c��W-���j�=U��rw��`�;�����I�?P�`�N�����P������A�C���HN���Hl�mmE���W�6�{�w����A]�]���5���t��b����K#���.:m��'�1QB���	oa+��v�E��X�t	�@�����]�a���Z��W<��JG���i��8CJI&Y���ju���!�����%�i���~TMO�[�Q��qb�;���d�sY<!���D��W��-�Wz���XA_�Z ���l��]�b��T�w%k{��o������@���������5vi�@o�n�_���;���H8ww^vL���-�(%${��E��\������'|��W�������(�:�U��m�(���+�s]����j�"��D�����%��>��
V���Z�RpwM���������fGxW�O�*-	H��c�U}z���@g���������%B�&'RG��9�x����u�PW�r)��4u^�c�L]cYy�:��	_{�����Q���SMyc5���U��u<���Y5��8-��]nm���u����-����qw�xXWD��}�&���vVf[���r�P��g)��������z3�iy[L�sg�m�t��_9�2:�J�k~w������mNE*�[~��m���pv7t�^.�hs9}F�m:g����}=;��0[)�b�Qm����@��;E��|�{�0��FJ����_��-��K��]�wneu�\�G��t�~�s#��jtw�`�8��.Y��s��A�����`�8�[6��.��]_�6j����J���(>K
f�~#�\W��()�[�a���z��3���j�zsw������3������=�O��i�X�-�����������et��u�,��J{P�E���'���`1�8.���n+�����R!X���Y��0z���@��
U�H��~��@p��'[������;T���f��<������T���~��@�w(�^Xw����*$�h=�=�v:��s�`a�$�rY�UEM�N�?�ar����������+h��L��xB��*�	��;P��0�� U�
:�>���j>�j�D���|a��v�U5"�����U���2��ye�W���G]a�����`���2���U��|X��5���[�$LF��W-�0�,�]t�V)����O7JU�&�
Lu�����)�<�a�	#�P? �<Tv�D]��R]�����V%7�g����H�P"���|5)
q�f����	P���j\/��;m�9t[F/����2�2Zq��E%�T����ug�@7|~����
��^�@e4(Pwk:���=��|1�x�J���_��k��<�wl��5[x%n������{]2���[O�T�]����<�:W?P��0^��"�<-V�i�S�$��'��,��DZu�D��7=����W���$��u����pZ�Q)8��J.QwFl��������?��i�at^_�U�i��P| 9-�&�nh����K���-	u�~��eZ���*�n�����LV&�0�����z��@r�U/���n*Q��:��/���m���?�������t�a��;���W��0��.6�������N��@�x��6�C��)��0B`.�����.B�Ci#��.�tr��{���;!0�����b^�h\2X��z�6~�[��G�����������"u�N�&�D�r�<9�'��s��zC�@�y�����fU��:���Q!�������r��.�p��@]��\8�:��,��M�4�:��4����]�0#��=x����j�6 <]���G�����%�ZEG�K�]8���G��~�G=z����M�\ V7��N��	�5��.��UW�\O���F�N��C���]�U%[���v)P����9�a��6���ra�X���2���?����=6����JP�����;m���5�������GqT�]�-r����zO�����4���`��71�v�oi�2*k��Z�����E�����-�F����������N�������H��V�'���!�-���=������;*��=n�m�����aoW�������a(t��4u���*����)���IVP���6�cJc.&'����..������0��R/&O�U.��SF��+	N9r���U�::���W<)%L;�5/l�]��[jt����<)���gKCk��=�Z6�L���v={�����"���@�1�A�pc}��p!oX�j~V+�{��V�|IZ�D��[=\{)��Dg�]�{:��n�e���R�H�.	���/~���{�ym_�a�!���`���@�.���-������:PYz���F�#���Ea���{e2)!���a������[#=\$5g�[�_�vm. �����zM�b^��\�P����
��R�~SC�����| w������$��{;rj^;�H:_��xB|W���Fq��rU��"�{
�/F�6�������Y�2Tv?��<}����Cp�`��}��������_P��tNP-��m^	��/l�W��%�t�6�)�X���\QY�&���R`���:B��9B�2����(����^J`3���9"�����i�N����^Jnt��ZL��R���Z,�n}�����Z��a <��<��?���l@�	tZ#��#����N�n�Qq�~X������k	��<��� luM�X�/��UH��V?��F����Qt���CZy����V����>.����vB�y8<������Xi�R`p���T���V�c97��_zagS�'C�@���V]`(��-����	1���o+Yu�{���JLT���e���������UR)f���b��a��%Y����Z�����(����	d%y�r����-Q�����������iu����me������VSL�l�������=�����@K�6 �*�?��������-��d/��'j�8�H�v����-��l��f�R�]s0L�2�������7���tU��k����q���}��	�'z�+Z~������^���hw��u����[���?V>!���U�Ltg;<��!&Y�*��,V�&��3'{�xr��T��&����&�'me����g��__����v�*���
�&��>����V�yS!��)������b�l��V����5!�DO�It���������NVU�&��:V��F�e�����q����V�7r��b�����1��*G
j#j�����}S<iY������L�x���B�f;��l������g-_����8`�7���$�M{���5/�_����E������x�U9_3���^< ��";�TF/S���I[%iW�����k,G��Zw�������h�|F#��4�$j�*�l�����^{���h����5p�p�LF���|f/�������m�NTF����b�Z+��Y@����$��� O�
�r�V]��e1�����2z��^r^�B�t:��x���
r�Z��s�>I�&���_7�|'�r����#��v�����1�rI������B�G�7�������W�JF!��a'zn\O�/@��ENR.�>��(�${��D������W����D��`������w�r��@����;�Z?o]��.�;E���L7n���FX���pEl�6�B������������+���?���`�`H��%������	qh��t��\�y�{�������/]��&��������3�SG]� �n�{�v�����C������?X���'�se��O�z�@U�_��K� ym:/��N�������4!'�����-����ft��uqv���~�o�E���5�)��>����ZT��6m�����~���-Q��W���H�&{������Z{c6q�\"��2�����	��z�O�f����
���-���t�[z}�3��r
�v��i#�~���R%X��E$~���%���h(Pu�y�s������A0���;��m�V}��e��[+{1�x4F�*���jz�>�D�J���7�2��.@����4Z�?�n;D�Y���
������0>�Q��/��-9�\�_H�-[W���?^���{�>�4�1L��|^y�����.k��?����L��{K?�*hP�D��(�$�S;��U�?�|������81fwp
T��Q�v)���46&��5��B	/a�^������\:�~���^��]T�8�nd�_�p�x���0������v����,�����_�w�	�v������+	�r-���v�x4F�:������;�\��T
���!��`1�8~F{3�y��@�����
a���u��E����}/����s2���_W�����6=6�;���q�!�d;��9Hl�u#�s�t����;({;%%�����4j����{����cu;}\%P���x]=}�u?�����3��@W�������j�������5����M�e�(k���?��Q]Ovn�)���J���@����;�`�3�*���/��u�n�Y7��:N�;!0�g�x�F`>����������o�3x��8X)�����w�_�����B�?�t�U��]v?��6���2�����(��h���]��!k�2<���_�+.��3{��=T�����?.����\md��Z�D�3TJ`$Z�V�7��x`������>r���u�8�7N�o��v��K����"8��"~���U
{�/7���(w�C��ezA�dF���9���g=6��S9�E|����~��k,��������u���C��U!M���3#�V��:7/��D��`�U���{z���������l�/����D(�,u�x��'t�Z�kU.T�/��N^<�����7�}L�H�4
��_?Wo,�7�c�XuAPPu��:��br&��
V���:������N����P��|�[��Au�r��N
��C"j������"�4+��.�=9^j��7���l��IQb��Ja{��mJt�/�����Q��R�u�w�n9FN��:��W��&;k�,l���W3Xu9r�]EAOU��z�A���b^��$��P�uz�D(���(i�.�| ����[E&A�D�,b�xB|FUq���K�*-�g��su���8R��
3:]7VF�(RN��+r�k��ta�J'��W��{��J�V����6�@���Oq�2���G���fx4��A������=Ta��eM��������#�5[��sA�Q���>�������a��J��H�x�eD�ju��f��~]c�@c�p��`���~uCD����-�I��Cy m�b	�Se�r�@+�nn����`�a�)��dU# h�_{��~(a\�Y4���Jq	��Wtg���0�m����'���;�UY�^uA�i|����i���wAS��U�]��<R_i��1�N�K�a��)��#E��0#����@e��������b^��\<
}{U�:W�-���v����!�����hd�e�;�y6��K\j>��������7�������<���PT�ANz8���u�u�� :�Nd"YU��T�}�_�^�x���4���,l����)�g��]��p�>lS��i�eJu������.Bh����c"'������/��2z*��������,���E5[�u�J�@��B��+�
��P���n�vY�����P�l:7(-�oH�3��{e���b�G�9��J1t��s1��`�,�L�������(�E��~����q�S��Xy�D�^�1b������Ob�s'{��j�J�n�v�X�����**�Q�>J�)Vu��
����?{o5[��V��-<0��\F���1P���N�$���ys>�M��F���t�A������3*,����v���UWxv���t �?_�S��|)���Sn����xB<Uu�|�wK��@�p��`O�
���Q�Yzm���`.zs[�{]���5t��Q��$������*���	�]Ou�]]�ugZ��\
j�.h�PS�~��������V�������\��i�������2���a(�s�BI�CI���������!_�(7rM����aF��B����$�	��6���\�����F���w
~h��X^p�\��_j9e�MG��0�g����/]�2��z.PW?��E��.��j�.���X�k�9�X�+�e���W��VF[}�	���`�\�������`/9�tYr�+}���B.���
����#�/kA��85�����`��0	���@!�(i|��C����1t 5(�yX����!ssvAD�;�s�S�4��w�LJ��|t��D
���M���}�dq�e��Fc	J�R�����CPP?��lsE���k�.�|�ZL
���^�}��P��!�zz���@el��!���+�V�z���L'-�&'��U1O!t������{�/�>��;|�� �X��RU�bo�v��Cg�����o�
^��l�^wk���j1L�>w�	v��o�$�=a��G������W<F�3�\d���~�������~����@�~n��
�U:_���a"(�W�k�/l�l�=8�9:��������������_���^5F����n����`��+����f�5���.��z�����]�F)������T�v!P��zz��.���������3w/i��,��G�~�H����m�jH���U�����&��k���k�Jg���J�����F.��K5�����O�5�*�`gA���[f6a]�|�UY����SI��^�Ah1��$J+���]v:��pCz����	NTu&��?@��0����b^���k�5|7>uW���z%HC��)�w��JA���-��U�%�Pp�Gy�����D���|5
.��e^��Q0�IT>a��;/x�	�'��9nA�P�
�&Z�v��)�T�<��)���[����z�� �N�(�N^�brp���������M�����4[�%*������:��*�����R�>��%����[���F�U�i�d�����hh����K~U�m�H���T.��W��bZ��������A�;aZ�Rn��7i*X%(z�4$��U2
��z`��$�|M�b��3�Dls��c|E#�����j]
�!����`�xa
FU�����s
!����a�s�P#WU��
�������_{��o*>�Z�@o�z*M������ysk/��nKKM�����E��}T����6��r?It��
�����)��5<��z�9P%�:�#���������[���q0����["����B��~h���
Z�����n(�7��&����uG��[�{�O�)=U=K�x��D���,z��#�P���!��T�4�P�i�Gi�������b��K_����vCP�!�nv�u�u��l.�n|Hl#�w"%�������S���^./�<���l@7���i�RO�W����*�2^h�(bA�9���j
��"��g�vw�����g�1�!;��W�j_!�2�(��������n��r�v���F������a�E��P�G�n���nJ�5��^�IT���D��K�z��:*&\���R�p����ss��7�!d�]�<����a����}���R������'�����K��������k�j����n:��l:�i��������k���;j)
�r�%���x
*o�9�.�lS���F����0W���uiKu�_�����o���6n��v����@�b��4Je�v�7��W
Au����$�d���;����^���etv���p����{���+�=L�l��9���Tu�B��<%8s�[�b��^rZ�*�P�����6W�lw�h��-
���������os^)��.������yN����;��S����<�Fq}�S�uo����_F]�<������nJf�Q�g����UU@�X.���t������\�_]1� _�V�@wVF�7W�,���������N��N��G�|nSJW���e���c	��6i��$�Z���uRo�������!W���������o�<�`e�#��	��_��o)%V�^�v�_�Z*�P����\L��\�ugY$�7"z�7�3{���D��0��]�0�g�E��3]i�]��,q`��]��K1�[Ic���{��V���A�}:��{�(�:]S��Mf��;��3�iXuus�S����qs�~XE\Py�������(]<������@����	����%������S��b��%�}�uSl�J��)K�����0��]�U��n�>[���u�����c�\^������[�
�`{�����isa�`��
�������6WE���K�z�
7��!R�N�����@oW\�����p�����eTfn��)�'d�SR�������:��@�
��K��I���l�k��k����]��|Ku>v��^�b^��]Z	�VW���������,>��e�u_��%�r��x2���x�VD��U����a�e���^?������
I��'��5�<�P�^�G�@O��:��������Ov�!��K������'<yBg���~���W�/�y1L�&����w���D�T%+��/���`�}}���l���
���[p@�zI��P��$�`O��u����U��Q(����W.�S~�#�}�������C��rG`g��BZsn�(�
�TU�i���s"ry�Z3����2�By��%��'�EP�Xw&LT�zA���/�(k�n�
v.�+����D�	��>'���j���pL��{p�{�IX��J	�7��&aO��u�%�U��?_��.&oH.�������F��l��"t��D�W��N�Jp�E�Aw��H?�w�l��8@������A�O������(Y5��>��K'5r����z���P�E@G���D��Tz!��������a���jJX'2z��n�YV����|�)��V<��F.FenA��m��^�p"8y�_?<��$�����J`�lG����=at\����@��5��It��8�s
��%�Od#O������rr��zB��OXhU:u`���q�>�`t�yO������&������@��
����������
���>��t������U�U
������1�hk��[X�_zL�b���n�<?���T��NK��	�-���%�����
Z�D��<U�����pt�@��'������9��K�`���A7��De=B�N#�U�Zo�8Q=��(l�6l��L@�Vs�N���:����}Tiu��R����i=#[�V�@��\
���R�������<]eO�w�7�D3�T�������5��������������l��Z=8P�;�+�������<O���O��@'om1J\�w�8�$�<�/�����Z�D��t��`G�V�Q�S�r�:�
�Y���c!�K�z��O�1O�A�Ly��-���ua�T�����c��%t*]����$RF�;���)���t1��3��!X����_a�PJ`t��Z�
�����
�@���/�����V��	�/q1J����%��nq��iZ<a�n���E��"�����AN�-��Q9�}Z'���R-��������/������3RFo�����{q"���
gM�SNMx$._���i�0�N2����R�+�2�\_ve�o����<]����q:o�?!.������!"B��(E�^��<]	qKwB@�r�
���E��q��:�
7������.��|�p�{��L�.���knA��c1L<%Q��zu������V[�(�D�tI�`��:e����P���2h��:R��I)��k�t���E����-�Es?	B�nr.{���^E�Sv��J�P�t�J}����;#������2*�Bs�z�RM�%�W��!<z�'�Zqu����UD�\;;V�;�w������DVawH@)�y�X�hC��t���z�eV=�XF���t"��q\@v�t�"�:��4��g
,�0�E��{��f��}y���7��1X)�����j����U�;�#��K�����e����u�>Q��uc�����������da���(DaO�
��
��u��@��p��:����/�u%�A6��*J�������������-�%����%�������r�(��o�V�@w"��=]�u�+��{B�~].��Ul:_J��W�>w��U����[s�	v��(�Y����M�p N����J�I�n��'��t���%��#gj����m�H�������8�0�R�@��q19x�.T����������a�l*ibXwQ��$���\Hq��.n�+���F�
���i#��6�����~��oh��M|*mb���7PW��"�|�"���P=��s_�0;�>�CE���
L�^�r��gw:�u����5{0���������dU���-�y2L7%���[�|�3�
n^#/������%Y��L��}Vm��.�gt���fM.�W#���V�/r��z�V��P�v�HX��
z��b��~4��v�������Y8�fK+;���>A��eZ�6>�������`���*	�u�p��T9�&���������u�*���Dx��\�+���(����ua�FZ`�,
��j�@u�u
q��u����KNNi��Q�z/��������$P����UQ.�/i��W�����}1L�yU��#u�"��v�xB��W�������0����D�K�..�W�^�F_n)�O�)[l��SV�ch0��q�T�|�gc�D��R�UX���fU�K9����,&��m��:u�g��.��N���ago���������X
��*�����`�J��J�
f����R�nLKa!�R��~.��&�����un=����������KT��Qh1�8%���4�\������������;%g�&����d=\4�[oz���.�[����`��55[q�W]����=�:�+��Tw198J�����K�b������[-�������|���;��%�}�n��|MT�����������������@���O����Wa�R2unA�s��n��_h�����jMt��#v�z�H=@���"�|9�!ew����K^�V7��h_S��f+:�����g��W�:�}����@e�8�1��,&�B~�\:e�������J�����*@�������m�YZ�wH]()_�<v��+��UZ�n�O�n�$�����P]��BJ�r'�K_��f�a�"��|�@�8\x
�-��M)?�:AuP��[��x���
����?��=�������n<!^�R���b�n�O�i��1`��3Mum����m��w�
�V���F���K�\����Z��SRt����l��"����U='�N�t�	����G���
Q�
�a���3��%���gH��st�3�s����<o��(�B8����>�T�_���QY��U�S�������%�d+��"���>Z����N_.&���;����F�\o��P���'[o�����[�j�"0�2��%H
���_�s!;}�zGX���qtJ�gW9�kJ�n�t�3	�|a���}�������}�O�oGMt�d�f��4������-\%<
+�����b�x4.[����V�0�Zi���(@eE>h�2��lwq/�A��z�lp*{�7�%�U�V�����!�#e��8b��-�i�����-|!w"�u�6J����T�v�Z����Q�e0b��U���/C�����m��@7��/��/%�
��F^j�5������WH�N�6�A�f]WG���rB�z
e,&��if{�y��[�Bz��k��^�(����%[��N�qc����������!9��J\:��*���	<l]��BR�rit�]ET��[\�"_n��u.�����/�~/�
��DP����*+��F�u��G����W���B_����#���� (9fX��8`nZ-(�|�F r��sK�u�c��+X.������5��c�����y��vW����&�C����nlP���%[_��V �{9�(T{7��I)��A5�F�
M%�seL.��;/�l/%�	{�~�@e�#��^r!G{�=4e���/�;[�;��!}�R���:Z�TRT����K|�����et��ZL+{�sx�����THa��'t�[�GV�����yVw�u?D�Uu��[�%Qs��=�F�V!u�S[&�<�^�Y����U�l�j��Nl��),�)
[�o�Yo������;UV�����r����������`�XJ��o���a����Q;�Up�����	��#��t>H.��e^�-�PwKi�}������-g3�(�����<=&z���'t�[�
7�����=�z�K,oTaoU�|��.l�W�|��J�n�������a���
@���p}#<z�2'X�**�������e15l�����f�Wu�i����j'��uZ�*{�j���/
(�C��Aou
}��Z�������$,lSa�4��M@��

�����=�{p������'U9���ra�����N�H�:�*�
*�����5ntsg�d��X�H��=a���7\/>�����/���u]u��J�%��A
���i
�^'V������:�������*�#��<������2�n4��(����dU���N&����ut
E.&��������?P'z��n�o�����^{I����wg#�ws��`�)G���C�����|]P�s�aX��+guli�������lS-��Z����'����������������`��-����,�t?�e��@�F���>Y����n�.�����W�f�
�agq��-�=��x,v����/&"h�O�{���e�7����q�\�������=T�[>�Tn���AI�V���@E}T*�P-4������a�tU(7��a_���a�e���������^�
z��_����]��k�y��p��`��%uI� �+�T�'��zU��Z���z�T���+�oz�.�������y�w��n{{��^��0q�T�3����@�MXiu�D�^�S�u���|�(Hq��Kk���'������'y;7��u�T�'�~o%�
��g�k8�Jp���U�H��nKE�Wi��?t���k%��"0\�C�Q��]�������@]�.����yX��
t.+_�+^�[8��_n#�+��`����(Q=\����Zw��4�]�}��Q�����\S��
��(�GGY:���5#����
�vH���s19�����U>g�.X#�S���}���3���`v�s���]��o�����N���	�i����Q]�	Z�.����&Q����R��n����7���`��uw7���{�`�.hs|����Of�����p�e���R�uw���2��y��T�l���qe����o��e���m,l��8�	�y��gq�b���Z;��9O}`�}ytew���������v����cB6W��|WG�C����r���"x��o�o}��w+��G��C������):�������3L	f����������g�)�AH�v�X�z����@���!�<E����\�`�����K\{|�N��t0�;O�K�jS�Ym�/�,m�p��@o%�zmT�!�,5?`���������0�gGK�F\��)&�Q�D��$�ae,��
A�2����4���5�����i���-t~oW����j�Hya�"�\����]r��"S�f]cH��J��:9���a���a�.��|��b�xJ��u�RH�.4�|3�bjp-�r���#E���b��EBb�~W��3�����]�����@�\6"���F
y������[R����b�84�f4����2��nH���%����!�JV
V�����fQ�L��s�tmX��#"L|��AI�zIA]6~PM���@��8���J~�n��q'�@��a�/&�-���MP�����:��2o�2����������n�O�h�F*3r���O��uge�P�f��� k��q/*����N������)inXw���u+N�)M�����1���
~�exIIF,���B:u��7�8�M�������Q�k��s����h���n�����:����g��??2�'��j��ju�;��TF��'Y����/*Y;uw^��#|���*S�u�8��mu!���Gy�NAt\��D�}��s���|���1��]�et��e��/O�������L>��:K�/0�]w�C�
d,lQ���J`�T��o[(N�#�C%�A�oLtr�O�o�V�`7b�b��J��v�m*�
�Ln��	��U���Y������JY���p������p�����O]�A$�Q�i�]�M&���r����R5���-��ye�wG���_�b�UQ�d���f���#�@z�{���wvA:Z�L}�2�9���M	=<�\��*��4'a�������a��N�Qd�G�l�\�8%�1�(�a��>���v�2z��"���0�ubi��4H�uB��w�i&jR��A���U�:��i��Q=���E���	#�P���A��Q�3��7������b����R��
��%�z�s=V���S�dE�u�@��u��m),g5��un1�xQra�W6������u]���-����D� ��()fXw[%�]|R���B��q�,�*'=T'.���-�/J�N��z3��v��b��>�tTK�k/{f����|v��N�~8@=�q[D�M���Y��zN��	��f5�����^��G�e����6���M���,����&:��;�!������������Y]�3�k����|�F��a�xAOU@���p:g���.��^X^�,�Q�����tl�.<�e�g1��,l�Y�@,��.�q������U�@���p��Nc��
�O��O�@�A��q����j��-|��G��:cV��Q2������n��Z�2:\�LZ��Fq�\^*���c�j���Lu�@���M����H����s�u���~a��v���sag���-�[���49��F�0r��[�QwU
������!�5�[�2�A,�QB��N��u�'��$R��y
�t'�@/��2�����o��6�������ZpnGY��V����+��]�;��O���'���}���[l��/�����.�H�K�`�E������G>aLl��y��ZE�K]�T>aL�rc��z��N�ZU"��sQ������]�=f��g��s�p�V�]�C#��l�[8�R�H�_e�eT�����q�B/�q���b�p\���z�h]�A��Q��Oj��a�\���B���	{y��B��� ����g�_�� ?�(�QX�8��X��0'�Z��A.�Q�p�N��I��zD�����g�`aAI���_����>J�Vz���2���4���� :�.j��G�za�-S�j&����� ��a"���p_�s��������u����������)�\��V�@/���'�c��,����eQ��X��m|��$lsq7P�)w.��,��hXo|��]���I���[
�����%����@�i5\3��������@�G��~��*�:I�&��?J���'
��oi���f1L6y�4�T����~BPw��N����I���+
��|T�2[�����F�1�����������M��j�N|�H~�5�B�/2x�������X�T*�hx:�,&������t���H��^�	t*�^L���
	<(�
�n]��E�����:W�/fg���Q�t'SPwu���k�X���ha�^��R�-X����(������ 9k%�l
�[
���d/J���b����[(X�c�QN�f������e�J��R�'o�Ej����:y��Jc1�'�jA�1�s[�!��\����*���u7��$��H��Nk����[tF�v�[�r��ko��O���f������+�=Ug�|-�br:�c��SU��6U9�h�r��J'#�~���M���f�e�����������N'"��0����������v�`g-��-<�[�Fg��
��������4Z��E���^��*�����N��T���sS�bZ����(����A/9�8`j/F�T�M@��M_�+����ow9G��� �����/���)�@����0q���)HU_zy�G���E<�U%S��F4Pw7
lw�,�T���a"*}nd<]LO��:�i�Qw�^Z����;-k��h��=�D�Q�)M�K%+���I�����m���5�_@_U��������|���uI#�C5�:���������n���.*���*��J�xBvy��
{O�����*���*������&[�;��^�]p�'J��C(�u�m��^��"2��b$��v�D�l"m���#�*�I���smn
��*����/����k5[>P�aPu�x5�'�V7>a\����P�T��������U�r�������SS�-��q�[�4����BrH�F��T�py��t�����.�;{��	��K�^�?�	O�J��/x�+������������]�O���6�f�?]�3�Q��{��|�/�f��������l]6��q���g�Y9��*u�t����ItjE]LN�R�KVud��D�����"��Q�u�f��"]��1Uk,�����
h[*	�D]lmK9��1��!��"���T�jSKT.�Q�:�O�_"w�a��A��"��F|qK�3
+_�@o�^�|�|]o��W�������/�/���Npu����u���W��'�N��.�h�HM�<�t�a�sio<��^_���'�1Q����mjf������]��hi�����9�S����>�GU��I-�������%m����9"��k*��������Q����To�Q}]�D���������:o��eA���Euz)�C	/�
�>�x4���>��
�����z4�9�^Fg��� (!OXY����:��7�G��7^R����p��[��Pc���)q�}��|o�/���0qJ\3L���M�S��DI���S��Ca��<��)�f�������{��T4����.�"Y�*�RXw�"�R���h h����W��&�"���C=���/*���`Fv�eD��CgU����kQ��.5���.��3�n4��::�j����a�6���}]d���x-��f�D]����v��W����_��:*���b�.������S����&5�ur<�������S�Q����",������)�
�r��@]�v�;�N��bnph�6��~]��������D�uy�s7����n��x%�e����f��J�����Kc�~����LM��m�he�?�l-yO!��(q\L����)�4:S���~������:���.��>G\���E��uGs�]]d5�Ki����~Be_'��V�@/W����zCe�U����.����*�[Phua�@�K�d�v��`��x�{�H���%�sF���c:����5[�:w��"��x���R���*c��J-�n��}��=h�U� ������8�vCg���5���}>P�b*���i\p5��=
��� \Z���v�W'[/9�(�v%\
�T77��z�_��Q.�����U�)��uG�|X�
%Z��u�K�R.��*�:�OA�)��xB$��^*����5{�s��*�
z�5L;z�]uQ�^��"��3��3i��
�bn6W5l�MU����tSG-�]�U%�,b�&�-�����z
�*�v����>rw_m��~B�K����U/5FU)>��*zAge����F�X���iVeDA�e(9������|)t�m-��:p���z���y�U�v��.�S�mS q���B�v�S/����b�x�[�t�s�@���������(�����j�Ao�m*
z�W.�h6>!%!��[��%Y�3��L���d17x_��v���#y��hOV�+��y�2���@�zGUGh��h.�U�p���vt��]�2:���hSiC�{Jt-&WH����uq���hWqU���DAO��U�MH�"�h��-��ss�0����d�;"�]����2��oH��>t�|��B�V�yt�J)�������A�W=��w�.#�^�	G��;$bu:�-��F���w�n����k-�z�`G��;��}������QF����Oxf��r��)�y��A���#����JC��QPWO��
r���9I_�}1�{����=���K ��Z����/�?��O�MK��VA�����J[1�N�������*,��m7'��z"	�.?��)=�[	���� V�����)��v������AoU����������ru��t_���,F�����>���r�P�q9?����u����q���b}�G-X���=}��pow�K�N�2Q������v�j�]5i�6U�
:������I��T#��W<0�	{��0Pw��\��xB�!9�kK����k_5���f]t!�����6J�)v�����L�����F�����Ni�������'���/�O��4�3�N��>���2�m>��~�LG��]q+}����-o1L<W;�S�����:%F����2:g��d�S����b
����#H�]��J���Z����F��Z$�����^��`�|�#p��A�I�&+��8�������A��w��o����vBA����[o���v%�����@��V�����s�������U:�������1���~@����|]UF�[S��i��3E���3�jQ�u�F�����q�5��@7�;B���x��(gm.G���K��������t�F�N
t��y�.g3�%��4�&��K(#o���!R�]�}��x$�c�����|��W{:+���g�}��j�a]j%��eU�g����-�&/tr�Fe��\L��]�Z��v%4�\�������5[�W�����I�^�]��� S/��\b������z��6�x(
;�<��u[`���)�BjX����n���e�)p�>��h����)���W������1������|��x!������]@�T	B�SNn���4.��#���K<�n�O�p����*��pL�3��Q�2y���@���? ������@��k,	����������pw+/J���	�9IF�*����2:��,���U?��%����/�������Y�;�#�,���=]����l����:�;n�!nQ?�!4����J�Y�@eu>��R����;p�����)!o\%;��&
���)�����5p�N���U������L�_W��h��f���G�������+)��$uw}����;[�2��SY[=����^�� �b�n�]Z	�������u��������"�@�)��&���7�Ui�\b"���	���U�6L���W�q1L6[����Nc���|"���e�������z�@;������t�?^���T�V}@V�"�����Y|17����H�_�F��$��&�v(HVeyF
����R�HZU�����;P��o���u�J���,���Dl����=T
�	���r����}%���C�\' {*��iO�Uu�=�|�br�S)[��4QF7�������r���,������,&g09��UU����YJK�����jI��V����D�O�~�@�C�t� g�����2*5�dU����G�:[M;c���?�s�i@�x����:�[���s����IN��
����0*Md��-��!����/��;�:+�,�Wi��6���_5��a�1��+�;����P97�����T6v�~�C#�z�W�>����P�k����������J������)�����M��@]+G���9�z:p �<W��l5z��0A7�)��������}W���R��iV%WA[=�?ZzBj�@���60�6�c������/Y�2U���L����<\��^U��j�x@vj�����~��@ww����@�M&��p�U�	���@����?!
��E`�����PFG��qf�K���?;u��H5Z=�Yk19��J������R�|_�(�t�<����sBhu(�U��
A�d1bw�D��.]1R������%K�%�u�)�;9'4Z�U�y�����M��u-����P�V�.t���������-�oK�R�(�[Kn������a�/1�:�
�r�����F�P���:����X-Q����8��_o$ee,��NV��[�@�u~I����V���1��?#��L8#P'��.���>�p��z �:\m�K�zm�
h�aTdV��[=oP�?	z�F������W�(%);�VPF���m=�B�P����5��CU/��[�
��M!5S���>�-�S��Q�<��=9H���[%[�[7�.��da7<Qda�j&��J����W�,�P������f�wO��<�c���r��;-�����n��6� �[\	�r[J��������Mscr�4]�c����U/ �"�<l��f ;\�#��.ss#��1L�jW=���c��:T�&��(�G�������B@�m�)���������+u�T�t��b��@�(�����JTV�#��J|%��+*��$Z�����q��0�u>�9��&����)�_ �g��A��i��^S������GJ�}����eT�@p]�b o9\@;���R���a���t���A��0b�n?���C�hy�.E�V��RP������V�+u�E��[�*���{Y�pK\�G��U�#��^R�<�g���%.	��t���^�j_�=���Y���I��>.J���%���uL���W|�-����S�ea�]�y��J�0�S.�q8v�+(c:���T�-������[eT��A6Wn�����q�N
��6��B�r��Y�sv���.��\W�xB�j9�#
������K������y�x�g��y)��
�B�tH����E����>�;fb�C~�U*=]n#����>:�����$Dag9��-\W]�l�(������vFBt�#S���w.�sO��������v�`���#���+X�xB)W��m��"j27F�K�dDa��<z��2�����6wB�t����p]�)��>����@�:�[H��'���������A��f���MR��~��@�t8Q���n���.���`g}��-��?
{������T=u�]"�%��nyX�+>��QA0U~�Q4!��0��}�����9��;�D\�~�trOq!�������
$^��x��Y�a]�|��[o�������p�=X�-+d��Px������o�����ITu�%*���r@����������������D� ��	O(��d�n��Y�e$����h�9���O&�}gl�����NY����/����K�1�g���%:�]/���	�7�����gdQ���i���^������e�S��]��-n�3�^�*=�?�-�d�F�=������X���6�.����0]���Jt.�ZL�`Z��!���NG���u3�����wuT��T��WcK���fr$��F�1�f$h��VC/���f�a�}M^.Q
�Kn-W:��;��Iw$�z��oM�|SQ��	q�������^�B��
o�t�$:w���ym[<!��QKM�T
��&8����.�]�OD�6^R7����c�nf��Q�i{Z<!��QZMV]U����DUic�O9e���8Q&���U����4<!�s���]���0�V���I�v�o��_��z������~����&;�-l�!�z��[A�K5�#���O��`�����%�G����n��	�K�
�L��UJ�����������J�����(���^j��u���f1L6\�{��c�_�{�a����z�F�0Q�0��}��������-���%=~����$��UW($zL���0������&������4�%����D�=d�^e����g�3}��^��,���/���Tz�e����g�t�K��E&Q�����ZT����+��.�����T��*!�d�7�!���et�i��*��D���ZL����N�!q+c�5�KZ�/������.�
���m������\U����|�����\�dg���-<��V���u�6VM+G������5��o���%{��K����De��En��+\8R��2�����-��7MAO7�8�o5/�y���9(��+�t��_<!.��L�p�����$z�����������$��W���?�������C$H72�7.�s�nDK�l�@��v������Q�?���2��`���
����Zu�;v�,V]��G-K���?����#��
�A����mY�����I��}�-l���F�d���V����p��������fA�����K�vG�@�sgpY��������3���0k�y}\,���Kr�����{�����_�B����	�tuR���UY�Fa�~V~�f�2l�J?�������YQ�d����YW8h�^�����@�um���g�u����;\?��F�-�{#����� S��u���`ug6����j��9t��Fge��Q����q�~��]���\��:I�U�=���\����w6�p���nr(�(? Z�?.}������]w�{��d�\��o�����8�)�s�E��~
��H����.����fts����S���k�����3�<u��{�KE�\�������s ��!������p��84n�F,U�L��2_7���=6�OPY�q�u/��U
'������)2�S�`1��$Nm���:���
����/l��R���	mWwl���7T]����Q����� �Z5;>�[xQu���;��yP�q�_�6#���sa�;�&7�T_��+����2F\�?t�wd���^w
:��;�n�Pv�Z�^F"�%�}�GK��[���p#\��1���Q�
��vL�s���9>����8�\��.!�f���`��l��\���i���=������J���	e�m��*'SS�
�M�>J� w�A��IG
��-��F����`�rgb5]�}��]������:���ub���\88���2znl��=�/&+��>���]�':�l<T����}�jq��c9�{���j*��?�2:_f�&[�����U���b���04I]m�Z���C9/����D�|���O���>�U=���]Ee�U�.�����/������#������1�o��}E���$����b^���n��=tg�H���>*��:����4t�$�;���b^���N��(�]�~A�;����,��|��������3�3��{��������'��C	y��S�������=.��aVi��>���������`O����n^���$�{:�,&�m�����V� �j��5���2�Qy(�J�{J,l�D��k�Ke��
C���R�2���i� ���������}Tu���^�
��*���[����|��yH/Jz�	�Y�}cUU��>�Y���z��4\��;+���Y5r1L�w�	v8���z5��2���`�+�����z
�S�?�^<�[�~�[�m����e�A-��'��#PW^���w���\L;���HV��@����Q/j>P|<���Q��&'�-�A�iM��KT����D�����m��J� ��k#ny��
Z������K>���}�Py����:&���E��Eg�Z��@Rs^hj���yR�s�x�B�|V`?�B��U!�Xae�+��%.��� �j}�B��5e��
�e�~�������z�d�l�S�}�E���N��vG'$@�t�p'�����:����W�M�P{��R���VF�z������=�GNN��T�.�U�p>P�[vj���
�U,��X�C�
�.{�3+��$�8��:#`o�����p����Jt���nY��{���T�z�����gcGwTf�='taw�y^�>�p�.\t�sr������Q�����V>��f{aOJ�������=��������#�z�BZ��u"Z�2'�����B{�a���n
���2Jh��uu{C��R��E"e�E��q��`�;7cvc�����tX�y(� P����U�����H���;���h�.�u+�{"(�.���'@/*�	���	w����x_��!-�9����w��V���!���c��Xt�MC)�PJ�����TMk9���
�Y%�
�(��D�����A������
�/b���Z������)PX=\�4�
e��Uw��pY|�n���Xz(�&�sc���<\�.���)=�7�h����eo���'��=�xB6j���PC��Mn�S����N�!g������o�a�Q�=�� �~�HM��@/W$�,���6yw���bb[l�n�{h�q?D�
J�.��p'�{�p�A��PM����t|�����Bb4KW�
�����lNM�QK�u�������+�t�����,��xB<����i]�@�T/�v�Q����>�`�-����Zd���Bwtc�F��p��k�{�m�M�og+������
��8��F����t��<����QM����/;���Y�`w4�8��+�������:Z?W�z�h/���}�r�r��+�v����8�pM�V��'����R���,��h}]x��#\�;ka]��u�F������7�o6y��	+�x}=����J~:������a��~� ���y������S����u�e������W#�LEO���F�����K����R���dV��VF�0;�b.��O�J]�Yu��@O�����{q@���h}Z���!4��U}���(V���������k�V�����[��%���s���B���Z�ra2PW�h��������Fx��>fTl�`E�m�B)Z�h���13�5��aAw��h����A9���7#��ao�=]�
#v������Z��4dw�
���"7���y1LT�T�;��
0A�C�b��a�)	V5h���%�{�Ox���c��4�f�]O
=Y'�;��dC��)}V�[�/iVe�@/��:�����<mh���`7�Cl��6��[��l����������=�/�������P�f���u���g�i���T���U5�N�T�J�4M��bZ��"k���D����MIU����3�>�Y��B��hS�����)I�Cm�:�^�xV�=�_�����8��vz��.;T�7���MiU��6�=7NZ�699�-���|��ut���Rj�+�k���g���VjSZ���]&���S��M��>Jw)�z`C�������<a�������n��Y��R����&PPw@G(���<j]����*W�`���/l����yXW
��o?P�Q�+�~�s�j���lSI
���nh��1��-��q�y�<8�|!��q,�� �y2��|��b�x�l��n�k�6����)@_�Xt���������Y�� b�*��f�����u�:�n'���"��d�a_�9�?@���&l}�Bv�)�UXOD��=`d�T�0�[��������lS�B����zMK��	q��l�o�z@�5
�M��Y��z�;��M���>� t~6�����*���z�����W|FU����5Ea7>+<?�g��u���`�������)n�������@�F�����Y[J�����6U���A��7��B��nhn5�U�;#����n=�;oh[8%�rJ�m.��|�b��;m��S���`/W5�+A��9(�[����K@��`C8��
-�8�+�-���e���m,���	���
�..���'�����m���c>�����Z�����d�h�V���
���A�/��������E�������+"�:mJh�uou�2��b��$V�����"v����O@7��:��UI���:?A��aUU���n`vmJfV�,Pg��s�{��a]Ir*��=*�]�+����F��T�h���QXm.ar#����@�:�|�]<!�����U�2���V�]����!�u�r����j�o����h]/��
��*l�.,������B���m�����a]h�Y�����[�l�m����A������U?�C��z[�	�@���bZ�6U�1�\7VF7��m(�6�����|��=7����5[���6e�E�!]�\��������s���:�kP��D�q*[< ^�f�����.?*''<�0-&�Q.���S�D�h��\�L�M���>y����a;����Y���F��Z?�!������\�#��2���W���	���Z�����{[��A>P�
t�����rSZ����<%��"���Y�w19�}.j�<�zN��b�8o.)���7E�y�[��B���/y�R}��4J�v�ZQ���`�}���"���Cd�]�����z4)���m/J?�����^�@
Z��P�v�$�����hKn�|�)��L
}h���CA����U�s���^)=t����vl��R�k5[MW����L�sB��l�.���{_"�������>������\{W�Q%
�6`������ �eS|����@�Y�����,���t.�_L+��K;+�@�k����+��Fx���J��i�������-�m^���n+�;�E�<�tT������W-��g�i@HF�����<hx��o�
S�Y]�M;�I��U���6u���@����^3#RC���4hq5wd�T������������^|��iN�%�$���rb�����&F��!{��z#�|�<��|u����A�����U�#N,'v��@��}?�0i�9�GEM�Vj���A�qbY��8����t��������(����v9��k������@��I������4��"��������u1�9�`�s��_��W��,?l��J*�.���o���`PUJ���y=("?����u�+��l;�u�,Neq�!���@]cPu�A����Kv���e5�l]nX��:c�o�6�nI������i����'�n����h>I�A�y5
sC�i�`P����s�����������hl��<P�X�U~3g��S�]�a6Cq�+{����H>p�u%|��}���-�f,�=%�����T)`�M%���LL�o��p��A����O�Ge��+������N�+g�X�}��,��
�@W���b��l=��0��_��h��&��
���*r-�P���
�O�M3P���*
{�yw�������+<���
���H�3*�='���� N�(qb��xu_U�U�k�^J�o����l�����JDtM��L�M��a_wq��G�4��IEj�������N��N,�uL]n��Yb�(]c�&��V~���k��"�k#k?�H�Ty��bv?����,V��{�uAuGE�;T��D�Q�~}�/+b��s�[�<5��;��k�v�:��t���x��.����c�5x�yB,0��y(Fv?����"���QS~���6� ��w��%�����}�.�z��zh��>�j{-�����'�R�������u��������,�5/�� ��TK`�r|o���r��������R5����?(?����?���Y4{�������7��}��.����(��63vaiP���{X??.��>�{�p��t��2����y�oC��%�4������j�|�����-��P��t�hUz���}��+@{��)3��v��}��^�4�Up��Q���`�����o�Q���/��4z�m�(�*�k����.��;c�:�����"�N�����:-!e���
Z���`Gbx�,rc]����2�������`��g*���	cT�VOI��������2�6��z;�B���h@���2��[��r�\��T�����J���`_�2��H����1�;���q��@s�q��`��q�?I�����'�s���`��&����	N).S$X	O���;���
�@����,���;�u�_���`������`���M�*��3���-��U����o�?J�v����j5l����2>a����p^��A��q�����x��0�\����~�:���@�-�z
��h3v���U�tl�������A���@���|��\4p�<{�O�kGf�B��t]G��b�n�u�Lpo���'	�D�����4�]l5�����+�=��)��=M�wW[�?{^m��Bp7�`e�o��}AY�V�����G��,mJ^4��� ���0g��E��c��Guk��%��Y,0�����sOH���ib���{��>���7o����9�6w�E<��h���[�<(�:iR���H];dm��i������������z����B?�Q����Y�^�������8��^�@��h���K�
���tj�g�%�\:�vgZ\�� 4�v�q}�H��R�YVl7%m[<�R��v�a_�����Adxy�6O�A�N�`���4zy�$��,��(Z �+M�h�_\W01�G����g�l�K�=���J�`]w�g�����.��k~EZu
���w����%�[]����F}@����K�=�u�6�������Ji�@/G�����V����+'���e�O�hu�.��A���}�� ��T����.��S�FOvc6@����u�9@2|
~�f���{���"�d�*��+l��_���U�L�^���K_��'��q~�s]���~i�Q��h�kp�s�*��*�x��]�.�
�|�s��]� \�H0�����R#���U����l�XU��	+KsN8/)_P5.J�����*��W�+|�z��[Ao�C��UG�*��Y�����������js�r�GZd����a_��k�kzH��FvR>^UPR^#����UDu�����Ue}����f]	�)#�U�������������Ui}�Q�I�����u�hS�d�+�IV.J��(�h>� ]�l4���V7u-�&��@���s�:�J#�uGB�][�o�3U���:������������<~G�������8�;H�����i��
[U}���@�&��'�zS�O��q��FEa��a�:�qP'�ZT>�|���a�"]���Xuq�R����#t�W4�����6g� �^f�DL7O�1������v
"+UVX��������rq��`��/!�����W���X_��������O��S��
����!���������x�]r�%��a��@�*J]��6����>`=��[+��wYArW���^*�)��[	���������Z����81Uj	ls�@]��W�nN4_9]��-*^�T��+�5Pw3����� J��qQZ^��6m�K^�f�%Jy��	?5��t<!��B��0�s�2�E�0��~���f�f��B.��`�iF��K����P�����7mp.���z����s�3ay����T�l��QZ(�v��8�n�����K����A5���`]��S
�3�`=8���.J {�.��DA����To.�
�8��8z�k^J�ts��`_�*�����y"]�c��.�J�u�Nu�8�!��"��:M�_4� �-}�(d�s<Pw����j[��R}�e�8Ve���8����.?��t ����my��eUn����F*���.�������0���E
�9�
���U�2v�����ycQ���o��"�nm�+8��E	_����^Vlk��]\����������/��
�%Lp���u^*Fu~8u��fY1o]���[5�y�+�Z��.�!p���A�/���K�����e�q�E�[^K����"����w������G�.����V��2��QO����7d��z�
A���}&�����aU������
�s�Zq���A���A�6������z����������
�YW�T�r��<���#T�	��=0�P�E����F>�8an.
��'��S�����Uu���Azz���C[]D+P���:�v��E�t>	�r����#���O�=�LZ�</J��	����(���CA���DX��
��^�/J�v�K�2I�Q]�}����b�]�lX�%�~�O�����aW;����4��+���	���^,�;D���Z���n����u����J�i_~��b
��)����@o��u%8�����A���bzq�e��b����f���3���B�.P�����fi0h\�Mo����N��w�u���s�.����bG9S!�����+�v�/����w�8Xo.e2���f,�!�G�_}_T����<A�K��Y6d��+�����6�|3������j����[����'������%���4�4}N}j���Y>q3u����b%��:����rS����U�����+�t�=�S�v����?lsv{��{����
���k�f]�p]������w�^���Jj��F���|��@�{�6o/��_�`8�I&(��E��a����Z�;PF�B��yXM��
}�4��Xd��
�>K�s3M�(�lC�U�#��\�7����KV����3g��?
D���Ul3�9��=����T����W�`ow	
�l�H����+7�8�O^5N['��~:�6cqf*Iz��D�@\A��������_P�.�������T��}�Q�X���L��}����a���O��n����F�Z�u)��,������m�5P��
���&�Q����f]��|����]K}6�,L��j�u����ts���^��V���P���ym*+
��������+��U��Ji������M�"�n?�r�:uxP����Z�����Ge���*7y������_�	����4�X�hU�0�]q������Vd������)�����s���]T���e�A����b2*����7P��y�@p��H�.�����}���Z��yBLF=�UY���t��M��3�x�|nE�~m��\�W���b�ib1�'��O�"���������w{p�T������u�s�6�5�9����)�1{U���C����
V������J�������W���`�����'l������`o���7���WU�{�;�T�?XM��[�y��Cl��U�|����I�vyd������io��I�6����f(j��
V�_�g��f��{���c�96��^��w��je�����].�?��N��q�d�U�����/��U�����?��}�K?]��7�����&���AT�*J�����KN�f,/�ZG<���Z�_�PK����\�RJ���K���v��*�6�.��N���VT�WQ��PqP�@
�:_j�k���r���i��2�@]�%��n���.��"�*��yU��4��V{��
���7
��B���p�KJ�_In����D�Qz\&P�������)Z��]}��iT��}U>�D�t��]�q��9�]�p�Q�.0'�l����R��uW�@]sHP�`7'|��B�:7��kQ(�9�&����((����k:R�Jt��Y)w���m��.��4���j�j�~�����{�(NW�|{/���XX*EvmE�F_gO�g=���rOK�0A8��m�u�{@/wN�h��%��Y,)w�
����\X�>�7,�A	]E�����`��H"Ww	V^b��D�^f6O�q!��l�u�)�1�nt���a�}�k5�&_��%��F���2�lP�3��
��3�t���sFi?��~�sX���i=�|��,��`��!��n����".\��2����k�������K��aP�����3��W�YV� ��	v�J���Y��&`/wR i|`7�\]T%��\�(�����$��n2��|upE[���AC��-k����d���R��Y�(�z����rnrf��[=(lAY:P4v%��>.2��.S4��ZC�J��� �{�Q%�������
�U�?���Z�(W�)���l�9�{���tm)4�(W�@FY�A�$� ��Z��>�<	t���L+�9��u-�@�%��&V���D�X��R uF_'I�}�1�Au8��U~��r��)��v���>��1�\�T'dt��cX(�^�W���jt�F���4�fLn��I����|K���nu�`����I��z�6O�9�.�H��du4s�����J3�>H�DH�*ZX���9��ZW��~�,����}\f'��tbh�W^��"$[��,lU���k���49��.k�
�����;-���fe8��N� `d�v��a���`��:��|y�Jg*�}�.h��������'A0��t��,���S� ][]5M��K�E���FM�]�"�?Vt���YW,7����\���]��1�~ ���Zt�#
��tTT^��=��$��b��E,��eSW������,��36^�$(�������]����^�;�u�/������+�4��J����x�M�S��*�v��K1���������9��R*6��e��\��K0�����.�8Xi�Z���
�����Me_��ty�K�B�	�����ME�a]�(�W�@����	g����-{A�$m�K	
�:�V����,�����y>���P���W��|�^Ck����>*��V�s�|���:�s��6��=h�~f&�9�'��{�n4z�A��������L����2�{5#�}{���lXP�#�w��������.��V�l�W��\C���%���Z�T�uOx�(U5�g�r!�6��z�&�����V�Av����.�:���V"��w^��������y���s��<!�e�u�X��m_b����WJ����.�i���}�l����_�������NT��\��W�WqC��)���*]�G9�A�����J]
���b��7X�<z9�7P�w�\s�7k�i��
X��U������	�J��#X��a����������	?'������uZ��M�#N��U�bnS���E�9��m#R����
�]'[�B��k���������nSi���c
7�b4l����4~ao�#��t����2��$`�8��*b��B�
�\!�u���NKd�*��\nJ v��L�]	���Fqs�y��6E~U��;�!U�un�����44�]���K���uN����Y,0�
���m*1i��o���R����(h(F7w�G1Z����.�����o�'��s��d���\~��b��)X�?6�U���]I[�:uU�5.�YW�M�,
����}vM%'+m����z���^���X���u�P����dwa�@�������a��hq�BP/�i ���a��@U�w9k��
��3l�u�!����<(F�"����]"����-\�\�_O���k7���|����}�s�� }CEy�����3�B��5L������;�y�lmXwqu��B�vy�D���+�)�D��.2X�D��p	HM��$r��WT���'��=�*�+�+�z.U��e������ ^2����4�]��!Sj6���X?��h��B��9k�g��05:�
�����	t}�6����2?�}]�!��Kl3M,F����� ��P����t�]zp�������`���X��r��Y��
�+$}�X��A���h3��)��W]��X���}Cj�9{�"�����&�i��%�2����~>D�6CaD�=�]:Y���Q�!��������us���vj� �������}<��������v�h�=8g�^k#scQ���T�3��g���x��8jS	<D	��W����I�w��D�k���_�(�3FE��z���e��f%AD)����������L���xT�g�H�7�	v��������6�3��&��5�$���vZ��'�#U�nX����jq}�jH
�����g��4��u��S�p����'|P��,wS���.���w^1�����*7lq�����hu��@�����`G��qmg�"#~p;E�Z&�[\�_o��4/K��nr1?����}]��Q]�t�_Zh�u�,QB��RN%��Ek���\B�|�H6��%���K�<����N����#�fa������-
�u)Y��\��#[RN�@�
���D�a/w����	��k��XaF��4���*Fu^
�e9�Vdl���(���;���(�7W�5���o���!���������}y_7����J��]��6ca���%t�������]����
q3v��,@��/�0��/M����e�"	~���W�\%��x������5?��=�Y����X��
��k9�f���n��q�<���zrjV���Q�����kh<7���
6���	�q�s��K�
tm��YW,%w
+}�����s�ny��e�a�2��23��^~��b!�<�;�V�
)��$_Z�{4��@���`�����0���w�@����-A�@�����@���.����i9�U�;7V$A�CT}J��W�}����r�r��[��o�?�Fvu��kY����#���������f����Wm��]�~GMg|t�]�.�*���L[���2���*�t]��Q�oH���O���n��d
�����r�Ls0M�E��w���|�d�|/��~rXK��0:��]� �����!����`]X�U]y3MjT����D�Y.�=��%��
@&�2�A�$��49�U����u���;P��JHT�����������|���S��u]�'���@%06������d��E'(�YD��rq�Q�����6��q��P�k��X��6C�}K�pw�@o{����Z��_	h�GM�i����
�.�n��F)O��%|3V�*�����nj�����.|��X%�Jv-M���	t�
����?{S�SH�
��I}�ibE9Sad��5G=��h*w��<Yg[�M����@�������@�f]1�T�2����GO;B��I�.r^������.2�k�2Q�o
�n��Q�1�~���{]��v��a��;��)@�r��b��T��|^���y���a��;	�]E�a����OE�4�2�'�����r���h���g3�����1����n�:�=����H#��w��]7$XW�	�UE�D��F���ng���i�
���^�:�V��7aD���lq!�)���Wzx����hD��+=fX'���� �.0l�*��am�����F���I�������"�U~�d��8GU� ���=\�	�7���v����R�r�\��N��bl:'/J����^t7���s�R��|�p��O�9����v
j`_w���hq�"Pg�0���kG���8d�V���SA��z��@w�_p�M;A��6��������a�Y[t��9�R7����4�He�n8���W�2�z��z�yBl7�-}6�H�k����Dz����l�MA�3�X�r��� ���m��O��U%��r�O���	1KT���GZ�=�Q���z��|jD�X)��.2���%�{9�@���6�Bpy�S���$h����)p��~Y��G��R���&���B����y�2���Uw��/8�]��8��v6��9���`o�m���YY��CU���4����a��_E���F�-�z7�lT^b� �E��6�`����SVY�:���"������T��7V������F�Cq���(��������7v�F���5������24��0�����]���A���/�(^���X�A.�1�[~ST�B��A��a��Dl���������e�����+mD����by�	���?��[~����<!����!P�j$�E�`[R\7���L`�>it,���4�H��!�}�G�o1c�
�l�@��7z��%�n�����)_��4��6O�-�|��%�~�_G�?��e�{�nu�!��NP���5�,Y���s�!�b���$�B�P��mw���L��:���N�&�y�U�27��%?�F�uQd'����eI�"�2d���
z�j��\��b�����;Z��Y8i�r9��V�WBO� �����B�N��U��e&(�V���|�.��f�Xon���K��.����[H�R�&P�a:�W����b���|��N�f,�!�L3��������+�s ���rw��C������;��R��M��d�`�'�<�{_^_�hu��{h\��@Pn��r��F��u���<!���p�u7�W�Iu�A��1w�bEM�Y������M�A]W��Lf��]�0�J�7:������Ox�F6���$�'��@���/t����|Q�r�!�v��r����|�����Y���2�=9��J��5e�����N��[��H�{��<��3��Q<�U�9j�@~ �<TZlQ12���T8PSvq��9�)���k���Ci"��|7��N�P���7B=�A��@uw�=�[��@�p����@'x(?�Z���]�G��k��ftw�r��:��R�����.*�/Z��*@j�`].�D����@��)\�^J9�e����]��C�����@/�-yo�@�x(mc�k�H������n�U�o���@�xm��+\���83U�6lUI����<����g���
�s�*=������\��	[��*�{���W��s��F,�_�������Z!�9c�}��D{�*�U�H'���8:��u����3�n�
�W����i���&�W,H�0+����sXw�i��'\���e��\p�����Vw�
����\���h��\�"�i����M>���|@P-*_��g��{���W5�DZT��7����VY�����,+���4�8�d��� J��=���������_%��'�:v�T��v���2c^].����8��������-����}�3$�5D����:��&M�m�V�L��9�A�MX��������>��������N���I��.�.�hSzsT����kS��.���?P����Y�4��8��"sc��	�F�l�:�B�[���^J�k��L�@�����b�)1e����f,l!��[�����k�fn,{�C�b+�����cqz)E�wI6����n:H�:������:�02��c�u`��[��[�����m3M>%����i��Q�>�-8G=X>%(�T�A/������Q�S8�5yx�����b*D��RN>����0o����o���8K�.�}I���g �:���h@]���{��:�R�W����@��5k����@��K�.��1JTu�����#l��� ���������U�4l����];��Q�� !�U;7T�����E���������Z��
7���L���H��d�>��A;�~-����A��T?;������|�p���^�����K����_�u�h����^�Y���J�g?��b��T�`]/�9���"+� y���v~dsW�f,7vk���4:�O���=����@�vVy�P����udheX"�5%��z�����3���Rn��F~@�g9����@]��B#T]������7�����4�,�l;�a��:�6+����6/�1PX��N�������dRa���}�������Ktp�8����t�V
����,�<zP��L�P���������$VagD��������a]���-o���Zi���:�6���;���b�������_%{�Ir�;c�T��P�^��wTV��*���I���?�K���Tv?�����������j2�Y��
�, @���6J��+	fTw�Xz����p_Z�����/hq�2�����y�u���.	&�'��l �)>��8�%��"�p�	c[���`W���X�������!�W��f���'=��1�w�hq��	��IAW���49��+�E�u�����:��	��LO��������U\�:�N��s�������X��Na�+��7�������G3�u	����l���R��=��Cfr8�5���$*�s����*�-Z8S�Q�EN��]u����n�.��:� n)��`�%2����-���Q5yb�!�9��d�,�V�7���J��^��6cM�o��DM�K�tu���%;�Q����J�~��\Yg����	z�t�Eo���y�zs��
q�i�L��u��������4��X�;��
@�%�i���'t�F�|�"!{Q}����+��h��*
�������F *�xN8�.�";���r��J�@/E��
f����1/:�������t��Fk����`��O��@��E�=M�N_T�]���hS�w����p*���u���b[(��K��u�f��4�'�,Qa-�����:}U�
��|J��8�U4l]v��X�*���=x.�j�o	{���9�*>��R�/�����(�=��49����(6�<�.:��/=��y��������`�|>����,�`/����s�J�b��j3AZ-�Hj�Jz��I�^*$�*g?��I8�)oR ����F�<o�#��z����=
��Zl��Y��1a��|3��|����(��*Fz 3�������Eg�#��R����5�QU����^�&_yX�����!Py%��7�zQ||��&�J�z�Z�{������I�Jl`�*{]���������?�/:W�nT�hQE�s�|��E��un�`�Nhw�T���� yp2"���)���c7ca�(E�5Sj3��s��*U!U�(��28'��\�����C;X'i���8��L�g�s�����u�s�t�&��6+�*K�G���|�6:��;F�u�������&����{��S^$*_w��@7�E��u�f��m��[:�0��Y<l�_�����b(�>�����@]���J��r��+F���o+�
���!ow���eE�+@�/�P��<K�[�x�^.�hq�L� W�S��,���tC+U�1��o9L�k��W	��^.y�aUehw&�T<u?	�e�H�M�q��,�4z9s3��Lx��X~Jg�U���X[��4x�m-�;������+����rtK���E1�l�nDe]z/�I�����w�]�"�������Tuqn��]1��.14���Ei�u�L�������y��w*����`�5�/Z����Lu���^y������~��'Ue5sP�6a���b�y;�Q���� ���4*oD��;���:s�S���\zp�aX8����������@�VYit-	�,+6����x��U���9������f,�x����������K]���'�:p��`��>�K���g�JOo���?���*��y������a�:?}������nq��:��B�T�: ^���@��3��V�B�����qGZ�'�m����}���Ad�M��3Q��~�aE�@����|�������`���4*K����z�w}��luzP��e��Kh�K����:���"����9�:�]u���A?���5�������R-��k���3�$
�:3�a������2����W�A*���_Jv�nU�rw��d���h]X�Q2w��}����r�a~}l(�	l?p�!
�*y��oh�"
��mDP�-T��Q���}�W~���J&�>�0�\�/��V5/���e�*�����Y���d|�!�����f��n��:HaFi�u7X�H�/���irj*���H������$XY�1��p?D���q��r��r���`���IY�Z��Y�[%[��0�|Y��y%[�'�T��j��>X�n�0�:�!����,\���.�'P��C����@��uE����yu'���	S�VOx-���+����=yI��}���d��f,l���,���8�/�����9j���c�:��K���%���L	@�����K�,?�A����^C+U~|�.�~A�;�|G�fi0g��+l?�����Y��.P���������_9����<p)��vw��:(�+�����Rj�{>�/k��}��4{z����'��doS�7��lI�����6{����7�#N���M�6c=�%����~1���0KqBL�1�����4Q~7%I�U����j�1J"��M;���}cm��2�U�*�����4;�t[D8-L��/*�o$]~�M��dM���4w���N��G��=N������euc+�`k�L�2Y>�6!��	����?������u�r�F@c����'*�)�{���$&6�a�|&����R1�h1�}�%�������Ovm����DH&�:�OT�e~Q�A3����������=������w����4�����g���c��������$/�<�?�G-�h:w���c���/�.h���X�Fyp�i��?��4Z���Xl�k6�f��n��=����>F6a��qC��K����2�����U�'Z��]��{��L����D����������0�O�U��M�Q�S�1I�OebS5����E]��D&[LV�D�q������	l��z`�XF�y����7z.�'�'���Imb$�]3,�����hq��%���`Y������wfbeU�3&j�~�t��?������>*0=�j?�;�����w����}rO�w�^�@�'���e��'��2���{�3c\jE`MU�DU����r\i��7���������|������'=�,�#���bt�`�����Y��n�h\�o9F��������*���I��ds�P�x���;j\�=z?��&�u�k�Wm���4)q����d��=��s`?��PH��s3KL7g��\H����������Q�R���s[?8������� 7����#��~g�����z�'�����1�L�d��yl�0Q�PK�6X}E}�hF�`g���(�l��;�r�o��}����W��%������%�t���b�����^.!�h�
�����>&q�vs�`�F��u��v?f�.�RF��[��g�S-�9J
�/����B��� 6����q�]Lam���/9�4���&�V������.TT�I�����5z����O�&���;]���T�E�R=�����c�mS������M�f,L7��]ot����:o&z���F�zqNn���HNv+��.���]�FO����cOV�U"���|�������rsV"�A�������2����h�m'1����6��](0��J*QDK6g���b���`�z�`��,@��=PY>7'�G}��o���Qb��'{��3��.���r����q~����hw����2aW�����e�ts��S�[��@�f�XB��DW����e���}������Q���*4�FO"h>����F��&�������3�A��q���Q.������%�$�.v����e��h�s��`KZ���c����`{�7���9�]�	�[��]�R����o��S�����i��M� ���\G2����������iw���{�������6�Ny�*���6gO2�r|n����O�v��@�s�zx�;G����*��Q���w�nY�kY6�g)���*��\�8n�f,�[�����=�W�l;�F�����`���Z\s|���<!��B[\�-��3pp�:����Z�������X��A�e7��
�������'|��n�A58��[M��1���cT�N:�I��!���>�m~�?�}T��}�kkN8o�#��c��'+E;~v��AGp����$���u���w.X��B2:oV������#��0J�{j�!���uq����H���Ec�8/45*#�?���5��y1��
�d���Qov)��^.#8���X|1��	��b� [Zm���c���8XW��P�31��>�A��n.��%4���H��a�����IV�xa��}�y>��5=�� ��r�;m�`�S	Tu@�����G�|�>��e�&q��/�M��uO��,�^Y�t����%��(�r�|�i�-�������lN3��.#��l���*_(>_�
��T��V��@W���<���`]�
�Z��F]��p�By!�})���;@��j8@�.�|�������8��vFPW:g�\�7OH���&���b��`�{�:�a����M�r��>��t976�3]B�}��o�D���}+��~��q�=~�{:l_tB6c������K"��~8g�R^A{>��BU�r�R��r�g4���W���v���.��}KS[}������H����`�3O/j��h�G�/��/w�#��V'z�"�|)�PX�]:�gX�h-�S����w�\�,�qc��z��a�:]�G���y#�W�������u���+f����U���eI����F����*�n+�`���g|U4����M�KE�`��v��5_�Z�W�|�����kP+��@ow�*��@{>s�BD�R�~��K"j�.����
����@��H�<!&�R��}������U���|������lw��������u�\��{�YV�>gc�����P�T�Vzw'?r�*�	����}y�7����2a��c�%�y3M?�@����][�m���D�a���m�>*�k]Uj�`���d�@�����
����l^��B��RB������/��|;��W�Y�S��`59�],���;��8��q���U�.�1����$j��J�u�es�����.��t�a�4�4�.�f��^*������:+2�����	9����p�w?1����������8`e�@��~�)����@���fq84�M�`��
������_5Y)�����irj��%b"�2{N����*K�3�/�d/	�@b�Bs�RrV�un���G]K���.�!����U�&�.�t��N�Me����s�%�h��rw����r]���49�U��b��=2���I��;3�IU)��N��5���A�]�K�T�vU�
Z�W2��L�@���Q�����T�>lw)>�J�����]v���`�����__�m�+�LSH������.�
]W%�6�e��,&���]3��0�T�/�>����O����~�N�[Z=���u
a����i!�{��ep��hs�Pf�W�����gf���o��R�{�h�^��V�

�K�n�j?_I!����ra(���y/�R/��������4/7uM�Tg�����u� &�������'����D����uwnf�'���m�D��p,L�mv8/~�@8��8�]�C��A�?J�k�<7!������a���2�o ����f]1�*,�t�z�� 
��B��B� �i�KI��v�������d�����`O��QJ���1��9�-��CQ���B�U���vu����?���Z���a��X�
����T��]Ww1g�e��^�����Fo�����M��fg=p�!
{)QX�U�*��8T��	�r'�$oX"�{�HS��YQ���qf,7�@��z�F��r�V�>Jot�y������a�F���
�:_ ^l���`�9?�@���k$��0w�2B�$�s)1��������#1|pK@b�rN�`������Q��������,����b�=j��i����4�*��G=�U�	��&2��U�e-�j�3��|���^�Vf��1��J���OQ�|7�kj;�n���CV�9�7r�kdV�
��RE�-T�/��FA�{�#F�"s�>��������AO����]M�<�B-S�Y�8�";�uZ����bn�-���S���	��xD��2��X�`.�(X�1u>�;Jm�����z��+&���
��K���?�g��lpJ���0��	���>��%L�F�G���Z�k���X�$S��|)-fXJb����L��EH���A�-�	��4x��$����,N��}?����F��VE��������4U���0�Q��Z72��������
�2�'��o����)��n[l:�|b����k$�(����U"�Uy�@�2�����}��*e�>�����[��e�LT��������]L���4�m�!Y�43@�Ru��AW����t����<it�Go��U�.��C�L��rW_Yu�'|yB���_��i�5�}�[J������@�����
���'|}���LKJ],a����[������\?���n�������3�o��oU�{���'����Q�w�r#lq{[�������o��o��9Y����	�
x�v*��GKnt�o%g�Ty	����@]z��\9�5��F�Vy2������*H���~����%\�yB0w��h���O����6������8#7���q��[���~d{��x����7�,Q���]�
�����8$��]�5rc=_�7ca�(�G��N�@�b�o��u�Ra]+�*�P=j���H��*���S�o�]o%2	[�K7�z��p���/���H����uFS���n���Z�����<7�*�6x<�	Cr��b���{]��6����AWu��49��.�p��s}�����3Do�w]���,��:���t���J;V��B�x���F�s~��G�,+���u?��d{o�I[�=3�����Q�yB��#	�z�)5��|����[K�J���z�{B����XQ�����p�����%�v���d�����LnY�����#;�X������ �����B����r������G�����0c��*]�h�p�.�*[�]����y�z���G�R��YVl!�
��B�@�d�`��)�&��jE�~'��@�AT��[)����it,��ibF�h8r�y��9���h*�|�2�!l��Y��`����4�=�ku2A��Fs��E?�v9��=�f,��*�uG�V��H9;w~����*��YW�!��<YU\����F���%Xi�3��7�|b���.��bg\������&���8����qp%/�}��J�����0��o%�[]:*���jm������|i���kI
;��%�ZZ��&���CTD���*���:T���C�Y&�;\���_�S���`��|�{q�c������R����jk��8x�iG)�-�;�.�F��v}/
�
Zn��I�&h9;�;��m��N�u6�A�����i���0����tx"sv�,`�|�H�q9��*-;H�k�3���e��Z�^����l����
S�-f����m��9a�g����M���C�0MVgb0�K	��e�(�AL}��%#�T��=����{���Fc�veC�y
��ly
��_����o�hl��
��������	��}i�6X$.��kwC���f��N��kW��p�
^����^�N�����j3'�3���3�L�fT�}���{�>�]�q�9n�~������I�z��sh�$�`��D���j;��E����M�[	H��W������1�@�A�?���+/�hO��?P���a�/t1h7�����a���
�rc���dT�!@,;�"Z};��`�N&hu~�@�.�<!F����Ltd��t�L�Q~�Q���%�����r$�o����>��6�M�����I:+��'���[dl��>W�8�,���Ivx�{,t{o�$����k�3+���������F���4z�q�����3��8
TV}�8���m�����]%���f�cv�#��-P��X�=�j�oV�D~��1�����v���Y��F����bD9/��YzwDRYj��4�w�$F����U��yB!%=YW�v�\�d������m.�)��^"�����'��rI��6�f�|���Z�Z����*;�������l���Im*��������U��U���6V��U�����D�,�������l���S��>�Y���q���}n�*����O���X�*���U���k���	�/�RKaW)�4���-�Ur ?���[H�aH�F[�R�U����;$�Z]�~Yw~�!��A@�����yY�x
�id�
��J���*����kt�U
��(Ak����;�(�iXW�2QU����A��=�f}P�^��sc��s�!=�]�7O���La�J
-;?���
���C���La����������*�����}1�EZe��X�*��M���R'��?r�7Ca�(-f��,�9�{W�$Y�<�'�(�'`����
t���{�h1?*���uAG����(��r�)m�V�=`���u6��)Y�YV�x��]rb7Cq��l?X����M�����;h]~���b��XWf���H������:���d�*���������4?`������
�L4"y�^����Bi1�[��-}2�^*��Lg�������c���u��3��>�@���4���^W��]m�ZQ�F��xI��~�l�k5=�8?�2�e��a�F�z������AO�q��`/���m�x�6��@p��_����ly���2�.�V�c6��� ����X��`���L�C^%��:ck���$����?�������o��M���M���%�����l�������J���
�o���r>:TwUr-�����&��*c��;a-*��:�9�.�2����q�d��y��U(�>*e6��� '���S������s�y\n]�	;�%�uS��+'��W��u6D������GWU���p�*�^���h��=u��'��UZ��=����}T��d��"Pu�8�m,��o�fi����^�`��8P��"�{���n��4wa�sV��7�owV��W�a�Cth���z���?��WV����,+��J����^+���m.��H��;���\�����\�.� B�8F���bU-{3��/f}������t�tO8�n'���v���X*���P���7��}�N�����S�o�^ls��@�K���+0h�mAl�Q.�2���\��Q"�������:��������r;Z�-c�k�\V��P�uy�(��A_�����e��ke�R�������"_����`��<hu���t�	��d����c
[^
������P�}�����3���e�:Y��	�?+�o���X.\��0h�p*�t^t�B���RZQs�.a-���������B����A�����dn,�M��y�N�P�E�e1T6����gR~(�(�6������P�=p����(������@�l"��8`T�i�o���J�(A��T�m��(Q"����u?��eg�����	��G���:ao����3�+��~�H�<�f@�W&�+S���P�ZDg6O�����6caZ(�5X��	��d�t}��?_��f,�j�I�\���Q�:���.�+�h�6�7�:�6P���8H3E��u��]eB��{m"g��������
�}]J�^�2c�-TG��o��Z�S����m7���'� �8�A�Q��R�&�������h��Z�$��[���g���� \�b�ed(��N��v�����%f���u�S��e!"?����8}\*
�sRN}T������yBLwY
�;����{����yBLW��I�o
��<@�F�����r/X��]����!�����pq�EL�d]1K�����+�xuO��Q���3������:jQ��r�C^��]����.�����X���6�����
^A������NaK��DA0�(�;X$�t��9h>9��RZ�E���J���*c�Z��7k3��X���L�koU�)���T��E%���*���o
+���Eq?C?�@)��������@�2�A]m��p>
^P)-�z[���V��C�?���u/R�EU	N�mQ��*��U�f��n�fq��T��R�5g9���i����o^Y8-�v���hQ1<�|zgA���,T���O�J�t�.&<��o��(g�����^tf�D������u����+��;��uz:�=�ZU-�z��"��jVi�-��fq0SU��d�m��`��:J��4�xso�8\L�>�;�Y�~\L��%2�E���^J1�����F�iT�A�j@�0�n������Q��$	��Ja��E9�aW�I������\�@�����
��*2`]�CP���J6���D����k]�`��
�@�GG^���z[��{0f�
�����I:##�U�a���B*C�8O��y��2�g�j�3����7���
��
�����2���cHI�NVI ���m��JW���A�Y,���n]o�?��9xB�(w�F~����w��F}���]r7��1�b:;�	#y�1G}��dXk	�vn�)�����[Ai��tk����O����Fodg��D������+B��Z���nQ�?�����Y�j}a]�j��]���+�<���4dzW���H�:5P�;��U�0�������+f����,��9ci���%d�����}
J�*Q����K	�c��c��]j�6��U����>]�]���UmZ�-1��/c)H7���`��}z�����y�QQ�G��,��g^H����aD�]k1�U�6�J�.���Y��e,�P�f����A��/x6Cr��t����p���(7�%	�u�]��7���q��`��>h�W}�:%h��ls�{d���14����u_m%�����	a�Q�U�,+���n�����_��T�OxIU�,�T�q?D�MK'zp,!g\�2�p����rAE��rc�U�i3�sB[���&S!XOx���Yy��G��
�[��w�.\���dU�0�k�7Q���h���
�4..o�Q��^5��*���w����X�2�?X%��~��Ic��8Wi�7��}�\��v��	t�����n�yBy�������	t}��h��\�Y~},���/U�<�D:6���P������l�H'�:2L�%v�����3�p�
�������5_���e��Rb��2B��nm��?����{Y�Q..x�t
1�����N`T��e�U�v�K��A��T4vY-���(P�h����yB,MQ�B��[=�XC
���w���%v9e���u�������	!�w�>�z�[Mc������f���-�!���t�@e�|���� �|s��%�8�F�h�������+���S@H� ?!��~���$�e94��($����{�TP�]*��RvV� B�_VlWN	�`��D/��.��!��*�����6!����a�UA�J�@�A	�����`v_R��� G^s� �\�]������/�q�A�N���/j�J�����4���n	����}P��tQ�����$�%������"�\�)�������-���B�����a]�*��	4*��}�}���oV���2�a2��~.J6v�t�@�%Os3M��/�����z�����E�J�@��(����_Bk������J�6T��K`���t]F���c�yB�>��=����v~$��]h�Z�$��<LX����}�f]����6�����X�i������U��<��Xq���2�[�j��bGm���	����M���!*�U���>K��f��Xn�C�%��]�'�*��.V�f��Xf�u����jz������pU��=X��P�$�u�`���i����4�7�[���~��+��D��2-X�o2Q���v�<�p�eX�u����U��u�m��E�������2A������$�|�P�fY93�W����c������Z������y������C���3��8���+��2���|E(����2���{�D�e>�J }n+��V�����`(�
��[U���tt@��Uy�@�r��{Y��u�r���
�r��V�=����fq�fTBlW�9��s�SO��#����D[��*�;��l�4���kUb,����A��*q"X�*��@/w� ���5$aLt]�
]��v��})L�LKHE�`k���"�Z���-�448����*�6O�e�R`�����5�!7�kK�@��~AUe	h^��>��A����*��U}k3MjU��TI�p��@]��*��Y���P{u��\��]~}���Aa`E������b�mD�����uu_����*)o>����������YR�7ca(1�v=A����e��*�A��;�;*����Y�Q�
�aU/ZU������������:���O�����}9�7��%�
3J�n�Gw\�y���L������tR������}X�E�	��H����&��v�v��B�����8k]��X�Q"7���x�6���<	����4���VT��|E�:�YW��cXw��b���m�����zM:W7����
�/�=����S������C�U��a1*]�����c����bt� �Y�/2�����P���7����H��j����of���r��������2�FUY�\�������_[U�tK }�L�@�=��T���e��t�/z���hS�������o�^�"��T`w�E X��������,���J��'���`���TTs�;Q��8���n�z�3�*C��0��l��8��GqW
�^.�3P�qb���Q�����esC!r���99p���[U�%�s��E4W�"��z��V��!5��RQ���&
��w��H��l��R?zC�D�*S~�'�YM%U{�A\Q�u��`�s5�J�Q��t�����FWY���r�*��:us�NS��+�������"�V]9�dq�`k_5<�;�BpO3>(�B�����<#���,���Iq����JV
�rn�wyV�^�C��L��B�@]������Vw���jT�^n���WO��rT��}�~�~�'�T���	9�-5�N]9=�K/bT���A���0,�2�WuzM�M�mH��U
9�6U�<�rG�,+&����m�r�M����.��'�$Q2���s#�oT:�J_����3mg3Ml%W
�&Z�=���y��u�4@]�u����C#Uf�����a�9�2�[U���I��Z��9|V/�J�T�x �R�����a�5-7������|��of�����������G������������80�Pf]ssscE>���G���O�|���M�A�����4��\��x������? ��s�++��WuA�|?��2k�/Z�C\�Tf���e�H�������(���of��ua�d
���Ta��E���U��TD4RW��X��\��F�������yBl!��+��|��H�������U�YL0w|�����@]92������l��^:�M�Q8�Yv�7��C�t)���I��0a�vB��y���8PWd�s����kU����?��E�}R!PX�Jav�L�����Y6�Y��V�u����|C����;���o3��X�B�U��%l3��I����J�	��M���k��f��X���s$����Wmj#�UHWt�LA��m���6���}T��V�hQ�����
%Y��u��=��P�m�#�rH'&	�����!O4�X���m*��N"�`���}��viE�9����lsm�]��Aoe���-��6�J�u-A�rTL���6p���/��]�Md���*hQ����r���+v�
J�s-���G��
����`��G
EW�<��!����YbV�/�������t�8�f���m*"{9{4���s�����(�6��!���1AU�=d��.6dY�rG���!��#a���4`�*��*i�V�9���=��|���Xy4_����]��rc��B����*@0GUe��F4�`�u��b�n�����8um����B���M�uB��J�
Q��D]aU(0Q�����7O:/Y��T�k�*��}�1��lS���;���U�R���]<?_5v�e��p^54h��A���@�|��!��HscYP_!������I��W����5����:i@�K)��6�\�9y[1���lw����\���S����fnsVb���V�����8�������k���M~�:�^��i��K��fm�o�y����	���.���%j�k�Qn��];�0��[
���B��j����(��=#Rc{�:��X
�Z'��jX�����.��m���+�o�����<�;<�T[Y�]%G�:�P����|V��.�%td]�zX�'z0F����.�����:�u��B���bP��5�t�l��J�u���VP;�f��
���f,N[%�
� @]=���g��N�{q:mJ�v}7��9 ���	��tY���3'��UGQ���Q����U�"7�O-yQ������07V�$.��A����gS����x+��{I�����m��B��N������j�V�s�����x��Qr��B�M����/��@��g�,��W�]3y���]���$O!��\��sv�f������l����?��(	v��F��{q0�����;��9���"�
�aO�S�`��-����tF_����p�?�����m��@�$�4z����'�
V����\U������yBF��+_��v�4��y����ls5���A�6����]�\��d�Ca��PQ�cQ	���y�"�:YPP'�?G]���b�Kh���
�|��:�F��>�@o�qT�6L����]����bV8?I����unH�v�-O��M���^�rB/7����\�\�3����d3'�����$��k�B��kSz�����������`e~t��e!z���Q�Bh=HEZ��H��.)��1@K^��!���w;����>;��_��5����{�8�]�m�_0R����~]��6���uw�q}�a7cq���>���F �]Huo�T9U��D�����9�;��R���lw��@���s�F�\��g��L
N%8
�u�����6�;��
D��bF���c.w�8�� �~VR�lhs����1s�y;|���.�4P�3�_���Ql&D8]_X��
T�\�zc6O�1�<aog�����w]���z�!�
l��M���N`	�v�Z�K�~���.U
�P�~mZ���	�h\U
J���hw��o���zP���gs�*���(H6W�����}��v3K�(%
+5fr�	���L8�E�M	N��@�S�k�r3K�(���L�F�3����wv�Z5Y�u��sTU�:���O�����#7���(�����f,���%��nz�O>J��*�J�t�j���^��S�18�����r��������*'dQPe�C��U�T��aUv1�UV��	���H�,�h�v���r"���p�SF6}��(�������-��rc�LL�YE���zY�C��}�_j��]��"��U��E�E����>�RE�}T�����ncd�Jt������������'�L��$1��Y���vu�UyDs�y�cGG���Y7��-M9*���v �-K*�f������`oUS�T�����r���$���Qn��j�A�^���jW������]�-��������G�����sp0��R*���'
����:J�.S�E$A/��1GU�1�[e_��|�tG�������sXc��i���@K��mG��;^��u��y�����(7T��!��'3�|��&�����}u���9��U`W7EuZ�U�����u�\����GUz�������*��s"zbj���U2
�-�����G�#�~�
�;��������h���t$]��Ko�=���oc����.�|JuG����?XU:
�dX �v�D�9�EWW[�o�D���56}�)lYV�\���m���R��kG�<�:�gJo}U~<���|��o*s
�� �aUV�/z��b2��C�;���N�FW�/��������2aet�A�#1D �;C1X{�Q�������O���l���^�@];
��N�B)r�F���,$]]0� ���
F�~�%nN8�F��;�D���3i��yI���jW��}���i��b���jwv�d��UmEhYJ�6O�q�l�`]��9��
�oi�b���aVD/D����U���u��@����]T�?�.)M�e��q��d��h�v��
+c�h����Q�so��������Qu��+q�.[��=�[F���bQ����E�u�)@����`�(E������6��RZ��U�V�:9w���r�]�|�����.m=X�k2��`m���U�s�0��=e��B��v�yWj���Hn��x��%z�s4��EV`�������������gW���N.�i��>KB��	�T�#���0�g�tz����J9����=x�8k��'��_�)�w(:����t�_W��
{��T�I�����
$G��#������J0Q+uWu&�+7��a�2��-K6�f,�
�v6z#�G���H�<!F�� "�"�p�<vA�Y���Q���fY��\c�5_���f]
��X�.
�l�3�U�#�^[)
���z�g9����Y��^�N"���`�(�S��%[Z]8,���FG`�5���Q�u��@eJ8���/���>vm5�F�v��q�������XDR�WH�]�J�N����(�>�6���m&�������#����3j~i0��/8d�Q�������y@�%}����@��l*��A�k��n��\�����%��D�P��n�v� ��.(2>��7O�	���}-�����v%	[�c.PW�ds����z��2aG�w�:�������]�~��5����K�v�����G�;��	L���3�|���rw	���o�f,�6y��/��4�.Iu^h6/��3��B�=o�W��4�V.m�����QQ^�0�e���u��]�%���V�O9���%oC#J�������\�K
Z,D~�N3����k�yd�u.������@���uP �Row�`�{�_?�*��F����
v�� "����J��@�W�*��F�q��^��]MV�R��%,�G=�9@��;�����>+�r���4��������;\L������&Ec���_c�Q�|�N�dLi��G�6z�.*��H��u1���`�M��I�	�z��D�@Dy��mX'�ZU�q�X%��^*Q�y��@y(e
�[m�����e'�
[���@�y(�f��2�@W�����u�G�)�U�$7V4�R��D�KF�*����+9�3v}���Q}T��DU:%������{��<���k��b���$��%��Y���qg0�D�}��KP�y�����8��(F�i\?V�t57��bT������4�(0��<��	I��6k���g}������P���E�����?	��~��~�P~)�K��A���4�@�����T>�v�Km����B���r�����ibH���1e����,��]���h�^����bH�;����@���|��e�{,������]}�i�u���Eo���N`]m������������?�YW%$[���jw�U>P=f;���*}���}������=���g0r������z�����^����)o;J%'���
�T���"'���H�N~$�]�o����@G���@M|(�!��L��ka�Nj�vWF�'�������W�F��Rt������Tr����W;���y�PE�{���1������
V�����4�o �=�;1qg� &��n�zw�vu���'���M��vv����:!��n�z/����b���)'�����VJ����*���d���J����<��]�3���z�[n����h t=��,��L��"�g�f�m�)���"z�C����;�\t7�������l{Q����9����pG[��m���;'��	K�m��A)��._�����G*���Y���]�5Tm.�h9���Ri�]�J������+��F�R�\��U��+&��s����Z�n��Q]2
j����fq0r�Z�d]6�Wku�+~'l��<z����J��i�����B��%�72�C�8��������	��t���!�X�>��|�<�
�@���.j�����:����D�~�2qX����KD�����Q5�jTo������/�(�8Q��J�	������0*�N_q������s�T
&��{���(�S�l^�)����p.�>��0g�M2Y�b��Q�K���o6��=�d�a�A�2�������/�u�G��"�:p���*���+���^��.�#��o
?���J6��9P��9}h���kw�<��%�5_��sp!D�\���uisX����2a�o#��p���r����U5�,)d�'��w6v��W[SC���4U�e2���@�]z���\�c#�_�Z��y`y���\��G�;�f,�
�u�^5P���)q���.D�t[1�K��	?��|�����S+�-nT�qz��\����u�sQ�N\O���^�0B���&qz���ds��.����$~^2i �?�$>����>nCF��F�:�����A(!~���h�;;5}�oD����Nyo���On��u��������a���i����8�p5�J��@��3��r�yX������
��pf��Y	�����I�|������JO��D)��]%<*�.��#�^��C���eE�_Z��E���Z�����@����@���e��A�2�����r���o�����&n�a1��h���@�����TbL�x������RP��hq��.�sP��_V�7�HY�M��B��_����s	�S?ob"�scE��@�	������Su���mw������T����0��7����D�a�Kt�I����*��F��_���n0/)�������Q��g�I���{����p�����$gt�n�����@Wg�f���clu��>�Z�CI��>�����~CR����o.-�Q�%��6���]��itm~�yB��F�W�zQ#U�,���+6c]�evw��
OAW��4�n��'�b�|0����A�|B"8�u^�9����Y��uu�$�>_��]-lUj����Xu:���|��`]+���
�:�AW}�4��K�<a�	�����"
��aAWz]Ke7�C0EE�`]����V{�w���������X�p�tEJ�������_E^��_������vqyl��I�r�`���X�CGZ�����d�wj9�d��.�S��8���3����E�U�dX�E2Q�D;g��=XN>g� }`�����d�w
2�O��]?1��"�����V���{`� ���5�V�8��U��9_wMb�������=��/�i�z
�:�:�4���r��G�(^�*�;Y�U����)F~F{�u�$������ib ��W��R@@/U�6g���(2�n�B�X9�A����4�hTXvU�������r�����`U<G�k���t�\������4�:����6z�~�^�d�M�6�
������O�k"�f]��TYlU^PW�z���=��8~U��d���q����3�b���4.,���ud�E	���A���b�o�CJ�*�������3v����c�4oJ�v��m���R@��#�]�-gy��.��b��;������?�;+��s�Y6]B������6���tO��-i������R����"{���
��v��&�B�vKR�n�a0W�Ut����})���FR��H��X���t��FmBQ]���9���>�$��]
,�2z������t����'���ZS�.�������8�~@��4tY���/���Q����eAMx��*��������/)�.T�&�,I���?<��8V��#�(A��bY���]X��,��	��')�&f$��;��(�X(����zo�J�u1OI�~�a��JVT����d9�&<��Z�U���)����exT�(�gz/��$������������U��U�K2���e�}�,�>�^���Lt�brl���e�9gY������5+m�Dv�dZ�=�,�f�vivR���u��RC'����P��(9��}rXoH�P��_]9�}���r�l�zs�)�.xB}����p���	�.��+��/xN�vI�v���_�������������z��{ICw17�+�;t2�$����
�0[E���Z/i
��b�&�tK���J08�����y��_B��(�-	H���E{%��I�&����aa�dZ3o��>�A��t
�[��a�:�X�4��.��ZevA���L��^�^�p7VS�
�J��-���\?��V������z��p|Fb�������f|j]HDTleAs
�N-���C����������\H�C����&^5�}�P	v�tP������\,��,:����a�:6Y|B,|_�����b�	'�^�H
Tle����o)��{��%Q���T�m��!�K�U����0F�Q{���3"�����o�B��r[��Q���C�������}�5:��:.�\.�r)Z(�����4eH!�L�L���n"�i�.a!
�,��d��@3�
��owc�]�J�f�����r.U��7�*X���2�
Ikn.����b��X�+4S�"�����m��=P������W�%��;���Vw,�/�'�V�]��,�{��%)P������BY�-O�	�IE�^�rIEt���%����_R�F��FE�S��k�dDY#���\��UU
�����BJ�bY[9���D�Yq��n�f���z�t��B��@+��,����	�Y�\Xz��y������D�6Kh	�e��,�/�����a�w0��P��+t��Wd\��&mX�;�Si]Ri]�������@�<�q3�C:�q�yeI�u���3%�������������Gw���KV�?�ZO*���	~��r������x�������,���7krK��{��i����x�#u�}���a��������W����"w��G�NS��*\���~�.jt���������30zZ���7�5�p����NS�*�6����=��4�����G�GGI�u;���
�f	��$U������<�c���G�����.�������/y���"�����O����'�S�:����M@�������c�1"1\�D�K���D6
�P��.t�"�?���u�lO�$��3~,	���r- ��u"���k���D����c��$~����4��fR!���f�����J$rt#���!?voxzx����H���B$�~�{-=��9�����i���9G$Y���{��C��{��1}�m����N���"��I.����`�����$�
og�����Px
�������v^|����$iI��������#1��*m,�FH�6�Q(>`IT�G�����F�8?����4f���iymP�x��~����p�;QP����������T��^�`sZ/AW�m��k�\m���]Hy��c��Y`�;�� =��-:-�M ��V|;��_5,����ly�������q�>F�)�������9<��Ex�[�~�����=��A�gI����Z
<[����|.}{���.�
��"������`I���-$��?�����n������J����bV[m���0&3�l6��:���������Dgt#e���L�!���n����h��X����N����=����;}��x"�?vON?=�- "<��+����������oN�iS����� �m�`���:=�M�]�����|�I�=���i8s0.���}�����]�l��c�x�~��.����=��]�}�6Kd����:���� ���Dm���N���j�gU��1}����h[�3��v{e���L��.�yZ^�"0���+�����b�Z�z�k9�l��l�.��iv�����}������R%%�?5f�o\�����q���=-�- g��,<z%�z]��m/R���i1��US���6�
��*�A&��hXL���l�A�KB��F���r����p�����y+�R��X�}d�&>���"�J�`��4Z������u?���v�<-�mT����?<f��Td�K[��*��[�k��l���h�VcIMf�Y������7����>���;!��I{�Z�)[���,h�����<��zm(B��U�(8���A�����d���*�2?{_��/�i��d�q��6��]t&Lh!��A�+M �k�dDs���Aw��'	������->�HI&;��%�g�����>-��6�F��2����G�����X>�����Fr�?��5KW���s&r7l@��hx9���}����6(������g�v��a�1P����Io��S�|��6��-��F�����IG�K�n#��	h+
[�%�< �-j��0�-���j��X�i��c�	9�"���)����3}��J�I[-����q�u��lN����_���)���Qf��u��^�m����|�;m����N6E���4�3���I@?�h'

��~���/���3RW�f�9�<2��H��Z�VN���&Q+���h:�XZj0U����M#0m?��Q�[6
��@����	v��O3�=�~AOX�l�[�0�]M���/�10�&��s�=�+-�������CK]$����D����a�D���M�4U�"�(]��$��H]���-[@�Dz��G�P:@���}'Pf�l��dq��B�\�/�TX�]�l�Q���^���}Le.��+�D\wy	������eI��:h���
�T������e�
Hv8���X:�a�������ejO}<Q�3����<�}Xn�����?�}X>��F��XhU�e�1b��|<-Q�!CD4�)�E��~l�_W�����
���DC�Gf��b;K��70�7�W�^^�&D~�������Q��Ffn2��} �$��+���o�
��
��}W�Q�����;_��Dp�'��{���P#�lB����0�����L�D'���}zLP�=+�&h+?��=������������R���Dx�~��
�G�`��)��"������
��&rx���`��e�m��VlO�[<�}���h���^�,�&�nY���|��=\��1��0lge�fY�����f�W������.:b|��u|��y,u��;x���T�-���2��j���$�1��OiS�A3N��9��N�K�)'f�:���?z�
]��K�g��|,	�0Ih�������?�W~X�Ut����F��2LD��$��u��������0����M����C�U�������{~������fu%b��>M�'3S
����4�OW�=YxV,�?}�l�����x,��0�^���~�g<
��<P�u+I8-�v����.|�����K�{��$lC+�>L�W4K(0��XD�a	4��p��	��4����T�.�<�J�.<�}XJ�h�v����j^,�n,�V���gK�1�
[��������o�3�����#���>����=�SM9���\��|Dw��cAME�	[����A���&iB�kJ^�m����6�Gn�4a�&h�v2P�5�l��J��T�E�G���N���W'J>�a<���E�z&�I>�9��3.���+>��?0X�c�_�������5��	-zA�y�=!��XO��}�'�Qxt���g�D��J�+#]������f�.V�(��	�	���"�<���2����J�z�0�1�L��c��]D�r����q��)���Fe����h�-��4U|00%�t%E�
���	���r�����p
w��27]KB�m�/�S-��f��]��r8u��;@��5���������f���:�"7��E��52|������1my����a?��#���=�?��NKd��4�n0�'Ai� ��s�n�������M�����`i$X��	m����{��r�����*�g{�����_z���0k;?0����O��s���,
v��0	'T.���+<W0��UO{���-�%�����D�E���T��K����c�n�>�����x�-�����3y���'A�"�v���gw�=1.}���$[t����W�-��1����c�az?�p0{g��q��'~`&g&vo�{Z]�1�(
�V�V�����vb��^���Z���h�0�H��"�i�l=�,��Z[����?M�J�M<o��lM�:�G�J��gt�KSZ|��~Z��2�c=���d��6��Bq�,��2q�����l�B���,�i������l�vzL��086����	������H�V�KC����j1k��C����XT��������{v��g���u�M��},��0!l�����0*+nx_��C����	agr�,f
{���p��u&�������/O�-������hA�d1kz����f�1��qa?PZJ4�KD�ID:�n������z�JC7o���z\��*6�������hx���6L��6��;��7��2/�
(�;%nX�l�f��-���>���kk��fpJ1^��f�
,7N��$�
����a�`4�����Mi�����`�����$�n�!��8to[���{l����p�����)d�f����&���Q�����1mi2�p��z�����o�]�V*��z���%+�Er�e^Z[�t	k��x�������z�
����E,|���E��7�#�Xd���+��.��������I�.,�\,l��Y'd(�e�{w~����X6�0�@4'�L�{:���*O9�W�r^��4;K��[p�4��������=;�m�X���-��)�*/,"+�1�Il��q��wa�S����,�/��!��!��)��l1��T,7�����������{����>��H�E��	�[_]�������j�o�5��i�o&�-�3G��D�U�twa�	��^�=��>��j�����N�7�~����,��.LC[���:
�c�����[��{��4UV��.�M���JxFIT�Up�������Y��ua����|�7~�:�gXU�0Ui��9R������N�V�.��4���8�,G]�wQ�b��B�=�2���=n��sB��X��o:���.}��;zQ�\��p'&�s���E��f����0�!z����ky�:���':���N�����2`D7��-vm��i�>��F��~�3C}n�
���g��f���K;&�,��[@U&%F+4�4l��e5j��_�8 �����H�,��.,Jt��t��ra!4�����r���X���mN4tvT�V��������,f����Z=3����K����������K�2
�v�f�����q��'��.�|�
�L�����q3;����:����)�����:f2bbkB|�X����Q������W(���f:��$����S�|T��0J�m&:,J��M�M���.�-8��Isv;rO�i#��C���H����4U�n��.++�_i�&�/�ex��
R	~�]�u_5[������DS�V��_w�m�3L\�bq��Z�tp�W���%:g-�oCA��R��C�4U�"LL�d�b3Z����{M��p�i�Ff{t/_�Z���=�Q����;�����������z��]����nM��4mE7��(�_<�*`���)O9��c	��*�E��p���ba�G�esY������������1��pEo���h>�������`��a	v8<��eaM�h�bM����uB.�X�0yX��,_K���#�)p���K���|��&f3��e�*�������9T���if�������,�������"�K�;
g;�i���/,l���5|�"��J�����k������^\��������zzH�"t�������$&���sb�l=19�	��bE[��!�45���f�J����G�
�&��?�cJ��7��nI��$mEx������j�e<R���FN|�V�-L�44D��;�,��0�P��l3�Z]�?�AB�k�b��<�\��Z�o�e�Rxp����s�����=�������N@K��_ �Q)	vW�8M�&,�w�4����wxJ��&!���TN��t��	�xb���G������>�a���&;*g�Y���,L�S���S$�1�Wn��1}B��d8��)Xhm:bE���F���P����<���(�$0|������&Xj:S�a�O��K4����$��g�J	Z�;�F���<�O��C���]��1���������$�LB��4�
�����e����Y��R�>=�m'Q�.%�	�'ga����b-�#���i�����AiZBC:�p��I	��&-z];
g�
fF�`���0�#��04��^��Tbw���]pOKd
�������9s��&=��K	�[��Diin���������~�},�,_��P����E���3����#n	�UC_@����J��4+�]�Y,���Y����6��D�����7�jN��-z�D ��MW�x����%1�2��������e-+��V�Zf~����)z0����6-�,N+���?nfq_/.�DD��xk��deU���������j��w��=/�&|��b���-�f�xb_� v%B��B��	5���%�������f]���%+�[��=
���	D�N}�y���\4<�,`"v%����%+S��&����%+����WY�#���ZtzLs��-z���X�����| >\Y@�^3q�$����r�5L�����{���hfR��;���,�Fl���ZI��[��];�4�O9c�&����P)E���������[����>]Y}�h�DD���V���E,AYl��`_x������{Z^����4�o4��`g�?�:�'mkqV�+����]��4U�TiNhc�v�#��R-�����n������fj������:�z�����W�iV�������
�B��� �i�lO�SD��,EL,��Ty�o$X&�'4#�Y��YY9�hXg%vA+1Xz�;X"����EQ�[Z���b��b3� ����	��n0nT���"�{���p/��(�A�4�7QNV->
{��~Y���F�/Uz����C��g��
/�Ag�YW+�V�9��t}9�,�hU%��'�U-\Z�i-�RV�.v�MZ�����������m'�fj~�E@+�&
U9��D�tm6d�p�zd��v��?��<K��������
_��d���`��<�=%���6���t*ti���dKEO��)�B���eU�b�=��D6�` :h� ��W]�i��bX��i��������j�'�
����%���,&D�eY�bw���Z��B3&hV�'��t��t=p&�b��]=�r������dZ��l���K��dY�����V��������Z�L���a+��
���B5�	3����<���,sZ\����Kt��`�����i���\o��Z�F��]k��[��i���`lA4t)[����TmxAk�����+�33.|�f�
9-�
>�{�H+\��U)}�R�8�YW�������������W�2�I�6q�$m���DG�jI�
��Ag��Vh�0%<h�i�����#=�g�Nje:��i�[�P}G��������m��P+�B�����}�
l���Y������g�V�l*�j���E��ba�u�=s
��j�����3��Cp�����>K��}V�p�������h��A/�
/�E�����Z""��
�x�L0�
�{Y��pJ���f@���%Z+����i��,�L�T���H������1�2t|�����%�lRh��z���������a��>Ti��=	(����`[�z����	���{W���,&.���?o����9��RK8
g����h�s_��l�����	�Xh�J��������i�l�0��{+��p6D�y��h)���jC��A�")��&���ee+�HV:6�
K���v���������tO�,�,4��&W��R�M����X����`3��maSM�T��#'��V�������Mj��f,��K
7s���--���,��H
7��:���n8��Br�{�i��
`a��V�J���������J�n/]9&���J+G�Ub�V>�V�rZ\�OL��44,�}�X��=�������p� e6�10�{u��Zg�'�w��jY����#���v���`�0���e+��I�5���Bk����*4X�� 
cH��n@ae�V��LVtOT�4K�6�2�;��e��P(�����f�iu�.2�L������_&�Y�����rj���%����Mlg��Y�|d6�	�,+����h��a���f��Q���~Z��%B��h�9/���[�&�g��{�V1��b�^[XpTl&6�,��Wn_���f��fYlTlK�������J�b�?��]��5�3���c�_s��Hba�C��O������T�.Qx�����>�{f��M�<4%7&v�,��6�`S����_��Z���8-�mk�\4
��h����fqg��k�vn���eg�}�c@�_�\Xv��M4�j�n�
R�H�;6���������-��4U�^LI����`��������1m?�|X����<2=��M����X�����l��+F�,4a�>e�O���q�Wk��6�J��tw����������1
{�����5��$M�=�o��Y��[6]�����ciwC���X,�Y�	��f���4�E�D��f���R�DO�� ��p�k���������-\�����*4N�i��S�<Hp+��e�����4�E��v�4j,,�����i�ly�l~����=�BW���Y����������"��H����w�M>�X!��7��*��y�m�NS��������YT�\��f�q�7Ot*�c���9\��
|�WMb������
�E��?��l���LmO0!l��,�Ck�����"��[�r��_K�]��
��2�>j�W���4���}��3��5��@]�����
�T���6R7&H-��mpkn���E�g;�!7�����M���E�;��H,��x�������������~���-_� ���:-�-/�9,����F��A�V{�3��Y1�1�p�{���p����)������2������B�����J��}`���1�-�����7�U�#�����X��8�����pZ^[|�-��)��'�qj��/�����4���i��V9��;`������3���R�
F��g�u�L1
zlg�i8O�fBz��6
v1�<�n�7!s����`���?��1��4 �7c&X	�1%l�n]r��CS�����L��l�wn��F?����G�q�9����'f"mf3)��+�����i��:��NS��	��]��pO�jTf�6��e4M�vl���Tm|�������{���M�
�`3�t���4��d�����m�q��q��+��������t����W=���>����
w���5�K}4.�gK�fs��6���V.�+�r&|�Zo0��6�aT�~��fj
:k�����.h@�7�9=�
h��2F2�jc���������L�7.�5�����V���,=a�F�w�`iGb�����M��hZ�;�^�F{p�a{��8�	��:�t��V:~�B�"��yz����:�����Uz���	SJ���9�w��UZ4�iM^�Jo�D��&�`3�E�C)K��~!]@����z�����6c`����bi.����(zb����^��j������3a`��(��$��0�,xN=��a����aJv��������Z����`}�����~J��Q�`i�����b]�%;�+K��W�-
v����+
z@�\���������,��������	��f��f�/�)dv��A��
�8�TA���`']�`��!���Un��m]���`SY��o�H�r��-X��Gl�����&�������K�|0g,����i��p�&u�0�l�����?�y�7yZ"����4t�
���X�Bz`>��:���c����?]���d��)��D���4�S�x
��0�,�8k���;���cx��[A&���
Tf
��H��������U�$DO�kSj]�������l�w[s��o�A�5��l�A�I��\�������ys����f����>;����Tm��T��;���aA����}�A���b+�a�_A�{_s������p����K����T�a�d�~��{t��@43���@�P�w�E���-����������i���{�tu����]�������0�������i��S��F����^!��m�b������M�t��
��<2S	��_�sNm��KE�9[�
�Y�[k���iw���)�����"4�[���!�~�����<2�y���Ew���&z��uny8��*�W&
X���T-������	�;	�3��/�Q�e)1?��q����{vk�c4��[B�3��h�W*���e1��6�`���iym�1,��k��������9�M�A����6v����7�����b�D�Q��l�������������V���m����~������UP�����g�^�ab�X��%t���J���A��3cX��E]��#!���Y��|�?�h0K�y�RC���|�{X���6	�UX������u�N�is��4EOx�>����l�#sF[C�3
}�����;4�D�4i�5���h�P�L{:
�����fzLB�]�4Q��B���q�J�:�������	�^�a�����������^������A����|P1�t���\��81�s�YM���h~�-V�E'4��5�;�v=�������a�����3U����������b����SrzL�;��x.J4<!��-�
�<ES��D��'��5���d,F�ww�c(zo�|��[��i�>���:�
�W��S��$�������+�]�T52|tM8i�g�����w�`����eJzf�b�������sU��b���a��}���[����)C#H:���:����tkRg>/2��P��;���
>*QX��Yx]�je�&���L�P���,���)����M���9�iY�C'���Z����������5.|y�}7��i�lP�\��+�������%������h��/bY"����w�����	=����ZK�N��ukw��#ze�n���������H6_����t�Z���Z��i���	�9�K�[���")�%��Z�3}X�[��i4��0W?h��P,u�j��b�n���s�Z��w���aY����^y��T%������{zLo�0g�UG�k*�.Q��#!]��,���\7����S��Bw��e�����Z����d��>���A,�OK���0��J�"�����F�+�?|"T��jy���aEg4w��V;+}]��4��	��A��!��nI���I��+5��^0,�E"�����5Y	cUZ�	*z�D���kX�Nl�ok1�O���&{��l;�3B���|���|=�Sr��6�5.�d��9�L��J��1-���G3L���(���XO(�tk�v��j����`����]*1n�'Q�~h�E���)"
PD��'��	��l=��ym=�����p�"D6A���:������>l&�o9MZ�#^����pG{|��3���	�o?eO`�B+Z����HE�v$�V��4,��S�N��|��$�39�y��CL3����	l�����i(/���@��Z�����j�Q �-�� X��-f��2F�u�2���|M��p�":�5�L����~����/QT�m���Tm��4������lO@�%�
=�K�~|XX��T���'�J�Kv����~�`�W
v����%����9�L��2������dg����/#C�������);�����g�/��{���|=q&�jYK���f��������;����c3}<S�;�~Y���=�4�����Mt�^�Z��e��i�h,v��9M�y���
[�����kQ�����f�'�:�������h�i������&u vnRF�����k
S�=2����R5N�����}mv{;�gSleW`���~�m[����V���,���������b�>�mL�K���Z^��LVO���}�g3}��r��Ku�2,�9=,}�"i5���aU����{6N[��.jsZ"�@t�a%������f���)��DWxh���<M�f�<��X~��]���-7�E�Z�e��0�+���P��&�=[;��7a�[
���!����(�-Q��Z��ez~��~��7������,�K,�`3�����&K����B�gK�J�a���{��4�(0��q+t�+�����S���la�bG���Z�o�����d���.��t���6�X%�h([(v�����s��������/0M���NV�kzY���yZ"},U4����/�AO%�3{�
7��XL\����,��
�5sY*�����D�k��=��r�������������_q����Bt�x(h��Ek��z���5�ba���MA��|�����t��~��	l��|`��z]��w�4S��:V��e��ba���=z�7���Z���=�l�X��(}�y���?%�I��}�L��d�=;���T-#�B�G2�������Y�(v������KS�f.�����
'YM��K��>�dDOi��i��n0$�����	���j�PB���H�=���a�06l*�m!PXq/6�;��ED_h�K��g�����~��g9���@_V~a���0 XX=�7�D��`(,hzV��	���:�/=����b�O�
�/������N�������c��a����Kl&����/E�Z�!�Kt���k1��U����}v��#tpM/����p�3�nA�����p/������b�/�o��ke����|-�	K8E/&�������<a_S����ZxS���Z?�e2�����-_�4U7L�Q�bbS���j�n��tKE7��v��6�{���1}H2�T���l*���4�5h�.l���`+,�yb�|�6
��,����e��&��_��{t%��V}���h���0��a�M���>��m&UL��%5N��(�o�����I�;A'�U^j�����&��M4
��v����O��|u42��������:|S�
Oui��}9�=��p+V�������1�	�;���kP(�`:S�kE�����L�����+6�sc%��K��|Y�so�x9\�?��)����pX�I��R�Y�-������5E���`+=,Ua�7Xz�IA4��b�����~�l��]���m�
�9g��V}a������5S,oI�V]In_�f�������s�br�&l�w��g���
�&��q���7��H�kE����n�_�~��j�V�NE���vZ��������f����=AwU5��h�[���B�gK���kE�]��r��C�M���Fj��H����A�{��p>����hh�.�
0��X�Z���w��3���%_��]��.eJ��,�vf�>f3���t:�������3EN��|�6��
��`�~��D����/���`�c�{�E��%z���2�Kb�t����8
g�IS���b�<���0���u�.���^�K����l�����Z��aT�PoGlc.n�L����8���8�����p8
W<|��u0���=���e��������f��~�`�9�;�v���P���[�Z����y���%:�88�=:�{���`$X�Uw�TGl&?`X�t0��hx��]t���Wd^����S���X����+*��-���,-����D����m���T��
W&L>Vf%��+����9�-�vX"����H����N��J����<�Mz��D6Y��h��I,�����a�q����D6q�B���\�b����j{��L��?_������`Z���?���D�Y��<4�a3/��Th��2��
����z<.��b��a-���t9��L��^>&2#�0��J�X�Ds�a���47E/;���6��1mkB#�����CB^����]�N�i;�������YX�,��%�q*��:������{o�����X&"�)�V�f*K�3
��`wq�{6#�7,��+�^Wp��G��{i�����H��,MLtc��z��������1������lBhmX��	�^��,��
��:�'R������p�{�N��TmzAG��tY>���t�4U�O,\.��r+�L2HhB�`X�v�$�'��f����c	�b+��be,p����(�:���zh��������7��Y5x��U�p}$�����.�peN4P�:�Nx,�S<�l��
?�`a����rk��W�{voZ^[kL�Xta�F^5.|#B����	u�am��^A���`����Lm�1yd����i8[k�����jXk��!�b���N1�a����8�[4+�Z�V�vU|�L��V�	��
�4�*��-�{�*����3+�#�:���s�OS��7H��4@l��v�	���l1�`�:����vA�TsN��
K
V�!v[���0@���cK��,5<��@4j��R8�A�`i��S���
/��,:w���bR������$�K4������$S�I!�L�����+tjd�D�+�tzL�@0����y�J�f����������j��]]7�,�6�����Mx��r<��t�>�.x�����-X���LI�:��@�B����f�V��u��������-��#X�a&6��2,�=`��D�a���\~,���|zL�^0V������N�`a�SS�n:���/)]�6���<|��e�I�4��qRb�:�zDCgK����i���������j����.���r��Y�|���������[�|��+h�
v�k�g{&��"�P��4|�_���q;����@K&����4@��0QZ#�i�Z67s�&����4���l����6�������kbi��XX����y������&LX�1
$����=[�},�-xZ"�L�D��T�Y
����*D�����7���/��l��i�l�����&�Y�6x_	�f@�G��k��3��n��j��^�`3�������]�SI,��
U�&2�,�[<���_SN��Id��-���!!��������V���	�����/�B��gm�u���D��(`@'�hx?�F��]���9g|vn20��XMm���(�5P�/m����m�*���QDqZ!�0��p���������~h�����9MSsf}U(���{�����%���S�v3S���w	`����'Pvtz�����	����i����-L	[��
����2��^yQ,���X	6��t���`�D�mHU���Vk� �U���8�Na0�f��n]��M5l��u<1t���os����3���-�T[,�������Vh����N��v�V�Z@���T�-g!�g�"����[����?��>=��=�s	vj��0�nN��fk?a�\������j�	AS�,���T���������Y��G��p7zA��`���B.����u��P?[-$��v�_������A�6+b�����f���r|O�k[:G�4�3��mXt�?��
���-Q];�j��f�b�%!�4�Qa2?��L+���
��-�e�ba�&��],������B����^]���w�����	-��������U�b���XX(�93�����ON�������bba}�g�>�{��i�^/�E"����9��O����2{VhF�m�=���u9��p�GK?�����5uX/�������}�K�a��N{	�n����Y��tW>�]���D6�XxZ��rE���;M�f����U���� E/&E`�"�BqI�	��t�(�����n7��Tm���9���Nf��'�~& 6�' ��[s2w�hXve���������Zb�D��i���*IDOV�$��M�M+���G���=8
g[�)����f�:�g��9<n�xxZ�~2��/t:H�>������,�DtcJ^�%Aw��|���gw�����~�/|��E3�r���s�{���
���n������q ��Zy��/��B��X��h��C�~+�%:�}���b�����1��R����������������?,�]7�4��6x�
z�����Y]�XVz �Cw�7Q%1�``���P^�mq�:��9�b`�� ���������	����wy��������NV(&v�z����7Qv<-����\��'�I���ui��&�
����t�"���e�[�d��_�F ���� �h1-�?�h�h(�&v?��ne������r�D/x��D���|�Q
�����f�i�6������>-�?MI��OS�Z�-�zlbumz�+g�_��{���=����]��i����D�y���,�?���������w?���
���*����NU�N�5.%�Y�Ms�iX����>-��6��f0�0�������R�p�s&���^d����|��S%�B�P�/t��3�_7f�033�� � !Q�6��`���0�zNhr�e����&M��d������vOe����'���-�?�%��*	v���j���a}�������5<gj���0���U��$�n��K���`k��N��J
�g�+��l_�70��_=2q*+�O����A�`ac������bk��wZ�B�U����������e!��Lb����<���"P�I}���t�P�I,5���0�����a��iEz�>��.�b�PEN4����o�b����1m?�����k�=������y,�����
'!����b���h��*��A}��6_��q6�j~ZD2=^�4;<����i����"�������>a���6��}2����'Sw�_��|�C����sv��^���T��l���`��o��\�R�U�;w�%9-��	&�#z��>
�s���Q������A/������[�{��xr�V��L]C���t�GtF�N�M�COP����,T4+]���&MK<Ox]��2����2�iB�0��X�y2�f�����s���
���S����w_�8o2��4OX�t�2BO������C�5�T#y��<�b9�l���yo>,���'�
�g�9�-O����1��3���=��NN������a��M|���;`]�v����O�6	`�h�-�O:��;a��h��[`�J�W�u�'��Hx3xN�����>���/@�|�������+�c/srG[���g,�;a1^�
�>L������^	��NpI�&Z�MK�N(�n+�K������������`+t'i�������GM�b�l�h�9�l;��5�TB��iiA�%f�T��<1S����-���������,F��X�G;�����5����0�5�]-����`q~��$4r��jq�	��.�Y\(�7.g;��[����������&����{J�=��(��D?�e1^��"�M��,��.�=k������=fY������i����;���nmbYN������V�y��p��HQ���/�hz��~Z���S��.|>����5&�M��R������X�.�w���L��1��[F��Y�f��e)���
�PNlg��w[��c.?&���Jy�g���a���]L�B4lEh�����]�O�i�I��~Y���-/���o^���]fD����e=������.��&fjk�98Ew��4H�Q�\��]�h�4-��%M������!}�3Q[������DlvY!J�����,K�.&�*��>
�]r������y��eK��
���+�-jqX"��.��*��O$������x�X�w�Mt�^V�],'@4�0]VyeG�X��&v�Z���ee����D��\ba3\�es$���&J�5_�j��4?:aNZ�t1�R���$QV�fzE��%�9g��,�.�i&��K�PTO�b�mb_�A��n���������D��m���Qb�D�����b������IPXM]L4UtcUkb;�H����B�V+s��X��p7��K�UR��!��O>]XTSl��`�,��c��/@�"�|�I��H1��-��pZZ^��
�g��M;=kh�7O�i�l,��XU�Mb4����U;N6�
��)��,,f����\�*�:��R�����)��a+�-��z�bK��oY�v1Q!����=;XZ��=vwzL����)x���y�-{���64��4u ��w��)�qxL��.��*����R*����q3*+�B1[������.(�j������a���������5ES��XLf��5@t84��W��2������=����n)l�*��C7!��Z�'\Y�2B,l(/vOw9=������	�y���K���aY�����������jc��������U<a���G,
�uU-c�I�M��_�,]�Tt�~�`w�=�������������a�Qz����z�P�Wt��������R3���.h���>����
��4�B��7��i��c=A7Vs+v��ZN/���=|��j�d�XhuAg��V�P���n}l�o~8�6��i�l���+	��4�`_��	�x������	������a��[$��tucX��
6��pYXv��z��~+�����+��iq�����pA�}b���Q���Qr[�r����i��!�B?�dt���o�	k���P��4+Y[J	���P�aY�6B�$��'B�������W�&����^]����~Z^��0s��Rh�G�p�m����{���MH5-+�.h������pS{���~�A�G����I�m]�I�
�V� ���+��2�"D�������Eb���M�/h���#g�j;F��.�"V�������i��GB�z=�B��$���v��z�:�`;�������V���q3i���^LZt��S���`
��,L���+%/x�
�eV��<��t���$����U�qZ!�@0�"�d��K����}~�Y��&t�������J����b�eZ��^�s���Qju�?��L��`����D�fb�j��T}���TN�F�&Fi�M�]i�2�O�v^�-4L5t��g��<=��	X$1��w Ei(�"Eih���c^�����5����iw���0	K�};�N�i�����1��.�<H����}y"o
��bR��Z��"Az�������_�:���A��#HZ���S���s�jK�V�^�&
z�	)wc������&��"�R�n7�j���lgR�b���xZ"��0��.e	�C���Hb�WPs�!X }1�q�/� ������a+Q�L��E���������6�����T=��MT���.;�)_��sj�����-4����Q��.��7���}C,,r�����5�=�VF��������4K�2�� ��I���+�x���c��W�,3��Vd��eJk���O��//�*MOT�`����YV��cSo`��7!���������hY��E���Yb��RuNK��D�v2]Pm�Y���l��O���1�pa� �P�{q�=[��s����/�F�F������0=U��D�~�Jt�O9S��������Nd��OsQ��n>��c>��P��i��4�d���o�b���vW6=��->��<����a�c�����eN���A�(�{���p6b��#���2)g��&{zJ�!t4����_2Sp��T_������6rx��������#�����T�L��-�����]���e�$�Y#Ee�,lh��K��l���2��)r���@�*�_�ui�l��i�>������dy���,�2�����37�b����f��ft%���N�icnA����z����!�J�M�y��lQ�$6�����:�%����,+�1��w���A���;
��F�^�`Y_t�L\��fn��VJ@1���o|5�:M��Y1]�����e~�1����f7�
��vTRfv��v�N�5�����Vn�&q������/$����&-�"������0�9'��j�z����p�Hz��6�P�����F�� �C�"��^��`�	���f�Ff4�rtO��g����O�����'�lN�:�}���`�I��f9�f���o�M<����	���[��0\�	�:A�������U�{B�=��	��\Gb����p>���Z�j�^�����1��M��
v�j���M|���+�)7=�E��>#����{���g��4�z���NS�yC#AWxVI��nUQ�
����51��k���G$L��o7��T}D��nAI&�	�����+<�$��~iJgb��:�������,�.6�`�\*����n~����P���:&Y��De�?��qH�z������T}�COT�
FY�e����r�@�f��V�&�MJ�:3,��L��$�n�	z$�.��|������Y��45~�&n���Rg6]��&�}/��m'q�U���7EM:S�mv�HW�P
\����R:�_��0*(u��e���k�O�F����X��J%F�����6o�������OS���T��r���`�b��f&��3��K�X��~����1��	zoSp��-��6
'*t��v��q��n������E���+L����\��*��2���^�lH��4��6����6�	����WG��p���So��=��l�V
�	[N0�%hx���24����T��}G����}�Te[H�/��J)*�M�P������A��=0l me�
n��V��O���\���"x��00�t��5|��@�Prn�m��s
���N��X�I^8�[�rF��6�6���U=-��eX�4�aov���`������:���z"����1T���0D`=������C����a������i�6��t���T/W���8���m���	�����Zj�0;���,�
�m�u�2;��D�"s���~��K��j���5���n�`�W�a&��f�k���4m=�"���#��<#G����?�f�G6
���L�����w�6j0�`�L�������2�L�����A7x��r&"�l�����{�`���&�������R@(��,[@0���W0�g������5��	�ej�f'��[���}����T�
�CB���$�y����l�x��=��=��E��S����<N�i����D�F�[�K����Lw��+&uZ^|0�K���8
g����j
��^�c��nhz�a�8��I�Y6�`�n�M(g���B2t����8y����E7b4���b;�~���+�x�D��=7/�i�����/z$v����S=�@���H�|,��0�_�s;6O�u_��Y��w3�OS}=Ut�n�e.�Y�B�@������B�+��,������8�A�����D�K�l�/sC��L��N�X>����]����]�2�� ��h����^���;���q����?//\�Ho��O�#�G����O��'4
�}��Uler�3sw��|�`�X��a���}���a�!���Vl����~X��hX�`��	��Jh�>�~�������<��}��Lt�{���m�vA��_��D��X��h��$v@>��������X�����<���G&���X��a�R���l���l��tmEW��(v��?M��K�
���6�����Al�E-���,<��	u����P�[�`�b���:M�6�}I��m�-�b@l���h����q^��L��c��%��f5�FYVlc1��,�i�lM��m�Z���Ek��WU�tfV�����V��.�$�X�Z���`�f=�;��'�r ���h�,w�����0QtO�<��}��t�S}���Y��,vl�����b���_���0�h�N�`3�#?��?t���i,��
��=���o}d(T-�A'I����T����r���2%#�:��f<^9~�W�4gw�\���V�9����0��
�D�	m�������������M���c�	��5���,�Ue����4=��t���P�|�`�@!���Q�X
��7r����+c�X�0gIS�X{�~�WO"��i���p�=���F�����3��f[Z��a�0����y\N�R��W��"���~�2�LV�)��E6�����cis�	zdbE�6�����n&����=J�N�s���}fqmdB�+����N���d���_�[�c�I{��^�t��_%����
m��Y���
�jm}��><���x����4I�'+��?pU���8�,�U
6���X���W/_�U���m'������lA/hW�azk�u��>=�M V�'zA?o���pz�D��c���!=�2���l�@[�t�a��SD����,��{g{���Vpo��*�#���R��'D�OD���1'O���y������t�E�LN����M%�@�E,|���
���&R-����I��g�ap\��W���0V��h�Xx�:e�.�(1��:��[�:?��+��=��4U�@��
����@;hH{{��O+d���5��%�N��|������}��<h��0���aQ���
�c1��vI���a���k~������=Y
�X��1,L)z?��V���:��p��[#3Y���h�`?��CB�t�����!��h��X���A�������������
�a�x��LL�:���]��Q����a��h��T�o��-.�������9�=�GCOOi#��5��	�����Li��6��b8�E�x��o��D�X�p�Y0|�\�-b;��6�=��K�3�N����7SX�h��X���*$�fz�b�����Z,�Mk�$�
KW�B{_��7"��g�
�/���`a
�t�3E6��~`�I��Tx��Tm<�:��p�-��)���.�.hx���~O�k��tI���4����fSV����V[����M�����c��I��H@�$F[�|�.�n����^,��k�tk�.{f����t���'n*��F�8t[3��?�l.����[l|��^LI
��>I��[Zb����C�K10�������4�t�3./k�SO�t��KT#��7�����3o�����8��4��'�j��H1�^�XW�q������J���������F��h�E�p��zXm���A�-���p���:\D�*�Xx��b85����mc+��B�����6.�������Y/�e�Db3=����w=���"��,�����K���{.��8������V+������{e�i�����5�K��d����/O���������R��0~�������^ tz�.��0b_vz���!dv+]9-�����D����q�~[X�����Q�2{a�s�31�B�Y������D��bUw��D��%�X��h����j�0a]�.+r�v�): �6�E'vo�|Z^��,�*�0^�b��b'6�2/F�*�+��"�������
��)Ub������������F�WI��o���c�*�G��>V�QXW,��}��sN�����������n���lZ�D}�{z�i8��L�^t�FB��U��~��v�%��8
e��&r��e�K���E����9Xz���	Y�b���*NE7V�!�2g�g��V-�������V|�fK]6��i8��S�L4,�/��� <�����Y����P�������	�jE�D�{��|a�.��{�~Y����t��S���od��t����8�,�^�uX2�L�Ul�o��:jO���z�����b��;����L��(-�\�-��E����X�=�'X�����D��wma����b��c!AO��(
�"1.��,VX��x�d�3E�,��l�mg�^��l�r8���_3\��������nVK��Lz��`��O>�	��b�����D�[��4�mxhU� `�YR���C=0��;2WK���]z��;��gl���~wa�O���e��b�e�f�J�+�/���=�-������j+��� h�\l�o�
'�%���
�#�ybYm���9V,�]X�������N�#)��.������=�����<-+i�}.�S:5�1�8���]�W��i�lx�+BS5|T�(�@���'N�6��������fz\��7}{��Mx+��]����/���3[���T��o+d�����ES�`����Pl�4��xa�{�a���N3X��$v$Z�+���A�Z~]�Zl'�����N�v�EE�@s�-s�Z���}�����]���+���,��7�n�X(���n{��&4�$��.�/1S[|0++��T����OS��E������������a���a?�����
��4.vd�G,uN����D	v%d�5��=��*��������*n�������	�Jo��w�2��)��jx�O4��`RG�^V��1�`w�����v�nS�py#n����`G��A��y��P��`il�
f�k\�����
�&����5��z	�$��c>�A?���`�w��M��=�(V�29{v��.�����B���]_�����;��#�mo�i8�l0�'h(���6+�uX�q�����j)O�k;�)�^�h���?M��\�f^@��p�	zA�J�{��i�����2h��
t��z��C��8!�[�	_`����]5���f�hO�y4L[/VE����v��HV�id��Q��h�9q��|���!�N��!Ew��a���I>?#�c�|���~�u��|���v���`;|�`_��
^��VO�k;&#�O��{vWy<M�6���^��q���H4l����D��$���mA��e$(K��v�1#���]��{�w��i�a�
��HaZB�Nh
�h�U,�^�W4��K=PS�Z��
aw�FH�>a[�A�����@�l����4�D���P��tf�����EC�4��Bw�8\�{s�{v@�IB��D^��VX�H�?�f/�2�����p�`Fu�&r�2)��*���A���������,�
��a@�4�����bx�bGA���P�S���J�8�����(=��Ot����A���K�$�
�u���3�Hxs
z��������L/M�^A�.���f}�TKoWV}o� B3�N�:���v���Q����VA����S�Zy~����{����7.|k��V�Zxe����?R��]���Z��f������/��w5��,x�Y�����W��[N�iy������=�Y��,���6aVV�gW&�'z�;���2�4�����o}��F��tej���|��D[�jef��V4L�}5b���{vo�zZ"�1,�F�?)33�Y�������~k;-�- ��,���V��&�eqe�{)�i�l����7!�Z-U\Y��h�;"�k�}����c���S��{��M�N3�CO�(�g!�P�T,�;��9������#z�mg�x��=���h��`.@�^5k���	y�jMg�r�.s�"��r�_�hhi��Z,K���]L��(�����	,�C���:�Pc�4���a
��`�����>�^-�]�
I��DQ��qw��1m�1�k����j����y9\�q����P�W4,������ohK��P�h8��%�q�6�(����D:z��5��)%N �AW��AOV�)~*�4��e��D�E��5l�*�1=3�/��;�[0�	�����f��ve���+�B�����D'�j�l��*��[�u�~2�fW��%��{�5��A,5%~��lA�2���`���v�DT,l�-vl��ium�1�o���j����fEC��F�l���`W"��Z���e�4��Y��N,������l�
����E�m�=g�����M'�oV���f4���I|�V����
��L@��&��G�z;��1���M���EgZwT�AW�E,z��6�v�o8XV#�o�����xeZt�}�/7�=�X�X���s������P�W���Nu|�@�f�S����	r��KqS��Q����A��.6�A'L�2W�e�d���=)+�phW��������\�q+udh�����L��&���="���]�l?��0��'��C6��$�hh�
%���9�l�\3-A
U4D�0�)-����4U[�0%^z��������p%�c�u�a�"�0*��S3��������8�'H��6�}�B?r���z���{zL�]��Z0+"���'�����cZI����hh���;P��$�e�����,����jc���a!���?�=�`h��,-��9q\[t�2�n�4����}��vxn[w;������U�_CG�t�a�����l�D{�~
�}�n��t���w�"4tzK#6��j�&]a0��jw���,^P�}s�2�3S1n)�
�����>W�����L���:�Z�A���b�R����0�&M�$���{���+S�
��x���oa�
r$��d���9�	v�4O�i�����&�&	W�+W��,�n<����_��7*�������$�L�H�<���9$	�vK^:��
 h�J�z����	������:��0����Y���I���se�������I���Q�yzJ�@LxX������:3.L�:W(�����$�aN�&~K�+W��2��"q�X"���n&�i8[1����'mkd����9l�����S�k��o�n�j�J��?�R����fy�����f�g@���9s�Dg���VX������9S��Eb��������6'`��hxHO��-��%��qa�i�#����az��_X�,��m�Z�a3�@�$���w��'����1��Ao��h�E`>��'��"�}\�R�	O.n�z�O�k�f<��+9�7!�Z��\�I��%�m��.(!6#�aig���T��(��������%v��J�/��L�\�@�<s��m}�
��5p?^��C�4U@0�L�����fZ�B��4�3^9kJWXl)Mi�6���� '<������������Y�z�T{5\��6F�o���{b�'���0KT�~?
W<\�H�f�*b�dx����f��r�EO�w!v$jO���a
��NU�@�],W,�aZ��n�n,��Gg�{=|���azb;;���.��c?&���}�:C��CV����;�	��fUh��J�`,���N,T����4��c���
vcr7�a�L�~�9M��:S���1h�������=����,�Y,,�;6�����&X�i���W}��#!��,�X�L4;��]����~�m�:-��	Z���]"��R23�i>e�&���������^�`��}�
���E�����n�v��[�!����f��J?DC�D��(\^����,zZ!�L~[t����<
WN2�YB��<O��Ea��2?��������A����Je���a��X���O�i��%T�np�
6�U[���������b�wN��,��O����f�6+w7V�.z�p?
gs��:2�2{��'��-z�zs������r��1mzA�gQ�F;��x�p�Q5F3���.V##���
��3�M�@6��j�h����n�����i����\E����x����vc���Y
G�6|J��3��EON+d��g����
���)o��Z�����j%7�v7&�$zyO������Y�@��6��"�|{NOi��I\�~a�9�]i�4U�NL�V4u����{���eYA~�D�L��uc������&�������L���%�TEC�@�^��"�~��~X"�X7&b-��.�`�D����0jV�������l�U���y�YV����
44�Z��*�6��+���
6�
l6�X��i�s�E5�W
+������"�I?��z�O�pK����fQ�SI$��9r-SN]�AO������!�r��xB��Yjv�����P�E,M��������'����*��M��Nz��cJ��c�s�v!z�/<g����Ah�I�n_R�����X�������v�
�O��6�V+s:X}��x�4���.3�
v�h;=�m/V.#z�������:��n	��%��]%AO��l��(b������=�;����'�G��t~��69-�-M�1zd���T�`����S{���
���q�%Z�1*l���a�v��c���bw���)-����=��4�M��KN�k��uv���K�1<����+k���V�����6�|������h��z6;05�LL�"�
[AS�;���g�v�����`����T}0C��WL��zB+`C�$����X��ovK!:=��	���������'QX"��K�DD��B�����$�E�a��)����=���������v�����6�`_X<%����h��#�Aw��O�`���{�&:E5�C-G��h���L��Y���Lz�D��f}s(�&�FE�&���7�B��'4�������R���C?Q�����v&LPz�L�!w�Y���E�Q��0�1�pZ+���q�`ySC:M��"=4�x��LY<��k����Q��hy��������]�S��]������E��=a�����;M�6t���%��f6���5����/R��N����]�LC���vdfU}Z��W������e��
��w�����'�JOe�c+�	7�)���b�����E����=a-c��72y��Xb^��k��';������G���`wO��1�	��&��]/�4�Og�kM%���N�`a�8�
/;3�3�`7h�,��sv�`��,�:=������3;
g�J(H�^*���%�LV�nLZ4
	id����E��0�V���rZ^[#�W�����
`J���a(*X|(DQ;J���0�4RN�kK��)
C�b���4��%:=�-h�X��~U�5��C_tg)b3*���;S;=���#3X�{��c?&�j�Y�b���T��
_���}v�wV-+��
�,�����|z����S�)�v��m�b���&�����;S�
%K����=�$���R���/�^��B���gr��
��)4����R�O�y�`M��]~L�e������M\����aa�i6�@�:4�n�b�f%��)��Y�]�d7i�.�b{"Z��*
;9�f�gBw��Lm��*����,aW/��x��,�;w��$z��A���b�M�%�;��.��y�V�X��=���lM0Y$���x�/�>*�-��D��g-6�i�XgZ��'K�I�����,3M4�����V�LG8=��f�,��0�X�1�d�^�J���nE��B�Y��X�gDlO�w���~��_�WJ[6�����,aGtMxR��e;4��.L�B��>M�g$�J
���]�|
���BW�����������Q4�����j���?�[1�nY�N����abL�{���1m����h�o*�$r ��i;+
���ee�b�N���+d�I��h�BYI��t��]�~���i=��q�3���e�����[�i8�",oG��w/��6,�Y��mf�l?�@I�0�H,����e��R~�Di��ng���W���	m��j	�c��,�j;6���1m��@%��U�=��A�m9g�W()��ze�C�b���hX�-���
��z`��&vn��iu}4����Za�N#C�Ez��6��n9=o�1io6E`�4h�3/v���~�@��M�`w��iymz1}Y�xyy���i�=��=�����!���9a�X���B�����7�e�H���n`1I���Fl�@�^�f��l�n��1m?��i��6�=�	�X��n�I���L�L3U�`
pb�S,tt%���
6���fjg1������'����X4�f.����������K;/]�_�4�X&�"�f�o�����0�]i�����59;��
'���d��S$=O&}#vWt<M���x�{c�L���	���V������J���}�����e����o�JW��7,1lB\�[��3AO���,���`a@HS������L�S��IW��f�a����;��#QNhZ������iym��D��$
_������"
����E!�����
<=�Mhe��r��@�g]j������6y�^������f�,���W����������F2t3Y����Z�&���L��m$������1m�11P��'2>�������f2�����4�;(��H�X��'�M}+6��8h�2�/9���"L���'�3G��6�����I���=X�t�+#o_�i��������v$�wkr�����&����l�\������3y=��@3.k�v��4,����@;��I���H�F��g���c�a����'x>��X(Y�q�i0�J�p�^���H*6�
���[���|�3Q���hQ�������Mt��/���DS���I����c��H:r���c�4U�0�&���v�f>�t3��:�`���G3��e@i�f�����p�x�8��z&+�v��4]�`�C�p��,��
��7R������
v���`w�����`����e���puc��yyzJ�0�xM���y<M���<�`.�R���H/���i��c��+�)�m=�?�[��s�-�Q_4: Y��(>�T�0�V���Nkg:��7�KI4�Jm��R;t���v�:
g�	����
7��k@Ai�r4�~gG
��V��K5
K�����Tm�1�S�Y�����<�m�E?�H�
�a���",�+A����I��n���
��a��A������qbga��<l�=X:����n���eX�t0��J+�a�����D?,�R�d)\b+���������(�u�e�!�a���*BD�K�/
����{txT
f��l)���0kI�.�
�eK�-�����~f�5��f��=����Y�����4�M�Q���[l+8��D�=�.l����K+?�-�*�K�Ji���6P�uz�������E�4K63w�`������R��}�X�XX�.����Q�a�W�Z8�����Bp��
/��*�o{dzVG,�.Q�����[H�V��$Ft.�;ge�/���-5����bs�ca\��)��eeX�v��V����,������Ql��;-��E&ik�r\[Z6K�|���~+O\�8
=0�p�����j�Z|AS���@��5k�;��rZ"���A/z@�D��t�d���^-���_�4����	���r��f��%���:�>�`��tZ^��,@4uK9����b�+`����0Doh�I������EO|	��]{��M�������E/���^qz�S�^qE�6\���K����79��c�Je5�����fzP���biP:��������E?��a���rDC}��O��l"�:��/�a���aP,�������:,�]4�e�X2�����;�@A����Z�Zm���7���4U[m�LBt���������EC�4����	���BM�OA/yX��dD����p�g,MTt���FfeAbG��`X�y@�`����"��llO'��.�v�gpw��1|�b��OiF}�����+S�C����T�S�Ilw[q[�w@f���o�]}�a�����q85����xS/��V������n�n�p�U��%6���MK	WpW�c�~J��D��X�`UO��G���������7L����=��<`�G
���5�b�BI����`���'�-��0�&����6�j��V�G�u�@P4�;�c�<��%�Y���	=����oU�f������ S�P��l�A����~��aSB�P{����B�oU��%�����E�<��p6�`���
H~g{A�tX���Hf����:b�z��I�7L�tc=-�m>���
<���@	��.�0-�=��%���;�O�_�w������������T;�B����5�r����'�4U[P0�0h��Hl��|����`7<������u��@�����Bp�������V���9�~��g���������8�Q��X5<�'~N9W�1'�o�8|�V+�}}D?�<���bsp���6�`�)hh�����Z�{�k������[	���^���SQ�$��N�����<A��	����i'8-�m��0�6�`W������iR���;���0	�u�`i���GF����0~"q�d���}Uxf"Jb���w���sXz��o����[v�w�����&���L����}�m0�/-lx���a�{�+i��J�&Y-���[��S��i�6F���.�Q���/Ek�K�qa:�����|��]ia�&\*��],L���a�`�K|�:��7���a�E����Y���uUX![|0/qI�nbR�����ZbK�/�+�I�A7����I_Y��������Uh�4��>���h���#WT-���;B~.�O����t��uU�Al��]	�K�r�PJ�4K�4��wxJ��&v.����?��ar�D��-�q+i�VJL)]4��!�W��V,0G^��0
E,45%w���m�8(��C�R���A��i8�O��X���:��8�@n�^pO�'���3������En�A�!�'y�OS�]XA?0�A#��:��`�i������_ylzA��.��,0D4���J�J��b{Y���
����[B�i���gk�0]�����^�iy���`Dg5��,�5�.v1;S���D�������e�.o�XKo���D{��,�u�AC��-�3{Ml�w����A���Ja���xZ����S��|���c�����B<na��n@��	�i�����%:w���^���B���~��Y�b���g]H8�V��L�^4�����U,l��q%��r��	�.(�L��O�+,z�{��\��_��Wk�2�+�����]��D�C��&�d?���v����E���������Y�9_��(���
���:��%��,S�fE��b�c��������Em��l������g~��4����p>���}�{/��n�"�����S�y��i�t��G=?]��h��x���^���`���;�����F���]�c�VZ��k���$������&������VI�Eb����J�������3-=�EC���~��T}����h��G�b��fb��Z��iq�^,���Y���eo����8��
��E���4�m�km���bZ�yB���������>f��W�W�DO&-zV,�5OV*&�����#��X������r�c�q�����m�:M��$<����qI.�\I���R�N���%���VAO������������M
��DC��� �2��<YQ���F�;�R��i�>�YN�/
?E-*����).��\��@<Y��h����,}^��N��cZ�x���^�1O��\��h��R .d�Ok�t;�8�22��������U��������Eo����2�=n�a�	�Z�ek�5c��F����dU��B'�i1`(N#��~DV0=G44��B'�Xx�vCoO���8-�X&B,
f��W��T}:��`�9��Y�vB��h�I��vk����
�����7��,�J7�^���:�B�R�i8��L�U�
��`+��������f�+F+�T�Nx�]qe[�t��j���6�m�x@l��N�������N�d��|�@�Z��Y���
@����O+�C&X
������bV��'����S{��Oa��P��#��:�,otzL��������C5����J����B�l7����,�"
*�y���i�����q��o|�.��
 =q�Va�IS��l��Yx�I8�T�y+f�L'S0�a���O+Ad���X^����}���
��lMQ������A���0��U�l���:�T�k<���%����]uZ"��L��4+5�+1s+�N&�(z�$�`�E>����������)���K�j��6�yQ8��P���|.�'��CJ�0;�
�fa���JT�W���A����B-�
������`s�ia�B��iU�I_��K���-�`K�HV����Awh�Li���K:��S�5Ms���U*ge����J����9�\h`7-�;���h��Tl�����F<���D-�.z�<�`;���:t�/��B�M�0�+XX4hK�����D�DC=�
�B��m�Y�^�u�����lD?��lV�*��6�b��~MWv 2LxUt�s���A��$D
�42,�
��O��OKdc�	���Z�ba{+�%��P'�5��S�<Y�_W��[����i��6�$Aa������W���L�`�B��i�\��q�?$�[hz\x���V��D�d�K&�+����N�4U[L�Tt�h�Y�t��_I�B���Z1Z`����Bg�i5�	M�����G���pK#�R�j�	sD�{��D���V��,'J�D��c��+;-E:�/x���5���������������]�����,���4���A��2���J��ee��,K����}��0&6k>�����A^����eU�����paOl�e������p�`6�X�'�Iw��cv?&:�E��l�7;i=.���X��U��^��\L�S4��(����#S�[��\,Z"�aB�b���(]!�z,,���A��p#Z8
/�)D��E=s����m����o����H�|����l_1],<-����L�2'�X(%(�Pj�,�5�>�9��!ewv[���-��f��*��������=2������;=��=�d}�7�e9�����B5�%���]��/$2k���������E����a_�,rb�n"����i�l����hXQ$�
���O�9�^��^a�������,~��4+�6Z��,A�X�h��,JZ��R��uY�4�+~�zS8
g�������Z���q�~�6,T�{�s����������%oBA3�F�P,��V���M]L6Utg�L�+O��������o�.���S���I���������e�R�
[c���C�z�4gV#����,���N.x��������g#/��.&�*�������+���X&v�0�h(;����"����e�W(�-z@��X����*��*��� O�_��>o1��Tm�011��eF�]���e���2TDx$�K����P��*N�7p�b�tz��j[x����GQ!v�����qK��m &�j�%��������O�8C�����C^6����5����<g���j�"���Zw�{q��)���$��Tm�)�P�L��K�����F����
>+��.-���~� k���S%��	���\�����Q��aG��O$��Y�����[�O�����l�hV�!�����M�w6K����b
�E
\1�-[���%��=�2��������*�#-���?�/�f+	���q��%����!���J���j��%��B��T4}��W&�+����������q:}Nds��AW$��%�����p����w�R���Lz�m��\��������������]����������nqn{�q��u��n�W�Y���`��Z"�L]K��%f��44lA�zYly�$��o��G�I���p1
�3����bsa��1m�������4�-�1Ms�52+6�mC-�
�~+/� ,�������&�cg��f��%����@E7x+�=������{Q{Ky:-�m>� ,���R����\
w�X�B�e����q�����y�.h�-�/&'�IH�n1tA��a�w���V��&�K�+���^L{X4��"�����i�����pS%?�m��=%tS��[�j��a�_�
&�K/���>��e�b(�'�A;J#$*�5���
2t��P�Lt��|g��1�,�{zL�@��<����F�4.��[�KZ8��.
~
�A7����50X��6�.N�k
�:ECP�
�a��c�f�J.�R+n�c�H�4]����b1Yi��,��%R>��$�Y�xA}	�W,�L���[1�,���X������l1��e�b�����%��h������������6����/
��'�	��W��
�_��m��Vb�J.i\x����D���X��,	t���I%L7���w�UBS^�|~)�V�}��������~g/���hq����Y���p[�?�$�c�b�u��9���,<[7����bs��w6[���
����n
��E�i����9{�>#�zt��`o��i������	v>;�)}����Z,zB�`;����a���;kc��%<\���x�b���������-�>�JB��sE���"�'9.O���a�������p�����^Dw�������^�*:�Ewf���gM�7,����-��Y�h�K)�a�S�,��s.X����)����m�bo&����7�	M���6�.|��[��l����nv��Y���]:-���X�D�ff����x����9����,"{Z�����9pOz�t_��]!�e[���
e��&���L�g
�����BI<�P�Vl���h{���(��sE���m�%�oMKd����O�������2+E����q9[�����L?�K	�l���2{�$�m�`�����>��8�f!Q��6	�������)z�x�����>�������w��ZQ�o�%����=���}�T�E��1�VdN�P�@,��-������������v�5�7KO���l��I��j�N�i#�y�M��Q�����&5lZ*�a�=b�d��jU�
M��7KZ�E�OS�],�����V�����7S��5�O��(�v��Y��Gf�#ba.��J���:��f��L�w���v��=�^��AaU��2�E7�A)�BJ|���jU=l�pa[F{3�M�0�i����������m���j{DC)I����x\�j8<��0�OO�k�z�$���i��t_�t��f�gY8�
]o��s1��������*������.��
-�Xl+a��'�O��N����.���C�yj�����P�St���5��N��	��8�-��Y���]�O���7-��1mM@��3p�Z�]0���-���,�h����Z�������<����w�����f�
b�&v0�c��I�.�f�T����[	yXz���.4����\�D,������hJ�b��X��n\�g��[l7�"�.Y��}��1����Zs�~�`+)�V��5�a{(�wA|��$Cs�
��[��&+�����������a�������#�����XtcObG�����3��}��`;��}b���f+Y�QoVi':;����BF�Sh��-e���Kr��~b�r�z~����N��P�ojx6}��	9��������
]�A��;��E�����Ag������V�W(��E����PiR�/Ob�
����_5|LL��.���7�C0
��`���U����3+����O�k��U �n�����
aAj�|!Aj�m�W*���xO����-�����h(�/6o�����a*��GJ�8
g;�A�MZ#C�����U���	R�k�Xx��u�)m>A��h/�}GiI�%��E��JB������et%��
�^���9I.��o�$So�T�a������O�������v�X1���_��B`����������������}f��
�(+�Q�`4%$�����c���Z	����p6�� �U)������h���=�nX[1/���9�Y�Ol��V���h�����H
�T�[�w���x��E�L�H(���N���sM���fo�w�fb{f��vZ"���g
]������)	���>��M]B���&��=L�"��z��N4X�~L,-������.��}C���s�t�,�y��n�te������A���`�GC��y�K��fi����b��P�N���p�`�-�]������Xx!Y�V-��-��/��.o�&`�*�~��������}�vn����o���������b�z(���P��,�K5�$�c��M~��Tm@�	�Vr0-F���h�Yh���&rk�������W��:�0'`XWl����|v��z���,���_�k�w6�z�V�����j/\ 5Q*�a��Ke��N������(�_��r3(�i�NOi�:]�����LW4������'���������lz=M��T�p�y�J�������T��j�}�fd�������,�x���l�s
�i�����I��]�Nd���a��
u�9!M3�I����w\t�����i����"�@�`fs��w�Bf���Q����R�O�;��p��oE���l����<U�'�����������|�9���������n//�j��������s��l@�{�i���lN�9M���7���
,R�1��/}������J-0=P�,k�d�d�_6��pv�/|xE��)����uzL}H��4��e��f'�:�N9]rO+d�Z%�E�1�eU����l�����F�74��u�F
?���#?�
x�_�E��4��u�5}�=+*S+���:���P������
�5�4[:,o��#�!������X��%��������oEJ���Pm�(��2�|��������P_������f�����)�{]�`����W�����(��(4����Wa���m�	���+>���}yL83:��6�;��NOi����{��>�~���'w5��~Y�B���w�l��\,��QK�b��jC�t�Y5�/��GU���/~m(foz��+������ylx�$9��wdx[M�`{RR:-�-/U���H,��2�E�O�i%)�.�D��PN�iVi��n��5_����DP���:����������)��NM/T�g���mt�W������Bz��t����{�O)�zJ�@0xt�a�`�w���_�
�t$L��j*.�;���P2��F����n���v/)�"��q�� �l������lC���V�fCI�����;X&0n�o�����;�h�id���'i�B�g��2��Hn����p�����vb��g�5��;�����tK�U����:��f��5��LA���@�8f�dj���f=�#����i���{5�Hq�l�l��m?���������;B��"���������������ug?�M :����-E�����K�{��������&
Q`�l�	=]����s�����9��Mwx���m2�OS�)��L�0M"X�@$�Wx�������d�1�4AM�O%L��E]��eSQ�i�l��[qWb2���:RfL��DY����m���D�;�XXP�k����f�8�(-<��?��k���1{W�a�M>$�k�)I���������/"@��S�����qab��`i[�0S}(�_������c�����\ �-k��$^:���D�-3����p�% �V�
bt�?��U��v5R6MM0�L�a��A����h6��>�x~t��l��6lw��0h�CG�T%�p�v�/A��]�L�a������#S
����f��a8����B6�`�^�7����)�d�m���i�f����|x����(���<���� �N2t��*���6L��jez��a�AlAl�N;-��$�h:�$����������D�j%z�
7"w��q�G[���[���`�����i�	F���W&D�R��a���t�Ie&4J)~���y�w���������l�A��d��������;��V�~Q:��V�J6�g���n8M�&tM��R����
l�h��@���s0�4�Of�l��o*b~0P�q�7�|4C��R>se8s0��k����R�^�%�o�&���>�a��RD8�ZG�������M�U�9��}���`�	i\�x�Sq8o���.8����y�Rh�x���u�+�����z�g���u=o�YO�kS
�Yg~h����l��K���D�c��V�Y��;{�����+'�����[�d���[N�E�x��b������;�������j��]Xm�����0,���W���B6���,j��o.a��y�{����{YG�b:��{w���i��g��y��e��]��[�V^�����i���Z������2���DC���A�H��.�����9���nGba��Y�b�C
�%�^"8�������o�����k���K���������2�6���u9�Y�J�N�&1tY��b�}�[!E��~����s����S�k���}1Htn���m,�lA������`�'K�
��u�/��(:w������i����p)��^���B�ei�B'��5[X[�^L�Vtg5AbY+=��p��,�}�5
��R�N��i�6���&5kx-��4�1[H���H
5�D��Bf��&%lV6pUU�/�h����e��y�Do��'���_�Z1�3��4��!�`����,�rY5n'�-��;���s.��:�XL�4����/�-����o�������Izb��k���6�����-/���[_a�j�m��'4�����L������t!���N��~bb��+v�*^l+a_L�T��d�&jK�U��^��;
gS�%\����������4��bwb����?�Mh��YN��J*�6���VtX"Kp_����&`[�X���;.[^��quZ"�"�1/���;2����ps�I�����aY��V�H��w����d�M�
^������Lj�2�Fo��.��~$5���P�vY����6����b�t;M�&�I
z���}K
,��+V�Nz+_08���������>0+�rh��y5=�U�/:������1�����,zB��F�Qc����q�O���e���I�����PKR,l�)v�],�J_��*�SI��Kd���3���?�p�K5�w��Zi6��{�D�3g'}w��v��H�[H!�,V�p�~�e�4��6��n������e%ba�P������4�$��*M����e�����p*l�^�O��!�}j�0~�����-�
�L��-��2���P�Yr��oB��`��F�O�h%��x�J>�U�/Vs*:w���Ng���d�wWo��h��,RX/T�^�:�����~+���2�e���U���](�V�,�I�5i�am�YX,�1=.���e�O�k��I�����F��l���`�:�jU�3�|L�J�d�b7�k\V8(v��8��������
]&����E��������1��b�B��e�s��J�
]�]j�n����[x������1��,��Ia�}ez��pZ![m���=���j���M���D�4a��T�aJS���+m�s(�k&]�SdOS��	�A�QM������L��7<������Tm���4���u�/
z��R#CK$��w����t
%l�Wua!�4
���/�5W����b�8�h�QY�J��T-~1a�9;�;[)��n����/x>�p_�5��5,�����
6��gwr����G3t��S�(Z����LW���������T�E?0�#Uj��5���;{W�u�R_L�V4�X v���`g%�oYj(6Y�.�l��7b�vA�B/����4;f���L\�a2�T8�F6��tU��V��`�&h�!6]�OS���y����l���u�n�)��D6F`@�4*Ik������w���YI���
AX�&%m��(���@Z���Z-)!��H
���.Ki_P~fu�nl�fL���I���E*��9-��'���74��PB �N����o��D6����d���w���Z����]�Y���v��&|r�B�<,���~V��lO@� �K�i'��4U�����N�*��|JB�.�_��za��>�+��0�!a�JM���/x;�@4��6�@{�UOO��������Q��l���"���������.���|�A�q�%����/���_�H}g<_�--��HX]"�c���c��Op[��fIT�G*}=
wy8t���L�D�]��� |3a��}�����]L���D���s��������bW:�OSm�*:]E��L����I����m��iV��%����7��E��p����J�*����3C��b�bG�B[%�f>�0�'6���j�W�h'�a��bs��wv2#Y,Ta6[HX��N�D�,M,�(g��Q���-���N��K����S�U�����[o&�*zA+�-�`�
���>�X=�ihz\���i�>$YV���2��B������.����*,�M�����e���j����z��g7���)�f��k���{����B�m�S��M�d�(���������V"(�U.��\�����.\(%�����^���z�C3����bx�������1m����
��ZfY��Y�K�N,���]���m�W�����+�0�����g]�r�����e3��DE����
<���^d�V���r���=���i8[PL�Rt�"��`��[E�B0���B��}!���z��y�i�$"&C�-X"�=���E��5���
��6�qv�]��ZoxI
z�On+����
��`s�w� �z[����A�B5�m���.L���m@b
�;��Oo�� z��B�����t����24�DW�{+rf����E���g�x��5V��)A7����{��I!-Oz�H�������������4�~5�b
3�1�J@L�!��L�m��6_a�����r[C���~i�]@����)}���kw���KE����p�D��;h�C�l!����
����d:#�.Qx&X�X�Ek��X�m	Q��#	QV�f�/4kx2������F���a`e�b����9
;����Nu�uK�5C����I������B����P�Q�.�������ak!�o����Y����~����X��A�4`���)����6�`d�+Y��X@��y`A?0�G#3�"�Vq�[{���TRj��y32�x���d��f
�b�`	[O�fz��'���L����Libj�okb�L�Jt����m�����z[)���
Ma�t[�|Ve[�-�T�D?�):��m��b��+3����b����i�.�/�q�������`$5��J����;[r[�f���[����7tX=�_X,����0�JC����7�D�\"6�������oj�Y�I�q�y�q+d�)/�~*E_����!
8���Y�2.�4n��-m�������VrIB�|�W�������A�6bs��0U�q�LEF��n�`;�RK��%!Z�z��z3P��^�6&" vB�)��jOKd;��m��m���T�@x-�ti����h���q��b���`��Ka�x�p���e����z���D+��V��O%����<r�a`��3H�f�hdz$��;��J�=�v����Jkz�J���Ka�*�4���+��U@oh��8��������w�J.��5����q��p>���4�1��x�i�>#�t�X����a|w�Vkb;,q����hI���cI����A��,����J�Y��(��*���M�q�Jv��)o&l':;���6�����|����6��HR��AoY���k��w����Y	[������;����'|���(��R=o�5O�k��E�?Ti��:M���s�+9O���`���i�~xZ�D�K���`���B'����Y~��p�s��0���(U�C�H�Y����������N���D�B������%��c��S��4��'�����wy���S,�H��)��������Jt�$�z�7L��Cj�e�Xz���f���D��^�H!����XX=$v�u�f� $4�2���%�iz�
�}�5q��3]P�|�/SuE�E}����x\V����~�>V����,�F�.�?V�}X�������D���<n!������xMnc��x4]Cx����1$����4��p���M��pV�}�?N�`�����H=n���ce��)��fF���\8ba�Gl�5����DmE���ws���R?��n��Z��-�ZB�c-��Ig�~
?�Em�.��h��J�����f��i�|�1���U$<����>#Y����`;����V��%qV�$f��������i�����B��U8z��M`i�������8{�y��.V�e��8�}*o��i������p>��D��V9%-�
�aE��&p��$+E2���[��
�$��>,�4�c���z��:�Q
�E��vVy'
4x\hG[��|,z�0�S�P�[l��������1}6C�Lb���.v�����E^�9.j��-d?V[}�d�h��Xl�7�[xJ��,�(:�/9
���U$����|�Y�X����U���Y�A>��`���e�$bg�|�h��DSE����p6'�/���/�Y��~�����)m��
-��*� ��������i�lM@���
�c�5/���	��<O����2�C_�U��},�
[F��Z�f+��%S�J��������w
���E�%�%�J�E7V� v��C�P��l!�����6��s�~Y��QfZ�Hz�-/�j�b�������q�������s%��"��P
���b�������`��hh����nxo�~NKds���n0������&���)m���p��e��}
���uSs ��p����{�,��S��	���?�s%hk��\+�q��{������Z�K�
����j���UP}���@�K���>�^+����M��;���O+d�3����@�N,��&��S��B6a,SR�����-���M6E���Y����"7������mEwh�t^��LKN���J�[	2Y������6���L���u�q��{Z"[�0=h�� ��X��������B{i�����iE��n�)]�jy���`���,B'���-'Y!�a
g�m�-hJ>Vy�2���`cA����+l�$zV�N�����=Nu����;;��,;�4�J���ax�KjZjb�S*��O9g�~gs����
�F�h����g����~�!mG�3v��K�w6k��jK���2�'��z���jS:H��
�2�n�����f�[�%y�,��
`)�Bg�^��?�WxJ�!t���6r���Hh	�������K�T�S�-}`\q6�
�����:����f�O�
���Z�&��n����iym0�W�P�R,-
�UJE,��>��#�D�����6
�\��B���Z����V�3�E;��A�4�L�[y�~�R�^�h��,�&I��M��Mi
��A�����~KJp��������8\��	���%�����
��0���l�����baO�y8=�M�+�UR���
���0T�^���,��	���QUU��m��^i��;�i8�t]��_�Y}����(�R/��'�����DZa>��o����Z��&"l��.�(����/h�������r��N.�%Za[�P�S,	6��OOi{��In��RQ")���Z���r��faX��Ct�<
g;�A�B�����tS])����6R��N����Y'k����`(0���X(D���^yL["����(L���'�x;`>A�����Y��oV,mL�Ttn�Ua+S�<U�m���h�#�������O�y�1�=!z�#����]�EO:�`��%����,�#6�z��m^^�9��Y�����p���6[(=m�r�Y����� ��#�,T�,Z��Q�,Z�
���)����,Z������'���f�������1�n_!���(�aV�']�ei�hm,�&j/���h�������W��|�~g'�J�o�;�����aM�,�0��,�m����"6X�����?���E"vQ�
�9���pa�J��E����HD,Tf[�`n������E�hX\����i������?|�12�q�����{Q�[9Wlz1]��e�����f����R%baQ��������~�2�_J��
��f�F�%�h��f](�$z0o���h�����he�lx1!\����/n����������B����"��������� �hX�(v0A�9hszL"�x�f0\�0D����y�*����a��������#A�f��bsr�i�l�@�]���.Jlg�F�5�;+>{+7�t,z�5+7��(v��X�����H<1��������~brW�+��r�
>�d�K��a����(��l�|d�l`�7;	�������=��\��1�#!z��+�]���,��h��������~��L�@,��i�Bfq�Hrc�����wv��5�3�`���4'�t�1� b�,WLy�|�������Lp:G��Y�4U�L8X�J���,���~.!�B�e��nc���s����]��k������.z��,�G�q+N�	�r�DCQZ��JvAo��Z������m0h�t����ESN$hK��Po)�5��BE	���M�,,�X���,yP`�9XxtV�,J��/�
o�M�8�X}��A��^�$�XH��`R�.�R��n�p#I?1�i��r:�O�k
�q���p�m0�����j�;�Y���^Z!�|�W4��&vA�V���r�O+dS�Kv)���(���Q��mc��������\SlcE�ba��f���`s��$�K�0�*V��pt�XZ�@��v��Tm�������@�Lk�W�0�N:��ZElA��Y��1��f�V�9�S�/��Z�`a���������Y�t�
(���je�#_A��J�#��Z��CA���K�B�,�,��?M���v���%q��}�`����r��)��03'X��@l�����+����T�������$nO�iK�i������p�F`�G���h�,��`��h��,ly �U�P���A�J:��^�#F���<k�6���p*�p��/��W%/���P-O����TWan��J�J����	���l��B	��0����F���,�����>����@�>�����"�
F���6K��
��pqD��`G���r�
��H�������OS�����0�Bl�}����TDgq������`;�������%�I�W�k��c��F�b�o^��4KI��X��6x�
:�@��W�CG�\+��:�����9=A/{��P!�?�89CNdc�
;����W,K��K���k��Z�k5]IY�\k����\����� �'*���SsA���&�7idx�h\h�j�B��f��C���^�;�!��JW�Y���q���iym��h�������+�6EC��eW��������,��`"�$[�L��P8���
���Pu#����4U���3�	�>�l��b+,h	v:"6��6&�*:W>���=3���@��v����������[��w��Z����\,,3�������c�������a�M�7L&�T,\�x�dN�V�&S��`,O*�������"�����Y~�����;��NS�<UdN��+�TwM����i�'a���a]��Q(�V��YI�;���}XY���<b���l!���P���|��#����{\���R���D�K�,�����n���u!�i:�x���J�Bmg
�������puC�$����~Jd��
���-����Y��O\(*�����;�U=���x<.5���Upw�����p�-z������Y���/[�N�����������nZ���=���6r��4�3�\�����di����y���E��B�b'��y�{���|;s+��;�w��/Q���@�����}�"og���$d������rzL��L�F�]�W�-o����hx���mA��[���F���(o|a{����Y�t�����_�����a��G�+E�F-��"Z>B�l�Z�������T��^�LxU����XV)v�dv�B�����B��e����Z��r'����c�����T��G��E[;<V�����YX�n��8x������^a���V�_�w���Xg���Y���=��Bn�c*_��u�2]:�|��*`�0�Y�C7�����<.�c���vzX^K�v��
]�������Y���]�D�V������V��b�� �\�wzL�mp�
Mo��|�� ����-�3�D/x�;���<x�"XYh��-�Kc��a|S���MP�3FsJ�i�lg�3��i���������,_Fl�Wu��-/�*:gg���
��������M�Y�+��q��sN^����jc�����2�����[�����O�B�P�]t�P������q����'���T?�V�0���i�"������!�,xzJ�O��]��v�>M�1LCX��Smo���Z��s2�NKd;��1����N����GBS1;���-�����~���EP	�4r2�NS��D�H���_s������ #�-nu�D�.r��IOi��|Jk�����G�Z�[�6s��}���`�Fk����������|H�W&hjr���������-:)r�����{���~g�$������;����;N���]�Npy����w�"L�����J)�<���J��V
t+�vC�9���`�9K���>��w��zp����i����}xLk�vx�MS���
��!E�l���
�E�3P��'�"��-�������B���-�4U#L�I4�i���&Xz���E�W;4��R09e0��j�	�=a)�^h���
����u��l��i����P��6�|����OKd{F����,4�������`WA��[��3}Z��`��i;��������|63�X��M����;M�,��
�����S�?Jt�2�2�F`����f/�Px�KsR��T
�EW;�*�����V�u�����^;}L����#W6dk�v,z��F�������V����7�����$�6a������kg�$�G�����i���AX����9����`o�� ���I������-u����j�}i\���'��r	�V����HU4��K*~�b+������v4u�[������0�1hh`j`����FF����]A/h�KK��|������EC����vW��V�������A3h��1��Tm��UU�]����@��E{�
��i�l?�$��'��;`�x�����1-����fr�b���e�Z�iW4�N���H�j;�	��A��p>�a4'����b��_�-�
\�V�d�-�J�~�����o���lN;=�X(4tfO���c���w��b��N���_�R���X�b����O�Gc6��T�uH��]�f~�:��1���5*�r��?L�T�,�$��Dsf��+sc!�Pn�s.�"���xbg�Ob���Y�=XyK�.�<��
)���f�Q�,�"6�g��;�P�
��K2�pucd��)����Mlx��#�����6�>L������i���N5�������.����~��-�~Z����SUx�(��E�CJ����lT`Kg����_Sp�!/�4;<nAbX�t��g���mV!�%��|hQ�e�@�YV�;��[�9W���5+i}�����
������f����k.�aS��It�����`2�������<�a)Q�
��a$Rx6o_��\�~Z"[���
z��
k�hJKZ2��������`)Af��LaXR���I����� ��xe����A_��^���
��,�kX�����O����`����-�R��L�V���`�\�i�6��6�i��"�P�3,3;X�����w���J����\P�V��m�D�B�jX�v��M������M���F�Bs��
�z��l�P],��3[h}1,Q;��@4��I���l4,;����PZ��%�dE���a�TjDH:^��0�,����������<�]LeO����tW�Kk����l����Ao��ut�ud�o�A��e���a%���HE������*%�B�k�#�����aS�I+��e
��-�Tv�i�����W��/��Y�4��e9t�P�:�;��9���O������]-H�k���#z�|��HA,K/
o�Z��n���*l	`b�(�k%����B��`���f:a��Y�m7E��&l��>-�
E�Uk�[��,,�;�5Gle�n6P��)���a���
k���"� �}�	u���=�m���e]t�"�������}�9�8k�B�s��D���-O5�EC{8��$�&���C���y
�k��]�T������>��_�����`������-��M��������0�MlA�sX�w01�_��7�����B�Y��pj�^�`��H@�]uw|�� �;,\LS:��zW���b�������A�0W/��*
NS�������u����R��/����b'����C�R��iym>����i�F�W����|�t�K0������Q��}�[4�4UP0A�o,&[4j�_���	��������
;��}`�q��b��h�+,�����?3hlJ��U���Q9i<�CQ��������
oC!]��G�;]���%��1m/�����v2C�[���@tv�|.B���,�MbXh-[��X�z��+|mL�D�/����xz���`�zP�kE�w��d�YI{�;���	_YI_b*�x��+���=���
�������Z�z����{����/b7���Ae����xS��ly��Ribg�8���P!M4�@/~�4�:���4�[��iym-��n��b�X�<���}��4�@�cR,�|�q+[��E��=�]�.��+���.�Ria�q�p���~�`K����L<�����k;M��4�����}����7M+�&J,z�[j�
z{����~����V���I��^��������!�n��,�Y��{Wj&��=��
_�`�h\!]���xZ"�00P�
�K��0e��t������������SF*�0ImU�,,u>`���8[GJ����g�H��G�8%����t|��d�����`[�BO�iS����>L�{��/�qh�J_�"�a���	DC!l'�[����0��*4��HL#]����HO��i�6�`U��7�2��'P�R�n���
��a�`7���0�&���;O�EaYwZ�4L ��;,��3v+��XL~@;$��5[�7�����H�B��m�`�E��c�`5�F�/oX1���izk�
�{�R�=y�O�7���-�6�`�V�4l�H�������^�1�[�w6�������0�<�h���lA�aZ�����L%�,���ev����9�g�D7v~�e��I�H�f����*�O��xu�T���"�������]�v0�(�����6�k������%�^"��v��f����mty;�e����iy���E����i�����(y	�bY�Rh���r�)�L�0�d�}�c.,	'�1���-�!�E�'��D�6=b'�����u��1�O��l������,�'�e������g<���iqm�2g��B��i��	Mb���,$���iz��D��p����L�^�f�X�0��w��������=�j��
I/�B��	���}��������������D3�P��S�f�2�p���-8��������$�D��E��sf��b�B��i�}�#N�
M�`;K�����O\X"�OVq*z3g���e��m�������K�Y��4�- x���|�B��+�������O&h��M�J���Tmy�@�i��6�������v���~!�|ZsBsF�����'������lgU�bt�k\��jU�s��-�D?�~�b�������WXL�C,>PN����i��	c��M.X���]�n��[����
&���Yf��\0x��� hZ
E���,	�,������l��>���>�T�V�`��6��,;�O\�P�/l�+����7��j��u,��h�t����F.�����#���A���8=��M�[):K�����	
��hl�-��
7h��Y���J��t��	����4�w6w���NVw�9C�Y�-9ZN�k���x�(����je��Nzbh�j��9��F�E�[�i8�m��t����f���?=��'��MC1���:M�v����l�PP,�� �.T<O��Oh�6����l{���������������O�k���j�
��;���E*�PX7�j �T�8�B��MX�J,����O����N�k;��GM=oj�/*�u*==�m\�v����}5��������&!2����	���	P�4�(��'T�*���L��
z�b�0����79�p#P����+�tn@3���mO��B���^��tU�w�
������t��	��A�0�,�	=�]
A��m/��R���
��H��U-���������R4� I��������;�>��������"�E���7���*t��V��0;2�l�����/��v�[�g�L�]t�V���a����+yE�g��~%h��qZ����Ex���O+d�:�G�M��.x��������'q�'������ES?�x����6x6g���g3}y��^�|F2�r�P�G��� �=�u>a�����{�y��x��)�=�z�J.���'�
�o���-��Ln�I'
/[�9[cvy���4�]��^9��-��z��<�������;���f���5\l�e�r�8 ��$v^)��`���+�"����4UA0�&�JQ�e��xE���n�L��}eT����E*������oig����M]������i88�c'-m�Y!A���z��&�-�A�-�X�z�J��[A*|Z�y2�f�����/�KMcE�����1�w�`��Bw�i	a�*\���������7]r`YB8�>�y(>��
�S�oV�6�h��B�C��Xli�|�@_@������t;?M��
<2���N��B���������>��t�h��,�E�+���n��7,���/��5�p>=��f���_�w�J#i����z��}�h*A��������`sj�i�lN@�Du��,l�e�nE�s��yO�k����O'1�d%��j�����tUcd�%�7����m�e��Nk�0�[lcIb{!��!��+[t��N�������Slg1k��TQ��l������}���1#��n��}�b�h��1������vYTw�?�7K��Y���M��`YR��Q�6.��.&�+�f��X��Slg5b7������.�/�������G�^�LV�,��|�V),���������b;Kd��t������-�.+�.xI��]w��d0��j����D�����I.����PG�.�L_��]LW�
�5��7*��b�[w19_���-4�����b9P�SF�i4"��tJN=��s����t�*,��{]�`�v*K3%��B�mY�jE���U�����(�	+��uWK,��g�4�H�
���)���O��zny	
���O4��fRMBw2YN3�I��A����]��4UU�`H�������H���s�����>n����Neg����\��Y\,�+HJ�����8o�yS����6
��+9P�����E�5��������b�N�oV$6�i�j9��R�ES?��B�jYt19P�����J��em���D�z'�
Z�b+���	��.����Qm��;��KcW�S��+.FKM.��#��_s���g��P�\t�!����b7ti[�%�,���o;�����,���'K4&�,���+��u&D&�%�
�J���Z����������&k�}\�s��i�J�p^4��2�r����Mu2�%�
��M�����A�9�e����L�����tV��Y�q��s�i�lM�*f�O%G�"�^��Og�%��0�+��JL�B�P%B�����>L6DlK���1mM��u���42���������T:yZ\[1�*,B��E�
��6�Fi�����U�RXx1�r}����3��n����������I�����]p#��<�����J��z��C������2�u���V�bE\���Z+���b+;�u&�/������*�I�y��"��������cY
������%X�s6g��V�v5L���=�O��F�i�����i8���nBt%u����	6��?�~�
v��iN�74���������`��8���P	�,��P�h([/�fB'b��l+>-��uh���(F����"at�O\X![�T
+<�m�M"����$�;��V���c
#hbaQJ�YJ���>����h�jt$c�4S���?���l�U��Ry�Ji��8��
E��2=�
��"��b�����N�
����ViH�)��@�	6+���f��O5kcG`���i�6��gc��,FiBF���<=�
/��tEL`Y&rA��hX�,�|����%&.2|S��i8���A2������L[kL.��!�����B��e��EW&�9���>%S��[���g$��
U����g�u9<�u14�DC�_�z���%<X��+u)�]���t6�=A#C7P�t�v�8��M�����a���oX���� X(
+�Tf�����
��&��4U[Ap��c�+�k��.&�*��}{�a�?�S���B6�`l:�V�@Y�u����E��R���<�[�r�w�4-MZ�5�����|g���w��z�*AK�.�:��.|����}���xs��o���Ke��c/�X����~g��F����;*.��Jv��x��
��`��5��~��\�i�l>��6"p��lK��i�6���3�cR���?H$�T�:��]�H�����S�������xi*�tm+���'&k+z�-�4��	Xt�t;
��ft���Y��Bw��������U�Z��
�i8�������
�EOVKa�U�e����<*^��T������)o��m�6��j��������I����bv��e��~��{l[�
����O��J[�m�X�^4��;X�Tlg��������e��b������^b���r[mu��N��~_�j��$�����L2���D�-/���|.�c��&R��,3]ln\��)!��������9_���ez��E^7��.u��lc�;�wA�v[ v���R����m,�Z����O�i��N5�r��{�v+�
�0��d���j�I���,�D,5,.���s�~=����z*��{'��Dd�U^�@�
,��b��M����i��Dmz� �A@��8���#yY�`�qYm��'�/����:���o��������NUb74I����;,�%qsj����5M�mI���{��l��Qq�Y�6������
^�B�x��sn�U�2����Dw��s�NS����D7�m
���@����-�����V�9�4��	&�-����)b_X(z�Wg�H������>���6���<�D,�Gi\&�h^�5�T�{Z^�Ot#����-�S��o���6\�0Bd�m^�����)m1�!��?�w�����SO�i�	������b+zd�
��8�]��NV
(���C�E�m��
�;����D�Y���J��������Y���9�������i��S�����X��hzM
��!yi%�p�II�M9�����	CAOz|:�������c�\d	���-%����4S[^�"/������1~k4oZ���_�B���X�fy��o���@��]���sfu��s�F��2��=YI��[8M�L_
��z`hg�YN��?��I����D�3Ll�=������~#YiV�#6����tyI��a%IM�0�*��e�7�KV����nKCo&
-zB�W�u�b�4���-�����/
�������n��Yl$��������W?�;W>M-o�=!:Q���)���Eg-��p6'X���t����M	���1I��bR�LrB,<�%\(X�V������7>���������MDA����p>������I��+��
����+��?L��7�.y���b��M?f�s�����BS�m�����ES����a��d6���+��=��X�B�'�G�d\[�8N?'���kg��)�����$�_X�,T�[�2����]o�V��LM�4�K��5.���m���J��)���O9xU�B���� ��0��zB����1U��Yt�Yx�;��x+�-V��0����R����ZMw��W�to��%���]��ZMwC�9�,I����_�5|i�"C��*��y���/����g���3�� �����|.B%���5�7S��`����Xh��:�n�o�=&�Ef��Sb��6W��-h�n�%S31h<
6�;�����zbS��iym�A�����������Tm@A?`�T�cJ���e�L3�":�2}ga������`��T�����AO��/�dx�v����1m�1=:�4�4�;k��j�Z�R.Xz�pk6>K�-���s��	�ay%��i�6c���hz�.��Q,5����A.�t�����xS�>M�&-��9���A��DC�g��N%�aK�"���zr$��b�_n�������4���������A��lV{;M�����e{dN����m�H����-�L�X�L>��p6���h���#C�Il�����Hou��K,<Y��E5���D����u1��P�����C������5�^���]I��l1U�l1��F1n�)==��/X�S��Z.y��2,
���*�Ij��=�����Xr���^(-������_�(�M�C�(K��e���;e�Y�m�w9�����S
��LG~z�YZ�;;R���D���X�'���e
���������z������{8�2����#BfsW����b��s�������������unz8��a� ������4���;�4k%g6g�gY�/K��Hi�n������M��fY$�����]���w���oQ���52*U2;Q����|�f���?��E$�l:������4GL7Tn`�u1�CS��������B�*�4��~O�l����9�����U?�
($�k���jR�3�f/�i�l�#A4
j�e-�>�_f��Z	�#I
���6��2�����e�?�m>��bz�V�6RZ6�Q���ERZ�"z���cP���	7�`Q*��������9���M#A'�,2i67Y��f��
�By}��o0�����V�f�����0��j�]��m��A?(��,��e�;S�h��>-�M6T�hz��q�Z3��(���&���D6��0�������+4�6��,KR�e�wP�l����=�������3;�I,�{�`[��A����p��L��I������K��{b�����������H����}����6�&����Xxk��6������ck���f
f�������C2����9WX�MM�mh���:��}��>�^1�����a
n�^�����,��8������c����r����r�to�a+����1��6M���
��H����f�`#�e��
qN��`�w�GV�fE��Tml��a����;��O��Fgf��y�l���|����Zg����o����������6�a�S4� 5��;��f�wvA�V����i
m��s'��p65a�S4L�v�KV��J���6���i�l�
P���b4w�8���6�A`�P%��B*����DjJ;���������I;���a�@h��YL�h����$��Z��C���X��*�.�[����V����;��1������$��BO��4�ay��L��S�a����w4�z�pjv%��7P�BS\l����`�n�7�Y��x���6��t�_�m=����J�F�)�D�M/�/f�p��K]��K��X�Jp����3U�����|�����E�5jX7�|���!��M���;{�#Hb�po�@{�M�1B���>������C�s�>����iZ=���EjH����>$a
�������	6+��,4�p�b���3|8���ho%�������G���+d{���?]�,��
/����vp���f��#^��m0F-�oX�l��N��\�f�X<�>Ti��E�����S���`��F���`',�Ri(xa�-x�
�Wz��)�:���
vA��leumx!��_���`�
�CJ��bSQ�iym��o%����YhEMU�a+��ME��4�:�C'I������}�\$���mK_��m�������d�Mw�c��j�����GL���4k�h���`s7����A�q+"�V5�M���70"���,�����qc���f���a��|�����(�,�����V
��y���q��-��W�;��qX|*z����k�RD�i����lS#	{�����V)�Y�O�����S��C��%��(�/��O�k��&����`Y���q������z|o���E�L�wW�V����U�������l�BV�^���j1
]�z^�Y��r����O�������O9��Ba�"a��q�k��1U��
��NP�FY6��%�
��=2|L��\��v"��<�9����q���0�*6m*����	-��g%�h�P����iV�����m����Jm���3/E�L�`�����h����?���[h7.$�H
O����/�Aw�GK���t�
Oia���gj�@�L�>�_��f+��
E(����4�
/h����h���:�:�I/��_L��4�����	�73g��b/w�������ZboVI"v��5������?k �"�xYr?g~���ibs�x�,�(��a����7//�j�l���x�g���cv?&:�D/v���b��,wKl��;���
��k`�Q��K�i��SE6�/]�D����y����*?��D���3��S�������D?)�~�����'��
O�������y��a��{�����b(�,H-�tzYq�b�P������^1��i�%-�AO��"?���f�����E��dB�bo���X���^(��������	x�����e�����p
���e�����j�������s��lP0�:��\�������_��j�$�|G7�!x������/&_/z0�(��e��e)�~b�������	&�%�)��\�������9��N����
HsN�������5����=Q8�,B%iiv��OH��2yY�br��a�V,T���SM��1m0�j����������KE7����Y�����"��p��Ec���Y��p���;;�WM���/��_L��t��e}t�e~��.�/�:��k"����iym��oD����.;KE�e��z�M��_p
z��Z���(=x�6[9����s_?��R>|�D���kK�_��3��\����Y����r��D6��g���g|g�GX����Gu����e��.�����Y�qY9���8��K���6.�:�fubs�w6Y�����j�E7x��:K������U�/j`�K�2[����~A����ah[��,E���������}Y�j;����mJD��v�oiJb�hrH��F*�f�M��=���"G]�u|Y���s�������%yO�c�����F�*��0���k�	~]�������PP4�\�*{�$���zV��8\x��6+o[a��b�N��	���2��{��.�c.��Ll�@���T/����G�<M"�;	D�j��0
���]0��
��.���m���?A�VJ�Y��}Re/h�_V)��t���]���%���6���i�T��_�*�+�S��h�Q�UP�(��0�A�2]]�w�����|6�>�h�L^��Go���nIw|:D����
x��J����/�ouY������5����-,.��S7I�4�c>f���-!�:.4�J=��/x=]�)Z��E��\:+�_��t��N��C/o����Yx���V�+�_L�P4���0�C��L�XlBO+d�
������/x����X���l��Hj�J��m/�:�������e�~�IN4��&��7��S���?-d��>�6cdX�;���W�d?���S-�i8��B�Z��)�-�f^��;���$D���~�����<|4.�-�����*��;=�M5Xz������M@��D6����
c����]r�+�r�L_:'s����[�~`~�F�����d
���}��18+�C�g���42�E��i��4�����S�=�X�X�p��+FK�_��$�������u�$�
�������Q���d�`{%
���L�
z�%����/��2j���9�q�����0:%�������4�T�����"�}^;��2TOS�=SW�\�?�`s���c����K�D��
���K����`�������N2��n+��7������7,���D�-/}����4s���w}���	�-:k���V3��&�-�Vj
{��:z�qw�4�j�t5�a��X���Y'����>�a>�~m�q�'3�i��p���e�azk
�R�?\� }B2
a�0r(
�h�M>=�9�!,:��~g7�!�])�pzL��L�W��������T}BB���G������A���v[�fzb���;
��yo�z�f�B{J�9���L��!&Y�]��d�n�����3M���-Lp�j�T�9'�ai,bwz�NS��*|WU���]��t['�fwG����5NS��*N�z�j
��_�\�q�-m�HD7��{3W������B�<?o
���w{y����x����_�J>��SZ����=Y�@�Sp��V���a�P�Wl�������k.i[v���c��j����D?���|�Bs���)mM�$Q��p���z��UJ���4��u����W��Y���\��������E���6E��Dtg
�9w�4U��M'����X���Y�;P�� �p[�f�z��[y�����xY������mI��I��^�@B,�J�����A�JGDO�}�X@^lvXx���$������E��jdV�"vs�������\c��4����T?�fC��D��$��R��. ���������S],�:mtoe�������D�4���C7 %�+��b����������=b;�&����b!������t|E7�e�Z������$D����lgfY�Vl%����/��=��l�~9��	���\S����E7�i*���Z�N7��c�zb)0�+����GV�X����a����e|o�x�	NU*��MM&�+^����P�B�u��g����mD?t;Q�g������p�n��Y(�-�{31^�#9�N��\�O�\L�������j�f8M#���^�pPQ	���(_Z���@����2Q4�������x������sA���o���8����]iyOS��]�A�BQ��%�����L!����-loFE���X����y�����������la�6d��V��?�5fo��z�E��$��fJ����)�wZ^2����H�.���-+��W������%h�Da���eu���k-�oK��V��G��d���HtJ�b=���E�������[{��%Dx7\��Uzd������u-��i����Fl�$����jE/&��-�{K?Q���y�9�n�k�
fb����`7L����du�>L�4�����Lbs�����%)Q����ca\�8]4}�U���4�k��j%6�/����K������.z*]pbY����u��p��e
w������!����8fr����Q������gI��m��1Lz@�x��:���{��d
��/DW����G�0YZ���,����/�	�:?�~��h����@L��i��������eB���)��.�`S�������l�V�f5�J��K$o(Fa��T�#�J���i�Q��v@{h��K��.	�I���6���h&r��a�����/������A�T�"�o�2��
��`s����f��%2��
�V�e�J?LWZ���B�o�����cZW�Mw�`;����o���1{=o������aEX�!M��m����w������r�-����9
�������"<6W��
�7��SJ��1m�A�����~�u������Lz
��ah�|���z�J��%�
#���G�&e�`$Q��,�����K��p�R�/�h"�]�b�Gs��w^����t���X�F��l������&�S�W�X���"�Y�%�Z�P���=X[U���&��5�����/Z��������������6�u���}�W� �^t	Mj:�h�Z�IY��az���a�����&a6y�oKdc���^P� �Q��XH��W����On�������*T���*(����x��������a(N,L.�{b���p�CA4�@;��ki?LK�4�"E:�6b
��S����p+O�TN(��=1��5n%_���}�u.QA�RK�?�^��p���aAw���+�c��H�������8u!���e�y�r�`;�2���.��o�:��o��C��]��)�}[!�l�t��#�F��������P�}�G�Ntg��bK�;Y�Il��Q�s!��YA^pE�
�3L<,���f���
=^!�g>��%n�5��W#8�����m��S�D�q����Y��Xf	�a�f�����b��,@ ��d	��  ��1�1�D4� ��Y,����H��
�5��pahB�����]8E7�Y����H�d7@���m����@��[�=[i�����X(V4�;�9&�~hY�g@��Y��c� �w!����X��h�H&:]��]Zs.���{����u������L���ZN��%}�6V�)v&a����b~�0�D,l�.�#z�7Ts��jDge��p6(X��h��#6�g���Y���Y�"h����(��J������a����
.��
@�N�� ��G����1O��7x�*���f
�p���4G�[$4x�U�V���Y��Xj�?�/�����rRs�(P.��9��SAc�/�Y�@����"�.Q��Eh�����d����^LG�m8�m,5�4+����nS�����D�~���
-i�H��P������#�1�m��e����+����b7+,���o�k�����Z����2��$
�0~�������?�;���,,�R9�������+���Mk� ��d�0Q���m,XQqs����P]����,@K��G�vz��Pf���������m8P�Y��J����
^����7b
LpA�)�7w
�)3�Oc������(�fEfaH-X�~'��Y4���ws�(�&z���`wi��A���E�����,����>h����e��a�^y{J����><x��:�V�E�����F�
��%��<V���x�����%��\���fV]!:}���|23��Z���r��T}>�T��m��$��a�	�����w���4�2��$n��}�
)���R��Q���������D>��L��
�����b�Y)|hVj��U������*�����v�[��0�Y��.����	���DO��6K{��j;�Q�)���C��/���e��D?)��6�����d� bas�f=z�'��K���/4	��{�x�0J(A���������^�&5������I��1m}�/����l�b�Yf�1�u�0n+�r��������d8�`�)-�s���*�w<��������a�k�+�����1�t-���Yx�1�C�
z���x�m�6
��&�����J����LT
zA�O�;�#���`�e1A�/c|k�t���Wh���#3�B��f}i�5��ra�|4�k�5�1z��K���T{��!b���<��]�����s�0�lVu�-����9U��(��S��e�����A���b���-��Vu���}_�x�j����l!4h�����^��t��4'�����j��`�1�9�]Z���k����wK�0j+}��C��
f]9���;�m�F��Gc}�����pq����`a�Q�9q{LL�Y4�1���nS���D�M'�e8������)���[��1=^���R��l	��g$�2
S�}[[m
O���I�~�lQ���-tGi�n0�/)_��	�T�-��`!B��"[:v������$�XB�����it%���5n%q�2��a�p�{}��^@���,)����D�p��c:bS��m��D���2~��z�(�T\��r�%�_����
�w�T\
/���V:jI���`s���Tm�@���<�`�Z6wMCV�vhOh�P*Bs�����,{���7/i�?5��t������5$��{��@���b��e�(}��$�
�`�����%���A���C�G)&�0���a�.�Qh��,]���/�������u�a+3��5�-(vt�vv��+�n�}<z:���n�W��*�0�Yl.��M�y����Yf�XXD)������^ 8Q�&�{ I8�1����3s4�wu��mg���-�a%���%
_L����m
o����zdf��Lz�sf&����Fn�����c	3��@b+�_�5us����v����O�M�m$X��.v��g�;�N\�����e)��mu�.h%�\k~�B�nY\�"�t��n���b�%�{�+�-1{C���e�H��]%�a>��)W�L�^�TLt���
g[�L�(���E�6U�L��4+����6U���':����|F�W�������X}9�g�Gm{0�+���K;�/=Y���J�\�(�����S����4kV��9:w�y������o�{���f������H������/���U���<2+�[2}�#J�>O�V����c�~)|���%EoKd���b�^t��ZQ�yFM�[7����hVJ t����K;��
3�����@�\A�A�SlV��M�6��
��BQu���a�A���<���z��	��d�b'K�{X�UlO:(�%���*�D��eM��LDO�% v�cS��L/Al�L�&g����<���RI�X������Vn9� �0|�d��E��[�t<�����D6�Xi��
�����m�6�XQ��	O�VRj��O���r��M^�=��y�$�����L����p��)�1$z&�6�-7&`*:�I���#F��,��Y����:]�+�v��'vW|��\�L@4Mr��*<N�b�W��k�����z�B���m>1�
�����njg�z��
�X��/�F�Q�lnx[\"0h���c����X���WW�.+�vVJ#�@�?�:����F���WR����t*����magZ�0��ae��������i;��w��at���2S��%�������a�+4�����0n%��:��2���*bi��5bf<�ySR�mym��
M����d��|S8�=�mE�M+z�40�VKc)����r�&J��>f��9xM��V�����=4�#
��F15�vh"H�O���v �|f1�R�Yd��pQZ�9�NX�"��pc�og2��+���cj#��o�2�Eii
��a���6�-�nO�i�����,��hQ�7����t��oj>��r���%���D��b���!1\�������"B�����;�����*��)a���A�
q��6%�w��qr���f+B����S��p�r"vTR,������)tV�g:t7���1wq�6`N�te+�ue;�Lz�pd�0<�a��z�W�~X
��oJ��i�ni��4DoX����l)�aI���w��de��%��y���8��v�Ht��
���a%
���$Kq���H�z��(��S�Y��z�����m�>4�]0�'���������%��q���C_��-zq{L�����������)
s��[�7g]�n�+R���������m���v�����{i��h�
vC� �e�4.,A6oc����;���r�BI�y����
D��q
�M=���7������n�^@���U]:���|
���IN�'�%��+���/�LM��
����+��lX���G�	s���@�[�Vl/��%�@�@��+3���q���Dj����k���i���wk�vXx4��I�f��O����)�Rv�w�	z�|��p�c`������!�}{���t����j�*����~�y`����e	�g�h�J�����Z�n���o{���5nAH�[����K��RAa-�,1�r8���,T�vV�r�����/�
��br���`�a����e����v�O��o+��
�?D4�	=��!v�K�������14
EWzn���
]�b+7;��Dl�Q��`�`	��a�����L��^~���Yy���//:NDOh���?�\N��yuo+4�B�;�~/���`k��=�W�#��}�P�\�fN�[���W~�^{����a���rD7�H���������l��:��<X����b�b�;Y�����dX&��=�W�QY�������d��*f�(�~�-�9��i
�BC�{���<2g�<sa�4���Je����ux�BHaX:w6~9���kba���p�vC�������\����������Pl�c���&}i������kY��<�=�m>xQ��o����Y��6U},�/z0/����^�E��fM��Y�{0�M��]�{�R���r<�B�aXo|0������W�`� ��1m���6h(f$v%m��Tm}1��N5�?�����q������|[^[n��Jt.#x�.h�k��F���������C��eu���P�Y���B6�����Q(������t�Bn���&�����+��T
�N��a�%X�-�8�`x-i�ccK$	m6
����9��������a�g�0![,l�'6g��gOA�vX�{�������
��qjOMbX�{0=!�
��R�����7�f�Ec���!a����
DoVN`�I�x�?�P?I���m�+DC�N���W��>�bGi��G��m?y�f���lc�"bg�~d�����+7+�V�/:'Z�����D{D��������'��(s�`�<��c��Ff��b[�����Lg�jW8��z�pv��GO��`s��mymA'R�Y��={��mL#�l�M�����G^�9������������ka�����
hsYqNu|�����:�~b&^)vT���t�������`'�<�����������>�`i���1�=�����6�J)��p�m����\���	[�-9 �W>��t��������ECiu�p�>p���^�p�&H/�{���Gf����7ip�.��P���65a"q����BEm�0�]����a��A���5>|�x�H8�I�a��V��}����W�����@x���6(���m�N'�BS�a�3CDC]��^�bbZ�{@�6h��*�@Gz���b��x���S�2M���/9����b������g�����E��D����`R��7�S{�E�Y����|�H����&��Cy��l|A��d���6&1 ���K�=%��V��������m�^n����j����r8���7�
9���i�$j[/�f���.x�Yk�:�����V��",	z���`7����@{�����-M��4�#�!�C�qa� ��.o<o�j=�k��>0����`a<�+0�%��n��n8�����N��f����]������D65�7��rvn�����H�P�L,O����q�������iXvU4��L�_����)������V<�%�O7EI������:�������fA��Tm�����S��6�Ou���<4X?TW.���+�����uKa��v�6Xu(1��L���}
���"�n�A��u���p��m	h�KX��[���3�����?��]J��2����d���s�"�~��mi����x���������GR�/�&V�0kU��-aywZ��wjdLf���!m�@����m$��2������xdH[�@[~@kK��l����;�u���5�e'�4�+�a�X������G}f8K�p�C_k#o�k���A��P�����N5i�W2!�?�k>h��G}`�^�����=���z����V��u����g���GQ,�n���o
r��9y��B6��Z_��g�[��Tmx����=�
��q�>��������T����"|L�����D
�~+�[
��^��v9w��p�aW���Mv��)?~J��������>�9�������a���|��M�y���oXQUln^t�j�T�yK�1���t;<k�>2������5��?��@4���f���%� �0-�?�I�a�V���G�b�E�3S�0[h�=�n`2sF�CO��4���m��S�����1�=��������=��c��F����wZ?���.hXh3-H��}R���1m1�T�d�Y��6U�1�i� *��+�j3��Aw��J���${����iaxj�
!�iqw���>'�v�{Xb��TDr[!��-�_Z'�G���X��'�t6[�#�����BF4�/���M�Y��0�B��iI����E7����9������,LY[i:-�?��N�d{_���|�"z7\�
�	��m0-�5�D?����`iw>�IIe�%��w��'<�mL�U��=1��M������c������0���rZR~�D4�OAI|Z�=w�}9\�m,$������t����v�g
����,{M�f��bsH�=[�N��C�4�04o������j�qY��W+�����6+s�@�������l�����A�f�bw�5l�}��'��|�����M�#�K+�����-��E����>4h���2�<��v����S}p�i�����>�����\�l����0��n�`+�:��O����V���a����=%R���r�
+d��e�M�cv����T$XY![m����������m������'pn���=�8���6��.e�����R�D��i���N�wZ?����o�����8���4^ZQ��67�~�.h`�_���L���V�H[�>��5��VE!�)���n�������0�6��'��/:'������s:o'-�a�b�Wh*�����'Vw%�a��b��VD��0N���n�k�������b��Y�n������FK"����E����c��1m|1Ay��C��
�U�u%�`1�	
���uv�%�M���FDW!-
?a|i<���������������a�1XX�%����}k"|["2�E+�xRX�)�Rv�WU)����+�O��9��Q��l�������J����P��4t	��(Ay�%�n�����*��m>�E/������l������5�4�F�7���Tm{A?[��Tp��Ox����
�k�vha�M��m�lz����|��g�����I�f����\�	�A7xA�25��,���q���96i���D<���,�F[d���
��~4�[�mum�|��7���0�N�����3m�����~����LM��Ex����D�Ra�u~u��������g�YbhKO�b4.zJ�>e�����"�
���X~(Ayh7���_��iA�||9\�vBB���^��lM6��C|6��Z�6��j�*�k���}�H�X(�,v��.�0E%���t[^��t�"<[��&,�z���r���l������pZ���?[���B�B�c�m�@���'t�oIu�����O���������ES�V����/��{���{6�2n�k����0:XZ��qS���1miB�6�^\�]078X������;�mumh��L��
~7�9F����>��52T���0��1m�Ai�����{vA)�����S����C�hZ�(�P���j�Y8�-�?�qtK��p6�`�~�S��u	�C���yu�������i��t�Q���x?��.�y���s����~�����{vU�`,�?��)h������6S�������v[E2}���f3��
���i<_#��?P�Vs~;��!b��,��r��������z%�o�	?f�p�6��f�SV�[����&�=-I?a���R����QC���lY�	m%�������|m�|{L��0Et%�����8��^9�|����sp�:���0X*�r�7����D�������^�wYy|�����=23����H�a�J�=y*o��xy��!��f��[���?�s&#.�)xA���}��?L��Ln������<�(��-f��N�b�\�e�S��C�-�m�[.�3��PJl�.w{�������'����"���E��2E���s���
c�vf��eO\Y��%��(x8������\zn2�n��s��m8P,�@4�z4�����@�P1Ol/��Z�Z���������V-6�P����������n_�x��E�i_L'[��rv���`�5������[���E����^j��
������k�����bO�h}Y�&����+�P��,���������p6(XA�i&�!������
��>���$���Z0}�����{g���b�3)�-��69�n�k���$���`���,St{L�^���\:�D�],����|*6���D4��H.�4U�O�:Kt+�9Z�<_��-zA�Rr��7l�S��&��
�a���`bi-?p!�xY�|A��5��c��b~fY"�����]����_W�-k��b_��������q{�1������
���G��
�N�`a���J����8l�)z�z.���`�76	~�)�-_,AB��pi�3���S��|������j��*;�M �s�@�e��m���e����!�Uz�m������!\����=��!1�������,���>��=jO����c9S�;�a���m<.�p#ZY:>m��p�D����?j%����������JO@�N��D,���J��,z�Bq����b���O���^�b�h�;�j�:���j��������r���XI�XV�d�R-����6x����~��ln!t{L[�L��4�U;a������J�b�X��/l����\���a���e�����E��h����{�:�,+��f��~�Q`U�����
�UD��j�Y��Zl��uyL�x/&�#z0���I]���6&�^�h�G���hC-��]��/�;.���L�L�������M���B�&`��h��lP��j����C�,|�:�R[��_�_���{����y�ej�bL��vx�x���PHt�d YL{��[��� ��Q��"lO���z�t[���-/x�
�����b�ba��9W,[�tKP�<U/X8�Y�`�[4L	+r�}��q2�ndk�3�aP������T:�&��[|���V*��$;�"��=���1�=�MMx�
�SR��~+�W��V*}����X��N,�I��C��F�%��N�@����7�����x����
+����4����.}�"�H���M��=������E
nKd+F�$�
��������$�MwzE9fK�/&�(���I����|��<�%�LX]�Nc�����2�/��#)��ek9l(�,z���@0?>h(8&6e��j;&RJn<�B�G�Y:���6E`������-Zz��a��K�m�lO@o���K��|�������>���a��X���l��te��9+b�M7�h\�����bb��+�Yl�S�>0B,�
���~Yj�����~��P�lYj�pvYj�����]IC�5��J�4���-������������K�f�/|F�oK/&,m��J������D������E(�,�*�m0,�'��g�Y{���6�`��hx�v�%�qa�P������"��V^"�PN X��Zl�F�����
�p���/�����'\��
����#���L��j�j;*y���^L(Z4�+������6��t��q����R�J��e�n��az��sB�{vV�����������s�m���w���O
:���
$��{����T�������mN�>t_��N�ho�������Z��Z��Jw<�BoKd�F|�2���#���U��N��m��GCg�h��Cl�k(���cn���1�+z����\up�j�T��'����f���l�r�=e�S���t�R������F���W�Y��6�����U�d��b��E�-�rm+Ko��)�37�X�Z����Q����f	N�������eo�)Nx�B4a[Yz3K@4����+��t��7����
H
,���}�7�q��.�d�Y�F�E?�a v�oTlA�~[H{�sEb�����LDl��k[H{�0�h(T/
6���q��9����f���&����Q���FB4�g3[P��������Y��lk2a*�,]A,>�&V;
���"�Z4�b��m%���"��15r�������
��������J����h�UQ,�>���K����(X�h������|4eV��)b����P`S����$�Y�El�7���d��fi9�
������i�To����,������m �����S���?q!wn[9|3��9�6�m ��&:kL���=��&�+�����IK���J����/I��P���5�k��>���@W���a�� ��-�
�NM����,[z��m V�%�U2oK<���}�E
���(�OAvb[�����*Z�m|R�.d�o+Ko�S�r�n��\��N���,�� z���]��Yz��7����Rz����w{L�LSC�d��b;��u<n��x[z3q��R�f�Cf����	��� �--��M*��2����d�r��>4T�������v��T�`�1��-��nkKoV[n:"�R�*S����A7����!dM���faj��Z\�m���
�>����m��D��������nS����E���Vj�����2�.��c�6i=pA�m[ v4��`�F._��0�/���s[�y�S+�NW��B���k����������Z�A���w�
��c��T��9���=�f
�+�W��m�l�c�<CG{������t�+/��	Vt$�^�����bs��{�UN\kSC�4�P�@�N��m��E��?h�I{~����4�����i*�����@#��nID������c[�����_�@��M���BIb.aV���"4S�
e����t�=��E�L-z�"��p��`-h���8�1���pyJ�<o����$�`���R�����7�qI�&rL����'X���,��T������R[����>�ba#-��R@g��
�ASWb��n�6Um�����V��
l.��=�-/x�
_�����T��y;����-�m'�b
����`a�@�������=��De�<o��&�
5��&��
�U5n%]����v��I��l+R!h�����������z�n^A/x2K�����|\������k-���/�So8U�}Nl���������
^���M����}`M����V�Z�^���E��12�q����x����rl[�{C��4�1���!��6o����A��Z>����*������C�6��6xVK�K�:�nS����aK��u�{�^��W_�ySZ�mym��0�R/���c�
M~�������9���p�o�m���)����V����
[����n��T���������������Yiu�
#�Ry��f��0+S� �Ko������W�MPkvm���s�}h6(`�9h�8�#C��`�a-M�J����7T:�N3|
��OT(�43�R�P�V���g��	m��%X�
���F�[�4����=E����p���LJ[���LU�z[���X�-
������q6����f��
F���2������Aw��E�p���E-Se�l��EIx�
��o�=��O��n�o��tVx�
g���>�����Z��o���`a�����6
���Y�\���f���[A��XZ:W��Nt].�,�X,�
3��h^����c)����E����Zp������#��t���k}��+������]cEwf��m�M���Q���B�B����6�D
�>���'�XI���k���P������{����z�~X��Gf�<����X����,��%&������a����z��}Xr������=��p��6\�H�.��8V���������$��*s�^z�B
��6TH4�,o�OJ��M�&��
�D�����2,6�nKd��l��J����YX'�q����4�
3r�Y����(o�i��������6��6V�!�y�������
M,;�7n�^���a:l������E5�Nx��|�qoKd[��G��.&�B���'����R��|�XyyLxg��w�I�����]LK�`�L��T��D6�X���7�`�ea�pf&���#�QH�p\[����|p������b����1m�����'���*HnKigC��p2���,;?���j�����6����k(��D�.����g������a�%��]��r8�V&��1�����\��ll2�s�EI-�>+���.���e�lBgA{�X(=�O�.�E&	y,�W7f������c�Y����Y?�L^��1�`�vl�vy�F�-_��-Xa���e�B��*���W4~��o���Tm/�-(�M�`W!%�Xf�@_���+_��'&Y.�aY~b'�N=k>g(�.v%�mym{1�F������f������=�AC����T��MV�,z2M5��9q�*|���>�x�&5{q�L�Fl��oO��e���Z��YX��q���'f_J�YD���>�;;���������qaZ�d�Sy�m�lL@w`��b�p>u9��[s��f���6f��'*���X��_b�����VI��a/G�jd
l%�c���iA�V�b��*����m�l������-��l�A/�T���q��cuv���C������U�a�������J�����Ja����~��u��=��E��.��;�
G,����N���qS��mym/B�c�4��R��7�vL
���.����lAL�X&������{���u����������u(��0S�@0�(�pxv�\U���N�� ���������7�^9<������5����G=o���X(=�_�~yp����oS���6Yg��,����^��B��8E����i�G���R����`+�����s3�������@���7A��1�`[r����F��
;���3�R����������l|1Q$�Pd�f���c����f���L�`�}��+���X� �rx�5[��[L�@k$���A<r����j�f:�@��F.��(�~��+�}���P�_4�^K]���q�.}��������p>p`����Q0, |����	����"��5t#�ae�d�+ew�=>L�P4�x���6x������*h�.��Y���Q(�#�����73���n�k�iK����e��S�����DtQW�����4U�XU�-C�Q�y�+����J�9��n��7L$��Bb����`���B4�� zTn/�[>P�#��R�f�e��d2t�[���
fj��nKd���:}W�7E��H�����������6	`��d�+<�=>P�i+����,���	CR����W$
��{����q�,+���/��ra��0�a����y$=S8=,�{��{>X�]lV2{�nx9<j�^���0�������L�
zA���-�++��s�2.4���E��&���)}��D��o������>!a/�T}�v�%�/GK
9V�=0�����)�HA��6h�e^��V.>�}�����+UFV>�[4}"��5lE>����	�^��r����0��'���>�!����m�����t{�4G^3�
UQ������ek��(����>���^^r��(�f�AG���f��\����$ht��eu�,*�6��oK4�D�cQkrZ�e5Bf������k6����wyy�c.j���)2|���T�������=!�}�k�p��p��G���t]4�#������A�!�e4�E5�F����x�\�`��N��m8_H�44h40��4�.4F������/*���D
Y�O�?&�,���M�f��5��Ff�����I�lz!�iV�m�Dm�����&��^�`�
e)�f�6f�d�m��������m�=���X����s.�[^H�4�"M!�������F�d�Qb�����=���_����2~LOT6�72������Z���4����c�����������Yt���I��������w��7��6����������E_�N%��X�y}��R��>6�����r�vT����m������������l���O��_�m8[�t�6�X�'�E����6��a�)}#�FP����R����|��<f�5
��Y+���Q���2C�>�����d���iV�e6���gY���q+Q�f+ew���l���oo�(i�l������������@i�4������6����p����EnS��RAw�;kv����q��,���c�KD�l��%R|�"����oS����|Mo��iv�p�f
�b�����?��*L�z��e�?k������c_��n�kC���f�ifi��X���������u����qzo��`�k���,��3;��^,Y�����myml��,�	-)��k�Y�W"�EI�fs��mym���Z�#�5��l�A�@��WF������nu������M3=��$�}`�����/|X����n�	t��t�R!g�����0�m�l�B�&hhH-����"?6������������B�L�����7l�@�@4��2���]����1���c�7���n��*������+��
��Mo�G'���'�����^��p�'P������=[���&����74(%�}����g6'Z����:����E�v��-e�J�����!C�L���z��"-;�VH����������

uS���6(�8��AOKE,����qa&��$j�o����pA�J
��A���s*��(������%]�j�I.��
��{e�
�.h��{}��6����v
�����M�U�Z��g��@��"Hg�����`;��4.R5�{����v�G"
�t}����6L�zU����u,	z�D�`$����b��\�����|�C���!�(XNVr��	�)��������F�zf+���
`����|���u�N��C�?�����m8�H��t���`s;��,k������D6���i&i��&�m�>��=k��.ln�y��Of$3k��i������d��,�3[�/]�D`����7XI�rv�h��i�{�����#��l��J	����mN@���;,K�H�{*�i�Zw��N��xQ����	h,YE�j�M��f]������?�6��H���}��'U�����MM����B��U������Sd��y����0�����t.��
g�����UcU�mO b�����Cf[�
�����c�,��=mC�&ctC���6E���#!Z��
�c�H��"Bsl��sV��0�;�����\����.$��J���$��L�{�]��z�{��-3���=[:��-��$����5n�H���L��|q�RrlM�����]8����A"��L���joS�}�A7�7<��	MX��)? ���\�f�?�ba���eN��q��D.�-K�)�`>\�0;T4����?���}'����\H��X`����E7�<����{���b�k=����8��]�L�dp��m�b'}yU�7[	},����^7���g����f�Qb��X~����g��O*�����f��k���Ol2{��jm��k%4]�ok{��p}$���p<Q��b���u������w��2�f�r�g���*?�f9����V���8UUj�wH���{����&4!����c��KC�������f��������o��bcz��;s�����7�6���������$y��`�/,�O'��1[H\�X���RAwV6/v��+<e��9�6��t��[!��Y����jin�i�
^����/���0��������L���,����s��������bs���,��#��-�P~�h�arx���F#���������'z1i;��n�����c����T���X��}����?L�N4�3J�O��������������.�
|�

��E/x��J4o3��}�o�!�a�
f�{���6�X��h����}�xm������
�z��0+R�cV�������0_R4<m����~O	RW����@����\���V�����`���������E�?�"��2IX).Q��<�&�oVj�p�m�[O���,�}��;���{�D�����eUb���m�l�0�d���Nl�{���K�-����o�k�^�E3����n2�
I(:���o��g��
:]%���B	X?oJ��-��6�
����L+Pl���`Ko���s!����.��X���!�:fy��p�ej���R����6���+�.��o�]Fj�&�64����Xd;B����7\����
}�Ao&W!��z��!KiQNKB��B����Il���g]�Tl�B�e��{*��H�]DO�� �d���}m=1�?�����mymiB��hx����W?�{��\�`[�d����&���:
����5�M��]��v�g��p�2������?0�9h��+�&�k�{v'���
���7��������Ym[Xy����M�/�E�_��i��L�:wx��SE�BcQb�����&����n]a,�����T8�c"� ������Il������a�S�f�
5o��V�,������',����>0,�qm�?���0�o�����IS���af���9�������@kf�0t�~g�tA7�c��Lz��y�'=oS����Eo���xA��c�pZ�C����j{���t�|��
�h���h�g�`L�������9SFM�����/XZXl����=���?0�g��/|����&���&�hhH{`�G�����^�c�X��	��]msc}}�S��� ��-,�-M&@���;|����=�[M�g[e3����A�L����L����i������R�p��xX)����DAw�	����`'�"�� c
�{M���,\�����$��1mj2�3����
g�
�m��'�����TmAQ�5yq�&k�tyg�t����(	z�\���z��&�=
��k����J����i���$)[)����6U������<����E�0)|+�V.YX=��/������7w�{V�h�B�������S���6�j�X�0��Hh
}�s���bw�1���X����-E�_����>"����52���
w���5M��)��6��W(T&ysh�I�����5��������f}s�g�-�J�
�0�p�J�e�A��S�4Y�����E��U�����d�EXXl���Of(]"�r�*`�o���H;���]vo�kS�i����'��J�2���t���
�S������-��b�5,l�*�)���X��L��t��?��:���(z���v[^[OP�G��0�+1x�R=_�j��c>VtX>�����b'�7�������},��0�U��E�=r��oS}<U�Y�n�'~�bs7���Y���Sz���x���)���-��_vj
b���{���)z��Wlc�N�����1��|�;�L�
:����v��>,s[�d�������q?o�9��wyy�pJ��,��,"��'-8���CeG��9��v��G�^�����1��wp3/��|��h�����r�L�8��	_����S*��3�
}a#�<����,MJ���:�53���W�I�����iM��Hg'�G�5Fa���\�r[ �,�I4�?[�G{,��0�hX$����BQ0��"��%�}�T[Do��&��R�6���
�����a�r���2A���g�De�P�L����Z����*���r4��~��:s?��Xa��A��`+wd��?,�O��.���l�0�0�����YB�Yh�=�����������.oX"��lW�=���[�W�D�e�.���;	�����Tm�h�hj<���V�����\������g3SW�
����?,D)��~�`'�x���R�Ps���g������-6E�/�iu�����%��R�PAtv���A�r�E?%�����=
r����s����#��52S^������(����>#�LU��>�`a)�c����������p�[���,~R*<��fHj_�������{6����&��}
]D�Q?0���
NU�������Y��U��z��@_�h����.Vbij������������$����;'��m�>��@��������x{L��N��r��S�k�7���T}���s.X��J~�	"��}��b'+;�{��wm���������x���e������S���g](�x,Y�@�}���B(
wJ)���W��������Y~`V����?s���;���9��*XV^#�������b���<�����m�����-�
7�U�@�4XjI�����v���o��mym0�H[�n����Bbs���1ml��Y�ct3)1O������|,y���N�sBl�w�g�W���B�%��I�H����������:�9��r���������}{F���=���
����b��CY.�^���=��P���H3�L�*�
�kV;=*��%?L,YtV�
g��Um�fu�B�W�s�o]���t[ �N0>����/�v����E�ZBi�br��q|�LU��l��~�p�/qS�����
a���s
�m8[�6��)JR����R��{����S�|k0��-��?��}�.�ix���l%������
�=2���a~��p�U��D>��<�ix3
v@���{��o��nKdC�	0��0�$��'���E��PW:�Ic���6c`2p����v�����(Tx���-��6�o��o����	6�`L+��(�0�A�������Xj�wkyq�w�F��������6������F��}��1u�
�<�6x�[r��FjD|�9|Y^�;?��z�P#��n�m�����1m�2ih���l�7oS���4�E����,|H+is��,�n�2�6��'���%�������6U�"��]4����)��Y~���c�d������`;]�Ie]�V�V-��@�����<�����A�.<��l@�����a4�������F��4�E��OZ�-�^�T��`�b�����X��;*�n�%?�/hZ;l�H�4��Gs�{������	`�?�Ag�k�������4-?��������6=��.+<�b����B
�|�[{��l�j����������	�^j�Bk������*N.�%?�w-�dx)��K��b<��4���s$��p����#��������3K�3[l5�4C7�
��SBlVinl=�^�f�dbYtT�JG�m��Wm	�a�T��2|�0�
���������l����=�Y���?u[���_$�%��Y���e6��MA��M/.h�oF*Q:�oS]�*��D��i�Yv��(�Un+��Bp���DM���F��=z��N���>��=^]���������Fi�Xr��W�n�K.t�nnL�N4���X��k������"��Y��Y����IlK��m�l��J�,;Gln�p��-/^���[,s�
��bb{�>�Y��+��k�=e��B��f��d|E�NMbG���M�����c���l��,c���(�����`����Ra�B��%��^��.n��i3����7��^���
�&�
1�{��fj���%��o��+���a�%�,�$t��V�����
��EC	O�=� oS�
�<������`r���l���S"u�*n��
�G���������j#��m��tZn�,n�:#�%����y^��m��:��n��)������<��"�,�Xz��o���G�)����>�a��}-�~���l���h�Ni��C(��Xn��
�`G!��Y���O����,��X�������a�M�g$K���3�gs�{v�����qw["����4�EB�n^J�)Dv����V�h��\�a�db��h:�nd�^��)�w��T
{D���=P�g���Q1���`�H�����e�jB'�,j�BI_��u�!{9���x�{v�%�|k4r{L^�N*Ej�A/���`a�Y?o�,�u[^0�4uq[�������~����U��=���o�ik�%k���O*�	Y�]�Hl�%v["[��0�Y	��~+�d������f���2DC�]��i��-��i�n���(�]�X�������E��si+�}���E�pg���T�����9~0���]8����`�\�P9�#z�4+a7V�G����E�Y'���a���	_s	RC�i�����K���f1kj�M}����o���]�b�P��4��V���n�i��M/R��aX��"v&?�m�l{A�)�\q~�6G0
S����P&�����4?i��n���@'�t������a���Z���p�����)]ih�e/~�4���diY���o4��@����Z�
����B�J7���I�P�����`Ko�
/�^�,�
�J�O�-S,�r���z7�|���A��0�(����+iL���
~/����J����b
n�"!F���V���d�NH)pC�2�^h�����`��T�r��2��6��pA/X�#m!_r^Kp�\���EGX��,M@J
����5Kp7:���'��E@��\�p{L�0�:F4}Z��R�$u����w��Z�O*��M��:��}`��RS2��(�
n}��V��:��V0�
]V�����M�'�D�1�7��c�(�^��s��{6{�oS�Q�$�E���`t�J�&�j����e��J�������+���Y���7��,���@I4stC�
�"����
w/��o,�)v�m,�|��gs�����b��4���a��O2���l�3Z�wc��idT���
�*���\K��{�
���A�{�V�>����`g������7,����3�h#��[�U�fxc����x�X�L*6W&�g��x["[�0�1�	]	RI�����z��!�����.x�-sNK��^0M:����nS�i����
�6�mEX���d�����_G-�
��������/�
v��N��"&��t���h�����
v�Sj��1m<Aw����$������6U[1��4y=��~�m�6'�{.�Ye8�L�[��5��NX��Y��4��g���E���J�f�s�����<������v��w�i�f7M��]0�Rp���;;�E/v�2�N/����0b{!G�[�vK
����L�����;�m��-c�hv���2���v��!a���N�=�$v�#��������.�*�0#6����NO���d�Hb���b�7��D�K3�%�R�f~2���J�fE��m/�7�7�����b�b�;��&�"��-V������N����bgA�[����c�.V���	�����dB�4|���`�	�,�'����r!��-��D���X�WYQ���H�,B*z�S[���
C��24�����U�;Su}��7X���.h�wK��d�����reUm-2�t�P�Q,SZi3����Y�[��6q��e�}X�A�a�-��P���&�Y�Xt��
g����E���|����3��\�:����~X��G�;���+Wk��w:�((�7���;t>�f	�bw��c����"E��O����e����wb����������Axm�b�X�;��m�r�?~"1k�S�B7bwA?�[��C���Qy����b;����%���b��a1�XX����^9imP��j�OJv�g���JfD�BW�n����RESVR���w��gV� ����p+h�B*�<��Ls\4|U5p���[�667�R-������\��iI���@���,u����p[!��|
m)��
L���je\�~R,����'X��i��k�	�c�Z��n��N_�.C��m���YC��\(9�h���/��
��K(����I��1-���D����C���o���+�#VJ�:�/��l ��H(F���e����n�u��K4���[t�gs:l��6��"+0
����k�X��.v��D����-�M\����
z��}�>��m]=q�Ekm�3��0�'�,�\`��f9Lj��|�\�.<u�M�%_���h�0�FB�p�j�Sp�Xc�Z��+g�$bW��[����<���L�g�q� o:Y�D$�?2�bfB�� o��u�����=���o��5�7��L���
x��;��:_o���b���i��Y��D�����t��;�9�A/�����7����������/;vk�wV�,z���^��	���{����n���tAD�������_�c����h����-�m �<
z1�5�P	Jl)O�Z��u���������_��x�.x�i��k�i��XxMv������M�[� �px��=�X!�9��x�{v�*(�V�n�P:/=a��Xh��k�n�i�z$^(w��-_'#���-�>t_:��V�v��c��A���T��u�a��Y��6��x��8S��>����=����
=3b���L����y�%~-��H�D�?\-e���6k�t(�-������$���\b��9Mz�0y�lv4ex���(�mum��6hx�
3<,���Vk�-����4��AK>��Lmv��N1%�N�X���;X��C�A���J#C������������������z���0:�S={����[�������e��w�\9L�[�G-uOE��/�����A�.�b�-��J��OE~VAO��	���<����aw&�-zCCT����l�!{L����.��"6���=��f:��bK�F�		c�Ao��b}��L}���W�0�$�/?�6X�"u����V��+�Z���[������a�p�}Bk%w(Qt.�.(��qalN�B��|Q����M	���������m����m�V�kY�StO�V���]�.�������SZ][N0�0h�]ln���=)�z{L[N0�"�	=��nX�,M���B2Z��J���6S�}~`���=K�R�����J��5��������d�B!��F"|�T�F�U����y�M~9\��0H$��J���4�+���B_�����4�o�Rg/t�+�F'��������b�B�Y���D/�j���V����I�a�a�r>�S���:�T�0�^�f>M�,�.t$'�m��Wmc��}�#�����"N�H�������O4S��������ZBOA�{X�%�s��m������oi �Y�pJ���L=n!kxX�{0���AS*
����i#��������?E���?�35��u����`E��7<N�}��'�e�����m�l��/��%
�=�\���7�����@�����W�����>�dK,T�5��A�������EV�,�����P��7s��]�t�a	������ST�*���C�
����B�Y��
��<��Z����8l�-z�dp�\���LIt�w�`aM��ebY����,��Eh�J����=���q[����i������C7_�Y��=U��>��a�����M��;��R����:�����������UDC�n����=K���s�X��`�J��z;����[=p�+`}(*7��?�H����q?1��������������G�q�4�mL�����6�����X�,C�l!udX~�$F�t�aV���X��F^j�g��9|J^<������X��6��oKd��e��.�p
���������L`�#���5�K�
;	���	�Y�|�k���5 z�
I���
��}����B"�p��A_�����#X��[	^�?������d-��Ua�����p�&'�mum�1�[���b<O�����Xd�\�������y�2�?1�h���`[:iD��E7���F~�6+��A��P�A��n���I����H���b�_���+�'.��3@�R��7"7�l�gg����\�y[^���}+A�d�������E���f�=X�bWl.<y����mym��������<�%DC�����+�Mo�i���Q�
��R��qbk�U��n�^��8��b?`.f�����=M��_����R�U��$M
��RN�&?��=���v����u��.���E�b_p5XM�&����bW%��J�f=aA��(��^9	�W�f���t���,L��~r5��F�p
��
@�Yu�6U�0�jI������>]��_4T�YpX^}���P�F2>����!����P�����=�����0��W}�pWvBSD���K	�f�h�����- ���Gc���=9�a9x�>/:��^��>��>���������au�]�A/�aF�%y�oS��m����m8��}?%�P��,>�!(�p�b���R��}0�:I~�|<���$26�����>�a�@�������X�}X���n�y-9��I��*�:�����a����+6���so���E�k%����a��	���.��,��i����
�����:����B*���|�y����e�m�"�`���Qk�1������n�B��P�#�	�3�]�$�6U��7$-kz����;aN���X:d}��r[\"L}[t��������s��m8�L@[�a2�b����]t{L����������6U�tU�
_�`;�v�0��R��[~�mym@�%�\U���>)���a�o(�&��`UI����a+�����b�{6_/����,�S#	��/a�t������(��d(Z!6���,��K"��J�JDi���ay��|��. �#m^�=.F{�������7�����
�
S���d���������jEx*�t/4kVHP'I*�pQ��s�4iX"qu�5�0{�5g��1���
���B���W�L[�����8|$����RKu/��Qa�E���Sb�0�5��5/����K��mum�B-����n����O'�!�31�R���)m�����;��K.�o�}R,�?����d���+UT���0X#�����B�/���[����o��xy��#���&r[
)��:���@�Y�R�0�!����m����^%�<�����i���,qK���8����	?���A?��a�w�I	���>�V�hX�'���1-�<���E��8����/�/���������n��n�9��.��o���2��<�*����-ba����]*�vv��
�(�����2�>t���a���4��<YB�����b��������N����.����kJ������GiK��q����Uh[3-%=��\t��}����M��"���Y�fZ��0S|��Y8�G,�B�I�����I�������6�M�6}U��FR���S<��-�_���c����b���+���iBa���'e�V�fK
��b��Kn�i3�����,�_l����j���Do��(�����J\b�t��bXw���&`�/����{vd��w'��MK�b���>���qY���vM�@L�Jt�~���X}X��X(� v�<�O
����6����3Xu����_�-8�,�;�c&hX�(���M�z�����j>p�����Ik���M����`��BE�TOv���F���^�P�W,���9��I�V�J��dB��;K
�[.��j��i~����=r%�k5�	/�ACf���V�d�bs(��D6��5���.�
kn	����[����LHW��;P���
~������������~	��8J�4'�)����;���8�,L�AC�q��r�����W���n����6UP0�4,X[r"t_LIW���<rA"cZ�v2UZ�;]so���AnI���`�SZr��.�q-K�f�����%��b���L��c���a���H�#������4GWb����3t��4��V����;a*�h�6��.�4.�A�}
�`�*��U�>0:0>������*�aaXL��~?�"�9���p*���)��}gC�|#B��14n%�g��	��AwV_*�U���;��^0�E#�%��z4�ga7�9[����������s�=�a����|�={����*��L��;���d{\$V;��Wx��{�#�6��f����idz�E�^���a���`�yAw�DR(l#�;��;�^K�Nx��io���E)��w&��^q��Ov��������n�b�S�U|a�2�4{iv^�3U�U�}�<���
���.XL��e�J:�U�'�AH����>�Z<�e7�:7��4H����)Px["�0S`�ou ��|HBp�4m������H��������Z�0R����)������j�d)�7<O�Z���b�X�8{d_�������F-D��I���`s���1mP�8�R������� ��q�`�xK�Z��v��6g����F���S-��VW��`��9�{["20� �dX�h~����(�d����]}`I�F���f+;�
(�$�e�m���#�L�R��I5��bof�����s�0�p�Y^z2yi�-�����5����E!�\I}��-X�/�fx��?XA�[��'�Kc���N�<O��,��U�}�Es���/X4
�J�&�j����=�� X����k[�xB`UDxZDx��,	��$o	�#(�x�A�9W�-<��������6��T�2;a�|�l�GN����`+�c���	�AS�a�P�Xl�f�X�����n�k#��A��Pi�� �U�[xBK�(��@�����>��K�nV����4�����5����O�g���mym��|��7}L%PT�j+��%Q���-onS������y6@u��;��(�0����v�����5�=�aD*X�
�qa�����^�e5��$�L�7���|���P�Gf����=���Df���J0�fG�-���y�(�i��;R�m��S�+��h�G�N;X����z������uNv��f�4BKo��D��1�������a_/��a9�XXw�q���'fa���}�\VM^���=��}ThY6y����i���a���nw�fAm�)�p{L[",K��L4�,~�����.+/��/z��'�-�`�����U������{gC��D���\o��dfu7��i{X1����n��E7��Y�D��3��
�.|,�%6�
oS�9�*���
r�~��:
���PwY�v�:E3��������U�y
�B�5����zYUw�k����o����6U��,�-�%��R�����w�������g�P���n���n��O�HN��T}�3�X����=�X�B,TD�{��~�e�Y��[4K�J7���0���bs����6�X��h�_���*���9v{LOL�L4u�I��������e�Z��/�o�����V;~yH�R��db� �eSs�����t�gaJ�[��,����.��8�,�
��E���ba����I�,��.��m���m�}m�s�����@'�$W��eS���n��e	��b��2�������R��iU�.t�Y��\�������2���-����V�\����/�gKP[��Y�\�T
�	�v����f��1%a���c���O��hY���j}�vF�[������=��{��$�����Xh�����kUpYQs�
s�����������)����G�0��I�'��8�]h:�,�	5D�'���H$����<aOx�Y.�=���l�����& �,���M)h����5�5+o�
 ��I������Bdb�t�-Hk,�b.���[C��,u�^��5a�m��U��U�3\V��*�/��)_���)�CE�-
�
a���l��)t�M������Tm?�P��Y�k(��������m/�����P��,N���j�_�&�#����p6
����^��Z��u��K�E"i��D"����a\�z���4	L.VK#z�:�D�Tq	[��Ys�wLj�*[.:\�s�vh��\^u�s���bs��my}��L����w��+��
u���^C� ��,lISD��6�&a�q*�_��|�C���)�� X�?�����T���I��AWz.+[.�l)z3���>,���X�r1aK��I�0eK�V��-��`�T���*
6��(�0����`�,�mym��$������_���DLW��Lx\����hJ��-�� &*��3��M��=��N�����'ibVjP���}x/��2	�	v@�+�\����
F���dpkq.&�$����`�k������C�!lJ��,��CS1����t<az\�z"�JY��?�C����h����h���W"}��O��B�d�4a&���q�Jb��Vsi���"�������y��+���8�-��`xJ4�*���l���X�u������m���H}�0ZI����b����G���4/�����HlE����*
��<Z�vAWM��M�����H��1m�2YZ�0�f��"IC���)
KXIw1�<����m8�|L�Vtn�����jf+�.x�<���<�J��.�	
�&�[����b���/O�1
�_��%8����mym<AU������i!~����h�������qd�����`4�4kX�q+�+�.�9;�[��mS��"\f�� ��p;��[	��;���qc���;��.�D����`���Ou[�v�����~<2sL���R��t7������;�X�2$�U-(�oK�nv���-��6��c�~��-Q����fi�bgJ��M�{���
������O��h���,iYl!�i[�w��G-��
��D?�����{v�����x[���E&�i��"v��=t�XB������D�K��0�L��[��S�Ol��B���E�cA�t[<x3�`��NZlcW���������m���la�P�N,����l�4pnd����fi�F�~ �����BK�m���$�E�&Ib+�����7+���PB���'
��������7S����,K�
o��P.�����^�b!�o[�����i7b;}�dv�}o}{x��B=�����O8�������5�W�R,�1�E��'�r8�s���|S[~��(�X��$6�|�,�E�7�
�e�}���-H�nao���so��h��W���(l�f�������7}�����=�AC!�m�`<W�^h�������H4�#;5��J����������
�6��k��V��v�������i�`!�m����iS��h��������lE�a[E{�jx��ca/BG�T��3���������^P�����L�X��x��g�Y-�ihr;+wkR�������
[K����t����l�+
s�Dw�g#V�y��|�=�g�I-����?��r�X�z��M�����eEf�4��i��/�S��}�3�n����}�A{���f&�-z���G���>_ap��!7<���93���,���t��e�+e�m�%�������Y��=;
Z����R��c��C����+�K�o��}X]��Bc��m=��]����������%����y'x9\/Z�VX�J��R��s�����Aw�0�2	��P�1mN�t������A���������a6�X�k�Pz�
��R�fJ��
�������������5.t�{�����z�5����:�	�����c��
����e��|H2�1�Z����M.��c��d���xov��������9W��;+��V��o���
&���7<��v��M��@�I���1m�������v�A�Pl�U�-�-
xq����m8���*+����c�o�-�������AW4P����?L��pU5rAd[:|�#/���6��T
T,Y��t��M�`'��J*=����VS���g��G�oB���bs�Q�y+*��0s'h���EQq�Y�{3�T�P�@,Tx#�������f���4��}�=��A���������o����r�;%
��0c�G&q��Y��������:�wy������j�	V�a����+�j������:�b'|������Y���I�mym��3�6��+�q����8}{[�8������Z�IA?���E�7��.E��l����'}�#F�t�nS�%��$�]	xY�{C#"��.���|�Co�D�aY�D�S��e�x�N|	<��X��1�����#�\�sgu :�c^6�����r[���vZ�d/0�
B���1}���"	-�m�4�I&,��T	��8��3�[Z"t0U��</XzKv�H��1}�0�a��c�M������������wo�C
�_�J
�����<�X�>��]�6��.^F��ZK�����s���k����E�i���%��a[�PNOi+��������7�`����MIx�%�v����E�
A#�
�s5�Jb����#eK���D�,���,~�� h��Kl��*�5����T2��T2}��V��MN��S�dc2��i(S#��
��7f�'>��U�2��x���G�T2�,Z�0�b��^}�6}�P�����O����I��Ra�lw��I���|���Q��>�6t�����	������ebM��]lg��X��]�]�O�V��>���]X�E,������\�������������w��]4��d����=U���E���������pz����/O�"��,�b�lk�f����M���#3��Xx����t����l��J&b{��NS�=U���5)�maZ�<&��@m+��f��{���7+5����-j�������=2[ i�2��,|����$�z�0P/��S���C��j��]JDVd"f����(6������sC������Bu��4�f�����I,2�����c�a*
�o�
 ��%�/{�w�����
���D����<baE,|�c����m5��j��t�����%�z\�:��Ae�l����h��Z�8X�f���*Olc�R��������mq����EwVK,�-P�������yuM����e7�=��F
�LBl/��o+����
�l��+K�����Bc[�u�_$hh��-�/oK�n&�*�C�"XV��a���UZ7S���^����[lc9ab+Q{�^"�N�g��Z���J�f*��+����R7SK=*v��R7���n�>����`��c�pf*��'��jdVp�q�1��.�[h���,��}�Q-H(� v�����6EX��hX�+v���f
�����p7t{w�h�]]z���l6+N�i+�i������mM��7�q�(�.��l��R��DZ��s���qcY�4��9W|��w����f=,�E,��XA����������Z�D�M��0U+�n�C������ eY��:lA[[v3uX��|�����
�9=��p*@c�f�C�~���������,�m/Vf ���:����j#�I�����XxM	6W��F4���0�*9\�B�������������&�:=����7v|j����m�M7�KI�����m�\"�q8)��w6F�;�S��V������)�^������
���qhQ�
*�zsg�kUh����fZ��KYyV��By����V�a����d����x�k��<A��������������$�e�m=[9zA[Il��OS�9�4iE�?���
�I���<-V�	����f�
��w"��Y����4b��Z��������p��K���)-����@4�j	vU� ,���x�h��vB+F����<=�M:���W-�.Q��A�����B_�m�a��
q��Ki�M3��r��b�fZ���Kt��a�KO�����z��8
g+:�%HSV52�JD7����93d�c�c*�S0�-g�av��l�~�����(�Q�������^a�V�i��`?b��b�X�u�dL���d����k��G����g��
����]����+�I�A��s+���uX(u��O�:	���O"p�}�o�x��^9D��_?9'��X�o�:���~��=��s:-�M��'���+�K+�n�g>oNO��$����P;���V��65��k��xE~��n�#tn�x����S�
,L���n�;�������4eS�i8"��o/�w�������+	����0��L^4l=Z>n>�N��s���^���B+�OJ��g$��\Z�%��uZ���/UYx[[zL��P**�U���6l�<>���%��4��Y����`]����J����V*����������6
`V�h�EnIl�!<�=QM�t���)�?L9+��V���o�����v�@X�lV�9��M��4���iAE}[�t�
���I����M����V�9�&�����
���z�L��n���9��u)�u���	��*�N�W�9��'����3�S��4����nn�A��f���;�3�
��X���D�&0�[����>]D��c��F�����C�]���
~GF�lfY��Y&�k������U(G��E�&�����Iw���|�������^&�O�]������R�?��������x��p�e��)#����l�~�����fM��T/�0�c��fo�S��r��@6��^�iv�1���%�h��5��%���tRMT�a��\��q9�P��/����`'�fe�������V&*�0�Q]�Y����EO�-�P�%���j�L3Q����
+��g���m�!yV��i����c����"��}uT;S��M'�S*�S��m� �P���i�aP��i�So�������������VR�4�:��-����&���T�	�Q|�#������@M3�u�I��G3R����>lG��fs#��c�x��d���s(�`�����rj>��4���j��]���?�O:$ki:oV��A?����;�Kg�Og���w>eT\B�N���{8E�����<���	�1���6��S������@���}�~f]E,�O��A��YQ�����OS�=������`Y��l�X���3��8X&��;k��h�NKd;�z�������l� �6���������������&fQ����]���	��e~�J���@���������-������o��@���x�KL��p��S%��~��G,J!7{��e��}�i�lv�
��B��.)��Cm���_��2�Wv�l@�#����;�$-�f9��c�L�������[�3T�z�
9
�3�&�f%$fa�Gh��6|.���P�/�E����](����<[�����l�����w���o�PG
�����3}0���e�2_�
,�B1{���`����N(�**Q���~�A�\��,L�������s	<����`oxM�F��H���J{�ium@{P4��X���%���s��]#��	�*�Mx�;�]�4U�?H���������a�C�E}h�)�0YP�[��M�0��fm����lK��c�8��3/����H#t���n�����|�C������Ci��^��&�@D6wt8=�Ouh,%���8X��,��5��_�>��^����#����J$������h�7R���,^3;�mf���0���>���6'`�L�������H������	�������ny�`�>B��Z~���.�K�9�?����.A3	o�LO���;�}�n���~�/�l!N�Y��;;`EH�����RR�m���E=�u�A&�QX:|����-hs���������/���v6[P��l�A�$�YI��mA����s��w��wG��/~�J
�m+�>]*�m�37Z�8d���x�4�����p�;AD�`�S,��2�z���=��#L����~g4�~�����C�T�sK����6U?�o�	���������E�T�c�u	9���'��	���J��
��f�;��h%���I�]���n
��R,�q��Bk�9�������	,�Q�g��]4��%�z�f�������Tm��d:���}plZ���U�x[1��$�Q(�lC�ffK���%����al��NX�'���m��[	Nm[@��,�U����W85�M ��	��.$��BR�T�BO\)�����c*_����������/W���nC���;�7
4[�'>lV`>��MM$
kzB{1�VId����O/�E_�����V��W���
�\�~�����4�M>h{=+�m�	�1[��1������eqW&�K&/��^��%z�8�e�V���X�}��,��z�����ei���gDOv�����!6�:=��c�=U4���������7ZH��,�
�wEO��!�f7!����n�M�������SJ\�(���N/��.�a)b�%��~���	�I��=3�8�j�w���}�1�6�_�&�/����m���e���t������w�n��v���w��Ga��[�qz~�Ei/&Jk���Y�����F�X|��El�V���q+��
Mv�4�<@b�H�Y>��]o�&s���6oY_�Nb���l,2!�/�e���Ij��� �T�]Y[O�.O��ra��^���f�v�0��~o*��jc��7st��Y|Rlc:5fS��i�l��,+��r@lN���v��(v����t/��-��6��O<i�K$�.��]�������n	�����K����d�S����64�I��B��/
�������<n!���0�N]����LO�6��=,�o��eJ\V
�B��a�����y���E��Iq�������q�E�/�iNKd3zlE��X�P�G��n�����2/EC����w�v���cJ��e�~�_,kW4�;��&�Utx�LH�.�^���r��]�4�����\��9��%x��Ov��	zAGx��e�z�0��SP����iEC�I��P�|Y������f�pU'�0��(���^]l2�N�k#�;te��H��
3�-���E�:c�L�Gh��^5�N+d3z�D���`����?�M�(�Jr�%����i4�/�_p�:'�~g+���{/x�����4�Of��C�l�
f�h��K�Ux/��
��+������ES��Ff�b�
���>��m)�Q9o��{������t�pM�����C���)��/&�+z�D'�C�R�-T�\�������Mt�������ba�I/V!y����S������A���$��l�t�>��a����%�)�^A�nbiP�,���B%|������]�A���c�b�������/���0gw����ctRf;bt����v�b��*�6��}�;����}=��:�e��������j�9���p��������b���zLn�G�,�|$z*��c��.]I<WV��P^tO��i8_0��d�`���J�4�l�V�gg���V�v��,�m�v���i����s���b+K+K_�]t�%~g���`u��r�K6O�k����� ��/h�X��`XZ��F��2/*�i������lIt~�����3�
�Z�w����]��X���)XA�Gb;,r
vzL\�Y�`��h1
�"�N�2�64����\�zYg�b�{���T������/���A���y�u�/�u�3�4��H�a���,���0��~M�8-��uX4�$jd�9v�*B��$Y\�P�d1M 
�W��;fo�O�������E??�u���������f����L�����Z���d��~��" �VJ��:L+�	�/K_��
���k���"`���y��D�-����N��-�m!�t������r0L�zxgH�0�N���������NUf��|2��X2��K���5���p�8IE/���PR������Ke��^t��������%����g
��Nm�l���a��X�[�o�-��=8A�����-�����wzL�"L�W4�l�@N�foK��$������~��$|��N�O2hNS���A��'Fw��w�(����YJ����[m��7����l�nI��xD�����/z2����`��kL��EV��&TG
��!�`ix(�-�`i���M��iym����y�����
���X��.�7!M>e��#�p)khn��T4l#%�����,	[,��;������W�������k���';��>,�$��rP��������v//|��f'�Xx��������
/�5�F�+(3��2�	�,�Ol��mV����h�6I��nbsz��1������e ����3�-��hV�n��������*���gv�5)�9�������(��,[,Tu�d<����Vh{���+IE����Bb�;���vay-��X�R4Tn�Xt��fJubv_[8^,�
�5��x��Dm�3��h�[4\�.�.�}����
]vb����5�I4.���q�����6���J��,�H,l� v�}Z�*����.�[��4p=l��`������a(Rl���	5�7���0_��I����y�~��;��x�����"_��xcI����AhAm�Y���m]����
����X���?�r�
n�A3-l��)e�],%B�(�z6K~7��
������4v�)��\�� �,����/��jG�R_V��e�����%��	/����C�J����������|kwv��m6h�4�n�wd�N�
vAUSN�����T�f�E�+[�M'�g�A�YX*����S�Soo,+Tt�6��n�������t�
�!�f���l���Yg�A�)���l���F��R��p����%���6�X���>*��b� �o�������0�E,�qh���fY���BM��=X�����{�I�{��l�������3#�p�[��]iF�,n�`���u���o����s��H��9��'�1mI�C���4��������=1C;^5r���{�a���{����+�o����k�������������<��Pj����o���~�0s/��N��d/V�FN�k�����^��U�lV�����w��N�r=��e����r}c�4�+���eV�&:g����A�RT���Z�C9G�n������%M%�s�C������h�gM���]��,�N
W��]����u��jq���[M���`o�}�89��������`Q�F��2'Ga�A�������E��f����������&����;����
�O�k��������'wh�h��}�&�V�4������
>h�����i8|�2Lt��gi�b�&������9���K�a�w�r���"���{�����j������a�a�tM:�������A���C����f]���/D���M��w�*��}�4�+x6J�K�.����a�R�3����S�=a�Xx����������c9-�g��.�u����^�`�>�wv��4��7�
��
���.^h,��W>��k���0�P�t%�E�LN�(:�j�����qwk�7�?�
�R���(�S�5n��e
������K�X�B=|{���F����b��+�����0Ag	��,�m����;�u��p�nW�El��w5h���<. �R�f�F��p�@#1�-����-k��"�zb��zid���1gK����o0��b��b���t�a�p�V��y�#��SY��h���7*�`����o��D�a(6�M�(���U����oQ������x��]��x=���%����X�G��v��Ac]
L�������Qk����f�]hS��[��0h�7,Uz$VP9l�����'`D�`B�#���c�L�N��w��is_�4�,s_�Ez����,�z�od�{�E��>�&Q?>��������`
�~����B�T���������A���4���0�R-
*y�n-��/�`%|g�c�ji3;4��>-��'x]h��������_���Q���`��o0�0�}m����fX0��- 7��>�H4W�y�z��a�V�tn����|�OS����E�t�������,YF�H7��p��Cg��lp��k}�a1�X�,%6��T�S�����-M�����Ne��9��6M��h��l��X��,���u<N�;���d6��f���@b���OC�*zg���Y����B��V^��O	U��1��w������O-��������ta[�tug���oxrI��p=k��Km�{��[~�3������M�g���~a�m�,h+���V�f{@����n�N��o
{��w���4��c�]e�B=q��y���u�;�������D?��]l%����Y��h�A,�b��3���6%X�����~ba�X���O��}������;�<0
���y�/���9�9C�4�,vrZ^[m���8=Fln�u����;�Mo5R�f�]���_3�,�sZ"},�(z���-j�PR��u�s�����������.��6������Y~g7Sf��t<�t�V��"�+�����m{R�f!��N��B��	I��j�b;�6x��w�qY�L���,A
��M�����������
��AC;3�$�{���=�O*�����u�;���w��p�s�,�E�]�Dv+w&�l����p��:2��� ��5����	=�]h�0����,L}{�|���;��K����0�Y�T;�O
0����St=Yj�X(z-�Z��wr/Ve����r�Dh��b/�nA�]{AC�T��n\l�FO�i3��]}�
��E���"��	3st�����|]��	D����������hIg��
�OK��`����Qy
,CMO��'+�<=��q`�k�z����k�f���c�����L�	v�!vk:��y�,�\�H�i��%�[#��C�F+�|+Ig����-��
��"�C�s���s�D�����(^�����b���iym���,������7�k$x\V��-�_w��w���`��h����u��b1��������X���s�����:��5���%���Y��f�m�I�n���
Dg���p6�X�������Jz�u����h�,Ah�|����Qx�;R��B������+5���lP4l"$v��2�I���s��������to��m����[R�wv�6K[L<�44������B7�|�y;,���sP��pAC�&��}�^+���n��
O������{���`6b������Z`a�\���n�o��^4�q���`v�)�'P���6�M/��
��E����hx�z���`�'�;�N+d�	��K�38����w6Ag;�A�jUJ�����E/X"ms�z�C�Q�K�Ns.\���a��4�aV���+�U���OJ��}lA�[����K&���}`������H��%���7A�0�l�=M�V�m
S@��
������GQ�:I��z��T�{zL�O�J>$�G
�G1�������O��0�M^�!Y��3�!�����%~����������@s���S�����������#B+*m�b���Ar����o�1���	C�]�r������Uo�l�D�?.$��u�b��+U���tZ][N�Ex�X�^^���M��FjM+ %�
���5L#	v�vu������w��	m���r%�]I���w���Z�7!��qf��]�A���`7�A"'
��=���q�4�iym�2yq�7��=�
V�j#��������`��{zL[���	z����k���;�=+g�e�;�=��7t�J���0���0�%�j�/���E������
_a��wZ]�OL)W��>+IuC��`s���1mA�]��p	v@[8X�����1�����DWZ�t�mw��
�f��u�����=i�CW�����M�E/�'�#���`i�|��� m�T�wZ^�O�� }q�z�H8|y5k�>��5��bH[��;}������R~g�X`+��T�����E��R��-���}lX�}0��|c=
wy8������Xl��;M�y��==Y��U��VE���'+�=�bof{�,UUlN3<-��
X"����)���b��Ga����9����f0��o��y����.�X��Gf�lb���pi���~��<�]
;5���s��]�0T�M�9|��+X}3��Xx!��b7�X���Xp0�i��=�9��;	S���6���q����}�s��;���R���)f�����E�,j�������<���$dQ��m�2G�i�0;R��i��������0?�X�����a����$�a����r���=�R�����+������f�Tbs�����W����i�l����D������%��,�Rl�����/�~�!8,���+i3��N���e)E����O3�/|A/�u'�:�$���0=n:NKd��U����i�Adgy:b���i�l����@';O�k���Tm�p���Yi����~��p>��R�o���i��e�O���=�>�V���������4S�,*������yln'|xLK���*��i������,����������8��V���]����:�8j������wA��"v���0��B�I�[q�YV}��/h��K��-&o.�&!nUhz8�>X2�/�=�oX�{���7�g���py�b��{��%��>���j����~���X�Zl�5O�i[�|�~����](&��,���f�j�<�%�
�R��c��d�X�{��G��ak*<.]�0c�0��~������lX�H,
{{W����tX�������,������6E��8�E?����a�v���7%��V��L	������1������7h�c*v��waM�%����s���p�[4�4�m>&#)���������N�a4�g��-z�
`��R�@Y{����"����iX��f���1��[y�-�=�%��|gQ�hX>{�k�h�i����>.�}#���;�>�A�#-����������6&��%���R~g]xLLzD4,�5
,�$���NKdc�(Ij�.��L���������E������6���]2�p����`'��Sv�i�l���}�	|gL�N9����`�w���Z}@,�8����B���0���fcG���j��G��4���+�����?��]���qa�������b��O��K��_��y���|�Uu[Y[}@�6�������������P"��S	�Sr
�fj�������i8@L�������V%Rf*[q�[�{0�o�����M���[���������[zBla�mL�Z,uW��z��'����>��gc���4�]��� 6�����C������.�LaNl�����$j}Z"��L�4��n�	U~M���h#����_dq)����������4	K�8��;Q1�J|Z"10��])�����UcA7&��;ra��5u�I�����$H���N9����i��q���xvB����X��{��>����J��F�vJ8M���U�+�?�3CEM��/��zv����1�G�����lp��4*	�����$v\8��u��x?��:]����t���WhE�0�S������`+�
��,jD��aF������9��m��i�X�6��H���4����x
]?���&��>�w�A��`��������������bX�y��K4|g{|�|�	K#4n�4�<��n\�3�(�F���`;�������z���d���9q�����J���,����h��iI;�����+3�������H�:3g����1m,2�d�0B*��+���$H��]����{�����g�hX�'��e��b�D��B3�i�������"���U
x��"G�f���V��>-
=YF��,�t�{8���#'�����������,>$N�f�Z�-�ULOv�=�#6��M9��\~L8U����Y]�����������Lh�"7-7���;=o\*v&'��1?&�y;�N�9��{M�]3\W��&�i��L�s.��M��N��=�i���QD��������n�{��?oA9xZ9xB;Q4}���+��V�"_��	:�TN���b��i�_���c|y�^��?��Ox��^;������k�a��G�����y"�����f��M�y��_?���+p
�}�2��/���7-t<Y��hT��e�0UO&8,�"J0-8<����
����1���N�n`���-�
/D7�U#�f�v�L�J,���}*�@,OV�$v�{C�D��%�'.Xy�W�L_Y4�y6���l!G}Z�9_�?�6�����RW��X����I�������PdR��aOV����fK��X��Gfybap]���xLk`O�$�v����F��(��_�:G�;kQO�
����a����B)3���������h�Gw9��c^o��M�����d:��oh�J���U9�	=�f4��	��c=khh����DP�c=Y.�iV ����+$��?<n%pc�����E�THp��4�$�M����
����NwO��E-�i�����q��f�
m�U
Wt[t5+\���
�SEO����������~��zX!~S��$����4�M �����`7�O/'C������P��4<3%�]I!������O�`s-�i��&��%mf���4|�_{�����:�5z�4Z��������a�$��i�l�@-��';
g�:���i8[0�l<obr�YXu�qYR���&�IOV�-:m��,'��b��6�)���
�i0 X����fE~b'�k��5����URv��O�y�+��w��:����rA�zZa���n������N�
�q�v�%E���`�Z�A����
�����&<#��"��a�JS�i��	c�SA�c��)�g#@�*N�iSZ�R+�,�Ou��x/�Av��*�0�!�_x��Dra�d����Ao���^[b|ga�%��^��
��br��i�l]o�b��
^��L���UI��D2-	
����Y����|zL�]��$��S)��D�d�Y%��Q�������|SY���h�&]��Zn�z`����b��[���;_�f��y�k���4�S`�d���4�t�<=�M6&�<-s��J	�%�'t���a95��7��f���
[�u�'4����r^o�oe��������E�|�`7���jGV8�,�<��t��}g[���(�d"j�4c$

l��p����,��'x+��4�h�]p�J��M[�i�l��_D�(���gf'�=��3��N+d���J�����k���M:�0�N���yO�k�:E�`�D��J���/�:��"/�6��`=��7W�i�ljBW�t����I��[�]I;��D���pK��R=�?�����IV��}�Lc2�
gsX���64a$?��J�}*��gO��v����NS�����M�\�G�o�����T/|zLm��X����#��!pZ{{B������_H1PW!�Q���\85D���v��=�e0��s�/��������qO����`x�B>'�#�k�a��-4���5Y�F�f�K����h��,�q��������rIoC�=��[Q�����a����C���Vb�~+���R^hP8�R>a��$�a(E#�a\(��q��Xl�����9����U�S����p��
>X�/�nh$��I��6X��'����&�����
K�$5�����
���I*/�Q+2�VG�tC�"�d��	3U���?��m��ln�}zL��0
3�UhY�,S��ON�NF�i����-K4,-/���e����8���~g���aCN���L�f��X�U-�"'�,��������b�%r���L�hj"����:y,kIC����,v����KQ
��b+"�����IB�~�Hl!udYMz1��h��Sl����0s���6���
�f���T}D�+����;
����������:�������q���+��nY��|Y�y����J'�e�c�/F�`"��%/���z�&����4����iK�n���*��h��p7ND���e�c��%���XxV��K]U��.}��?kY_y�Os����TE��.�>����A��
u���)9��L�Al�c�\p�,B/V�-z��H,���e+o�M/&�'�������Tm{�B.���C�f�;�rK�H�b*��[�El?������QO���`~{���Y�~�b�����W,���{zL#LG�4�5�Z��($�.������\]��],�/�n��-4�]�������uXz�]�e]�������|�F�����-rZ!���v�
}����4����N��3�I��n�	�����lb{!���
�X������n�H��Y�6���z�nh�M�I���-�j�E�}ba�1�O�������	������w��E�K9U*V�� ����-KA��,MRl�.a+���-��,��.VM,:�O��pc���a��9O�;��[tzL}�}C
���Y���*�s%\?l��d8�P�^�.�-K��������tx���&w��1m���c�4�R*��m;��U�2e?oA"yY�wA?r��P���������M_'�V���&�T��1=bd�i
�}�-��,/x�MLI4��|�������+�.z/���X������<r%����������F3L"	����+4�,/��Mu��h����J^L+�4���r��������U�v�4�b���Wr�������A�����l�0�d����7<.}�L�q�����6E��4l�!6�1�Ms>=��	��4+������4S����oi�����I=7��%���bR���+�y�H2��}6�7=-��'��b5_f9zW�2�<^�B��0���J�B'�����X.y����~���'�4U�10-h���;2|i�~J>��c�~�/�|�������i�������@����}���������H�{�RS�o���DEoXk ��JH�����R���H����w������x�����n��ba��
��LnY|x������I@��i���n��]*Aoh?[��9��m��zK/&y,��B�n�O��NOi+����t��Iyn����j1���f�Eb��"xW�������=A�ws��Qz)[IV��p�t�8���w��b���,�0nE��������0�O#������6M�0a�����^0���Ka��b���x�y�����zj���:�0�Jm�U�S}��F���e����DCX�W(l/LR���R�c��>�CS(�}�Rw��d���g��P��ED���&�b~����}����iymi�/T2v�U��2U�mP�F��pQo	v�!=��(�ium���>����2��=�,�B�}p���Re��
=	��Ty��90rxL�C/������Z�9�Y|�z�������U)C�rW��� �`Yd��I8�UOS�
��xE�p���	��vX��9��D���~��
�9M��pA�#A"�0c=�;�"���/���.�:E�c�	���R�*Kd�	�fM����Z����JR��~}YR7�E~.�����/������V���qr[z.E������;X���R�NKty��c]�Wz[B��
�7xdfX�e9�b����-���L����a4C,"5�Bbw�sp[2���
�-�f�p��V_�(����j�����+����:bs���c.?&�5����,J*6gC���c��'�H����Y	��,lz�����/���-�1�����z��Y��D�,	���]��I���Z���J�P%�#����J�mU�����n� ��F����d5�\��q�7#�B3\�f���xZ �mL�L�S�]��������$�2g���2��>����B���G4�]yd�B�V�aj�t��0}g�&�{�_����C�"�7�f�����p6c��.X������b't�H��,�y
����o:�~+|8gE��)j��5b�t�X���;na�lAI�P,Xl������c�b�M�aLB����q�0j�LP[4~g;l���q�C�R�7���)����PdlA�]�tu��*l�����0�rN��|b���;+c���KYo7��S�������)��K��r��n�sjx5mp���R�/�Z~C?N��Kv���PN����`�U�f9w�����V:L
�^���_W����g�����f"b����������]��vhk��,��4<L�}�K������ �w[��fY���.��B�����7�Y���F,���J/��'�I/��z�����j�_E3	g�#��NS�)���E�&���w��-��7'�a8Ki����z��`����
���+��o��L�Wtn����5��Y�j2c8;U�U�a���*�:'C5{���0�.�QH��m �n0�b����������f��a����+���L+Q�
��bYy�X��+��|���
�5AOh<;��6z�-,�&vDxnK�g�����7b�={��n���L7�t��N��jc���}y�������B����Y���p�
�����o����E�?h��������a���I��}`8T���d��b�TyyZ][O�l\�����~�H���?'����e����������E�oh�Kt��'O@
6
�����%�o����(���b�fa��8�iqmx��v�t�U������U
�^*�9-��=&$:K�~g7+w�E�s.�������cn���,=C7Oe���`���p'Z
r�k��0�3���j�N��H���$�O�`[�r<-�Mc&
/z�E	���U�������`[�+�mA���%
����d���j^t��!���S���(��$�D��Z��m,(�h�l��������=�������S�	4e�[\�-tuZ]���_7� k^�4�J����i\$��>���k�����^eM��� �t[@?�W�
4�F������j� ����"|s���To+���=�,�}zL[mL�G���U��nT���aY4�*
6���j�����dY�=kTn�;�=y��=�����%(�������DC�;���q��uzL�L��4szd��������wfK�	����)�vz&DN\�ujQ���}3�N��n�a�P����F�����_�Q;C������`a�<������T�����T[o����^o�4��3��N�i�
&�5B
,<�$������YbG������&�
�y�8�L��E����7LG�~��8
g��J&�H��"Q�0�7*
X���Z�R�Y���pJ��,l>�Y��^��L_4�|n����$
�$�rZ"�P'�	=���d��\>�,fZ"�����<����������m��/��<���Z?Xn�L-�fk�z�@��V�#�cj�����K���7T���>�����>����[��Tt
z�$�`7�4�1�.���xZ"�|0�F������s��������>���,j��U���l�@G�h���&0��;NOiCz�������d������Z`��jK����X6(=��_,�]�vf�x�)htZ!�Adv���~L��}�
�p�E�V!$��r��p��� �*&�(����-������s��w���ew���bWzO�;���\=X��,�������s�1�T#	� ��X��ae��������%~���7z���0]w��S�w�'OM��4���7��2�-�A=�f�wo��Ey�����TmO�75hx�;
����9�q8�R�U
������J���-���7�"���}
����&�.z'��i8��,�'��6��&��44�m���B����I��4��u��(:+I|g�C�o��Yh|�X�������.S4[:�|���
�t�T��������cZ��aED��0�i8��]�vw�c�v����DC���_l/=��f��-��_�cC;���as	�i�|�3�n��G�G���D����Jw�9�yZ]1,Z4L��~NS�5�t�Eo~K���v��c��a�\�YxL�J���LmN��P��E�fs�4U�te"���M^��D��BJ�c����������2������r����Y���������Xg���a`^,���� �w��s���t�����s�%W����`a���$�vzJ�LdPt�Jv�G<U�.t�~,���#���'|���N,�������q��Y���:n
����h��X�V��Y��o�92e�;?,�D4M]�T2�5I�z�5.<��f]��~,��$+��pq�g�b� ���<uzL�L�M�,��?�;~Xj�ih�;��'X��&��$�Xg�au��VI"�&�Hg�5.�;]��4?,�T��1D�4ct�]s�5�;��m/����2���G�b��&��D��$�Eozj?o�E���\��Ix'X����g~��%�a���Vh��X���O'�����c��F��L�Rl��T�'�E�ar�~�t�>-����(z�����W$�^�Fl>1��������_����&[0����K��@X<X�(Tg=�}��D��m�)%p����O��?��-V5)���_��2�$L�S,����??LXt�_��Z��E|�?�5|�?W���,��cZ5����saum���y�^%wY�Nr/����	�jIW�������D/�E;�{�i���Y(0|����/32G�\�G�a�`�7H9�����P�U�|��/�Y����B�3�[��|��;�.*`���X����K��[�J�TQ�Rr$�M��"S����BG�|a�N�9��0n��l����]Q�}�����P)���!���SN3�	��z;���P�B,�46��?-��'��+z��[���1���
b����'�e�s0��p��"o�)�w�k��%�Xd�����{��J/��1mz1a����XrQ,��J���$�\Z^�mL��4��	�����K,��[�/�N�j�^0Y4�l-��js^����CK�����E�LgK��V�%��������������=����������a�!��!�^���`K��}���h�e���3	�VJ�,��0^�P^���J�����G)�VL>+�R�"hZ[.��4kh�������g+S� hZ�,�sI�n�a��=IN���`K�?}���g��,:L��'X�������O��t�%�����a���x2���e���~_��[�$|��5���U���BV�}��>���Rf�J�� ��Xu�a����rH��o[�daD+?0�8�,��]��+���:\��������UUf���������e�?�4��	��������>�3�L�h�Eln:���a)�^�:�>���3���i8|t���|���I_��^��z������X�4u�[�gX�a���s�����g�� v�1[P3��I�,�!z��m�o��=X�������m�������R���zu���T���)WP�����,N#z�M\l����;���s�1�T#���b�V
���7�~����j�B���{E�����Lu{�h�
�����I��)�-�;�����[.�^V�)v��|�e�m�_�R-���T��e/�]��������f��������n�oV�"�1���J�����fW3��:��B�����,]���=}Z^[1��.�1M�\���-9�aDg?�i8[,�p��~g;}�W���c��a��Y�����<.�I%:\Z"[OLtX4�eYdf�ql/h�lo��o��k����4U�1,�d�j��2�
��~`v�m����|��pSOm�D���hg�����V��%�7+�}�;�FN���Tm�A?���J	�b��e��^,$6��NS��j
D7hYJ�����.�F&���-�-���U*�P������
>��4!�x?��2t���g>���~Z^�^���6��kS��h��1��������m���
���ES�S��%�x��l�mE���D�����R�.xW,f�;�~-A)vy�F�]	^o+CCu ��	��������-
��w5h8�W
������`7����Z���.}��E��I�t����4�JF������L�L{Bl�y��M�k�)R��Y�{C�O���Ih��,�,����N+d+^�EC�NB�����
�����p�$�����D��9��TZpzL�",mO4+��K�Vn�����C/mg�5O,�"�.��mkJo&&����F���,���D/�������y<S���s+����������p��57���L�ku�.��-g��E
)�Q=n�v�R��I#����,T��C0Xz�
6��N�k�
��n�c	�*�,S[l:HO+d{����
}:b�,��Rd����������!��?����4��
�L���)=��!e����E�B�����-��l��J`����j����(!m�D:\����q+�Z�wo�&4����Mf�J7���r[�{CB����!�m��d�Dw�T���
�fe�b'���Z���*���p��01Q
�0�Y��R����a�
m���!1+x��KJ�l���7���+�U�7���h]hX��J�ad �m�`a�l���B9 �[�Dly1Ak�4�^l�DNS��F&�^�� Ekz��Z,x��h��]H����>+<o_
z2=��x�:����f{�����.� Q��,
�����'���~'uh�j�����iym��I�43�$��-��!�1��4w)iW�����LO4�Y)�Nw��Tm�0ii���Tl�Uoy�
o%��	l�����fR�����������$��
NKdC���F���`{A�[/y�PX��~#js�����}�NKd�i<�����f��;K����E�R�lyh�yk����F����.���v���66a��d�a��sQAW�PF,L����f9�
s�����$Ik��F���<�-�{Z"���e�
#����v��~��B	&IiW�;���tai�%�h%��<��ng�-����6��WIR�PN��o����
m]��� �z����A
��k�q�O�����j������*�t�E/��,-���wJJ>=��!�c	��=��[�&���fQ���R���I�R+0��0���Z���"���X���4���O.��c����q�z |g����	U1�<������k��
�����1V�K��fi�������T������0.l�%����J�����	��p��R�(h��L\�� ZO{CWw�V�{��]����)�
����4��7��mU��q��rK���a����a4j�A��W�����c��
=�-�3���������4�5;���4��S%������y���|�-�Kvy��[x�����j4W�,kR��~����l��'�v3;�����S��:hL�wd���Bf5o?����4\� 9���o�F����~/����N5����j7{#�����6��y�K�����X{��w���x8�2A�oZ�
��nO��������&��a��-'��J~�=��B_����Nx�k��}+?�oc�oL3�Y��{����@D#-�_�2���u�~�N��be���G�B����������M3�7�7����������v�`�
9�Mg��4��Z5=P��,���7��N�ic%��~�Y���v��]�����^����xB�r�7*h�%��e>b�,1���?�o����a���o�0�t��f�H��w��k���V*����
�����B�����B���9���6��w)�}x"�B���=�vlAi����b(��nl��9M��U���a�4��'$pa�w*���{h���_�rk6�P��,��,��7�*�~��y�l,��#��W1�P=��	c!7��OKd�E�MW��f�\����������������T�av�rK�L��l������S`z����
������tM?�u��kc�@W�I��&F��saG�6����F�n:�t
�Pu��|��(�V�dC�sf�Y������a���6�CQ� *?��.hx�;����|�E3M�E�Tf����?�m6�4PG�J2�{���H8���4�,����0<������6��h�����/8]e�����
��������l;��d�n�C�*��ErzJO�OCY�����0.X���������B
L'_�i4�!0��0_!����;�`�Q��D�`[���DP�����v�2��_�~����i�l>A�F����4��	�J>���F���f|�8-�M ��m�b>[�G����~G���(��
�F�1?��(:,��S�������.��Sq[N�Op�S���������M��|�:g{�����<-��>o	��J���D�`#������L��>'?���a�n�z�qK�����]	�O0�t�y�,��O�J���0Z��0�l���S,t��(������z��ERL�����,����	���Z!���at���,��0k6h&�a����`�3�����s4�����p>_�) �T��0Yi
�X����Y�<_�frZf�J�~�l�7�%�?|LUq��ON���lO���t���"��N`SI��n0��?|^����k+���	��ozAKD��`���vx��f����MN��&@z���������=���MoX���a��-�O>ex9���=qZ]�"�����D�����U�1:��_�w����}�z�7M�]�b+�y��'��t�7�Z���L�
o��K�"0���V6k[^��
#�M��6��e��-0��*��ms�������l{!
g����a��6JK���p�M ��\��Kl�:����&R*�I��R��)e�a�B4��oB��?LK:M���7=�E�����j�	6�f���2}_���$?�-X'
lxt<���">��#/�c�����`����1}BB��������oQ��q���OH��l���Ai$�P�|���6iW�,��HX(��\�O
��)AZXK)��V���'�s��A
S���/2��1��B>����'wO��V�n�����w6�����DAO�����/�_�I���b�n��O�u}-\��X�4��-�"��f(��Pc6��)'����e^xK=�k],�;�]!�1���������NU����m���9���E�����/�iB0�61�YW�0,n��)I�����_����O�
��.��P�uY����n,�|Y����.O��q�����>*+�����������n,�+6_����YybK������/�������i"��,6����r�)�p!�F��M�b�-}*��em�M/�!)6���j��Z�L�Dl�
q�����kZL�>��*v����9�
(�����|��Q����/k�^�>U��F�F��5g'�&��seymx����I��`��0��IE�?n%�wY68�~NN��������\�n
W����b����6W��V��K���{O��b������w�b%�b[��iYY�$FtO�i8[1,�Q����?�oC�����8s/���q�K?K��`;�x�LT��
[/��^,�*�d�Z��b�E�Yi�4��*�$:��ggA����(�������U^z�?���"��|Z^�s��zA�9X��#j������pf��aTH�`�Xbt��Y����Z;,��a/h�u%��%oR���>Vx��H
��f�]H����J�"�<e��b����AL�Tt��C������s��I�K��zLC�sW�5%���b��7�O�k���	�����`��w���.+�R��h����K��V���S/��
z����5��&��9�jk�3EbO�kc�)�������']**���8Z%��
����W}��p[�y����/D�-�z11�7�kd����kbO�i
���N�f*]^��^<��&w�i�l��4�����
���JY$�b1�7�Z`.o���{����!�V�S�e�X�]�����T��[��bb��'4-�,(�-�W�b��f��.K�f����M�(,7�[I���,T}'��p�F�EL��y����4tc�b�Ky���e�������<8
gkz�g��2�f��Tm@��TS��n�
�����������(�`�Ff;����+�?n��8��
��On�kd��#�|�ri���v��z���|���j��i�����O��lf�O�7dH��b-Y��b�����[	Y$���I����]�LXl��]����]�������-�fE�p��u;����m/X�&�Y���������9�A�J��f/V�-��4�������9��m��j��e��b'}����u�Q�Eqa{���^�,��,N{��~��~g��7��5����X��V\dV�����h��Z�[���,�v��/}%��^�e9��NJR��'!��O�����j�9���pAxa��/��z\������9W�V�������R���`'�X�k��E�/��Qd^��-LA���;��� ��M���}�t|Ew����D��[g#��7�� &��o�������;�N�k�I
��e�F{4.4�����z�����S��O�LKlE����_	��p����
E������i�l���|�4�lN
9L����Z�H��w�f��Tm�AW[�tK-�4.��
Vni�)����6�`�K��/�mP�C2�E��Z���EC3*�	
i<�`^�4}=�������Ra����ek��MF��Sh%�]n��02�Y�{n��n#�%�a�6���$��������6�x6

Z�\��mh���:��h��TSox���d���sX^�a_P�+h����a����G���&'��]���
�L���w��9
g�"A�d�`+=�.�_���s��<W���&��OA��8
g���a_�������K�p?Ud�,i}A�������qo����g�UfI��m����X,��y����yZ!�@0r�
y����6�"z�D�hpUc�B{�f=��w��p�a����;M��T��l��������L���,z��vV5%��@�2h��)�f&�Y�u�e7�=�����s��K�n�����Qlg�b���i���n@����;p��,g�������Q��-���P��l��l��nLDtn���eWj[�o��nLWD4������:L(Kl��������p����)�}����:�z�
~���fq-���r��Ur����-6z;XZ����������k4�j�����d-���93��J?�fo�/#�`�X����fQk��_2�*�
/���E����~���
_���*,��.x�����.x�s�z�W���&��=�
�G.�������t��gU��j�EC	8��T����9�X"+b7�< z��B�P�P,�x47�`g����������%E,����t�j��*y�o�s'�Z��vx��������e�����AMq?�BV�3M���6�X���,t��eZ��t�����
�M�a�B��U������l����-_U�O�l��M�hy�|���,Z^�Y<��`�� `�,�
����.��,l
#�����3�B���������lOJ����\g�W�7tzK��0Q��,K�YK�v����}�~���qsg����h�K$��#�X��>�:�Z��ii�����Y��Yx��w2�OKd{���^t��4�B�S��vc�G���&=l�)�����4R��c��`���
������[��@bWAs�Y�J�����Y�T%v�T���fz�B��f
�}����D��t��j�	�7H^i�2M�:������FD��/X��a?������E��]��YY:��~n�hF|Gaw=��P��,J��(�hX�*��W�E��MsN���%�Cw����V�Y�S�q�1���U���/������BW7���mAl��_�|w�W��7}y��r���w�FL�PQFl����j��A��O,M�
6;hN�i�	c���6K7&�-�fC#�R/��6�w7��*���`{%ta)����E�j�7+&;��[s���Z�BP��v���Sf�	����^�����}
����������	�6����pzL�Ot���?�����`����l���;��e�VB��,c�Jz��'�l��V^ha��8�����s�V]{�Ba�4��q+`+�7�5�������c�L��:;�F���5��7�yn��VS<<M��&���X��
w�`+	=Vgo0��CTR:��`i������j�N�k3��,5��?���+S����DD�/%�����f���C��c��aSH���PZ���~���\������-�������;`��zU�<,���{
oG�>�ul�����+��Io����x!Ve�����E����p6�`W��U
��vt���4ni�ly1�q���(�m[**��x�{�d�a�J#C�m�P�S��V��\�`Yt�1ek�Lr��0�Z����&����,�����rS�8��7�I�R�����w[@��
��R�`	n��-:W.����A�J|�������"� �}�',t=:���%�4��Uo��|���������	����8�	c^45n�yj�"u�N��s��p>\����
OIR�����9���n�x���q�VDk,���7�|��p>���P4�����/^h���JW�N,����~.hxxi`�5�D3��a�d��$u+47�
��Z����X�
�l���������	������5T���L����^Y�P�(�����M�{Z"�m����n#��L�4U�@�ds�:���<6+aSaN�J��Z�@���%�P	��0�i�l{�����|�wv@op�7}�b������,_K�,�����O�iS�����
}�ba�-�\q����������������<:�Do�;
�
��;S�
=:W����Sv?%:�EW^�����m�e��?�J�?�Y�}��%�.�:��������rb+:��b��~Z��%��f�)Pw��pp��df����W}�h_����S��<z�2����}<Mu{��T7�r���,�$v���1-���T/	�p6����vv�7�d��L+Cwv	�
N�n���d�ECY����~���;�L�X�b��p����bw�R�-��Y��h�;�$��=��a�+�'���
�k�u?*�,GE��*����0��S�*5������G��m�������rF��dz��a����j��.�� �)�Ov+awx��dj~waw�hC����(t`z���h!�?K�J3?�X�n��f�B�Y��B6Y���G���t@�ugz���o��l��J&|�.4�&zC�Ff�o��',�I����I�S\]�0��UNOic��v������ma�v&�!v�����b���`��
3m��*����t�K^�42�������A�����-���|N�B�>���n��
������6%W�j����D?�j;
g3����v/��s���Yq��pj3W5�o,��,�
��,7�le��hx��y�0�[,�=����-����G��wg�f�g���[�;K�N�����u��B�^����b7��5.\�����i�l�0q����X��vw*>9=���	�a	wbY!���
����++d[�%u���E[�i����UA��[����Z��0B������;��h�%�;�c������6�K;d���wd�B��e�>l{1�p���p�v]��Y-��
�����0���[y�m���6h�/v�����H�/
����{�4UP0*����6��#�#���A�u�����4���I=�0�u�as��;���a��lK��3EIV����1)�[���������b�����k<���>��o>���`s��,�������`:����4�X&2)��>�g](�����0�I��t+����YC�Ws���Ye9�<�S��7L��M����~v)CC'��O�����������{8(��*�W~f���������� u���$��ww)-�``Z����iG8
g�;�;f
6bi�T�7���4t!�h���0A��4?
gSnxA��>�0�%�J�n��7����8hhE��[�8�yn���b'��/��Vd��U�;y=�)�����j�_��&����L��K�!��|�lE��[+J��)��0�u�;3
�J��J4�C�@OM.�9����v4�����
�)46��;���z��|�l������V(����s��<�w�yo�N(���{�������D���~2����p���
��I���qQ���Z����hx����2L�����S����p�U<A���8X��Dj
4��wL7���{Z]�1�8Y��t��
�Q�[����}������*�Y���p�����>j
�Q��-��b�[X��V$,
?�1��~b>l��_��v��J���I��2�':HH��el!m��t�����pn��"Pe�M�p���i8m0�%Ek������TL���aZ�
:�=2<���t:N�ik�UHI�,��k�����	����w��+g��o�Z��-!V��i�q��J�*�����0�*5��cI���[E������b����#�!��V��-��a� �`$�
Khw�7������
��������leiZGt%�����0$����N��X�v]��r_�Ptd��g+��
:�����������7����`N`����i8��L+Ytv���p�����i8�0_[�f?�����c^~LtR���u]�d��Y���0���p��w,p!z�=�����
+��f���,�%6gI}gs����//�j�������K=Y�,����
������i���NUr��T��nk�
�������=�8,��F�^�9
�=<
6ny/6wo.��vHlc�cb+�a���
�E��"vn����A��b�����i�R���d�n,�Q,,x[i�8,�<X��h�i�S�O3����MC� ��Y��NVN(��'��\�|V<��D?�MP7p��Jy�����M�EO�Se��6h������<�M�6�5����N��;��ZlV;-��6Vh)��m�,tv\8Ih��5��<��\�*��
K���o��_��p��X�B�
7Yk��_��L-B�S���-,�C��[�u���R��a�bz%2]YT�]����������j��ak
���QY��"�����q�������XF�ihu������h
`��/�a��f�]�Y�x��eqI��������]�Agg�w����X�	&v:�
k������
=������T
tX!K&y,zAAr�)��4U[m���e���.���:M��
}�+�X���go
�}gWAaX.y0�d�@����t��Bw�a�dz��E$�;J�:}��B?=��Tx���[t��W�Al�����YJ��\sr���6��,��^5�Z<�j�hV{&t������]��Y�w0%^���M���
�T�q�������r0
�a��������)[-�{���L�,�K����*�������w�p�"�k7CO���:����b�T�i�>^�w4��Ss�G$Liz��t����i�>^anf���D(����=.t�9'*/�M�8$z���0�%|iN�Y��;�X1�Xx54�w�f���T�hx��W�ya����7e|qV,��U4lk*��.��]��\V;��U4lX$6�5�����qzL�m��Pt�gO���a"���<�>��f��9�j�NKd�	�%:S��|����;E��f�����Z�W���f��AS=8��)D���,gm���If�l������R��X�w0�=��)x�]��G�������S�
�r�5����W�Y�������KO��������SH:�4�m&,�aO0A��q��������Y����?I�X�V�w�f��;����T��(m�6
`�B���Nl���n��\7��^R��,�
h����h6
�Uz��#�����F��-�sT�~��<,���L��-�H>hV�<=��'�n$j����8��.��,X���f*#b}�`ap����g
���Y�j ��p��q�sn��K!���|��;{a\(� �c����j�iymh2��a���m������T@KX�4Mo�`1�o�_�'|g��F��P�`���19`U�$��1cyf�e>ow���������7t �jy�3��|��0�qJ9���5�e<�I���]h�0��K��A7:����w�Ne������V�~`��%������%^x����`<W�]�
�>.�g,;���~`X,�B����i�a��d���X�4��6�����L�C�O%������4Z�d1������w��/����	��a��d���2�pu,�+�N��iumkBg�h��
v�D��{;<��i����l�B:M�v�m��2�M����RY��[e�fv�?$NC�Y����6:��b�����	�+�����lyA�i��k�e��VW��c�z�fE�p�����'�h�
��������K+	���$R��7�YK7���q�`�k�;���������=a<$��(}���'�i�Z�����dj��'��X
�g��Ff� ������;�F���������N&<�qf���6Tx
�t��)a�4������[S��lNb9Mux��������tK=Muz�pe���>��}���m�f7�i
�\h�q��U2�(������d4��!���f)����lx�W>f8rXD,��;����e8-����k�U�������H�w��;��
�c�np��6�A���r���k���F����)-�}"��B��i�����EC����zp���	�yM_�H#*��MKYO&z,�a)�ba�-������^�H>-�=� �������-c���8�����R��m�h�],T���,�q��i��<-�M h�H^��t3�e�ab��M���G�m������6����ay-�=Y�X��i�;3NS��������r��IU��yD����bS�������Y����o��6�7%�����\pY��zh���d���v.Y�������y�b����(���N�%L� �^�p��a��f�c�i�����a�R��������4���,�k�I^m����XW��E�h�hc��G�`G��������af@,��[��~-��2� �w��u�_V`%������<�,�J�����Z��e���s����] VW#�C?V��L�JlV��=�] V�/�F�%��Z��vx��C�$�|[�nz��H�h�)v��fa��c��bjZ��:�X���^�(�K?M�s�EX�h��)6��
�N,��(uA�������gaA����(���+!s�a���Yti��(5��=Xy��A5_���O�����(a��bi(��X��c������E��C}�]����uV�Z��aa"�:�[���:� �.�k�Z��e���x�
��-��YX�*���,��2n�����7���eRA3��m�2�v���T	^[K�e����++_~f�[B���jbW�0���/S��C���\�B�`�7��;�w7���t���|�>��t7T�m0� ����|�7����-\��Z�
��?���5jx�	vV��V�~�W��h�^��h7R;�L9\��Y)��h��C-�km����e7�v�a���Yo�����?���8�)�����E���8,���8|y��7[������D�E���W�pve���b��zpEW	,��4�nA,MV[(��EY�<K�������V�v���:,�6_���]��L�\tEb�������E���`'<{j��p�1��7r��v����PYT���9C�%(�p��d�<�Jy�5�_��$:�v�����G��L�u�_��.�x�p�����/�w��iuY�k����RI���,��/�94��(v�"8�����t�]Y�d3�I���hx
?2���vTb�+a+v��������.����������f[���a�&����:b+I'k����E�N�� ��Zc���xi����X�k�o;��1�A?/�����d�B�X�L��C��,�/��@�$�	c_5�e:M%J����[���U�C����6�D��#�g���1�u��<<�;*
�va�a��{��������;��9��J[�fz-)����d��P��5�4|#d���*<�M�~��"��U�OiG����f��B�l�M_]�rVf�~&�����li���y��5��+<q���L�U4=-�����E���.��B���5�V��`M�T�e�M��
�U��	{��gKE`��A���������O���9{|�&�4�5���n�pdq�����)��/�1ra�����3���7��$t��#���_X):�@w��:����+*��K���2e��v�H0� e�Z0��-�AS'+�7�`L��.l*����X���2^A�0�9����z����+b0
�P�~����6yh���y7��`���axM^`�~��
��c��z
�nz��@Q@������j�.�n��\&zdN4��,�V���
s��yg	��.�s�b.����X��8�V
[1��8�n���
_��[�hg��rcD�����F�
wC}=T��H.���h�;Y��O\�[�V�L1\�b�k��X8�����hx����g`�5���D�dxg��|�����9��FB����}X�Clc%�bg�0�[2<�����d8�����Z�����1�W��u�}wK�w@
�o���{�`@4\h���%D!�n�����EC�W��;{�_+8A�9�m��+��*6���a������]2��]�m� V��S�x���S�t����XH�S��vk�Cd��5���G�sv�d��1���!��[����O���+Z��B��[B���U����[B�p*��vg���;�eku��M��2wSdw��2�f��B���;�wOiw���L�T,I�_��c����h����n����EC�J�P[Z������0����wu�5"��[Y��`a��X�w��B��[����'�0%j��
���0Mw{p��t��6l���g�oM��un����=��)
�a�����g��:�vSd�
���n�-�������'�o)}n��g����7���B�����7#�,K����	g��&����oc������3g�������og��������-W�{0%d
m����$��.��;X�����|��KOE��\���l+��vd���]�����7C�fx� =3�T@���*�w��wx�n��I(�Xli'�d��f.��+�F�{3k~=`p-X�v����1��Rs����H�J`6Iv�!S���g�������`���+7OtK�w�z������j�5��
KYW����F��U����n�_aiS��sNv�jR��va?����L�
vg*���2��c\����<dX����&Z��];1L��l�������������������E�"�@'���1b�A��Q�\c�n��oz`R��?�C�D�������0!t����a�6���K����]5�n���j$��Ks(*/�Evo���h�T.��U���'b��*1(�w&��-�7�t��!��������)w���I�/�l�X�%�'��n��d�����1I����)���3s��!��zu����N��C�](��G�
��)U�������g>��+'PK�w��	:w���i�e=A�+���w��np������\u���Rl}�������z�������Z����V
��w�2.:����0��Sh��V(���B4�R��K��V�
�Pog����9kvw&� ���
��`�+$�0����t�Z��3�o���]��Yh\��;X�1'�UR��
��%��t��v�;aLGc�eL������z�CsS�d9-��T���l�pr��w�+_��E'XnJ����z�����c�V���
d�	�{h$�aE���puN��w�-�AOXg,<
|��G%!4W��W�5�i����+�����-U
Y���0�t��)G�aM�4�ancH���R�,xD�6�M�A�J����;�U����U8��
���pZ)����}��g�<���y��TU��!��L)\�=b���A
����l��������1����i�,��<�#���>5]����]a���L�f���T&����.��1����'�;-�nXn!����G�J����6(�4g���Z�����Zz���r.�>�'����������,�p��%�������94wqi5Y.h�w����ES�`a��
�3��0��i�z��������;\�����3g�V��jS�w%Xj���t�E���w���C�~�o�����Q_U�"�w�>,s�j7����I��=����wSd:����AOY�i�U��mX�{0s�oVs,�)�W�v�{K�e��j)��v>,�=X�R��r�b���X�)v��������a����E7V�"6'UwCm*��FBY�cfah����V�-�a��X(���_���R��n������^���as���_W�@����X�`8�+�����Y�-)����Y�P�M3���g���Z�E�6���hi��5Z,�;���nv�>�SZ�t�"��D���L!�,���K�k��>����`�
�bg��8,�>���O,R>��Z4���@'H��KB�+Q�8}�����EG!$��Gq}R���X�����m,�,��n��pX}�N���C(�PB���,���-��
+�C!��PD9,�>X�Z����bY�G�Jg��SZ�}�&�,e��\�����DV>)6U��Fj?�LASW�V�va��2�`����z��Bk���y��Zk�z�w��1�
����a�����E?��v����P���~@������vC��A��(����=�^�GM�7���3sA�yX���&��mN����E���g��|/v�y������h�e�j.���+g�mx��h�s��T����GV�)���m��vbYI���z������zSg-c�iZG��)�����-:o&;s�X7��������=���#`=B��e.;s��Yy����{�R�G�.t��H��&z�*C�4"�O���7��-��
K_C]_�
.���l*��'���f9�����aBd���l��l6��
�o���]����`��}7Evd�a]4t,�e��H��>���5���K�;�;s�&X����lV	5�M�ku��(:KS���az��<��2�@z{T\�u�]����u���7b_��l*�-8���{� �-^S 6��7�i�o���^7���J�vC�;A�]�?_�c����U)��+a���\�[�Np�
����zg����e����-|�{b�=���2����n���|������.8@Vs������ta?�"3����2��r�8����^��sXUy0Ue�/����p��-�1���HW��VsL��t����^F/�6�h���=X��'v�`�fz�������
�%Q�tum�z��y�f��<g���$�0���+|geL�Yt��e��,�<���4[g��0��]�{aX������`����F�7�S�v7E����&hZ�-9hXS�u\O0�L��E�-��i�`_xN	���3�����������4�DwXC���U��j�
���^x��I&�����)
�I�'-:_��1g=�k��n0y,���au���E��-<+���o����7�JD�(�X���l����M�=�&�V:��8<`��P/J�}���A?�g�Ui,��<l���:��i��^�����zL�h�0!�i��M�w�.#��J�5O����pSP�7t$e�/������7:&�*�U�G��D�l)�������s�)�n*��M�7X�'^�%����`+5.L�T4~��v���
.^��U��)����nP��9���B9d�oi��w���un�����O7x
��N�C�2�4�/���b����ZE�LcQ�
Cc�[����+m�
�&+�ao�i��k������Jk���j���S��I����������,�Y7����J����Y������	��ll����i�w}�&��+*�V����JK,EC�?�\��=��
��W��j����I�n�����]���3�,���^*�����.���Z��Z�:A�0�#�%��L���/��2�������������/:���B�Zju�j(�P��������_3�^�v"t���nv�.�BD�����?�m���1��
���^��72��Z�b[
���Yh���k�����D�B�����dZ������%a7T��0�V��H�37m.�����!��4}�ckf��XA[)
��K��o�7�O��Ze�XVv(6UvSd?�UA?y�i
��A�_V�"6�#��7vV�/��'��;Vw#���������e��bo�w[R����\Kt�F��	{�L����	��1�����%bs��nz���R�i%O8E��N��F�
OC��"�������>�������6��+���;�w�k��5���tT�H��� �4� :����	#$��}Y���J���fj�~?45�L�Lln,8gs�`��v�X��hV��&�"��W�q�����h��35[Nl�0R��L#V4��n���W!N��N��*����v�G�������tmE���,����6���cw��kMk��_d|��k7T�^L;At��`a���]��w�:��7���Hf��q��P-�;�(��Y��N�j�@�R���iyZx��h��$vB�2�����cz_�^�p�
��&y���
����1�!���i��	��Agq��9��0Tn�Y�#����K��p�����d����?�?��a��7Nl�
�i!���qh.\�F�,]�&��C�[ht����H���w�0J!����S�pX�w�2D�oR����?��[��zZ�6����HZ��=V�%z�:T�7�������z����#��^'�z
U{���^��*�i����^E��@S��z�vC��Ng&�Y*n�5W'<���-�Ucw�`���M�7:x*
�b�}�Q/�f�������>��������:�]0�,W�������b}�\9thN�����Pl�����d:�a^�U����uNOK���Sv+e �����{"t�����|����<)���_$�*��l��{�w���i����DC�=���?g'k�o�
�@��������1�`��������m���^�S���%���$�,pnE��Q�
�P�T4L�Hh��b�������Hm����\�Y~g�Sh��'��� X7�����>4'�>p!��7���S���;P�/����!6K6������f��Cs��0�^�LxUt�l9gimC��m:gW���O��^��=�N_����;���Ck��	+8���
���%��b�����>qq��n���?���}�����	��?$��-(YN+�N����6�+J��j/�]i���d���aYp��f
��B�;���yK�N�F :�
,L*h���%W'S�4
7�`�k�C���f������j`+������ �^�[�v2e[��}������PD�X�9{1�-�<�j�0/ e�J���m'��`�P"�D��g�m��N��,.�X���fo~�������O��"{1� =hx���|��n�v�`jr���l�eq'�!�o���,]���/OE*�nk�N��M�/������S��|+����-�1�O��rg�����$�0}?��u����N�V$�X�Z�o��9{�v{_�xZ4� W�E��h8��n<m���iU\�}/�NJ�W�n���������
[�������+e�V��p���.|�+n�����
������A�������`��T��Kf+/��Exb
:�kr��^���W"�Ex������>��K�:����M������k���	��]�����O�-�v6-|o���/rh�%���Cs�8~�aF��.�f���3��f9����M��M��I�J���>�T4��6K���w���sY�x1�_tc!�+B�J��,j+6���f���Bs��I,����e��E��5u�e����*D��w���!gdY�}������P_�3��.�s�eY��r�����k�m7����I]�)K���@�k7�U�������}YjU��4���3�������:g��],�l�p����������Ib������R�����2�b����;�l^�wC��<a��U��}Y�_l���=���7��q�.vz���y����Q�^��rYL{��F�z�|�X��e���E)^�-������Y�����5
���2S}�n���X�Lt+d��u�S
�f�93�'�iw�i���4���9f��9�U���0�,��������b�����E3|6�2��H�)���b��a�Tl��u7T{O,*,��4��F3���;P�_�!� �nv��1ei�o��w���0�e�O%&g�d��*�������z���f�%�����}\�z���F�S&Z�-^��O�Mgu|^;gW���=��	�y,�R<������\��1g��t|E��y��TN���*V� ���������iVo�e!����s����Tp��^oVLGS�]zy�Y1�@�z�b��"�|�=�7:�,*��e�Qb�Mfba����S�nz�����Jl�
�������CwA~zY�w������*��K��*b���p�uba���"���`zX��-t�-K�.��%:K���v��8Nl��
c.��.K���T�vai�����i��-��-����\�
.Z���&A8>d8�:sW��L|X�[9QZ8+������	���$�"������B�bie@�����MIx7Ev	�N���8gi�/�
W�!�5�:LxH[x�-��3��
�p���n��C`�e��R5X(�j���-����M������PWM���`��X��DO�e3dV�=`���p�E)�T�1
����7������aL,XZ(&)��c�wb��M�b���n��������t���n��a�2����l���J�bm��oX�,������Fe��;�5m�F���[�5m,w���2��2�r3W�nAiY�w�Xw�q7�XZF.�_X-l���"��Y%�[�����=�����f����+A*k���������y��
A�Ci���HlA�{Y�u�B���]��+�	$��6��cz_g���_&*��Q�`���%Wx����c=`�Z,G�����@�����W�����	���*2�V�Y�	��
�4�����KO��]L�V4���e���V�]L�Ut��l��K���-�R[�U^�����c�!`-�����o�7���A�1����.��K����ZQT�R����A7X#,���Ej���A����p(�QX���
�D��eg��:��o
���vXg</|���\�yZ�x]0+<o���`PLva$Wv�H,��B�W��dP��J�SZ��]0\��[����(��K��J������?�7%�v��{��	�VOe,0z3I4�--����F�:�@O��rZ�<l��?4���<,LD?��mA�M��6X������Z^��������x��H�n�v��N��V�� �Tx(�UB��Z�R��������I��.���,��`���81
�����&�0�lv
w��M�������!����ZZ�L����`<|�rAtYt���1+�^V�\08�t�/,|����`GJ$���{3��"���R�<�F�$.�9�������������$+�i&7c��n�V~��OI�u�y��{l>�C�q�>��@�P�&i������@Q�3�� ��z���j���]�(��y�����cV�>fXF�(fo���R��0<EpY�.Q��	�f����0������d9>�*�7{#�����g����������f~�e���n�����Q�7Wv�{l�b�M��.�0=P��Y��`�E=����4�q���]���{���q��gOoT�����QQ������~���X�s1�/Y�M��j��h:k����IE1��2H�7����\������]��o�
�M������h��|��n����3�`�v�,�]�������*/��j�7D�
���Qn�,� 5���o�����E���NT������6�y��F���������TT�a�0�e5��g����Lw�o6�����.<������=����k�
$�7�K����lC�ut��������	�K�x���`'J�}��]�.u�����c$d~�/��0���k��TT-j:g�������-��&*	0=�{�<��R�]>��Ff����}BU���"�����2���\�zm6S���B�������'�ob��VV�7*���G*��
�l���v��r��	��b����@����H=�;sv	`����;F;}w�MT~o�H��C�����-(�������Do����C���L�t����B���O���M7��g�������������`_Ip��tY�P��hr
vi��}hxH�Nr��m�D����P��l�>�)�����M?0����?����Trh.��j0�5#���;Z�������v`�?����?��f���:W����hA�:M'p�c5��jw&��0Z�$0W��$������AS�=����������i���+A�fW<E���4��zvS�u��v��W+]gX�l��M��r������I��������D���m3��kg���f�����(���`�������v�`��+/NL$�Pk��q����}��i,W��^�"����0l
8_�������z���?�~��_]�����O�\V��y�� y
���"�\��v
`"������b|�U4[�#��E`^���*X��]�Re��$A���������a�,\�"���������*���s����{@�7��b�]��������[Y��6����Ue�RA�NA��c�k�{u�
���C��0�Dp?lZvSdOF0{�J�nIur�v�i��`�fB�f�����
�{��Jp��[�/��k5v����})w����9�@t]����<g����u�z`������4�} �h�V
8Ea���c��8�Fh���S5,�n���J������
����J��+���w]����i���|x_�i��_�iK[�5��J���K@_����`�J����L����4kws��%Z�& ����m��a�J�w�hwC�+#��\��������
Cz�2�9�
�>�{�e�0�����6��+��T����u�KV�K�z>���Mz�'@"����h��FjwF�����WX��ev���b`g���.��K@C�$�U}����Y�Q�/�%�vE`�2h������`��E������9
s��N$.k���~L�!0A�KW�����x:�v���8S������Lj{��&��K���oe���"r���:�e�o��g�s����?��J����yB����C�4��n��{�D�nz�����z�����+�wC������b����J�`o�`J[�"�]�d���	��$6N����)��F��L��R�����xW�p��_|��8��B?&����a��Xv�� �R)3|q~�z�W���]�����uY�&uD����e���}��sF���%b;��]�#�c.��/����Cs��NQ�?���v��ea�|���'0�P�o1��P��
�5\�(��LwY��b�/�Y�I�,�^V)�XnP�K��q�Llc�,bk�����vxz��5�]�|�v��(/_�������qYZ
T����;s�����~��"��������.���Z�3sA?��A.�~_�;�4++������c�a����>�-��.�`_��C4'����C�VT�/�X_��h_�����EW�f�{��v�X?��'�w���0�a��"`����P�0]g��J���P?_�d�b��;|�o�,�$������q��x��U|��&hV�&�Bx�,��y^�I]95��&���~�P�2�l��Ne��5��}+�Z�:_L�Y��+���s
4j&P)�e=CbW�K���3���x�T��yZv���{L�@L]Yt�?g���WAJ��B����DwV�.��\�G
�Q�:Wb��W�X������b�/�6z���/7��&��"+�5](d���LC�7o��e���|���Z�/+B_t��us���|���kf}.j��M7���/r�fl7T��0-�(�����_��Q�Q.�:_0:bef����"Kk���T�����f]�6����H��X�T�Y���F��]0����f������b=���6��$9����svA�D��%��"�PTt�c9go��t~>6���~�U�-�@_V����i��D���a�FvYI��$S��]�|��Pt��gc�2�����(��]����e}���c�0���X������3g�Z�R����= ���a\l%Cdq���3�N���5���
�b+e�+����x�v��/+����Cs*y���Sm7To�0��&��M,}��!S���)�U�5\4g���?�2(��x~3�
��4g�D�o%X&� t2}�e-�b�-�e�/xH��1������n����Q����f���Xx��X��1W�&k3gq�Cs�{��^;
��5�/�	-�f��b�"��,�y����wSd�
�����b����mc���s��9{WJ���|1!�������Er�0:S�{7C��SN|a��R����id+hZ����OV�wz��
)�}`�xWt���vd`Y��alU�����Z1s�6wSd
�\���������4WY����Z��P��7\h���/X�*.vVBH�:�`��m�:gK9�_��S��C��o{84�����J=�U��������R�p�v�*))�:�^���J2�I^�K��{���d�a�2�?���j,�LK�%���e��4������xmW�~a���3�����`�b+EH�X�����	�Yf����tJ��k|����Z������v����]>�
-z�����U�}���wz+;��������jU���I1r�F�U~K;|LPZt�I#Y�|�v���
�0�6t[(���|s�l������e�������ZK������bMS�C�>p?�
�d�����lSvSz3������~�����/�!=��)k�K�e$c])A���O�Ag��s����.7�%v3d��U�~`zS�aoE�9�{L�l�X"�|i����'��)���f���M���3�����X�wG��fiN�[�[�l��BJ�����{���L�����w�����L�K�`��l��I����������Eg�s����X�Q���k�l)�ml=_���A,TD[�Q�})�.��_��`[�p�2�?I@r����M�������s�~*�K`�c�I���`���d$,E}1)�������j%���k�,��a�Ui�E}�r��{%�lI��)JR��a�4�V������-����IY�W6�V��.�Q_04�
E������{����o��
���to�`C��"��c;X��ljA�=�����*	�������,��3����n�B��XDC}]�/;��e�'b[���-F}�,���J��� �n��#��N�t�����o��
��z�7;=��f�S4���,r.�������NZe.�}���VY�Y��N���]�[������[,y2��x`V�"6����r��*�D�����]'��_��+��V��}*���A�V�`s-�n�vX����g�_��d���x��t~�V��Y���}
Yf���U���M,�}��9�|��9��&����b���_�=#v������E�{�p$�l7<��f�YBgA_�����jqD���#`E��j��p��GgH������7+�B�%Xx��m����\��,�
o�}��^�r4���b"I�iD���?�B�9Wvh����bW��������'<�H����b�ba����%��U��=m���Zk�mE�Fo^�,v�0�d�`���R}���R�n#�|�vE�v��N��x:	v���eud���[��������E
��(���*��b�m9�F����[(��-'
��D?p���b�t�����-'}��$���)�p��
l����|��5��D�����9�O0�t+����f�a�J����{���[0�
I�>�kCn�+C!h�p���2��H��U�x��c���sw����a8Zil�-�|�8C���HZ��hw[����8������7�tK�������DEO��kR�ad���Q���`��r7�������s��=M2�l�k7�0T���w�\��~R������l�)I���V���8���#=��}w^\�)��P��l�R���Y8��\�t����,ig�_7{�o����.��i�[�����V.��l�D`�����9K:����z]�9�!]p�y��S� �N�lG4��j������{��N����=j��I��p��mi��)��ff����A�����Z��X���z��5�?���.�Z��1,N	*D��9P	:WN&e��(�����3LcY��F�����t�%��T-��Jy�U���1��FZ'���j/����^0l�C��������1��|�@��a(8����?�vV��V���T�iL���B�M���{?nkA�L�I4������c���`�������nL��c����GZ���Y�9����}L���Jli���w��K�CkA�0�tE������:�E��T�7����r����2=Y=`��D�+e")����\;x������P�^4���"����������h���e�����;+�]�������'��C�qprQ�(
$;K_��	�&^&^K!�AWXc��f�����7:��������T��0�lE���(�
7���(��E�����r���EJ�i�m�KnoK+����2���d�-b+��/�����d�R�l���I$5rd��E��	6Sd���)�~�vln(�
��k
+d$S����P�>����waz�
&D����b����`��wa�����7�Q��{01� ��	`5���a���]3���v�k_�i����`�Fl�+��\�"�@�������2�H;���J��
�7����p%fn�������P�#�Q�e�������E��/z���\��yJKSi%I�$�;�
��j?j�
o�o\�*������F����W����U�w�����'4��`A�
�@+�D���L�Wt����]�k��0�,]l
UE�
���{o�7,��s�2�YU]8jX���EAS_x�oZ��l�F�=��� e�"�U�b�[�A����s*��M��6(���H��������0�c��
e7�v5���-s��^z��pq�cufxq��\��3w�Z�D�b�2���fU��c�~L������������'�e�=��%��&5��c6?&�D:�����X&�a�����5��
�����(�4)�������9��,��X���^�%�-�3k?l�Y��������!6;�)Z�"�cFE4G���Xx�����l����X;�aY����m�"�z���"�4���
���a�N����b���{_v�i��fD��;[f�ebsW�9[H?����S�\%�\�}z,��� ���eV�V^;{^���/l�I�R2���K���E�^�L����C�������-�g3�C��Y:tg�^]�b[g b�/�.K4�-$$�?,'��`�����N�"a��J+?�pr_�J�v��������Y��-3i9�Kk�e��b{!��X+�aE��+a�e���;��t�vVyn��B����PdCt���`ab���h.<����'x����}��1���s����4��N�`,b��+Y����n�L6
���v����<d��[)|�f�������`]�"�X�}�*���;���+r���.��!�of3�V�~`�6�3b��Z�����1������h�P���v��clx+����G�-Fa��R��Z��V�Cs�7���9�����4\	"F>e�4�v�`�(��g�`�;�]��_�3�N�\�]���^�y�V��x����"L�o�h����a�D�'�C��99g����^��XE6��~a���]��;�eh?��$*��
����������'E�k.���n�v'R�������;s��a5���`sM�n����W����`inA��6�Y3$��p��c)��)���}���bV]�'��������X�.�AwV�+�?����t�E���������aR-�Y)���������b_x(�7��6SUz��(�M�(�k���a���o�"�lA���^9�1���y�^�lg]%�'��[Pp~,9������-(b��_In�!J��y�D����	S�AH3�������Me���k�;ay����L,��;*[����������3g�
��A��J8~�� U^Y;|0�t���W���������5��e���(�q���1��u7���`�.�	���\��},:���$��n�|,�
e�D���g9l(�f���By�/���`�&�������</J�����"Nbs��9[Q�y,��@g���y8�{d:KiCUP��k$+i?����p����tKA;s�`���h��,�0[�������2��0���L���R�mnZ�t�o����?t#[�4f��>T:^��[��a����&(-�
v�
^va���VB8��	�Cs��Z��5��ZR��5x�hv#��#R��u
C���muh��,u��5�����
m���V'>|��+
�JM���M�i7�vc`vG���L\����:�� ��X����Bc���,�X��a������3��J��Qi<��t��]?g����)�K+{�~a�T�
��e��_n]jZ/mi���4n���c�)������4�Z��BHk��_Y.���A7X�l.��
�;�-M��6v���o���l�����l��n1�M]�Y�i�'�e����9�4?L�Y�(����a|"�|�:g�J���v#�d��
S��
�z�xf���\�]Z�����e��P���m��r���{��.�o�,�0ei�=)�������]����^�W����b��Dfa�|�o������A���]q�,���a.A2�� ���X���(l�~`
!�U�
����d|E�0��������-��{EC�b[��A$J
��f5���D�������X�A�`�Sb+25����E4��\,J�-�6�6��"z��Y,�f�
E,�:����D���vV�)v%�������)z=E��m��wbaU�G�<����1�����vO/|�����X��)�s�=7K%7��=Y���Y�����Y���'��^�:���,7k%�oE5*���i��=Y��Y+�3��)�m��y�������qc^���
H�B�B���I��pc9b��E��b�b���9\l���f���J�E���P�H�����2i�Y{h7���YD�/�U�F7k%7�
��.��������,X�Hs��$��>�7����5<7x���2�"�p�7��6[z��2qh���Y�d�Vb<�j�tW�4v�k���D����|M��k`�99��)�o�T�E�1��S�
u����Sj��[�=�]MVd.z�����j��BY)�����v������)Qj��h��� ��,����y+�	G���|��o5I�����*�ES�V�U�����"�9>s���]
���h7E��X��h���J�������i���q�@��f+9�,7�"�n���bG�M�~az��z5bal1�����-�]�J�����?��r����T2,l
�����:�~fZ.�6+-���d�����^7��p�T�h1��Y���e�@�Y8�`�0Ava�+a���k�b(k"���K��B�@Z��Lc������a�����fY��Xxo�X���)w�k�	V�HeL��Y��YVV-v����7-+����G��H��n_�7�y����Y���Xi��k��belz5jV�,v��&�����]EXm�$E�R������{J{{��m\MH�
��;���_l%�����b��sET��[���F�,���,8�E�0Kl.�
��1�=a����a����LC���f��z�E7��l��8�x=	�� ��,���K>��FZ69������1��oi��?�������I�"���	�n�����>3�9KUfR���)Rcr������n�n��}u�{�mL��la��ucz��oXz�*�Z�A�=�C�����6kJ����\�*��Jfa�i�9
��"{@0�e��V]����{=�����6
c�����`K<V�nL�Z4-�[��lV��Owh.r�����
:/w��l\oO����<6�ia��R���+�w��7��~��Q�E�fQ�������F��y���&��`���� �7-����������
v�W�PM�]	OX��!F����"���TB����I�W���9��0�!Qi����������1����T�}�����
���M���J'�%���qfNb��h���i�+�S�����D�+!�7&�*:{�;s�_a8<�	[�%;kd
_���vS������Z�,�����l�'��r�g_�)��3�}V�Ju�iR��/�������+,�
���V�����p�^#�����Nr%:�Q+�?�vf�{��p�N2��M5Z�u��\'l�:npkz������^��*��B`��#�A�J����
�ZD��`s���-M�wu&ul�x�D2[�8��r��A��zF,,�
v�0��M��	Xj;{I��Y&�A������9K�������c�'`r��'�Q��=��N��5f��Fb>��v�k_�L)6ZK,7��Kt�E��l(|�,n����/�JIt8�����}�������k�>fT	�"1���I[����V�4<��{�F
=�`�H��R-a��O�AC�w[���������>����%��L_�(	�a@�,W��VYn0�����VYnLeYt.�;gi�k�/]N�.<0{.ohV�n�O\��/^X�gj)R�����~����f�`������kYiC�|/���F�b��XXz�ZE�|)z����d��)���m���������>�H@��a�#%�w��xz���JP�5����	��EH��,��Q��n��g{��
���X��E�G�=�~H�>��e��,�[8��V�~Y���\^p��[�^+R�A�|�=��v�;=��k=
�T�U�_��H��	����f�Vh~�B��>O��VJ~�)�a);���LR#���+�<}�P@���/��X���P��Zw*���*b'�����l^iwSd�mE/�>]jp���vEXn@4�yX�(���~Y�Lt�����e�b_���Z;����aIx���A���H��U����G�Z��e���G������`�H�;K����h3T���K���I��El9%awC�3�:�E�p�nA3�����Bx�_V�#�.\��Z^�ej��'P�2������S��J*^���fl���^������R�bs�y7EvF�nyK�����0���)X�e�Q�o��!6m��j���j����_���������Cu����������/\;
-*�E|_�
����P�����)���2U[��;�aV�!�.%��Kl%�d
��lA�,P(�"���������}���h��(v2���6������t�E�_��*n��|����W�v��b�/Lj>�k�4>,���"�k�cX�-�eR:b;L.��<������C��l�&�}���PU��T��f��1��<_�`��KW��/3jw���K��s���U�M��n�vQaz@��L�G,�X�l���x����/��Z���[�vOi_�h����v��X��*.��V�=L�_&8 ����f���j8O0l���`_M��3��7@������'�`�>���6V�,��kt�Y��`����Z����I�����K6���P����,��f��0�m_�l��lW�OAl����T�LC�F2��
���2�/,�l��S�p��XxQ�X���oo�fz-[�������=h;s���������5;P�_����,s���F?pa������h&�%�V�����=��'&3)zU�a?b�L�W��j~w��@�)��':gi&7X�.�'���t+I
����d"h�:`���xa���b|�w:��f�^]�tg����Py����Yt%@b����~��������wuX�m>fH��O3����|��ZDE�)
����B
������3���3A�(�PX�l.�=�}x���0��[���hq��>���B8��4c��������Z]f�c8
k���%[�� o�35��&���w��[OY��h�n���i[��->�>���]iU�44��Gt����a�$|	?��><=oA���5��5����*:g��K�{L;���()���k=��	����
�]�D�Q������7��0�v��7h(D(��p�J���=�V�7<�K
��
�Z
������'�����v20�-\��Z����-�]yy��v��i������� t����siz�{��h�P�Z����CW�g�+�J[��6�{�����}��nc��UVx���3s�a�A���Z��X��69��j����9�fd6��f��"t,�.?�?f���b����}���]q���_��o�t�N��������\�km��e[��b�>����wzY����B��40����
�a{Q�Y���Z3S����D�W��>.<�Y��p�����,�����������c�o���A�4�P�Q���r��t����u��}/��v��f�	v��C�;s�E�t���a#��B��*���CkO������/|��Rhp���+j��|����m�����*���*S����=`�-�|l�.};���lUVo��YTR�0���B��v�#�'���d�S5�nz����[��R�c���?�E����n�������|��W��e�����q�[���eDtg�$bV�&�yMF�����Iu7��g���.�����E�W2d��P��x�{B��Da��4O������]�����y���98�� ����-W���%z�>��{���g��
|��v���{z��(���u��c�b�9�xhn|��8goV�"��r�0�+6_��������r��9
����ag���O	�.�����9�D]��w��wV�%^so��)C������E���������-������P�������f��=����%|E��w�l8���X���w���v�Ma������)D���k3�n���Y��������D�R� ���o��
��U�4�{�e�b����������ES�9X(�+������n��2��5/����M������[��,��5����ak��{f�c^�$�cN_�n��������������
�N�
�.������I���\��-W���%����v7T{#��Z���V������B��[�����t���u�b���4�.���"G�
7L���pC��P���P+���[��3��ts��wa��v�>��|�-��wEy���nM�N�*Mk���jW��
��*��!o��pDtg�Cb������f���������,+v��@�4�Sy�nz�������+���h7T�"L[�4��3Q����`�"�5�����	&��H>v����-�_6�,?������f3�*t�ukw�M�/�nZ�-�����X�p�uA/��������J�F�.	��AO�
j����qb����"����I4�MZ,<@KB����p��7�������	���L�Ll��[Q����Uq9�*���vL��T�B�O���o�:-�N
�@��b�M�n�������%�n@�.�b/����2[��3a[�--@;sv	�k��G����$�
��5f;L�������9o�L�U4����w5F]}����
�i�.���U��K�����n]��0D�{%��� P���`�]����nY���7E�B��9���zuI��w�uk���H�n����L�}���i;<6��w�WX����T�Z��3�V�
���Og���5�{J�0u�b��ba��X�>e.���-t�vK�v:E���A�Y�d7T�O��
FC��������n�������+����N��-��$��$x������"�^��V���m��V���
�~4��������+A���X��
*���1��B�����I7���(�.vK�v�:'M��,�z����`G%�`y��6A����m�/����vOiW���������}>��"�X�6j��j�	�
o;�n-�Ye	�.����3�����V��[+�Cb���LX����[��M�����������tfEC=o�P��vKK���]���H�U
����L�o%�E����spC~���K�v�k��bW������b����w�^�tY,���J���]I�[*�����I����FM]����B	����F���	��/<��,V���L����Q������ba���b+1+�����'<MI��7�}��=�=M��2_\�4u��V^.�!�f��"�L]�Y�WX�����(� ���^��S����TA/��g��p$6tJc�R~k�Y�$�`k�>���Y���\��E`g�^��
z����^�����c�z�#�IvSdW��.)��)���?���h���E�D�h��/�"�����J�v�`�r���-�3z�nAn�[������p�^k������J����,�[���ln�:47����Yxo�����`�
��)�3B�;l)�eXB�&��`t9��U�z;2�+]�������`�Bi��"o.u82':��������..��cX������x
������~���y�bg!b:,;X�X�b����{�B��^k�}3��c��|:,�:�d���"G����*O��������	B{����b7����=�g �������I�����N�`�<���a����OE����>|H������9Mwf.���^`����Vn$^�2~Pz{���%Wk�
u��NV�(�-�/����p�E<����\�&T4�R��ke�7tD�r��2��U(�~��%�W8�p�+�Wu����`�o�G�2�\���P�5	���)�����9{"L�Ut:T���#`Ay�p�Ry/F�G����J��)����V"�G����0�Vn�Vj����{�a���[���a���tKE�`���
g��9�[���K0
"�T��:��������a�U,�/�,�3�~��:`/:L��e\f1y�WW�\���N�}��P��5O,�u�V�������G�����`��%�E�,�#������]tV6���;�

E����9;LJG4
K<7n�V��_�g6��v�k���N�fI~���Hl���w�|�\�Y�v0=[�L�D(�C�Y�|�BT8H[�v��M�P0Il��=g�4��)�915[�P�F�b��bKI/+��"�Cs����T�0,,�
2)����j��\\������n��j�`�������=�Gq'��oz��Y:k3��90x��}��>gaU����s�f�����G��^{��Mz�5��+o��c,�����;TvC��	7��'=��^
��Ll!~`����E����~�T'���6xNi*��Q��&��j�E�f5�bGe������
m|k�:g���`n2�����";A��\t�����NP�n:�����]��,8<�Q^2������a��ix[	�Z�*���u�:��N�6�����o���OShAO��;`�DvY����>���4
THQVV;aZJj�p��7�������Bb���z�AO�(4'+)�+g��Cs*
.l��W��Et�"�a��������)0�'�� �5���2�aYLWYL!rh���+���U���
�����e��ih�y+%X�ws��Pbx��]x��(�lV�M����.�iKM��H�M@� ���`�"��RE�5�ac�i�VJ�p�t�
��u��U�1Q�f���Y`���taO��
9X6���^�@0.t�?���Jb���bx�Z��u~���R3�5�\�%���`���n������h��-��}?,<��>�w�^	��F��^�����<���h��g����SL��.���vj�ax{�hZN3T��QX�(=���mQ���#qC�5��]�d��$�8��5XZ����T�Z�x�����$����=a�b�Px��N^��1���������b_x���a�=��Y�L���i������z�Pe_4\�2�:����u{s������@�`~���`���b�����-�4�����)��_X�E�J�vOi��4
���o��
���������wW�������9����i�p��|��P��1uV���:�/���
��'j.*9+��(+:_?�3�}�I��
k7������Z�b������� v��
��A/��D�F�f������C� �������0�kY���z��'��;�u�`���;+�V~o����4R�����B��j���j��v����$�l�m;ga��_.�)<m�Z�a[�VgMX8����b1K������EW���v���G��=�iM���
������0��*,��XDC�d��,�e�p3��-l�����{5��m�m�P�<���K�"�Ba���|j�=e�S�I
�}��������]V�'�N���}=��}g�m�bo����������uO�5Cn�	q�e�Cb�����Fl���M������K��2����jw���O	'��\ 6+G���<T83
z�Y�w�h�h�J����>��(:��|�>p�v2��i�b��Zm���;�6<Y�]��St������T`Y~[l!�7-r���t�QV�)���t��)M�2O��#�<&�e�,���[��>����b�����'��Vo%�"����9ushN�U��%.���f���b���B���0s��>�4K��]����E�'������f�8Bg����W���9k$O�f������L�I4T�{��J�.��N+O��
oP�X�,���cfU�bs]�nz�A<�w�`�B�����d.��l+��O+,������*�pA��\1
]���	�<QY�I��x�K�����i���j�E�~%��pw��tp�r����>H����2-;<a�&��*Y��K��^'?1k��5�6�k��	#�A/��-\�7-�<�����ra�����!����~��bS���^�7� ��J��B��	-���f�w-�d��:���Jv�B�PXE4���0IV��\,D�R�nv���P�m��m�b��Q[e��k�O������a)������ZH��������D	<���E�']�N��5�BJ������+�[��������a(R��t�.��6��z��[�JSwJ*����,\��*
7�`�TA��";�����DQ8
Z�J�n��]�]"���m�yJ�)DX�5��3Ej�
V}������������EAg��9{�LBTt�E��[�<j��K��R�lIjx���������l�7������q�`����J����V.�`=�d�`���b��n�����L��rE�f.e����J����Y�{�>�4���������3���{��5B��G�oe����d
��;�V$^����Ms����	V��n�%�����'���J<g+�<O�hO&�-��r�`o��K2NQxmt
{�����^{|��4�,�azEv��AJ������d��W>�^�hXm(T�K�������Vz;�L	L4
a�*��/����Wy����������-Y���aU�|�������b�v������	�O�8���k[���[�PM�l:j��^*�TX����N��O�&$�6}[�s|Z��n	��������*<�����>���bZ������o���������Ir�$����	��~���6���j��<�^�&AJ���ie�����U��cN^7lO���1�1�-�/��v]w�W���,]M�r1�&������~L��=:|����PJ����[P����"+���(�}���D���O�y���n�!���dZ��>'z���t�+��}6X�t��]��A�D,\����N��OX0j+xV�����<��
���bqv��4������S^�
�z�B��'��r���,��*�*� ��O��7/��e���Hw����b+>���'��
:�p
l�^�i|Z2!9zXxl�F?g��-�2��|=*�m����������T���pS
�p�����d���,��CF���YvK��]/{�t?����6z��W��V��0�t����jT�T"j~��=g��4���n*,W
���;e��<M��0�&���S��w���_��E%���>}���;A� ���E>������$��S�9��3ggV��������1P]��"]%��4�J��WIL(/�$Q���%>��������K#�p����P'#��uf��P�J��_X@,��5�JK�����HMte���=/]Qi����^�Cs�����,m+��yh_������^�2�������v�os��
@�;���
���i�p9�2D��,V�"��!�)�<��
,�;�4�6��&v��Q�#�!���������6�V
����� :��t��g�]�o�i��M��)�/���������`�y�fA�e��E�����K.�����c.��/���~�e!|��o�#��-�y����	�k�U�;��"����Cs��4��K�Rppv�#�<��|e�b�P�K��}X
����>��bVb[�{y����2�a��Q��/�����Y���^�q\��_�GQ�����K�vC���j EC������P��jh��[���E���#qw��H���yY�^q)�C��R`��[�6��g�2������C
�(��;f����"K�C���u�}�&�]��X��_t�_7�s��UKv`{���eQ����MW������E���+���L���;;t����]�����B���$=���
�����5%��A�s�r���D;=��jO����GZ�����X����nv���Jh�����%5bsc��v�X;��|r:g��"���]5�����L��S���s���Y�~1�<�/�E92�
|t}67[IJYD��5��������B:|Y�~�E�
�,��,��a����������E�����/Q�w��,�S�q++�]>V�.��!�--�vY	���Gw3W�Y���x�H&��P�Sl�"`����X]���R;��V�h{m������[n��������������v}�+w����z������,++:`T��)���!{LI[t�n����
�9M�\��wX�#Ak�v���eQj>d�n�-\�����XS�hx�������Xg�PI�3[����S��X7�-Cg"X�
�aM�b{Q�M��	&-��a�[���4�3�9��v�����a����;�1gn(� ����������M�����b���o�JH�5%{����we��,�b��o�k�����
����.\��,�����*FP���1Ak��6��-��-��8��\:���'N,t�e�-��-+C/�`&��C���0A�Uj~�_���[+,����Ww��M �b`�/XzR�����fz-���^'�c��e�RSe����EC��z�]M�G�������v�/�c����`&�e���������i�<��k`'i-W���u�/K�wK�5���b��v��*��'�i�������`7`$W�Q����(���Jr��e���T�E�B�.E�@G,���\P�\VX^�����X�� �����6�i���L�CoF��po�����c����u���8�7�`[I�Yux��+����l�pT��0-���0��	��+_���q��L���;��"�3g/�	���t�Y7x�r��U����T/AB�p�����Cy�b��+�i�]L�W��J�N��3�<��U���b��o�ef>f�;�l�4x+�
k�.��+��e��H���oh��K�����s���Z�w���y�H��yW�>D�l2
��8��e�4x��'��TW��^�0�.1���l�JPH�mH���4�4��c���$�`LD��0&,-��5	�MI������Q�����Ui����Y�.t7E��`d_4<����f�s�&H������eI��A��(X���O������Y���"����K.���y������tMW�,-��������`i�B��0��1�}[l%�hi�|�����-K�RY7��V��,��`���J!�5^�?M+H�[���P�F��V�7���[��E�~,u��@;|Wcw�k�JV+/�wg�K���c�2on�\6a��8l��L7�]�aQ���E��{�i�\�"�9���j@7��wy�!��j���<6�.B*��{�n���j�v����d0��4���&�?��P��n��t��
�l;o����l"��{�i��,��?�y'�0<Cp���:@�e
gf�=^�'���6���7=��\��J����Y�<��%Q��ew��A��l���+����1��D���'�?���4=P����[,�|6�UiwSdG�	>���T��?5�Q����������`G	��n(�o��/��r��������t�;_H��C��ZE�����_���9�����������L3A8��z��P�O�2�7����&��|���/i��)���������[�S�������/f���fzo��H8�46���Z^�}/�53�Ft���:4��y��`��V�f"�����N�������"�$2=Q'�Y&�l)�}�V��!;����`:CJ��`��������Lw�G��/f�Ef����)�����M���Y�������l?oj����~'��8�l��p�I�>q��>Z�L��l)���"I6�`�T,*�2�R�&��
�����]��;|L����c��9|h$�j�A��f�5�f��n����j0�7t��V\	�?v�P-�i�zIp��j�?�.}w?�����`7iq�f fT�aa���
��P�c7n�R�E��f������)�� �?��2u�C�kz���\a�Y��}`�=�O������{���nf��FXFj�2�������?��
�6���>�E3�_�3W<�f�	�*������S�6Tn�3����V
�����W���[0����f�X�'9�J%K��G���s��������\C5���E���NT���]�v:��&����wLW���V�t=E!����"�1�4E/�0S%m�cF�
���W	��1�M=?	h��`�7,��$4vSd��<��{�,y��[�F����,�!IW��{�J���x���#����K��
�wC��g&������K9wC��}b�Q�_$MXM���"�>X�s.z��{�E�A�g�/������_��a�5[��O0�+�n���?��b�w*c�=�}/��6L�J�~�a��K���/�V���w��vF`G�D�a�+G�"]�KQ<����`'5)�.m_�N�/
z��a��)�Y�U�,[g��)<��]�1H,�t�a�`s}�n��c`>_z������]vT���~�h�~+���~,=������|_�9{�m?pa�������s��?��	��D��wf

�6����`'<�;�/r����~��$��&Bq����U�}�4���P�T�aL��I��v'�v�iZ�,�x��������)�O���n�b�I�L��?���
n7E�E`0o����4G���b��l��n��iIZ��7�'�}?��/�����k��AX�<��K��xbX�6�7M����������}�&U���=�}M$wn��&�`t�-��W����������tI�*���m���E��*�}k���F{
]���O�a���� �s���my�bU�t�]���6�;�Z�xP�0�k��3���C�AO�!c;�hO���1�����)���uM{m�5��9���d��:E����vSd�
�%�k*�-9V,�G���^gc6����j?����h��OI��$J����=����M��W�r���G�=Ba\p�P�pH�v&`s�TQ|LY.|��;3����������uK���K���w���&`�a)^���`o��v�����9��}�pD��}ub��]�`[%��<A���i�!���e�E�Rj7Ev�`�N�6��.G2��`[�%	�e����������/X_!�ux[_{#wC����)��
3�_�a�o������w�
�e��BmB���=\���.��As��J/��+��R��O�eAz(�&������)��e�>b��M��)B��hc�a���.+�_L�Wtg�C���7�/;�nA����~.�84��y��������D��V[.D=/��_��^��Ji��Nr���R��0�e!�<���$�
��c�!�����?`�1��wY���~��[p�����~����e1���p����~����*�������e��L�D�[�,�1~�PNl/�]�������O���Z��U��Y������e!�|���g��v���v����U���/&�/����7k���(������ads���Z(a}Y	����bg���M�]\V3-zU�K�_,
pY��O���h�-��^�nv����&���k����	o��u��-}!��~���b%�,�tf��yN�P���������/x��$T���r�e%����4��y���
�~}y,� ����#5X����C����A;s�]a�C��E������m��5�/���fy����g�?�J������U���uV? ��R��en�p��`��#�����|���'��y����p�eU�����~�)U,��;�&�j���U�/x(�-��]V���2��� !}Ye�b�+��"v���G�H���a��"{A�s:M����w7T{20�����V�4�w�����=�`{A�����c��z����,�I\�J�`�R4]
(U����l7�w�ko����^�F�;�vX��4�(t
4h��}���63d��������b�d�a�~�$��~V�V
@����������P%��6k���w�����xT��9,%�fy�1��0�r�7�����%Xh
vj�/��_�?Y�
�b�����JvOi���`�T����2��z���
�Z~��f���h���X�����
Oa��6�������W��"2��o���`�Yr�����6�;�n���/�r�:�.�����(���CN
j����OE������Y�g��~���+��4[���������|��n��&���hZf.!nX�"����d-�&M����'�|kJ�.G;���l�W���s�A������ b���{L{10�,n�R��W�sV�������!�������w����h7Ev��t��������(h��HI.���T��{H��O]t�;g��H����+U9V�����h�Z(�F(�aj?b�V����������:^2g��kE��`iV3����v8�HP��D��~1�p�7L.�`�t����b��'?4���������=]��Q*�t�
�����Ular�M�_��;`v����/����m��x�Y��7-��A7v\����<�]��:�����"bS&k����a�A���p*�0�/5l�/��7T8��wev��0��t��6�D��-#�B��H;�l�Y�[N�I~��'vK{��v�/��lU�b�9N#�����n���s�>�Ctk����X���a���	�E��_�cY2�T��9�`;��<T�)t���ya{]G"�<�d��sQL��\�j���"$Z���`si�{�]�na�`�����D?p<�����r�c���	��1#�g>���&O���R��R�n�����	:_�sk��+�5G�����������$�2\������[W=��#4A��w�c]r��lNs3UM�����P[�?�������5+���%�|4����X�~��f����*y�|?L�+���c���)��!���]���}��D��������b	
C2ym������O����
��|f��'����)^%����n���3�)��F�C:�x{L���K�����gfX�#�,��<<��)M^��a2�V[��������4�e[���oj�ekQ�O�8d�!6�t�l.h���oY�[O�{�& ��}��~!�������g��������E4�fQ�.���m���=��El�Hy�6V~�'NK��-|��Mspkn�94y��#��/���hkeT?&��E���������L�f�gcz&����-���O!��mL*^�'���x����v�T��^ !��y$��N��e[7bOa�Y��`�t��{�����Y��X=���J��=�[W=���}��k)A%��D�����?ne��SF���F�.u�+7�O�Xt��2��S:�`[����>�����^	�,����������tpv���+���v|�2����T��]IhX�����y�z�����RM�]������U���49�h��]��j�
^o'v���2O�����V*��E�
�A�
�[s	��P���a�-Y9�X��v�����
���T���<��$��]��������SY.X�X5��|��{6;�o]uD���82T�[DoV�#�nZ��6k1\����E�h6j��m���������d�L�m���U�h�"�H�s��u�
f=���j��6������n������@��#V�*�f(M����K{<s����6>�o�p*����Xy��U�������ak��	���Y?8����vb�����p�lc"2���w����$E�������}���B�9�=[zH�0p�{���)������NU���t�A��f�Y.��2Dt�P����sd[��!���`a�X�~�����T���9�'�_�F����j�N�!H���: `��'�*�My�[OK�����k��5���|�E���0
����t���U��p;e`�,�w����d�����	���?w�C%���W�EE�e��#�`O�6�
�C���%������i�D?��O-�_W"������9����0U��,=�����Fu���-v�J���O�z�`�4�����d��L����f�����]�� l�6f=4
C4yK]uD����;h+v��;X���v+Ev6&2
��>���tJ���o�`cA��NG(�F������-I*?/��;4,�
4�
�����)=��W����\X��cfM+�e.,���l.��p���yT�L6$�r�b�����a�{���=|�s}�(z\)��������D���j,o��?3�S�����`L�n������<"G@L�(~3e[d��������6B���Qt�F�f�a�_����b;,,�_�H�YzzO��J������V�p� c"���i����\l�����'��7���o+�K?b��%�������sa�{��nU��s6K�S�AC��X���|����	oC�����c#f��M���vZ6X�4����%G�R&^{)����m�$/%<K���{�R6���,�p']r��R�=��6_J.Y��\�1����G;+;'SB���|��{��B�����t,�����/���'v�/����Z�����6]���W�]���4Eo��1�W^O��,�9���}�97������<���#�	{���M<3x������[Ko=��
w������l��g7�[�Z���zy�?��n
6��u�����	����
�`��p{L��o�;���5�In�}`b��@��?��e��������j�fg�	��������&'�=���Y+������&3��,l�w�;��3��=�~������>���O�^	�[X\t{C�)\��2P�p��l��`�t�3����
j�>l�P�bu�bGAc�m;���'z�����3b'�?���L�v@�6����2�'�����B���5bW���
����H4��N|��X�|��7*<n�J�nmg�=�{a=�����0]4�<��{�n����>�u\���3{�h��{�����
S�nf"�h���
�������l�Os�a��]��w;�;�~�eA��/�i3����s����MIv;e;;W'�r&���YQ�hVv-t�]W7[���[)����~V��M\D/�U,���4[���V�v�q*�a[�b��Ql*�=��	���Y>���O������10c�����5�)�����s�\�������U$����?|'�{
gu����J���M�����)��Q��6g�`s-�mt��wHy�+�b�uB��t��2���M�f�����c6��':+(o�9xb6Z��F��,�]Al�������.���b�K+���)�=��ylM,�^��*�D��rn��������>t��|�8��D�b�E��>^<{l;����w������b�7�M��J ����X���o���t,���DVL*�r��[GO
�����������Lv���>p�V,}�cc�0��b`(*���=L!v0?��Y86�������30|�n.v����f��^��������qE��[�{Y]���-�,�������+
���A��R����%��~�bW�R�bcp>����!������{�3O�����6��`�^�`VV/��]��S	vVv���pf��������P�x!=<g���4��{*2Vw�*�+�n�9jcg�E�s����|�Pu!o`wo�����p`�y6X��p����#X�4<�n��=he0����]�YnmK7\8����pI"�/�`W�b�nep^��lNy
�!��V!�����M:s"��p4�_��/Q4�v�nO�����M���`i)�����.��p%@�n�3��	�������2��7�����,�:�Msk��3�����9z��,�q*�y�$w�!Y1!,�]�������+wv�O����vw�*
�b�������$=�F��Py����9�E���0���O;���j<j[��o���W�ay�Z.��-
��0�0�l��Q�f��{�-�4��f����n�V�
����D��w%ocYq>��������������%o����Y�D�]+�L��p���0����,w��;��z��P-�B�O�,�
��7�/�k�r���A7XM,s������������v��x��AveX�$�reG�v�N�"����"XX���'�lH�0�44)�Vn=u���]:;f�p�G�����(m)X����n(����s��D��+Gv����'���eX�!�,<����nZf�����a��N���hB���a�R��r6����
=�n�����B����n��`�/]���7����;K��sBR{�!�G��B����N���u�b�fT�49+�����0��a=]��w�;3�����0$�����V�Ty���:��y���97��T��;}���qnC�`VpI���@o�9Z���L���0kl�����:��9��i�����7
��7.���x�$-����t{ZJh�^���[���]K4���@��:�5�G��0Z���������;o�9��A�h��7\��CX�r��%��9���7,:�d{k������'���p~�������J�P����e	�fO��1=G��f��[���	M3��6���e�17�����x���#��j�-��.V� �����9"z��]����a
�`���[��],3!6�e{��"u���c�����YM����46�VP%��W���E�����=��S�8D4�g��-�a�,<f/*��V�'v&�a/�����C�L���Z�9;����Up�
ka+���������b��)6g:/Cd�l�i�k.�Q��}X);���h�G{�i�[W��x��.��V��fXe����l�G�����u����GF��l�
�������r8?A�4op����a�`���[������D�[�*��m�a�kV��l���-���|l?���W��mt=�3��������R�B���y�^������;b\&W��k��mtN�H?��wYe���f�|����d���,����EU��t(C������s���F���_.:���ZN���2���1�a���+L�l��C,;w!��"�)�6�5��ipE�V^��U���8�0M�a�f�f�_����>v2R�J{.��1�hx�Xh�KV�����Rv�/���������6�����s(�60E��R�5���X�����6V�'��+�I!�m�P��i�*�����zbgzW�.h���/2�m��3������:(`'�Do�\��fj���H��}_�2lw�����n��R7�hpE#�)��{�c>?����1����9����f�Uba:(P�>	v��e�����)�+��j��m����U��g���^�)z�l�~��]�~��D~W���H���(�MQ�mx���U�p9,�O[l�T+�I;��V4;H#4���z�(f���T�.�cq�����v+����'���a}+�,����1S����2��a��z��7X��!�qe�jo0TH���������-E���t��^A/�<R���=�V���
�������]�������������^�E���W3�n�����&\Z=��+�2;�'v�W"������<�2��K(M3��+�|��m���!hX�%�F�����XXl>;y^��������O,LH��KU��j��9��_����_�� ���`����aXe�U�/��*_z�>��Xl�����Q93Y���Y\���YY�ZF=`.*6���(���|�O���l�iv5�����%�9���������g	n]u�h�
�aW�e��[:�X�X�=��F�UX%�cMA�B��K�i��lg�u���9��$g��LL�0�~;�l�����tfO=`i�\��D�Xn[�[gX�=`�5h��*&X�����U��_��z���J��[W=5����i%~i����4��aYv�yS�=�~\����6@���w@�cXF��a1�Q�e[��c����KeS
��Vg�aiu���M�����=�Q6�_���H����C`����n��5�In_������0����V�0{f�	���I�[s�!a��u2��U�,�Dp�s��{����.�,$��
Ll�}��AP��Z������I��_�l�C���#�S�'o��;����(bxtA!�bk0�]��i�`}����4����yZ����h�����=a��Zf���01)�/�U�o8�{]�!����j��x��Y��g��������p+������eH��s�=6b�T�����<��������{,�� �,<,��
vT�-Zf����E"�}<�'������t<�Ao��,���M��1=��j��O���O�K������<W�����M��G�{a�m������w��!�
�g�>0�%�o%Yc���2'	x��Y�8{=�$R�Yx����V���u,�{�p8����������}t������ay�L�����lA�1�:��,�hv|Q�f�w��46m+�,�2qB'�+������~J��}X�����#bW�1�}fE��`tZ<�&���b{a��v�N&�}�g���vs��4�6[9+6���i"����b;�~��wZ���/��4[@��W������p�peZ��SZ��z����-}��
���-�-��#����B'K��e��&��
��N+���=���Zl����U�l�C�b�:b;�"�����iKr'^6��Y����~L"�1I���^�������I��A��$b7��$	��.���3��f���G|��,����O�3������8��:hc���7;B)6k�/]��x��d�7����r�����c:b�Y�{k�!�O���_-����e[g������������	z����������e�M�����p�&��(��e��t^k#���U@?}2�T>A���l�a.�
�/j���G�����w^20e�C'���8�u�P���x2c�h��l�h�����XA�%M��]�������J~���I)�������m}�\�����lV&����
N�A/�%%�]*��S:`d�5�Y����z�������S���0�&/4��q�F�!���>{���0��:��I�>���gO��oZ�<aZ�e��	u#�0-�U�T�lg�0��jU�-��
��J|�����EgM�{��l.,�m
�W�k.��N��M���:`G�E/��H.�������54,_Km���x`8��A�����A��*
��plxZ�;��W����e��������&����������-�4�(�,���%���zj�_���B����1����o�����k�>�S�`Q���n����l�ekQ������;mw�*O��!�Li�[?���h��!])�K��sO�N'�9�V��n�:a�����`w�L+8'�;����>pGQ��*�`w�,6���0�
���
�?����F�;V��J����:�����$���>B�=-kh��0�����)�W&Y�4',K�
Nz��������Hz`��&�����CvN^4�N����#�v!���3=~�����`���l���_0%�1��Xx���=qa��@]4;.-���5���T�=)�z^|��P�n�K����G��r��9�d�AE�$�����:��{r��C�b�Z��n%�c��d�U���A"f��]��Z���z"G^L��G�_f�I�����n��cq�����V�C{�����x^Q�[y���(���c��N��2��X���%��ex-���`�d�������K ��������� ��[�>��{���q*m����`���RqvU�4���1F���W�v�N�����`�2��UGn�Vwk��$��/�"�X�c�'�0�[�;��J4=���T�Pq�v��UET�,��0u���1V*�,��C�.����?�8��jDA��*�S�|Y:�����9�=��vw�mp�|T��C��o�6���`�����p����f���F��OX�4�pS,�Y���~*�#�,��es=bi����@;}�{-}f�rVW�l-��0��k�t��Q�x�g�8�vu���2,:W�poO�f�a����<O��-�3,�{V��i9���{�n.�����/b��p{L��Lc,���+�V�;vRC��JLb7���h��.�}�~����(6��M_��9l�UfvC�/A��r��b
8��o��oC��
F����K.l��Jtj���[�A/�[9f+��g����@���bs�����c�N��p���;Ko^64�d���r��R�	mK�S=��9��t*x����>�8���E��f*��,�K�=��}=����.����eI�b�R�P�#�� ��������������b;6�>��m���6��%Bf��E�a?R��#W�~�E_��~h�3��4b��C�H�{��!�/��W����:�v��f�������K{1���Sp�/���F����|�����e��b.m�pr[���l+Wl��o#�x��$�*L'�0����_>��#t<B��2xs�t+n����S�����R���T�����p/���1�0K|�ml-/�����5��2���:�)W���6$���@&m�����+�1]YPY-�EM/�$�=XVK���/+�K��~�dAlg[�b����1�"p��p�������A��\��m�^�� ���9�.��]���6B��M4��;�_&�mi�ryL[�L94�������U���'s��y�Wi������&�
6�e�7�]�UX6i/��\�b�qW�(���l������Eb�lc>b+��B*���$:�\�0�)�7�H����e�7<a!z�OB�0o%�6���o�9�!r�G?	���O�@p�$���T��MC��j����v�+�����C�
f�����}��:X��
v�����9�E����5�����0���=u��A����e�uN��l��zh����a+���^���7�V}�R/��^�R��V���
%6�J������������;D��tL7Q��������x���rL@�&V�(v�
�[W=�3��i��P��@���X�a��<D�Zn�yn��f����,����v��=���L��5���5�Y��������9�aJ�O�
�e���k��Cj�Rk���t��e�6Bc�V�h��FVn����Cg�+�=G@L�-z3e�Xx���������\�m�=�C��wbiL�^�����t������Z*�)����^p�$���C�J���a��'S��gw����)�����������������5��bi��Y�:�r�����%n���e����EC��������+���|�6D���q��p~v����8L�/���3�����i>P���Ld�x�9�l-��`�$i9���V���+���P+$���������%~�3'�-�������L���A����c:��3B�t&�8���1����$��tx8Y������R�`{���=��6��z�$�Lf����c+C��&j��~+���W�����}�b�/Ez��>��s�������Jwo�0�vW��X �`�@4L%��KM����1�c��$�m���l���v�f��������Z�N�[.���LOu���L,�@l�{�j&���+������Eo�l���4�oe���S��������m���q�.��s�����A?0���>f�f
�=��	x4B4<�+�6<��k�.�YVqgg���b+.i���b+����nZ�
�k.��.��o�nC��	��=`�DZk���^�	-b����u�t�%�F�����QTqW���_p
/��n)�
�>k�����f�)%6<-w�10�t���I�qk��������[����^6��L�jd7
F�e��������}��aS�D�p�EOC�`�o�6��d��Y4��K���}
�/K��%M�'z��v,�2@�c�2Yt��o�2����=��&�R���Q��oKE�
���nX�l�>�2DvD/X��Hy�[s���oYt�{}�_�+�*a�����<����v5/X�#2s�5����Mz"�^�M��y.|i�j^p?!h���p��U�"��>��k��a����'`���i���gg(e9������gg�-|�of����1w���<QT���5/&k�������PI���F������p����z8����b������Wl6>�����Eo����%��<G2��hx��-��@,��q���<�}���JDg��������.G��U��\5y{����%
0
�,��B�o[]���X4,4��=lK�l!E�mL�I���m|C����z���N���x���|-������<4�����k�u��@����MD7V\#6_���7���b�[0�lk�7�y�\�Ol{�������X�W1
��O�su��p�y�]�Y��4�*�}��=X�X0������89z�\\��
 �2;[*��}��5��������`���_,���i���������mp�21����d���6���z�B;��-o�����V8��m��,�+�o[�Ef[���.�����m��f�b�4��=c���"+���
fU�>l��,����zM��m-�����m?4M��f;�b����u��L�������,.���z�'�D�!r�G���]���\�>3i����a�K���/���n�)���6��w{L�^��H�������o���iV�Lp[.���\�gvHG,<�n.9�g���L�P��m���Nt!�[Z~L3�Xx}��V8z��x��O4�!���(4���-N���tz�6�Sa��?X3%��~���
�>��NT���j�m��9��a5�Xx����*���M��9�����+A��F�Ve��.mXo#:_	rk�aLXui�*_�0-��{��K���NW�3;&���ZW���>�6u�'E��!r8C���z&����t�j�
7A�L���Z�m-5T���E�f�_$�7{����6���p7hx^\�d�:�[�]�	`uW��E�
b+R�m�5<!Zh����`it(�5;�"6�z��u,'#����j�F����[ GO���X+*ve��^�M?^*W�_]o������XlNH���q���o4�5��y�E���n����z�����0�2uF�p��Bk�>���6����v�L���O�g����$����n�
��v4c�����5W�Y��L�-���u�W(A�����Pv�SlK���9�d�C��D��]���	{�����8{�E�+u2�hoX!o�x�VY�Yg����|���*MD�~���G��@-��"*��X�t��v+��`�~��w.L��;C?�hx_������fx+�h�S

�i8C���8����&h��}�`����V2�4C3�h(|�k�Pmg���I����?���*���������"8��t��[b�m��)����{����U"�)-f�0������l�TN����[���}�`���[WL�j@y����|��]zj���
)�a9j�N|�u���-v�U/�������fM)�����'.���V���p��:��_6�q0P:zJ�."�~��x�Nx�?��{�����Bo�����*��lg��Z�lN�0Jk��,�c�~�B�l9������x�l�y�`s��{f4X)��!��������dzu�^���nj.�n��d���?����=K��J~�n��������-�70�\*p{LG1�	-���m��-�^�8�Q�R!���:����������`�y�[W?�*dy��|�(	��{����-}�?�F�kT�s�����C��s0��>�����s2p��(���#
f�}��G����7��{tVv5��i�t��������kb�
���m�Z�3��h�U�mx��s�2J��Tv�t���UG��,��<��o��G����k�`S��mt���;;�S�G�Ha��z����,z
vT�R�Bo:2�8�w6��0�-5}g��%�m������x8"e��c����rE��}��6L��@{i��r���nx�����xk�1��'
�i�m�&+X��R��������>�a7����XXD-Z��lz��+p=XT,v�3�fy�����VH�>6~�����E��"M�#'��vw�^�+e������#����q�����g�R�o��
����I�t�
���m��=�:U,���<W���~J���H�-S�>�^���r�����������;�I�����Mg�n�7�q��5#�bg}�.���],\4[��,�~��[t���=���V�p6���4[��������l.�^�W������������n�����?��0�m�>�L��XXu��.�~�����\�2~,�~�6��|�����'��)�~g���?��-��=��6VS(^�*��j���,�f�`���mt.2����
�����D�{b��|�mx.�s=��������X|
��N���0U���������+�����9�@��-z���l���A,,��
W�?6a�[=D��H��OW���6��k�*����m���7��s�<���!-��2Q�JU���t�����a}����[W>�(h�L�S�������|��9�Jix�U��{b^���K���I��N0?�i�E$�5�.�-����	���24���b+�.���m��;�1�����e�\?u��Vi�s$�K:\� ��0o�i����[|���9�

KY��i�=[J��W����o�����'�������$�fF'�����Q�rL�g.&�+f�>���2���g��2����0O���I]����E6������M�����b�����sCWu���~,:�w�������</�M����\���ci���d������V�/,�}�Odb�����I�V��x���7c�n0Y��Tk��: `��E���n&k�n����
�N�AO�4�����|�S�g,=�*���v8#`)��N�[���?��}A�n�!^����~��^�����T��@��9Gp/YV�����f��c�>p�]-�{��(;J/�#X�':EA��0��h�����������;� �����/��Ol���=�#
X�g�	*����]�:���6�Z/��!� %.�
bb�D���B'��N� .�x��}��}�gM��l�XN��+�;lz}��Ut�P���'X&�Mw���M2��������n��~s��
��W0�y���6�
`�&�|K��9O���YX�#v���t����u�<V&�),��1��{
�)���H������R�
�Kk�����$v��O��[1�l/[��nEZO������M!�����i5�i~�����>A�����G������E�[���������]�J��}�~�hv�_�kM��MR�������6���Wt�����Y�=ax��)�W�qV�>Lm+z� q+z�C��|e#�����6&4}�+-W�s��0��hz�x���,=���U��E���s
��� �Z�S�Nv��/��%`2�VNF�����D4�2y��Z&��Te��<���>���u�	K\D�d�X��
6_r{L�{�n=���������_��v5�J	��%=z���F�x�wt�Sd�-�Lt��IZlK���������G�_?:\����7�x���$���0����M���������;�����'��_�(����Y��2	���T��~�eQ)$�-~�&����4��f�;$w0k�&a�mt��%��i\�U���S�������4o��S����~,~`��$��}�������R�lw�����\����5\$����mI^|^���w��w\yg+2w�h���;�jn:�]8)�-lm�YL��r�4I��>��������T� g1�mjo�T�+���	�����m(��a�������[>�e�KX�������I>D7��)6;�o]m�*�oE7v��,[���bb������3�������o%���������>��S)��#n���O|i�d:K)�����uu���/4[.��~#�,�e���]����cW�a�b���I�(������bp��N��1�_�`Y�Bl�p��+nK����cw�a��
~i��M�u��;p)�j����[W����hx_�Xx��YV�`�o�"�c�a)��-2���M������F�F�����K�@a"\l>�R�2���
���bx�Rtg�>b��v��:�bq�g�uql�=�[4��`�^�0H�gv"�@��+��BC������J0Eg]��9;m�]��K����B�c�a�����,�w�a`)�o������D
����p���o���`O�Gul�=�M�������	f�1
��-����YmE�������U��0\����M��p������������C���k�����MG���i:���`����V�d�����{R>��Uk|3��9�lT��?�`i>��v���2�c��a�`�~��V�'���X�FP�n8	�[\��->�+t��~f�[K�s1�����p|�X\|`�Ia8��]�iv�\���Y�<>����,�5�@������4�F������\�����
"E�_��jF���������
c�`sN�=��~�.�<���)��s�����[s
��R�H��[s����K�J�������>��2�%��I�M�Wt�H�K��4�E�
I�+��2\�/�;
Z�c�������8�M���3&g��O�����F�A������[s�$a
��z
�{v�����p�o/|��t�2I��{`������f���H,����}�����JY�����]�/�C���PaP�e�e:+��N�>}v&�����u|Gl���=������AA7�[��8~b�d����9�}�����ce�a�d��pD�X>�UP���|�6�_���,�	z���[�/^��a�0��T�cg2=�2���~������,\��qw7k�<2��v�<��_����<VD�<D�Kw7��E,���������B�h#������A�=����]�]���+c^6�+��v�Zs���>�k�nC��n����	�������W]�e�Xr:��I������	�c���]]����g�0�����l�����1.�'[*���+6��1.�J�����g����2b������ExH/h���-�����f���vG�:x,���r��kX��U������c:\d���L�X�����-����E�Y����(m�ga����n���f+#�p���������z15��JA�u����DO8GK�M^���6)n����Jk��o��u��J��7����]����{v�2Zu���rC�Y�B��j���A��k�0-��0�l�O�2D�K���-�����!���`N1��'y��B�6��`�"h(m�`>H~i�%
t���G�����!��5��4|�����t"�O��t��'�C����R���$��<�t�����68D!Jy��c:���b�TG��o����h��HEwG=��v��,������g����n�}�\o&�x�4�%��I�E��v�����r4;�n#����4h����En�n����<M��!�|������O���&��G{�e���L���1����c�����U�^0�:��5�8�kAOh<_� vWr��S�����~��������Uy��n���u[�_,6�;�gi�v+YwK�i�C��>f�@��Q���:H0
�V���z>P��������������l��h��@_��������J��?�20������B;5,*r5;�/���	��K'w������ta���n�L����}kn�9��1]8j��n�*:���"��Y�!`���������/�pL���������i,���l�c^z�����A�R�[s���rE�����?�~$G2�����9�Q��iv��Y�#K�H������'
�Cfz���f�K��(4���;������t>�}k�:�h:���5���WMo�4���l��cz�A�T�%��{�n]�dC��Y��K?���m���������'X��5M�l��22����u�O���g�m�������zl�����7�.B1���1�h�����m��Z�����=��2�f�N���J�9�?��'����J�0��'~/�8B���[
v�PO�F;�f7*:���U^�|Hi���i�����o�*)
�S�W�������[�5Q��if6���f��{�UR��!.S�.4����T�Xtd��C�`����S:��9���0�����:f��i�5�,�b��k����X%��m���6T�fz ��_�0
��c��!���.9�m���;@:�?�4���u��^��pW���Yt�U���W)���]��;���?1f��m�n���	YvL�y�����e"����z��.T�d�.t��2���v��'~_�u�a 4����e���u�7�S��6��QQ]�i���_[�p�:��$��>��0T��b��f��9�D~��eb��&����=��L$74�W���+"����[s�BP��it��hK�0��:�A�f�L�fv��j���������������]pWb�0
����,�(f-ei��b�������IFkV��|��7��6hv���2S��s6+��������:�������q�����&�[!�^p'�3���e��U����
�8f�vi�mx���+9�aj1��b+���a�Y�f���Z�	�`�4���+�O����a*����t��!'��H��&�@w*����cr�������l��w��C�e�>��`K����<"�8}�b1GH����s��u2���$�tA��p<k-���������L���j�4e������`���r�
��RRc��;�^{�Oe�}9FE~'�\�J��\�f�>�X�)#�wJO���1*��]J��J��6�J�
�D��W���-�0
���A�If+uB�a&r��p�
��h:�
K����������4�����q��SLb+k���q-���������g���,R���{��?��"L-��;��6�
v�j9��^��p������P��?�vt�.���0�4�,Li�a"C��t��6���a'������H#b�f���7p����:hv3���Y�����M3k�Y��D�. ���X�6B���rl�P�,}eu���&���_b;l�?r���`<^��'M���&lGm��d�]T��2�~I����N:�@te�w������H%���[W=�xVt�]�{!=�iv��7�-g��S��m�������u��,�v��A��J����������|=�w'�����~=�~�����,���l{�?�!2a��puliu�8�U�A7�	�E���]X�h7|#~���=d`�C���l��o��Z��'�����X��C���JW���K*1�&�p6_�vy�� ��Ag���90�)�����m�'vXpTf�~�G����l����\j�R|p��m���`	v���z
���.���Rp���2��^�w��>����
��/h����&���O9�]s��m�>�6B��`�K4T�iC�E��R�e��l�i��6����</{7����<���h.��V���#>d7=`����H{����c:Z��A?������|&�Us����,[A�eu3Bg!z�Xt�a����L���8����bg�X���y��_$2Wl�,}y�M�������!���Qh"v����0�U80���/���1���B����yO���������+�[]���=.,�>��XI��]8<��������I�������i������=Y���������=!k�?4$�|Y!	��{�������T,	��i�x{L�@���hX�+��Yh�j�>�k ok�lN����X��u��:�,J>��/��C V!m�	��B��X(|����9�byi��-���)�0
�h�}��=�p�a������=�aL���o��y���9��ot��9�O�����>�f��c�������'��
�{�J������������
��pShK/�m����p���������c9����
>�z������a
(�d���4DD`0t+�|W�D�.�x>6���X�d�"��s9b�������������c��&c%���?�3$��E��.V�v+�uK��9���Ee}b��m���g��XlK�����>��5�,\��O��jE����.���\]4������X����^����K���m��1$��T��M?���:*��O����j�������6��[�9�=�a|�}����
`�:�lMt�S���i���U�"0q,5;�0u��XU�1�xL�b�Qb��K��n%��a�g��n�4g[����^���,��e:gqE����a����M�0_��&������t/��b�0g
O��XL4L�
���`��Nl>�z!����@��Twqk��+LJ��������Q0}���������@����X�9����9&��y�����`a���Y�
�3����7��m��(���p������+�K.��������L��xb��4g��K��J�e}���8E&cq��=6�n��P����%�a���W	�����n%!lw���es��J�w�s	bw%�n�������[s��`ec����`����p*
�;*�,�R`M�T�g7;�,v��������l+
�c>�'MK����_�������P�c&Y�C/�z�|v{JG|�LV4��N����S��}l��u��R��W�p[S�����\Y�Y���*i���$	7�N[p"|���������JG��?������ST��Y�L��E���oB����{'j7��m����t�0��J�y��# �Z���Y�3���u��S���6Ce��V9�h����tE���@+5��~�Z-�7�%��G���!ba�����K�>��~�V�VR�}��r�l�"�������e����a�i�;��o]�	O���_�`g%���6�$_6}�$v�)R����~b�}���6��^a�H����������������O%_hW+���4,4v�@���t�y�y^E�cH�Y<D�pgP,�MQ�+%������w��k�^"��\�����}`X�X���o��l��`���B>�i?LM+����XM�����,�
Z��v��,��Dl����U���
�2Dr0l�{�.��<\]�|p�A&^�<	v��7z
���vY[����[6`tt����
f�����S,���"��"��� 5m����A*}e#	GW�*?j���vH
_:������x����?������;\�����:X�oGA����
�B���k�?06�:�}�d,������
d��sf�py�f��r��^	��3��~`�~���.8z�V
&m�������m����:�n����X#�-UC]��8r�uc��������z�6��,������n���	���ln�1�(�
���3����!�i����`�����V�������]����w����qW���fa�Xx�����+k��6v\It�@���n�N��z�,��nvQli��G�;<i%^�,v����Y8��,��Z���� ���rk��������Iy��cn?&�	D�o�������@���l�-����+w��|�!:"8��F$��h�
���k���������Z���y.�p���S)o��fn���i��Y���l��=���^���f9lc��D7V���aLl��w���y�M;L��u����Y
Z(L��MK��S:�a[Q�+1���p�Vt������`������;
��p)�vY�U�)8i���YE�������=��������s6�o�����D�	W{`�������~

�f�m�'�esJ��?b�+���u�!\��`k�}���	��c:a'�E�����z�|������{@����k����e6�
���%�s7�v��������A�gaN_�S�m��h���V�b�-bK�O������&�[s��`V\�V��$�9�*\{
�x����m_�~�QA���?bg�DL���1��i8B*a_Y�i������Y���
)2��T���pil+��5�a���>0�%�,�8�
��4i�8�J���l�{v�!��	F�2�JT�]��m��'c
l%�����td6��D�<��^�*K���*��I���1�h#
��b��5[I�Y���������r�F>�!��rK��4�9���{�������&���
z��0�Y��67
+2�:fo��ze�{�[�
�Y��X}���j �N�A��qy���������uL��C�)����������XDX_liG�n�����;;�#�y����l%3`5�$M4��}��M�� ������.���I��Zr�P�$N�Cr��wX������
���EO�C�����Y�������J����`h-�6}",g���kXr3�x����+�m6�7����a����y����4���~������{�T��3�j���%�
�ck&"}�2?��'�������a.C�m��T�+�mw7�Go�#X����/���(�������?w�pgJ���N�v�`Q�l	������������0~JZ���]�p��i��������d�(~*���Yg�V�n����#E�,��0��N��c:dc��������mx��hZgl�Y�����E�g��1����u��S���=KK{���$�]v���-$���������)���>��
�iP�����4��l�~8�l������/s{L|tT'?!-����.�1]�hZ�,�R����J�=mAp�,8���A�JF����G2���^��6t�f��ne�1+����4g�:-�
������[~�J���P"h�����U���;h�`	�"�i���C�AO�)P���"����=�c���~���O����:�t	�v��,vVN��p���$�3�2����z
�z����!�������k����p��|��������V�&��	��+%6����}��P���K5Kg�[��e�,e�����w�g���=�Ra��1���Y�a�HVv��R4��(�]��Y���%X4�$��{��3z��G��#�`�(�|eg�^�F\�����,�_���*5[�8���`�1�I?{���;�9�`K�"������PHl�P��U^p��������)7�����)��5� �N�!m�d.y�>p^,\��t{\���������pvW��YZ�,�&vU����NO0����X:�s3�s�����4;��EhG���7�}�g��������=�En�9z�{�A����p����[���w�z���������2�	�>�S�b�B���F��?��
jfI7N�x���8��o�2�<�@�,|T�
��Q�
sUUy�����I�;h4�3���n�8t�l�/�aI^��E_b'���hj�����(E/�=;��k6elo����h"�Y�%v���X�	Z9.�mu��G/�������y�+y
n�9����S��~��[s]����Q�,l7w+�;}S#�*�S�U��HS4���b�.�P�a6��n�x���_���������FS(@��w�B����<X?`��#�6�w���o��<��`�w���[�
u����*��������6=DC���Byw�@��e�hxC�Y��F�a,�f��������D�i��b���{v.@�6�w&w}�|g�}�e/T�t��;[��~�"F���������
D�.��19������:S��>���n�v���5�,�v+������b�\HTwk�;;� ����:����H����l#b�������bw�r�n�6,��
��n�vg)����������
FXA�Q�{�`u����������$������|$���"�$������#���4���/��Y���O��P�m����-�m��S���zr�I��Y=���9�n64����3��vCl��\�����Y�h��v�����,�M���!��}����T�3���	�	�=����3�e������
�C v�O�H��[s���bh��E1f�������Y�*H����f0�?m����o|�}���	�d)me��z������5|�����`x��9��`\�����V)*h�n��[i���V4M��������������2��f��������~����
fl�xe�i�nfr���������/�����M�O�!���N����0V�JB�[W=��Uw�+�
/�Y>J���3�#NU���f�t�a~�V����;(V7����va�2������4���������B���.������`���������0w��]z:Gp�!��Tx��=��#���Z���G+�"�m�)��-\n.v��Vf���6�d`f�8���	HG/�m���s���A�-t��m,�@V*<���w����(X�Q����].������pS%���%b������
�Tuk1�qB4<i��+a������es��*��lL�YOv{J�0�'1����~K�-��X�e���;d��k~;����0��.����vx�h��s}���gw���BN����!o�9a>�P�'����n�?�-��L�)����%�}
���tO:��j�/�k�h�K��X��)��#���%�F�[	���:��I����o������������=;*����f�����E�������:��_��������V[u���#��4-!���
�.,6
6����M��mt@1k�hzZ<�l��u�A<�.�Y�����_���t���A��><�U�a�6X�h�o����ISM������t���l	����J�[s�c`Y�L�0*�~��4{w��H�����
��HE�-����[W��0A?pc����l���J�-�t~:_�vk�!��]�_9�/��^O�PfY�~`�+�7��T��c�T���������e[o� �[��B�-��YDE�"99���Q6��e�����c�4�~�����p=-'',�T�+K!�<������i�eTETxJ"�������U��g���l2�����y���#���!Y�@���esQu��X#�
�/�����H�	�rg7��yR�@�oSUD���Q��b�*��6����MW�|�<;���o���,�y[,,�8:nT��X����S��{h�n���7~����oX:�A ��}����4�����
l���
�9D7v�R�SX��<;R!�a��bGr�����U�fk?��]�a/�`��Y���}R����������I�o���t�"z*2�<�v�4G;�a���fY���`U~���_�]��@�[����p�|��9�<��������n�v��9X�n�?�S���z^�a�G�����E����j��nW���^6����5������f�0���_�f�Qb��3[�����S1/���.�>l�*v��{������������\����������������Y�����yL�T��{�7)��a�,,��g���:p����'�]�$��Cg�h�~��)�v�V�$����Zf�Y�-}�n�� �64�|u�Y�m�>���|��_��.��
7E�K>�n�F����S:.g[��'����G����0�.�P���wk��5;.�f$>d�������������c��3i��b�2
k��B?��J����?�A������bWA�0�Z�	�����~�\n�)P�R�C� m�[(|�,��L����xx�}X��N��lc�ba�����f�/��dxC������6��������z�6Da��;�Y�������`�Wb����!r��$A/f>;a�Z���@e��<`�(�2}��/����q'S������4�7��{����,�pC&�U8�<lx��^^6����g[r�����~���D������ue��f�A�"�7!�{�#&6/n����	�Do��v�pg$�H�g,��89����x�\���>��@�����������������O^��s����k���9�@Li$:��T`�w6��$C�|�{$���L��������#x��=X)�i������S��,�hZ�!�6��sc���bg%	i�����A?t�"b�*�[yJG@��-���w�_�����e��3[\�]p}���[��L����n�y���]sS���p����N��n��������>td"���.�����vw��=a�_,{���5�����=S�vk��\_��M�zk�����U�a�j6�g�'+�\�S:���v��
E���������4��
v3U��c�`�Uf�!��N?;QqN���oe;�n�T6��1�o|����7�e\���7A���7���+j$����`�<$=�?
R�WJ
�p+5��D8n~��n!v��|����f5{��V��[���������f���kc����f�������"�7�~�.�����~�#Y7�����"��tZ_/Gz�V��rx9�i��b���)�U�9|"W����u�����S���5��L�.����v����v����D�>Xv~Cg���b�w>N��������}���u�\��K>n�yreJV��������)z�L�X8������.�I#6�����L�d������<���va	������%5������^�Osk�s\����J�`�l�$�p=������Vv�m�����Bk�Q���'$���+�����n�n#��C�p1��c��M��mp��c8A?���Q-s�mw?!A���M����ya���Tbv���ekQ�r`����������CE��2]���<{��a���9�2}�}a�ew������������UG?��;�
��b�����^��p����{�A�
����j��mh����B�7��QG0p����o���R��"^��r�`���6��a`��L�������S�00.��V�K71�}{{L"0w{t<	�E����>gQ�m����=�l9}�.X-�vw����\��KI��V�Y����R.k{����k?�B�B�g��`�m��o{R���c�� h���$�������z��L�l�!��#	eY��4@�1��,�%�G�����=f�c�Qm���i5ow�����2B�#�B ��~L,I�nV�'�)������c���u�;��uu�������v�
����naa3���L�(�)\�;m���D-�q�X�@�L%}��|���=WB�-��o==�)��Eb��H���X��'���]���Z�=�>Q�d'7�n������i�p"�^���hX�#�a'fy�ii��!�G���7!���pbs���1?���~�������[hn7E��!r�$��7�J�m?���}���
�7V*zV&A[��Uq��k��������9=��~,����mZ��H�����[f��������O,f���I4��[,�TJl�{g?�d~�iO1{�`���|&/3��%��u����D��E�����M�rI�>N;�a%�i�%�f���Md�
2�iu6q�l.��]��F�	���p�L�����?�M��I�l��IO�C �������v��[y��1�h�<����b;f��]����^=(z��f��?�����=�ae�b���mx�\x�% ���������S��G���{���B��������gEO�
U�)er��c>Vu%z�9���(vItg�d��[��B���~���;��u�E�(�O���Y��
�pyZF
%f�a4l5����=
������"k�����cF�
>����u{H|�����LQf+��VQ�����[n�id5�cn�|�*��P�?�X��0��a��n�p���>{2���c�.�#^�������O+�'L%
}ZfS`{��#>8��c�"i��s�D����r��� ��H=��/s8���i�i���z�R����h���A�Y��{d�s%z�z��Z��m-���b3��������L���Nle[�����s��=[HYc=a�J>���bg����*|�,X�����oA��9��p)��j�pFkZ��0���������z�I;�y�y�n.��g�`��U����LzSw{�!�jL���HKlA}=���+���hR�.\�=���0;!�5����Z�	�����Ui�����U��0D�2q��)6mB����:\�M����� �B�;��'|��������>Yfg�/�M'����mp<��eY��6�|��m:��q����"�*r
��-���{�0x�$�3�]p��$�R.nI2</���K,,�Zk|�n��oC�(\�$�o��9G"p�+h(G�`�&�|�����b��X4�K9��IbO%7em0T��pWp=���-����t���`#a1��DmKa���x�3]A78i�����>��p{L�"p2��{`W�br�e������Qz���n���l�p9�SPNN�����es+'�v���B[�'�Q�*m�/m���,�v�9�`��TbO*9�
�#/���u=�j��P�]p��=a������$�
3��o�dP�O����������-��q���&�}{��F�J�0�m�������K���,��S��=�vt�P���i�`��K����9j���c��G.��+ku�+�es����V���G�/�~�\��K��,����+�6R������o��g��b+�����pCT4���	~f�=��H�=e�nC���a�*�Ot=�X��&8�a*l��r��:�Ig/]<�^�
O��]X	l�]�6D���Zt���`{��9����]
^!&9��t{J�"pP����`[��^�|�����LK�"Q,w���� ������	n�
��f������c��Z��U��a��l��8���+
{9p�'����=�#�s4���|����f�	�^0h��by�L��+j���M�/�{�U�fK�1Lf-�zN$��G|-���=�3s6�=���.�p���
�u���)�����B�rYI���#�aD�y��������@tc_-��P{�,i����+o��3��h��{���M!	��J^��,^�&v��@l!���h^���C�17��5��i�E�M3K?���J��c?&���o;H�Y����8���kw9}�.�kE�b%��|J�l6�|�+�=�CV�,��:V���fY���v���B�aY����.4�P��VE����9�L,z��{����S�"L� J���s6[�D-,�Wl��?������l����E`��a�Q�Lw�,Y������.������BK��%����M�eQ�b�d������H�f�U���rbS�����QD���3�3Gb�IR?q��~����bAt��h��3D����V��^�/;�s�����s^�!�p9���w���e/|���Uf����D�+#%-���e����oV��������DV�b��b{�����v1e�i��m��������'�o��L
>+x�D�n�8�-���bs����v�.��-�����`+j�e/�5]�`;�b�'7��
U`���Up���pr�����������`wZ'����\8��[0H/����>���-�}W�0Q�uB
���nev�����F�I,[_���*���[���K���%
&j�.l��:���3�-}n�9�c^��U�������:~�{����1��������.
�J��~��i���$�����"����+�/[i�OEt�M�_���m����f+�C�as���B��,���,+�Uob[e:�9x1s����K���Lb�"����]6/��:-5n�9b_��	��T����c�)�L���me��M5��t����S�5;b�_����_�������@Ao�J;���X:��v��m��������J,��������U������8���b��@�f8���b���6��`�4����0o��k\�V��I]0v-;��
�KL���j�s�bO������:z�\�"�Q,�x���M��@Z�UP�,+��i�P�4���va�h^��F���)��O�`��XxG�YX�l.�
�CMX�"�4,V�?���B�<���.����oB�p�Jh
oO�H�i���zi�����!�WJ�E��N���Nc-��.B/��;`pj�5{|�*?M�^0�4]��lv�����c:�������b��Q�?�0ch�n��0�92E7X~%v����U��4'8~bbi�OA��,x��l<���R6o�&J$��h���,�����k.����n�9������`8{��7��V�e�i^����q-�YX��>�`(�����nf������
	Y�aqN����-���S��n�6���2a��g�lb��c�9�O�!r����,Dl������[�RWpTu�g�w�V�o��]�mZ^��l�J��?��-Ob'<r%�s���
��;A��T��>������s����x^L�l�E�>pCW,^�V"��L�H]�!Y�`�%M3��K-
�+bS%��1@���GzC��|���l~y
}N���9�g_�������E_~��Y8�Q�]H���c����}�-��	Xx�4Xx���9z^�O08����
6�}���������:Z�IV�4����pu��`�V�H�a/X"4}ye��@�0��>W2�6i���A�rC���K$��[JfZ��`%S�����W������=�4�t/��]���
7������>���b���#3Eag7
���O��������������:�eo��p�{v����R�*(�������A�a�
��K�Q����U�������
��6������2�$nR�a,l�����n[��A^�,$1��}f�[����m�> 4�~X}��B���6<�^�&��Y&���"�K�}����n�������x��}1�y��=;��s��^��
/�A�u�������<���~J����������F��MHfy����b[F��Q�pY/��_��Y��O�V~����m�f�"��h����'_��l���m��lH4�~Kg����ny�����}�f���E�N�Ao�?�0]�_��;�`�7���������K_�m0�v��
.=����?_���������oa��|�"DW������$����������N�e1����f��mx����������~���z:8��ev&T����C?���U��q��>��Kl��=�[W?�a��/,�:�'��v�������<������b�F�X�b;�|}^��7�*5�&�?�o
`��`wa;q���Y)��V8����0���Vle�����v��6<��Uy��q���)`����J�D���A�U����:E,L�:S��mt|��]W������Un0}�+��J�d;�b�kF��n�+����]t :�����m^�e�R����F��
lv��hxQ��N��O���}�]k��>5������
�=�s��=�;�(�3
��Jq��=��s Zs��EP��;��
��{"G����o4t�-��}g��[0A���9G^�^�N�F����-����Bb����U�"�W���ib��(�E0����
b;����r�������6�i~k��+��}X}���W�f����Y��
J�ai���'�����b���}�����A�W�H��	C7B��I����'��?���L���o�.`��bi�V�.���C��4�WT�"��":����OP���0N|A?p�)��E��bwe'�"���lNj.�����pu[���f�P�v5Z�	�`g���!; �~�t|���J��C/v"N��E�Bi��U��l��7��Dst���Hu2��t���4��;a���56�>�P��������8��J5�E�9������������;�%��r'��L!��g2o]uD&B�J��e����E?��7XX�3U�S�1;���������.�o������H������tD�������Z�����	��UP��u��^�Qu���"���
u�I���Z��k9�+���I���.�V���%�5\����]lAu����0�'Oz�p�����A7X>,Mz�������o������C_��� ���[W�0�����!��������
��H�0�������,��������5�0V�M���e��KOr�]�&�P������#����n�~��/������i�E�zR���6���T�!r���-s�����g�/E=f
;��Ro+��eU���Y	�ayg�4),6�5�F��"�r��:���p/��~�0O���tk����j��2~K5!���#�>W����BG=����I��,�7��|��mt����;����{+��Xc����lN�|g��L����	�n0������
|�t"�|J$���A���&����(�I���m��6D���Szi��v�Vf�ex�(����/\���������0����i���(�m��0�V�o���G(����������t�eZA7X�l����/H��%���HF����eb�"P�U�������-�`O�kxdS�����xf��7��m0_�^�yTu���}��H��%�:/��a�����D���t�
� A?0���R4e�<
0$�����}����[���fw*�%���c�:}�VQ�yTo]u<�A�$��5�y�6�<��h���\`�����*����PNrTi��7��+�0�����S��P^�����������R7b�V��|���#��W�����F�P�'����B"��Z�a�n�+m"��nM8�'�h=v-��J�_X����pb����aQ�hxE���&���e�nc;b{Z���wyx��.��+=�4����w�O��}�+����5��9���E(�Y�]i��u����U��
~����-`�v��l��n��������i3��\�ba�RlK�Y��t��
�E?lI)��=0�ixo��
�	A�m��c�VnQzl���i4�S�9zl�W���\�����0���lCb�
wb;�.��Y}���u������ED��J����[WQ0��i����Kh�������#1��b;\�;YA�Xh
�����������|�vV�-6W���|,��v���kI�h��|��'q^���~��p��c ��������]������{�aU}�;���,����E������lL�B
���pc�c����AO�!���+Fn����U_����������v�x8}5���!��r��:�b'\D��W�\}=
�����\��9�� J�bN�t
l����1��H;�,�Q]�N�l���'�J�^G�,kg+;��c��'�5�?�%��.
��}XM��|�<-�-
����:�fG{a���ei[��\����`4-��HM��5���qZ]�O��@�`b7���{F~go��(6g �����=J��m ��%����Xv�{��
��`%Z�x1�Q������l/�/����
�`��i�6�`�B����z��u�-�����a�L�Ll�o�X��'�����-\,>L}9Aox�vU��=�����x`K����������}Wba�S�����M5l�%��I��������b���w�.H�,�-/������T�-]�-��`2Q�C��$�}��e�a"��
�7���e�t^��{7��0��q+Oi�����?��p�������zL�z��=-��E�d	z��n�-j&�%�a)�����4�� �],�a�Ibi��������|��!��`;�5�K�O�i����/���i����:d���1%@\8�-"��E�&���
��`�5#+��lY�x� A�wA9dY�8'�}.�?�����K4q3h����5���E��9��e��JA�%��'������0
�g���c�������n�]��F+O�i�1kf��bss����E/��p�,�UYD�� P�/.�x\�Il)��:�POt��iD��S�[��Z_z�o�c9"�9u�4U[|0��Q/r�>�	��S����Z�wZ]�L^Z�
�L���i��
MX9�����4�
/z��[��Sq!Z�y1�g�:u�����0U�&/��>�������Tm��T���|���	k���[&�i4��L�It���X���S!��1}F�a��o�������������s��������R���F��{��.k�.�����`wAPgYhv����p��^�4kx���a�����r-��`Dp*��E����`z���|�U��},f���N�,j���>l�N�/�U����N7��Tm�����oh��+z��yAO(����/��9�]P�B4���Z-+�.XX�
M�5x����F'�z�b
�����E�������)V�ZW��C-�C�SU�z��H��U�+
�N]����[��w���v��I���S�T
�,�����_��Y*`$�Tx�C�E[v�E[��N�9=�;{AOe���<=�M��Xl��=
g��a��0�/�J�e����%4��`�^yW}�B����(~��M����>_aM�V�Fa�)��v���r-�K����:K������V�-��-oz�TG�\���1�W�Y��l�����f
��aJ��17g�}g�_�B9��1,�
M�7}�Q�s~��Zl�V:-o����Z,�X��F��w�k[5y3��hh$zdv�;���qYx���{����f��0�ZlgNO��n
������������,,�T�~nz8di�n�Ms1�	���<U����V�����C��h�"K,l�*��]$���}�-�
m+oP�v��h6�XA���!{�f��
�<2����)_���6'��h�cXb'K�e�Z��m�����ES;&�F?�\��S����[�LoY4��[����s�]�E�`�i8����(z�H���,p���u��&�CS_,�H����-���EX�����ba������-�����h���*[�ys����]�0@�]1�,���>gQ]���u�;����%�A������x�6��d��2o[�z�����Nx��
0�������%�5�7�xk�����y+a�����]h���>����i�;��������M�[�;���S�i�[��i�l���B����4��'�z,:Kd}g������0�T4���TV����)�>��z�4*��[I(��-��6����e�<�4G;
9������n�s��\���A,l�$��0�p���I+���������������������SH�����L"�4K���75�8�����
�L�$��p>����h��,�����	���r�������gA�f[�6�>�EK�Z�;e?|.B,p�7�S
�q��}w�L�U����������x���V���x�����J��:��>����f����i�>���������������g-�P���-�afA��g�'N5�
�=�BC�m]����E����Y(d)�3�����p��(m��-r�u����A�0}'�	�mC��
����L]Otn9����LOS�����D�0�:$��H��9
�w-V��=��M6�c��RN������Ax�j0TY@��U4}J������K��.a��&b��~]QL���M��;{�+�$xa�����tZ^�]0]�]��;;X��Yz�J�r6�����C����x�A�`sG��c�b�<�a���� #�������	�x����m5�
���'L%}x3�^W��L5Kln=-�m>��+?�:*U�P0�M����*��n&+:�5���p�w6AO�i��N���4^��,��q��h%�����~����
��N����8����afr��t��p���iqT��g�Xzu���lK�B;��3���@A�-M�[��[sj���L�C���@�:�y2�s����1��T���t�����;{����1m�BCs��B!�k�c��:��g���M�Sa?�������\1����a�@��E���(�]��Y��Z���E"��`�u�7L%z��Y�0���+$o�e���o�M�~A��c�F�vM3���(�o�$�����J��u�7�FI7F$���fI������>_aR�%x����w����>�a�G���U���$[����U���9M��+�])����f*�����4��*x����/�wz~��+�4l%1����t]0�-*�����E�f�,)���`�t���l7�Q=a�)�����h���V��L	W�
����0�H���'X�NT��HY�w��v�P�]lvp����������V��0�8h��L,=4n%U�J�h��$�=���:��L��c�$�V�V�.�j�����]M4�o���8�Z�Uv���X�4���&�q�`a)����R��I���o'Z�������o%n���vZ^At�C���q���`���=���?�(Y�br�G��?6��NS�<U`O�hb{�����XS����G�}�����,����EB�?v�������6��"�?�!��?v~V���1�F�������NYp�����~� 
?����
��x���z����<��A2�~l���
`�1�4�>�#���Nr]��H����<-����wE)|$��3���<�/����`{y�cn�d����w:�����
>����Qb��E����K~��yq��$YF?���;I���q��� ����	1�8�KtW���X��^����ln�s��
>�����P������c�gGR64����i������~,*��o\x��y�kC�~t�����>,}�i���9���[�������^$�L*�{bh�K��s�A�o��x���4.��F��x��=1��Jj6t>����?�q���f*.�����N��~lK�����I��~� 5�?6��}g'�����i�l/����Z6R�&"���l���6<%�X���yL�������+����X��&*�?>l�����c�L�5	E�X������2�N%)M?��_3F�K��$���N�^�
v��u�P��������4�
7x?
��B�4��H����>���
�iym��8���.8U�O��7fMR[���o6�p����T���E��?v���D66I��n�i,$���P[��=�AS�m�(������[yl�A�6�]���8�~�6��=�k����S��G7���_����F���n���FK���"�`�\V��'"I���N��E��~�C�~��\��m>�����0���f~zL�^Dp�G?i�;�m����+���x]�@��O����E�c���("V�ct����[���(�6�-����~"[���G���K�d'��?z��V���������W%��� ��?z���n�?��2cMv�i�l����t����`�m���[:�l?����;)���HS�?�~��V,�n��h��hT����`-�@D��G�����?�J3�+\�m���`�0�
4.�l�a��x
�����SJ�����E�t��F}��]����F?v�a�U�J���C������ajH���,x^��^D��?��(���O���:��:�����n�E"�sR��c/����7g>��\�
7��
��$ZN��p|Ag�$���vt!=`v���a0��G������e�b�������q4�����XX� �s�&����c3��^���j=r�yl����a�)���$;��v��o�*��.���V:tai�����cKf��z����I����� ��W�J@0�$���+��Ek��JM��~l��p�5Lk������R2�D��G7P}�[g��l�P==��	"e��K��is���.
��Ba|�V9
�m�.��������M���Q+��F��ba�i�O:�NK���N��
�]��w��H����m	��,���	��i��C!��?qa�l�@�S�0 1���\aXx[��x�6mz�ZNixC��t��M�Y����L�B����H�����"p������Y��4�M ��.���b�ln9���*�
�t�H�����2i�D��->x	_����l���G���s��<�l�����e���F�j�����|����*A7XQ,j��c�N��~?-�m XQ$f�J�.�R��0n��:-�� ��	:'����A�����k�i�g��Q,�Z�-�~Z]�@D��GWL�e��[Y����w��+��)�M(i��EZf�I��0�?����}�=sZ^�@t�����:$h��9_�X��D6�`}��"+F�:�s���^�j�?tG��I�W�!��6�7u*�����>t$�o@�m���OA?P�'X����RA=����D��`���,\�9��OS�����R��}l�6z��!e]�[���6��%E4�5#��N5.ta�]L�jU%[��qtA
��|����EC
��%��)�uz����~C�0mS�`��b[!��r���m���[.�a�S[H��,��*|��H�,���D�>��u/|�:�l���#b��\L�H4K�:�WP,����=������k���p������=�D�|b����n�b�B&�e}h%^���/^����bs���1�n��7rv����rxL+�g��pAO�[�e>NS��.��S[���,<�$�2U���C���|��8\�,��,��K�eY��z��p�����
�UE����Y��p�����~1�2����#��.��_�H�b��bs������e�tX�#���0��M����V�sf��bsi�iym���y�.������.�����q���w�Z�K[=�U�qf�Xh{]��+�����
��s�i�yK��I��,?=�M>h�I��C:u�����[���������/V{n�e��}X����������H���Tcdhj�T�"��_��Btc�Qb�T������SYe�i&%�bqR����>������UR������/��(�w[�-���~��y��<=�f��E�o9��R��a�����w!
ox��X��YV,(����`���iym��/��8��n^�����v��M
c����+3�E}����IB�i��B��4Q4�l
�`�>LB�U�,�,�}A���}6;��]��������C4u��@gP{p����6�������G����E�����IR�rF�����&Ca8Ki���o�=`*F�����u�kj�L^OlO�����$��d���-9l��'���d`�V��D2�?�"��p6	��4�&vt+.+x_��(��]������~!��
����MC_���a�V
������/x8
��R�f��b'���*�h�a������R�Z��PxY��������#�DO��c�c+�|]<-�m zzm��Xln���-�,�}A������f	�������%n��7�'��W�V��j	���F����]����!4T��,�
W5�0�(���������?IZ����b��P#��ni)���\�^����/��	:W�}ga�.��lV�:-�-�-���J������V����`,,�Y��z�d��^�������E?0m)�|���H�PKZ�yGbM����r���������.Z,��)��v�vT"��`���(����<z��}g�^L�Cl�w�`��"%����V��"������^q$�]�%Y�b������e�|BW���J��G��E7/������EO��9?��yZ^��Fz@�d������T�{zL����o�f�k�'���/����M:\��v0�0�0o!�\�pZ^��L��4tH�-L�r��I�~��nx�J�<��N�i��i��^0�5����
M��i���)+�_��)�}�w�a�`aKf��W}��O�k3:&��0�(�v�)��zA������T�M�_3$F�]G��i�N�i;���n���tQ>M�6�z���~g��u���6&s-�jfh���e���M5���cfaGs��X������_������4��!-;���n�
%6��NS���%�����p6'`�Y�0�l��W}g�9�ag���/X;��yK�J��������8��/�X.:|��|���%5#�k��na�>��=:����J���/�8��5�A&�x�`x+X��&���1ko��_R3�S
/PbOS�Ec�A?�l��R�f���cZ�����N/�i8��������/lK[�i��	�.�e]j���ag7��Y��V���}��o�
_��2��j
������xKD��g�<�h�i8��P[5�=(��4~��~_q���uL9}"���AAg�����2
�/�@�������T0(�y|1�h����&�J]�R1n�f�bJt�����n+5��V*�����-v������"d��bw��OS�=U�����l���%ba����-��5�?6@�]�A*���e�eb+={oK5���,z3u
�P�H�,\in�<�L�A4}�"TB_�P�a��bG
��V��
���y�0l�eNS��*NUapUU����u���m������f����4�������A7<i��j�����������YR��������2�7����yYb7K��-�V�����=hr[��f�K�Y�XX�$����������������r�L���R<.Q�u{bsk����c)]��o3M�`'s]���e�Oiymj�B:�9=�;��Os��m>z��n���������E�w���1���]%|����m-�����n~���\o�������E�*{�O����B���E�����o&�,��mG��������	:�$z���=��M���7=���,��	tA3�����B�D�]tN����*"��bX.�fr��<2%[L?��5��e��bw���m��z��~
e����o��f:EUO��T��G�K����C�fY��9�wV%a�
���`�@���<�B���r��"�<�Bj�n�zbxJ :�#O�k�	��A/�&�C�`�54.Gs5�ium����l�U;����������^�L��l=�pDS��#��"�m�h(�$:7�>
g���<���*�����4U�0B��
��,�4�L��G���o��y*��-��,���9�3w��Zv�=�/��bG���a����Y��������4p!�g�2&vW"�j���G���>�X����r��Em��hX=-�Of�*f��$��G-����C��AC��Z��Q�6��Q�,m����t�Y]�X��(+��������R�f��^-�:^�q���s.x�f}��}��{�����*:E��!Ui�v�%�0��<�Pzt[����R�.�����?�;�*K��U�x���==�
'VIjD��	��>���z3�%��CBAW����a�<�YIu�@3M�w��a:���+_�
�-:�`}ga��d���$Y�B
�mY�|�~Na�������Tg���'�H�������@��2��mQO�k+����	��B���7Ly
��i��g���^0�����-���Y���E?m��"�7Y
cB�5q��-h�H��.j�����?�9��=-����"�~^������."�	������}Z]m��(�)8���R%���(�b4}�o�����w����<�?^H��p0M1��/��6K�~g{�l�����DC�I(�E6�{��G�:����7�E
e����%���7%
�i��A��lEo��~�
��S������.|��]0�l�+
�[P��-�K�'�0^#_�����AX���wM���|�`7t\i\�.hzI7� z[78�1�5��;��u�qat<X��Pl��`���.Q�.��SZ��%z�}OOiK��$��0"�e)�j����]X�%�����7Q���_,���AX��Z��f�����U�a��4����I��~�`�?<oAs����
��v�g�����E�oX���P\�tXa�����;����#��j�Z���~���.@������$��mis=M���
}������Ec"zb�[����	6b`&���aE`��M����j�!��l��>�z�J���kMa��~#�����4�W=+�7;��o4��(vU�,-
}C��`a�=����t�I�4��~gsT�;K�9$F]hr[P���������	�H��������`��b9-�m>&�-z�t�`�cz�^�{�������7��?��F��}h��B���Z��*��pJN��6nE\���Pb���5|ggl'o�E��F����N`C��Q��0V��a|}+D
�s�9��F�`���Y}�1��h���,�h�6��%v��f���,���.�����eJ=b�N����&�:����8Z�)�^6k~7&�+z������NS��*:�D����p�����Y�n��9��6v��3CZlO�S��}��p'��s��$�a��baR������BAd�pwc����q2�d�NS]�*�5�yUp5hg�����������
���/!�+�.������T�S�aj���=nE�Xb��J,����*[�T,��XU�hv3Zp�6kQ�����5����1�X=����?����bt��������Lm�1Ah��.�x+P=M�����7��p���V�(v�����B6���-���Eo��;�5J��,�*v�6�e��
M�5b�5�q>��e��b{:��k)��*ESk&�
?p�[�Uo��n,�M��K��
�Pp[t/tmV��~���
��a�g_lr����\������}w���-�m7+Q7�w"v���B��R���r�
��A�����l��k��GfY�X,K�ZiE���
;���Xb��Q�d6�I7h3�*��/�~�W8L�j��3�i������E���Z�z��DrZ]�!L!�Y��'���X�p*�
�fA��j�E_�P�YL��Y����6M_�����4U�O���4���D
}r��J�J���;��,�G�bU ��
����XV���!mk�r+o<Q
F�"u�(�u��+7�g��x���H���������������O�k�
����Z|bGAW�Y���Po�
�^����Tm��)`�}�_o����3�������m��a�����}`v�X�Yk�=��mz1�r��������}zL�mp��8�N:����o�_�f���|�����Q��b8T����*X���a�
E
6<z-7^8��7����GC�����Oc�W�<-N��]&�4��+����*o0���ZO�f����EO�����2���7��UV4��7x�Q�����o���&�wv�������y%5�r�
��A_��X����v��2���g�n0E0�
w>������L

���n��������]&��J��u���
V�{��C���h(j�>�'F��w�!�����b5e�s�w�*h�6��7�e	:7���B�D��@I������j�fe��{���v�������+Ey���
������{B����
?�`G�-��	#kAC�@����X(�*6�+�V��&�z��.��a�`�t�9=��M����VX�4��Ys���J������YX�nh�;���QEBa�l��}�� ��c�s�>�6�����`w�i:=��EN�>([>���OiC����F,Lz7[0�-F�`X-�����,(O}I����T�>�Wj�0qGlzgOKd�	&N=�����v�`i&����O���T�"h�d1�E�
~h�&��,F�������I�����kRj��f5�K>�iumz���%	v/�jvo��4l*��p$(M��L����/l/��!Uxz
vV\��%�D&*�1QL��������.��09<�^���5�7-�a�,*�`N�E��T���C[*�`o�D�����-��*�`�O�4���S��i�66����o9K�*|�����,�vUt8��������*^"����q�V�S���?��e����8x�<��q����tP�l�����;��/�r�/S�x�����0�yNA(��P
M8:�7���R7I�����\�2������|BwI�
�k��~���������a�V.u�8��u�_�O����'_�����W��`�{�X�)��^�nD=*k��47i����X��j�I������`�v�T|vK���*)�;�����M�� XxK	��C����2l!|d	��&��QK���v�K�V�	��-d���D�E/	
�'��i��C`QV������N��e=����8^���&4��&�V����Sp�v7��'��U�����(�b��X(��qY.��J�w��~g���v���]�NSm�*��D�t����#���4��pp1����X�V��L�^�`�;�=�FOS��*��D��8b;��2�L������/������:�������x��	;�
��J����/v�tg�,h6���%���'^������q�q�I+�Ia���a!�93�4�v�����YV(v1�����������^,�9�����r��8���%
#�~��~b~��"�V���S�}�Bu��wV\)j��]���5|�������bdq>��##�.-vu+�w�;*z3I|���Zz�mz��*���q���^�:ow"v�g��o���`5*�0�W�H��������8DV&$�)B�%�;+%6����X�����vV�*v��iym����2��'���U�������Lm����.g�����bsY��1m112�4g��H������a�����`7�Y{�H���~���b�
����G���`�OS�+u�
���ro�&�1l����-:�b��/���;k�����ES�J�9Q�4U�1�iRL`�y{M�.�L�sf�����
��������`�����%���_��D���
���0����d��K�������Ft��qF���X(Q�qaT^�[���u�k
?�&�V*Q��$t�Y��(�i8�^��U�����9;+�
+�w��&z�]t��gA�o�M�������i�6d��>��e�{d���G��������Q�6�`{�m��j��U*����^�sv��u��w&�h��,i�ss8���R�%�Q���D��:NXx���=�R�+�����=<�UhB����>��
K���,�U{��c?o��O�kk��$.���
m��������i�l�W��k��|���g�����9&M{��2��;+�r\[��CGk��2_�b�6�u���[���Q�%����k�������GS�����M�`������|�~`��FfZWb/�mv���e�aY�h� ��
b��|A��vb7L�
�^�M/�i�l�Ah(����=	_���
�C���;t��`j��JT�����Rx�R����}�������F�ku�_��<���pw+�w��4�~y���	b�����;t�Hi��{�-[N���<��Bk-��b6��;L���9��x^m��Tm�0�p���I?��
�v��B6�`4!h(�a6U��j[����0%�q�{�K`����8,��`�`���{V��n��M����6�����|�=g�����?o��i8�L�[{�p��wg:��Z���LN3�����E�^��Y��[r�[��+�$���-Yk��-Yk���W��k���O4�"�V��,kM������j����;�:5M������4U����*�������t�^o�������T�D�J')D�(��-l"V�����ta4��Ll�44����*l�f�B�K�i�l��`���a��C�E,L����.t.��x�L�Y4�
K���e����J��
�T)e�v�?L���kNS���tA�����l��\���$���]O1W�:�����
I�R�������\yl���L�ty�[C��Tm���%F+��V�A/h��a�`7,K�J������������2'>.�h�J|���*�l>�8�-�L�X4~w$����u&=,�{����h?=�MX�t����IE���
���i;4@�0�d���;��9{�*�\����A��p��I���L}��Mu���-	;��m^'����������,l.�b?��BtnXO7�5|Nu;�1/�,�k��
���z���K,���,ErX���bq
k�n&�^��{����uXzx�L5���A��[Q����L��l�j�Z���D�hb��}��$��=^"8�w9���]L�Tl��=-�����$]�>-��+zX�y����`��k�
�cZ���~L8\$�2?�G������O����L�`2��a}�Y&C$�I��������D/v����>F,�Y��OKd;n��x.�f
K-���;�����b���],}QlcQ�� j?,[�%g?7��Y���AM<I3I���n���6
�T�[]�i8�,[Z4,��M��T}8����qKr��.Qx���!���pX"+�xu����������5��,�Pl��>M�'������y��������	��7�4�����T}��"}���y�.h��*���]P���U4�e0�w5��/`xUR�i�l�0	a�0q@�,�~�&,z�3i�C!	a��FzLAn}Xx��$h��h��,����*�Q��-�D�B���o�����#F����r?=�m xak�J�O$�����6x1���S�b�����S��K#c��n@��~1���r���p[�8\|,�F�H�����Xd��4�Z�-=M����
SY������j�	���mFN���a�����N��\����nh
{����x4bD�k��x���z���"�o�{dx����y��Uc4�LX4�H�����48�O�^l�=�2SO���O��k6�{��v�k=+F��x����-1XXO*�h�������U|����I���Q�!��s^�����\8�,<`�]����4�- �22E�T_;���js����^�=l��|g�J���x���������I`!���xE/��P�<,j;`�m����;�a�/��
���������bWA{X�v0Y>�4�T�����������7��^0aQ��Y,�*�zT^Y[L�L�C������4U���E�fE�bs��w���,L[�gmN��2��B�a������p�W�:�����w���}X�v0�X�4�V������*�Y���pAS�)X�"h�0,T�;
������A?�N,Tc�e�����,�������"����j9��
I�BS�i��"���P����o^��[��+���qzJ[@�$Y��{W�D�
E�-���/t����=mLJW�#��fQmD��0�
-��%|}�����|�%��m)����6���z�����bw%��Z�����0[��o"��q+G�5|��
��`W�+c����TEC�i�&~���O�i��Z��vt��g����`��w���R���#�b���$�w?1��,�\�Dmi2�4�
����w.��,�:����>�4S�mt�
�~+12L�[�,[�y0�f�P�T��`X^�f5�����KM�af�� ���S�h�7��+	�����E���%O�4.�k��+�%��?��l�B����t�J;VtI���:���\�y?�w���>��+��qE;���VVI=F�0�!�'eu}g�J��U��}A�+X�'Kl�Y8=�����������������T���p�6d�����E/�<���1-
H����&}=,�<`Y{�4�lN8L�r�P�Q���c���V�Y�x@q��awQ�c���Z"�~����m�)�SW�D�a�$X�{���2IK��--�<`�x��g�i8[L�X��[Is���`�����U���^��l��*����������<k=�����KMS`��=��Bc�����D6'�F�hX/�%a3���.�_
9��
=�Z~XH\4�[��m'�c����I~te���!�B�U��|,�0���ei�eeb�x#�3?�W����X{�av�h��\lg�Rb��D�S��|�<�E_,/6�X���x��	��(�}X��,K����B��c��������&v�$8�YX�����	�/)ct�0R�
�����a������b'���m�����Yy��p�K���a�8�P��#39�0D$���~���0_�i&'v�%�k����F�k�R��������(|�FsX����b������x�����c���>���B�B�2��*<��0�c���	����bW�O�X��a���+�a�?�,Ft�&�t���lV�����rrX"�?,R'*���������-���w�%�?'[�wAh���1,!��4�e��%:��X��
v���n5������4�Y���Lm�@��/Z�Q�s�X9��P�X8�a���*,=L4k���_����X������|��,��������0
�W���:�.����_����X6���{Dg��~���;L�����K7���>���N����_��a�����L���c��aeJ��v�w6_MNS��XI���C���h��}gg����/5��fi���*i��f������/���r������O�i�ex������lO0�`�,�RhE+��
o�U~.B��6~;�MHO���b�X7������~sVg��+�
�S�s�;,�5��9,z��I�ty=k>��*j��e=�+~��]tA���^1�0
��m`;��4W7<^A������`Ag���p���'�v��	���� ��X������Boy�����`�Esfrb{%��b�PAX�dI�b74�=k>.����N�k#�	G��
z�����U�_��4�K�p�7�Y���D��K+�<>7�������������*,;r��R\�����X��������^��]I��"�_��a;
����B�f������A���$�YQ�'
/������c����;�^�`�,<�4k����vr����f*����jm�uGt�Q�eE�bwA���7��z�k�D�+U(�~�=3�
_���Up���Eev�KW,�
�Wfje������E����ewba����(�c����^����a���+^|�w?L�J���+��P����u����6�{�!�^�G.B�E`7);���#�N���$����(f
C^��$�Y7��
�tF�
�7���S���>Bi��X���H�n�O���O�v����6<�g�>\��\9<m-��}��"|g��J��Vj�Wz�OKd+:��M���%;X�����,��hZ�V��~S�������j���������Bb��>��~zL[���*�s��(�r��1���RX��)Y��a*��tjjdxj�MF��1m�������m��	vC�8�	s���������;|�����0{Z:��*����=0�\��Z'��=M���N��G��.o�y��1����+�vXf�u�D7;�z���S~��n���aY���E��-�a����bd��C�Z��0��
q�����������fr��+���U��*/:'�~gGE���Sw�`L1�:������1ml2Uy�T�A�����qab�T�����D6T����U �Fn��{j�9��j��Z���fW(b��:=�m>X�4l{��a����	W7��b�/H�>���Cb�p�|���Lmz1yT���<
g�1KJ������,<=Ve{U$��e��(Xa�f��.
}�$��[��a������u�z�6��-��9a�f'�i�l.��!���?�����[�5��?-8��������B���<pKp��"4^w'��J>����`�e�����Z��q�����q����+�>��:Jb�7:�B,����G���W��A25OS��G����6���%�Y��IuI�F����K���$���1���D�[���q�k[yi��LVi,�e�Lw
@���e�'bg����0��h�{�e�#��DBs7��
�^!�y�n�u��Y�Jln����
���;����,�s�{8�2a?����������bf[�t���4�Dv���������0��`2�����%��YP��,[���r�[�dq��C��R&�r�������b��q{���T�#����t����l�����E�T[�Y��;[]x�|��������D�[����k�d�E�; �b[
��������Qb/�Yj�,M�s���nt��?�n ���c�n"������Kd���L7X���nOpy�*8"�,�$���Sl+���E�'����3=M��
��6��]h�[,L��/z3y��R���#�R�2�bf����Eb���=Cr����4��&Z%����U��8�ca����V�N���0Y�Q4�2�a��_�]��
6k��v�� :�����,���d�o��3��&k� ����X\]lnS~zL[1��P����nK��DD����s���p�P��ba7���J;�s`���s��w���c1]��~����h�wv�8��-��M�+��]��p��j���LgYR�7�a����j{�e���e�bS��Yy�Xx�b���������9��5��5n���t��	��������t[z�N��j7����fh��'�`=��
��O�_X����p����)�����`&�Z;���pm���v����xz�L����+Dgq�_���m~c�T�=}1��u��:��p����`[��|���d%�����
�t���V�f��f��	���;�-id��	v����c��c���7�1�N�X��*��L�g�LNL����D����M&�����A-������R���^���&t����^������X�8v�X�ium,�[��B;��.	���������q���?�K�1ug(lE��0����l���0�Q��w�`'��K=gzb>�VPP�n����.��Ow+�E�K4K�OV�):�U���9�d�EWz�O���v��?�!�{�L��+80M�����s���*���cJ�w�,��9V.$�����9�Z�fW ����P�
���`}�T����O�^�G���%`U��T�M�����a���,�S`+��U�'tiI�~����L)�C�F���k�O�����<rmT�s�0����������q��,m�����5�+?��V���1:`���o-)���a$����qZ]�102-�n�J��/o*��`��i�l@����a�5�p�R#F�V2�:>�N4����
9OS�%KH���1�[��J���'�BDC�`*���[�{�J#	x�r�����`k�����!F����_��T9ka��?�7����1/��gg=��.�q����RKx��	$M��m{��X�0������ba3��L���h�?�/h�X	t�Wvc����[�%�'S��*�����P�`q+fI��-���+kj#�-����f���5�UB/��qYQ6�=��I�y���JQ�U�i����g���\~zL�?LZ����$�a�O���!�<3l
#zA�4X���*4����K+d���B�����&R�4m:A/�4�a��R�c��d���������D��hVI�L%Y���O�����������\��)C�����h�8<��!�`��hdxxIr�����@6D��#�a�y���/o�u���fU���F����I������,vmOl��U2�,������������^i�0[mK �n�{�WZ]�lP�t?/���(>^�8^
NK3�4>�+��{��x��F���4ttK����l<�����B-��T�b�)�'�e����
~`����-de.�/V*z1�$�Y�4��SE���������~?��5�s+������X�^��-�k�E��c�/������������.�bDo�8k��bG��Y��?-��%����������l/�2,�
/��%:�O�-���0	�'����X��!v3����P�,s�XpZ4�$,v�h�g�2+������������������X�u�Y�H���
�,���D�B�����b��;|w��)��uA|Y^9�&~���F������+��5�K��X�X,�z��,��,<z����dN�k��N5<W��
6KAg<���Z��%�����E�����aN���:�f����E����/%.�!��k����q�b�B�Pl�lA�aY!y�J�P�E,������e���T�~4�E�r�*�������6����iob��'�t������H��P��s�yD���;
��������V#��9��B���j���h���@,����U�����
�@�e�Cb���;[�_YVX�=�><j�"��2�P��4�E��)�������+��%�a=���\�4�O:x�{����.��$�)7���N+�C�>��!���f�w�)��[�
^����[������^���n0�l��N�kcF/����f�%+�cVk �%�}*�mK,/&�,*��}����~����f&~gwR/:-�m/��M�m[��Y�+^L�XtV ;
g;�c���(
	H���P��b�vbw%\l_������yD?0j"��p��n��c������
q�D�����$�
M�����D�,T4�a���?���k�U�}i;U�0������b%��7��eY�b�k4[(#YV^LuXt����|�v��,j�Y���D���E+�`h&[W��Z���a#�$�r0M�	���k_om�NS���T�ECe;�Y��;K��������LkzCf��ZF����r���1�1���J�X�{M�*��,��x������d�Zvx1������yh�;�/B{�E����)�,/EM_�0�`I�F85���`e����EC
[�������5�\V��9A_��O,u�{�|�� ����`�������"����n����s}�w6����T�:�eV�.vY�{A�hX�l�����q6���:���R������W{��m>x�?�=`�f��^�vzL�|tU�{�(������7����a-V%m�q�])�������`.�����0,-�	6�~���/cA_���������]s�2���������~��N��i8[@�b�Y��+l��6W*�eZ	bg���	����%����|:�����o�M5aoQ��I��������!���������'
n�'L�������{�JL�������{Q�y<M�v�H�[�gi����+Y���^p�z���|�]��h%8k��E��c�C���m)��������p?�F��;[�{AG��'����d��l��������
o�R����56%���6����i�)F��F:<�5�s��o�
?�%��=���%�zH]����v���e�����Ew�4�V9<I��qK��_p���x������+��A_��<�� �Bs�e�o�z��5x�V�%M#+/�)����V^;0��4�q[�W\V�^0�4��������PgR���#&�
�-�w�a��R�b�����M����l,;��W��\*���9� ���}���f
co�s:�OKdF�9�l���^V_P�3h����{W�E-�`�%��>
g[��K��R�ce��8\��TNKK<S�$I-'k�4�gx
:��O����[����^�6�C��~�~���-
�cDoV),����DlcU������o�Co&-:�������i����N9����N"��,���6�ma�����v���g��.�	��	?k	�^^����M�o��
/�5�vM�$�7!,����W������$��Y��Gf��bY���e��bG�K>�����e�)t|ga-��e���y��fq���.//|�U�:����=�Eg���p���,h*��������R�;���jdN�kc�y�LC�Br��[����f.���q�-����t:N���a����M��[���k��V��Vh�b��a���n��2M6[��-����O�,}�>�Y1�i�2�aj	�-do�Jg������d��p>��GT4�%��c�0QK,o���X~�Xza��34%4������f�3�a��G�^�`]��������;-�m	x��<sa#�<3,^�Yv�XX��Y�Rx�S���[�5m<A�F�Z��^p��r�Q>��>�iumw�$m�0[Vl����������tZ"^�TVt+�<m+ho��-
���tU���	*�M���
���W���B�~[f��n��Y,~��e%�b�>�W�.���,_Z4�5[y����a�/��j��>,��l��x[k|��[S�5�1����`s����6�����Y���������5]�������n9���=��EC�g�,�F,l��'N�\�%�=�g�`��y�P��~O������s���p�	�S4��UK�BK��!,�MT�^9�m�(h�����SH��]9�,d�a�@��UQ���U�&���)m���WW�4���Bf��^����.�����^�~������JSDw����!-���#�s~J���6'��GC�<���f�E�
F}{KQ=-��E�D�M��4�-/��-�"z��E�����Px�-��aBL��w_E����7g
������.qf��,,���S��ay����V���
�B���f���-��l;o&�,)��0�"����O�ic�B���JC"���������n��,�=��������F�!	,C/�P&4|g�}@����L���d��<Y<���>=�m�����E��:�.����������
e���E�|��u�*�8���f����]#��N���C�J2
I���'V�0�����-mV��]
�C�J�4�l)4`��
�>$�3�4rA�t[�J�����{a/z�������&����S�`�nv�0&--\�]���������--�
��'��)w[�w3�N��Z���#�~���1���uN�k�f�>+���0k�`����R����`�Q��(,�6
]�~`��E�R�a�d��Rt���`[�����Y&��p�������4U�@���
hI�B��e����Y0^l��wZ^�mL�X��\�]3�N���l�UrZ^��L�J4<���z��J����������v�f<���0�<�	kC%u]t�3���8\-V�a��hz6��*\�0S+5�C�=�0�;�	#���Rs�D����7�������0�u�ie��a��R�E�V��V�LyX4����0|�����n�o�w��6��NS�
���E�����z05���@qj������V����G���%�i!O���,�Ji\L�����=�4rE?��$�&�������]-V���B��A��rb/�"�f���[��Za�mq�
����=�S)�~��E�7l�L��h�b��'�_�w6g��jKVq}�R;�'��i��D`�9�s'�m�����L�&�I<�Q����[��|��RBk���"�q�Q�A�-x������z�X��El~isN��i�l����}L5>�;���%�\�C���4���
OK��4.,��� ���74��J
�[-��[��1�2.F���?��?`8�92p��pdQM?�+��nG>��|�f'63�e#O������4}!��Y&���kv?&1FLv�������gs���Ae+�Y���x����1=����DUYf/�0��9%j��hz��2��������eU�?e����{p�_`yy�Yiz�t��!m�r�!�D����#�l4��7�w��]�DP
�������p��A���fU��,S\���=q�_�����F��E5���>=�
/�[5}!U<�9I�0.����pKv}�0����<W�Q�����eN3���D�L_(S��@���I�w6QNKdKiK����i8[m�
�
�`*P6�r�~O\��lx!�Q��\�e��f�p���|�����|�M>T5ecaz}o�u�s���7��
�e
��vx��7{��&��iym.�<=������Z4�6�P���O�`5����P*��F_��Vru���T�bz��f�%���t-?=�� h��*�~h���)o�A�0��}G����|�����{��_��4�.
o��p6�������Q��^�/`{���-�>Z�I��8L�����������xE�}������@�X�U������a���6	Pj�i&;av� �����lN��I��B��= �/`k^�����$.�TV~�~����!��g~t���lM���y�:
��:�za�7uRk�}e�[��i�|2���]�t��Ou��c�,�����Y�3�{X�nK^����]��o�i��DP��i����]��2)4��b�u[�F�%��F�(k�c����M�C_��������f
s��}��)�,�}Z^[^��o�	�YViv�%�oQ��lN�=-��6x�	z�#?��b�:�����QY�if���>H��*�q~�n���fM��NTg���R��Th�KK�4�-M��>4���6�0{U��E�Ug������SZ����7�la��ue��EI�?�������@��fK!�a�s�@[(�f������])���D6S�/��#�|���
�u�1���U���
�i��^��	6���s(o���6�`j�P�y��l�@�����9�u$����D����[�5��D���A�^>�a��u�K?�U���������A_t�T�V���j��M��zl-B�?�};������R����M���x`>��E��+���=-�
>��/�qX��o�����`
���H�/`{V��
�O���AJ��;<���$Y<�~��%VIH��7��VO�i����^H��,��2���n�M�J*O�k#&wIp��J����.u�xw%���	��gM�T=�YC���ia'��C����^+)a�D���;>�U)W��a��%�J����7)RC�0X&f����>���P����l��9M��:�$�^)�|��37�rM���Ix#
�V�I��������q�K*����*�J��gI4WJ	�X��
�������� ��06�����|�"iA��LIr�0)�`�mPp`���^sZ^��:� ��|8��}��O�w����`����1}8#�e�L�������pO�r�^�	�"��ZX�	`�@���������
�����_�v��
o#R��?M8��������uAw��"��t���j�fqIx:����K��A��$L����C��f��}x�mcfPMU���`�,�#W�h}�y+.�mc)-��>#�4�ai�V{��
�~B���x���~gg������������`Y{����s�,��/$h��a�f�����������wa�l0�����Y�I�G1�t��CZ��i������v�Cj�����=��TZ���>M�6��6�*>�m�
i4�����=�e��\4�i8�,7���1zU�f���lcz
^�B���F�����/f>�]��������Y��Gf.a��e��-,P��m���3\�`����Vp�_V��X�����
O�
?f�p��������v��x�BB�eMj��<oIy��������Wb����������~Z��%B������xd�DJ6�gC��R8��D�K�L ��
����#v��m���k����_������7�����ER�.dJ^V���/rI.���0�Z2��V^"�|�T�4+��YY���V��X�X�((^VZf=�L?���r��K
�y�v�R1���b�����6�X�Pt�}g��Y��j�I-�n�1%����sY����zk�����V�������)�
�%�a��h���~��j�,��'.H�\�Z��.�/��i.4f�,[|�;�hxZ;�����r���qF>w���V�	�D�c��~bxQ�U�S��,��3�?18V'.v�����Q�-,]�����������<����p�^$�4W�MA�P���[����������Tg�b��p���L�$|�z��]�r�9�3W����VK6�B�b�iq��U�Y���L�Baz�nAb+6���/�������1K���>�������eu���K�.�`��5��������/x:K39�6O��tf�	���"�e���A7���Nw-���@���w�&������A�O������d�{�;���-E#,M�RA����e������~X6�G��M)=��K�G����i#�\�x��++����G�|T�e%F>����~ZZ���}�]���T�[S��-&�l�v�n�������}g{����d��$�4F�[D�����j����q��vZ]|,�Wtc��P�xY��bjE�[A������5��W��%��6&�"��h`���L~���������r�gW�t�����Z|8�>|N��0�Q��0OJ��x��5JDC��D�a�w������/T����'`x��=�����/
�H��}����'��B�e=���>�^0C}HP�n�a���R�NKdC������=,�����X���m9^��O�k�	f!����F?�#������.�E�aI����*����������<A7��*.,=�v)�\���`MN����;��n)`l������|/��t��I�?4�����%�9��V��|sw���I���:�e1�$�^I��������{���5/���rcU��t�;*���/X\jM^�]�5k���"��qU��u�������.�+��nn>�q8uo��V����,�;*�D������bK��/���0|�bd��"FYH��1��7�Mi�%���<��1m��I�P�F��J���h�9��
�������|������7r=oRi9-�� xczBR�L@Ih�'}��f�[��ium�A�6h��l6mOS��S�����B�:�#y�O�i������Z�����p��SW*��1}1�;��O�Y�t�]���-
��1��0��I7�6�[")��/�r��g�����,��#)���<5�kd����NS��M��8cEm��V4����9MK�E>.L�t�aO�k�V���?���ew1�����%�����8�V�h�~8t�J/�z���.,���{�F����\==��c{�p9�1�8���xS�9=��c��^�[��i8��z*h��&7i��������%�/z�-�g#���=���}K�_Lj]������bx_��Y������P>
g���I��$[ElQ������+e����V����O����.IqCS�2���lQ�����V+�����	D_����|K�����[����`�S,,E�����b���Q��\,���|�Q���J�w �S	���X}>+�_0z�=J�v�D1k��$�t��l.�>-��6���7��wv���`;��mI�~o����L@tg�pba��X(�(v���%�o&�.z�����2���|,��s��O�{{y�� OF�o.�?L�S���g��m^[�@A�!�V��Y`�4���vo�
\nk���H@4�&�rbb��������I������b�B����=T|��'N�-�n��*bsP�4���"CD4��[i�{[+���^�D@l/�B��,��y�p�W(��
���7����!�i�}]�BeS�99INK������d�m�r��c�;b�&�����2���c�s�{��^��-X~3%o�����6x���yec��������wZJ�����m���}�q8yD�y#���i�>����4+V5�B�b����1-ELEC+��bfa��n�
�[����v���oxB�f�p��J��2����q���A�eJSBW!q��v�7.�:l�
��@�]l�??-�m	x��X�i8��,�(:�\�����Y'���1}�3���e���"U���`fB�a��Xx
	t������}��=��aEx�	6��S����
#L��nJCq������|�Bc7�~������,Y��1�`Wrf��������o�hL�d�.h�k�'���oVT#v%�Ti�~g�������	��m`��[X!�10V����,�
�C�~�.�^j��[��m�@��4gs��i��	�����
�=2�$Km����:�\y���}�K�hV"'6;)������V�i�lzA�B��]����9��p*�g��F�6���+��n��<�����F}�mW�i�������E3m���G��2������D	vW�kJ�tU�\g9�b[���XiYC��4�+!V�J�,L�&!X�.Q���
6����;����6��
�V���T-�Mo��T-�]��v��6L����j��U^�~��}�!�!X��@��f��������6F��h��~[�����d�^ �ZP����}3���J�pq���4U[m��geh�.�/j!l��~L[|0�c�go��$�����<�%��	��c��Bb��y���6��|�m�����7��
�"���%��Lr��|�3�4,���qS������`�����70XX,�A��0�l�Y<��ME��(s����-z��}�}C�����������QP'�-�}3�R����wv�3���5����=WO�k�f��`�n��L}h���:������#A/x���u:�NS�����K�$d
�U�����B����7�����H#�0c�P�T��k=o�Vd��^S�^�M���I0�b�[����	w�������i�mv�N���,��/p])h���
���_K;g���E[
�������q�`+�V��~�9x��j3�~*o��|��Y����-eg��)%kh��+V��s�������e$���8O8��*�V��,'}�<��7�>���������f����i$�������7�
ex�n�Z��f������������b�?�g:N���������lI�z�7��}��`'���M��c���vl�4�������w
s����WL�:�z�b��,��Lm>�HX��
4KY|g���^-��
�zb2��;�����q�/3�����	D_���F�Bo�Z\n*���i�	��Ir��[����
����!������:���^"��\SK,��������^��;�LrA���L��d�E����2�45k��D���
6k%����"��Hbz[���pvA�/��S��D�4�Vc����h�e�"���S��,h�A����S��4U�@0�_z�����r2��&-��J!��t����
#���n�`x����g�YH�1!]�+����L6��
��uts���"��zbw:
NS�=U���n,�DlO����6O��7��s<kE3[p�6��6&K+�
�]�;�y�B'�fI����ui1
��<�Bd�.mc���;���ew���]�Y����f��k�~7���pK�����Sp��y
.�z��Q��iV�m�R��t2�n��J$*l�V�������~X�Ol���,����4�.5pJ�<����/����d����7��X�~/lp+�Z��������{�j0�H���%M ��1��D��pc�N�'��id�?k�B�T��pc���7��xd&�%^�=��Q}Z"[N���$l���m���f%�����Al!��Y'�����-U������n�r��{�qce��e����{X"�$74��N�n�+%�h�����.t�
����2�h8��V�	������<;���L�)-�rS�.4�+%�O�`[!��Y��1qg�#E��l1�d����Y*��h���������B@�Y*��<K���ni �qg��e��r�1��wAY�Y�8��������%��������X�5����S�����
��`;�@�y+/��*��&��B�4�h�;�]^D�.cb�����0E�����t���c��[A�#�;�`���*��-${4k7x'hj����q�`Y��o���e�����E/V".���<��;���wfs^����1#:]y��v[1��F�(/4�7��&���L-����g���dc57VH*�Ie-��l�@�I���v��hX�1[y�m�@�i�h!���������b9���_I�����Ge9�7m������RE?��.5jx��6�����Os.Ts5�`7Va�N5���[��+��.��%��	3��o�%Riy�������^0^�U���Uk��(��E���o���
�]�+��J��qa�������=-�->h��S��i8[|0)U�������s{E�������b�������b��@I��q���'�jV���>aaQ4t�;aB����
It�����e�{�a�
��,�&���+/�v�v,6�;a��X�������FS��a�&�F�h����9Cw��B�����Z�,4�n�Y����YNv��l�<#���kP���V"Dn0v�4��E�BYy����1n�6O�k
��=�cK?u���D8�*Yr-n0$*�bx��P���z�`K �JnL�It�/����/#�J�[��=�A_��{�,7�x��H���V�t�a�H:���Dl�8��sA%��t����y�n���f�����I�oP�%K�:�
n!�I���Zs�1�5��'/���QFK������.��?�KO�`sz�i�l;1yf����wv���Y��k�XnLcY�����g�1������i#^N�u\���^qcz��W��l_z���/&��w�1&�W%bb�_Z�t�<g��M���|���D(L+
6�1���e�����q����:��?M��t3,�v�r�)i����!mK�HK���	��F;�%���%�^�zh����0
��������ium�@K"�^��Z26�
]��k����bs���B6``��R�1<�B���K��Xn��������`���7g�w��������=h�:����`W���z�
:U���f*�aX!�a+�����������>0����F���D���p���iC�S�4k��0�'�^��X3��Kc��&��0,	�A��`�;��D65�f�hhale=�(�
7�4��VB���D��~���������H��2���$�H����r�bs��i�����h�7�������f���X��1if�����[���"9��������f�i�I�e�8bs���1o?&��E_a��*����-U�Y�Bt���[��3�_�xa��d��.�t�~X��Xv�
�jrb'�H�]�
tZ����gd!�[~��
.���(�b�t��v�
{[�]�|�n-[(�a�E�����j=����'s�����#���P�X4t��F������-��Of��$���Y���,mK�����a���xg���'f��~����[�����B��naYXH�-,?��7���i�>#�q4C�e�0��pY��w�t���V�7�S��i�>�Y�Ctge%ba�����~,�)�4u��f����6n�.
ax\���Z w��vx���B�g�
��@@a�BND��kgB#��1f�W��^o�������^Ew�%H6��OS����l�a7�Y��4U�1LV�dqe�p�
6�|ga��s�������C^t�p��nx�j\�'f����[��3_���V�g��J8�����?�����i*i�?M��&����<0}eW-��[7��T�PrH,���k?�p�X��3
���~�-�hvKwL
���BWb��J%9yjO+d��E�E��!�������ECqJ��e�i�����K4K��V������e�H��g�ium<�25����]�`�X����Y����
f�f�K����bW�
�[���hVS�/F�`�w�N;��)m<1�<�0)�[r�rh��WSCH�.�kJ����X����$�,���������+�(��v+��G~�~�WX������|#�vftE���#�%����j��_l)c�����&��?M�������*�L<X4��%�F�$��j�O�i��������0�,\�H#�d�Y��3��t����
��U��-�KmRI�B�)�
��.<�-/:S��.�!���LC4�0�*���J�����ZN�
����J��!���k7�Y�w�V�7��/��"�����:�Y��h�o�Cq?>�]��X�8���8\�}S=2&a;1�9vZ OLcY4,��7�0�`���-�Wuk;�������<2F�d�����&��:�S�o��K7�Y40����%,}f��Dv��Ic���[��&��A'Y,�D{��ukwx�z���$��7�
�)���v&I��8��S���/����+�i���6�F�)� �oR!6W�����"�l����bih>��8�=�S��i�ljB�6h�Cl�Z��jSn_�X�>�Q���Q�\���q�%�s�������/B{��}�&����65�+�&4S�

�B�?��gas;����bI��taD����p���58>'/���4���S�Ul��Q��ucR��s��4�m>��%��i�Rh�oQI�����;7&�,����Y�*��0-m�eVxy����(_'�{y������f���F�gs��iym{A�b��6�M������a���G��2�
�>�;�1JK4��C��$��a�F�=�5N�k���;��z����h�J��e�i��T�8|�0d*.KR7�]�$u%����	<������b�^��+dMj��t��b	K�wI���^�2
��m���ME����a�h�0�o��*�]��n��	z�+�F�~H��jb+����,p]1�,i��m������dG����m4��
��������f����e-��D	SWj�-LM����9��l�����ibl�����Y���wVV[aqm�1ii���"Yj����V����t��hAS�����W���~���c��a�R��0_Y����?=�- X^&�ghgy��3[�nV����/��#���7��x\�B�g�#������G�S�<����4�J
��[q[X��1Ek��H
�n��I����6��|����tP�����<�i"��gk�d.���F*,k���U��Dh���{����������rU7M�P9jK�0a��/4P�����
���P�l8��=Yx�#�;�i�����h�����Nm2�L0�=9POK���-Z4��;Y��g]��+��h���!��(�T�����n���"F�w������Ym���~?
7<�`Ew&X��Y����BUbG�s�-v���t�	9
�<\����yV,�V��j����*�f+����a������=��9M�';Kt=X����L<�,�'t����J�_�RzgeL�s{����!�3���nE�z�v��,���	�-����vI`~�12�C���pb�\l�-x����;����6)���j�%���K;������n�����b�j�P�N��VB�W���"=��2���f�E,\��>�	����n9z(;%z1��X�Y����Y�>������={�f���;���/��Y�y��B�XO\������L^4�V�eE�B/���)3�������X�;f�����z��5S�{Wn�V��LA_�]P��V��LQ^�o�R����U�+�ic�X����p��4���t���<,�#��i�)W<;V����Q���bdV�)v��&���u���O#����LC�����n���Z��/h�+v@+A����5��|����!����cT��X=-��6�]�������a�(�
�2z����������L@����`7������[h����������2t�NV�����7�w8-��T&� :������/�������u��9
yb�"���Y��X��G.�	6Y��h��h�7J�>>6-�
����� I��������>uC��FB���
�-��s�^%���p���v��Y}��
wu��5n�gHo6�Xa�i�w&^�]�
�2���D�UI���|g���a .X���=}��F����~M�1���}��;
g���Rw��	�\��-�����,��u�Cn��,<�U�;LVzw+���S�ox��-�ou���x�T������e��B�B��n��7��t����q�PO��E���z9-��W����I{�=����'����av��M?�iymN@[��*6��b�N>��S�T�w�����S�4U[���� �N&"(�.hv+���=��S�aF����I���6�h|����Z��8�hH9�������a�t(��	b��,�H�/�f�p����pQ����@s�����67�8��M/���(���i�6c�Q:�<��a�m],�i�*i�V�����
7S	�;��ga&���8-��a:E�&pK�;�b����a��B���:�=���N�i3V		F��2\
���B��~"A��#	Z�"l����
��YH���2hz�H�����^�����;�a���y�tT�����c�|�Ae�w��;����dL����&��N���
Afa�F�9c��D��`�6�s�42Lj���o�r�cJ��`�[��3�n��7X�W��K��2�`�J�iym{A���sv�0�f]	�Ys�C�$hZV�M�����%m��������B����QQ��^y�Q���u�����N:�n	�:O�������w
	�W�V����*h8��Qa:lbL(
�RVh����=E�DK�w�`g��c���d�M3o�f�[��������
�sY6�`X��3�9�4I�����Tm��HM��w�X��1n�1m�0�p������i���z)��D����m�o�DQ����-���J��U�;�=���XZ�����`[E��������2��Y����N�i�f�=��D�����	S������������n�Ao���r�,/xh��a��n�)�XZ�kV�������qZ^[�Lw\�U�kX�������vK�E?X��s���	����
�����q+�rK�wz���&t��]�s�w�gQP�*��!&��S����@�:��y�L3����r�����5�,j����,l-�f��X��)v�S�O���NK���Atcz/��b'��x\�{�]�L�a��A�~����k�<�����.f{�?��R$��d��V�{u�{������G�7p�M�i�a�q�����T^N�-�a��2�����z���E��2��&c*��f}X���}�����2U�6&��q+�����0�YO,�].�by3b��b�0qO4sy��j��pxnB�r���5�{v6����^,�o���9��>X��t���A�t�D��s����]���qS"�i�l�����%���X��X�Q)�e����<0�t>X�P��XV������v�S�)����=�Bl~X8<���.��Z�V��m)�f�������B�����`
��M����=k��TV�����������W�n���6��5K	�{���}X9|�P���)o���,�2���?i����Z��Y�U�<i�P�El��=1�X[-_uXd}��W�0�#6��NS��J_�����4��6�8��x*�?
g����a{���ZU��
�`y����SE�a�V�0@4K����Lm1!m�����\���,@m�V�.8.�=X>�h�g<�C�����%�������"�����$x\�X1,x<��^�)v
�����r=��{�gK�}��q�,M���:{Xyx��(�Pd�#3)��hi��|������b�y��a$��5gvV6��-V<�����"L�JV�.�l�q����pK�J��n�������W�������6&`2W��4�
xvI���!zd�{D�I�D���������$�����:�w<�6;�z��g7��
v��t��r��R�����*�,}�d���U�V���
����0&
s5e����3�f&tl6�lp��Td�Db�H��M������k���D��>����6�>`|&h('v���`sz��1m�A��U����y*�~����sJs8-�M>:�;.V����i�6��SZ�����>�`i*��$�tZ"����
�J��]��[H{0!m���#nxy�p��Mz�NKdsp])%���
6�����`d�����`�A���{�B��	i��(�i���6+�a�~�W�dN�i�^6%i]��XZz������X��'�R<,K=�/Y44G���^p�
v�����t���AO�kF*}���dcY[z��P�)F�,�X��+Ikx�sN�k�F$$�M�����|���	�h-zV���J=�*���t����<��0�-+<svd��%�����TA�Y�0�Y�#A,�;��t��fe�\��r4E�*���5A�T�s�&�U�<��������h����O����o�ba����R�g��K�$=o�i���Z�x�����7�=;�K;���-L�X4~yT�_�p@'�|��|�V�%VKL-Y�
/�S=G1
ki]��d�B�F$�c��{6+��g�B;�a��3
���+��]0�L"��"l�+>-�M �_���o��I��4U�OLk�4�����
3��D
�Vz��4(��
/��nx�vtd�u����r����<xi<r�4����n]p����1�`s���c������"��	�~�QDS��Y�y@�%�t�4�6v�O0�.�M_������o�Qa�n=��*���4���=�����ga#"�[�,�<��iK6��~����b74�4g(�fa��������|9\��@��`�tl�
Oi���ME��%��������[��Vbd�k	6��������MWBY�;0�tV�-��x:M��M+���`i����|"6���!��*�N���'�$������z�p��4_������L�g!�W��N���.��H�p+������9y�B��*������d�����XVz+�R>;-�;�����8N�5�v��{�{���l���P����k�������dJ��+���R��I���?�x�l<�tz��w�8@$v���mO����p8���G5�%q'KM��X�W!
}ZMw������N��hf��l�Y�����]LD���b����fAf�[H��V��, �f"bS��4S�,�C�b�8b7��y��= ����jD7�B����=����c�l������v�.��7-L�����2��E�h������D�dYU�9y��2Fe�T�tw��!����)��3���`a6�����`�}������,�G�bA!��!|�5��Yw������=���iq�����+5��b������&��l�����Uhz9��9� 5Nh���N��JU��:-�M���O��X�VD�:��2O�g]�O��Nx}
�b�b7��$x���9-�vV&&�z�52��;Y-��\h4��:YR�hX�#v���X�5Zl��|�V��%b'4Bn�boQ�PDWln~zL[L^Vt��G�K�h�J�-��,k8E����l�gi�DlA�yZMw�]3�-�[�{�Ex�v���	v�%��I�����V���1��-d�MKO���PN���dR:��	��
�������v*S<�
%d���:��^�t��	� a��O3l�B����d������� �`�{-6+����v}��3a���������`@�Je��������4�����
�i����nt���`��{���(��;-�
7�z,J�����f�U,L.�
]m�����U4�,��b8M���4)��=A�!v����Y���b�c�������Ix8���l	6��9t��������xL3
+�W%�lM�|�y7\l�x��<F�v��w)��qib���q+A?��N&�k�����0qR��0P)`��paumz1%_�7���\��V���tEW����O�?|\12+I[R�����b	��(UW��yga����r��$�V`������#��cF��U��Bd����n����5Cb"�z��������	���P���X�w�
��B?�G����d��K#�A��<��|��,0��������DM����d���/�B�M�w*��(X��6�����V���/B*�x�6x�{��������x���G�!Hw��
^�$�\��Y��"���/B��OJ��2l�t��	
ACI�7�
���s���z��V��-S�
����!&
�bM���q���Z{2!l��r!� ��������{���YT����2��/@��w�{��������4S&�F���g���0H�'��J,�=�[y�����V�-�
{T��������4U�{��,1k�����O�]�����2�������f����7����9�oOX-lPKw�0�����6�����o��a/j$��B��
Y	;W��.�����OS��=����wR����X6g�`�)�+9�NS����E���)>e�1�����',�X?dIn@��J���a���bae����B�w�#������H��4��jd���I�����`�wM~=��P{I�s�TD7,f�[
�.z��-a=�v�&j�S��)�����ja�	5�n�o�*�=
/�������:5n:�N+d+2���b�kEB�0�6X�l�lAZ�9��|9\XO�M���������Vl����&�g���z,Ej��E�a�����:w�L��p6���u�T8�,
=at}+������f��Y��Al>�O�k+��J�����V��LUZtn����[VY^��Dtg�<����e����CM��e����ODC�&���qs��c�~LtV��k��_�*1����{��pdD{���1���BS@�*�	�K��8#��T��oQt//d-�,/�5"*�}Y�6�
$��������8_�-�NW�KiYby1�e������e��-�b,�3/&�,:��x���S���Pg�0�0$6��NS�A�n��YB�X�B�#��b��b+I?���0OR4tQ��,�Xl%��,)��@�hXo��;y����,e]��l��
�Y��=}6b����:-�-�wh��
�^,z`��d��G�M���E�M����Yx�,]^��}���vh}9������������bbB�a/B��Ay\V(����V�P�,+�_�w��f.v���Q���m����Uk��Eb�.�i�6���Q�
�5��l��,7������[Y]��B%:c�������D�J�en�5\�%c��<�
_L4\t��g?,��,8����r�������,8��I��2Db��D�.m�����Q9F7��&.>{�[�����4���hX8,����
r�����TA���K��Y*��E7��}������Yo����u_0�$ivh�I"�Iz��==��c&�.V�������l�������W_,�L�`i�bs��i�6��?������	b��[��5�ey��R�Eo vA�S�B_���P��,������N?��Wg9Ib/�=�'.��\_�t��r��70���7�Y��G��������I��^t+
������e���/�&`�O^��i���
SRn^�'����s><�%���M_I��23�9_����YA��\^���.�`�����6��M"uu�cFr����c�Ao�J��+����M������r��+,<X���
v�����{Z\|�
�xO�^�������?�6�r����"��
s$M���Dm�1��7���K��j��)�����S�nOS�����D_0}Y#����s�R	�a����k�`57b;�i4k�D���z�������II���5���h���.�W�}��LNS��/��e�����J��u�Ms��z�ajR��[z�
���:����;O��0=*X����~g���,��'h�M?QIR���������Xq�����tu#��}>%��7��O�k{^WECw����I}���E�X`�~���M[�a����1R��C�/����4U�@0�?�
�jC�F/h�j��RI������a|x���2)g;�[
�p�n4@��A�i�>
g�&�H����6�E�qa���!F����l���`�������=T�}���`���4U20�X����ln�������\>���T���(�`��P�,�i��{1]S���� ��,)�����])�����+��}��*G��053�^�`���`�8���`i�����Y2����i�l��(������L���>k���JM��NlN�9M��<O�0�����T��s�~t���k�/��?�52L��>|������%��	����B�v����=��*��z��F����X���K_@9+�k;����)��4��6�+zB����L��?�~��:�����V�����JK�N�N|��~�B��������O�p�\\m�,<���MKN�k^?��|^?5n�%��
�h��Z�.�������~�J��R�a����A�dQ���	���Eox�X��UV�fTgy�v��0%<��������hX!�������;S�V"V�_Pjp)inJ4��)���/�J�t����^<+�/��
�s�?��a�M�p���I����>�aK����������������.�sZh�iWA��V���aL��&*�B���h��/����[.��S�h�����B�e��u7�c��=�{��g;�;+�E�t����}s���7h��>�Yf�|��w�mu����E_��8
��p�G}��d��F��Y���B��me��.�a���9���n1��l~L��q���&/(��?�{��ma��C�r�Y�
��>�boV&�)�Vhx��#&E��R��Ty[�^���{�,S����.v
����7���L�KlND,��{�����D��}�k�wd������^�,<,��7K�1��m�v�$�:�6��y��{lV�)�fY�ba����	�0�B��v��
�75`B�b+����j�j�6p3[H4�n���^)=tK�M����j{�I��N{�i4�^p[��X���F��^�����{�u�sW�������{9����'�Q���+�iym����S�i8[O���8�/����YN������������F����;�G�:��z��}i}���>G���&��J_�m��

����'*^p��"i�q�G_Ap[��rw���U�,$tmK�o�u�4\,#z�>��
V�%�7K�2]P�����z
����K�{�,D%6WH���fKV��;�0��2���z��������XA�����ga�?q�#��8�f���=b����B��)�o�^�����]O]
��P�_l�xc,<��@���S|��3�90
����O�t����A�9'������������J������������-An��������#�i"��%���Y���V���V-�
�E�F0b�cPj�0D ��t�;-��/���8g't�i�J�����A���T����,��NOi��������w4
���n�`+Be���Y���p��I�
��l�CJ��Q#l�VDv�����DJ����7��
����&bK�9���L�JtN$:
�����������3�"0K�l�c��
��A_�d��4L-v�Bf�=��OK���	s��]C�^0�l�1z�N�T+1��Fk�����K��<�X(��9�1kqox����=J#�u�7�+�����l��+�k
����i��lO���;����#����iS����@�i���<�MV�$����R�2�	���y���^,'�����<�G*w8
g3��Io:;5r��o�����EO�����Vl����4dEx���2�F"?�`>[ny3��
���vnJf�d���i�{r������aM�����0��������0�0� �f�i\x���3+m��O�k����w�q�[t�������L���z]o�Zo��1���)=�����/�����Q9?�/��U"�h�8,
{H���q���i�l��
�ZWa����N
�*�9�g����6��������bs��l�m��
��E��F�t��4�U��+r�y��
z�BeIDW|��[�B�aWl��'����#k&C3����X����$����8�����K�,]3�r�vY9����������*�b��K1�~��)[��B6�`d*������a+��- xf>+�g}�b\"���n��������`�1h��]�]�����fj��K'���7�_��/|��5b�Ch��o�drA�}[�x��^����J��2����aLL,�b�#Km�*���6X%t��~�^�6.��d���f<O�n�f�d>B��.�0�7hZlNz9M�v�=J��
�
4l�i�k������[9�-�[���	��Y���l%���������I&C�0�Qh�-{����P�0XZ���=�O�ic����g�~*o?�������na4�]�g�p������b����7,Lz���`{:WNS�-M���j��`�D���mX���V��,M��4�����0��{��kI�
�RIbC����Lm��A���l��:��NRpa��_����~zL�10�����}����O���g:����<�!Lt�5{#�����>1J5��o<���K�H���F��/�<�f'�����L��^^b��f�G�,�*0�;k�g?�:��}������#mO}��Y#�={#��;��v��Dp?	1n��7���������m3��P!��F?��az���L?&��Lg���p����6�C(���B�������>���K���'�Zm�������R��w�pC��_n����9�r����B�?�v*����?��;�`�U��f!u����je�:\���B����;2rD~�E�/�n�%����z�Y�,������;gx!�j����^H��4��l�n����6��������L��uf'
�|Y���\Ca�l,�Sl>y���	Q~�}/��HE	�_����`�
��n��lG��f���=�[|HX�K����'�k��WK�6�PH�4����.8����B��sw���|�s�����NMO��	�UK����j���c�	��%���<W�eY^�9�*�����#���P��I��?��|����c�X��
��@K��mh=�N,����W�@�����rY���_���c�z�.����AS�^�������4�D�}�����`)��- ���	}�-t��l��S�(��(�B��r�^��m�����
��N$�bv���/[z�myA����w�l� ui���R�/|��������?�V�IE#E�/[9�n�1tU�
N5*�*6�m�)5��P:�wdx��uq��������6dP��i&/m����������t���������T�h�����{6g���fLcf�hhX6�\fjs����?��T�wzH�i�g���'��6&�&�������z8�n�����w�)����>�����B�i�|0�B0�����3��I�����|�)<M��p����}C���������P��Y&ev"�����{��>�a��E��TU����~�;��Tz{Z"���M�<
�������NVe4�q����MT�o�����v��������Q�z_k���>v)b�����b��	o|O�i�l|������I		n,a��j�iC�d�S����66�}�
�lb��6���pzL�0��������]I��6T��;h��bv�%��=$���3�O��\�iym!S�D4�6F�K�����5r3=`J��Rq5l�"�
����z�|g]qx[��@�7��K��h��
v@3L�Vv�aK~_A7��[�h��>�h�$v%�6l@�;�P[5�7k��?M��������;
g�z�n0�&�#oCY�p_W�K�1l� u�/]�A|6��#)S�K����v���+Lz��zRI5WL���I5��d�Z��,��1���O�5��#�MOE<�T�1�^�����d�M7X<�����q���g��5=�����1��G�*���g$�3}�~P"����w����:4<�!��S���W7�J�����<���sv��[9�mO��}�T�#����b6/�"�t�'���=���MO�����vC�������&��ium?!�d��e>�k���7Zi&W"��v�AD��!�Qq�.�m��:�	w�C�F,]���b?o�c��#�A�$���C��Zp�l�Ay����i8P0k���f�@�i�6d`�B�T�Mlr���jc
m��S��$k���NN��cn#��@��0���8����u�����U�#����l����|1�'��u\b��I]j��"�a9���B�msf���]�4�l�8=��u��qu�����-,�
:�(#�'t����q�9�q+`�FR=���3)�����`Y[���V���
/����I���D��j?=��6��l�A��`������zY�~��o�('6;NS�<U�W�f�G��P����b�q�N|Y��M�{�X��+j��M����,�/�C_���KY�x���h�*\��������P������~L8/�6Kw��q2���^ ��*���l|�����/f<���t�XX-��L�[(�,
]���5���/&a&z�M}���Ht����d��K�e���P�n����42����&w�i�l+2�e��4)���S�L���c�jcI:��K�)u`�l�r�P�M�b�e���vYh���n,,%�bk������L�����'�T��q�*(�_V-�{������/���*�m ��/�Na��p�'�iy���2�
&�'������9:��p���F�e	���1��Y���^yU-�{�z(�#e�����bE�#%6��9M��$�K2���f�q&=]���X��JB�e��%��n�_�b��b4
���stZ"��#�����[�����lnsrZ"t��V��������a\�P&�%������a�v�Y��}�+4����Y(��,>|�|M��V��2�����7��d���V*��=�=5��J��V�qk-_,GG��{����&,�*:�!/�����Y>�h��/\�#�1m!��O��\(y��I
��D��a��m��O�.�]���(�i����,�e����f5���X=���K��2q����iy}`:=��U���������E/h^���4U[�0�4���]����/e
��\���%,�>q�������D�BJ�e]��L����Y�"4��-�-I}A;/��b_�u�/��t��M�J��Y�.t���	�V-�z���������k�B��eE��������f��{
������J���=+(+i_�����i8��D��Q�&���i�Xgj���2���9M��+4��nt��X�����Y*���J�4	E�+P���'��5�JH�:�4y[:�0�N,<���]xJ"��[4��I	��-[T���gA�6�b�9����v��+�?kJ_0���`H���xz���vzL���U4S�����'
�`wA����R}���������~`h�h��C��tx=`|]��	������K��
��:��5��{����q+���&4S���7�G�U�sG�w�M��`W���eUhz�=��rH���xR�.]V��i�/�S�B��*��
O�@;�E
Y|��	��;P��|���6��{5��t�#�qg��N�i��U��W�`wA7���t�F|9����H���A�)m���R��p��I��4S�"��	zB�L���,�Q_�k-�h��N�����<��X��K��	�b�/h�����L�e����O�U��&�4��M,l��9'������`�]��=��C�d����X���q+!k�g���������W��Tm�0-#�:���
�h��s����+%����I��vE�7�U�S���1m=�_�9��=���N�"��TX m�_*�o&�-v�^]V���p��z�0���/����=����5��R��a�u��+��	�����#����5���2b�~w��M�
���^0�>�
��f������b���g�z:
g+V�����&����.��@��`W��������nA�W&<P�"�l���,�lz�:_V��`�N�P��,��M)��������ES��`iu]���4k��V����n%��S$����2�[�����������
��wl������`���U��K�Y��O����y�g_��Kt���:������*P���gs�t�Y����s����U�QCcTl���1m����T��/7XZ��q�m���6d��4��me���Z���������@�������0f���Q���W��f����2�_�,�m>������\ip�����%~^boV�(v2�����9-��%�/��[��ee#B+��B��n��>.�bg��O����p'�S~�a�1G���?M�&�Vhx��>;��P�g�}A�d�f++4�B���O����O![�cY�+S��n���������F����s[�w�]���~�K������*���
��=r�(�c������LpR���f�<�bs��D6D�%4l�����\,�d�����q��K;���|�>
gK��E����lc�q���4�s����D�O�k3�I;�n�"/v3���-�	�E��,Yh�&'�3�XO����L�NyK�����T�Eo�T{��v���@��������^L�X,�����X�0��l����t7=�A#�,4�0� 6��%��
-�������B�����?Ln\t>N������hVx$�f��ba������%��mL�~��w��j�m�
+������2�Y���pA�\q�;��OS��$�E7��H�����v.X#�v�0mg�t+XX �,����+dC�e���'�~���v���T���X��m��s�������T��U�sf��\H\�X���"��a�&��z�Nx����E�?�.��B����?��\�.� �X���*\D������~X����
�<2������{����c�+��Y���Vh���x�:K�n���p�������,��K��`'��[�U�X;�CZi���@�U/�u�aM��^��-�a��a0,�	_�`K���Y
��Q��Z���>AC�n��"��������B�����i�D�X��.�{���k�P��lA�c�=X����J���.�bg����V��2M���������]Q`�{-��TY\^��[q4�\�qa���-\l�

�MW���w�b�/��?�	J*����s����,[��,M.���������%�����o�L���KR���==��'VCm�N����v�����,�z;�[���MA0hb�b8���s�%�W7�Y0�Dl%�m���=a�M#��\����� �������t�O���Z<���.���*���6z�M�������
�0:K��M/�J��2�����K��b$���'`��}~?y[��Y�����a��Vy�i���S��{��5���3�\��2gs*�i�6��R������v&��q�v2��TY![���bN��~W���V�L��L�3��*�$+5`w��X�+��Vj�~��g�]�)���E{��B���5�?�v4�%m�@7�'�����&��/��������ho=a�6XzI���o9�+Txc�zL��&��I���Jl9����A�i����9
��:������.xG��a�'X���EPX\����8�N4Xx����=�7�`�FtZ^�!L�W4�;��l��D�r�^���d��l����4��}����?0�1�,u���rqa0�!L{Xt�Q�`=2U U�*�y����W����-W����Y
(�-KZ�?����jU.��<�@�a�����+i.�<�@GH�0�I��������R�`G�Z���X�t�+���@���7+-�����InDaK@{ �V�\���V���{������1���m���S���(5�Z�	��$���2.��.�V�f������5��m��XO�'�%���=�BB���;�O���cZ������
�{�a~�aS��� ��@s��d�����$���}Z\��0]E4,<�9�]�8����
aC�V�^���-����pzL��iO��lNWy���%�\h���l�������f����a�,�uZ!��E�a��o�[9^��&�{��=-�-\(��M�H���9�5��x��6f��
7����y��j�F:}!b�u��`��hX�l�|��n�box�v�yok��l71]P��-t~���M7n�����?����b�����s.=-������8�Hl�F������PEC�Z�d��bW:�N�����Z4��
f����H:�Vb�B��m����	�����9rYN3��):	D�����@b������|��;-����%ZO��N�m���u�����Z�7�"��X��m�s�i�X����F����o�=�Klc/��%��]�m]��9YDO�������<�3X�VDoK����I��\vbS��i�6�X�BtA���8���D���bG��?M�V�*��p���ic����-��.���W��������b4�����
�`G!W�����<+�=V�o����nD1.K<;������&�����_�2�!���$x��jyX"k����,�-�G}��[��v[]�����7+�����e��
����7S���ql�|�BE��;�V|Q����H�����~��8M�f&+��/�c�bg�/�m��N5lT&c'6;������:���v5���j��*R�W*y<=��[��Y�Z��&B��)�'.�-�����4��������Xy�m+��n\%�^�>����������EWZ6���������w��fYv(�(���
�+�gC�b�7�����U��lM�[�����1������ `yp�W���&;u�XA���$w�f	��c�t�~����k�X�dc�P�~[G�fy��5��;��{��J����7�A"l����B{����7�����Xx���|���m!����r8u��,�$�7�������j�7�5��$J�:��:g��6��^R����k��)����vl+�������M/�������Fa-_���9-�
7��t>+����-�F���K/��/�~
�����qSC��C�~������#T�*W+��������S�S���
��Re���`;��J���P�-���V��Lq	�a���,�Q��g�j�� �m!�\��r�n%v��\��\������lc��a���V�/4Z�-`3ac��b�[��f�������Je�me��r:���[m��jSZA/������'��������%�!��LEw��	Z�8�|_6���'�r�mjd��<:�
��m?�Y�k��F��TX7�����
�����&;+�k���~pc��}t����������g_����i8[L�RtK�g��l�<��o�������G���o�T*��Oi��k�qS~��1m�0],��	:���$�5�T�wZ"#LT[t�����/�&��������&���2��.��Vf����CPJ,�>�"<��NuUf/���p�Y����hX�?��C��Q��-�N�P�r\
��e�o&�.�Y���',i�t!?=���96h����E��:�W�o���ps��y���m����AX�f�q��t�>=�� �8.�A[?��$sn+���v��	�����6�`��|��|�f������6[yym@����',=�=�,H�Z������%�����E�rT���`s����p��e�0ILR�0�|I.��t:���FLX�'���V8��S��l���,�39��1{�S
5.�gJ��b�YD���lAS��FN���TmlBW�RG��v,�'�V�j���lN?>-��k�F)�:����O3~8��������N�k�����C�b��e�o��
����{���������*,��kz��@.�����������X��Om
�����i	�:R������Nb`���`���Ao�=	�
�{AcS,�O���'���o(�#1|�`�>]�;L�D��)���D66�WT4}T��K�Ni3�w��[,+C�x�^5����%�o�^�D;&���i�>�aV���aA�Xx]
v���g�����w���<�-o|�7w�m�7�wa5K���s��p��CO'z�����{�5+)��=���+��;���]���f�����w���Yv<g]�N�h��[Q�m�oL:\tg��b7���������
/N*=py������s�1�'�
�Y�4�f�o�]�����%r��a�L��l!G�Yw�1qk��]
�N�k>6,�[1(�w��c����6���e�
I�����Y��1�@�P^lE[�Y:*��,i�,;������b+2�����E�E�BP�Y����X������]y�m�*n�����bJ�b���h:�N+d��+Eg��4�M&�-z����mo��R�f	�b���o%���R��m�����YhV���6�X����r���h���.�2������s�J����������Or���j�e����i�4+[�����}����W�\�J4l%:G�����e�N����i�l@�\��-�i8A,#Vtg�bKz;Y�O��
&�U�}L�#a����+>+K=7&�,zB��g>�{�fI��c��ar��WA��Y7��lV�����O�`w�}j�nrc����}8P<��)}zJ�p;��rz��p>�Y�C�n2������v��f��8q�`3l�.��S������,�lj�y�fyj�dJ�bykb�,�������6cX��h�wE^2t�k�B��fI�
��*�'�b7V�&�AC$��5�=K������ 7P�E���(���+��
 VmlFm�]����l�X���wu����*vAk�Y��1�%������L��l�]`u��.k/�S�+�;��*��R��v�kj���vZ^^0$�����bH�YX"#v3%��#�����b����.��h�������dq6�����<���}'����X� /&��){Z^�|�.t�~2y��E*�|�����n�1��pVa4�m0Q���QjE���E�r]�9K�=Ks5��'bIm��,z�M�,�i�-(�7K[7&m-z���p�c��4����lv�Kb�?$m��OKdc�IL���N��^
fY���/h���C(����={��F%�������
�F��t��
T��m�0�^���Op���.�B*m���J�+��M h�u�K���~8�% ������D���31h�%���F�D�+o�E��9u`�,��#�t��!�QI#��y�N��+y��o����7��$=��OS��	����?(XZ�,504.�^6�?-��T�
�t�B;*������6Sa2m��7�L;�����N�is�I]���H�B��4�l�<-�MM�������(��)�b���{0\�Y�C|�������dN��n�Ot�,�����4�4=0{w���1l���a�l��H?������-�L��l�(��yv��N�hl����[��,�N�e,y^Y�"0X�]��l����LD��%�a����X�J������&���a	�����1}�@q)SWN7KD7x���3L���������1V���dA�BK�f�e(�+:+�����
���a��/�����)�f�b(%z��F#��nL>Xt�wt�O��M=�\���m)����>\a����Me8�0�{=�]�g/�a��� ��������<\�M���T}2CX�����r�����\���&.
�I��'���������l8��%�,���/t�hd��0<�4.\^=oE��������E�4�-/�q$9]�X��q�a���*��6��6X/%^C�����j������
��um,�����N���/,�c�b�Mc�����6�`qC���n��S���9��/o<o�����������{��8�<��[�&����yZ^��t��r1\������h?������k=-�M\X��ek�-�EX�#���n�n����O�����^�`v�-wV�"z�7���a������2�M�d���U�������b�i&9 69�g����^P8�Vy�,�[t����M�3:=.�f�-,n��������QP������%����4��p�1M�U��CS��Y�v��k���W��sn��r����tI�����B�D�>tg~W�0���!�n�f��+z��`��(	v���l������E�f;�u�To��x���m�<t{9��������i�p��f	�baI��BD�[�3yh�,"k�r X�3uh���U���#PVv)�*4��V��c�a��X���
�?��+,�M6��

vIC��Eu��O��s}���
��q`��8��,�%�yM�������������ku��TsL����;tXe�p���rgYo�s��l=M��SY���V,�D����b'SF{��u+4w��,�CW��a]<���O\�'�V���g�Q���Ak�f��*����������),uZ"�"LZ4�4{�������N�ic���F�������E�Rb����=�a�H�3��[I��V���W��YKm=)a�W�R������Eo�s!�C�C�0@l���[��C�+h�&�,K|;U��*��'Aw�+v���W�
g=��j�MC��X;��`����8-�M/��'T0�-I��$�i�s�j�ol�\gBb�
���6�X��i���7^R$��������h��D�E�rM��%���t����LJ�N�D������������B��I|�a�^?���;���U��"�����5�D42�{C�M"����l;A&�
�m�.�$��<x��,�n5kzhM���BI ������;t%6��/��,��k����/�
�X�]�7�4�����,(�t+aw��-�:����4u+Rw��
z�;�i8#L�Q4��{U|{�����w�=�%,�JR�U�;K�}�A�4�9�	� �����Vd���;L���*������/��rn�n���KF����/V?�����(�}zJ�1t4uW�,l�-���l	a������,�
� ��*�bi2H�>�G?��5�;�-H^�%H
�&��-����
;���f�i8^�?"}f���)��0Uk;wd��3��	vC��E������_��[�9�a{9\X��rD�;w�g}�`O������������T��E�ia����I,l�,vB�A�����R��iymz��x��[(�ak�LKl+�a������6������&�������I*�dxXK&�8U����F�����;L�MO���U�v^0��
�4r�����������=2��S����6���J��������v�w����J�:��m�{��/`��
S+J�f��7�K}���B��,�
�.�nv+hw��-:�,�����oSW����a��X�m��~�[������i)m��a�{v�=P�w+g��6��?g�]}�bx����1&�os�n�ba\4�]I��Ly��A����pV�0�Mt��a��w�%?N����xgj���;��,��T}�C[4h�#^���D�RS?�������i��������J,���w"h�`e����-���X�����������O�YM��xn�r8u*�l�Z�g?t?�����<9���-s��U�R��D0,U��9tn����*�������������
v�<F�~W~�ow���/���"b�l����X�;����u]�0�-�n�J�W�����a�t�a�l���.�~w&�,z�{��\����uzL�O����6��MI���_=pi�����4fo���O���8���-\����g=X��kCDb�����6�`�L�4f'��������4�7�vL�
3��M���_�^�-�����a�n��B4L�����~X����f1Q����a���j�E/v=6���<kv(��]��I������4����Yv�0�r�N�^4���N�����N}�+�X(%vr����K�
ex���b/f����c�K?��*���U:��
��Hbtbsn�i��SE�����w��BprX�{0�n����XVm�bY�{0�o�����.I�[5�c^v�����
v����-|+���1G���@�`qR��e&z\�������\9l�"z��X���B%��������a���t�E/�.{��������FsE����b���w���/x�z���p6���=�����D�EO��8=7����Y��b�6�9��0��S��X�Y�
o��f5��d{NKdK�������H���
������(�t�r#�q?����7���W���a}�4��*���R<OV�i�lQ0�r��k�<^9��>X�G�L!��p>�Y*�i�[���,�I������<Z�����g�-k�V�&�bZ�b��i����6����_�=�Y�����e����~���}�B���:���g��@��r+�0��;��m��!E��8����
����t-:��M ��w�4O�����]���R�d��bi�O�
4���a��h(� z�4�t����������=��T)q�RA�9	�=�#�����$�E�,�F�/�b�IF���u���v����6��	�J���1m�A�w��UD�����Z?<75~7���Y>�X�s4g�#vWQ�xK4;�D�\k�y�>=����6��KW�f�:����c�A�a��T�E�r,�N�����zb,�����lJ==��'��� _���%ix��G1��@��O�Nx)�74�4n���7��}A��X��-��v�B!���a��+|9�R�9;��-�����%���`z��s��i8"�����{�={A{K����a�p(*��s,X�������,�=XQ�i�*����~`��Ac�����N/���`V0	(�J��������	������lN�9=�m ��-6�{��0�������`�%�
�KA/ ��v:NS�=�-%�M_�]��[N{@�w���%%�B��ae��A��+�������V���
��R��lZV�����6�Y������<�Ofl��44"�D1��x�����j��%V��,lE#�����D6c`~M��i4��)Y�4U�"0��t�=j���
�E_���
�OC&�3�++vU��,0M��$0
?�!�MS!��m`m���0W%��b���f���^w������h(����
(�8��;����*��������-�V��E�/���q+D�}��p�6*D���g�r��TX�������H�<x��R3�jd����`�L��1m�����s�v�@vB�DO\)��4�)�j��VX^0iI��X�:�]�����M��v�~20S�6���*A/X��o�f
c
�fU����[�R]<;�42�7�������F`}z�|��:�bWE���������[�Xx:�`��������,��A�?Xz�J�~g�]W0O,[>�gEl��J����G���l��,�>`��d�Sh�={����{=g���b�����Z
U%���'l�o`<qE��z�Zp����UM��`���2=��S�R��k*��b�n}Ag��{���`���B3�a���6���@k���
Sm���j[~�A_0~(�s�~�;���6�`��~]��|���c��cqA��i8�10�&���`���X�L���v3�k���aO�0�>P*C�I4������+�N����.:ibl�iM��4�M��v����f�@���{��7�
���$�LKqCI��P���_�*�N+bO��-����I��������.����c*:���E?���*���V���2T�*|��a�� %3�����/������V<.3��vv��������'�C�f�ob�^�{��n�����V:.N�iC/���%U{d��������w.d|7�%��i/e]�7!XX�9'��i�l|��r�py/�_K��N��S�nc�!�Y����$SO&#���R8������X�'[(
����L�Z�fY!����m��Z�]������,g]4Ts{��,Z.6G�OKd3��^��]��Vd��u�s���pa.�x�i8�|,�F�
�T�n�}E@��
�rT�5���r��F��8���z�z&?0}#v����d9�#�[n�������M���e�a����u����)O����J�����6����,�Zl/h�OKZO�{"�As-��)y���Q���A���Ew��/vC�y�wJ�>=��V�1-�
������fQ��c��`��7��0��/��<��,�O��oBd�TvbC����b���I�w6�\�b[K{B�Pti8���.u!�Z[z�1�N���n�5�R���I���L8-�� ��$���$j���.�6,�%�!����a���4-%L
}��n�4f����M�ZOxZJ���n���
�x8u
����i�b�tA9=�
VU/z�V����n�*��<~Z�97�~9\X� ������D��i�hX"z�C!XX��YW��Vj��jX�d�P��\����<������lL�Dln`���`H�;��f��.QX_�b$��-�8�d���7+�{�Z��TmAA��T�a�]{��NS�%c���>��<ueUm����7+�R�i��F`L���Q�$}�C&�]�����
K4������>��F��������.�a�#CS+Xx�����S O�k�&�u��T����B� X(@h6AN�k���M������!,]�pU���j�0�<hx2z����Lm������Q#�m>�\*W[�D�M�
}%
��Q��l��������a3O����4�m&�,zB?UT�y�6��-X�j����U�E��LWU���e��a�6Xh���IL��B6D�L� (HuO�-����;<\��C4��F�����
����Ar��v��0�MZ�����'t�f�b��[����R���r���-����[�x��+Nf��?��
�����~Z���S����{
VN�<l&�-Oh�JlV�Jm���~�j8<���ac^�
�"�V:qLKO����N#��F"������E4S.���c!�	7	�R���k��!b��	��Awh[i�6�]<ajm�9C�4��W�!,����5��rjYCx2
a�����0w��5�\1E�!\E���L��`�-A���r&�O�,:G�����P�=�`;�%�
z5gX�l��SY�Z����lA���te>�������x+\��NXa�
�h�BW�=�4���E�tqE�BG�i���DfEC�N��c��B��R��N4l����L�J,���k�Vj��	�SA���b4���
��+�	-4)��y�}�D�4b�0� �
-��4n�bcm�	k��/[�2�F,����!���1��VES%0�\)���������	��aL@�X�-�N�iCoM���m�Vl����X��7��x;���,�p[�����UI��H,l�(���od��F��q+U������U����T�u���'h�nU��v��N��*:�t{�v����q����������i'4���]����WbtXy����eE��*@E�>Y��\�q�����_Dtg>���tNS�x�������?�)�}z��	�44�SdY&v1M#���%6�P}��=�=�aG���&;-o����D�f��7���eY\��'�*��/��.�t��T�4��ppGV������l*�4&z�|J�Y*�=����ln���]�
X^K�.V(����u����lf���Y�El�$��7+�����`+e������Eo�� ���-��.��!�1��w��LmP@C�jO2H��,�z��gD�k�����~)�'�}Z��|�3Q���/�fi�=�����9����a�q��%!�����f��
[��,�
�����A�b�b�����l���W�Ot���|�e
��4HE��@����{e���x���=�W(Pxo�\O��������L.'V\]��
����4��	�@*����>
����=	L��6:��Q��=���[e�bs��iym1�L�������4S���5S{�IK�4�-V���]Z��|23�����{67;y�n���*4�X ]����/,���T@h��O+d#������',����,�Il�G�V���y�+h���
O4/������M�����b���+�������r��$?���ux���bu��<���
M�`}�;nQ��*t�]Vj]0�'�U�	���R�b�;4����'.�|j�{Z"�^���t%����P�]t�@y�����"jX����������*����'��4U�@�sJz��-EW��	�� \8���
+�M��Y�����-A�?LyW��F4���5ba���b�X�u1
8�0Y�5�h��7A���Vd���Y�f�bQ{\>g�jjP��l�A>��H�J�����.��'��{�������Pe���G��O�������H�jD��%%�B����/���a%X�K�UHo_^��(��/e%^jcJ�^������j���������p6F����������M��f��,�e�V+����)�uZ^�����Z�9��4U�0�YZ��k��I���J@bs��i�|�2�W�����T��b��c�`���z�#������<?qAcYw1�D����,N���*���P~�
�,��]���v�f�#�Qq,[�w1���G�X�o>��.o�K_�p��C�U��4M�*
c�X����6Y���B��e�\u�r���`���xY�Y����0g����U&5^&� J5����@/h�j���e���+A7���9*�W2&,z��oe(n��Js�e�a�Kt��N�0S,}�������&��}1���!�{v�;��!<;�UW����`��T�]a��q���.����5��*x.�\�._M��)�c�J�?X^��Pg��������}5���`ohG����j^�A������,���*h��-��8h,����(���d�e�(�b1/a���O�-/h
{�����_���+Djn����������=����`��X���t�r=,���L���2�*.��
3�
%��V�D����4U�@0�Cb���b��=��<Xh�Hk�Rd��3���7�D����n��Sk���^��p>�a����+�}�/x�H~���[�7�i/G[�J��.�O+:���Y�v7
� ���@7������%uT�W���,���m[WP�CY�"��
me���[R7�P/����i} �B�{�F����.K�.h;�G���p>���%��Y:
��
��=��Fl%��2�����z���"�=��O���:�$���������Z�b�x�iymO@�I�B%�`w!�`[&v�#H�fV�����fY���l�W��������2�s���p��Z��Ll������f"���f)����X��j��Obw�Eh^]dP|i�������mk��q�J�i���N�?u�:
7<�Dw�J����-���-%����e���]=23J�V\Z�R���EwfX�e��P�[,����J�iu�W>�~z��pV��L�M4���Y���-���V�U�/�S�)���m�:��p���6��%����D�q��j�=��/6a�%�����'4�>��������c��b������X�e���]����G���o�o�,6�{C�-Xj�JD8%������Z>����<k��;7wT�S�o��=���ji��B��%��n���m1_X�.�g�e�a���P�-"�E���Bl���9�j��]t��gsn�i��(X����r}��M+P�Si�����^�����J/�m-`��P4��[��g?�tzL#L�Gtn{�;�y}���wd��O���a��a��|��������%U�~�Zo�o����p!r����Y���fG���m����U��U:��|F��2�3%��g}������1}�2�W����{v�0.�}eb�6�iu}63�[�01Rl~�NS���nE7�S!vC���e�?����-�6S�Mg:�z��g�F4�j�Od+��%���0&
���
��)���,AS,�2Z(����0�.������Qt�8
g���m����^X����w�`]{�ub7��E���k~a�6B`Z4 ;��7���D���f5����Y&x!6�(�g?L�Rl���X+~�(�,fS�I���01N��&�T�����}<��8-�
	��Ln��H<nA�e[2u3��m���yf��
��A��u,l�%�[�L�oB���d�f���s��4��h1��kN������hV�!vV>+k�n��
M�`;�k\����4nA�t[#���j���2>ny�g��2��>��h����������y[!v����J��j���v���
�������a�;��\��� ���&`e��/
6�<��Z~t��|�q���`;4}��*����Z���E����5,�YyL���U4����e���J���87���C���J��Z�������������1�����$����������*i!V��I�c<����&AHT������,�m�y4���E4i>*��J�r0�x�7��s�i8@t;���X��a<����<����_[�in&�)�=�H�L�������]���Tpk�n�S	����ty�<��Xw4��.�a��i8�Q�Y��H���2
k�n�$o���o����LI����$i��>�����y�;
����k��C7H�
j�����������S������G��w���V���Ms��u�����z-��/���,Cw�5�'��.���(M"������)m�@�@:��-�2��Z��h��s���������Ix��N��U���0�T:��J+kin��)��M��.�{���-}">�a��C��<J-n�UG7S
M�@�����)��
��J5����p��3h\�D+\�-�J��%-q��XK�7}�7j�ZU$,e�.l����
�:��e�v��c����z��b���b��ep7��5
����B��m9�
U���
C-���U��Y���.,-���-��K����p����5k(M,�
vU\q���LWt�IC������5L���h���k[z���7YAw3]���J���{$�}��0��B�9���q���ba��X��z����'����3��Z�YVe�J��������'a,��|GN��i�O��v_���jE���
��{�?�����tC��_	��7k������8-Q��_$�I��������U���m��/����J�'�7
'����������OR�8�=����<U�z������=�X�$�|B>���������_<y����8�7L�3�R:�a�.�@H��t��u�W2�NS�1�n��Y��Ff;��{��r��b���U��
($�h�Bef;]�0�P���E+fs7�����B�m�E��Txm���O���f���v�p�Z�L�l��)�(�e�CsL����?��*J����yov�=�4U�t/�u��ll�`>����C�4U�(��t��`�����ej��W�`YA����.}X���/T�jz��C���v����w���>�3����,
�������^�C"�_���\pe��c�����u�������L_te��C�=�O���:s�^(�lG��/�6�s���XG���'*�1�T��vx���(�l����fJ�0�u���
�+�7k��F�Yi���D�w��7A������J�4�[j�gap�����<���m�	~���0����|��f�M�7J���0�p+��?o��`��A��QK�>��
D��m���Y�`�u;�����m�
�6�����^m��0b�9W��m>���>2&gr�&j�zho��ct�z�/[������?i�����mYf����_�mF�nY1?������.��<-�-/h
���`��S����*�3M#���-
�UB��f����_��0� X&]a��^���j�&	:��g/��i�����6����]�\��f[�#��NKd�
f�YB�7� H?^�[�I��^�t�f��b[��t�����?�6��6������f�n2�)���D6��#��^������M���p6d�%,h$�d��Q-M^��]��O�~���v�^�et��`��0;�uzL�^���t���X�|���~��������'�m�!�o�4�-�]y�mz!�&����i8�1�Gl�����IOb���D���l%k����q���n�wd�Ik\�!��w�<-��'�ck:��}�.ha��Q���vVb���8��.�m��Q���
�M�J���l����."��6d����;2��lP �>�0�>~�	�m�"uzJ���H"h�����{�����6��[9-��	��4�����4�E`�.�+,��H��;�������/�o��D�0t���TpzL�H����^��A�Q�;��d�+y��R�6�`�Pp��X��}��?�g34��^t_�s>e���k�"������
O	<CO��W����10����`�2�YZ��9W�!@�=PY��,+]����,4Y5{AQl%r6m��,M)C�����b�YX�;�C�������i�fC�=����y�&�����`�^����1:`z���a�d��;���wZ]���\4���dxE�b���!��G��1m��-Z9pU���`��%=<����t�M��U#W����|��	�K�s�����hx�[����������F���>g��}��?�fL�Y�	*�j�&�M#:baJ�������Yix�
���s�t0��OI��,0��pU"W�',�6�_��p�~���;=�v:�]��l�0�Mr�0�>�la�g���W�g�� :���|�B�]�����}H���V���,�}X!�a��}��?���o���T�������Q���,��+����
n��Q��=��%���b>l8�DHte'��m�������p�f���h�6���]�?��%�rU��]:6?�����������b���1��^ ��N���3��j?s���e?����67�e�W�c!lQ`�8�-l�]6�^��+z3��Xf��c�_��h~M�3�>��Z\������V`��[�J+�S�v�.���9(�1���������]LS#z��@�3��%�K���^�Ss�{��D"�����9���}Lp�����X�1�Gf>7[��_v�^��+Zb��3^b�R�;��/B�/|�]{|aQ�hx*�-�3b�<��v���C�a�t�(���2����!���	����i���9�����+S�u�����������`���S/k^��:�'`u\E,v2k������D�C�Y8��L�2���V[Xp!�5�"-uO�����]�]���K�M���������������S�.R)gw
���'����l
��N�Xx�Hl/��]V�^pb��������rzT0n�u��x����b�q��l����B��*^:�}��I�0������j�����e�^L8+�������k:~����[�^pY�{���,�����z�	b��V4��(��~;�?�q����s��S��ntx��H!���5������{������W�zT2���^0h	�m�
}`6$XV%4����M�S�z��K��';�$�N�j�~~1�$��=�+���� ��B��.���$A?pI,<���b�.��\��^�RL���b�
<���<���tVL)��F��<�h�p��_��s�I���~D�����tB"�^����;i�VLX�]�P�$:�4�TtzT�?�0A���������Ra:E��JLb���Er��%B������>���kw��<��99�>]�P$ v���`����s�1����-X`�)��2m[����|l.��`yU��Z�������Ir�"��L�*z1�����xe�����~�d����P*!�bs������4�t�h����B��{�\G�tn�d�QG�)IsxR�e/�
:g�N�9Xd�J��d����`g�(�e�j���cs���M����3���:�!�x��
W��^����n0;a�l�D3��^p}4���AN��������������u�P� ��%e5�#D)Z3�M���
�t�
�*�#IW8
z��J�TdY�l���z1u��Jm�-�\w}1e����<=��\T���bhv���`L#��tz�������Kt������9�L���bwZ���3$�dJe��������C
?�a���jk�]/&w=a�<��������-^6.6�p���0�[�',������q�`'LQ��[xz�J^�"\(5
���`�l�.��>�|������u����N������e AO��%�-�\�c+v�3����h���l����`���~���dW��JM�E���/:�$�����$��Yj{U*�,��`s�������x�2\��w^*�t���g���V��^���t7#g�U�����_�����0��a�P&]x�Yla�l�.T������%�|�Ra�X��Ru`����A�K��f��w��������������X����`�G�va��_o���&���X�[f�W�
�O���"+��8of|l����`�*]l����zu����1Q���q�*��e�\}=`����~	�����5���O�&�R��S���X�`�\����`O2#
/���������3��'�b�d���S�i�pzT_���d�ps�y�<�;�+��v,SA�<�p�'n�n�x��`���g�7�|l.�	�"�OH���O�^�F�[���/,1��W��^���.�I�Ss�'��M�f�_$���&��-��Y�M������/7x�MB��[:�U�A�T.zj����Mwd��xl��)���������u�q�)|��&�:v?���Ux�9U�������f�5��������b���;��v��d�mu��D ��z���*���f����tab����Gm~T�f{5bg��y�}��<�w����m��-T�6R�li!z����B�����frg�����ra���n��loZ��Pn�2�<~K8�<���l���m���r��{�%}�v|3��������������h:[�],���f�fb[�[����#r���}�v8�K;\(����Y�N�b)c��-��r�r�mS2�"D3}����X,��Fl��:u�Cv�_4��������l�%�����N����%�EO��3�N�]�{�R��oa��e�f�z���S�N���Gu,�\Ag3�w����w}^��u��R�����f��l�?p�o%?a���l����;�\����^�q+�]��������t���
��$w�}����A���P4��I��61�n���d� ;�-;�����*6����7;X&���������l3+�B�|�v;����h��G��C
�_f���r��|q�[�n��J��U���pq�����O,Th�}Ru�^{�� tK�Q��������>�`�b���b`Hj���e�N����:b���\�I+
����)?wzM�1�P4���a�,�u��8��cV�"��b�L���_Qd���f?se�k�����Dv������;���v����~	���zc���g��va����W;�����Dd��K���������Q'�L���
�j��.+�4[8�~��}�$B��f��m���(A���Y���}`���z�J��
���f���vX�c�����2��]I
�K}3/�hxg�XvH(��$�.�Z�Lh-z�s������2��Jhi��>kx�]��=����;�.{��.v`��U�����fb�W%n������\����|�05��Q�������u�����~
���V��Y�D��f�� C&$����m���I[4�Glc�X��g6~�"Wq��Bkx\Wt��l�L��-��nk�o8xM�����d����lA�{[�}�l���w���e���7S�.�h�-��7�}lnb�����v:��LG������M���w�pW6�|w��Q{������}`�)�w�a�^�A��=7���xg�����oy�Ss(`F�&n6�Ik
�#��J����7Sb�~*u�Vb�p�)�Q����
~�;�*xn����
^�VJ�m���l.�}0���+���Z��j-��?��=J	�+����Y����8��~�]��K�o���
��a�@r����f���t`���J����0��}3��J���dz�+h�M��<����2�����b+��%��2�V��`J,X�����w�;|��N4sT���ub�/�,��v�
�� �?��pk0��t�Fs�����m�0��M4T����,��&��4a��s������`W��s[|��B�WE�a�,�~�4\tK��~K��>���V���nGR[�Y,���C�%����������y��O�^��yiEg��w�
��l��v$u��s1���WA��d�M���k:���Awx�S��-��u�7���^U>��&_�[�[�Y�{�@+�A����;K#o�[��X�KwU���6+���tsxA����V���vL�������h��k���p����|V���@e�.5��M���:�Z�pa�����*��[����&�95��F�[6����=u�N�����$u�QaQb1m^lN�w�6�Q�-������>,��A��d��<D��5�xf��"��|�aQ�[���N9
����TG�����o6��l�+������m��[tg����1�B��Y��;���������D�_X���k��lUN=t�������P��l��7�����Ss����Dt.�=57�"EO��2�j/��3���~M���~�0/�vY�[,s���
�A�9���X��,�!�e���������T����fsp.����h����w6���Y���63�kQrc�d��e��nmv,783_r�}_�6����|����k�7�
�e���	��`�o���5q�8��-���q���]le����_��'��6v�O����NV�"�*
#��`8tg[b7+��)����S9b;��g6��b7����?<u�c :���+D[)j�7��~;����i����67f,���sD���K��t�8�+�u��l�,�C���a
�CQ�9��X?h�Wk�~D@�_��Pr��n�CP ��p��hK
�p

��\�=����t@�d����f�mc2�
�/�f#��Q=I��1�������*���,����������27�Y��S������yiE�J#�p���{�����'��F8��l�6Vm�vK��0��&�.��7�p��ck15��Q�P�/v���Y�y�"O�0�4<d$6���]�K5Ki�o?�t���up�Z��u�e����9���Gt��`�e-b�������v����D�"k�tGR�W�bvn�h6��[?6���Z��x����_+*O�ynf������~]1A�-=5��������<7��P�p�
�/e����w������~:��^�m�I����NU�~*Q�]�
.����h/ek�Z6���(�����lpB�^�~2�������/rzMO7�/)�aG���B�z�����Aw���[rb��CnJ�a�� �k�ZB������N�y�d�G�4��FL������Y	
��7��]��	��U��o�s�e��%��K}uVA���l�/�G�A7��vS��kpOv���V��_���0G��U8���ylt
z~��"����`s��5��#�:}��Kv��l���i�d.���i�%���_N���^�Z6��4����v����G.\E�l�l0~��0baZ|��fa�ng��d�~`,�d��
8�+q����5u�/��F����2���,;u��'�1tv�|g,���Z�y��}��;<�0u���(�BV�6��z��Z������:j�sA��B��Jl�������=v�������I���O��
G�`7\g{�Zo\�/5KO�������v`�N�����G����mUt��~g7���H��M�
N����%�,�0�d�*��������L�R�UXX�]
�n���SQX>*�r���|��cs�(A�K��^pL�o��S9|��e�Ot�^o�^���f���h�V�]�[��gi��<��0��9��.r�F��������Dm�]X��tsra�����$h��"�������/��_V�d�C��k��+����68H?�4��z�s����Z�M���AIb��wj�1L:<���~goX�v+�O�Z������@�������j�����S�:�c�2���#�D�R�A�rr��q��"��%���m��������B�Y*%����`���z1��s��u$��{JF\���(A�������%�������c��a+����V�\���9�\X��L���g�F����==��'f���oD-���X8{;a���-u��E8������bj7���t��}���|��.���:���A/���o�,O��0&we��Q�m������Q���w��	fe����p�������z�.U��SF������v����.���u��:�N�y�5�$"����.��Ltz���	��n��T����D������Rb{��9�f�k�G����J�9��V���&��jE��[)����vf�=X����Pn��/����,�`��G�v�vV"z��T��I{�
/?s:�}���.�?��U�b;��}��f�D����b�n�mgb[����f�w�-����-�����B��hx�E,��I,���lZQ����i�^��P�7������|����Z�B�_������F#�T(����E����f��T�j�+r�����s�����>:ZN,������x;+e�0��Xh��� ��t��l7�;�%�e�wn����h�J����\;~�Jl`�o�_����a�?��k:b��������
}�0� �p�����Y�^4,}�cO��UK���l����	��������6�V�R����\����zS��{ne�����*��V�#�aG������Rd`�qg:�y���V�!z�G
�������[P!Wogq�3Ad�XE�[���~�����wV�+�!���c�p�#^��zF�a�c�����')��+�>u�cf��1A-�Z���:��h���c��x��|y���@����Geooqg'�D_0�*�qA���-���EgK��9��L�&��VFwvQ���R������zvf�X�i�����V��9
�`��������;��\<{�`�����p��u�u���0[��
�q]�E��T�f���N���N�P?���*�0���3�F��O���"��1+��J������w�a�+���sbs�vzMG10F:�����u��n�������4�KG��7���\�-��L�-z0��Xx�V��`in7�R���ox��Sz���[
Q�����S9���{h������)$��������
,;�"v�e�xw8��������z��l��=u�#>����
(�p�,�)�������������nj{��t��;;�%zTR6pw8�=`a�PEN�������@S���!�!:��}gW��O��p�i�L��ihO	�f�p=���K�������9�LWv&-��L�%����]�0��^�+��	$���Cn����>%�N���{N0��h�����m��	���R_�ne���7%�V�����:���a�yy����B�c6��O=��)HE�{��X67��
w���m������]Gm�,��08Q����6x�k*�Th����Hg
��t���78���Bb���$��{���E���'zV>K�;�	�`y�Z�K�1�\�~�"1�}���5�E,<����t���fx���_���wzT����,��j�Ss�n�J?�	70�M#��I=���x�~���fw0U,���;4*�s����U���98OP�:-����K3����8�
i����@Kx;Sq���0�p�vW��������i�Ss�m�)�G)i���a6X��g�Sy��Y��q�	�,2�����kzv������$n���L��6��;�K;|;����nW��[�b��Kx=���-�CX��V��������\�0`�l�3���j�r��B\h����r�~~����^Zz"%h���:O,<����4����;u��6�Y�uX�
&�N���p[����k�/~�r[�	6�nm��.������w��l�no�������O��p�C���Z��>w�=��o$�.�l�������Q�Vn~���v��MO`;��`i��������C�Vw� =������:�����7}K��?�l3j�!���J5��;��^p�5X�+�'�,��U����E/�����L�f;�����5������i��d����eX�,z��OlVt���Q�oD4���e��Zy���DC�i�����u�Q��_��b��bw��yX�<��L�O��=,;����S�-�����b7����������M��U��%|T����l�=<�vl�Y4���l�+�a�&��s�.��y�)Z�c��$v�a�]�����^ls�-�^l���^�QK��.T�{������ao0o����/�=���VK,�����Z�� �V�B+�����.��|��������-����S��_�Z�|	�XRtcE�b��Ql)�^��s��0�
6g��
��$����d(�}�SYbWa�r�W<����������	�e�fc����$������������U�c6�G����]��H,+|1�N��wZ����y�i@�dbJ���`'+�p��i�����A�J.����#�����a���XU���3��N���u��.r����/��-�a���6��K������{��4������v����}#bK�"��;�9,wfBS��EM�T�����kX*M��va����b��/�t%���5��/�Ek����n�m�Tl�O;u��cVQ2,��_B�2Z�vaE�\S����(�S8~j�1\�5]�U%flrh��7�(�z������4��������{�P3�����.���v}��[HY�k?6�X���M��8������t=u�C\��t�a�����&���E����p�g��=�I4D�'u���t����sH7T�����<��IKvg�'�R%�eA�`�f��J4��T��LzMO��LA4���W���s$�E�-)y���I�d& 6��������^��jz��;��`r5�����vx�J��ss�������Y����8u��H�Ms\j�RAd	��O�����"����z�������+�����a��v��b��t�cX844���7;}g���}XZ�	���MlJ�����,u
~wq
����#jn��Y<�`�r>������>�B��Xx���Y����w�{��T,��h�~�OI�6�h�h���-7��]j��T�r�"k������d����E S�tU����Z�^)vj�a����cG��^��,-%�3�}|�V!�����)��`�x�� �������^i����#}������x��nr�?��]��a�/]z��wY���dq�������#��
�a,����V~�6C/��V��m�k���E�+�Z�-�`8,�L�+��B��4�,�;��gf���oN�y��5�A7x��,�t��L<x|=�G�`'\�{����kz~����a)^��i��#d���cZq��h�,-��oR������4�n��%���K4rV-���D�|u��p����y0K����vX��3�������������5$z������k�W�-V-fM���r�4����*��5c�.d�V~"'���h����&���j�Z<l-�Z,�f%d<N����:&���A����B=4�����%�}����cs���o�+�����!���_�.6��:<���f	��{f���0Z���6��
Eox�J-����M��#���RNg0���^0�����x�K�����`{0M��� N�9z���c�l�T�pU�v������w*�<���6�	$��R�wzTGOp-tI�a������#pR?��o�4ER:��<'/L;��.%���z�tN�������H_8��7�w�����~�i��d{m�Q%����v�NV�%^0!v�~�>��F.�������6�Nw��L�$�"��v���0D�ZN�W��?=j����@tcu�fk�i�dU��W��>57���u�1���Rb;�b�'���+��.��I���
�*���,$
3b��U�G�~T4������Xy�v����k�/S\��2��e�����g�����d��;�Et^G}g�~����baM���(:u�#(�&
3Hb;�I�}����5��#����l��;�V1�-���-����@Ft^���s���D�;����p�|ZK;���S�N�i��d��������o�Gu�1A_���,&{���i��d)*��
)��)��-����W�.g�����9���G�>6w��������aD������rf���bgf�&��w=+�����j��B�����z��b�,�P�.X��M���VE?pe��x��L%��������L��bi$���v�Nf���<5�I����^)[xj��+�G}��y�p�B�d�ebs���EV�Nf�
���L����6��������D�]S�������D�~��
���x��H��j��j��%�F�b���$���@�4�.���T7�"Zps���a�����.d�t�L��-�M�i�f��I�i'��`�ll�����s2��h��j~��M���B��I���-9���p1l��O����>j�����n9��Ox���
#�`/v�^���CWYqas���	G���� �
�a� m)3c�]��������a���D����������f���z�1�����m��Nfi}���l����b��
�aa�hx�l!&��u���G"��aU�bs�w�N'�N]����
��n�����|��;��
+���Z����Q�S,<����%z�?�~�N�;��L�*�	K���D���N��5
�C�-�/l%��v�|��E0l����I|��im}zM�1pk �����m��Guc��;�����A��R���r�	s+���G�e`���=��c f��a��*�w�E`�V��_�B(bY�d�T��8��`�=~H!��KdN]�p���D�i�Y=
�)�n0�6��N��i.�'��,	�����i��n�iu��Ao�8���fM��50k��])����+^�.6�+��s3LL�	��5�+��/����.,@l<��x*���"b���?X�b�p�{��:��U4�-�-sV7L.��gt�L%���~�XZ��v#����F��>�?�`+��6���&L��������g���/��t�2�fxyp+�����[�?6�x�<���YN���������s����7��Z\�"6�$N����nE�?Xxw�X��
��k=s���i��I��7��Q�0�,�CH�
��K��x�*���F������"�U������t��?��,��j���n�R�jg0����v��p�%���v�
_�=��P���;�SNl����f�T���<aF0�	7��ea7!���A*�����A[��,-���|T�Yur�^��;�oE
���Q;�{���O�|�M��"��/`�������k:���C���%��8�A�K[���2���������a���x�"��m:�����y2����sb�� �s�88��/�'���,,��d����`�������Z4�*X���[Q[a������A�/��I����pM��z�B��aMjfXQ��{����C�`��jf�EaSLK���:����A���:5�8�i�E/�v��}
w�L��!��o���,C�������|���� �\����h�����T���h����Q���?�e��b�GDw�:�G����~T��^����\����y��k6�&	DWny\�/VR(��J�
��.������XO�M7?����bY�,4��Oo���h�]�vy��k�?6K���85����jo~�QUCG��3RqxM�w;� �Is�w��CU��^���b�ew�b�0��>����������t��B	���7��S)3�������Q=���6�W������������(����,�pa��4�;
*�e.�U��5�xd�����/f�H�+�����Dw����il�����`X$�����a�C��ow��L��s^�%���XO,���,���9��]�Px/:_���m�8����d�;�$6/qO��p��
��2So]���z�W�-��vY/�������1��������}��P&�lh^��,:�CN�9�c�c���Eb��������t��RA���=���,L"e�n�P8�l�^l{G4��R,�u��0i�S��,���StgUobf��'�����S9�����G�j����	{�^����l�0��b�S9�b�Y��hIl��I��~�������{1�����b/VA"v��n+Xl���"!�P�-v������Yx(DlO��S�:��]$�#�T
����4b����E���_$��C�Fzh�4-dm+���Awf���xB/�ES��q��1LKV�YM�Li��p�����_Y?���b[�xO��0�>���������Y�D�2�`Y��VNt����w=r���qh
������l��{h���R���7e���M���.���'���T~zTO0^�)��J�`w*>�� o
_2���u B���a�?�^��/{��6^��p����
�EX��_�@�����e��bNi�4�O�N�
��u)rh���}��R�o�
m��G:P��f]�v:�lN�z��:�o�����enY�P�h�2hZ�
�Y������^p�O�=��s4CB��a��U�}zRp����
�`��{7����>u����	:��,����.���l��_-d)������Z,��}�j������4;�'�_
�����P�P�b���[�~�v�L�����P���y��C��s�`t��D��Q�+w�����������}�fa����Bm�� ���lZ����Q���3S�����%�b+2�e)��[T���?M�nK?5�?�mp�����:������b�mp���h�����C^L�����J�����W��\���6:�o4X�l>tr�]��t�������f%��F�!<�4W�T�����>����w^�.6O��t\��L�q���IX�c�h������v�����t^a}g8�-�V����-)��z�r��l�/���[D7��v�:>=ue����#GA��sqY���D_4<�h�+l5K{��VF{��=u��.ve�hZu,�r;�b)�[��*��X�����8��/�TPe��r�������#'X7t�s�Z�_��`�W��O���e���3��]��l��������iO,�\1��;=�������i%�D���P,L�Jd_YKYF���4��
��bKg����	���I�`���Gu�F��Q�NR��_����s�������J�%��z���E��bj�av�
�����v�X����g���������>"mP4��q����s�����PV+z��yS"~g[%�f�b:z�pE,,�6������
�B?��~kn�ZV�/&�a�C-�����npJ�P��=���:��+�������9����-�����Rh��,��|���:.���Ss�h�F�!���C�L�08���wv�!�^pdz�����zC��(4��������U���k�����V~d����q�^�l���^�q��m���%�o�la?�����D��y�qz�����.���D�vv���]4"��
������U�������]8����������f�x�la�}������P��X��0���^�/~,�X��t������E����x�#b/�d[�3����a��7�Q��n�e��f������~���17��5�����n!)��������v�Tlg�
�l�O,���uw�<��a%��;��ny|��b�������x��l��e
��S��GuD��t��cH�,����v���c+��?��W4�S�2�B������z�!\	������a��bw����f_��L�XE��9[��>�!n?�����-��_Q���]����`�.�>K��0��S����������E�hV�#��|���`����.r�2��;�N�mlw�����%8�b^
���R?���Kl��mq���������<���._Se�p<�/n�S9jc��g��OL��0�!����}�.���������z�����iE���v���P%V�e�����(� ���A��R��6 �[8��X�/3}��SS��M�����:���������;5�`�,���.���S
�u�y|��\�����b�[�������5I��<�����q���k��������f�P�cq7��������p������{�+L������A����n�������}���D,��L�fR#�����+�}�H[,�1	v4?�v?�hZt�+ZI���)�9\&�e����`�{,*�8D��n�P+vW�0�# �:�J�`t�����:�azt��y��V+�v��������$�;�[b��t����k/�#������5�l��4��v��dCS+��DRt�)Ni�+&k�X]4;-4_�uxR�i��t�pt
v�s�b,Y��E��.r�4�4�^]	��`/v�_,�:X�.�;�i�)�	���@����w�7����eM��`$����I���f��&�1M�"�#�����O��<��.r����;�
�������g�q�����a5�J;azFO�����t�H���f����t`�����`:hx���|)�w��	-ut,��]!��K�an`��zo�y��.�Y��xT����{�����kN4<�$<La���L��WR&v��;�>6�;�8
7����!U�n����@o��3&2�W��mVh�
ke8��l��p����`GlG`�O�r8�;���vaA��o��S9N�e���y���Bl28�^��&��e�kW9�a���L��s�b���^�.���0:	w�*���0��hX�+-{eme=��;��q����L6�?�8$�	�e*O��O���n#/���S9o����A���`�
I�����C3�.r����/����Y3�	����L���M�;�Gzuxl4X����r��z������Y��R���������S�:\��y����W%~�#�a�t��%���G-��U��m��?L�n�	��^���L��.�fE���������Gh)�aF�������X�����E����+�ck���}Ao�\�pa�va:����0�����3,A�St��
��y�J"����c����R��xR��
=5��3W*��f�z���������~������x��z���H|��Px���Cs6��N=�0��{Ew�Cl�������5+�:��x�BFxx�MOM��z�2X;F��Z���kj3��d��?�h���}l���&|knK���W-�f���b/�/T��S.��Ky?64�"�K^xR����l���
����I������p�5��x	�9��r�
�*AS�X��
v���`7���e[��u|K5r���w(�U�������AQa�V
�J��5����nP��L5��Gu�3�2��_��W�j����W������4�f��m���X:������|�D����h������]�o:�t����zS������E��(}�st�Yj��_]���XxrZl�����~�:1��pp�B�qEO6��i�vz��G��a�+�����=��`�������,��Gf��n�p�c[�Y�����yf��R������)}y���.B���j������F���o�K)��Vn����o��
���t��jr�$o��7[��^L<#v��XNV�����o��=��m��f�1�P�.:��.���3����1��u��
�E�}�Ss����������],�.��[I�nk�7��D�/�8,�+v�i���S9�b6y��U��]���N~��O9��u��T-:��w�m�?<s����N�.n�k��z�\�;�� ������u�0Q.^-*6K���� *���o������vz��o��`�I,;5#6kO��`���D�js����m��f���3D���E�
���
c^��O���k��m����p�~����a�����cEd��~�
�������nv|�le
d?��Qs�&E�V��z�}��1�^����������gW��~;Q�Q���}�l�h�Q����3$s����������x;�yzMO�L1,z�2,�{72��'f�
/'�������
�Syrec���KnQ������Y�ne�g��f&y��5��J���V�o�Y���\H��I(*3[Y�Z��llN�'���M���Q�t�37>T,v������_~ vn���qL��`x,�� ��b���W>]G��d����a�'u�����;���R���o&���_�'��d���������m���c�?�?�������`��H4<(���.fJ�Y~��~�^��7,5������V��J.[�7s���7����4�p��f�LF�U�3���0t��&��p�(}}e��������jr�������bhs�m�<5�P.������N��w@�U/\��F���.���n��,4��������4�V~+���:���6:�D�	���o�;=�C/f7=��n�<)��3��!&�������|3Y�i��
��bL<���l)�i1:M�L�A��:X�'&�9,�����Pm�9�N���Q��7���I�U��������3+��E��/������~zT�mp���F������kJBTX�X�Mk
D���XX�:u�!��[�N���G�?6���a�.,=;��t[����
���*�n3WNY����h���$vT��������t�0/�T��`[�����7~l.��	^(/����j����
�#o���*�cs��'��S���m(��0=�|6������0����_]<3<��'.������+����Z�ox�B�o�����0O]��n�/)n�k��,���n7���������-�_W�"b`�5h��6]#~j�y�63���r����M�h������W$������c�"����Eg��w�����p%���#��nXV���?u�C/��:�V��,����A���B��J�O/��
��<�+$�.��_o&�
��+	D{�7gmf���~��U���S��.r�K�np�.��Ks^2Q�GQo&���h�bj��� =*)�����[s�+Wv5m��V<�|x�;[:,k�0�����Qc�����7��oX�+1���p=4G��9��7�_����?vn(�hwU�H+�7,�z@e�����n
{���`K�G��p�F4�
v���V$���Tw[���q�����,�V��d�2������x�����2���;;hD�
4���������h�t����L	n��Q����[�q�tCgO�����@�����y��{��?�v���4�S0����6l���	�k������\f�a��������]'���^2���h����^��~T����\�rz��������A$ZF�f�4������W��=u�r��_����-�������Dm�"��vs���~	�>2�PI��r�o��������FOA3O�YV������s��^h���@���>h#�l>R���(�a��C�{!���J��T"����������6��1}�.j�<*���:��L��Q-���R;f�w��?���Q�~�o��@��W�t��oI���:A5�4�]p�w��;�����l�U��q�	4=a�,���l�^�v,�jMwT�g�9�����~;�v�!�1���iv��YVo6��N��pm����N��\PzTO�0��J���9O�0��;5@��g�N��9�L�^�7���#�������`8�{�|��5=��C	����Y_�������Jlv{nF�L_h��,�+�����k:&����[������.,����C5��
m���1��Q]������.r@���Md�2���*iz�(����6��>p_)����p0�Q�0!,*
4������3��O�Z������:"���o��8�BgML�=��l����vt���]��%�?��&��oG�}�fsvzK�0Fh��?�29e*�?�{��?��&:�l���.�����'v�4�|����L]*V���>�Y����'��e<=�/�14����e8�`.�k�E`��[rO������"h��|�t�����eG6���e����L�
�����t������/8zK��`�<���r��.r������'fL���V8W`S%������K���Wq[e��;nC�'�x��1~8�F��4�;����.�$�}[xP�O0?,�7|N��8�T�}�#/�j�I_��9GO0����v��U�0�.��������OYRi8�Z�]����:�	���p�	����,���3�o�<��p�!����2��1L��������F�o�0/����p������2�VH�����`���;u�c'������Z���z��N���	H�MG�'?�/szK^p�t�got�l�l�����v����
&L��)�95��
��&�����������
l:���$A��p�p����u�EO���u���E�X1�	��`V��c6d�6�`�|��N������������8U��H���#d�1��"U-���2Y�X���������p�%�	C`�[���Cx�#��s��e���v���+��r8����-y�`�w��?�a�m=`�Qlx,�I�4�[��������/���_��pDw����L���������
���4�����~���������<�� ��M{W��B
{9��e�9�,��(�R	�^me����f}�^n�Hm�����-���:��Ao�^�K�����,P��K�`���O
�b�_���{>����<�(��zT5��4�6�E��Wr�����y��A�`i�����B<�8�����/8}�/V��>i]vzM�m��mz�
�`d5��&�^�!L������F��h����	��1Rp��;lJ����!2p��p��E��*�1Z�o=����Fm�6�7pzT�m0it�����W����@O\�kG|0]�������=����g%��M ��������m60�hw��������R�������9�	K��0��SW��np+��"f��\��_���q��!���t������X�t>���������
<�%:���<x������=-����`v����>o�l��O��T��5�e�����a�O,�5w�,��vS���nw��DO�l�f7�B7[8qY<<�0'��5����)�i_��E�]��(ye����P�tY|1y��|m�w��l���':���9_�t������*m1��#b�?��IV�b�PtYx|�-,��R���X�����3`d	�I���eP�\;ow���������$7�Y9��� 2�,i��6����0bwAAsY�|������q������M�O��d�
����
/�[�v��L�hh�u���������L�iWH\���,�� ���LNl^��^�!�3�
�4����b������pY����#�E��,g1+�Nw
��^���e��������x>��dVg)6��z�����A/8@K���c����`'�^�VaO����bvg��G,�����I�[{J�/��;*������vb88�a�����b��/v$^t+H
.��/v�O4+,:�����E����S�����t�Y1�XhM[�q����b�\�G��e�6���%rb'��t�+g/���g.ER����!��SI�[�}�=��'L[H�����-%_vh_��-�����0��SjU.{��a���E���w
��I�	���R��Q��
��>�+o.����E4�������������t�t;L-�� �|�����E�����0l��������q����h��4��V��0��h��j\�#v����&��o�fZ�-E��,_p�4M�����4���?��
�P ����0��v�~����w�e�)���J_��N�K������:���������p�����.�7.�4_�1��wec
s�U��q����e��������+\�uY�{��=�<j��������py �/�����#=3;�&�.!���2C���A��V����<�b�`��Q��uA	�|1�hv6\(�����tY<|��b�a~j\��7�|���5=9�_���i�(o5O^����
w���e���R�b�����+W�\��^��+�n!�-��p�j{������v���z�f��#l�-���y�D�<�Z���W���5=������th��U�����D}g��Q��-[^/fM�a�l���;[*B���b�W�V"��
�cK�z�Tj}�"O���!�]�}y����&I6��++<KS��Ht�����T����zk��	��������� ������"�4�b�����D V�^pc��V�����@��]��"����S;��t���>�+���!z��2����Y�b���tT�0�X�z�����M�b��H�
���.�v�f�S�:x���Ag#�wvVv����`�V�p����-�[���-;�|F�
n�����N���	��_:}��j9^�~�z�r�;�+�����2$�
��i��:"D>�^��a�������a����C�(�'����]5
�e�E��+%��fw����OHj�.���� ~���sj����r���
��`y�t�~d��u�
6DC�J�����M�0�'or��:�*������O)x������U���9���\JyY�{�U��0�S�pw*���`g��<u�Cr���G"�Ba�����=u����b����6&��c��n�����rX���Ss����1}�Q�h�x)���T��|���A?i�:5��f��t>�o+�G��� /���a���v�:�V�]��u�H�z;:}j�\�al���v�Q�p�*�q������~l����B�����i�E������G����g�y�`g�����>j��t2�V1�Y�L�WAx�M-��Ai��`�@���E:�������:�`fh�4�����4��3}��t ��������k���%�5��8�M��x��H��E�f~��m�}X�����H�w{���.w�k�,i&�������m��D��SD��/yc����<�Os��w��Y6��]���Q�oK�G�?H���;{'���5�_�� ��G&��x���������&1�P�%v����&�YV=j�2�-�.�KtY��D�m/�����YO�p
{���>���[�?��V�t��5��l�^l/��o[�o�#f��%�V�u�-���g��r2f��B�N�Y���'1���~zMG1���hx(Ul>'���V��l�A�;����u�W5����_�+���:S�fY��F��[:bBi��"��lc�Kb�����D����.>��6�E��Y�m������E$�v2�Bs��e[f�}�7��6]�H�v��~�K�e��b7��[����|3��h8�
��bS�^�\*�76p�m,�m�������<�""�����90������}`(��fen7%:N]���p��W��������i��
WmR�a�;����9O���)�E�:�t	&M2t������S�:��ct�9
�l3[	f:17�����-�no�s��[sA�S[b���O�~dB�T��-%�:�L�'xv�p�l�R��g�]��]�7�L������T�U����is-��l��O:�EN��x�U���9ay�a�,���`�����M�73Q��;6-oN��p�U���qP��9��.L"�0�{����;_�����f�>5��V����
���`[��t[c
/�
��nnK�.�0����ha@�<�f����$uvA�p[C}�|`��p���J�N�����f��b�<El�Tfu�0�c?j�?lXV��p��	��`���S�:��A��������<5?��
����}�{kEWn��-����6hxU���h�����E�7��%���9v��fl3n��-���������.���+��������v����#�]�7�|�t��4�2�s���[���(Ay���m��
a����,� ������kNn��o�'
���0�����F��+���C���^0F����n���j���[v^%:�[�����93�
8���<8=��'���v����3����)i���`wes�.w�`}���`�O
�������-���E�����eX����a�l�������������v��o�8�������o�I�gI�f������mEC��X����v�n��hJ�����",�
���62��(u��;�=��(I�[0%�������hX�,��@,��4_[w�!�pc+���^<d��	�c�4��]0]"�v���S�xK����5����!'����A*����
~�r��u��
�+3�c'����/��aqxT��ox0^�}���v�
�SWN�[��Z����H���`�����c�N���0$�o�zjX���f�V�(
[F��������rJ����]��E���ae_0p�/0�*7��$��E��+�/���B'�V�����fz�n��^���n%ej|N{l�����5�F+�
�QB~�J���|5�^�&��5?�D�Ab�J�d�:�v�����59=��x6Yt�����n��z���Ss�4`z*�����d,�<	��$������s���9�sp�>�s=jn/�o����<y��m{6���4��e�����:������W��e�
v$��������C,��
vU�6o�p- 5���pl�v������7"h��9`�(�����K:"`�m���������@A��H�4��v�S(�n�W�U���7Bd��C��!v�������Uu���u�"����n��s����"���)��-u$�0e��M��A��y�m�}g[�����V�J�
K��4B�����n%Ieaw^^~l.�p��r����l�n�f_t6c������E���f����ftc�W�l��
����pEa���1���^��j�27Vv*/U�bWanm�27vv�4[���w�}g�������	�����c�l�l?H����������f+s>%��9���.������f�scFg��P�,K���ZN��������
L�t�����#7��#���e�(�17���v<O]�P�U����B[l!�n�2CM���j��U�wvJ<����%5D��.vf`����D��#7&G2��5��lA�`'��BV�Y��hsqX��lVn��l�U*��g�N����m�nl_W��S���?rePw���E����������%����N!��w�^(h�������o�=��P�N��O�����D����<�3��hx�\l/,���
FA7��-�0��������������*|��p}�0�/�V>Z��p�z��9����S�vO���&RniP`��2�B��{�[~�;��(}�^�1�*E4��l��N����J���d��������4��*k��6V)z�D�ZNz���zv�������lcl�^�[�����o�+�%N�yfg'}E��.�����?�������P�V�R�-�
�A�1<�������������U�SYi�u
�*�����a�j\��7.,��gmL�*���Jb�O,;�+���+��4�zRg2G��N]�&��{r��9eY���'�>��f�,���������X�-��!&���l�����4�toO>[�8nwy2
q�5�
�z=��p��J�W�t�u�{��P4���p�v��6�y=u�#MV!+�� �����h����e��t�o�S9\d��D?0s�b��b{����g�X���Pxi���pX�YH�����]:%�������	�D_������I�DX��+u0v��K2D/��lKG"O��y��cD��#��a�������*ki���Rxo�h�:������1l�����J����D���
�-W�U6�6vXFt�a���LM'v1;����v������g��iNo,� ��^�-
|�	`9�hvlFl^��1;-���|�I����A��IK<iP"����^��AwX�"7e��m�#�������A-����RFg�c�7|l.6h
2�fWc��[���>���==��W�=M��p�*gb��8���9&M��zg�"�;��R���d���;�����`s0zzMOtp�K�G��������e���|��_��e��0�nf���R�~��M�K��F���u?5��?Q�o%�d�e�;��Z����z���Q��S����\
+D�rr�zN�%��fCd���E���5
V�]��-������=��=A_��c���+���zf:�[���}hI-amg�'���|���������y��O����y�D�t4�Q(����4�4���[sA_�B-������E���V����wv�����[�n����1��
�U���-�4������"K-��`��|���tzM�@�wj�K���&���:��PA����^�]>KK�����Dr���L�Ra�T/\�!�x�P{��x�Y:�E�
S���}�
zO���k���Q=1g�h������5U+R��,��������aL�vY�����.r�7������T[�3���������qV�miE
��
&����1�&w���i���E����-��$b�y�������S��;(�V�<n6���M>67k�f�h��}A�kx�N�OQ��>(�ie!eoiV�}l.h�J��fL�.��R�����RzA�Q��
v�.������n���wu+S��R�b�+��m��N������Wx���p��[���Q�����/O���b+e���W8������lv;�mQl�$N]��E�5c���ev����n�����U��w;q�4�)����p�|g�z������.�YJHt��Ss����O�&g�56���Y:�������
_E����A��1K���;��G�����X�O��k���3M���m���7�]�"�nI,���������a��!�����Mu��u����a�^lg��*�����n�m�Q������O�vV��������?�Y����\+�-��0n�$���^'�*L�X8�,|�N�`��f����C�DXH4L|����f��{+�c f�5���ba���l�?�������������Z����	uM�c�b+��e��6w�����s����,�n��gN����u���A�Z�?�U����`��78u��'v�O4M��y����.���O{�+�����}�����tH�+�s!�����y2)��w�b��8�@�����>R`�w���x��B�o�q����<�7��K�����]F����|}��`$jL�V���VCCy����s����:�dfh���&��9�v�4h�fhx�F4;�/���^��S���`{�\�[���[t������=V%(����D����?��
�l���m����m�[Zg
�X��������vGe#�����'"Y�J���,�w���K^������V~��|��
���N����t�#�������
������_�V��V�w.��;wv�Q4��
���w[��.N4�&�e8�;�!C������-�n��fw=�B�+WVX^���aX)�r��sD��2%'���9�pZ��.g�p��<�.U2;�$6������\_v��?����b������c��u(B_3�	���=?��s��Y�l>�{�]G@p76hx��
0��):��u�&��r@l��"���Ywv��4;| 6���J��@�i�Jjx���R������#z��E:�R�8���n���l9TV\p�w�w|lN;;lH���2fx^���������;��wX��������0z0��Xx�Ul���oAa��J�cWr��j����mp�a*O��^�qe����3_�hL�`�.��N�^�,�g����� d��JC����
:5����A� *TR�������jB�����Z�`�>Y��+�V�>�n�ugBk�Lt)v�	EBkx�2���������6<*C�#X�+9t�o��s4��og�rg�5�p+P�e��
v����5=��O4�la85����	zWrv�g����Z�xf+u;g��$��������Y?�����[���`���������N/��
V<
/{;+�xv�v�i��I��W��]X�,V�.�_
{2�wX�����`7�.]�����\���0S��������T+�����������������,-m�S�_�S]7[���.����\�H��`��[lNU����<�4D�2LP��n�O*�:u�#>X�4���)v1���R�8�������AL���[�4�[M�u�\�HM[��[M���V�C5��V�����02:�����������_MD����0��������G9im���`����(�����X��VvQL�0��.)�����o��� ���g-������*d�������/��/���B��Y�{�5�V�v�6�*���:����YZ`,�����*�N������E������=�����DJ��?�`���n�:u��T�=+��5����R��^U}"|���u���9��L�k�U��e��f������_�ED�����$�~jf��36@����)DC����mI��q��5�_���w����w��a��I@,��Z��
�asI���"�(R
�Z�Pt+L���A���'^*��"���Q��!v��$�Y��Q&;��
�e��X���^���s�z�|��[sA/v�ElN|���:S���,�&6�lN�����eE-]�+�5���d)E,�U��iX/;X��h��/^1*v�PX/����:�S�:�azY��h�����P��
D_�c������M�YE����+�6V.v6�����~�fIV��X;Y��X����\��V[�f
O��}�L�[��b�L;� �k�*������7L�;��A,
�n�P��Ym*�a������!�����)���t�����k�t���~�������aU�`5���Wp�,6�����;;S�x�!�1�Q����WdcX����O��b�S9�bv;����4��?���WlBN��h/��/s��w��6��,���f�S�:�a>4���1��m������K��������~�X�Fi��*D����[=��'U+�7;h����?s��:u��=�a'W+}M�Z��U�����j
��T�q�^��pa4<���@���`�]r�������1�F��i�`��������>��cc�Zn�/��J�������7����S98����L��������Ql����E����W����`�]S��+R�Xa�e�nN�|l.���M���,��R��nA���`VJ)v��:�Q��cX�;��j��w�f#Q����M)�S9,��AC���
G���
��^���eH��sX��O%����8���q�qJ��z"�M?�SS���5j2�������K����F��)���+o��0�l>-zT�|��k'����'���&'=5�Pnnumsbt�3[b����M�N�r7d%��Kk���]��
Kq��w��%�bs���[�yY�;`.)hZ���N���E��68V����z��\������N�QD���e�<�-�p�Y,,�_do�����K���08S��^�N:XX�������u,��������c�vA������>��_�C��^�S�:���7C�����i���:���+K��e���v3��Xx`^�S��,=Lz,���t�f�������m=���Ss�(��4M"�b����t$��$=���`g�,��0������>�L��.]?3�G	vV�
&��}����j��/���0�*'��<�g�M��/�vx;�5[I���<��Y��Q�Z�����L���\��Z�6p���g�
&F�]��4+�i�G����-����,e�iQ}�W%�h=4��]	��Zp�	����`���O��U)h��y0O�hz|r�e��X`,v����:\�����a�(X(��{c���+}�^�LW*V�J�Lg������`9�
���K�`��GsxM��<6.�T���\�v������j�E�b�GR!��T�L����t����B�+���p���4nfap*�6LX�����:�7��^p
&-5�
���w��}P�I�u�^G�p���S�7�m����cs�������p�,��Z��T��N+����������[���5Z���G��.n��-�m]�^�!G����hX*,�d�0�j��ar9�|���w��R7��[!l�����+?��Y~w��?�%��0`����I���P��2�2�������53��h:X��w:���ZNz��������n��+�YZ�l�,lx��������N��,\d���p��.$Z�K��perp�����i	p��������S19� v�\�t��B1�`�
�K���=]��f��>�P�t��P�0���"��������������_�X)��e�%�W���i��d�����vKz�A��#�`��V�O��4��T�2������+N������]��+���.���O�:��po7~g���{��_d�5Q".���0�,;�(v1����=hZG���>6�~x�b���,�)�D*��������j��k�I����Q��DC��E��iK������>_��9������%�����&���FE����j��B��������
���s����$�g���B^o�d?Y)�hxX,\��
��i��dGqEw�\{�b�:��_{;�s�]����mY8��rfa�e�fYJ��U(}����+&E_�Sf��|��csQ�Hg��d%�bi�7f�H�oi�u��69Eg���9�m��#���>����Z�i�=F��i�i�<����-\?7���0'#}��N�9�`���� w7��4�����t0A������;{��J>y�V�W���C�h��$�[r�v3����9�E��#yj�3���c��l��]���v��~�2�B�z^f.z�O���i9��)�����,; /�r�u��>a*.�
s�2����d����V�2�j�|����T�b�`�O3�W^����+�J�����s�zv�����X]�����.r�����Y���4���a3���������t����SB�0�Y�=�!S4;����aw��G-s%�dup���:��Q�������{�]�����Wu�2|�`� ���}�����4/�a�����b������wO��������g�_/B<���'V
hn��L������*������p��'�h�*�x���,����*��I[�B'��,���f���{?����V<9�=���^��O;����cs�����.g&����~��3;u�c>�����u]
����j7�}9u�#7�
z��Y�
����a����{W�4�g�0�]�p�V�OX�t������T�����Q�-��Y�E�J��m�.q��^�C����%�pgB�rX	��-���EXx9n\x)�yZZ���,�
:����#}C�Gu�g�!�(Fi�l+���=�V��.Dj�~O�X
���]��x����-����H�������X�=�JH4L�%r�k>oK�����-E.V�OX�t>���}�NQ������Ll�/=t���6m�)��f��Q��-��ib����0�-�z*A9u�CX�5%����TpzT�"�Z��������!�ee��]}�x*T	��=T�0�7�o��p�@vu:�D�r���t���+'*lH�����E>�^�(v��q!��]��p	���n&�������G�����?�|6��sRK���� �n����m�f���o�y�>5���z=`��aJ-X���#���`+wpO�'s	���.�6y6F�S�����E����j�`+�U�Ox*F2y�9Z��9�V�*�]6�O8��O,�e���M��&r'U~��`Pfv�!l�I�@I����Ss	`zB�sx2]jv�uR�0�l^���l�[�>���t�+N�9�k~)����|������d���3b+���&����-�90���v��9�+����N&��P�e�#����v�m��.r������u���|1�������6Y�Uw�}�{����U>�B5hz3�'����
V�����	2�YcrUj.�����-�����p�6��Vj7�|�.�C��M�_H��q��|H����k������~[�����;�~l.BX�����]����z2��<�~g{%Ab����D�*k��K'��wJ�t����E�&���|M���h�b��KN]�p��r;�c�{�k���f��=��R�	O6������JJ���GO�z?��(=
�f+���'}T�^�C���JO�
���k.���X�n��,����t�����*l�-+�;Q!z����y}g��\,�Fs��c:u���E����ee�X������u,����������Y]�b�*��f�Suw
pM�� ���n��3�>,	%�*��}��vI����t�:D,\��]��l���P�,�b4b��Dn���.&��e5��c�����_�����_�{�e����J[t��}g�n�Y��O�]��f_��.:;���,�&���H������}��.]
Xi�q5�������Zf���-\���9_L�"������<�|l�4f��Oj���8+���t����;��O��e�xb����sx��hh��6[��.���R2���
�v�������rEo���>�^,��-���e��1A���PV
,�F|���:�K�����+z�e��qz(����e��b'�E�s�b/G�������=��?6�����P��2�e��bEM��2.�
3��v_����{������>��,�����e��b%T�w����~�A��N2�-��e��Q��"��.@lI���p���\��.r��\��B�^o7����1;A%z���y;+zTL
/���4�,�?<����&�o�I������s�~�J�f��b��ax'�:^�]p�l��;�������'�>Q��)��|r�N�,;���
����,��Q0����M��'YN��x�	�E�H���_u�0���z�a+H�KN�9$`��?����U�����D��I#����p�`�I�;f/���m�.,\��/&+
s��Z=u���eY��?I�1�
��e�8��I�]I�v��p�+hx�]l�AD�;�n6U�����:,��~F�]u��9J�Z��bY���}�:��O�yb��}��G��%Y��@tJm�
�b��Y�K�Z�U���A���u��l��v�����?����v�kC��$�
C�]�H�M�%-��/xD���B�{����g����D������e=���h��-���vX����`a�W�.�����)*Q�J�E�����p�(��.�\j��*���	x�KU�RbUi��������a1�A?*�Q��r�NB���b���o�����aV�,���ga��k~�X���v����s�������+����pcz����@G%Hf1j�+:�������hAO��,�k'���r������/�4��F��������,���*`kQ�E-zUwkQ�~��s���p�%`�T4<��]�5!Mh����Y�����<�C��8�o�r?��Q�/�=��&(-zA_�F�\-�<`�K��);�����BX�4��{�V�-���[4�*rk��+����Z�z��	
��$����@�����XOz���4�;�e�����3,���`;4I�Bc-���t��6c�m4�����o�f�Xa�d����f
�������$lXO�jHOjp��I�[)]���em�N�n8�1te"����5�7S��s��<.�	�Tf��7�}����f<�EW��-�<��&������,���B>�E��o�p�V��Yp���N5���j��%t��mT����LS���`.��������l��R�
���`�2?��s��������2ZMEP��[�T�a�_�/,��P)\��&=�L4���6�T�+�AkQ�E-����)�x��*��'=���h(s*��KxX�y@K/��h���-�<���4fx/v�mS��������w���(�^�����S��cz��/��[�X�y0Ih�T�D,,��$4t!�O����l���m�}��5X�A,��k���`�
^p������U�b�/q��6���0��,w��������E^��pQW�����3lD&)�erwbaf�X�h����L;O�GO�%�r!f�z�l�;�� ��7���'����� �b^�PDL�����BI��*�d�����i}����E��6���p�'�������,Ut��<g�������Y�W����@��P.]tK��n����69�L�,sG��X^�X� ~Z���k.//|ydz���Eia&������-���V��,�A4���,_l�������H��m �Z�N��N&�+z2?��U�����L�I4l�(?f����=�^�%�M�����N��N��*����w3����oD��#��2|�BIb�����s���5��]E�L	�#'�i7U��,�-��g���t6�h��'���v�eJg�<�3-w:Y�St��8g���9{��Ds.��M��N��Hx���6�J=LA_��C'���uB���F��=gx��IQ����$�����\�}�����1m�0�(����x�v�M����=Y�������r�s.���	�a�/�*��L+�N��
��.�`�]X"����.t��x����t������.k��WG,4E��,�F,{
��aw�kC�A���j�xY��}�9����j��5�b;����
�<�^M�Z)7}���a��g.�$Z9{U��Y�LfUt����wS�
m��a^�X(�%�A�)�J��im���E��k~������9U��f=�����b9��a�_�\��ZWv�@�h��&m����j��������"]Yh�v�g[�X�
�R�:�h;�a�U�]�F�-(�(����]0l���`��]��*Qw�k��8���&b��)5\x=�J,.$�Xw25������~�����e�0l�?kU���D���s���[��Y�
L���b��;'1\�k��-]�YL����Vb��M�����v�mYe����c��RG���[�w���i^8�O���Tm��o�PbIlN�*���`_M
�U6x+O��%_&�+���h)3i�O����r���)Y����b'+{��������}��C�P���f�f+�8k%C-!��h�}��n7U}�|Z����Z,��:}���R�4��Ls<�Y��	�B	��l�����N�%O��4���a�H"��C[_�2�%�J��[�����wm��\�q8\8���9�dl�fj�fIH��bcZ�x2�b��&p7�
&�k�4�u�[���\��S�&���W���E��
���t�;�GX���^�[I�0uYJ��wq4C�J�o�?���G3������5�����#�O����6hhi\V���\;KO&=,�k$�zb��Zs�d�[�x2A��h��a(���,=�[ [L�X�EW��{�'X�l)s����I��������K�L/Y�������`����1m>�[b����qZ���1��ex�4��26c�����	?��Y��5}�b���������A�p�9K�C}��62y�PsN��nym��HO��gH/�(���xZ/yBg�t��Pz�������V!��v�
g��i�~*�<���""�����~0�=��pP|���p;:�����!�uE�Z�������c����x�T�f����}`����O5(\i�lKe���>�[���p��:-�#���hd���*n�edu�	o0KN�����o��	KM
o�Uqa��Z�Kb*lO�����E!��k|��6(`��h�7!�h��D<��K�D��d)���1.�5�������z>�i:���������_F�E�������xE7hX;`n�T�+bY���EA�B;�iy���iE_0��k~!���o�r>*/�m/h�J�Z�������;��\��
-��.�1�0)�\�.K�.&m+6����G��J�be��a��X�
�P�^������bB����.�=k�}����Hl�����-,GM��H�e��4]�H�a����k�,���!,�a���]�<.�r�`�V��
�3r���,���_�����w�*/�����H���n2=�3�.�
,k�B�/���S�����Y2N�5����m�l�y�M��+�M7�K���M�3w��\�g� ������V.X�V^��	S�]���&�����a	d�s��9��6��G����\l%�sY}���,��#��Vl!�cY�x��d�,aI����b�L����j�D�(��[4T2{��5��E����sY3y1?���%������,�z���>�["[n�~Lt�o����������o�����y�DCH�
�E��f���eJJbs����P�w��;K���-4+Y��^�:�o,�)�>�],f�q��"�btZN{��0�����g�f�*<��Lb�s.F/��/&n�$����.Hb�1�;����6=��M�9�~5��,<�MzF��D%��v�-�,+�/�m$���������/��e�W����~�r4���������eal��n�1.�lZ</�oV_0�':�v��l-����7<�������=5�����y���i���A_0� z��]��XV=_���4}d��=��/���1m�1�e�q8�p�B?c���0��=�]D��-�,��,�i��e;�V+=�nym�AO�h�� �����XU�X�NPl�L����"}���X9�/����!�����ttDg��s�)K/��T��["[�Lm]4�
��%Z_6��1����Q4|��������O��l�x(�'���l���C?��z=1����}���#������5�������
���=�+�����&�u
x��i��x�We=1�������q���hx��><+��7�H��������num���|���F}s����0��.��Za�����.B����`GY�~��@��C_M��b
��`-+���E���/���T�j������}ae��`>|�O�:���b�(�a������Z������C�<g��t�+�p���r��a5�X���,�������l������D�/�^5r�a���������Y�k��
��H/���j�w��:����b��+"������j��`����ax>��t��*R�y��mH4=�O��	X�,�[�``���3������lV�9g;��H���������N�hX9hE�wY�}�����g�F����:��J���L�����`+��e�/�NW��p�c���D*�+����`W����6�RJ���4r%�l}x��OtmelO�z���L�����C���\��+Y�_�?�*i�`�[�=���
�on�y4.��{U��-�eE�����Q�������s���p�WR�9����e��`�����\����Uh��� �`&l�06=���[��ny>w���j�����A�([�f4kX�,�qX*����� �y&C���i7���P"P�!Xx���
o���Y��p��S���j��#H���5��Ot�G�>�)M������X���@��6;km��e�Ls
:%��F�1�A�_�������H�)q�B6``*���P��}����������mv�k�
�������Tk�{/|yc���a+��*���"*�2T��L��a�9{�l�`[����?l�.�^�$���<.<#���8�,�O�$�mE��W.+�_0�4����R��f������Z�o��M|���K����e�D��3#���Y�?�(8.R���lOr���J�1����&~���v����y�������Tn�+���e��� IsN�������o�

��,�yw�x`����T��v���������z�,7X�_4��S��B1l����,��W*��o��A��o���/��/�� �~���y�����=�^=����h�sj�n���C�t��
w{8bL�f�Uf:��v���;g�"j�9�2����1�s��p���
��F��e��e���>�A������K�,S=�e�[���K�z��7^ ��Q��W����o�)�	dz�MZz���Tkf�DQ��W��y��0���2}���/�.�f�)4����%Z^"x���|�E{%��)9~���
(d%���r��
n�fqg���R�?o���p���u����E5~'�|lf��������nC����B�����>M�k6g��j��B�����v�C4�+��e��~VaP$����7T�|8#�v��t��C���i�����
<��T<�lKV�n�>�����/2�F�!f������~�s����D��_y���$Q������-��A��M_H�,b���sG�~��{.���pF�����MJ�i��M��3����j@��|8�\'�,o��@1�t������@yR�{�3v�(@���Q2����5i>�u�����AY����/�F�����V,�f�����BG��l=���E�f����V���R��8�Q�E�P��w��}�[[�0��je��h>�Q���n z$Z�z�w�ik�U�������������o�����?�7�Zn���j�������(z|�-	x���/����zwS�����L������Y��Gq�&���M����`LO���Y>?�-T�`����-4
�l@�_����Y���w��`��}������`��.Q��wT,����\��H{�B��"���1�n_]��(��9yc�B6��1"�_�b����/�C����9��%����M��3����F�}�b��(����-��>:�AS,��Jb����QLOznO*��;n�a�ml"�_�z��z�^���\����l;�9�l����Q0��#�//9b��cS�����G��u�c�/sx�w+dk)%�f"��#W�4�-/��A%U�,�7
v��}`��T�����6�`��������|���-:g;4S5���b�F����n���l�U_5u�l���`s��1m>�`F��,�*
�+���%���-/X2"�b�Ac�u��7�56���jC��Y�=�����WO�)fn���&���W)�9����n�����$�Y����i��`��S����7�6�����hN��nfe�?�
(s�H3g���T�_2�R ����������BjV�Y+N�����V����lJ��-��/h'=��L#&j	4���E�,>�r�����k�|B����Sv����Tm�������?d�a�SsN7������A�S�.4��:��[���m0�+�k�����wS����Ce����l��j��'��mz��G�o� �T�+���'x�
��@���Q��/�L�[L,6�`I�/]���A5���}H�F����?��=hKD;a��P�;|c\��<����6Qa�G��0�l.8g'�_�=�~�Ym�2
�I�COz�Y��0eXL-��JA��Y���M�7h����P�VE���Vy��1m(����_�{��8��4.�wJ���;a��0#)h���l�z�M�V&L��7L{�7�y\�><�2�Qzl���	�hC�8��Symp+�9��7l���;m���O)��h|I���jk��x2�}�I�m7U�^�|�_����K��O-�s��%*�s���l����R\��������[@�X�6�@H;E�vS���bAWb��&��[��}\�����,�"0�8����vx��s�Y���}*����T�\�-���o���a�q�eF	D��H����+Qi��,kP�;n��d��n���������������k|�\��6�Y��7�����]���_���%��H7�p����F.X^���/��
�4���������������t�t*��
w{8����z�b�a7����#�4��}���������'���������z��D�L3W����t��Bv�e��)��������R���+�Pv�y��&�e�o(� ��GB�1t[_�����7�����[�����YDYt_lv>��j
&�!�%	e���>�����M��'�G��0.k�iv�[�5�YCd�
�3�>��!v�������_�����2`DCg��,{�&o��)m����}�`��PElO���c�Zd���4;��N���C7b��M������J�U$|/��_��o|/m�h��B	���DC
���_,gKt�����
yE��x��U��,�~A�2��Bb;�e3[�,%3�D�n���U���,%S�Dw���*f.K�_�TB4,��L��Y~���-����������|#�%�0��7��c�H��R�=n��ci����c�:G��*��j���MH�0,�[��{��e:�����1mL@���mp���Q4��"��$�/�^������Q�pwY��+�K�;�E(���f��u�������bYR��	Oz	���/����5�/&``�|������lc� �i���e[����b����U+���Q���8^���K�+�w��v�;e��Xf���������"�_L�^4�������n]=1���Z���-����?���R�t��C����r{t���?���eIebs��1m+��7����G��J���0%�)[����f �f�
�����W��Tm���{A��r��+������+yXv����'_��z�:{f�6,��y�Z�e�a�N�-��v����;O�W�}�e=���������~�<��j������,�Y(��YW~�,��4]�����0n�����3t��{������x��^��%�/��~�PaO�+��oC�����$�=�.��_0�Q/g8U���,u�K:nE��$��[^20�t�	���U�Z%�3��x�1�,�
7h���!X�l�A�=�
(����=����=|��f�g]�����"V	/�ba����5����[�m�,�[H���4��F����&v�D��a����aL�^��&?��1m\3�}�����K��Z�1n%q���t
B�����7}��W"�f�����c�������=.�����Jh������������;g�B��z�4q�~aqQ�� �~�Wl�`f��T�\���������f?a1�����>���k]���������h�w�,�2
�jM��Q@aqmwAg�������n�`�J���/x��F��Bgz��r.��=�>���������U`+{���s���pACIK�
��b+17
��� h�S���l�e�~z�
������C�X,6gV����t�M]|�>)�k7U�N�[!�}X�������*g)�C���=��j�"���l���-�Z�E����U�q��;ls$���]�0M&��2;v����nV��e�^��C�S�lQ��(�����iRA(�2?���������-[��D7e_���$�K����b"M������
�lfZ�����9;��J,�	6�����6�5�&�h���b��2���gC�MJl*eH�*tL�D������_�"_:�Y��Z��MeO�m�I��v��c���!�PV-�	�T�R�	���F	�W���T~A�$h*4��
u/+�_��\nX-����`i�#�� |Y!�8�m��p6���`��M��il���d�S��n�ly��I���`�?���VRM����O�po\�����l���������'��SJ�n��c����
�PB,G;<���m�w�k��~���$kr��%�
~�!U�i��)�h��6�T�hI_�
x���-U~��Zt~��p��C������n�~w��t���s�.�@�%�o�O%�e��Gf�L�P@Pl�/�m�r�#'z1��YV��YW���S��>_��,���,�J���vK�z��{t!�[��f�2�;�c��d.��e��}������D��B������{��pj�v>�u�o��
E��6�E�A�s.�����
s�E3��P7Gl��=�M:�h��D9XA����
����r�X�n\,��Dn�Q�,��tAc����
�f���#6%�����uRJ���>]Y���F�����b{AZ��D3��=Y�UlV9gv�7-�����������Dw�)�S��YJ��.��Vw�YN��Y�py[���TA�$>���s���M�������;����}*{���,��pQM��`'�+�M���S�df"��g+�
���y�E�b\�L�Elv����:t	H��Y��������
��:���f%b���Xhgk���3t�It�������
N�����*�7��
����g�"y�|o�)��'���

����5��:�5kV��;gv$;���[^�L�W4��.���}�l�	�-�mx����B�m{�z���t�v��"��K��[wS�)��A����<)��]���
������$�(��H�V.CV��Y��h�o$�}�e%&bG�q�m5��C�l�����eE���������luv|I����-�������������X~���g��*��M/
��`���n�6��14K�������+7K�,N�`��f��@���J���saumy�+n��L��"�n����{,����a�:6������V�����7|�$����<2]H��?Hv���X��f�����Gf��bW����
/����K�������7��
�	��Fb�/�3�����mo��$UZ�zxp�Yk��6c`��$^�����?x���
v�<b��P�|[����f��H&�!6����f}e������=.|b�������t�[�r�b:Z���+�2�&�C����L�
s�^��,T�[J��\���D?���f4J��=T��Nb�r�`��dZ+[�eZ��%�������o�B���lO@��}xrl��ClV|:g;�7�V�1j������JG�'�m��������W%�_�e� �w[��f�H���V
� �������(-�z��`���n1����p�8a�7W,t��<�v�``>eDw��(|c�L���Jo��u&p&���2����>�
��.x�������7S=]�1m�@�h�����wS�E��KEC[mH.��o���!�tKE�0@<����������`�Yj��>��������,4�����^+y�Vx���r,����k%��
�4�a�V���k�p����.�(-��-N4�q`�����f5f)��IA���2bL&�n�\�R�7���+����B�`��qa=���Aw��*-\06_��Yb[�_[�fzO�'<���[hbs[����f$�:��x������R�f��&��8����2����p����ReS��)u������p>�a"��C������lv���,zJz�*���`�}��-i�Y.��u�A�B�����Y��p�����@�/�K��D1l:	v+�sf��:����aLF��<{�x�0�%h���O^�Mp�%7[X\��L�S4^ il�9Kb���4��|���P�Vtn�q��@��4S��u��Y��E,���3g����Dk���G��D,t���%���l~L���V	�,�	���~S��n������3��]t#�Y��:�\��n�l,�,:w����Y����n;Ji<��7kZ6�6%��:�3�=n!5�YK�1#Bt�8g������8�^�,YC���[b;��}XL�s.4-o�l��*z&3v7��f��3�,��y��%�?�p���:4���ol�+;�f��WHI���f
���"Ev#�RC��������4��~Y}���Yg7U"L:TtN/���	�a^c���b���o�T�G%���6�)L1Hlg�Y��y��ZM4k�6�&D�	]�H��h�_�f)�sv&�x��64�D����$�>��\�Dk��|��l������,������r���
���~SY�n8���4lp��Y�T,=�4g�����b�nym�2^����6V\ �����Aj�����"�
�E�e�f�6&���ec����D?���,�`�J��1��]IVk�����>�l��`�T����L��L�G4u���7����v5"�M�`�8��$��,��p����n�pp�N��'�H{%��n�6����h�'��'�D�Y���D��8�Y��01�j���/S(����-}��h��o�M�:fVHr�������}�����;�r��3�����5�4��9�1
��"<lAm�Y��fW���t��+!�dxI	��kr�o%y�2���������x�Yr�1�a�0��nx*
�x��
����H
�t����`a��+��%��	m��_x�Kb��
�Mn��S�J�?f�f��A#�"[���2�EC�/�������e<pz��
�l��W�%>��Y6t7U�^L&Y�����v�&�P��Y'�A�4�aP8�	��ba�������v�:Ms�<r���
����S�	&Ci���f�d��.�JN��pJnpe$:�����<�e2 ~^&�#���}���bX��hx
#(����e��rc"�i^[����Y����O���
:��~`���K�����.j�w+,�VXn0�&�a����x����c+S����6�kF�ta{��v�z��Z������E�������#}��+���-Z�z�T��["�N��#�������j�W�=�E����aE�X��X��-���+��[^�l��+�';��BlA\�YO����4�a,_���.[,�����������iB���"�N��������}U�������Y��1
l�P�,,��������s}U������"������^1k�fo�n�l�1�l��R�wd����`+�R���
z������@1
�?���k
[�6���Mk^�A+8����Z����R���)��'�aj��\�`�@y�9mC&\��;����}(�Z���O�����@���g�O�L��x��-�n�\:�0&b�r>n�L����l��6avc��~h���"����1��w��������+5uGo����dVg��b;�k\X?!E��
n�*{c����J��%�s�����-	]Y��qj�p��J����
A�c��=�5�=L��z�N9�t�rw�����4,��Jl�:�
���G
MK�������(�*����np�:���Z�:�����������v���z�
F���=������)�P6��vKd���/V�;�	���Og��-:�����L��AoW��!'���V���M�DC������|�OJ�,��SM�|�]��\��.n���)���Ew�D��`oB�Y�e��6���%�K=Y3�%
.����U�~��x����;<fW��E��7��Y�~+xn���`�6�\6r������qu�V�,-T�3@G���K�W�������}�D6b���h�0,5��BR��B��f��s�t��1)x��w"Y���)��a[M�/{��B_��M���}gb{���[���,A������Y(Z�-�~n%vk�w��w�5�v�]��SA�.VQ�'��<9���^]t|��J��,�Wh���*�+t��w�O&�a.s�P�R�`�b����\�[wk�wf��f�#��Y5n�`~Lx8���)����L���v��"��FN���9{8Z����S����<S�.���9��0nn��yLK�w��*�e�l�la�|~g��hX����n���"D�/V�(v����������A��5�i 
�{��}����
��B�
�����>���9�S���;�5#xw�@���.�D6�X����r_��}gJ��Y��Y�fq������n1��v�tG��@l��{�6Z��u��X���Q�w��w����M�*�����p���;��C,6�����V=.V��e1�,��\(t��f���'�s�;�����;H������	�[^[^��4����P��_5�4�n�l<���������TmA�?hy�0}e���=��e�r�����fUB��%{����AOVN���%����[-�*��
>�6%^��_����u��K�{!v�-������p��G���`�Ec��6���%iv��wI��[\���0�����]�������'����T_�[^�?,�N4�"[����H��q���,hE���H$��:w�������z��T�����Dz�� �OY���l0�p�/�N{�L$��R��xgI��+����acH����9�K���2������5���L��,�/LY	�����+;�e�;�A��+����KE
]&�u�8K�����9�~w&�-�b��b�Hnz
4.��5naqmA����a<�Ky�,\�x`>	vd���a?7�
&�{AG�X�[�9��)�V���y�`dAN�P������`stb�D6R�~��B�nmuX ���`V8�q+qjk�C�{�o��@��y�~����H��-j�oA�[��CoeU1�[16����5��P����wL44�5�e��$���h�K�����#
2����bgA�[m�C���~5�
����A��b���*�E�~w��-�*�tkhw&�g�Pv��f��
3�+m��|V��P�,�	v��3�m�W]a�|�A��ql������4�!�d��K��Z�X-�����q�8�#�vS�!C��*����zp�/��o�$�Q���F2����+LS]P����LrX���H��p�`1,x?K���;�y��>��~��D���� Y�-Y������o���o����K(�_�&6�h�=�Ou��+��iPC��&��aa�H�4�HA��T}:�8�tZ��������%�=�Ovh���\�`g��U��lg����i�4�����z��c�-�Ov��%����e��iHp��* .�����4c�>0�,
���ZJ��>����h#0G?XZ}�'�[���,[��3^��=�d�0
�SB��u�;T�zVr�L�=i��\�y)*��o*��=�-/xN�
�Tcd��l.��=��6�0���^���L�Wt��
g��O����*�'�o,-��~/|w��L����v��Z�4!3X��I,M�	�-��V��+��M�	>������
S$�����,��Y��3��_~f�P9��u��(�i�����SA����s��D��W����R���{g��/����l�	�K
����~�O0��4|������}�-�{L�OL�Xt��������E��m���r�sv��x����n�l��4b	%xwx��.�X���a����C��+4�D���mV)�aIE9}��^�*����U���-v�R�o�v�X�a����9������6O�U�_�k���E�'���Z��:,���X��Xx��Y>��\��?V��2��Y�S�`G�X�k��,4-����X����e��n�/j�}%��ue�++����c}��I?=U�e�k�E��������9���w+��B��	�9���vnb�B:�cq���
DO��&&�x\���n���U������lEg���p����i�h+��k������������s��n8^,�)��.e��UU�m�|�D��4E/���r<,���%���vd��C���Ri+|���?jD�J��
 V>%���X����9���>�����<R�X��a���a�����������l�����5H�W��9�7XV��;��\P{,�5MD��t�oA���f�����B*�c���������n8O,/B�����B������`������2��O
E������Tm�������a�0�9�0GNl+T�>�Y}X���*x�^�����^Z��j�hi���
�C���������0[�4�E�m������`�p8U��U
6������)����^,R�Y����R��%O��%:_�v�����$@�L%�U��Y�a
����'�G�.�B;���9�4����\����zp���.���>�c���~��t�>,�U4,�{�K�OiS��L���%!s����P#Sl�M6Kd�T�H���)g���VqSZ����x�����b������	6�;+��n��i��n����"��p�p���b��b����(bg!������8EO���&L�
��fe�%���-vv�kKf=X��Xx�X���a�$��$1E��bf��OR�tun)%6�w�k��A��0�B���R�4�EC�a�WAS�����B���'�?�-��x�����w��
�6����Y�����f�������I�����S�|�`zYy�a���'t�id�����������p!�O1�V~[^0� ��A�e�Hf��Cxk��k52�hj\by����n�l=�Zg��������^�Z�l���X����D��F�I���{7y��>0�:���k��05J����SG��-�,J�0QZ����������c1\���*H�>V�}�Y��\��Z?��}�_.h�8�aB3b'<5g�yi�*�Em�:y�Y��"����w��M>����^dB��Y
�X�L!������
�[!���SQf1FsW��Lm�1]-�&����Z���������c��/X��+?��6��+��fX|�Rf��>��q������_���F��M=+�^����/,��oAC����MR	��l�`�&�����=��6x�	:��X���p�1m=1�a�:Y$\���X8v����6�^x��T+���e����a���C��x�B����-cC�zec���c~�_���b�X
���J�^J�,k���_�p���o}��6�k9��i�.hsI����X����d��V.A�����s���p>�aj_�
��Q�`/��0m�����4B����n8��p�
M�`t;�����}�O��0
M����,�
{����
X�&�K]�Rcu��D'7�n8��.+:U�o��d�S���2
��%D����p!�M�0�.�O9��V�g$�KJA���J���C��(�i����k�s���U��I��D�p���KE�6f��[��p�Q�He�|2�X�tK�
EEnzvS�1K��9�>������#�����{�\�|��c��
dw+�S��,)@�!|�P
+�Y�f_��B���U�.y-�2�@�, ,t$�_�����.z��^k�������te	7bS�0����cv?&�j��&9g'���}YM�Yv���T��Z}Y�h��R�`2�b��D�dI����w���jv���~i������Z��e�T�KC��z��d{��Y^bs)�nu�W�1�/��#6�w�Muy������-6W
m�j�SX�+:?�n8�",h-z�j��p�'�
��,������E��q��.;��F,=���i��-��&�'�����O-����k�S�J[�m�Z��fE��]���(���
����A�M~������G_&�$z�x�X(;K��m��$��P$"�Q��(�UB���7�Z47Y9.<",AH�`q=����R��������k=Mz�
����X��&���m�����
6�<
�ba#���t���/���_Z����P�����P��Z���W��s�9�X����z��vb�
:bnI��K��Lj�4�j���-(<@�&.���C�R�/���=�v����fp�������Z~���eX@��v�i
K�����5��j��L�ki��|6\S4�-Q�\������T,L����(mJ�)<�m ��
O/	������EwOiS�)��.����}Y���Y�[6W�1��`�P��Zi�eJ��Y�����)�DK�����5-��2�W�W!!�����J�Eg����3$�tS�'.d���}�<��\iu���'bB0�,�P4�Z��Z��B�\��p�,�Q���������}�i���W/�sF�$�[���Z�6�#�",O�l�)�m�@�.��/�0~,T>��g%�,��[^[^����s*������)��[�LCItN�,����b�P�T�����2����,���n���<QwS:�l����z�=r��ae��)��^�������S�h(�+v��_K��L�U4����je�>���+h(� v�ja������v�D�'�L��Sf�m�	6�������j�Dw�D�&��Z���/��g��,T+����}���B#���/�=/�h��E��l�S�["�1��^-�
�������
��%�!��������	j�����N��
�T�`a�&�H�����2c"pba�?q�1l�����C��pyeS
v���*�����k�,�Y���B����}���q����y���`s��c���f�TO��_+����-P�{��d.ZBJ�����nV���'���/t��`�t@�;O��0�H�J�_�����	�z�_���qa�����������
��*���TY���fZ���
4��f���tJCfGI�fK�����k=n���d*�:'����9t�������:0����`i�\�4�rt^A�9�-��E)����/�Ca��.O��j3]X\�]��/OF/�`�L+th��<zkJ��%^_�iZ{�>�H/�QP�y�,�����aaxq������&m�0����.�]&:������������H�#���/���X!_�����B���������N��w���R���,�ME�#=`���������LXs4<$�[���Z
�q����������C�����`a/6����W�"
e	�JH�� ��Z��e����E"�����8Uw��*���'h�=�hV��F75.�.��\P�~�u�x8�3v���^��HA���b/X���g������'��M5s�m�[��24J<.F���[]�^��D4���U����M/��
C��f�s6����vTGzT*5��L5����l���2�?��V��X��2EO�]�dO��J���)��������	S�������}e'�[b�0S�0�	T	v%���OuX%y0�d����~K�O�J4,�<�8���NY�,-�,�[Z��+g�>����y8���n���8�`���U)������>�*:vD_��yj1�a�`W
3�>�;*�b�7��wK4�D��=X��X�4K���%��[��%����|�W?�sv�����
���B_�a�d�K�7�Y���Z�:f�	������S:��oy����DC��WA�iX�j��f1�-i<��j���B�^��m_}vS�5��K�8p���������a��\{q8��$r���=,������x����5�W<���^qe������sTq7�:�N"�au;b�x�����������xa�c��I,����ICc)��Vx���e�a�,z2��E|a�<�O����-��$����G�O��I;X���U�&Z�w0��������`D��U��YhV6��;X5��lwX��1���Qj4�q��tS��
)����KP���W
�����p8	���
7=�#��s�	�%����2E/h=�5`��F4n!�nX�w�p�hVk+t@�K�����a����y8���r���`���|b
��FU���V�����7��sY�9���n�����/������6
���D��5|4d�l����(��V���(l�I���X��&6{�v�k{����fS��}��-40F'_��l�'
���xt�H������g��.?q�,�vx��$.��v��s6�+s����6
1�����w����X�Q���6t#��0t�;���q��S9{��;�"���4Y��B�������:rs�1O�y�������xEC��3G��Ku�Z�bs�nyml��T�j�����	&�v��gw3��D�f)���na
h�K7�����2n�Sa�b��WtK���l?�=+h��,{��S,�l=����|b�T�a����6,[<X����O���9��p��4au�b������� ��B���"��E�D����q����i@������X�VD��t7��u&!�)����R��d^���Q���T-�J���~��#6	&���C�UM�����,����(|�j�5!A7&L#v�$G����%b[I"�@����BK���
���W�
��������)	�Awh�;��S�����	���� ��l���0"�����ZIz��n*;..���eis5��pQ�]�bS=�n��&����U�X�u0M=���&�	3����di�x|6^�����K+�zE������F�����`g%Tg]����D7xGvB��w��}a�~�� f������0��E��}`�t��Inx\h�Hw�rZwx@O^�O���B��n'�a�;��0���l�/�SL���`��i�v�n	���F���4s��&�(��I��������28g��F�V�V*��&�����[��J
S�@�}���~^A/�
��{�|d�_x��c���JH�VdH��REjm�C	A_0?T#���yev��f��
�+b��=�>����,���p����4l�����`R��4�%���q��N�9g`�D����*��Xi7��hH�V����Pba�u��BA�U��������M\h(�N�������gA?0�.�\����Um\U�����i�cj��c��a���s��9[r�X��*���K����A�`/�E^M%vl}�3-W�r���=9wS�����2�J�a}YZ�+�W��[J���+��*�mK�fm���T#w�`���.XZV\P	N4��&Oy\:�����^��[�u������`LA
���bB�%f'�_E?,qV������F
bs���]^"8Uu�D��JcZ(��=���#�d��>�/Ke����ia���`M3[�wd���k����lA�mZx2G���jj<2|u�j+T�O+O�
O��%+� b4�>{����v�����K�{������\9��,l��X����seZAx2a��U���d�M��N��+:���Y��Gl���<�U�a��h�b�xRf����-�R����6Yb���P�=�����^A�
 ����>�8�>\�El�1P�p
�����'�/\�+�~7���iDZl�m,�Z,T��V.X2V��e�P�Il�o��zs6�
lJC�-�-(z(�5��Lf^,���h6-�<Y�o~�-���~��R������-�i��	7��;�d�&�s�>���F�],G^,������������U�dz�ba}�Y���),�1Vy�5�g�1����d�5���x7�M��
���%��Q�/Q�,��L�-O��'z�����J��^�!l���L�L2Yt����j�r�����1mM@��hLB�K�KP�5��l�������A�Y��G���X�9y�6Kd��	����
�������y!�eh�����-�������G��~gy�o�0eT�[�pX\������e5�b����P7cZ���w�v�`+_�MT�J-����)}f7U�����:b/x{��ttZ����7'�k�i�hO�zB�LS������cj"�+]Q����<��J|���s�f�NBi5X���w��b}g(d&��6	-��-�<�-\��������\"��p��Y���>����D�;y��<6������y����i���T9��������X��I�]t�.�_O�J��}�V���a8Kb�����zu��(bi0^��0��h���R�*/�
/�U(�W����`;}�G�;�����Ew����aL�O�pN,,e�������'L��6}{#Ef������9g����Z��A���N,��j�psv���n�l�����i�T�� �;-�=ay�O*��
g#�Ip���T��dQ�wO&�)zA��XVd&65��	�V|�����=����'��
�=�J�b��Bh�{Z1�}1-.������+���'�k
[���x�����:-�
�����V�Kk�������M���t��Tm�@�`�
�;��ni�W������!l��v3��c�VVg��a�g�9}s�����*�h���b�)�t���<��5�t���-'x������.hCI�� 86-����}������74/�VJ�-���@'��>k���~�/2���X�Z'�T_h-y�H�����r�O�o�}�����W��/��f6e���j:��~��/Uw�
"!z�������G��A��R��6�I���V�N�)��\�`_h&j���-2�f����������a������2����t�������u(��j������>{���`K%�������;L.
J��-=�m��4
�����tm�z��)���%���.����u����_z9$�
���=!��W�["[#����F�K;��Y����7U��7L-6wI�M������v��d�g��������	A�#��r���a�o%���&��?�,���<�B�h��@s�S�@3M

*z�}z�d�����J�����E�'�+M�B,�\�Z�8WZ���nl�����m~A?�/�d(��Y�9%S���\�I���2UV�6z@1�`����x�-�<aJ����W�d�,O�'O���'��aF��G.o�T|hVh���EC7s�TlB����.\#����h��	�����N�(:�V���-���Eo���z�����-�\[��^��J4l"+�3m'��M�9��e���l��Es�2'���$�g.�IW�����3UUVe�|<�5��ci�bk�����o+|�) �nx8��G|O��L(�/����I������e���2�D��p�Y����z�{�����*�
�C������^,�,K�[�t,�3/v�
�F�������XX�o6e
����5��|���-�a�_bax�l�����bV�Y \,�}����N���\�c
��E3�P�d�Q��l����z�b	@�������g���|4�Y}���W��j+A����,����-\��$�^S.^�d�����&
�D�������>@4��{�G����8H^����b�l6�v�i3��
��:�b���X�+%6�������
�~�^��������9��p���L�
����^L @l~�v+d��>f�	���`_�K�A��V���nw�9N��1z�$h�O����6��������/Q�:�.�g/x��v�!i�����[�0eY�F�D���
�1� ��$�eu�����19X9��^��ZI^t��&�%"�a�����b�����n�l���O�����|�?<oe��J�bu��WAgdY�x1�b����S�[�+^�.��B�+��$CW����UPx[�I�A��Y�����l���m|e����E���EC�m��t����,���$%���n��c,Aw�v����+�i�����n�����<�,���`+�{A�@s��\�[��]�G3�0���e��	��}a�]��M�["�LGG�]\�B��e�e��W�c�,^��4
�M	���&�a��~�0w��`�i���(�4�1���4n
�������I�f������~a\����M	���D���ex��;��JL�z����-�Ga�

!������o�6w�k��N��0��Vn}���������T�/�������`G��h����}8\���v�����`�oA�pYw����/x�xn;�m>������;���V�v�� ~�j��P-�XC�^�k���D��y��%d�b>n���-��M�E,� ��,���^�hG���p��B{<�,�Y"+�.��+:�\�
gC�����M��>0gN���.��.�g���G��QP\��]0��t��A=�����Y�e�b�@�9coz�J��uq��}��i���D�l���an��|f+�.��k>��k���v]��E��S,���t��xs�����������^��������`�F��@����#$� �<��xs���p��-�nY���.���T&�6�`��>����	���s�V���z�Y�p�����Tr�,��`�l��S�9;�t�R���;�����Po�D�&��,��`�O��0�6����+
�m�[�5q,�	��ijd�#�����J��-��'x	��/<���0�'`�
����r�+���6(t�f��6��L��Q�)�yL�/�,z����0[�����1f���E���F�l��]0�)��������}A��`<�4n%f_�)�J�[**����~�P?�,�����{L�P�!������0-��Aw�Xx���a���+���,�[^��-"�c�G�H��T}�����C~L���T�������Y"+5S��hX�����SB�j�j�������;_�
�84.t?��+d+z�����L*���E�
�M�������`g���-��'�i =l�yK��4��D�������i
�.������J����i��z��}��������^w+�E���MvKd�	��I����\�����%�r�����r��6�`[���%9lh�.��rY�.��Zo��?IK�0�i�A0����q���\~L8�0��Io�J�m����*��~id���$��6O�L��P���~.��tO�����`�9OvS}<U�5��P��/[Y��3��I������#��i&�h�A���Y���~���$&����f���V�E.��'F�}���uyq��&���EY�F;�,5[(7�]�P��i0���>�Q��i 4��|f������`�Tw�[^["���rqe8[p�	��������w�(�j��������X���C�E)OfY�Y��6{������x�i��i��8�P������4�����2~|���tCU�f_h������R�1M�7��e�<[^H��4=��W-�f��- ��6=��w�O*{�5.|e%�|2�ly!=3����l���`+Uz�~Qr����<�l��u�zB5��'�+5�Q����c�0n2IvKd�	��Mwu1[q�X����.]�n[H�t���
�c����]���i��5|w����W������.hx;
��_sTH��*�3���7�5���>k����<��hF�S��1�6%
����:J�2]1�|��,B�4@�}���M���s������+*�6��I��F,���������~�B>�Q����=	��}�6������.m6&P��4��2� �Y�,��w\��i��Y�6(?�t�&<g'�4�O���c��@���Y��/CJM��MXJ6+�m�����a/B�
z�-�~�[�Vv^��4|�50���1�6���q����6�:|��gD�/��K�baT*�v�	���E���]����\����6R�������.L��"�<v%�O%�I���,kem�:��lh��t���e�������`�Awh"�Om�s6W���&4������!c7S�����4
�[Y�,��,M�6��oV�����L��@������^��0����[]��0?����k�������
>��j���R�F�ofY����+^��F����O�`�������`�
�A���9{C�T��*Q���bS��nymh��0���l�A_�t���v7�m'x�
��g�th�B��Z����V���m6�{�	���R��F4�f��fK�kn�?����CjoMO��)�j�f�yf/�Sj=�?����ymA�;�	��5r���%�$�Mhz����Y���Wm3&���5��@h���I�$�M���#C����a�c�Y�f�D�c�c�U�Sv�a��}yz���+��k���L���1�G+�����B���_z��Ze���`�u�����I���\�������Y�a�VvM+���&�P��:\-|��f�D3���z�|b��XxO	���$�o����4�~i�6���0�l���-�mM�C��TAnHC�����>0[y`���'���`KU���&8=a��x�DD
l!{a�^D���i�E��y��v�I�:u����g=������R�a��c
7�R�~*Q�����m��SR�nym�R;j�;}�Lt����z��':m��}/h���,L=������"�i+�D���
g�
�~����K��7�
�
�[�=og���m�A<�	����������=��L�C}A�b���%����=��=$�nz�*��pOq�/��%���Y�sM����0;L	6�&������A�����l������~^��+�&6���(:�I6�-[0 &�����|4C������G3L�Y:"��#l���Y�`}��%�3$e
����9��l����Y��'O�/�#����`G��e�pF����.��O�`'�Ob������>�K�G��`��j���L_Ze���_���T}�����B�
����$�K��e
� )Wr��������x4�������3���0O�eah�[�eF���jrwKt{��$�w�����0���`]��XQ���P�rY�:��q���]����u���}^�B��em��]P�,�}�8�i�y�_���T��
��k7���e1b������������������vb;���X�����z�f�}����3���+�����e���������+���/&�-�e!�)St7U[@,�T4K8��s(���6h_����num<1O�h���w����e
����p8����*P<�B��e-k��)�e#
�I�b��k��6�XT�C?���a�rbs-la��:z�D6��,h���z����e����E�i������2W��J���
���~����2�K�1]��[��b�������,+���/���+~9Ka_�\�eU^,�O4l&v1		�O�a�eY�z6n^���S��n�6
XM��Q��\���X	���r��^�?f=k��B������?A�B��ei��IC�~Y(Rl�1�������
�j6.�C�����>g��"������3�5�aM������p>�X%��QHi�,}1q�����
��������bUV��+ti������G$i6
g���F'}�?�G��Y\n��6�U'����6�EW5JJ
����/��,z��^�,��f�hvBC���u��������E�0�l������]�g��������@�p8�C�#w�ku]}��_t��f��b�6k���~W�)���it?X(����1�
�g�%�s_���"����]L�����g�O�d����yDw�$���������J��������/V�/��`�F�����{����6g
�V�F��V*��0�n�6Y����U��e%F�;(��;*V�e��P2�0�'�nb�,�������)��Y^�4_��44R� �_�z������s�B�����H!{���v����H)��%�U���E��W�
�)v����1�-�mc��,z�\�	��J���b2t�K!�5�>-�������G�5��|���Tm���y��������qa�����0n~�v�k3��%5�-h��0f+ih������hX�$�(�H>��vd3���aj��������
���K�s�D��`>b���%�
�4����z�t��B����B����lcz��F���/�Q�P3��{?-�s6������g%
�����}�����S	�n8"LXt�S�e�a��+�`h��*En������
����e���I��|�BY�e�d�i��q��g���)�~��a7�O&�+z��U�����H�)}P���s��s�������x9���V�3��=�� �f1j�J~��/X�#`������f����{L���,%��42,*���`,�
T�{+_L�Et�MV���j��VN/["L]O��Q0K��U�_.�s�I�/�%�=�e�n0 m��T�/{�C:hZ5?��s�"{Y$�b"������~a/�f�"����DVk-��-�����Z��3����.�l*|��W&�9[���l�O���_6�����z�M���r'��OaHZ����`s��ny}��_��/w�-��F����v�������i-���Z��f�U��Pt���
���I$��{�Y*�,���}������-I��
/�^��g���c�p�����3|�`a`V2���H�V�~����)&�J����V�-�J��A��j�l��;Zr�&C���{)�~,q��d������b�f0���|�6��$��p����M��_��ZrQ���/o��I��#�b&���~��s���?�m�X��*�R�y[%6[���]����
��bT���XvKt{��c��k
���km�+���Wo��m:Mu7����o,�A�����T_O�Q��o���:
b��ya���1�D�����n�a��4Av��
����Oov�=�+v7��p���+;��erjBg!�r[�fZ��f���,\e�J�-$z��z���d�f��mt���������D/���r�����[H�fB��������z�~���`+���f��Bsv�n�6�X�]4L�����.S��Z)��[^m�'���;>��j�	��� e��Yt7U1,sK4���+�vS�D���k���x�+p���
�7�i�P��,<���u���il�D6��s�4�M��Z(��^
������l�;P�,$�;,��<�m�����Eg��s������mb��eZm�����F�M���1b�h��B��m}Y�R'��W�[���
�
������3���@��������m�*��Wv`UK����-������Y"��|7>ga����n�1gj�DN:�v�k�U��~X�����<neK�|0�-�K�_S,<�?�</vU|_��Y�����>�6���.36.R(vA�b���N���d���,�����t�M��d����VHk�-�|���/4���!�`;�m��/o�<gK�p8�A�o��eR��D�,���c��2D���������)^��x�mu��������6hu�w\�8�J(w�k�z�%�

�`t�h��c�"�7�����7��~g���X�Z�S�-������x8&Y��\����w��~8����f����O���`��U�����Ex���;�X����z��]��B�7�
�=r���mAk��?_�z�,�;aZ���P�{[��f���g%�j��z�~�B���~_�j��wKd����~��%��p����
�]�w��[_���Z��f���au�X(x"6Ww��F+��`\M"���l�l<g�1��-��-\|3�b���I��p>��k��i��|oV�)���n��#����P`1��Q�~`>��5��w��r	�pNK;.h"x^,�$6W����J��~�J���H��\rk��tU�Wu�n8L%�4])���\_���cZ�����W	[��
v���:�9�0a)�Yz���c`���Fg�N�X&+d��y���������{��~����w[A���J��<?gK�<������/��s�A0���F���Rb���I�^��,��=%�r�*}e6����'������F��,���c|�)��F�����^���Y�a��m�B�7��
)��'F��`�����C���7��23���3Q�m�vz�5�o��d�h����
�YHJ���6
L
����:����0.L�� 6t��Z�������R�����%qi�k��pOa\����_������9�{]��j�	������`i�k��$�D�o�Z��`���6�������M����BI���n�a�V�|��������/��s��o������
}P�a�E�<f5Ti�����0F��a'�������%����A�*�����n��~^A����d�+�$���0 �V��v[�6���P�X�I,u��4kD�V��������p6c`��T������=%��d)�9����	=�sE��������p'���X9�f���;t:;�S��]������}���nym���P=S*����o��t����YUn7U�Lu\4��
4����X����V����a�\��ps�o�Bc����/yc�+��F�~��)mM����8|�B���;+���7������m���I�naa�Xhy��J��B)k���=��
��D
���$�-�������5�|bs���T/O4��Xw��:z<���y{��;+*J���e����~X�C,Lth�g�s^���q*������@������{<�E�fg���i4���_��R��-��%�SU�7\��-`�%������4����;rEwv�k�<.����`�%�^"���`��"����g}�^oF��|cqm�PIl.D:g/v/�KuvKd�	n���/��n�v�Y@�'�m�}�Fl~v�iC������
��a@�
(����]�������D�^\�����b���{LP,M�����BapOx������-�
(��5w����O7p�p����m,��9��M,/��C
�M�����=��z�/�6+����X��9�-a}��n��r�9o�l���yr�fI��Tm@��������[���yK~�`J[�>kw�6%b��n��/l����h���%�^z�l1�u�L~@,,�����,`-6���-��/h�J�� e����?���B
�2���k ���5k��uh�r�)v��4�<ix��h9|�����nqmAs��y�e��w��a���c�B/���z�7���r��.hVJ9�z�06�[�lVo,w�Yu.����R+x7��-��q�`K3��Y.���%�����\�fR6B_V&*6W����v4�����O����`/xY��7�=���}��7+��6�.�-�-����V��������9�p�������kM��>�lr����n}��,��J��E��4��B�I�������T�h-.
D_���?��s���z�0��aS��numzuv$��=���~������;��F�%bFI�/�8h��`o� v���.���^��_���<gth�����"�9��p��+I~7�� x��/���"�_�����w��Ag���p6��-,���T��u������N��lO���1-��� �������sDb����=�
x\�A�,\��/���
������G��B�W��c�(����i�o���.x���I�����g�����E_0u.������m&�'z2�/��
�����WJ~�-�����=3��}*�]�p����;�yz��
����\P�m���R�_�d�`kx7>�7�K�;%`o�j��t�E�=����~�N�^x�C������n0�C��0�'�7)���j#�i
����%El����nP��jU�V�nt�A��
)q�_���GAr�Y������^$���_�R���b���/���05|����p���t�������"��Nv2�&��~+o��z��i9��M�>0����|,6�`PB4L�~�W���Tm|�����9[�9��0�`��PW5�f���Lm��M+�]eRz������	[��+[\V��Z�i-H�9i|7U�1�n)hr��sA��Y��1Z������ �,sy�R�C�#����4���UwR�.��kV�np_��s�&e��,�w8Zd5�:=�5�3!X��%v��-��Y��A����Jy�U�����yV�f��s6"�l���Rk���Y�����������7���w�i
&/M��$��6%���dcZ����+�dK.g{�p��a�S���@�&7z���U��}O	��/2"K0�,����������/�l�/�Y��S���1m�0�d�T�E��0-��JHv�i������
���m����,�j2��L�p
�H%~f��K�L���.}���\�������s���
VRH��b�Z���T�nH��r�qc��+��R�	���FE������[��,�����dua (�N�8�+_�W������R���Y	��J��V.X�V��riA�t�Q
)|�����-��w��v4�[����<�vD?�D���.\,,�;
j�������tx����,�Ytg)Fb���i��#��+�)��z�b�Q��0� ��j�Q���D�4[hN�,3�X��hm���r(&��������YV��Y��
�$/g���1���a�t��ba"�����<r��O4K�6v��N��p����S�*�yt�>
��6��r���J�����S�`gy��GA!�Y���-9��27=2|w$����c�p���h�.����m
S.H7��6�
���e15��~��[������O��c��E�k�����@4LY�_��M����T�7k�6�4�rM�v�.4[(�i�km��$^���B{�f�U�#)����)��0U�6x�
zB?�����5�+>j^�~�9]mO�k���^�T�f���T�wJ�8
gS�Ag���p>�Y�H4Tz;���4U��4����B+)��Z��{�/
?�����B�z�OJ>-�g��$*[����N��r���k��������v��S��,q\�������g�4�9�eS��)��
5w�>��[���,���>5��f9��
D�/��|���f�tO���J����
^��^)�4�Mh�Mg��>��H���6	�N�h�dN,,��7�����i�l@���Isb[��}��f��t*��Gs�^NS�!�2E���{6��fj���kDC!*��h���0�]�B�p��7^r�p��t����l����eKq���$G���`Y��']��l��a����Kg=,���]&�t?-�
'h�7�a��������������[���	c&��i���X��h���o=`OS���*E��vg�~����h%]����i[��L�E,��[x\��E��r"XS��L��7t�@a����{�r�Y��r��i���`S��i��a�t��g��^}IyB���m�R�D/�����)5N�@����`�T��eJbg��r��g�!����k?
g#�)[�.h6[Ba����nk �������
�����7�-'VV;�/��.����8��4�TY��q�)���������h�/P����.��s��:Z?�� f�����	��^����@�[(kn�m��
OM���R,��vV|�-mL���.���l����&|i�/2D�h�!�`a�E3.4|o���|���o��l%�a���|�
]A����b'�k����f���Ago�i8�m��_t�����	���\W�C�/|��s�g+����84h��	j�-�[�3{I���0	�������
vV�d-
u�E�oJ��},�5t�X���1n����
��`��Xx���F=1��k��qm���d5EC�-�#��i�����������E�XZ=�f�x�se���h��V2�,<��+[t��l�j���,pa��D���\�d����U{�����`�1h(K"���"�[)���)�N'�����8�N�%�Tj%����
��DC+j���rw�>�v������2����	�������
�����n�l;Y�]����Z�V%S�2�PX�Y*��gbaD$X(�%��0{���V�Y6#_�|f
�CV��/����f)����7L���0�%��R
i)\(-��;��!���e�n�*��M���p�a��$ia�$ia��Z�����p���mcr���Z����f��[����m�w��a.��\>��������f!��-��0�?X����t�>.?1��4nA��Y��Z1[QN8�����Y�7�L]�;�����[�z0�+zK���a&���+A5�7h�l�9�+K��m��4
�n��qs���1m�����p��� �=X���%���$}�Te�7!,��LA�lpg%��;s��eab'���5�n�����E/f���~g��Q��u+w����@�Y�}pcO�Y���D���O�a����v\���}�����+���E�;��X��X��q�3@�`7+��'a�$t60/��2�����p�B?qA@�[N��W�o��tgz-�;������ba[��2�����fm�������"���j$���],F7�w������Zyvf
���eW��RV�S�����z���=�:���������)~�^�R&6_����k;=�
>����I"��������������a���BZ�v�/�N�����5��nmz;�.c��lO�D?����LZ��	���]X!�,5C4t���-�<.t<j���]�����;s���L�O�.�������T�K�K�M���/|+�����%��Bs�n���)E?,�@,���}?=��	�U!������L�[4lE'v�_$<�HX��wg� �&x'6��P	�����Q�(��������F4�	������\g5��_��+3��zR4��U��|���@�#�Y�V3������YF��|�>=�X&d-zr����az�h��-�)(�tk`wV	+��S}����I�6lwe� �����������SUgk�k�0�������g���E?�s,
�����P���[h�-���7���$��n2����`��;+�����,F�p�i�l��E���12|$5^0E��Y���U������>/��T[��$vVb������
�f�
(*��}`;�	���U������`X/��tw�n��,l�a�b�X
�3�/�4�-m�&�o:������%��#PAg��{���]Iu�����`�Y������������c�~��f�c��(�Jf������z�B=u��~+�����8�D�b{:zS�zw��]�����.��t�hS�[2�����a��b��3�,�}Z\[|LKtn�y���i���`��Z����B����t����;t��3{�Yx�����Sn0�=��r�O�k��Uh�^��%z��8M�`'�-w��-��:�L�F4�L{Q��[r�z:$�]Y�]L�[t���gGA��[��35k�
f�JE;y�S�6l�+z���`��&�����0C��|P�������t�Z�+�W�H�F�����}�R7��`�
���D��`yT��m�i8@L|MtN��g����������Kaw&�-z@1������5=1t(j���pZ^[10�4�O{|�����6��c��=��B�{v$��i�����/�q��lm���o�A�0�����#�J��n���d�E?�M;�}�e{��
(��l�n�kZF�������m,�
�yDC������f�
52�B������������iym�1m����4�� X�4]���=���`�B��v�<��v��
A�_f�[n��>�H���
���y����JD�`���Z�}�NX�!��Bo�n����Ag��{�������v�h%�
���nx����qv$��Y���"J��l�,�kt�J���+����w��M���i8��LFT4����)/�4U�����*5�i5re�6�`N��0��,t2�Vx�L�Y4�c
������Ace�����y�n���hxA��t�]]�:4=���w�5y 7����,��T�P�^^����9V��;P�10��<��;�����)K���#[����������VL~��G?-��h
K^����i���������-1��5�����������&��5,�v
5�v����p��E�&3�a���a�Q���Td5�S���i�i���`�����MF�iym0�D��K^[�xw(�4�Y]�B+A�xw�
�g�u9OS���'A�B+�aA��#�Y���.��o8��<��%��e^������^��F0,j=X����r����
���i6�������7!����,
E��4����<-P����}�o;
�=|�����=�,~����X(�j��r?,�SrE�B�eX�y0�N�f>l���0,.����T`���PuY��Bb�Py�����0�`��aa�?�,��Y���X����2�����Y��p��O�1��7��Tm.2��+�;��)�Q���A��-�2
Dx>�y��](��L�Z4��,vT�/�KC�(�;���l@A�0�m=ID���Q�����a�����/�P�5,��m����UR��5�px������J����`i��&�O�p��B4L��8���W�j���\��gA�}Xny���P��#����,�{zL��,=B4T���+�����A�/�E���>u��y��B��ae����EC�����c��h��2�`����G�q�f��"���>-���7M���_��1mA�w�^��]���q��*��r��a�#���fR(�5�[;=m>1!n���Kln�s�f;�����E4��5[���,��f/^��Av��M/��
�6������K���6������u��2V��x�>����]zyl�0�p�L
@(����F%�rxi�
��u��m��U�f�:�g
�������aE�����y\��J����4!D��Vb��;M�v&�������bK�|���v'� ����{�-(m���/'��^�`��4U�@�ey9\h����p�EX���4��i\��#�-��
�x�h��pA�3��.,���3vO+d��	��S�e���wn�t9�W��=K��`���1m����h��O�����X�U������2���:-�9����6F�c��o���,����o�bap���*4
�������+���I����<B�������^��������a5
�b�l��:a,K\q�[L{@����L�"HL�};o��9�{�i��3���X�Zlc
��"��%��E���U��[�z@��T�+����R �#&b�5������/��B6a`b���a*`��u��y��2�J��EiX|�T��a$+�\Tz���x"�B_E��&����9@|9\$��]]j�0L3�S�x-���_4S��5
��z�����J��~^a.���������o����|��Hv�P�oX� *���ld����`�xZ^1�g���k�68��t�yhii($$z�V�RWR�,-=��,�Bx�H����Z@s�����.4����H�3kd�^��0�-�\_|Z"�O0
4������>OOi�&	��3o�	F�%.��L��|���{�L������E2���~I���������m����n�
:u��
-���pU�	�w=17k~���F*,�����K/��=�Y"mX,Mj������vzL|��[�������t���`_xY�64|e���;��e�i	�hfH�s�H��Y���0���I����bkJgQ���"�j�,� �lv<��4B�q�5���6���8�fnO�@w������Gtz��p����E��]09k�o���lV�?-�m�,[r<n���0c[z�0�K#������Q1|!�eM���5;�Y�Vg-H=`�S�����d�ZT:���N"�����3,��*cK�q+��������I�l��Q�2_{��V����ni"KkJ������`{%���TNl��?
g��'������������d�`K�k{��Y�Z�x�s=�RX���f�
��B�I,��Lr���R�4+&�z�42�^�*��O���bI;ZLK;Ov+�0'�X�@�Y������4�)=Y��i&X*6W����T��D>Na���:�	�����Gf��i�c>n+�����'�i�^����<s���Tl�vZ��%B����]��6f�������~�2��e7���0;�-�4����_$�uXdH�,�����'���n,����[��������}k��� �j�'Xl�������N����4���U�����/�f��b+_��'3d�|�S�W��$:��I���~�i�����r4�J��.�wi���#63�%�����M�����e��Q�>,9�������'+���H��g4�T�rzL�OL�Y�/�����t������y{�`jZ�j���Zh��l�1-��\[�K��p�J9���'Sw
U��
���'�������iq��|���@�i8�1,�.�"�8-�<�{U��{�F����Y<S�J��i�l�t5��y����r��L�I������`g<�Vc`��4�Sa��G�����6K�2]��NKOVe+�a��������������J`yZ�wB��2��G���T�K��H�<V��,�@��������i
����D��
w�`b������?��Mx�
+�����
��`�R���i��	�J�L/���/�1���9������6�����}9|{���p��>�d�g��K9����,��j6=�iumy1mB���,}�"1��*��h�L�3C�e����B��i���d�E��}��X?K��3�*s.�����0��n~k���J��z�dh������C����`{J�:M��1�M$�������f���9'����:�{B�C�/��Tmi�o3h��S,�	�&g�t����'�E�����{���E�)-��kY��I���7���v>���q0���.=��X�Ql�FOOi���`����V,=>��X(��V��LlNt�I!R��G������x���-,��E��]�v���������bS
v��+����j
�	=,�Yi�Yx2�����9yZ"[^���4\��@J���Lmx���������lv������KT�~��:�(l� �3Y"O��CdZC
���-���O'�n�|��v�|wZC{2
m�����v�-m�m��Mt%@f�mz���=���O�������*��T������ZT�������bi@.X1�v�.�j�����dp�F�E�d@E�B��iu���rEg=��p>^a8 ����[�]U��0kR����4����'S2MKF�r0b[r���G$SN��k"X��(�U�W��{�\�^��;�X�h\��;�;X�����EVA��/�wb
��EOOiK�4���=��{�:���~c�w���j��������������*��n2~��7wK��z�����"�d�����Tj��M?yW{��I<��ubA�	]kA�����<.�]{�r��`=�	�r���Pc*���� A	�K�V,�������t���V#��K��n�_3�NKd��ip����`�2�q��O#Ts|��=-��P�%��������7�(�Vr�,�=��E4&+	W������a��$�a�p���������-�������K�����.A�B��iQ��$E�&�b��=��4����V��,M����}��6h#�����Z����L��6T���w�����d2���f������������D_-g
�+i����]��6�k���",c)lz�	�A�'������� �i�	��%I
M�`���r�YH�r���.
�c�8X���Yz��Y4Lj����`�LH����r#���dr��(ql�7fM�	�����/�C
����4��4t$���%�',
z���l�h���T�GS.x�,�=��h��-��,��=�*�Vpo����:�����sY�z1W�i��'&b[����H���Pt�g?u�eE��$�D�tm�gvK��Yqz�����s�l�[����e1�l�\�j�9���������R��mxb_��a�����������w\K/��{��)�XI��>:
�<�"���Q�u�o*����~Jd����bVq&���3�@����V��������Gf1�_��yDY��|��o��N��a9�����J��i��$��,�L�eCB����)mI���������Y�5�F$������uY�y������x�����SH,�Tb��N3[9l��7���s���=���B��Z�Vb=�\�v9���3�z���GY���VP]��^�
(z�
��p��^�	�1���'����,v.�M.������f���P�P������`��[ln�}Z^[���z���Y�5"�R���Q��?.�S�
NU�2����9`�S�5-Q�X���^��Z�{A�T���0Tl��|���E��,�������t�}�)+8���/�������Yb�9}��M/V2)��>�`����-t�X�7_��\�����%�-��.��(_��z$��4�����������\��������F�n�`�<��1mO����K��'
������3�f��b����n��@���M[�iym���!����.�b�d����w��%X�N,,|�SI�i�l@1�l�tK��Y��Q	Xz{��~�)�gi�P��-�e	�EWu�a�S���)+���K+d��A�d������4i��HM����6k5i�|$5i�2(&�������vq<-��6hz��Tc���<M���:��5'<2�l��M4�0.�O��N�k���=�~�w9��l8M��S�0
�{Z�TzY:w
�n���`7+����\���4wV4��%�\qwY`y�ha��",�{6�)��K:D���9�Q/J/����*��v^L�J4\i3L�+/#��:tY"yA�%��|�W��`���X���9W2�-����^����`s�{�-�f.k$/XM!�ah�K����x���`�����-������h�u�A@����,��`��h�geye�D1n�$kY^9'�\^h3����Wq�{�A��-|�V�^����uX:
g[�o�%v�����I7�>���VHZ�����	d9�����Fl���������f���������c������������`aG'�V�,���kiB�w�o�5����`i����=c���AwV�m� �,'����h��b6-�i�6��US���u����
��imf(?'�V���4�`_��/V�#��������D7h%hd�����W�q+Y+��^��":	Q�����	A���`+_�-/h��GO2��j;��.&�+�F���
(�B�'��@��(�Dp�=~�o�g�������,r�r�F�1A�����C�4�0���v�B)!�9
zZ^�!L/X4M���j�`�{��.<e���Q�h#�������
X3J����@7�d,��q{%A�2�^���g�$���>p�6�?�V�f-��� sW���0�1��1wZ �{��.��~v�~��-G���[������ee����������.��/`�&1V��riYMzAC�4|��)v��7�J�*�Y��r8)4��!�����v5t����O���db��w�>���T�e��a�`;�D$
���W��������>�S��]�^�#^V��.�c~��NOi��	�����{��!Ukg�q?���X/��(������S�����4��Wh�IM��m���S��S��4�+�]8�-���/G]B���D2�F��m���*�E����m$67�gw�(j["y3�d�����q�mu���Y��]h�2�5�������W�����^\���*�<�5"���t����=;���������e���2�����O��bo���
��,w_�.�����Y��p�[��{�������VP�����P4��u�<�?�����g���^^xT����b���,K�OL���E����V�����F�"4;X�4(%��_g[�z3!j���u����!������Z����Y�Gtp8
g�
����f"���������pQ�E����h����ZuzL�|L�Z�N��lg�fS4���6�a4��;�	(�E��6�e���\,�������t�6x=�n7=�eu=~�t	8���T�o������LSZtV��g7�����Z���Y��lR�:M�6���]�
o�$CQ���������V�n�$o��,����]K,4������bY��������N�@�;�UJ���6�X������V~�@�fD4��0�?��.�L >��D},��,���E��B�G���f��Y���\���e�Y��
�`t��D�����m-k�MA4��K����{��1�e�_���^�a��\�0��\�:�����J�f�vb_��h��>U,l�*�����w>.G��.��X���Qh������!hX�"vBN��)����6S�!/m���o��=�B��d-��=�N�k�z������o��i�6���C4}L%Rc��\����Q4u�J|��N��qS
�i�li2�n������w�w}�$9=��E&k$���10L���Oi�����E�t��������D�3Kc�b��l�l@��1#�`C\#Co���O������������=2���2O�i�	��H�X����Q�$�Y�Fl��xO����ln7p�����7�lM������bi���-�n�~o
n
�����E��j3����;�(�1�T��VB�V���t��
)�W<V�����3[I��jw.)�N�[U�v��-D},�
ED�b���i�6D`�q��=�G��:�%��\���
�ZA7��;*9sV��D�0��#c�9��or[yx��S��j�Y�	�4;R����6%���i��l.�<M��:��M7��u�>����a���`>��3�IL��� ������`;�j�J���7��
Uv�N�y��=0,���x���X8(=a�A��	�����)�I^Z�B�m��
�n���w�o&4.�1xd��X8t
K�R�-�VXh|3��m�q������m�n��O4��!�CW{�x��7��i�l�A������ly�
O�����7$��������N��"�fQ�����M�h��
S�����'"ze�0�l���pa�j7�m���N`��
7�v�k�G�o�/-�Z�7y!O�k#��U����b���C�/���>ze���oA�j�`'4���p�t�K��
7&&^��~��Lm������� w|gc�0�_s�D�����3I
�t�]_\�&/I�=%��V��&�27�\ ����5���aB��=E��7L0
st������=t�KL������1�o�-���=��M"n��s��?-��c�4#Ex��"|�6���������y���{�"��J����j2;��7tcJ5��������ROL��`+	��LNY4-_���X*g,�w�9��^��"�rx�Y�����"��[dC����%q�k;�{��7�R���E�������q�b,���v�P�a���b�h�i����!�t�L���S�����[��Y��g�����/��X�~��P)gi������$�Y������a�@�����U���s�4�J:�%�7���*EH�����;�W�����%�7t5���L#��n����9'?�i�l��k�i�}��XQ����I�AW�=l��o�i���N5� ��lV������)�Se#�$M���Y���w��f���?~Jr&��7c~������n��_�~������4��7�K[���L���o~J������{��p�eE���}a���D��0�t��.���;.�4�"�fGJ?-����7Ar�p���xe�k���~H�{�7�7����Tf�����r���d"��wyy�{�h�X�9��4Uk�MS
�1���f���Ay������� ����i�Aw6�~���M��0.����������mv�� ��Oi��_M��V�L��w�H����/�l�!���b?�~�(��IW���_���6B�h�[��{v!w�YV#m�>�����`�E)mv$ZnyC�C���.����]���B:fY7L�{��r��(�hv��2�*���fJ�4����p+	v@�C�Y���D6�P���w��C�w~����t���[](��[1�>����������">�L��w����?��.��ezAC�,|�ec[�e�����������K$}+8U�*S����0L�x���](�w��9�?��E�3��V���'-�0;�7:K-�~��0�#�{����J�4�z���(o�lK>��c�6�`���eP�R�B���K���P
���{�vRH7����=�Q���=,��}�����[����`m��@�-��06	�S.h&mv���^m�����l�o������>��Zv��=4>����}m��m=hh�����l��>=��	�Wc��:��(q�lC:dfs���D6��2���BL���M�Un������~���
t������)q���6��
��v�����f����V�9�2IMCwp�����`k�����	mR+��W5X��I^����|�K4t���G���A����!��q����%�</�v�������2�������#��������lK �q�L��,�v�E�SN���
u�?�.��/~9��`�m�jv���V%��m��(c�y+����y��m'���0���`�	�mK!�^��������u� ��1�|��>�f���~����H7�a��F��z�+i6���97���j�l���h��
����4��������sz|���j����`�yK���Z�*����Q���7��;JS����LwX�b����t�����Y�����l��0�v�j�A�L���v��V��i+���3E,��Y94���n�D�f�2KK��$�*{��'X� �bC�k�0*�R�DwS��6Y�I����2�?�
>��/^96P����G"g�Z����2�������I�ba�X�r>q� j6�M��),Ix�J��<�=��9z����I�����������M?�����
ba�@�6����6R�4��J�e�jCJ������`�:EC5�`�J|x�B
���+#�^��0�'�g�m��o��>Ih��`��5��"�����W���{V�pqC�i����=��@0�Z4�PM���/�0#l�Sp���l� )X����Y�@�se?X6b��g�2��X#��_�����c��o�x_6&�t)r�lM�iBC�\���c�`K)w�~��BZ����T������i�l�TI3�R,��J���x�����d�i�t
���0K����I���
��%�K}@
��ekV�-U�c�S��m���T�^����	��03����B�V6�ms:���{��9���~+���c������0�D�}���G3R�5�K���9��_��N����N��Y�����GB��xE�=���%��ofA/Xrl��?M��
�	�`.��h�+T��)�9�3R���t����9C�j8���*�X��aB����)��oS�����6�1{�Y?�}X:����:��]'�BG�X����y��c�bX6*z1�U���~�v���������y��w�����g�����uM�*m��K�%��/3��}�u"�h�:-�����,�����j���>��!�6K}P~����KU;�7.�55��T]���(��^rZ�����)C������=6���w������l����9f��bO["���=��LlN�>M��"���
.�����n�r�7�����1����N�KK%9������}���XN�X��[)�y���@3F*�t��<���<kx��*���,����|bNv��[���fY��hi���
=�$C�"�B���v�,���W�^,�!�m���Z�<�����RtE��=���g[!u���rV��N�L�K,T3��'Ks���t�+����Ygy�+%��������Dox�����(�u�x�H��b�&Q��Lmx�D����������M�����i��&X"���{���
������,��l!@�X��aq8��b�=N���k�%xa�E��E����`�+����=�J�D?�="�`z$�o*��l�}wX"�?,%Pt���c�^�����~���s����Y���i8��LWT4�_�^�`������iY�VO��j��,T�;�����ss�>����z�t����6��^�:fd���+���6���X�.Q�^�~
v����c�~��Ao�	$�Z-�0-9�0�a�,}_(4��:�<
~�h�h��G�SA���0
L6u�,��V�}X��h�.A.������������>xK�C�X��Y,4�4lA��i6�`�Q�,uS(l�&vAc/�^h��X]���]����j�<@��	�bsC�{��Z+?�5�~�{�����f��4�E?t�QfT���Xp�a�q�{�6�����MC�x��:��j)\X�'�M����|0���WX��r�Z�a�s�a�uW�n�}�����A�L����K������HG�+�E���I��D�T�`a�5������>`�!���{�=�����d�����kU��e�XN4�s
�eM� ��X5���.��T�8\9�l��ZW�leel0�^��ec���]g!\X.z'��4�M&�'6\����������x�>�xxF��/^���H�� ��X���n�����=HFL�!m�@�2���ZN��"����l�����P�����lKo�u��(�N5N���ai��>����52|��P�[���X��a%��7#1[h��X�����ZIA��),��T�L�:�O���t2������1�T�)�v�0�S���Ko�S������|�� �X�����_��l��3�V�}=VY}`�<�R��UV��|9��W�G;���_�-\g,�JkE��Z�L|I(�����=��-X�"��BO��B�4Mp�a g[%�f����=��G�����qa0�\5zX"+�R����[_�{vC� X}
�
Y�y+1=��>P"h�����Il�G���#�s�hi�l�\�����$H��%*[h��XT�a���K�w��>p�f:��Cz�t�XT�Jl)����56��������lNW�.l�J���Y��Jb���l�@�B�0�'�R�n�����*��S�Z�q���Jh2������(��L�Pl������:��I���a���������-�;�4k������%����]EoxT;��V���I�����7�����5��lES=�`���7_��1m����_��w�6K,��:*g�e&�+��-I;Z36�]zsl���ka�
K���[P������^0&(]��|M�g;��-d�~��{u��3���v�o�Z���-��k���4`���&���,��.z����7=M�y��t
�����V��x\f��y�5������v��.�X(��+���%K�����t�N�-�X�P�Rlg!�����C?��I�L��a8�~��=X>���V�4U�Vpoz�/�y�u
:M�'�tEW�{�p~�z���T{��K �X�,�����"X��9��2N��C�E%>V��oB��CA�b�)���C���%�%:�����A��!EO��#��=k����i��u)?L�R��K��i��=�E�������Eox���c�b�G�n#:��������yN�i���nU���axC�H���p>�Y��h�'��-��>V[�0�E����e�L�0/��R��f�������d��x<2�e}���s����lOG�iym�0AL��Z���;��������U(d�X����D��!F��6��)tN4-��!#���R)�$�����h�'t��OK7���P�$������R��DA�v��,�n������7�rN�8���LV�`��W�����U��~Y��Ty��MTx������,�q���L�UJ��%yd��2��'��w6��Ft��eE�b�)J�� ��������M��6������\s���-�	K�M�������=�+��p���+����	/�g��������W�^�a&�J|�*�xl6��(V����y��	�G.TH��I���z\��0d$�������%o�A��
v@K6�I����*w\�b~X=�hXn(6��,�[(��X����8E�,
�b~��.�~_�����Kl�.�V
�Y����<E�J���8?� R���s[4
��BG�D�)l��>��
���WZ!�
�0C�t������ *�CwS��_����sA��c��S.��*��}����p?p��O+d;&9�K��m& *�M6�i8��,�[4t�v�vU��:�
����#k\����������A(UL����0���"�S�i���5A����i��)n����F$M�U���z�f����V�@�u��F����~g�_���������(�&j����
�&�!:��N��l�~��<������V������S!�i8�L�S4�h����%5����pq4�oj|�.
l�Z�c5��r�G���������6q{�/y������]���XR�V�
�p���vf��|����.z�-!
�w��MC�fi�{�s|�:���
�U���L�j��}���g_��[1E,���9��.����}����[@0�_4,V��H�$S+&��K?��*�n	�_�<n��d��t��*���~`�MB�tU���Y3�1�
:��}
�1>/�/O$�BGE�P��,��h�C�z�h�=`�Mz�06=U�O�U����+6,6�����=<��Z�Q4{�0�Q��L�R�L[�i�l�1�U��������F���������U*-�"��?������p���5�	s1�V��VM�0)8�� ���)5�\/tT�n� ����RG�n�e	���1e�[�4+��-/h�����p�f�\=�w/X��a�4�>�k�@������F������`���a��K�#���l>���	�"�[��N��~l��+l�V>���������z�G���d�2�Zoy�
�ebst�r��[���?����,��j����zb*����$��t�;M�v��:�e��.	�$Df��4�D�\�`���D���.���=P�Q
�0@��B��c���9�����{�L_Z5(*���O�����'���q7�}��c���}����B>�k���y.E��\lo���
�|��is���p�d�	�v��������/��DC/���#�|�����ZQ6�0��Q���|f�Gl!2�Z�����*vw�S���;-���s���b7+�;Y����v��M/nF|��e5�b�;�uZ��%��I�.Q��<�ba�q��]>��B�k����L�,�N,���Y�A��6��Y\�e�\�P�C�fBSb�%zL���Et��U{��d�E��V����~� ����-b;���,�sf[��-��|-}���I��*��>���sf���jSN�k��i��f�[�o:�NS�q���E/h��e?�	���/�X�_��;��-C�V��_���L�Kt�P=
gc������\����E�_��	
u��,p.v��v��h�h^����JMt���`���=�
5�u�_��Yw���[	v��<�zm����}Z^����tg	y�U	��
�^k�W�@}�lCt~������B�Gt��J���T��(�m���pk���OS�����DOx(���-t	x-���Os|9O��|b����Z�i8�O�5�Y�D���Y��[�������8[��}-��2q4��"�.���6�N4l���$��B���p����Y�a��B�V�V��]��,�
�^��	qz����~Y����E�4��G����4��"A���O��M����h�&�+�*vPjdB�v���kY�:����������WM=��,�����[��=[�Cl�0ei���:guh��$z�x����������	�U��V�~a����)zQ�J��=n����|4C�D��,�N����@��Rl����(5����3�Y��.v���\�C�g��J��4�6�E
v�5?qrj���&�]��Z��FN����QK4���[,���6���i�YG�x��l]���r9Z��$�����%�_hMt��g�%�_�`,�2$+
�`��������-|�~��+����[�����	�c���4�5�����%�1���E�J����_�#nYbY���sL�0���d	[��������y"t�X�lAO��7,��5!nE��MR
[Z!1��Tg
�-�6KOO���q�M�����X��h(W/�&Mv�o�"���pU���9Kp�L�[t�	�ba�<�Y�>�Z����X�P�O���)���t�[y�l����a�j��,
���.�`gA����9�=
z����_&l,���9
g�	��Xt�p��p8l�*�)=�vXI#���[Yi��V��\�r-{p��i�p��fM��`��!���)m	�������
,L��w�!����M�42�?k\h�K�.���Gj���	�����b}��{U	�[9���EX	����oo������_��
����Z�����i�#����
}O�iC��=`�A���;����k�-%GX7�����7�v5Km�`+�����_�*���KkM4.���-c�5�����ba�Xh�Kt�n����x�,X�B�x��Slz��Tm/�B���0�F���`t�/�4������X���h����n��q�p�����`G�wa����e,t��`�����J/-��T�]��������q������{�������&�v���X���������\����BOx�
����y�K�q�)?���b=�&���O�N��"k}�aNd������`���i�R�)x}X�����:�k��9bt��T�xzL����>1�0WU����2|�)f��yO�i����o����XN.����$����O�k�������p6P�a�e(b4�����b(Zv�]�#�Z��fzI`�2���0�n�%��03�Q�������H���>P�����Go�4{c���s��i������4���.V)j6�N���c�Q4T!�����f�t�Bt��m�oLo\�d�Kb3������\�\6�7��6�j���]]�d��G-�!���}���"��T������f����r�(Ac���%�{\�Qj���n{��������Yq��YrxLY7x�]��m����o�YX�,�����I�[��5�IC��h�U+v�����d��>L�w����6K�7�dO���b'+nl���	7�B7h�Y��G.�k�E��$���,v���i�6E����]��R(�v��h\���?����,
��(��\�q���-#H��1��l�������efu�*����E���X�f���	���|:��(���#3w��B��f��b?�w���,H]��x[6�
���/<=�+h%I�����YU�A����`XYV��H�hX;��YHM��.�`Y^��V�CnV�m,�'����Y	7�a�NX���Z��p��'[X!�6&�+�~�B�@��Z��/�O�O�V��:�
�V�.���.4���as����6b�x�h��j`a�m�{v����-�+n�xQ4��[ih�,VKQM���oI7���vb��s��i8�N��Q�����F��9�4�Xz�k��X������r��}y���4
�����,�@�S��1m���c���U�Cm�HC���W�
>�Y�L�����N���Bu�&t�4��S�=�V��������`�[���6\��1����5�wm��c����yS�����*`9{���7yc����}_�,��i�y�f����E����0�"��~�QH/TZ���Z�
�����z�^���g�[C��
N�k���}�.��h�Xn��Q���2I,�k�i�6�`�@��G�l/��4�3�n�w����S�4l��_��J8����iJ��^A���
����q��B�v��4l�(z��D�O�E��s6$*
S52+Ike��j
�9���6R���h� ��0T��7:	pW2�,������O	a39X�4�,lR+�t��w�[�n��4�Y7xM�K&�]t��N�i���
�^ �*
=��3+��p�iym�2�?��`	a�g��t���D��o�4��6VIn�K���h�=���>X(Mn�P�,f��}*���0t��_RJ.H�5+%7hP�����	�.hH��rVZ���;�����X��J����`�J����s��������\�~��-X�!�4z�bz��t���X"�L��l�oe��D�Eo�
vA;?��X~xLKB���������,��-v��+�	���Z��o�`�����#�XV�/vCWR��R�a!��0�^��J�p~�/}i���3b�Ks��T�[I���uc��a_V����d*�fS��i�l����o��|��K��[:��1m����_���lz��_)J��_�B��5�B�j�ib��
��������������6���}��~\_�����j<�i]�#�K�{��V�j�1A?LV���f��r_�6s�9:AS]�`g:pOS�	��I��H�B����p�dy��+�]���	��5����/Q�\0�-�����>���z�
�P%�3�����W�5�A"�b���}-8��������e����h����v��-)�U~["0�S4�)7w�I�f��+y���mp�Aw�{
�S���l�X�z�����b����������>�N���
V9[�>�����Y���x��42�H�^����~�'��iymy��_��=����{�pp�IR����]��,�����h�!,}�b�B����9��r4uM�3
�<k�w�b�u�i��.6�o�]�L�����{�nX,�L��&��-W�u���
{�������[{z���	� �7�b'���b$[0/���;Sg��px1����^9=�������?��@��sg���aY�,�MhE��[��3qf��PX�-u���M�N��������a�'���p����a����;t���Zl/t ���p�GbB��	v�=\,����,���JW����xe���[�.h�t+w�,z%'�i8��&���R�.��?�[��X������B�n���g!���DO���YF����9��d~��og����Q���k�2����9-��h�
��B!O���~b&%6��N�k#��7���`s���1m|���ix�y��|�{�)d�t%�~~�_����2n�d�@3�=�� �,�NV�*�)t����L�M4���e�B��9:=��Ex
5
��H�i�6�X����y��B=b����~���`dQ/����^��Tm���L�o!��-���w]tv����Q@���������}��vD��A��:���N,=�4�B+�n�����EC�|���n����D���\�4������_�.h�uK�R�����;=�i�����/
���9��jg��r�xp����7� #��C4k�%+6�z���g$.��+�F�O�"b�~
����z}^��D�����Y��$�i�lN0Y8��ee��,YHl.�<<�u�;��Kw����B�l���l�=O+d�V��;

����=�/����8������q+?�
/���au�b�{���������H�[��Vw�,�4���0�X��T*�V��h�L�E4T���h.X	�;�t��������E�z��1n��N��h�J(��;�=��m���6a�X�0�J2������I���"�Zd��W%�a��M���.��A���Y�V(����{�����'�Kr����hq���h�}I�������9W^"�|��Bt�w�`�'k���G���9��r�H{��gY��L���b�@�V�r��������J���0��Y��2��5�;\p�Zw�3M�PLl��=;a�@�O��NKd�Z�]���U�%u��������6�`�|���KsE��K���af���hl�c(\$�|�k��i����V�h�:
t@�d�z,���������\do�L��:B�-��h���[t�o�g��s��Y���AC������[�[������B��n��N���a�=k%���
_!u�|�6��S��N���������dc���w:�N��t����������<����q����NUR�0�_R�0Y�l!Y�R�������x�>����1����|q� :������^'N5�.x$����=��^P�9eO���6,�/�F������1m���H�I�n�����MC7m��~�1nA��[(vH
���M�����{6+	����W	z���`'t�������eM�N3"�00o]h����)K����������Q�~���s��37�����g���9�b���Y����O���d������/�-t�����94�pGBaL7���%k��t�ES��F�	��<��6��$L%0_]�DD�H�iqm�B[1�]�bS��i��3�,�4���(lh����M�V
�,���ZB�����5\�Y}L[�0��4��������F��
��)p��C�6h�;�]Gl*>,�%�i��d��w��a�O�����V�;*>MKp�����E>��KS5kL��wa�l�B���-E#Wj�-���a��dY�:�S^�x�E����Jn���i�`�FW�]�.m��[���w�f����l��h�"ug:���%,
^���(w�wW���4�D���l:(�l�������il)}��6�mm�a1l������b%cbsH�����U��e>��cfSi�i�>^!t$����V���(:'Q���d�����	��'f���*�� �<,i����	��%v������]�%^"8��H^��p����S�Nu~��g���=�{bs����.//�c~id�],]G�[p�
�������S������2)��)���
��CQ�a�uf�h��U:�X>��t�;
g�����~��L,�k��-��2���-t�Y��
EW�����w�������6�4��[�b�9�[H�Y�����~���"b�C��}��E��
DCKO,s��,��,��BG� �2��>��������nh�>���lv������7y��p����U�d�gba�R�`	[b�l����i����NE�������`�/�a������9�H�}*Vk���.�e�"����YV�,�)��q����^�������d$�&jK���
�����-��U���p�
v�;�iymj�}�#�\�>�D�,Kd�CT��J�����Je1*���������S��V��}bE�B�pX�~��a�L�@,,+���{�e�Wbg�J����&S�7
o�ip���aX�0���S�����>��?X�hV�,4g���������4�0`@/o�4��f�����~���'�k��\�6�E�����j�D���l�K�N���1m?A#���K#��:��g�������F��=`HDm�
�~%��\r�� '�^�6�������b	��W��sX�@�U�0$h)a�������.T	K��F�������q�����
�?���>8V(��(v��]\h'8�-V�=[��V�LG\tE�jX�}�"p��=�:��5� Uv,���Ut�~#	��#D��{���������iy}�3Ey��/I�)��e%bs�����`j��g
���1���+��).p��e�a/��j��E��,vp�R�^�;�������EC�P����\����Elv��V�����@�MJ��W=M�6+�������-6~��m x����z/���~�N��s��{�f�H�������9OA?t�����U�3��j��5tZ^PL�Vt���`��H���u�.��
K���T��?&I�J������.��`�����K���6w�
���/���Nxi�S�������� ��.��Q�����VPt���xuz��V����V����[��R:�)�dy%�j�r�aK���.~��Lm�0iY�P�MlV+�)�zzL�0�W����*������c�\�gs�/L5������)fvzL�0
l�V1b_�^���r+��B��a����L��z�����gs���S���q�);��������J
E���J��������f'_����[K{���'ti��Zu��mh�O��������=�
����L��:��T�7��Tm������{���h�J��e���I��R�k����S��p��[j���8<�������p�aTl�1��V3�=��\9���<�f��
�N$^�|w��������7�E5=.�k\���y����;K��K�}`�#����Y������"���Dl����w9�z��w'
K``�����q����D6
`*�h�����9���L��+6��<-����,���GR>�T�[�x�M:hXX,l7&���h\��ZjH[0��<`�!h�n(��)2^n���x����� �c�#��V���a�.��g�c��L���������5��k��`�5�T#�29�?�7�Nk=x#��s�^3<@5�����&t�]���n����>��'X��F#�A5����
����{6g�����>M���N��+�>�0.=O�7q�������zx�
)������&���.�#�}�l����n�dO���
�����V�Q���'�7
S��2���^x?1����D����^^������GfG��B����s�@s9��
9���)�	���S��i��W� ��ey���(�u��a�1��%z���i������pXe�\�1�Y~�Yf���Ob��X��n�dIR�+���"���
����T�������#~�/�u�hc�[�^��M�p�z�
D�\��� ���^�����C�b_���9����]p�Lk.OxM��qJ,>
�����E2��|s�����r���V*6�'8=��fh_
���r�|����@6&�����e����{��u�/�����,gy���ii\�g+��*������
�y'K��X^����&��t��a�����|vZ�7�_��V�Qa1
+��v��q����RD/��oD[��P��h)���OEO�$.�)$�O��N����,����,g��B/��B��im���qE�
B�}Nb+V��q'�������P}8��;��i��#vR+!apuW-f;-�%jEo&�*v����m'+D7
?/��r����/��@���L��.j����5�,���j�����������a��Xj��&���6��d�����b�CWWn+��oh��%�V���s��?l�JZ�|+��g'hji���U��c����������k��=��o9����-��
M�!,���0u`��)���-4��V���=�������I����t��1���Wl��]0��Y���!�t1|�f�i��`���1,��Y��X�MV�S��7��.�
-�`wA|Z�x2�b�4�%��J����ZE��K������.�le�l�@GG�nF{A�aZxB�N:�,�^l����r����d����M���Xh���h���%����h��.�1��q�O#U��#�R�������VG������!��.fG�4��Vd�c�&�������~b�N��h�G���oE�
����[�0���D��V4����'S��������j��f�Yd��D���h��a�A�$�|�<=�M>&�7-�?������mh�vXI�qS��iym��*Z����%�'�J�� �4-{<a��d���7V����2n�8,���'�=�����4�(ZC�4��0����g{��NKd#�NDCT�9?�����Ks�o���P�iumA����+y��L���,�Z���`;�i��k�s{���
��A/�������,�����
l��k]k��!��d;[_z2}i�&�������|�$a��U	4Y�zB�������4�m/&�#z�"J�K3�f��\��V����4�J��*�^���-�`'/�e������_�Vj�LM���.M_�n�m�b�[�����f�n��\��=�)�}�b��l������F��+�l�ay�x�70�MN�����2A����j�PCK4�.��=+��m������
CB��z,��V����8-&	���h	��:�`�j���$��O�������>P@��$=Xx|�|����(M�	6������e�'���������g�� �t�4�*_��ExVKe�+�T���Z������~:���U�'4���N_����Q~Z�����$�E7�k�o��i�6�`Q�h��^j6��`������ ��������������8-�->��
:��������F���������<����%�rU��:4N�}�u��D64�P��oG;�?����y\���q��wZ^��0�h���`Y�|�J��a��i����i�
�y�����i8A0X��Gn���tUn6��0w�Rs�vt��r	�l���nH��j�*� ��O�tnNs���Bv���$^�K���<�oB�Vr����]�
_�*�Y
�XX�$��������!cD�f������NS�x���
��b[A�xY���E�Y��X�ZI�Z�
���_�? �r�Y��e�Z�V�����{y�T%l
����
}�����$�����N�M�� ���#6�"�l�c�s�1���p�Fl.��ga�?q�~�,X��V����I���Z�|�*	����xdv���,|'�-�]-+�/V�/����B����9^���
6����P
���_��U����:�
��f��{����e�%��.��a�!��t��B�e����E���=
gc��V���i��d��jC����^,�#�������2E��
�t�M�3���i-�>�U�S[������V�O�%
K?K���<�����_LV^4���Y�H�(��-��/x"H��C[e}��e���p�D����N&�1L�H�ez�B��e�r�-�fi�bw!:�,Y����h($i�%����|b+�K���P�O�[�g-K��6����o�_�l���i�N�iS���*
����]�������9���E�"���9�r�M�a��Y�X��h(xa�-O���1m�l'���{��������ik�%�~��[lA4sY�{As=h��A��[yL[#�<Gt�SU���PDN,��j�B�����b*����i8#,�C��� �Z���J��K�e����Y����e����R���-d.�xg���������`�c���lhY��2Aw�6�3<L���2��X�V�^��-yj� ,l�!v���+����%��������{6�n��F���@WP�:����O�i#����C�������7�����%6�4���D��y~�Ff�
ba���Q�q�,!�`&Z���lK��Tm}A��4�YJ���%m~�������A�]��DSv�L��P���,�|��Xt���&����+����+]�t����w�Zp.+���M)��/�M�g�&���<;-�M\�X4T�[Jf��8lX,�eJ�b��p��MMh�H�3�����9��2�[�py�l}Y|�&o��V�=�a�*�7e����"}gC}^�����q��:=�
M&.���]
s���t�����;d;z��L8��3��6�7U���=�6no"��:W�����z�4C1��T<2��
����Vg0Mg<���<�%�e��E������ly��s�t��
>�
���J����i���J���aM��_�n9�.�[��1mA�L�
����L��/�.��]k~;-�Yj�j����9�������a�!��$X�B����u��/Xy�����n�e	
�{����q�%���VL_L�Ft�e)�_����������[�~�`�Z���9��>-�-(��
�%��2�)�����������\7-]N��S��i8[A��t�E����g���~�B�F�� ��,���<��<��+����^�4Uz�0�'����4U���F9�r9g}��
�~�)���'�$uXyL�tLY4������/tI�:9�OK���$�\�QYvy��1�����g�.�`g�:=�O:Xo)���t����N���VlAmwY����L?���C�a���j�0c%�
8-�OghMO�`L�Y�+�K��,�=/h���1���.�������E��AC�J��r!���N* ����qc�����+�e��leK�v��nri	3�S�/�{��a�:X���� �A������r2<y���
�U��>	���V].	V]�����f8U�������@K�����H�
�Hd�n���[]m9�UO�k+^��n01"X(�.�*�IU�li�����"w��s9\�0�/��L��Tm-�8���X�z�������0L�
���U�7��E��K�(��m�=oV�f�UQ��v�=�0I6��d���V���I��.�b{!�f[�z���iVb/v��.�/K<��,7G�H9A��m^^8���F�l���g��V`�+���IT��:�b7+���.d����eU��L�K�S(����,�g��;���c"��Vt0���7S�
���>,� �e�ibs�i����l,�J��|�bw�����fI�Y���k���0�4K�����|�����D6Y`�4�k����a	^�l��8�/�������tUeU�A��Ttn=x�B-�[P�����45i%�������-�����������|���qZ!2LI4l�.��w�`Gr����t�H�~�a��-��l�[oh�]�r��3�Y"��,�v�g3��D�D�B���A��+x[��^�~X&�X�������C�ter��r������W�&?��1}���$��N�`�����|M~:-��e&�,�I���p>��Q.�f��������4Kp�*�=�����^�E�]/X�r �C��G}��W���%8���Bl����3h^)$�����ba\�?3�S�d���7��6
�����;6+���P�ZlO������F��`V�"����q7I[��F@
F[^�
�IkL�o$,�By����f���aq��Kl
K1�f��=[��[sy�l��[��O��(`i����D�&G��m��\y7\�yM��OJ;M��:�yMo�f����7<��|�r��ys���U���~�����W����^#�\�`���
����7�/
���}���d�}�����;-�MV�$�^1$�=�����OAc[py3EV��
V��F��K$��|Z"�^,g[t�NN��b����S
�t�T�F�����<�r'����-��m����i@G���6 �J�P�F4�?
;�m���?�.�����$�N��p6���<���������I��)m�J����0�f����p�l�@d[�v�E���Jo��$�4U��0K��o"�,���S����>��T�h&6"^���-+�X���^���-P�a8H����dJ�i��gp[��2�����������{�xpsT��z�k�m�+�����<���A���U�SP�����0�V����<-S��R����6D`�P�����?�K�
l�`���t����/B���R��Q�`��K
��s�J��)���	���
��Zm����l�7��������g%C�j�����F���4z���`i����	���]b�S�������n�����)���L�Vtc��bg�����	��.y�-����/��?��/n| �U
�,05E7x9[��Z�v3%L����Yh�K��S���_�F�$#�K%�WW��S���b�=��m(������F����L���[��=���L�'���6d`(a���G��&�{���m,���M���������H�~�����
�f��i�l@��f���Kf�������6��weIe�`|Y�x��{���(�����.P�����H��R�d�b�����R���
���q<��{���0�j1�!��Wi)�W,}��8�M�%�
D�j�S]x���*�"������z*�#��C2t�/�������J��)-���4N��d�aT�������/�	��J���7L[��������
,�ks��
�|�E�A7�%H��q�]�2koX-���p��` �B�����Y��r��E�.2p�V��:[�[�-���E/�8�'�Eh���U[K��Y'���6���4T���`�[��W�`s�Ce��������*�.�� ��$z|�C��I�8���f����E���>�x�D��4������b����>������?^ �{��$\\���O��O9=���$����bftQ�eK?f�c��:*��g��@��_��}��~��%��H�������NS�*1qM��O���`z��G��1;�"��S����^���G�_UX��j��5�E�7���=�bP:���.�A���<��~���?��f�1����_�>��z������`����i�S��@�O����@b�]�?����g������g3�Kb�gJ�n��/��l�Q���e�E�9f��?��	h>��?�mx����6�����6(P1��v��{���p�l�/��������h�>���j�'m�6(���4�b6��%
�F�Q��!�d|M����6�.�����~��H��@>d����i�>`Q`�tC�k�,��e����@)����iy}8����h���������xM�0��N��(l���e����m���"s����Q#r�����g3���)�|���$�L��}��b��6	�T����e�kf�Qt�6����d��������m�7_l:zOS���qL�(��u/o���|�Y����/�|�t�H���^m��`��xQ"��|�:M�6�|4=P�/���NS�}�rM��3�����}�fEv��e�A�j�~�*}7��k� ���5#HB�t%��l��(��k�������a������rq�|����<��>�Q$�����>�9V{Z [1Hq�tO��i8["(�����cN��d�oj�����.tKP&�3���������@��J�6�
���,T�O%����Az��;� ��-\������[�t�B�e��G��d���J�K�����VD����\���`�
B��1����&G�iqm�@+OZ�0�@,����&b������;����K��l��z��T�;�S"NS������*P����Hi����S���.�W���- x���2���`G�Y0m=A�Z�,���SI��D����	��S��g��I���^�Q.��#�"��)��i��V�4U��HQ���o�dX���{+����#zBD�������TqQ}���0IQ��+��m��B����tqM7h,[I�]>^�����4�R]��#b�dF���g2"N��t��;I��p��^a�)����|0����sB�wvV�o�f��j:������
����{�aB���h�t�OJx?-��X.t�z��>��/Kt*#:
�s���=�����s
��������x�'�Y���>�`�8�E�N�O����0�6�_=-�OW��jz���[yl��S��lO�{Z"[�T��
���;����
�e<��
���3�5Q�Al �T���Io)�����%sD��i8�������������E���{j�R��K�����OOiSV9<���������%jo�D
l%���������1�4�7�H��l��rZ"�mp������T�~oz���������
,���1�`��nc�[O�Y�3��\n�����"a�d�g�9GO�i���a���B�f2h�0p�SIPzlzA�9��3I���y\�=<�-�B��MMXH�l^N �WhQ[^��1g�������6q�������>��
6��8=�m\Xa��i�R���,��65a�|�a�m�
:��f����D�`a���e�����p�����9��S�o,�U��������HS=������.�
m�����J�������"��
/�vxk����F��r����V�-Ga>��eS��)m��K�h��D�QAZ�Y�����!
�7sK{\�����f�����7+��Y���-��eZa�����b�K�����uZ�h����jc��X���d��bs���l/D���a��L�7a�T��rD�����\��o��mL[V4�e�-���e���Y:�Y&��Y3���Bqx��mcd��[w��v�����,�sD?��
����,�Q�]uj��m,[tg�5������i��*��)���*^v�;���dNO��BY\���4rA�Y9���>��3�i8�mL|U�`�O�����X��H���R����E�?7j�f)��<������������S��i8��LV�d�K�0, FF�V��6hg5^���Y���R�����h�6K�6�� z�Dn�
��Mud�@�o)��%�lp������\,���}X1�X�n��U�Y68���8\��<����Y���p�3������o�U+�o�n,�'z�"�5�+)]	�4�����+2��J�����N	
��lM�t�7��52\�����"`z���m]z������RZ�g�5i+�7M�H�I��a���m,uC��N���������f5��TWDW����aaC��pk��kc9��s���p>3�m�`b�U�4U�7L~Kt���Ra�R,4�4���sS����|e��t�{3)@������,�V4�j�R~�i�>�Y���2A��0��Y���O\0A���{%}NI����o[�a��w��M��](�ixm��tnr���L�Clg�&b�@��K�^��a���.�
��c�M��Os����z�P�],���Y�K�4�lJJ?���6x
�
��)�t���6&�+z�s�e���j��+��3��Y�����Y�r�O�V�����k��e�������b������jC.�cV]V�m��:_���WA��Y�
����,S�	>����Vxm��C�
���vx)�r��%j<�)�����J���fBsC����$����V8���T���A�&q���Dc!�{-�W7����YC������xkFzZ^[��8
z3%E�^�$:\I��pp�'}��1��a�D��A�������g��Fw����L�yc�Q�OJ 9=�M\�t��n����sD?ta6���Y3�[���)WJ�,�����h��^ �����q��[(�n���M%D&�e��S�����++Z�������W"��~��J�����B�k����L)%W���;n��Pr��-�T���`o������x�,����|.L�"y�B�fy��<�l6	�~$��l�;L�b�
&e�7���V�X��,�7�:M5�C�.���R���.�T���6{�N�k�ZxA������MB��p��L�Xl��I�w���pC�]b��[��S���
�4�
�C
�(�.�{�����c���6~�7��Z~��-����6d����ap4������Ybei�eZ���������g
�P������9�jiiz\=����(��������f�.5�i��--�gXG�q���
���Z��b�R7��.}hX>"MkX@&�b��tczv�;t��������
WP�����VL?x���(� v�4kK������d}h��t�ee��r�>)<Cs]�����rT�[[1L�Y�����v���j+�	������4�X��0���o}�Kd�����Zc4[�y}`V���6j��q��A�� �
=�3�]d��FQ����r�F���<�u�i��Z���l@�4|+**��������k�:������/LA��+Jr��mL�Wtn�p��}��1nI���~S�?=�
�e�>4&����@;�!���;�C`&}�����?�e%����D����l��=M�y��U�Y��Y��+G��L�Fl��O�{yy�p�u��Rl�#���=U8\��Y4�,���?������".�
5_�B��B�����K���-"�s=n�qO����p����Y������3+�M�.K�^�7*�y����'�a�����CfS�����WN���'b�B��eI�����p�d��A��T-k{�[���<�b;�����{�ei�~_A��9
g�zA���i8�1LNtc���y������9��5:sZ^�@��'^6�v�[��Y�bJ��;�,<2|�0�
���Z��Si�yH�>��<M�<�E����T�v��Ogh�KPb�T�g������(�eY�����f�5��	���Cx���+A��yhE](0(z��R�M1��c��a�(�=�����!����s[��p6d�}��c�p�[%�b:�;�.�L<kx?������Yo��p��W�Z_V���3E4}WU�w���(^��������B�py���n]�Yzw[��X�������v)�~+�[{��c�����~�.��}w���r
�
��T�Eh�����e/���+F���a�
]��>����/�>,:'0g7�N���f�'N1���~bI��s[�����PW 
����),�->��,zB�4��J�<.�"�7iZW6�L���<4��#�5����C�Q��!�
�b����/��)��7Vw%���\_�[��[������@��t�����2�����E�`"I�F&�~��~g�TxX"�a_0tV$;
g�������P�]�
�[���"	xWr�,�}�Kr�P�C��7	ZC�Z��#i�D���a���������E��0����E�[����R����&��������p�(�������]"����X=Rl+t�,�}���%m���?xp����@G!����w��~N�O*?�
Mh��
�?H�MA�I�7�����!�\(����MsQDCO�7��e�bwA����8��=��8��o����	V�`��T�aF����+5�/R;Oyq�%�����/�p�=!�Y�2�,�}��/h��W��oQ�6�����%�/&�-z�"U��6�@+)���UB�LmL,�ReL������^��uY��&�M���S]or"�YZh�qa�L������	-[	x:�^��Iq�y�����:��Tm���~�R��f���T-i}��=�����v�G��a�~_7��������V{����>)�y���'�Z�Dx�R_LD��W�0�U,�`��0�5�� �pY����%a!��Z�LT
���Y���E�N��X��,����v����b��"��r���S�y)g��
�n,��.�8]��`>K�4�gIq��
(�_�?_�#����6��B��
�K�Z���Z�S�
U���j������'�����3+�_0�KJ��?#�rh�����==�M>�C��w%��
�����
W&<f0~l/}�6�`~R�&����d��f]�>��:~A����a�s��o�g]I�����EAOX&y/,�+��G��8Y	�%���cA����e�pZ���[�[b�i�6'��)����e�������5+ox���w�����I�a�O��p[6��|g�y^��N�k�^��p[��7��h��jMs���Y��b���������s�����P,lu&��'X��b���s�S���hY�x���N�CN��CZ�������/��Y���s%�M3���il/=��	���
��>eK���&_wX!�w_P�P�������'lv>����t���/Q�����-t]���}AC/�	]�]0H�q����*_�-X�������m�
G���s�������i8�L<\4l*k��x���Rk*Kd#�����'#�����a��F$��l�0p�YB�4����%����K�;��=1<�wM9�[=�3�p�k�3�#3c_,�;Y	q����D��ygUA��P�w�ba�����~��/�[���-����{8�'��l�V-G[�����0���q��;�L��h�vK�w�������,L�������.o<o����<����'+^;M����c�~Ld}�L�F,�����Sg��B�_��x��{T��g,�������mE�v�bY���eQM����oB���Vzg�1�Y���{�i�6��otg�V�Yu�;[�Q��Y�b}�+�5�2���P����b'�D4��S�[���Da���e�[�7���2���U��w��w� z��D#���?��������hc���GA��[f���!��[�\�0���������K�
��6��[z
l<����=�w��~�.��u�����o���{H��T�;;������o���>f{SL���,I,�Y-6��>-��6&�":�|��l�1�i���~�[�cT�������E�������[T>�n��B����l���|Sp=-�M ��f��������@O2=o�`�[�?�b?w�6�Z��6h'��2�����n�K}8�����U,��V�
[������n9{�
��vh�[
��JbYY���|u����F�SUF'���o������R�h�cI��1#)���;�[�w�V���g���������|*�5�����D�Mzj�mt������;�0=Y���Ew�W���1�	�;O����1��ti?R.�����e�"��WH���b���;��@�O��?���(}�q}	���]M�wNB?�(}!dQz��Y4�h�}��p���6��6�d�X���Y��������cD��������������E7��0dz��
�	�.�]��	6�\O�k�
��$KW(L>&/#6�e)��L��~A��[��3�b�B��[�l��B��nU��T�E���:��}�[���=-�mM�K�T�&t���o�dA�����^BxM��~���[X������,��azH�+���ly������3����i����;4-�����G��|�<����;<	��d:+�w��
zC���=��W)���9�VOx�*��m�J���N��\�1��;���mL���B��O\��}��{�P
���Kyfi�<=�
��?���#W���eE���Xxa�R��G�Z��+�-������|��w���jo��wvU�����L�[t��s�';�$��a��,-6��+�j�z
��3�_$�C��c)���}�nX:�q+�����gt�m���?��+��&�%���X�0S�
z�p�FN.��T}��]�(������h����4,a���7W,���y��������L�Ztv3�������EC�]���n�dco����e�hz�������LfQ,<$l
-KM�b�Z�����iqG���h�h,[�
����������4�M�Uz��k�f�� ��kM��[
��cF���;�]#�=Z�B�nMlZ=~Ku
~�7�L��0�E:�I���D���$��|���nx��%}��-�hh��+����3���L�R�j�<��������n0�ln�~��MM�ot���4��Q/��$�C�*�����
�O��g����X@���3�Ye����`K�n��L~\�#i�NXf��&c��#��~&�;-���?M�Rzl���$�Ew��*���=��S������7�A"FW����[m=wD�8�Sk���z�a	����T��_fH��w��G��W����:B��0�Z��0�!���S���9�A/(��ey�wWl��[��y�U��5������`��������M%7�mId�4U@��
z��1C����@��s�$tX��3�v�4�D2�0 ,�g�qaGl��j�wj���#i/.��Ly�����s��n00,
��7�{W��V��L�^t�����}����R`aMz�^���������}.��4���t����`��h���O3�<S������bG*>M�{��=�O�4��p��0����?Muz��$
/�b&��q�Ipz���D��h��*�I������*.����$v��X��%vD,�U�S��/%������T��
WFI�p+�/�wf��e"�bw!iX�:ED����Y�s����^E�^�b�@�����b��Z"��HM�;������{H���	�aY$ba��YV��9�����1_#Y��l�bd��=�q+V���S=��%x%	����`[rB��������,�,��f����Y���B��x����sy�}X����"��z�`a�a�^�x{Wg���b��:7���B5R��\?b��\�W\x��>�E^J�L~D�
�����+��m���p6���i��'���k\�0*�"r1,<>���h�b�9��R����;-��EV�"z������i{��"a/�nq�7�����B�aX�����6���aY}�ohjdxM
�a�~�s�	d-���jDvx	eiGfS���)mN0Ik��A�i8�,�CtcIdb�+�IC���������P>Tt�S��L�`�e��"�d��)����?<oe����`�8��]�u�o�Z
��J�e�s���p��B�H�+�����nD������gAg'�w���.�Q�)m:AK-h�(g>c$���b?/�l�*w�Y���-��;�C���ZUz�z7�7�����!�3T36�l�����c5K�'|�P���������2��-���w(Y���z�T�/OO+|�������tq#ZX��X{0�6����i8�p��@3�0'OB��;�w6���%����XE����%&��Yw����ZA�0e�4�@�.=�
>z�D��,,g�J[�M/�h��s�����3��-:�go�D�q��S����KR��9�tKw�`iJ����`���iymz��6��_�Ym��Vh�:,�=�����L��p�F���^�52+d��.�C�(�{��L
[4}b`&*��G���
���S��`Yog�w6�TO�i�f$=�9����`�R9=��/�8
:;?O���n��i6��o�y��K�`c!g�=�A�J��*��A�JB���wzx+p�&$z�8l�&4j\2Z���Da�B���t7
KY�V�s��������w��1gX6A�Cw��|�3l��h���&�������]*��y����eBDbW�?�V�������gs��,Mbv1AG��ZZ���� :�����=�w�������b'����-}+�90�(���Eg�4SO��w+�	�4�'�"�p�#H2��3nX2|0�p�����e,����0�l>
O�k�
�1Mc����0zC�g����i�l-2q*�4��OO�� P=,�>�	t�U���q���xd5���?��
\
��m��-����>=��Tx]	����rKd��d��c�Z��i�zy%��4k�l6g��R�~^�*��^�oMI�����-�-�=`z�$��S�7?�i�6Sa���*�p�&��~dzU~�@L�[4u\=�XWp�Z}��HA��8n)����aki�Pu�o��vn-�%��M��6(��])���������R_b�^1��*o�v�2��6����oBd�C
�G=p��E�i&����K}X�z@[@4���OS�)	9��S�5k\L.xjJ��<,�=��2��4�m(VaUivjJ;�����&���7�����NS�=�d�Ew���y7Y�Voj\(6&y������&Q�.�fkF����E[���]���T=&�e5��~�B��sY���DzM�Of���b�{����
���P�dY��a�B�*l��B��	%�~�a.���Bo�G�3k�o��oexu�
���@��y�����\4��'����^;��{Z���?����i�����Y�*�C�%�'��Dw����g����S��k���l�A>L�z�����M�L�Eh+�iLkC��n�����"bsQ�i�l�=Rz�,�Ll��sZ�x���i���eOS���n��
�4��H�3
e4<��d�f����i����E��?��%X��
����L���TPp�g3sI��S�r�����fU�b�����A�$�3��;Y���]h/3�,;�}u����%"y��������H���q~���ba.����n5����E��0��<�d~,��@1/#�Ko�z1V��������;M��:K+�sbO��|�v�h�DeK05�bMbYR��M�s���9����a�V�,W(�h3�|~��D���=����>QK�N�
])x�����n��S<�^��Y�vB�hL�H�wf��],Iln�pZ\�!�R���l��E��BB�A�i���"��g�Fb=��r;E����`Y(X�*(N��N��a���22�;MR����W��iA����D�����M�����!A�%�Z+��^'Sx=���_j�3���d���+.yWV*vV2%,�:���h��������R��a����)s�} ������
�
������aA��",�!��\�-�:��3� �8-�
��E���;
g{��������g+t��A����6n;��(�,c���� `���K���C't���1���U�x���m��
Y�t2������'P���
4W��V��w����/���0����~A��.���@�IG�]���i��I��/������`sc��S����:V�S
S:d�v��������Q(����zbB���m,�
0[�I�v:Y������i�Q�^$����oM�OS����~���l���j�	������`;�g#4�h+����N�:*Jb��W�`{��d���T�D��9�,������NOiZ�A�0�"��H��i\�gq��M�j��T���;/���j��	7�%�Jeel��P�������������d�g����d����6L���'�M	&8�Sj��)mN��U�L���&S�
5�<2��b�iO�}'��>����n������Zq�[�3kH��b2�O��TK�����q}��C�O7h��!�P<��}�}���g��	�&ixBsM:�0T|�7I��c�a��b����I�$�[.���d
�I3rj�N?q6�������6���)%�J�������i�A��p�
�*H��R3j9����q��u-4���������p�:���VyxLKK�&@��A���0�D��p����<--9�/�
S�m�
�.%�$�	�]���������-���WW��Jq�e8'�GR�����zl�������}Zu���N������Gb$��
6�]���V�H���n��D�`���F
�
�ECVw��D�����G-eXM��������C��t����#�����q+Q5k�Nx	
�/�)[�XS��
���R���h�?�ea�3`����`h�n��L?��R�9���,��h\��(=�p�XwB[<h(.��,f��B�PwO���*{Z^[��89���`�O3%����+�����09D������Z����VA��S
^>�|����v����#tZ�x2�b���4�,�e�)��pa���y2�VE��a��	+T%8_���[k��I���k������Ib.�/��^l�
��B|Y`y1�e���]�����B��i:�f7
������%b�������'^������OY1�W�dkYpx1�a��@���b���wf�{�
���j�0�Ltg�
��\��{'��i�n��1��~�����	��%����Ob�~+�[*�i���n�	�}*����v�0�T�����n�,���U��K+uf3�K�f]�h����cXtg���j��Tm���h���#3�����a�>����r+���s����F��}Y�z�od��~g���
	����8\�'��w�V+^�n�B7�k3KWH����{
�V�F����>�>���qY�����������LN�b�;�5�Nv-X�,�
+E�+\���|��� �}��^���%�,����?w��&��.h+��ZV�^,QQt�!��B��0�)v�@�U���_���;��H��Yp�;e���>�e�<����,��������6��?��@�|X�&&��P�,r�O�����A�-T�.��/�U����M������.abK��E�O�ksZ���������!L>�����K�E�KB��ylc�����4��4L+K}X���6xQ��%=���6�al�s-
�t����on</]�������i&9�����4;l�-�.�/K�/x)6\���*�V��"X_X�S
;�V$��|����F�3h�u�t�o���������=��������1J3��}�!��y������X��/]�ip���P�;{W1��_� �����_��W������N�D����V���u&�.z��Nl�DcY�jl��]���J~���+�����XVW)t@�J�4�NSN[�ium�0ie����0�,�k����R��ID���o*@����`���W��<�N����J��������MJ�05#�
�,����wU���_0;��bXS~�U��{:O��aZ���<�6j�0+M����8_[������=J�^����-!X�W�,�:[�X^�����si�i8�m0�[t����Rz6,?��)�2QN��<kx��������a�y��j���qz�����C���E����1l/�}�d`�o��D�*�cb���&�]�Y�~������S,�u�C�������������`�5%��]����0�l%o�"����M��R;U,L��W�1-�+�M���w!��lg��b������.��g����77�w��T-��[�.h�*��x��4����mK���c��+/������Ne����5(lV!������4���5i��NZ�A�B���N�u:0
LE����uL?��25�X��u�����6�hxZ��&�A��.�:3Zz.wf�3Uw�K+�����q;��+,�]A4��-v�d��S���v4��;3,���F�	�)[��9fb��&�\�fu��
���%y�r�F����W�V���#aA��;L��R��]����We�l�BC3h(�*������[-!��z���bQ��y��|g���YX,w���oS��U���t��vp'�o��y��Z#���Xx�x�{��>-�MMx9W'
������
v�
WlaGp7��'��h����0=�Q/.��;
�:w���/D�����GS�(*9���`�Q����4�->�y&�i�C��5n���r����
#s����w��������%"nP��l�@C/h���,�Zk����=s���b�b���Y��o��/�./���/Xxo�������f�=��l.R+��>��Lo��/�WJ��z�Bd�w:N�iS�b�a�0X��.vB�r���D�c`����4��PQC�f�f+�[V�_PFoK1.�l/�����C������Lz�*���z�[wzL[^����(?Z�~�75*�H#:�.��/h��[��*�E�F��QUK��������5��� ��
���ba!��]�(�����t�
�R0�|�b���i�.���DO��'�a�f
��zk7\�s�����{y��(:�����<ay�4x�L_�����'6K��hz���%:����[��a1'��������(�-�v���g�iuo�.��C�����t��e,�����
�O��xq�p�K��i����>��:������c��B���]�4��V�(�"F~[�f���,&o��g�T���[O+�S�9�E��Q�,�*��Fx[�f5_�o�{�����O����s.�������E�����<.��<������A�,A�l��NS����M�o%r�Y����?=�
�e>��@,)
�#<eh��7������� 	���]~6���������g�H���p6�������;&�����z�P�Wtcq;������P�P4�N�J/�- H�Y�Gl/��&��RB������H6G���-
��B9�m�������t+�
CNB�%��pxY�f)�Y���^��Y��f�E�
�o�����x~��b-y��Ht�����4E�C_hQy[K��?��������%�v������:-��'���BN����.��;<������m�*�����F�S%:dm��A��|��T����7�R�SGN��|�?��/�/��f}�d�����BB�m=�����=���f��baP=�V�����~��>�t�I��.��-�4V����K��@P,��;���q�.������P*�4�I{�������cZP��~�:T:W���/&�.�)�y`��.����=�N+d��cA��h�~+�n��H�����6��tz��h�����Y��m���<�^��'!{�>0�!�Hh�
�������.{��-���q2N�E����q�H�I{�i8�1�Dt�^e��	�����`'tY��O�k�:>�F��f���T�(�"Z�7+C[���F�+��j
v��)a�����7���ne ��1�����M���E��X����oEV��^����
=3SM��T#s
zu���`�(�i�l|��2h�J,�Y��Y��"�r����D�EW��o��L@�4��	�f��f�eS,��5[�Iv[|OU���`|��6�5
?��-|Z\�|��'���������v���X��l%����
�h(,���}
���5�iXV�)b~��&� [����*i[�����ha�ar0�c��4�Ao��M�{����
�P���B����s.�x�����&*<�ECGB�9��4U�{���d/�7l��%aR�.���q����o&�/z��e�\����}N��8\���j]#�b�`iE�����9'#�����Y!y,��D�~AZ��>
�J��\��Q�`w%��j�7�4
#q�N�M�
~�)m�A�M���W���WMS�n�O�����ox���E��E[�>�*]w��*������OP4�,��8q�P���<��o(D"Q��f���s'���E�;}��=n�W���B������D��(y��������c��y�Aw�`(F���z����D�
���LYl�W�`',����K��0
<�
����m�����(u�t[=���.�y��_�(H�hY��f2����@��^���o�iF��M����b�b�������7�+M�p�m0�l�y>z���n�V�=���ym0^J������V���$<[��>�`B����qbM�o�����|�����9��;���n�������\�2X(�I��a��������=�`��=��52|����^��W*m-������Z�}gs��w�j��++d#fL��M2�4�
M��t�{�FN���Tmh��Y���;�U��KK�-t��%C7v�4uF#�R!��%����A;��mTx[
6��/X��������i�j�f���-Q�;;�)vZ"�{��*h*���b���o ������������E��_Z������)�}Z��%����J�N�]>]��>i���v)�X:�����eNH���)4{O�;����y~W;RN��aj������f����)=��8=-��!�@�����G��
������NKt{��To�5#v����CcT����bsg��T��
7�pm���?,{�t�������n��)�`�	�:%����:�����n�b���X���a�����l�cm���0D?,�%���������A���'�s�M{�i�6(Xd���8g����Q�Z>�+X������N���e�_�Z������T}�2��|�ga��� ��X��a��;�����)�L
�3�������[7�a�F��"}���}�R��i8���$v=��R�WOm=o�����x.��8\�	�W,�T���C���?M�I�=�IX��c����g�����n��'+������������(�rh��+�&+�?,U\�.�Z>V�~��4��;X.�c�o>.5����+O�k�Iw��;mX2�)c�������/��	o���^G�O�������,=�a,,��*w0�w?���4tvIs�3�x�������C�U����bU�b����1m=��_��%���~��Tmy��@�Y)����t���qa2�W�P��X&�a5Z�G�Jm���e)�~R��i8[^L�[�N%a��l���W��vH,L�;���'��0=oA����6��	�����0�,�3����V��4��~�
d�p�������`����1Y��6E`�,hjz��V����zzL�"L�A4���70��2����i�l����B��
��	��,����LZ����b����i�l���x�}g�"�g�����>�T������,�n��
v����Tm�A����"|����'���n�����z�+�MCS"�l��t�k�?���UM�o?L�S��F{��-��mp��<(���rZ][^L�@4�K����qg��9�b�*`L+��`������Tm>A+q���a� �X��+�����/�Z
�%�'�x.��0�p�0�#�Q�������t�tU��!�A��t�a��T����e���s�"M�O�����5�
5K=2Ga�0�L�F�H������b���s��i8�^��C4t�K�<nJ�<=�m �1�����~��?�K7�

c�����H�p���:��5�\f��4�cI��IR���������;X&Bd��:�[��i�l������n�d�>Y4�����;F
����^�d}�f
��Ap��+��+?��a�	���|��S�=`|&�,��������a�Y"���>�����wf)%��V�}����+���3����B���CWAg��i8�LyX4�}���1�%yO��3������[�����
�S
���*�Y�
6���������l��.X]'�`�96�,����'Xy��K�<��c)�z#�\/D/-����>��6�	O�`{�u�c)^Z�,I\x����k����z���������iNS�����y�;�����J����LW�F,t2����a��V����S�N�kK��w�"i���W�F9�a�V���N�k��'�>��tS��ls|n�ao��i���dba(@s��LXb��i����>������]�O�i
Jw���J�B1{���e}����`��F�\��O��od�8�V)�P���]�q}&��>0�0hj��YTd�R��$A�J��j���r*<��B-|�M���a�v�E��bt�W$2WR9�S�6�D6��K����`�&����B���0E\4��EG�If�z��f;�O����]�'�����&��]��mk�n��+v������_m+�B���\����7���l�v����nxo��n��+&��m){���T�4+�;�e�f�_��:m.�8�g�����)=n!l[�����1(�m{\�{�����f���;�H7�Jh����*���7��=�e,�
��?�������xZ^_LCF4l:���S���)z�,^�q+��u�7�i=����&�%��C�,<��~�n�#P4K3[p�o����L���������$M�E��7�`%�����eV�n����7�
���Rc��Y�xb��u���0u^�fbb�����[x, ���4lh*6�N���c^����)r��<�����]��mi����LC�A���"`[�!�-��;�~n�U�}g��%`V��qS��i�|�3���y��.x=��p��XC_lE�c[��
�z�.���c!��B��m�b��#���A����h[���w% ��H$��Y��J��
�5M��0F�� X�������Vay-{�Y���A�Xln����bs��[�Q�-���h�h��!4'-�fj{�Rf�m��s�����`���D�S�t��^	SZBx3	a�3���Y2����=�����-]��t��V�j�-���������
�
0�~Ms
�])��4U�1LA�t�&e�
#Q]!xX��h�a�V��L�W4����Zg��i��b�mI���BE���u�-Al��NO�������q���X��a-:�����S�e��.4_����JG����0n/h�l+�n��+z��'�]z����/��i}lI���m_�YJ�~[Kz�����%�	�[����@����`=9�����tbJ����p�.~e~K6��1m��J�m!_��\�F�]��Y��~_A7V�.���	]0�8�?��kZx3
`����l[�n�������aB�X��� �����"�]�����Tc��7F;SZ�i�l,�S�`����!<�4.;=%[
�`[%Bn��
�����`���H����Mlr��V�.=���_�����4S�L�X��w�`���X��j6Q�TlhRA�"��^��P_����,B�y�m�e�\Et��z�b��3K,� p�-5D��F���-����v[S�����a����M�L���P[���Z��_s�����^�%���v�`G�R>-��E�z_���S��Y1���4F5�[��V��"+�6��w	<s4�����MYW��m������h�����F-
7���`��z���^�l�=-��EY��kk���k�j�hn�zZ!|�)#��^��
�t��]I������[	bl���x�i�6Ra�L�4����E�4>+��VR�:��=9h��[l���-�.o�s�nu�-���c�0�Pz�z����	��[bQ��lx1�n�P[l.=M�&<��
�n9���x����1:�����x�������`;����{�_��.G�����$�E���z�� yv���O���L�iym���u��Cj��Vv����7�7�.�v+�z��� ���+E�:��v �U��`��~�]LF�l%��������^���XwZl��O�i�������ut����b'�{�����+{��Eh�
����R��3.�����u�GK�"7e-y*���D�������WF���Z��F?-�M6(�t�%���:�r�M��p�G�0e��)����U����I@��o	zA�)��Q����y[}�`�����U��������^p��::|ec�JB���7SG�V8����E�/uPv$�We�[�E[}��j�^�<2�Y�d�7���U�a�:���i8�1�H9��^�(Re�����+~+��v��������fj3�k%����m�`����p!��I�=���������p����E7T�LC���^�h^!��Ji�wy8���^(�b�����A�����?�{��pA���?��	��B)fY�)��Q�iy��NW"��������wv|/��L/��d���������p6����hy���k��{�t�+/����_�~����^������S��y�L�[���Bp���T����n'f����f#������4�-
TPdz!������Tm��t'�
�c�]H��o��1��o��ZL3���e�l�����F�D4���#�{}�?��37�����|�!��O��j>�P���B��?�R�6���6�L�7kx?�I���+��>$Q��i�{H���L/���|��6��eG����$������>�Q����J��FF2,4|4�t>-��	��7����i8�H��4�������rzJ��H��t�*����JF���s����W��:����r��~!����$���;-�
�3����l�����!�����,���.w��1}���%��D�5�d�M���,�A��
��`��O*��s|Z]�"H�������F���`|y�����%�)���LO�%����*�����	#3Agm�_�pN��_�7�4X��`�w�^(Vk����YV��7k����Xq�t����'��<re���PR������t�^�����=i�`�����H��,�X��Y9lk�-H%Np�
���;*n�n{�#�fe@fJj7�+7�a[���f	�f'�y��u����`6���������H�~/���n�W�!�K�
�@s��,+��c+���Euz��������Rzj�������\D���o$~i�������P�hb�*��aSz�C_qa��H�t�y<��0�()���i�FQ$���8N���B������	����>yzL�^�n-�r�J(�t��a�}��M[^����f����U�����6���+����Bo�|�*�7�`��z��M>�k���)�fG�O�f�f�t'
����`�������N��������D�Y&�`6Kc���4��UN?M�n���U�%����D��+yS�vL)
��	�R�N��������Ag��l�9~�~��[Z�w�d�N�^�Wt�I��6����
��e��1�~*���F�J�2KiH/��A���MSOt��(��y���4�l@�[����9
g��PK	��Y�.��8[:_9[P���|��A�$~v��+�h6��R������.����}Z�J�IeK�z�#�9�����\�]wS�}V��y������9���C���Y3Q�7LX��ad[��_&���9���fo�/4}�m��Xot�x��vA3=�zC��QuzL�0M%h�@2��>�tyNi�����W�X�HA�45]�B��f����?�v��:w�;
g{�KJI���h��~���@j�t:��=��*�i�\hV�<����R������a�K,�1������g:}�8�+%��W�Kkns���va���P������������G>x�5KFT������0����8^[H]��C�rp��l����-B7����"�������`�w����X2��T��,��f���K�����C�v��5�+~���L�z����0���ssU�@;�����Bo���6s
�u�0{C{1������tl�^��|�����-�����
^��Yquo�@t���	o6�.X}�YW^�"H����Y���K�mO@wu�3������
Y��)�%�_yW}��bY���~�����M	��O������f��O���Th�O�5%1��w����0�_t��$�h�����@�S�6iV�mL'�Y%�j�vd���Y0(��^Sc�������f����_DwVw#�4���KY�p�PbXl��?Muy�������������V^���	���M��;�su
���KY�K�O�$�Y��1R�������wK�(8���K�2]��nV/m,V�����n���
zw����e��O���Y�^�&c��D>��5(:�m|g��T�?k)����[H�iV\�����8���oV\mLqU��j��r��o6����S�7�6��(��6P���HZt|�����n��oz�E���R%��V�vs�����b7}b���wzL�{,�X�f"!bG!����������K��Nl����"�R=��jX���2!:���s�r:-�mT��!�)h�5��6h����S�d13�7�����]���6�����V(�i������"DM�`a��X���,��9�,��4E�bJ����|���q8�|`� ?��+(E/z���1;�3(����%�
DO��(����f
��`sI�a��=��Q���=����[�:��)C�n��\lAz�YN���$���������(��M��
�xb����
���R��N��&�����|*6������8�f�	A��Y�U0?�����!�^?o�[�����w��E��mcyU�'�#����[:Ml=��G�<�k��U;�]���q����D��XU�h�E�����U���)���DV�m�Q�N!��p6�X�i�~�f��b7L[��.t�[�h��m�M�q�0��K���G�
(�$�dI�����%��|��%���D��X�,_S�
��V�56k�6V�'�P��,K#�C�!���)�B8?p!��Y]6�z.hx�
�W�'+�6�Lk:����l�@�K*��s�R����hj5�6��Lm���UO�L�T���`�i��S���4�(�/4��EZ~�1
��h%]
��`����������-��%�>4�\K������cNlJ�=-�M&�j:����^��$�Zn5w�8\�"��?f�M��Ws��E6F`�@���;
b>�����CW���Ih�[mLZ�Y2��Ob���j����i��l%k�B����f:%B���9C��a�mlE��YZ�����tb�?�;K��K[I���l��*A�0�\��0gE�.��6k�6X��T���j�\	�X��1��4iI���\h��6��
����X�qON�w:�N�k^�����.��J��ux�z=����b�������pAP�Y;�1!��}���
�G�~`����,v3���9~�7����/t�;*��E|LW	��(��x��`���m�"�
���.��[L��V����i8��Nt���`�K��`����H�b�}Z\[1�2]�:|��j���[n���}VNOi���@�^����/,��p�)}0�z��7�-;����jgs�a�,��%���[N��`��)A�J-��t��M�����R�"��"�
WR���"��>��B�GlE�J�P=�t��ea����'tl=���i��3�V+9��m���@,4^�������"`���G���b�4�,��%���\�W�1T����+�����o��,�v?��NY+��2������<l��]�YU�;�*	��x�
aDS������S&�J���n�ba�AS������V�tfI�^b$K� �V^"["tU���hv�fj�������R��p���<=��	h3K������~
��n�b+�k�	��o�5*���	�"�7/�[P��,�Do�� �f�;�[^�07[l�����yy�
$�����S������t/��+��x��J���j�S���O�
��H������mx���T��.�Rl|Y�f���Z�%�>,c�,�x��x�e5��	\��Y�������1��j��MW���>^]�"D����yY�j��~�OlE�������D/x�����#���lf���ae�Y�*&���,�[x�,�{��a��%�����i�>���A�
m���}]��B.+�^�nF4�	"�f�Vbx&h\h������b�
����6�=������XNS�=��aE/���o�;���pf9L�a���l�������x��VZ���k�Q��J���h�e�k8OS�Q�������
oR�24�$��������`�h��h�]?�t���oS�S&O�iym1qY�Oz�N��au�sf�wo'!�
/��.O0[�J_��X����
�����v�x�����u�|,6�X�^�
�p��@[o?��1m�A�=���;��)��qY������pY�b)}����z�}g�������9��m\�Y�2-��e���B����G
��PAqY�6��Y������>L�SlEm�����Ew��
���B����6|=n:O�k������������`�'X�[�7���ln���}*A9+_�r�4<����L�����;-��r�y�7��4��T�;
z���]�;����c�Je"��<�%�a���Zd��a&������Tmz��y��Z���X�������d�~�`a������Y����?	�����x`+�r��^0?Kb���,�}-�v��)�S\���`�R���^w["pS���}�
�5�QX<�)��ium�0��z!W��L5K_�%
�����
�����#�|��^0s7�I���8�a�f�O:�NKd�	�����[��B5�e�����E�bg%dd���	���:���
7��,��Wl�M���D�E�l��X%�i�zJ��1m�@������$x'
6���Y,
v&�iym{1qS�+9[O��a���'L�*��{�|������&V`��D�f5�bw�Z����-�~` N���JG�B������`Ki�<��D��-7����%����m"Jv���c�>��;,���/x�����,u*J��4�J��%�/&�,:�������t-MC���`�J����/xI�:\52]^y���y�;-��/x(
��@������p������������A�ty#����;�X��1���������T�WH�Mp[Y��'�D:���X}.:n�G���\�B�\�����v*�p�
�������_�r� �tY���i=��,LN�����"VKi_L}��6{�[�����a|8��[��-�}��N�T���Rha����������w,��-�2��\���N#C�B��F��!qZ"[���������b�f��E�Nd���,v��
���]0�_�V�_���V<�C�X�R�h�PDXl.�=-�-k�t!�tx�vBs�~�<9=��c��V:����P,�����(rR&�iym�{R�7���c�j���o
�a�N(
"^����C�����6hz���vc�j[�wY���r���`�~��8f�Y���!X���GC�
���-�u,g�-:�CBb��|��bKZ��a�����kI����9W�=�0�H���-H|���6�a�H�
.���K+�_L��4,�[�-hO5+�te42�U���<�k��ay-�A�L����4��X�4Lb�?�L�l�`aC���$n���>�Ng�w��k���KuH���
������h�����`,E�T����_������=x���m�-Gjaum+����p���������Vsq��V���D�VTw�$6�av��A'��4�N�i;�uM�])���H��
wU�H�` /������`���e���`��$�=`U����bo&X&��]z�)yZ��B�����rf��U�Sh��������wAh�����]�e�n��Yk���!�e�1�����V�\�[:tf��(��+v1w���e�z��>������ �&�)v��\8v�q��N�]����`��f���~��Vv��3E�����fY)����9?�����n	����0��P��	�8��w%�a~W�~����G��sL�
����&�����+s���b�%F
��}�;gt���,c>��P�����3��h��KoT�~�|boV���M1����^d�b��]#��$E���"�������$����Y���k!v�0��e��b����J���%�������.#��)���I�IB�4U_t��8N%6/�a����o�
wqYa�\�����Y�Y�`L��xuw���d'EO�kid&G#vC���Rd=�B����T�������4S�O��t�m~g���;���S������*�BK����z��[o;�i8�����3�;�{�|g4�5nA���Dg%!��O��B��:S�����q����~xLw8��:V4���;B�ew���ECq������UyL�,ET���3�H����hf�D7x��~��b���D4D?��������&y�~~�V������'��}����N����c�4�Ov��&fd�}��������9��������xA/x�U��B�S���V�d�a�����ba��X()�����MAgm
D/x���aD}����|g[A"���A����xZ�FN'�i������������a�V]�9�V����D�V%����`^��1:+����;�M}��6�7������2�Eo��$�v�k�)s�����X������vz����6�`S�XY�G�K������;tVl%z����
@�Z�Y��;K�������Ag���'���M���Z�PJS,�?�AB%���.2����yY�������	�"������N.�\�E-�����O~����1F����^����&�'���T�`�|��i����H������c��l��=G����[����5���u�����	]��w�����$<t{k����%�a���Q�@�-	�a�P�p�:����9�#���>�a�C���;��t'�f�-�>�jk�[��p@������`�Z]���'hxVK��`���T�	K�w&�.����`a��zc4n�-��$�E7�����2U�"L�Q��n�`'4�%7��Bq ��b��zbR��aX�
��%7^��Zm���C���)�T��`+
5�U�;��1
]k���G�����V��t����]r���A���J�dx�����,��I2�Rc��o���^�?��NS��+�DC31Xz���)k�����`���1ZrSX��3=j����Bw��.�e����2]XS��\���VR���a
{���"Phy:+����������=D���d�`>KJ�L��jw*���������������k��i�6'`s����4��u�ue�����Y&`[7��2l�!�������D�+f���a��n�c�y�������]��-'vU�|Vw�P2&��@�k;��Tm>1ug������`=6�7��;�K���'�H-��K��4��oeh��'zC#|K<�-�f]	�X���d[IR�����p��!(zy%g]���H��o7�
������],����r��e6��������5��T{��7�f*�}�F3}b��Dm-�2 �0���p��o�����@mD
	^���0D���_u��	k4w��(����y�V�g�~`�A�7=�a=I�w�Wz��_�ViM�s$�\�+�E�;�M�
���3�"B�B�a�cXf'z�*������Ab��>-��%B���Vp�
&��"v'���f���c?&n`i�P�F�d~��9���s.�|����p�}7��U��S�(�
V��D�`��b7����t��\����R�N��xy������;U`�f���cn?&n��@�Y~�0UK�{��������\bo���L.���LW4�����0:�����e2���f����e�?q�=�����E���QV(!�"�0�y<��������`'�	1K71��W����<6]�g,<�]�`G��DKl�|X��W1
������3���������-
�F��NY:�����RAD7x�6Wh}g]]� A�"W����q6��
w�������Qd���"D�s��w����Nx	��c���B2��L�`S���a�b��t��,���:�[<X�G4�7�B�bs��,��{����z��������+�.V�"��_&�e��b����"�P�V4��&���Zu������TM���~Ks���n9��l�����"����>fD��v��
=��UL�������
���K��@?D��EX��-�����W�t�v)5������6=1���
Z����	�������<��k��;{���i!����MC�I�7�J�
�{�"��<Q4���B�s����3,5eEO6
�����7��
�y�R�6���/�!�;>�/���~)�B�0\4l 6+���jc&H��wr��>�	x��9����6
�5�(��,.=����	#��n�f	�%�����	���q���f�]�O��6	��$hh�h`		�����k�M����a2����2^���Lm��X�4zg9���bY�o���f��b'�U�����'N��%�E-���4C��r[�.�`������Wt�[����0;g�-����������4�aW�/S�k��xj�T;�DbZ����:�%j]qTY\��:�`������,�;����6���wl���`ox�������Sy��
��0��Su��1m1	o���T �}��
�h�	^k����@i���+v�5������/�BU��q9�%NKd���\��,T�������a/#�0_=�,�y��e��~���7{g�(+S��#�f�4B7���+�V��0j�.
v����|3�?o�a�����U�ACMZ��>fX]��lAywX�{���4���+XJ��*~K�&u.:K������d�E��t�47la�M�Y���B6���.�oz��o���Tm��DZS���0V����j+�nw�������d��u����qLia�����a�����
6��<-�-/�Nh���X���^L�Q��N��TmN�*+�p�7K;aJM�]�a�������F+b��L��t:�O�� `:���-y��+��`A�X�����`[%���5q�j����s�$H
�T�n����t�����>,����H
:��m�^��j���:�JK�	
��Y�.�rKa
��5;���=�>��~.���l�
���4E�7��w��7�`�q��*��V�$
zCi3I���Tm�@�M�7���eZ~bK����PB��^I2��w��L�:+"XX<���|zL�OP�%h���L?�i�������B/�aU��s�?����-b5��`U��T�E�j��,����u�;�V2�H��q����:���^�p���e��I��\I���`���<-�rt�~�
�H���h}V�L�Z4�4	��NV��oo�9,K������,���-e������Z�t��a�^�T�VO\���6�#z��k��n�1n%�o=kZm4|v-�vZ�6����!v�<D��%-�����>�P���di���u��p����cQ��]�������*zNK��Dp���Xd�#��v���|����,>���M��w��T��
���K��Nv��Y���^�	:��=��h�$Oln_x�����_$|9������������3����+�rX�Q,��"n�,i��2�NK��D�0��<�i-����EC�����TmQ�k���<�ba��X��'�p�����L�Zt�u8�f{�%���*�b���
�`=14%h]S�����:-�\��-�<��S�SzU}����h�eG��*��f
_�I�}V�����iuh�.�N{�i8��L�Yt�t����Gf�cNl!�wZ�y2���J�����d���o��,�2�������a?M��vp�I*;F�]���i��>�8\8(X����*��v&��q:��J�0�I4�'�XMl�1m@{2��������fYF���@���*��U��^,�/V�����`Ek�B��~�<�h�����v�rK�Fs6�?wc����$��e�'4�$;����n����0X�nm�1M]����0���'��Z����b�9��-/�n"������*�����8����^XjK�f�rba"��-\��:<�����H�;[q�X88{G?��1�D���*�C���-��LO�V#:�O���`�y4�+C���\>��;Y��h���o�����hfiU�;4D��^�WU=��6�9���5���t����������T�
s�oD[��,X[I�n��l��l�P�,�[J8�@35�����i��	�dA/x���z���qK���'V@-�3eC�4Kf(x��;�B���M����*��B�f��c������o��
�:0%�3^�����\d���M~�CX��D3T=�/�"�������(v�����0����!<b\h�����sN���������E��7da
�������_��'+�6
=��vV�$����������i�Se�����M�4U��0+H4G7|g�k3��lg�6b��S������`,g
�U�n��e�',��*�/�@Vx����[���*�g'�T�S�����S9�po�Z4�;�<4��b�����E��`�P`a\���L�*t�����j�Sg
����eeiXilZk�R[8�	�jR��N%)iW�w�a����f�������
�	
c�ba�Z,L�6���V���QHYF��m0�{��T��c����RGf`,E:�������.��X[z�l��twv6�%^OS���t�EOh�K3�������pUM�iM�I�z���"�cKe������7T�M�$�Mw1�?�;Q�+7:�O�2t�����?�z�v1K�Oh��=������6�No���s%�����Ms�R���2E��tx2�OS������.���=��t��N�@�1�Y�[`���y+9|V���[���1��?�`��#X�FG�S���V<��b��_�w6w����(��>��
�\���sO��p��`~�h�Tl��,�)a�������'[������O4����0O���([��9-Z>��t�������g]Q��h���E(�R�j�	k����cR�.L�f��
E���B�i-m�Mt�x�a�0�������o���
����i�>#���hz���m�� �bhY�{�o��z�bwEJ�B��Z��^[������c4T0K+��]���9C�@�V._��qASo�������'��}��`�;���/���iuX�4�N,|����+xO���?H[�@l�05l������l�4�$%mv2����V��	z��=,�����'��='�����q��)���D��`I�0�Pj��>���=`T;�|I�����qx�]�]��^,�i�%��m�-+n��3������O�����h��(��e��\S�����-\��e�sq�������Q����X���8�g�%�^"8�^���,���	.�V�c��O��e�p��Z�b5ba���������b���j���������
�c�������e��-�L-�/C��mUlV?8Mu{�����B%�Y�����k�0���i�q(�+z�m�4�
 �H��9�����X���L�W�](�X�_��
:�����5�.6�G!�Y�{��m��%�U�,x/�E�YI���U�{�,)Pl.�:-��	�
+~��BmY�v�
�Kb�+���%<H���`yr%�����$���Z��5tW�r�|{Y�|1��h(� �A��f]��YJ_L(�4�C�-��/k���o��
�+g�{��;��)mN��������zz�2�"�7�7[1g��E�D�p��a9�%���i��%������Yr��M�(TB`;��������RE���wv0�N�P�����J<oi������Ew�
�����u��rH'��.��	�:�XN�iC�2���+�z��0OS���$�Dwx���[��w���=.gs���Z�=wq�6�hV�!v����Tmj��]��hba������s��^O��<,*��>��C�������q���B��� ��aU�i;9
g{�%���/�F��h�p��F�D��A���F�����Gb����e!�]Aw�'��.�����Y���Q�U�,����4
�������U2g+=r��
��z���2����v?�7"������N�x����>T�
u��n��7x	��?45
H�����u/�Ag�����
���^�bW
����n�F>w�f���6�����&�5{�s�[��Z~gag`?�s��WsZ^����.�~V�g��5kh[�R��i�l��%��
�8��`�5T]��Is.��-wX0�!h��Z�4Xn8�`t&�N���-c�;K?�����P����qa�D�������'��|�P�Al��9-��rX���0�1Xl�F�$��[�\r������M��V�$��/��/��px��D
�����)���B��a��h�g:�
�4S�0�E������Yh�5�3�m�N?��k7 �S�0����x�t�V�6*���f+(�.wHX���4���IboD����j���7
�0�*�E79��E�d�`iBt�
Z$z���e�	z��n�Nu��m}g����
��
k�`����pw_R�a��q�k�a���#����3��r{��4�R<+���� �~�Sj�Bs�e��?Gi����
�>e����������n���^��g7]��s�D�����p��M%��$�nh#�a��AA�|�a��	���}o��%���b���f)�sZ^[|��
�1�u2�m�rq��/��/�i�
����9��m�[z%l;��0��(O�iC~�A7�
v@s-�	�e��~5�d��a���t�0���+6��,�/@��n�`�$,}��m>�Em�N����;����J���d
�������,��)6�����]�������ig�e;�k�)�10������~G~,�����1��;�i
�h��_8G��?���AA7�elV
������MG��/���l���h\X�/�%-l��������E��N�lp������1�]��fO��*�fQ��R�6��n^�,,�t�/��]zY�[;A�$��
�EF�Ag��n8/VLd/J�=2,�	6Z���"�$���q��LY������c}�jB��`9Y9Q��=?hq8\�����`S�����]�^?����J%��uf���/��
?+�6J����Pl)��y?j�����]��^��_�P
��{���J����t?�\��]���>��)����wS�(fD���\8��R���t����W�/-���|���X�5�����P�WB ��_X��tL1|E�7;$���l���0�XX�"h���k�F?XI�����J��2����5Oz[��.��:�}X���-4����]�Y.Olc����6������V�1�����7�,(�1��X����1|��H������;$V�{d��$v��x���)����au�`�����uH�9;Yt�;.�0
{�k�=�f��Qhw���NP�g+���~�� z�����=�����������6��p���/�OJ�]�#7��+������M^���J�������;�C�q��=�^y�Z�Mk��Zl/�����)�DC��Xxv��V�m��+��Y��X��{
2���"�p�(f�(��U���-,�����E�.+�;Y����m7��:�a?T\���m�a���o��(X��Xh�{�~}}Lm��.����E�7�9{�z���:�aed�Y��_����@W�9�+�L;���M#�`�c��.�8,��)��&�r�����L�X�7�,��s�&�t����a+�`��po^,��e
SBs��n����<��6���@4,�����p��e���_j�s��/��l��\���0n%ea)�`��i�&����?���c��>���`�nY�}���u���MN*���U*���W���V��I$�q�Mk��`�M�p�v��u���mw������s1
b'L�����n�?��%lZ���v�0�q�`jE,\������3��M��'�'��dwm��H��u�
��+3�P���*�.g���2q���G!GSVfw�^�������
�lc
zb�&����j�������f=Obs��9�X�����h9�z��8�����:����� Nvi��W��h����eT<g{��a�`]���Q�,l��U��������\GO0���_���p�D��Z4<,Y,��ViWf������.����pw���X/����u�N����.t�
k�s��l�������R@���B2+�i���Y�w��:�=n�1z��<`�S��r9���*�Z�	�`+��a��`� �D�gK��R�}��y�S��NQ��#������'z��G�b��(qq�l���S�A7�X���2���\A��!G��^��A_�[���?\s��s;����9X���w�#X�<`���0�����M�X�zZ�\�X{<��Xtc&���ac��q~��o�����#6���.�1�%����\���'�`��%X�&�q%�f�p��9N~��DC���#�y�`SBd7C�`���,�p�	���>���X��+;�6CQ�h����w�\F��/�k�7
��e��1�*j��f��#�oA�0�-��~���C
�Y��	�%$���Z�<�.Y4��{d�Y���(R-��v)�S���^GmL�,����`',���)���M��0
�4�V�"�a�6���&� ����������A�::��#���4���U��MGn�z,����rO��tX=<`���A��Y��u,,�
v�m�`a=`��4����N�<f�@�{���V^��4�k�]���h��H���'��I�`���C�����ge�9{�a�^i��9My8�6�8���,	��K/ "0���G.bS�>pv0����R�j�6./�k9uJ*|�d����[�[���	V;	�K����E�������:X������l��/�JD�8�*�5�h5�^���hD�0��
w���8[U��s��n8}��J4��/~������}+�}�w�� �K������$�����b�l>}w�6a3X��#D�e�t'~}��v�9��=������~d�Tq�`H#��������6��3�����)$���P�������)��2m��\:;�X��,8��Oo����l��=��.�a�����B��Y�)�.�nO;�'sx���3��}��}��f�o��Y�d�6b�W��*��L��'+z0�*�v�=�]T?�w���fZ���!�a�sb'�����K��y7mZ��rJ4,���w�:|�(��X�,v��a��dh�����y�*�xz#�\����_H�6X�������.����T��Y��}ZJ=���>����>l~��ww�(���D����p�bXNM�����v�� �b	�vCCy�hx��X��#v�n�aE��6���0u�h��H��6@|���C�l���i�t
��]%���2	�l�Ghgb�A��u����D��l��`j_5'����;U��&�!+	2��>��T�Y����B�����������~�p�<s���	����&�s�a
�/+1O#[�4�6�OV[/�}������:�d�h��CU,<��7.{i���9De��;����47V���+a�o�,Z7>��Ht��������M���b[��3��L�+nw�]pOE�pVu(�?����M�?`�'��o:g{��o�U�mD�=��p�5aJ4�������OXN��Aw�Ulnk�\���Nj�7��X� ����K�����9nc�o��B�/k���21��%��"���(V������Tn0
�.h:�����I����Vl��ZvhO���n��0	6��v����iOE�j�0|J�2�3���c��2
n��_f��l���	^�~X��7�%�OB����i��d�q����p�d$�2��u�~���pJ��D;F�+���~l�6��2�����wZ*=a��x�����%�f����_��:�"��aR���iT��(�g��[hW�VROV+:����W�<�i�5l<
�"�*��VRO�y�L^$#�4�;j\�{�B�n��dBk������fs��RO���*;n�C�����I�M���R�&������,z��=�	�e]5�����d�-��v��h�A���YV��\�.�Q`�~�K���X�4���|��7��X!6��E�� ��6Z����������������O��2���0��'�������uN��'��� ��+�7Wj?����a�K��@A~h��l�Y���A�2����rK�R�`����V�/��'��
z���`��
����bo��-�5���L�-����X���/���4��G�1~�����a�[�
�c�xW�������rb�Z�W���6����|1�hZ�(�6L�
�8[[�|����[���R�	#����X,������PRl�?��J=����{������0:`�i�
v��]�!n�!���0�c �-��
��E�����S�R�r���z8\��
����n��a(<������
B��K������u���D���`�J�:��t��+�i-��ujAw���C^,,��5�v���Y+/�?L%*�ft��oN,}���W�n��1+��Jw�����A���������L/m~F��l�YMML�~��^_����Iv��M�p���W:x7�c�Ua��X���K�D/t��$�0��B�u�Wn�,�����N��6?O����:�9!/�Gf���A���/�[�M�|'L��_sa���q&�4n���
�	�����l������Q������4������w�
�uq��Rb���u���aI���9e����Ll
���f��9��bo���+����4)t��|�>�i�*Ty9�����_�K��V������W
'������~#x����2���j+�iy�������s��� �o!Io�5
�E�����l�d�JO�I���fb���U��A����O��X�@���R�e��bA��Uh\-/V�$z��f)��Ro_*����O�<�l<^,�,���f	��R�/��Eg��9{��7��\ww��o�4D�w���]����+E+�h��[9tx���=X���d����@{��������%D����|_V�����U���][�a��h:����gv��u������n8����,�0+i��b>��\��5�:����7����d�oe��zx�o�#�a��P�#6�'�l���M��V"���<��`;��;
�&���E�:~�7K����l�,\s�TrYz��h��?���4��*_�lF�3}�}�m��t��t�����b��e/�9�]���O�H+����>��Z�b:�y�n7E��XJUt�����]�1k�������}S^dw��EX3���y�����6�DW[v�.���I�/��{���=��yDE���K�-mp%�
���y}e��ei�]�u��D�B��Gt�$����HM�c�[�t��5j��=��^j���������}*�
v�.��	z�7A�we��.����E���l�
A�[�I~��I���i�!�u���U�b���V�d�]�V):���o*N�]�g��.[�.��X��������T���%��S4���w\��[�XC�hX(+���[��,KH���_�y��azS�S��������`u��I����Nlv��.��|��f����0�	�UrE�#�	)~�ydx�w���?�(�(���%��d*��o�^���q1��dw�HV	�.�/�����#�e�;bK��V�B����H�k�<��X������^��.�,����������`�V�Yg��]W3=��3*�?K���m0��?�����:C-f�����h��l�!r�sNAw�#-�e~!_5&a?��|>�nr�1��3l����p�`A]��.��"���Z#��	�n����������
����0����-��DP�/k`�]3|���&���:bc}����pYi���U\r�>����"k~�*����.X�$�,�2	���i�7L������f�����e��'���sK��i�o�`9y��l���e7A�X���k�ei����?����vS��+�j��-��YZE:��%�tL4�$Z��������uT�n��0�������*=n�����?f$x��?��z�.��:��f}�B�S���	�X�o�@V*��c����V��l����V�X���,�9�����g������*9v�9$�������
�������������w1��������u8s�r��A������u�V���].�R������!�|�"+B��)��"�@�Z h�);>	:g�Qn��tD���k���3C���]:z���A������V���K�t��������o%�@tz��F�9���73d����&���cOv�9�"���`��h�?���Nl������%�AWLH�zXh���-��V.�!���^pb����N���h��
7���yJ_&]x\8������:|b�_�t_��J��
��\^(�	�W�m���z���t�
�=����5R��.[�[�
X��`�>�wQ�4�pqX_���mZ���~K���9�u���������9���k\7����J����K~8\d�*ih[i����5�[��s��6��s�J�U�Pi-V5�[J���[���B�B�o���{r���1�Ra>p��PF�1l��5W��v����?<�:%�4e��T`��
�7}��`+K^��}�����S�S�G����p�����4���������q_R��c+�{yr�O�G#]��%��:I��l�.w3t{��]F�Dv�~,:����&I��oP�x��m>�6�c'�D���f��"O��&]�nz��?�!+��E����i�:}7E���y��9��i������&N�{�c�	�� a�R��K��ody8���?�
B�Ov�� Q��L�%~lK{���m����G����XR��cs��M��D������cI2���N���]:�#��}����%������8n#Ez?�9V���|4������	,��
��s��n8/���N�j~� ��K�4h;N#�UM�1���0�=�}�����2)�������_��:c9	^�7i�����+���u����$}m?�%*��L�?�|�+/r�M4i����T���w<.F����xq��������6~h\���������=n���1��h����������
����������������]ww���H��F���`Z.�&T���}���M��'�����]�Q��Tr�����c>�
��H]�c����]�q�T6�b�G���7��6I-���	zY���mp�H��~�q�t��^���Gg��n8�"0�4��+��v��u����{I�f���R����~��P�d���c��������"�����GOR(�[y3�^#a`']1�Ku�uG�����������gh�3�~l���^����?�����5n�����
�
r�Vb��k$�#���fU,��	v�JyS���"/���4����-��+uL@��?�����r�A���[���O=�oev�����vL�Xd���O����A#���%��?�n����f���:{���,<gQ�������9��q�h����y���Eg�w��73*g���>��lM�����R����F����Q�"���`�����������w�v���.'R�V2����#�����C XF4������u��B�?�E^���^��6���]-���[�G���;��������?���hw�^�a�U�
~����\-�{|�x^$a}��J�`�BG:842����.�g;�����}�8��
�q���f�qau���WA�n�����Y:�J�za�������?��H�Wx�qa���G�e�vR�������Hr��������R��:�;���������+�	?�u�0�{{�h�@���~��
������A_��Ea@����)r�M�� XtO�&������sE�9����+(�^�G�{�����W,,A�Aq���S�C�+�����������q}u���/���5��)r@?���{(��K_�R��p ��@�f�����1��-�� �����h�	`�=T�	�^o��j8��{PA��$#���M���6|��J����L[I������
�R�;M����Lm�L�?�WR���1����w�N���p[/�w���j��tw/���wM��Z�VX��a=M������M��o�[mzI�5g���K�:&�����i9�����:�!N�M�)������;���B�.9���f�!Q��ht����\.�N�]3���\�7|:��[�A?�Ix��:���v�
?����YbK��M��	�W���~1.L�K����-G�p9�W����TXP���Q���a�N�\��<�r�	��J���V^�Q�7��m�i)�.����5�����VY���[�������m�}��h��tI��>����R����C�6/�,�����h�Au,���'�r�^X�Ku,{���l��5m���G����C���f�D���K����w��<��R��^��w��/��M��Il�u�,�m�H��
-��I~lg��b:���f�����H��q�Nm�� 6����J�I�����d�������YK�Q���Z������3D7����,�[�@h6�6f�������}y���x�
7����M��+v�}\������3X�"8�����?{G7�pS��^���,��m��I�8>�2�|0:
��v���9[y8\�5X��#D��^Z�� �b]��9#=.�[q�4�ts����d!ncB\�/� ?������?���@��_t�����h�NQ��1��YVDi�P��,����^��\#r:��a�y/z���||2vF`@!�e������Zy�����mv��>�W���
.AR��l���f}pc�	���A�JE��Ku@��8D�-�sv�}��d���YN��]�"p	����-)vvW�0~�_*����'��P��%r��Bv���1��h��&��)+Y|=�F����i��Ry|�e��Oo����;������:�a6]�/+q���-H�s|o��`�'�����eZ��U�z�4��)����j���������*5k|a��h��)v�^q�[y��n���4\r�-��n�.(�R���n�G4}y���AF��RjV7��	��g�N��,����g�����s�C����,�e-��|�];;�+���V��� <��LU �����Jn�9�3Y���A�������\�5;�s4�~��_��l��>�8�n����{�@�f�rKWx8\$�0	�����v������K�.���s�e��f��@�	�E����E�-'�-x;������4����S����:���D�/�u�0XXe����i�P�'���C�^�)R&���t �X��d��Mc�o��8.�,�=g;s�x\oi\��O��nzL�(h��c[���6��z��p'�����p3�#�7P��d�M���|8��_���S�,�f�������������:�xdX�,�3�A{�9�f��>N�^��H[h�G�~���M_0N����	���L4�u����]u�����e~���^_LI-�)X#�e��c$������[�}��U;FG�E�v���{8��'x������������������v8�<�p�.�
���2��T��"��p�RBj�e{����{U��n��&a���$���H�]8�Y����u��mv����D~�-�����1�@~?�*w�9��;D�z�*?g�^L-:W�����Hm�t��Y������r�`/�Kf]����:vs6\��s�B���-<��Y�n���#��=�h��?RwWB ����
{���k��C.���tl�o7��
�:d��[���5S7\�����!z�����	��Fy}u��VZ�,��L%��m����i���d��r��4���+4�}�����$6��;+����7f��;giI�X����9�`�d�M�Cc��4>�,
o5n�{�z�|T��p��N�X����|�b����-�����2��=������.����&�������:R�������]�
F��a�6�����a��T���!�N0�(s7�52���,�b+��f�7�'��
�2*��������V�JT^8��Y����[t�s?g��l�N��+���~�c�D?�Dhjk�����;�'��������d�v����{%�eo��z:�c��;�������I���a��Y��,u�i����e���p��+�$��	�at��bC����	�E�p��������W��T(�
z�
�`��"�Ku��3�sCc�Vtf�i��),�}5���U�s(LX�b�-��>(D
z�|G���}�'@�3�������}��V�����AN��9}��lU��l�o�&/:���p�u�K��,)v��e��b��V����DWj8/��/ff}���X(l���mw��o-{��f���l�Q,,A7��'|�����Z��K�~X�&6m�K��T8�O+6������
��o�w��4�b�R�K�M�q��CL�;�����D������ba�/6������Y�}1���\�}�v����f�ib��'6��w����>��P��SJl�D����b�@��X���n��������^89��`�b��0)����R���f����
{V`-�a�jbKf{�������%A8g/��qY���C	�K�3}lKD���:b�6����,X��kM4,{�*d����0n�I�M�d:\�,5���}jw�r�6��N�_g��}��K��Q�{YE����ax,�=+i�TE�f+�!���/�p�h�`5biJR��~�e�>T��~`tlk?[�����/[�/�'+����������������ek?
�.����("\���,t*]V�������Z�����5/�.�\��C���������bZw��,����x=�o�u����b�_�y_i7��*V6"z��W��j�����y�E���p~��Rz�O��7!�Q����ig8�d��l���}��#��Y�����t��kI���D6�
���MW|��P����.���$c�*Q��3��.�.��a��h�h��e��������G�����Ec����N�f����������"��<'b�O������c���� ��
������M|T�P�u9$�/���Df�}x����LHM7�u�3�w�WC�����4�nz�0�h������5��e�6<:V�dM�b�+Kc�qAJvY�}1����U��	�bF�+��O��]�c��.����>�s6�YY����` tJ'�F��wT��B(����4�l��mP�/�%l��N�&
J��vgxL�hZ�l�t>gs���6�0���	�;4rj��]�Wu�3(���X���"���\�oA�x�*}����J1�������u��9{��nv��~r�� ��,��`�&�I�V�dmh���h���c��u���8���?bW��]���H	������!�>�k�/��
��������:��+A��b�}*�6�^�K_43k��_�����`���?[X|�zZ�++��u������Bf��}a�����_��9��|1����d(b��!��T��/��
ky�0�'�1�Q��������v,_��,z��~��w����V8��b�w���
��5������M�#/�����`b�mF�W)����D�rF��������ZDC�������T�^��#h�>��<�|�e���{�����n�0��3�bSvw7���<X4
h$����`��������a��L�����K?�u��7����
�Q�V^	����qL����p��h�n/;����V�-����Aw������>0u%	pA}Y|�������B�n�[���eC6���H�����m:��V�V#po(hj�?���-������X���SQL^Im����U���h��5>(D��hZmK�M�~`ZE#C%�����g��������������[��^�i�������k�mv\�	���I��V��^��T4�#�����>O�\�H����/���r�����k{A����9��X���N��t�����i���0�
��0{�oYba��L��{*��b'�_6�^����V�w�����n�1������i��P�v�{3K�����fY���N����l�M��fo/�P+(�pb�m;����������E�����-��oWo������l��]j�����_���,<�S,�&��B~����f�����jx8��R*�At��1�M%_3�C���������ub_�I��.�����7�DC'���B`��D��#s��Gb3�v����+���B��������������p�@��g&3-{
^���s[�{���hx��Xh��-��S�k.���=z�w��V� �`X��+%v�}���:hc9R�\o-�=O���lO@4��ydV�m�y�����9����m`3�����fY���9�����Q�Zh*��<����0U4<�Bl��,��*w�>�SokOox��?_����0
��V������Y�h�&������e�9?����f���G�R���fbL���x�6�7�|��#����f��\��^��Ol�_�]����+vW�}Y���d?g����i��M�:�*���l�v����8��?�����]��&J��O��pv��Lh.A��?�]Rb��[�������w�:Y�����v���+��6��p
`vU�X����NA�t�/����%/�	�ym+o{moV�/��%��6�bE�w���#=g��W�[���m�������U����6���=������k�����[4����_3b�*���5�����"�"�;1�	���o�n>'�l��[�4�
�u�����g��]���qY9��-|�[�{�O����w7��	��
����:��m�|'��������(��	9�\x7�����W����b[x.�h(F?���M�1��tL�E�p]v�,�
��+��j����	?..��	#�[h��-����V4��8
\b�ZQ�2[�]�x�-�l8�x��b�9X�]�# f�3]�������K_tc��b\4���;*��Swn�|oN
���v�����/'�e=�������I�DO���P�Ap��F����s6��r�6����M�#>XZ'��-d	pN����V�������Dte���\�z8���z��o��x�����B�R���r6�hX����V����$�-��a�+�>����,���w����\���7k�T�a,����4T}xd��i������O�������7�x������58�}a���~���v*�m0-
n���l���rI�anE��J#�-���_������^�/L���_������z�����(�b�}
�������?N�J�7�
��`���
7|���o�|��t�
V~�����]��'f�])�����I���t���h�oY�t+��v����t���������}������BC��`�~��R����������vw��`)���l��;�m������;������U�R�V�v����`�^p�%��R�hE�
cui^a7o����
�7�v���b�",��
��4l�j�����
�2��;�����C�X(4	�������CX*���$���Y&���98\�`�P�V�K_@K�<Y)���]G"�
�~�q��,�.~^h��	Y�=�7�����f���"5Q
����������#�	���:�<f��M�&�q��~+E&�B/�hZ�+V�ST��t���������i�|�S��fXD&�n�q�:���pM��/��>E�U�b�����&���ba-E��mx+m��Z4<�#��5�pS�|w����|���J,���U]��MmP)�Ho��p��`qS��h��j4.��i��'��"�Ot=���lE�g�l.�<-|&��P,����!�c1�����'{��L�%6gV��|
�9�
�J<�>�6�xd��/v����m^�M���(�qaItN�����jw��/�s]�n��������b��}�����m��M�j�f_F��X(����R�(H��x���0E����>���]���\�c�n�:������8�;^�� ���b������n8��,
�X|������,�L�������L�X�
�
���>�+�,�T�%�������u�
}E?�{�,\=�����m:bId����|k��U(���}`\�������w�����iE���u7��	��y�[��!|�B���8�v�$�S��������&m*7�v�~,�UG�������:zb-��S��f4�e�����~s�,O*�4������!z���`Y��PV���e-9f]K���t]�yXh�����z2�Y����={ta;������X,�l�R��n8G0����
}
f������
�J���$
���=�y�9n��k�=���.�K����K����j���j��9Dw�^I
�����������eV�!���]�+��������s�)���X+�8.�B-�c��������_�d����9c�]�6�����v��6;�vS����(���W�t�0H���m�+h:����P09���s������9:+�u�a�gU�E���c`~]nXV�k.�<v�>�Oti�������~��������6������;���~!g�+,^
O���0~	����}+����Lp
�&�U����K���k[r7����I4��{��$�)����� &��X���|p�9;X����^��������Od�������s�T|�p�F���Jw��`��O���O������v�H�@�P����	�D?��+�N�c����X��Xw\���2e�h�\����Z��0W���a���t+����9;�[sw�6a�+�	?��}+E���>�QD���H��}�;RjY�#l������6�We[�*]�z������t���L��fR����9~�)����K�X��>�#����1������Y�c�/M�u���g6�u��Ge1]�&��M[\��u$�l��_�
�)��X\�+l,�-�g���(,�}?[�w7��	�)���._1\U4.,�������|���L���X���E8E��������p���>+�������Q��M*A�#j���1#�����Rvf�I,;3���K�.�p�c�r�a}�h����V���M��Q�s���?���6�%(�p��c��K|�������N���{���f*F�/L�M�%W��f~`)���,��`�Jn����N�$���C��hX�.6g�vS��
n�
�]�Gl�[����D����.�!&+4L��mBs��.���y��'l���p����+���3����6��a�z��E�)D,�Z��?�I?0/'��m�L�u����	��RQ��ld�`�<X�],u�:�*�\!v8\�!�4��81A�UO:i���~��vf{�i��i�����
W�0~�H	
w������������b7E�C`�^k��[�T��8hZW-�g�]p�G������Q����S$�[���h�����W�u��
��K�
���B�����5�r�Z����v�;�����h7��6�)$+4|f����Vh�Z�+*XZ�&~���+	��s3��p2J�f�`/�l����"�����DRh��Jd]�����j)y�a�_�
�@���Xy�6)}����=�9[q8��k��]��Jl�W��$��r�	�����b��$��*�V`?P^�dY�hv~���q�������Hgw��a��.�������:��[K"�[����}��`~���"^��:�|����[E������[�=�.�Y�u�:e�����f������������P{�m����U�K����'����4�n�OZ�E7V
$v����v_*�u���u,�m����b
��D�lk�,(�BI���*����L0$z�0M�`�/������y�{�r��X���h<C���������+�3�B ��U����}�l.C+�K���������Y�����;g��ba�]���,|����vt��]�a���w�f.Ib�R���4���s7ES���G��J���fOl>gnw�5�+�4K����������i�E7�3%v���R�ew�5�K+������E���j�{��~�w��
�0�fF���D������-�[�5��hS��AX����0.k����)r����E7�P���6�jQ9<E�tef,���(�7k5��������[���ztg�Lb�����`��j��m��a7���5�4L�;R���R@����i���r���E���������>;�#6'^�Y��,�-�M����P^�(H�����9�D�B�K�a�3�������3���fLf+{!��w�v]�-m�Y9�a�/7|%K�_]5+��`�_������:�`�]��H[9��[W���\t�)���g��������W��v�n�z��������v�n�y>T�p�H�`�~a;��n�yg���'�Xid��,��
���?�������)=��Ua��67�ye�M�# ���[������]L#�k��/������4�	�m�%�Z������
L�7����yz���n%<��
:G$��,�rt+����
��
����u���+a����uW����D�?��m�j?��;s#����2��$��-�Dx�^�������H�
?k�]i��]�C�
`	v�K����:nb��YX6"u�����f��b�^jT���'�V�;*���`w��.��"����6hw���=��2w�$����p����UA�l����x����/��j�6X��a+�u��;�����/�`�Hln8ggAq�-���k-hZ�!�6����������&
�nz1ax�|��d����7�A�������:j�o����)6��aE��J����?0�����~��S����m:Z�UA����pVo�?��(K��_���cp�~�%��CM�X��s��_�V�f��"��xU�\�kl�O��
���@A���`�\b�k=��9t��b����"9��bC��C�����mx��hx���|$��R���
y���a��(��*���]��!�1L�%������Zf�Y���4;gs���Rm����CfhXt,t���E7uT���a|i�H
?��7�������`+'�u����U���a�^0� �5�M�
�_�(������j%z��?i�+��vag���p�y��[��\����8;��I���f�K.=���I��9�`'�L{�B��m:�co�6�{�m5�0e�k���[��8\������v���M�u���plO�7�3o�i�3,-���r�W6��:���;���}�������Nw\	�~�rX�t����dg�Q��������:8���0�
��NU��M��+EI����F���w*��\�\�Jxxbz�L��g��4n���~�\~8\d&��%�f��D~v��[���d��<����c[#���<����~5��f��5���'=��v�9J�����K��[�_��n��"}-|V���������R���w�&����p����9���a��ROf�C��s�K�
_b����������������Un��W�q���|�n�$\p���qa�t�L����VXZ�a�n�����pF`]������+;�������p^�a���p���V�����������"G�.z�5h��U�p�����<<|--���4���e�kY�y"����e�j�WZ-w�]��D������-��^K�_&-
7V_K��������	SE_����p�d�0������Z�
�BP��}��e	R�����-����\x�QL�*��2��:mp�ns�6����-�b���]���������������
I��b����E��7���+5�N��n8/�,*:�~��|V�l��w����f!�nz����i��}����������`W�F��!�e��sy�9��:�������k.�#_[�_��$~b�e�4�q9{����/3D���V���%�Z�)R�Vm��~a$�TW�`�wq��������x������Q�d
��fOc�-����Z���4sa�eb����<��Z���-�0{m��������s�p���y��P\����@��\��0����R��f�@b��^��������_V�&������`8z���2�����������:{�V�v^��_!��
��`�����bw��QYi�h\\�W���J*����aM�G�ipI�1	�Lb�������e��LO_�+�����Yp}8\]������r|6��OMh�ZuO�
�I�6&�K������������XuN�R���k7�cV/):��Y�I.�b;�b���p���_��_V�#���2X�+v�rs����b�����k�1
��7ws�6��q�������np��������p��~�aq�nAx����J�a�
�����a����D,b��(���~�������/h�H
�����'��������'���_�BS���KG���*��Ry�I���p�Hx�H���6�w������E������1�c+Mm�C4]����1��_
}����<�����b��c7E�bX	�����Q,J{�K�^D@0��`�h�fX���*D����0q)�um�p�'��`z��6��9���DA�
�G����Z�������r1�����p��#�>��#����w�~,]��B�l1�����f�n8G2��.��1l��w�d;���b��%S:s����Df���:�������w�n
����`w��E�P���c[�����&��
oZ���"�6J	�`���Mu��������L�� X��\�k����'=.����[�����������E���'6Fw����B����lV]�.��L1
Uabih ��b+/ ��_&~
a��*�~:�v��P&�e��[9b��9��
���d�����8���&H�~`�]�����������/����p�F�3�V~\b�����0o��}��VNZ|�+��n��;v����}�
�g�^0�`��C�
}*9*��_����b��pD��5���6k�_����`�����Ul~�vS���A������/�J��J��u}rR�&)����#XF8�W�V y�+����/sC�-b%��_��:�vn��y����2��������/������������Rlw�^���F�8,f�M�\{��^l���y��_���VzOm���m��
K���}��:����L����E�/�M+�X�<^�a1���0�
�QhnI�K_EJNT~��	���_{]��������aWB�T���R�L�+�n��������\���t�b����4���Pl������&����\�0=��j_Q�r�DA�vU�w0���;�t�y����Q��^	b���v����BN�J�e�������@ZZ��\��Q�[Y+���~���Zx�o���*���tES�V�4�]�t������/����)|a@,,3��0���*T&�L[|����\
_�XG�EA�6��L�+:�C��k�E����J�a��`[G�Y�G(+��=1���}��U)z�]h��-�b�?\3��m���ux0�����1fS3��R�/EO�V�#���6C%��+�@������u��0h����r0�<�0l�l?X4����� ���^�f�fF�D*<�M����HD�`�H�W���\����Y�M�*��gc��n��)��,J,� �b;�b��[4��P4���6�a��`���u�}X~�W��@bs&q7EcXy�i��m�X������sx�����R]b�K��M��lcOV�V5�+�+�����Zlg������z�a�0l��Ys����������!�<=a�&�m��m�=�a��`�
��-�a��`�1�����M���:�as����ao�'i+�`�����n8�,�,:����\�p��B-�������1�p��dV����c�m*vt��������q�b+�J���AgU�����b����^0���*|S�L;��V��1^�lwI�S���$�������	!�e�'���g�� �1t��������/�(#����2��
�E�.
����E��`_4l�����_�n����K7o$��
6��S�I�>�
�a��`�_������"����R�{7��'��-���}X��X�G{��%��I^E����p�b`
'�I_Z����e�fbW���M���*�1�"�g=��RP�������#��u��"6t��^�ZL����V�N&��U���m:���M�ZY��V�^[�J�A�-�`��]�UAl~������E�bi��S�.�$v��>����
���j3����"(�m��;,�L�%z���n8GA���y��Iln�,�p[�Q���q��2$����bYm��F��J@U�"GnLN+�S]0�aY���S���B�i��`;�����l��[\�>���a����u��1�
b��a�����_X��uf!��w���+�c|���s�.��;���u�A_��)�|��9�����Fa]����u�	K%��1���-4�
K�i��"��jm/Ts�n�=Ll��=g��W��t�F/u|���1�[M��L��|�OG�1���A3�����^0�(�.�R�����x���h�fy�$b��`;l~��0C��D�4�a6Kw���NL�p�zU?�����D�bX�~�:����E����U���F?��r�0l%�i���Q��`�h��0iw���|X4�������D���k�������6I�Sp��T�^��(��V�O�S�A�?��
�;d��l� ,��U��^�c8�V�:�A�6�=��K�����0����9�y�!%F�X�_?�X\<��^�je���c���E�`��L��'vu�4��#[2�S�fc�h�]�������b�
n���K�-�~��^�l��'�q+�#������(�r��\���htJ��?12]j'o�	�T�a��`��
���
^b+��a�5U��a/��:�����s��St����
�sA_���U��O����b����TG1LI-�V�hd�16;�
,}�c��pP���{�LU����d'5<�L��=t���}�I=`$"��������lS��Z����VR�#�E�G66���+���[SU���{���)���F�DW�Y:w��=`nm��^�N�,\�����@4l�������K%O��������RG�� w7�
���r�����T�/�����.���|��Y�=�h���?�p�x����8�eA����Y��
6�'��t�s���e��������B���:v�������h�&`�[��%(���RhW��vY�/���t�8�����,�P{l����Mk����G��^,%,���yw����~���2�,��O��R��n�.O�i�~Y]���v�v�z�R�_���kef�~��'��
$�j��a���b{�HaZ�=�D[�*���"����/����	���ww9|�p��N�~�.��/����{��/��������p���l?g����Rm��,m,:�(w��_�9[�J�VCO�/(�df�%���Z�P	"6�Hw�������n���i�4�����Xb'K��������%�l�
lZI
7�E�0
n�3J(l	���H�6kX�%�3��Y��(�O��a�\��^�^l�Ct�����Pm�d.��C/���C�s6{�w����u�����M��'3C��,�+v������b6RO������n8�@�*-zN��6CC/����4��������u����L��nz���u6���P���|�����-�����/z%��n8�p]�$�)��%~������f+�v,O�l��gL��<�3��� Y��3O��/:��u���=�iSr>6�p������p���Y���i�����h��l�>-J�e�;���^���������r�_�o��v�����efb�k�U�����7E	��A�������.��'e,f��bs�rw��E��X������1w��X�AC5���N����m:(`V�n�{�<A�k�3[�kM[�'kT��.��p���l�����m0�&n�=��f��9Ms�O�������D�d�\�
V�i��dU�Y�����Cb_�Z�k����yq7����Yt+���E�&�$N������������JV����Z�D/�KL�"*!����#��l�XX<a�Z������U�f�[:7J?
�*oin�[*��:���f���:��{���������7=E����w�=��M6E��1�T5]�;e7A����#���s7����|0��;�� �-�h��[���J��]���`��D;X��TEB+g�N{ta���I����4���!b�]�.���
��]6bXX(-%m�s�
;�7p�4H�������!����`�[	"����+M^YX�,<c�����JHh)�d}��_���8�����.���8;������w{eo/kVi����&���ln�.��v	wS�P��aM���A��}*E��N���K��j��/��jX�l���W���>�|��pA���W�����}�c�a��F�o����Q,W	6w��&��",�xu�'|���R�����H������U�ZX�~ZY�����
�\C�,�����	k�%[e�'���Q,�����~g�~�M�C ��#&�-t�Ob��`����K~��T��sqt�yj������EA�rPK^�;Rl����	�xej��U*��D�V�;���= �+��6���:t����Z�s{tIU���'I_'����5G<g���
_�b�������'�l�aW���5�Zae�T���MO��6?��d�8���=�9�x8\�0���#�J�m��d�J�p��[�z�6���qk�������xSG�T^����g�4�0?�w$�N���<`����:��uA?���4u2i�i��4>R6�NX {)LX�U���|:a��,��Rm e���o
�=��vQmM���"�U8Em�^:��E1f!�k��[W�V�i���i��VL6���\E�����?"����n�K$��J�	�0�y�O.�0�!�'��FZ$�v��E������R#L�{���c<N4�������
��M�n����9�����y��,�� ����y8�����&��AoS��hA�>��fE�nv/�.z�D����e��b���Z�
�x8�w�����b_�Gj����^�M�e''LP�^�`"6[w���R����q"�-�,K9aS�h���L�,b34=C�'���9�VfS�fw���	/5j����z�#�X����U���Uq����g��b�H�t����UY���\,�<�u������$JbKn��*�M[5�����m�)���fY������t�7�h�;��,���lb���nz���@���\�9�Eb��t��6L��]�4��~�l��0�w[P�,Ls"�p8�lgw|�j�.��"�>
�cb;k�U���P(���&�SY��h�>��?��b'�-�/�^�A�l��;������E��^D����b����+�Aj��p8�E�mF�,�c^_�}��t�
�,A��W�/����
}����E�����M���X���.x7?����U�}ui�>�2���i���;r7�3�r{��PV&6��ww�x��-GM5�l���B�i�w��g��3$��e7b�d)�M�c6f���I7��l�X���������L,�x
_����eY�����-�g��	�P��,�]L$�a
9bG�/����W��� b���9{1���4��"�l�m_4<I@��Y���Zqw����5����|a�+����}��|�����^�^��It��N��uEub���b��&�J���p��X����pT���w�v.�/>����s�b^_szm���S����R��J��M�n�=`�$�k2��}	�i?d7E�d������B���\x��MGA��+�e��#h\����p�&�'} �����~�6r��{����^IZ\�`jO��B����Eo.r9�#c7�c��*�K+�T�k�-l�
E�f�S9$���L�	 6���^�O��b����K?���eM����y�����f[h
O�1�>�w��xf7��*�`[q�(]t~Vw�y�cv�e�,�C<��%kb�2���u}��g5:�x�5�?�n��J�������`/X�yG��J����4�]��[v�f_��p�7:K������]�~��a��}�}���n8}|mf�:^xX�h�V��������hY���'����Ax%�+�'��.X&�m*\�
��fD��e�|����Dn[�V�l%�n�����M|7�����l�Z����S��d7�IX1-nRHa
�B$l���p������7)^��8�G�0c���U�����w��p�	[E�T|��������s�k��e8�j�i!���_�.X�4T��Ff/�`/�K	�R
j��b�W�����p'`�l��� \�.�v������_���7t���m�m��]G��4����r���:����/�n�)�p�=�9�t8���J�\�JX��������`���������?J���Bt�i	�������?_��s���J������E�/CIS�������c����ISEWJ��L]� �t�uly����|��v�R��.�R�d�(M��a�����;X���
kO������_G^��/|����p��I���"��;,���$>���p�j|���|��nv������������E%��t����VP�y�ms���.�'�t�����y[���2U�|��n�j!3e�����04��^�`if�
����3�/��^$�\;u��J+��������q��o|�i	���C/��,�-,����^��?;q\-�np��_�Dt�0������8~b^[���9��S�Ku0����94~��� v��`Z��M��s��������@mOfsh����K%D��y��������mz��z�������K%/�/zI��h3���l�q�������O/�T�m1��/���WJv����p>�m��~Q.�ln0>g��:����m�E�tV~��7�.5���fs��n���������p�{���/�|��R�@�,;��,������i(��'�,
����\�.�*7�3���P I�i&�3�Q���\���������q������2�f������1�L&��,���]pJw���Q����O*���"�7,R2���S!�����if�5�Q/�Y��m�p����>�S�t���6��f���6���������<������0���A�.10V��?g�c5���`G�����P�����NT��cQ{�YVO���B�x9VD�U����}��i�p��v�L?������:�|���6��|U�m��}��3�?�
�}^��/��m|��P9����u�6:E2��md���������Gc��pg ��|XfK_��z��o������f��{��g7��0�����.&�����l�/��u��f�n�H�j��=�f���R��<b�I�}`RP�S���p����ul�nz�!���,pf�s_�N�l.)<g�s���#M���>D,��M�|�K�������"����������t�~����qS�z7���Q��4F/T�hY�����E��I��;��}a�EB\w��a���yY���G7��pH.��f������xt�S�G������E�����=�t����=��,-��K�_r�"�f��1�
�~^�:�0�a��_�>�u�����(B�h��������]:@��i��*�7�2w��h�r��z�Ga|�����]�M�t��pQ_�Y��2��B����S��
�����v�9�Amw����9�T]���?��u��n�=���g~m��s���~Q���+���~$�O%k���"i��Hf����c�Sw����R3�72{{�K�-=��)r���L3�odX����X�KAHvl��qt�Y�w��Sq���3��|�"��s�O���A�W,�:�O1���!�����`�>�VBHH
wWt����}���t���Fs��T�����Q���`�.?3lF�9��T-����.oe�{�;^DNi�
n���)Z%qF��u����0l����j�ca����Gm�nvj���WGpr���	����`�Q����&�!=PO�����+�|��1�n���pQl��k�p�Jw|~^����T�r2�lf�I'�7,�ZW���&�@uZ)gX
l~��n�!�z�pxm����Ma����R�!5{�����H��C��m��j�G�������]���JIjv�M��:�7:<F�t��Ju�������.�t����pP�����v�(4K��`����)rd
�`�"�`s{��R�"5���8g�X���V��.�(������Y�/�iKs����k
������a���JG�j!*\3�
h�*��L��tn��
��"A3i��S<���5!��^�5b��E�
F"c}TEV�-��t43�S��l
	��	��DRa\�g%~�q�M�#X>�W���9�`G�^������7��,���A�a+Y��P�w��-����g�!��k����R�3z!g�i��a>\W��qP�!Gm���
'7/�����>���@s7�����a����_]&�l�a����E��+�52}�
^�:�W�9�M���u�
C��;���a�����VD��u��`:\,]$�R�R���z��X.��
��!�Y)�[Sa�A�0�'��
? ����p��ue98���:[�t�GKy��������h��	�/����le�]�`4;|�,mwv��o)=X��8���c���"K�WeAp��J�n��q
��XR����(���gg��s$�N0��o�`�]��0��`l������|:Bc��K��ek���6���/9����h>����r��U��}��&�:�[�n��m��.\S.�p��>M�,e"v�|�nzoO/ZDC����*��O�(�������`!��|8�9��Kl>b7E�S�%�O�v���8s!�.�V�_��}4�J����@�����qD���Q,�T���oT�s��5��|������y8/�~
gm4$���5��6�����^�3t��h,�"������C�5�>�s(��*�
T��d�����	��%zU�,���M�8��m���<�^����hV`*ZD}��C%6���f��+kz�R��n8/�����������=�����7�J�Xe�����<n����h����D��,/'�e���J&�':�����.��]��:�V�n�����Kb�OE�#��`��J��#4z�Q���fY'���t�E��
�;}��CW�w�1��Rt�d�|�����mwbg�	�|:Bc���+��O��y8��]�b+�T4[�����_�b��p��y����e{uB�����]�L���%��l��X�{�kfZfM����W���I7��	��)���������,����?����A��8���Ek=}Vegg�cb����]t����������6�_��TU��0������
f��v��_�iWqw��c�"Mt>������Pl�B-\3�4�l
9���	�E�T����Ln��-a����R��h��7� 
��lY��N����N�s* <n*����c��|�A@b_��}�����Zd�*��U�������	����)c��T�@��A�b�f+E"��C��h��&��h�;��al���O�0	v��!y��o���wS�@n�M�������f�y����6i�m�Z�p�(�f��Z��S0o3�Hi�w��(�f��QTX��F�E�'bey�_PA�k�����K#�����jW�Ra�����?�U���0��o����lJo��U�S��oV�����n���Y���:�N�n�1��:~�v��R�R�1tR�\�fe�.�N�m����Q,�J���RN0���~�v_��2P��S=�n����(��P-�?�����{q��Sqv������E7��,���}amM��pbU�:��l���pz_����7�����Z+a���1��i���vV�:��P�e�w������-��A��]�:��JAw��
?��k����h���^j(?
�b/���}��c�����d�>l�������h�r�]jr<�r�`K�Y�-7X"4�SJ^��q�<��sTz���'�r�h��d�`&c2\��-<u�7�2
c&i���[���}+�S����Z�b�l~��n���#��
K�5.��6'�vS��	E=�6O��Y9���2�|��n�1��y�oK��)����_��s�����Clvw�.]Cg��_f$�`_U��1��X�6�U����Q�4_,��X�@���C?k�N7����r��gHU���R����~S3�n8�]p9
��`�u;UE���0
�J{���u�3�A/������+Sd�|�^i�3
������O�}���q��4{��lKt>�b7�C6&i6]��7[���L�K�����d���|����	l<���AwX�����0����k����*M�67f<=+	~[����=&������^��I,�@i�
*�f�q�������:?�������kL���q+������B>�6����{�-��W��J>���S_�%�K�H�yK�}�����a*5ex���R]��J4n�t��,��+
��C7��6
�A��t���RZW~��pa��R���A;�*��`�+E~��up���Xf&��i��[��X��W��a�w������a�>��W���n�\.l��� ��7.g�k�u���e�w.�=N4<�I�`�XXUe�<?yY�}�=e��������XXJ#v����B�em����D��������B+�/��4��
�a���o����b%��Y�����U[���{DK�������a��mC���}7E���=^\|����l���Eh���Z�3��L�E�����zY�
�-�����ny8�'��-+�*fY��XxL����ZT~���tr���s���&�Ee8G!�.�e����\_tiRI�-o�0��*�������E�FW�/�]�e��B�_f7C�aX������p������s6Gj�K���z�E��`�v���e�u��
��)������;$P:�r�W~!��p�_����$����wi�����^��6��vf>����~�IZx��q��f���M������fax6��M��/k��\����J��r����t�J�EW�J�,����pJ/bK�/���^|��X��'vU�e����q�%���M����z��/�K���9��o��eSb��uw�F`�����?g�r�2��X�e�K.lS_�_0%o��e�fE�}L���PP������E���.��ba�,k�z���V���;�[�AC����q����sw����f����YlQ��-�����p���w��s����_ua�Ku,�A���i5n����0��{{��J
���K�d2b��u�)r�jjD���0�6?��M[���g�=��~_��_�6.:����3��	��Fn����qa������x�een?��F��
B���ew�^a�:�|�����|A��}1���Yp�_6h_��Qt���f7�e
B/XL����Z�M��^.&�]p/XZ�#�2�c���4L�YSW���V��^�H}7��`n�Y<�&�9���#X�[LE7���e��P��g�de/}��~��cW�M�8���3S���K��p������1�u���B�����M,�$t/4Z]�_�
t��jf�!���1�T���������n8G��i$�nGH�+���0v6���)r�	?Q�\���/��&��u��>��Vl%Mf����;������q)K�/X�t��<goX/'�8\N�V�w,)�&d���;g��	�M���m:�a��+�vK�s���pw�,��������U�������]I�
U��s��9s����Y��K/��WP�m�_��U���:���F*&EM��uH�<��WQ,m-���ifM�v�3�{�����~��_��K�+�����a�X�����/=��� ��������s8Z����,&��]���������B��i���TDlAzY�M� D�������)�S\�f]�n�����&���`K����_p�9h���������V�_�/2���bL�Zq�Yj�S^i"�k�b�q��,����-��m:����Aw��,-�v���l���Dle���r�q/S9��	v�$[�������`{%N���*1�2H�R�W�\��$�lH������I��eW�OQ����i��n7���_]t���7N����G����:g,
�:���;��I�)q%|x"P�EI���J��~k�i3G�����s�S��	~�IE_h+��bFx�0U3�yWy���nrK���������m:N���A/��2��������d�������~����������_z��"����E���^�p~�e�8���3��/l�kl$�f�j���$��]qE�du��A7�y���s&��]�
=�Y��YU�<.�6���[	0����a��80�����Z�O� \��6�v����I�E/�5&�>��-L����`ZS�NZ�,���A��� e
��^��pzc+;������&��M���[z����o��o��j���X�m�q�(�I)��5Oz�����b��v��,�3�����T�������|�����|w��/A.�t�v+�>���l���5�f5����6�������_5���"�MQ��7_���#[�b�#>��/|0�6��C��G,\y�����m�&
�E�#>���.������EZ�)��"8\l�:in��o����b�4����n���������-��-\����
s&�a����W`�������;.��.�#�-w����jEC����I-�������qh��`$8��;Yc�����bs:k7��X����I;gY������b���nbw���5������n��o��
|���E��j���B����3��^A���4�t6����F�����]��9pc�%��g����
�=,�V1�Y�ffy��J-�g�n
[��������h�����=��r8���1y�N��k\Vc��/�-x�G=w��i�/k�;���w�����4�nz������#��r,�ue��e[��w�#��?���_	j@��-Q|1��w�V�a�����
Aox	�_����9A�����`�A��;����VO������S2�iym��wb��:��-*��<��������B���,�v�9��������]�W/�wv�Ls�z5��
R��������D�������+>4��?�����mt��M����X���������PB�,�Y��*��������tVB>
g�����B�fY���M�VSS{,����1�
�j}vb��-6%�����&kX z��n���bYI���[d��)��t�[�5m���j���jX��ba�;���(OKd��5;0
�U8�w6Xx�������$<L�^4���T��d������M��MZu��{;����#(]YO���a��/x���?��t���o�����6�`j��3���`;����u���
n��)Qp5����DD7&�����9��+G��`<��r��sWH�b�w�VLKP;
h`4U�������=n����j�L�D�`'�W;�oRM4�eGl��f�w�q������B����Li��g�X�	6��N�i[����a�o��?�w�C����(�YI�qK�y���pqpK
�~Pkx�RK
���V��,���J����]�DW�V=n����������;.�����9W^x��0�4��E�������6����K/����V"9nh�lDg}��p6FXc	���X���a�%�aS���B�I�@[d���v�`,����
�[���J��'�ho�n�C�����~Li��]���]V����A�S>H(0*v��O3N��i�l;���x��Z���@.�����!��
����}H��	1n����]jVc�Cj��M�D!w+����� ���{����������
6����Rj��w������Crc�*�!���K��!9���pS
�8
_�`s���S������s���p�a�$B�42&��^����:����A��/h���H�m��T�'��9�4��X�4�.�NuQ���`��s�
jI�3fing��������X���������&�&�-8g����n�Y�|ro�Po�	�� �O-������������A�P�8\h���N��Ov��,Sl%���
h���\��&��OB�V�}X�4��2?�pOT~L"0`4L2P�X��|��b���������X�MT������)��-'X���nbgr���j��n?p���g��'�������j����u���o����X��n�����[*�i��C�,����s|�C���`��a��������
�����0�����3�*�IBeum��H�����`��{����1m�0�u�;����lM��+Nu(��H���T}����hx�v���[	X���^
���dqEBi���>��������(
AKl����P�}c�z��;Z"����4��SE��hvw�
\����"#F�`��b���4��S�������f�r���)��;�9xt�j�T��C��0��hh�}�S�#3����"�bs���
=����s�������wv��N,�{\��"�.45i�
ot�T;��s$��i��S�/m��I �F������f�b{����9l+�E������,��z�,l"�N�������3���,�{��m �D*��z���f�����EW�!6+�7&-&z�R<�K�;��sfQP������t�X@4��;VH��%%�P�,W�X����Bb's��m,rf��y�Yb�1�,�*t�_�4S�^,�Yt��?
g��e�����`+!�f���T�'�r�2�<ix������;%��V��� ��+1%��z��A���w�Yq<��8�������B4�Y�A�����jd�"<�k�5�aA�������y�Y����������%5�e%��5�e���w��������hX;a�~g���O�J�OKd��%�����-�o��O\" �15!�[�P6��7z8H�����W{�V,����&
�BvM��v�'C�
���e����S����������7h��R*��\�0�l���V��"K�6����N�J$�C�V���sJ�?���[�Jh&�.��
�J����uK��� ��>�[H�h�o�@
�W�����G�`>�����X�hX~&�A��4��0�+��NKd��+�����G�-|���Xh���5�X��	�Z�p?	:���N?�`St����4�Ep���xd�b�P9��h��q�!6��78\����o�v44���uN�0�!XV%t��������q�0a�^����l/2iu�w!7�Yj��=�).��"I~Wfj���������p6c�-AZ���q�&K�}��)�B{�fm���Ag���p>�X9��Y��n�n0�!��������u�!}��H_�
���T����z��T�dp�^�.�|��/�r���4�����4U7L�Wt��u�g������,������T���i�>o�/�O�z-)[&e*6���g+ MS����z),�.������'E�������k�Qa�t���\�X�to���h��pb?��{aL���lyG�mB��o���8\����%t,X��.t}hdx)�������D6F�gI:���,��#v�a\Zng�������y�A�����`��b�$���n����B,����r�������gUO��[dC��f���dQ5}��`����EC�z�4?�K�������`����4������9Yh��,V��}E����	�b���W�a+q�7���5,���n��P4t>M9��W9�^��"��S��s���
��gN��V�E��f�<b/Xs7�6�e��9�C:�Y��h���sj����>��M6�"��P�,�0s�% ��/ �	}��e��b����J��
��f�6�f�obs��w���h�I3���6��H��z��~+�����;<���g
���Re	;W*-��J?wa�R����f��;������]�Y���.�@b�T�gM�3S�	
/~��d���jz�����-]g�Z,����X�n0�#�7x����d7��|gw�������5Cv~g���2R����-�w�������4��6�[�����������XU���!���4.�i�*/�E�T����l��aA���A/X�)��K�Z��,����H��`'�r��+R4�n�yxU�X�Da����V|~h1������S�M�����������I7�a��VmV����5��

�@'ZD���Y����ium@�8w�TM#Ck8���4g����u���6����	S��/����x���d��V�6.�w}�HS��~��_�g�~Q:.��R�n�����E/v�[Q����L�\t�[}ga5�g�v1�9�%OKt{���':g�g;+�[Pk�VX�LR4�����5)��a�[�����w!e�[��3}���N�f[��J��nU��T�M���Y5��bN�9��p��88&Ft�B�!����i����"�M��4��p��6��$v�>X�Wn(�$�L�%�;3�D�� ����Ty��:=���=}���)7y\vW���^��������D�dwd�L�������B��nQ��B����>��Dlg�;�2���-T�wk�w�"D�Yi3���r&D�BJv�>z����/��h�1��@GAW�[�3����j���,�Aln9tzL[]��!:���Y��4U[lL�]tg1d�����Z����f_�����u��mhK
��^��� �o��YDU,_;
-�r��	�����	����3P����$����Tg9��s��i8�������*H����
�)�V�F���O�M&��IW�=�!,)CtgI�ba+R��}r�-�0�^����""�@�d����S�m���%S�V4��f�fBo���*�Oi��-vi������b+RE��0VtN���>,�,�{7���yk�w�q.:k����o
A�(O�=e���j������Y�YV�a����-�������z������,��{U|���y-�o���}$������w�������Q��<���3p��+?0+�����:�����S
+�������m��
=-��T�����D��Q�a�V�����9,l�*� ����b���4DO�� �.�
������+�E"9�rz6��0�"��!����|��G����	s��^��X����U^���w��);VJ{U�A�q��!�U�a��8�L�\4+z��!�n����6E/�imK���"~����:Se=�
�)M����w���V��a��oi����&��i��vV�����L&�[�|��LB�,]�p\�p�i�l������<�l��NS��|AoV�#v�����{b�����������1����L����n��]]�Q8��S��)�pz�Q�S�?������>hCS�����*.�6�t/Q&|�^�0OS��	u��]F�NV)(v��K�S��S���6RYo�#��Y��3}?��a�.��0����h����-��uK�wXb4l!�����-�����K��t�?&��>��?l"):�D��l;�kc�L�I��_W��v
���J�?%F�V�vS�}���p������c.�N�;%�{X9$c�Q1�V���eR�gb�bi���+�s��w�/
n���ea	z������76�e0�Y"��4����n������'X��)��Bg�n�����M��Hl����|�E�����-$���%&1;�}�����$Aw�L4����y�����J9��;�i�����1������wv����������oY�f�LI���f�I�����
�f=rE�����ZM��Uj���B�a�T�����I����1n%�c��\��p�?nsI����]�����?�c�~��������~����
��)���m��V�-a��NT�#���l|A?��C�z�Z�����]W�f�����nc
���Qb�0S�@��:�U���9�����
V��a�����B�b�4L+v��S+�V���t�-�"���[����w���
Y�������W������+����L��t�aa-���8\4��~���Rq�V��tm<��
 X~t�Y^�${g����$�����:������p6	`��d��}&X��m�"�i}���8\�0�9X�j�q+��u�;]U%p�]K�!>�����c�&�i<A��+b���OuX=�k�^�~{���T/O}��a!��U|�X�����i��	5f���e���}�"'��������l~L����WV�{8t��n���a=���'D�{���.N�5�W�����a-��.��+���u�;�M� �X�dE,���K3��o�����/�~S?gi��t��i0���M��3��-����,�]4<h��\b99
���������bwrr��jk��3�np���`�\
v������fK����.���<��}��/�s�}-\�pO�z�Y{��D6���[tN�>
g#�����#O���a�P�sP�����<s���������-9������3�2.F
@����A���7���Q����?�F
;[��eXb��^���6<m��������9�EC�f�,\&j��-(�+o��.�����i������Rj������%���Y���,�s���=�c�������*;M�VK��XSln�u��-6�'$������i���X�i�;��M��O���a�c�x�����g]�@[���^L�jX�-�t�+Wk;��,z�#(��q}��m:�z{�
6��%S����]��w��W���u�7+���O&X���U�o?,H
��E��.�Y��A,�����i�l�W4\���1��B/v�,wvX�`�Y�:7l�8\(����&�ey����qa�Q:�i?:��
M�4�u�X��3U�Xb��

M�B��L1��nkC�N����#��6n�"�.��Th;0,)=������iyfzK�~�@7+`��Ma���a�6~?�R0�$��
�|m���&*0=��*�J-��(�`����;;����&N����a�E�����"��P��B[�a5j��@4,[��,'^�sn4����
��E�����*�Sa��)�����������s��bo��)���:��M>h�6.�c6e��j�����M�U
J��S5��1m��2��z,m�v���^�2X�:��������b/V�m����H��o�����D�%z�:����E)������9-��T��-���Y��+�n��--�mMhR��? ���}��mM�mM?��V����=�N�i{����f�i8�^L�Z����`�ZJ��IA��aT%�J��a9����.b,g=��������l�����VF���:�����V�Xh};S�����(���hzlI�#���P����`w�����t}J�,42��{C?�X�.!��:-��hQ�O���E���.�Z�w�����l%���4AU��Ja-&�,��$x7����E+h%k%�������do�F���`{%��Z���4T�X�-xT��<���h��h������^{��r�f�SjX��Oq��,��������~gi�$�+WK;�v���
�i8�����N�������d�ES��`�������k'���������4i��+J�`:����m�YE�I:��k������M-�_�`\R�cg����OsZ"�L����������`�i�,�����pV�8\��%�J���Tm���W�p+
��	Vb�!�)W���I����;,���������RI.xU-�L���P�"�
�`��/P���U��Z�y���R.4\]�La�B�z�Ce����<�:��u�42�r{���Zo�2�qS��iymC�_��F��2��2��1T�
������*���}C�e���b�Z�y@�4��f�3Cs���������\Q]�<��U ACe_��[���y�R��i�lw�=Z4�n�`W�j��	M����[B�@�n,�����*h&�-��z{o���?����[Q;��I��/�|�t�[�E���<ne;�����n��i��i�0p'&f�e,���i���������[�]�&�q�U�5�s���"�9]���I��TTlc���M��iy//�����;[��6->Y��hXs"��e�b7]]5/�l���7�^S���G����}������^���-������K�*�3O��O��&��xd�B[����)�L�\4��!�9h<lA�gZ=w\�6\���z���n����qD7h�X�����b��s.��L+�O��'z�+�X���q����J)��B:4��
�O���a�z����nZ26
��b����(`qM��3'�r�����,�[���H�����Y���J��i��	
��o��.��YB��VH��9�L�\4������E+6kwV�Z��_4Li{C[�l�[������'|�����o�c����i���db���4S�L�[4�;Y}�Yv�KF�I���)����6���h��JlA!vZ������,�L�fy�bsa��1my1�n�L��l�TNS����KE/�\
*����"�9��Z����i��I�n��p��X�ix���K��a�V���Oe����v&`$�buab[�=9-��hp
;��m�p���7�XZE�,�{W��V��,
{Z	��	R�f	�boxlK7i�������'>�'���Rl����b�e�����G���'�M�Y�W6�@�����Z���@�7TR37�����{tN)����L�Zt�ne����E���*|�mm���ap1�YI��24
�6I�%��t
.��j#��]����a���������	�
�
�;��f�[��4@0(�s���b�i{���V�������f��Y���������wt��T����?-g�7���)'����z�>��4������Xj$���%%���HN�kk��Y��W���uk���z�����b;��h��N�����o2��/�������e��0h-=��F������a�J�]:����4U},�4�w��
/���'��I����T2ls'����X�	��Wz-V%�:���E��f�m�`�c��w6_��i�f(�'��30�&S��o~��P�=�
�c6����EJ��oB_08o]i��DxAL`Z�zB�8h	�����e��~`�7�7�����N�S
!=%"�	���u�)m����7���l�>�`a���S^��\���PvJtO�i8[����wA"fZ�{B;J"�L^�#:�Np�������wu�Y��9�;��mp'����R���'<g��_�w��D���4ih��Z�{�A�oO������0&X�&Vl>�O+d����J���6��9^�O�i�C�s��l8�C�H��=n%����f��}^=���1	w������VX��t��<�f�	&�M����.�s��,���1YJ���db/���
8
g{�����Y��NK��94�5g��4��,�mT&�in��v&�(vTJJ����j�7��+�t�;�Y�4t�V���f����I���O�`gZ��Tm�A����nJk����)m��d��g��n){Z\67O�
��7��������$�_�:7-e?a�,�^9%���]��!	}hKB?�WN�ksfaYR.���I��j�&�XN�ZT`I�I_�0d�OQ����u�'���v��RYg��bo��������������N���p6(�0�j��4�D��oQ��.ohZ�����6��I+��J����������d���&j;����0y}�-�������1�v>��2h�uI������(@�Y���D�	���C�~�&�k���g�t���r8���~�:��Ohh��~�`�J
�����q8��c;�X�������<6	�t�h��D,�*H�f�[�}7-�=����l�����$�E7�5�>eL����^*����=���.����zig�����x����~K���c.x/V�#�*��-�aC_��|����=ZL�P�MlnY��-��.�C/���Y��X���\��l��\���?��7��L��������w������(�3�#dY�z�������X�u
zt����D��a��h�6@�`9�bo����o��D�K7��s���tz�������l��K��oi���]p/�h/��$:�����������/�w/&�-�����$F��\�e��l�eAj���e�&bW�����K;}�����s������p�v��Dsf)�b�BlyY�{1�o��N�B9u�t3�o��������E_,� Zm�4+t���VZ�.+�/��}������b��E/D�B
���7T��Y����>L����&��pA/V�'�b�n��r�Y{1����O�`{�2n����t�������OS����/h=�`��'Q�9��B�������j_��Y+���6����h{��L�s.��[���?��S*{�m&\)zC�9���"�5���s.��,�o��K�K�;��p���h�J�n� �>S�o/�M����~�,��,tqH3��������^��4l���H�����z����6�������`7�i�
�`�J���)��0r#��B����b����+�U���r��������VL����t�b�q����G�$���TH�\�-zD�Tjy�v}S�[��wv�u�����!�`:Yn�^�-�
WWI@�)��xbx���]!lg����Rg�vb|L�p����d��
��rhba�\O����,��=��{����3
�����@A��N?1����-T�8D���������/�h(���+6�/��
:�F
,<=����vx�J ��4cY0|1�p�0A]�U���E��J{*�f��II���+P�0g��	������jj��J�����u
f�S>�i�>�aZr�
z��k[����y2V���S1b,��X�hjL�����t��J�����}�%j�������w�N���lM�(qWe�X�/�`�bw�6��4ut��El������b�_�-�^f�+Agm��,Su�a���B��e)j�ZA�
�R�u�/`��`$Xz�$�������0�&�UI��������bsc��l)������h��/�l�����,�
E�D���,�
U��$�������aG*��1�i8�1����1�="���������95��=q��++M��p0TB��]L�Wt��~gs��a��]L�W��!�e���rgG��e�����-Hf.��.&�+�@��0��
o���&��D>����i��<��c����I`	�+.�j��I0��~�w�3y
�7L��+)
��]t�(4J/�i8��L
�t��8
�������`��o�)��'y�N�i��WJ��R�a=�����JO����`m�uB�0B"�VX>!mX��zbxL�3���V,q�����uM/$I]����Z]A�?�n.Q"9�T�u������]�����g
=���&�f+U��]0���y��RgZ�Vh��a"���M������^�%�\4D,}{�[��i�l�1IB�Wi?������/��Ha�0S�^���hK��:�����%K�����w��oh{����?��QS��aq�sL�N�n
�^��U��;����.=�m6�`�������X2x����s��i8�00�+:%q�����<��`��$t���b!�Ba
����N�����y{`��V�\���faY1x�2)��K#��'�]���/��!���:�Pnv����J?���hpZ]�0�
��~�7l�
�<�7K^/�b����Y(��H�����*�i������������,Ko���OK�x��#
�������f��bsK��5/����C�����=U��������\���H��w'2^Yt��f�bs���
M�|�������T�-|�'�n��\�����"����-������!j��3�'��*�E7��(�����
��*s�%�7+j}'��;K�����������XVuh��B��m���J�D7:���a��]�<n!Ef[b���i���l�}6����b/���?�0��|�������&�(}��B�,�C�HI�������DD��h���9��+m
��h��X���B�����f�t����X�x3�
Z^��'��i�����I�n����7s]���I��;X�7�An,_%vJ����s����������a�m���$�DW�wo�n&�+�1��X�f!��(����s�>���L�E�(t������.,�P��������[��Gf��b+��:�������_���D-���DC}�m	���jI��"��pW-�-�����h�C�72|�`Y��X��)�W<>����It!cu[�5+~-J`
		�"����n��L���������3���\�w��n��n������X����J��V�w���d~�g�p]�X�n(4_+O+d���V��Ab+��V���+u������I����u��j���X�fR���D#��?��[�TZr~�J��+�UVb+&���M�N�i#��
��8'�x�a�!������<�����t�����`7L.	6�u�����"C��������~��
 ?l2��{'�?J�����������L������4U�"0-@r�0c#Xxd�V�|g������1f�W��vI�`����+���as����]/���h�-��8�f�6�+WE��n&j'�����v;)���H�Ym��D6b`:\�4�Oj����A{?�Y	�[�5z}.���D���]�v-�y���V�
z�$�R4n%\n���TL�%
����(�l�nV%$:����������1���Ik����-�L�Ttg�bsy�w����`[%�f���$OEO��K��U�m)����6d`e��C
L�&&�?����U�����]0�����1pQcd����*L���mi;��M h�M���mL{E��T@XXvC/��_@E�0zA+QS.}�6�`xhL��Il���q�����y�t�<-��6�f=�������]0B�9'��i�lj�0l�PS]���9�e=1���y+5�;���h&"v�a��b��b�����/�>?�7��;����`oh��RO�k��	H)�b�Y�8��|.hM	,OM3}[�x�C0���);.o���Rh����T�_!�^KWr{�S	�� ����������<��2�	�����qn��q8I���|���`/�	&<L�|�����
[������T-�����h�
6WT}g;t��a�!�,�{Z^�O0_t�����1uM����Y���`,��
�O�k�	�������y_���f��^������YB��pa��T^��xVl!_�2��������,�i�d������%��|Q��������w6';���&t�I����`^��(�C	JWj�(�������V+K�R54�`�l{=o�8-�M\_��4��Y�O��������a��V�t�IU� ���*�a������/J�����e�7L-
��]�3��4�doy��T��*��5k�}+�4l�1���6T�=*��e�7�����L����.�& K��"1f-l�\�Ew�����*�����c����W��&�(5��	z@����w'��%�M��0�R�iymAgR�TB,������`/X-�������II;���~42�����4��S%[���_����1���������$���Y����`�U�����F}H>�Y����D�1��w��S%�������>��f��	K���]�0��"���M���//9L��.���p��0��+fS��4�����aQ���UP������������9������T/�(����:����:<;��(�o6k�g������ud��h��c��#]ivTZ�|��dF����0�Y�L�c�mxzL��p�
�*}�>��3�4�0#�%!�FEQ4��P��V��n�|��S]9��l���7*{����������A��?�����
l�h��b�����w�������|6|gK~����#=P�Y��������e�����4<$��Q�������fWm��l���T��m��U��\D��YO`�
�#�E9�?�{��?��"������l�OE�(&jv�@��������A�[Ye�����M�"���������#��D�
�*H�������H�,S�2;�k�lk��`���4{��N��U�o��lO�������Y�.�����yM3�Q�7��k�����H2������}lkB����[��p��P�����q��f<2d�{.ixxIf�|��,�^8�n�]}���<6����QS4���l������D�_H��4��1�c���}���O�������L���>
gc���(�lV�8M�;��B��F�t�H,����Xh.I�6���D�a��gh�����+\S:u��k�	�gNj��k��9J�7[�	�m�����tc�R��������	P���i��F�����=���M�����|���.T�bv��i�lP�_DFa�G��t��o�C��9��MC��F���a�
�T���
 �m���h����j�f\��!@�V������M7�H`�u����i&��*y!O�k�.P�d��s��>L��T��Aw��&������=f�5���"����]!��P�?���J����?��i�������%��+�q�!J+�����<����4�S�w����c4g�}gWi��1�d�MC�����=,�N��2t_����uZ]����e��F��j\���i��%�E�D�M�t=+���f�D�Y&#�{���<,�����M��y;l� Uy�p��&�{�C4�f��W�����x������.�����A���x���F
�WrvB�����'%���v�XD�~�Y����d�������d~�
v@[H���J����d�+W�a�f�H�:Z524J$��*���h�i�l���r�|2��(	�	N���s��8-�m>�Ta~hj�w��>!)��zX�i�
V����,��9��^0r8k���6Sao���������F����4Aw�������4U��tU�����,u�z���o�L���A_p�����q�w�������[�T��sg�L��DACs&�:5i������ �4a	z�L���,m@����w.��b)|�#(�XyL[^��o��,[1p��9,M����XxM	vU2��M�U4���uD1[R\Y6E��s)m�m��g�u��j[7�h6W�������
:wQ8
g3Z\A�k}�\G�������1f
�p�A-�`w�^e�����R,��"��d�e{)��h�L�U&�r�5���vs)FZ�,[@�~��[����]���9�K������iymy��$�V0��E_���ob+����#�,�R[Wl[x�
>(�#�rX�i����:����.��[hd���	���s��i8[^�NK��)[�4�-/��tns���0_'��l��c��C���oX�!�p��#�s�m��Tp%n�mt�oa��p6���C��V��}������=u��������m��%�
�9�����Z���
��09�l�����c���t2�O�����G�`���3���z�����bY���Q(`�,+}��-���|="��P$El�sY�b���/����eO�Y����.�o?~.�`_�v1]�&/�`�,��:�`����s����E'���2�N��i���=-������Y�b;��*8�/�w�^�����P
���R
g�<b�����[@,�):E�O��bn��]���Bu��>T�
m����U�/ }A{/�n��Lvk�_,�.���X@LV�����.x3	�"SpY��b?�;y�O���G�h���R���-V�.�����24�F�-,�m	zPJJ�v��������M���Y��bz��o&�#��ma���������-X�9�Y��9����J�)�r�e�/Q=�]�~h�]�w!���5L�}�#Z��L�A����TNqZ"[1,(zTn��g�X�������O�;��������DO&nb�I����fzzL@�5q�K|e��9��j�'++��=�0UK�^��@��2�vx���fe�P*���qa��1�>M�����0����{���/�o!���d�Y����uzL20^��9�viI,
�.K,�tr�+�hN��`g���;��{�3�4U��
:�>|ga:�g
C��T9���/�$_�S����G�p��<P�'.�F\�g�������x@�Y�[�e�/&-z��g�,�Q�J��SZ�������d�<2�45z�<�m ��i���y��Dc�j�K�u���g�f{��T���*
v�}�4U��:,�d��G�����]�������%�����
S�����@+�G�u�/��,�%s
��>�V[��*�|J�����0b��I�:-��1m���t�&DHt:�$v\�5m��L��b�B��������C���J4����x�^�J�<��/��&��bI:�p;�r0���aX�+��J
�D+_�#�j�Y���X�E/�EF)/|J��)��aXGs�$�X+9��~.�0�R:���(�d����$�\9lO@������X���-zZ`+�!���)��>�E���^���e=�Ft�Ju^R�v}�R,�$Xu����T�a���\�x�b��j�EgE���fRL�u���e��f=+�F���XQ��|7��B�F�w%����PgH��[�Xx	���^���W���	���v��T����CVF�B�����G����[�]d�5������e	��/�8�*�MX��b���t�jdx��M+��������e�
l����~h��p��e/x�K�#�n�]K�~������D6F`���2����/3o~�v��"P�V,�4�O�%z"]�Y	���y���5�:�����0.�^�=2;�%k�t\��j���������n[�	/P�����������4�s�V�~g�{'���c��y�A�L�H,5��^��^p���-�`52����p�d�~���"������������y��K�B�BlE��r����h�����Q�T���QM�����������[����{���RVN���1s;������lP0yY����A�y�����>��nX�����,��S�a:��;T[
����q-�.���l���!X��*Jw�xb�U�������j��T��3+42<���B��s%�b��f�MoC�����z��ti�B���J>g�TkwzL��0!YZ�l���m&j�����
��NX�YW�gVy�����
��[�l������X����8�{�%R'qvJ]&&�+E�V��v��J�bi��V�+�g��!�J��Um/�j+zB'�~�c��T���~io����������\�u�����]Kt.�;
w{8������f�K�4��SE����z�mm���zE�B������������;�.��t��NO9��h����.6{�OS��*:�D�|<�0i���j�SY�����z�q���r�7��4��	bG�m�m���	��������]l��Oi�����D�.4b�&��\�zzL��$��z[���+.�BM�m���)���>��,�Z*v2����3�n���f7���\x�\j
3�����^Sm�i�l����B�����7�r�����Z�}B�f&�%]���e��`���m������nt�����2����7+�
��.������-��A����z����������v� 7�R���)�kN�k[��A�KjZ	���}a��h�����n,�,�f�:�[H�-P{3�Z�7���C�.���{`�y?o�N��������'����w�.H�����5��tzidh���J��1m.��g`�O�� Us[7�|nb�M�P��.t��-�{��F�K�{���g
M��U��0n��d!���c7O;��p����ox(HT�����N���ba��h����������ih���Y|��
7V1):����}HAC�H�p�t�<ex��S��ium@1-_�
���B��O���r����
��W.��Y�_t.�8
gC��D3��;)���jc��r���U0�jM]�D�.-�i�lP�
/�Y}X��X�/Ql��qX!��B�G�Y����0A���-{���NL
C���v���9�����E
��;R��4U�"0��d�}6�|H���s������|�;un���S��i�|�CY��2#�Z>���.+=1+���V�����7x������G�#�&�4��	�����te����$uE�,�`a_���]l6�NKd���{A���`7��[h�u[���q�L�W,�	;��i�b��Z����X���K���H��1��{W.�V=��EC�������a�����g��K���i�R���3��K���Lx�}�c�#sv�O4�-�*����dG�����oxi��0+l���A:�������o&\,���V�(�d��abQ�#EUO�kc�nw�M�4�
/&�!��L��n�i��U	�YB8���
�(����=,�ID������7L�:v404�����lS+&��XSt)rg�d�N z��	��K���\{[1��Q��\ ����/6����b�^��	��C�s��z�P�A�L��i8["L�Xt��!��#���9=�MXB2^��O��$`��g*�;g`�|-1^h[��-�{�4��L���.����Ql��\��l��>-��H�|-!�B[����7,EM�'r����r	�:-�=':zg�|�o���iyOK�����^0����������6x�3[��m@K+�
���hN.(���������T;�&�5#�������7����x���8yon���{UJ���|��zs���\j��J������rX"+5�� )���-�$c+&��u��V	pZ"[��gt�6>
g�&�-�q6�}gs���1m��t��W�R��4����H�:��V�5�.�a����?g�������
���o�
�����p���R��QQk�v����MC� �	���fR�]��o��N���a�D��	��\q$Z�������3(�w�`a�#���Mm��iA/��^��
��ok���]����
�$\q$[	�*|I	l��G�wJ������%�Q���Kf�[��������/U�
zB!�`���X�������
�����4��V��-"|�r��9y�
!��a����x�-!|��*Ih��x�p���D�����N�4��3E�����Q)v��E�0�'6��%��D�1o�D/6�T���x�����s��y����~������J��~'67�<M�{�h�4ML���G�f�	�Yy��D�K��S��E���G�����^���_��^g��]��6�)$?����yZ����[�z�>
�=|�"T�"�f��/���e�gBg���c�e�=��������_��B��P3,�����r0����bB�+t;�q�f:bW�*���4�0���obs�����gq���D��:���CkK�����|g�Bt��.����Do���9|��[����4Y��h(����{��M>:\TI�k+Sgm�����F7�������=<,K���j1�i?��tnV���,�N�b�b[�hE��t��
-[����b'����p���\hU�X�n����c��v�fj��A������-T#>�i��5>���0������TjszJ[m�V$�f�!�����K��\#��>�i�"������	=��4t[�EI�����y�Y!��F_Y��W�F������p6bXE������f)��l>)����5n�f�g:�GEpl�$�
 ��K�R������a���+=2K-�
/���w���2����V,�Uk���Ilg�9f�V�U���<
��/���z����2�^����E�w9
gc�y���P��|��s$����4�OX��
�P$�X>�a)1�a��LoF�����6zz�;�}u-=L���Y5���b�����c���G��b	�^_��/�~+�*��S����-�����u���b�������D�����|��R����X�c����}�tm�?���p���R�.�=V��
Y���z�3�����8�a�Bz��*6#x���:E��efa������0�$a[�tU��_S,��
uq��m����V�8�����]6Aa4�p��C]���O�m��pk�>0R�����j�c�TX�(���Ei�Y�-�qY����*�497hj5kd�y�U���
����\�-N�0q�������lY�� a[���-��IZ^�^������VJ�+�>0�;�=�R�MN��T�N��,���5�k���Tm�@�KJ�0�6X����B�[�DIK�>�D_tN�<
g�	��e��\R�����N������V�$���s�$�Z�2�X85�a}n�����0�T�+6��LOS�����E/&d*v�e\����\0(�������U�P����N�����L��dbE��](���\��wf)�V��:��z'��p>!��;h����K��������&�}���ix�[B����%bi^�����@��Jf��i������[*$���C�A7�I���9U�0.,���m�R��Pu^t~������aaVS��k���mO�kCw�z���^P�#X��/v$���D64�=�"��[��-����}n������W����B�-��j���D�m^�0.X��,�1j�*/��[:Z��08���;K����Z���c5�Z�AW����>0�k)���12�ph\hM{�X~�����
��TxEW��-h��0�z
���������Q�8�m&h����6,J��C���L;]J;�K�����jaYZ`ja��`���}������������~�U;
�3�����h�0S7L�R4��	v�z�`�dx���>t����:��H��Z��}�@7�tVa��tV�I&������Z"����z�n.o�&*�J�>0���i?i��gI�Z?�K}�\��\i�����`WA
�Y����^��4��������H�rK���\rz��O���0#W,�0�����ShK�e��}��p����}��Y�b���-��%�����fe���eE�VTb�l�Ya��B=S��mc!�W�l�Y����0�LI���s���Vhz��g=��#|g�f����D&B$��wHs0Z��k��m,C�Y������6��)��
�@M3#�,|�.Il!K�6&�*�1������x����f���B�q8	���K"���=M��K
{b�e(��zC�6��%i�hm,����
�py���gM?�py���uV��X+n|�|2�Z�PQF�d�w������%|zLOLgUt�za���*5D����lM�
 L�U�'��1�m��'.$�7��B�6��%��L7���C5�fA���
�`��l�Fi����J|���
����S0X�e�7n�c��O����{�[Q��P���Z
{���S�E���lic!�
W5�����YB�b~S.�����X�������@�1�i.V�x��N��2��t��-$�������.���L����`�W��o�kF�����^��R*�W�S����@�[`���%^�����,l! 67�==��M�}���$I�����e���*�`K�6�jc�����
^L��6�.#�����a�c><��'�D`,-�Eo�5����f]H�l��m�*iYv�:�]�������'��V��[I6L�e)��0�I�
�z���<-�
FV�*zV��V���^�}i��d�i�6d���:��v��<L�:�P�E��n���;��5#��+���%��2�D_�*�f`zJ�7������a���G�:
�s��[�����������h���hR�+��������h���#'w�i�>p�'�����B�p�P)�l�Gf%�/NR��fz[5%�fE��2�E���^lg�Nb�
���&�����n��o��-�`���Y����xtA
�%�&���L}��(h�n,i{\�[c��2�Z��E�-6
/2��B��f�����E���;
g[���q����`�}-X�mP��\���SC?��3�5����*��.o�|�Z�f	�F������f������������\�Fl?19]���R������������}�os(�������9�&�{
���XV0��u����/T�=��4�z(�������rzY��1_�Y��;;�e)�g9=�����������b�7?�\�qZ"�1�j44�09y�|�|^6'��L4�m��)�	+�\H��%�vEC��X8N"����O�i�w�Y�d	X��1�c�P�U�H�r���&`rS�a�9����a�z�^�����%7&�,zWL�7�7�^~gi�7Xx9��;���a��f	`�Y��;�B+1�)4n�������l7�p���@I-�qg�hN�k�
f�I��l{���4U�^�� �a�&�;&;��]R���f�b(h'����`L�n1=�O�����4k��T
~������K<gG�Ns��u�Ns�N�m���+|����PV�������o���3s��;�i(������
n�K����n]�
�fS��i�l�C�*�p;K��'.��%z"����V���M���E;���������X��A=��s��i8�0^4�a���dA=S����tX�ZRK�lpy�:~_�`��
[���#7�M8
�z������������8��1�p�$�]�h,�Ms�����`�M�q+73�q7���] �r��w��H�9m�;{�J��Tm�0%o���2�	�Nb�A&*.{������7
c9b�J�XxG��y�0�ty���8\d��LI��~M[PL~\4�j���uC��d|YB<�}N������%��=������_�F����>h�wg&�h�]L,4��2��h��W��'��>�YQ��J��n��"U���<
�x8��?8�%���h�[8y��;K�}3k�l���[(�3�E�,��wEC�_��U �3w�X�G���B?�p>-����%�oRc�2����t8�p�Z����U�x\���w������L��	����&�Y%�������Z\4�h�YR�;��|��T��>6&X`�4+�b���I��5,�7M_������Nh����|��j�����n��,+�zB����`E_LpS�,Q���a2��,s��w���K�Y��I�*��uKLwh\�XdP,^��`���%w
�4# U������Y6��B��nM���D�(�P�d�,�eH��rS��vg���o��{k�e�aw)�7+=��������� ��-m����hj�H�����[����R�) y�;K ])�k�L�Y4L�{�������&�N����|��/q��d��c�#���nV��*,��W0}A�����s���f��+�b/bg��l�0,�M�`oh�k�L�Cl��tZ"����:��g�)����`��5�;�~�����B}z��pg��a�����������B
6��rZv����.�b#v@�IO��.<��5c�c�{���Y��+6���F�
����to��<#�d_|5��g6RYi�iVO&��
��@Y��U����i����S
|��[��4U��L�A��E�����B��Q��� �--�Y!O�<4�������_!+K�"�,�vZ]�,�W�`�1ba���-�qt�aw��
���.���aV���/�
�*���S��S��4�-c��z��0)x�e\�*.��_S��*�k������v_�9�����Vb��dzZ"���4M�sm��~����Iq���6�a0�Ml�B;���[�wv�Mi�������5SwM����<�4S[���D4�FJ����rJ��w&�.zC������)q��/�"�4�6��Z�4�M>x���9L���0g/X�Gk��6�j����`�����1�EV��+��mM�a������qi<H��Z���^�!$���G��0T"U�Jt����C�J��N���r{%S��D��`�j���t2�!����S.�"u��CIo�P�^,,�7�t�s��8-�m>!�0<�5��n���ZT�3):�4�J#C�6��|���6���hH�4IM��F�4�7�Z��nE���E_`�����O�i[��A/��3�/4V��L	_t)�hEz�mQ�
���C?�f
��`+�2���������n;�I��0n�U�X�='�~.v����`/���'.����w�=�E��t��w&�.��=-��6-���|K�wb��;���V�^`�-2��
�\��(A���|��32h�1u��RDs��S)G�0|��j���6���pTZd��X�T���QQ��%�������Ek�����l�7���� �YZ�$���)fZ1Sn�F�F��Pz�w~	�C���C�"m����D�&�b+J	��������K�M�����L��B��n���T'EO_�~���s�1�����+A_�u����p�[H�fV=��,l��-��v/�9m��%�D������O6ZZwh�/5���H�0NB����'fB�bs����������N3���xB��aX�}+����8M��n8���T/�V4�\:����S��^�ZR#�T���011hx�|7p�f�t�o����Z5�����/|]V�����*P+Og:JE�;b++pw�94��)vBv���&�[	��;_���� 5���V�Z-f�aB����
��0�Hl��f�v��v���l�a|gi������V��upwhW�N����l@$���H���
f��D�E��'�T
���`���S
E/����~\�
��yOk{ym�['z%E��p��C����;����B��a���d�E�_�4\�p������������6T#�n�a���3��p{���O$v���7����H|�o� .�zzdV�*6����.����[�F���	�M"�;������b�O���� �<,>�#�����f�X�G&�����Z��	M���p6dXU������p6d�������ba��g�2+������baT�Y��4�� ��%z�������N���RtZ!�^���|\b+���E��)"!mV\ �������������D�<]����X���,��{�
mK�E��X����(����go(������
wB3Qs�l�V���
�N[�i8,aM������NdiMm��M����|X{0S��U?�@����Y�El+��KS'���+�<KxV=Y��X�Bl�y��V.�VLu�4������������~s.���'�U��������vV<��:��D���Oe��p������]�7����q{������O���\�a���$����������s����{0sXt&�������E�#M����a�������:
g{���^�0�#�a����@��=�;�r@.U�CVU'�~T��`9�bo���&5tq�-���t{}�x������:�x����B��M���b\�[P��L Z4lk&�*d�
�-xo��1K��^����^���R�5��������yc%2��1�w�~,R��D���'V�"z@R�wAjX�*$���oUR�)q�4U�^��Dt.=���
�� T3�z[�
�Wv�O0�Aj�0��J�|\�d��0� ��d*O�k
����0��#���0�/9^��,�+����BI�,���Zx�R[�0�l���`+)'�L~xX~��{A�Ms���\(��[L��4��]0$&�e����]��b�a���DdD�O�U�S=���N��|�nV����L���j�	T����R�M��i���X��h(
'���nU���R���Nba�E�N.��c��a����N%O��0��0�l��
��K/�AO����1��6���Y���-Zk�&X�ac��r�I��V����T�]9U��{�|���Xx����BS�a���sAwX5���I�CT������h�����g'��^�����U�FY�y�����/�������5lc�{��@%��
�9��q������`7=`F��������������<S@��y���������	x+�65 #�+y�NS�e�~�(E����y�����R�������s���,�����RN�i������Wba������:�R������M/�b��6e3�5�V���i=�>���%��
��fy��c�����R���l{��fj����� �x��:��5	�B5R����h���M�R~?�e"������=D��.E��`"����&#�_dq�_s��`Y�{�T���$}�m�`=>%$	���O�����6�
'�pX/l�i</X��I���I�x^x�x��7������l�����-�Z^�mPhF�0�O#C��`i����!uZ"�|��X��R8->��\�7��	��/�<n�M�������P�r�AL[,��._����/A���*-mz��V!�gn�K+zCsQ,�7J��R7f
�c�����)�N��jA�-���t�w������8��a������6�����{��k�|�	�A/��l��1�Cz�V����T	��|,��
�NS�)���EC�q�W%�f�v��.�����{��w��'��J��R}j-mZ��U�_����i��	�"n�n��[���\Hp�]�����r��v�����/'M�OV�!�o=ra{����LP���.���
��e�'s��fyP��9���NO��)�pOT��z����l��|z�����]x'�� v�M�7��3aZy<7��8\�?�u����EFt�Z����q8�bb]P�[��L+bO��+N�YW�)D�fz�bs��w�Pg1���(DC�/���������������~Z^��Q-���Z�bof�y�����D�'����d������2[L�H�X=z�t0�0�MlnrxZ]�p���Q��y�\g���a�\���
7AJ�9=��	�D����w�,H��{����u�'��
5�=re�����z����������m�b���f�_����Z��b����dj�7K41�����,Ql�xT,�=��'�9���<M����BJ���w��8\$�@wL�0�(�e����4�Z:��_![iZ�{2��Y��4��'h�H����������hz$X��`�Z��n�^�X�'�d�_	&�Y�ZOz�D��������jw�O�x����B���������&lZ�{�������l��x��M&�dz8	gK�ROL4]��X�z2$������X���b�����/�A����fl��;"
o��-� -;-�=���
o�����=�v�+ �Jw����|b���[����vxnt�q8�@�Q���WmS�	q��������i�>���tc�Tf+�jQ��D�EC�.�=�����s�M"�lU%j�2��^)K����	`JB�=b7�i\�|*vU��f;����nL_El%oZ\z�#/���Q?-=�{�&�"v�� ��R�.���V���dB��t�������~>�j=a�\4tn4�Dl+h����3�=Y1������]W���'�
K���U��Vy�L�Y4�
��%�����/@��y�XX�`6y7N�i��I&��$�ZBx��|����4�X������^�L;M��3���W���/���N�p����f+&O�4���B�I,�Rn� �p�Z�y2�g���k�L�d2�����w6�����sz6�n���������.4f���L�W���	��B�B�Z;��5(�V��0�t���q�zb�-���>�a��dq+aGK�fI���I}�<1r%��z����Z)v�~���M�40��S�i�>5`6��<���z��w��*�W���^��a�=�74��D0J�$�Z�����d���;�]�
����X�t2�R������(T
s��n������i����LC�@�W��:M�'3��M�����JhOS��s5�n�����'Sb
#���&�K��<��f��P�[l��Y�s29N�?�BA�3E�N�i�	���aq{�xGP������0��;-��.&(%���F�;����am�i����tFkjNX� MMh�`iO�7%k��7*-�Jm��<'��
�Ba
��C������NXBt���������lzA�m�9��4��'&O)���a�=�f3-�^�����M�(��i'8M����������;('ox}[�Q�������k�������;������,�:,m	����PfE��)*K[N|�"�5-����>��B�e;�OKL�O2�V)��<e�}.����:���e"s�������`�s���{��E�
�:5n�������)y�����Z [���T_��I`�����q�8%+�`E��N�b���|������
�N�����8A���wvA��`s;��,~w�M���^�e�����,���Yz���j;�B�b��"�ey��<x�a�F�3F���Od%�oY_r1aK���%�baf���p�\��\L�N�f�X�}���������~�r�0 �3u�,�I�f�
������	U�E��e���4F����C��������J�����b����bQbw!mhY;ZP��+�pB���]��V����N�;�++,��������s��%��V���o���][�
���M	��)�x��M6��'�*����CaW\��<�n��k���8=���X}��o�����bU(?>f$�����H<=���}�[�T<��9^��OOi{���Eg��i8����.8���)�u?����0��%��
;Y���&���|R��%s'���]/����|V1o��]�XVL\��(z��R��%,K&���y�e<-��9x
��xdV^�q��Ua{���*�B��,��sf)^��g������-9{�1��������2�8Zdp���"av�h�(�,����Y�����R�h���������p�;�r`<�tW?,��%<K�-	�����j��e]�����d�_�P-IlNl+�����0��
���H#�R�����`�#�ct����;�`�UOL��'��+�kc�����*!NV��q+Oic����rx��l=�b�eaJ�i�;�;zA��������uZ][mt�j|eU�3j����o�����1��aZ�X�7�q��W|���m�?'sNu���=L����+����b�!/�R��*}�)�����5�V�hXj+��a������R���;
M��l���+1�f{Z�A��/��^��Dmy��H�����#I,t�5��W�L�m����)����T���3X�g�������b�������!z��m>��*����nV�"�A�������������;}m�(����������a���h�����������^ ����������f2�s�����bR��{%I������0l�;8M��4g����`s���l�wN������������f[�����]��ib�BI��v��YDACM�)��4S[@LWtV�>
g+z�����`aWK�L��s.�;�b�
Cz�t�lh��1ih�JF^�����zZ][@0)�+9�D12�h��t���Z��?��F�L��i��E�~����
�����N���
�QIz�,K/h?���
o�����M��t��j��Tm��(�d��y��4���=q2OOKd;�I�a:�4*���#��@6����h�����,�L�g�t��n?�T��+��+���$�K����E	�H��������3������
�����bJ��i�v����$����o���?Tt�+^{��-�
�z����/�$�v��aLk>�.4��9=��x�����w��,A�[�9�����k�����o�NS�5�4�+����J2�&��`�?o�bZ">u�c4��g/�&���^��6/�10O9��D)WL +/h]1�-8�`hG���p�Y��V)��/&=�D�X�0(�{�;�z��V�������e2|���0�����D_��I��Q�WA�sY#yA��4��N)��J������
#<R*.}!�a`�[�
zS$�7��&�[`�{Z!�?LoX��v���9��h���f�<	z��dI���I
�/X^*��hK��a�V9^�����^�`������*���"D��-�U�������\Y!�!0�(^$�n�����1m�@��B��y�����T��,r�������`s��i�6D�!�����>���]�����"QHM�`a����<	vW�,�� ��\,���5#���h�����E��������4�M&b-z�U�z������-�Y��4���F��d"V����Vu�}�Dw��w���,y��~���u�7��
�Q�2��E���&4:y=l!;f[�bD��=8���<]�����>D��ba��g����-�E�E����p���mv`{Vl�{����[@�2��%c��`��J��K$���\�\��v�L�Y4,-��X��f����>��%B&�hh�����ba�l��:�f�X�a[����}[�y��W�9rw��<��fW?�P��������mQh(����L�����e������lr8��
/&�!��������������f���s�������q�N����Zd���+-����7��$�T�V�
����+S�5���EoV�!5x\�y�������vN��6�-= v�K��e���?��������#�fI�B;�*o��
��5�7<���n��p6E�����H<
���[DoV�`~�����v�w��D>����h���������t����G3����!lh�������L[X�,Kn�oS_���B����P�_�EO�o�q�M�q����7������,e���&�������r����hX,+v���4U��,�,6�{��d���J!����N�k[������$��y�](}����LZ��o�l�]+��E��[���yD�z�z���`�H#3aj�[	/Z;�q|.(V�+&l���[�9eA���F}L5�o����`�U���L�N�
�ybY�����@��X����c�����,l�q6���a��|-?
g�������boV��c�T+;o��n��a�l�9O�4U�O0Bt+�6c` �)�_�p��B��H,��j%��iym�0�,�L
��*+��{��1m�0u\�4����V�qa2��������fL�	z������	=L�Gl/�Jm�3�=a��BbaI��	���)]P��h�L�Y�
��6x�
6���d&V������@3��B����+��7��]��X��&���g#j��u��t[�`1�GI(9����j�k:./J~�.<�M ��
�1]�[�Al�����,66+��$�szL�"��!h��h�>�`s�����?�[y�l���.�h�(^,T�{�[��c�b+��7hM�h54��������T�}X!k;S�g���R���!�7h����mM����E�`�w6'?��j���DC����a�x(�.��_4n%��z�4/Q���)#�Y(9���������Z���'��r��������1&Qi��,5��R������u~i?�S0wXl�`9�Mw��S�����ZA����Yo�"u�i��"5M���3��K��!���b����Y�� ��.��{z��p6��i��]=��)}`00����*_�i����96=
����_��$�p���pcN�-�J�;�D�0�l������b~i��E���Ru�J/(q4�(Wl���ee���YEgDw^L�Yt�{�,����
O�����;��'0X��l�����Zb3�E�;�=k�{��v�����^j��L���*-�@�K���-�Zu�Y/�
?��y7�i��E�&�h��?0�W������i�����T����_�H�A/�9q���&��=A�av��X*a�1397��J�iz���X���a{b��)����<=q�f�"�5=a{��a���X��O��XOSd'��Mi_r����>eVk��0���E9���G�@����z���T��V&.������
��jh��~]�5���`{Fo����H�v�����R�+�jZ:|����������44���6�[������}�5�,s�:��E�����z+���6��9�p����I�{�ONC��Kh���.O�����L�P�Z���x�7g&�,��O#6�L���<QH��(L
����S>����9�
�'�}Q����%kN�Y��dVM��>����y���JVq�K��MP�4��C%_���f���lA1K�L��������6O/���%3�>�`�,���3F���iv�g>e��A����hv�NO��)�{�~������.��{����	_������/�+���M��1��SE4qJ����/�\��1�WD��Ss�z=������E�1������[6���6���OH��4:aM�����P��?Nj��T�#�*
~��'\�3��/�������/�
�~�Em�����%�������xkF
v�4*�e�{E~o�p7/�/�������P���F
.f���C�� ��/�z
�n���z�����s>|J�l$���Mu���%�/���}��l6�kzwEIN�L����S����i��p^g�o�p%��@�e��f{�lX�N�0�hT3avlbB��zk����+uO��5�z�_�M9��[3R�5������7X�7�D��6$�e�U���8���u�Jb�U@��l�toe��%Ux���2����x�v�_����A��������.<���S����WTLdz����i��F�)t�%k�z��3#Y�_:�>�]��������v�w=���|U���D��
SN�T~b��W�����,yY�}���p�{pW�������ea�AC�����j>0����~�����������}zA��R�p��Yx���+�o�������r2�����f"�fY��Y��cv�pH������u:EHG���lfin�	`���d��[>�������O��L�T~�0~o����.5'�x��Jdv������c��{"��Z�S�����E�f,����(��vl��������iX'l��A�E���?��'���KC8Xv��Y�������n�	�jI��~h�v�}%�W>����d��nw���n��:����?�]/�Wt���FU#t����.
��b2�Yp�-�t��ial���f8EA��^���<�f�^�����4!L��4�d��"<QM������y��8s��6���r��J)�R������a��?j��������VM�W����y�g)�BH,�-���H��[`�-�P�k�&{�~a4(X����z����~{O0�-�T�_�a�Uv�x���k�����T���Xd���e����>�]1�4����Y,��	�d�N��4�6w�d�Nl'z��_f�t_�_r������VMO����E&��a�	�f���2[������@76�w>�pY�d*���I��'��4tYb��9�O����;,���)�v7�` G���-�le~M�"�|4���l��"���)j|��9%����tM3�&�}�9
�N�zJ`6S�:� �.�����,~��1d7���d���/
���294���Tl�����ZM�^����'��2M�t���A�����5N���������X�wv��iz� ��U��T�L��0���������N��������n��"M��<2_�j�l���cz��.�Ty���'M�V���%qp)�_��P�k �F�����E�C]�q`
2�
�G�l���4a1a�3�,��H�����5���[`�Q�L5�l��5-{��}���xB6q��`oVP,�8�����j�*�Ig&��ew���&�5f�el�6��������A���b��A�����.�Y�oQx2��?�=���� �49�?��e/���f
��=x��&����&<��?gyP�ST,��{�W�DvD�eV�+���L�M������.	]�bA��V-�����}�X�/���i.�o7�4������
Ela�8���4��S�6��%@����V��YXE��y����Z�E[1�b��������`�\":�b���f����L>�v7A���.O/\t#*�i"���_&��l���.�0�V�,,�$��#��Qla�>�3.-���r��V���`o`I�d�%=����P����.SgNIQ�4gk�\�XH�Ps���/�u<pz#����*�0-�B4���wW��j��e2~i�E4'�)�-���4���������z1R�P�U�J�����]$�6VI,�][c�e��~��^H�ja�$��:�{����0�yM��!eN)�l-�I��j���b�U(:%:��Y:��:�,&tW�8��3������S�:Q0R�B��.�5��-���N*����UHa!���`Y���A�|���5V����f�n\�,Yv&��"hX�`��&�b�T�:,���W�_����zS��n	��E$���?���{a��9������DY-�����`Y����[��O+:�������X��0	S��q�o���P�O�SL�{4�d��:K��f� ��p+�t*|w�����O3d�������9�-0j�Q�dK���Ry����>�$<���oEu���%[w��Ksk���m�b�������{6qu�`�$�����0�;j��N�=!>U,o[X+�h��&���>��L����i�����`i�H�-8lai����.�r�]�|p�o*f/�X}
�����c�_�>�h��'v��j�Iz�Gc���|���O�i?������7�p=��
�34f�]�le���.0/=_�]
��Y���,�C-`����������7�[�#\�p���)���N����8���g+qWb��q��^	��>Z�a����Yk��mvO3d_V��fzb����*N.��Z��	u�b!aWz��(�	��.�0fM^f_���th��GH�g�;{mLGX��[���v�nY��S����>UQ��.���Bz����4Ev����iF��0]�:�;�s�b�{b����;m�M�YX���R�h���n�h�4����6�H�.��;������,��u���&���D��]k	�}I��2��L.P,���L�U���p��Sxf�"���"����+s�(���wi.2�����n,>
�&���\��q�(���)i��-�~�Z,�~v���u��*r��!{t�A��$�
#:����Y�0u\����3�?��n���W*=pIo��^1���T��n�[���+�g'��.te7�SoE�]����P�{��f~M+�����_���������4�������#KX�p�v2aU�M�QQ��[�
�iKv%���}��#��������!������R/�
�����'���=�fDC��u?KXf�������n,�3wm^�X,����j�P^e�O<�QZ����t���w5��%S�Dr�e�N,�[�&��,Z�-�+gV,�&v�}<
������O��Y� �h��6%�`��KCg��F���@+<;�J��N2����?S�n8EQ�l���)�`��?M�7v(sb-`8E)��`�v��c�)�
zA��f����
�n�v��
g5����O;3�`��TE�-"2�mV��q�Ur�_��Xp!e��U���&�P�������0%,���L�yS�
3AK�!svW�L���~�!{O�kd�����r�=X�/]����uq���tqafVlF����J��U`�V�;a�a�Q<q&��o��;A������������	��f�%b���f�dV��V��X���]�4�����\��y��=����m���5�C��h�K!4��V�V&�*�3�j�Xn7������%���~�u�b����1��;A������o��me�����b}L����f����kD���]��0T��Vp=Xy�Y��ke�WI�XT�������
j�N��.[���B��u^+;�n��H��ieB<�a�K�����j�����f.��E����s�#�{Y����Y.|�HW$���5S+�j=XIl������f�@t�~s�j�Wl.h���U�V��#V"�e��BG���j��
=���D���j�f::�US+J��J,�J�`��{��]�V��1�0�V�����L����`r��'���+��5����l�x�Z&�2�X��"�����`��V���d%n��V��0�"�YV6,vo<?
��]�"�}�`aZ��gxzL�10�'�e�B���)�y�[r�4Ev�X�����`i\FvY�������{���h������������bW�K�Z�2`���
������k`�/t������u�+����ym�I���<��c���C�_Bk'svTYq�iV/+�F����V�W�?,��a��_�}]�yzL{n0Kt��jM]x����t������.�~zL;_0x��a�Gwp�����g����L�V��L�W4��;X��G�hM����LW4lL;����0���J�SdM��J�E7���e��;�o+=^��o����.��
3���[�=��tp��.
��XM�X�j�U�����`�%���<��W\��j�:�A��'s���g!�X8�Q��:�n��C�������*�!;���
�P�D4���e�����)��|���M�������(Dw�j�WK��-�ZY���I�f��%�f��V�Z(���MW���%��7�`��n�<m��I�&Z_��Z+,H
7�`�����j���u�#>���>X�Q���g���j���:ND��M8���:lE/5���	������{���%��	^Y��B/H4����?Y�^^`��_I!v$Z��eb+<H������J��]�����Vd�:ACwMR�0�K����2��%f+�ay?sR���b3�6V{�L�U4�xO�d��b��(s&�e��
�AO����#e��e����5j����V��V�Z��=e�,=�j���1��I�Z���oD�5����r�=S$f���E/x ��|��n��q�c�i������W���~����]���P�^/{�^;�t��<�&E^��Q��7���9Z��25_��x$Q]X�`a��D�VIj�H��sr��D������OT,���f�9�]\�&�i�2H~���B�3���:��=\��e:��l���?�{�0@�1g���=�0;�.9u2g������rq������n,�U��0�/6*�R�~)��9]�	S��	?������j���5;m��I4��k���SL���9,��A)&C�m���4������+����1�k�}�`wfd;��\�����)��2��g��J����[����+���A�`;��d�v;a�]v���iz�O�����
��5�0�4=�[m���m�)w�"�T>#����wB���5�'&���xM���R:�����e�=��}��T>S�`yh����sL�L0Y��o�Xx�v�=3���1�����+��M��`W�,l�h��+����������"���.�fX.�.����YF,]��}���Y��%�g���n���j��
{�%�7����z�����l����)��DW��a�K�
�^���p�M�<XN���n�o�����g�a�A��P�!��-:=�� �M-����_��6���reN�dg�,+6�x�M���J�~+��\�9��f�������/b������
��������t" �XP�a����H����2��(���*}���)�/O�����N}=P8/������U�z�>���xA���"h."#,*���D����m��#w�c����$E���l��:����=}w���)����������c�������i%��TY����3�f�����#'s��X������],� �5�&w���T�h��'J���4b���OSdwnE�l�w������U�r�"�{L�Ztg��b��p|�>V�l��S����Cl����j�O`Ag��+����Ks��$��K�?�$4�q{,�U�X���8���9@��������E�KPl9s��l9�M�baY���u�
��l�.yi�~���lc��PK�,sJ�sp�]�@L�F���VX�����)����n���x���m�;��x?L�[���I-���F��JN,T�;��/)n&�$�$n2y,������K;��?O������~��O=��oi��IS�����e���/��ig}�.
����e/�7Z�Z���XVl�����K������{2g�����.���,�j;��HO�z�f${�i?��(��p�X�����F��M���Y��Q&  �M���}�~S
e��6V>"6#��X���D�$�����e(mw�YOSd����������&��f4�	e��
�S�����L7��q9�aFl�J��������������	U��M���>��a�i��&�O[�kb���8M�������}��eRO\!�4��L�T���H�.x	��$��<������!Z�J�$���\���_Yi�aJ��YS�Y�&p�����:�POI4��J,l����qzL;�0�4��H�=�����OM[	kv�`Qu���f��
Tb]��M�f���|�]�?0�.�u���v�$h��v=�L��c�������=b��c�v���X�������z�{��C!fkke�T�qwb>������	�����Ya���_�m+�=M��T&+/����2�/���3��z~��O�����Zm&�d6
I	$e7��>la
�
��V��j����+AO��h�m�x��T��gw��c��������KPx����u@p�wsN3dI���2�~3
?�������pb3gc+��+�E�0�!�uX����|zL�@�[�eBgb����P��0uw��������yJ�pu�@;<r���T�eb{B����;���:�B3UQh`���M}�)#�
����,������5M����
���0*�1�0��%9M��'����~��1���N��&��*���)�7��`��]�1�2'/�?�%)h����>��2��U�i�L�FVdF!�}�"-��-Cz�"{m�&������i�M��0�l�n{��L<z�����S�=2�EV�~`�4���l�VM
U\���{W`	q�=S�j���8��op�
��.�+w��c�*L]U�����4Ro�0LtF���7�|�J�$|t�h�BO�J'�]z�+�0]i�J=�?4�O5�c�g����
���a�����P&A��0�9{�y������S{�%q�cIk�DJ���E��hd�{0a��u����P�#��������`B��l�����`�+����K����t���W�����35�p?���7|������N�{��~`����|�w'��x��M��������6}����}>�N3d�V��`'���a�Lv3��Y?0�"9k��������l����LM�Y�^btW��gi����,������%�K�-�����y��ww���ey5<�,u'�f&f,7N�$�F���������l�*��>�N�4+�������(��,�m�3�&z ���S*��>O��C;�h�
cb������O	�ESU�U�6���,',����}��vz���	��:;"������f��bS�[�H��7��Dw�����l�L�Y����r����~fQ���X�Y}�{���wQ����.�M��V�n,H&z�2t�s;���jW��"����]&�-��(����������G��E���=YNZlc
ba�Y��D�E��v��Z���V(�4fV�$�e���-�x�[��p*o�BY������[p��D�v��8=�
o���m=:
��������0G)6���ecI��]��S���cX�e+�<���������O�R bS�Qs�{��i��t�pC�������I�<��Xh��DC=���}��F�*5C���_P��������b���~��m��������#U�|�4��C�sb���e9�H�,���
�v*��G������b3������Po7�)��h�V��a�� �0Pl��������������07�9�Y����V���9���.}|i�|]C}�N�[J�������v3����
u�l�N�n��/`�]	��f=���9E�z�fI�D
���
.�'g�Qbwu�{��hC����fU��T�Ewx����g`y�F������*����
�%��fK�7VB&zl������� ����We��p��_��i���0a�{�`�
�{O��9iP��#��rM������� ��n��]tM��4KP7N	��-��Jh�m+8=�]�v
��@W�ks,OC�OA$
���;Ry�r��	g�.�Jp2���.�����/r�7I&o,�%��5�a9��E+5E��-jS�f��7�4O����%RO��Nx
v�j
i2g��,��`�"���bY����%
��2gV>�2�L��aC�����fu�������Vl�>��DOq�L���ti���3��)z���M�����)nLLG��	�`+��K�8��[/��Py��1g'���"�	'(sP�~nc��������`�a� ���9M��>hz��vb�j�ek;=��/���\���w�4�hZB/���u���
}�We&�n�����P&VtF��Y|�A?"��b��,�&^��������?���
�BH�w+Z<�����{EW&$)v��W���C�oMVBQ�Y�w������u��=��1��j_�5���Hx07��m�m��Cb���U������	b�6�6&�+z0����y�V��3o�t\��?|�-�@d���*XZ�+����M����_��o��fR�V*nL��4\�6���OC���gA/C�b0��
vON��ntJo�
�l�������%5��N�Z�5��0���mnp+_��	�+
�g��<M�(Y�QO�MHy7k+��X\����<���T��-[��i���A�i���v���^�|g.�}�'sv'`)�,_���,�Kl��a�+�#���p�-����\���C�ai��&���%����$4�u[��?m��)�Ld�2�
f���9;a��F
�z���t�e���~��6|{;O���'e�ggB���n�'P4<��`��|���K?;������"���G���|$��n<X��I@�&��&����PY�G'�Y���7>u\�n�����P>[4m[0�(����������Y�pK
�o��i�v�ac����/����F
������K=ob���wc���a9w�/�	m��5SFn��W ��C�X,��Y���=_��)�W��A����d�^*�����PNn��nL?[t���,���T�a�^��-�`7�'D��D� Hh���Ni�����_
�0),�[����v�`e����5���L�p=��~�������[=�[����n���^���F[f�&��0%v���4E�S��I��%(��I��P���\��\�9����b3W�ukowvv
���Y�����}b��I�13����0��DEu�vg����!b'�n1j����
��,�A��;���O�B����^L�E,l���YRM���=L�E�;s�D/&w)v��7���b{���[|�3U!�������N�@[���i����N^�/�5%"�pK���Y��h�� v���X��E��&b�����Iw��/K�g'k�������w�";���YtO�uKRC]!��E��,]5#n��6���V���J.����b3>���;S��s�?�
>| Y[l�����E�f�6ba��X�����%��E��Z�z�����W-��.������~K*u+K�_����ecO�i��h��,�����Y���&�'���;t���H	������m�n
��?�oj��/�Qi<�V	���n�����47����F3��K)���K��u�;]
�Wh.����_��\M[��������j1��������c��]���(���\�����1����D�������OC�7Bg�F�b%~��FvzL{#�
�X3}�\����%H����n�i�D.z��F�04'�[@���v�`V*��J'm9�%�-
5�E�M��d����]`��E���;���������
�n���N��\�U`�$����N�u�Dw#
zWm�gW���[`����h�'4��O�����5�L4�-������W���[�z/��4�!�(���
E��p����}_Oo���������{*�������1���LK�c���������i�:��D����whQlx��h&%)�������%����������I����a"3h(�(v�n��D�-���*h�r5�+������n�i,��a��"�l�������m��U�q�"�"LKR���w2g_zZ��hf���t����Nj�0(6q5T�Ftg���a���,�������/j���K1���"8b3
���:#A��}y�\��{��;<�H������b��'Sfe���>q;�X8��4����#kZw�q$���]Y��^8OpS�����<��5�;��
��~-'kx��ZZ�LHR�vF=�����M_�`tH$�
7�`Kfu�txg����$��	;d���.��J�<s��tx�E@���%;������!���"�,���� ���Bk�
�����8�Y����k�ng��P�A��Uu\i%�_��u���1���C��f�k�/=����}�������w���T��,5m��#�e~b���1o'����	�����������R�NHEw�Zw&�!����d�XF�����
y#p��/'�4T{�gW4<�I��!U�p�a�b�~8M�=x��&G�R 6��`�k�2�S�xw�E��N���8�`a9��xcOSd��
����&�"��*q��x�;}�i��}���`�MQ����5�����)[��wg
O�T�	�������U��z+�w����6����o El�����3�.��#�MH�u+�w
����7)��
O��%��[;�C� �-0x�f�F�����*+IkX�<;�8J,�w�lB��[�
+�n��N�aS2���)Kiw��,5����&nXS-�����;<O��h������s	boy���i��:���b���;���>����~����������*X���Qo[��1����}U.�'}hBve6kk<S��=+�%w�����m|�R�=�	�������$�E7X�l���-�a�T�IHZ:�!b���d�E��%����v,I��I0�~^���/�ff�;3]����PX�A�`����!��e=���_��,����$$�����D���D���xz�$���-�|\l��D$���i����w��m�I�����~�Z��%���Z{�__�{r��kE��)b�n���X�TlI��_kK�L!X����&W^+S�L�Z4����S+�2������Z�/��"�����6V$����.��x����4��������S���F��~33�}-�K^�:�{-�����i�a�^�l��|zJ�^L�U�d=mb�K")m����!�f�����J+���X�k5l�]�v+ei���k%����
��b���s>b���_7v�\�l,�+:SW�Z�z���4��'�������b���+S;��X(�'��S�-Q4�Z
��_��7o�pB������Z�E/V�'^.6,������/|g��G��y!�=;
����_V�-����Zr�w��~Yq�h���X)�Y��[��?o"/�Z���Q���}ZbG�E�����E��)�R��~�@p�
�B?Z���xW�.�x���A�)���R��+�3U�u���&����-rv�^��L�\4��K,��Al�1m=1�D\�B�/�r��.���W��,��'N.�+����wm�{���d���vx����cN���g�������b\�����fa�6�=up�^{���X4l!�k��j�fWeu3��j������� �6e�0$��������l���_�"z$.�y������3/�]>�A'z�s�#u��k�	�V+OD;�85�D'4^������=b�e�Qb�����
���L|���[.���9���/��`�E���K���.lM����������{������aDZZ���B������'`%��aK���4��L�����M4&���{6���B��,)������3/�}	&r.z$d�_+����Ks��0�A��%9q_�k�szjo
l�s�SE�����1�;����a6��\���Ze7������D�E�W���2	6S�i�r���f�l���������E��b	�+s"���^ri��r�Bw���Mx�V8���hx���}��.){�QN{�R�[���zT��No��2�~+��L�Kt�R�R�P�Z4�\�a�Y�I0��vC����" )~�0����
�'�\�Zh���A���	v?X���I[�
��Y����2����^����������`w�����o�/Q���}��@�6�"��kn�IZf����$���]R�LwB,���z��s��p�
��2+U�2����	�`�M��4���`�3h���`!��f�8,n�����"H�*w�l�4�Y����v�����2��$�*�����i��������&��L����_��;FG&on9�}��3t�i��|[,�>=qf��u1Eu�{��d�����N�X��0��s{���\l&Nn��������N��3C7+�
[M$}M����a�x�{��i��������mzO��E25C�p3��4<!��U�|zJ�rL�Zt����.<��,vo>;M��WX}t�����/�����)0���>=1kH�:��b��&������L��u��]��\��C�N���Ivd�x�_�2�j��._:��5���1=�����M��J������Ze����T�3n��i,6hk�f���,SZ���~a�c��C���V�����M���L~���/t���0+4U?��
��m�1�0EV�~�{�t�{�-P�L,�h.I�7P�u<M�} �z%��x�M������f#�+�$�E��-f�%�_�����b��Xx���t������PZW4m�	v�/RZ�p��M]��e�_�6t��A���'���`��,ew2��} &-�&����3C�Dw���>$a
�z��O�i�	�-]!_Z�������C[\VZ��(�V�����mx{yO#-)rcD����Vv.�]v�[X�]���J����^����,i&v$.�uLIJ4�2��.OCm*��Wq�=�mNC�*Z,EV<m����6V+�'B��b�0�#������b��<f�f vo;M����_3z��G#v�$�����O�9��pV�����l���f�`M�d�gbYA��#~xJ+B�=/��f��a�4T;A�*J��H=��S���Y�(��-��vzJ�,�!�A_$��q���<X�ZtI�'
�v�
u��V��=UQ7,V�+�^Z���D�mp#&��� ����|X`y@'�h{��]�,)*v?l���:��:���Z��
�o���������M?���,]��
m��]U��Z���3��m�vVbe��i����	3����,�	*_B��1�}�����kw�������6�e[\y���.���3�=�+����e�.B<L������5�5�3wb�TzJhX�y0��p�Rt������9���{���9%��OM4���e�Q�k�9I�a���D��Zx]�r@���](u�;���o���4E/VC$^�h���zL;^��M���y��7���j'.xACf�
���]���'N\S:�<���ix�
6!9,�;`����K�rj%�'��
D/��?wc���i�P��C�������_��l���3v�>x��IS[Xy0ae�����faz�Qt�/���k�#=�K4�\	����t�������d"h�;<����R���[��H��	��a�mx��/�f����������Al�G�`K���a������u��(����a���?�\��P���UX��j��W��;o��$X��=_
��1o������f��i�H,<%5I>���qWCl��dX�{0�n�#q������/������~�R%X��D`zTb��e��QG4t5��
���B�e����.kO��E�6��3;��T�*/����R�E�#���`j�����d��=Mu�0(��Dw��b���A������pw��'X�/�m���2,�6��1��=`�y�#��}��NC�C�$DO�=���-��?3<��y3o� X��L*`���DC�x�{�B��U�]7��M�dZ�014�7�y��Dc�����1������9h��Vw��(
����_D����E������$������xiN2��	���|������f��`Y��'H��:=�� ��5\i��7Q��	��a�A���d�u����=]��tF;]�${�X��*�+�]���a���
�P�@4�Jv���F
]Z�9�1�'��HTM��H��Le�4�	t�\�%�������<L���J:s����^�ui.R4�hlF�nX�y����w��9���4"�e���%�v�hL�Yt��#��v�`ie�3q�����`���a���C��,�U�M\e7,+=�:��W�WZI�V�7p�f��S�
�;3] ���5��3}�����%��c��~Y���'H����054u��]p�v�%AR�����{-��9�t%�f�J�Z�v�<Y�;���Ew�����Y��-�~U��dv��c���<��&<|�YS
�JC�@�1��y6����[���%=a e���8�N����2zKV��SQt��S)��+bEj�4��J���e�����~4
�.�=����)=��D4<��`��4�3-�v�q�!>�gZ�y�^�U���-�%+PZ�lb����EA�����
������L=Y{���"��)�
�V.��t�Z�z��i);����yE�i��C`
���5o��-��|U�W#�=��1��;S���X�4��"���	�FjG��:������DzuZ!y���������ba�������f�L�Y����ga���I�H	���lb���f��s��	qZ]y�8���p���'}��W��\�9�x���{b�$����zwZ�x�i�4��.}�6l
m��W�"�i�]���\�U���,b(6Qg3��/�]YY����"-�;YCtI�N��N���X%����s���EJ������������2�D����#6ss��r/�>W�J�R��w'��
E�������T�L� �^�`�hx����	�V�������lm��.KU��[���1�7�&���@q�NAN+�N��F7��X����>a�NFf����*�k���Y�v�� ���Z�^�}��;��1�P���hX}-vA/�����	�?m"�7-*;��4����:pbk�7�y���@�R�����iA�}[�4��ub�`�i�v'X����uW�][6�4T����4>��:����J�9�R1��:�c~��exn��,������i����!���G���v	6��ZW����m�ba��Xx����l�tb]��ZQE���~T��������������Bt�lE�������,k������e-���P��4�N[X]���t9������eN�k��)��^0tl��W�s���c�o��B�
��&���uV'�-
��b+f�W����]�"���W@��LT,����:N�k�
��$���z��D
�����������%����]�n���h&�d�	3nA����lGh��^�/Lg�*�n����&m��A��	b���_���f@�m0T,�]���==��} &=*�����8��,����f��tJ��%O���E$2R��L
���+���m���%@'<R�a�_�a`&�	B�fnh���L1G�bm��lf;����E�0�$@��/�N��s�o%��������'It�G�`�b���������`�i���W[f�)bkqK��}�3�iz���7!Rp�������jw�$�
+I$���{�VL�0[�^w2gG��o�J�MV�%$.�Ie~Vrd�����`{�1iZ�t2�R�/<�w9#�M�O���D_����Nt���t�,C:
�N����uI����Gw��;sA��y����.�5�\�w;l�&��S�M�`;�a����N�i��E�6G��@0�.==
9�c��	�$�
>��L�����y�m_Y��9�1��Pt�E/�NX�����m���������U	S���^�����i����Q.��K'.�_�x�6X;�Qg�#,�:�`�hNB��p�TD%��X�tWs�3�~����=��t�A�/,WJ%>.��N����K)�BOd����Y��+}�^�0�4=i���b��i����>Z������1J�82�����u���i���-�I�$ ��B%�iqX�N����kfo���^ESWX��	1�i�Wx�����;10p,�T�VFv���
]����^	��"4���e��N��w����E����c�V�����gk���i�W�X
���k��aTVvS3d���.PJG,G���K�p'2MD���LWV4��[`��pI��Z��i�6,��`YE�����a'���K��k�OC�X�[3a+��|�\<O'6q#���+�uBt��I�&��Nxj�J�P��/e���,m�$�����L�V�{j�|'���w�`��f3����������y")3X��L��%m�
6�_�Z������%S V���PAWp��!�G�/Lv����S��}6���i���/-��Q����~���p�`!}�o�_���f������e��>/�I�M\����X��iVX,��v�I�������>Mo����}�A�Wlcy8���y�5QD�������iv:�SC}<T�{��kC���S�4�����+��$��^B��e�`��/f����6�����N���1�[t"����;]Y�U�~��=��RB�V��M�4e@L1Pl����*�b-�b���%���V�[��0T�%�����
��� �����bK�D�,��X&Cta�0[f�
���+J&�"K4/j�~]s������j/�����aH����e��=�si�c�6�z���N9�i�,��X�Ot���`��'�!�,�X5�hXT!���.���H_��L�Z��I���O4K.�],c$6so����ba@��I���w���L�,��>��N�k�z�A��������0iR���X�$T�*��Z��D����^�|L�[ta�wb;S�1�2?bw�����cb ��&_y2g�
�e�fYk�,#&t��/k~�}��oiO��f��� W��fS3dO��]�gM�\��$��-~u2g����0�$��=T���w���C�e�����yr2gG�.Y���{0gi��d�D�4�X@�64�����s�����t����M>f�����iR�~��,��,���s[?:�NSk���@���`����P�J��i��
��&v%�=�5��������np���#`�C���%bw���P�M0]h�{C�=�WJ����6�~`W���'6�v���g���`S�kJ����"��k�V4^-v:L����I�V��M����e���=��v���g���bw����D5�����f.| X�$��Rlg��b�������f�
�A�.0��a�g����1����e�zn��R�f]s��e�E_�����������a/�X�/-�%$�����$+M����2#���^D�-Ey2g'�G%����wN��,K4/�M������$���#�D3�h�&`���{K����<�Y��}"]���uGvYS��g��>�V
/��e�YU�<f&x v�v8M�}�]�wla"b����F��m��em��.�2
�%�����McR���SW��{�-��_���n�e����H�D��Q��P�@�e$j�aJ�������*�,�M�:��'�,�
/

oP�e&�f��_��6�^�95��a(�-X��,\���/��g�T����X����t2g�
����m��{N��=I��R�M�+/�h/&�-z�%��B�`\q_)P��)fk;����~�.
�o�H��j�
n�Ax��C1��[<=�=/X��~v�����K�`��Z��i���4~Z2|W����e)b�=��A=qf�����?�}�O��1�p��M
I����a���e������\�����}`�|(��(�w	A�e��K����9�����DH��C#��	�[6|AQ��[����=��z:�p_�/d�}[����S���g��;<������}��L�e�'-�����h�#���I�;�� �����;<z�2�7��x<x�<�X�{�(��\�J���0� ��-�zJ���������2��������	����
K�d���`
@�=�3g�����EX�#�0p$n��H����GK/�5��6�
������_��)��[�����M��������b�Kk���g�
[6��#��g��E�:y:B�a\&�F�(x��IZ�|A?:hsJ�2j���)�L��*�T�B4��/����e�l0\�)��9{m�G��6[	���+�Y�(�C'u��.�m���t�E�CC���#��
�-����wYs|A�	i�CA�����]X��'�,��4�Z������g[��m�������N��v��1���"<��3��_0�4�vC��|�|��
�/@�p8l@Y���)R�~_q����G�'�����(n�#��,�]�eQ���Df�(�^�_��(7n�]�b�5z�>1���������M��������~�mg9=����C}�����"�f�����z���x���P��P����?Y���������g>e�
Q���6�.J��;�~�asd�6���3~�isp����_��W���#�/���'�g���Yvm��v_g�W�?As�Q �,S�2�j��F^��6�iv�>���H��-"���I���������3�f�����+�����L�5f�6����B���Yg�YT�i4q��`�	���nH�l�;����c����Z��u�Gv�^L�U����p@��E_�(�G����}��`�
YL�(�mv"��_��*���}!����K*Yp��(�=�W1�i����0�iz:�e�{���lb���T��Oi��9{mH�������+�����<��`Yt�l�o|��������TF��0>W�>%��n�<�n���R�J������M�] ��7����u��=�����	�V�@�`S_����6V�����c�}BT��}��`7z\U��p�Bo-�v_���A���_8v&9��S�t�M��(��m�=
���f� f��\�����`g�������v
����-t's�����i��b���@��%��i��7<P[����������I����~]y�2��_v�M���$�Um�p�jm�oQTq�K{����"�/��~�f�-��WjmqW�QF�,����9h���u�����_�0�,���H?�}���K�z��y��i���a}����l�����a�0�
O�z��F��~*�5]`��X��r���+�~�^��tK��v��0�i&h�It�}3G�f	:�.�r�?�}B	�)�����K?��	x`�25t��-��,�D3�������<A���5�V�]�ku���E�Of��	�:����]4��7;2�n�����n��'svF��i:���r�{��>���$�N3d�M�.
����zz��zc�����U�~o�p�	z�Z�`��2[`qgW�Eb]�v
������_5�����@J������]q��e7,��A�`���O�k'���qK��U��w~����5���	�.]W���Fm2L�[�&�R����kGIb��/�
�_&�3������4C�����iv9�YZ�(����I����8M��E
��<��"M7�skj<=��>�{i�d�a�7�m���,%M_�5}tI"����D���+����K��,������{i���*�6�P���]�0�f�N.�X�:0K;9$�
{4f��c��������MOq�e�z�*�}�(	�B��)�����f�\�,���Sg�a7~�A����i��a0a�*]�{;���Q���O�>�!1����0� !o���e�J:�)����w�l=M��T����,�M�6�������)�~��`_�^�No��eaPt�,:.����t��n���|�/���� a��t-���;t~�O������z~{�`?�.��f�yy�=
�>n��u�Mi(M{��
��� =��n��/��K�.����)��e�?��aa��$�a]O��v3M��,�����e��`�A&�5��O�8�Lo��\3�kt�]�c�[E~�DDxz[�������
v�����Dbkz[��v����	�SCw"�	�'%m��M�N ik�-S$��N@�i=�ta��=��9�}bX7�1gZ��] �����`�Rd�+Q�
���O�k�)y�����e�������`�Hh�p���a�4�T7����\Ag�P�/(p�����a�������oc�����+B����6E's��`n�{J����
z��g�n���M@�I�����X5n�'�4��?�m����U����,VM.��'�e�6��*�b��z�Dwv(;]��*��^`�o���X��0�J���y����Z��ma�����kb+��;Y��O���b��y������6I���/��dy��q�{v���4E.jfE���"�{�m�B��e]~���e��raB�}�>�O��{6q���<Ep�]�^j�0`%v���YV�"6�Z%�0�[�%�U,�M.L>B������H�>�0�h&e&t���X��k���b���t'D�g��9�l��C�`q
�P]W���bW�������]h����9b����1���-:��	K�-�P,�����DcNd?����
Q��E�o��JT4��A����k5�f��=X$����w,�-���}�.����)U�����g�E�f���8<�U����9�p��f���wM�Ksx�]L��v���5CQr�	��b�d�'#�������*�.�b�A��lf�\3�(���8n�>.�� ����a
$O�b��X�kl�u���{�N�k�	�V�^���0��~��g�koNSd'�U2����V�`ulf��U���Y���0�f�m�^9���r�3�����^�2��4R+��M��4C�c�?!�g8��@�O.P�X�X��0�g�P��2[��7��D�����bm�C��'���������dMl(Xg�U��p}�����1�z1I�FJ$l�PY,��W�����D���i���X��h�xf���Gl�2������M���X����I���l]�1\4t����v�G+5������������;���N��a��m3�
�"������EK�KSe�U�|����<M�7>�7&5]r�1�������kv��w4� Z�2��H�������S6��,�0�G�9s���~5��9����L���;�X�#�
3?����F��xa���+�0��OC��
S���At���3�C��Z����J[j���J.}k�8���JW����l����kI��PM�Lu��������(�P�>��y�����~����h�K4�+��x^>�O���0�8���J=<?�xx�oL��rW�g�f"�l��\��d;@p���/X��"!v&.K-�;�����H�-g�_~���,�������g��y���'��#�oX�-�o�K�v&:����.�a���n��#�c��	�|w����+t�%��}�������W{	k�`�p�{#����x�z��IiR��*[��������y�\{0LE[t�=��O���/q���\��\���>����W���F��}�6$�n������Jd�	V,������aJ���%�d���ZKe��T��IX�	!�bu����?4�KW��9�n++���4t��vA�H����o��i����u��^O+4�4K��wb�+4t�}b��Rraj��i������)�0�l���b�e�72�J������\��,�
�����a���M"��K7>	4gN^h.�KeH:~^�+3�n&_k���Y�,��`k&4n��B�W�jMY�������g����Y�0)O�����n�X��N�T4&�Y��01k��e��"�i�vd`�P�+9�0t�+^�0m����`3sj���ASQ�`�^��
K��}zSMh	O�:��6����[@�#�+�5E/X?1_|}�X*q����VF��"���h��)��/�;`�y�/T.�����������g����Km7q�w�+��%�S�>
�Qxc��ew��8�����
��@Gj�v��t���9;m��
�*�����Y��
48���^�wi-��L��������g�@S�f��.��}��;,�=:������fbA��.L�Z4���L;�e����n�5's�%`J1h�m�W��`�PYC����+�cU�oW�K�~Y�,���]�+K�U�+�P����-3�f���'���g�u�-���zz������b)v�.�K�]l�����j��REO���m�Ile��e����
S���{�����%�v��2O��������i6qN�"|e����}�G#��"U����S_�����g���m)gc�1�/}d����Y���&J)�5�+�
Wb;�6#b3��j���43D������?���|��7���9L��n�s`��9����L��,k�;3�k�Wxd�X9|$W�21b;���"u��N�k?�)���s��Xk����k���vr�} �t.�1�.�[��4T�"p)��5Z�`D@l�&�j����E/��Z-�
����8=�]�
;���#�T��3ln�����	�j�����EW���/���P��]��hX�.��^5<����������i���b;k�����)����MEO��&v��;
��������Q�7���T�wW����j)�0Z�<��(Pce�f���j�nd�����m<9
��<J�fR b_VI v��
Mb�VUw�^;}���4��������}��
I���
����IW��;����?��c��4bgjz�l��L�F�d	i��H'4q��$|�bi���O��������A���{��������|��&T����+\m�����G�&�1��B��1�����4�9
�*��y�{�a�ab���gI��$�M���#e-��������4��t, &*��m��C2���J���w-c��M��
��������k��~��n���F�Ks�o�:?�Z�D�c��~e���;������`'�[K�f{����	����;r0g��
� ��r}2g��������Y���E����;LW[aj_O��>�6;n�N#hxM�����Zb��~t�n��O�N:E!�K�
�������M��`�=�5\�[���Za�D���mS
����������l/
�e�>��W&�k���4����b�����;������3}zL;2L�@t�zV���^� �rX�l����/R[�fUK�W�W
c���/�i�v����T,���	�� i�� ]��>
��)��n���ja����KsQ�kw��s�~[-�&�f����%*����*���M�6Rh�i����"ex���yW6T+�W&
 z���`��o�e3��X�,u����d��]3����C�Zh��x��K	��J�=!�Y-�^a��-��/F-����`[B*�Z���2�������Ks�J����6��<����=Br�!�"�VP�0�����f���Z�wV���F�Y���L��R-y^���i�1|���7!���*�J��-�^�L��c���EE���)�-��xO�WK�W&�.�C$y��W���ka�"��D�,�^a��R��EvfJ�-�^a���O�~Y�[`#�(��kd���_�>�����{�C��`a�d�9�kF�&�\��0k#ux���*=<Q�������.<R����X:��WK}��+��U�+,�
����`�cv��,)���F7"f�^��0�4�3P,�B��3	d�P�������t��W&��*�*��r�'s�pa6�	E��f����_a6>h���7�V�W�Lyml���(��L�l}v�QO�kg�0�f��b'�U+�#�c���|o@�������A��d��
��g�MR��g�`w-��c����A���{����t���&��W���C����c"a�������Hf���D?��c��M��"pK�C�w���(���)	�?�y��9M��6������=;��~������=����N��g�vk��[�������%F�Y��{�����._����I��|����7#rcU{x���=D|2g��.���y��7��Jt"^d��������st�6�h-�N��||53&�f���.OuEC=0���n�`w��{v��9M��W&k/���qI��_&
�[�Z��_������f!]��������=�j"��&Y��Y�!7{hx�h�CEC:�����14�W=V��)�����g��*��*���$�UJ�b���~J�r�P����e��b�f��w�������Bs/�J�e�8�&�x�C��p�����,&'v��h�t"��?�0C�b:b_V�$vW%�g��b�<E����N���	�_�E�Rwj}�;����K���'^�/k5{4,I�0Iz���.[fU�bk/6�sb����H�����O=V�XB���l�f:���/h������<�?9��X��a�{�����R8�3Q��X�_	.�E�}����2�0l&�B��������cix���\�cY�zA���aIz���<��{��0E����3�L��cq����\0�p���
��*7&1A�&�^����`���i���0�h��m��������
�V��OH,�c��'�����q��X(m6��[����E��������6=1}�4��z`z�vO�j-���wGyF�H`=�1Yp��;����PW������PgG4,�������=��^u�"�00z�������[d��sb�����F�40�L47<�
�k�|iz���am���g�-0	�4�G+vm����b���^)=kx���������=���e�5��ME�'�$�e=��_��Jg+1����0���ezN��������f���s�e�����9U'�YV�a�d�iz:���D�fN���~X��c9k�B?���>>�D��c��f��n�i*\�(����qH����z�v[�:B�����c����Z���,g����
��
�7/�SW����V�~���������D��_ �[T�4CvC��5�6�{��;����](Yh6qq�c���$��j,��h>��`��H���=6�����*^|!�6�
�6��C�x�����W��p+�IHl�������%�O��,��Bi~�������D�PBI������E�0e�p8E�j�*4i��_5����e�w)�Ks��d�X�}�O���c�K��']�I	k�������Z,}ub�0�$��-�z�!{|044-���x���������������5�]�:����	��5kn]�@K�����8�����v�P�D����X��h�����������`3W�>�(��F12&�5-�
��u1�i~�u1Qu���HV���gF�0�lf�����E�[����*�cM���K����T!|rb�%���,:L�2��k�m����|fz��19v��F�r�o9��B�`���{���T�{C�i�����:*�`=Q��&�]_��,�bj����av-!/��+���-��XB���H���K��,���.�L��*�,�5��.���A�;bl�H���������z1]t����/�=v���g�Fu`�������V�P&�E�3�Oc�W[���-�v
����}��6X11t|��s>(���Y��aU�[&�a��&�ES� ����\�	���0;�q?�T�9	��ML���^Bl�^�j���������������9���[��������0l��%t�]�`�>���{�����������jO�~���'nL���8X��8T�
u#��
�<i���=�`	vn�b����#{A���,��^�V{zJ{?0�lyq8C�91�o�/����ag�����-k���&���0�,�9Z�>E�l*Oe=�fe�n�07�SZ�0�>oz�g��������E���)���K-W�]��X{�a������s�]p�__�$�e�o��O�D��������^��sF��:��
(�������d:
�^9=�f��,����.���k����������1���2����*���h���n��	�r��9�q�*����_������	��Bu�cY��9��h�h��oL�_���&N�����\�������/@�|}c�	�+���kYd����O�7�����Ew�;��g��<�m�;MQ��UK��J�-��7<V(d�	%�f����E��"�fY��Xx����
�4�����/>#���4�k���o���)�"������
O��>���hQl���E����^�1�nt��N�����p�>/(8M���-�>�pj�I��]��Y_
��)�`?���?���=U�m
�������di?1�n���q�^{�L:_tc�ba��v�f����"o3c��&����	��f=�������������Rx���r����H|i��}rb+#�e�&b{�e�Y����}�����nU������;m�Z���B�b_:�
�%<��o��g$����a�X���?��_�#����v��u��'Iw�i��%�OC�S�
E��O����3��i���p�J<&f��+�7�Hx7+�7�e$z���k[NC��U���I�b��t�f%�f3���f�-W	D��?j�N�5�<����*�����5�O����i���{|���������4�l��|����~'
��*�d�[3\������j��2�
���<�M���E�`@#hX�&�p4j�����7k����E���fb�v&X�i�Q+�?3��\�%�id+h�����{�=�-�kJ���a}�h�y�d����
n���;@3�j������)��gN�����/�E]+?�e���r>nw�����
�%��9�Y���<���9�W�&��kV���H��m��`w��{�~h���:dO�k_�a��2�'k�'X����>��9��pm�W;����P���V���v&J4����=
�'�����d�Q�B��ed7�iY���6S���|2��R%�M�ha^�d6�3�pxc/����-'s�w�W�^Z�"���0$����n��O�.�u��1w]2��L��h�i��53�D���.XX�/v��
��[���iz���:��Kj�/���E��u	a�5i��~{� {@��4h��-vB�[Z��wy����lB��Y���Uv�_��0A7�3!��,uN��AW��w��g6@�]�X1��������9����D���Ww�%���a����o�nn��Z�`�i����U�k-M'H�Sf��~`|[���?��7#�AOX��+��]����3�����_]a"I�a�U,�4f���n�
��P�Q�~��=/(��������.���T}'�t[J._���|��&�������������/�� �C�_Sv��&>f+KC�Z�������a5�Rg������P.�E�<����=j�k������m��r�{��������>��%�V����/���3��J�u��_����x�"�O����s�&�f��F_��k!X�933v	�J�h�P��*�{�d�-���t�NS���f�{"P@4W[���+���L��E�,-^I$v��E�/LF��aAV��|���<�]al��%%����f.�m��v�����r�]��4������q�]�mL�[��O�p'6%�a�rbiZ���T�
>f$�`���B!�`��?t�^�|���_1������
�x7��-:��hY��A�/���7�m������(���#kB�������@Z�	]�f��_��[2�������B�B��:M�� ��>K�N��P�5Y:�0�,�V��|�Yx��7�ei	���qi.���0���.2��Fl�h���
�M�_��)�}"���;2�8VLn�`���v2g_V�����P����c^����sbv�z�sj�����#
��0����N57&�,^<.�z�k����8#�`���$�#��.��/������"��i�fMB+s�����*&�[��9Ns[<�p�����d��zsD���nei� ��`wy��=�"�D��<���fkh���[,�3�d���@���<�p3�z�����A���n���z�d��B������.�)~G,;��K����REf�����i�����b������*����L�Wtg�#fY����-������1J4�j;X�WlI��ux;�DE�x��75T��,\ �M��uk�vQ=�ji��d^�A/���X(4a��)�]��K;8�������T>������0��'k���bE��='s�FXLW4���l���o�0V+v��f�3��YK�����`��ui�������[R�4��'�O`)���`)����3AK�v&-+:S��--�������b+\w���j�nY���	����tC���'�K��B�����L'&��a�h����-�[�5m;�=�i)�������D���u���kH�u�[Y���A�=!���,����hz"���,y�Nkg"*���I����Z����cz�d����|��=�`'�,�.+~����K`�����KsqZ��&Yf�-b_��5�9pY\v,\��_wx�����/O�00e7�}��=
����
/�;�w��'���Yh����e;S�5M��h���`L��n&geU��D�N���ba��i
��;�BE/����nQ�����6[Y������v���o�gmQ��B���@�����ni���:E�W.��ys�[AS�mR��_d���`7s�I�2m�e$A��c�4� �.#�%�,�q;�E�����%:��>�+��!��cE�b�S==��u��)z���`�
�VxI!�����-�b��]����DGT��mg���a�,���<�B�b�0g�������3�$BE/X��~��=;�^R��	�c9��d,L��0���:����g=�-DzL�^L�G4�9�,<b�zg������v���_���&���~�a�l����jO�k��.�����J�p��i;S�]`Z�����`=�bw��4Ev��*���9�s���0��Ob�t��vx^�:-|yd�Kk�l7�����\��V	��e��XE(t�-����x;�Czl���9�@�p"E]8����5hX�"6'�/maxu�����d*vba�;P��c-���`�
�q�o�A���P�M�Vu�f?�#�:N���3eZ������b����1�i�����&���0<o�����dmM���`iKQ��b`�9���$n�.�dm��#9���iy����E�p�Qa{�dma=��8�TZ�j�^�M6�G`}Yx����)��i��P�������|t�0�(�������4�<>K^��
}�`_��,M�nfz����4q��,�K�gY�i����H�X_��9k�v�����������!
�X%��i�$�~w������?�*r�SF�
*.H�������k���t;L�X^�-�SQ���giZZdtK5v���WJ\���*|g�>eKZZ����E��FL�6���Oi�
V�]`}L����i�v���C�o&Xi}�N�����?a�0��~��=�d��,i���$ma��dia�!�	�S���`�V�r�^��v�E]�O�.�w��	���2�-�����z���$m�r���a��X>�=�u�];"�
|)��>M���,��e�hF����.^���3����XX����4Y�^v��vxz����[��4T{^L�V����,�
�"1
��gIM��n�R�	Nod�������~#Ac��z�o{��t
��3�ue;������`K�B����/�B��k���E��*Kle1a�0V!�<Y[X�4����^s��e�w_���x�pf�X	������z-�������?��:Q?�����jW�	�� �2�f5'ba
�XXY#�-��/�=M�5�Y��h(�.^&������)���hx��cF�y8��6�|'���5J����fQ:�Po��v<������NQ��NdA��
���K����T����'�R{�m��eE��S����B�����M�b���X�#
�:�ra?u���#���� .[���E���~_-;xS��������2Q�be�b;��w�)�9
�#M�c	�+r��&���W���9�-- �I�U/���/v�z^��@�(}3��iV�!���-�O9�I�j�4�S���t���.�$��2���{�--��:��,��.���vY����g>�vt.�R�i���Y8����g�]�����Z)=��0�;-�O�9��u�l��h�~;�g��4]�����n�����au�XX,-�R��i���H�0�������%Y
�\�.k�U.z�C�b�����u�n�m8���~`X��Kq?6�:8��e��X�,���C���|0W�����������o|0���\������.�7�,*�3��p����Z�Cs��8�A���9�O08
�"2�3��X:��RN�4D���\4�X����M[l��t��ZA�"�Ss���W�UP����l����6�[�pW^U�L�-���+X�
oU:�������EC������a�����2y����9��N]�,����`���z�E�.���h�[���.cS����J�DO���V���(=`h4�M
���I������������+��
�2���X��o9{U2
w�U��Uo�����SW������$�f���N�t�l+83����C�����-S�����6XX�>N�����v��F�Ss��`�����������v������P�+��a����^T\
[����������3Xv2�]f�n�l� �F��&;�$���C�X�]vTl������1�uI6�s���v�u��3�>D����p1}O�p~3����/��&�y}g�����HNC��
�^��L�]/��~G�E(o�r2m�S>�$X��N;��=����c��5a���a}����-�c���r^�0h����`��p���Qj�?o%�n�{�e���������@i�Y"��N�E�4�$�<���0O�^c�*6�N�� &R����Kle��B���A�s��v�E�I����=~!G�p/NzxB2�?�j���^��u���!rD�#���	I���I��6YN����w
����`�q������?��[�m��������`W�����A���~�V��4���T�L�:������}����V���?1�s��4���`9��6
�i"���������v�}��@����w�p.
6�<u�1��h'�<��f��F\)����Z)�aa�4B!�`�?
1��/��:�����)�+�5~�V����	X�$u~���5��X������&;u���~3��~�����&�2\`�WG�wv���4D����]t����,���)�99�\(���<�
���]�X��|������}m��G��i���X�`���fKS+�G����pQ��&	�V������	OF,U=��H�(�eX6 �b���nN������~��e���t0A'�8���K�c4�4���,��I1�6���e����$i�0�Y$?`r^4�dn��+��X6t+���e��+�X����P[�_������ ����V�m���D��_l�&�a-�����V�l��S>���<o'�9���T�v��b�-�&G+{������/��<�����/xhE��������a�.�va{Z�=�@[4<f+�jo��e�wO��2�B+�r������������������z����������nVb$�a�?qi���M���G�Y�$0[H�M��'������6��kvL��j���B�h��
O}�����%V�6v�\�J�0NC4=D��������R�b��y�i��d������~�'7�"���i��d�m�0=!���NvlRl���n����O��.�~��	��,�W,<=�v��ic8���6	�����^�P����=
��\8�^�������y�_+��l��3|��~����i��d�����i������f��[����f�f����,�iF@�Tpv��#7�q�$��;��i�5���X��-���e%�b�B��VXex������,7,����n�m���W�JfZ�=aO%�.�����7���0�����O,+�r�Ye����?
��'&���^��UPeL���a.�������������~�$O���:nc5����������h������U�@LH-����64���4�o��y���8�~"������24����oB����4��c`���P>�~;���}*k�����o����
�B���;���{zJ2L�aN_b����f��������`��]NK�9K��\ �>�|%���n��{��]��"��<�~lN����_�7��:�������_�cR����c�G$����Q�$�f�$�
����?G<o���i�����Aj��5��i�M����9��'�}������Sz�_�hv<M�S	����pJ����w��l��h�0B7�"w,�
i��'%����C
��S%�w�fG!R�tx2�����%,��,����T���7LcK?<q�pg��s�L�����	u��].��Hf:}�W(V�t��o���c�8L�R������B�d{/���.
�gfv�Q�S?2m�-�J6�N�T���T�P ^��'.�z�=���]9>���p��<o?��,-�yt�%�mF�Slx"G"pEt���b��������85����aE7�=*�l�����\���9��Q�y�������w"�R'��
�*�k�,����
K]��[���uP?<��V��m�0�4���a�-?T�XT�L\*��Iz
������%b�J��������.�|,�0y�.��������6[��OD'��
�-Gu2q$B�!����,��[�N���]��[��C���C�P�QW�0�[)��{4��>6�F	^P$6�W�������\b7����?����z��4�����H4-������g�5������m����p���	�[�w�����-���K�L��K��F�������S:���A���H���:��{��������	A�j-i���7h���qk81��y���4arf���;K7?��J
���
���.�T���^�y���4-���E4�����X8u
�2��������>m���J����N�9��%K�6�Y8y�v+����N��,��
��U���������z��Tm����+�������w�CS�y;������R�r2��9
��XQ#)-�SF�����~[b��Vt��-�z�����V����O%��w��4���pa�<��;�A���D��	�G	�)\?0�������-�(��Q�0����$�^�<���7q����`����m'��������S��Tdl�E���)-NC������G�����`���t"�4B4��Wt)��w������/����8��Q���bv���SiN+��P'&6�VN��p
^#)6�X��������qVn���s���t�l����+�
�h�:���1�-�ye��9���������������-3���6����y?o��]�,g������������"��e���O��^8E���^L
-:Wb���njS�}go��6��b��eC�ba�h6�	�7D��B�{Y����.z���Xv6Chc5mb�,�4B�#g��������Yx�K�U8q��X^�*z�
1���������������eb7+�[��/��[��.I]6�.V�,��o������v��e{�b�*�k�i�N]u �Y��-��i�
�����'9��sD��2�2��Xx�H,<�$�h���4��DX��i�=)���'��*����i�������m���7*��O��p���Y���
#=�{a����D��_o���:�a�M�+�[Y�Z�o����D,����3�\�r!�O�T��	�6����7��i�����������#�~���eg����6��K�`0����'�s���^���:�d�`�S��])�r���TvFB��]��������d��i�h��{�����x�%Q�Pm��������hI�a
(���v�+]l��4D���F4�%D,�8Rl�
X:{[(�X$/VM+J��>������	f�>��^I��q��^�����$�^�Q%�a���5s
��7��"y�oB�P�,v��{�
��+�����4���WO���0l�|j��L���,����*�������7VG)��>�P�Rh��4���l����g�'�>6�
>����/���R,]uj�R�q^G�p�����Ga��+������\����S�b��e�64����0�����UG_�EPAW�H�vJ��[������:(`
m���0���
�����qD1�N��`��H��N��m�}?u�\��X��Xx�����%p0gK�����M�f��npA,��	�[�o��������M7m�N�sv���������$��`���$���6[�VZ�
U���5�bK������������Xx\Y�bgq��0���-���,+_� �����`�����h�������`/X�,���������:�y����eg�b�p�������:�K�������,���|��|� 8
��'��M��f#Y��/:���IF0����]�����������R��%r��m9��iQ���"'|egG:���tZ/��sC���u�b����`�l������E�<{������<�h~l.6x���v�;Z��gY����@%=,�P�pO*X(�[�XY��`Ab���7d��b%���kf�8�
������b�SWO�U�����WH
Sx�_M{�������an�fh6����x�����fhx���
+��w��6x\n������+}�n��7�|u����_���L���+Xx�������+i�������5�pr����W��l�^�x����1�XX�����^��^��h��9O�������K�����c:(`~'��(�.�X�/xNn�����[��6������"�z^�&���0��A���A?�%�]��'XX�4�
��]����������!��.K7�������0��U�qt����1Y�Up�/��,���x�2��BV%;�[4�����:(���a��
����;\�J�v����e��ug�!��x1u���x�NX�u���{\x��^�0���):5�@V#l��
�}+u,
��m���>|Lex������S��K�������s0� ��c�`�B���_A�r,���2�`h��8�z��tD�:�_��e@��UX�
���`�1[V/�"�8BQ��SW��r�(������vXcl����!�vg����Do�}X
���
��.[��i���^^8Dqo(����l�P,<\��-�=��L�lgI4���e���m���V(�o�6���Z,LD�����fE�v5o�j�oJ=5��9�����,;�*^�"�r�l���Y�TtE��� �b:��cyjn�9������m7�
�`W��>��U�q7�6�g�����Sf�7�z
dNC���-�Do�����g��e�V~�vo�"���Vn�vo�
��@YZ��s����g���V�������|���UO���~�@�!o�SO=��j7���3[��my73��~���_�A"D'�h��T�w^G"��Dt�o�8��}�Wv��T������Tw��a��lH�(T�o�maM��	s0���(�Y��*6o����]�����XV��^��?��J��VV���n��l7��B�d;6n�$2����.M�fg����SO11���Drf+Kb+j��p�'\^4]�T�5����ok�M;��-�����n�>�m���I
�q�N���\!��:b�J�:�����v������:��>5�X��SE�c4b7�'�}�D{+��^<��0�c``)�*�1���ZbGj���'������)c���%{-���\�p��7����-�s��#v>D4��Wl�*�u��7�n���ZY��}
]u�a���|���U��p�I�Rg�A
��r���+Xv>Eh�i9���	�h
�n~[�Z��M�_�~�_Q,�;�g�O��sA���M�t�.|B,�[���zLG10o$�*��W��v��������`�OW�g'}���z���U��i�O�a�-O,�jP�����
c���WlO�"N]u�
�EOf{Eb:+��r���Vv���0�t>�{j����"b�<��������m�9���9.I;+u���n��)�����m��~?�pK\�[���)v3��������nvZR4�eH��_��uk����F�D��&+�^	�ll�p�zW���0�W���#���z*�O7������G�?���o#�r;��v5�>67�@p[��Qx���;��
v�It���;;��G�������
MK��re{��T���I4}�O�y~�a�i�7v�����kn�����P���Pt������\��m0�0��OS
e
=uH���n0l�O:u�����B
c�`sv��U������MZ2��P��UO�0�4��Kl���`s������a�H�
�F�M����z��G��������2���^���uu�
�����/c+<�7�a_���oS�f�X��I���|�w�t����
k9��/����%Z�c:���YWaT��d������u��D4����������v��b7���0*�*Uas�,���t�c��[�V���M#����R���M�������b��Zx����m�JU��.�����le�^�
7 �Tt�vm��>����l�x7,w
�=��-����E��>P�}H�{���M�y+�csQm[�:v�A���0�g����p�}'�b����Z��sm����k�r��V[�X������	(��]�����u3��hZ
�t�ma���^�-�X[�
������_�~Gg���~��������Z���[�3���v����L,���8��x�r�����[�x�r������h���&���J���	bE?��;�F�l�)=5�RA�e�$Z��%Y�aAw���#A���+���Y����K���U�z���V���C�F����ut���V��m��0
�p��O���4g��65���=u�rW�dz~?��47G��(�EQ��o��,b�	~���V�����X��@U��,�y0���������gc�S!|�"��~M���)as�4�O-����`�)as�%�����^�`��$�0������rs��TK	?��2���^x������MO9���s�zyRG�'��{j�32��n��������,�J�l�d�����	~"��c�76���]��2�/>
��	�-5�������^����;;������O��(�~i�[z
�(����eQ�/�=��8|�!�h�6��o�k��������������E��a�8��#3��W�����f�����1�h/YI8����5*�4���:�+�c��u��r��4|�b
�2q���lH?Ps����~i��4�7BN]u|sA��MrYt*���~`�p�
C>�Z����C>���
�!����~�O�!>f�_��^����10��tc!|L�\yy ��i��t���
�����*a6�9�F���7�.-0���,8B�V�.�N�0��F_]�?-�4�8����a����N�����qLB�����K����ex��`��rfK�����s4�������x5����tT��6�>��-����b�-��N�9A%*���j����YE�
\���������[����)�x^Gp�M���D
��y�eM_0z�]6�<u��3x�����Y�b3��6�O�N+���x�Q,Q�������HZ���?=��ju������}M���S:�����etN�lj��S�"��4]���|f����H��9A��_~4�*�u�[��;���-���e�#�}��g�9-Wh�0{v�|0l&G�x�?��8#E��_��8jC'�M_���������;����UG^0'Mk:�th�q$�bAw��yt�N�W�8�@'�M�������OA�	����f���z�s�e8��')�J��Wd-�������idvU���+:g���>R�a4��OO�i.�$K�9�`���f��Bf�� ~�sp�4���}��A�N��2��/[YG?���"Q��-��������f7��]�DI�����pL�T��;�q
�@.|��c$�2=�z"X�k����
W�>�?�C X�#����!,/
�)S�68��������T=o��8���IA�S����>�8&�������N�[�>��(m+�L�mHhk�#l���b������`�����:����2��,=��^���������6��5�|W����`I��<�,�����R�0��4�h�	v�)x��m�na�+���T�Wi���3����b+����V���e0[�-O�0p�6�3l���>N]u�2���_���I��'���rfv:�S�T$�joL������4�|K?��WMK��H�!������[e;`zZG�S��%�J��5�pq"Y*��Tx��piDMwX���y�����-���	���]`bv���`�E��S�b+����	ieM����~����	W
��1�����	��	z��DzX�������x����[*�95� f���>a�.��]p;t��3gK������IN��^�C{�� ��_�������`k���~������AX��K��
Mm���X��8�;��G*��
������ Y_i8�l���t�������`/�	R��t�u�1�����X��CyxaM�V�&P��+�������6#
�����+��
����N������|���.�|�e�p��{[g�+MGPp�4L��������z��F�����:���������i���u������:�b�v��g�������)/?%z�Dw�S;������E_L�$�pn����b�Y�pI-6�H}g;+h�����!�"������j��i������5���M�@Q������B	�e������Vq����'��/��j��M�]�w�f\��8U(�q������#����KU�p� �l����B��e7�E�!��k���`��6fm����n�0�e�u�'~k.�N��.���7q��}�Q
z����lcu3bU:����3��B��lg��f�r���S���������!;;-�I[���z�����p,�;�j����������W����y�kV�.v��.��/V�-z�e�t�,w.v����\8FyY�|��������i_#�ee���D�M�������'�����M�����#����:as��R9��g}��
v@F�`�
n9�4O]uP��������O�b���m.�����u�\��'Lv�e���*�������Dg=��9�10�'g1��?w���~w��H�����jD`�SAO�R	������^L�%N���`��&����-��_�_��O��|wl����i��������Ya��S�w\�0lO[t������#�4��d��b�zZ�b��j���KqB_w]��q�����b���4DbX!����`s	�w����[��7|l. &�t�������W3�V�r����L�����nE���|�1hV�,������U�#[������ck)��m����~�&�������)�+����+�
�q�3����!e%5o��^�����h���;��@n&���DlAVzY�|�� ����X���\~ga�]������M3�6���BI����M�.7�rA�v��|1K�h�B�2	�f�������M������k1�m��G���Y�,�O�,��hs�*�	�*����������n�����D�����E��b~k������i�����c`H��~�N�s�auD�
�X4Z��h�iPt>����a�y���Q/�/X'#�Y$~[�,]����S
�l*��%�/�5|������������^p�lc*$���A���g���t�'g'�A����}��d���oD��J 	�(69�Ie������PA!��oB��E�>��x=ex"G}�4H������� E:�
��J��}���F�We��G:��,$O�9�`B�9%���y��Rb�8�#�o�I�����C�8����������������,��o`��	W�������w��~1K��^Y,�~���hx0$�hc�kI��?<�N����u���Z����b�B@�.\�|Yu�����\D�0�l���>��8T����6����ux�iLNX'��������e�:�W�����j<������f��-�Y���(����;<(l�����������oo����:,�Z��ge�c���]�����_0(���]������6#��Q���;?�����4!�c!�E���I�U��8��P���G�t�s*�	+��\)���jTEO<����k:�>��w�}���.�0/{�/��7
Fnw��Z��O:�} 1p/�{%f����A����v�$��=}�O��`��
�M�wS���b��^t-�� �����	L����q��/��<�L��jN��/fv
/��*��mv��Fg����w�R�hI:��\4u��r����������~A�UI�a�b�O��N��h�X�^���$=_��������X5�4�f�G���71�F��s��~
��^v����E7��Tl�����r���y�aRLO\���3�(z�ok^��]�[��;&�:	�a�'�x!z��;�>�!\�K����P���"�J=�=�����w6gw����s����h���
w�5�����^��^>5��3!�nlZ�>?B�ik*��GU�_�1�����Bb7����-�_�������X��hx��������>�*����+��������8��T�~������h�eT���
��s��|�md��L'4�����7�b���fG:\����Ss���Q�LN���Y��X�Zt!�����Q�hx�R���[��xzL�1L�m�m����XxJPl���,�nlq*z
�%�
~��n�n[,��^�`E
�s�3�,�npU"�w� �Y�MWA�b�>����D��8b��B��z�a{������q��c�^�����SZl+��7�����[sA/���eu�b+��f14�JQ4'o^I)]�w��np������F�����av\,����|�>�E������:"`F�t��M�J{�a���B�d+tc���������}b'+)�!�hv��u�Pq)z���Y���b~�"�@?�<�����:xbU�s�������f�vc����,�qi�{M�q�����.������\*�������ltoU�>E�~���jR�fv�#�z�����'&�
sbB�Q(�y�����b���Pa,6_T`��i�� �nR7��������
�k�����U�	���V�����"}���Gl�������~_����;�af�&�?����e�ucJ<��+��0c�v+����m�������Y�Xa�������~��J2�����	6����_k���
���:�_���U��	~��M%k��t����p	���Emp�"j+�@����U/������4��
���I��oZ^���g7t�J�KO�8��}�4�����k�+%fv�]Is^�0���hX�,��Sb7�(�
��f9tc��E�����������l���v�bm������?��� >
�#>��.����"����gXa,�v�`C�N=a�8�N�p��mX����J������I�f�`�"�;������u��Y��-�lR
�>�d��m����.��hi��&�w�E�0U,�����t���q��[team�5�]|t�F������O�A�n��W�������
Us�W
��Xn��,�@�`�f�������������N��������'������dn��<C2_��3z�v.���(V�b��R��O�u�
n�=�*�,�����dO��i��A��}��`x��ixZH��J���
����d �<�X�a7V�����O�I�K�QF��b7�]�1���t"+x�kNec�c�5�a�����|���������lj�J��
P�.���-��YZE_p�����.���^�Jxh+m�/O���m�0�4UH]�6m�m0���K>��6�����.-����I���4(z0G��|����(�ZV4}�����
��f;l��@��i���J��CWmZmp�di��>���B,o��k�R�4��&���^��Y����U4-�S����X��V�aZd]��ZZx��hxA���')m9JgYx�����:��/Q�q�L�������D��V4���,��������Q�bM�X�e<�`�3������b+��V�6�q
:_]`��c�8����?
�C/�&DqL������:���d�s����J'�p+����6�\�{���Ss��`�(hX�!-mE�b�l�}l���,g��Y��2 ����6�O$
o��a-/<Q�;wc�*��6��Z���E8��y�x���B~|���<7l������5,��9��[��`�m���-mM��K�=��{������(�=`Q�4���6X����-�R@}��o�=��Mlg�Kb�M�������9����E9��mu��J"DWv�o�to&{
�Bf���.��t��{�xBt�?X�����n���m/��Kt���;;��E��fY`!���������Fte����cn�i��(��(�����>����wG�1�s���'a�����B�u��{3��hx@E�,�n�o��-�a
O���F�k��_�@wZ��F�����;f��n��C�jsn��o&o]I-�Y�J4��K??���_��V��BmO����D���Ss���W@E5�����69u�q�����0T��������V�!�-Y�a r�8Db�cF����X��g�`)�-��Y9���D�S���m��M_��E�b�B��m��
W��;��9}g/V
-�	2=X�����7��=�O�,���.�|��J�0]���J����wv��E�\��u�7�)��0�(�t�����f)l��p���o����U��ySI�ix�1����~���+k���r�9�m	��
;D�1����SO���|���Z,���}
��^��N�:�Vi��S�~R���9{������D�5�����ULZlnf�:�]�[x|��9�|��wv�w��7�����Y=��\O����A�&h����~��A�����I��arWvh�)
���mi���Y�����B������,�f�]���'��!��0�Q��}|K����]�ba�S~���<=��	f�=+u��pU"�l���jY�
?�������:������Eo8������x2<�ub������.��EW�8��N=�g=�������}�>W���0$�&���v+�����w(�^`�Z�����c:a.9����;�a�1�l�==��	�Ecm1����8D��(���'��4�o
�L�(v���b�N�it=�\S����n�����j���]H>Y�|�����4���s�7�%�K�`{%�hy��N���w���s�YAW�����7�l�]����"�lE��Y�z~^�l��`w%�a���������������cV>�T�[�w]G1p�����,�t�Q4<#�n!����UCA��_���fJ\�;�����T����7�;���[*��������p�%5-|��7���e�L���e��f�ck���F�Yxm�{��>b�)��	������K�R��s����/�Fv�3�V���m�7L�/Q���<^���*�;}NNC����c��?N�9$���h����0Ihiya�����sm�wzQ�k���w���.��n�oX�:e�a/�T���4��������7��zVj2�����W4,_t�}�`K�����OD�?��R�n
��4�����Wr��'Wm�-|g�����R4<�;U<
?"�J�lJ���������iX����v�
�6�EB���L���S9u��LK;���5X�%���7��	��{��WJ3�,��/R�_��	v��f��$M�S�m��
�6M�@�e��,�W,g��i��4���abi�a�m���et^�����`=^�*J��?���`!�R��'V4>�����Jt��;D��c�tN��J�+�f�d��[�K�
liNr�WEA_0��a�x�����n���~g��
OE���A���k��!r�I?�����[�5�7�,�����`sE��1�w��Oy����X�������(�~��w�u�[�A�[��+o��>��z�!j|G$�U�q������R��t��Z0��oX>�u}'|�#U�v;RS`azY�Uqd�M=][�A��Q�U!������A������7,�z���Ss
�i��XH&m1L�n��U��Q0���������
j7����1�����X��,���t��\���������A���3�����Rb;+�[�G��%��E���w6o���z��p`�.8����
���+�}�V����h������������l���_���psh^]1�u��;;�*�~�'���]��b�
�����~X�X��s�Y]������`X~/�*�H�-�Y���9Y|��.����b['�m��-�U�0�-^�)6;��������n�H���7!��Y���R���2������tR���D��tcj���H���`G�r�npg�y�ah �Iy������������3�������<5�����.gn��Qw���El�����l�~���3�fY�w��o���,D��CQ�hx��/�'Q=^Y��y��E�4K���i=u�a+{��L��~�m�Y(���@;���6V� z*����9�Eo��
v��=XxLXlZr�F�1�H��v��8��~b�0i��F���:^d�a��t�5��i|E?�FY�����B-���:�����	v��;�q�f��fa*�Y����=������+��L{#��Q����s?o����Z���l:U`��k�3���	��`s4\`+�jOs���[WPat�z��i�E�HO�����M��S�������:w�y���yw�2���`J���|j��+
���>L�*�p�w����?$�`h����G���V��}���g;��a��bOb���� ��}��.|���Q)�h^J�-K�?k)�c�~#�u���5�[���H4�����.�F�A�4B���2J�eVn.��� ��Nlc��Gs^|p���wn���p
�w���!h��
��`���;�
w�v��;�����d������b��H�� ���aw&5���l6q}g���R��!r�������)%�$���o��7����<�4����?��F��1c_�`��xwXt�o�J���G�R}��1��%��Q�n�t��WA���@�����J���5hx	����$bG:�yzL�^�J*z���`a�_�GQ�H�V�?�2�#t�"�}��V2�x�P�Q�|L��c��G�F7�-�M����u��|��;�"���p�q��S�a�V������-������I=�Bi)���k�@�`����48Sk��8a�p��/���Vf��8{��z
y���.�]���%��q�|��_�u����DO�&��~�G�e��Nz�����W���\�cv��������LZ���N����KM�_�,���U�3gK9/;�;���������:���ZR��Jg)��w��iD:Tb�QxA��	K�eX��C�*_mpi,�zit�c�����f���N��c�9��g]4<%o8�Xt��M;�;���n�$��M�,|��:�0����d�w��+������VfMK��(]4MB{�*!��������9����H���mJ�pgc9�`9	�z�g�����N�5y�a�$�	��������i%J�!�T�|"J��1���
��_��H�;K�����wK��v�������;k?{�I/y�a�K-��D����`Su!Gm0��t.��;KW��Y%�\]Q�3��n��`A{�F%�������0���
R���������aA����ku�E�~���0�v�����hQz���+C�O�xu�O��qCR���{�;�1�����������{�W�*Z���3���,���N(}Q��� RW����n�=��Ul�����`V��f/���0L��������i�P��0h����2��,v�����������w(�
��$,�nR�p����5��"��(�����+z7��;t����,-����,h*6��*v�m�`�������e����E_p����5��	��nlU���*��.�+	�&I*C8��}�*�-��0��7��Q���N,\��f�>��>��?L"z�-=�P�'v����t������&�Px��ee7����4B�#��0��F��{,�XH����#�/�������{��� �X���m���<!��?8�)v�)�}���*�),�������
�O�.��Nyx��h���������]��>�3��}����h�wv���U��a5�hV'����b7����T{!l�'�*�=V�?�H�h��
3Wf��z�#�4BX}���J,N�9"`bx��G{�����J��Y�����{,��T^t����C��0����[0��:�`9s�4��[(���%G�jZ���\�Ju�2zb7K4���y6�?pI4]��e[Tb�DN��lk7;O��	���F���b��{"�?�*Qt�~g8I(_85�X�u\���Cb�n�;����>�t�i�w���|�l�G�Li�SW�1����w|j�1+�0M�"����;���[,��Dle������	.���t")<����BA�c��C�"K;���?�')�N����	�Eo�&�&V$:���&OCe.r�������b�J�;{�!�va�l���R���
/�ev�S�L���c:pcRx�� S��?p��Ll6����A��d�gU:b�.�m�l���4D��`��b��n�#,]��*),���:��'�mc���k���_�OC��\E�J��}�3������;uln8������:���z�p�,�F��}~�&��j�j>6�?��Q|g���(���&�{Ur4����4D���[��^0�P����2�����Xl��������c:nKeD�k/��|G�f������&�Q�b��e�a�i���nX�#Sz25���,�������f+O�(���E/��R�����va�B��Gp]m0��wX��s�E_��%�bi.I�sXzi~���:��u��\���e���U��Z7�	�`�^�*�L{���
/{�X/���:��\t������uv�D44J�m�Y���V�K����O�yjf'LEw�;*�v6i?p�t%�������r80�'���w���y��p��c�6M���-^8�^���*)$k��X6 ������CG����;���s���p1�|������a�4�p�"Xx8���7�������[��_\9��zPl���Ss"�"p3I4�E���|��W~��chW����;;aP��oB<q���X��0���J��������������j�O��X����^���{��V�X�f&v���K�������J�3��	Vo�M�[:��,T����{!+�f�������b�p*��^�`��g=
�#>x.�
�B~�
���Ao��	6�aN]u�t�����`�y�������-\����M���[e�6����K
s����p������F"SRF�kQ*�8=�c��'��l����n�|��cs_;�����;�NO�p�9�E���;K��[�B�[��?�����;K1��NO����
��;`�R����u�����L�.9
1J�h��E�]����z�:5�y����g��p����*8��+�Ss���Q���aX�vu�c�2���������6��0K Msz�N�y�d�b�yMxh�
�����\��h�;�;dN���)=S���AOXV-�)y����w���NX��<��k��M�a6]���`�L��d��.�	������z��V[z��_��������ZN����#��Q�ia��X�	�A��W3���>L�+��F�S���������G��lp{�����G������������k��Dw��p�]��/5�s������'K(�D�����p��.^2d��4��Q��;N�y�1aW�8�&�y��������bVG�,��w��2����P�9�ilA4<g%�m4�����������&���E�~�"C�v+�������O	_�����2;��v�����4l���s��wn=��f��cn?&|i�
����2s��-��m��h+Z0�j��6V�(v�?�i��1��hx��Xxe�����n�l�6;
��E������(rO0Z�:�m����������\E����8���;X������,r��w����
���4B5Y�����m�-���������j������8�������L�������3�V�������_���C��w!U�\�F�k;`�%7-+���$7-\�;��U������u����'L�K��x;��N���?����M���:(`rZ��p,6���aIq���M����u��EDo��l��Y~g������Q�`x���I���
��f����u�cc�+��e���xEf��MWH�O��l�����,��>���� �b;����[�W��w�
��Ga�z�k;��M4+�
o,�
��Z������%���c V�%�0�X�:�^�d�poJ���pgXz:X��h��v������FtcG���Z77�KeE+f{�Ep@��E�k�N�yb�����d�iA}��'9�4��.U,]�[��+O�_�`�Y��BQ���v��I'9@�F��������;}N�y�K������&F��;bg����^��{�F9�6�w;���U����u��7%�����d���_S�zaEh��A����;d���t4��2��D���:��b�z�8�!�Q���������^��5�V�$���Ylcg[�f7�a�l��� E�A,{J�<a6+��5'��lX��Z��o�h���^��s0s��|�;{��
�C�!<�[�n�{t�c����V83�0���<O�y�����+���r�t��'�	��vO]u�A�jd�+��]�f�}�����H������n�XH~X8yF�p��.�1�H��0�R�0��9��^�V�4D�{��6������r��v���wvV�$����<���1���I"������t�������&=,���J[H�,;`��hv�S��T���
�}U2�6��8	������:7O3�������ba�-�3;�^)~;
�C>=��J,S"���x[�:�.�M��hn��
��aA�������:����<�acj!���4���5'�(<�m�i����a�F�,��:��^��z;��1=;3)��Y�i� :�~�L�0���b�G+���?����w.�(L�{��f�c`�k�b^���/�T��u�		S�{
W:���Y�.�r��������;�0�R��{U��Xy:��F4]J�
���u%�e���{	���S)��J����P�+���.��R�p�l.x���+nO��(n����*���(�[:�Z_4����S�|��C��&.�o�>5�p�����Y:�\�xj��@�=
��9O��x��T�*E�Xq��0��6k�M�5�1w�[9hc���1A��I�����,��Q���4D�'`�`i���H� 6���\�������!�KKj���f_�i<4����(�[�:���U�e�e���cswqO��U����Y6�JO]���Mn��aW#����vx
w?o7}g[�&�n�#_�e9{���`i�v���5[y{z�I:���2��i,���i�������@fZX���[�Yj��ck�\���3-��,/&�s"v���l
.4���F�����p��Y�����������\%w������js������ww�������cZ;YRD4���e�{������QZ�����}<��Ex�=Vb�D�bG��.��v2s����l?6��U��0�
�D��-O�-7Sa|bk��OKb�HK4<�����,;�+������N�J1���barW,T0�-�����U���w���,w�^�70�\0{"�@��,�����H�w����l����N>�n�
��
t��0��/�r����WS~Y�}��kN�e'���n��}�,����Ut�]��0����ymE����n�� vU�6;q��^������s����a�#PxU�Xx��,+���r���I^�{�:�]��Al��kZ��5Dg��w����u!gf%.]���������M�J�>w�j���|V�f�����[X|j���|I�9���CB�kQ(���-\�:-��lOt~u�����le��w2!�hxZ�������D��B�}�$|-��L�+�Rn�m���D	�N&��a�C6]V�&v�mK��U����c�&^����O�9��_i�#��"�[9A=m���`�h�e�N�U��]���U���A�z�*bYq��^8�=����@4\�
���YY�F�����w��<a�&_2��^U"V��,���>L;�'\[�����w���j�P�,v����Bhc/��]
�U����~���M&y]���<��e����_�E"p���������~���Y���9Y�`We����5���]tVR��{���t��`.^�2���*T�d&���(��xOf,}�7?�|���U�pT��`r�k��E�.8+�{�d���|�E����k,����)	�N����4���_[4��4
���mtOO��]pN��'�Dw]'_��/����V����P��I�6������|����,;��c��Y�CXx�6�}����O��
���e�� �X@�v�+���;��]����/�95�NwA�}�G7��_�s��\�3�M��J�m�y���9E"���m���UGp�R�rXl��;u�!����o��SWO0��������p�*m9��p%lO����:�C����� �e!��>|�����-������E`jX4\��0[05N��'L�YN]X�YN=��Zt���%��������/�f�m�4�$�r��<Y1��h�����n�������4B�#�#Z��G���y�E,�T��V���ZO8�Ms��n����i�3<��v���4���azb������^z���U���S!A���iA��QD�t,����`*W��2N�VJ���������\��ra��:���8�\Y��(�j�N,��Y�'��lWpt�Sa���+��6�O8��`
]��>G��#���K�',e�<>���g����t�	��e��������N��������U������Jt����n&}�@*X��]��~T�UI�Z�>�>h:DQ����]t�V���$�����}��f�<
�N�'����~6#�Tx��K���\4�e\���%�M��c:���j�.r��|���p.R�?�}����n�e�����g�9
h��G���rG��������k�'�H=�di�k���t��1�����C�f\�/6,,l����t�qt�nR�J]���C#������
��H7���O%e��:��;�R�����C�w���DuENenp��K���[�Y~�/�h8�oe�
��5�kA�J��Z�.������������Ss�^a��h�l���Xz���%��+�S�x�
?6;a�������L���}��(V�tX4���*D���So�~�7}g�g�;�`I�l��0���?
��u�U����Z������ck����e4�M�d��M��&�����]�/4�~X���E�+6��pz����^Y��I��2s����'����i����Ed��]�	)��&������w��95����hO	vU��JWw���wVl���������It����e�����b�<�XRL�J���9_�����Y�HlcG���$j�Z�X�X4T���)�r�����.,�a�a�����]�o��p�\�.�'�u����N�.V��v��v�J�4D�%��#75�
���i�e��b����}ul�^�ZW^Z��l/G�f��b� ��L�(6W����Q���XRUlE�����������b{*�=u�Q\�H
#�`aF�`[$b7�������wYl��"Ob���������D���X�x[�v\L/V�%�a;�b+�eY3,?�6��0��0[��z��������g��sP���E?`5x���.l-��-}g/��"���n�����v�D?�Olar�?��X4t���\[���]L�+�r�i�����W4T���f�u%�l�/�B������N]�
�bwa�|�m��mG4<>,�Js������f����e_IP�><�n,�1���F�S3�x�k�$��t��o���1>
�#���`����\��1w��-q@���c|�^�.(�����mE��d��fz$>�{x�.-�|�M0��A�U����V����.V7.���V��\��B%�i�
v�2�0O�.c4-Nc��	.�D�M�`�]���:tbP���j������H��0���������T����LcF�y���4D��3�)��f�����Y	�i�m{�/t�&�AQ�-m\�����k�U��nY"�`�"�fZ���Us���W\�����pBtv)���d���n0'���k�[��?�[�g�n���;��c�������9�e�%<S,�F�>u��s13�h����
O��/|��+���[.v�O4�eE,�H�k&d��Z8��,���z��������P�
+>���$��*�;
��	�
��7�����,?�Mg�`+��'v�F42�e:���u�nd�����M����9�`��m��I}.\W�l�]p{Ht�EO�9��9��/�w��,������xY���^K�����v��;[�Q;4fB\�
fKe��C���y���^�f����[��T�Z��
��;��2|y��
�;X�[���!Vt.#��B���<i��������~�"*8a�M���ZE����^0�1�p�E�V
��[]L�*z�,T��E����,��"�Z<�+�iA���=������o����<��=E)D��"�<�w=��U���+�L��H���Zs�V������~<t3�����u�K�y:x2rV�[�]pW)������R���tC����?5�p�^��9Jl>���.�C��u���X�Y�������4D�&`�@�tv����fX+��
�~S������i'
��
�`�����:$�?���D�����UO�L�'����M)�SW=5C����1�e�v�3�>�zC>���������O	����3B��rb����Yn+5i�t�Wi�uL�����z6P<��&�	����[��`Y�IO�o]��
Q����^Vy.x;�
����w���C:�����|����T����:D�����H������	a������V��m]�*�:��2�-G-����$�,.�!i���$=��@l�������,��9��p�4�&����N��ux�����q��=������r��m=%�4�m�'"v��3�y��4D��}�EO�I0��+N]m�*�x�f�
����nD��Sn� ^�%�����)�vz�����N������E�;ld��1����'wD_�C+���mb�mCle����l�^4�W^�����������~L����#���eT�v���X���-�������5#n��]4�=��V�n�A':��th��Q��!z�*I��:J�SH�m�G�Xt�_K��x�XX6d�P���L�L�*�a[�b;[���O�����E����,���Q��\������}���)��|�����"c���YS��BM���t�-i������������n��o���,�*
��b����m��f(��vu�{���,�ew��Sv����\����m��f�U�������V,,�;a��)j+�V�n�x
o�u�`�Ya�� ]�V�n����n��~����'���[!�N��N/��lK�-3-�����=�~��
e��
��Y%�����^ls�,���73�ixY�����
�b�o4P�
�rv`�;���>�VV������.�l�������x���6���b���;;K��r����5����:A�P����]�}��� �������W�f�E4_rt]����Ft�{#�>�1�������t���}�
N��vv��]J��2j[IM�|A�zH��R�(\���y�[������WM�����H��|�
Y�Rjx�X4��������'6+�N#�h����w���txu���[j)�f}D_[����f���7z���������-��p1��-��Yu5K?@���=��]�&=�f
��B�>�|B,��d����m��l.����;�i��
�4�����k���{���p���gw�����/v�I,��D���0��(���m+���P�q��E�7��,}���q��9�dGE7X#K:�@���������+7Xy�������`+�����]��+����N4[���o|3��h���H	���og���N�mS�0���ov�R�d����^��t��g_Xn�	
���J�������N�/N�9��I��!���p�"~���h��,��^&.��#rba��.=�#��|Tw�?mS��/^p9�>���i������?@�M���C ��
�Jb/X��^�(���
��XV�h����+���'vXV4=Z��7n���E[4����T�����]8r�m����
���&�a����Y��'�HO���������`[�����������bG�6�oh4�0��Y��F�6[NC�
�E�*�p.�V��6��T*~^G_��x��u����|����&�J�a8���T�wv��=
�c/�+
�V�A�>��>�YI�t��w��+���4� Kz%�%}��l�0��H�����`�h�tw3��*?O]u�w���Q��B�SO��������q|3����;j9m������9�E?0j^��v��%��[
�l+���V�OEd{�fm�py:u�=�}�Y��2���TT^�p�6��Y�����X��]�Dg��ia����
SzS2�
��8�N
�
w�m��7\��K�Zs �	��x�R�<owT�k,X�����u��a���0,X��+t���%�N��a|��^Tl6/���/���E������h�����,���oX�*7,I���	6������Z�yS,|^G�6!�^9f��f�q��]Z���W�	������
���L�V�o�������r�R�am���-A�����{��q[�,���p��8�aZ(�5@_K��p�����8)����\����
�<������+�]}�rD�V�6�o�E�����C��-\��
�PO������`�������9��	�+�:�7<�+�������?�5���j��������N�y�1����F<��Zf��;�~���$��i��3��$��h���.&�w��p{p�E�:�f�_���U$��7D}g�Ix�����>�W(����N�����i[������������t^W���n���Bk���o��M���D���nw~m��O�;{�j`��V��gt����=K0�]D��S�����9(bz��@l��;u��:�p���
��D��fL��U�>������:��3���fg�7�i��M7��6��%���n���Y�M�����I�-X4~O����4��6;�D�^W�����-������P�3��O��H�1�)�����2t���J9��9�BBk���m������w�����I1��h����Q�x5�O��t����s�Q9�Q���� 9�a�)������q:�c������l�k��{����	m���(-��2�2;`@c������y�M���v���%�?���v�����ix�!I�/M��J��SW����d�p�(Yre	�{�Un�t#"�E'AI\*s��'�N4
�Tm�+���_�P8����v��A��6�`.��d6B���s_�>�B����N��pU~�f�����6��+�9=��Td�4��<����U��0C��~�����]�z�p�,3�4��u�~F���yzH�����<��#�������^��uDsR����v��mn������P��o������i�M�M��l��>t�;�@E��4��4��L���O����h�B�p�4;^d�]\d��~w������fd���K����:�8=��	�����.Z�p�;�C�`;��V�!OH�kz�,d�����y��?����~�p�Y_�n6_#Y`�;X~����<t8���y�`Q����|<neC��������{5Z��a�JW��.��l��������h�!"��c��~Ts�{�����>p���["{0:���"��Yv������1r)��9b��+o��[8Q�����d��d������JW��_r����?�������+�e8�?�z�_���� ��u�W�A3%��	���,�(\m��\�FNp�(�#�G��v�?�On�������0��.�-�t��Q�s[���a"�JE��P��������H�P�����4������N#!�Yv�����m#�?��6�nh2;+A�p��a��p�)73<��v�����2�6y���Zf��@�_�����"#�iz0(����O]ulwe*���~��p�2�6U��eH����@/��*Y��8V��/�(��c����4��Y���2��\�.)�)'x!]t�Un>e�U�������3;u�gx �l�?
��X�7/^�1/^�+V��+�t�_���%�?�����@S�pG]p�0�7��w6_���-����.�����>���X����{8
��=�94���l^����h�iX���1��KA&�m��>��V��8I��JU-Wj[��=xj/�#SY�a~N��D��1�"��S
]]�����4=���]�������)t"�l� r��vU��M��R�w�z����$�p����C���r�S�A�tZ���c �&�u��g���'A��)7s!�@��!�,�<5�0��M_�����o�>0�6�����qLAMg���CNz��/���U�r�#~���.c�,-[�����g��9j�}$
��k�;��.�6[:�
o���J��i"��ivk��Ogo�9eV=q��?
�#M�&��u�,���S���1i�����0�*��-�?�C>XV-1:�}Y����'��l%J��Ra�d�[Z�f��w6��~zL��p�)<�z�����S:������~��������'�U�"������O\�l�m0O�%���J]�4�U�g����"�*L��]���'�]@���Zg����|��i�.�l�*]K�47�~U�+��eA��G��u�f{�����<���\��db+���������~X�����[�nv:G,�;q����v�����l7��w���	@�*�]��_���4��]�'�^N��LY��fH�K �-�--(���O��J��2|���
_l���/	\��-�;[�W�����Z^���V,[z���
lo���l>�^�1�9�1�Os�G�i���gA�$���v�}N������,s�����f������X�Ztg���Xh���^�����q�nlN�U�F]�_,Q�K?}Y��z�����Bq�e!������b3�Q�jY�~�S��i�)~
�kuzLGAl�U��_)���,�~����l+8Z.[�/vrI�dF7�ytO]uWA_lOR,�`s���Hl����!����L�����.������w��F���h�,�����G�����B��e����oM��7�s�������b�y�4���X��h�N�{�ba�G�PtY����������������:e�.����&{�itZ��X���f����CW����\(�<��W��v��
������^�T����T8���Sk�4�
'h��78��;�"vNz]��_L�':����4ev����'^��+��H�[���Y��a���N'��?d���q���\p�A�|-K����U!�>0!�P�~�������`eA��o$������i�f��������Z�����'���z{!N��8�`A��H�P+.��
�u
L�u�tT�|5���n�7��w�������/�nb�l�F��Xs-.+)���-���`�G�O�^����	�D�L�������8bK��U������l���5�����`9Aov��s]�����sQ��������@���9
r�0O�I����>�p{"�|	��1������z���b�d.�/���o9����B��e|���
��b��1�x�{6\	�������I��u���a�,k>,Hs3���G���B��/=��s�X���I����m���'���������������JE���}y�������'M���e��w��S�t��&���~^�m��i��7_Z��SxL��/��
��$f/\StY�~����s���p��?�c/�����h�������=���������
���r�`Ge��������}�H �YL,�^���M��%b���Y�0�%����v��i���P�X�5@p�t��9��������1x���h�L�[�/��U:�����F��sy�.h�.K�/���\�9K�����S��t�+
��G���b�|��}`�L�n&��t�ZH�N�����f5��1<����9�`�,��I,|w#��jN���
~��21�k,\UKEO_��R�y!Gl��{�������n*����L=&�~�$�����
^�������3���-���[x`���2���������x���Vba��\o� ~gs��ix���&ve�t'm�����-�`W��dg��7y��~F���gw�h,���1#�7'�n�����L<,����	����A�>cK�.
S�����l��,����:F��hi�ama�.��p�l�����`	���p�j=���u��
N�|X���73��E����_Y��S����]|�qv��W<1L�[:6miV�|lN'*�Y�^0�Ln�K�`������`y�Sv]����@4����^q��B2�
R���6�_pZtr��s������Z,�$���`�/4��~8���=&�M	��
�SW��Il�pRXNY�~��x��z��m�\g��)�xb�Y�WOY��\Q|�?����6t�\K�_�j:Z�+��� <�	Kd�ne�ce������v���s��������t~K�������?��7����������feV	l��W���l1&�)HX��
h�K z��n�p�@�5�~J���7���]l�!����-�=5��9���#5[�K���E�,M&v����-� ��~;�0�%�����SW����f�+��N�m7��Pa��[f��X��J��}�|W@c��M��[l����U����z���b�A���%�bs\y]O�l�C�d)]�0�-��)v�oC�y��4�EX�Tt���f}c�|�����,|��
CbS��i|��g��[�����vq��o����>.�nV�7�����e����|
�N���.����}!v�m��v��,K��m����"+���a�Ss�dOt���;���S��|��
FB�&������)�����?6�UB�H����lV�7�7�d�|S�G���I�����4D��/���	�W�]l�Rl������*=Y��������~x����?�rZ����8�i�E���>5�x���=`�,��G$R�4���z����l���-����������7�}g�������bG�=�m�
�ED�l�Y�N8�j�U��]�J�	>�>6w�;��-���)=|zLGO0	zU�$V�7�l�
.������������ul�o������Z�\h��r$3�����<�1pkA����eG��N
4���Mr�
�����X	�h��s����fcwc�r��hR�bE.f���]�����p�{���1���N@�������[����fk7�5��]��xV�_��[z�O�yVg���t!f�<�1y�h(�����?���v��>6o7f�
K�����>|&6O��!���������Ss�`�y[��*���?�K?���&��y^g�p�0�h^��z��7��
�I���������F������Z4����d�0j�*(D�M�y��cs�M��!��a+I9;$'v���4B�b`O�mo���l�6��g�V
�,o��8�|��;K��mL?�valeId�x��f�nW"p�������M��J��l��}�Mp�w���0�"Q�f3�ix���<6���_,,�zT��Y(��+9o�������Bl�q���_�`���9Je&E���Cs��7�=����D���CW�hh^v��4�?b?���vv����|�
���_���X��9�y�RK��I��o[;���4\6���Y,<���V�8l)��W$h:�����6�C1����?
�@��#����b���b�T�s�MPpy"�v�X��s@���S���$��o�G��MU�b� �����f��z�}�!�_!�e��
S*�`�D�F�����b�`WA�w��}3s��K����W�yf�n�4�4��HXF,�R�h=���c��6�#�8��I�a�<��Frj��<U�s�<hh�7�s��|GG��8=!O�L�#����X�tc�_	#m�'���m�
�d���,ba3B�.�|����&]d�����f%$�M	�������i��
�����$-�pa��F�������+��K�-�/��g~������V<��g�lF
�zx�m�������K�bX�-o0\#,�V��9���{�9�`}"���)������5����T&J]8a��s����i�n������=��aU��o[����8��IEw�EP��M_5fK�d�$�t���"��w��"9��iK�m��_��h�+����PT4��*��v�������xi��1�Bi����?���"N�!\�
+F�"T��.&�	w��]�8���fuD�G��v\��t�-���a��kG��.,u�����tL�r2�������
��a����p��m���L��m��G��0�&�1�B6o��C6��/�a�*%�6�����;�DK�� Fxl:~��S�b
P�-�rN�z�R��_t/���8�����j��N&�[^|�,^4[��ylI~X��<�w��k�U��m���;��}����]�?�3?Lc��Y�6�C)�*T\>�B?�-z�>X�u ����������m ba���1.���0r}��z���X���c�>����}z���~-U
]�k�)�0��h(j6[�}�)��)�z�]}g��TGA�EX4}�$Jf7f��<%��D�Xx��Xh&��r�������v�hV� �+v�����1 z�V4��~�"�b:4���cE���D�3y�:7�^%����
{"�������?�?�'�x�0�CVz+��:�+/����,���V�V~,,����7��yd� 1���'�'� ����p�w��x�����}�������%9EC��X�q
&r���������������M����|d���"'�z����T_u���n���`�S��i8��pAt������;[���\\������W�0_������������M;�8�=��F,<�Ll�[������	Kx1z�_����`f�Q�{Y�c�0��
��.���}L��tc����`fY+�Xx�������X~X�������+EY�a0++4}#�S	��g~��H��Bq�c_1<�\�H1�i8G1��C�f5Yb���b'���Y��<�?�i ������G5���t�������~;��;;�@��NZ{,h~�}Vt>�4��'&J~,J.��x�
�.�R�4O�p���r����N�
;RU��6=53���
�Z~p�]��(���O/opj:
�9�S����b;��	vV��+~`�V�P�$�$y,~����{��]��Xl���`�2���<��/���
�Y�����h�(i�pN�c��3v��K�Z��Ft�)�=��'XX����XL����wA�������f����O�;]�g+����[�%z��Aj�48���N�e,��������a�W��Y����y�f?t��g���NO�;�����_�-,��Z}`YP�|��k�~���)��V�>������0�X���o�x[�~G��[l���`[A��X�
��EW:c+O��a�/��jO����2���B������/�U��@���]=
�h�)OE7������I3�����V��xM�� h���q������������������b�N&?�b�%O�T�F������aNZ��H6�P&��z��c�
�[�p������;;a� �V��<��>�]/��)���d~g�����D��BE��
�c����t������3��N�W	����O�<="�0D0]����}��Wtc�'��p��c��KS-���:�:���N���TFuzD��`O4�6%�������vX�#�R�h�p��8�\�+��
�Y#�����?0�
�r����j�p�}�6���p�,<�K�bn7���zZ�����)�O�����H9�+�=K��t���s�,��a_�L����m������5\>�t�Oa�������+�H�>p�Z����=��������p��K|���)���<1�}������**'�&�eX("9,��H�Z�X����q�i����|u���d��vUR]6�>L�&z�$����p�-��ZNO�q���c%�M����:���5Aw����pSB^Xu��4e[i��=�PD:\X,/.���r����V�>����KR��Db���Pg-m.��8\��w�S~a���~����
�r��c��C^Q�W��p��c��{Q�Z�W��v#NW���)OE�H�.�z���?��_�Y�
���R��V��5���4D��Pxv��������nD�Y�1qJ��V�}���S�d;�b;���
[J��T�]�#v��P��M����TlO1��6�o}�D�?�l����,���0�
�u�����l����'�v��f�jc��?�����)�fg)�5����la���w�X��i��{�6���R?��9a;	��1�;�1�^��M,{��9��n��(����;{�<�XX��;.�S4{e��^l�P�d*�Wa/������C44Z������:nc�V�;�hO�9~bm�/��� �m6�f����^���Y:�DUM�{�,<��|N�J��N}�t[�hY������1�����.��/>���j~V)�sx�v�6&X�������Q6��~a�x���0/���`�,�B2���u_5�T5���G�x�]����0�P%�b��f�';�������X��X"V���1���r�K���W��@��?�t������RE��Q��0����k]r�=p`���EV�a�u��mlK�w\8O�Y9�`�Ft��������+YA�s����l#*!������N@����VW]�4���M?<���G|���n�a\p�hg ��i@li)f�nc&]�p�
t�B �&Kt��o�o��'�ak�
�;��0=,N_��D����f	oc^��V��/Q���>��B	\�8�1q�h�S,,|�X��Xx.��-^�,Jn�� �>�@�We���)�sz@�Y��h��xt�|��I�����]���������":����efW_tAG�lXn�[���3RSi?{��V\��f����8�r��/"+4,�[8��Y)�`�8�\�s�.��
��,@��/�1�pu�i����B3��Y��X��4��Z����]�9��8\�pc.�Io�.J��u�����fuwcr6�����p��``t��@�`7��(z�{������=.��������������?fBl>��;{���`s����Z���
��/�p�J,L�K�N���k
O�{����R|1���E�"��,���*o0tv�~g7�5�����]��7�����c>��4�����p�f����b��o����cr������:=[G^p����W(r��3h�t���Np�7�I+X������MM��'��I�D���F�	�`gA����o�/z���`���R�top�'�w����/��X%�`
`���
����'�����G��
�6
����f�P++]{����P��~����'���+��#r���!�k��j%+c�}c�"�.���?��v|�wv$���	9zb��f�=ga�&���������W���^�`o���e&���6���u���W��V�X�iX|S%X�������y������%�� 5��n�����������s�?�A���B��A/�u�
U,��}g���N������= ��s�����Nc� ��::�����A_���~0���p!�;.����o��n�q���q(�|��s��i8O���.z��O�39���5�T8��y�h��7�C���`iZn�7C��6�to0� �z�����,��w�|�����Ag=�w6�xO��In~]9��Y7�`��hL�������Mz��"��o�s/�9��h�4i�n����
���c��hKN��|g1{c&Q�vU;azTRw�xu�K�EpH����`J_���;]��W�9MC_����4;�lo����42����q�7�9�������n
O�6[Id�7��o\��y�-���u�~{�O�A\W����`aS}��UZ�
�#2
�U��g(��ax���[y���m\4-�[�4��M7y��N[�}���]8	���M52w��G�n�P���_��wtt���m��A)��-�6ww��fY;��e_��dF����F#��u�@�3��i&��kZN���R�'\4���]�+m�R4����3d����%�E��-��c
��
�@��k#v�y�����	�n�v����&s9
�<|21�a���PL�,C�+N��������K�f�%���I�����r*�VJ�N����8���l��� 5.�	��m����<�2�����N�5���tb�����<�3���
��`a�Xh>���>="�,� �b&*���+�����e�:����X�9��p����b'J�Z�D3�.�
�b�wv����ov���
~���ug���n�z����n�5�"�����4�����2J������m��Lg'z�h8��u/���GQl�5��p�P�S�~�^l{F��dp�v�g�^�3r������3�b��;���f�0b+�����H��U��Y���(-�Ow��~C�����������G����]�T��vwq�+Y@;���U���i�^i7�t�	��X4\G�*�(�vw�:
=gbo8���~�V,�Yk�;\�
;���~�V�����T���#�`wA%�m:��t,:K�N�yze�_��r�nn�Y�������<G����VfY���|z�w������w��+�"�.�v�vV�"z���i8�r�Y*� v�:A�����mZZJ��C�m�Y��f6u���E�.�t�R;"�N!(����f����b���.4�U��P4�B
����`kO�s$3���l^i�.��+��
����pa'�����=="�0I������+}d��7M������������f
�B;�s����nU*��Z
/5��BWO�v��=V�C�S�u���0����o��3�Gduh���6��B�o�����b�7���-tuv[8;�p���I�yB8]�#��!����`�#z����p��K.��w[8��G�c�?�g�R11�h�� �W�+-���D]t���m����K��9���A]�G��l�3e�OO�!��0[,�M�]��O�z������OO�Q���X�����<�j�i��Y�[�����
�!}{���|��R�c�'Tz��;:��>��o��R�a�eg�u���*1%���
�r�bJ��*(��,���|\4,��F�:g�LW��+LG@p���R������n�ag�C�N�`q�6vF� ����`�GW]�v;s��m����cb;#�]�;�t�����P��/m�7������������G�����������������U���v&v�s����V�kv�bt�'���F������'6`t�q�h���OO�;��jW�OW5����V�-�j�0(��Ao�
vT�V&vX;�E� ��5+"ej����-v����������E���M��+X������`o��[Ih��!�+t>c�;�K"O��(���^�H�bJ��G�?�3����
5%��I��tGb�K{z���`�/�%&sO�w����
B�8%��pvX4��H�	����1��"���q�=�5����=�����~+���xv���������t�V�~��-�/Ranw��
�|)I��!��i!�����#��4��}.���/��������.�V�Y�l�u�2��2���T�N��o�����z���d����+����lZ��a��;O�����b�D_��qK1�79h���P��`<�C��hX�.)&,9��`�T�*�<="O�PS�����/2,��u��7�k�lIm������Gt���t��nX�9����49�	�K}|�����6�����5�q��da�����^��'��Vy�RG�k��f���Q�=���,[�ea�/����V�������8\�?����b+)�a��`�S�[�����7��;�����A�|����)o|�"�?�*����*�M�~�E��G����b�/Tr�B���\v�"��%���X<]�>��}��&X��_|����o��M����u��*�L���Y��6C����1��H��aL,<����|33O�����b\��;���O�
��ccz��mMoS����@��@���������v���~���6�^�QD,�1zU>Zv��<MW����jM����v������x�QG��bWA�3�-�Y�[�w��S���7�:;�_����0��hxX�X�"������s�����F��v�����g�C�t�Z���lu�
�����V��\���.��#rE�$9�����������>1�������'��.��3M���^J�`�b���b�������a!�`������b/��%vW6�,���}��FV[�[������U��6�V (zN�N�b	v3O��V�H�<Xe�hX��al,��4.��6�aO���5S���L
�����s��������y;�&������M��Q����F�.8������S
a����j��p������>�.��&}y��n���+���.�t�TY����*c���Z|��#����;���^0���M����Yz�� ��I�����W������w�v�����S��i4GO
���[�<r��b4G"�^�=�U'zv�6��
�'�o�>�B����E�#��.�����e���%�.=U�05(�4\%H�Q���;f��b�[tz����X������JPj�t��.h�ym�)�f�i
�*fm�����������[���z�o8qGn��Y�=�J[����Z�M���/X�,�M2
SIb+�F+��AWtE�0��0�#/5���
��
��,L��:��O�9��A���N�Y��'�4n�9z��a��e;aJ/�Q�A:�an��Ri�\�t���%of������M��}��.��c6N��H����WNkX����o�6+���K=�prKO�C�c�D���i8��0S>��a/O�
��e�i��vX�����az�����F�����/�=gW%���;�N��;;�
��4��5����F����E���9��[��{�?�O&3Ko3
�
��a�7<�Ut>{�4��X�tO��p'`�Y4���FMR��EQ�-e[�������6���m�4��	X��+�42|���e��Y�
�W��JJ#�����_���U�'�8�Y�DW:�,�p!�
�q�B��X������R�[i��s|�����P��6��+�9���{&�Y�g�c}�K�2���g�8mW�8���$�����
c��vzD�`�T�0X�����N���w���Z|�[^jD@t��pF��u���afE��JA���>��C���+��Vx���O9
�pV�a'�J�n����z�a��;�J�f�`fD����4��9��Mw���f�9]5�u[8.r�-�z�8\Ls0�������	uD���"������a"m�07[���<��Y4�����U���`�B����ipu�]�o�k.:�N�y~�U����k������%>@vX������
�!����-��r$�$���J-���<]�C��6]�t8��H�Yq��:l~�S<c6K���|�k�!�����g�������G=V��/�
I,
7L$�.�5,��4������i�5��}�,���vY�n�s�Y�����pz��/����iS�4���P8!���i�5<<Ft>��4\�p�)�>f�����`�����;��@OO�����h8k��g@����Jlci?�B�hZ�=��'�����H~>�eZ�
����t��.
E���w���J���Q�,3-��L$k������O����wg��v�����bsZK=a#�4K��XRln"<��c ��*z��*���@�P��k.��4���,�$����eKb���b�Y�~Z?���z�2x��,$��+u�����/��l�D��q4ne�c1�dd���aj��m�
5��'k0��}����i��d��a�G��i��c�����9�E/�� v�{�>�	�E��3���v#����iMl>#���,��>�o���"�Yx^���*p�M�^������"n�K�]���iO���}���O���4���sP���a���j�����M����Ew8������K��^����M����EN���O��
�@�k�t���Y�iLV�{��O�=����p��Nf�M�bY�����?aUl+�1m����y�|���S��X�X�y*�r(���6��q�'

�#����?]�'f�%
:�����-�iE�d�f�Y�����5l��1my�p����--
OW������z���dE������u��<�6
��iQ��y��{%�o�)n������0��4�N��y��Dw�2��_s�0x�����#�������3���k�#a"��f��Cq��^�q�]���fVs*1*v����e>�ig*G��i��d�U����i�*<�nZ�
�Q����m� ��Sh�
��b�k��!������NQ�"D)\���S�t��EX�h�[V�$���nfw�����k��d����)Wb��1�����\	��FN�0Z�n-�����Tnx���Ou��Ku������^�����R�H� �VF����Z���Qb�4[�_�U)���t�����L-�}�����8\���;
���R
;����������Ps����o�%��>g���%XX1��U)��At�y=h��
��>����m:��$�'AN�Ki!R�0�*qi����	���d=�bi��T�i�<��c��}��`(K�YxL�X��[�������
E�biI�����C��~+y#�G�	����Tl��������<����*��a�Pq�S��
V�����c�zOW��z��r���-Sa�ll��J}���NX(6���b/XN�q���:L�a��J4tq���}��V8Ux���{�?�(�� ?l�����	�DA���y�Q\`L�_�V����0��!�yY�:�f���0�����xq����������q����	wND�����S��B�iS�d�V�y�<
��YOE�P�!u)����+�`kZ�^�������pV�N8�K?
��`����R�J��7LXK����M���	9�`�T�+U��sL@�	+��=o{	�Y��4+NO�a�T���J�u���VE7X����"�;;*����NX�
�^�nX�gU+���szD��a&h����vz��
Cle�v�	��a}�z=�;{AEC�t�PF�Tpz�c��d������:a�>�V����u2���Y����u����o8Y�����`i
G����[	,�y�0��o������t��'�oU4���\��x��=������<��o?��O�;*�"���n������E42\b���w�yW����J�����9�XN��`vbJ�
�&�wB�����Xt�E�"�����4�P!�&��V��r��2d�+������eiV��/���v��i�@�YY�Y���-��/�t�0����p��C/��E�b�6�Xxf�������S1���6?^��}�_uN��Dl>��;[9x������v���znx8��M�����Z�.���	��/��p(~=R&�4��p���:�����Il.�:�����	WE_�#�����OEgq�w����fQ�X�����M����t^�t��V��K����%�;K<��{��K�,I_�>� f�B�j�buQ�+n�6OX�,��n{�aNM��%}�������W�/�q.8��f��bsj�t��^��.h�;X�G,
���a���7���\��s��������Qs������f�P�|��f5N�fV�&�r���t�
m��%�������x�V:=!G"lC[��k���=�i�qa��*4l/�Z������G�p������������#>�I	�NK��p���fKtNm��s��z6Dg��wv��d_u��bY��� It.�;
���N�{���0�{�G��9{%����Z1���Y�XXH��������q�����L�i�T#��Fz�B����v�T��z��wv����&;��e�2��WY��.��
O��X���euH�Yz������s_���g;+?�X�����b��b������^�[�����f�!�&?�Fa�^���e���_�6��>�� ��cj�7{��	9Ne�b��p ���8W|n�d���p����x�?����[,,����YQ-�Q�-�S%>�������QL�
������W]�17GO�fW4<��#��H��xW�U=-�3�N}s��L��c�[�t{��X�M4L�6U��q/�y�n������S����i�.���70�I���9����A�b/���<O���u�-lL	{=����n��b�K�U[�P�P�/����`��������~�<v����a]O����i9}�MG@0��N��p�&��Xt�B~g{���es�bz�47,<\���	(�fd[����z��1B4<��#�����t�c�zO4-[v�����:��_�'��D��5�����6N��|��-���'���-��d��
�r$��mz�D��]�e�&*��+
]r%�lQ�b�f�w�8�����X>��6o&����
�5��1��K�@0�%a2,���0���vH���{�o�����[�~�-�mp�0�ph��1y�LN�P""v��H���[��)]���F�c�,3
�*���]�4/{��*e,|���]�_/��LqH�\i"��x1{���[0*,�k��*��6��3�>w���N�yff�����a�w��t*��`��,�i��4��H�a
����?fXg*��mi����R���R�j;-~Uc�&pm������R�|�M�70�t�;���o�����t"��Zy��"aE�����>X��q��=�Ui��x��f���t�s3L�����K���+��wr��t��0�
S/�����E���|Egq�i8O���+�ZfVU.�������M��)YF������N�K����vZxD�hx��Q�@�&v����:YXX�����X���k�i+XO��6�aAfa�l���`i�{�b������`BKV\X����u,t
z�~�`/fT��p��3����N���3�������\c��O��L�x�����a��jy���G����g�����>���|�'b��N,L�i�Z6�:���VQFs��.j��m�
��{W��,^��?�
kP%�k�`�>��6�2��h��VKz��+u�/:[[{�YxV���FT�����m��7���E�����Ew�[����n�B!z�����n��
��m;-F�a���O�m�o��w�p�43���~K���F�]������f����#��,�L�&��_"�W}_�oK�������>"��������&f�!n���1]4�������R�/�E"ncsb����)(9���m�K���
��oV�'�.��nK�7+m}������C�p�k.,l��7���fI$����(}B!�)�y�}����5p�pi[�O}���j�8��dx��hx|�Xh���%���������s��k`��X�l�U��K��t@�G�X�Y�E��uTN�d�X:Y�Y]��������{3O�����a�|��MY�7������m�4t�����#����_�����d�0� �!����Y��X�Q�c�=���a��A���u�nV�,6�	NO��I����b'���L�V6B�}��U{��^��p��X��������K��9�t�`�mo�����;�Y-\v+��><��YM��F�"1r%�`����4��h6MA�K������o���_,k(7��5g����:�`&:��������K���6zE�#*N�y�d^[������N\��������-l�Z����4L��-x�����z�7�#4r�?��k��6���qS����:���|��g;�zMz��Q&n;��}z�����z��R,~��R�k������������E������=0���P�xuDFa��.y���h���.�r�S��:�K�0J��0�[�O�09�aN�c�xuT�ZK�\�;��a�6��+hZ�l�oB$�`�U�V6)-L�p��+r-��K��<��C\�
����J�-L���D�c��eMR��.�!���`�C������L0������q���K�)�:]�c ��t6���x3�h��t}��Y�|a���-x�m��D�
��7Vd%�j�0���������3�
�!V#������(����p�ha2����]�%?��#���
�����O��p�������-6��N��0n�M^��X���p��c�l��?=]G^��[�e�xgq�������Eg}�wv�����>^�����*�����ea��S�*��<�L�"�n��[���Ku�3
Ag��w�������
��R��P�#/�2k��*��6of<}���P>���u�M@0�(�0���<.��Z�a{����������E&���{N��o��
��R��qfG5cp�o}.h��?���������������(,��[=LW3�a�4X:EK[\8�i�[;�E���m�[L����p�����%�^��S������x�M��G����K�%���{.A|�����#b{A���������E}0��r|���y��6��_D� Xl�G���
[�-y�M��
��	S����6c_~�U
Ty�P��E�t��<�#ar�y���|������L��J��>��Ku@�v��'|g/X��q��Ow�!V�3�~�������&f�MFSI����Z4���-]i;�[�~�\������"�-��Co�S���Ka�������as��e����$��2�>�
�g����d���
,������OO�lE
K��)|:]�C �O*����j�����c:#�0�,���Zt�+�\X.Zi��b'�|d�w��B�f�6hS�*�.|1����g-z���`���;;��G�VJ�-���R#��������Kq�8�n��p�/���@��t�������Y�0
��x��9,�6�K���
-������X	����R��G�A/%i�QE���C^i!��=��r�UKA����w��������n��\��!�h�Ze����m��]��U�?��"Q���{n��x82�.Lw������l�����|�wv�B�?�b�]��rz���������g��26�P�Y6����S��������AC�H���[�����������DG<��7��v�#��O��|�pRXo����@���i��6��iv�~������26=Q������f�w9~B�V�
���FFuf�z��D{�fsi���:^D1���
���U2�^�M��Y�������������L�S����w6��N��HY�M������k���`ha�5�kF�>�h&C���k����p���������?�Q*t0������� ���$�iV�av���X����}U�����x���>��|D��K����0�l���N�qi6��N���m�����F,j�5;��d��d� ����k��a�E,*�0��B��MMp���(���Gc4����zc67c���(8�]�A*�5���,\��*����9��������6��\w�}2>��m��m����8�BB�?�~����p��(�x��ZJ2md��o3J������_�Dc:�	s�A�iE����l�������n)�8�BM��s?�w��nf�t������"�p�T�}w�����?6�����'�>�����m������l�p�����*�0;�V���aX�sf7�����
�o�n0�����xs��n��"\R�`�������03��H��Cs�����;����sRT^�O������&�C����>�6I,��5�a�J]Ss����o�Xbv��Y���q���F��^��E�-��p�7���/r�J��5�fw��=�������`��~���EX�4��z��W���B������#M��e��!�8�B:�V���Yv�Y�l��V^v�{�p&h�6�����kz�;��jEO�M7��p]%m8��
�4���Q����p��<��;��
v�
���v�]0k!����`�K�o�$��V&����zA�	�y���H��w��r����t�GN�9��I��s��;K��������l�8��E]i+���L[���\���'�Q�|�'�������^)�;]��f���\����L{n��a(,kO5���T����G4<�"����-�q�3�3;,�
z���t�?��v���+�������[Hy�3;,�
��q�XX�l/���(`��h�{�����zf�5HA�3tO�y��i�������0	��r���o8*��r����,|�[���M�d���P���cW������Y
�1t��E7����
��p/�h����a���	�p4�kA�����Z�l���Y��Vi��HC?}�����}�j�`;���V Y�
�m&���C&6�����e�M�N'�p��3�\�zz����fv��$�p���`���������=%���8x�o�2�8h�e��p����D����d���]r*^:=]�|�K$����k���G��n��"�3�v���=q��<u��f�Q�a� Xv��Y*�aNn���u|w�DWj��L�7��:�ll9]��L��Z/�	v��������=��^�W�W�H��k.�S�p���2^�;k�9|��h*9�li+~9��!I����;���}�7�V�5�J4��+����&����=%[N�9��UK��n�`�qWM'������J��r����g��P�Q�~$]5�������FX������^�j��'/|�����>8�H�WGb��E�u�L��>��N���*�L����-G���P���� ������>�7��h�!����������?����v����^�f��
�W�m�CkX�-V������.,
Ho4,�0��w�6i;H����m�����PBz(�5���T�uz���n�V_d���(&��4�O&v��.�������C\����*�J����^�T4g��>K�leu�f�>A��������b���y����]�?�v�=j�������{h��.ta^��_L�/���.��/6���N^����n�Z���B��e���*L�mG������?���~B(�XK�������/>nD�Y���A?'��c{b5y�u��RCt>��;�|?�m^��C;���q�������G~~g������t����KtgU�baE����I��5��9�a]��N�f��b�^����Z�l���������2�������������P�M�K��l�������u�D�L�1��}�o��
�E�+��N��.#YRlc9/��Wv�K^,�,���e�t������t���D����e=<�H���i������R�R	����Y�~���hV�.t���X�����`[A�q��~1���^h���H����oV`/v�Y$�J��e5�sq��1�}�o��K���6_Ew�
�1
�Xh 0����#��C��7}icd8�;X��X�g[yP0�h��+��Vi����Jxx��hV"t���|�0
�qO�&���4�����p��`�\Fx�/l�$��]F��/f�}��t��P�~��~�]����\bw�nvY�~1I���"�k:�t���/:�FN�9�a�\�'�vJ����h��@;R?�oAwY8~�bs�yG�4���P9te8O�p�����3,\����NV6��-X.��/�����U}{�Ba�e�����D�0�����0l�V:=!O��}z��P#�j�QasP���E��q�e}�b��
v��X��J�����������e���
D�L�P������9���?�x��*N�9����ZWf ���F�g��R��t��E`����*�\����Z�X��h�xwM��v/;�3�q�X��/������g�<�#��pR(��];�����b��y��lE�~�M�2;o�����0�vV��m��GL���eK��,��'Ls{�5P��R�m;�K9E��HA�~�������`W�qO���,�
z�/m�pu�q+s��&��`�������������,��%u��z���F�dp,���{g94�czd��;���Rj(�=`� X�C�U���`s���9����Pn�	
��W3�	W����O����OF���CGs�i+6�Y�}�j��W�����V�K�
����v�t���`����p�8�FS�R�"0��������X*lE{t��
O�
�@������Q��Wg�74i��G.��� �7�+4.,�
�N3���:��U8Ao8Y����l��`1�hXu&�wAw��}� �	8���|�m����l�k��]���[,�p������M��pzU�&k��X�o��}gsu��R�V�����s����9y/�X�=Q}L�-r��!6D�G�Y�_@>lX�5u�*g+�@b_�]`���et�Ja�������A���`og��U�qI��/z����&X���0.L�j�T^zz����pQ�������D�BF���������`��Pl�y��6�0���W�.��	:�����dl.o?��M���������������d�pI4�8Y�`-\��L�H	�v���]�����p���s���N��OF�z>�4_�,4�3�[�����u���/:gc
l������[[��`�n�Fv����<��o��
i+������������������X*.F������D�����_����pz�F`u����������f������a,P�UW���t�����`�rRlE�`�7��ne����
?��\
�Y��`3�Ng���J���m���*OD76���I���^�T�dDO�&�]�6#l����w��*�~�����hx���aU�b�rI,�X�nN�����5��^��,����G8|gGa����fn��^bo���U�����{���8=����&����w�K4|������X�����Ob[�����f���%w���1��&�������EWV����7��f�~F��7�������Y�(��4�l���f�(����bYLh�tx[-��R�8�[��.c��������E��S� �R^:~��[�|�����y���f��l�g+��r_�G�������?/Y+/�#������4��	��!�V{d��$��]-��M�����Y�Et�����8;��%���o�w�F����c�6�0�������������_l�T����f�����l�t��`�8D4���Y���J�o��a��4\{�e?�@���t��_��<�����B��m�1|�[�+�y.�o�y
a���7���\�$bo�����qK_ ���z,�f�fajK��BW�m��������#��u�"���2j�������u(���������v�K��fv��:�;�����k,M��-8/nK���O�aV�$��?Q�����G�|gW�z���Ef��}��Y�(!�Q���z����N�ACG�X��\y\�Cz^w�N��1.����;���/�B6�����.��73�w��k���Z�
[�D�ca�����r<p6��O���1�B���Rg����2mx8�h��l��,���t�I?����*���i}����Nk�����lA,���:�5�7,�
7�?�^�����Z�_����pz���_�����hX�����t���`�^����<���}�7�a���RV��pnh�����[��������+�Ex��C`�q���������R���;�e-Xb[A�{[;~��~��x��l����f��w��M��#r�H��p_��f�:]�C>�J�`�.�:����[���J�k�{>6��pA�JPb���4��i�P,\�����5�On�#���������E�}��9;��/X���gU�B����amI��S��}��i�47��!���+���o��)z���`i�W��<��J��U�t�5�\�u��"�����,l����v�+&6����8���n�C?�����^��t�	�-}ay�Xx���]I�[���dc����
��j'=�>�������Q+��v���0*�U8`��U��a{���C�~g�]�hu������VV�6���������d�/��# ��=`p,-[8]��S����{����N�fNE�_���+��(�l-\s����"��M�G�N�BE�M�7L��H_I��*�������#���7�&�

�yf���0t	���-�|P��6���y����V6b�I���X4�D	������)X������wv����_~v�l�n9�aRD���<b������p����K�@��I,<���L���z�7��t=��T��T��
�1+�o���%=�i8G��+������
�`�H)�J]s��~�����+��pCL,�vBcG�9~;<^;�oX� ?;�)
v��/�J����7�D��p?�Jy>�J���m:����D��������t�5a�P�u�!�y%�kc��������U�������p��#vVz�m���$�7�m
������c)=.��x+<8=^�1���Kp�Z������:����Q#�!v��U�Y��q8�7�"���`�J��5�7L�li��_D��Jn����i�Ew�)�W�/c��

SA�3M����`KM�V������0L����DXY~���a�f�P�-�8�����6�@�D�n�n��qv���`[�T���s�������<~�\U����f��w�jct��cMo[�of-�*
S[�i�to�����c8<z^4���cx>���p�bg��b�;X�������C�����g�=?8�}���S,l��3�������G�Sa���Pc��L��v�
��R�t��:���F����i���P@ �����> ���Kl����
�a�����G,\-�],c)Fb�������x����2������w��9�b����Bw�c������N����K����
��K�ta�������R�Nx�6��j\�;�^�5�cC��6/E/��;��.�|B��6=���^�0F�Z��R�-���G�`��E���c�������0Slg��bG�N�n�3,+�1
c�`7\��e�<���U<���;��q��Y!�Y:	���^0/#xJ����$#�������G�P�,6�N����/V%:[>O�9�bn�
���������b}���K�f[Cb��;{������E���� 	���O���R�W�����6x�y;
� ���DC�����@b��7�^�G�����9{��i���Y�pzD�`�^4L@{1�XVOo�"�v�����s����u$�X��X���-�_��������l�X�f��f�������k������{�cb����+=�m�\[])
~l�~�]Zt>�4��	V~(�1'���� �����AC?��\\������-�����b/V3+�4��M�35�n0W*�>"~��Xx��Ve�����1K��b�����ziZ� �����%j:��r��$Y/��3��-��(\Q��?�`g�������e���E��B_��O�V#�
.J�]�n 6�(r�M�1p/nS��<.|����Lb��Q��%��jM���j��p�
�[��0�6�;uz�5��T4�z����u�0��):�f����:��I��C����t�t�RaaX�x��@�9s<n���\��9����H#��w7�-y~�
G�g���j
c?k���b����b�����f�7�������Bl6�v�������#vxyd�U ��2�"����u�����0�����-�h�G���iD�'h%!i��kd[N
^��z�baY��t-S3��t��A����j���u�E����n�6���n���6#�J���p���X44���U(�������P;(z�b���o{��=
�m0	����������{e�f���6�0�����C!A!z�8���q���,��C�;�����F�n�-��������v��i8���#������wt�)�t���a
��
�u�o���
����*"�[iJ�1�a�d�3e=O�9�����7���-mfX���M����:S)��J�z��
)x�1rA��X���|����X����y�;�+w���p�����`���J&�>��%��E����d�X�H��������������#c��[9������Ou]�K��1X~�9wz@��a.L�a���7��w
5=na�h��3A���X��TB�0�Y��s���
�����a�Q	��}���|���c������������
[���p�q���t����Ia/5R�q(��6jO���f$�*6��Y`���T�R�a,~�I#�'�`+��=�����:5go(���0�
v���z�
LK�&��8���CN����9I��:�/l9X�K�
�*|+�y���E���?����Y��0������R��,������#rD������VTPHX����>'�Ke8���h!���ql�B
z�4l�6���'v��5
�����I��}`]�h��[y�<EBF��k���u�TO�0�*�
����iLD�Uh����.��L�/�X��%6w���mS�]�Ep�^6�E>���D�.��7�Z���&W�=��NW�|�p�����f���R�/M��kU�X�������n���%��;�x��2f��������r�q8����f������a�/E����pD���/��m��7��O�h���/
�fYkc�{���b�B����v��A�`��l���5���Gb�����t��EX�hxb�Xh'�Ur>�B����;�d;Y��Xx��X�Q3ZHS5�t����p?�.��p����V4�;��``�q�z��(\rJ ����'�1#z� <�����-�_������|�������N����|�U<���6�y_��+�;�����W~X�6��t��>6�9������]l�E*\s�+9<"�x�Z7���bs��������O#p�H��������3���s��J�WR	67��OH?
�(�c��=�.���p�qY�����x�2[�������'��a[��	g��-�V������A�f���P~���m��E����<2��F�+0[��n67�V���������:�b:]�3U���`���}���,FP�v�a�N��������-�Y��7�i�jz�/^�������1b+��t�6��:,��t<]�c��!:;�������Y�����5N��q�����S��z��w�bhVC����P���n�CI������m0C4L;����:T	�Bb�.5Q��#�n,��6��,M{[�-ov�6���YA�G�/Q��2#X����z�������,�|J��.���m�tab8X��
v��[s B������Z�y�����]s�����Z�UM��O��f�w�&��#r�L��We�f������V���@Kx��Q)x�����q8�4��v�}F��Ph"���M2����,j
���ES�|���h{miIQ�.�����/�o��)<9<";qi�p��/�O(�\p�K�m��A4��������4�l�m��b3m�y��i�B�7L ���(����+��p���+D��Y��U�b�i�LtBO�9|�q�����l�e�����_�N���!��cv�������� |B1.}�"�Up����xz����\�t*>
�(�%�����~+�K� �1A����r��:�x$y�u����W��<��sE��J��z�SV���K�}06W��W�i���9=!O���Yt�K>q�]>��*|�,���g��r��Ehba1���iW�V��8��{,6�0+v����9P�'��������4�C f�}�?�����~MfMZ�l�m0�t��k���x��l^���C/��8~���������6m�m��4��"��m0:�?��[���n�E4����E���}�R6Bl-�I���E���g�����m:�c
>�2?�����=��C>X&Y2,���N�������fx���.�����S� �1��l��������j/O���
��A����p����Q4<����|����W7��xT*=��+��C�����\�VB��i�t�8�H>kA���.��t�����O%X��
v�Z�`{��ear�I/���3X���^�O�q+���<78�]����`�L�c�3,��������������B�aFQWM?���oX��W���C78
+�����O(XX�7W�����t*�P>k��o&���:��M�AS�����8S����U��>�����%�vR7������������a��
G;5+�����������4&%5��l5�����e����	F�A�:�`WAg���n0��Wv���n��a74�Ev^�/�u�t��'��w�@����	V�o�/5
�a�w���7��k����zj���AS�X�;�e���4<��,��o�`��(����v�;x��������	b�N�,��}�Q�u:�D_�3&���9�|�����~,����,+O=Hb'�{�����p�'ze����v5E���Q��;����5��Y���6�w6[����4��p�UUb���lZ���r�.��3��Alv��.�ED,/":��}gW�]�.u�R�,�qn_��?����b������������O�9���V������_rND���C/&;]8wK�ai��^P{t��;kD
(=2�O�����0�����N	����4��u8[^R
��f+p����Xx��������0��J�e����z����]�NTl���n�7��E�
�������3��bZ�Y��h(���Gv{�;+�2
Bb-��>�W���6�������/�\��b�n�5<KX�����z��~g����������u��@AO�D �������F-,vm��0�	�N�������Z4�X�
���&m���G����;��G�W�x9lc�Z���K��!���Z�&���'�i�.���m��0�tE��m��L�%:/�����{�m��0At>��4��ufx�����5����r�M����P�`�#boY�	;Yo��J�R�������e����Ag�i8��0L�/��F��A�;�O|��
;�;�,���6���]��U��e�b+�#�N��A���lg�abYy�o�I�c
��
��xR����ga��X�x"�J��9~bo�7kJ�c�_�]�.�����vZ��������d��b����[j��6\���o�F�y�`7�Gm*���\�;��'�d�r�R�������0_���t��H�Z������>n��Z#�V�l���.����u�bo���,��M��GE
������w�b��������J��fiZ*K3G�����j��Jc�tgbi��o��X�������p�4s.��N&c�`WJ\����'X��b]�,|���s~*���6<w��t>��4�C ����(�.��p���p�&��M==^�^��QZj����,����;a�G�����Ec�
1,|��(��
O�]8��[J���Jt>	�;K��}w�,��0F���Is��P`a�U�f��-�a�ww��4<4�,�a���s)���1������Lf+M�2���`+M�������w��/re�=!67�|go�x�p�q�p��M��;L��=�>��-%pzD����F}���_���"Fg*�?=!�LV.Z�������e}a�B�aYy�u�A�0��D�w��0�'��?u7��������_���42,����8�T�����^�o���
+���U~�?�������9h��f�6���
�
}���l�9�����.����|���}`�w��3x������O|���>��������B������Ao�\���M0��s������u�7�&������r��g�k/�����$`=��>X����v�^��p?����I�p�_��f����A�W�7�t���"���-�.��H�L�.:���Fs�w�D���u��o����u��bg����|�'�xO�Kk.d*O���9����,Kue~u��0��q+/�C6��*�{��l�,&�������39��-��G$7�tN��!�n�t�����z����i�|�#���.�a���q<����s(3�A���0�
�tK!h���2�����}[�������9��q����[��a5���0c.��d<��f��,�v�
"]uj�>��gX��t��<
��
��H�
#J��)][��^z�3%�N�y������p�/6���DN��	���QCS������.����L�-��J��`Fu����e��m>��c~��lF
�y�������m��M4w�fs����d��s�����#z���m>X'v%���R�/�<��g�_���%5lJ��f��[�ba����9t��<���4�{����-4t
+����h�� ��������L�@�9z�=X����5�\�E����u������p6%��=Y�#�6���������~��M����E�p������R��u����/b�p����H������Z���u�Z|E�������db+��a1�`bh������9|������M���%�"�AQ�������p�@��3�$������+_>�Op5t�����������q��\8qy��<X;���6��nVa`�u����a��`Vi��mJ���J���U?l��h�mbY)��Q�J�*=X��h��-6�����b�4���i����Vih������e�����]:`dm����X���qa:Sw�6|�����x����]
�,�0�zW��VC8mZ
]X�X�<X��h(��������[{p�'�N��a�y�d�B�f��`Vi���R�����G���9�V�d�&��L��G�P?
�X�u����zd��&�v�16l���������E����l�i{�t�
��Z��(���)6�HN�����Z����b�.�,�u���d���������?>��v��w�r����;�?��tEl�$�a6][�
M,�@�q���;�������:�b�2�ij&X(�1��5L����h�x��^5��9?�>�O�(�-T���=X{���:M#����p����o��`�q�� <v��w�8\�X����p�X=���i;�2����8Z������p�E�
*��/������8����Yz05�x7K��sL�JCE�3������o��&()�Z�R�6��}�_f��j�NF��R�i��!H�����Vl��V����Y���#�`�NVl��>=!O�0��u���42L�i�B����z�x2���:���8����Q��3��)p���y���M��0}.6���t������[�k��K_�(�*(����.mE���4��68[w�r8K�����S��l�XK=`:&h�=v��f��6pO���������6�[���R?1���F�rK��=�������]z�C���a�����zsx��s@���=�_���|���0�Y@<`%�i��[p%����#���0.M��a�����O�-���d���|a�L�P��k���@+�6����������b"8m�W^�~+�&�B kra��4��!:�n~���&�^��;���K�L?�1n��e�q>���pA�6�`w�6�����1�6_��kd��o0g�Dl�������R�a��`��7\��>w�+u��A_��b����YQ�~]9�|�3;`7N�7����0�l�N��)�~;&��������b+�&�b� �:s��wa�+<>Ot�|g�Ts�T�^l0
"�?^�l������t�8�\���l.�;]�g9��_��a���f��U�6
�Sik�|������t�|���|g�m^*���(�;
'�
P\�NU���<�����w�
�2��%������:]�':��t���-P�����F�?�`a���g<��2����<��;$1e���]Q��~��4��?�W�����yWa�����'��u������}�����`���t���a�b�*�$K7������`�6[8�dX3;�]F)���b���:��\A�.t	j+5�6�B��hZ`,�w�����h@�����u��A���IB����R�#��a*D(�K����"������u�I�����
b����$���.�]�� A���#�WW�b������O�q.z���,}D�[e�w�����#����K+��-���M����ty
��^lI.�p���}x2���B{��Ax2���;M�������|����}�b\�m!v����O�Zb����e)@��V�i�/���Tbg!�>����.I�L�a8�|'����YX d�&���A�}��4R���`�"��?����f���:$���~K~g�{���Z��m:&������Bl�"7����@@4�8
��}����Z���Qw���W��n�M;��.r",-6�~�T��Aq�l_�Y�Of'KR���I���h���I'��ReZA��e����D�Ne��Mhn�/[Yq��:Y9�h������K�2���]Y>��:�_�~�@���)�4A�n��}���{�
.�tr�
�|�0{#�l�v}Z�:Y��hx��X(���~����x=�Jd5�����a���F?
�j���I�0i[�K���Y_��U8�xZ�;�^�hX�,v2W�������U��f�<b+��>���WE�
"����MX
O�J\����L+qa+����f+��������El�2sZM����{~���&c���Nf�}���i8O�L�*:���aN_,\�up���B�b�+��I�
C�G�-����8�7,F[
cN����
:�������Y	��|*��9arY���T,<yJln%?���V	-��;�6�r6o�n���	C��/V�$�.(�����SEO�����N��8�}��fs,�l��;�gK�=������u����i
XS�Q!��"��DI�
�����N���t��E`������J���T}o��l��==]#0�t��|gW*8]����2M�^*�-l�Y�J7���_��?���@�;���/����j,����`��da\�W�f,��R����:bf��;�]�s�UGT��ZM�:0
,�~�jg{�{~Z;Y��h� #65��;��!v�M��/���0\�!n�����`K; ��N�����K7�4n!3l�-�C����#����R�����Z�����H�7S������Rz1��i�v
�������bs���;�!V���
�.���DC���w��N�S�����6%�C5[0�O�x'���p�"�.���`�T������������	�E���lA�2-�NI�}�����t��c`R'h������W�6�A����2�t'}�F�&��DcWaK�b�	��?�Q�
Sba����������u��������?���9)sJ�|zBSakN���+��u�����Vw���~J�^��k��d�a��+�4��E�����;���[��cLl^�.�a����0����^���El�	9z�?����1��/D�rn�q�����+�v>���B�ce���o���[��pv�:�~������9���l^���;��d����9
�Y���`�lw0|���� �f�:���mU��'���'`��Mi�W��-<��/t������[,\��A���z��`���a�bSb�t���`4��
tTz��Y��)�a?�F������I,,i��� ��V4OX~tN\��s��k��7Z��B��z�����/��JOVu�j�	�m�a]E�����^(����pK\z���D���	�Q��p�:��9s�K�L�,�Aa�4�0$���k���}zD	�� �R��U�n�}�X4�~���*<)�������'��'��lM��E�����A��`��o��),���	k��xI��F��k�E�G:_j�������MzR�:{�q}g7}�����][,�'�x�C
��?����.�����/K��
+������o�,^l�%:{�
l�N�,�]��C4L�����b�B]���w1���|��i�����*������]�[%z3��X�X�T#���Jj���x���2�X+���$=���m��*�
���s�����W4�E�[��;
�bs�|a��a`��������v�a8����X�-����n�m���Yv�6����(&�t����0.[����?�BG��<z�EV������,[N���'P�N�X�C��h��(�"�^��������������Vk_/&
���U*y\8%�e�bM����<��o�����X��7.g�R�� ���L�_h����,����e��b�u��ibw��<]��E�z�����6�=.��3�J�|����e���-�����l�^p�
���2�Y���+�)�n�!��}L�����<��a/�G���[Y8�����B�?�w{;��t��`�4�h�X�]���l�^�ocY�\�y9�	�[g��/������S_����m��0eK.��-[�\��Y��YVsm�U��m�����%��0�p�dT�Tk��F�����������L��	9�a�e�~��:�e�rn��8�Z�9�e��Ku���Lc2����We?���E_�h����v4/��':���7�G7�^��m:"`�d�0ohe9k��b�a������w1��h�|{������ktY��`�k��t_\,ku�5�X6�LH�nFo�r(�f5�����eaq�>�8����_`���]�
�[�@[��`(!Q2L��e�J���]l��5�?L�*����6�4.��E�`_C/Xg��l
o�\0[.��a;��VY�[���d����H���
`H*��5���qz����Y4<E�,LR[9�~����^f�7\�7���u��>����N���&L�J�W8n�j\:	�b��Z��k)������*�\�x�K�L?,�*��-�V
xb�>�X{���`+�}�;/X�/�2\ �`��X�F<o���#r�����i�s��p���ey1��h�=��[{�wv�_�9"�u�
�n�v�U�lY^�j�O���O�;]��'fh�����Ku(��
�soo���LmJ^��X�b�.�&��G4tb�9�iU���Y^0n��1���4�9*\r�
NO���!���}�,�����b��F3=}������u�#L���1�?���cC��;b24���0�:��7�;[-����'�gG�$�e��b�8����U�FA_��-���F�A���O�9a^��p����v��F����]]S�h�R[�p�&�Twg�5F,��[�D��w�=0yx��}���*�����%���S�stx��$��D�.�r�e_�`o�D�:�
~Obr.�X��F�R���|��V��p������:(�
�A����v��{����#
������!�t�P,}�g����������]l�a\�a�U����y��m�3��D������m����]��[��Q�����)��t�	u;�z��}G�w,��
��$�,<^�+>�|z�i8�m�5z�^s�m0��6-��1_��d�������KM�mL=,z���`\���z�9��������������_����9��C/fi6
�ex�y�`��)X�������C��0�K�P����,|�V��p�F	�����p�R/f�Mc�`/�I�
?��f�H�]I/[��`����l��>
]lOE���t��|���������.��rC�_����bs��t�Ra�$��F��m���u�F�Y�*���W�R<AG^�T\���Q\5T����L.���)f����w�N��0�Hi]�g=���]���k�~��LT�a����m?]��KEs�h���E�;����tzD��`M�O,L�����,���Mb���}�x���3[���r���L�.�������Eo�[�^ba���F���m�xz���M���7���y �w�kU����v3D�C����g��>"��*���G�k�������TD�b���+S��l�/z�-�0L���f$�'��Jfw8��K���~�p]$6�Y`S��9Ne�9�o8�^�&|���q�OR�B�����sD�-���
��p��k��M=��Cwz������������l_A,k$
k}����-��Y�Eg+�w��H;���Y^�N�5�b�?�U�;�gY;�t����K)]qN3���T�Do��*6w&��B�I(������4����	b���J���!b�x�Z��������$`	?���1,=	#M�e%y�I�����pYf��N���5��f25b���W+�������	����m���
L�{���Y�����tzL[�L�[4����������;�
�����~�Awh`Hw���������@����j�YW�1k�oP
����[�D�Y�����uZ"��psn���V�J�&L�o��2�?o�j��
�G�����l�����	����	��.�TnkxC��
��.����79�C�B�T���7���-��p�'��}7��Wl�h,������6.%nxF�+�OS�I�(D_,/Ll���-�1���B�&�9)�q�Ujdx_����[�Da�lL��4���F��~f�A�X�V<�����}��:�}]I���V]���������K��	�����^k�o��$��K$�U��-�^n�C^���{����K"�t��b@��P�Ft/(t�n[��q��L�E�`�zf������St��9�n&&���`�O�k��"��'�x�5������7+�
u����Y���\���f"��'�������4U[A0�?X�M,�G�7���?MT�%{�������D��0=X����X��Y�{�pB�������`a�X��~���&!�-N�@���W,L>`�w�^w�U��-z�EoV�+v�gn+������ST�4��>����������o^��c��b�������
8�5%����&�X`��yZ^���4,x�<��t�����i^A���ba<�����)���������N������T������������W������Oe���:
�H����V�fV.�L��4t��G�vhX����rZ!�@0�X
�L?Vl��|[|3p��U���>M��S�}������lNX������J��~#A���`4m���`��w�������b���a�F�Wr��j�	z\�:���v�F�bkg�
&n���f}��Tm�0q5���c*+��vLKtxL��ox(����������F��J��%�7<��<2����<�|���`�J&�%�7,�
�e�^������ZR�p���0ms��k�������<���e>Xz���;|��|�[��,�N��E�L���C���&�u��`K���	I���4,7����=��U�7,��a/B�F"�L�L����`[�%iq�
�������;I�����^������������v-���F�)����Q��`.Z��������\<M�f����{'X�g'�F����-O�_$=%�^���q�Al���s�e�����&�4��.o�3:%��P%��.Y�w��7��+y|��0�)hX�*��J��E��������&�J��i�6c`,�Q�c8�����;K�J�z���X��`zc�8��%�[�~�`[�@�B�����pA7�|��Ud��V�{����x��D6�`H?h��(�vX�f���m��M�k�:
6��>M����
��{j����Y���~+wQ9�2��|�8\�p�
vB�K��Y��y!A��$��CAW�t+��+�Y����,k��w6y���?����]�hKW����N���Awz(���$�������y%V����6��l�89=��T�k�R����:�0�iV�ev�-��q��b6�2|ggr�������
�4+-�e���l�xpz�������*���g�,:������?��%"6�i&alv�
�4�����4��2������S�?�x�;
7=1FL����p������^����52d�vd��>��f;?�������W����fY~������`{��K��W�lOz���^6dPB������mH�l��}zL�iO5
��6��av��#(-�4��7��C�w���{?�
��lz"������w��
t�2}U�4��/4�k�����`�EpM?��h��O�j�\6dPt�����6x?������1mP@�%h�����\L/�����tCC�L��,
4[�>��-
Tma:�gY����=��E����p4��H
��H~��,�
������9����[z�}:#�P�(5��B�~fR�5���������A�e�Y�=��e����9=�
x�
��o�����^���c���6~���Y��������s�����C;-�
(T+��4fG�ro6��&���	�0�mc�xA����wK���Y=����vJ�3�����l��������y�>f�:��O�i3i#�fI�f{����j3I��F�e�W*Q=��&t���v���rq�}����x��t�H<i����:4��F%�����UE�Nr�|���Yr�����o�����:���TG`�#��l���f��t��_�%�
SM3a?���;�l������?�MT8bz@'�d����4U�1����^��V���}�z`xM
�J;�ium>��Y�A�m1X��l��V�VJ�4]��u[^0�+�s?�}`����d��w��R�1��l����s��.�.�lASDZ�t�����w^�$�q�&�ium=!p�4�����X��]d��&�$��K���&�:�������U=M���&7��WD#'��4U��
z}W��|�A�P�1�2�a�����l��������)��vx��*��Ofx���t�v>�a&�hx�	v|��|�#�d�
I������~�01@4<����r����\x���W�Laz����Wj{��hF���/Zw�yQE�_��]0m 	G��.o8`�l�z���%�)�N��������j3&|�f��$�a�~�y�N�i[�������>�Q��i��lO�����*��iSu���YoA��];��E���k��p�
`�N����0�l�a�`�1}X�e�iZ�f���n�=#�d��Y*6-|����/6�s���7�4��V�?�-
TvnzC�@��cY�-��;{�Y=o%��l��������~�:e�����>6��[������'��A��4��OpvV<�V���Y�f��ft�I�V���DZ�-7����o�j�lA!Q^����O���`�	����,����Y�V��1[P0A��G�p~G�����5���g���a��O\��<6����Dy�K�6
`V@�^n��]����h�c�	����\��OZ�0s��9up�|�6E�fB��������y)Y]X��T}H�- �m4-��&/���0�	���Z��c�	:/�W��w�WrX[^t8����(�c`��f
�Qua�����t��|J5��J$&C��������m;�+$##/���(�S�~�2����0��l�}�b��N�������$RM���n���8�b�����fj���H��{����-}���U|O���������2n�u8=�-/xG�������9=�q�}N��01��������z��-����.��[��l[m�q+U������(��*�=��=
T$?��t��n�Z�{�i���%�,��D�S(k.lz2��?�����������X�A,�������+����c6\'�q��U�J��%��Dh�4���b7+��E�O�����Q�T������������c?&��E��������^��Ll���Vhz��h�)F������;:���Sf~�W�!���|�wH���g����
��dt?q�������?'x6<X��,��eY�Bs����n�.�1��e.;�x[�g~4�MK��D�����"�h�a+�'�i�6SY��h����e�$�,H'�)8�.�<������
�HL�1�/��M��
����v�P�[�d�;b{�'��.�4e��]3X��I��/�Z_LIt�T}��"s��%|���e�x�,&,6�����&N�*�'��py�[w���y���a��h��F,��J��`sb�i�l�1!n���,i}A_����l������`F[;4|Nj�1C��r�������E�dn*f���-���V���"�bGr`����~JJ�E-��&��sY�����2�
����z�tekdxT���>���OKdK�IK��~Z�_�E[i���+i�6�����=o����],����������
�EOh^}��+n��*�� ��nx.�6\��~s����[��l��U6[Y"[|��z��u��./��[i^zY��b������HKt��-M]�b9+����)�sx����7��|Z^[���#�u������a�2t/K�_,�G�,_�Y�yj���&�u���:KH��r��d���~������T�E���{!%YN�k�w�<�m/�n/�a��fY�����[<.tjk��Yd��~���vb��-w��(Xxa�B{A6���:����*���!���xzL�^)��pQ��������
&�u�*��|����8^]8\�O�)���&�2�e���������
]�+���6�m�TzAv��T����M�P�d�-�.��_����o��&����qszL�m�Y�((�^�;�����.C���;�P|n�+�3��`��h:����i�>#a�x�P��,�E���%����)xsZ^��!����^}��:�4[�����,,����^�[,��	c`)M�z��x3�l�n�\����EOhjdx���y���Jv�%�/V�)F^�0�4�+x��4\+�_�[y�(������/�2�-���wZ^P�*4�Y
���~��cZ����.����~�{�uGS&��`kZH���^�JK������� r��c;�I_��S��yZ"�|p	zCC*�w ��*4n:�OKd[�|��o�r����il�$wXH�bB����,����~{����Ig�&�B��m���|s�}g�6�J��wf3&qJ���c�9���z��qf+mM��Vk[m�D#hZ��nt����f�i�J\��.&),�Z�\�p�P�h�
6������@=�0��,\���,�����>�J(���Dg��p6�`"����%�~�D������v�~Mm��uI��
@�e���`����\eum,B��
�_f�inp���'����wv��M �n@�������������BAl��"'�	k� zA�E�������c�E��T'E�J��U���5�	EM�]��%��eN�M�*I���@5c���b�[�x�������*������Kt������kE�$yuI�F��Ma��c���%u��@�H���c^e�6	)���D���paA1mh������\uX�XC�VpA�^����G�����p�*q����o�����}*I�V��Eoz|�R�DQ�Y)Hw����rdK$����YZ3^�p��u�
�L�7��#�?l)#��m�<M,���)���B6�`d"h.�������`[�x>-�M>(t��C�]�W�;���q�[,\���hZ��6	�^��������}*b�n�@�Uj�s����=��4��X0���!�~n�/�Y���qa��ZJ@��`GE��m!.����[��4��Ex�U�z���tO��}��\��on���E����p������-������Xvo�R}����4�B
e\�n&!vn��}rN���n���#3
���Dl/x��{$4�#�434�>�_"6��}ga_S���qZ�����4S��X����|<f���rss��L��~,ai�X���p_i�����������������|z���	����2X�`�,���u�B?�������������|�b�*���I�-(�7�I�����X��#���p�on��X�������Z|��.�h����a�AC5�����N,�D�a� K��a!;5?'�~fw�Lr���R��p�D��Qb�9n�����:��P�\4L@[(kn��XQ4T����NS�����+Jq�-s�^,	B,L,;����
�zA�t?���)�p��5�����vB�V��m�OA8���@c]D�'��������L��l��s�j6=�����e�4U�,_B4l!6_��������e���{�����%X����p>�X��iV�$�3���{b;�z�i�;-�v��,z�����/��i�X(L4�YZ���������n����;X���NU�����
#R��L#�������V
����,���op��uW��K{�����yzL�L�H�`�m�\h��,�s�DOh2����z�!��{e[��zcU�����Xz5�x��T�}i�Yot���
��[-���5��_=�c)�mui��[��@Ie+�o1�J���[%���F{�M��z��|NZ��	vV��-o0[ �����nx(����,�����%�E�S��:p�
:����+6W�1�b�S��i8�����p����f
���>���f�q��M4T�����!�&�	M�`�B=[��zcE��Y=�P���I��g���-�PV�,�u�>���i����_;O���"{
n��8o�;�{zL�|LU4�Zi���g��H�h��TlVB��>�:vzL�|��!-|�
�a�ba���q����iz�i�iJ�:[�"�w�9�]S��9����"L
z�q�5�+�Mo��������f
��4�EO��(
�JF���sv���^��|giX;X�2^�L���%��j�Do���Jb�������=�[�/Z�?Y��1�N��y^�F;|��[&�w�f�	bG��i]yjYMs�42L�
6�4��E�%���*�E���}��|�����a(~�k^!�n�wZ�t�^L��CoR�PN��B�?��k���6�`y�T�;�)��Q��,mxXA7_�QO�k����*f�	������L����h�0g���}�	L��;���p?���hJ���1nAM�Y���[�h���\UL�?L�Y��0���Lv	z��`L��������Y���pa�@�S�����J��5�s�����$��@�t3����%
��.���a+5��h�zc�s��p4�t�:=�
X���g�F�_JT�`���a����K��-/x�_�_����%tN�ij
�+9^�Jo���L$]1-#���f�rjJ����;N�7W0O=X(m+��0�Vz��AC�(�<���0M���&(xZ"�m0'}������t<�)��Y���q��b�v��E��r�
����2��e�,o����� �RVhy�M����^b3I�� ��{��HAOXG+Fb��1Y������M�h��D~?��I:?��b��
�\��WA�T�@i%������q	��*�{xB����c�V*=x����~RY�$2Ye�1�u�P�W��������Xe�A|+�	.�����p��2<j�BW�fexzM	�"�}*���h�M�E��f�y�Y��7P������������m�TRD,t��?�9�H�������S��}���l��D���p��'�m�9�/2����6XM4����9=zO�vB���7i����6�.���$[�Op���d��c�^�E�A���f��,�|8|g�9����������o�11](����~��H�`��YfR��,�W�f>y��P�t[��f/���2�N����]�����ov�
'�M����vO.jxYI�Gf�b���F71n��>��K�5�����n���,)z���X�� tR�ok��,�%�a��/E�h>�����-�k�E�s&�)���;�������Y=r�u[8�f�����P�f^7��D���4�^K��W~3�r����x[���~X��l:KNS���Ew��,v��o�p��� v9[i�s[
��+�m�s*6�-����������m�����.�T�V�������N5�������A��>�������yS28��MV�!�*$�������]t��~g�cMh�~>=��Wh=���,+��|r���"��������J�m�����E�j��p>��$�����mm��
;D�e*����	?�����U�o���P�s[4�f����������t��u�;<o�r�M��������&��u=L����x�{�*}ga�S,l�l���}[��fI
�;4@����bw�3���+tMJ��PC}[����U��"�]�:M��+t��s@,t4k���zL�L��4��������2F�aK�Oux5�����]8f-�}�JV��C${f��F�����a�%�;�H5�P���4���C�i�����#�;�T���v��d�D��)a�m��!z�5�������4kh��a��I|���oB�������v[?�t������ aa�PTl]:-��5�K��w��9�V*n�~�����
,���aZ����1,�2v9q*o�M6&T ��DW,(}���d��#C�J���]�U�%�s7���E�x��64�4���vzL^�G4�=�w�h�oW��V�����hV("t�t�0�FlA^��p�
�$�
/�����b��J�����+�
CA���_�41��Ao��I��^���`2sb+6ow�0�/h�y-��������������e�bsW��c��7���v��������J>���oV{/��0����,>��J��%�o�cJv	���/��0:)��������/�����
����7��r�`;��+�����6����~���4�m/�b	��
�m�5����p�_��J�����7���N���p�'��i�#�)�<����`�����	OZ	Y3�Y���D6F������)W|��Ox=q%u�R�7�������x>F��.��w�[�hm1*��z��J�7t��],U���
}A�NDb�B���j�4RcU��GeUh�&P4���DLb������7������>��U�&a��RJa�>��M:�����[W���
�E$	�t�NK�c��K����B�m�)LwzJ��L"Y4�g��T��W���<X�TlV�-�04#A�J����a�C���H��I����&�i���?��`o�X�gJ���%�\)1�@�
_��X����G���)ia�~�*���nx�i\���q�����oX"�{%��i������hh�:���i�������Si$�kZ4�Jv��o�i�c��J2�~�ayA�Q:re�l>AW�S�����
c2�rl�}�����H�(��\)��b���E�]}����Iw�M�� s?���Z������7,hj����8�����D���+$�`��#ieX�*iex�	6�����lyd(�+���K=b+�NK+�0	#�|�;
g��i
��^g��Vbf������/x����
�'���1m�A=���
sf�����fd����y\���2�hz��������%o(@���"���k��b�Y���~��75h���e��7a���8�-��Yl�4�5�.�����tK
wfb���� J����Ea����-��Pt�6���=\�;����
��������cv?&�F"b�|mb�F�V����w�7H431��?����'m	��^!�5����w�"8�-��Y
�h��B������~����-4��V��,�B4�a �I���
|��A�(�~�V���"F��V������R�����V���j#��_�K^����n����K����� ���~'�����fs����w�������~��[�~��R����p�w�;B�Mq���b�-����,�TlK�[�������E7x-���NS,T��q���6�����@	���[���l%�[������B7�n�����7����,�b�ez���fl�Y����SW6]�@��*�L�X4���Y*���b�[����f�<B/�Y	�ae�bw�E����tE��t��qV��8\xT�4����`�0��1m��"����G.�^v�+w�]Hc��H�FD���}
�|���%���;�9�L���f+��8%,7�Y�u��p����o�u�8\{�p��>)��4U�7,�+:��������T��3�`�P@�b��b�]/zn,U\Y^tL�W�d�b���4UVL��[��E�`��b'K���eZ"��YoJ{�Y���Y��0�
z�4n!��[�8;�?4���:�hc�db'�@�o
�N�k;��$������6|�"����&c��D�X�0Y �'C��l?��L�Kn�`�C����qS8��D�����yU�G��n�,��n{4A_�A�J��Tm/�p�h��dq�gw��0�YX���������6����
�m`s���)m=1�`�<+%:\�8������}�9>���s�����;�w��1�`'t6�%�Kd	��$|E�Lx�.�txa @O�j#���x��;t����+^x��Y����m5n�H�[;�3�`���>k�v�]��v�����{�s����>-��'�,�������<sE�V	Co�o�Y�q�M��D6��T'���r\*���/z�)����6w�h1�&*�
�����x��0<�"g6�����b��CAgM��,,���{xL+�v�M,%^�,M�
v��7���sZ"[n�'-�$���J���3���n_A�mD,t�h�0�8����\�Z+��
F�#��O��~b���7�uNUIU�.�O0��k�7�
h���Y���Vr�n����w6�:��{����AK%w� ���`6b`��T���^�NS���A?����2.Kw�
����0aF,t��j����;��X�*l;�J�L*Y����d�a�a�z�4���h��rg|�i|�����*��x���(�fx�v��bIK����;����Y��J,�:����8\�����+L���1�F���w��n�`+�����;4��������q���$,z��]iO8-�-�B���.����bi������GJ�;����;S���� �
>R�lES�[]�3ui�� ��w,����pp�3�����	��O{�W���?��)�����Y�������;�;��e#�!�6��1
�2L������������
��N�:C�k��iym�2!n�0ULb���(���<=�MkX�d1m���n�g��bX����	+�����7�.z��)�svWN-�M3������n�)-nX�'�p����V>R+yw�
}DVgZ���h�b��	
��x�J���;M]��X_6�M����B�b+�����J��i>�F�H=Y�����=���������uzL�@��-��T7s��}U�p�"�R	=���^�jn�D�+���9�_=u���$�IH�����m��SM�9����
����P��4{�nf�x\�����i��W�s�7�%�e�ob[����f�`�5�,H)t2�Y�`���\�}Z����]����>��,j����/���O�a��Ag:�T'��� �1,�<X����x��f2�>�~XR�����z���,����-����WbQ��2�^,d#����Os{��������p�.�z����+���|���.T���}������yZ�%���D���RS�����|�7�w1��`K���.�%���h�a�	������B�b�[��-CK5h�����p6E���L/�i8�"�RE4,�[I����/� 
?,�;�������x���k���Z�������5�V� ���rx��N5�[�=���S����`����JS��a��.L/M���{'��-��+��a��#�m,kR�E7�p�����a���E���,P���p���8�|K���B!Y���X��=<�=<��+���Vb/x���q!pX�x�_��}���k�T':����jq���m���j���bA������?-����l������;��>,iVlE�aX[Vc�f�jB+�����E����}g/��/�8xX��$�IV�ium��`�h:�0��8����d2�J=�*�i�4-v�a��n���6���0q��:��J]pRY�z�R����Js�-�8����b�������6�$��]�0�������tF<r��OS�-�t�EW�g�5������jW��^�=��KKd���7V���������
��]�f���T}HB�aW&&Fa����0����"d�s������XD�y��u�Y�������B>�a�%�-�0�P�.h�K-VJ,:��������Eo�M!��5�|�����q�}.h�
'v2Y�C�C:9����q��|X�8Kp|�zSl��^!�a�����%���l���+�UP?��LNW4L#{��n���eu�f�ium��4)���o��N3�9����>�-�,������bs���D�'`B�h�g�?|fj����#�f�������?��[)���X�w0�;���Vlc�b+�?��x6[�m�
���V�t�II��k\��MU���:��r�O�kF.�zM�%�v;<�}*&�ux�^�j�����`���o��%��H_x����S#�����>��]�����������=�V�2
}���J�����:r�p�V������s�������d�+7
���k{d&�!6�>���,x<���h��O�_Z	-����a�6a����"K=�)�b��Ix8������<��}�cX���?�����h������`����%Zf�6�m��+�K����
�����Y,y�%�]�Z�oB��
v�5��!�Cjq:�Y��;���k�;�+�iym@1��a�c�"���H��db��Wl�����?J�������g��/���\U	�3�,�H%�\Q��X��	A��i�%�3P��TwY�x@�L�9g�4��>�[�����l@AW�#
�D�/�"OS�1���^�M����aY��K��B��!���0sNO\�=l�0I\��4��X�,�If�}`�1�E7��(*�9���2'�W����b
��Z������Sh<���5|N���s��a�K��d����%�	c.AO������L��3L|��k���Z+���#J��|�����z`�C,�,vC�Tb�U 6�����V,�v�K7�������>�az��B|��6�'==�
x	:�/zD��TY_������/�0�����������dE_�:J�*D��um��K4T����.�Eb+������	���zG��n�l���Z�^y�i��I_�������y����i�U�7M�H�!��9p&��^�b��z�,:#�1#X,LA�[W�s�1�K�H��7��:�{;��~G���S���8
+c����OE�6X������XX�)2��^'K��Y}��������VO�R����N��NlN�8\h�����Y�{Ic�9������q������U3����b��}hZc6K�~.�%��o6�E���bE��]�~G.�i,�
{%�.\O��N&�*�3��M�1%B�%Zo��������(z2aJ��P5�B5��2�d
��'���eI�b�<v�a��[���V��oBS�v�����dNR��EN�������Kt���b+�S�j��������,-��+{���'�.M��`s*�i��d��&�2���]���qY�Ql!�>��;Y����)������S�5
-�`�B}��:�d���/��*�E�.xA����A����iU���$E�<���O�y�TszLnL�W�.�OK�N��IZ7�i���!}�����z��	2_1��P�Ul�+��8n��������?bs���1m�@�O���:
gS����;d����X���q��.C�`�X������w�?�PX1�j}\1b�������Z���.�e�b�`��1myAG�Y��4�-&V:�b�i��I��������bKw��s�cQ�	3�^����0~t�>�~��S~g����J��i1`��C�S(��6tr

�@7�|4i�����|������2��u���z�>0�F���m��+�=w.f'6�����#�Uk��I�b�<-��!5-R;aFEW�,�E�I���@�?�w���5���M�{���.��ba43�������@a����"~Z]"���D-<����m���Pqm�z���d�����J�����C�5��J���Z����C+:�\��������'��
���>L<�,�ivUN^K�����
BI����!�w
��p6��K-�E���A�����wf[A)kZ�w��r����w�r��zb����>�yy����>�'���4���Zx����f�������B>�q+���������	�Bw�D��[�q+����Cb�������	��N9���l�0q�9y�h����:8iK�f���I����X��LlnTrZ!�1�8�a0b�B�g
c���}i�>�F%ma	�B��,���$sX��[����v��6�
&���a�$�B��5����1-eUD_L�Jl�9M�6������uiN{�F����3;X��������V����LSP4��$��]g*o��6�DuU������=�k`���m-�R�]b�0�m��U������,E����#sf�����$&�E�']PC������E���Vz��#���}zL�0L�Vt����,�������d�5�	�+�
�V��l;���h�(PlV�(����Ba�*n�|��u�+�����a���KV�u'�
;/�������b1�	���7�m]�B���,wU\����y��%8��7����qzL"t�Zon��,��|��4n��=-��'�[,zA�$X��!f&j��H���$�Z�x���d�+�t�-�������-X�HHl���N|Z.�������.�O�O�j1�;�r����
�I��R�k��,��q�����g������j3�sR<���`s�����*�O�i{Z\AW��V�8G��^�42�Q�pi����AS#M*�n<���K9�]�)wZ^��P�!��F��"f�?����b��Y��;���'��Yy��8{���j���T�~�}Q,�F���Y����n�e�����E7v9���l���
OKt{���4��G�l�:pYX�\�n,Q�,���v��������=-���D,t����2�Z��wzy�c����{�����S�/^����
���:�-�.�J/zJ���O-f�,h
��M�x������X�D�b�f�~�����EC
�e���k5�����p*�go����Yr�b����B6����h�(����i����MN4Ks
cEb��yzH[O�l�TH���b�,�2�����t����jc���V7���G{���Se�_�H@bb�O����b�/��n�r�Mv�rw�=E�NKd��	����r�hC��XLBq�����6Y�h�K��Y=���	����6L'��MW#C�?�����b���s����U�Y��^��4=$�]H_������a��G��W�-�IN�i���`���<LlV�)�,m�lA�fY�:�S}NN �mF�_������baU��.H���u��W�-my1m������a9��a&�X}i.x��,�F�S�v]�^L�Jt��A���$m�M$�dY|{1��,�ElV���f��;S�������b�n����&��4�i�6����n8aY,�sj��������%x����=����n(��[XV*�i,�S���������oe��3X�! 6;�O�i�
�����O����W�9��4�m h�
�o�>��'
m� 	����6~���`��b�k7P��)6��V����c��6���*b�h��-��/�C�C���2ko��a���ID��M}���#�����������%��,���V^�-EN+d[�~�|+}/��/�x���^��|�C`���VlnM����r�E����J2���/��<�HV�a,��X�����]�^�<�o/���x��
%�Ew�{�r7\�W��1}�2l����eE���E7�[,-[Q�}���P��J������z��*	J�������z��S�B�&h�aR��aP�"�������
%����o�`W>Y�zd�]�e!k(B,����;�^��)3��D6E��4�W����vx���4��DM���
J ���9U��pV�f?�F.�I-������m	,������)tzL[OL)@���;��yi\hF��+gJ����M��
��
]���f���M������)���..-�X/�c-��Nr��	6�����6�u��������A����>b����� ����L��������T6<�LaY4
�{�o3�=�ayxL+,���o�M+M��L���Y<R�.��YVv^�\
�2�RGY�WA�oYQzA������J���������7}��d��k���$�\�5mQ����3�;��v��0d��z���kY�nx�4|���d~gt X�����l���A����p6�`s���1����0���Awh>idxO]��fD�-��/�J�t���d�XQ}8�3����*�@�;��o�T�$X��h����B'��*	$���"��}��H���S�(7��&���D64���
���^�{d��m���9�����8��A�d���V�K�N��U��0�|yT����*��%��J7�����x�t+�
�t8=��E:\t��"R����E1�5�
l�K���8��[q�`�Y�{��Q����Ccr:Q����mKp��h�9Q�Y�{1	n��;�i8P��1��c��bq�hW�J���`�w�����������6F`�(�&��;���j�ftl���O2X�������`Xe�q+���/����
~,�V'k/�}t�4}g;�������=^��m0�r�����G����g[jy]
�Y��h�������T*�
Cq�s�u�X��aR����GFO)4+�}g�����yZ����L/��=
�<��D_��&�DB����XT�ar��;�B��3<���2��Y��XX�!v�|��c:�FW5�h,�Y,��B�c��R�������}�<2�+�[
��1�"�a6����obs=��1?&2cD7��+v���0E^�f.$��t�m//��7nk.v�D1�:�B�i5k�8�YD�,�Z����c%lX7%z�B&���w���Nh�JE��������d�E?���ZM����vv�}��y:"w�����/6����l��7b��\(T�]����ZdR��se�i8�^�[�J~xhj�?�3�������|@��_Xl����T���D�V���lM����im���K~XY�h��+t3���o�����Xg�a�}���*�e�����-��N�c}�,��q8����J�������X:�d�8��h��l@��4������{���W�2�
$��fbg�������mb�%�y�;M�G3<=Y}����������J=OKd��a��>.�������fy�Bs���������O,x�0
W�����q���x0���+��������x�v�WA����/��,:���Y���/�D��L���Z7>���)?4&t�hT��"6���s�������DtA���t�
�����Y��"vBW��� "�X��a��Kx��������1m��o$�[�x��	�B7�����H�J��[�~K
���>9�������xL����p6E�4t��XY�X��X�UP1�x�$g����z*tkx�- &��K�U��bl�������E�]��V�{���u����"�bRBf���U��3>���.�����[�5m0����;�V�3�N�i���D��\�����������p�yJ��H����,�B8�b�tq�����9J�R4�t�8��
V�'�xxdh;�0g�x��M��iym�@c]
�����'�f��$
�"v�����DOh������6&U'v@�V+e���&�P	�U\]Vi~`^�h����O%
a�e�4u:[�!~,�{����������TmA���^���)c������q��cC�,����\�`G�md�f�8H4,&7c<��[���1m>�U
z@3Z*���M���`;t ;+�cV�~`�&�'%:���-Ag���p>���!����4��fx��|0}�B��mx�Vz?V-~����NUW~�����&��e��bGi��M�Z�Z\��Zy��R�eR���Y��{�<���
'�a�5���uB���a�\1Z!��0'[4t��-��~�����D�4��9��#v#0[Z����
��`��/`X"-_�>�9W��_-]��z��]#C�Y���$|�Yt������������
=���jC�}b��{Z^A0���o����b'��I���zpV�@�^L����O)j�H�.Q>C
=o��a�d(g)��+�d���@r��JK?�M��1LGvV����G�
����u��^�����"��
��>fx
�?�������c�4qM,t����ma��J�L>zz1o���<�DC���J6�5b�+z�1�H��p��� �+*~�mn#�"q�Ju����� :����H}X`���7�H���0[��a���/xO��}��Q�*�X7�y}.hX����Z�	[��A���Z"&�HP���`a������`���i�>`������q�,t��'��\��.�l����;��
'I_ZZ�����`�e�q���V��L
��'��Z\�&�^Ir��m�,���J�n����m�����^�#h!_����'���5kx���p!wm[�w3Z4��
o=�?��?�]��<��������Np����"�bw������f��Y|T��RROS�=Ut���n��!c�q�m�����EwV�*v��@��?L���m���K��[��n����>�6=����l�[t��3��w��%Z^"dV��������H��XF�X���Y����\���m	�m���E7V%#v�8��Bv���/��Eo�xk�%3���m��\�����e�ba7�%��Z�9�q��	d=�<���
���H���5b7S}���O��l��Tm0uZ���K,Td��YV��B�d[Q����'|���Ui[vF������Ao�A_�^�T�7�g��B���i�l09^��^3����\\���;������0�4�}I��/(�U5e�"���������p������~
���\o��n&�+:����0�J,��3[���-�Y��4G/V�$v@�=�,�rZ!�O�����@/�����w�����t{7��.�f�A�N��n��j��?h��t]��-�L�Xt�����d_�=2�q��J����2��)z��z�L�������]^�rW�J�����/x����T�qzJ[l�6�4����ba.�Yx��y+qQZo&h-z�������BS!�VP���p;��v�Q�����f�t�a�Q:��~`�:�Y���p�M�S
6]�OS��MSk<��|r�y���\,��j�(�CoxZ=Y�����5.t�����l��=-��T:�������J�����%M����l/���&a�l��mY�
�t��[��;[i�-i�����J���>���e����}���'����N&�qYU��|&����<FD��������~#!��0�fs���6�����9g<P��)�����E��0���JV����%�����g�N~��p�
`^���+g�Ov�4��u5���^�Bk�myi������yf�j�OA8n[#�N��F�����,��zU^w�<o���d2+��e^NS�C_�;����%�d��Y�#Ar�0_O�+�j����h��91�(l���V�1��7�A�YX2�Y��;����M����v���xu\���
]����F�z�5lr���������X�	�Y��p�������)Mk�����E+Ey���o9�
�?����I�mIk(�&��;��������3����!Y��7���q�m5�
7��'L�I[	�n����y�b�E���6��!����
���i��Wf[&������W�`�yh���V���}��9L�K������;[���-�����ih�I&�ID���N������������_z\��1.��������}��lExn*V#��4W=p��V�j�>�T��
@����F���J���"4YS�����I�We�*�fb���[Q���@4k���v�=*�sX�������`X'aw����fa-k�o�<.mvxW��z�CNS�%�D�D��h�~f�9l����^�jlK�S7��1:�M,�^:�l�@{k����Y��D\�p5���fr���H���������fV�:���I��.�5��)|Z"[1��y���������i��#�|��q����1m�o$�8���<�Hl�������Ew��>jO_����Bg�m��
�SAC�g���4n%=����A��`���x��8�����0�l/�jo��oh���D����d��
�[��
7L��ox�`Z{�
I���k��B=������'�bjd�'������-WNKd[�A/��
6>XX �w�`g������f�����Z�O,�Ki�0uOlE\�"���$&O��9�2NS�
3���_�z���=�O�?wzH[@�l:k�}g���]���6���j��������8�
�����7���@�w���'����3=PV�������F��/����./�FLO�m�E!FY���+��V�y����h8��3f������%�p{��Mb�����������
�����2����\Ifs����.@��.���'�YVzg��04�Tx��^��L//���[������_�{�����p����
��L����	�w���g��nY��.����	5���qj�!�)���;�t��������l��3����i8[�H��t���Ez����`����V���FF7f���Q	6�*��ec��f`�,�e�=��u�,*$6��cO�k7L�:��p��P���C��sV�����7J��H\�w\T����i��%��Aw�Qm�A����*���R�~���|6����D�b�=W��l	6��pAC���EM��F�lz!�{�,Xn����`W
��&*�0�Q4�wd�0;��C��_Fa������D�|�sr�w�P��nC�8�ss��p�cP�����4��/��TUyzL�O���e����&lC�Wf�����v�,��S
�������R�7�?g	KT^<#0��BU,f/x��}e��1����#�������&�i�w�DX��`�6���K��(��,���2����^t�{s"����*�1]h*���r���Pg�J�4�����l�@�h��}�����Q����`k�k�
��~��#����,*�1���~������#���Q���m}�Q�Lu�,u���o`f~o������}i���\o�-O3��-�[�b���%���PC:�N+d{�c!&�j�~G.�^��g��fv�X$;k����	}HvOY���l�C$����0�w���l!Ay�
�]���/bs�6%�/�X��/	���� ����'�1�7���TmL�0ZM`:
��^��f���#��|2��G�R����K�p>��g4����X��]}��u�]^�������*�=9,��-m���j��1�5&g���b�'tVs;
g+�BE�MSr���l��;=����d:W8���%����:��
,�0������l��Cs�.��#W>/�1������f<D�z�|g�[C*�0Q4�| �V���=
z�����4�����
��b�w�J���
���-q�����L���/�^�`Ge��>����i�`�,
Yc��Lz��9>�i3����G�5p��L�ln�pZ"�@0�t��D����^1��M/�Wn�!���];�~zL�@�n�
�`+F��
���M����Y�}�������S	�zKH=
gC�O�ntU���@���sN��%�m.�RCK&�Ew��+{4.=��tU0i��/�[}�c�y����f����.}�)����Wr��j
ix��H��w�J&��!w���w}��La\�Qb'm�^P�VbC��*�&b��\qi����D�+����\*���
c'���i���[�[��m>��3�pC��RaWe�6��#!n�"(����
��)m=!mY�������["06��j=O��XGb����y�a/�D��(�����`s�>f{�)�)?�4U�0�!���.h��M�5���K��j
3,5��N�?�M�wzBk��MP8
��%�hx=
�������GAO(	$ejhX>
�T6g�0"h���,��K��i�������P=�1j)���d�`�&�V�.�.�B��f����=sS$j
_��Z���]�v�q+%����6�����d����@z��4�)�v�m�J�l%���T
�-#B�bz�J���%��AO��.mi�w�7���S��������[,��0_�(6���Z�Ja����������6
,�C{���E�)W�lA�hx9
v��3iZ�������5�/�i-z��XX��q����������&�����������s�\���yy�T#;��8�&w"v�7?���
�^!��D<�{���{8�iv�N!�o�],��O����0�D��	����b[A\��P��|���8��/&�,�b��b7�/x�B4��dr��8����%��1<�4k��>�����F.K5_L�B�b�!����e�����~XlZ,k��;��d���e��L�,�6Cabs��i�l�0������/����so����>����
����`���c��'bV�&v%�iymQ@c?hX6"�b~O�Z��p(X49�?'��w��e�����^���0}�
*��_V�X�E�C���+�[���W��������
�P�R��������e�������o`�0L vr.+������7��������N��9��b���;-�-(x�1+���V�qY^������D����!��U3��N��Tm12o���2oO������$���'�ch�h�w��/�C5 �PZP��Wr�&CWk���J�����YF�h���,lN%6{�O�i�����?���M��l��A��HN����Z��b��sO��p�FXZ��\�q��3<a��,�Y������WlI��KA�{�du��z��OX��`����m�NS��L���}KU��Y��d%���$oe���C
�8�+�NK������Gc���Ai0B[��-�{�R������y���/��q/��#��eRK6��W~���[I�����F�^
[(����{�H�^N�<�,3��(��I��m����������\���&�W���A�a�����X�,G+m�.k_0�G���H	v�%�~�f�s���B�e���Io�.f��i��t7�B4�6�^�|
Vi�X^��������,~�V���eu��,�q�?�����p���/&N ����&�>�P	���%��Z��&�xP�b�������������
A7�DJ|���O.+<��I�4�:Z�G�e��������_,M&7\��.����iym+B�T
��v-e�B�e��EA�Md��Vx���Hb~^����i�6��:������vz��CW�El1Y(����wv�H�f]�Dl>1�g�����I��0S�4��I-CC/��H�e���p�|G�1��K�����5�ICl�<���[E7h-id��7+�<��W&=,&�y`���-�szJ�Ly�4�1�&f����h�7����&�&�TGJ�D!��2ROS�M��s�4/�_L���xpe7���DC�N��Rh1]Z/��)��	�B�,X(��9�B���
�J�PoXt�/�U|�I����6	�76����4��u������p>�`;������/$��`Z���+��5|��4lI*�bJBb�J�e���;�����a�Dj���,���$(�E6	`�J���ba��T|a�v���o���A?�8y�Z�X�lk�`�V�^�������hdx���a/��F}C�����/��,�A�-���S������E�hz�L�v����+��VZ��{�9Q�;���}��2���_`+1B�C_�������B���
���������h;`��#I>n�TS[Y�b�����X��TE��JM+��,
�����`w�U�eE�^��^P�K��0M,�		v�{@�9�uZ^��1G�S}xU�T�+eZ���r�A���gs�A�[�W��6�"z���a��h���Q��a+�8Kx��~K>fX����n����qa���UX]��P'���������O����5���o^����������`w�m�e�s�������4�mMXljo�&��	�'b�Cs�����c�����/h�M�~52�9����+�i�l�1�p�T?G#����P|��5IO��R�k�������0>lB���6k��n�������,�����n�v8t{��:�bK��Qb���������MtV%=
w{8������5�ig����"%��<bsl����!6�|g�)vZ���E��Q��i���*���%|�#>����2�Kl�OK��D��W|���<�ss,H�6�R7�E�*����]�Y���da���i����Y[�1�L4K����F+6��-�,��l���,K�XR���*<2|�/�>.6+$���6N6��B��Y��1n����o{�w6��O������E���p>��{��$�;��V���|��.{b�.�iym@�P4�B�����q��uzL#,7M�f�u�,H�� ��'.�1���s;����7U�����Px7
�{�b�
�ACi�,=W�f5tb'<�5��wfn��S4,�[9W,h
s�DW|
������a��Pu��f��,�Ll��e��uc�a�a5��](�j��n,  z��k�]OS���4�E�f��YXo.����,\��*�	6���.]�������`��p��M�`���4U�"t���x�_��D�5�K�������������1m0-l�^�er����wc�L������%,��Rb�f��������w!��,���4l,,��23��zzbV\$6[���!��E�\l�9��;��o8��jA=�B��f������e�9[�n
o�bF��8 ������j��G,�5�a7&�-v�X��XVS$tt�������+1P�RC�>�~���@��e���%`������
/_�I������hx
��u�Tsc)����l�����hVu���d��V��+�]�����L-��G��P�zqc�k��� ?
�#��I��	�"\�1�p�j)�2�?����0<���0�l����*�
Z�A���i8���g,�Cu4���q~��������`sc��������:����pfQ�ar�p_��0g�B��fI�=7C��p�:.��ct����3$�~
}��5y4y��r����V����|.�9��rHl.���`�8���oyZ^P����0�U��p�v�:V�{��f���c�����q�|N:��	vZ�4k7��=��,��?I8V>n�2����;{C����h���,���D��c
��$��h�����Hq��c��a�����*�]����@��������4�-x���������bw����P	V4���f�����V	��l�`if�X���v��\n�2�� ��	�/.��j�/��8�s��;��mNS��������ab���]a+��qcr��aK�0�4�]q�[s��.	�kb�=9�OS����%$L���c�G���a�����E,~L�R$`\	xXH��4��;���|�^K%B_"I�n�� ��H�`[����oc�4�i��z�UT`+^N�6��
�*B�a����/��t?-�
:��&r��Jx��`	��-PsN�iym|A��q�� �	�		��"_��tmUm�-(h�2�6n��j}[����^�?�17�;O�i;Z����?f�\�J�Fm�Z
�{Mc��l0�V�fn���~gxJK���-�Y+�1�X���,�������x>�^Z���Z��A�]:�0�f�2����;��i������t����f]pX��z��~`���\��e��X���Xl��X,�S�x*,���0�j�W��;��}Z"�mL�U4u|����u�M���'A?)��4��/&����Y��1�V��9�B'�f�T�& �T���|�����r�O�i�^mE�����B��mS�C(�mUB�A+�YbG���*TG�����f��Hov?5
��a����
3u��B��m�����D�B �����b��;�4K�<k&#v
�nk��L;U�L^��p���S]�b�7��v����m�S��@�bA�0"�3��WA���d���	�b��,#]lE��T����D?��l��^o&p&�U���T��j�P�_�`>���%�������5�����X��X��w>��&;����'�d�h���#����l�Y��h($(��������l�/<��M���7��lAN��P��|���}"�����@{������D���K�Xhk�,2%6'�������^,+Gl6��������NKd��Z	�M��0��^o�GK9��S�^��],Lp���Vl����]o�3N����7��a�LlOF�i��c��e
����a��n����E��j��y�M����O�/2��	�Y����-�����z3�.�,�C�f	bg��`��������Q�1�������p��q���^o��"�C7��^���Yw���}�Uf�F�hx	*��]L$Il��<��jo8U	�����������"�7����_u��	;���=���<y�*.S���,�A4L.��� '�Gk�B��mm[X�&z�+n��5.<#�]����U�����{�l�0l��1�������a���D���w�����$�zzL�LF�f�zb;��;�OS���{�Hw�����������dz��i��FNi:����cz����9gq[�h'~��vxX��3!X�����SK����4�$�����	�b?qe�l�Ao�i�"�b���~��M�����xo�d.z�������5�L$�S����{���/�Y����`�~i���;����@tE�����
����G�"�M�q����7'�i�l��c�P�~�L���*��h�$�X��6
�4�����l�����`GAe����
]IA�$���]�"�����%�i�
vJenD��:�.4��-�|3�e��)�-UfX�v�=�/'��rlZ���;����$:����bw�������[
k��^�M��<8�-�LoYt��p��U=��yo�|$��;`,V�T�n����|�{�H��i�>����S$����dUo�������Ej2�;JW7et���^eD�c$��N;S���)}8�<���g�B��=�i�>�������zH5n�Q>=��Wx���/��/���W�f��
�hf���,�|K�8	d��&�R
�#�BW����szL�"t��Y9��8�a���a�J:�p�
6�{�����AS����`��6�\�����`�c�P��w\�D!}�s%;���������O���^��S���s7���I�9�{���X@-`�(����N�`s������R;��&m�����0|�T����q4.4��Z�V�e�oXztVu��f���Tm?AU������4�l)Px��?��o��
m%o���p;z� ������er����*��;������ L���p�Bc%����q��M8�;�-��lE7���0Mh�0�wI}�r�����$�E�� ?
��F��^tU�[~�i�>����i��1�@���G�Fp'XoQ����h���sh�;K7�����wv@��-W.�.��{?�b%��l&k�l�������B�������-cN5 ���)~[N�fB��K]�����_��������i��9�V�)���
���/�$��yQ�Z�6�
�g����3X�A��w�������|K���Vr]-�{����G��d�i��D��$-^��FF%������$`:���x�;'��xaB��������0��
�?������E�6/�Y��#v�1?q�wNKt{��T�x�����S�4�����U49���ba����H��B�+�u��]���B
n��mg�h�s?��p����*�
]���Za�7��7b�_X��'��*�OA��[$�&��
FY�����������r�����,���Y��g��b[�F���j8�3'Y�D��r��c��a.?������NS�9��g����,v����^�����p������e��PZ,l})������LN��FB��'U�j���S��i�lx�c>h�c$t��>X�s��\9wm+���O�Jle�l|N������	���������,}Z]����/:��}g�4��Y<<��ta�M�9�;���nQ[(� zC{/X�4/vJ���ta�h���V|����,�E���`{!)�[����P)�	�	��2%��6Z!�?,�Yt���`YF���q������^IS������TU����������+�M'Vo*�A;H����S���d_?	���"+n=Y�R��/F7�t���
�,�,:���,�����k/���=nAk�[�������`�v�a6kU���������[��W�[)���y�N:-��DVA,^���E������MN+d�:�oy��T�MC��lL���I]�������^4u����n�4S�z��4��J���0:��J��gk�-Fw���[��3A	�PQT����`7�h�}
:c��[���Y��~��,��)v��t�����[0�3�`���R�Wz��2	��"�:;����Yh�hX���b��������%�po������Vd���������OS���J�E����l��sR9�nW����������;+=��L#W�����y/�����?W��d0�H
���]����`t��-�V�V�LmXt��Rg���aO�B�����,7�����\���H�w�v&�+�&^���%���9���-��M��iym/����ih��4UnL2X�L���p6��.=�1�+s���
W������4���W��i�6d�!h?��/LX��z\h���&O�k��I����j��;�iB"9�N����*6
��`7�������E���pOx�4���z�4.����V�M[P�it������T-�L����652<�5.�����lV ,E�a��$�+��%�;]���`���p�
67:=��/&� ��7J�Q�@'h��sn�n��VE/hJ;7��0�3X��Ql��@X|�����g�������B���]�VJ�-F���:h���L�P���i�����
�Sk`wX�"-jX�-�~���|\6�`�^��b.
�B��n
����

x��Hb�lE��[{��w�O)Fs[��LmyAH2�L��,<������1K�q�C�������G�w
z���n�����<�������;�I� aa�
h�E�O�c���������6g�J�����L��l]~g43�]�����;�.��`IA��!�0��r!��
���'�?
����$�Y��[(�3�p�������"vw�"t��]���4�[:���M���`��5��{���}L�.�Q��7����6����<U�P��u�fo��{�i8UL�Zt�^�`�Y-�&I��dgY�6N�*Af���?h��vV���a���t>
�S���.|�V9�0�*h�m*�f{kX��l��N+��	3������a)����T�A��q��%�;�tM�������%�;�t�`
`������iq�$���,�%��,��t#�2Ch�x���sa�d���T�Aw�;�4���
������wv$c��D�b`�!h�%D���j\����U�:�=�����,/�P"V����N�y�1��&:��������^�� v����a����%���G��h�`����2��V�������}��}���O!�iX>{�,>��n#8\!�aa2�;,N+4�Bp���RP`Y�J,��m,�.v%!���.�.\�0��X|6�7�w�Y�B���iu�.<p�����p�����^UNK��D���o�K�H���5���p�}
�����9
�m��'�+�RZ���aM����D���[y���[)�������������e^{d���Y-�X�Xl�D<-�-Mh�K������F���^�D���^����e���:�l���H�g]�k��$ :�������4��}zL����z���p6�Xn�������������`�s�Y��f"Ub�>��\9�,>�`�i���8}Ll�<=�m�i$z�w�);��UL��^�%�
m����&������o�;{�k`����������Q4t���������M�y�N�k��)����]�����<kV]h�����Bn������$7Xk���&6�����~zL�m����$�U��c��
�,���������Le9��[!�fXt|��:
���^#C�t�������0+�Cmc��e(�����qS����66�{4,��e��p��\���o�i�ll2�<�0�I,���UG�U���7�6K���j�i��n,kY���f�vS���1m��;k����e�FB'�CZ*����9���%��o��^64�B��a�����E/:���X����jyzLP��u?Tr@h���@����|�����"�P�Y�S�-��K��zAO�D�v������h(�$�a��DG->`�@"�pJ�
���n�y��@�1#���b�7���4^������X�6�B������}%��4��hNt����b�f���&�PZ0,>�+�/�� �q�"�Y��VL\z�PwWI}��� �`�����������Y����l�t\���^2b��C_A�k���iK��f��nL�4�����cK
<�ZCW��M�������DO��c�ql�vOif�M�8��
�vS��J9E��(���R�]�lzv�c����!�&-"��_��O�`K�5�sJ��p=��,�=-S=p%�b��lA���o��RD��D�to���;+Y���n�T4N:a>�XVH*6;�w+ds^���	�ba�[�.(6+7��������`���9�����\&hV�n��j�o8��V.�V
�an)C����<7�-���������
�I�4�^p��j8F/����f�����D����6k�����xe7��	�����6�`:x���j�����DQH
����T����L���h���j-w���b�[fKg��T���L���
!����N����[P�i�:�^��a�|X��m6�nV�
�
��Ia~��tjXh�J`b�y�[][��4-�����Tm���nH:���{L�])�k���R�����W����������9;a�c���S��7haJ��?10&i�G�w�5����L�}�/��p����~v��
g�F�aE���;,L�r���2�t����N�!���0�S,&G%��b�t��N��n8[��<�Jg�f��,�w8�����C��b����b�4�6h*����,���f�;+u�goPyC���,��{1�m?qi�l��_$b�0�=��My���]�z����UI���|���u�k:�j���c�S��s�Wj%�����F*���8��_p�[�A��h��a������aE��\)>��~����+-����i���+����{����'�@-z�����@��S�x������X����n�6D�L�hx�������{L��(h��6����w���������.%�X�����C�S��"XaM�F���i��u�����������
�X�g�i�",���$<,��$|���-	�Y����B�bs���T/O�;���R(L����N�4[��u+������"��x�����+���|��������H����*:ND��������[M���Y���yCb'����Z+f	D�B���ECI[��������[�3Ex��9&�b�C�[�s��f���ny�s�[��3�s�P�N����<��cZn�3�q�0��,&h�H �p�V*�N��������p�&�Ep)�W5�"�M!6�Y�l���["["������B%H��y���B�@�@zn4t8����9{�;�Xx�$~����[\&&�����E�;��Mo��Er>�_��
����s���7�`�b�����b����Qp�u�w��(z�0�X�a��f����D65�/�&�6CM� ���O#��d����=b;�ai������R����t��c�)���_)c��^���E�;s.���_�E�;]��5�`�n8�m,�P���=���/@�m�u�;��=S�n8�^t�/��:��+vT���)��L4�rz��r�n�b_��-6������"��oh��
����W�e��^�������4���MP�7��"��6KdY����D_,�Q�
���_�}Y2�����-�
>��?��:O���V��j�|
|���,Z��{��J����������^p?	v@'~�:���e(�������E�L�D,R5l��B��n�N_�HX�6�F�/B���[��)��[!��L��4�V:N�	47:*�:��Bc�n���M���3j�U�;}g��Wu~u?gsY[a\x1|���u�;��}�@�F�W��Tc������(��u��wx���E����=f��k���?n%��V���f_h��}�����S����"�~&�*���Au�d��6�YU�h��R�����B#��N	A���|�ZT���5����-��ch�j��(k��,l�#�����z�^��9��(B�/�	�K�wKdxE��e���b�6�t���Pw[��g_���c��}�*�n�uB7����{��6�a��U�z��/��f�n�aGSz)[U��=bY��YcV����V��e��p��c4�
�����u-���=(:+�����Y(X/�\��C�I���t��������7
>����~�����3:����,�y��pW��<F��#�^v���}���S&�����+��["_%�w�(������A���`��Vw�>��xb�I��nt�:������u����]�L\w��������v���������y�.L��l��pw���}6f/�;X@�n�Z��6x�����~�
]�fc��/r���p��.n�8@�8�V������&��w&Kc��u%��$:}�"��4��Tg��n�~�M�&�^|�l�6	`�3�=��p���5_;R��n�l��V��������d�yJw)���l?F;�
���������%}OC���@��t�-@��{�F�w�`s��9{�j�`s`o���&��Bt%���:�2ME�������]@��IA��r`�]����ASJ�nylK@����*���M��n��%`J�:
�_2<0�<���f+{��hJ�I]�0C
���;
t]:{B����f���c�a@������b7��tx�
z��2�v�S��9�3��R�v�k�r���>����]�%'��V�������"u8�u��p�v����@����[!]�vc�cF��xv��rB4UW��9���m3U�Q�������T�|�������Y�� �Z
��f��h�}
:���3kw���a�DO��(Vi��D^��S���k�-�F.�������h���#�L�`+b�n5@����p�T��1[Qq���4�]����n�>��>�$���P���q��/O����#�pN��?.�|��J�[h�����C���oF���-�M��:�r
�3�B�_�&�/e��_fT_["�t��gw�*������;��8p��.~��J�A���wG����'��xd�a{���Y��
m�F�����E��pC��{�p�����DCo�X��z�l���o����}KR=�����n����'�[��K�{?z������=,�n�^�})�N.���6�.�LD��H�pS���2��������'�u!�s�)��}�%
�9��c69Iv�9��p���9�{3���\��tG+��/z.��M���hv����������E�lt\�n�0����p��eu	ba-��\=�["�"���"
�,*$�������ps�z}��7p3j[��,�%�e�'�s�m����p���/\�^k3�������I�q�[$��O?�,`�f�YdI(���ena��7W�����z��UQ���'`��e������*8bs���1m����ix���?�G��Ssf���n��w���^���M����%���0h#�����O0��i������b[/�=�-6��
z��!�#]vS�����Yq�Y�[)����;�2Q,�C,uZ{38�K�x�t#�-�-EV
j�����X6���J���"���L��l>A;X���t�a��?I��*��f��D�B�,Y�`�Rb[*2���Mx�}��
���Wl��=�m�&:���_M�n�[�Y�����W����f
z���W4t�D�c�;��u(!�B1��������fI���s^S��J�<.�`�*����s���pA�7!���m%y��+:W���P�\l��v�i;������p���+u���'�����*��������+I���j��i*�}��fEw���y�����Yc�p�p{%��n8}��/�sV
-�6UnL ]��N�`��:P(`�a��C�U���e��z��'�����5���`�/�B�aI��R�E�tu�W��s��{\�5(9�����ei����A(�s���}0X��E�]Z]��t�^��a�����WA]�������,��3Re�\X��>�� �G�������T��N`A��n8�^0�'����4������T��["��L�kX�N5LM�H'�r-��9|%b�����S�����OW��p����&h��'�h�}Y-��V��L@[40�������q�.C�pY|�Z�ACwK��Wyl1�n���&����2�8�_���`z��6��4����LK|&������)�$�[�{��.�\�l:�6S�`��%�AO7�pw��vS�����E��#l�<�M������a6�D���O�.H}hhcJ�.����|����a	m�TA����6�-��`0;+~t�oh@I~�u������]�=,�=`l-�\���V�����{��H�����J��a���s���E��a��}�}kp��=`h5�^�����
�V.����W�nk�m��c���.������flG
����]��Oui����`�J����=a�9X���k��Q����l��>���4�(	vU<��L"�4����cv7U��L	[�K_iH�(��@�'�&�-�mXt���6�/��O�O=�s������e�Fk�n��Z4Uw�|w%��R�zd�n����a�y���K�!���H�	`xR����2+Kx��
��o$��_(������%���EC��aEk��G5]��[���R�.\O,�M/_AW�h�g=`�I�/3
����.��M�������5�a�$�4�x�������-4��
P�!���`a�8PZ�1�Ws�{��+L�\tv>������E��ob��(�qxo�W��+��M4�0�-CV�����a�%�v7U�l��ZR��,������f.L(fc����cf+�`�U����=�����`�����~��<XZ��T�������Z��mK���-�������(,b�����EC�����w��tZ6VR�F_�H�r�Q��WlKA��]^ �{��=��2�)���i�����PVV�d9�b���=���D��h��H,������?L���mZ6<�;.B��g����d2��/�5\#(6_���;E�wK��Dp�ax���X���l�9<-�=Y�E���Wm�_dz����),�`�M+pOz�Z��7t����|b[z�wS�I����B����dI��+��%�a/��A�GN��n�>n��Y���`�u/v2o��\��6�g=�F,����B�.��x�=��9����-,�U�d�/�������d�c�_?;�sT���'��8�i��2�0�Z4l
-�0�M�����Ylh^��K���%���DwV��+7 �pO��3�<?b��+��S�b	K�;�;�d�g
�����Ia����*��w��2N�ROV�(��m�S	w
K�[��=-i=�$��N��h`B��]��
�2����pAC#�V
6\�`YXJ�d��W�nym�B[<h�������_�������*���j�f�B�:���b
Y�{B[Q4&�6�<;g_�}��,���8>���h�� ��B����6�t�E{��{�+��V:�px>$���Z����b;�	���w�k[��j����~���Z����^�� 
�e�����%��-����}�����-�Mk�O�l���M�7���v�APIp���)n��3�'���� A�0�#�����7�����
,�>�r'���[��������U���^��p��pa$�
W��������9������.����z7�-h4}�c�����
����3���*��k:��L��#�}O��1��������e* Bi�3��Iy�*���Ln�4���������F[�ivKd�
Z^Ag5��p��`�Z
��8�y�P�y�\������/ah��������W���c�|b����m!�U	6Z������Ph�,L���������R}$���'�G
���^0�X��7�.�QOkJO�$z��o7���GJ��,{C��XhXH���YvZ�zBKO4����Xe���[���������������+�m x=	��	(��%�M��h�B/���������Ya�D6d`�^�
F�4���A��cZ�9���
'���]0�?X����)J�["A�^��3�*KT:I+��j
�xA���JWR>-�����N,M1��3;�4.�Xb�
=��E��x���p��@3-��@3��K����
f��6F�'h���7������'�t�D6���h���G������d�����o7��	��
��+����cFZ�_�J����POO�
�&��*�c8�]��%�-�1�������Q�!�R�/�Uk7-�=a�h�|{vA�����q�*,��]H��=!��,�`iVX�o��=��'&�$��|�`a�^��2����W�%���~��.�@/���H��)m�A�p��n�b���[�
�7�sv����i��P�������jc&��ce��4���[���+�4��Oh���mb�#!X��+~���/���a���+$q����"�����S�=g�rZ"4�BN%N�w'XZm#���dm��5���M�S���f�9[�s[}2yt�4)���G�L��U�����$b�"�������5$�am�T�n^1.�i:��k�Bw�i�t����94l�mL�lA�Z�|B�����0�r
,4�%r�*CvKd�
����b�0X����Y���7>��'NUl��j�rZ��;������O��0F��.����	k���|l/���e���!�C��RB^�ku�	O��L<
v�0���IF7<vKdKVJM����^�n��;�j[����f�	�R�����.
�JJ�����oWA�H[�^"4nE@����Yw8\X��PVj�������
���&��5�����i\�6�^�}E��Z��U�>��/������Y����>2����eQx4
3e�.&$6�W�=���Df���������.�[��E��=�T���l�C��:{>;.,/�YK��7SZ�����=�����yy8Z�l��P,�%v������n���� ��mL�Jl.��=��c�_SZ����������=�<���!6�wS]�*��"H
?�p�.��"���l��/v�����Z����@��num��������Gf^f�0�N���%�����E�����b��q�����T\�!6� ��(��++dc�UI�.�����~1�_x�K_�V�a���`1o�ihE_�u�����������)~��6�X��L�X��U��6��2K���SHe������L���pP���_�bC�/4[r$�_�����_��$����(���r�(�,z���Xh���W���S����G�?�u6�#�M��<o��m�`a���\BQ���y��^�I�-k��o��j�����6xjJ?z:��O\����^,��liym.�S3�<�9���������Q���,���
�����vh���L�|�����6�4�
�����J,����5����YQ�p85��/���Z��������Y�X(�#�b�#b�
�n�l/2��w��pY��(�7+�;�]�N	����G�4��V|g�k�/B�7�G6_!d������f����Z\e���r�D_��G,K�]�P�Dlz�(��^F���P�9K}��s!%i�U��l����}�0��	�:K�U���^a�bT�W
������P����T�~�7e����ntU�E��S�����r���6Agw�n8�@/�y��
����-�
oDC�n�P E��%��>LM�PM�����
�	.P�������`���n�l�h~�4��6n������{J[@�m�<� �~��,l	#��Z��Qb�&���[��-���v�b�k���K�[]�?�Q�hX,�M7��Tm:���h��.��L,�"#�PF�����?�fSm���t�&���)m��<���mX�N(�+�*��;+,x�
��]�.����`��|�rk���G�XRvU�|��a�xl�YTx7��=h�����n8�]��]h�,��`@^��0�v������uXi#�������no�C�������@��)-�����+��}�+�h7S��0�t��e��A�p���'�9{��P��e
����Dwh*{�m�����
�=2��5n%m��t��u���,���Z��4������`��>^��,�@�+�r�_�8��z.��/���V��V�GV�_0A)�	s��V�-V��)g���wU�����M�',���U��S�^0����}�s������`��]0l,���0����?Z���M�:���a����`th��������D_0+A#��n�6���4�v� �h��������a����5��}`��X����+�
k�/���Zg�e}�+���"�l�q������u4��FBx��'M����`;@��r6�k���l�rt�Q��78�Z'������z9�����v�@2UKVpYX�}�_S��lO�W�;���`j�T�I��a�������~���jk&$��SU���Tm@���n#�o�:����b+�d�����T��k
.�,�
��S���V��I����1ra���`s������X��=:�J��������.����`aw-������rw�k�&Ag}��p�E��CB���R#�#0��3k��%���Yw�k�	��M7<H�m��wi�
�%A_0�+�\c����6�3]0g�d�`�Y��ul�(-Y�z��{I;��{IJ���R�t�]�!VE���sFo�V�O-���gc�+��&�e-���/$���>��F��?5��o������&~������^^^pT���8����'���`����������X�j���>^^��<���#�$��.E��|��p�/lU�c]���~�CbD���-�yy�Y�MJ��?��`�{������%�^"���R�;����q�{�����#��~�8N�`z����LX��^D:����1�����YR��������\6��#�G7���(u��Y�h�����
���a����F��4��%1�{���{������F������l���M���w��(������=.
�6����H��?����l�6c�=U���K
�~,�������r��v=����m�R��}|��<g����E2l~4]!ICW~[O$�G�_�n�1D��G?���Ds���m��o���}9gQ��Y�w�:�|���m�����h���O�su����)�n�l��=�CG*��k�����]��n�]D��G�R�{^q�m'R)��Q.���rb���"���$�������t�~l�B���V	3�G���n8[Dv�G�Wg~U=���$���,�y����z�"Y.?eh��V��?6��3X��$���6�{��24g����2�-�->K���v��"�?zV��������XX$��p��@���8'�����.gQ�������q�����Y���=Aw5�*����U��l���9�����u��G�8����
����������N�I������l�����+���&Q������	Ij��
�X���z����q��|�'��p8e�V����A������aDC��Di�kS��N�et�n��B/��`����8�1����?�]�6�,�cQ�����;�`k��F��?	G��\@�{L["0A@"�����������9A�a���	�����E2��0kV�������fS�T%���d���I�b~�����f�����l{����')�����a7UA��n�����>I������9�bK��>�)4��i`f�:�����M�X1��0t+^q<2F[
�����1L���/\ i*2s�'�YT�������a
��$;|����T�n��Qy����j�d1�`��7=^�W��nym�*I%��7\|`a�D�f�5�'<�F9�/z�da�LD�~,
�K�XK��mX��x�p'Z����Q�]�����lg�@F�����a�eW�Q�y��~�`[J
�-��L��tK~��p����4M^6+����{J[^���G��9��XW*�1D2�G���.� |��=�`
w[OD�G��P����ZN��k<.��W�n�lE��wz��D��GW����H����3�;���k������7�SZWA7���� f
��+>�������v��C�bS���)m�3]B��}y�\��<�I�xs��Vx���/4{�:3�����]?�&]?v$��ny}�C��{B���76PX�
����*)V�&L%
zV*���G�J2���`6�f
��������,���C��tV��
g������s=��N�HN���%����VI��"�%�A4Rj�����,���M96�%�!B��t%y����S�|w.;
t@{Tl�vp�v����s��s)��X�s�q���+Z��v���V9.��	�4�f������!:�?�+����f�]�Y_>���4-eX*x������}���f\>���Y�0kC���B,��-�\�o�d�+�k3�A��{?���n����SI��qk�l�j
iC?N�H������{L�^�}���9&��Z0���'h�������	�^�50�5-~��|�e��}���D�+���	D�9c8��'K;C�f��/�3_,;@��B�b����e��9b�B�W� ������Pl.Z�=�����*���1����/}�%�S���.�T�:nJ����� z1\l�/�,�X,L�����-o����+���=#���v��D���2(��1�,���fG��9;X��,��{�����YT��#PV*g'S�1K������^^���nGbo�^�$���c.?&��\,`.;_��#����,Q,j^�c�������/�#.���:���vYP��[����KkQh�&�_��������c�����^`��%M���:��6%g���������}f��n/x����z������8\/��]I�
D_,�Blc�6�Y����@&.�X����E5����n�l��:.��+�v��*�E���+��ba��un
}6�����$X�wi\�{CK3�Q���,�}��[��;����,�~g��������B��;t�H��evx\h$JR:9hvKd���U/K;�7����wS����A�[�9��i}���ts�+�3�v�k����ES�]��,���4�Y#c����-4��,e}1)k�����oc��bs���c����[��n�3�����8q�V�V������*�
%(���__�D���R�<�Bj�e���~��W'mV��q+�{p�PC��P�rY����+	p����p�����i�<��Q��$�v�i��A��g��t/f'���������*������j�E��m8uGlg�;�I�]�\�-�mMV�,�������p�T
Z4X#��qCi��],F�;Q��L���d:.k�_��%}u�~T������2mT�O�qw�k{fb=�����>�`WA/��:�M��_BQ����B���Z��^V����Y�����la�6�-%������Xd�M��s'X�����2��d/k�_0H���b�������:UvKd[&�I�� �xYO�bz��Y����nv1��3�t���;x��;�������OC��(&\X���������X�z,�;�-�9�/+�����p���N����s������
�l��*���=`4G
���l�F��M1���f�W����$%z���Y��.�������>�O�s�W�O�&�������?Hx�k9����V����a7����l�
��/�3t��}Mk�_0� hj/4��c�?|��+%�������b����+���/�?�=,���|������E������S:�4���t��p3����9��b���Z$��'A����J:�����]����-V���eaw���4�]�e��b;t����["����L44�$F-j�����`a�<�^)��=-����������������x�U\��t�%�/�
z��~�#���������LN6+^�����X�)PlO.����x�"A/zVG����-�Z�j4��+�3����s��K&��}�cJ���6'�����l�B3F�p?�W���4��^�-��(�g]��,e�]+��}��}a-L���m��W�������,�X(��q"X��/xnM�	4r�XvS�������l��\������&�X�.��8�-I1Iz�%�/K�_��f��3�*ox'vB?��8E|6Kda���A��@#������`������������(!��Tm��2���D%dH��
;�e�iJ������n��'���h*�6_���Y��$X����vb���/����{t��0X"��:����:��&v����`pR4�K�Eb+����`�v�
k��{<�������F���"���`G�����4�.'-���2�0aa����n:P�-�t������?������:��Z�*I�np����q���}���i;��*�A_�����["P0Z�Ti��u	��8�Xx���������K��1��sx7U0+[4��^����$�����["#L�_��'|��Ez��-�_����k��6����h�������8K
7�,(����� k�!<�f���T
'!��h�PEA�
&��vY��h8���B��1z���y�e!D����r�U��������m�!?.|u�u�$v7��3E���/w7�����k�E��fU��T���l/��9�<2K^�{����1�7�D�U����??�nk��,�)z�$-�Lwd�vF��'��%Z^"8��uwb����}R	����j�����b+����m���N��zy�YX�+�1���7���oV�*���GH,�0
<I�
?oK��,L$z1��Y��.���e����;���>��
c�B���Up�������;�{�
��	 �1�3��\�E�o������p����V4lY#v��\���{L[���	��?��Tm�1����*6����X�P,�.M��fu-��D������}O�N��b�Qn���|$��Q+J����&�r-���p��6�YU�hx��d��Bqr�:?~�UX]��LLt:Ew��Z���d/���,1�l�N�v�j��o@�s�m}�J]4]���0�.V���h.O�-�mE�6���	���Vqs[	�f��9Y����)�Dm��[�p'P���a��������>��3u#�)�l7S[?,&)�f�q��e��}�=L,�	�
��o+�����p7m�.t��V����z[@JO�n0�*}x�I@��w������E?���o&Bb��#����G3|�)����I��{���7-�a���G����V����������!�u�9�)B��`Yf�W��u`���e|����g��UbKf�U�o��.���6�fs�����J�h�wT�����4���`���pa�T�@^���a2ba�,�:���=K�Vd�o����-�����
g[���i�ba�!�������o�Z!�2��x
�^�����M���f�s,]"���?�~U��Z������D���kg���f�������o�x*v���`iR������e��1")mx�i���kKi���$)m�]kd�D!�T�XZJ��vs�����������`����i�����{'ii������]A�-i}3Ik�Y�c7��	���?l�12����Yl���V�6���-BW(�1�j�T�?���4c�D���^��I�Y�7�������~�D�����mn�E�:��;��DO\��Y�;77>N2�0H��o�f]�o���
�$E���Q��
u��%�o�,5��$K���L7E�J	���#A7��^5��K�Xx������[^[�LJ[t~��Yz��-\v-�}�����;���Yx���jU�?��g�����R�2����f�M�	-T�w�|0X(�����6u!�U�����T�E�������CBs��-��.D�,h}���d���/�	�)�����[�v���H�n8�0�/Y��iii�[Qt�����9w���Y�}���vx6��1�9��������	AOx�t��
� �>���R�Yp�p�����`7�X��+���R,����WHa��	b%�\�{8\$��Os}5�9g/X|�qN'i�������
����g]8,h
��L�s^_��n��	�8�hZ0,,P��64�-,��X�44��V~J@0�w*�2bJ�>A����`[%'�z�7�
��[��f���g���m�����p�� �9��ku~�����f�f��Ft�b��,�

���)���Z�9����[����b/��$}g�
�q+I*�w���E���0m��^'�^p�������)x.�^�-�|C9�����8giI��J��"�7iM��b+�K�a�*���-xL��^�#���C�
�7�����5�C���V��������'���e7U�t�S;LxZ��L��0
�7����,f�>��}���4K>�Y��c
�s����m�:.���-vc�ba4IlV��-���E[��l��{<|��`g�o�O!�X��a9��x��b�Gl���=f�c��J���9w�N-�8;�Z�b�|b��Q�(��?LxX�d3ba���e~g��<�J���O����'����[�<�Z����0�`�0eZ�,����>����zB/�e��p<����X���S����X��U�bq���n�l������`���9;�YlN��-�M �<
o�b<���7��Qg!��0T
E��2i�|�,��[ ������	��0��[���^,���
[Y]����Nt���k|���^����y[A���R2�B�W�����VS,����%l/4�{���0�PD�#���|�m�2�9k�l����Y+��E�J�[�����c�d��)��/�����M����>�&��/�[�!l,Bgk�����D���U������8���"�������E��O���^�`��bW�/���KMI��&�X�*����=	�V6��L�W�#'���h�>LPW��&���1jE����Q���:-t�j\Vn�������u�> �������bs#��S�a�`�'�9�o�l���`+3[H~{���,��������Z3�X������T R���{�ik�-��6�\$v���%�����V���V+Y�
�*�5�s���pay��k�nkb����c���C��U���"��]I�~,�K=������^X����{��|�K%����w�k�)}���������oA_LhR�����2e]����>_�w�k3�N5�����c`z����H"���B�4�����V2��nE��QfY�����k�Bm%�9��w�k��I*��� ��d'�u*#�=�MV,�����G�U�Z{��GB����0� J���5�BC����|
�����^�~��t�v?ga������`������������s��HX��n����)��p�Z��ai3 �\�	�~����D�ny���6��l�!�-�
(�|%>���l:g�Jj�O��V��[�X���	����������aiM\��Y�
�6�]0�$X�
+-����-��	��+:�����M7��K�$��>�q4����*��~+����3+������;P�9�{H��0�&����PH�V<j�L}`�j��nb��+P���\�W�T���ZE/&�&J���wp=1L���>3[L�Htg�
gk��"��K+�H���������b%�������1I�~LK���~��eK���4���b�<lg:b'4g�-}���}�(�N���jdZ`��i��6�`d8�lp������U1,,������p�c�<��]����bK��}`�hh����Hl��f9��c����������0�Ml%�z�L�R�+�x�y}`m�fa\Q,L�vU���}��Q��:4���7X��j��^v$��nymA1A]���j7]��X���|M����@�0,t{����
�������h�J&���+��%uXq�S�F�}%��n8#LR�4,���K����mZ6F�,��_s~y�wS�Q�AS��I�w��^�5.}���|q-��3Zb���
��}^l�*��c�	�AH�%�U�-=�mh�-�0�5�l����mh<����Y��,��	���`GEc���,��Ur7,�0�`�^k����biUg�4%+���V�������w��t�3�T�}@�R�cU,��X2�j	zA�u��s�`�\��"fk4?�"$�fh)���R�,iC�N��Y�!;��$�
�1���a)���������q5�%�_\=���#�Q���_&w,:����,�<��
�U��0:��'�f�Mb/f��q�}��E�_&�,z����������*6����p����[�^}���c�����0�9���F��$`���N?o��Ze97<.�����<|���7�g���9TD���_�`�x���|��`����~Y
���<lb��Bl�<������Ew�c���v���P$?G4l����V��:m��J�n8[^,�F4��%��b�b���i�cjWHv��@�������'VQ':��,�G]�x��i��+�h��-o���<_�B5B�0������6_��y�b��[^[O�@W��7\����&H���q�
lK��fy-�k����/�i$��V�V��Yu����k���e����e�K�;���%�_�U(�	�eE b����J�/+z=�h�X((��5��#R	����T����H����s�����jK��Aw�g�t���2����R�������u�RqE/V��4�������}��&Kc����YhV�M��0�+�$�J���$YiE��0.��������_�g-�f�(bt�����~�pN�����9k�l��TRMhg���t���=��ThQ[�N5�
�m���a#m�
����D
����{L��L
[t%{��44�N��+�� ����mEj��KW�b�XW�e��������Tmz��X���a>�B1�P�[l+H-��w~�u,h��J,t%
��S������$��	�8����v��()������_�	z�{r���l������B�T�fu-�M�AC����|\�t�9�l�`�B�k���	����bQ,�{�����U����g����"j��v�`a�L������ACy6���Ml���`��W��������������^B�6�*]�pk�4;�0��	��`/�{yw?�[(~-	��|���c��_W�s�n�C�����,b�2{��P&�Z����A/�4�0;|�0��mr���n����Y�9z-��2�?�3�v�������������v����4�vmwk��L[]����`{:2wS���j�Dw(����NV�%�^�5�tT����vJ\��������Dwx�v��^�/��.��lEE�� ��!A������/��]��~�T�B��}������U������A;�*�pcW��J,��VWYQ�i��B:�]��Oi;��E���V�t���M$X�<C��|f���5:��z�BQB�������W�������Wp���T����A���/v����OA�,��p>�aX\���7����3�Q{-�N/�]�V�W%s.Q����fO�<�%��$�M���j��`}�����Mz3��_&	)�N!��p>��R��oib����Dv��3�IP��-��^��&yu�YJ"���T�]A����
�s&��?�oKn�R�m���
�3�U�����N���1}8C[0�\[���$���{����C7��%�����P
C)�B�[�0�pH������fq-����~�
����}u��M��+��J��rY�u�t8����Jp�b�/tF�����X���
�B����R�`/�@��+�3+;�0ek��'\�HZ�7�`������Y��p���s�f��s��	Iz���*�/� }��4��%�"~x���q�J����_&�-���^F$�]�TX����H�
�����M����vW
���M}.A�@���+U��~�HO��6id�!���`!���p8�hN������=`�G��l���p�
����`W%��:�/�/���_uX|����+.�o���m��d)!~d��n����jZ����_X#�T��Y�����FV��������6,���7�.��&��]d���#K�
��M��,��B����/�}�
!X(���W������������p�a~��J2w��6��f��l��+�v�y�1��#:;��Y�� �d�����
���-��5�v���������6�����YA;���j���t��vcE���4�n�����.�a�h�pMc�,�+v�����������qF��������n��:�0�Pt�d8ga[W���C��
1�f�����/�k^�u���wio�����s���Kk9i�x�e<w��Xg^<�/��,EZ,����\Tl�Z��u�;.�L��Q�J������`qi�7�R;��B��oB�����'�lv�k��~,�9�����,K������6�"�b�������?�P���#=��"�{����M���x4�2��V�$��f����b��u����nLC[4��
E�=l�f�Y�����V%0����Y����Z>�����-�7�h7�"�����>f�9Y��o���g-�)pZ��+���u����Q`Yy���������nym 3G�h����54��f
�Y����n�l��k@��#l4(��v��c�N�g��P+��f�
�A?L{�#C�_����[(@m��n,_]4��I��n@��.��wn��-�m��VL�3S�r�t�=�e�}
U���Yy�p8���
��.B����c��ai��a����vS��*�E����f����|E&'�3�Z���8��rc"���Q�2�^0� �QWkYnL�O��&p��9goV1!6�Xv+d3���A�|u�������j�
Z\A/h�H::,�X\(Hj���	D�t��
g��/�z���+X����BC&�^���,��`($��%����,���q+�������`\>���q�}��+��8�-�
(��
:���^��������]��i�����.����{t�O�r����m0������N&k)6g���6���w��i4,�M/}��'�j]��tmEwx��&.4��g�9{�O�Z�7��6h�HP��Jba���M�p�M����Dm����������
C�AS3V,�h��E���AR��?~���z���`���X�@,,�����G�\�-.K�A��,��6����u"���y���>�9�v�D>����-��)Q��F`�����������]]��I���>>�a��e��H#�6Xj��-������������Dg��n8����UeZ�eZ���u�w��P������l��}��+��
z���`o�
W��G��9[Qo������',^�.mz�vS�5�4^E����}��-�<��@�h(�$vTRg,.Kow�������qa��O\Y"[LW���Dma�N�w�M������7���e��
��`a�9�,,�Tf�q�g���B��%�W��t'�`"�P��iF'�5[M�Y��dM����}��
��'}�������������]��TUd������B��z�
���Y����pVn�S4l�����:%�����-<�`�_�P�\,
%�����V_Lys*�k��N�����9�p������
����������i��+P��=$S�1�15.|���pY��1}g�t{K��7y�p;i_U��qS��nym�1mh�P�O��hfY��At�����|�X?-F~5�J���s9��pi��/Hx����j�Z�s%����I?���x��K���
�������Mu �,
kr4n���=��\�l'��*�+K7�,-���C����n�����t��Z.����4L%��p���veym�Bs(���d7��>X�!���v��1.����4<�$j��������A_�n��r�
����>\,�5�Z	lK"fB{�����r�������pPs����Z��i5���
�����m_aX�������{u�%�;�������p��C{�hv
����aYm��\�v������s�����b�����,>>g��Xl;�-�����)kN5���z$v�����U����r��'}�����W	�h�5[�����;��
O^�PZ,�2����
u��A��~g���/Q��4bb������ZE�b����[z<�=.�m)mu7��p�U�}a�X[	`wKqw&�-������������h�E��BFY���Q
�V��L�D��+�s��}
�~���a�n�sWG��vg%^�/�&�C���$`j��o�4��^������\�U��lO�B&��~��K�r7U�,�!�r��h�{��e�
����bE�#k}�K9ga���������k���i�,�Q4T�{17���e_������������������vw_�=�g
m�`+��5�;��H��}g���c��2�K��-a7�-x�]������������a���	����,�!�*�Rv����h(R(�I:�����`�,����k��X���k����b%��I	�.��twV�-z�/X�]KC�`�[��3�b�O�n��pg���a���}�=��0���`g�g\�pqg)V����b�b+��U����paP�+�X��>a���v�A��W6l Vk(���4.�9j��������������c�OA��[ �C�c�� /�-��}E���bs:�9��v�i;�)&���%t+wV�'��W�`�l�����x�,-Ql�i6�k����8E�q�W%i�eX�,z�d�������{�dr�����a������^�����a����{7�O�`���j�p1u�Y��`[}8�bN�JF�u|ak7�Yx7�Xx�y��(�9�X5�g��v������^0���_���,l�e��>��n�a��M�UPx����`�����`�?�OA��[���R�W�����I��|E�p�
����-�K����q����MW��c������T��'��H��������2�O����/TD}CD�_[�9[�Z��pN�z����wS��c�M�c��J�f�Er��%�V�� �L�At��`�C�q�������'�Y^�&w�k��q��������b�H�n�l��%h��j`x�����rAi�[���~`nCW�lv���CNO�k���	c�����E�U�n�����E��\�r8X':�~9��t�z��n���[��6�BA>�9�vKd�
V�u���S��a�����D����g�D6����|A�
g
�^�`��+ZR`Z��3�Q���;�%wp	�W�:�����k
E
�^�,�d���7P���T�Dw�W�n8��L'Z�/��j����a�E���`��3|y^�h���3�[	�[(�C/R�7�H��R
c��C�0��Z[����9�I��
3������m7�v��)����A�a�E�Y�n7�:xhH��NUi��]P
%�Y9�,���(��?�pc��GW�s4K�����+tw
�����u���
v@�F�����;��H�3K��4k��.���]}�n��N%o|��0�hJ����V�� ���>e������|�w��v+d�	�`}��
�J��Z��p����:�h��*�vS���qA���FN)'��Z���A��.��5�������X��\��,�K���h*K%%��������	CuAO��[	DY����&�[p�Y���������(�*����z���g	�
a��BE�`��������t�p�Z�7G!��_�T��l�@����J����D�7���
�M$����,*
X���Fi�B8X*$�*{CG��x5c�������b�bov��-���R��=��h��c%4b���F���J�a9����Eg���p��C��h��D�I�
5��
�DC�Y�b	Cba�������%j^"8�@�	#�U�z��`��T�`i��a����v7�������(���uO�=
�b[
����<U��.\x.6/����z\����-��
k�f4�����Y(&�����(O����aX4K43zd��!������b�t$�������m�v��b���KR���}7U�@,aQ4��m������9
u���^W����������������1�-;XH�4����Y~����J��}������m6xR_��5,��v�^���_���Tm�� ���~�12}���b��7evn��������pAWd>�b�t
{��e�*bo����]*�)�����>A���@l�����,�!�������Tm��k��i�c�5��aY[�JK�C���;���������b���nym�@�P��,�@lK��n��
���i��$.�\��	w���-�em+��*v��iau��Uy,;�D�hh�:+h���
�S�25@�w��wO����4������+�D}1�/�P����X��1}6��)�P�Y�}L�L�6I�j��%SC}�=+X��/e�s6�V����:<��~`�$X��+\��U���J��:���n�����j���	�f�*��.&Q2�L����o[`�k�e9��{����?g�C��-l����0K��y���G��t�T��V$z�� �+����j�
��^	��E��o�>���[a�mT�r
:�����HW&l������m��;N�������
�8�s�Jl�/Ah���/����;��4+b�e�������.��b�7	��1��zRFJ
��������%x����������.�^�v�x�n�lM0�H���l�GC�s��A7
[�Vpi7n�%�P�?,8�� G{x&W�^��ej:F+Y��*���D�<0��s�������F�`���s���p�C`�]������������,t	��D��\�r:�v�k����bpb/���/y��c������o�^mr� ���
�fe�b��Y��jk����g0Z��8,H;� ��,���G3�����%Y�u�7T���l�F�M�g4"{����]a�J���n>"�L#D��`s���T}�����a�X���%l�����["����7�����
���������+����o�*����0GZ4�V�j���]��.'"�fCi�Jn�%V�i���N#T��YLV�<+���``��\/K�������f�����o���0v�V$���]�v��N��F�$)�7v�i#�����)���l�@c�����=��^���5e�}��a��X��9�(�Kl���1�tpE��~�7L}v��O:(������V�ui,Q4�m{��w7U[P��m~&O���%�4A���9{��`+f�Uts�������,XWv0]Y�7�7�@��� 
;,
;��/h��/v������py���/`<o��-��p������x���+��eJ`bs�num��oe�.[OLU�t%vee��0��
b��k����Eei�h�w*��
�C�A��R:�lI�M.���Rwgy����������[I���k����,,��j���X��x��*]w�k�����N�`o�o��?��U@~��T�[^�l�2��,��-t�������w
�c�_�j�q�I�["1�t_U%��l�@���a;�T3��m2gw�i�����Kq��Wqk��d���Yy�h8�h�7����^�(�wL��K��N\��`?M��N�
3����������B���[h6-J;�(�h�����w3}=S�������5�_^#�b�y���Xlg9bW�����{y�#�9q��,Yl�fd%��n��W�!��3�,l�en�k�����
���?������pm�!_�X���[����S]_a�s�c���$Lk�B5I��H���	�b4�.u������v�k���M�d��l'����Xz�G��b��U���,5Ll/�<O��N&�k�9���w��gZ�w��#�<��������z���p������6�^`s��1miBsQ"�,q\,���
���J�P�^4�{�D$�[h;=��;��3��_xZ�w��V���,L+��_d����&��"����h���vx��X"���5�	����'�":k������b�a N,��Y
���{�x��'��e�b��o���cX���E�����~�4���bYrx2��y�.�b�=e7U�1,'Z��ba����	�,� L���P���Yhg�������C�J�����4�����v�� �����lU���"t�
��vz&[yL�3Ox���2���bKl�i�=�m/�	���w�s�.�LK;�D���"����@4l��j�bo��?�pG���'�H������1�9*�����6�����/�[<-F=��_��,�MlvB��jk��BO;W~[^LrM4t�>j7�k���B����u�'�'����p6bXq�����^LH��^�`s�f�,u<Y�����Q��Y��5������\����X���t�j���\P�*�mN�3C�d���O�-�`;�nIF���y��������/x6U�=nA�cZz2]h�������k'�^�nY��^EC+A���bY,�}�U������������M���,X4���B��;���u�-�M�����T�jx��gZ,�Nb��ql%��b������������	R�?C���Q+Qi��+����� �����	 ��7��Tm?�,��a������V(�����tU#f�v��J�d���j��["�@0�;����I]�������������n��&�uQ4��H���[�"{b/��G����o���}8\8�`�E���j���?3�H+�-/V=<-I
��`�s'�Nw��kwd�	:��.��-�=���\�{���[�#������e��WV��1��`��1m=��I������F`���	r8\��`S��	
�m��s��SK_4}i_^�"�rv���[w+d�	�)������[��^��6�Vu�M�,�`i�`����4�t>a�r����J:�L��S���g7�v��*���{;�]�6��������,��'�O
��0���!�+����?�����A7x5�{����%�{LOL�Ot����9��
�b��O�S������~5)���`(�����a���o����_.�rX�7�Wn�n�l����5q�i��	=�A�lB
��%r��-�Z�|2�r�L
���n~}����t=M=����O�,[��k�Y"��O��7�1���z\��jsF��~��5����]�6��U�5m����)�v�J��R5k�&��j	�%����$�^����>�>��P9�����&��:L���;t��w�����b���b��}��v7U�@�8�W��������+���awU�����|��M�6�}A���<e@,����u+�Imo��6���eh��j*s�|��H���%�&�idx	6{�v�i��I�����u}�X�Yhz-5�-��g�	���)�^I���tN1?g��$�R�Z���r8������j�^?�U^q�[o|����'�2�M��(����
g���o��+}�oS�����u�s?�����oK�@�����A�?���bQ���R�vv��L�e��T�E?�B���p��"k��L @h3�=����?��#Vb�p�Y��o�9C~�������i~8\dl�3R,�N��iUba������6�.|����0C�����e�q>����v����p��;�N�e�p���c����J�%^"������s���m�Z�V,��}O�.��#7>����.[�`,�w/]
�]�D<������~��p�����4���^��Lm*��L���8��L��l�����"�=�N)ah�;������s���,f��Y4�`����b����2���B��em�V#����.��,�`/x�$ 	_��%z���
 ��*z��$F.�/�QC�����BJ���q������%BJ�.$�����y8\�")���r�x7����3���j����K4������X�o�q���J���EC%+�0�X,��'fiK~��T���be������xX�� �b��bs��num�1�o�0��7re�����[���T�cV�9Z�f���+����a�wY���(�k��^��(i�����F����;�	9*,1Yl���Y"K4/� �^���=wS�1�2D��C�0[@���`����������+o��H��|�����`�5����z��v��b�S�,Y,,�
����i�Ot��hq�d>-BC,9B�U�OX<^,cZtn��,tj=�t
�I�,�ElE{cYzxA��$��Q 	`��>�7�i���r�D?LAJ,l`,v���e����c	`��4����e-b�y�{L��It�o�*p8��w�i���A�$���;�V��S)���M�����r.��f�������r�BC��_�,v��^��[��}�����Y���%�}
E�������N���p\]p7��j�]�
�Cz����M�������/��B��e�T(�"�K7�`�B��e�T(E+�z$��y�bs}ta�������)���W���������h�6R�f�Io�P4�,���&�kE���z���j;b���Xjh��i0>-�.���!	�BCK�tQ�C>nN��-�m%
��>�&���_�������cJ,�Pj���&�T����k�����j�9N={�����?��!�A�&����ncr��Y����9a����ZEg���p6d�l�hZ6!�������E#xs�N���Tm�0
R�L���\�4l�0Q�
���Z(��j|5W�=�-
�A*���\�L6�(��{�]$���f�U��]4�?��p^_���E���d(4N]V\]pG��j*��
g{�*�
���^0{T,�V���>�@K��?�fA��=��v�
�z�B��e��?jI�B}�����ZyX�k������i���l;1y3�����K�:��Jm�`iZQ�4e�X�
��j�u,����Hk�����;���iAeY�t�C)��s�f�B�J�������l�����z�����,�,�����VL��"���]����TG`�UJC�������)m�!��u�.&1%�a:e�������A��.��\�A��P��R��WU���
�r���A�|�`T���s�j��[�hz+����~�y$u�es�����^)��O%���hY��0�l+���aD �^�@��j��>������|�T�maU��Jk�:��G,���b�����rRLeP����9;+�(V[�}$DXh���j�I!6e"����"����.��p6�`���V������I%{
�	����e��\3~8\�q`��Rc�Iv�C��V��64������l��M��3���`�T��s�Y�����>;��.��
�BK������������%��?4����f/d>���6v�y�1����������lG��o�����%"/���<��x<y�Mwd�e�D�
%@��z��\���zy���)���J��^H��lmOh^"�}E�%1�����c��g�'n�D�K��T��lCi/fs��9{�KV���>f8�P������~�F"f;�����N���N//�6%��(j�P��o��ya��{@��K��\���:U��w��DQr�e~���_���rw�ikI���Q-�Y�;e����X���5w�kK��n��q�%����\����j��e\t5���
s�|g6r���<�.��`��[��8��f�E�L���S��Yz�z�pQv~�����d;M����%'�&}���|B�e��FF�f;rR��L��f�����E���U����W5�~^]���A7x�������-�[i�����g�6c�����>���0f����,��["�O(���D�]f��:�,��{L�1(���W�`Y����/n�����K���S6~�
�#�6�%>��<��`{����P���;���j�U7��Q��Y&l�#e2�O������jA(��l��vS�D��E���>��q�w�x������
7�p}Tg���`Y��o���{>�F����&<��\�2���
�6�`P����vB7�Xh���7x��p���G�|��;�-����J�����6<F��R���l�8����f���Tm@�a���z|����L?�HcB�{f<�4k���eG�����������[���0:Sm���M$ed:K�������>���,�b��q�#���@��cD�g��nymN���}�/�s������������t�y}��<��K�l��u�c��2�^�m0G�l�U�9��@L7T�d6W���js���f��fQ9���"�6��J����{m!Uj�
��^Y"��_2��lA��`3���f��f{%Y���9]A*b��'�����h�J�A���
L�?��	4.<�5.�6-�]86�mTd�������q��|�6F�!+aj��K�	��
=��X�?��6
�����)wa\x\{��1�m���4
��`�X���������������A�
|���`�
I����i,+5;ap2����,/��M>�n:{�����H��)��y�ns�`R��fk�v�n����x.��E$�m��Q�.�����������`�^�=9Yv�i�Z@��7�@������8�%��v��6=�G���Y$���s�J�V�%��O�F�F���tS���T�n�����^}|�]���;C��
vKd�����o�,^���S��8�,H7�3�D�L��04l��t����9;���l>!	U����^9����p���;�������D����y��P���q:l�!�Y�W�.z����.��K
�1��]q�
�0�tA$���V��>����Y�b����PCp�#*��Y�x�B>"��<h&?j�����tu�GO�q�;}��;�t��q7�-[�2�OWxBN�#�����s%���9��o\�N�i��6LA��>GsO����t�IA_�m��\E�Ofh�}�h�������Ou��">d�&*6��A�D�M��z�
x���1t4����)H�{L"��$�C����T�s�������m��b�T��m��N�I�z�����`G%�e���t	5��$P&.n$B+�N����IZ�hd�q��w���{�B6�`\���,]��v����.5�J9������PWCl
h��j�
��M#n��Y��u���l���/h*�,����7,��r8,���SQ�nym�����3�Yxg��x���mLw �����%E��e��$�Mw�����Tmg�(�h��6t�K�k4.�{�b���7�V0��T��ij�e��OR������3�4 t���{%�6�^,�l��uY7�b�����e�s��p���%kf7�����,z�WG~����e9����M�#Z,k�n6[����~L8����m�����D_��`��{�5=�:�I��^"���VjyY��b9��s7�s&4�}����1-�|���^,�X�`�O�:%���G3�J
?�@'3I����~Y��b����y���IVv!:k�������bRyw|83�Z�9����7=��b�Xv�bWo����+���U�((�]VJ�X���E7T��b�o�p����t��-���R'�C�R���Wms��L86X�����aba��[��m��}��W����|��cZ��bY'�+�K���x��e��b����ey��1z8�����,��1
ocRhf�����v��6����_����l����h��)v������^�I��;��E��d���)�Y��k��.v��Z��i}���J���-#nD�� �,�|���s��F��BJ�^�{������	��*&/�C�}������q��w�0�b�bW�Xv�ks�.Q��X�Xz���34q5�B��e�f��-6:��P�n�6�X����I�Ff�f�,;Vhn��[!_�>]tc%�bsw��Tm��k�=�=v���bh��E��h��Bb�e�e�gYc�+����8�����zY�b���'S��k�wS�	�lAW�!�2�/�$��p�F�b4I����+v����|A�����e�e�=lF����K���&������}8\��
��l}��tNY<g[%S���
����*��?�0i�l���9��D_L�I,���Y�����c���9�p�����>0A.�^(����|�+�t�{vV�;�:_0�(�dh�W��0��9�;k3_�^��6�t����5�a9������"�K�	��,,�"�W��u����)�V�VZ�9��!��4i�fj+�A$��������%�����-��,�Lo��f�Fb�
��������X�%�/�n/w8JNEM9S�gU�����e9iX*����`s#�s�A��������U����tn�u8\�Eob�W��#
�3��v&�q���q�>J���5�i�z��Ul��Y�����u���5���hz�6��+�[�%}Y���)�]y���
�1�7���
��`+��.�QS�G������>���������������/�B�[G�����+iZV�����Y�����s�tN[�Q_p���3S�{�B?�0�F�)w�D6���te0�"��"�b�!-Ii��E/�J����ie�����gs8�0n�%iIiz�������p�m�7�����Bl���������I��!����'x�M�C�K�I3���V��\yl�1%k���*����s��]��`���<������y������+��A��*��V��`�K4�����T���������E�;5���I��*�����6Iw��k��R����k@�6�u+>4T�(�]0��$��7<u��H��_��������;K�����l���u�
%]��B�G�O%)�����)����I��m���U�sV����ul���
�-(OOi�.�h��l�x�,�>�^��}G�/$=x�����A-V:�N�k<-����^��Lm+2=x�
�����O*������/&%/:�u|g'<����s(����fy����D��AS��`WR;M���L������=�$��j�������	*z�=�YW�W���Q�-�Mx��gZ���;xxL�����idV���$z���1������WR���~1�t��4>�iq�Y���'��x6E`eR����>��B����XyEK����-�K�OI&�-��?q������B������a����?������tzzL��L�[tO��i8�������Z��ku��oBd����������PJP4��eISFY�����7O+ty��pR�.�����.�~�|�X�xg4y+OO���p�q����,�����w6��9-��%B���]p14p7v�
�b;���m,�DlV<-��� ��
ms���s]����[���p���O#�,t/*�{��/&�aJ�����oz���9�q�0	��G�*T�5�w7V�-z17��Y�h�n�� z�3(��=OS���2�Dx��"p��m���
� �Y�S,^����w�f�n:
c��!iV�n�O$:����|H29k��'�X��Ml������-

5Ka7��):+d���Q������q�?�;�1"	�B�N�vc�5��e$��]�S��uc�����l�v����Jmh��t�������z���
������7�C7:��'�,�����BG���Y��E��U��e 1l�����e�6�g�YTGl��<���S��eH��9M�4U�^�3&:��O��a���a�	�^������1m�4Y�����3|�"�R������m����������w������q+:���
�H��$.7�745
_xi%��>�~:=�m&�,z2})�0\�Y�rq��4�f���D�Egq��p>�Y��h��#�%�:���hy4+<C�7�P�#�0n/$�5�47��������
�A/RW�	;%-]	�ZZ�1U4��p�4�� �F,�:�<2gKOi#F��n�.{~����Zv[!,mY�7�����J�`oA�9_�����`���Z����4l��n�Sz7�[��
�#����-�1n��'VD*zZ#6KZ7&i-������_��p�P�Y���X�-��`�.��n�n0�p�����X��R�j��un��q�����;J��`����)m��W'4r��B���(��@[l���X�1-l��	�X��TlA��Y��A����M-�����X��a����-���.��'z0�5����ec~�T.pZ!{0������!l��l&V�nL��t2N���b�P�S��i4�00�)���Ii�����E?������`���7�U�����M}=24+�}�.������;9�N�k���0����V�]�C,T��a����RwNQ���Z�����hV&6����P�Cl)��
�
^�EC[8X�Fl��O?1;{��P�iym@Acx*����`7�����������5�#=��X��h�Q=p����uc��a��?���������+g6#�b��J�~+�)�	,f
�@�~X��X��jB��Y���7T
a�Nx�����������6.+�6
k�k���Tm�</�������.z�I�~,O1�J���U��py��
�;K;������D��cb&�"�\�������
w��ZA��/���E�Y���`�N�q+���nP�B���v�#_2�0|lnTzZ"��L�[4�����n���bs���
��f���7LV��7���,���`a�RS��Ud�p��4uk���>�����S����J��Z����8��:\B��~���T�I-��~�\qHYW��r��[��;
g�:�M���{1m�����^���H��eZ�B��0�Q���H3�~
�5��-NS�9�T�E�U��,�F��s�EN�i������K?�����5T�iNF�iym�o3��0.~+��P���6	���Vi$��u���Tm���4H���4}EC��~��Z2�������
��$���J+<��+���=���������V�K[1L�Y4��6�.��������Kf���"��u��c�)m�@'`�0 ��q�`wA4�Y�AO�hC�''�i�>����k���"����?�H��b4[h�A�������4�OW�a��v�bXc�q�_^�B���-8%����{�4S�5��������������K4����B���������t�C�d ������s�q��_l/�����;��EOv�^=k�/��K]X��+���������8�2+�,�������n)���{D�L`����K���("0��2���^]��L�3I,����,��q�\�rx�S
�%l��!B��ab��n�����q���
r��h���4{zx��T}g�$��~Z�;9��k���S����X��i4�yNOi�����gC���L2�e�;|�$�]�t�wCEZ�p]�L�S�����gz�������������h��g���{��r��>:���e�Z FZ���!v���%wF�����>��T�hj0]Jm���k������I��f� b7��0K�W"
�oU��7j���d�EOh������� �/I�������(NS�1�B
���W��,��Tm��zO�,p/�U�e=B����*�Ku�~w&8&����xb�)��C$����4SO�1�b�-b�p��o��s�fOKd�	zM���}@=k������n�����q��"����<����aG�'�������ln�rxL�~w&�-�I���p��I�%d�>�\�-Z�f;������k�����9c4�w9����&���52�Wc\�~ v�0���������E��>�����[k��YU���.'���b"w�+m����;[�����LK4�9K�����gBQ}�[|;WL.hV.&�a�f�V�����x�:�rw���Y���	7����4���b��b+:{����)}�d8�����q+���r����Nb���l���@���8����CY�BY�P�5�;���N;�i8�c��b�xW2���zh�a�L�O�.m)l�A�S	�Zv�}���i8�+���T�y��X�<<U���v�Y��644��g��������a+�����Y_A/V���9z�b��:���	�D+���`�&���zb�n��������t���[G�C�{�/+�4�P����[�;���8�j�����`�i��D`xG4��H��U���.��r�[��m=���J~���oQ$�;��+�{�p����p�-�p��
�-=2����vA��[�����t"��>�c	��gi�*/�e�s����
�����i����Z�h��C�A������;LG

�������rHsN�W�%����T��cF��a6������C�J342��4�Vx�������7��/��2aL�8�D����k�D����n(�4w#
}�S��*���'x�z�$Ba��)�d���B�����-�[��3-C�V*��~����
�}���	<�~�1$6-�i������JF�i8�@p�
zT"�V��p�4�Q����Da���*��fa���q�>���5k>��Y��B��`f�h�c,���mt���	��*
�����`�����M����`s���c�~����i�J�PLQ�(��w+w�<lF��k��w6�S����@��-���:M��*b;�;����i��������&V�mu�(�����a��r����:4�*��|���f��s�������4k���q+;���i�����ku��������C����WHrD|�y79��mM(�'O�	v@[s�e���;���wZ^����:4�]
v��7����%q)Z�V���
m~�v������:a�NOOe����a�M=���<�<r�w�}�����`W�!L�
w�"A�\bs��4U��P��ioY��YZ)�����
�w&�-���g��R1��~ba�Ss.���2���#�qx��8�v�����V+�3���a
�L��0�Ej�tT���7j�&���U'�\�{��-M��.��%��G��;TK����������L�w�����i8�|�4;h��6WU���F�m�v��!�ae�,�Thnvz��O�v���&v���4���"H�`�mb����i���1�k.�a�XbkS�=U��X^,K���!-��������^\��#���
�y�<.�{��h���O�;��p��lcv����Q���(s�l��K�k��;X������)�������n�.�i�Q��,��?K��(���n[�l{[c={2?����b���}���ma�,�����,�U���n��f���^������7�1��,��#3��P�^������:���w�G/�a�,��_�Y��'v�7��D�G����M�Q����i2����i����X��I���q��l+d�np3	�O!M����MW5�Tx��
�R�F�T�oK��tZo7��lEg���>��������R;�3m������nAOj�(�
����������7����b�J�g
�o�f��l�3>-��>h���Q�u�ak^�����Z��N��p=�p�=��=ty\����Y���-�<6d�7=h`��EP*���n��]Y"[2L�_�����Lb'�O����������v����7+��F�m���t!�����
�����n�`Y��������|{��N�k���V�n���*�7S#
��Nx��r���(X�m��U�D�u�f�d���R��M��6���"�VA#�v���/����v���%���p	��AB�S��(���ohVH��r�Y��f�P�������{���	�
�xzdvV���n����DXM�hx�R�hn�S���)m�Tr�K��
��o�
�Y��hzG�AONp	��\H��-���K4K�;YZ���6�m
~(w):����������\O��d�� A�����b�����:��,�K��w5�7������:�|���t��3�B��m}(}u[
�!
�����DUK���
������

�?�~��J����7S�}�o��g�o�
��V��y�*/Eo�s$qxh�H�z��}JK�3f�H�Z-��V�7�5���������l��J��$,D/������\�X<ZV��a����aN����]_�.HO�V�������E������9;���W+eF���F�K�Zi���g�����)�A�5�?�daB����mM��N5�����`	a���C�'F�Oi���Z�7��=������LfW�S[��g3t�0�Lz�7���ox�=S��4�m/�~��1$�s�B+<������������g�P����aKl��c9�����p�-	�;���a��b!$`)��	7�~� X�Oa-��Fk���'����|6�`��T+��{n#��x�(x�����D_�����7L�*V��%���w�`�~�w�U�����r���0�Q���%���PY���a���vQ�uYv�0]��p[�
����Q��+AsK��&���)x�/���-�tx��jU��-�~�-k��,Y~��~�J���;X�h+���hgY*�fR��a2�Ph�sb)W��@Y�a0{��-�V;�5k���{��e�����Pu'�VqqY��fb��iMK��M���O�ifQ
��=2|�������)���;���R�f�����,v~�?S4��Q!�����WJ�������ox}�:��� ���n�-	V,�a�#�I��U��t�
%-�`���q����<�����JIf#��������sR,/�X��~�XF��b�Z��>]����~`a��#{���x.��8\h���)�����l����v�i���(������{bK:�MqDS3X�)�~,�tU�F���
/���U���%���M:��Y^��Y;���
��$�N?�����F���H
X���^tK�svV2�,�M�9���Y����<�#�'Q�������a��V�{�`Xt|0S4T8�c�!����9�E/Vh'v3��X��O�N��5/zgE��P�)�.P[0������Utg��bs���2/������Z�-�ay��� �P��#����e�b�'��D�K���$;�~�,LfN4l
'v2�V��O��\~L8���Ba�Y��eB�}�%~Z���G�h�>�.��+x��-�I_�a8�a�T�o��Y��XxW��.	��p{����6�K�>����=n��:-��6"5
_�����;b������`N�k���'D_�j�au����EO�
�����������ve�<5�]���YC<XX�!��%��b�e�^W��W�`+'�U��+=�]��������%i�~X��Gf)�bs���H��%��o'Ao���.}f�;�R���gm5�����akI���5�P�.�ZV�$zZZ��O���l����b����EW�|���e!�4c��U�5�n��v�����4�E/VK`�������V��K,�Bt�������ue��C�"����a�G,��
��a�����D?�.M,K�
U��������s6��
'��T�w�'$�
�!�m,�Y�D$�����W���E���E/Vdh~+������+Q}A��F�N�`7<y�2����a�f��*���`�~���}gW��NKd�����A���.���O������h��.�n'�%�2j!�nM���ZE7�v��2�K_�����"�=X�Yx��6t��]K*���V�4�;�Y����0������N�fs�6�8=�-MV�+��j������RN�i�����,��p����4�������)TxzL[@�`F���Ip��Ka:�*h�
kR��&u%����FD�����X�F�>o�)�*4}��w��F�������,�u
ka�n{���E�e+����Y���!-��6Ia����D���%�����w��>v����-��;��g���>_��������}`r�P�)����������6	��
��U�j�zw�Me���C�"�����4R�.mE6��;�����l15k�-��i8�"���F3����`��f
���Bw�xm~~X]KC��b��@X�/%�vx�����"� �2,+=`>_��I����������c��b5��aD*�E�^���qs���l%��
�w�H]���H
�Z�N���h6E`�����O#C7E��B��sna�q�0	*�O�,V�-�X���~Xc���My������\#E:p���N<oJ�=-��'Xbt�����[bs~��1-f=�B�hZ������}N� �2,�=��h��%�n��v7LJ��6�$j�t$�V��eM�@iw3�4����&������
]�B�"��JXOi�	fs���-��"��LmwA?�*6C��L�[t��ikh.3��0�(�����p����_Z��a]h(],����`���a�Vh0I�
���C;�6��J��I��]]�aug��J&��Q�5��
��uj��W������8��g0��G�����S�T�)A_03E#�H�T�1I3����Z�Q�R�����2�X���o!�������x��;�jiX�b�m����+o��.x�j��i��
s��S�N+dk�����{��~g����J����LvzC%
�������~k�uZ!�0�k����=L�2����Nl������*��ghK���%kh�x��O��f�<�-�4��=x��5?N���a�������4s%������<?��I��H�mP:(�')�������K�����$�\�"mO��(i���4�+Y�x�>�cq����`��o��ZZA��Ci<��R}��3�/��F�d��'3��2����l��c^~L8�W���,��2W����i=��6��6�d�����t�{8�����|#��C�������2����i���{E��kpnz8�2!��<�b;�������'�a���4-���T?�+���SX,,p��[��RO������T�<����E��C!��?��)�!O�����=o����^p�O�O�L�X �#���Tl���4<��)a����?DC7��E�WI�l�����i����D/v���N�q���X�p�%KN�kc�yJD����p66��+�cv1��MI�T�k�,G�4��;�w>3h��Yb�����5-�<Yy���2\�YscO+%������2�m�f^@�bS�i�����a����{g����E�f��>ex�Xz��Yq^X(y2�d�0mK,l(6K�|gg�q��R�di�Y����������,�C{�����'S�6]P��Vw�3�WA�gZ�9�B�8�����f������4lA/pZ����_s5���u4����6�X��,x���
��������������s�����n���iZ�����Ip�Z��i%�����UM��W���}��*���\g	���\#���rz��eIj��^�nP����fSt��������f9��c���FZ���������z���{|Z"�@�hJ������	,+]�j(Od+�$�\qb[dy�4$�;�IO��$`	��w�w���djI�a��M��������0v�	����o^T�Oi��\]�m��+����B�oB��p�[�!=�:L����7R��{a��)���B�a��wK\����I���4:�7����-��,��`N����`�N�g����v�h�_[T����+������5���D�+I�W����@�����aw	�����!���z�I�JW�w1,�Z�(HO%�D���Fso����a����i��	0D��}���C��|������aa��m�`��%F��-9V�G
+nE��2��%�B��n�af�X��/�U��]��9-��	�����9�{\^����g�0n%�d�`7��~+����[�F�����v��X��.QX^��iM�	������K+��4l��k�	��2T�T#������������ke�WL�����&���a�J��2U�OL�yZ�N��*Q��/j\h�IS��I[�Jy���bj�����VjL-*M����E�U���"�d������-)RN\R����i��F���98"�9mE�%��ML���l1X�V����
�5|���}Gg�8-��'��:'���5����qi��
����zVDW��6������P��,�A/����K��b����
���aJW���Xl�}���f,�	z���3C1�,������	6�?-�M'X�tgbObg�M�� 5������O�������V���ZX�Y�N���c������,I6�}g�
,�	}O�s�XN�k3������D�P!(�
�2�L/��G�2�[����& ���]�=lv�~gsO������g
��J����{��
��1g(��9W��
�L5L4L���8t��������E�o�����j���3��}�i�l��sE��\4KaO���R�-I>n�K��6Un����HH�R�mU�l�~n�nM��PX�0�FlE������va�U
k��<�M>�l`��J����GH��x�6�2U[�F{�t�V����Z,�������T��H�F�F���`74������V�@�L�ZtN�����6l�E/O�.����t�=*�Z�YO��H��}�^������@��vr�����S�MM�`7tgK���`9�	=�A���%�'4~$K
��]����+����{�7���,�!*�h�����WhY�z1��hv�����eU���D��
��P������l~L����m���
��,�:�A~g�B���6���L%Xl������U<>�
�[h��,����Ot��qnz8�5�x��8k�������27����a�I���	�
]Z���������c��BDb�����bW��jYXz1ai���]L$AlEAoY�z�$X�0�Zlg�0�,�U�`i(^��7jQj�}Ac����b;s��}Xi��M6�iym/2A�u�F����|�f���] ����iym/���G������cY^�;sX�m,��lA�bY�z��h������I>b�{��B����o�A����p�S�Y,]ih%h��im�����f��B�1��|�Pb�l�8��G�(��+��\����PkEtgN6�����ez	bsC���9������J��%��U�������!fe�����������b}�[�aY�z���h($`����}R���6��+���������zLm�q���Nu�Vg���������DMC\,|����-�Z��[����Dw��"6�{��R�S�[��l����iV<#�:���������hl-��S�G�P��#CoI����\�f_�zK4�J#v�p����Wl��di��A��8����{Y��[�~`8Y#��A�� E��s�[|N�&�7�Z,�/��/�=#���Z�PfM,
���Y-������V����k�"�ZynA�q�Hw/40YV+���?�����p6F������X�������Q���+bn������/�h�?D�������e��
J�w�=2X��)�b�DbaU��V�&X�{�����$6��f�H6����-,�-x�z0��?���V������x7&+����&3���"XX�a�P��,7��;/����;�`�D��U����Y�qj�����<���#C�Q�����
)w�u���:
mI^�t�a���-�d/��/:��qVn$�u�����D��6XV� 4����<��US�_�9_��6�����`�Wcp�N�?<���S������E_���������m3�
S�����O�k�
&��Kt����fj�
�n���L��������]6���/����^YV9_0��*�p���]��T�`��hx[����W$j��.��g����E�;��K������V,L����jVH��c���=��Z��9l�"����fY��Tm=1�e�o�YR}^�{��L�����ti���+���4U[�U4�f����L`:_�O��Tg���7�{���4U��L?[��~�`��
v�BZ�p����5��YYs�=�i8[�2���;�����Sb��e���Mo����zY�{A7���!�����
�;/�9/�e��H��?o���S�l�A7��12�;��lV�<-�m�����H[��5���e
���E��,�`�
�����_�6��X��Q�i8��L�Z�S���>3������Yq�����7�
��~���:�3<x���eK/�@'�a�"le���Nl��8=��W���������x���HX�*
�J%�ExacA�����������eE�a�����l�=�[tp���bA��.X��(���/�.i�0�<���K�%����~`F#����2(	_��q������|�P(]l/h.+/�K"f�K�8�������)���^^���RS+S����:{��w��T}8C?�����0�2��;��yZ!�����d5��E�����Yb�,���oe��!��V�-�=V�]�!%\���j�=2b
Oi{�	����	i�t��Eta�L��������6�DaK�t���D�*������xO��p7��Eg����d�Gb73{<n!q`[Fw��h�Y4�;�k�����1������XX�"6GEN�y�1�p���y��^�C�s����FH�����.\��%x73&EC���������^���/T�6��ba&�����;��,J��k����f�j�7���E�-i�����Vh_�-��YF�
w>�0�l�O������)�_��kdh/z��}�����bD�p���"�1Q-����bsS�����d��/��kd�7�\{f��JlnT{Z^���:L�U���-���S?6<X�e^h�����}X���i+�.�x�b���,��l���z/��2]��n��n������{��nx=�����2�jpn3�q��E3�vV$�~+a�����aY�h��-6����Z�w3�_��%�i8�OL_Q4{�4n���"�f���7��������J���BU�V��`9���8E�t�p�i2���w!Gj[
wC���`�T�l��l7��
����B��mEZ(�a�>�X���Z[Wv3���m����RV�R7�������t���zd����I[pZ�u�w6,xI��{\V��q��tX"�BR��-����Y�WN,T��5�O�kkR��n����2U��,�L4uz�Y��Y��Z1�-+���h�@=+�=�q������`���J������}p���
u7�N����H���P���f��MC4}�B	�n�������4�&���m�������*�pU�����1mzA+Q4��L��Z2�f}��
Y�w���PB����a�D��$
4��fjC$y>�:�=�����I�3A�(D���5{��
�a����i��N���p>�����w�H�������&=��Ql��;M�G$]���O����4U�,�[t�	O����&��C�%��I
�^���%���8#d��R{'����R{���������%������?
�������0MX,<�4kV\!�pi�\��Q(I��d���>R*�h�-���.��B����f5��i�?��I������fM������Cb����&<��=
�P��+��N_��<���
<-��zz�M?�8���������0�u<7�OJ���:�^�n������+�,+�n�y�j)�zq�����|V<-�V<�E@R<-(�l��nx�]�~����:o�=��0�m�Q��;~����X�4�|?7`���&4U����rg��V��m��n��*���!�0t��3��K����.��z��V�f�.���2�����(�xI�z������v�w6w�=��uVi�c�4��T��H�.���h�L�Ut�\M��
������l��(|���
���JZ��]7}��s�%�
�h���zL�l�v�Z��1cd���@��]�^��L�V�-
��4�hhv�[��D
��i7S��+G�ii�2��^?
gC�I�����[�G����&���
����ub+��Ut7S�=���Y��o�u
�1���|�-����>+�nh�ZU.��&�����j����f����b8���:Lc
�J�lY����������-��a;hz�����w>_�'"7���J��,l�b��*r[�wC{�Z�[u7�C[�	��^h��-�����������Ec�v��W,=�
o�7,��0����H:�������>�J������#q��T+t��M/xM�h0��w\�~,��j�-t�PN�-�-�:�T���o�l45��8���OS�����������*�rzLP�~tn�r���|I��!���*� h�[t��Y����6d��/h��k����n�l�������J��Q���B,U�[��{,���D�+[Q�},����]�����v�{��b����Xd9wI�8Z��2sM�d�db{��~,��]��������X��L�1l�R��i��SEv����9fY:��Q���v���Vtc���QzW��
�)��/<LwC,s�	���������Gf�:����=gfz�]�r�������q8u^�,��!v2������D��p��$�R8����0�_�����e1x�0;Bln�}Z!�1��HtK���p�'XA�h��f��z,���L35B��;�s��@���Z-�sj�wz��f���c�b�T�3i�����J(D�R��p6
X�����{�F��>`�N�
S���=����&����<������p���W&+z�B��p>���*�U��7�g��F�rtT|��>�X�\*Kq2{�?������V&�*������|�bs���1}���~�Wew��*��M=m��e�L��l�
���G3�rM?��e)��z�y�0�S�0	GlE���n��'�yK]?g
�]�6�41����^
�oR����P �X���5�����&��n��S��`������}Xu�X���9�RY�9�����EXpM��������������;���s�Y��4U�LTt���F�a���\�X��azF�'t�K/��O9g��V�f��M�|�g|��n?=�m ��m:=�i8�10�4��Xa��P��E�=�����V}�c�Y��Y��m�[.?�)������M�V�)gaA�X(�#�����&�����	$Ry�/~{k�{���6��*�ai�b���;;+N�j}�E%�Js��R��j�?���M��i����T����M�Xn��)_�L�{���TmP�=Cu��m�=M��4(${
�%�
-Y�)xqxLk��i���A�4�����FO]s�sA_���*,��X��X�=Yl�����3�b=X��G�qli���W(>nE���J,��Z�<Vk}���h(+`z�4���i����(��\}`6��Jz�W��4�F��0��YW1>��X�aL �	2���T�H#0�q{�<V\}��P���/��<��.����?�%��eD���g��0�<X��l%~n���)��n�$+�>0�t�J+�LC������m�R>-�ry�|�0�S���+X��*�S���'�8�-`
��DO�+�H���TmO@kyJ�~,��;P����O�P�U�U�@Y9�����/z8D�	,��;��E�c��]��0*�����0U��B�^������e��	brL��Si��R�Y8��M��2����*Z���}��Z��0@��^�6�N^�qvWj��K�D��^��p66aU�DL+��1��rA_������)n'��������R@e2�b�������tT4tHy������jV��8�
��j�_��3�W���k���8��E�������`+�vV�}`��V�+�����<x�����`��,�m�`�S�<7�m���>L�Vt�qxI��,=�[1�-S��>�#s��'����;�[�	Y�6�M>w�Zi�V�\k�>0{,�	CK�B��h�,�L�}�A��z��<i������l�@mI��j�4��K�
�t[���d[z��Wi��V�D�"}�	��eg�"���Xh
�-�Y},��@{"�	��`7���|*�ry����V�1VO}���e������p���;*9.|}`�x��Q������G���5�m�x�vx��:��	:/�w��c���tzL�0[�Y���G���T�8_�j�%[�����,����������e���=���'�c%�Tz����P4.���aEt��������I�(��4K47{}���\�*Y�Y!�;;�;�,�m�#;�l�x�4//|�p����o`T>�7�w��@�S����D���F�af'���=p��V��
���t�8
7<\U�*�+�;��1����65��{��?`zy�cN�O��@���q�w��,?&1pM�;�i������p#�#a��+�m��lN<>������N���x����0���R�5��e,�6��z���<����e��fY����>���'�nkz��=�e��eiif�w���M/�&�
�nc#�
W,4��e��?6���������L���Y��2n�p�l/�s�R{J�xM�d��PQ��t���"H4}�S[,=��[O��,s��+�������7���E*�f�����?�w����Q��wM_����[�c_�pQ��M_"Y������o���F��s�w�)��(��,^���w)��-z��e�%�]�N6g���f9��4��bt���Y��������5hz�7���em+��8G�y��zZ^[���l��_�����������s��m���!%�t�8
g;���j��!h�j\$�dv~/����D�\�Y�����������;;Q$�l�C�?��&�k7�*�f��.�f��f����8��1��>��n:#�b�vP(Noz�|{�tc������t_��tO����l��2�
��`��;h3�*����]��`#iN�n�J����uTB�����6d�i)��]��6d��?�R���`;��Z3����\��� T�m�	��P���Bi�?�������t��oE*��N_�������l{!�u��5��0�,�����.W�%�m�A�`����m/��6t�;�c^o�XN�i�	~����zBU�;]��]�����`�+E���- ��mzBH#��RWm����-��!���n�i��
=W����`wiumh�+g��1�3nE�`a��W�pm�mh"iy��t2����D��;�	:�$K����`�&]�`4�V'��;�O,���f��f7t�
)�^�a������s�,{���=
��n����Wy���f{�F��b�J��$�}Z!��H���i��#�;�<�������	MO��nv}o������c�u��vXY5$;_���*yZ"�^���L������c`:q��������,�$���=o%"b���
�
/�b����>g||���v����^��5n3;�����!���5��>����6.��M	���Hl�=M�v*<DC#Lm*y��6,m�u�4[�6����i�Aw������i���P��0l�o�j;��G�����3��HI�,ug��@��Fz��^H��4��r���Tm{�ly�(x,�mx-������h�T�a��'L�����T�OHhN������HK	�l���	{�saO_>�a	�$�a�|Iy�`�[�?�L }����|0�B��'<��]�������fj�ftS���yzL����o-���L��o��
l�a���G3�MM��}`x����9�R�7�������������t39�������E��ME���d<������z�\�- �E���g;����y�s������(axX�(}Xb�~��\o����|��=A���`',:
v��4=1<y���%��6��_����|�`s�[IH�cQ�������1m."�H�9�r��?����m� 1{�����A�%?P0��
X]�����vXc,UyUvB10����m�<��c[��`�	��` TB�0A�Q7��)������ASZ#Wl����G��(l��W���G��i8���|���C�4�a��"X��������L?�p��M$�3t�������/��������|1����bA��|��p5������)#����f��M�e+k�G��(CK��1mwA�2h&�ov@���ah�y-�����������/&H/z��I�WAv�� ���E7f���Rpb';�<�����B�}��B�B{���z���D����0�Y�;�.�BS����e=��I��f�8B'����~`���y�6����.|"��Da*~�����*|��fc��ba���������	_������wam+�t��(gA+��t?�+��F����*�e=z���r.v�w.��_,�&�!�]��R�P�Ut�����B��eM��^�tH������EL��/k�_L����z������-���/��M�&�:g�!��%�x�� �e�����E�V�f'��i����s.�\���>B��1%���H#Jo��1}�C[_�����
�4
/����y���Y3A�4F�:���vY��b��G�5�e5�����������lU�Bg����O!=��
��\�p��,�$��=����J[Do�#a(�.���%rZ!�m���]��,�m�����������b+;����1m|�H�e5�������_
�k�B3�N7i9U*��� Ve+�k����i������,M����g������5��1�4���j[���5.+H�
�.�p����.,���A���sS����A �Xz��bY
���$���������&��D��25"�����������vA_t�2�
V�5����h��,��6x��~���7a�������H4K�;��"�U:ym-��z��������R�7m���f�4j�f�#fa�Hl�j��,��q�p�A�=��~�J���B����	f���e���4��,�}�|��w%Zl	����<Wl�����S��-�8o^0�"�M�Km�����%�Y���~������)��n�k#��B��e����E��Yp���*;��'&i'�:[52�f��
_�YS����}A���B���Z��DT������������1m��]=pt�V7������u���$�E�B��R�P|Q�S�[�44����DD��|A�F�
��K}�b��QO\P2�,�L�A�\��D"�h\��������\g��������n���+%�����d����hA3��2���E��K*���Yo5=�����������7���:�`�'����kG�- ��,����t�:L�J��s�i������v�YA���������E��^
������{\�����eE��)J���\=�B_0):�m�`������Hj�LV�o�
6���/�QKR>�\@�1o���s��z,�}A�?�^��sYS��^iJ����d���j��~��.�`s�i���`�R������������V����}��_��|�UlJ�~�1eh�N��v�w_L�[����]-b�R��� ��J����/��������4-�}1�n�Tz �O�`[���e���f�q�����$��kC���Z��.��h�[��,��J#=}����������]�>�H����c�l��"k�u�>
g�
H��#'�Vr���}�k�i��2S
[��X��)��g!���5���XYT:g�~��n�`�� 5{w�����%���X�;�2X*��U��^Z�[	�X��Z�1���-���m����wvz�]�������$��)�)}1Mi�t`���A��VX����H��~�(�Y�������1,�C��b�w�I����a��7�r
�Q;+Y����`f�V$�	���_���/���/x7�6t�H��g�-t<�,�}���`W������2�	��`+�r�����4i`��z��-���,-n��E,l7"6wK��f�����B;����T�AT��lN0=j����w�`���D��?h���e=�\��L��y���*��ZC��;����i8"0AJz�P�L:��[!6�q��c6kJ7�X�����.��N���3����C{����bb;��<NB��>��uVz*��WUl�}g+u��J��)%��!�,N+�a�bs��w�������c�?#6_�NS��*�4#%��E���$�'����OK��D�=Y�S����rqb��-���U�SY���(�*��5+4������eR0,��X���\�y��K�]2},Y��d�h��^lcy�5s����^d�2���F����o�;��� ���D�Yf�h���(�o���8�X���B�fm��n_�KG�~`'K8���e�q�_sZ^Pt/�8'O��������\tZ"P,'OtV1>
g���B4��l0��	4�;L-K%�4N�P��,�����NS�v��o�c���U�O�����h�z*����v���-��5+%7����:�Y��+v��������~b�l��	t�27����Y)�1�d���I)���=k���S%�i�l�0�e��������4U�L�Y������|f��H��)|vZ"�1,�Qt�4p�v�;���0���4A%�?g����f�`�
U��nr�Y5��� ��,Y���i�t0|�0(*���+%
���vh|k�)����6
����M�H}����q�
)���Y���������N�,aIlg�3~���t�vp�����|�$��h��"����"�h��V��U�u����R��Qh���Y�M�Kn�Y�4U�O,wZtc��f�0X�4���xp�xpc���a��Y�h1��h���k�c�\t��v�&��l!���t�Y���-�m��EV�`���|�^X�]�U��,L����m���&L�JV�E�s���p��L7��3H$��j�N�i���R��2��������4��[����b*o�;�W���Yx�1�F���:g��n��pAgY�_�`��S,��-�iV-n0�'^1�]0�.����ib+^E�47V�&�J��U��2
�5�4�-(�,�zL�"�&���/���g��[��+�����py���C��B�]0����T���D���+�0�Z�����q�Yl������+j=�_N�~>M���6�n>�n�|��9��f����b����2h�=<#)�,�xL�<�.q�7��J���$����$� X�,{L������k&7�Y�j�U�i�h��d�b�YN�:+�j�
����$A��/D5�pu�����B��`�[�Yk�4��h�=�oX,���/B�0�3�,(sZ^�1����0���7�`����M������N��7�4��n��BG���=���i�Q4�������4)W�����sc*��;4��\P�kVL�%�A_�C���b/Q����r�
�����OI5C?z�P�Xlc�|~�������&��J2�i[�����u����65�Vs��r�n�frcc��q�TC�/���$���%/�b[����lk5�#w)Y�5b+/��E&�(�"��,�����h�`���L���7�J�T�BJ�0�l���f
=��f���DV�n0+7���-��k�����3�1�����Y������
wx���b��+���nP�%�	����
3���������8\����N-��6z����b7j7��o�����>�}�e�'�_M��+�����s��4�m>&�-��G�V���[���M�q+���Exq��o����R�	���#����	y�x��bL([�sX|�{�`����a�Q,�vT�f-\��p����$>^Iy��x���'L��r9F��bs�.j�	��rh�	��J��+^/��7��!%ox�HA�Zh��F���1�V1��k������`�J��E�s'���E��"`p��L��+%���4�{[���N�I�,�`�J��
��)���P�.XX��<\�C�M./���.���
_"�3��Nv���Y6��M����^^^����j�b�j����9��1�%j^"tz�f�F���$t1W���	���lK
�����[ ���S�f��4��-Au�sx���$��|�?����-��/��/�j���";��>)�xZ��%�/���mu��g����I��P��l!v�-���P�h(� 6��X�[u5�V����U@����,�n��%Ka�)���B6�XI��J.J��}g���a��X�
��^�|�^edO�k�	�A/V�-�M�������,�4+2K?j����E�;����L5Y�b�H�9���6������~]
6���o��������.D_,WG�dQ}��n�����F�/�����q����j^�����[
�3����������P�i%}���,=������+)�����+�}��������:�"�
��E����ba�$����=gL��#�����R�D3�}P�.��'�*��tK�w�eJ�n��BIl�����0l����@g-D�$�w��"K�M��m�����j����E�v�f�5#�~�5a:P�Z�����P�F����`;t
�Z������}����l�,8L��
:��
�b]�����Y2�X���l����&A����R��^�Uc�B����>f��Nbt`�9�����
�XdE�;�g;�������:t�	z�Py��	8�}�>�,CrZ"�m�������\�T�~��eYJ�r�Je	n�/��N,)*���3�:���)9t7������S=Xz�Tc>,,4[����'�a�1�	=K�^tK��|bsV�i�l�������n��k@�;�C����L�����c��Y������&�z�����"��B�bi�a�P�Z,=��Z�M�`�&��<N7+���=��^#3�+���`i��o�^O�k�	f"��]��,tx�������h����[o��L}��W'�H�ws�h��N����N���&������<,����+��n	��E��,��C�lC6����V<���k������li�u{���C3�&���&X�B��q�R��M����hx��T�v�"�?'�����
4�JX�������B��0F:^�����z�@u9�@u*����B����wZ"�m0+w(F
�����NS��3k���nA���\`�/1X�����2~N�k{����P��`s�R�-���\��7�w/5f��������w��T���B����+������G�)0�Bq&�%W��2t&�-*����<f�R=*�{������p�Qs�B����
�OA?p�
6���j^s�Tn�F�5���U��4�-xBMK���=������������j|�i=X1T��x���[|n)������qaV���-�V�!r�Z�.:����!b+w!7��[
����+�����Yx6L�d)���;�R��O��T�F�o�O��d��8����`Lk\v��b��n��T�E�,Q)�39\��Z�aS���B6��p\x�,2��d��K��9W������`
5�=2��%���cZ����%b��`h�{�loP��t�>-�- �k{�Y5��^0"lE5���n�R����`a.���5���(����Ot�Ia�7�-)U�2J"�(}c����k�W�L���t�y[�����T�hO���,�����^l����}�!��/����a�u�Oicf����b`p�Sgs>�� {��a���>�3���aFX�N5�
�*�����Q�&���ylK�w&a/���`dH���Kv���y�K�w�?z��~�\8����������N�����T�+���i�:Z5gh^<j�Y�gX��V�K:FR52������K)���Q,����t�$�d������f��Tm=A���/�q.�}hy���H,�k�Z)������`�T���y�^���+�$�_�����H���
6��J���[m���o����B��S��a�����B�+�^;�P&R�d;�����b��,�5���[q���o�>,�*v�"�����c>'�
m����nv�],Ol%v}[��f���Y��P��P�b|��^����.�K�;X�\����<g��*v�K�iy����2��[$�^��O3�%�s�1�T������<M��T�pR0�/^8&+��^7� ^X�����m����LDO�!��Q�h��e���L"�,��s�B��+�l���<M����<2��c�b[!��v����Erjr��&�������y�� �r���
�����g]1�����7��Y����U�%F+9[�G��T��>�k�D|n77��CD�C|"�\������fQ��m��
p�z�DJO��7K?
u�<2`��
����d)������/�6(HR�np�6��5l����d���i��~XXV�dU�b�������r[G���w�,�Yln8y���.��[/X�����t������E�B�m�{��,��]����+�����$������N���)�}/�\�Y�>7��8��$q6_�S��}���m��Y��m���Lm������+,��4�*���b���$��a?�����j�����������>��l!����{��8ZD��L���������&�t�a >��b
X��f�#�+�vC]r�����u�������q�flb�4��1}@2j���3���"������5�
�k��"2f��7X�[(��-�Mn�|W�L���t
�#����0.<E��L�Ml�ww�$`E��'L��;O�v��(���+�Z���*�7+
����
W���F�����6�Kd�>f���neLo���%�� <W&n�$v��hr���J��U�aE��I�����}`
���2���&.�jT&2}��/��J�m5��,��p�U��h�8�`����1�*�����'0��52�R�mp�6������1�
����FS�������!�|(�	�EJ�/�X,�~�s��B�^0:,�k$���1���qZ]��L^tA;��|N��8Z�l����!��6�����
�������������h��v���`w�Go=���C"^��{��s���Xpb}q�Q�	������V9���
;���d�X"�fE��a�U�41xJ���X����$Ns�f���`'M����%�������G���-0~�s���	���w���E/���5��FS�
��?|+�M,�0.4b��)u���6b`����a��u��)&�����i�lz�r|�4)'���4U�O0�^"���X,���_�#�O�������	+����������7t����`i�[���>g���x�i�0��T:Y���y����kL�4U�^�f4G{������������]�����J�N��$��~s�[�[[���I�Ao�AZ'$J#��.�/�^s�N�k��n	Q�/�nz�(>Z���T�
o�KY��U��E_�M����
��JNOi�'EC����S��0U���./�|��m�*K���u4lPm�%!o�z��E�Z�7L�
z���D���F�f��3,�����Z^�mL^����N��~�^�����";�c,@�������
-Z)�Wy��~3�T�y�����{���N��:�$%�w�`�>�AO5����J����i������,X���+%�d�u��+t��o�a��s�G���5f���_�{iq����~*���s�������)�����T}:C����T��n�G���l���iASO{�� J}[���=+uv�����&�I_��SG��0L�q���s��x�
�Z�h��M,�E^S�OO���/����G��R��hOO����v���(�YZ),�������jz+~g����D?�N{��p�&�Yj�Y�#�sO����h�����YH{���F!z'e��p��C����
��^��5�������u��-z��9�kX�����'��En=�B�aQh�3�����[�j���>��Yl!�mX#y0�d�}����9
�2b�bQ~��{uX�y�*F���zb'sZ���a�V������7E��:��y��^p���YN��Y�����]�D���f��b74l���tp������KN5��8b��J��T�^�>�����:Eg3��:�
YC1j��>�D���E�ay�hX�c6���j����E��sb'�r{U�E�,x�=Y�����o�f
���OyT)kJVl%���������Y����]��}
}�����w�o��h������%4�~R��i8���
/��4n
����34��f��FS��i�>��gV4��,3�l��O��s��,���|�Vrr����s��O�����,��,&�qY|I�SO��LZt�2���o`��*N=�C��j�M+�;���T���9����]H��L�Y��2V�nV�q��������N��{is�����Kf��Xx�i��Ul�X���`�a�!�\HN���ES�O�93��2I��o��m�O�k�
���-]h�2,.=`T�O��tQ�Y��p�Z�z�������mtK^���
�ph=�6��]*�N��+vr{���40���Alc�
b���}zL[O0V4��������8\�� ��������B���Y�0�B�a������N���b��!����}_ob�����	��A7��!����J<�h��f��p�;2����F��G�L�4������4U��-���bsr�i���`"�=��D#�����o���%��C�R���7/(3�R�N�i��D�>,��J��,�`���G�+c��\��m8�CC/��j�<�B?�a����C.�]�s�� =q%��*��v���2�J��������N����8��m0?KJ�����r��J-�eV����gP,4���oOKdKZ�A�B��a����D�\�o�C�+������2��I���Li�#�=A2��o�<5�O������<����/��o��S���I��
�0�b���G�,���vJ�:L�����S�n�EA����t��.>-��>x3�.v��bmk(�-z$���p6d�N�h��5�������IL�n�b�#3�-�-�`W�T���v<�f5�������8\���z���l2��@��l��\��������X�������m|6c�Q4Mov���`�h�[V�i�l�0)P�0*/�Mi���"�;+��V����4<��
C��6���n�lE\oX�z@��h�:'��)�������*6�p�^��Y�.��lE�dXQ{��-���J,4����+j�� ujxl����V�V��|!�|�>
gS��A7X�.}���6h&�`�'X���	���s%i�����i���G����9���B6�`�D�4��������`/hk�+�!���N��W�G5lA�oX������|f+��v�`L���HRX!�^0�'qj�B�����Pm�7�6�h�.�V�0=Uj��L��v�h��5lg�������-=�N�4$��;`�I�����O�k{��X�-��;�*A-�Z����U��M�(f�T_=nA�{X���t������yQ�8<����z�*i�!ki��"-�t?
g�:��&�����i�>����E���
��`a/��B���9+���Y��vh�kcO�iS��w�M��;KM�`�$Kv����� �%�}��a�W����T:L�0[ym1�q����w�^4=���k�	:��(��T�|��5zbf�Hg���f�sj�K;�[��D�j�^�`Wa+��,��$D4���Y��g����.����L9-�������	��B�t���|�����-tm����������X�J)6K�~g+��@��
���vV  vQ0[N��O&�/��w(�r��e���h�i����~��6?p�N�0;S��$n����i
}��-���7�r��[��Lk�O��/z1KWl!���=U���O�=�"��-v��\�Y�iU�����pACEz�,t-Vz�L��SN�������#Egi���.DH���[4,��
��Tm?�
[����,�����RR�6���s�O�k�A�]��l���2hX�$v��6�{�����'S����Q#�3Pl�����:l�"Vb��G�f]�3m�0�v��%,��I�b����1m?�����b��^�B�ie��j#E?,�!&#����	�^p����;�iym@��Fv��xd��+�U�'n�Y����=M�����P������4U2,X �Z���8������,�B�*$�MK�Ox�X�����{��th���s~
I
�m&�����t��������d�1�0�El+�������})I�B�����d�U�-���Y�}�[f��]���N�Y.
���'�����J�d�c��i��-�;�Vi��n�j94B��^���x>���h�`'�*��L��O&�>-x_�8$Yz�Xh���YN���3xZ]�s�VF45#$x^��-x>���h(�:-x�U����>#ax�o��.v���X����,�������'��4

��~�py�U�s����D����f�d��7�y�
�����9��p�[%�w��H)�����'L{
z��^����;]����w�U���M>��	����`+M��5�a��i��	v4c�5�ab���^��p6��5���O��L2�e��w&���?1J����V�
���yS��iym@�����?~���`aK0���d�r��Yt���F������0�%X�6����g3�@�`Jh��1�xA�fZ<��|��-��r����t�+nQk�O�����F���X�{2
o�y9
���������p>�a*�������V�i�>��N������K]�������^��-L=aIB�^��m��ia�	/�Aw�D*&�i�0�(����}Z�z2aj��M��5��=.����V�xZ"�"0�k��������D��,���TB����[	��}gZ��F���^-�/��u���1���Ew�y��0h,=��
]���'}�'O�^�Z���u��u<-��>�n�O�\*�P
c�o��0QI����i�����M��(�Ex��hy%Jm�	�A������PV}Z���;n	b����a�C���lAs"�����^��\�<O��*�����BC�i��	��AC,�\�:��2-J	:Kug'���a^d�OAkZ!:�/�8��UkX�9�}�5���E�����{zL���X\yF���`��9z=M+5O���1�X���A�j����'L�a�O�9����PO�j���j������O����������M��i�l��S���1����n��PO�=���d�����E�6�������8��L���V�zZ^��L+Q�����J�����}�}l�>�b�������m���6��l��,K���(�g�_�qa4^���O+L�<��7}�6W���aE
���l+���V���.��J��u�'<s���4r����N������
�Q��V�����a�h�
��$OMWHN$vl��+��e�'}�z$Y�~kLO�1-:��*�0I������Mi�b'��iym������t�Y�������#����G':/���o�|��<=��/�z/
���x\����V���'��K���q�`���kN��Z���2���0'U�.D���{�D3O��+��O3m�)����wt�m�l�l^V������lG��rR��D4�q�ea�\��q4	���+�TXI�X�%���)Y�����_������(��^HR^�]��V�f2�b[A�fY�v1�[�P:O,l�*v3{�o�p�^oMN�����1���.pf�d�g���f��[H�\!^�1U�
?���
����a���am�|��T%���#�OF��,?H,�	������e�nD���+�d�e�������V�rZ^��L��4<������{\V�o��7���_��B+�e�����D��������6���,�b�r+���������w�5s��],"#6��}=���m�i*�.�4]V�^��|�|�eEnb7K[�-h�.�S/x	
�R����o�R']��D�c�|8L����fQ�-��NS����:DC�g�t������h�bz���^��'OS�=���Dox������A�6�������PO�k��	=/.sv@gKS�"�F�;��O.�.=�S3h(l$��c�,����N:��l�@KK4K��+�$/�v�6�v&� :�n�����54d5.��z�����d�������{n�����Eo��&�A[��fgn��R�NKdk��D���/�?ra��FX����3g/�[��6?�(v:�O�kk�UF���.�(6�d�� �}��+���S�
�zd�6��vJ�8=���_��H�;�k���
���sw��,lX(v�t8����vF�����Awj%Def%��������������G[%zA�L�Yn�4��'x����T���?�|�;=�-��}Rk�Q���'�m :\�0	 X'��p��WB�Vk^0��z��M�	��2\bsZ�w6GiN�i�:D�����O��tf���7<z����P�B�v����gY�y��D�0%2���;M�',t8�sG�Yqy1	-�������r���5��]�[S���
sq%
s�}�W���>�a������,�ihj��e��Jt^�4rA�{Y�yA?�P�p�Xty����]����.6/&4 ��9�}`([,�-0[X!���8^[.X�6g����:�d[��rX�l�yC
��5�i:J���������������G���,����,6+E���g3��?����K�]s���>�a�!���`�B��e�EW�~�Q����3D$BL�s��$X�5�1+���GN�k��	�n���XO��.��Z!^�d��0;i��MS���Q`-��oS�'*�����0�s�!�N���
�
������_��p6(XQ�i&/ ��n�ua�T��~�J������52���J+V!�y��ai�T���H����`a�X�Y����c����p2|��_����g��Kc����D�
��a������i8����t5K��(����[�|Y8y��`s��F�u]���Z�x����+A+�/x���0LB��1����04���M�l
�����tUo�J�~'�c��e�����|�Y����6���4:���'b����
�/�_lz���/oX|�Bs��[�x1
b�P�Ml�/oh��/,/L&7�iim�1�d���+�d�G����tzL��t+	�.���~g����1m�2�f�4�.Xz���;N�*jqX�y����s��i8����*��uj�bZ)�����������lH�::4riQm�0�a���,��q����)m�@�G���yq���q���q+{���=�%���Eo�%���d��b�4��W�'��
+����X��V~����[�w�{�#!;�D�M8�;Kzb���PV�}���n�\@p��\�"��,��c����������>���~j�S����e����Kl����O!�i[ly3��iV\ 6���BMC�9)��D�K�>k��9����NS�����v.���������'v��|�����J'{�yl���p
;Y��(����������/k&7h����.^�F��Y�u-&���m��Z��p[����/m�^�Mo�_�Y�z�*}g�r���N�.|����bK2����D���V3T�^�j��E����k��tbO���Ty�!#I^��[�'Z,�4����~�D�|Y
x1)`�p�"��9h������;�����e%�����p1dU=bGB�qYU��
���e�;�,��w���o��}�./��N���`�m8[�,�K4~���n�m�������A��0c��6U�1�6^d���kb%C��/���6E�g��,����h��{<p�z�0�����J4�LWw�]/�iQ����3����q�@4�*����'����qS����'e\����e�����t����v�*�f�
F���D=����b���aR����(b{"��,n����h���6�mV/V���������=��&A'���mL�Fl�[���������rD�{62O���XBx�|V�
^���L�Dl���`���X���-uD��W�U=��U��D������n������������7HI5gB�.^��K��?M}s���j�G%����.��ZK&��4�^����n_�=��I����X�H�9��6�g(����S�d�/
������;s��BW�����R3�(��2���Y��X|�+�Mq8�n����5���`���Y���l��������i�[�GR�m�6�Y��hz�
�^]�~��|yLkD�<G��x�n���d���>��7��m���8\��qb�hK�w��&4��.0�M#�=+�
m�`a���7�-��.M3#��0=$X�#���s�w�`�N�����3'�j��G����a�_*���l��q������hX������qa�B,�i�NM4XV-_�c	�1Lc
��;���G~�nJ3'���x���������vV$��Mi���V�&.����C�z���G�p9�
S���zvY\��/����K�F�<���
����%�e���/���0�L��ei��%������m�6��;����;;3�>��/�� ��3�
gsf�u�Z� <���l�ee�O���nc��l�����X4�����-$�sV5n��]{]���|��������+
w������0��E;w�(t��p�BWK�g:�mu}0C'T�5!/������4�����SVl���.�b�p��6+]x�B-YjI�����p��W9��TmK��s�^��B���o�7���5/��v�/�����
����)d~[\�N��;�0�n�����c���`�E:n- ��=�������
����91S�/X�0����T�����_NnY@� ���aZf���J�����k�^�����������b�p�3e���_�k]w�Ujdq�PZ_�u_0� hz��d��c/n���lK�������[H�����)�*p{�K������S��+��$���35FV���>A7E�������E)AWXI5�`�Ru����<X��
�H�:%�����x��B5��6hui���}�Gq��e
{��+z�������a%�+]����!b��C�Xxe�L��=�ME�a/�BGP�4�R���(�z�^��'�<_�u_�B����Hs����Tu�}IE#a�Z~�������X����yA������Rm�� �X��g�����j���;�(	�,���R����g���t	������L������W1��l���]�b�0��U��0�-��`)�h�*����u���M�zvK*�Z?1�|�
�K5J���xJ�@Lz_t��[�L7�����&����bn4�E����/xv]`�y���F�����t��a�8����&Z�,��/��o��������r�f����H�����,E�4���,x���q;3���W���V//2%L�����j��/�~�����7�x
=�b�E���D��c>~L��<�/��o���=Ud�f��b�-�6�����Gt9�8�����O7q#A����{\�[Y���v����f����f��[�0nc�bOu���n//|�"|FI���k��_��SNt��������4K�S���#������^4���$O�H�c��Q�2qFX����?�������(v0W�Xj��=T�o�ks��	DC� �������B�����fL?��o����w�?���rY��s[�3�s�
���KB��
@~�.o�>o�k��ew��Y%b'K������po�����%�e����@�fng����
t��eS&4����k���\,6NT���c�A���y�	��v��t@D����Xd&��e��7�)���Y9�q���X������bY������vg�����K�K�2L�?�@�;*$NywT�����]���
���������;9l��A4����	e��&Z�j���&:5m7r������2�6�
 �?
z�}�#��q{����EwzXo~�����m,�{�����uw����DW��(3����E7x����)�hc�A�;�I�����E�!�M|����L�_tc��b;K��`���3b~[^[@�DZ�f	[�����=�-�6m�1���������n�i3�i���s*���Ws�dIt����zJ�'��{jr��j�
^�%?]m��S�x0��jj���Tl,�P����cF<���=;�&Xx��	!Z�C�����K�������"Aw)
���3�z���U�%c�����6�|m�����&���>��n����1���PI3f�h\��Ho��7�B�������i��~��Lm��{c�Z^�n�5�Yg�ST��D���GH1z�'�����
���s)����`a�h�����R�g�����%'|L�o��U
h�8�����A�"��YX.$��p�D�!���|��I�P�W�Lt�U�F�D��OQ#C(���� �f���;L
��;|i��,�}+v?�mym��s,�A������Tm?�4����U�	�����wm�fw���c����`����0�#F~��� �u��|�hX���A��
\}%�$-~��#��6��B%�����H1�,����D�h��'6?��0-�������~�?��r>��}J�|g�v����j=q��g��
�Q������`+S��g�9V��L-B4u�#��6��;a�\l���.����e���7�0�8���`������Y57�7�`k&���P�Bt;"���lk2U_�F��zE&fjS�u
=a.��D�m��Mm�0�`�y�l�?H���:�<~�b�S�
��&��`?�X��)��������m�l�����;t�L���7a^��	����8���f����������-
6,�
��[`������9��a3�~���w��po3���{A������R�����B�4�Tl��6]�H����=��;�%
VAk�2���@C�A���`�u�����q������6.�����N��L
��2����i-a���Ea��!�F���:Id�3�t��7��!d���
�^@�l�����%���<����oE=��V-,M��c�L�%�j���������C)��	����f���CZr��a��NM�y���y�lY�K�z�0�ZI�Q37�����o
���l���H
��,M�1��{5���?����'�A�N�S���"��t�	���iu��D��aC?h�T�%���`K��qg�
��������Tm���wVH��n5���)�m�`a���g�f�����:�E���`3��;�����E��G������Q9C��us���#������!��F�
�
5�����3A���w�&/k\����p[!["t���f����p���h��p��2l:��������%�CCX3N}�6��f+���h?ZXN��f:�%�(�|�4����^�����3%����=��h�!��!�E.�_9u��W�w���������M�'�f�=����g������I����~�0<��MO�R5{6��Muz��-W~=|��O�Muy��[��(��������=3����������1s������YA�D��p���gx{L��Hy�t?N��p>���Z��(r���^`v�wV���x[]["���tA����,��;�������0����Nx�{v���6TIg�y����C���;�����a�����4,��N������]��l;b��%���
mL����p��P����|Tf�T2{��n�i��N����6�u7��Hf��l��Q�����T�O(m��F�V�,{g-��yl�A��Q��������H�>s_���P�����e����TmA�+��d|�����R+��3w���	��n���DU2f�g��y�KL�{�`����F�F�������-��	7if&n��&R%2=����~���6���(�qL��#���9��a������[���T��p>���t�n�`�%�I<)q�5���_tA	?f�V����.Q�����`{�N5|"�QV�6�����,k������mym��R%��b���R��Vv��MT��6�Pa�i��j�U"�����v�[���;f�B��Tm<!�s����������Q��$���o��������b�?/X�&g���/�����>�������=�v���9'���-M��n�e���0�q���Y��j������e
]�.�2[��*�)>��|w["[�H���!�z�.t�J!~�a��������,48�~��l���=�I��N[��=U�n�iC����c�z��.0l�i�����f��d�f^Z��v�t�!\�L�������=N��
�J�����w������Tq�-�z�64�L44%&�q�u[|��
�C�vWO��I>a�v^H��@sf;<���I��#��D6�����	�Q�V��4��"�{x�y�x�mymiB����a^��r�9�jT��J-�MM���=*04?�04��.}�4nbmm���h���g����[���1mW�l/����
A��i� �mw�M���Y
����R������8qy�6�a�������L�������M�
4��?�!��*�v�&�\W��v5��Fy����>��,���d~�����`�I���Iu����2	�+�������O��6�
\�}=�E����/�=��Lx��~=<��-�o���V�M>S	����`i�O�=�6��[hHa!s�����z�6}g{�R~��A���;�~����yr���l�dBL_�V��~��-p��0Iw�v�{d#�V����7]��4��6;�%�=�m ��2M��#g�����,E��S��/�a��N��	�}��lz!�|�&�Z7�����������n��g�\�&�{��<,��<t!K������V�������A����a�[_bX���z��^b?��E���W�l�!%x�������i�0d%�#2wY�e�
zL%�=f�vX�(�bz�L�`��������i�������)mxA'P���^���[��7�����A�|��gr��
 (�#�����
gK	���p[6��/1�m$�ox�K�;4.��bXx�H��Qo�kV�Hf��B�}�m��\����l��!�����e��������3]�p������j���K�p8;3��m�	��%�s#�e�^���3����`[�'8�B��-@�>�`��"_Y���6�`JQ��H?�
g�I����fb���A�m�@�y���U:���y-E�=��.��%1wLVh�Z��.����f�-��t���jXl��Al&��m�A����Q�s���`�.����g'���ud�]��}P~[?�+�2Rd�b�[���y�r�g��O��>+���0���&�Y�2�0=Ft;^��p���oDt�j�X�0-x�0u�X��s<�DNW��{a���+s_�]�k`���fY����(��-o����9� V,!v&��2�����>�~g����j��}a���"�{�"D�~f���hy��S�-B7>e~7��E����n��^��}a�9�a��������D�e�}a"��3��vv�����(�0������-�/Lt_�)��eU�F�`��)mz�l��UI�mp���=K������g���R'E�t��X�m����?<�-���Y8���Z���)�[�6Sm��z7��p6��@���u�:�P9C�N�S����!��7Tj^��Z��i��f
$��R��q%�z�����f1m��{����:s���$�b����~�+tmxd���7���1}�1g���"%���l_��3w.�����X,���u�i6'�="���)	o���!�����N�R	6#W�_X����B�b�:����D��BZ���j�b	{��
����b	{�&Bo�������f
��f�7����{ta��ba��e��b9�$����a��h��,v�*X��O��o��O�N���1��L������b�-�qR�_X�����;�@;J���=�M>V�(� ���Y��� >�B���
.Mw�z.v01J���"��(`�-��6xk�-�z�V]U%�����`z�FX	:�5n��a1�������������E�F���$���t����������s����O=o�o�>z9������N5X��
�����V�8=���"�^���)`�e���=�=�#��B6�`@R����U#��%b���J!D��G�,-TlB��X�����b�q������E�U��X��@�0�I�(����8bv������E�M���ob����V/00��1���]���h��hd���8�����j�b��cv�b����7q�X��FQ{�y������j;����hl+�5t5HB����TOV�Khx��������d���Y��05k�g��p�dXq��S�$

�C��D!r��s�n�;3��g���q�[��0q&����NVUl��B�??o�[�$5��I�Hv�
g#���^��p��,]`%��Xp[��!�;���v��2�v\`��hxs����%�J�/Vh.0�J44����6��'��ly��]C)��=#������[B$�0�c��_�X��]e�w�^�)g��ou��t4DX�$ugx=	�� {��nKd�	�"�`�U��U&4��0��s��pwfb_b+��I�9��X���p���;���=�q3��Vh���E3�9�-s�X��@k-hZq+��6�M�fS;
uy�.��ONm�X����T�	�iY*.�r������v["�@��z�
O��8u
�ku�m�l��<I4'�_�5�i�6�
2�w��6�����:�gi���T��WM9����;�~�=�,�U��}zC/d���x�|\�@)U����-�-/�l]���]�;��F���]K4&�,�f����\`��hX�)�e�e:3Y��Y��K���4X�����&>�M0�J'n��.��������4�����n�������Z��c�CC�F�o�H�,J
�E�J���x���i~�zM%J�0�$X|\�7����\��K���6X����<����F$��/	<��H��/���a����X(6/vBC"��U#Y���z[^}L Z��0�K��C��������X��@'���>f�I��_l��mA�+7%�
�f���E���CZ��J����m����L����k7�C2����l{A9��+�B�������U��z��M�TXo�79���)~z["�m����y��
��d�je�3z�i8�,[�hB��Z\��#Z�f�{�Hx�M�z��7}�����?�,j-�%|��Z�0T J���\�,�,t1�VlOt�����L�[4�g�L'��m��3��;;SQ���}O�6t��=7��T����[�=��S��]��4�x���$�=���
-�n�����Dub�ver���������/���9{������7����SF�)�|��-/V�!:�[-i]������
gSn<��f�)�=Q9^��\YC4��{��tI�����8��_�6��9�[,z$
.�u�+]���3��Xj4��s��K�CD�
�n�0.��Z�XG��mu}�2��h�4{��}g7�^�=m��Y����,YJ�Y����	p�,ue�"�G��m8���_�J��V<��r��s����}����A����bO��6U���t��eI<C'�d������^_-��~����9�]-�|zC?�.�p��,���e�~���������+$[$���`g���a|���1����n����������P�w�����B�b{�9X��qe�M�'t67�5K,�Ya:�����6�V�y���b'4h�=	sN4���i�0����f�5���+��=a�L,�������W|�M��I���X�Gf�b�����jk�p[]��L�Z�H4���x�L�Y4lb,vA�P���C�=/��%���J�D7��%v��d�zF�,����������,7Ot�;�P�H~��hnX�/^\���V�a���P�Nl���f������7��+��Us�����Aw��v����\l���ZL��Tz���� 6�.����{j�]'���+��<�Q���f��j��){��x���]a�����X���mp��M xX��;P�
a�Nl�U�)�<AW����1��0jO�+VKZC���$9l�&	����V���`�2��H������m�}��p�&����3V���Ugb'ta������D�&`
�d����H�GV<Whqw���4�|��8�o��xe"��7���j�N�4�����A�>��n�k���������4Wh�v���Mrc�x��>��z�P�W�Y�����=k���y���>eyk:��=�����p����a#�+�)�Zk�2�e���N�b�N3�2�!�e�,�L�!C*;�]�����++�=�/���BS�\rer��i���������	���������1�H��]�@����ZZ��nvCW���9Z37K-�rr����a>%�QUk�O�m�)�<�Y�<�M�����i��>��H��-�m �
;��048��.��1m?��\	&C�F��u�g���c�����A�2�`S�=5SSo�!�0��yyl������N����f
�"��%��ls�z
&sv�\'�]�-W��,��C0�/�&L(d�I[:��dm����pA�L�)���Lmz1�\�fXM%��/e'��<�PIc��[�`�L�=��S�z��+���Z��z�>��n���`���a�6�=!e_->\����S��;�3�V&�+zBG��o�����Tg���a�r�j��f���q�����������c��Awh��?�>k\4
��{����>����hX����z����)-�KM����_�/����	1�j9]Z��n�\-��(l��c�&�/�h�iZ^�}+��5n��\��-lA%zBi�����Z|,l��$.}{c�L���t+t���,��p���K�S�fiq�����p�ld��!�DbEW�9
��R����{["A�1��v��+�;��
*�I����	AO��Zj���kV�������w�t���Z<Ut��>��o�U������m����;#
�z���,`�X����_b�����t��4[�g/���v�.:
DC���T��:<Ut��>�������O�������b��O����x��ic�a�+E���w(�l1{�foK��Dp�������_�v�i�\Ml^�MmL7U4�����f���"��'�|��(Z6K�6Vx'z�je���E�����A��s����lcAl���+�������Y\�������w�s;�e%b�������f9^�^.��KXQ<+a�Y����	�Ba���p��>,SS�He5k7��'���e�dB���;�,m�=n�DA�`N]��%
6�}j�>�O?�,x�D.���Y��(�i�q�oN��lg�5ba����;�mum�2�a���/n���de��3����s��^�;�)�x�����
��=2sz��;�D�3g�E���J�^�-�D�`24+<g�J���z�f�d��O4��h`�
v��w`Q/���H��
��nL�R��G�b�p���%�=;l���V�=�IW��	� }{���-I�&��4KK�B��X�B��NM����b7t�M�4b7hQ�Nt!kV�nL]Z��������4D/x(����������	/pA�����mk��D������K�M���J��W6�=�����br��UK�����`�����~be5�Y��P�|3_���
��zm>�`���E������t�n��}i���X��l;���Y?����D���'�ax[��-2�����=*l�g#&<�5�R[=kx������}�F+������L(����������&x�Y���Y����q�k�V%�7��R��-/�
���*�8�����/1���}���Y��q��>�c,L �����X���i������2+b=3q8�%7��(�7�HNcA
K-���k�%���th��wi���$�M�d�`�O)FC��������R����J�h��)�,��M�6L=�����n���
ke������X\��0�K	~*.����'z{L�{LWZ��B�%�y�&5T
�(�����`;�L$�_�����Ip�n�0����M�����l;a@�K����a
��7qG�zw���ACK�+Zh�)Q|g'����x���Y4�Ak&����X��A�$h�yI�:<��
c�����m�l��y�4]�q���j���}6A�
g����G�m8�"L�Z4�	J��4�L�����F
�Le~C�0�K4��I�����	�E��|U6'���h�����j���-Z�})���2p�6l�)zdX�YC%�fyg�;3�<��n0�m>�9������w6
c����9`-�������?�w��{��g��l'����:�J��7KC7��t�g�F�������gf}b���������J�������'2y�z����7���\��,L���M3�;[����i�����bO)��T-��`�����X%��VH��9K�2��H:�"X�����hx���*?�C��-!���+�+���4����b�-$-lh��=|�����s�DC��4�a0+X�#����X������4����f�����~������;�/���)my�-:,/�B����Rg���������-�-M�C^���[���m��4���d�a�U�gv�m����|��3v�:�
��m�!g��_sr��4{��Jl#��n�L*�
[ip�>�	���W�-�m/�M���������.
n�����nKd�	��A�n�b�����r�i	�F_�����\#Co�����b���-��6&.�fr�`����K��[���o�#}"���S
�����yU��%�����EO��$�I�j%)�g�=�����P�ZrAo�+�Z�b�+�����1=��������:��b��O���p����^�fb�V����������3A4�B��#��6����}G�)��e�:����b3�����E�����
�=2�D���cq��Y>�a���3��6����=\t��X>[���
��V��o*�e�DbK���X"�a��a����/ba��Y� '6��X]�>��!b�i�H8�+�?pI�>�o��Dgs����{��2S���,�������)}��r@�`O���T},���?�g��,��ZY��%����i��[YxZlIx�ko?L{[�yP&X��a�n��c��a���(<�-�`�c�����E���b+���7��s�����������-Eo��!6u������-E�/�w:d�&n�����
��F|�Y��Z�,�-�b%E��?��+��bT���N�e��b���="a�������L������	S��0cStg�u����<�G���6��5#�oe;ZV�u��"*��{�4���5�� ��t�]�	�4��:���X+W,,V���M��<V���Y��	����'�B����_6�SB���6c��������
&vCSX
���c���3�*KQ?�\R�)��������NDJ,�}�U}��UZ~g���L��c���A��#vr#���Xgr����H�������c]�S���p����E�YM��>V�~X����1�����8���O���-������3l�Be���@n��SzB��	����		o�A��7u�'$�h?�'�X�2+v'D�k�^b�a��X�"����5���ex�U��T��]��;;�<��T}�B�3�<<���M�M�G$��}JE}g;}i��/���.U
�1@,��MC=�Tb��{V�*v`Ks%���F�	��pi�O�^,52�D%3N����{[!�"0�#�_��,6e�Z���Vzoo�	�}�RN=��'&�*V��������GK�&{jW���f��]�)����]���)����Xs����8�r�8rn*��>0�"����l�~#�9q��l��d�E�>5b3wK�>L�W��<�����`�������=�$����z%���!���m������L�l�����=��2A��h�m���Xq��_�`g�-�c^��$�T�����jcfn��$��"8�:{�|������<�~��le
bL������mym�@'{����*�M���S
�3�!V�}`$1hh
����	X�l*�����]a@!�o�S=��>$�U�-G��mym���E����-�wY�����8����@��D���
��"H�8S�j����Ny��E2�����J�`GB�����#.R���W��]3*n�i�&�M�+�_d�tg��F4n��ouer���/|x�`��T�m�8�������p���*�^��9�
=����E��-���L�
z@3Z2�	���R��]`��RV
{$U�v�@;�D6�8�-sL����]��lg�;�X��c���H8�m�k��2��2	M�}��	q����S�
�>=r�?o������.�#!\xq6����C?�H��	9�Y�����%�{����l�h�h�{� ��M�E�����c�f�~g'4}��0�,��*6u��v������.\Q@������:��R��-b���5���*��;3I���������Y]��������@\���a�@[d��Tf��-]G�����|i��*��1m��|��;�c[��Xz��bQz��!�9g3�G�@�2�0&.MY��3)%h]���=�w���k�����i��F��������H�0,l�*��o�,�	�=;����1�$z�����L�%Q:�-*�YK�b~'�����������e����k��kg���%������<�a����A�m��S�_F�L�Rle�/����bFp� mg��������w����,�g:���[���;��O;|��^�~��������>[�g���6U���@����6��nf���_�dKS?��}�
�|�.v��<b;�V�n��O�s�������DJ]�rig9��a�I����,�a����m�|��\���S��J�=.�_�=�'oK��9�E������1���U�fjg���OS�2�5D�����Lsv2�XX�+vyn�%�5��KEO�����nRX�'��g�\����������X���M�(n�	��nY��jM�<3�|X��E,��;n�n%���@E�{u�������7��
����A��E��v�#��s��������
�~%�V���w����DeA�h�)�q��a�|bO1��Tm?��K���M-�T��h�g����M����'���$��Tmy��(��lgy���5.G3�a�u^;�y�����p6����L�(��L=e:>����%XV?��btA;S�~�����b)&�3��5S��R44
�Bp#�	�?�-U�;;�����6�X��h���,AN�b)�bO����b"������#tCGR[o=r��3D�8mg����`jd�^.v�,z�w�u;�y=�,��<�~N����r��a�)�/��.&r����-�{��8�<m��m�;k���%��	�<�QY��O�`�a������f<�DC�n��S)��pQ�
��^��Y��P�����D����DB�0IC����a�	�2�+Q��-
��ofuB��[��C�D�����<ba�2�gbi�y����6���f5\]�^H��,�������X�R�/�}�oH�&
s�U�;+b
}5F�$
��]���w������n	��n����EW�����K �D}��3u^
�n�h�w�]��v���(/�;���-�b��;a�`��n"a�$�����ip�K'�,�����F�Q�v["O�4��(6b��q������%]��'6����a���;+���E����d$�	SZ<�3�`���Ml�dZ=�+
+���C}�6U��^���`�[������N50���3y����LyX4}�8�9������>�a��P�\ �gL�����L�W�`�3ba[P��	j�={���g3S=���,�z�����L�;��pu����0	������b�����E�D�n)^(� �n�ba9Z��fl�..I���������Y�]/Xh�Za�����`��k���-/��	z2}0�g7��Tm=�\ui'���5�;������H+H���
>��J��D��������`�����0�L����;4���������e��nxr1�E���f�\��BK������
D7�:f%[�!X=�f5]��B���,�����t����A2�0CF��Gv�m�l�h�d|�����q�������Qs�����;,;�B�$X��(��+N���6�y�j�W���p'
&I��K�*2KdK�3�wk;�U#XzoC��N}��Ra�\�����;t������)#�Fe/��;���&u�&�4�a@D#�hu��(�����l����J����E��
�k��s��&�I�:�
kI���DC�IiCC������,
7���~[^�0������
��h`������;��]������Y�}t���+�e�n�NOt�������E���`S�&Kaw&�-z�+�d���Ur�����5m.��d�3��z���R���b�;�

�`[FS�j����h��
�`�������`v�������=vD���wX����k"qXdy0K@�f�o���"oS}<U8���V=2]��|b�f�%�AfXUz0Ui�������;����1�m���-��]�l����LVZ4�/8,I����e�93O�>�x��uF3��
/P��c7c��8,�=�`;|����������!��6k�o��^4��%v2����<�9!�3�7>��[t�1���8����gU,�C�����R���6`���+D�#��6�m&Lf�y��&�������fivB+��+���6C���\��Fd.��RFb�,�=n�k+�)����nb���,��qY���}l����
����7��I��%)�M��o>�:�h(*��{_����
��0U�K������oS��CW&��X8Rl��/)�C�����x���ae��.��pa<[�m8�@��z�U}p�d����8��2,q���W�h�m��+��	��`�P�Mf6�)0,5~����-����a�����az|�G$Q�8,�
e�M���L�A��+���^V����_�h�!%��B +~��$z����lM0�#�����2�e�bG�d�n�7Xt�lrX�{������6��V�m-�1AV�,C\,
��s��fZ1�vV�%�@�P����	���Eo������
Y�{�p�����;_$Yo3�
���M'�`
�I&'-��Os�Yw�������Dg�a9i�BM�Y�����H�g:��1mN@M��0�da��{��nA/V*���-,��s�g�V�p���v��x��?�"Y�.����X�m	��ai�S���&���x�-�|�����G��

7	%'�u���t�}���V���q�0���G���
9s
������+��	��#�M���y"k��42+Q��t�������>Dg[���v0���h�YV�#v�sSl������G�t�a`[#��:��*��V0"6!�4��<�}t������`�>�+�K���5���q["20&�f���v�z����v4����;�1�2^lk%�-�>7�����l�0�c��m�G���01�r��nKdF�����XV9&���_�:��@D�>�s���Y|���am����ECaq�g�m����7"}g��w.���1��������#�@T�^6%gM�(�W0�M�a����v�}�����
]�AoxQ��5<��
�1:3~ kaC1 �)������
��B��?�Iw�p!Y����%gM7�E�0
m�;�����`�]�+!k?,
=�E0%���;��)�0M3���V��� h��El��,o��n�i�	���0�,Ui�{���V.hX����������4���������E��`�cx>oG�m�lA�0h�rin���Nm_6c`�{�4�Bb�Nb������5���]�=U?�������`���;�����Lh�r����X=�#S3!r���*������a!���=�i����b*@��i�g}g
G���<q%

+Z-g����'X�"ih�Z�Y�IC��`�S��y
l���B��9cUX�y�4H+4��NJ���*��7!d7��|&?����x���`iIb�^�5��9cYi(�j�u%
M��0�2���6�2,ugX�#.n���u�;��9�:�$���4n&��2��%�o��N����f��,
=��$�7MI4��d�r������J�KT����Tm�������)�d��+�_��&�v[ [mp	�f�]�vL���w�����V9H���J9l�������[��m�l���r�Y|��A�@��D4nF��2���,�����F���q��$�fXz���$�[�y@�;h(�,v������{&,��%��w���7��;���6����U
�`���;�6����o������k�x�a���3j��=;2~g������5<sECQr��%�a�� ��,g�=q�OkaOVr'Vu�e�������{[���?�[;��(��mL��,�������WH�����/}n3]�)�����=����nOY"��b���5<�v�������6\���f��Y'��O�hOvq
wY���&��`�Yxf{��n�k{������Yb���E�u���&����'��6�n�ba#!�t�v��m�l�0�n���!���b3����'�E������v��,v���1����
 ���p����M+xOV�5��
���5,l?����LJ��,��/@�g?��,K�3��,J=�(����
����nS�M���+S�K}O�B��g����a�KN���/A������g����I�>��1�YM��������V�,�����Zk~+1.���=�������]����'����oOi������,��,�QUY@pu�MHL���I��[o*���l1���
�2���'tX6���O$���4�������O���p�E�~4��J�R�f�
b�a�V��tmH�:�;�i=Y�����~��+����G,��
e<,t��{w|�BgS'p��#�G8-=a��M,�(6������j����o����^���[�����������)��m��O)�������=����g+��
�L�nx`�����������#Fg��Fv�g��S�Xf���Y��X��Z��Y�a�V��t
KP��3S�B�����$���G9	c�B��	%�.Gz�m8�t���q�������D��i���DQEV������Y9
�i�����EgJ���'LOv0[��Cb��,W�O&v<-v�Q(�-���w��@���a;�4����z��Lm���t�ah�����8�������f��]���p���u�,z'�N�N�������Vx�����e�0~�#����'�M���7���\�I���1�`+�${�|��Q�}["�0=C���������i�
,
��M�\M��N��t�7
��lj?��=��~�����A�-���/���xE���42dQ+C�P�47R,K���=����
��L��&�z��a�=��X�B�F��-�H��'��
�]��L�����������2S�}�Aoxs���y����o�iC�I<��*�f���S�����'�5������������M���v�dZ�+��
6�zn�_Z�j^�Y���
7��iZ��
��&�|����j���IK7��&�� i����`<����+�3f��t'4
���K���k�5m'tH[6��������D:wZ��N�q)��oyq����D^�Q��F���@�d��{B�hZ�u2�W�0��������6�EZ�u�u������3�=��W����jf��d���,ACI=�-��gZ2u�*��l�����d���+L`��'<	�M���V�LTt�+�}h,����=n&o��Z�A�mG���^������m�lL�������X��JW7����uY!�N��+�R�.�$�M�ND�X��h>�����3`���.i���#�&�KBlfqmJ�|�������lJ0O�s�:���ACU���Z�~gW�4�������I��H0�QO�����X�U�j���?��6�4���|;�l�D���Y��q8����f�+`�S��PfN��P�!�~\�o�k������Tv.�x.�
��xd��{\v���d/��.f>�f�����m��S��H86X%�X��]�fF�XX�9'���z���	�;Y�.����7xY�t�lW����<2su�==����~L�mv��,�������q����3�r[���Ef���2�Bi3���G�NX����0sQ�Y�x���,X/���6�/f���[�J�D-K��F��ak!����e���j'Do���_H��f��1m{�;���hf8�OL�S�N6.�q.����o�m8��,�Stg1E��A,��|a�����eI����;���]�R�eY���5DCa^�,��Y��n`��������Ou�O'z������5|w���P�q��e!����������DQ�|����T{<gN&��-K��f�����-,�Wl&�aY�t1� ��9��%Og��K+7=XTK�f^^���Z���%���Y	��T��%
[:����y�lg��%��xv%r��5O�M}���ES��a�������QY^���R3�.x{��;���q3���j�[��#vC���V���'�����b�:��������.k�.�y*z$���5Oa
����s����e^����f������`a������mym�1�V���Olc�8b�q	�=�M/�+^���X�|+��I�6!r��,{�Q~��9���tg���������	�e%�����k/�
�E��|���X����^��]�;��3n6�0�,i�`DK4���4'�Q��-��
�4����G�(�{f+���v���m�h������[���
g;�)��~�`��������p_�]0(!eZ:�0	�A�4mE��b�nv��zb�

6���,��X���S��;K����'��f�,�{���o�y��<	Dgvf��f4lX"������`l��(��-���K*�@�.X�����_H��2V���L�G��b����m8����I�&0.K�.&-!���@���v�����)#������A��^-j�`��������b������tM,�w��g~������`a�P�����	C�:��	��.0g���nS�M�4mM�rx���N���n�����U�e:������|���pi�2a?���w���p��o����`�p��R���M,�M�J����`a�(�#�ieY�v���h�GJ2a����Q�`a����3o�M ��kE������^�D�/3l��g�����]�^0�o��`�w�B�|�4,8�N��]t��������,����P��i'O����������=,������^��������YL:��b%�m�>}��,i���W����*��d��vh�d���tm��.&�+�F��m��r��u��	����|-K�R�2hx������A�`Oq��
����S�`���P���p��m (��)�|�64A�xk��`��R,<������M(�-����=�'}�`3�#�B�F�P�,��j�0�q�K�m�l��
oc�y������J��cZ��J6M�4r���p0M�_�m_�
g��-��CZ2��2,���Q���E��KL��������f�06$�_����K�����`���+��/�P(�tw��f}ew]�?��H(9!���v�`���M�����)�d,
�Z]�@�/�a�&l��K��C�g���t[][O�A4��*v���=�<.�i�d�,'�d	
6�{Y*��������l��B�h^�/�b�	�n��w>,��c���Q����@��E���ba�j���3�V��&�M��p���<��y��Q�LF��x}����	�������R�l�G���3Y�<^P
c� %3�v���M��}��LXt;������C���~d����}��YD�,K������s[��%B_��S�6�����/z�I�,w}������1�%z���'a�n��-r?>|�9����$��d�`��Xl&cq[�u3�W�����G��m��3������QN}���T��dB�t[m���.�����f�*�����i��&6��y[mu3�U��C�=��}gan����"=q[\������6���������&�ti�S>o���Lm0}X�;���������h��T,s�x�����V7s���hBm��B���L#�m9���b�ae���-������Dw���Y����H������R��k�����1���e2�0v-6Sn�-
U�E�7P��YkN�{[�s�SKz����,�O���u�'�8}�!z���S�(|�T�
_x��IXx�<k>�R	8�����;�Gba|�l"�z[�FDDw����*�|��#�-��/V[m��������9E��b��T���lO��m��nx�6?[��X��R���5��8{-��Yv��r�[������$Dh0J�4E��f���'�_�YM����^�`�������?f�cX��X�r�q�"����.'iL�D12�{k\�������R��s�h��I7~g��#�`a��F�n�ks�Iq��Q�`O�����K�USO����� �{�����f�,�3�'��@7��
s���Z���ZHt�������9�������|gw�9l��
=3AOh��
����������?�p�J����v�}~���lO�z6���[��	�;�@���D3�E+zn�E�����(�;���q�X��L�La��h�
�1�2�������	�c.�LI��
)����(<��=��nS�=/_���H�|�)/S������������c�#�[��A���,QV�/��|
�b�nyK�����	h
�E�vx}�<�n�i#Z��Y*����`��J��� ��������{g�������Bh����gz����&����O74!D�mv�)�%XhnIq5��o[�t��ka���������2L4TK�Qb3��Wi�I�-��d�R�
X4T�K3��_z����:�/���Y#�L�`+�pI�~�C�7����K7����(�f�nK�n�]0������+�z�Io�i{������%�k���X���e��0U@��G��m�6F`��dD�8��}�k�#1�L���+����(uq�?���n�Ud^���&�YE�}]����3^J��n�!%Px������UD7��KE4a5[tCw���2�
��`K&��j���y�fbB������-���h��#�x:�!��TZ�tCg��)s����v�h�-����X��lI�q���'�-@�����)���'�V�����+�q���l���(��]�]8���`�|����d�M�1/�L�T�)��`�c�]��w���������V��
m�`'t �3�R��n(ct;"u��lz�T!i�B/�X(��Y���c���~*��2�.��	K���q��f�R�S������ZEW(���6UA04(��#��6�� &Aj�L$��`m�;F�=�g]��t5E�6:kc�}�>�n#���F��e�������m�����j�����q���3�E�j�`+�86����$l�'��yl�'��,��D��C��kj���GS�n����m�> �yt�e�f��Xiy�7h��`�������t������������W��Bw��o��mym���1�����*�6U�0L�T���z��7�;;aM��V�������=�$��p�����?��������I~M��q�,y{�# ~{���$�����������y�d�4���f���6��S�/@D���������R�N$*e�1���v//�5�+��S����}2��GB~��%�o��4$������d����
�<�x"���~���fY)���R�����~����;��K���=��Y��%*6��������1_��'���](��w��M�@~�����-�� �Hh���%����BE\�JL7����@wG����m�l|!Y�
�{�e�������Q���DC����03}6T�
gC)����K������I<�Q�q["[_t
WJ�0��F���*?��>��3�������;�:����q�w)��V�5��Jl#����>;agR���M�j�����;+�	���(����6����.�%;P>������p�m�������h=6��\���YT��;��}X~[@(��4�c+���e�6���7�-�m6T%n�U;�e��fO������b�GQ�mum��sa��fL��T��.���\�_�B���f&�V��sP,|yW�����-���/���w�Y�[?���LX5=�{�m8�{(l�|�G�lw�(��v�h���E��$�{9�`�Z�A����������m�l+"�c���6��'x�$�6�$������������H����e�fY{j�3��l6���&�_x�[���I(���D`�%�sQ�����hC�Z��B?f�	!������3A&�����������w�`+4u����V���<<�`����QY�Y��,����w������J�"��H����.
��Z����<>�m�,R���+1nf�}lj� �C�����Lz�7���S�X���G�^�O��"�4]�� �6��+��7N5F�II����n�i���>�c8Ks4�E[g�e��~���'>���$���v�Xl�9�m>$gm�T������MOx-���H����%�������78�����U��D��`;�� q�#
�L��w\>�)�p[!�"�V4L����.�A��S����AWh�K��&�fL�n�EC�9X&�o�5�7{���-��6$��K�����0�M�����?X1�&4�[1t����f�.~I���Cjb���5�������i�v���Q���Y�����H	��qf����8�j���CxC��D�f��B��3!�a���O�{3lL���iS��j�	?�x��]Y~["0E&h���))�����]�R��zl����1/$��;e(�Yh�i��y���y ���N2�o#-&���,�]	6��;m!�n���%�nlk��=��od��~�>�n������a.�Tf��U���W����y�`V*K�VzM9��;��t�`�Qav["[m0b,�r�y^B3����H��K�����'&hZ\����E��0R���$�m��������f�:��SCl&4�|�C�����V�> aQ��h%����"�`k��s�`�w�Ui;����/#����x��W�	�����v�m�>����d���&Xx�j�	�����%(
Av��`��N�������}n��C��K���E��L&��|�#���h���!)fM^�����M��
z�����R�?�m�zjz�7����Uw����vcz�o3����l�@p�
��:{�����6�$�]���M���M/h�H�;aN@i:���m���?��X����XR���wl#�kt���m�H������;������(
v��m�l@A�=��	F�5�L�k�`��z��������q�v|��{�b���j4D���Y�#�M���v,�,>��V&�+v�m�����U/N�Xv�x�	��Xe��/�m���
%6�.h.����Of��m��|�j�T��.zb���L�>��j��\F�^�M���2*��5[X��Y��L�!�&�����}jI'Xfr�e�a���{*�������8�Q�e�L���i,��J��~��dzD�o�k��������beg���v�7��'*�{���"�3E�H����*+J��,zA3J��,��Y3��	��bE����D��m���
�D7�k�|:b�B��S��d�>��V�Gf�
7��X,���EWz���
�8�n�i���<�.,Yl�����	���E��.��W�L�"���$���=��^�V�4-L�9Q�U,�\�Q ���RC�Jr�����Y��X�MC,�lM�@g�<�X`�����	��3C/�XV�.�e�\�B��w�#��Z'��w������]�r�Z�AwV�a^R%�����R�%��4�E/�Dw���G����7�*:����P�m��b��+�]
��.������'N1k����Y��X��j�,�PlF��X��@�+���ZA��m�s�)C�$���/�g���'t��;�:���h���2g�;X��W�(��-�-/&��K�7!����5�Z�4������a�/	Lt��q���3"r[^���-��L8�J�g#���I6�+��R�v\XF��Aw��&���\�,:\X���A7�9QTW,X\X����()V�-�o�pSD(������)�DAD���6������H�m�6'`0=hh�Js���3$�
����}�o�kk��>������	
^���I��o�[�4x�c��/B+�L��������e��7�`7<��0Y&��P=/�:.�DJ�:���p��X��h��,,c-�
��������|�����8��
���Bg[�� ���_�j�g��o���&X����6U���ze�J�V�(�,E�
g�������6��	&
"��CK#�Tc�����
�9���o����������q�2��c��`*�a5��
��`�����1���j��o�A4���X�Xh��aQQ�����-��'&� z����,l�&['�����M0�;K?
��M�\�r�h�{z��~g�c�'��,��\1L��/?�a����#W[��a�����I,\��:��������K�mmm�B�k�
�b�d�YF�f�{�o���L����<���C~>e��;62�>�F�.ux�L�<k������#��6U[NL%�4L3�B��T�ara���A��g���
6j���	]���p�1����<D����K'~M��W,��u�kw��	�Y'�0YD��	�N����	�A��X�q�l0}�[��m�l15<���,���93��f*m�W\� h��-v����%�|gS�{��n�k���^k~��������o�x�-�mMh�����w^u�0X�B�U����+��>��[���a9�T�����%�����M���T)|{w�����s�h�u�����Y:v@�a�{�s["��T
��q;�}[,���a�R�������/�h�&�I3��0�Rl������]aJ#�ahk�a�5����,��/L�S�������`7�k;����D����%����i�g.��v��mA�&�f�%�q�� ���L$�WP�I=``Q#��`ihz�!Ia�7�����:���E��y	65U����QR��M����r��C%)3��f,y������+\�g��}_��|b��/0�/����
g�&T�3j,�v/pO��H�?����x���c=z��D<��d=����E���w��/����P��_`,qK;$�������q�p�A�r������jz`��l����}aJ������p>�a�P�=�&���U�+�8
?H�l�6���V��W��j����e���L��j!����O���,�>	=��Sf_����<����v�����N�����h��e���=ke����j���lu���v�f.V��WVK#j�m,F�d�K��sz��hR��/B�!���X����$g�����.�.�e�[��w�2	O��X�wv����p�T���L�-���ZzV���G��6�
/&�%��n����n$���52{e�6[��0/o+d#����np�	�N��Tm������U,l�%v�C�<o���%���B�'<���
�l��^-(k�Ew��7��M~=q��=�]
#	fY�N�Hxv���+.=X��X��J����&��U��Wx�.�&�����+��
��=r��=�c��,�],T�[Y�Y������f4��'��E�'_�P��Sa�;������]{�sb�=�	D��\���$�������h�Y��_Y����vB_k}��=�->����7���=&����t��F��7�=
����t�+&�[��a���'��kJ�v�8��p����*f��
�$��eA
�,c���R!�gfVf��{���g����)���	����#����5<���, ��64���h�sB,+
��W(X�m�;�V�v5}��7z��&4�����c1���j�'�h��>|T��������Z��O��AwV�P���yimj�z$�^5<r�n�le$���6�	�[{�B�K4t>�����eB������(.�nPY���w�`�_�n^���8���^��:y�^L.^l�)xjq�hCT�����K-2q���+�=3w\��W�CD
6���j��`W&{������0���_sk<��]�xX�L�z���������s�4�F�[��1m>AOI�D�m0ML�����5�%��5p�N��O����u6v�NB9�3��r�(I-6�+��B1!��*�����,��TV�$z3Qt������e�r�Hu���-Mx����_��0
;{�����B6R���y�����J�^��h�QaK���k����s9�oKd#��!a�fR��X���.�>�8bu����n��~����/�J�K,�yt	��5V+�����Y�AW�$
�=oV����CE]f���m
*S6��`�=����y�;�����TP�Q*������^b�;%�����	MC%��1����LX����9h��Y��1�`�����
�9g��nVP��>�]uC]A�0n��q����4����&��j�z����x��~��
(M���`������S[�M��/��{6�L�����^�LH�������)�}��k���\�t��O�������M=��	��5��`_�Xx�K�z������[T:��;<W���h{���=��	&�*z����$}\���L~_t�iD���1C�S�,���<���mym�@�Pr���������S������c){��#�6U�@L��Z��x�M�<3.<Y"��`wB}�Z���k[�F�$��c�,<��(z�7!���`��$)��7SnI��$�E�x�F��*[���Y��0?,X��i\(L�r�����+��T2�
g
|-W��z.�m����)m{�� l�@�r��F�V
��fDgJT���?����{�������5A�����|�B-)Cgs+CW(���F��'���Z��;�.o���p>1`�E�T�!XZ�,��a6��o	����q���g���+}65������k;W��,z���VbiyB�+S,n]��t�E����A���1���v�k:���o3�)��[��9��al�!}�B��V��hD+���Y��T^��^�w�t%��Z<U8����! v������U|�M��5J�N��7Z����fUh�?{\��������6//|��U
=2���r~��c��
=^!d��,KlI�e�%�+���.��{M\���a��Y������Sb����	����"�����Y��1�G4���X>�g���ba�?�g/���n//<��[���lITw4+;7&4):��������:��n��a���7�<�YE�Xh�zvr�����F�*t�+4��5���������b�lzs[]1,�B4�f����>o���������E�����T
��F�#�f.����"DoV��Yn���S��b���O���p6��>hX�#�$�Q��������E�o�`�Y]��+�m��aT^l�'f��U�qY4�l�n�Y���9����kVWn,� z��w����m��C�wK*���+6P���l�Hn�&C�H�J6kC�_��%r�={�&�e	bw�D��0���>���$�-�7�xa�n�!�r�{��OX��	z�T��-���
��fl��=�?�E�t��x���X&���tnV���Dh77��c[��],�����N���
����_8��[�V�%������	�Yp����.�`�b��w�,L�-�m>��#z�X_�4>,=��&\�:�}�Dxk� #�L��=��T�h"����p6��h�����n��)�S;�%�9��mym��Od�p�D�=���:
�s�vx�
���D��J��j���*gD7��"�����$�Myu���(D��
v���_�}hRgN$$6KS{��g;t���1?qb�l/������/J����=[
��6Sg����i9I�fe����E��k,���D�/���;eX�cF�(<����6�t,�<5o���a��}U'��2P���&�g�w����M���4}�sg7�4#G7���6�e�����v����}_���[�Y>n*��b�
�>A�V�b�����f���6x�:s�Y��t�����Y��4mO@s]*�0/U*��<;X��V�=:�����R�1a�X��TY�8�xs&ga#a�gD���6�`�^�o�����������:�
���_�`a�__8��'�l5K�6&�+�L�����9�����������0+$�����6�`|s$+�,����9�S�;[��I"��s�����|��0sR,;��fR�,�{6H�8��vBg�0����P�V�-vd������+��M��V��W��O]��p�C����zN��mcb����,
��i��m�N96S;������L:��v)�]X��Y�$��7g0{�����L���-�]�f������^��/��A�fm�9�����E{Ex�H	7�-��m��k�0�tJZn'2'��JH�6��Y�1]X����={����.l������,IY�
L�t$������X���,�)(���kc���a�_��i�Y����h3�O+�6�(+���{*�gi��Rq;����	AXQ��dI)�B��`L�E���:z�D�f��Y���z ��2-E�m�f)�3��pay��m8[Ote��W�`a�<�v$��epa�F�%��?4k������D6�t���2bv��{��
�f�]�O*���u������q���_�m8�^�l����z�|gk��o��p����+����c;�������r�%�
7<�C	�`;��[2�{�+7hH_���s���ch��r�����*B���idX�"mf*6ulZ������>�"R���FSv
����@�5����3)�Vvn�2���|G'�9[�CZ��pq�S�q]X��l�q85�N\��(
�����20XZ����=��6g�����j�X�a'��3��;�0F��>��1����a�{���&��D������hE/���8<k�;�Q"�����6//��Dof{����>�):�DF�6b+�8�=E=oK��D���8�&�,�f�r�)��'���:�Vd'��.�=��c�w6|9�E��s���5bK�]�c]���J�NXk�e������n���>��w�����q>��������,�-���eyB�Z���p�>V���
��PFla.b��ncb�d����dz)�]")'l!Ka?L
[t�g�%�����:����X����W�����M�=��:X��X[����3�5�&���C?,�"�$JG5?��/���Tyo
���
���f�cq���K��5+�P�����+�^����H������Bi����E�a���t���D�cA����Dw��,�����%�~g���m�l1n��>����/Sl"��X��a�f�W"m�����@�f�H�u�ba
��rh��V��4Dj�;;��,\"5��oDT�-�
/�������h�J�;����a��'}y�[?��Tm@7E�^�%��r=n"��X6[�H2�,�/��AR�,E�O{Xk��������8=�

���>e}o��hf�b�����
�������w�"q�-hJ������X!�L�X4l������y#X��E���-��f�h�V2��H+9�����I��,�D��������U�y-�g�����^`�
BE��V��J�3���M�X���y�a9��s��[P:y-�k�EO����4�O���/��>�3��0EO�L��n�l@O�+�=��{����TmM����x�u�9Se7U["�XSt/�z�V�}���UM������Lm@c�P�Ul�l�V�}�
�h��U�w�`'L�z����D>��r������7a�"�����v�k��>��pK�_�L�,t��KV�Y(�eB��o���1�*">�$~����f�,�����d��MHr�p�lji���Vl��Z&��Wq�p���^�`as��c�n�lx1�G�
��M-����>��w�i�
��A�f�b;���B��Sa��t�y-MO���Wl%C����JA"�p����[��LT~�0wQ���lwK%G�6��
����.M�������"�&��e	��j�f������|�mS����Y"k,��5��qA�������E���
g��R���{,�U�~-Y��O#���0,�1�[��*B��;~���h�@���n�>�a�R�����������4y-Y�����X�XvVvi��]��(��@>�������$�����'�\X`�����V�������3����m:���VN3[^0�Oj���l��c�[)9���dA?��n(t�����W���c�jc���a�l�7�6��O�����k^�h�P�!h��&�n	�Bcu�_���)W|���~��#�k������v7����`��&�l��6��f=�F
��u%G���/}��o���qa�Rh��a������n0�b( ��UI��V����E�� baS"��oK��
�V+a2[�
Z��������_x��j8&�E������V9M3��A[�f���2�n������%H���q�`�BO����/���e�v�����F����e���-����K�����S�I������mm��Ht��9ga5��P��I�qK��M &�m:=��(��V�~��o�!�l��h���x��������/��D�}��~�1.�F5g��������m��;����0"�q�KI���E����Y^����YB�����v�m�K*U���"�/���S��n8nL��t�7���W����b+qv�o�0x���N5�����q����_x=
�C�^�-�wS�t����b;�xB��.o<1L1������6=iEWT ���B�+�UI������EW�5�Y7���^,�@lEx�Y�����h�#�n�����Y��o�y���s�b�n���&�%���>^^tj�n��%�`
6�J7&*-�f���ob��-t�n[�fi���G��pJ���{�r��,<��KK��Dp�r�p���-D������=�����P1�4��U�W5��
 ��K�=��YlV�9go��6�b��%��tc�*�o��&6'���j��]�Dw&�&���f�Lo���������Y����;�W!��Y���h�h�+*��mLiC��r��Z�C�-��6�0��TB/Gm��+��h�+E8w�k���S��d�5C��_��B��jb�2�T�,�'��@�vV�?n����/r��jF�{L�|�� U�?��0��]c������tg�d�9Hx�����M��f�,IMg*��B��Zj��_��>��
���?�����X�j\l����
��M�������g�]u�Y�������*����A�SPHkV�n�lz�;�Xh�H������Z�o6�w7x���6��{�@����[����,h�6�w����j�rf��jS�l���p��e�e��b/�������f���t�D��l�.q)��K�=������!�:{c���aQ��tQ�L�
��)���b:���RYvS��	�����ba�B��D�m_�5���w8\��pE��	���+�=�
U��
���i	�BM�y���J��f-���|D/��d��bGA��Y��FA�,�Jl��am����E7hY��� }�)m�A��%o�5�+�=�F��@��]����K�����4������m��fUx���;�>H�����mL�le�lx��M�Yh���*�fYx��,<LF����EB~�B=S{m<A���|)�����d)�
�W5��~�L��|<=q%Fa
�F_��e3��7<O�������)�X�W#�����b����Nkf�ZC�/���~�6�����Uu��u��T
/��v�	�����t�Z���9��l���<f'�HFD$H���<�B��fQy��M4l>����q+�9+�7���2|�Xv����6p�SN5�1L�I,��K���r�Ye��L)��:p����J2�/��!�Y@S�p��6���]�4�B{c
����5�r������(}�"�� X�����+4<��-��mYo0{@"���	gL�x�Z�
&w�����I�P�@��$�=�B��fe��O�N1p�Os6����4��(��>�ba����+����i<)�Y<gs��n�6C�'�2����B+/��r��=u�ue>�O3��W+��E�����2�
�7vu���^��`����al[,��5kx5	�W.��o��
��n_��Tywlx��+�'�u-^l���`s�Sa��)fe��
����	��`��L�[p�[�A/W���w����f]�[��AL����b��c4g�L�4�� ��]�����
����Z��Tm;�Um_���,��{C�4���V`W�j�4�Ht���
g�	�?�a^���g)����,�������g����$�
/���!�n�lxA��X�nli���wc���i�a�4!U��,�)9�����
&�*j�7���R�n8[L�[tm8��P�dJ��m����o�,o��mH��RR����LB��si�o>���-���#!m��,��=,��[����w�AiW2�-��`>��_���,Uw����(u�n��/�{��/
��Y�����\_����Z��z����,�Y��/�������N\�Z�
z���������������DAC�;P>(~���[��1�n�4�K,,
��a��X��<�1U8<�V�`���"j�T�j8lj%:0�Y��[�_�|�����fbc&�,n�I$�!�d�����zr%�V��"U/5���6��A�9���F���

mpUe�����"�����f��o����[#�����Gv�����a\Z,�]�������q{�J��su�L�}�l2'vS}=U�#�fyB}J����%�b�D���q�:�������Yf�0�b�]�0$�9*��E�;I�:����B'��O�����m�n���.4�����B�A��ygJ��aPIl�~o�j�����a`H���|b���{L�1L�\�`�v��8Fl�v�i����������Y��p�'����,�p�{3=)������Q��\{���:�p����	�b)b����1}�2n��^���������s��>����h�
�4��������N���3)�������W���z��sv�DN�U��0�h��%v��k�[�^,
�Y>��	
�`�B����S=1������ni��d�D�fCw&-�be�b'<M$*�T�VNC���������������1m�0I8�� L��X��l��?�K��j������%�JWM��DB�|X��G�+���/�u��MH:��EP7xxF�n�aX�^qgz���Bbo��0��x�+fY�b{%�d�b��/fv��Y�C������)�o7U�"00#
^x���/�;+�jk�v��^,g��Y]�YC[��Z���R��Z������z��6��������������	�������^zbg���ppg)X��D�W8{7U�t�Z_��6�YJ��$Y���&����Y���Q({������S4����m8�Y�������Q�dyMb�B�}mO�hW�9x���:�K=���U7&���&�/��-�["��L>L���'�\���fV�b��;���_�L���g��nymN01\�P�@,L���.|#TD\��YH7_J���	h�����CPP`�����������N��~�s�������5��/�	vA�_l�)mx�z
�fb�`�A�~f�^����h��;�������Sv�n�6�`@�}d������n���F|8���z�J��R�Y��p��&���vS���dtEwxY�/%4^�9����;�������)�R`�A����i��^�k�|;���D���lG�|;t�H�:��}�M���qt������U�hz��p u�
��5|;�aI�7��v��\�fD���6�[�����bS�n8����o�T�9�	��`�}{�J�-�Ov:��aY�ba�!�Ov��7U����VL��0-�
�����T}���.�,��T,���`�������[��F�E�n�W���Gw������qa
�PqC����`��j�["��LrU4u"�B�g��?z��?�
��R+�Wx�v�;M��7h\X�$���[���c3h��Y����s��:-<n�`E��r�^0�tH�p�[�6�7�SAoa4�@�8����m��f;L�
��o��1����>� B�����i;��K`��@�R��,����7�D��0�6���Ul�����gB��#��[�%�(n�Q�P�#��6����-�K��A&s%v�T�`����"��QH��R�iQ��DqE�(��m��h��k�(.�|a���l���

���m;L%�U������y*a�L����nf��C�$��I����e^s#�����
�f�����`�O�)��u}
������
{��]Ie7U���tno���+M
,
����L}>B���rY*i�B�f��*w��sf�����Y�C)�	kY<2�5�0��z��{Z)���(�z	�����K1�*�/�0�?��Nu���w�v����W���-�
�X������;�z
o��������<:�E?������+6'���~M�3�ov�{{y�;+Z\b�#6o^�,����oD���49��Q���p���r������"���}�w�5�A��pJ��e���qW!:3,�:X=���Rr�V��Y�=,�_X�7�s�X!�%���H���X�da���\���,�aU[h
�f����8��7p~�I�%Z^"�����g�-%
����+�1[\�U�V�LW�dW����m,�Z�(����t�7r)��}������������bg��8�<�z�h������a_�d,����������d����J�\����b������lX{x0�H���F���e��{�����;�[3@D���B�yX|��������0�/�� V�,�.��& ,������,,y;�������X�8w�:-� &l(z���< ���y�^��N���_y���l��;���Y\U,T��Y��XzZk��������>f�t'R�Fa���,*�[!�|,#O5X��6���-$*k<&�,��n���b[��j��/�ACM{���Q0�z�)������l>1��Z��^��x��������j��Y\k-�������,���X/y������\��Gl
��&�Z]�K��4l�$�����?�������U�a�E��7��<6
�@;�5���=�=H#�
$�B�����`j%�����
;��
���`j��+�����Pf]4ts>�2�6����P�`B��������~V�e��F���X�i�!;*G�������l�����m�W�����c�����'��~����#<:$?������NS�)��+hYIu��H�0B��a��>�Y���VP?��0!Kr�p����/��+L��,m
_o�����'r���Q,#J�+z�B�aY����p��{&G�n8�Tte��>����`R����3X��%�"75,�J�����nW[0f��S��w�VNd���.4�2���Tp���X����e��#6A?0����i��:���1m�`�	x>����W����>ln�v8\��3���r������-v&��fu-i;`��di�.����pZkb����UpMZ�v��(����f�m��^I�����t;��t�?�7���}���qg�|�NDWlo+��F _���r��U
��1�����
����W�Rp>g���nK����n��#!]x���+%?�L�W��U]�����Z��]����	k�|�r��j�^��iZGWy8|�#� �����~/��
E�N�4$TS8�<�Q*�_��7������A���`���/�k�=AMU�0� �J��{��:h�q,��#v�+��1m���4i���~�0���J�vOi3j��A~������|�6����h�'h���������D�M��Q��1,�;��ix��/����.S��������-�M/;
zB�2�p��2O�c���`2��agt�4���fo��+Kd�
�?%��?%���`�9��\-�;�atcb]b��+��������&����#r�vX�9��xS���dZpx��|��jd��6�����/rA�3IB�ty�c�mzb��4�1a,�b���������f���9�K�n�l�t�T����p�_���1m������n�s������]I2�u��u8�����x�?�U����{/-kX���a���+�V���w��]_W�svBW�B���tea������a�S�y���]��V���u��=qs�K�p��`W�{b�n�{t.��
g���h���H���b�d�y��-�-7&�=,�
�T%�h1�\�|8\���s�YxC^j\U�!|����4<Gd��\����f���c��{y�E��#:wc�
wy8�t�����qbY*�������*,���E��N�9��!�"���D3��rK���v�L+COvR��q�i�����E� �X����������,��[�����]��(��y\f<{�Bp~Z�y2y�i�d���~7�����=tQ#��%A�}��M�d�(bW�j2����Ewz4�/���T��<�.4�� �%�
�?��)m�1�f��]�������B~�����_f�PN�]1��W������%����1m�;�h�a(v���L�������d��s��svb�y�B�eZ%yB{�R����-t�V+�,4.��������&x�^p�m���-��6z�D����yPa�+1q����x��(�d�,Bn�% �m��W[������Z{2��L�Y��J2�r�e�;bg������=VZ ��V���1Y(���=�D_�B����.�V������x6<n�����'�n=����f&Su
�)����'�Eos.\����D�,/H�S:Klf��A����#�� *X��X�=
�RC<-&=Y��hX�/��0���2���q�����'��I��U�����K�/s�����M�6�2�f�3f�'@"�ty������d
��g�Dv���`�A�K��������{J["�T^�]=-&
��
s����Q}�m��&���Tm��2&�����x�'=Y����P45-�+2D�������j�����<rj�
Y�+��~���ZQz2Ei�=�������D���b�B�P�{J�N��.�zO�IO�C
����R��T}���N������#���d�+�J��b�����U��}�1eg�7�tzy�L�-����g$���Nn��p>#�G\4+�������I�'.��������-E�������\�z���m	��JwD��h��|��o�\U��Jw�>�5�:������bb�rK^���������h�o�4�U��0QE���$�R�����i��^�J,M�lJ!�l��������U�n��Q%�r�F�d2�'<��<����bZ��=X�����r��c���e
A��Ik�o�FAV�fi����
'Qi������IW~C�QO��4��[I���s�����.��������K���}RPg��6E��(h�
Bl��i5�	��A�%
)��������
�y=2������{�X���D�aee�Yyc7U��LZ4-�	v�|-	J�f����["���	�
}&n�,����R��d[[�&��I�����L�j�:�(
����A"����=�m�V*�UC�BO����{��������i��b~"��m�����	��#:�_��o%rau���|8\�TJ���<�J��42�v��m�{L�0U4��b�;��7�%�'��$W\� ��0����0�$���y3U�N��M%pvV�s����e�sj�9��Z`�mD,�_��[�|-�;
��q�[��,�;a��dta���{����o��s%���P#V4���/|����{��{aJ�����V��S��`H1Xx9
��p�����)K�a=����l:?1�U�ySZ�nymyA�a�Y�l7�- �a���FJ���|�����n}�w�gQYj�`~c�4�k}
�������|���,�Y
���+X�n�7na+� mVG?Nn��V`a�\�u8\��\I�n7Q[1��
����`;��/��r�a����R�����pa���+��D�[0��F;a6��h�i"5ZXs��@�GC�:E���.�1PB.�|�9giEm�7=�"�
�`�2�nym������~7��'n��/]9���e���4��WF���
fY2����m}Yw�o��N5L f`���~,v��ua���m#bo�o�qY����"�^�B���Xq6��{����:�@-�B����P�Ktg���1<kd���|������X����%���::�YW��1�T����{�Z�b�z�d�Vhx��pa/2cH����,V�3��2�Y��P�(����UlK�ny��n]Q�\��^^,�B4���,D.6������rAOuY�8���"�9�*?~���������L�?)�f�H�4�5.<��e�z���'^�u^,��4<w�	���3nLVN���[�ICYg���f��0�A�M_���[�nymC5��T��f��n��n�&����T��t��M�f&�3
7��2����,�Al/��-�:/�c}�l�W!�bY#y17�h� �Q�_�g�U���x������`����EC�L�������e�,�����Q
�,�q���������p���l��>�������4}e�/i�s6+����w��B���Zq�8t8\�e��������hp��us����������)\yl:��K��%���W��*&o�2���k�[\[],�Xt����{p��WO�s����4�+F���a������-��,k$�X��hA����#Y��X#y�����W7�
/h"�����������b���[]�{L�F4,b���wS����
��������Tm;1�c��v�p�"�����V(�_X^���%4��F��v��*64�����nym�A����Ib������Y���������nc%n����������7����~,�K2n3���t�
�@G��cY�z���{��q���������%;.����8��=/A�j-����L���R���<E���Tbo�wK�$����U�a�G�P�El�.�`�c�����Z����u��6��J�:�ejBWA�cY/�
�����z7U["0���<<��������`C��@��h'PA�`Yz{��]����l��aM5�l�6',�����MOO�0�4�^��-9�,5�`����S
�n8�m�a��a�`���=X$�����d�+�7��^��
�f�4�|����a�����A���M���
���E?����/��������LsN9������E&�&��l�&mQ>�ZR�����5����Zt/��R���vQ��J[�-F��J��E�`V�bY�V_�^4{����Dm��:�~���`{���M���	��$���?�o�(Cl��-�m>�K
��K��V9��p���_��s6�T�Y���'��!6�`,6�&�{��H����[]}�
��/�u�}@lE�yY��Ve��2x��J����]��D`v���a2@���������/�L���L�Pln��yL��/X8%��QJ]���5��ee�o�C���	dev��.�:����vS�)ET�r�B��lN@�%��T��^��qa�d���n�lO��K�
���q�9�R�����W�`��JT����:�'�/#C7���s���:�i���tO�������X� c�,cO������a,L��~��a	|(x-z�I���s�W%�d��,}8\�01�>����YC����af���Y���>-������*1AS�&�B�e)�E_�?HH�E���_�[�������j
s�e���-t���l%�����M+�4r��vS����af������X�R%6��%�%�����O,�M)�%Z5��e)�����g+��Iv3�!�T�M��T��Ev�%R$��Y���6D`b��Q��������B�AC�v��+�c/E��P�#�Y1I���_�75{C��z�4%v�i�	��A��&������v����3��	��)��2��_0�F�0�@z��1U�W�����`�t���)�P��j_��AE�`���nym/�@�Z_�4�,������j��f�����?i��0����f����5�Y�����]^"�k�Fe���l"�=���$��i������q��n���N��2�v���R��+�,$rn�m��k����q��-����%��i��cv�+`���
��^��>���Df�����S��=����(������{���$��i�{b4'����y���w��@�X�L���y�������L4�
�!��������M[�X�����b�\>�����I�h#����Js~lr�����������
*14�B�9C�0�~���9���Lg��n8�����v��"�a��p��
�����lM��|~i5���*�8�����@�k?��6z������yd��w�A�y��h��}Q��YC1;P��o��p��OH��4+5�r��^p��(��lO�������7��s��9����^��Pz��s�Z��hX^(��72<#n�*����b7�[�(��4����Q��Yz�
��!3{�Wz�l-"�D����F�=�a������w+dz���YqNhi�D����Z���rz�E�=&T��cQ<�7�s
���y��n����5���(G����#A���?x�?���{���Q6����G����k������:�w^��C�����}�>�j����(��G���2����4<<W���,�<��`Uo�n��#}��+������LOx�	6�y��JW����w�kS��x�����G�`�#m��os�N�f�f;<�5n
Z��&R#4�KD�YVSn�F�U�9���������#�84�SH���+�K�0T�
��T��-��\�g���-Ya�
Fx8�{���Y�f7U��R4+5[�N���crA�c,��r���������O�����^��,�M���!m����Wu���xi�"�w�s���R�7}��`h��>L:��>4l5n�v�k�z�,+�N"�\I�{m��Bb��3���@o������/���6$�oz���;�Q���+�9�Q���v^>���c����;Bm�
�h%"�l�������i�}4?G�+$~�jp�C���
����_����)��PBlK��%�i���M�0����L�6*����}.�S�P7[���x?��7)��qG��v�i+������`����|H��
�����X�����l,"��7L���5k���q��l�V�S�����;�����V
(7[m�|
����Xz���U��/P���BA3����OT��6�P!���wi��|�`oxm�
E��H��������}���6��H�5�+v�����L7X-,Sj6K�b���#�q+��-M���t���`a!��+���:$�k��l�B��h$Cc6k���j+�,����?�mh��:�3����1�@g@W�b#�VD�
L���`'�
u	��/s~�tvKd;u90=���O%�E��������fy��Th��.l	��"L
��`��
��e��s�(�[|pr�a4�����F��2��'l��f�����z��1��L}H��m��QqG�@0�4�I�����������fS����e�	��jr����-�wOi� ��]��Y�SK�
��mo�@6������ATA@�-uG�<��!��#�~�~�F�d��W�0�M]
*j0�����/D���%������iK��������RZ6���_}
�%�qa(-�'-�n�lM�������2�D��nA�VE����`:�������\�P����V|+��R�6������O!�D����O��V�f}�W��p6��Y��
��������M��Y����
��`����l?���/�
6���j�iQ�h��7�-�:!��������E�j��17*��$hH�������M���5��L�`�N#C�Z��W�t��&���1Lv�r�`Y����R�lk�����h����le+���B����eJ�/9����'xO��|��a)XY��m����G�/B���w'�B��v����4}L3
#�P�HlAm�r��������s�54;���n?&�DD&&$6�_��o�C�=������l��������R�S�Y�e7���"KD�MCy�����baDL�Jn���v//���W��n�����(���x�����5E��5����p�8�X��G�?a����$v0 ����6��^��'����[������)}��|��<����lr$����:K�=�Wv)#���w�M��n���`t@+K�����w�����W��2!������`�?�Yki��o{3A/��_*����� ��G�Xi^,l`$�a�b���J��nym;1���A���A�4���T%*���=��j�r�r[���������X�X��%t"���2\,0.�E��^��/�NN�s���.wV���~_�d]lZ��Lm��m6hV���19X�F�U��w�El#"���������Vk �uB7;�vW�=K�_,eN4^��b����Z����r�e�����.��\���XB�hfJ3�Ba��#>������t���AC�J�^�4��>���6=J�
�p�Y����EC&X�e,�����/V"g����$��t�����,�W,����VaO������EhR����B
K�:9������/x���}�I�e-x���4��xd�EP�2���E?�����=e�X6������}Y�o���c��~��;($4=c�Nh�>j�]0I-pNo^���7b��4XV"���>�x��Y]k�_�@A4�j���������19���YG����t��K8��*���[���9[���}��S"�LS��=�Y��j���L?��Z��k;�'��������$�M�4�W���F��7��^��l|���oV�����7�
��]d�B�Y�h��Pl���-�~�U�_�v��~�����/g3�5�a'.�0L,���c�����O���R�9���@��\����������8�n88�N4���v����i�u���w���3�b������w���b�����h7�7~x���3����L:H�S�[a���Y�����l����a�c��Q����<�EC[<��U������S��n�|X�ji������������;gt2�T6-K������[qYG�M�0y=�F<��L=H��oQQ��������(���1,�'��.rk�R?��{1��}����=��&,��E���s5��iWP��^L�V��u�>������.+�^�D(��barH��m��?�# vU����K=JA7X�a�mw���n�[�E[G�b����p�Ml�o�|��k{�8vkk��)�������d�34��7\�kZ3�b3�u1z���`��{Jl��?T)T���K��.��^L��t��tWE/�\����w7U�?�R,��CR���C����fS�������=��yfR��d�Z��_��7��_���e�\�p8�g��p�$�Z4�B����F�^L�K4u������`s��n�|2CV:�0z �^��,,��W�v�0a+hhd:`��D��P�G�[	@Y���9WS!�B�^��a�u�w+d�	�M���ki�����������F�0�*u����`d����u_��������{����;�0����}8�V��xY�7k��>H��loa������h�UM,l
j�>�7[�+�w�R���s�s6��
�b2����&&�i
�Z���������b+�kK���LV|�~�\���t�/}T'Uxk��c!l=��,�D��19�"�n}l`B'�h����Z���,M|1ib����odx��G�}-k�hhZ�-Y���W1�p�Tw����s���h�������a5���,M��������mQ����Ew���-��_�0Al%�����M3����#�D�Ly����nk1��zU���"b&%�����9��u����=
�-L�P�w��6�~����Lj���Jx�,���~ta��W~�jF��pMl%K��l5T��Y Ol�TvS�����D��?��lx1i%���:Y���*��V�]����Y��i�'v@k1�	7 �[X!m,'�����1�]�6v�E�o��&�R�t[��f���aF�Y����>�����N>�^�,K]�b���[1{7U�1L����r�G.Z�����(�h�#����������|b�E�Ra F{�.�V��.�fk�x����S	
�B����4�1����f8�1�h����b���XXd!���-���E/�1;Y��,���}
Z�u�o��	�R�r[V�����`��V�Q�-�|����+v���o�=Y���^���-3|��Y2�,�S�`��b�2�Y�7[zl�0]e��mH��a�VB������h�1��W��n�>�Y�V4T�;YF��Vhyv[��VA�zH��L�Fl�\�,�|� �h(O+� rv[,���-���l��g����v8��=�V�-x�������
�b�%Ii�;�����|E�f������H��1�Z�����ox�~$P�l�{���E�������|�����t;Kh�������`G�
l}�\jy8���<gx)
�a����f�,R|�s/��H���4�%b�������ih9X�GKtn����<	D�]$XX}$������{��7��=�cF�n�vh{�r��>l�B�����P L4T���LK����=}��%�
DS�"���yo��@�=�M/���7��j�������s�v�A�UM�3�������Gf�Kb��%&��������
���1����x��I��`zYV
�����A,5�%�\��,������9x��$3{��Zd�s>�YI������Eg	��p�������`oV�"�I���1m��6�	�A� �^��1���bEo�akP��47x�=�- :��T���+����0CJ���F}�"�^4�����Yz���Y�k-���7�[_��s�-�?�	�a��+���o]��6����e�ba���F5�t��-��'�Y����b����	M�`G��g��&�����|I���/��h���&�������p�����_�����n�%*�aY����'<����l^�0X&���vS��H��
�-)�Vw��6Y��h�IS,��5q<.�i�����o�����
����$_�y[����]�\�G��
7ii�CSZz��&���o	��8����!v����v��DC����a%����l��i��V
C��O�2���|��`?�p��+���Q�+��[![mL*\���`;�����0����s���km��>f������+YP�F�N��i�b�y7�M����&O��6z���m}s*�!���$�m���i���`�����dN�^�4nEm�"�79�wf%W���	�U[V�=��������U^��?����h���o&*z@{6�	����v�b�F��U8�,���0l4�����Lm?�Z_��������j���n^����V��af�hz�D9�g��1���`,~3�p������`8l%,��}�������ox��6gs��n�6'��"�fI�����.���in�D6'�W�S
�,<��B���\�+-�}3�n�0�-X���,�I2����x�
�n����#A,�k���z���'��h*��S���]�z[
��n��,@����]����9K=ez��H������i�����R��&_��Jh�D6�`��D��I#��)��-�w+dk&�,)+b���"�o�cq����E7��,�J����^�*zuDC�Z�b����bs��n�n/�4EC�m��e��=�7>VK�������b�m	b+������������y8�DX�����r��pa}���0��h�H$�1��X���X������|����D��f�����b'��4neu�W�Ea�1��B��cQk�] ����Gf!@�Y�h��V�~X��h�7����Tm@������b'<6���U��i���&�):G�w���a�+��9���|�� 9�X��\����
gC�I5��w�`���F�����Ca��6��7Qt���F��4�E?�[��V�X���i��ds��ud3�����2

I	'�p7U�V�S$��:D�]�di�~LV�QG'��q�����)}F�dR��s�..<�.~��*����h�b�U=YL�l!��X�8o���u�GEl+D��?LX4,a;�)��B����c	a��Etc�6�0_��fy
fYi���}���6�A�^����#FKK&�>K&?,�Q4�0�\F�z�0�c��H@l�����	v������
K5?�3t/�l?�[~�/hX&)j.y�,�G�U�2Y�0E�]��J���~`V�.v���K?����3��)��qY�����r��)�l��6SY)�h(�)�*4�z,M
[����zbJ4[�Mlj�\�Y�b7�M/VR,�^����d�R�_"���T�K���H���_U*���t��b ���,�����4LI����Tm{�����������R#:ga{�[��_��LP[t.<g4�4.+}��r�El-������n
\H&|,k�@�?��t/��`]��9so��z���b�Y��;B�����������Wi�pC����%�:����p��=s~�a�=�M>x+
z@'K���I���$a�AWz�g�E�&'��\2	jC������e�bs�����\��D��L���a7S[���_t��jq��|A�B)�cq��MmA�ln�Z��5.�����s������I����a��E���e�� F���n��c`�l���X(�g���n���|�p�Y�i�Xq�a����>��E?���/D$�^�
�Y\kD?0���i�]���1�Y�
Z������.�w0�,�����������65T�])�~��LM����9K�����H\�?b�g��-�a:b/�k���2���W�L-M��O3�@�L�D4�ek�0_G����l���[^[|t�"�s8�2CCj���8�K?��3hZ���g��������["[�0�*��B���J�L�
�W�U,���������-��U���m �]��|C%?�n��'�9���
s.��>�L~�TS�?f�"pu�����Zl��Q��;�1�����C14�������t��<?L�Y4S����%j�|�Dt�p�R�P�T�]I����3��r�
��d�92CJ��M�^���Qj���X'��[��l�0�g�!��*�4�:�a�����t�f]�}�R����������)�L�a�wU��0��q+7=�SW���+�2��K��o���Z��!{K��BOO��0	*�g�C�t�^���r�f+	��=~�[L��o�
��=kf�s�vKdcz�%{���
K��(����z_K�<�Fq��D�f8K5?0KNr�p_���
���W.V�~�'W4t:J]:Yk��������7f�i�E�S��r��9����6��I�gU�����_����`���`,z_���@����)l�:8g{�/v�k��]R=������`/X�����b����`^�T��_&�c�RL�&�T�&�e�zXK{n��A��h��7L�V��[���������`a�s��,����Z�*�f[�����W���Z���
��pK��V����9W��^KD�,�Dtc�s�W��~-����M���!���	������z�Y�����s�3����G��.��B��oV}"�:���~Y�@�������qs���c?&|w�Wr�9K_��@bv�����L��d�EC5j�P
��&��1�^�/��+_��������Y"�C�F�g�
�%b'������x��6�X�A4,�;Y��l�o�=��'�l=Yr�X�Mlg�w�WJ��-��6&i-�������$Ik&��9���|���Z.�[�h}-�
��E�)�k7��'&--�D����_,��]���j�/S�
+��V���V���9��E���{�b"�-����FK�
���^,$"J8��x����k��������/6�0��j#z���]z~l��f�p��.z1
L��blge6b��Z�U���Z��e�7�/xS�f9<?����a���Q+���'&�.:-w����s�p{��W�[�o�s!|�Z��e�������)����'x�z�/d|�&�����,��2]"��E&�=�Y�b����4������G���������bgr�l��/�X}�l����Q,5�$��v����c���'��%���o<kVx�qY����zh���R�:��/��R�
�A���(�0<���m�������1.�������D�EC�"����oYc��a����}]�v�i��e���`K>E���0�44����_s|��<gY���4�������8��&�^��Tm�1�<�P\,l8�Z���Yb
\���!&��d���j�	�L�4J�J��&�B��{}i��V�4�_�1���w3������'�����U�����V:��V+�������S����i+:��b�����/��}C#V#�U��+�qU��{�9��e���"��*���
�^��sv�n8����W4�.#�NG�f���~a6�hx�oj�^�&�&�h�TP�["�L�Z4,����'1����{L��r 1��J�k1�z����
v��H�Y���m�k��_���5���:x��2�=�Ov&�-�f�4fY���V9.-��������	
I�c�uZ&/t@��Z�����/�s�4���J���}�n8T�
�a����<gi���f���K����;gi�KS�go& 6��m��b�P<Nt��m�#�����l����/��H8n	�V�oZ�J/���W��BS����n8[�0/&n��vS��]y��Y-����"����hh�H��~!1,]�0����������<�D���+��`�ZG�v�G{��
s��r����e�h���/�K����7�g
e��.h��`j�����������i&�%����P�R����8=��n�1��6�;	��;�a����	��e�4�m�N4����5<���]��Z��e�����|����Y�t����b�;��TU�[ ��0�.h�a
��^#����u�_���vA\�����{�+
�������$���{%�n-��ia��0�$m�U�qal*K��yYG;Ko�F�U�`~����0�h��J���.��-�Mc�A7(�����������V��b�����������]`�����������_&t.z����p6����N����K3.���6���l�@���{L�"��������4����7�YU���TAW��Vh���D��>����0�h��
�x��#z�3��WU5���/�n�?�~ �����'�w��K^[K4�L�Y4
RIf��J������r��D����J�Vj�-w���sIW�;�r0�����]<v3�	3|�^��l��IQ��Y��1�f5\4U��������i��-��%Bg���n��
��-�����=�����fTX����p��5K���	��s[�Y��1M[���)�N�}���eW_?o���,��� �i�z�������	�����o��y
�n<A��Vl�����3re�s#�Y��1�&�P��lek^�)�EDOf����3^lg�[��n�m�2,���%�?��4n�K�,L�k3��0-g�Kt)���Z�ft���w�xm����*�����=b��/�{L[1,�(z�:a�7]��k��=��	�a�[��^���LBBlnl�["[1���4�����Al>*�b�)x��%m��p���L��Sl7U[@��	�@x�B+�fY�Fw�0�X��������SS��-R�Gay-K�X����<�b;��Y�p8X���;X�����l��m��<����<0���e9cB+5����
zV���� uX&��q�Q�`��b�Bo�f]Z���.m�u��F�.�:�`�X!�Y������,m�O9��}�
g3@��e�ba�����=g&�(vd��%m��&�����lc��~bh�[��i��mL�V4��H����U�6k�6�i��[�8Z����#����OS��Q�`�^�C�O���f���zbzO�YA�X��#v��a�Y��]���-��'&�%z��|q������,�X���~��x�� �����{��m��Bqu��3S���9dc���(���i�j��n�X�x&�5,������x��e]����x���%��+�8}d��O4V�PZ��hK���'�Z
��&X�����ma<$�,�q��0YG,��%�[��,��,E���l��{�)���&��}�{M�OR��M�f+���� WiMm�����h��9���]�	�6�y�Cs�t�`�J��Ei�Y4��.��6�R��DiY��X|�|6v,�[(zn��zg�I��]���f$b���["�"t�*z�SU3J����)s�D6'��T1
�@5��K$3���}%�J����P�C4��{Cg�X���*-�
>��G	����Q������*s�\q��|8\D9��\��L�T,���0]U�������<f2��,��bYr�����iMQ�7��k�t��M���������+.��-��?�N�+#C�W[�W,�Pm�>_\K�6X"�������"���Tj�g������aX�6��!4x�K=z�.�#�'�7�`��nym�0�X��w.#���\�����R�i���$��Z�ht���_M0+���x]�d����E����Q��������i������2����0��l�B6������������bb�bs`l�D6�`�P��p��k������a��/�fq-������DWjn,V�`*n��$w[h�?�97��-��T�D��w#�����
F���0�n�pT[��1mf�j	�������S�fc����Q��.������
R����v�����2V:��]�sT�]t�9�[��-m"6��14�����`����f5jZ�>.���u����
�=}WXn0���^��,,7��fD
�/�F'��.Q��1�������������@�l��hp��p��LLu���R�@l%�d���D����z�fjc�Y�*�9e&����:��g;�sv�p5k$7��=�}T�-��`�S���
��J������y��{��>���#���T���(�`�5����N(�"5j(8'5��������B��0a$��"]big($/j|��N1�c�K�k�r����A��r��1wS�Q���y"egx-u���J��n�l��Xo����9K�9��'����o����e
����`iyV��R�a��|��80�,��B��[C&F�f�6���-�w�`w�m :Kv���=2�D�;�����b;��=e���-!v�oC�]��+#������k<�t|������K���#��P����
U�D��!�f)�b/f�{��T#�s��[��3�B����q�����Z�`x>G����{�L����9��owK4�Dp�����[�8k��n�����E��n�r�k�<�bs���Ym��k�h���Y�V,��;R��n�l-�������Rr�c���\�(\��e�;+=�,���lo���uK�w��*zW��x\��R�}����Q!�����@P4��Y��X��&4�����-k��
��/���E�;�d�S>�n8����J���DS�U����[��n��7�n�6���4T�3��v��k6��l��J�tk:.������b�.�a*�X(�"n���BZ��y������T�������Fe�A��`���������/
�����i�[���� ��X�����`�������U����e����p�,�0�2����ni��4�D?,�*�{�-�{��t�L�]�S(���8��9�o��-�������9��R�Y(�4���p���^tu�H�VV/,���a����Viq��V��=��G/��u��S7�t�+k�wV�.��%��P��Jt���4�(U���>�Y
��,:Q`a$��f����n�n�VO��S�8S���[=1�[Q�����:����|�V&jC��	8Q��q+\�vwV�,����vCc�Q�����v�u�gW�����-�e��-)�B�~�5�s}��P�4�!��U0y��|�����W��g��F�|vg����/����$d�
������R2���������;+M���B{�x��I��n�l@��;�����P�Yl�v�[}�3m���C7�FAg�;���-�n��0�@4��K����U������%�`x�����{L�����q�"���e�%��C��vlK�M���%H��$�
����_s��6�X�����rw����>��r����a@��r�6�VV~L�����
7x��
��V�N,F�a�u���,|:��[���-����h�m*K��Yv�qNe�`w:��avE��A����/��G�n�l.B�C�&)7��8{'U��cZB���Q�WA}�[B���4��%�
��`���]�t7�D]�&+��d����;����l����9�����g�b����a7�wr���!���E��`aP��g��>�`�D���`��b��b�PNA4�#�}���Z���-��~�0�Y,S��:�tKw��2.���3�Q�P�Il�U�[!����B4�{�*~��=����%�;�����`�K���w����o��%Bs��B?�n����A�<�s��6��7���B#�n��N7>���_���
��OTB������;��T2�y
v�OT���73pw:�9��v�kS"����@������r��ce���AC�V�5��R)�9,+�����~+�X"�qa�/����w�m�2�T
IR��
��������,-�
6��w�k��I��o������Hh�)mYC�&hx���[9��N
��i4#X�.�,L@��yA��[�6���+��"6S���'��;��
[���0;�Wc��c���W���Neq�=+fM�s��qG�3i���'�0�Kb����L�b���Mc�;��05.tax�
)��w��K���,�&9;``e)����[d�C�����F���.X��F��J��%����z�R��E�������;��Kb^q<2����%���;Agu�s6���j���
!�Y)���y�5����b�9��!-:�qv�����oA��b��������`��������m�a�A��s�2����q#�����n��q3�������V�������g��ekbYF�P�1�e�abGAh~X�z09k�tq�$��t=��H�=e�S����s�}�+�#��x��Na�����9.�`��gz8�����<2�8��@�PcW�(���,GK4�����=��*��u�a���B
����`�x�P�A��4*�2V��_������`y���3���R6��{1�wA�hX��"O������T��1��f�=��=���<��p�X�i���M�U�mp{�����i,W�j�],AK�
��K:�pu#����f�*=����fc����f#3�S��1��1m+�|��Za|KJ���c��1m��4n�
Zm��?:G+���������pA��%f}2�%�a�t�0�z|k;�����}
�����HD�d��r[�B���V��bS�n���X����}q�Nx������f���e:�*���,�����t��M���(�s�Y��#6����,����y�jX�9;V���Zl+4/Vw�!p�0��#��H�gY���V��V�,�ItV��g�d�MJ4t$i`�M�Xf�X�v�7�������o����`4/��u������������n�gV�9�X�W� 0,�=XV���2���?��k�s.t�V�����TH�b���t�a����"�5}AcQ����a����DC�=������
/z����L��p6��"��,�u�����Lm���{a
u��^5����3���p>���~�7����
��RY���U����Y����k
g��#���L�@,��{����c��c9��L\
v���0�,,�7[q Z	{�d')a�;x�
i�����9�/+axq:gh��4��v�X�y�W��������h�cb|�7wS�!���EC�g�����,��)m�*9��;g_�	��r��^�������Z�v��J��&�,��b�un�u8Z����
gs�>��U����<�D�4�`Y��P��
C���J��J��U
��9���lA�������6x�h��.������M�,�`a���F�4.}�d�"w�M:��+~C�,���14�=2��"��|a=���E��4��1��5=%�L����1�U��D77�kq����EC���W5n%m�'M��x#��>g��d�����/|�M����[lA�oX�z0A3�0��#�7��7�)	n�D��`�A�9Ot7�-7�����M� �4X�OZ,��+�Ub!V����O���P��}K��-7x���8��=�N���(������p�JAC1X(�%���2��W|V
L5\4�T�27�,`6��Q��1,8NSz��
��^G���iPl�_~�s���t��C����@��D�����	SZ��J�b��5l�o�*,z���w&�-��)����J��p�U�Ob+�o��0!Yi�FY�W��u�)mN0ug���a��+�$w\���,���
�9I�=#��n��hq����ny}63=/���/����X�w��C4�Nv2�<�� 	���TB�?�_X
���aiC��[9�-<<��)�z�$L�i���Tq��J����&�=��l��M��,�
V�J+�5lA�nXgy0�e�VC�,��jC�C�����J��f�K��H����^�~D�Z�������t��/u��c���a����K�f7�
(��	z�oS�������2A��f�4��xi"�i����������p�eM�)R���<V�hI��B��������x��F`	����u��s��i�`(,/z���G�/��z*�i#&U}�d=��-X0P�Al�|���!��h�W:�����j�K����n�����^���-�MCO�5���2CZl~�s6�-�-��%B������?��b{!�vZ�FkD���bK+��Z�w�����L�[t�����b�N��1_?&����U(��V��R��/�M&��������w�%�^"��FR;��^�,��K���r��f����//�5E���	{1����:=U����P��"�d5l�aB���5<sc��f�����VFtn�w��������6d����uLlc�(�P�]l���|�����)q��V��b�Z{���������n��EXM��\[����?��
����j���mv]�|B�D9�K�{C�9�B���br��u8�ZUp���BTiZ1y��h�I6-�\0��z<�����H�6VI&6�Y�=�f��,z��f�u7U�r,�(���;C���SZWAwx��u��/R,6�'��+��<�,�ixG�BDb[���t��7��}t�)���i��	]���eam���x�pG�)�P���'SMo���}.�V.�L�X��d5�6��c�U��],�!�)t���.�,�Stc�b��)���h���B��adH,+��
�t���'���������n����������>�G�@�_�������Eu'��BB���9�}8\����
g��I7�����p>a��4\��.�K����:f������6���q�<����I�����^�	���`}��%�"/���`D�w�m���S�AO���0���
j��j��G�A��I���r��{���;���;P��A�
�
��T~Z��:E�.�4���t�s���,#<a�����5h7�
�C&�O�-�N��N�n+��]$<�������s6�w���\i�����"��I����@�O��iJ�.(�O��BF��%���yj�B�H��P�:��;��������S��
����q't�
?�6h�h�0:�qY%��+%E�������6��m�`s��c��gQ{y,������oB8-*p�h�Y��m
�`t����s��p8U!n���5;����[�n8����V,�A�<�m�|�=��u�Y �V��)�X��,�?�M��f��3;�����:����g���9�J�MCC+����R��U����������������ajK��Ou�B��PpFlE����t�J*�E�Tl.�>.*4��&&s���3�T��9i��_��k#����^'LN	�[��s��2b��/���f#�}������m;�������m����.�����L�V4l�)����!�H���P���BCE���l��\���i����tb�l~gw+d&RY��mx���q�u�n�����l�/Q�`���x�\k�����bE�cs��.Q���x6-P;��0h���#�=!(x������g��N�:������c`in�g�y'��a���|9�J��m/h�M������T�g���Y"�C�$����R���#��p�$��Gl�x�,<�e(�#���G���Yz�JJ��|'ta[R���*L���U��j�����tqL����2X8��n����������X�q�YP���(.�
�L���E�0�9Cq��v������ACf�TKz�� ��t'S�MS`����2��Z��������Vz�M�������"������`=]�@t�����J��Of�
�zd��l�������
��@�D��ae�T|am}ZO����|I���y�E���'����]p=Y�v29]��������9)�VbKV��0#�����0���;^��4��^t���G9��U���n)�%��D����=7+��ia�hX�o���,K���Q��"����{���W��Z��]��]�x/+�.v
�I�fQ��T_O�aN0C_�`R#b�������X���^hy�����"�b���vs���N�2�Rh���`*���������$�NY����~Ld��X����_j]L�R4L7��y<��P��Nk~U���x~�Gf�i�,A���t��
�������n8��,�BtN+�
�c�	������p>�YN����>��e�R��
b/��1�*L���z��`*l�(�a�b�{d������&D�
,��(ba�3�S����������~b�B�)�D6&�@�h��@��o����OL���e�o���������t	^V�]p���,�����Vze.+�.:�0E���n8�"�=���ew���7��3���SLM�R�2���J:�����[�������b�$��{J���F���x�XzK������B��)����n����$���>������QY]["��&�V�6$�J�7��Zku1�U�,�Xl���`;4��B�~�O��a�����7��Xe�g]1+���g��6��p�bX����`�a��tE�qY�u��Z��U�(��7+o7ui��:�5ia�������.�G�������������e�U�':�v��c�������b�k�V(�'z@���]��l�O����b���4?���E
B�����c��S�.�������VV�+�^����	�qYA���oi{f�X(�m��wx�_8L,�
�sD_,��,4����?w��m�]���*������`����E��]R������>jI*���.�A.���t���6��
����h��O��o��
b�eV+b=����rj�>�\��.&�j�p����b)��{%o�j�Y�p�+(yd& �������l+@-���e�7��k=k��dG�V�6��J*�K�D�1~��.x�m������XX=.������~��DS��4(ln��{J�1�����A�M
N���a���a/#��<�H[xL+��fVg�����s��������Zv�ru�F����=p�V��ee��R��oB���.���Y�v1����������W`�R��Jc�ea�E���V���2,$�s
s�N��������&�q]r�Z�66
�$�
3�I�0A_�v%�������*��2����?H��A�X�I�e����h��&��BSD�f�I�Wr��V����
��6���+�iK��%�
���fjk�����Q�!K����B����TV�T�/��s��������K4�/����X�
������D"�����
7/�M�/Q��6/�.Xr.�V���u|y��B��p�Ps�lE6�`~���ib����?���}���g��q���*uh]�7�NU#��B�Y����}�9[f��6��a;����9���vX��$#Z�v��WI���W-�+���E:m���l�1mX��g���~"1.<f5)����Q�h��T,uaK���I���I���-�Y��b��a:�T������s��x���u �V�B
6[%��������y��R�tJ���X�u������lE�}Y�5��FLu1����F������fL��+m����f����t��UilK��K��4n������5���W���;��+=�JZ��e��
�aIu�4�,������[\�OPOE�t��t�J�^�5��-�����3���+5�9/��-<��6�J+��s,�R���Y��9����kE����e���hK)��������?	��0��;�pv�]������n������4s���]vS}<U8��w�������������������%�����>g_t ���0�q��4/�5���Y�����8��Mw��u/��4��Ya�F�`�q��`6'���hx��c�/��9�G~����Yv����rHL�.�1C{���^�����S���
=o��l��0���`������tM7��f�B�ZfQ���\��[![^H��4g1�un��;��w�i�
9�M�8����f��\�`�	%#���.�,+�2����<������VL7��7;+g�e3)�f���>�fY������?�f�J6�2~Wl��&�6����6�c����s6�$����=�FNO��w����u���M xK�t0{�`Y��<����wKd�
����K{�D:g�2���?�v�N��������{��BYa�
P�������O�f+�f��6{C�f]����������fYc����X��']rvKd��J�~���Y&�i/�HU�1�^H��4��3��KZ���C�=�
7z���$gs�sv��H��4X�r:���/m$l��zQ��������Nm�D�
F���4�J1[8>�m(w��w���6����<�������m>$
i:�O���{#���0�&�k3��A3
v��{�����=�M\��{����{����u�����e�-,�
k����7*93����f
D�X���^��c��$XN�7���T�n�6��O)h����A�|��C�4�wAI��dL������c�#��*A���t�Kt��J��
[�0{m+�Kr�L���]�N{mw�lw}%���`�86�+Nw�i&�
�������{�E,Xx�	�X��.�����k&����?�6���f��f���o��"l?�.��AR���T"0/q�XG��f�s]������s���a��a�Iw�xb��{�J��k��;�f�f�yW���'�'Dz~*���l=��"�f��
����Y7a�D6�P��\����*5�Uw�������+���s����C)���<��R��l YQ�
�Mmh��!�q�1�Mp���M\����_I���������:��3}U�(��<��0�����/�.�[�������f��N���p�g3M�3���q����1}�B3]��0MP����qa�M�
��f��������n���lN U5�,�
��c���d�r���L��U��M�.�b8A��XG2�?:e�����
��]�H�C��nYq���L_�z�%�I�f�h�4�`}��V�`�N��nym �o�&(t������z�3��h�*o��	�D+_��������������4��9�$~l
H��jKi��00$��J����D�M_�������4�v�ic�E�f�;f;�5%X^1J�� <
�=����n�6�`�&7[�������R����X�7*�dv�osT���#���mGu-������[c���a������fy!D��
%��,�-pI�@8��N��M�y^n��)����eR��v3���
��=a�huxb�x9����Ri#
�Y:_K�
C�Ux*Z���B���/x@b��Q��
&��>O�|g'L'��������/���pz.��H����Z��Diuj*7;`���6�O�d�r��!�p}����1��VJ��MU-�Op�
zA�����=��X�MK'�����\����'K��#���-)��a\���f��HX�9��>�)A�q��	~��,{��:�~��?��X�W3��
&;��_5���d;hC�s���,P��7����)x�����0x
��te6���x�=j9����DP�,<1'�zf�w�0/hx^I�q��W_��)�������f�p����	�u�m�*B���0?,����q[eS���!*}��>�u��������bm8�%�4�E[Y�������Zl���X�+�ue���������-�HH,t��]�$x���0;����.��������	�%�,�c9�vR��c/�6���?����S�b���e���|����^����M�5����<�.l�!v����]��y�1L�#v0������f�'����������?��v���U�;p)z�W-�!f�e��1�0���E��
C�6fB�����*�bOza�t���z���4���,����r���:l�AI��P�Y�Q{f�o��p~�E_�[s������
?�����;[�&��|�|�!rD#�/���lg^���=doC�����MS�6�rv��O�|pm#O:K�e�2K�,e�c������c�=U�����~^#����V��� �l�$\�&��A����3����b_y�K��O��9�rX�d[Ebs(����U�N��]����E�xM�s�]v0����~Z�'���H2�5��������p&�7;M ���~�����:��
��+M9���F�=O����9b���}���.��XOp+��i�/�M�����`{+~g;�}�k��V�M����������\�[��.0J������e�i���/��h���]��T�6|u�|�����,+�{��p^�^p��������
F����?jT�e������wA7�����n�����]���`���2�b�6Fil�f33�CEV
'O��;���:fc�w�,_�G�
.��R^�������������(y/V��3Mm��w���h8��NV{'��*�������
�U���sf���.6�����d���e��qd�f�$��C�������i:��E2Z�#bW���6�s#�R�h6��������Z4�����J��NXcl�d�l�.L(!�n�J���0��$Y�F��QA�[6��l�.pC*��l	n9�S��"'��(��B��{��/b�*��z>o��0&8z���X�;aq��8�(��^�G'����[�9����S���g��.����L�1;�B�X��^�@�������H��z�F"��K4y�o�����.�D<k�w�I��;}�����`����pV�f���/�g*��Ph�0���sR�����7����^`��h�����7_,�c
�$�s+���]iW�ex�fp����%�j73�S��]t�/�n)f��`��a���U=Z����>zzJ^x8�;�.^�����	;j�����R������ck���<�����Xl�/p�n�^psk��*\���l��*_�U���D6�g����J������g���>��1mJ/p?��t�v�L�)�F�.�a/���=������M^Y�^`����������;<�l�P��r���TFl�������3������+���p)�����>�2|K���D�ygJ�����>�2���z�_����9�v�sxZW>k�{�^U1������p����	��`�����D�sf�
��T��i!�X����Z�fffk��h����U�����	%m����w������i��K�u��
�&n�)VC5���L���C�������ck����u�asa�>�v��v��[:L�8:d�v����`��z����f|_VpS;A��'�CN���
����S���<���yuk��:�����Z����m��:����,�}w�w���`�,W��M����uX6�y��w�j����?�Kg�o�mx=��*��_����X��
��r��}Tr���q<�e���t|���`�K�;q�L���LT|ln��n��#q�e���+�F�_,v��PLL-��+�5� �~�6�EK�����V��+�v��\E�`'��vv8Fle�o������]��v5�:%������j�D76)���������4�����M�n�EPbWbq[�y��l�L{+��������}�P'&��w�/��+%r�!��F<��&�+�^mL�������b+�W2K_��v�wv�^�����4���g��K'��U��P�i������65�Z�o�Um���e�K�g���1���I�cf$����]�g8B%g���-W�g"�T0��s' ��F�[����ml�M$"������E�{K����v���f=
�2�=���u�����f�S��4�;�e�����(����'�(���������?����T�9�����j�0
,�n,�'*�k�}#����93�Z�\���hX�*�2%�����b��������Z�O
�>��[s���
#���.��f�t�=���!r�^5����F����R���T�m�����h����Gfar�O���`WB�\����o��
+v��C��c"���2o�����;V����b;e,v'�x�vZ������c�bw�<P-��L.-:���EfU���^zh�:
v0q�Y�����JD�VZ�����Z:���'�
���2�BK���2��9�����Z/�i��#��t�����w&�g�2����p�l�a�����`'��q���j�r��,�ps!��1o]u �����}����oe	6ql�Zz\��L4�D,<��^��y�������E�n�`X���[l�$H�mjvDo���n���8�Zmj�'�E7v���eC�H���l���V^��sQ��	�Ksv��q�-������90hxi��Sy��7��4�;���bG&/h55�G=aIc�.r����8�3��<�]k�+�����������f��b'�������*�
��E���g$�
����9�����`[��u�F���
N;a�.��d
b��6�&NxT��+������u���M-Rq3����{ba�'��)	������o8D��}?�]�����g����Ke���f�;����2����z�Z�]�g�������z���_��HJ���sQ��pSLFm:D��Ln�v������������esb}��v�0�g6��M��'���J1v],�Bl��=q�h�R�����L�IlM����`�<���g��������v����	�SW&���t��9�@L6%��F��|T����Xf�e>���`�K��owg6�m>��i�����+3��v����0�v�]���\N��u��D�6����p�l��/��������
�
�� X_(��A�-Yv���X5#�4���-�r��-����&�"������n���\����p`_�Y�J�P��>������D����
���	oo�b����L#�eX��Y�~{LG0����P���&����=�o#� ��
o���!��	-��>���\T�wH
L8�Q�$2�	��9~����[FJbw��l�0�Jg�H�9��S:���hL���u��=��V�o��|g�/����C��t�~���q���[�c'�v��V�����Ah��;1��k]�a�p�"�K%�����ooK.�-��0���U�b���������c:�aBm�^�U���\���e���g����p�4�����n����?�9��o�x����C����p�l��+=1���K?�C��u�����iy����O�C���g~��������<����R�<���&��6[\��n�
���C��X�;i��n��.��\��;\K��#H����go���.�������������t(&�]���x���!��w�T��+����Gxk�A9�����[�G���UG�0�	ze�mK?��~l.����1">���^��B�����9jc�u��'��.��u�!��b�Z%�]��F�����6�7[t����E�Y���]	�G�i�1������=������p��"�6D�C�>��A1�%Q��lx?7b?6�bT��%v�Jp��nn����^�r�F��U�<!b��f�{c�i�g8yk���0��S����������]E���#Mqkn�94i�,#v3��~�����~L�U�8����Y1���6��cZ[�X�I�����ly��K��&����l[U�����&��l��78�=�zF�N�.5�������%7[z����b���m�<���������fV�"�1;������YfS4�5Q,���Y��{^5|!GL<.�U�=V��:a�r����5���9�E7VM(vg�z����
O���3���,��'��l�3q�Q���}A�t&��W����y��(����]���11�����]G���U���Y������#v���WvzY4�xdj�_-���n�Xhk{^�z^���C��/���b����,+��1�4[��<���H�N	!iv8�v.�����f/uc;�;}$���&D~�BlxV�����O�#,���?�Q����mb�����z�p1Xx#�{�Y[����ZJl�������n���f�E�-b�����l�9?q�Mp�
��P��lgZ,<le�g�m������|V����K��w�A9�������a�l�����?<mf�j�y�{=A����!*���.��%����>[*v'n<hb7v ^tc%�b�� n��Z���kZ��`�4�)6��L��.����>�L����"^��'�!��#�u^mG>�cs_�!��i��UO0;tO�nvZ�}P���Eni��{�����\G
�A���`O���!=�3��h��,�@���Cf��9�f�tc�bD��`l���b�I�����f�;;��'P4,�v���_,�N�����2D�J���o���|D���M0���}T1��������^0�vf���,npk)��F�[s�]a��i��^O�p{��`��Z^i�1����Y:m���� �����m9�L�(��e�o�Uo�y�����Wt5[x����p+R-��������LEt�S���������fn�9������9�r��+��a�.���N�=�y�!��
O"�N�4�l�mp���6��k6�6U�z���j8u���6��	z���`;�
�������p��L�V87��L�
��~u�vU�y�2����)��W�����b����.]�W������{�?B��t�p_k�~!���
�1��i������������7����6�c�
W�yj����Y�a������y5������K4-����;�/lf����3���.t�V#�a�C��5�����O�#\�&�rFb3�5+�,���N����`;<:_�{����c�
��9yL�n`�]x�\�f�imX�W��00�����u�x���3W�a�I����KW-Yn�tP�d�I����`����p����
��rX:(34����cN����n������D8}{����tm��%���U����cs�5�cj���K=j7H�
/�M5R�J���b��7��"��F�����[O.��^�0�_���_M��$���������R�G(6�`��^oH����6��	z@�G��P�d�p�Q}��H�:�����i..���a��=������
.!����`\�����`<s���Tk�:�����S�&[x�zf���5��Ua��ka�E��s-�����
��E�����Y��`��D����V��"�{v�p\��9on�p�f1��3{����DOx4>XzxV��lzYZ���%h���S��!�[�u���	+����SS�c �k�7��H�ip��]}�~�z�4�T
=h���E�;�~�~����ca��|lN���++��L�Y��;XM����c������f*���:K�����X~�cY4<�f�U%����O�w'��?�3�l�ata�-W�vV�vY���s��6����J���.����i��5�-�gm�����;���T��l���~J�CQv�����v�wh�S�b��{o��<�p�^X1-�:���&bqx����F����3�oBh#�����?,�(�<�������l�UlI�z��i*�pI�`��0H�'vH����-�����\��+�T�|g�F���V�n���=/3�
�#\Vo.��O_�gN��UG���%z���Y���^g�k;�aY��Swk�������g�NX>�?�o[�0,��9���+�r��������9Eg�HK��*L4��T���v�5��1P�O����l��J������������M�75�����]�v��1=��$�B��H�0����6��f*n���W}�o�yzeG�E����b��f�#��������o'����S(:s;�c#�������o�U|g��2�������+;
��;Y����u����SJ����~�}v�K������B���Fi6�(�N���
�����#f�=��-'�;�v~`�f�3|���+��#�"���S�����d��F�:�(t��}�����r���bD��|g7\����/3��2}gkf?�.kx�Xtg5�bk�&��������]���{�v��4}�c�~MvNX�Xe����3!���SJ��f%�+�������AO�{�����j��y�6D�b����h�����`�l���c����D��zbaF���U����Y���K���
��6s�����f�������,�4�p�)�v&�h�����;�����jn�������>fd�`1X���`��'�\i�3/��6��G����M^�o?����
U,��Y���W]>R���u��������`3��?LT.��U���c6�W	z������j�u@������
����,
Q��b8[�8�O��z��z���S����8��	���~�Q0�P�i��a,l�{�3MG1����~�"$�!�����
�3�/�"��q��;{nm~gg���X������`��`�����`s������J�����}nN������|�YoC�HVx��gb;�^
^!v�:�`O#�mx}�tk��X(��s�O���[������Zb���f��.]��f'���>^��`
[
|X^�f&�Lf.��|YR�F���\����`'}��7[���9��|�-��i��O����p>������I
�FFR�Cwq����>
^ v�	��U
t�c��c��6���`>.��)Z�����JS����F4AG5X��;U���1�Vf!e��Y����(AJ\
�XV���R4�!�8�[�e&I7+��l������9eECy��Ig��~����E`mr��E�����]�^2%�5���{�>6������]�j[����
�����E��#p{L�O0Ot�lI�����,����M�S���p�/6�L�������a���-�~��pI0����wb,W��zj7�[k��7��p��t�I"J����1H�5Sbg5���H�_�fR[64?��?��D�b<B�v��r���:�_F�rgx���?"b3�-J��nAOXs�y������a�-�0T&l]���zL���tD��=�A�`s��C�w4���If��?�1��K���|$�NX���dTmX~`.����w*�Wc<6,?p_&�E�]�����D���N�Ao��M,��X~�cY��_X��������r���n���������oN������cc�eA�]��QlF�m�Li$����Y��;�I.�+i�r����\�0	=h�����~E,�4\����=f�c�Y]4�i��2�[K��D��-��'��3������|�����jm���8��\~L�^��}��~�7�Y������C�#qAM��F��;[y�m���n]jg�T�������/,��\lK���u����fqB�}rbOs��)����Rl;N����x�����wf���,�!6!������w����w::�.��eu�B�q��6��X�Rta9
��2Nb���������:[x��iV�*��jN��B��2l�f&|��-�},��.���=_��S:Fe�X�9�nng*\��y����H�u��FKg{DB��<�� hx�Sl���n%mg�j�lgG,~y"z���0a�>'�M�ti&'�����2}����������aV���W�����=��!z�� ��je���l���`����8�aE��7�SK������_F��KN+�������������\}�m��fog�^���K�Mx�����X���������V�v�7]D������0 z��H����Y�y�3{��T������.�B,��\,�"��7_vKx;���>����M��^�K;�y&�.�������^�0�4�_���������^�.�W-�<��h7��t$s�m�D������6�v&G=�O$�
��`��������sB�������#�
�|jV�H�X��{.�>�V�k����q�F���Y��GBf���|���#j7Qy����L�+�.�����[��������"�m��8Wb����`?cQ�����?��V�����������2��X��W�0�6s�`����E��H��iJ��[5�V�
5����V}!�t��RbZ&�/�0�Y�9Sqg!n��h�E��G��6�u��?k�x;3��f��$�0��0wv�;�U�S���'&�5}�o�9a�B�+�`��y��������;{^�x���u�9�����������0_���v\Gp�_jY��,&w����t$�CEg~�V�v����_D-�r��zz�QD��G����*��]�Oc��7��
Wzj��l���m���,+z�bT�p�_f��B����l/���K�y�G�����-	�W��������p�6������!������o�p;,�
�T��o�K4R��e�<���x^�|��+zg� �i�n���p7+Xz�k�z�������&n����vX�����	�Z�:�DO�o���S��d��=�4�tc�$����5����D�����0���K�HX��q�_�^��\�����t�����I>�J��4��;��VX�,�����#�.���?�b��W��9�3a����vx1hh-{��n]u'A�����|���}6�f��D���h���
f��-pQl���~��2���vf�]�,&/\�����In�(n�
�#/hz��[��H��_�'��7sv����M�������WO��R��Rj5�qX�aa���	b�H�3���g�`\��������\�-��������(K�u��54�K���y33�c/���f[�M�Gl;>��cs�o�[V�nup�"��a����v�������
gu�{uvI/�w�]`�uW� R���@�������nk�a,c1��R��R>���f�����:������P����`<�|)��L���f���:�"��s�k�;��;���;���^�tl��geq��H�����������������m�
�au�`�`��=�[f���v9{��
Q����4���;���Vw}�E�����Sb+[/�-,<;EH������EoV�j�}��kV�*��]�^1,x�D�`A�[fe�ba���e!�������v/�k���[s���wv��w���2�0�.+t0���K��K��Qlae�b+���������6�������[�c�D�X(�u����a~Y�����6��#pL��'f;�bW��|��=X�X4��K�]����as8Lg����J,X����>��m���4�hh);�4Q�'>�V����E������tB,\2���������=o>�[s6a� �7\��e�x�uB�;,�pN��D���������=���u�K�@�&�����������7���-������,����&�=�V��������[s(���b��2�h��+�b��2D�+A�N�m�L@��1����0������G�����*�0���aL*
7\[��{,�>o>��X���`�9/�0�v1�����mx����[����{��A��
��P��:�`����[Y��Y��N�7l���-ze���;�.���?|�L�������;��������e����	&���0�v&dF����AC��X�&n����v��m��1�i8[���N�;|����p�%b��@,<s�v���������4�4L�
O��]08Q��i<�9Q�4�Y��rXw�w����?��9��`�h%�����Ki�.���z�M�%�����q�����LlF:�J�{�r�gB[��;�+��z����6�
���oO��(��7"F4����qX<>`n���=������v�+AsG�����>&K��x|X>���0e&8��	v�,���?%<OX������<A%.��xvpK41���3m�43�����k����;>�eX���ba����0N��rmI���y��u����a
����`3Q�U��a ����=�8���Y/�3
'\��r�aw��E��p�_f��&j7q�{��=��[t���Z���`�Y�;�3�����`}�p��s�s�]�+8�*B�/����������������,�L��MCi�2,Z0%-Y�q����c&K]2	H������f�fv��0#tc�l��Ku%U�Or�R�G��2�6��9%�9<�,�E�i~��pn{��m-�i�N���L�P�,��c�y3g:���+/��+��	��?���6D��^��_��>b����S�&�c����?6��CJ���:�;�C�6�Z�X�>��?	��J*���J��,H?�T��@�3)�#�y{L�m� �x=��-����6�O-x���g~�[s2q��2�cQr��
�p�?�p����c��)���.�]��o�g�����`��G�t�l����k�	�~	�&61��������)	S����a,0���/����oBl+%.,v��?���6�����~��P�Y\s^#0E4��
&,�0
 ��vgR������D������������(k��g�@�Ex=���3���������=>�{\4-I\:{��
C�`iff��r%�mpj�Lm��&�62���i���Z,]G���n�Db�w>X(��a�D�#�f6��]
��`�����pW%����n7�����������s���z�.�x�]������?f��U�m���ddr��:�`�M�n�Y]��L���#��+}���E���?�4f���9\���C�`��W,-�Y*N��y������ck��������F�A�DZ��A�nfi��������0w�e[�5\h{f������7(��:��7��kx`;����80���i�N�~�����J��m���W&|�G�[`,��V,-�qH��?�g����]�X�������%s����w�|l.���\�-'z��BA���{����N�K��d*���g5����Ut�����7�L"3:D�u)����eq����C@��pE�v����=���XL�&�����-�b��Ln��w���������]E?M�p ���
�lw��X"M�1Y�F��ok�qs��,��������f��L��t|��,;����!
�}�������/�N�h4��e�YBK�$4}?�d��E�w}ga@,���h��l5'�$�D��.<E����.����"K,����W%�xf{x�gL���D�H���K���M��j�Eo�����o�����=�[�!r���$�.�Rl�?�R���,���n�H��c��M��`3����&+�]X~Rlc'����c:@�/��p������2������e8����l(+<r�lTlg��bO��m��;D�������������
�v�.��	[�����s�>s��Yx����4Hb�y;���*�����}�����������>�M\�2}�]\�
��T}�
��.h���O�%1Y�����:��5�b��V,��4����
��v�D�=+��[���c:�b�x����$��N�Aa��W=�����]����D�K&+��X��[���`�� ����6D����
��|����b��=0|#"��]|�d��u�n�9buM��un9a����b�?b�����	�L����(�]&!z���.u�$+���g�)dKD��Ib��.�v|Cn�9���[Aw�$#�`��
��1+�
�=P��� ����N��Z!�����@��;��Vv�Hlgg.��;2=Z	w��]�S�����l��d��	G����U)Z����6�������.��cy]_S0�FM�n<���O�����zbv��Mk��a�0�����5t]tc��b7�Ot�@����8a��^p#X�/�(��(�|�Z����\?:C�i����<*���h��o]u0����st2���@��)�|Q�ti!�>,~�>NE��	i��y����q��zM�w���i��?��A�>�/���?a�#:3���OUAw�������}��M�|����SL��';o*�4(�dJq���0�.>L6;`x���sK�6@������p��f�f�'3��^0O�_K���N�2�'���6�O�l��A(�q8��t�a�FW�H����a�'�
�����X���l��)�l�dc|���St�k��Sl�P��~����-��3?/������S�k��������*$`/@�Q{n�$�M�5��L�����N{�'�E�.�k��"�.}�#�`���~V����AO����.O�nB
>���p	���E��'�68]K��IX�?a�ppc��s�;{f,o��
f��N�X�?�GDt�K�`���z��	�����u%�5+�'���.�e����E���5�l��T$g��������1���=�?�������&�r����[
�!h��,�?��n����-�#��^�&�R���/�[���|�����u�	��A�����!�����"����0���U��7���h7a��������bW���wLvW�hx����p�O�30�9@{��c�M��v�OX?t����b���-�[s�D`�R�	��ex+��YY�NO9}����.8��azD~������	K��>����<I2���
������{��!���T6������0�l�����&|gXl?��������v���]���E��������]����;��;*���A���Ks�O�����������>�j�����
�#&=�^s��L,��Iv����9|�B��8ayk�Q��������L��Yx��X������o��
f��v�w�4�zI�3nW�'x�np�hv��������M���"���xk���y$.�VxO�C
sd���9]�'<@t��Z/=�{����O��[^L�,z���YVf'nc�]4���6��"����Yb7+�q�l�N�?���z��3����I,~L�^����~i�;�Y�[,}�����������=]4%���1U:��za���b����yY����Ht��t�����XH-��4��ua������DwV�'���o=��)|�u��G�����=����q�6V>.n���D	���^
"��\����j\6D/�����e���f����������7b������}������s��hY����Y4�q�	����y1}�hX�+����5o�3���������"�K��g�.�D��n71@�XJ4��D�f����)w��!����i�O���Dd������\����@�fV�,v01���m�����/��3��.�K����N@��{W��%0���M�Y	��
�;��Y����Oe����6�b�����)o�9�����y�,L�H��oU�Db�.y1]���6���}n�:�b�ky����<m��b;��p�����mx���/h�&��	�#�vm�9QP��->c�����j����d"���c���^�~���b�#��u�s�A���$*;�M�P�-�����������e��b�pECG����6f�t��1A�]k�p?7Xx@VlK�5���+h(�ub+��o�o��=�&n��������:�[s����t�Y'I��_�����C:�3_�P�+���/};~�s��j�.M����l����l�������n	!����L�}l.�0��b��Vk�[���,�<{s^�����54,{�w��C �]���y6�;;`�3��m��j�?�A�m�`�:U�fB�������%�L���v��w�n8�*���z����E�F�n
���]��	61'Y�
5���u\(�M[�:N����"��~T�76�`������p{C�fjQ�?O�ln��
F��5��NO�w��y/K���@�y���9G�L.��EGb�Q8zyLK����4�`��c/�X�C��]gSU���/X�giyb
��|�#I�i�����Y�� ���[3�)�/�n�h�iC�v�U��R�������)���}���U�p��M�_���%����1!�YV����D�����s$�����U�fa�*������	6�q ���$���;_n����&��(xi����u	�al�T�Zx��Nl��<�e/O���/�E����cs��>��Y<�����,�U���io�d���X����4I���|�3W����Z�9��c���G3�n�v/�r��o]uHsG�������9���7���E�y\����������DWX9��a�\��L�����'�pN��c�t��%���]��~�m�E�I���;|1w���;1X��`�IBl��=��n]����M���LM�"Z��Y$�Wz�sfW�V������8woe��K.��*M�0Z3	
k��Z�nPl�i�`3�Vb�y���I��TGL/-���|=O�������<����h����;�`�y����Jl��0&S~m�5Ui��Q�`��^3��M�6q/f�]�b8�S���m0-l�����6@���q�
n�{��'X��Q�R"
dk�b�r�tel�a���0�l���ek����e-�|����y�x���i�P��:?)�:L,]���k:��E2���~
�3�-���&��\��/(V�y<S�k�bp���s�
�n|����-�����{�P��v3�Hl<���aQ���0�������ZN���j�D��p�
]�Rr��_����:�������\1HN�4�&�����/�h�{c���@Jv���;{�����>��������
�� x�Rpc�SB{�U������L�DwE�-pY�(0�%�nY�����������:��6�������Cas��0���%�n��m���Y��4��VVs.v���}f5�b����/�L�e�X(��6b3g����)�Mg� �����MG�N3�b���o���1aWc��-r�6VF-������1as�s��t�5���%�^e��W3F+�1���L�+��5�����5��r�<�t����o`l��7a�k�����]>�K�Z!�\$	�m��f%���6�V;bO��wG;��������D�T�PX
�N3���r�o#�p�9�EW����1�b����9\dKH��'�;���e�Q��YU���d���1K�����v��w%}lN�~���6�o���m.���H0�"b+�4��T<Z������"\u�ml�
��[W{��?����V��^����j����+>��|1e�h�p3�(����oV�"z��M����u����v�sv���{�~����y}�S�6��FX	�i�a;���_`[�o�}�|���gS��z�����=o��
�� �B	:�����oV�+z��M���v���|��m�-q���D|�E|�5q����{���.4����
f1�e����<����FH���f������9�a�^,'��������&� ��o������BE�{�I��[o�=�&e������
�y��T���z�m_:T��f'P��{?���U���<�r3�M1�����`�n�������
�c6�x}��n�9��%A�+����<��'%��o�6BY���Dc�Wv�0�-lm��?����9R��R��mF���Ob�k�K���Z�0��������;�$������G�*�m<�����t�1���O]��?Xx��M|�l���$��oV�	���{�0?h8�s�P0����n�����Pt�S�,��g�,�L;���L{�S�a��X�.!6� �����&�4���<��#M�y���U�0pI���f�r"�l��f�ZEO��,�����7/��`%�|�&mx�Ht���`a�A�f�,��p���y�`�+jn]u��l%���IW��"����;Yh��nH��u������K�.���=wSo��0�=a�n���j�
&��k��m�h�����B�#��al��XYX���\t�y�`������9|��AC����0�w�,�I�{�
��E�y
�<�ri����X��0^Xm*�,��=�c/����c�5!����oXT:�[��w6�/�6�o���8��F_���~�������3��0�,Tn�];3�96�����i�=Xzt�����'�C���a�S4���e>f�@�*�zxQnC��	VN=���`�����[c����j�
�.����CW��P:V�*L��r��������e������G�a�+�����;��=��3�q��Cu��	��S6�D�n��eHA�7���s���
�nbG���m1�����v�wzj����f�7�X��"
��o$
�����S��p���v��6B xI�N��u��)��o�K*�.<5H�;3e~V�o�7t�C����g�1�v�aJ:�F'2��	!��7\���^b�*fG�>�
�V�����`;�\�=��n��(��
��K�B���^���&��f.L���Ovw��7�d��T��*O5`A�Y�[s����S4-z���}g�L��vwh�]3�6���A�r�[s��a�h��=������sZ�r���r�M?���	h�]k��=����c}3���� [���� 1�*�b�+�|f��~v�.��j�`�KP,��
�BE�F��Wn���	N��������\��v�P������g)o]u<����kfAcA�����0�-Qz&���|3��i�#��	I�aI����9��i�����D�9��
���f�5q���|�d���Pn'�9<�,�8V����`G��d����oA�'��gs�?���?�9������}qk�U5��q;��k���h������������%�i�,6�P��Y�*��1:����'_����I �
1��_F,�������.<�<^8DQ9�vB�Z�O�by�~/i������,~g�y��v��4b��b�6B�#��aY������|���6�����6D�C�����k^����X�4J�5���%XTQ���#p�������2�/�\	��fq�����h����R?��2���[T�az��s���`�����3�����^��p���~M'����B�?.�=o���~�����'����BU�f��e|���u��6�6��.Ta�������)��;"@��?��a�����o]u4����'�_��Gb��UO�(�g�,��4W=���5���?m����}�-�N�'f�c
�y��SF���,:r��]N�%��}
�B���z��e��?�h�=�]�������������
�[W;�3l���;K��`���=��'Tb����qh!n]u�#��;\�WY�2/�C�7�p��N��r����?&V�z[z'��9��g��/�N;��5�@������)�0��N|	�c �_��^�n6{5%�����
��!v�������=���H�az !�{����������0���@�=���tL��J��0lCHfa`h�n�8A��4\�����44G"�x�tE��f�����<�!�����;����p$B��:�w�!����#�*
���������h��j~�������fG04�4���f�=���0�6���8���1���y�����b�.d�g���9G�.EZi$��ca�H*l��U���O�g�H91L�Kd�NX��va����(��y�mx>��t2������v��������n�>��"����'��6}*�/�u�@�����R��������2���$x�1i�����l�+��w��?�12K����k���$��w���:���d�0���e��f6���'�;{�{�l�Yh��m*�?�����;\��CZ�������b�I<Ol�K*=��#���@pc ��'�p�.�W��R�V�!rD���rV�;z���:��	��M���N���5�L�k8��K�����[s����}�&=�EV�?�����u �m��8h&�0��&��Z"����V��yc��9G1���}�e6��X���<�8��v�����U�f���# t.�4��"�D*q8A�f���5c3��b��&��&,�N���Xk)�3,�6���b��R\`���_z:M����O��wv�2j������1� ����	���������P���c��`'\��]X��va�tO�����B���
7�������/���#I��	���'��t�%�S�j��J������@���Hy�4����J���������Iv_�h��4#�������c�t�(s�G�L�n6U�9y!����T���KN��3�r�=A7x�6��T�w�]������f�49����"��v�k@��3��C>8��j��L�=`���0�&�2������Zl�&�����(,�E�(W��r������1	V%�2g��c/8�}&Y�������xE�u����C/]S?�@����..�5�x��A��K��=3����'`M�D��=���ZA��4���?�	co�p�T�3���!,���E~g�S�9�������!�,=�va�LO3C	���:�F�������/���On�35���`��*l���f�����=�<]x]�mp���Y���/��8~Bl�f����9
�����/`d�����p�H�����v:D�2�/���`�qz�6���a#��8T��.L�-���iv�R�G���1�6Wrk�b�ua�������b�sa�b�55���C�3Q�T�.l�P4���dQ���
h��9�!��1���������5�-��z��lM�)���o�������y�Xw\�ZStg��0�g�������]ow���w{x��,����������N�g��]��E�w���L�����Y(�E��lK���������H�f����X_,<�+6�`,v4CI�hh u�lY"�%O�l�%r�?��;�?��3`��aY��SC���p.
v�\�����������:��Q�|���,v&A�v������g�v&`�[M�f�Sf����bG����B�f��B�csQKD_���_e6�����S����,�Jl����-
�����;{z~n]u �D�����P��e�)�&j��U���DwVJ$v��,����]��'��O��u�t��+�5���(V<�x�����9�����g i�adlb����F<�?��-������b�W��4��dbO�|��D"�C��c�[��3b+Qv�l�N�8V6������EV���Y-�X��Z�+���4�&�)��y��/�j��e�e.R���@�ix������:lc�9��q^����f�]�fQ����;�f�����6D�����9�3,|�;vW��Sx�|Lk%^(�����-��n�v�������H?�oB��?�|���
�F����D�o"KsI�fT�������p����l�o`<1�����6.�kgy�q���-0g"W:��q:�6@�5a%�#�T�5��p��(O���`Gf3�q�E���Ab�]�;SRf�wa
o���e��cF�,��x�!r�F�"=wMf�����q�0s%6,G
��7A��&�D�������&>-Z�����H�A�]���5�>�c���0����'��������pvb�4�Z��
��d<o�����#�y^�,��
��]W�������r��[t�5{6q�!�of��c:�a&n�N(���:��������sP@�����=+�������F��Z4L��a�c/u���
���='���:��E�RK�����	�c����J��m4��GF%�l�����O��~�tE=|���[p���]��
���:��l�/�������B������{L0�3����to2�I�Ry����,�������k�#SYc3ua��E�	(��N_���V�{$�n#�(~���p���Jj
��bx������]`("^�v���a�C����'���,�g�`�,A
7�$�fB�+q�H����|l.b����$J}J���z�o��f�����D�g6-�*��V�i��@������|���]���4�@
��3�G�}{L�]0�
z�p_-��L�n��M��]�V��
%S�`���"����������4�	=p�J��:�cs��Q�?�������o��0�~ggr��^�O�
�"���_�`�~h������2�N���7L��i}|,/]�����oy�����D�f�sa�T�����q���U0m����Z�LWAw��O*��p�O�������9
����i������Q��uL-)��_��9����c�����g�C���%�>7�o�yn����������5�4Gz"sx��gxG�hj�[�*��i��D��1��E����������	��+�����
3��O����T��n�l�g��`3)Uk�����q��8�i����W'�G�I�W�[�:ga�'4��vH�����#�����`Z�u�:�*����8��;�+CI|�%�D�oZ��]�j�2[���k
DOx E,��D���`�Qs"�]0'&w0�j��t��t
������~;z������\Yd*z�����8�X�;�,�-&���Dr������F��8�Z�j�re���Y�I�H�Q���	/z�w�y��O��VDn7a���JW��
��n��G�f�g�����E�	B+K�������gz���R�?��Y�kV��>'��������Ew�����vW��l|\Qle������<������[s���9�;[z�j�3��V�d�ub�9#��8�R�Y�������`���;����6%W�$M?��68��������wO����[Q�����u����E/V�,��R����$���cXQ��������G��ql�5�*���h������������,��i��{��ZY\Y�Ttc��f�U���V�����C"�����n�����L�
?Zj8q���X\���t�1O���kf�d��K~��e�-����������e9N��	�������"�j�o�1D���$����U����6@%��C�3p�t�|L�5��d��F���S�������k��P��4�V�3#�(���,p�E�r��b1:���e�l��)�o����~m�.�@����9nb�P�g��;[a�,<,
��&�T[�im�1��Ye��J_��o_0{dio���NI�$�d���_�]L��'f��f���Vh��"NNM���Y�i�������6D��a���e8D����2m�G��j�oC������w_dvfg��k��M`�6JW����`fRrd
���Ou��9��Lt,^'�eV��W��<���u5XX���(�������q��#���d�6���*>�/���.��V�����!��1���!
v��c:a�N�V*�t�J��J��n�I�v3��$Co��K��fv�mX��D�i���%���{����g9�m�N�J�GEp�a���:�.;��vS�"�O�������v�J?#�1�w6�������r���(��M���!\�=�� �1����;b^�9>+�>6�a��J��=��%���L�dG�����\�Cap��Rw���m��r�
s
�����9�"����P���S/�cX�(]�q�����uv��q�����9�z/�
t29��s�n7h�V|Vf}l�mz��E���7\a��_H��'�����P%������\���,��i����6�	`!���#���n�d�e& ����O4���#9q�^�#�T[|lN�vf�������';,v���pm�>'����`x�h(�;�lBl��ZCG�2_ G1p~�3�	��&v��# :�_�n�8~v��C�����Y��a�O,���88q\���4�~kN��L�n�o�/�����
���V���?<�i������%��Nb�z�]6�`I�����l���)��6l����-�=�(�����(����A�:�`����������
�E�O�x;sr���X�8�[��=�����8}t{L2tB��f�i6�	L����V���9wx�J�V;
+�������/��
�qA����g�`����c:(����a�G����.G�8Tl�|+-,��}oo���������*_���?W�+<�*��a��5�x&U���6��9��L�+�������M,Z\���%�?����e�0VW&w
��b7���Y�0�l���j�1���;�e��nxV,��]����l����h�p
/�l�f~�n�d���x�n?����u�����7\�����K����<�a%ueJj�V��+���7��ER�����(FI�I
�)��{^}0�4��������g2�e�����$z���'E�>})�Y���,�p��[�iJ�qh����c&��K��G�S[��f�I�RW(q����s�����Z�w�$ZN\b�,Zn,h
%Hb��w�K��c?&z�E��f���/u��o�Y��dL�H�*����DD�D�����X�����>b��]l9�����~L4��N\��,<n,"��W����Q��� ���������-�DO��1{�k����U4��n�dykn�9���
)Va6�m67f
�b�{�n]�<�BA������q���,.�]G��mx=G��I�p&�r�b;���.�q,�o����)�E��R��0}������D�������aVB��&�u�A����)5��T�=�������������X:o�����S��������U#z�}M���[����Y�E���b[B��l-np�4��=�z�8��N�fcZN���g��7��F��;/-z&����������uC,T��=o��=�C����8Q,��n��Xtg���������L���bxFt�^�Y���4K���,e,��e����#�J@�y�;{����vvN�l�v���m0z�b��M`��Z���JV��D�~����hY�������?VMg\�GR�W����Ny��&vd���
~ydN�)�`�.�z
����G~nC����SE�����B�X�����[s�%�
�G����gI�^��t��DUZ�Z���G���Y�vGF<Q��l�l0O�4��WuS��P�[6��m�B��h���*���U��"�S��2W���ROy����!�����G���B�V���3��y�3,��(X(��[��[��~f&�2&hx*�-g���m0��y���9"p���As��z��~t�|��� a0h�y��E��M����,\��`XlI\N��m���K�2�m0���4�@������n9������9	=v�f)��������q�31����X��h(��k>e��[��z�6D����)��@�;����?9�P��^�,z�2�<�G���%�����e�n��0���DCQ��
K���L�!����b���
��vtN4�	���������O���������b�����n]uw����������w���k�����n��})�(�f*�-�mp�t��D,NmpC0������F���$Zs������3��?�`�[d�&���}���Tt*�f�(<d)����xl������D������
n�p���a�&���0����~pr��cvr6X�t�_�`3���y�L���0�!�v	���v��h�����4�|l.�0���l����9z���F��\$=��f�fc�\���LE1�/"sW�/�p�������]p�"���.L5��m���:|bR��hG���?H�����M��h�9�����h_(z[^
��
�v��Z�l�X{
���'LR�����0��]G�w][^���>��o�9V��JA���Z�_�`;|���7W�y3�!�ymp�/������=�����0�"6s��Qh�Mg�G!�����`�8���fn��������ERj7��mv�6x;��9dgjcZD����|��|gO�wvf2���`(�	C �Z3���.�t���<�0��~F�[a�e��mL?*�<�{k�L�nU��������������f�����bB���$�P{"�
����{���5�	�����!����|���*��z������u��-[`y��=���������<�$�{r]�+sB���F��8���b��"����Yy��>6np�9�C?��:�	����p��v����J��>�B�-�4����G7{�/��-\�E=��������"��\���l�mx���m�k���c�&�_]X��X�^;�>�������������~����������Q�����F�{t��$���evG�=�Az�L}�3Ut&a�X@z�1������,�[������-qE�5��L�����&�f�'B���������2�������`��l����"�O��*���b�m�b�����9b�'�7��M�2�}Xe����`a����T}�<}X�D4�'��5H�[�R��5
g.�R�������RM����0��ivnLl�t���s{J��"Y�y���9O�,[*���n:�DUq�U�>^M":��y�}�G��h�PV}�V�/Y���������+>�&bA�?�kM��a��Xx��]f�J�9QH�X;�0�����L�&�LK��(s(�H��q(�����-�������;�+F�N��O�y/V�MH�K����@��i����;eb\����f^	�=!/x,,}�g�i[��D�=7o]u(�d����+����E���RW�{����u �J�M��Y�UV�'v�t��|��!r�����;��e��va��������D(l-��)���C������>��>LG+�3�}bY����
�
��U��>�zk��������vb����1��mypY��_��1_�����"����0�������Y����t��	���	�#qD��	�a&\�g��;���:Xh�{����>���6������9{��8
�Sm���?�e�f�3Q��t4SV��w��'u}�c���1AO���L�����e��
���G��?/�A�/�H���}`5�3�|
��P0G�h�62�+��c�b���m���s������}L����F]pb�����F
�t��U����chs�Mr��]0E"o�!�X��0��	��~���]	��c����A��8�L��	�D����
�{�`�����S�-�bK&L����c�0*�8{�X����m�t�SF�7E�&�n���g^�csA��������M�����>�g+��$�X��/|U������G��M��t�����H^�t�����Nl�������#�;;��F�n���	!�c��S��W0
]��~�n�e����8Je~K�&����}C��������f?�`{�.����V���E��P�v���^'�r�}��[z'�
y�+>7C?67^.&��.X��N��������5�'�����8Z��������Et���C;p�1%��/�Jn����0���
�]�����W`����*������aRh�-�X��^7$�e
��:~��X�Yu����<���T�V������3�j&05Z���6�D`:��dbK����VLC4��a�M-���`h5�q�C�vU�`t�Jt.�eH�_�`3E�6$?p��!nm�������5�A�Ud��u��n]u���g��m�}��G4~����k�)P������,A\�����2��L�Rv�)�0y�h9�a���3.n�]��F��Xp4,S_����������w�4���Q3$�����+���!���2g~��a��h��H�����M��?0'�/\';`.7�
O��{<�#p��u�cYY��;��k~�f86M�X���Y?jk�i���eK[�H&�
V����tEHq��vXqL��[�<��+��N�1l�[�z��wv]�?��H���et���L�
�!]aaW�n���S:�����O��w��g�$g�*?o����
��2I���`;t�����8j��r�a1E����;�3�`[�O����z��e��������d6X?�HJk������~�&���������B������9����x�PT"�$td�~������#��/B����~������<T�`�'��SS�J�����uk�;��]���tw;�;s�.��#v%��E�0��t���4�|ln��[�����_lc'��c��6���_��sUtK��f��q����M����E����l=>���z�e�*��Zw�L�%������	
��L+^Q,v�[W=;���a��[>"�[W=K�������[s����]�J������L�!���1h������lO�ljt=9�L�����w�{;+w}��������N���L�"�<�x^O�,�'^'v����e�9�I��:��y%��,C�;�k��t��5�~fX4+z��t��������}���v4w�.	z���A�5}�[R�6D��_3(8�{^�����
=1�b��� �Kw������tK���5����&���>����v�`�Y�NR#&F��1�����eN�t	��
|!����-���J��i�B���D�i����d�
���ttvq�M�x��?O�~l.N��B�n]9|��VsyL��;��
g$��9�	pm
��.�L�~g';h�m�����#���7�DEv��,L���98�0�k*�O�v�wv�[4�]��G����R���4���~S�F�
�r�'�b�vw���`�Z>�	��:��#�������9Do�5�q'�b�Y�������B�{��Ob���6D�`,4�z��]zj7M������h�����q6#�����+Y������)o���,�S�`���3�
$
?R-��u�u�|l����{��u�a�3
;�.�(�$\���p(�����<<o��}}{LG1p{t�g7��������	�`�nfJr�+����@�X�5Qj1�Ep�G����P}k�Q\`���D�����h��jN��m��6���`iQ���-���]�j�x�9�0al�9E����]�j/���o��T�,�K{��o#��	niM7�Vp{_,\r����[���r���{�Ko=u����)�k��I"�,*�=��.��4M�t�:���:�a
Z����������@�
�3v��+����q�N����|#��r�`��u�t�>����f����]��Z{���C��)�M8�����C���WU�e�-4���}N�����&��gN\���g�td��g?�`L�I�zLOt��h�K"�B����,3����Y�6�,���v������*X�<v?o]��
���_�h9a��v,w�kAa"��s��l���C�}���z~��7�Z�n_qg:��	����[W=W�dx���Y�L�"���N��Ea��K������)����V�������;�=��yZ�����������0; �2����e�����a�Y��������W�A7�F
�w��L�de��l�m��@��R�?�f6��I���,*U����~���<�����b�Ls�a`^q��}�f��}��5nC�����b'����vf
�m;�p�:��M��O��
M�������S�0
����ij6�u�u��������{���tk���_���K����U��Vx�N����:�����k���nyp���������Q����KK���� �p�(X8B���n�8�Y�E���`�v�*=1��dJN\�mJ�N]���iT��K��O�.Xs����V%���kqh��u��	�c{Lm0�&�q������r-�&b��)�`���w�U����$;�;,
���������N������9�E�
�%,�������aOu�'��t�E��qz��l�g;���4K��-�D���������'vG#o�[<���]��T�H�B�����ECC�X��s�}R#�<B��m�r������������&>�P�,��~��C_��Y�a��`_��X&���nM���E�wv�#bb���-,���J�{6�B������B
��M�wa�G����
�����dP�la�V&H{^���������y��~��m��U�b���c:�b� �0�(���ggf"��y��:�0�*��Mt��\/�f��a�s�������
g����8V;��)�O�/��q=u�=���q?���,����?<�H�0k��B����&j���t�3�����a=���mf}o����L���I�aKr"�qx�,�hx�������S��0����p�����������,L��^��L<,
��{{�u~G���,�v'>�vfh}�������7S�f&>����I������,���q8����XI�i�*v��B,���-��*����$c����m:�aE
�i�,<��v��kt�A}��_�����*z�Bf����a)-]�KJ�m��D���?���h������*z�!�6�&��Z}��~g�J���:n�;������l�u;is����D�Xx�X����61@�`/���+�3�w�1La"�d�2��Xx�Ilf��Dw���|;p�a���\5������C��u����73���"y��t$���B��"2���%v��YbS�RK��h��;$�Qr~���LXt��������a��;`p���L��.V������m<����R����{���R=5'B5{d�n�� �iE��d�����u���=�CE�"��o�gi���a�(��R�[s��Y������y�L�!t&
�wa�>/������[W�0��
�����M}�-�N�Av��l�H����nF�)K�9��L`��Y<����O���{����u,\4�����:�a>Z�0�(���U�Pv%��r?�R���9�����vb�SF(Sz]���B���N���7����X������<�����+�E��7�����d~��%`A�h��j�,�StL�]�2x�������S:��U�A��)C;g�Sv��S?A�����/�	6���?w0��
��=?���{��
�guXh"����.����"�P��v3A�]��M�p"aG���7�~ln��"������zjf�^�03!F��|���vd#��i�g��`w,^g �1�%/v�8�`�9�F'Un�!
���^��b��D�,����I,��	�n��MN�%Ms#���l�������c:�dk��>f��X���9CE�����s�E����5�]�S��+�$A2�d*��t6$���k����r��,@�7��F&'s��bfZQ3u���5�	a���?����
N�yG4|�6?�"W1��]���R���aG��E8A/����a��v3��v3X�Gcvg��v$Xdt�/��������G�����	��44M��+��X$�Y�<��W4=��y�����E��Y���[���f������	`�4=����;�����`[��b��`fg�t�T��2���r�3����V�X�|��~l.�'x@A-g�B���%�F��b�L��fz���F�=��n��(�e�U6JCm��3���M���y0;�hxO�XxU(�M���.gfY�<`�S�
���w���Js�3S�j��`bg�4�$��������Pz@������������H���cX�<`�tJki�1U������
����KtL_��+������`y��[�F�i��y]����f�jbgb���
Ov�Z4���'����g���Z(���������>�f��bk����*|g��>��-�/�Z�h��%Q�6���,��i���tsh�
��[�)����n�"��&��L;��o���.�O����J�iw�d�j�a������U{p���hX�.���D��6��1�b!��L�,[��G�|{L,�$z�����Vib��Ale���L����nD�f�X����e�$�p�(���6����qX4�{e�A��MT�N��a����
	�����lK�Q�U�P�/��X����7a�i��]=��)}�10����*_�i����96=������'q����1�$�R��7����M8�q�B�WmX�x��������kV�-���mx�9:����"��EybaE�Xx����Y����/�E�	�D����D�W<�^�h�"D����e��a��������{aP�>�|L���zzL�"��B4�X�2t�en|�:�������n�hV�c�����M����v'�9���)��������K��6����D�~Xrx�fd�����0�EtK�C�F��@baj ��%�O�i������,5h�0�-	^&, �dKK��%�L#�3u�t%��m?9M����=�N+�^��'O�.��o����iz�1�W���v{OC�3�A��'sv
`d6����Y�v0IQ��P[,������#6Qb4�K;�G)&����oJJ��]_En�)����[|��vc��E������1�A1�M���Flj������i�����,�����]���J(�k���$��T�X��I#�ue��aZl�x���b��a����9?���+`M"�i:��������#Q8����iz��bi����a�Y(�/���+2-���Qo���1��0uZ��)���U����l��[�V"FfQ�������BlK����x��(.,;�j�I82��+N4��KC2����x�o�4Ev���N|��sRR���~?�if���V<���-P�����g%�0$��)G����l]������������rzJ;0�+z�m�+����x��t7XMw�v�^����{_H�%4g��t�����UG�`�����VZ��x��y��=�`�H,���M\+0�[<��1hx7�-C�$�����nvOSd'�����{R���%�iP8��
$[����X�,[��Eg���e|i�A��)����]���.<��,tJ����N�i�����b�b{���Z�6����v�N�t��f~L�1���nm:��%���%qM�uY�Y�`����T���il�z�|h�%�=�M;�i(��E�O��9C�Y���5�����i��/�{$<���c��T�d^�:=��Wj.�9����+���g���1�����ifa_B�&��4�������O�k�
����`S�?K�BAu��02����	���"w�!k��iM�k���>
�{3��D�v�`k������H��l�)������.x�ye[��ia`l���V��y��gS�5�����������
GS��l�����|�N�k��N�ni�oQ�)�)#��.�J@t�o������`5��^a�������Ebn�2-�z����m8pR#>�����)���1�X�u��z��yH����4T�1p���:�`'���;��7����&����it����p��]D���N�8����������.�p#
���e?Q{^L`Vt��AxO�����;��R"�hm�����t����d�`a��&�����Y��K�'�r�J���S����i�v����@���S,���
�3�j��]���\����h�������x����'��=Y/�X( #������i������wA���jsh�]Y�_,�$�m����1�m#��p�����&����'S!�����u��?b�����V-�P�N,�����KP��'}�^,>+�&��i���Z&E�+7��bV�����1�������2����=����|L�=qk���2,�]X�N����j�����E7T[D�n%e���3��MD�I��9;#L�X4,H[Y��X���Z���M�O&{%z���d��\;����P��,v&�s��|'�5
��`+zCbKj��/7i��_3Xxb�������������dz��ac����J�"�P�C4,�3�b�cO�i�	�~a�A����V'����DrtZ�x�o����=f�%Q;�\�
�&z��U�'S]��Y+�I�vY��,�,5[�_����f������c��b_�YK�8�H[�x��d����e��b���~���`���*�D�0
 �c��/����O&��{}s������u�,��e��DA�����q�*�����~���k��+�
4��<�R�z-8EAb�
b'tl5�?���B�^DO���@4<�5���[�Q�����?��X�z�]�4W���N��i�����Y���]<"��2�{s�i��-����l=�@t��iZ�y2���%��������D��	'���=yZ�U���G�������X���]��4T�m�TY�d]b�SS5\p����
�f�����o��47yZ�R����ocj���������D���e�'����Vdii��IN��D����5�H3
�|��N��NKZ��a������S	�4T�@�SY4���2|�����]�At�M�^V��L4E4��K�/����
\m7���
��oQ�W��M�;0���kt\�������a�a'4����'�{���nZ{��\Ws�df�j?�	Z�f��b<��X���]��0EV��������-)Z�=�����4�����)��(A�������/�h�]=�R���pg��,=�t��wK�K��}��	b�w�"j��O�j=����J_"�{��p[B�hZ�J����X�/\��]�K����������K���}����LX����^D��8�/���nBpZ{��s�z�R��>��P�|�I�/�Et?|�|%��SO�N-���OY����m�>=�� �u
��`a\9�
{�$��f�~����)���;k�	������f��a�����'��������wb�c��1��P�������L1���'t������J=33�vF�:��
�oYfGb�6%���Hf�R�������W�ctm�A���bJn�+�A�r��`]��4�Eg��5�'�����`��&^�m�t���'�l������I[�zB� �S������`����c�%��#A����yk�����:��9o�L�Z��t�X`z�
|�p��H4��(rI-t��`$h�\<t��^���Wv3�=��$
���� �B���]_)���Z�z��@������5L�OU��&��A������P�K,��d�N��1�����'��Mu'����hF��B����
+��O��S��+v������:�P��4,8����4�aGva	����]��0�8����1�*B�D4]n_�e�7t�$����'�4�v��o4m��`[�1�r���B���l�0m"�r�|�f�:�v�;3����t�=[�q^r�t[Q�F���0�V;�R��iI�������T������������'N��V,���)�������'V,�o`�\���%�8q�����Y�����b;��0��O��s�k�D9M��c��.�EQ9{�l7���M��f���R�Q����(Z
3
�V-�L�\t��`������f���j�����DK����W~*�1�k�)�\Wv3y+�O��D$�V���`������e���i��-[��Q��w�e!�M������HE�Y���SV?%zgEw��g�OCm*�M��O,�����\��YlKH^-��/�����-fYk�G�J��e�)��"��uFK_�@��������S�u;
��:<T�Q���7�Y(�-6�l��*u�D�DbnYe}��_�����,�"vW�;<��;��n,S*���Q��9���������
&�.�_�&J��U�����J`b�^��,R'6�4X��_LV^�ba(�,��AC�-���e.+�/�=2��V�J��|���lBtvYE�D��]���mtz�{���R�b���iv���}�t����z=��|��?g��F����&�V�f��b<q[
�����"<��zT
&Fj/���E�wg�{5l��	�����e��O�A�p���O|]��_p�%wY��t���
K�����knwo��gK"��,����'S��'Q��,f��Q#�����9�1����P���_��5x���?���Dw
J�n�)���8}�/��[�sX���.7�_�v�]{�=��<F��b_x�vl�����*zE��\���j�����;s����J�e�"8
����]��������]�Y�.<u'���:���*[��~��&R���_L^ta��b��l�i}=1[d6Qq�,e�`2_R�p��H�XVB*6q��=�dKR�S�P'�Z+�/V�+zo��g��b�L������e���~&k��2���HMl�y�`3�
�J���(��f��iY�v����J�q`�S"�	!�e1�_����-(�v�`a����`{��cY�~������.����-�y��������Ks�:�����	Y�����[Q�4�l�B�e!�}��a��/��_c6q���=��X�OD�-(�`��h�x�j��_�
�#��[��iv�z����P�4U$��������D����������N�i�
����{v[�#���_�t�a IZ�����Y��YX#����4����P����;2G
K�/X�,��b���uO(,��/�,������`�c[a��v3���	�K����;6���P���%R����(Xx#���3��f���	�w�^����;�����!DgTX����
t�+��H_&�4��U����W_LU���=��n�t�E�����[��4RoV�9��;����!m�l
v� 8M�7X�s.��f��H�4��N��-�����W�`l�{U����-U�����d8��{�=[2��2�v����l���H��|����������=�L�v�=v������9=2�5+_0<4���a�,�������lM(�/+�/���a��X���J#NOi������E2g���D��=���������]��d�~�*j��p����b_��
}�@k�k�4�b����o(�LhE��p���C���E��:�{	�~��
�'���5�i]_��I�>�������a��~�������s~O3d���w��J�{^?(�f�(�'O��A���<S�'==���QlFG��E,OC�#BgF��������oEv��2?;�O�k�����~a2)��?�����Re��g2�V���
RI�4^[&}��^�
J.K_�>��h�^�lz�U�;�3I��<�]��l�_��}����l
v�`�����.�n+_�"vn�i���������:����~����%E��9�1L6\t���X{1
Y�P#���5���m���jd���Q����{��4C����K���pl������R�6|����v,
��_�}3�R/�g-�ld��%��V��3#��}��]�.O�wV�^��z��OJ��u��+X�`_�X�F�����}�������OZ���3�Pn��D=�fw���c?&�ELWtl3��1	��.�P����5=�C�?@�9�9����4���Q��#��j��K���w[�oL�(�g���������������_��2�.�0;���,K�����y����%��ivI�Y���;jTe�k����`z��/b�]����gh~����o����"����'@�|�+�P3;���Q�c���?�����Ab��4*3;�S��`t���4Cvc�����2[�� �b�����0��3��[5����l����������L�7��z��P��!��_�X�6��`������P-�i&������/{7�`�	�����_8^����KW�x`x�
vO��f����&���,�]6�Q��}�����!�a�/}��ghQ	�_��������D���Y�Y���,*P0��E���p�z������B!�_F�����?H���;=�>$,h���V� K�]�(���f�!�{�� �e��[a,*��j���Uh���~&��I�:o���{g��M��,�0[��~��(�izW�g�^z����{!���1t�$)
G�-}J����Q�[�3�{�du�$5������@�@f_��G��������*�taS�F+��2�*��no�i��)��v�{3�=���$i���iu����iz�^��0��t�-�ij����{���L�{���v����QG��7szhvpa���I
�5hT������$��������)�
)k�}�`�	4��0����@�iz��7�c��v���`'�`�f�fd�.t����Y���"�I���V��^*m2�2.�c��u��p�� 5���a�������iU���������U*g����W��r����~�����~���1���t�U7��K�<v	P��i��~����6��`��������v	`�N��>{2�m��D��f�L����Wr��5�Xk��G���$������xO3do�hAI�eI
�g4�^�>���8��r�nO�Az�����e�OC�;�mz�*3�g��;�I:�N����+��9M�0's�E`�����[�a�Kva��c���08M�(�mb�J�F�%H}�����A������N���@�"�
�]Y4�kz�������v�P'�/
=�`i���B��K.
��Qw�����B��a	�P$�bv�:kw'|�����]2��k
~�AO\�j8[^5(r�%S���q�a'�w��p�����c�����|���h����8�Y���\�� �������P��Nn��zp<@(��K^=�#��4a�R�V�2g�I��f���eR��vaDR��t��~��Y8M�=\��I��������4a�&�
S����
�S4�D������M��������0�a�
�����
�	���EB#�O��5�)��	�0�Tk�����2�>X�8����Rr3����?�%��1�,�����w,=69��H������L����6!����������A.�����}���~�^H�4,$��-��l���K/�4��2��z!mv�{3����'��Z#.�����W�^tT�Sf��A�-kt07���-�W��7)Xv��]�����O�k
�d�B�����,<�5s7����`T&�	S#b�{��l�)�>!}u�/<7J���a���;Od�zRH�'
Y�����i��\I"��f���R��!�`S.����jA�Ly��'A(`6�P�-MxXJ7?OSd�
qE�6m��o^�i��������UP�-{O��GB�	c�%`�"�	�6I��/$���1�6�%	�D}��#�A������UuiMX��
sn���>����
W�0�"iv�
v��;M��u���*�g;LLi��������A7�K��`�������l�zB1��o��P��C��%�*��K�l���yJ{0'�s�����'r�5��&~"z�����;Y,���E�[��.v~[�D�D��d�4W������,�����bi��:�E�D5l���~�����,Z+�����,k�V�+z���_���[�����~��W��=�Y������b��{����X�0�Ite�YbS���H���-����������%���j� |a�@�YZ�XK>��Y�0]>�����e7��]�\S���>�"����e=����gg�k�X��@'���>��St� ��H���<�^%h�nvO�i�����~YJQ,b���*�f/L�B4���,u��}Y�Kl��]NSd��e�E������,�4�D�\� |a��'���
��EI��k�������c���������
��������Y���z7�.�����$�3�����l
���@;\4dxh�dmi�����bZ���,,��De{�6;�M��f����t��V�������	���o4F���=f8���L�����4�k���`�{��Y�-��z�����������]��d�n�2�J��V�.,�'�e�|�z����|���v����'����	����1��N��i��S����|����������A���&H��ua�����4���������V�wam`���'4��X����m����d�{3�
#z���k��1V�J��Rs�9�[���Tz�����p7ir	8[�����DH�����.LxB���a-
]�4�hX�&v�"�`���C���= �I(z��}�H�%����vaU��i;������
P����X�{o��4��l�l���P,V�.�"ri�~�����6y��5�7L��M\U�{�Eh_��{vW��g�L�����������b�/��8���]�Q�-1��������z��6��a�����4A�o�C�N��UN+��uh8���S�A�~��`�Q�������b�p�:":�
T,�]������o����v���`+V/L�Z��������'uiN908�*��/�Z��0�Lj�������;��Xe,���
�����	)�n��
6q�V��6��N�H\�S��]`�.���vX���ix=q�W������������.�m�8���[l&|d��#�R��5K]�#���/���c���������XZ�l�1O�	��b	�=�tg���o�[2�B�o�8�h��l���NC�'W��������(����{��������Cm_B's�(�XJ��;�7�[c��W��+<A�rf��Bs��))��]��|aP�
�f:
��\���������U�N�i_�i;���d����=�B�IOL�@	CgV�@LZ�~%������}M�_�xI���������'�y3R+C���W�������R����{v�F8
��LfZ)9�OX��0�b�
�xR�L��	�
��$X_baAq�����W�,xv�`]������E�p�`����a$P���O���NSJ
��NXcl���`Gj)��5�,o�'sv(�������g+�@J�9qie�Bs�I)%�(}�[��i��	��<u7kfb�0�`���L�$�%����*��P�.��7�����
�Q'��.��A�BR's�`�0��
���6X�l��,b3-;��R��w����W�X���V����d���=`"1�F_���������|�,�[��S�PgV,Tb6��s��������b)^������{���gI��^=o�J�b�`x=��kF�}��E��4})2��@-y�F�_y�>�����%��k��E2O�k�v�J��P���6�`�^9=��>&�,�CIN�4g��,�L�/�����;����f��,y\`�,����5�E��K���/�E�	�xvdT��y\`e�h����
|��T
��U�%�����hF��<���
K)������V���a�-s�mug	�,+)v%nw�VK�,�+�9kB3���B���S��,['�6��5��{��W�W��'z�b��;�;+f=[	5�j���*�D�
=�����+�oT���^~r����E��i�������mt	_i��MO|�'��Q�.yz��P��Dx������X�����88V�KW�{#�.�f^;�4WVw+v��]�m�,kW�Z]������~�����cN��������U��}�\��M���jiiX�,zN���������v�7lg���V�r�^�m,�-�35�{��i���X?�h�?�2�������Y���L�N�Rs��BD�M��j��U��,E ���m[���1����B����r&te�e����7b�d��V�+�j)����e�����_V<i�L�R��r��D
[��re-]�����T������c���~SU�*3�vdXi���}"'s���� �]��d��3\V�np9v� C����}ah8�]#�4������i���e��������z�`�:���A�uH's�`��h��`vK������i��Gc6��S��[Y���	sB����z�`�a���H�.�}��T�P��.�%��������'�5�����4To�04�tr����TfE�~<�{��=;]��
��W����
���X��G
w�P'��'<N���zKAWx�B-�5���w�;	���q+�E�P�(D������E���z�/�����a�)_���)�'F���@g�i�>vcX���E_�p�`>Q,��0���Z*��d��^a����p��@�D�����<����{bJ���m=�F!�Q�{�q��<?\�E���yzL{mp�|�y�_�a�o��{��!�`�:M��Ej.z�a�P��8�i�v�`��Y+�=:`4F���C\���w�!�B�{���_��c�l�I3�3�Z�M(NT��V��%Oo\hd�"fp��n���j]�J����v:E����#&R?N(�V�W�o ��7�}������q�`��8��=k&`#z����|\�{��T��a>=���9�V�+/v���4Ev�am|�F�:WW�W�?��s��Z5y��.�Ei
��r�4K.Wjn��l9q�\�lre�]�a����G�6\�z�vG&�h���$�M'n��M��4-�l2,�~�H��1~�"��07�H\P-}�W�\�_z��M���`������f*�,�\����WiI=����y���1�|AG:�c��f��f����1�@���d���2���Oi/�	x�.�`�*��V��u�.Ls
/��w
T�&W�e��$vB�;�]����Vk�;B�=��X�����(��|���i�����'9AJ�oV/��d[��L!Cl�{�PX���$�'�`3��k�[V�=�=��r�;s�Z�j���E�Ln����~�B���j��k>��"L�0`4>uvN��M�>��pZN���11_�
����:e��MKu��=�B��v@��)��.H��&{�/���xq�����V���OS,�]%�;�E�+,�
���*��g���W����ir�<1�g�%��se2��;SK��S�@m�c��+<=aW�,�"�`�����v�`=�|��t��V!���@�Z]�f���[H�Y�]XAnU���g�����CN^W&6W��v��3Aw��.�$
o�)���pY��_$hx��Xx��YrZ�r�%W�aW�#*m�L1���+,<
�B��Uy�F
�r�k�a'"z���SqX�l���_El�.:��j����&��Mu-.������4�P�m}��'��
o�f���u2W�d�R��~_�:�{�i���`[�PL(X�	t��Ni�	���^�H��7�,�o �����\��,�Eg��l�in,�j�4�"���!�f���$1D���;��f��]O�����9����6���	a�f����cD��-���)��%n����T����XE�8�Y��/��	eN��D�T��1��JtI��7k��R����G��*%��@��1�n��%v��v���������\Q*�=f������3���5b��5O�k��E~D���3#��E�PH\{�,VE��[N�85��6�.
�������eE7g�e�D#�S�M4�7����L��]���z[g�n���f��7+��j��e�D��k��������!oE
���#�
�Lgf�����w��n��Rl�2�f��,��NV�~D�g�D�c�
o�{��pY�����lV���U������=;X���n�,���G��pE�����j�4�Qu1d���	7��~� w����_W_���+S

y���s�lg�bY	���"k��O���b3������;��j�lm~�iz���R��ct����0�$
��;X��G��1�D�Y&�1�d�t��e����m3;2����a
�iVC/�g	�v���Y*Z�^�x���P���d���EeN�k��5v��%0�@�R1 ��F!4���&d������]`d��)�������<[w��P}�4��#p_�p����S�)g]5�����������s��g{�������+�UD������\��6�U�b�bie�X&�)����[��0���n�M�dzb�+�OC����|M�����>Iw'>M+w���E�e�'sv5��+:S4`)����E�S���<����������Q��f�e;��������'��m���~��[�����Er�i��$��c��.�U+���D�N��.��<��_��k�]`<H����~��=�������[�5�6�)�I��i�����42K}{���&��Y�%���,��.b^�F�f���T��U��P#���]����a�������L��U��]��2bL�I��M�V�U`���,���.\:^��-��c�����]���E��a�3�V�����i`��n�&����B�%����������p����{����pO�M�����gk�>��X��^�`3��u����01��Mk��O<��z
%7���@�L����
�?A/�&�:���?L�]�F�i��w�|�h�cv"�1�%�����	��f�b�$���p_�dpc�8�a�\j���b�Ui-�Ta��[U���K2{���w���k���T'��Y1�.(z���`+<�i�[u��1���
��iK�,���K����i��<A�R4,OI��fueZ�?>�8'svE���h�60>�(=
�><�Mv�gN^�9n�Fx������b���'N��7K37&�,:��b�bx���6c{��+<
Xp9&����L����
�o��0�������Z#�1%��ON��;�����e.���>��o�U�A�L*Ol���$xa�XvT5��6�Q4���e�ZN(2�i��e%?/�v�$6!��,���i?�
�,�vx�v��$�i��wp�^;A��g�a���|?�����q9T+7�"D�,�!������D����F�����G�lp�m�A���,������/�J��Y6�1��f���I��
���e�f�=��Z��.z�pO���@�����g���A������lAO�7ZI�f~��9d��j�{�'�EjV��w��~3�7��6�R4M����ljR�W�c��<�"UY�|b7O�4E�_a'��UJ�BM���i��&z���_��]	E����0�/���ea�/X���|�gWB[����*�E���<h�T����N3�<C�\��g�j��P�;��m��l����[������)��"�������R���1�PUElg�u�X��*���w���3����h�����XFwo��4������c9��������e6q��cIZ�d�_hu2gg��AW�o�e��b������:�R=������U��6����3zg��]w%�Ks�W��=;�z��]w��Ks=�@�X*�aq��VL��-h��z�ab��+�b;Y��v�[k�;�����z�b�w��md's����tg��ba�������i���E�DWxH3���HV�a:���X�6���A[[f?�/kx;����MTy=i}XxQt����X�?��`5G���H���?��x x�k�/�u��[��la�=b��.bg�@���-��0������{�$�x{,h�Ps��Dy��Dk�cu��1�������Z��]��\3�D���	�]��T�`��s�_���+�K
u����`�4T�1��m�T�H�YM���
4l��\�nBd���*],E�����I��N�`�O�M�O<�}X&Qt���X��0������
[^D�R�3���X+�%���=�Bg1�]���}3�+��>L�A�~��=�_{}�/�9�h)t�%
��m��n�����&�@������o��{v��\��C�O� ���f��}Xq����F��p=��$�0�<}���hz^}���-�������p��C����\���q��E��
�i��&�����\,�^��e�y�������3��*\,e~]�W�E�l�o�J�O)���G7='Fj��I#���V�^f���	�Y�������9�"�c��}Y������c��1,
�����������-}`��2�l%�j��vk���OSdw���
\������������"�������{�����e�X�,�
�,��0�	�[k��+^����V�MK�B�x�4P/����l��Z{���������P�1�lz�U.p�

t�������!��eO��?VK}��n�Q8��b2_�=X��?��V��P-[��!w���\z�������(fG�����,
?��~\�r��0�b����cg�����o�9���
��R��@�{��=��� X��<��C���K#E�f\�p�vm;��1�N�g�}��N�����q2=��~����To�0H ��;����j,:=��ux�	�f�+j>0�0�(�^s)jbr�3L����&������6+��3aM�]���\���,����������3��AW���e�	�d��-���j�x����`��5�3
<�}�����D���%*0�9�P���-y�_��|E������,�z�v�`gB��������D7Xg$)%J�"��d� �10�;tg+�6#��y���LE��=��UKX�t�}�R-��8Y��a�����d�~��]��5%w�p���I�EA���=;aDM��'���SMKg���L\��X<�a����[$t�g�*�9=�7uxfz�BN�������;t�d9���0���)E�]'Xx��G
OO3)��XL����)a'��81�W�=��|`w����������f"?��|��/�~�`'������5<�;�.�E1l�v��8���l�����`w�����������i������3����q�3#y`������L;��?��=a(L���_,��4f��Ku4�2�a���+����$m����,:����	<\�_�����-;���h��b���n�P�E�w����~�n����������<4�/���n���[��3N���	��`�������(������.��n)����Ew��d���V������h��ggiD��n\lg'�L��w��)�"�x�.L�A�K_��K�u�v&*�0�Tle�b;s��&�9�5Kw-�Kkj��YxO��IlO$���N;����2�f�Q\,���\���mcE��4|�p�	�n��=}i.�'�z���]Vj��C�H<M�]>����Q����,)z$j���];�w
������EeNOi�2���Q	�;!)�j���l9����[�3�����d�~��
o�[���Q'������~Y�X��A��V���n5[z~�@�?�=�v��	&g+��-	9�n%���3�'���+��p��/jMFG��J����}�.�j�a�B*�	��nE��iE�*k��uy�M$#��a;<$J��I�t�^��)v%n���Ad�����X8��6�_6�F�b�-��F�|�4|��l���n��=&riN�O���-
W�_��'sv&��$��^��9{�<Z�~)����HV|%���]��;Mu"p������f~L{��_��������P_,=	i�2G���+�D/x�l���h*�`�T���K\�d�k��.�[���p��v&�s�;
��<]X��-��a��5�-���a�����k���+%M��j����E8���Ks�� �VV�'�Mh4ux��a�*/�y��Hc�1L�St��H�hfa�<���a���K�i�[J�3)M���w2�Mz�a�H��0�d=L����A�L��v+iv�W`n}����c���cX[��������LvTtem�b����YX	(�������[�~aAL�-����h�����Gw2g_."A�|��?1Z����!���z{�/���e��b����M�i�W��^��=�x2go�QD��o�
�9����O�i/�������&�)z���`'t��-��O��z�Mj�4��b�������'s���
0�Q/�]>�4T����������Yva\,��9�[�J����
vB�Y��O���B��S��c�*��o���4KEW&$!v� ��G�`�%t��EK�2��=>q�v�������c�����AW&� j�y��-
�~hO�^�n�T��$�e8���������7��m��Q����L:��V�
��%�J��(x��m�h���w~����
�Y��������s�A��s�h����3'�V�s!��-tp�] x������cN��������.��a�@�#�e�-xJ���x]e�4>�������[��4�v������u�BA
�K6Sh�U��%��(@���S���}a�D���k��EZi{w�������&�*����`i���]�p=	(Slq��R��j���}��$^:!veRV<�05�~�?��/{���w5��U���:n���Du�����ti�b�p��	����_��{�%.;������Z�����5Zi�'�7<�����Vi���O�v [�fa�~J/��fJ{-��������`��;aM�X&��n;�iz��\��bw�/XIJ7��n�������K��n&oI��$mEW�>��g�����5miK�hC��}/	�s6U�gE���pE'n������S����xZ[�
�X�-xba`6�
c���{;2qo��v�H���w��gq�}/X�~�=K�n����9�%���������iX�����Q��0��Bt��	6q�C��.f[���'sv(�6��������`'��;��kM��U8�.�1�n��i��#E#�m��'s����!z��>Yk���H��%z�2
��m���Lxi�5b_�+:!��Z"�e��'���f�����Z�V����'�����[}���hxY����Wb�����86��j}�V�h8� S���@�������Y���AoG��SZ1�e.�����b�l�e�r�A{-y��b�p�
��U/��1
��fVK��,�%���m�-��*������OSd����EOv��e��#v�3�gG������/�6��������D"D��t���D���xzL�]t��������z���kBJ��:�Kyl�}Y�������L��km��E�D�-w2g���E7����DM�k�WxE�h��q��j�����/S����S�pM�S��J�l�^s��j=��I��������z��x���m��	v�sf���y7��4�v�X'�hX^c�,�'.�2��	~��h���~*,cHba/��&<���%1�_���vpBC����z�DWV�%v�����}E7hr�3q��k
��i��^[G���]>�c]�������3l6�iZ���y����d[����.~��������dU��a�XXi6�2�Z����P�P��,C��C���2�|4
�\�4�<��������^v7�����]����'��7�|�#}�|���d:���B�k���I���I�E��r�/����e3��Y��G�����#�i]���d��
% ���`5�_�p��L���a��hx[�X��g4��[^�!6m��0�$Uj�l>����2��D��kY��n�Ks��B�{j�y�0���!��1o����Q�!IZ'.1{;�L�U4���_��/&�hz-K�2�0������/��
�J%L�6����{`�+S:anX�-z�P��B�M��m��D7��FJ9S�e�����\��0Sz�� Kv3n�}Mx���4�Z;���o�Y�G"J�	���6#��Z�^J'z%�6_kZ�08,a�L����_����Vj~a"MJ�p�v��4To�02t�T)5��A�����*�P��4t
��k�OC��7)5'��L�:@����G�U���~%���`�]
���o7���Z ^�!6���d #�N���������*�
�Wk��U���Y��B��N�k���������K����W��it�V�����K���E�$������u��=�����33c��E�6�`���.���.}���-M����RDW�����_�����W�P�^��������
����R�%����;��[$}��e��]:��\���R�D���a�Vj~a\��B���(�A�&d�^�C!M���L���`�.��czc����K;�W)�=�+���N�.�����S����[���i���||j����}fgE��v��	��m�M�o�n����/��=3�K��tf�r�,���l����%u_X%+Y\&�)JG�MH����}�,�h�L*�0�*���%)�-�{�"o��!+�
O����M�
�K�3z�L��b���.���$�#�u����r�xMPz��}�3{p��?��;�NSdO������V�V�}���hx
�������55��m_X�4���@-�4��_?=�	z���`�"�/�����������u9��SK���LH�����N��.5�$�Q���0�4M�I��NQ������bi~c�* �yX���Q���(A�{��=[�g����i�Vx����A����K��vS
�{}a�������[��-]^W����P�_$
��3��b���	��.��#XNvX�&y�D!��<-���n	Xcv��4����e���L�����`;��d�X(,�n'��c6?&Z�EWV�'v���4��CEK��D`X�v�UN4��e��,v$j���m�_��3���%W%g�9M����R�y�qq���e�~��R9=E�=��J�0��@���������[8�*���7�����5���k�����&��7��n���o��
��t������Y��FB*q}���.l�
���v�o�2�����,E(z�)R������f)q�#5���4}�0��������{i.�6�%�,Z!���6���8�
��?}i���h"��t�X�l�=�_���{X�x�cR�����M��:3��2�?[f�[����m�������a���z�EOU;�����RON:.��Z�������+<��2��0_�`Y������4�>I��,hX/6��<��<�:��D���l�`���<������Y��Kr�f�..k��:��f��%�k����nX
x�������Y��k���1��S9M�=/��H
���-�<��|�D����< ��
�����D>D�Lr���z�A���m��;
��++A]�����*K�����_�`w-����#`M<�\,e~���e�u�5�mZ�w�v.�m�_=���c��{���`\���$?qB5jX�v0�Z��No4v��?�	6��[��f>���'��+/'��$���q�@h���;�+�v����c��/@$:���-�=0����y��:�4-O�k���4%X�c���.C��������K�������,L�?J
g��#\i]��Q�^-��3���k6��_��i�����%�b�~(C��h<v4�����bb��R���$�K��'�yZx	�4��������=����eb�=���*���:���y�{/?��*�������(�9Y����*�9�h��p]�f&�"����$��v�Dv�w����r"�`I�A�hW�������e�,�?M�7f�L/�-���8�X�w0�I�P��9
����&Z�w��pW*
�B9�/{D������vB�l�hx��YXh ��L+�5����h�/��
�����;���bX�w�@p���`a�N��(Kw��5[	�a�a�
����\)��A�f��J�j�����f�3]������V�LKH4L?H�~�6�%���4C�a`)D������v��@�K0+�+S-k������T�Z�v�C����c_���`aoC��i�z�[P�4�v��8��l����fK��D��()�����pa���I9��Ut<9
%80:3m1��W���;W��JQ�0�l��J�-�������D���,|�*�L��V,VedD/���B�@��$O3d��G���ME,<�{��nf��w1if�;��������}�����A����I���g!e9#<`)��1�����1����Fj��]B����P+[��>[��Q�DM�(�b%~+Q���+\�enb������������3�����`�,g
��=`}���a0o��Dl�J�nV����v'�2��
}RY����<�;����`��{v�Rd?q�����`���;��[7m+3X�9?ksO���Bt~���l���`
��
���M���WG��pr��6#�aQ�������}�IgZ ,&=`��hX�����q��zo���U�����a�Hb����:�w�03N���`,���wi�Q��%8
�.�1�v���4To���+�d�!-�d���A�1����4Ev	�9�	:�X3.�u�V�0h�dn���v���c-�<`M���!|i��#�[NK$OB����)v�A�4����Q4��MhOK$O)�Xi��]���e	!������'SW
{�����iZ]y��-��-Zb+��[X�G,�\��S9M�]v�
UU���	���*rdDO�Z�]LGI,,Z/7�Y��'t|5j$X&7*v�_"�&Z�������hx�����{b{BycZN�(��}ER��Q�iIhx�����������;�^�Z�va�]lc�G?o�)�8�der�g�yfZ�xW��4U��F,��ev�4OOi����D�k��������a��YHE�w��������<����d���3��:��)jMk�f����HH�����y�cB��������(b<�K�ucSd}�	O�A���3Q�>-v:��4T��`^�!V�����y�^��,�&6������l���ie���@D7x
�D+��1O�i��U����Tb'�L[)�i}��������
=�*8�l*��S��g;�����������b'+���~g+�}Yw2-\�=e����M�P����Agx;}��Ut���`��6�����������3t�pZ^�.z�>��=������������9;,�*�K�eUbW��ieX��:B�V)��$f��%������;�(��Y�>�h��/o;3�Zw��\���Q����i�U��+��lv�o&�j��=
{i.*9���W�L�N�D�����{\��)�Rx:�`)�9�Z�,v:�������lnE���c��a���M��4��b���25O�f�4��U2���D��p���	��`�&AxzL�OL��4\r��7��]�q�:��&�_�uV'<a
/��p���:�B�h(a,�7��	�`Sah��N�*+�'d)�eVw��Ks��J��M��BYO�/V[aC"�t���]�#���u���LVtf��6��di���@:��X(�����������nq���D��j(XZZ,v{�O�i��]���bZg�v9�9[Yv��B�
�����$K��[F�4C�`!��aa�N,�h��3�,X�����P�Ht�"�'s�b`�Q�0(iY�6��2�"�&?����8���6����m�'sv�����p�-�:�&�h��	t&����Vi^G4t�m���U.�}���-(x�";1LVt��W�"�n�	����h61�v�`�!��x���WY�����ae��VWz�^�]�C���a��f�h����#�t�����y��{��Jt�n�����w��`AC�p�	��i�`��������m#�.tL�-�{�E����N#��/���S��b�6�[��`)]Z74��`�c��s��������ll	���K��NQD�`�{�5�2��;aGg�����5m'��
o2�����4T�L�H4=��n��i�v'�"9����}`�b�4Y7>����%���C�p	����!��[A7�U�2,�	� a5����`����O+���.&���8M��X�!����/���a���p����Zw21\�VFK�w���X�v�2�0%>�W��4T�00�&����=k���i1�	��f
�Bi6]���a����=���Y�w��T�uf���[����D"
��}3����c���^|���������������/-R�f^��X������A��E�C�;XZ?l���+N�����^�i��
*��mP�Ab��S��'�B]�~��}��$PO���bZ�x��>h*� ��};�=�zL�|P�@4�c5���LD�B��?h��K����P�,�B��}?O�k���KI?��b���d�=�������*l�_J�%��_�I���5�bi�Zz�t_�'�����H��]M���?�K�21���o�:6���w�^����M��0a�fR��r�T](hx+�������������k�N��"�����.�TP,l
��Q�#!j������ �/�], !�e1�	�e�px����Rb;;A,�~st+�?�P�As�4�[��������r��D!���6�4E���_��9�]�"��No8����e���6z���O,���v�1I,��Q�^�p�����o�"��h���uI���9���������������cZB�?-:s�����b���_V#����m�>=��	v�
��3�>��M���-��Os�^;#,��������NC�'���Sn�5�����IJl�AzY�z�t���5������4T�tL[��'�`ai�����b���b[��mY�{�B(�/���_Ku��&.z/�9�����@���?b["K�,�
o�
�'ba�����`K��}��e������d.�6x��Mh�-�w/�9�XD{�,���}�'s����������;3qg���R(L�������Y������,��X��h�ng�pn%(
�8�������L��	�[~*J��{��4T{�D����bkf����b�@��� ��������c���a��Wf!��b�
�S�X~�v�l�����i��C�A7��I���N��� W�5^����iL�o���b �Vo���{x\�I-��H~Y2|1�p�/�]�N���V���x��*_��D�.9�`��-����R��VE�|f�����wQ�Ksj���{�?B?��;����[E��EO�����M���L��^�a��W�����~���<�<����%�u���e���?�\�|p��e��Hn:C���k�]��E��$z��_��M
�2�B����f�.��4�z���3n�
J����i�vF�x�iJ��.�}+�8=���m,:�NX~{�=��������P�53�n�0�"��
�`/��-�0Ol�g��/'���
�DW���r&�e���=�PC���E/�og~o�0�4M��a�A�PR��az�"����\�.Pv2��V
+-��Gl���rB�oYSzA���F��D�
����=�f���i��L��4�������4������i���wv~�N����L]��m��^b���Z��XK�����W����`:���s/l��y���:TX
���_�[�.b8
����������B����#��K���`�/�+���s�i�nB�}YUz�_����{��������^��
�3�W7��jo�N%��������=��Rr9���O\A��������[
�1Sz�Y�����h�f��:�
��f�y�d���_�
E	��7%�cn�kd�[-��X���L1���L�J���V�������;$�I(��2�����fJ^L(Y�_X��
����U*g�M�4�v����7!I����`�U�P�]��%�C18E��GW��u�iz���u���M��-���J��}o�K���<LUL���'Xx��Y��������N�k�
�
o����j�����'s���k�Pw X����j�`{������q4�w�`��K.�|�ZN�R-yL���t�R�\5�	�[�d���f�S�%/�4M.�awT���&/+<3c*/�8rZ�y��
cRK��})<��Q�m�DRj�0w2��Xl��O�t	���H���J��)���w�T��������Rd��#XRZ���`�68������[��iz������i��J^������/���|�Y�[�H���U�0�[���y��[������g��c��;��l������	K��P3$X��!�0�+���qO3do�	/�OD���a��5������c����2�[]��0�\�{j��q3"M�Y^LgY����Rw}:���1�?��`�4��2��(�����1o���h
�������U�#���-�f:'��E�O�����h�"�}������9���>*�6M��Q�����LT`v��[���J| ����L���Q_v���	?���A1[����=[P2�������g�4|�6+������~�|���g.�������;���b����
�lCEf�6��c�'@���_��o�7;�s�1�K<��cP��?���_�/c������A�p�*�4��N�
���>q�I(v������*h�NT9�;jt>6��Cf?�]>���6��{W�=���~�"��_�^z����R���8����E 1����������������4�M���,���e�{2���|�H���#��f�u���-�Q�G@��jg����[�d�Nj�1�K���J4�ez9f�P�i���!]i�%�ZV;PH��4�G1�Q���n&$X��:r��5's�(�+F�g�i������i��n��'�m��?��:�A�E���a�E�K"����e����U����.U!�|��
N��]�c������7��u�\�����GM�����/�\��J������^���	���	����w���9;p%h�J����f�-�B�?�Tg�^L����O �e�~���{�����A%s���1�W��=��iF��f3>I��CdA�kv���= $[l��#���F�l��Y��`2V���D7{@����,WY��$�~L��a�'X�d�������Z��&+��>va���H	��%�w��E�����M3���Z���t��n�3}g���C���l�6�����B�z���5��hG
s'��{5���"L��)R�yb{��!A
��~��*a4q[�`�� ��?�l�_u�\�_�����1
���[?� �EFb�(0�w6���o�1�UD��'��]/�����&�u�"����4��ea��F
_x���|���:���F�{vfR��>g5]39�n��C�����9o�Hj�4k(4�������)j����Z%�ot5�e^Uo�H��4�����	�u������p��$s�]����~�|�����@B��+<{I����������a�G4�$(��?�=y�������a�6X��iv/t:=��	�4Izs�N����	��;a9��k�_�kO�Y��N�^;"0�"�gXW��!+��%Yzb�������A
"����en�����!�g��,��1����'��=o��������L�z�@+L��l����y���A'n����W'r;���]:bv�dO�������N��!����,nvO���nR�6�G��y/!���	��S~��+���l_���F����} x�
��l�}�7�Py1��V��}��`��J�;��8����r���l~�//x�����i��O�B��S�A�Y��k��H��<������>�T�����!���h������M�[YL�m�><��}�����8��/%��\�T�{e�����V�r�"�@��Q4�H���{�!a3��%���������/
��`iVv�&�pO
������5a�L�������$k}������`g��*-�Gi�]���?������{�i�dY��4u)|�>{�NSd��nc�y��F�	����
�9���OSd�
F,�K
k����,j�`z�f9�d
l��EX$��uDba3�$����T���f��e�i����;�7���/6����H���3����'�6���6f;a�&X�����6������0�#�����"LM���
������L����
��%�
�)��N�g��Ex���5�5#�F?M]��"]���,��t��_���9{0�������������Hd����S�=�'�*�PIT��E9��6�:�����N��e�=�P+\lK�+D&�+�m#6��$f���)?%Z_EO�����>x��<p���)�����]�by�����v�9�6���E`��7���:=T����
\+�0]w"�h1/Vj.��A�`�B[N4�+5���w���p(�jf�����&m6�kZ���T�����[���'f�s�%q�*�x.,�%�z�����	:3�^�i�����������F��/�<M���B�B�p���,x�6'�4���XJBtgU�x�8t �%d6�U����Ks�qLD��U�Sy��+7����1�f�{S����'&Y"zz2�jm�.x�(��h���qa���'t��m,�l6s���ra�:�%Q�Q�[+zDCig�{����,V.�m���)����[&�a���
yD���
3�9������}$b[&,b����ME��k<�e��i�YI���
����cz[�/���f3�nK���Ks�k��g��#��5�-V-���KsQ�}��K<����S�Y��YxJl�p����
RKNt�KVt$z�����6��C�b
���r����V�`<�7������,L��sa�%��!:�c�������
���������JEOi����=�`�=Xv5��lm�iz�*��.���b���4T��0�*Ij�o�}�	6��v�G��<;"�����1�u��+���S��7������`�B�_�2���E N�k������ha*�.L�Z4������X��0=,������?���/��_)v�NX2eYi��h��2���\f�����5���1.���0�,�����8��]&-�Fw%�dh�v��	�h�G�Q�i����u�i�6��$����r��T��5�	vseN�k���`���5�B��-���w�	�m�6}�`��f�*���A�rh�Q��\�/,���>�e������Sn���|��
�8�9cZ�0
l�{��d�<Z��yI�g�%$����S�
�KG��Zb3+��tXv��:3mz���4���S�=k��v����a��-�����'Zk`�':s~��3T�]����9;&�,���!���z��A��,�	�������czoe��'k�6Z��0�o������\������YZ���k�$�3�������Tu�Wy���p����[�XM��C�+��9�"t�V��V�d�[3����$�ed�:�W���I�1��%`������}2g��);����Y%���~��E���J�M���$�� h��!��'���M�X���Bk�l}��s����s��Ag��W.��S:�piv�T���E�k[�OS��6f�`�k�������+�N\�[�T\`���_�?����K���yo�;H����k����NHS�������o��`�Dv31B������2q's����!�}���K����i��m��p���q��=��N5�&�T���8����'s^�a�Q���
,X�2+�����#��Yi�l~J�����/�NW��o,�f�;�/�E��[�������o&�f���(A��0Y�p���z���b}Ux	��
]%YN\`[,VZ`�N��[����7u&*���`�
��3�+-L�Tt�%
R�������%`����+�����|�����;P���E�����0��;���T�?��G�<k|����4 �T�����i�
�P�^��*~2�-�.U!����;A��p�b�	/�Z~��Z5���M�`�������e��'+!�P�6
��E�G�{��3����M��ieEk�����[3�i��C�34��]�<-6��V�L1T��s��m
��3w�V�oVV;*������ash]Y$D,�gRl�>��cZ��OE/
��4���7uz����[G���b�j������-��:�������S������_����5��Y��2K�tze93T�r,&�&����u�,�/6��}YR�,[�$	�q����
/4KU��,�h������q	��X���h��"�k��/��w�����4�v�XxA�����/�D�����1�1	L�{>����r��&�)z/(�g]M���yxLk`�p���!�l�
�g����py��fe�1���F�~��i��w1'�+�HY-�YY���D��Z��c^}>~��5�!p�
����,'2�b������5�b��-�~U�n>�i��3�_$��Y=���������[4�#Ll�7�Zr?^Z�
����N��]Vhe��~�j!�]f���!ah:����gV`6s"��deU��-����:u��r/v�����3[��}A�6c���h�o��A/�
�f��+j�"�J�j���Ew���eEp��>=��&l'�eu�b+�!�5�������vc���h��U-�Yh������I�����+����Bk��uJ���}����0T�V�<�C�m���f+��'$,��
+S+=��S:�V:�������mL�@�~qN���n�M$.N���'���`�8����D��8��6��������L\�lBm�Zdq�5�4�q�Q��r����{�35��-�8�$D�U+SY4
�s�R;�}���l�Tb&�m���*�E��c��uN�^�}zJ;mt�bWl��"�!5�&~K+%R�IJ������#]�����YL�-�X�T��7q�M�T�>�Ks�f/O��,�Y����h���h��W���z��nk
��)5����gi�#���a�Z�FeD�o�����bXM,6�_V�J	/C
;~��%�����������L�cy�
Vk��u^�gi�_v3[��6�H�"�9C�����V��LxF4��Y��1�zs��i%��$�D��g���U��l�<��������43�U���0ttg�Wf��H�W�a�������A�`i�Nr�L[�O����Z���x�PB\,M[K�2�������o��Bb+���]X�l������b*���c+�0l�:�j��
c+A/(��&����'<(;��Tx�f�FJ��0�Q�a�O&0h��J�p�`��,�B��3�zxL��VX�=����@io��-�rzJ�^��[b�l��^)|���[Yva�Albn�gB_1����0A1�%tb\�4���L��k�.�h_��'s���������]P�a�^��<_�����&�vM����p�6���z��g2MY�������0B���F,,�vfZ'��[�t���*���(F�xH��0|5�B�������jW��:+�h�{H�>�JV�Y���-z$������08�~?�������`�?X�5%��xb�������^�1L�W4�5M�~��=;aH[v�x�f+��\�V\a�e*������-�f:���\a9�����;%��������������o���|�-Xb�cF?���O��{6��dI�J?�O���9{P��(����_]Li;��4���gyf�������H�F��(���>s�.F�
�����c���U��/i^&>QKJC!Q���$�=�y��c��4�����g{�g�r��������9�m��O��05��
��
������>����H���������iA���t��5��z��H�f�.���
g��N}�v��c4~�_�v]�"h��}��v��iA����Gq�=
��d�~��D��p����@��9���b'+S�]��������xw����u
����_�H������X��4�V����_tz�����N�������<�]�LRlO�f���{�������-�b�4�'t��u���
� ����i���
?��:�}���X��}&vOS4<E��8x/�5��W��[&�)�$Z����}����N's����(z��}Y`�����
I��h)��D�E��t^�2{cZ���VlO�4��7V"zA�)X���Y��,|������R���D��{g7�P��=�f��*�L��YOV�����@,���Y,�v�����b�g��%lzz������W3�] ��H�5�(����zt��+_�@	��fAy��=Y�N,T�5c;�O����o,,����y���������
z�U-l�d�����6�+q;E�|~�O�"�B��O�����d95���E��C�Y8��cUbw����������;t������P���_$<M���Z��~L>=��T��%���|c�.y|i.�O�����{;Y����*���x����H�I��ed��1#��h}m���A�4h�Y��
>��]���m�!������.	R|�S��v=<�o9h�H�1K|^�1`�!.����5��
4�� z���d����Q�:�%q�H�u�ui�[����u��t?�'1�*-��0P���d~;#05�s�b����L=n�p?�����d�]���
�o��c��yc�����.��m�d�5�}gt�FS��%�S9j��gk�$���Z�����~Y����	�Y�J�������������w1���+j�U�-���T���?�}�����
�X��X6��7���h�m�vo��,�+0��N�,����o�>M�wW�zm��'s�]��|�ffX�����f���?`y�]���\T��y��h�4�,������,����-�uI,<#����=�����I���b��i�lW	f�/}8��]6&�'���-�������i��a�}����s�6{c������������>;^�%������`b����
�I� �.�����yOi�
�:��N_��U5y���
�v������kpi.�806,���;�X�1Mx�/koK'7*c���X�:.tW[<L�����=��������gI�=�ui.z�a�h�s�w��j���f��+y,8C�;�Se�����S��3E&VuoL�]4,�a�����.��)1��e��j�����.������K��u��OS5&|�%�X��������,����qi.�N
j��n"h`��=|iM72�Z�� XZ"�'���)�B��H;�l�Y^[v���y��c���+oE>����f{!D@��!�1�������C���t$+�D��^����������.��f/��X�}j�'L���;q�^0���n��-������M����]s���hN��4�o�������Dn�JV����j7�[�������[	���zt�s7[�0-
`j�/�D�O6K����+�����x��`�����'���z������Ub���fp-+`�~��6���+;%�d�_���A�)�]G�0�
�p�������d�{LGm�	/��,�-\�����o�8l���T�����	y�+U����b���Z����q*�
��)���a�`���b����
��'�c,�v!�B��5=Sw�Zs@������K?��?�1L��`�A�0�*�5��;��9�\9�a������yb�E�A��`K',�~������"����-���'ux�7���Y���va l!�>��?��;�PR�0��p��c6��=�6��9O�pc'�e��������A�:8�V�6`?�������������b�NO�o�Z���nx��,�5��������Z�/���r���1�]���;E�Mi�I�/����
nvB76%���%b����5[g�����f����*����E����-3����U���Wk��=�%��I�E�J)���^���-�Q�l(�
/]�v��,+f������E����Px�����;g;}�#���ew��=��K[��E��>\����P�,��
�}�d�<���
���p��7n���J�����F�L�v����n0�������N�P���WE�>�1����6a�fU������>[tN���s���+��>i=��Mx���zbf�����5@l9-�pYM�����������d��=<S���<��`p�������v��fA2�a\t���ln0�����*O�c�E�f�"bW��fSqcYR�0Bv�6��������b�m(���_3�����������u@����^���g�V����ax�hx���|u���b��T4�H��\t+x�Cla]iS1���u��,]���\�e:|bJ��C,<�'�M��c:�b�ECW�Xx�Xx�G��q�F���k$7��m.��2;/�b��bo:�E���j7�S��@�/���X]���m���i�f3D63���EW�����
��b����s������Y��iY��a�&69Ov���
����0��M���I	�	O�v��%����.��{���y�EO8��������	fV�Gf���.V�-vTv.�e��uE����b{��ftc>h�f����/��Ax�0�R��_��f�=�b,�7�T6]����_W�n�Ka
3f�vv|Z�dg����������0���hVg7��������`����c�ttg����t���%K����~a��5|�{������b��z7�����i�0u���7�W%��w�������9�*{�v��'�@p��)w_�`��O����9n����oX&l/\9���n�������b;���nA^�������D��u���Z���.p�4�S�pM�v��p�tU�
-�n�t����K����.�{;���{b)���v���]W{�����	1��pgc�:'M�8��q�BO��%F����r8��A���b/�{���n�`8lJg��as����db�F~��U2�6j��&���v������u�'y�+�fu���]I$��vm�q�~����w7D��[4��Rl�o���isb�����\���
���/6h��P� vT�_,�n�f��|������l�tT�����Au�2�X�M�3��^�D���S��0���V�e��6�&o�k�������K��}S'����)�`��m���`eM�e�1�����t�lx���.��r�&�f�u��RI��7+�' 	�1�*S�u����E���Sjg��lO��c: �k��W�[�5���
��f+ovJ7�����`�nv,�@P4���L���;�l��
�#�De
\H�M�5�z��T�9[9"a�s�	��iy{�/�;
�6+��O#��J6�Yu��B�/��K����.�
$Y�x6%7X�#d����j��i>�����LM9dY��s�k�����rs?A��P&�Cc�����t�����+��5���
����M�DC��r"����t��_xxH-CM�{
�!=A�U�i����/�������`o����������}��
f)���'��rA��,��������b����D��`�j�������r��guXX�n^�'6-w]��
��A?pq �re��������]m_�,��I����n����ex{�����^^,,���W
�,�npg8h7-�,�U����E�|��9�t�1�28��<[��^�ax�S,, 
��J�-�C������c���VB/V�$�e�V�U�v%�l61M�RW���l������eK`�=���7�&��m��>�����������:����*�Q�Q`6���L�{��DboV.�R���L��*Y����k���|��9{��������as����s����{�b���n���Fwzt��4�x�}*��:]����,����9�t_�����A����@/�e+���iw�|��Z��+�[�JV%�eM�)O�{J1,�'z�p���V.z��;���#��������
�b���b'�d{���
��68EK=\8�����
������ �'V�.�~D��),��<~Y���N?	�<-����^�/�b[1=����(�f�	�vv*E,tz�������������(��W����l�^�(���y��9���ClkZl��e��d��Q4�[���A��~R�c����~��-��yf6��G_v�y^gb[����q�p^��W�r��,���3�������E���>0^�R���l��:1���n�NA�k�<oat�0���Q(�{����������9���K I,���-����D*���X�_�`�BQ�k���q��!����4�#��w��y�Uz���fY��Xs���9a~Y�/+��0��X(;
�^����pK~Y8����.V<���������\W��x����0_4�����H�7����-\��ZN�/�<lN��>�f�p�0��
*8G��1��B�\,r��hv�F�H��]W��^rZ�yl�q���@��1�56�H�K�(�6v�Hl��#j��5�.2������K_��������&LXJMg�`'+c��
���1���������J���@��R�`��w�����h���'X��t�~�to�U��#vC����bE�47��s��(�_&Q������-)im�����/��������/��2kZ�K����w��H�i4�>�@J����^�fw����Y�.3`�|�p����>�M���:n���{�$�d�p�'�,r,�}��T4�,���{��4�6��B+���6v�W��C�����:XB�*��Q���W6~�<�����b��T����t��S�I%�k�a����Y��*O��0�%�-�={�/�����k����0�,1ma����[w�sN?g����:`�=�4O*?,\{�8��������?��������*ek��k�� �\=R`��>K�E�#�����}��&�3)�v�yf���2�b2�����b+elv��0]����
�x�oA��i�2���V���+�`o�v�gYx��}�KWt����B�����cb�����������[J��aq�;(����u���_�t_f(�������d��?����{-����^�do�*&�������t�����/)JXC�`+[v��u,���c�+���`oxXa��k�wC�H�Y;E�t._��]W��:������L�]Ww�2�0%�����������W�����sj"�Xl%0���e�b�0�q��/sa���	��`���
�#T8��y8g��Z��j������"{�_�V	Z��������`I�.��0(�e�EP�L���$mw�i���^|W��\�����E��������l������*�t��eu0��H��{o�^���_��_X/u0L=�eX�3ugg��i�������
6�]��|o��1A�Dm�4�
���yi�9;������wl�������Uf+S����tY��2,��}`���/���g4�k��3�Hw���/�;W����aU��|M���kg�`%���O��)��^#����`��]#����&f�w��f�����\��0�,���YS����j��
�Ew�Gi6}v]��U��������u�vW��D-4��w��9�nGs��D�6��-�<w�9$�aKh���D���������+����E<��'b���?�n����T��<L�W�����;�g��n��������n�1�	A4�G�����u��������,��>����e�p�Wjw3��;w���f�vb���l�\�<�����S�d�s��\O�*,�%��e�E/�.��n~����|�n�y1���?'b������e�OB�����"KC��
�e�3k��9��F��";�,z�"A��{�y����a���,Vm�������eX�t��*��T������;��%��/�cT���������������n�v����}c����7�ivg�.�������{1�������n�]����^�D���lpb�B�r����F��v����Y�P'�������up�jpEOV~��e��lFl�e7DQ�^��\Nv�>����
���5��^v�9v���L����T�,+����n��1�������f�u��L�����������}X)��U�V�[7�a��^��(��2�p�!������y�����g��O�������]]4tz���ko���&�����:���bWe[�vux��4�ef�KN��~�n�zgA����M_ZI/������+����c ��}��:bs������b�J-�����!:+i��F�(j�`����|��-�L�����A�[��vX;�����Nxx�`�vuV��mp�!W9��	��_��Y!o��������
G7�������>�we�k����a��_��sv��^zu&e�$v7D����Ft���-
�����}�-���*����#�	��-��/@2��l������wE��f�+���m_-v�~��D`��,�03,���=���t$w�e*�Y�`�jS�(Xa�
���E��P
��IS���7�������r�����{��^������^pSK-�j�`{e7��rz���v,��t�����=�# X�(�7S��p���V�&XT���T��5���E�
��>pa#Qy�8w��;E���
��t������i��>g�Oe+�����:l���������;lN��`�U��a�N,��`�l�����"9�[z
����,�4$����~:R��|��f�,f�p�X�����5��n}���~}����	���2���\�������(���������Rl�/�6����/�/15���u�����ut���$�B�LV�_���c� �N0����?�Q$_��w����Y��|+�~C����I��P�������ar�+��/m��<����l���M��~fu��S���s�g�M���6�Q�0of��Xb���W4M�HD?c�uA��-���"����sv��6�l�;g���`G�����d��Rx�fw������/����)�F��b����T��F�a
��Bk��``���M�����X���5e���nl���(/zU��l��pW5h�����cNS:�L|�������:jc{�7}���X�7������������A{X�i�={����f�0t7D�4�W4�63��E�=�#M���������39��|���9GOL�.z�	W-��Sg�o3�-Lbv��"��~�gv�9���SG1�
�uk������t- Fa�a���}�/����s��u��2�Vp�:��~�������J��;,��L��2^�)#��B�`G��n�|�J9�a�Lz(	^�h�/�V��v��s�r����<����������t�\��i�}�Y�z���3{�;,*
:��=g+��wX�H��9@�c4�x��Nc����z�
Q=���������U12��b�]W���~2����0G��A��]0ZT�� t������9�����\���o�69#���	�E�0k.����u�������|h��b����VefY�o�
�{yt��Zt��5w�980��%��7�^U�PR$��1,�L�/NEn��D��������Sn���6�f�
o!������D�U(�����=X�D,�`����6�Y���S��v��hxe�XxN���]�F��!�3SY�y�#'	]y���0�����
��o
��.g���Q
v2u���raX�?��F��j"�N����	�l��wC���A�}1�Y�V`��a��`dE���G,��A,<�%�b�6bG����q*�Y�k�w�9nc�r�0g/v�x�|���_��������:��/O��>�����M��J��y�d!�
��>��%&������Jlk��`��EO}]���������}X���/�_���t�&����������8=�K{��o4[������V��f�`a��{�6��>�0\�[��K��%]��z�F?XRZ�'�`�y*����m��2�w��
��>��7
��b+s�������7��X����B{������Q�����s$#
�pE&�>+<|�4���
��;#��M�]G��l�hV�*�����~0�����w�9$`V$�����
?��X��N����1�������w�F����xd�O����z��	O�0E�7���H���+}�~
r�a��`��]h������~<t4�~z>w���
�2�S5n�s�N�l
VT�����aYy>Uz�\���t��&�i��_&���h�e��.z�/���Ow�p���f��PE9lXp[<hxI��&���_@��MXK���Dv��7U�-U�4�O��\4]&M1�u�|X(^����S�B�A��qf'Z���z��$��o�G#���v�Ue�s_i7D��`�4��M,<$v�`h�����	�wA�5�:��aE�s�n�pA��8|��0�QY'Z��6w}]:^a�_$��Ri���������9�a��`
���;��O���@b�C�%����
��[I1��=� �6���e��*��>L��>Wf{������>ob�5��&^Iv8���+�u&�[�i��=��g�S*2x����G�"�|��ak�kB8g[�����:o�54��Z�T;��=`�$&��������0
lE9l����6����!�;/v�D��1�����g�.,���R=0������q7�����Z4�/W�����3Z��a�'/5�h�~��"��vC���v]d���2}�u^	�F�h<��T,R�0��0s���C���f�zM5��?k��
��a�w>}v�����V6T��0�I?�Msb�;WM�90�J�����y}D��C��a� 6��
��3C���@������.���C
/���f+q���.d���G[�1���s�0�Y�<�������3Oba�%6m��F�a�Y�^����+W�w�e���2aWR�Y�y��	;����C�����hxb|/��s�����Jc���Q~�9ip�VT���cJ����y}l}���PJ�yga7B�B�+Y��SW�t�G�����c:�a�f��I#�>�ZS,<�,41������:�������s���W���6�P[��wXh=`��T���Qm�5
��a ����i����
{@/�l��:t���:2��O���|~�6w��`�9�E?p�(�3<+kQ3��������%�~�-=.���H>Wn�����K\�>Zj����W
��<��z�7�K�.N�bS���1O����_��/�@��<`�^~rT��J������f�e.�y������r�]i��^�Pqi�1������e���bxg��E?A�@������Os�9zUD�h��.������T4���L\,+��	�
���rD�[R���^���*�����=B�"g'��[9S5-[�,2���}���ly�J_����b+^�iq1����1w�u7V_x$�xjC���MvC4<D��{%�[�H�9�Q8.{M�r�����U���$�8��N���f�O�S���=�0�
T���L�������*vC�H�9�E��o��W�/;� ��)v�����:�a���&m���	f�=Y���O�	�*�L�ts���E�tr5|=��-�OO{|'���(�2�c��V4���i�iG�dIN��p����u�z3�7�S��U��^W�\�����0b9�i�*t����b��n�P#9�[��[uk������f�]W=��*���Q�����n�1=������~��\����j�\:ik�\O��]s����"h��	v���is)|g��B��������'K��]�M��J|����a`/q)K��}`�W����`��{uN�V'����[fb�Bm��ou2��hx��-7�&DN�2���J_��+��iW�d�!�;'�tl���	�A���2��7��`���B��|��t7'�B�����k%��K�G�|�[���i��d�W�Y��k�1L�����X�.v�7������i�-��T4J��-��;��������D{�����N���d��L���j��[Q�L�G'�����R�K�\����f#��	����J��?����������zjf��E����Yx�����`���[8w3�=��B�~�1�wJ����p~��L����+��o��] 1�[����t������N.��pOX,���=��b��O��6�w��X�D}�:�&�=,�.3��Y���u�<p[�| ��,�]w��"v��>h��
��I5�VT;G�������~����"f�[$�.;�#���Mw�v�C�^��Dle�c�����|E���b'p�.���+�"}���/�e�X��i|�_���9�d�`�7������:\d*�nbo�[	�,�{vA�
BI|��F��z%X��r��4������E�l�����7���:��N��������P�ew0��])���w�U�h�6���L,�d���2X�;��H^X2���c�������u�7;�*���+����i��C���_(��
�gL;|'�:�b�-��(���8oM����2������4<�(�.�m�v��K���������K����f-�>8D�������
�]�O�>������{�}~).v���
�����
���i�����f�,;���[4<+�q��R�RU�c������s6q9g�ui��Mq�nx�2��i�#
R��,���{W�X�<a>���w�9X�qm�/<	,��?t9W��F��-��
j��N��"�p����8��6��s6��<\)&�=��-����c�3�j��q�DG�sOw������=�~_#��O��o�c!�o���]�y���9��t"��
S;���P������zJ�0=(E3L��{�SQ]�4+����y���u����lG��1�h�@{��
�`��kn�p����*E���������!�(�`���,O�YM�R������?�[��}�
=aQ���F8���c�`���P�nh���~�h$�kF��~��8'\����������������U�S����O\ ���-�����h���`�J�g6��@4��C��z�wH���+�v+[�6C���MUK�(�6�.��vuvC��~4�p	�[���z]���
������01l���u�a*<Nt�g��&����{L��L.�������������k����Vp����pP#��(�l��0eve�u<s:A����Sj�N@����>�R�e�b�/6G��Wa�]���F;;���h���M^f�� ���\�h/�g(��j�u���M��cba�T��B`��F�s6e�v��<��)M�!Xvh�,�"��y����5|1k����J����L,[r
���x7[Pv.K�����F���~�]&5�������;<���,]�����n�:��*�B����V�n�����nt�G~�$X��h���������f���������%����bo�^���!rX�:�;�.�r���_}������<b����_�t�]u�����BW�g�L�%���-�7.���w]��[����X���df/>]������/8\*McA����v����]w�9�e/������;;��:��:���K���BY��~��i��,�M3����^a�AVwvP_l�Ct�;��gVe!����l�_p�4<���a�+���v�-x��/�:��v�9�aES���n]�[��8(��j�0Z����J�~�"A�����e��f����1��#��_����f�t��:+�
�n~�'������w�����������%�t�fvX`*���]��f#��3�1�����~�4�h�:}����#�.����p�!r����"l��C&�7
�"���k�`W��|�n����F�n~Hb���f���1��\�8p���p�}Y������_���,����n��t3A�:~�p|t%o��(��� �lp4��d�2�t;J���.����1���*��
�e�m�~)��7(-�h�}]7�{J�N������gb+�[�d`������Z���'���b���.((�Vs��T���X�.
��=�`/�y�)���o
��A�K\�Yx�����
�eIL���b;L.��Zu����{��o7���D���s���bc��Jv�2,�"^M,,��]����"d;�as��������1�ha~�NwC�(�5�=~���`��	D���P��bF�[�����WT���S���`��H�*�@�|Q�b������s��d�W����s�����J|���	�C��*#v�y~�I@�0o)�<�V	��e����"��������L����%��_f]�T��zZ��������b�qu�/����[y����}��U�*���S�YsA_)_�k�33L�t~zM(�p��������{[�5��b.�LW-4������]��/f�=`0)�=����d���C`0��y2���]������!r�D�{?���:��H�0��b��H���`��gf�O=`}\�7,��d)�Lw�]a+k7,���Q*t��nz�2���C�I���V~�v~/��^�[��	H�p��^B/���k7��&��[4}��+�>���������L�+mK��������}�����{+�&���B���b�.���El����N@A���"���B%�����&R1�l�}����E�H��C ��������W�u���I��i�`���MWm�^�(�l�i7p����x
������U�����z1-��V�H)M�W��o�jT
y���Q���MBa�
�,e�No�n��0���QP5.����S4T������u�;�$��G�}`�}����nK2�e@4�Jl��_'H�Y�gW�F���c��C����"Y����o$s���^��wTTm6�����W��[:�^w�a�2��v�wC���|��Z���s���
���bj��gfx2$h�������9��w�x�&�.��]}�����R���	`�.���I.��R�`+����.x4�� �^V�������-uu���e�e\����9{�����:������*��#��?�"�,��~�s|�Q�Lr�h����3�������G'���?n
L<?����?���c���>�����j��V�k�$^~�s������]
9I��c�i�K������!�c�������~,J��{��b����1?�lJp��:�U���
��v�Q�cQ��������<D ����2����4�d����S�?�"{k�Z&[:������rC��?A��O�]W��*�=����$;���d����t�f7D�HR�G_����E??6�d��&���������d�C,C��-|�/�m�z�G����$���u��){�W���"�1dG�G�Kb��\X�]c�+�G�cIo	HU��n����nO�0������md����;���|%�n�<����e���Q�@v�~,���_���&�.�w7�EH^�Gw5IZ
C �������y�v(B�������K�M?�!{���������$x%��~�}�����k��)������=�x����'��sP@L�?��?I�V�oD�B*/�#
�������������4\=��Q�u�����h-���O0�.W*�X>��y������!9k��r����b�K�p(Bdq?z���K�a��1����#�{!��8�!�Zt��;g/�il���)����M�fI����D�;�����-���:!e��h<�<�C�+�����ni�c��#r`�G_0�/����)#0�*�����&�]8���S�hF���GO7{�>����gR��c����9"g<���
�o��<��I���k��s�����8�jp�"�;o�"K����R^���pEt�?z�:�`�t�w�UGAp�/�A��,:��c��>jsE?�/<q�co��V��f�`���sv�`c7������Gw��	���R���j;G}0�����k���>��	������X;G}�]]�Y�c�S�39%6�i��D���$����W����m�h�k���	ouC�u C\�?�{���q��cU]F��f��89�7�^2��bN(�M_A0�z����TP���@�B��pP��]�]O����a��E��}�"a���o��W������8���@�Dk��l�1��+�
�r�D����n��N����R��:�������4�[��������}��{w�F�\?���S��J��{�)Wa��ZN[j��:~����[�+�9��u�AOb:��
��9��*�"�A���Y�K�R��L2���+A���W$��'��wC� ��K�
?�baR��%w#0���
�CQSwLwz��'&�Y����1AwL�������kA���^��[}��h�m����'`�'C-���2�@',���fw��-L��!���c�R2�����o�80���[��t�C �ba�w�W�������b��p�?Z���p�,l��y�7>${���b�]�8��gAX�(�j��w8��i��o�:����I�b��`���?v�`p�S�����1���z}����<�)��M2baQG��F�i��t��O�*+����LEKn_SA��q$��%���M�#���a����W8
��52��9WJ����t�A�+D���Vj��[�*la6}A�P�Y�}�R����o�v�*C������W(2���������EV�������������7��Xt���v�K;�����uD��h�QlaJX�'`�(����k�����������w�_�C��J�#��zj�+��oX����|-O�p-E-�������>wjf���+5���:������	7$�M��]s��`1_�V��ex,B�Yx"Pl��tyj�{B��Qxn+/��9��	z�����u��-T]6���`t�8g��6��^�*z�E/�M�k�|��l��^E��i����+)vO��)��C��*w���{$h�*��EV� 6�	w=}�S4G�~X�Q,�c�����%�M��D��Yu����.��k�\��!�]�iv56-�:Vlc��Y�\6�^l�D���>������U8i��6#&`��n�-�^h� �����g�E�#�bY��Q�,���Xl���F��|�D��>P������t�#/)y�EF^��������7.y�i���"��#
s�����`W�(Xn/�|/��X
��|�����Q��E4,9��b5��2b��j����b�P����2���|E������~2G��1�3��f�k�/����iVH(v�����N��E���k�PVsY�|1���sB��o8��]�+=YQ���:��]'��I{7D�@M�b�`b������pNDA�b�l��j���19g��k���^�!n(��a��v�l,Tyz���z7��`�t�A�����:�a[.�;���h�oQ����=��'�������7��������������]GOp�'c2�U�*���E���Q�v��y�g�D�B��ee�G5�����.vv���Z��c:aGD������\�<�7��t�
�N'�W�������Xf��2��������'�.;�/��4m���Xx�S����V�G�n���`��:a������]s���~X�w��2��xtZ�5��]��!��#-�p�#����t��a(R

��5��-��r�|��X��x����`/V���;����e	���a��6��2%��J���G,,v��V�{�C vpL4�Ll�����i-E��JleU^Y@L�#z��}���U������de������t�1�0��<�
v�9��������N�����1���3�ib]-�U{�P�`���n�o���5'���`n_���
�+�8�i$�^_��sv���|��n�V��O�����:K��Y�	��H�M���9�+?��������v7�����,���������5�&c�_#6{0�YZ �~��v#����a����0 i1,@�x�������1L�J<�,bi`�^�}_���N��#����9:lNF���_��[���w��?��C�`\���]i�`3B_0���"�]sal4�]U��5��p��'�l.X�|����v�u�c������(�h��e�U,��
�N�b�?\vC_p��3��X���^�7��Bn���up�l��,��������p-�e#5-c3
��`���V��A�0�"����3�=��6X�!'5�����R����������`v1�U����9{�����n�{��������8�	�j��CeSp�b5ME�!r��A�� �?��2;�;��?�|�]	6_�y������
�~z��'�F���E�����P�*��a�Z��~[��F�*����^���e���,Y�d�R�bQr�m������u~b�\�z%��'�������g�j�@��]�_��(����]p1,-�
����T�SX��|AM�./��*�B�����9���@�3��Y��k�/��/��
z��6"��(�X�,�*�g�]104�
b
Q���<������g�����b���D��KU�}����)<�]A��X�gv���������4+�Q��#�����n>������}�����$�z\)v��������`�cJ>i�������9z�e�Aw�����������c:�E���)	6���`5�R��s>c�^Gm��S�!��|;�4�����n_Gv]u�D�����l%8����uI���z��|�{q��|�����a�Z-�������8�_9�c�6��Z4u,��QH�X�}����[�7r[��AG��~��Klc/�������*��]"�����!��e�b���~+bgZ��F������?
�v�=n
�����[H���v�l�M4����zK�0�1�V��!z=D��,��=f���F,��E�`1�G� ���)���as>���]s�	D�b�.��������9�D/Vv&��:_����O\8�[�}��w��~E>�������Wa����f��0�����m�"��>?6o��Ut�����l���fUvfYU���������Z��e��N�Y�Fb;[����"d7�4�=�����u��~�R��t��	�2���y\��J4������0<64Sf�������%tD���7�v]u�H������y�����E���X	����v;��H����vC�h�i�E��_�.kx���c�[H����K{K4��w�����:p����@��	��O�1��5��1@1���|�v��
Z=Rh�k�3;+�
K�N��s�����/��M5���uT�aAW��m��a�!��6���5�L��
�����;�`&l�p_Sl�K�����b'+�v��
�U�7��(
��n{�of�}j�o{�o�[,z����l�����)6o����Q|��~
�R���P� :�����j��|��.�n;�oV],:�j��p3^l�B�����������06�����`G�`��D���NI���6:Db��;#��-�YH|�\/n���}�\�L�pO4��*���a����7�+��Y�{CL���0g��/=��)-���Y%��k1o�i)�h� �s*C�u�Ac���s�����
s�A�{),��	���9�|��n�<53����sR4�*z�4��'fN���o�;�C�^p)X���^�4gSyLa���f=���$��V'��:(`�6�
���r���N��VZ��.(z������&��[j�J��f~��p��m�4�k��#�X6	��5�0Y}�����n���������RW6v�x��AOX�(=4{�e�NQ��)���FZ���i]�
3)o���Y�V`�E��1���no��s�as/6��ZU��p+�m��
��a�&=4�{���
��U����h����	��������Jy�>����[9zd�1����0�
���]_����n��y+G]�K��/Yt�N�5��	�kA�K�o��9��:-�p�U�S��nx{1��h��(]�����Y]�Y�|��&�|��9�*��}�7<�4=&,�M,�/�lA�w�z���;lN����_
�]W�1s��Rv�����E�b����+XZ&��b��8�r�����b�v����O3��v�!r���
�bb;,,
v�b��c��L�f����_S�e�{�2�`���*|��x���T�p6��4�������M�������ri�+{�5�F�0�)a2������Dc�-��1#����.T�l���=�#/����d�����������L����^���n��9�D7���Qz�Hl*�����=�����0����]�]:b���P���\E�����7\eL�O�h�A|[�|��&Sz6LUb�N������;[�����f�g���L��������
���������$�2,	6_�}����Q9�`���$��'}����#2Z�7�}>�
��=�&hs����>p�&m���MF�%�7L�
�m6���b+g�,��ik�p����s���P1���t��D���cFY[!�i7]1��
7��ve����P�-:��v��:�5<� vi�h2���m�R�L�0����>�YY#��}������my��s��as?N���9�J}�D����hOE���:�����D��`��RT�h-���G�s�����m����R-���'��k��ox5������`'L}KJ]����:���?�v�����P�����a+���b/��w�Y.���}��V��"����E�+2��������sv�$��������=�(���]	���sv0����,�z<B��H?�� P��������`�P�F�yt�K�'��eA�����b�e�.�%�nt_�.�FE_����VH"�|=������
B��oxt�4�����-�~l��s�as>� \,\k��C7��z�=��p��G���pq�U�O�C4K]>�a�UvK?�'"�4[��}`~��;��]��<�-?0H�0���X6\��y�'+�v�S��^O���'�2}�_l�1��`;��[)=,���7�����;�n���W,\7��]�\�����(Rfp���#$U�6��_%�������K���/��VZ�����]��%=��i>���vY9������6�����m�����rx
�{��	�Q-<u���Rl�.���;�6������E��?�?L+�J��v�U4,C2�������UL��;jn�p����a"��P���i�0���&���j���������k����qsba.:��J��K�a'�D��x�4g���3��b����u�3,�XzT�~��vV�#�a�����0�,��
�gg���i�`���]W=;��,�0�lc�hb{����2����M��`��<Vq�v��<����Z��������1�?�LW���� v�B4��R�E������e��tz��e�����D^�����j����></���_^�s6����#(V%&��+�`/��v�3,�3��E����7�k��������L,�a�e�B�s2y�*�k+���Z���;��6���.^��-T�>��?)�}���U�z�����u�A.S���I�`'\����������up
����s*
����������7V�e�A���[,����aNz������w]u�	�r�">���v���(�|���GUE�;"w�9���A��o�����#n����u[�f�l��k4<�+vU�_6�?0�j/>�EF�<$�~����B�N]AC��[f���.�`t�i��"�l���?��N�k	� dz,���������p�A}����/��n�x�J����d��������*����~7���`��<�tF�x����B��gB��/M������+80��
F��*����E?����o�`%�Z��f�����H���MP�b>�0[�S����a��Y����sv�IS�N���c:�a���y�-�c?;�_^�!^�"v1����r�~��^�
�������A�0�����X�e(/<���%��R�����W����VHu?"�j�Rre�:�����{��j�[����������,��S��j�`0|�X�)��Y�u���_������f7D�`0<n|���J�g���$������9�10�'�pe�cq��$1�;�$�US�x��cq�2$�{;j�Q��������+�qsQwnjV>��%��q����7���s@�\DbBK�&�
��;`2?�>g�;��x&0�V���L��{�a�=��qb[�t���3b�0�M���O��
���������`�|ly~��Y4-"��i�[)m��9�a��i�S���o$�f��0u���-:;���<u�.�]�e��1��T��3$�K������4��\SR�BY��������_�7@����yL��X�4=�t�����`:�F��hn�K�4=����gxQ��Q��-z~��Y�
KA�2��Q�0C,��-�-����Z>a����
s�����s��<g��N`7D���Yz��+�jl�~��:��_,� ��v'�F��
���:��&e����e����[O�,LH�]�K��P��Q�=�k�ws�b���:j�4���],�;�f�tc�i�0-6����|c�9��b��|7���P��
�b�l4���u��X��Y]�����H�Z���{�|:�c��K�M3b���Y9��\���Y���6Y�`3�X
��lgQ�U�K�Y��Xi��\��kn�98��k-}��c�fY����r��!Z"�m�:�*Wl>���u�0�=X]����?g��OO\�kZ
/�
�ym�bYfFh�x��a�w���sc��������n�
Lt����s�v@L���XxXV,�����Ax�D��^8���[n�p":�,�k��:KS������p��N�./������������;���n�B�h�������X
X���ebS�N��nZ�o���\7r�\�Y�|�v���P%-��l���pF�/|����������/�i��*��4k����hV�"��%����2Q[��Xi���������C��
�kf������>���1I��Q��4K�}���$W��9�p�����/+2���"X�kV����c	VU%����omw���������d/�o647��X�;����s�N��*�����BUD����c��g%�e�rc�e�7�2������N�%�0@&���4}��u�k�U0��a3�y�\��E����&����^1��$�n�W��?5[xFGN0�te���_�Z7
��`�\��T�4���,��L�+�f
��
I��#�bW���fWq���54
�$
f',{{��dbh�+[4]8X�,���?�9�A����v��Q�iwg������Wt/>o��6V�,��������u���r=�iU������*��9I���5��g����N�\��x�:�OAO�"����p����cU�07�>WVov�6��){_"m	���*�������8��������B0b.]�=��P����U%"�[��7Kx�o��������b_"yt+����������X!v��b�w��p+T������u�����6�9{15�{��/�0MlAn���mL�*^�%�N��]Wi�#������Z�W����������F�7A���:_]r
?@-��.�rU�m-�m�O!��*�`�t{�V|���|��as�������6��6�i�oc�_���s^) 6���{L^��,����V��X��`(�u��jd��t��Nk���������������*;���6x`H]��������p�
���3p���$mo�'Z���/@���!�u����%��3m��D�+���r�Bq�����-�m�'&�nL�t��:��Gs�`��c�s��;�f
ocj�tY��'��n`�M����>W��V���n�,��J����J�+!^�-�f���bb����pxUG]����m��'�R�o�/]M�s��p�w|�
�YJ�!����}y��{���\����#7X84����+����
����hW���������'�J]����*���"�*\r��,�=�+a���
�g�;\�����jjv.lA��oU?l��IR���S2l��=��uy�nx=;����o������`�g���.��J�
�����������OJ���7mZn0'7��-�]s����X4
G��O������
��2�z[�+/�gX����xz�&�����9��E��h�n���A���V.�k��6�t��������F��(A?p���e}K��*����6�������AW����6��t��p�l.(�u�3��]��m��r���?.���R���1=k�!�0{�C_�h�~�t�/|������Z�t������R5���������9jNtgy�P�,v��wa���"�e!���6;��T������fg�,<SRbYh�.�����rE��}<��#-Z>�vVP�^�/��UX��V���/�bZ����]�gk�7;
��&����f%�b�L���Wl������6�����>'Q5��8�������DOvf�-RT�m�/��������_��u�Z���o��0E�[�#��$[����b�)���Z���
^y�Z��~+�.V�!�������Kf_�_&}�9�&^8Dq�����k�/�)Z4L��-�=^�x_��}��]��&��;q���(���}�>l�LlNH�F�a����j���J'Z��nZ����as����6�X��*��Qq���`�����/S-����j�1z����\Y�[��2O����&�N�(!Z��9H��1�s�k����Eg��9{\'��/��0]�G}��}Y5��|�a�e��b�������e�8�}��'y+��.V�`&h�V���0ct�
v�9�����0�}���S~n�U����u�e�e�bo���r<X�����ax]�h�����0#�S���7�}�a
��|���9O�0X�j�����b�����L�f�������yk��Ole-d��rA���Z�+y��^@9�Y����N��F�����>O�7;y-��d���/���.�h��D��~�������E���s��B��p�v���-X
^�_��
z�)P�cV��^�E{�_�=M������*V��*�`�=�;�6��sD?�Qq����2;q$v�!�5��km2����Ms��L�!z�9���4���S��\���"��R���}�^�.�|�}����������Z�����M�n�<��f�+���)M�{JO�h�}��5�`������9���������E�$&�5��n���q�D�p	.���G���{�H�������4�)����Y�v�����+����<Xv�X���}M)�BXae2�%Gt��)����ke2{y�]��[)��n����W5D����kC�>0��=abWeul�����
�Z|�����W:��k�1;
/z0�kp����`��,�>g'���a������To�0�qzT���~��G�=�����r���1J�Y����
��X<Q.'/,�xu�6"i�0���u3�����h���g/x�(X���=q�!rP�T���y �0��U�^�`���n�<���A�!�	3��h�ym~��O�
��d �����B�
�/3�������z��{h�N��	�"x~mM�n�����&�e\����2/��	���2������v�����7	�Z��D��`c�.�������c:���f��`O/�T��_*O�����/T��t"gr%�b�����n�����Q2��r���t��AO�E$w1��h7_��"�O0�t�?v����k��6���~r������,���UzA_086G����\�b�m7D��`�Z��J���/<#,���9��}��O�=�XvC� ���~`��X���HG�w�� ���wk6��?��]q��a%a�����_d���F��X4�������� ��[I{����]��s����U�S�x����O��qK�2�@p�
zB�d����^�R+	�af�taj���C����&RHp�B��|�T�Y�:���i�9gz���DuV�����9[���vZ��s���1#�����,���q����4L�;`�K���g�K���Vvl������p5(�~��4��_{d�!r`
�I����Z�pK.�����]!�������p�^��)��<_x�\�0��?D���Z���������s��y�%;�s���
�#k&Y�+a�%�/�M��Qpd���x�l/}	-�D�R�T��-ha�L����sv���`+�!�������N�K���J���+?g�1pO�u�&D�;�E���+�r��N^�i>e�>9�����:�n=< Z����V�'vN�v���K�����}��\�(�9�U�����_�n��������c>~L������],�k>���?�`��z7D�C��6���������mlOP,����A�N��*hL�����4�v�w�M=Y%v�����n�V�g�^�������
\@�vY�!����<��7pzx����B�������D4��T��l�n�-?��
��YO�@���T�"��Un��d���������t��-�f�}�Ql/�m���w��
����#����NG&�b5��ba��Y���4{���Q�&��Wb�]}K�*=��z�\$�`x �8��.%�
S�������W������ry��^X������g��_�(Pc�`�>�)����2��������������4����n�xg�q�w�l����G��{p���,�9g�[���3�n�<�3#���mJ�p*�uc�m�;�@��F��:+Q=Y���V��t;��/Ht�)2y������[)�%�U����Y����_��s��i�`�����#|�������L	�X�����������~��jh�����9�E/>�ev�K,�Wxd
-�E�J�pCK�r��
v���_����������l��-��U�~a/����v��9Z+���b!z�HoV�.6WL��LD���������_�����O�BLl�1�������"���N��]s�X����j��&3����bX�����Cf��/��4g�w�������Vl���`a	��\�6�����[����b�c^_�sJ�>N�=��p�*n�������i�B���|��nx�����iC�0�	�n�;�Z#�����u���U�/�������:�/�����k�S���_����;G���Ji�-��������k�q���^`��Q,-�
6��
�c/�\������<�t���D�a��p��{sw��;����]I��M���������n�u!*��^�m��;`�9�RE�}�����������>g/��Q�/��������:&`nd���'7���{�vO�Pn}���������-.�6�g{�as�#=������<b;L��:�_y{1���Ng�Ys@u���7���(�-�e���f9�Jf��{��
p�p�N�t�����:��[��f@�
�
�>0W.�p�E��;�[6��{���5���=x��;<��>f,�n��]����������`X.n��	�*�������
�+�?��Cz����	z
����2���e�c������
p<�M�3��aa�������u��z���:bR��;����`xg�b�L���+!�����asU"n����T�0���a�Xf.[�������FI���j6qC��\��k��:���L]X�X��_I��1D�\���5ffS�n���SZ�	L�x�i���~�E��ir<�%i�p���E��r��������
[i���+�;����3$\x�uG��<C���E���Q�g�`����cz������SF�p�5U���LwL��Ju�u��,��{ {]����Y������/78l.R����b��y���w��&��p�!XzVZ�����[\L��S��g�
X���u&b��`~�����a���U��t/|{���r,����A?p?2X��P��/y����>��S��{��>������������������Be�p���o:2����U�|L,�AQM����s�r�}�~��
�����:��	��[Z���s@������:�O��`��X��
v�o�t�i��
�'gX�����j9}=v]��$�a��Tq���&����,�X���3?q�B�
��!B���\U�k�vs��"�QHP[s����b[J7����U��
���}��.,�t�g���t0���t({�\wsh�4�RTb'��D%�	�Zb��a�a�)t��~�0�-��Bl~%v�9��pTc��N���[n~
b����03�Y��[�3[H�]�g��$��w�eV�"v�-w������f�asq�'[������+�y�;�=,l-L,��}*������4��%�?�e�!���
��E���u�F�(7L�3�����x���yX�
/�
]ib��yba���\��"��l�V�b5�b;H.y��Z���p�|���n6��wx��7Bw�6������[f���B���^�s���!��L4��;*o���Y�r�\�����6��*v���b��xX�P�n-��x��:���pb+
3� Q!\��w�\<��X�b&W���:Z�����)B�3�w��a��`���Z���������3�S��B0d���/m����}#Ne�	��2��!<�CXt�%��s���8U,�P	�������	:������� ��=�`���b+7G
f�����c)�.{u���eX�;hs�E.��0=�����Y����nS�`�M�Vv��Vv�T4��,+:;�A��cz~e�V��:q�0��J�����	7|����VS#���G,�+e6�f�5�;����,�����B[�E�w����6������aA���J��W��]0#�������h7D��a.M�V�7IM����nv�)W�"#��4�q��_w=u�N�;W�$Zf'����U|y[ux?1O���P�>��0�������2�]W���o�������`�n&���+uA6�f��as*������QI���5{�/�^��E��7����^�W�@lx�}
��aS����W�~���e�{����p���y~�a1���A�-��)�?g���y�R��.EW��-������'��e��/t����pdt'1g��^�m��,}��/�\InX�
O>�~`9�Z��>V��V=a�)��p����t�����N���pC9��p��9u0���n<g;)�va���������m���l��M�����u0���,=g'\I�7/���u�
��uX(_k�m����N���^���XX���
j���&`�W���L��]G�EL�W������P��z�
/�5]�/n�������������r��a�k����n�[����c&^�":o�>��gh��^Z�[]������99a��^��k�t�	6��v������Dg+��9��0�
W��V�V����P�M"jU����`/�-�F��:S��^��M�7L����Q�W�
����w�A����d����@����);1K�hx��Xx��b��B�l�-�����R��������~�B��t�m����/����� T�����O#��P�.��!j����n�g����X�6��[��YzZ}��&l��f�������EQe������8���O�7j��5�����c:J�'�M������b��+">�B��
������F�amN�8�����Y�F�b�~5u�N��u�O_Y1g����]�\��
6�����&��-����9M����nE�b/�`^\�9�}��Z�s6o����|�i��^��\7��v����z�x�k���?�	3��>0��C�����
�U�)���
��$�k�C,�!���rt���'�����t���P�8Z{s�C�Y���{Uv�x��9h�������V���[�V����������5�eW�C�C:���,�F��hv��(�
�K������[z���4���e/��e�b�@O��';D/�a�q�p�^,</c�|�1-���_�P�.����5F;����&���{�O�������h�,��F��61�f��nt�G�q^~�"�L��]O_���a=��'���u�������z���ps�4}��
�����f�\b�?�w!�1m���Q������m��o��9[)����g��as�+�s���c)�l'Rl�&�M3�fxm:��{*VI�eU*b�{�����M������Js��~��~r�m������I������Y���	�
n���u��
���;K��e�)�w�,���{2���W��h��t�;�'��Q��wO��*z1����N�����]V���-��7����vD_��Vl��a�U�|�����L$^B �����?������hO&�
o�/��e����e������E/��?�X=g�B����{�rx������p��f�����nt��)I�n���v����!
w��N�9Q��*X,��@l�[6m+�L� ��Y�n�bW�be-b'���V]G��%���B	��4|��m��@��m��*�r���~{����wM���9��3���o��Sw��\�9����LD/�?;�����KN������&[���=��<��P���!��ov1�`sj7D'X9�hV|/��������a�iXy��a�T����`��9�v`N{�'�B�`��y��F����x1|�������:����i`!�UZ��p�t�
|yc�
'U����_�W�9�^p#��������}�9��{L�O�~S���(�^0��,��v+%_��O���t������Z�L�/�.t�����>����/U�ys{��#���t��M���)�0Ml�s�F�`��6�O���$�,L�6�O�����w�y��kY����p9���nwW�_-��L�-:{w�y�����J�����z����[�����nZ>a
l��`����T��n�
�r`3����T�Z�=�/R����k��+����4�@���z��<�o��V������H8H�
��V�s���X������'$�.\�7-����z���i��dN���Yx�6�{��Dt�
��V��?�cv�Ut�lTX�=����S8�QC_�����eX���Jvv��I�=He
W�b��KlO��{LO��H6�NRY���{���&j��=�S6l	2K_�81?���p������Tdu�dg�E?����{2��h��Q�0��%}��������9a%���%6_"�������(E6o�������}D�\�9�`������s�N+��Y��f1]��O��i��hX?,M�KO<�]�L���R�a��d�s����V^��m
�p�z2��XX`�N���X���;��$}�C�A7��	�����%�)������
G�<Y.�;}y��R���iO�d�t�p�r��}mZ:>a�@4������:sV���^�����6U�?__�-�tD��qzHr��3"e�
9+���K�i�����H,<,�v/�����:�l�$���7���'��m��[����`WA�;�������
Xc��V*��:
b�K���"��'\�OE��{n���`s�b7BF`R:l� ��A2��
�����O���?�����:l���aP�S)����E��}���l�v���}jK�'�p����MsZOXv,9tr���s(����$�V����bb�BU�����u��]K��������������Zt���5�0���E�4�|�J�V<�eq�dV^��x��	��:��	���Y����>����b��9�j��K���9��^���	�^A��k���i�Ky��`�F�1S�^t�
���K��P<p����#�lZ^��,�*(����9sx���U~t�.��7E�����x��[t+l5/�|��)�p�E�����^����J���I��,���w���BQ���w�Ht���e��b;���b���k6���B�����D��g|�5���-��n�:��hz��g$*}Y@!������%�������T�����EA�h�~���MO���%�g��.������;����W��PG���]�����D���Pr�O��n��~����{����UVf��^2��S4L��]l�)z�Vb=Ku;*)������/������B6y���.�����,�.;(#����b���:�c���U#b��{|Y���Qp�-�|�c��9mJ���XU�^�Fw}V6�.��
�+{�t�����Z�����5�m�F�A�o����[l:���1.K���1�`(�zy��3l��
��rVA ���e�e��z��S:�g�$��"D�l�Zl���e!�bB^�Pz��u��v���[�&�kF�����V����.&�}WRX6�.��)��O����~!'�k�e8�D�.�pvO������A���g'������w�2X���%��<��C�`�}�bW�:cY��X�w��mp�RlA��, �#s�\���,�0�M��?p=1;%���,/^L^,��o��/�3��jw��.qef�b���f��F���L���\�s���X���_w;X8�����e�bG�E���������"����gx"*�+��C��p��Qj���h}������_��4���:���r���ei�b�gD��xY@�XU��~���TQhO����t�����u�b��p�U�|��q�\l
�$o+������SD���`�Y�E���t��J�EC[��.��k���M^�FU4�%�lb��2�Q��,��;]/����������l�^���e�%��=8������k��
��[A���&&�����1���/�Asb�����^0�������TR�L/�Q/�j�b����9�`��s7����YK4M��
G[���Yvp�\$�`
q�
&�����z��Q�e)6�����s��oQD|������?<o���%����}��&7�����^�+�~M��u��4N�i~X�q�_+�����9����A�+��B7��i�w�0>�2�jA�M�����b+u�v�/X��B�������}��������Ws�-���m��/v�V,t����3\������<=l+�t�e���^D����~�V���AD7���C��?�}�����<'����v�9�qp�����~�"i��b���9a�s��:?X��S���t8+��dVfO�0���A��=��,=w�?�c��m���t�t�P,<j!��6^��SMC��p���u|�����T,�k�s3S���Ul��<��H��G$�U�U���H��_i/XB&:������
7F�c�
n�������b*O�0�.�� ����CSs�k���8}��G��F��a�����>���<�ntN0�h����Zb��)*=o
�6d������<Ola�{As���p�$�6<^l�K��h�����4����]�����u�|���V�����k���o������zz�x�A\)��2|��V�n��6_���-����n��1e���Jw����g��at1?C���:T�AC���������=DW��<'��������^�<w)�����i�`���������(���`'�AT��;���q��J��&���A�K�~-�y/�|6��n�]�o/X"��Y�Q;I�
�]��{��f�nt���h����,6_�{LG1p�R4��F$R)���{Ay������t�-�k���5?�-�xe���q*��m���9�`�:^��l�[7�`�4��_J�5�����@s�������[#��i�W3{��/�#m}���c��F2}��vTCo���?��%�zVW�]�yp�;v?E�}+�0��RVr0��G����W�����	��}��@�ppUUW&X���f��D�]����W�<^^b������=�4���C�43��#c6�I�0����SU|y>%�OS]�*.Z���S��M?��Jj��W�4 �E^��^Z2b���������u�Rj~�D�tu��ku�f��b�
%9����`�����z���`�
������m�=������.�V�����4U[^(��44�e*�f�A��7��[��vJ1�*��2Ya��K�q������?�n���!��{��?���[�h�c��eW�e�H����f��?-�MT$8az�g��l���d�����Ux�j���R�~4��6�P���?k��o��zBQF�y,�0�7��g<���R�N�k�
^R��'}���4kT
m�	��[����4���i��n�n��i��4�l�i�F�cQ@�l���`��t�?��"t��P^�Y���7�}���m>�����{r�i����^���O��}�?�6�
Vu[��*����`���+��K����Q�d�{13l�������Ij�����2Z4�>Y�;��5#H|�4=
42�4[�SZ�6
�Q��<
��~�M�$�E�:��A�X$
m��7��M��g$�O0��p�g+�"�l��t�3���������&E�����[L$����b���&�� ���Rh��6��Cn�AW$�`�t��u	�}]��7/��`�fK���0�B�A�:<-*�������1B�����[_�{��{������^��`C�i��0�"X��f����l@��G�,����-0i0��N��ft�IP��]���.<q���4��������D��f�p�����sf3���]�8���������.��L�o��G�����0�c������9��h����|zL[O������S����s��������[s��V$Yhh=i�0/Ii���.�wZ^[O0�D��
�����IYg.�-/$Gm�&�����i������(/~h�n`����em�s�����/�A��{��1��Do���p�F�����*����������2B�y�n������X	������#Lw������=�^����{�d<:�&�Y6�D~~#g���M/w	��za���f��9C����1l�-/��l�@�����y�Y�w���z���,��6�/��5�B~�������ee��b�&���vzL[^0���!�`;�5�L<�
>�L����4�
>$
m�����l�A�y�3�@4m�@?������4��u�9
z��)W�%�|���`��,����{��G����>��M��>��/��\���|�B_�TpNU=������QA�- y�g�h6
���Y�i����[���T$�]���e��?�[��i}|��_#�L�d��Cz��'�6����3�M�g+���D�;���
+��n�SvB��g6����{���1��/���b��%��-����>�aT&�
��`_���a�~�{�i�lK �?��=�(� �d�X]jp��L/1P�A���m��d����%�</�R�^�{�56;�����$-�^�tPCI��aeB;�V����(�od�������6�`����a�M���������t�f{���s�6������k�)-���J��V������x�^���E�����pyc\}�l���%���PA�0�T��|<M��,���2t jd���>4�E�N3�}�d����6��lzW�<
g���=�T�U�3;���w$^��+�+��}�����~��A�-q�4�
�4��id�����nZ,tC���;���-�K.l�]Y*�����=kVe`6Q\,��D/�m�-,cW,�����i�>ta�`�s��}����e^b�{?��5/��E����{�W��ta���,L�������q��9o����>^^�eF��o�����b;���� ����i�����i����i����4��h�wP�
�e-\�)v�dT��m��D��NU�;���_��=��F��P���&^@+K������$R��$N�i���E�0�"0b'��[����0�^4�������i����f�O���(�����e�$�����?��"��=�
��I�H�D�0g��	Z�a�{],�}�j)��.��B4�[hv0W�X���o>���X�GC����@�/}i#�-�m�X���uY8h$�up7[%������R�f�������T�K]X��]8�4��'��#zl��p6E��[��=����?�0��,���Ie*=.,�\�~���U��\L�>
��,�&:!�_��[�o_�b��bw��T}XA?y�_E|��L����R��hV~%�B�.��j$�f�*Vt�z�l�?��Gq�d�W��x)
���B���0f��+6��R,[\`�.�F���zr���	�k z�;�F�o�trO�S��w-���hh��F�q�
5n4;�qO�k+�^M���O)>laR�bS��Chy�j���{�&����v�3D��D�O��u�������&R�Y����S�N(Y�aV�#�'����4����_��&v3�O�i#��@�Q���`��G��u�~*	Zs�eY�?6L�&5Ms�*�c�l�4��?�o�����9E.���v�Ym�J'��n���;�^0������l�n|�V^
v$Zk�J���iP����?�z����q�����0�-J]��%�,,
��H_J��*V�.LY�Gg�1�1L��4L���3����?��OKd��>f�@���XZ�x	����3o��6V�)zAV��iD��&����qG&A��4���$�6%�
�t4kV�/������/	#�������
�q���1�0�Kl�j�X:�@g�##.oDgapF����6KxC)>�z���f�4�������V.�&X��	�������7��#zo:���4�t8�4k����2�&
K����dK��
���x����LA�S�3�����4��1����\�.}9ZX��5���(��0F,'3Wl���`"����l���
�MC��Pad���|w�r��$�
o����7��X��0
n�P�Ol���>�T�Q�q�aS/��.�u��/o��kb����������4��F����Z��@gP�4 2>����+���	a�b�B���Cc���g�{6��j�oZ�9�.�/��;I����2��-An��-�R��U��JSb��
�
�2��gs������/`������ ew(�,�M�f���/0Y4����%�r���E(�4�>�T�~sN8W,'_�v�hx�y`��Qe��M��,c_�o�pI�)�0�d���QSj����+��l��d��D�E�D��b=����E����p6��=>���?���_`-c��i���0e���f==�-�G/���T�%�[S�JM�����k������Nh�K�+�	�'���oA7X� ��-�s��7~x�K��G�f�z��.0�/	������������p����^���v����s-+�0���\�z��>�p��%f�-���G��0�k�^��q���yK4g^��PE#�	���s����{9����%��,���bq�?�����}�6h��f��J.�#��A��
;w�m-B�h����m��b�;;X�*h��wN��S������(����uT+,W��,f.��xs���+��^��KlF��Zr�2�a����XV5�C�
���o���V+��0E������'v2��X���S��rej^�;sD�]��j����2Ew�'v0��Yf�������9�O�;����/+�;�����leNQ��{|��se�"��'�&����+3lEwf��}SS}=UxI�>���`���"El�<��re^�,������Mn���6��Y��d�i8�|p�)j�
�Z������*���/b��E�E���o"��Z:�v���W�2��U�
���������:M�'34�%��
�=2}y�����)}�CS?���
Y
��, ���R�e�`�����3|g������6&���bF�s3
S�o�~�*����c
�����p���Ub}����F�9���Z"��_)�B�Z�;��bY1��|�����t�"���l_>��Tm0�Q��+,�D��]3N4��:�L��Z�8a�Y�x�
�n`{�V:�gg�6k���T�M�!����Vg�|6����p���F�hE�2��M��,�'�'���+��
KV�x$�����c���W��;7��������O�T�����Z��W��P�U\T/�m������JX1��'�a���AO��D?�j�����r��Y2��L�i��p�A���8�Xx
M=�M/��+��
L�,�H(�����Od�
�Q��5lb'�C�2�.�W��z��a��87!�\�\�����s�.��������?�M���jV+WxM��0t(�a�O�nJ&�����d�DC������y=�gf�s�9'�K,����S�{�-�����M>�}�f���[a����],7U��+I'�����������B9��QbYv��L����4���c���b����c������m�1������0�Ml�GS��1�iH��E�C��4S�|LbQ4�3�'��\NlF.�Z3�2�`��hxx;�j�_��a*�4�%�����S�h��W��?M��bu������D��`�M�x����;4.ta��3)��LoX��Y���liBg[��������<�W���rkWh���Fl{1�]�G�%t+�=3`�������;��tH�N��l���/�A���#%8������)����a�,J[�(�hj�;����Tm@�0h�c*vo)q����{�:@�Z�tZ^0�'f
�M�%��|{�&�~��V�04����&�
wk)�nA��
���y������p3W8��V��+����	�0��,���/�������?������P����n��Q���Y��
�6����	�����-�`>.��K��fRk�9\a�h|�V�g;�)Z7���~�a�f����L�E���ga�f������o�����Y�0�*Php
�;�$�Z����^������e���v�{���I���o��P����f&j��)����^,X(=%���X�N�
��0�&:v��o��P�P>�#�_$������I�%��
o�A�/�i8��0�(h�41��
�x1kh���0�.vZ^�P�(h|hF6,���w�[���I<obu-M�!�ap+�]k�4U�{0b�T�^�U���NS��DWF��l�v��w��%�����f�5�G
;E�0]#X��+v��==��/��4�1;��K���}��*6������Yy9����|��a�&�����p�f�V+��>��L5K�����i������+SW
�`B�
��.�<c�M���B���"��kU�mP�/X*>��~�����.M���d�`������y������>�W.M�6X��n�V��5��fJ7��_�'tO��V�����>�`_xO~�����ZY=�&�I=s����o�����LD������pQC���X�6z�*c�|>l�):s}��=l'%z�c]l&Y���KA�����p����E�E���=�<+�4u��<-P�����B��5�4��������X&Wd�E{�.��+v&d4���w������d��������?0�C����A�"|c%�3&�6��a0[�s��jLy3�O��xu�;nlj�������Jf���&y��wxy�w��V>kH��7QU�,&[��eN�-_��r��J��y��BF��I|Z��K��:>�Y���H�h���P��y�b�������a9���cE����p6���h(@-��M��kV�o,0.zB�8����m hH
{<6+�s6���YM�A�V��,y@�.�y��vV�-����NhriXxHk\����I^�ot�m�N���`�i�� =xxD;������]�����%�I�+!�Z���DD��W��DV�o,\4��X	��f�xL[1LIL����N���a
��a��X��1i�[����}7�C�}���T,,x��
�����8�����Ks���&�?���a
���3����JU�!�f����4Vu*vl���l��D���v�e)�^���f��=*�������gpU�~�g�z��}q�f���a���][,�0U���
w�M=�M����q3�i��J���i8�O,�L4������6Q2����������M��2"vN���W��*q�Y?��[Z�B>b�G���w�&S
���wn���6�9��^��cR<�3�������h�&��V��������K���Y��1=%��=����uhvoL�H4��;X��XX1�9g�u��7&
/z$2��E������pK��P��k�=��6c���h�-��;�X&��c�����/��c��)�~����!����O�iC:$��8N,���/�-����E���I������������s��|Z!�L��4�|����][$�A���YB���4�<n&�o�sX~(z��~�B�K�����3n
��7V�*�C��X�{i���Y��$([�|8�.rr��������\�`
�����g45l%t�E�NS�)B��0	|�E��I=�'�:���h{f�����=���w�i8�0�P44#��y���J?=�v�r&�pxX��c����VY��1�o��z	vm&�i�>^���:�����7<���~�@K&�`���]��x��fc��
�$��9��G�����+�&tJ����'��_d���K�P-|�"t�Po�n�f,h��%v��p������"5�L�j��+��A��Y'fjK���'�+47V�/zW��ga�8����]��rX"�,7&j)~!S�$����l{t/��g32����
��
�i����|%����V4��v��D�`i���F�Pr���;��K��}����c�h���S�@�T�����>j�{09w�v�LZ�����=�`}�T�n�Waa����E����"�
�(�����:�LA�����~����P$�c�b=��E�Y
{���[��a�V,n��0���~���E�?(�;�0���F�X����������=
R��n����7������.L���/<>�4��Y�'�;6?�iym0=\�0�Fr�0��a�Q �`x9^��2��������K,K��,�h(�&v�l�`��K��pu����ium�0�;�������,m��bb3��ptq=3y���mL�V4�=I�CI7�����Q�r��[p������L�����h�c��:-��6��4M3�o�,�o�i�AXw��a����.m-��I��p���X�����i�����I�X���(���S�9K���e��~`x�����ium{��F�-|e��^S��2v�gV���<z������X,,������wZ"�@��j{I+���o.��[g�3�e��U�Xf��P>��w-�4R�,4%���@�`y�b���9�P�
���4�-��)������YJ��=7����I3�f~���D���=�4����� z$$��Um;�L0�����v�\#v�=D�Sbm���t�����p	��y��NK��Dp�
;��9�]`�i�q
����P[P��5���:����V,��	���k�c�c=�
��������,�D��-~�fT4�U�;����
[b�-f|���v��_�����ba�t?q"�[��3�b�PM�#3W�����-Y�Y��h�=_=��Y(���eWr�9a�Zc&����I+vAC3�D�K��qgb���,�X�p5���Nh�[�����XdR���n������Y�DhgYeba{?�+!����������M��p��7�,1Hlg�9b�����G�NrgAX��^]�=����%�j���e��uN���a��Y�W,����X_�H��V�!��-5r���o����v�L���S����8�.[��4��fh���c�f7��i�>�Y��h(U��Y���=������,aD�~��gkB�[��+P��=�����OS�m��;h
}�-Z��OSlB��[������ Xz�V��]w�������
���QSG�Ex; ]Yj��	M`��&N"������p��],}eU�7�`y����	����@�����[���1m>�kb�/���a�������f,����)?���$*����a��i�a�c�&�Ml},���I��-~��D�Z��q��|��E,��R�a�Sb7;��D��X��h��R,l��q�!�����b_�+%����i�������IW	\"u1�l�Pb
��������=V}���M',w������-~�
���K�����1m�@�h����US��v����UX�����G�1��d��Lm��q�4GJ��0��Q#p�It8���[t���!�/���m �^��Yl�`qB��[����Y����Q��g���;S;6�X�V;���Ft��1����+���'��v�,�-H���FVN�%h�f�PG4�1���>�g���k�N�k��nx�Y��p!�a��������zZ![|�(�lh&�(vw!���VCpxL�Ywx�
���-[��i����A+i��v�6����3�,J�f/��_e6���-�U���l���[��3Ij�0�g${1ukJw�c9������y~��,-^����j�P�J���B��1��M���.LQ�����M��������h���/���L}�3P�^��f����2t��hx���2t��aFG���7��dm����E�1��p�'`b�	�����BR�U�=�4YE�lK�%'&jk�TY����Bb�Cwp�����_Z)yo�|9����#c����*��,����'�dd&����14������	t���	�	zf�g���������@��<-��z@�XV�+4��zv�*��2��a�^����
��%����l�^a�9���[	�3Ej�tuV��U8=��=xVK;sW�v��8�0�*!l(���b[����������~a����:M��Ld
ze.Bw��%4���VZ�fA�nw�{�jT�7�M�t��.����T�b)-~_���q�[e����h�YJa>�gZMb���ia��4�����O��X�Y����%mg���gN/�I�0��U����n&�u�;t�����V��Z�h��t�j*v�SO��)��g:���f�I������D�����������V��~9���D��7�U�	�����������)A�������=NOik�;������[�9��x�����=��}X��iV�(�B��,��7.��.bvZ���E���m���3S��*�aD�D�c�`�I^�J�[<��}�=D�b����7g{,�0�G��x�i����+>��|,�Wu|�8�s�1�A!�e�#����Yv�<V�O�|�����c��J��� �i���
_���d�9�����f�MK��G��pA��c��9�K�&v<K���i�����x�������<�q�a��M8�K�Bq�P$����O������, v&����3.�S�&�K[��a�������th�[�6��6F�i_ni*v�k������1m��R�������Y�MK�7	{�
�� =X&�X��E�*�Y�W��i�l�������b�������q������Z�a����"���r���-�OOi���,��;1�p3��{��L,����Z4t�;e�q&�+�������Y��:�D�c
��U��.�.���p��h�SV%�&fj���2���X�#oi_����W����)�7�U�X�ay0�Y�B�O��p�^�,�)v7�O�k#:WE�S����B���vxJK�����_���w���~�`g"��X:�aR��'��5�h�m ��myO�iS����7\���7��rE�#�@�Xw�aa[�3��X�w$���t�+���\�,�Z�d�b��S"�����	���B�4�4�a��_!5��l���z����b�6�k"����.{9\X@L�R,T��G�& ��>0t��E)�&�=V��PDWx�n��aU�]��r8����F=I��gU��p�9;�=Z,���������	�n,Y�#�a������b�v�:-�- x|�wT:
g��k���S��bt��9=�-��z�=
�s�������b������&`���[�������D�2� ��V��+��y�����a��$y�D�����x�i��X/�a���3�%��C�	�%��=��|��1h��.��{\�I���9't�����m���A���h�k�p�s���;����U���_G^b\�J�Nk�ri�U�k�N\->�0P�{�=�I4���*�EWx��(t�J4�@j��5
;1�}3�K��>LT�`�Db������(�	���c��b�{�e<�}��6���er=b�a����l*�a��]s�r8�1�oS7v�����=;27E��>0�%���\O������1����p>����i��DU	��I|:�4e�QlM�_{,\�@���Ga��P���4ex_��zz,��0���k�S�D����4����DE�4t������GxXNh�UU.�E4��<=�m&>j~��B�K���J�M�L���\��q����tZ3��m	xG��D�`_X_l��A��M������J>�p�}!S	���G&>j&�I4�{����X��w�0�e1a�Y��o;�T�����q��������&�n.}J��.�f���jk�J�z6�}�Vl������5-���
��W���c>�6h���0&<j�<�d����e-��iy��������q��5D�~���o7gahRS�D�-]�@��h��
�d4�}`���<��i8�1L�S��GB�@����/����TUIb�(����&f�%S�c
�&�]`���@���q3�}�q �e�����?3��f"��=}��9�����\�`'L{=�z�D���B��x����*n
a�n[��1m���F������:M��LW�����l��q�6�bGB-����M}���/�T���2$����)-�~)t;[�L���\>��e���K4�}
������f��[���������%*^"8\�O�����M�qY����9�OKT�D������uS������u��,������j�����������`����e�V�,]NlO\5�Ub�q"���,�E������V�faM���(�Vk,�Mte��Y�B����ga�^�	1�a��=�~9��]�b+`���&%�n���Y�v��:�����������7�����o�Y��*�`���+�[�V��=�����C����e��������~I,T�����%�����P��t"vX������w��������c�9��a9���xE�C)���F�1���$n�f*v�m|Z^[��M���!�T)�d�v*���f�_���
���L��4���f�>aoXx0� ���%5��p���t�����F���ei�m�s"v8��;�RU���Al;���hxX�2��l��t�+�?4,�;�2��L���&.���9A������7��|h���p���!����`i$�Y)�PhV�@`�I�W�%7�x����?�J���9��7sf)bk�����1l�-zA��F�^��������.�Sx~h��h�a����(E�[�t|3����t���h�M�V����Wb�i8[��S���o)�nI��������'K��X���=o��M��
���/����<nB�`XMw�`D���D��.�`��I�vx�����
���B=g��.�d��WB��2�M�����m�6��,1���5��!m�a�Q(z1�:�_4k����<G�/e���Z/�����z\��N���`�~��%���
�E���{vu
��<�����?l�0SY���L�.����O���~�`��;k�z����J~,;�&���iL�Y4�������E�CgE�x���D��j�%Q�<,=�<��	�^$�P���LZtB�nXz@�K*���a���A������f�v�GiO�P��i�q�/�������
�x��J8��gM=IA�{�S��i���7T����{X�$
�@����a���&N���N��i��#a	�����U ��u�����8-�-/x�
�����0�"-�D|���^0���]��+��<,g=`�S�/��H�~]a�`O�{���B��X-���1
-g=�l�h(�)�:[���IF;c�[F��AW��4�F3�yYF{���P6�E�n�+���&��
�YC�_l�����4������������4�}��-3��9�� ��~��|�1�T����=K� b��'�f���q�z�����������
�e�F�d}	3�$�VO5}f���?�[���iy}JBG�,_�C��|���L�����0�5Xh����0���1;�
=���O�`S�wiC'��
<�����{5,�����J�
�7��J��g�r����i0c��>�:f%�"x�O���d�d�L[�;0O���������vzf�x���R�|�(5L

v�H�jA��������V���m������k&�������Ixf����?�����UF����`���x��R�"aNXW�
0,)r�e��,�<`�_�
�	�����D�a��u����J}+��'�f,���9���{v��?-��(�t����6z|�/��{v��=-�
h��`��T�3�+-��l:��lX-y�X�����L�4�?X�=��n7��������y)-���`aHP�f�e�K���D����,u�H���I.9�Y�����d�"�������^�����������*���Jw�|��I��~�����O�k�I-�~a��F�������W�?��[T���6����f���l�@���-���nZ����.�*����Y��O,�m�MD���������
��X���2�Ml��OKT�D�M��m�bg�����dR��������~���=U�Db$���F�7�����`�hVg�f�����~�Q���x���Kt.��_y���~��m���i�cX%z���Y��,j��M}��W~"�S�=sb�N�����&��LKO&y,�3� ��������N�i���D/f
���>�q��i�����Ewv��L��0
+v�zE�9�q{Z>x�%j�.
wh�J�����<�D���\�d���^���<�b3m��%�w���pm0/�/��MY����5���hX*6���,�A4�6��<k�����i���S?��0�)v�Bh����&�7�����d���+���w��gw���cZ2y2Y��������b!�MJ�5�w���p���������CU����^���6��p��m��%R�<�3KH��������h[4]��I��]���2]�-��tZ{B��V�������[N{���d��!v*&�	��e�_bkBOdZ�{�,>����iej�)�Pj�Vj��NP��M�`Y�������1m��{���zqb��B��7��eZ z��"�=Q�2-�<Y>�h�/K��*�B�m��_�
hu����Eh:I�Z�b���9'����'��
�}������
�?1�h���j�N�k�)*���,�
[6����6�X��hVr!�f�4��3Oi+fx45�`F�T�3���'���V��?f��2���tr�o�������W��t�K!:�k���9A7��T3�Ed?�?���'�J�2��L�}��B�N��[��&��2+[3h�O�Q�nF��l��HQ���L���Y'��t�ve��w���u�p�gl&k�����o�����-	&�\���2m��$��+
�B����|ye=e��L5z���Ln�7,|%V��=�qZ]O������������q��NT�O�Z�V��p/����a�c��DkiCa=�}KD8
g�	�K%L
S�#�q�������El��t`�K��*��0�-��7��.�G�c��2����`����tB�lZ ��.��)&�NO�a
����5.�����G�92��M>:�����FN\q�.
�����l��:���W	u	�����I����:}$���X^�:��	��z�.���=A��Ec9����E�L�����-l(i
N5X����LJ�U�a�"�n�b3nh�ZO�j-�M(�N+SO��ta�(bi��X�B1�L	��'����RJN�������h��_)9�a�v7>\+��%��%��)����'���a�X_��OS���BCu�p��W�Q��6�x����'�/z����#D�.�UK��gH�<]����~����f�,g���������a �p�r9%���Xl�@�J�4KX#��a�US����@�OXa�3���u��:f
�4�&�qZ"�^t����/���u��E�Z��������^��~a�������a�`WB�uZ-}�s[��@�_�o��L^�E�'i�B1�m�`�th\x
�je�1��0�"h������k�����{�1l��	�W�d)�����������`;|��
�)��6����r8I��7A�b0�3q&K�O�ut��X���w�.�O������u��.h�'6��V��E���k>����q� K�O(dt�F�X�A��������h
;-�>aN}�{��=��y\X������D6E`5����/I,|�����7��BV����z@��W�:>.k�D��uO�k�FD�~a�8XZ#}���1������V�4��f�>Qi��M%PZ,���7�}�����?�v����`|����?W&t6��i�64a�j���,l8-�����R�NKd�'���_���	���z�5�i��++.Q�\e"�����E�/t���)��j�-�+�����a�����/��E�,��X���}#H���1�2��Y�a'V�0s��2u?1��=nB�yYBO��N���O#��������l~Ld��nLcH,TT��n��~�R\����l�����XX�.���~h�z�B��� ������ba:��Dtu�S�b�/�/�����'�yR��I��aY����D���h���bW�[�rsX�!�����~��]`���~��o�K�~����t��_��aP_,��;���f��t��,�F����g����R>N�����d
#����/�*�Vh���D�%���|��k�]��n?�MoVb}����w���pjX��F�j��w1k�/�.�1��Gf��/�r�Y���]M���6��NfGs�y���������T�P[G�b�{�P!Pl�FB�43�
>z"D�4����(�f|Y��LW�,�!t�TN3���w���3X���2���cK�>-�-/&�#����54��'��_V�_����{���?<X����%�-k�����4<>�-�#MvyZ���
��E��EX��qy�o���ae��A������}�}5���z�L����Z�ubi0��-�i��Y2���8����GiP%X�*f6eH�^��J�A@w��M��0U+�/�'���+X��"��7�����%��	CAx�mI��,���F+�}h��z\�D*�o�
0f���Q2������x\�����8tZ^��!�:���e4�����b����D6TYZ�iL�L�;�a�������>f��8��l`��8�P�Y�����k�/�f�p�_�-������.t3YTZA(
����V�}Z![�,�W4M����f�37HXL{�4{e�[��fjc����~���pb�67���h�������:�����bb����XX�*��a\�]���>-��.�
�;�e���Tm��3�
���
,q�����!�#�aj!���{�:���>�-�X$%�D�e%{���t�}����6w7\�/4Z����qY���M���_p�y
O:�d����_�F�=S���n<,4���'����	����uA�^9�����,t�H��x��L�J�F5E�l�`a�O����Jw)�'����_L1M4�f%x��a�T��S������/�[\������-��,��rNdM�1�6x�
��Y�}1E%�P4T�obbg���nx���5J2 iUx���~�:
���t����bt:K7����c�F�EC/�XXbI��Y`I����EW��7����k��_��;]�g;����P\fc��N��w�=abn��d���g|�?Qta�;f��B����gT���`�P�=�0tY�~1-{�p���=F3Y�V�_LQ^4�H�G5,��I���s�����.y~9\��7=2L���>�!h\��%6#�,������K	��mO���n+��=SVm������0?^��0b+�I+�Mh�/k�/x��>,���=�i�8��qXA��Tj����
s��ZbbK����z��ct����?���{/����&K�����!�o��g����8���.�]ao��y5.�k[�5��.Z�1�~�&����&��/!�VF\������*���mhd��U��Z2�<n6��v�@��`�|��
��Z5H�AA���|�]�n��a,�pKe���!�mq�?����Ru$|�f�x����]�� z���F�+���q��k��Pd����b1�z�&������q�s���M,���!<#"A�K�nb��Mh�-�����������:0��{��i���������=u���S����N����]o����=�Do���*���ro��lg�=D}
�GA#C{O�2N7X�q���e�p�	��|5��������Q�:����s���������`����������AO���*]���2yCnr!�.�����a�@W��mb�eH��Y���X_�&;���l
�7#O����eM]��VhG������G�bS����uG����D���e��N���M(���D�Z�f��f�G�mcb�D����$^w�X����p�j�T��"z�#_,<�����+A��D�K?Mu}��f��m�g�b>=�����W$��%RR+|��J��f�&����:@�h(Xc��BSC���Y�^KZ�����9�s��[�v�[����P�5p�K�U�x�IV�B������Zd�K�PO��L������$��;w�=���N������M��
MhO�|���,]���'��I$z��&��n��T���������
����,�����$�����B64�'A4s��u�_f��)mg�E}��N��hc���_���HG}�����-=2�N���������0�2Y����d���
�������<r"V����~��
t"��u��P4�������"��}[O�k��59�2�O�ms
��j���4D�v;b'�{���L�%���"�^���*��p>���4t�[��W�_�yL��=�z)�B#M��/==��	xI�\�L�KwZ�5�a�������}Le\���Sx���(U�&�-v�i�V�6��Do��a8������k
��b_���>�����G����&�����iym�����9&6Q��Z3_���b'���������=����k!�����5�b�K%���
���V��%�������]�����E����b9(?��[0�4S�O��}B��������E�k���a�0�=d|zJ�t�H��GB�T093�L���R�pS�:;4
��[b_xv��8-�-/��'z��\�
:�ei�BG�;�k)�w{g/����Il�/�g1��1mx��.�3�1e<��6�����OKd����a�$��^��C�I�����m�.��1.�w%�'�����c,(�'ju^���L~_t�	I�C3J���N�i�����W,�|���x-��'�^�X;�o�[��s~�W�v�`����7!��Z��F|Eo.��p�(���hj�?��f�����!|�{��6���?�\�=��`��t��[���/���R�aa�PBl���*�+d���3��L9Hl���f^[LA_4M8
��I����?iD�2y���a��5�9K����H���3��t�=a}�{5�a��5���Wi���h|:�NS�
M��a7K�p�2��
����1�r8)���'���5������Z�������=�Aoq��h6���5�W��=���Bm����q�����6�����
�<�����T��w�]���N�k[���,-��������n�K��A����	�z�|^�:Q;�����1��x�����9�=��������wK���GV��-v���pAx��a�Q=�A�q�E������v*��������3��0l����#�}-���(�����;�z��2�BW�}�<���&,�
�V���4�f���~/�
#b�f���n���^��o��L?uH'�c��*�^42����X����E��J���l�r?LO����,u����E��`�{�)7�U�_���=��YJ�b���3i�V�a�W��p�����d�pv�N>-�m&G/z�� ��C��d���"%{x���[���6��GR���|�ma�h��L��0��zZ\|��\�'r[�~�a,BCs�����D6���]��4�->h
M
���a�����E�_&
/^�1��������7�m�lg�������l��p�����h�FK,������}��iqwZ�*���Bar�Xh5JS~K!>���T�/zoez���
z?5O���u�A,
���f�T������k}v��Jl��O�q'4��WU�_��	D����]��[��4S[OP9��)��p�e�Vv�=V_K��a��p����(����B"�c��
���x��D����G���/������K����j�OB��gU��^������W�tE��Y������1������Qt�70����������?�y}�C���sf�v�>M�{���2�6h����Un���hOK�x��)�(��c����f��<��o�����������5�=K�A
�v�w�{��
���������Dj)����T���������/�vz&�R����N5�.��`�5���(O����J���mETjf�=d�r�F������X��Q��(%[�X��0��Y��6*R���[o�I�������������lG�efr����<��M\��e��\�X��nv?>���b�?6c����ma�5L3;���x����|^��^F�`�y�~4�l�ef�������������c���?l�j8	3�ts�@�}P�`����FI\F�'���/���7���m{^=�f�fW�[mW#��e��e��fY����P����a�����u����1��3��5�@��{.��1m���{"�=�����������-��D��NU>�2�
{/����	������	�
������Nh�;�ey��3Q2�i�Yr��
Z�`v��8��ME$�bz��Y�X�7�}��?���L��{[&XT��c��R�6��T�/���p���h[�q����)���M��{/���-�R	�G���~���G�f3��
 �����f^1(��G��RIx|����uN~���<�l<A�W�,D�g������;�X���}��vB|�'����51�Q�����i8(S�t����:=��?�"�N���)�=[`j���o�Y��6b`�M��^6�`+���7i�������~���u��-�������t�u�G1:��l�	j�)��V��*34����#�������.���4 �B�L�C��WK�~�����A��������k��g]"���nC�n"�\/�}~�&OS����.t�����=[��)�6��n��{����c[fLI�z��eM�~,La���}S�����((��&>����9�$�M��{�m��3�;�g�p�����@u��+�G��Le�:sw{l��3����#�D�`�Be��qj��[@HP��D��f*7���j�|*����VN�G�1�WG�K���{��p���`�����WV��jC�Lw�2QN�y�OS��]On4iv e����)�����al.�z1u
��x��E%OS���A��\'������j�
�R��/O��'�E���a��K��q�n0�4R�5��,}w��a/���EO�k{I.��^��h6����i��g�n��3�u��L����#Yc|m��l���HV��1�Z${�&��[�=�6G��1m>�<��w���p6�`�J�3�#N���z_����0t+����i���'�4�7��4�-��n���������C'��0�~J�"qXN�"�4��;��-v�)��6���*�������*AwT��Px#�	���&���l�SkJV4�k�p��A���5}H���)��i])�Y�q�t���`�:�������|���Q�T�Mx-�*;,u�<��X�?�V��4M��`��������������l�i*b��+���6����*yt��������*�=`2�X�@��9����g%��e;���^�U��|:�������=��5x2����%�)�#�S%������)hZ�#
'��kN���C�_��N�k�V�71��p����V�0	6��b��'�+�����H(������)���I=����
z���`���q��->��4����Ky[7u��S�h�����+��|����szL[|P�&�	}���E�i"VYi����D6������[t��I�`�}Ur����ks�*�j��W���1��K�&��#)N��\�^�W-q0�@����a�������v����"��J>�m��X��RA���=����O�5��������.�/�^#�����7�Z,�^�o(z�`���v1�O,���:-o�����4Ga����4+��/LN^te�T���g�B�-?1}�"	i�4O��xy�I"z�x�Xh{�LT,L2��u����p9��������fRm�%�Y�(����@E���F�����}Z���'n�c�����&�����	��������E9E��A
���.�5O�=0���MTS��&'#:3�-E�E=��Pd)��#��Yr���t$�fr�%�<�%�~���`��	z��7��p6a�9 ��-
|�G:s����%��F8�R��	>�	��bY�����'sy�-�
�b���d�E�u��,s�	��G|xJ+,��%z&���r�����5��SS���
�E'�B�e�����S�Yz�Z6��KH�Z���b����E��E�_~��T}V1�b����l	��B��+����	��b-��r�E�4�
e������"���{���U�/��mQ���
���>�Y������g+K&[X���e�g^�-�������C�G�AD��pa5��;��;����(��[2���Y�e�:�����1+�q[��N����Vl��x�i�k���=��n���
�l�~��}���x-v\�1t�G�F����S���w����zkx?�b1��b�,yM�������1+��s��@�%��X���U
GW��I�04lj �eBlJ����F`�-jWZ1gK���>%�X�@kQ���l��3�6	vF���O+dkF���?jI4CW�$��1l��2=o��m-B�-��x��J+y�)�����=��}k��MD�S��`�����N�3p�12�a���+X	4����a���}
&w#HS�z�&
Z�5�=nW�p�
��_�}�<��c��bV�_V-�����.E���`!����E��I�Y��&���J)�.0S2�	��`;]���������	pg|���$����
I��f��b��7����S��^0�H,40�-0�$��4������&�"=a��od>.}�;��h�'�5�����l���`iV�u�f�5��H�^>�e���2�pO�)�����N���6��n�h�/��%��&R
2�e�L�
���m��J4�r�2NMKph�KF{�m;
g����I��v��+�J��[*�0�H-���C�:��y������ncU��a�U�-��e]i��4l�"vc�K���/h��o!mj
]���4�_4�:J��%h�9�-J�7`�.Xh�K����-(�����%��N�sy�������X�i�,t@y�2��
��<�%�A�0�2I��E��Yb�����p%�e�X����J�R3)5����q�����*��*ua���iDu�d���S���z?
����C����S��8s��Z�Y�Q��^���
#����]���fM%�����5|��{��]�BF�h�1�Q)ka�;*�zU����D�I]� ]i���d��bMj�"+z�kp��I����|�h�p��M����>�������i���b����I���v��/R��/Q8
0�`�aIS��u���������]���]�#S�/����ae#CV������ ��L��*���h�^�q$%l�c���L��:�����r����{����"�T�hI��"//0�xwF��*�j��B��Y��H�����N����.���_�W��������4UU���=���{U��paC���-�w�q�W$��a�BW}�/�\h\h5�y�7���6R���iXa&
n��e����.�V���,�j�����`�fh��(q�~w�����?��3���>������4�-(��t�Q�`L��\H�:S�gE�B�>�R�]:��a
���f�4��W�Z
���R�p�"B���e�weU�=h���LH�4�=�k��.VkRW�}(�d�X�Nf�����z�����f�b�0-�7k�B�M�3�AX�g
oM'�����PNZ4������i��3E��h�1;��%���?���j����Q�'�9�X~�Y�2��	�#�T�,]��Btg����.6c�W+ZW��+z���L�B(�W���!)vn�����jc
P�Y���w�W�fj�n����i8[mL�S4T��X������b�4�n��iym��
���0F_Vkj�84���i�������%���
V�
����I�����,��������������E6qY��i�l,�1���=Y���65���h�Z&�e���fB���V��"�j�����bO�X��-������kY�
-���F���$���FX���/NKdS�>f���0��a�	]��&n:��Lw�4���\
��x�X��[��q������/���+S����:����j�
m���'�����"����]��_Yl^t����p6���<#���=l�J4�5�$�ZV�B�w�=��Z-�^Y�N����Y�k`/�+���X��(��B�����!`������Y��,+a;��*�u��"6s�Xd���T�-s��bye������u�XmG,��[��y3�;��W��+���$�W��nv�iN������#���Z9��o~	����?�Io�~���EA�u[_9���������l��(O�w~�CcI�fY^��L_�7�Y[����(���=
g�
�1������}�kM�1,Y^7�r����`aq�X��g����'VM"���:��?����r�P�VtK��cXF�h�=)6�B�Z����Y���%\��"�[���1m��c��~���0:Xu��]���B���_4��*��yem�0�B�{��0���+��K��\�������L[t������)/������&*�5�+��I������D��j�c��U����`4�����G�Q�/�3�E��s��]�.,6��[�O5|���(�`h���&�[��i�l0�b�t�
� !oY-\����R ���
��4`���y�������6'�-��
^�,C���FYj�2�e�4�,�8f��%������
V=���PI����U�J
��DOx6Kc�R��$P[�����_V�o^N�J�6�`�n��%��S��0Q#'���+��
���OS9�������`X[
���,,���uX�,]�>�i�[�G%s���se
�����5�VK���4�$G_���48<���+4��Z����'���y�j��
���{��m�Fs��0SR7lk��0'������6S�Mc����,��.����v;���	xI
]W����`Sy����P- ��Ik��uer��L��R��/����`3�����A�k���^u���	&)�h8q�6��S�r8��k���+��
{y��6t�64=3�u�;W��,�^����ux�~5H=-��u��(zo�t���h1t;Kz�}��Y��VK���2�KW�j)����fD�z����]b����%�w�����)����`=\�����D�'`�WR�P�#X�yO,2)6Ul��
��A�|��^���Y���8s"�z���W~dR	L�/��\�F�������q������=���a���$�a����3	@�;��n��C�i�0��a���aGL�o����
��a�h�/�1;�U
v+�=��M6�g��oj8�0�&4Ui����1��f�J��~U��
oD������wv~�C�������n���>���G��L�������#�33�#3��f��_��ncR���*����U�+��,��X@ta�b'���m�>5�������~��Cla���5K[�������x�/����1��{<\9T���f1�=��r�8����72\����RDN�9����S/�����-���YM6��+�Y����G�gMlF��YLw�A.���E�?���R�<.�:�]��"��9E��b_��q��=-��>��H�7Q��,���E/���e~@�{'�{������6�7��j�����K����I��/������(R�lA6�X�D����"R�cy���������E�,�Y,��;7O@b�����D66Y,^����
�-�YC��O�06�����FP�$�����S������M[I��K��i�c�S���uz����EOL��
v���g\])��
�[���6�u�.*v��"4��_�����e���#��@6���^>x;
�*����qY<����jV�m�XzoQy��"�)I�E��N��<8:&v$w��tS�
D��-
�4U|�����I��V�mL9Bt�6��p�b������G�7
+��+��D~j�z���w��Y��Y�UvA��X�������j��UF�.,./������O�i�U����jRl�$�Yx�`q9�h�][�3�DEF��p�N�C?d�mK�>M���D��
/C��j�q���0�������EX2�h^���MlK��k�-�A.����������%��~3�|k�B�%���4���q+�K���������ocZ����e�tW:5;q���:�f��=�r��c�S����{�o�������A/��l*f�m�@Wr�/L�v@� �M�`�fz���6L>��/K�|��J��f=-�m/O�~0]"�{%���)�����N� .�c6����[����E�X��c`���4+������%
����$� � n@F7�wz%�7�����,#���y�gr��zU�L���
�	4.��x���Y"2LG�4�4�B�Z���R����`�z�����Y��L�i#��0��1Z���>�	�5Q�o`A�V��Z��n_br2ba�W��`+�I�9S�`���j�E���%��/3��T����F�[�*�f�d��@�������`������dr�9D��&l�$8[��1�7�&Uhd�Ge�M�2��5n���Y3�1M�{���p���MJ��0�,�JkU%]�}���	D�����,�`a�z���hFA�Y1�1
>�z��L��U�gX�8��p���C�����w�\�����.�!Y��9dCF���h���L"��v?LN�i�i-��'u�0L���&��7�-�b��
te&���`��,_
��,
��?�=;�[�&:K5�C�:s���[giq�t�=����w����"���]�TF���������-��`|[B������������=:3�[�47��,]���fa>�I��2�
�H�f��F����;=�- ���j�Lu��_f����T�O��*��l@��`rN�VTK�a�L/�J�����Kd-����E���t�������c~�D��f
��K�O���I��-PSN��6��C�L�=���Y�{���.�G0!?���r����/��{vn7����l�%������;�9�+���vx�����Dz��7|~�������N����a,M��0��q�K�v"���H����A�}����YCo�$�ax���6���]�/��,��w�Z��5.��y3�k�:B����������3F��{�]��,lO$v��g���~s9��M\�y��%��`i��X�v�����������1�(
��RZ��b��-�v���9'���u�m 3��c��I������� ��D��f�v*��*���/���wQ�2UcV���/�z�_5����R��3���VZ��|/�����g�X����B=�W�	����S���I�T�3����V���TD�z!v���/��7�P��V��L
�4+M�V���+�����[
������w��>�/�O��_�~e��V�yu��$�G��[��Y�}�}���E�;�
��,�i"s��'b��%z�D�1���%h���|?��]��n��T�E/����t����;X�Kl���[�f�v+�g^�����C<�^*� �'���E�;K��l�$h�e���j�����S
V�+�����%���;	�C3X.�H;�����%��c�,40�&��e�;��r���,|�;�+.*��
N�kC�y�D�@%��;Mw���2�����2�A��W(f�e���v���_�O���������gw���Tm�0qw�3cLX�|o%v7���Y��X���N���<D��/\��|�C7U��P�=E�~�N����3DC�*�5���[���
��"���-pKv��qZ!����!
��(d���v9\��gkiw�q	�@w�F�'����*�����E�����R�=�:���lbg"2��w���;����a8k�w�n�%{������W��1}����I{��x��?�[b���Ei���
DC%S�^����O�ic�i7��	9����A��Dl��D8�y3}��-�sZ"[#Lx\4K�
e��BM�0_E��P��,E�4}�pc	Z�����6#L�-Z���5q%�X��/�<��^���������F���������xM5pe�w��S[��3�s�%�P�����'�ph��M��u�CaG���
��4g���+nT&v&�{���jV~4�a�e��ba3p������|;-�->&w.zA��,|c��t
K�w�7e>�g���LmA�\W���*A��D��Ml�
W�5���y������2q�����r����NKdf
����$c�{�������
���$Q�Ro[WwA�&
����;tC�f�$w��W���f�������m��{g�U��
���������[�@{g��a���F�X��H�����V}g#���$����b�����������=��4�M/x�	z��,�8J�������@G�}�Lzg���iL>�].������X�5�a�h�%�}�����t���	�nI��$�E�����^���L^4�
JcC-����;t�
���
���j������7���������!����n�����"�IQ>���{�y�Rg�H��v��<S+��'V�v�N������WLO�����)����uE���x��^�s9��jTt�6��u�/3\O0!D���2��0�M��Y]�0��$i���,�����hx�
;o��c��/����u�H��,X�Dl�a�4{�W��'�F�-�v Ix��g�I-�����h�(,T��:J,��aCt��j�4{�N��w���S9O���j���}2�D���[�_�[���0:>��l����S��0�#���bl�c���y���}gOHw�w&��-��������3��F��U����WY�i��c`������6����OS�1���)����	o�r>�K4��k~Z^20�8hj
K`��7�}�P���F:=2aq��cd)��`aH]B��������3!��w&V.�V2i�Dc�n�pZ	�����4�
����,u��/@�1f�V��0������/
K�b�K+���g��T�Eg�-o�;�����!U���!�����������x�J���W����|�%�#	A�M��4�m�:�^%u��	����`���H�X��>\����|������6'���U�=v"[2�8�w�0�45�����W5h��
z������;L���t�Zlu�s�������|��=Vh~��D�`a�,���N�,?VY���/�+��Q�HH=J~�)z�����|�b���1�m���)v1�|�b["������b���D���
��m���\��0OS�*�$�������fY]���qZ��%B6����w�2�@lI�u=V��>�S�O��+v$��=�:~X��h�(N�d�*�:��X�vE=�,�%�aa���2��?�/����n������	���E�L�R,TW�;��Y����f,/�,?LuD��&=
g+���D��G�zEA%�������V����Yj�����2k2g��Eh
cgba�XX��'�|�6��%oF+.�}���~
n
3%j�XTJ{��{I���!^����q7��i�l���F�����,.*�eB8b+�����k���D���oQ���Hl��E�~�q������]��l����@k�V�p7`=���e�&�-:�U��t����E���O��t��S��6�`+���7�>=��'V
/6�����.�Xb�+}������EW�5��	9���������B�b��h\���lf�M��G"#��r����D�,�0�X�d� w�q���G3t���q8�o3��#���X��a1|�����
�����p����}���D"g���6l�+z�%�� ���!C���5��L���S�]=hKY?,IS����������<����`9�I������rN�ic:(��P?~���$h����q3�U���_�	nY�B1r�uS�<��M&d-z@�B�I����`'�ib�D��c�m���X���12�q�������6���6����gWBR���4��M-.IJ3EW�{ ���6'��D�����U���Fl�@�o_����K�A�����I�{��ium1Mi�{��i8["L�@t���`Wj��b��!���>3��h\�XlI��<Y~�$�e��?�q�@��x�����MD���4�mx6�f��ba�T�P��sf�[7�����C_��\�������09G���bAl�������}]"��
��a����r�N�i�	�c<
I��>_�����~��1h�3��y�J<���z&n�n	�v���r�+d���?��M�L�"�/EM��Q����f�6-���R�GM5�W�0����q+��e�V����K=`��d��{X����NhNy�7KY?L�R�`�b'��[�5�s���3{�e�����o��+�kY?0-�����f7s������^	��������T+��0���������3�2���TZ���7�L���x����w��
����fT�{9b�-xtZ^[��4-�`�y�t���
"%kevw�L�L���qX��a���k�H����||9���2O�SnY��o�i4�0�2��T'����z�[:=�fx�M��J��������)�A�2�d�X�v*=a��4�]�k?0iM��	����������=����S�|,;��c&�7������K:��7�`ac��TPk������&�6����{���]\t&5�Z�,�[:p��ui�K������-�=2����'��p5�Uba��X��J���xl��������K�|�"����������+�����|s�����5xa7���$��N�V��g�����`U���Y���	�R���Y~|X"k�BY\�{���p�&`��h�vB��`�f������EC36X��,����3�TV�}`�V�4p)�_X����w�.�]�1�-X{��.��	�S�D�):��>PV)���cYI���A������3��9'�&,�gk�2�h+�>�)��>�`wA��TmO��A)���������D,&��F��n�`Yx�w[�4\�p��D��m��*v�8������p�`��Kb��,�S4TY����������1�p=��1��yxb��e&����%�z*:���A��O�1�aV�����u"�vX8x/��.���q v���X�J ^N�&:���D'�ow��p����HdD&,�a�]��n�����4����-�AR�M\��%m���j���RY�b!$�%��xXv0_�h�}�2a����?=��9[�X
�X��'�U�
�����������)�����p>"Y����B���[2��1}VA32�=������-�e�MV��H��5��h�5���`B���y%!O��K?�{�����q7u�����`�#���"
P�;Y��"���N�f1���A�`N1�=�!X�t0�R�{�{���8���x�z��M)�l��p���9t��D��	�i�y�	��a����VECUF��c���b����Q���)�z�.�+v{������"������Ou���'h�=���0�UO�)V=M8P� :������	y�a��T@E&r ��LG������
]���a�S�o!�B#���`�SY��lj�lP�\
�0.����DO�D�&xk�hO�&j��5O�<��\��p�	�K-��9
�3�T����[�$+D���<���)���R�N}�Y[AF����vn�g���]0�1�5�uK���������}f���Y���$D��#�RV~,����C�ti�>�4���kr�f_�4T�"0��f�:bL^��$$62OSd�z�A?�:���+d/�}�����W����K�w}�"���-P��	v�j�0���[��LA�`�b�_�V\k��f�KsA�w6JHS��4R;AL~T�[��iXBt��$����n|�����:<�e@��
�o�@Z�����:�P�A4���J[b'�j��'	�-\j8�z:X���,�s�N��a��G��o����?��Gz��9{@0���m��B�����%�L%_'s�&`@>�N���M�����?
Jk�����<��}TP	�YEV�,{��	�����������a�N�S��a��
��u��!Gs�4R����/�I$���B������|�<��v��E�@O�
��4�1�}�,�0+�@(���-,��.L�P�]�`�C���}�zE��=�V�}�5dNO������&��p�&���va�����42%A���?�bI���c�������U=���Rhh�=��i��T���oA�lX�p0�,��.X�l�W\f�&f��Ksqf���0�,\4��$I�� 7�9` hZMl.A?
��K�R�*����8`c�����X�y������:�4Ev��"2��&b_X�"eK�u�����{O�k���R���=���8��Iu����Nd��I��8��6�)�.��������RY?t��l�a���r{�0�4U����*&�j���R-e��b;������<=�]T��*�S�R/i���h�"a�V��,��[�/������#�A�v�`iX�/t���������$-+;`�O���8,��i���	�p�6��f�.9]�":=R������R|zL��09t������>&�t���N�����N�x�+A8^0�(�V���-H�k���H��`�z�f����L9��:`�G��PO+��Rn�����4���;b7�j���-���-0�t��i���Y8C��nH�p�����\�w�7X���u�,��[������J�BWJ��f��:
o~K�2E��n����ZYv�����jX.��>,�:`�b��08�pc�����+�iw����;�5��(F���1��V'+�����Yk��#��l~L�>�f������n�2��1�B�rZ 6��^�S�z��v9��$�X�� v����������'v�u�v��iA\�D�����|�8
��������[�dn�|:�k��'<��h����d����w��l
9#�g��xZ�t2�P4���CB�/�!:��uZ'K���p�j�	��������C�����V5-K��|]�=�Y��]���M��iv��0%]�,�*�A�f��|'�o���3��ej~������z���j���7+
���,�oL��m��j���`�n,�j��&D�f�mb����Ba�������
�8�e��R�������&2y�~�����������b+:+����<�^��R�~�a����g�6������Y�,�.:7����]��jW�{���?1�_�p}�/������k�>L0�l�de��I�E�~T]�|��~'�������b�i�s��=�X�����~�<k%OV�,&��vV�i����r��5h��)`z2gW�I��.A�t7	�r<�r�dIc�PQlc��bsc�=�@_���:M�]�"D|���e�dB��G����������d���_��yxx0���szJ�{LRZ��O��)t��g5����EO&j&���F
��^���V��53�a�������>��=V;%���[`���������G�G�Dp��,>��`����#|a�����L?q�DyZ�z�L���h��kZ^/+��#�C�H��)IzzL�\��yT�U�B,D=��� 4�UQ�Y}�
QxJ;!LKZt����J���n-��V�KsW��MN�i������hX8)�����7�����-e�,a=��4'��b��������T�y�\{N��t�&:���mA�`���a�Q,<��`
d��e�4��a`������(���_+X���h��s���h����V�L;O0,t�oD`l7X9��2=n���N��AO�u��?���
���&�?�>a��h�)v3I%������i���������1
7�@��P����D%Ew��>�:Vva�]O�I����������6�aW,��K�F���T���:U���tAwZS}�`r�����}*l���+h:��w����T����[����k'D�?�V�i���+�\�{�";��A,���~0gA�	�YA�Z��f��@�;1	o�L�P,���Ev���O�C�S��d�N\�D�B�`���cM�	W��a�����s�7W�v
z�s��a�>�|u��1�����P����4�d���7�U��^�w,3>���iX�8T��QZ3)���i�rx1���8|��/B�cE����;��>a���+��V(�^�U���.��R(O)��Sz����_�=�h�Ke��=���Q��.��������R�M~��JU��'���
�`i��F
���W��W/�@�Ct����I(��mL��%$S1��Rd�	h���v��_�
f2������U�'lz�>e.��~���Q[}2it��
eF�-�����`z�����6z��4�����g��	�F��
'K%S�������T�a�W����Rl�1����O��>f��V��>a�\�-�"'s��`a���a�)����]��b�XOXt�'�d�>l����c-'=aY�RH��s[z2Ih�/����LvTl�u��-��Z�J,]m���]2w�v�	���Xig	lx�������,n�����\�k�l��mn�a�W,�2�@I�W"����_A���S���~��������`i�S�-�J���7�����_$,�c���9���4E�d�F&�o�X��7��������e�)���j�����9{_0+�K���b*������^�����E
d��~�Q�Qh2X��^�}Y�b��,�#v�����%��d��������F�m!d��E�Xu��6�_X�Fv(},��|��h%
+��v&�j�p���a�_����i�����,�v�.���e�k���e������l����7��}J����3
u1��4��b����&hz���!�p8T��b�~d*h�_LT%������Ye��Z�/��}X�Wl�6>=��c"7S4;�
����2��������a��v�v$��Q{����4z�t��\�Ag:����v������-��/
o>�YvK��j�<��9M��jv�
������i����f%�b�X��N��������E�z�-E�NC���*�E/V� 6�H��j���_��=dba��X��b�~��}t�\�^��b+��#�i�v�X���Q��,�_�I���"��9���Tt��{6�kNC��#O���`��oa��Czwe��P�_l�gs��=���v+/�_C���O�Bg"��?=��`-:_Qq2�M��;��b�Y��0Zl�CoY�"_w*�]�QW�U��^���4k�;��,����3�)�;���D�f2�PsPl�D:<����\������,������n��vV�-f��D
]`=nA�tYNz1Q(�PZQ,,�[��X��^LzY����\�\uY�V���2�bK�U�5�H��xYc^�+���gi,stz��e���{i.�B�%U�.\��,��/��4�;1�k^��Y;^L�Xt�k����V�fb�b�a�0C�g�����������u�����b&�f���C�R��i�;X�]g����4
 a��K�}�)C����b�B�GM_�3<Ii�_������Zh�?�2]"�K�d��YZ�y�n�&�e��_�*��}/j.:�aZ1Xx����z+�Vru��^p�~���oB�h
7�/kC/yV/�eXd]�?��o�n��|,v6Y�����o�����"���Om�fZ������ci��D�C�2$MVAmYz��y�~�b�cF���va��*��,����%�d�J�������S�8X�K^L.Yt�[���v����h��,J�-4�-k�������,m�	�.e�L�Ql%�h��,�xi-|/x������`�����P�YtK����]/&�,���v���`����Q��oY�y�S�t����0L�-��/�Cg5�Ks�w=�`!,�4/&�,z._�i���A�Z9��39���^�d�<`J����<����Ug�!�����`���_�A6T�[pD����0����\3ga`�h�������qR)<:��U�<<
��^p;�x�`@M���#XZ5����s%%j��c0�a? Px��X�s q��yk�����TRz2��6K�v(u��B���Vl�m���J�a���E��gU"�9�i���6������C��L,y�`��������P�M4hx1����D%�f��;������/,��z0�"�W���������W��."���}S��a��Z��j��n	R<���u%#n����E��mV��N��;��JY���,�	:W!��O���e������n�c�P��t�������a�o��"��X���N���7k�����g�G
N��j�EI3��[Y�;��Q���<����X�]l���r��>���{6�����^�d�aDO,LF���-���4�b���7t+���[S����]����e������N��j����\p�J/:�Pr,�������/�=��W��i�?
�l;��2�-�@L���l�	�4C����i�t
�fl��CgKR��"Lg]��7[�-��	6��i�v��(��z�=sZ�����c6{������V���%�����I���>�]��������A�+e��O�[�����+��NVv$���nA6`[D{�����~�����T���X�f�b;�!����@�����E�Kh�����P_-<�GZhO�>6������`v����Z���VNS4<E�=�n�g;j�������~L8�����H�`p�tYi�)���w�KE�=��9^,^+%�]tZY��g��7����%bg�Zo[�y�\���1:��;��D�.j���f��,�e^������V�f	C�/;P���sbYJh%��-��Y��iV�/&}l75����;���	AF����u�)�W8�Y�y�_����O-������B�h������h��O��%�=[/�����s������X�6���Z�2���,>l�;o��
k����j�,p%�iHz�)`{�]�Yo&g-���=�FF���������*�-�
�nD�����������uA?��Vl���`_�)�1����^��q[5�yj����
?��[u��1�h2��/����y�>&�-,L���P�����
F�����e�7�0�:�N���l�hx��X(�g��z�����������^�mYi�t-�a�sb�����+����p��6�"9�n�M�G��9D��\�����&n%*
��`;����-�f�+b!��K`!l��</�~o[�9-~��B���a��[���m�mx�����y�V�&v�ML����Fl��,��/y�4��0�(�o�y�@�[cN����kc�b�k��= �ae�.����X��XyAoi[5|CH
�0������z������7S���}�g;�H��.�n�9����!��if4�'%sOC���:fD�S�v� �UBGV��L�[4����G�TO��[z���\~�^{_0R/���U��,�M���.h�nao��"z2Q���C,�v��
�N3d?�~!����z[�zC�Pz�0����������!V��.����`a9������T�E�����<mJ�;���i�YR�4E�c� �ix`���	�����}��OSd��	���0�,L8K�����(�m+Yo��-�1�g�:��V��oo�
K�$�
=/���,�M?_�>Nsk���Q4E��P��(�u@��q�`��r�f�.*t��
�{���x@��������3����I���.X�/�pV�^������9[�����0�1��n�`gA|u[{{�:+�gW�9V���%��D!O���0m�
o��o�K���(6������Ag��9�0��F����O��e��r~����BA�v[k�6���?L$��o9t�|�GMEp[�^u"zn!��0_7��7��K�0���j��E8���	�=�^,�IH[�M��:��P4L�I�C4�H��r������|�)�f���~+�oV)�p���8������`K9��o�SJ<��,[;{3�l�vf�` �l�1����4�awU�F��B�{*0Q�B�3�aC:�0��M��D��)Rp�"�0��u*�3���S����b7�{N�k':�A��Gj����9E�S��C�Nfa�S,L��*l)�j���>P���I�tv��P�7XW}�"�%�&�X;
Un��o���K����&t~��'<z�y��������a~a�H�04�1cr3�S8�"�����m���V�a�c�o�*������o^h��
���IZ�p�[�n�:����
�C��`+�TnKv�����?�i�9��[:���.d;,%
E�E7��;``4�	�������f�4���a�Y�P�\l:��F�-�AOX�,��Dl�����J����7,�:W���y{���[�8������K+�V�C-��a�n�V��!�Xi�� 4u{������:��U��w[�y3Qg�������f��9��
��~��y�dc7�:��2���Q#�w�HB��������^���n������E�2�������O�S��������R
E��(���P���K�����y�F:<R�UE�E��N�03��Od�v�`z������u5��l���9����Eg5�i�<=��c�� 6vT�`����������f�U����r����u�G��f��i��������������������'�F��������?�~�o���7�����@�l��>
�{3�5��O1��[�,�"�'(}�v
P0���^ZSW�u������o�Q��h�?f�:�b)fYy�����fW����t�f����^�`�,-���T����#����a�+,�w��S	Ot��H����K�Xx(��-�j2����OJ�����R5�D��vTn��J��k����= �$H�������`�	F����r%����*1���Q�������b�R�������4]�"*��Ayf�};�`�����(�f���`v�-?"H���?��6��K�rN��j�_���]��X��H��,K��}��������|���^*�W6�*�����;
��&\������d��>���+Xn�u�em��su����i�f�.]��6�`R�2�tn�������L$�l��3�R�W��~2�#*�*��[Tp�KC7^��uE?��E���o��{6��j�
�{���HX�N���r��c��Bz��_X3��o�g�,�c�l�%<M��6��d���R��r�}�!�b����l�����Q9��Wl��z�dj���[y�^�m/{yD��RZ�����PMXW����`<Z�������AZ����^����=
�4m���	ks��\Jl�\��'��|M�o�E��f����1��->��2�`o�K��o���{o�H��t>�}�9��O��9��F��pMO�wa6������u��G���i�}���M2���� �q���xsF�2���h)[�>�Sy���{����O��m���~`Y�:���T�~��4Ev'�qXb�0%j]8������`���������L�Z��f��%��Y	��S�����H����H�%����4X0�%�O3d���^0��KW�5]q��K	S4����E�/����S+���u��\��j"���0�J�������M��=P��]�d�I�K�	��{*����&����i������{����.pb�P�������.���`��U��;�����>��e�g[i����$n~i��]����rt?�=>$Ta��:e�f����g[���"���qA4<��/��F����S���)��	��_�������o�.�,=��]M�=t�����\w��C������M7x��6���9��x<j�J�BP{�����)W�
�v�V��|y�=��/3�����&�K,�m��T�{��6��l��y���Ue����Z��'������A���W���OkJ���F�����.\�+�����K�i�V���[3������)�J�vy���QA/�'iZX5 5����F��������y��F�V�0b�T]�4��u��k���oY��`��7�E+�fq��R����"�e�	�~�:+��x�%���_B��(,��!������������;��Ck���!z�`��&�"
�����K)W���]�R~�
�g,}���?q!���xA���;����{�������NI��9;@�� ������G��r��/�
���I��	�������|#��?���t�6��
v��
��#����k�9�/�;
�{3�5��Z{3� XA�b��$a�t|���o	�4}�B8U(�f��:]�����f	`X�*�������f	�|����NB~������M��Yhc�����B�2	E?n���YM�d����K,����ek���i��}��f����>����Q�[��7�7V#z��v����4�����+�.��,|�F���~Jh.�����z9��U�,n�,n�=A�,+�����+��5|�!���P��`�b�=����7�J	�������`Y��_�����h���J���TyZ�"���/
�4�`�#�9nw�>��El!�,Y�Xo����$bVR`��z�f����uiN��Y�����Eg%��9���dO��8-�mLOD4��Y	������,�(z������[(�lV���@w�D�_DJ�p�v�����+��U|�ED��m���f�+"����)(�7k�6���E�6������T���	����E/�����BG!����KC]�����+h�|E��W���mg�5���a\��,+
J?K�`\���91]=�t��[�Uk��mtR�M��0C��Pz�,h�X�J4ve�[W������m9������
n]A���d�(mcJ*���B��[�Nl�mpQ�(m���Yh��R?�L'J(<�JX��7[ij�����%���=	�����������eyj���%�Z������e@5�E��:��=�g��.��5k�6��*:����Sd�>/|���oB�M��iz�L���_No���e�,,�M��a�����k(�U���*���6�g����Y-(�4��6��H+��V����%
�}�.=i�;�w�7\������=���'� ��,��X]���a���9�~in�����C����7,�x�7���P��3��_�4R�.��l��o55c�UZO�`��L�7�:�5�l���Y����,��N	��z_g������W��_aX�q��*�����0_,T���m����
._i��I�o��B�
V�I,fe��>�tV��l�g��u�]�"0�'�ph�fi�"�4�	1��)��<��?<o��8M�}/X�.�U��K%��&��b=����db��*��I�,�����)��k>�_��
���oc��b',���
{�"��6��*z��:�
s�bi�������c��6�>��b�:^baJi�vj8�QcRhRo�hm�G�
�}�6x,�H8��}E&�,�
gHE���	���l��p��l%�����Y����� �X�_!�r���k�#����1{l����X��f��bW
����I5
��`}c��U>�]tS}
\����d�����V+mL�T������K��=J�:����f�T�|��h��h���dCEC�(�z��fe��c�ubr��lP�\)L�h�0���u��g�$�,���L�hNf��4P{0p�4��V�;��'�p�a�6+=��*k�6��*:����0K�A�w(�2���KZ��6rMe�P#[����P�:����;t����\k�6�	kj�`����l.�=M��jN�I�������Ksw�[�,�X���zeV���0�h*����V2~vm�bI��p?�e�Z�.��v�h�Ta+RLV�m��t��O��P��I�Y?�d�t��u��
%�4����r������-�f����JMC7BR��)#��{�tJw��6/+��m=�|��=���R]�URSI��(��<=�"$3�"����NSd7����
������B�+X(Gl�]5+�6�����v�f��{6_�pzL�O���������~+a�giB=������}�/��[��=[z��y� `�P�"�|��=�����N+��S�ir�g���t{+uz���7h����9����3A����W�|0��7��v'�n���L���M�Xx���\���L0X4k�
K<��E�[�j���k�nog�T����t���������}l�t�J[i��V��z���v,��Q� ���'b��E��wzz�PCj�����{6�^��c.?&|����{6'���|���1��<Q��\`[f�fY���.F�B��[1�3�1�Y��d��:5���#f�\�2����DojKg(*��I��"���?���D�R��9�L�E4�����n"����n��� D���Y�V,L�{��2�n�����C��W��=
b�T�=;
�W�J����Q�r�ba��X��n�r���rg�/�;<�����������r��23�=�>v0g����34������$j��qg-G�Y3�Y�H/��e����X��9�����<;���%l��^���[�����u�n����pi����{�>�a�4T{nL�X4,���\��-W��DO&�'v���i��FX��h�[v�	��mj�'+*6��B�B�6���w�U�n�ax�o�np��og�-����-C��,�T$�d`�V���������q���s�}Vd�������;K���wZ����F]	�X���w�������K|��{������J��*�nERYf�[b'LIe��������QL�`�N�.��[��E6�Q����-��vk,w�TJ��n{��0>�y�<=��:��/H��]+F����w���WJ�����{�-\���W�QDo�}�2�t��y����a��`/^�#��NC�Om��vwX�$�aX�$�`�/�������<��������f�tjA.��,X��`�t��w:���8�K�������n�_Z��stR��U`�.���b1���:\�^+��l�����}��T�]�0�U�;S=aF�����x�V�0�v����j������;L���l's����!V4HJ�S��n��{A���0,^F���f�1�@���R���Y&X�Pn�r��ogj/�S��d��L~�p�vV��h�E�`��WcJ�.��M�t�a��g��yB4�������`�g������7��4�vD`6h��)��j�����
va.[���+q���sG����a���.��,�=�O�vWr�V�0C4
r�$����2�[P���0u4TF[J�X�����P(����i���A�N�`�jfS���)��1y
������n��Lx^��(��z	��x]a��S�ux� ���}C����	������^��k�}z��U���FS�~��lgZ�bs���1��@�?�R.���t���4�\���[����)Y����~#��he�n��amY�| z��,���`ZW��������e�Q���-�a�h���@�W6������H��"��mg2���4�
��4���n���A���T���H���at#hZ���e�=)����J���Y_�N�k�	�jA�04��Nm���(-vWr���u�_x��e��-)�����/��6I��>��V������A���`_X!,�w���4C�2��?�|��=K��}
�l����i�������`G�Xe�����^&S��U����Z	�Y'9H/�E~�������]��A����Oc���}T�	m�!$Yh�m�tAi!�j}���E�����>xT
:�Cx2g��]y6�P'��J��p;<�I����H+v����+,��J��B�T�$�
��V�^���
���l���p�zWr����L�4tv���V12Fs;�i��Q�0��aa�����.�ce��)��f���B9�c}V��`�/+r2����{K�����ua�+��x�
���KcO����*,�WL��?������7�. ~,d��S��|�����Y�����z27m������e��B��m��l����X�ae��S�]��u]s\��\�����B�:
��K?/	��������}������,�^������)�qzL��LV�b��O�v���}�Z�Y_�X��m�����d=��g|v�����9NSd��Ag�{������O��u�"�@��J4�<��6NC��D�������,�k�y%�[8�Z��aU���2���B�b����\�X��a2c�4�7��S�.����-8C���	��du����������gm�l9����,L<y�i�<M�}>&
+:���YX�#v1U���z?o�J����+��B7Ab��l����:��V<�,'d:������~k9M��T�$|p%�X�w��r��
�����N�.��C�1]����
y��������fZ����u�g+���c�
�.(�?��}X��h�E�F04�J0�r��=�Pe&�$S\�5?��}X3����g�`��}����x6
z�������b+�����"�+S����9;^��)�_x�|T���<N�-���.��Ix�5i�}`��Q�����W���+
?LiX��9�Gw-�)��R>=�}'���_�d�^�Dt��Nd��j�������.PJ3�Y��a�<�s�����	x|�4d��,�2�`��;Xm��R����9ixi����y�l�m�A�I��d�;qI�q-�������$=n����������P"����r��%�T�>��V4��S�4T��LeJ���b�c'�,�\�����~S�9�~0g�^���.�t3&�.h>��}`<������Bt������Kkq��i�`�u��,
[,��0�_�/��g�Y�w'vU
v-R�@���U���}�7!��B��c����%���`i'�����)�/���EC	���Nlv,��,'w�"�O0���X���x�i���X���������`�n�&����<�����b��;c����9����w2g�������t�0�"UX�
6_�~�"{p�
��^�-���zw����i�X�o�7�����P4T����-�>V�}�*�hXo!����^C��S��d�'+z�n���D�b�Z����wH��x(1��-\)�X��aS�������l�+��(�ea&+�R����`l^�_��N3dG�)�����:���K"�([)��*lN1\�{��-+�>�e��}����+��'�`��|�"o�pY
��M=Xx��G]q^-�����hX�/�T��;`rM��0*!9��.�c����������R�m����v����5�0Tk�>��:�RO���������;
�Q��>H����4E�aa�1�2b1M���n!�a!�|��4��}3�]���+���Ao��)5��9�j����4;;�$�P�BJ����4�9m)�3�����?�����!z����f���s-i�s�v�H�����)�'6�0�/YK(�!)�$�tzL;#0������m��l.��gi"`�����8i�x��@�����Fj����������k�Y��:a�J��z�O�k�
��A7X�&&���������$���tr�y�=�������
i��x�S�B/�p��c�U��)�TXCl�Ib���J��:���d�n��I����v��@���z������*J�Ym�aj������k���)���L�Al� ���F���1���Z5�o�\8�V/}�/*���	M����>(Z�EC�[��u�y�l�;���j�/Sk�
��k��\3qi.�9v6�I(I+����nE�,!��_;T�2�D����y���Y�4����h��_+���o���B,*;Y��,��V��lb�������4!r�N�ba���V�"+��,�&��E^+������F��aV6 6_||zJ;O,�,z��Y����S�k����m_V(z��-�'^����gKt�B>�����^EO�;���,�,�w���J�/}��'��t(>����%3M-U�����ow�X��
��Eba��������2��r�/k�
�����/+q2��������|I�=�/%<M�}&�&zZ^+������|�kAN�
 ���B4���3_r���h�ta��)#o��C��5�4C�&����c���bn]��u]=�p�	�0�dmK�6������V��5<�G�aN��1�����(x2����S�n�$,�FW�����1Sa�a�,n�;W����'l��D��2������t�?�Y:�a�u���0*+a��r�kaLxG�i��[�_�����Q�S��^�S�L�@4,�����`^�b����5��Vk��>��w���
Fb����p��B��km�f2�m��R��
P��������VtVp<��]��Y���|{�i�v��o��,I��"H�/]4������\y�,����1�&�����R��&��+�_+[�)_zi-��
0�k�������MlKU�����`�����	n4��N��M�iS���,�)�r�7Hx�	��y�Z��e�+���%_��%q��'�W����X<�����],M���/�E`���re��������.�������Ksq��kG��}�VR���|�	=�
�r���O�D�L$Rt+46�\|���hx���U����h"� A4\�d��J��C��� �M=������
D7�x)v��i�����,������ys�Y��D*;�7+��%z�pR��x����HX���*�<�j|��>����k��,�iM�2T���[����^���gZ4-�v.${�z5�E��9���P��t!gg������a��9/��&�^��z����5M�x�|4�O��x�� �O�O�������~`��,�d�Xx� �D;���^�����z����*�R0o��!�J	�p��k%��)�fKs��ubaY��+�x��A�hK�_��X$ma��X��k������/,�
�;�v�M���O�iw����K��y^�0&�������/��I��?S}qp����0,������J���/,#:��g�i�^}���]V�Ui��hx�
�U"=Vy������l�U_��(����,c�6�K��V2���|�>��Jf�:�/��
�UOo4S��%[N3d��K���Qg���I<�n�}K-�LjQ��k��**���%_y�������<��:��.(�VK|aHD��09��6���x!(�>�VZ|a���a=��C(F*����^+��+RtA���la����\�v�=���b�AGDsU9EY��e���LVm]T�Q�w���������sM���}	X�4<\��/�Y�_����V|���%n_�`�k��.��JJ�����d���>�u�]cAo��#�t_�K��=�"�;�/J�g{��:=�}��n��]�X*���E�V�mU���?��/z��G�b��e�W�Y4�4E�S��oy�������,z�b���i��py�?�c��+.��_y2��9��G���S�����9��Y�@(L��e�&�����z �������?��J4�������b'�|���:������d����fw�0Tk��z]���O(_K�`�X�=���N�k/��UMCoBr�����u�������{��[��n�U)	�K�>�,��_�s�����	V�,��^��r&�d��5��.�V~,��a���8�������O����%_B��x����`Rz�s.�d��+�������r����~�����@l�6�����
�����d��4�2��%�������>V��C
�e{t��p
�����:(���v�>���!��kl��U����������$���M-����zWl�&�N�+?�,���hx�����}�lGA�c�Cx#�hXA!�q v�}E�|�n%:f���8�47q}�X(N!�R[���������F��:p��
��c�_��\)-�_�W��m��M�(t����[R��
o�;�:&�p���������� ^�(��������u?0T�S5��1�-���-�,u���{?���(v��\E,�o^l�8=�=F&�#�Wr�Vy�0�G�z}���R[L=����(��Y�w�^�����W's�F`\_��t�a��#�������c����O����?��ZtO����wgV�(���3S��+b�G!��c�)����c�[.��}^o�L�Qtg��b�2����z����O3��zi��Cp��o����K`��+�M���w�y��I3����������3�O���0i�f���U������y��]g��(��|�0�a���W���U"?p��J$t������o�����|�>:��@�����C���2�Yb�4��E`D.���x2g�)[���v�#m�O�%�cE���tiN�A�e$�]�-XQ��.�az�b;<����i������z���dyJ(�"z�T�p�zxz�?<��xK��7�^����k���h���N������%:_��Rv���PDt.Y=��V���E�2�{6���m���0
*eK���� �}`�P�U��Z��"J��2\���W'��[3�����G�S��4To�0�:t1jTP�m�4To�L�Gt�8>��fE����`,=Xx�������J��%Di�$D�'�}���+g+yf��;sA?� ��<�9r��%+j~`T���S��������'H���?�,�������>f����iy�.�|���a���G������1hzZ��`i�}�f��/���~�q�';	T�}}*�]p#,2	��6]qy-���E9A����9�.�&��*4�C�2�U�=��a��?n����9esi���`i�^l���j�x���a�`;/)4�)���Q=M�}�P)���������
%����>di����@�2�+�I'��c��U�+J���zP��#f���;g�Y@�4Av��,i'���I���������B��0�%EM���b�����r�>�B@�����e���_M8�ceK�`&���Z���[�����
��0)���[�
8AQ��>��d_�f�rR�>���S�~*�#�S��Y��pi�e�<lVg9=��2)z�"��2uK��4R����V��V����V
�p;S���N�-�?���4�v�����J]��1������'
�CKL~�ZA��P�8,P	���_��<�a���*Ew�5�]l���Yi�YLf1���vO.��E�Kh�zX3WZ]�����>_N����)|q��`Mb7}�����]~���M����P�S�U��!v���4A��r|S>�gw!R4��9���h���o����<Ph.��}
�,L� ������.���n�-\������d�����f!2;������`���4��?YTL�f��b�i�4C�����hxM������S��b�j��f�����>�n�O\��iX�s��4���O�0J!v����C�������bN����b��
7}���
�Ks�o}����X)jQ���pH�dYP��j��c�����.E�K����%�V��������`���+l�nkV�t���1�e��bx�[��
����'�������r�V;+6�I�����2���%���z`��Y��2��R�j��Q��(��l+w�
����L�e�P������o}�"{�LUV4�B���{��6&'z2e"[.�;
+���a�B���Y����A7����~��P�1e��U&�r�wX��[%�AgX��]�����E/��>_��OC����?EC������P�K��D�O��zX�r�'�:��B�%�����clAqXI3�
\���|i�KbV���Q������*C�.	�>���g��3j��pfz�b�Y6�4T���G�fe��N�-E/x�
vz[��0�f=X��
}�����=���{vV��V����i��sP,�+��<�a�B���W����Q�`��f+��kG&�_n�e8i�G����`���sA�hX�3�/�����^)}�U������c��K�n��,��Tl�����vd�������_�"v���`W�{OSd��[���O��@1�O�t���2;����!��U��}-��z��5/��i�>��S�+��Q������u8�����lK��i����L�hZB!N���eNb1�����'�)'�pVRNV���!�|�����H��]��gX����f*aFaie�����0,J��}��;���g'<7I����Y�3_7vg.��5�r0�)	O& �C'}��^8�X:t@)hZAl�h�Y�������V&���L=a�I���z	zn����z`HZ���y>��[E�=;�cx�";0p<�7%��9;0~4-����O��JK��LH���X�M$6�J���~S
5
w�nX6l��[�
���eC��,����Q,���+�n����!��t��Q��P���i�~������
�A7��I6�������?H81�1�v�I�M���1��:���e����[��#��BA?o%�b5Z�c��7������<�}6�A*���l���`Fy�B��7kM��4aEw�0!�P�A,,��+ia����'���`�BC2��(�a���;`�k��x����V,
V�n��<M��6X�/]x*_�n���[�9��x��]9sX�7��pi��!�n����.�j�s]�!��L�W4u5�� �4��..�k�����{�`
/�+����L~�4��4[@���H���U�\9�XE7G[/�])(���`r�����f�R�0�
����tKJPs���0P���dI�/")\�K�o��{4$O�k�\A/�}I�Vk�����\#�g�b�N+�^�����������a�����]p������|��4Ev'�o�?�T�d��/Q�@)u�"�1�Y5�
����F�{6��r����S�KV
�V2�]/����:�.?V��L<�C���3�D�+�
�UL[��B�V�[����.�yS��4��RajK*5������N+,��zE��/4��<Y��h("%vp��������������\���d����
����di�0�&�a[��N_��?U>��3�v>��R����w����i���D�EOV�f�h��`�X��x�I��4������srf�"�6V�c���V�7-*
�E����~���.�����B�}Z	{2%l���v4-���/��L�����1SK6�"�b7+��]��]V�)6w�����"�A�[{
le��^���W��DJ+,������.�;S�iz�h2�e�/K��������K��P(4��<Y�A4�"�0��,F���i����X�h(�#t}���*�f
����K���E�n��~\�n@����,R,�.D���r~������7h�&��&���~���M�)b����Bw����d�z�aGl�;
�<�wU��,�O�et�pZxg�<��h$	���U������I5�o��aZ>x��F�P�Pl+�O�O&l��"3-�Dm����E�_DWl��lqA|kZz8/��B�U%���;��z�c�i�;���/C�g+�L����������OKO��=*Yg��X�yI����9�Z<�j�4f_���Z2��d��VZ,9k�\Z�5��i�����Ew�B ����E���C?�-��K��`�+7�LO�F�+��E�'<6?:r��J�!�V�o�i�����cN'����'���n�Y���x��]����p`�8����GZS��]�f�er�[9�[�z��tSN8��(u���3'Q���m�fx��Jc�����)��a�Q��0�AW&���'����bil],+(4�4��BW��F��;��$��#���N6�����W�M���|+�<
�>�a��w�&0�l���c���H�03,����\��Z�j7�~`�Q,�Zg~,���
�v%��w���K�*H�N�O��}�=W1g�:v(
�/�O�o'�V�}J?�����f_�d�aLM2��JMv��F�!9���S�.E����zq����^����������J 8
��`���������'��J�����)������L�e�����^�������L��L�c`��?*.�g�7>��:��|�����Z�4��.4�N��C����
���5��(���'��
���?�
v������6���3��t�1����`����O�4A��a��i8�(���{�F�:�V�
���BoS���r��N�D3-$���J���|�U����N5,'
�--�v3�F���H���Dv�����v��w4��
�6��]��*�Yp��	?a�Q�
�E�'��`�M�b_X$(�p9����|�[1Y6���p�/lq_/�=L���'�{�=<��2������`wA�tZ�~������Z�j1��+���X�0�h�4X~�hR�PQP�O����4����������jIH����,�t�+M����	��{:����[d���w��g����ui.hx�
��������'��.��m��C>XZ�1W�Z�����/�
���W�����>�R�����s^���s>a�r�/�U��k����5��B�����`��������J�����9�#H�>p�]�<`��E�KN��7��U�/��2�5e�Rxg��	O����l�Oe��w�����$�P�~�H�7����F����L3��%�rX��.-�(`�D��Z7��:���m����H:���_p's�(�n���a�o��;��o�������D��ak�O�Y�����lnG:=�}�]�@�0n��.���k��T�4��v�=��.OC�K��E�2���kH$�*�RO�	�����3yjz+3��L��N�iz�����a��he��&����N�2J��_����	�j�n��O��6�^Ot���g_9��Y��,[�<��@���7u���~X���UPA[
_L4\�b�X����N���1�K���y�^��^,-���}�� �������i�>�"�Z..g-6N��>������
��E/��;YNC�*\���b���

l���[���������|����Pb;]��_x]�\Y����@�|��1����=f�[� X��ehw���	|���	��}ZG{�2H�99u2g���D7V#v�f&��mc��fJ�b�-��������fAe���9��^���K����rE���{b5G�a?��^��.�,�{s���+��]�`�������e��D�NH=��m�z�������%Y��b7��.�a7���)���b����H����@�f����*d3�5�<���FY\���OOi'���^L�Fl��S������F�)�'��D�D�=���,l���=�Ba���������o�������x�*!�h/�"c����JibsA��1��1�n�P8J,^#��
��6V��1�7�4�vq����F��]�P�v� ��/&.�~fa�l�����1�
u�nV� ���m�C�$��v���X��
��`;<�Za�Mo����������k��D�Z���>�������.�u|#��O����j?=��cV�"��t�t����/��D�X��s��������G�O�PmY�j�0#Ey�%h�R`5zx��hZ6�|��:
���Ja����W��]�����v�X��hz��Jz������ACH(�o���;��N�A?p3	��h�4�Y��O\�"{OL$[t>b�����Ks�P;VlA�{�vD�F ���Y$}�z"��rX,�
�B����m7����7�V�f�(�L?�D�Qi��B��W�4��b`��U�������/O�H��~2g����~���z��
�sK]Q��=�������`�]�����M�2��z{�a���dF�?
_}�1��^�����,'��Kt�x/��_0�4
5�B�9X(v �^��2�����>
Op����`\q��i�?M���.z��(� �'K��R�O�������������;��"�Qh�_�^L�[�b
mbG���e)����M3�J�9'^`�0���~�"�p/K	z����9{#�=U4�J;`�A���������6���O�Y�Yx�^�.�%��4���X����`�K(,`
����2[�������h~���j_�PMK�T�SJ1��>���-5��M[���?����B�>~!�t>f\�=/Ii�O���]����������o<qAbqY{��2h�_(5�Y(�/����n��R����3t��E����{v��Wl�6�e)���������^9�Z�;��/�EaM��jU��T�E�$a���j��<I��m,6[�4���U$���9������MW�}-.��/��o����PYl���Y�z1���]XlA�sY�j^��0d)�����w 9���������j��C7x�|�������6� 6��a�,�Yi����.A�4m,�����>=�]Xj 1m����7|���U�����t��{��J������6i�p/��-zB�Y���+���aL'��".c����^���"�0k���S���&���Z�M��k��i��;`AcN������/��%
)@��Cy����?���nA|Y��/j���
��Y���S��0E�J_0}#� �������%����m(�,��U��/��\p6��N�w�2�bi����+�2VK�jA��
!Xxo������c�cd2��a=�$��
/��rW,O�����=^��p�v����1�}��OI������aX)�^9"YZ�J�Mk1�.��"����^������P���y�����@���i�m����x��5�mk������No��C�q�,X"t����A���C.4ylK�o���������jg������|�������f��hV�'t��C���Klg��������}=��\�:��.v�����
��[�6l
.!qe^����w��������b������o�����-O���.(�ok�CMS�y�ga�����0���7���f5tB��)�l+\J����kw/��/}���f�5�-<��&C#F��>�Z�4T��,�$:_&q�f���P�A2n��R	�i�� Y]��|d;����}M�d�e�7;n�~�3'�,i+��m�EVm��O������a���QP�����������bas�������@�S�X����?(S���H�Z�{�����"�f���'I���W�iS8=�wgV�/j���/Q���z����{�!;�]
z����������`;��$j]Y����w(�����bs��������;h(�,6GQNC���RO�'����b%��*�mu�M��4�o:X�&�� U�����--����i��p�W��e��B[���ma�����'t�%,�*����<����f%r���h�;=����W�����qT�Q	67��*/�o���4�f���'}e�2����N�iO��)�OE���H�u1�	�t�Q5s!�d�e(��-����H�h.�qlK4�klE�0j�S����Y�)���������:��M�_d�<����)��f�Bk��/�.�Q�m��
W����
_3&v��O\�"{1ik�4.|��0,��4t��NOio��;���2�m}�
�lA7�O6o����if�bS��4��D��_:�t�U��}*	-�,o�
���}|���`�5o���(����������AoV/�iG}a@C�V+���=���iM�oC�=�A�z5�b����0 �m������H-��a>B���)��0� ��G��^����d���L����Y��.l����M���~��$�����:�1�����d�f���_�_��8L��|zL����L��E��>��E������T�[�{�&|��c	���H�-������U��d�~����b��%�7k3]9�X{�����
�������Y<f�j6[p�,�
�#
��N���)�nKwo&�-:;���'ij��j��%G
��	����
[($���f���a3��M�N�bx�i<M��I�6���"�{���.:nKw�NI�`����R���`P�Y��4E��������`��Kb��
����kc���Sj%(���������U	FZn|�������~o�����-�AL�svU����������F��
���AO:��w����)���Ie���g��m�m���5�F��
�������1�y�T�h:�p�`�)�Y�������l��u�y�<
�n<�H~��7���x)����g{���m��
OTA����6�n�j��o����Yf�Z�m��
���U�m��
er��t�R�8�57��Jh����	���[�����p���0�)!��Ki5����E�pq�6<�K���������i�G4�THU���Xz���T�+2+%ox�^���H)N�j�*k�7g�5[:���|�J�5�D�����y��}K�`�W�B�T%���v�������Zc�K�V�n�m��
#"A��!?��*�NC��g������7vX4-��I�<���)�UNAS��`�L������0-�:K���ys����ta�f��~��//,���RG��"���`�J��Ex�����M��l��NC�w��iW��M��/���R�)��,������~/@����m����]��,+����G�f���]���?@��Bs��Md�l��#���J�-���������'iz�o[?�ks���Z�4��T~�"G�?�����}������Y����j�����)�,K%�}��b�������9=���	���Z��p�X*��MO���"��Q#��_�(�g6����w{z�/b��B�_���`�E�fG�����B��n���o���Q������)��j�L�(�n�
���)��N�;i�����i�%�0
����/`�V=v�!��p��l1j�0�P�����(�vS�����$���������},��r�f��	�v��QO\����B^4*�0����N��7�+�|��	�)V��C�*�s�}M�B�K��}}�4���`'<t�n����I���_�k�����~�s"���w��(�fz��v����F�f�}��`�	�]m�l�(5���ea@*X���5�~�^H���}�����!�J�
��i�d����Oe��v�Pk�i�IGa
<�u��
�m����=�a��ob��l��OOi����f�x������Ajf�J���H��w�����~�h���q:�A�X5�c�n������{����I�����
�6�X�6i��
��cC���'*�5;�Z��j%��!�f��"R�2��Q�Q�Fs���)���@����e��f_�������)����=�n�2�t~��r`x���I4�0;�#����oQx��j���-������l���4T;��I�tn	;������M?���e�|���x��,Mt�";�0��@�fsK�a��]>�������v������p��V��j_�e_�����{��o���P@� h�
��y�/|�����f�NL,I�n�V�.���7g$mz�ot�NR�0�'�eX�,���������
�8�[����6x��]�������^��*�6��`t��
\���{��$���?f�[�_�����	`F3�N�G!$��Z��1�����AO��[����/���MO�}�Qs���Q���'�^�)�������`Q���F�����`������#I&���d��K��j�������~��sI����6����akv�`��g����k��=Kc��i.-?vb�N�i���k�����{"H����i-�jiK��B��+�0E��L�Ik9)����A�������=���������������lJD���-�J�a�H�-NC�f��R��N�4,&%��&9�I�-`�F>�u�z,���e�`wUbj�^��5�a���x�E8~���\�	`�thg�oQ���d���7A*�U�^M;y$�s����L�n*�8L��W��jM3��_���Mb����s/;����	t	�����J�.?�� $�kz������KA�v,I�i]�}�/���M{_��� /��
�]Wb6�TyzL{nH����o���}��A�{!��^,7� /L'H����MY��c����JA���O��A�<��mK�=
�F])�_��aYy��2������z���r�Y��d�;\�nH����[�j�#����8��7v��4�����Jr������������d�"���B�I��5Dx�m�0}��G�`�J�����~��E�/,����:M�.���4@/{�\$������v��	��k�]g�v��a�#��*��T6,{OH}���%����������
d/m�0����*���N<m����
���z���m���k,=H�`�Ul�'����_���,���Z���m{|H���K�mpo�C
�`�u{�v+J�^*��	���K��4jo��K#~���p(���
��hP��YD�*��m�R�~��t��/����RdW&TE�3�������^��c��������9�Y���Ot�*��5�C��hv���,L�~
Ed���I<�fWa����$��������a���YO��������i��n���t!;�����_tcmyb��]���I~b�Z�-h�5�a���hvc��E����_��$LO4���V��U�4����Y���f�e�c��YZ���7�����m��E�,(�5�C�0��Y��r��\�k8�%����%������Cb��g�b�>���f���B9�aN��D�e-�~be[�����
�D�����[=j�O���M�=����.������=��]NC��}���wz2g_����np���n'�p�
4���f�.�!��i�<��/B5�^7��6�����������2r%c��}��;-��6~\��Y���88M��'��,y���`<i��
El�?�7e�O�k��%�E�,",�����l�f1���b���_V�a�0V+�m�f��Fg5�Op��I�e-�b����U��{���iV�dFY����A�,�6�D7&-���]wd�)��+H�����YP_j�������-|������BU�(v�k�����qX����� ����t�����scB�����S	�Zq��Z����*;���+��B's��`��y�
�bW�"�f=����D/x`��/L�����r`��o��_i�&��d�>��
e��v��$67���{3�=`�B��t)�}�v7�[��m�n0�tc2�b'�2��7?����r�"��h}��i��}
j���4�'�bX�d�d�.V#�1��{6W�����5����U,<�z�lS
vz��k
��,�2��X���}�[y��/B�/h�x�x���U�������sY�=��A�`�J�����~��Kc����E&0-��H$���,�Lw������dM��a1�d��+.ij�(�_�s�V�f}����E/����������cZ������C�65<%}�~����}+�$�i7x8
:��p��|�i���9]*�����{�&S$�
�y��J�����Y�&6j$vaA^�y?;=�>�
'��.�Xx��&6�it�I�tnU��*}i.��fU��\���VjV�n�����;�����+y�1w���(�Yp������	O8R�.����������,�u��K���2v�-|��n0�4<���`�E�bi����+z��������
���`�u���4�+���2[��m�����SK7
�.�����P�<��xk������)��^������i���R-�K�$(��F���o����`L�i��,.�����7xZR�/`�`J��k���'j�*�B����
V;
�^��<�X�kFb�~5�B���Z���f<��C�MlA��Yx�����GA�Y<�1�p���f��}Q	���\��)�o�$�li/�vx�~����Q4kx7����7��{6����x(��b��5����i����W�wv�/�}�h�d�N�C
5��n���a�+�[����_�N����;�,#��2[)s�Tz�1��G�.�h��[[�����s�'��{��j����Tt���R�kQ���U�{��z��_�{B�w�11q����`7��5[��'���E����������� K�7�k~�@�g?���u��4V�6�?N-��
)�7�z�)�xL]i��<�J����h�v����-���lK���,�N=L������JW���,�]���Y���&Q��f+�7�HM�yRO�y�=
�C��y�`����Oa3[-e7�U����"K�r�2�ko�T_y��Q@��x���X8C��/Q8A����*\���������\��9;#�S&�|��=���i�UL�D!)j%��1��
+������>���?D�2��TL}��v�xg��+s�'��-��_-m�*#z��'[fN��U���[<o�����+ba���^8Zt+�w�I�\���p���;��E/�� ����E�;+�=��u�Zw��
��;�f)z\b��%$���PD[���V(X��lA��[�3�&�P'O��vK����3�6�-���;+
������2�9�;m�)��wg�3��)��pw��Y�N,sO����e������7\�2K���Y�I�[hy�VK�����������n�rx�i�/����n���r������[B��B-�P@�[hZ��,� �0���]�l��+��f�hygy4��B�S���Me�=�ao�Y��N\D+6k��f�.��4�*H�����IUUN���k��iz�gBg��/B-���Q�`;]��������k=�|{��9����XV)&[���(���.k����,���}*"��w�Y=Y^��:Yl�p�`�8|g�l�V��-��72��J�n������=f�{��h��O3d7������{�S�Q��Y�Lg]�f,���0G
���o<M��T&&:�*v2g��Uy���@���VL�C�*xmV����6���
�����4�����=f�pCt����sbW*:���'&w.��A���]�f�(bG%�h��c_AWZ4���s���\�!p��J`�.��KoNSd���@����`au���p�s��zge��+��v��w�un����Y/�,���L�����Y(���L�
h}s�NC���g5�b7Sg��+.�����'���'b���G
��`gA��[��������RlNx�������cM���������xe�{��]+h��M"��/Q�9i����NL*
�����?����}k�����i���7������
^���;,1z�l��8���*d(�:�Y��������b�T�7t+$�M���T��,�
�E?0al�V����z*�,u�"�pw��IJNo�Ys�4T{@L�Z4��/�:
�,��t|���,/t�]�F~��>I�4w�����[:��
��~���������4�	-�mu-wX�(� ����E�bs�0_!�u�if�kb�N{�^o���]4lhKkTln#�����J���iA�h:���q�`7<�}����V
w-.����hZ+ ��J����;k,4
]������/L���������.W��u6��i�=
�>�r����`_Xd��/`��y%�KW��>L'�a:3�|��=��H��\Y��/2Il���7�|j�-�	v6ag����g#I�JQ�%�;�
I���jIqt��e�;,��4]���������N�Kgm�Ks�_���[�a��j���4�N[*��TsV	�4����Gi������V�����_X�lg����v���[��C7&��Vi�hZ*�r��@4��At��j��������*\��,�_q���!Cy�~�������4E�C��?�n��6��,]����i���@�p������%�����J��S�:t�)�����`GJ���jW�3�K�a�`<���D��\����i����'��[Q���x��^�fN�m�����*\z���L#�����6��������;��"Ab����L��
1�T�z�} �}�-�����>%��Sz�J	���;]����Xx���Q�a��s��vA�����.���J
K.�i��������^0�(�r���t��W��*?��dfF���r���XI�����4E's�����h�$l�2�n%��A7X`���d)Z�������~�����cJ��alWk������D��r0�<t�5
A?��<�Cw�g�f���e���R,~"�?UBV���LZZ������B����x���JE����Jr��������EO�D(v3���)��e�hb+���b����Y,tc�������T��1A��H;�,Ku
N���?���+��=��P�Vu*���Y���z�f�uc�u�����p���g��lg��>x���1+���uF�m��.v�\�X�)�5���-��Y�E7�M��zB�C��l�*v��@���B ����;%�b7���#ZNS�<E�y�4}I�'��[Y�7���^}��,��E�b;K��]�O�k��6�����p�p3s�XXJ+��O
]��t���1	�i�*2�~g���u����(���������h��.��{��- �Bg��B�g����U����f'5<�Wtg��b�*��@�[OEb��u��-'�U=2�������(Tm6k���=���N�����Eh�3�Y��Z
���*��l�QW������\����u�
� �N^���q�����izb{!;��n0�(�oAi���m�+J4�>�eP����������W�b�.��g��9V" zVyv�6��"���������m��+z�.[�P�bF-�z�3����
{p�N�s*�#�qY�����[��������z��J��e�J��&���8\��u�,�0����O�����j�ok{|+)=` ,M>�\Hz[���2�	�TR����-I5+��iM7��2��Y�*���
U���`��.z�N �\hlV�S�>'w^a�`}p���8�|����6H�-t�5����Rtgvb��W����������A+����VP&�,�b�bg%������_��8������:�b�d�We������������	v�U���?\�d?�V�w������$��8]�#��:����k����i�P�#v�0�4���`\*�0����tzyG��� ����`\*c2}����w��!�r�j�m9W�}.�u�a$v�W��'S����w
rO��@}A��u��u�
����D_p7��l��J.���W��<����p��`U���4w6�W���6��|����;��Hri�l����r���$���Y.�`T4l������B?i\�;.6��N�����D�:�`+V�f�uN�|.J�a���v��.���R{��Q������g�`s�ir���^��i/�},<�\lOq�i��E�������Wj;4M�����5�����N4�
���%�3|�j\��n6U������H��,�0���j��������,.�Z&������b#����Z���)hh���BDji��F�|���*Zk�L��#�N�9j�+���>����r�F������R,|�R�@0��f�%x.8���\p���k��-���_AC�X(;�"Jl���bixX�hh����:]����=*��U�
.J����`7}Z�&|h��ap�W�5b�t���A���,��i�g�=E���y���dI?��p�D2��h�P�7|T#��T)������L�	*��S���2�v���U��������cxr�h�)��^�K��v
����`'��	�.����m��j��a�Q�4������`\�������:�`�f��C�Tm&g����z���f0�c}�_W��S��
�
�����`�V}�y��t�'`k�,�P�����0.lY?�c4n��?M����
��fo����C�k�64�x���&u�����������@�Q���u���iWC�9w�TG"p�D2^�&6��.��u����Ab���Y���
��7����B{U
a��m��.���`^4�A���'���o0���zfk����[��G��,-7]yW:��R�������_��x�;����)rkD$�e���%.&���c�����9�i8����n�og	��_�#�I
�&bW��f���_���|�y8���$�����+$t6�������p:NNP�q}gYH!t� ��0��h�:����������A_ra���v�Y\*z���4��p�]4��������4�,3+�Aw���v���Vhk*_����[v����Yx��X�;
~�nogK(��������N���	���^l�&
N��>]�[���v�vV�/�b2U��m�t�t��4�������Y��hx���Qy[Z���LW��zO��,� 6�?O����>x������J�[���\N44���=���B�[k�Y�b�����[-�wv�e|�{}���3����B}��
�c��L���J�D��u����D/�T��p���v��M��n�a�
V�n�pga�f;n���_3����b���4E���o$��;���Xx����I�������:rc�f������s�Ku���7W����L�}�k��w�R��-��0���P��It���'�����s�&��^���m���1��'�{d���6'g���4C�4a�%�����h�Y��|��a8�a��i��o*�fo��zl��6=�=�PK'v�V���:�a���\��x��2�n7��p�m�.������0�,����
����9�?�b`�,�;Y��Q�Mv��;��D@P8w������q��a���di�]3����i�������EW��-�F�AC��X��P�|w�ZiX���3Gs���l�>v:D���*�T{�;�,���%G,k$�EW�Y+�;k�=
��������n�d��>���t���`L���'b�G3�	S]���k���p�K��9/�>a���
j��'f
z��K������:b�b�P�&ZC�B�����:M���kt.N��2e��W��W�h[�;\��:�����~a+�w�O�(��`�F�a|�
�]�'����A_p�+V��e��t��~���0�zK�M��d0�7,��eY��e��T�p�"�m�-t>�4��X���u��Ws�10��,�]�m��y�`���M6wf
z0Sr���v��#�����g[4p9,wpe��"�K1�^�1'�������G�����w?�{kk.\sA��-���$������q���f���pG*�s9����K7��?�)����a%��p�P�J��=��5Q���h�������|����]�V��~z���e�0c5�`�O�V�2�������K)z�;��:s�2�c YM������Ql����������,�B}�M��&���C��/�tab6��[9����������b��?/|>��]��u�;����`z5Xx���|��6�����/#��4Xx��\|T���o�����p�7U�_E{���T3?|"b�Jxj�2T���U�S���D7?}��R�H<��\��,���5�h��HRj>,~xG.�9���E�$6,����������G������up��^�
+�;\�J�
��.(�P�m��0�4\�ZZ�X��a����Z���y?�;K�1�M���r�	_�A�.��p�`�*hx��YL>0�
�2�N��vY�c�D�����+�[8����apt���nv��5A�V
�T	T�M0(/4\L�)]�����)-Wd����WAd�*���`w��=*��]���=a�HBj�/������b����tb.�����ba(���{��M;�����_���]5�n��OS��	�F����j�y�t��F��z��������Z��a�<��<IgM�����;=E�)r}j�J�"c���0�",��nu�!P��-�R��U�6>JI
�e��0�)�6�k������
������!��<N�����~����v�Yg�.�g����b���;
w{8�7
��������+|������V�!����#��������fM�b����9��5��������[�],��L=(�`y,�~��h�)4w��t�J�������p���?���I]��)v��+�s�q8���K
� ���U��{�?;
Md����[��p��c�;{�<���6@���b������:|b�a�a/�XVq)��O]r���X���L�hx��XV��aS2�t��`4#+u��>
����2;</�d���^�������[�l�H,�p����\	��~�{@G��og��-��Bk�����G�������A���
u��y��q8�
/5�)l���:����w6��@R4��,������I����~��~�VZ�]yf�h~�{=hx���,f���b+/<+��5���R,�[�|�lW�*4w=�J?L+-:[�����K�fh
{�=2\�����7��4[0�?�4?p�{�� D!�#��[Ow����D� !�\����:������sa�c���v�DC]�XX|+�����v��a�,�~`�4�J7{�N)����~��@NjVsg��9����y#��#ZlNz~g7���GS=vR��VM���E�,�;}��Uyy�b)�0
(LF�H����n�I)�r��c����E�SK<r�4��m�������VJ��X�!#5k���X���vD|����F�V�4U�V��Y?p��6>oN�b��bs���6��~��Z��{��U�p�T�OL,->��6�9�^���t�KV������K&6]��.<�b�������M0��hx\��.��H��_q!����aBj�7����i?]��	�/34�tid���	�1_�9���V+.����p%��&��Ca��-,kl�������S}�A}wm�&���e�,��U���jO����r�F:�a��s�W3A����`;,_�f1��X��.4g=�B�����Zqij/�#��/����t���:��;�A/�#
v�����:���f�x;��4���05tn.?
�/\�H�����B�����BWVV;?L�l�Rvh����A�pf�X���
�������s,����yd�	�q����J��N�)
�}�s��wv��7]�l���R��I�E�J�����]����f�C���]:(�;�A/&���p�}�����
�����\��q�(P��-b��t�dX_�h�u/���hR�V���B�GL��!9Oaea������7,h?�$���(�X�%����JvY?��M>j��"/t�d-��T[�i�W���t���/���F]y#�F�0������N��*�f�y��1S���'��6��
]X�[
���'|y���S:�4E��t�=A_L	�Xu���g���z�O���>	�[UyG;���"A��.q0�fy\�[�?Z:��*���`�K4�^�1�����*�N��p��"�Y������!6�Sd��K���pz����E���U<a��U:�I}�zk���^p�6�Y�?VCC���
�B�J��/fp ��2����[AX,,M)i\��	6Nu�"G�0A����B0�\8���V����Age�w�#v�j]3\�,�
��5��$,E��R��
��O;	�5�^����Vt��6u�|[��F��~�6<oy~n����s�	k��~S�|g��Z,<�V�E��`��=V��o��_�����'��o�4.7L���;�wW�X�w?L�-z����p����>�
�����m���eW�.�<�����:r����a����0��1�)�r��:b�j���X^#���:��QRp���=x�J���Xt�
��������:��^D_p�l~h��Yu�MGPP�4�*m9B�]�E�"��S��!}4�� ^�~+Z��W:l
��[����������U�n,� v��Xx���B������*����������S�N��|��� z�Fn�������������b���4���+�!"/�`{�T����q>,Xl},:[�
lA�2l:����S�	�f�i��t���
����V]	������A���m'�;�R��R�/�'�)
� ���������5�������g}����i�X/<�����	��J�a��`uI�a��Gf��b�_;	�ao�`����,����]���t��VM�_f;Z�;����t(�zjM3������������q�����n��U�4����������������:��X��������K�����{qb's'��e_�k�o���B���S���,���h���J[r���~����!3���~��Z�D_0����l�rP,
�������~���hV[)����l����qY���-������
�wb�Q�b�R[�B�h���L��
����&��W��wJ�f]��6��V����aM���W�;�N�9b����*%X�1q/|$�Y���5�"���:bUp�'��{z,�5��u��f�FB�VE�]I�[��k�>��Jx�12���wG
��Q���4q%�9�u��^��-��7It�������[���V���8Z8����4�?�LZ(��\�F�K�`\������9$��������FNi���:���Y�0� �8�|��
�����A�p�ln\��fo��6N�Z��aA��fTt��=4{��Lt�m��B��������q�]�s�P&:,��;�x�>&���4n���n�A+��O&:
��3�}e��#��Y���Yh]�p���?�`���w�������9�M�M�`����`����B|h��`m���W�Ol�5K�p��p���w�]2pVo�Tki����wl��������M�����R�wA=l�\Ap�<�<�'!�n�fX���*���������E7\���^8�lXN�G�[!h}8<oZ��Y����3XZ��k.HB����&�pS��|�.�
����T�i�0��x�����<�0����M0{����f�\zf�1��h�^{tt/goX������[X[[h?X+�h�2��2:�
��a)�`Rz���+�F�b�.�����hC'��������.-��S��i�=�,���p���Y������m:�bNz�y��;{������w�Ra'����A�p�l�z0���[&��u������:z����a.�,w���Ca��	����GVyXXl���>�{/�n��Q.�J)������*�G,�0�!�:���'`�&��XhI;l��{��.�AV��{��Yx����B������8��0�`�c��>Dq�c���4�t����x5Z�/��&[:�i�Ja���P{#�v�K��������|��B�a�a�7m��R�qf�.�
�L6S�T���������7a�u#�n�A\[Z�
_:���s��{@AA�����}����p�)�|�"��3hZ[lc�'�kR�����p���?E��g���J����	�o�5W�-0^����`�q��>�s{�i0�"0�t��:
����.�p�Yh�C��9:��4�b`�hV������|m��8����M���:����K���'v�Y@�jO�����O
6��[�s6W�9U�����8l5���^�t{U�FvK����j1�����`jm�0����`�=rZ��{����;��-u�Yi=`�]�
����.$>���g���`w�X��+nk��R���*�������-.��.��.)�����J������g%�g_�����i
F�����0y2a��+U����<zfDw7���M��s�����.�<���,��o�=[hR�6�f���x���Y�u�6���_D�S���������1�C�Jl=[����X�s��+���Egb���#p�
���E���?�F��
6�TN3�<C�Ru�g�A�f�����;�������\�E�	�Q��bW��l�[�� �
4��
�����t��p�����V/z����cx����}�q���N��i8OL�k��2��P�����{u��x�E�����^,�&�����6:�����1��6]X�'�����Q���������9��oU��
_W+b����p���(KkzT�j(6O�a�l����T4{�j\�ym�P�>����JH4�P
�4�OK^'�`3]HLNKO'�`�Y�#����`8m.���U���hbi��V�0c�����mu��<>�l�Tl�L�e�v	b+��E��!DtN�g��^,����G��[�-����w+�����f��%���c�*a�=��4}���V�[���6�1	��^��#�j��,V���t�L;|'s<�^0��x-��B���7��>tJ|��s��:jE��S�w�T:]��EV},:�A~�q�l��������i��^���t�F�"V�b}Eb7+����E�7����M�{�^#�F�4�
m���d��2����#P0o�h����}���:&��Im��L9 ���������v�od�.	����U����0�l>k�4E���k�x���!Cbs!��6O�����E�*,���[��w�M����>M���)
S��^����U��'�xd��6�K�n�����W�_��o���R~� G|��43'����'Xx@�XxX����%X;<a�.�/}i�s��0C�;���<��.z���,�:]�C>X��7��	�b����.����a����G@����[�;�z;Y+��s�bsM�'����N�p����)8��K
Kq�;N����:��O����p��(������n�a*���v����',�]0��k.���U�P�#Z&��F���:�e-��a/��
���jX��k���Sk{�V%O��*.����F�0,�����y��
��3#����q�5��"�i7�4����Y���o��R�@+�64O�u+���m$Di�,�Ezt�Ga%i�s~u}n��0v���L&�f?��ZX+]��[

	�|W��N�X��,���h�
.�i%u���8\��3����t�@zg��
��|�0X�*�'����>xQD�<Zb{���Z�	W�A7�+�[D����`sW�i���
t��a�F.�i/���,���������9bi����YuE�����,���-"ba:U�\��Xg����
'�5�@�
�
��u�Y��q������vV*�l���2RJj&�]$b{A�<������E�^@����i�a����)6g�O��x�<��.�����nK�\��Y�L�(����lnd8]���p�7�6K�{q����L�w�2�������PA1�U)���������W����(���f�+�t�H�V��H�8\|`��U#�����*�[���:��������t�r��li�p�li#�f�	�C���q5����;`�L�V�16a��EC5�����WC�w��xQ�[I���=��[4,�J_+���j�j]���������`o���fXn$�z�/���a9��DhM_c��<	�i@%1|��[���RZ�]��a�"�n>��+m�6�S���0������v�O�k�(.l��jU�p���9������0n�	gc�������`���l���n�8\��f��=���)]������	+���'�X���v4��6��K
fk��{�J���FPAg�U�����J���]yt��?�k{�w����dd�qW�U��s��B��0�����;{<%����D����
�����
|�l)'�����_,�.�E@B�W�,K��Y"Lleno�-������AlK����6_*��H�����	X�~K�<n�4���{zQ�'��4����/������Y�W�]8�c����$�����S;�y���X�'�m�{��i#���v/E_�{ny8����^�zs��.u�R��GG���T�<F�H��=���_���4��5�Lf�^x���Y� �|��e�<������m�m�e!}��8��O-;
��e��b�x�p/v�����D?k&?�����������Yx��|,�iz���hz�a����`I�e?�X���e�b����F���<*Lxh\	k�
{[��������m[82kY����/h���X���^p-��������,k���B�`�b�:�t��&X��h�i4KG���*�e{�b�~���fs�w�����m:�q��x>v��H��R�Mg�R���[,�\�.���@l�R�f��3�����/���I��4<2'n�����rD@���F_"�������c
�9�s�"G"L�(z��H�w���j���9���[Y�w������Gt��&lh_�~"���M
p��qL�X���b��?}�T���C4���X������`��}�����p�m=���c�m����M�3��u8k��p��l� p�GKCE���|7R�
����9�W�x�A���.\��/�
�@b;��{
��}����Eo�K��d��m�����8\�t�5x��L�;e�O��(��j��T���#��(��F���r�0����ao�`w%$�~�N�7�����'�z��������T�X�N���O���p��3���\�r��H�������V�
�wCO�������O�~K���
��9�p�������0D�����-�'�l�^���l�f��Ff��ba���;}�OS���Y�E�#�N�9 `)�w%��sf�2�n����bo��*�u%�d�uVw~�����vX����%���������B��Y���7U��n�q�����!���U���t��z���,�A'�s�f����N�@���F#��[YY����N�h�q(�"�^6C��h���y���=.��(�]J��$8
b�c����\6/�S&�1L6
m��Ym�A)�-m-^�Z,z�HF,,Z*-|�m<^0�7T�/U������kG�1L@�e���u���n0��i��\�%g����[_�i8��6 ������++q�3����8�F�C'��WP��g��Tf����8k.�
7����\��m<�u�A�r�@�)�b��t�p�Vl��:���fZ�O����#��N��6?���hY�aU^�p�9�Q)���
k�g3�����lT��!UG�8�|N�i8Gp�������������������4��`�����)�NX�J��z3���VFj�L��n�V�s�2C�+�>bi���J�����A��e_w��0C���x����m��u�KB%���ImY^p�.hx"���f�L��|��������PI*�Ju�U��v :9�N�9"����i
z�7�D����c���F�|f-�]0@_��	�=�����4.��������:��A�RZ���L�_�.�P�d��������Lt�}>
�H�HnU��K�p��t��T�5��itEW�W^V�.X�4<�`YIoS�G�{O�\	Dl������;����@#d���b���t�b�
HVYXl��[��.X���[m���!���2�V^"�b�wGZ���_u���w���m�+|g��gbsS�w�f_�m���8k���Y�Z�f;�b���,��;
�p������D_���l!K��Z�lcE4~��e������X��j����o[��YzJtV��{<|��� ��XD�`��U_x�B?���?w��`�'�7�|��|\��������^x����&��
�m+^7����GR�f�3���U1�������6����o'���t��
�wz���s��D_0���l}"�fI.�+��ju��H��,52�!Oh���������:�c5C�7|�jd>*�����S9�bY��=XQ���lr�TG|,�,:�N�9b��p�Sl��������OS�0�eJECO�Xx����~�����3,���-y�!��0�F����t�c���hXX.�����q"��WX�*:�����i��W������4�x;�����dK,��^o����1�����{c3��
3u��d����4���X����6���7n�6�����kZ�m/�f2]�W%l�]�-D7���H��vV�'��_�`������q\8���]r~8E����P�����G�����*�b��b���l��?M�c>���m��Y��K����?L�5���t��`�W�;�d���>�����4�0����Rl�]9��C>V1*z��������n���P��������3��+e�%��q���RlO1��R������]��^���:�cr\�7,z����.��n������p��O��+9���y���������K�d���`�ek�j����'A���d���)�{x3��h�,[(��vo��&��o�`{e�l0�2��0�����`��t�����c��Xt>����>X�F[8�~[\����E SxYZ ���?�&?g7�V�}��c~�����mL�����hNli����MgU�*��f�L�'Q��
�rW��lZ.
��D���p����o��m~ga��V��-��Ko���z���^,$�f�eb{%��]z3��h�~�}�S��R���
c��� fz����~G��K;Z4.\�k���i�B������)l�7��y^Os�����N��0�u��0(Q3���+j]2L��-m�~��\��'��hd���o������k����[Z4�����g-����Gu�"�|�%�k��m?4]Q���C;p|X>jAJ�-��p�D����;
�@���;�������0��kf�KMV�����������Q,
���f��qe��>��|���1�bi�a�I|�K�l��e<T{+t���J���1��d�����{���;=v���kb��/9E��r�����9�b�!+f�2WlOv��9�a"l��������I/D�p_#4��f�|����7k�w&��U]��J���y��q�b*[�7�,��`*F,�1:+��6%oXWt�;K�5.Sw��R��i�����i�R�7l�v���.NS�P�������l�Q����O5V~h��_Qtg�L�� �
���Z��/9'�O���v���'pq#S�7�x�-L�/f"6M�f;^��K�E{�v)�+maVRCU��\�w�Q�Q���s�?�`EE�t��H����u�����o��
�'�t���`�4�{���`�n���������:M��6��������*Xx���Rm�w�V|n�ec�~N�-��6�o<�8������*�������������p�'�/e��T����.��!�����Bk*d
w�EG�e���%��K\��F4X���a+;�io�9t�e@[]h�/��lj����]8(j[���[t��,�n�����
��&z+~�����������^pWC��J�6�o�T���x�0���h>le�kQ�����i�!Q:�]�|��t��$���g{��X���`��6��R���T��b��e}���o���l�I�`����!N�N��<������0�i��d������w��^<��<C$�2�zF�NT	g�������M��f[f�f�Q����{��?�y����4�]h���������&��#����`6o�g�1W��||���U�/5zQ���%��X�v3���O�;<���5�^��Y�B1;�K����I��?�O��(&2�N5{����Iq�����?4U��?M��}y���T8���D�E�=���z9�C�!�s��i8�O���4���c�����kD:��c~9�B�[4��3{�������������N���
-M��i4Em�!��YvN��\��^���4J3(5n�B���qQ���d}����"��iV��72���7�����i�L�~�NM�?3ik+_m��H�oz}�2�z��"����_�E3g��h�4E����i�5���*����dj!��j��E��K���G���o:�}g��������."����`'|���S�p�M�m0��@u"fgJ��.�!�a��������Dk��	T�i�6�����,�:��6�����������v��0
�@�����������h?��
�	bQ��������-<��p�@4����y|�X�9	uX�])�z���Pf��pP,����j~�f��]�b�4�����tn����O.z_h�J��9jC�;���,+c0�O�;���6�7
s���\f��������p�H��Q��)���Z���:ZD����-���r��4�WLVx��6��y�TG|������M������#F���l��=M�MT�mz�u�D�������mM/T[kv�2�`/X"=��u��[���#>�Ct��F�p�d�t%��O����/��0;�vO�7�uHF��P�p,�A��	67�.�1����N�72�u{��j�
��<[��iw�Se���Z��w��?�q|����9���3 6��N��nb���VVx�Cf�d������4�iv!��iZ�)P�X����tw�#���h�j%��������������c}�C#���`���l����8^����J&{�4���%�Y��>�q�A�tG��f�g�;��0n��Z�8����rW�I�|����<�w�55��[��}�����x�t��l�����[�1z��\V������ba:=����������cv��H���:��P(��)��2����	�*|>�����=M���]/g�|G�W���r���t8s����{��G�y�J���(���Crd�2�`��F�l��������k��T��#<���@���42�����g����"��i�'�c+����\����94������lB�Q0�?t�E?��]Nfa�p���G0
����!�p�C��B<:J�c���x�0�:^�#�aa��Xo���f�1N��.�2���d�w%�=���i��S�l��m�^������h��5���W��X�� �=�[��D��Y4l������G�����}:��F��!��Jy���:B�\��t�L;;ar�����9��U���H�2�M�`}y�do�GOP0�S	�7FN_���:��_������m��[)�q�����;��������_��vD�a��c �
�]y�,�"0&�!��[?�����`�S������c t��i�1X7��������8��/v����E�|b��R��A!Y����r�Q}�c
����X+l���-G2�YUy>���d*I���v,^"�L���JP���������A��+{��:m�����R}>g���f{���P���Vw#{h���<['���-l�
����6���nz��co�`W%N�d�1�'l���7�H�r>X�FUy?�SL�/�w��`��|�	������:j��L��t��T���I,t�y���:J�+9��@�(7`S��p[�������pa��G3�'0�c�@�o�Z�a+n������n��&�����n(Z5���b��^���V���-�,;G����������I�����|,���e��L1{�M
���q�l��:��;������RC�1K�z��������������������	�B�_�Hi���6O/��x����y�l�������I�4���e������x�t����=����hc5�bG���������tnz8��,6���!Wc2����OG�m�+�������"��!e4�KV�\8E�v����.�����`;[��- q�l���� z0Q����:����\>��bM��8(��}L���f�
�.4|J{E���"E����ivL��r�-����sD?����A{r�m����n@)�?��#vZ��Y������mA��I�fweEbm?]�YM���z��r�-U����q�&��,(��}��E+Y	����������e�E�0��u��v������gEW�w6�_l�R4|�:��V]�H�,���e�oVK v��t��&���4��;`l�U��.V='��i<�L��
MRp�Rn���\l%]��.�'��")�P^�_L�/z�
��p���](�w�B��M�b6y���T/��/�j�^�m��}�bi��;��A��dE.�oV� ����^����~��y�
��42L������^p���DN���:3}��`�Qbv��#!�����Bl�+k���J�D�,j*�����aa�P_����
����8?�Pl���`�NK����pY������n�����R�y��>w*������{�"^�����f�O3���&���-�3�������*�/��(�L��m�?!v��6X��6Z�S:@M_���E�x�x~uG�0!�><�#W��?�;�%
��{WJ ����G^4tz��0g����H��r�Y����`Lk\:E��O���9��aw��m�4�c�2	&��d�q�.�!XA_�!�0�Q@��{�r�N���U�X���V��(��8�����W���X����lb'�)[9B��+���Mk�52���Z�������L������z��in�o��&6���.�v��������u�X��h�v�O��R����A�
/6�^N��/�t������L��]�p\V_�{T4-e�&���������d��	�b��+���B4������K���I�E���eq0��n��Ol�����?f����Bs�e���CA��^���LMWba�x�������������R�`G���o3��pKE,��'�~go��S��O�X|�n���zEO��ES8���v��&z�w�F�4�Ye��i�_���!�p�/cqA|�:�=`D������bW�����~��.���_p�S�`�d
6�����A�t%���|��J�`Y���p�v�b�a����/��:�t���`�g�4�3�?'����`s��i�{1u��
Kr��*q����_V>AV�^�j0���:
��v�=��lc2L��_/XZ�l�a���������pSX����?�������A"C^]t�M`���9�>����
���}���M�3��0
#��D�J6������l��<<
�o�2�`,K	��lxX���	B�`P�����tPK[���kZ����FW���i�/�������a$+�/lvW����`�>h�����MZKx/f#�������|.mi�hX7!ffe����`��L���������]���R������c�/m/�0&~��k��wv�<��6-��="/ijd����c�J����y��q��`�R�pNh�Ej;,���������=��};�	r�H��:(��p���7����"�v���p]4��:Y���_.�)�2�����(�p�_l�{[Y
w�D���]�bo;���2���,OV���f�{v�]v�����,���R�w���S���Z�-$nOo&<����Z�mYj�e�8����o�GoV#n��K/��K�?+��p6���j}��"��`Z���nm)�9K=Z������0�,���Yn��^�+��t<���M37���6����nOs%���"&��7?n+@o��(z�/O��u��m�gwL����O���7S���2��p�8��\��$h+���Xw����Z�v�f�����^lL,,#�w�N��8��#���#WV����X$����m�'����/B�5Nlni��
n@s��q��Z��`�P���7+����Nlag���f�G�+����sD�4�����;��*�V>��x�0�$~�U���|���6��A��m�
������?�?U����6g�6T�(��o{<o��%v������J��Aw�q0���V�a���a_P�\����X�-�';���mb��;�V��6��dP�4�.��}����:NX�/�N������,9&�>�GfUmb'�[[iz�-����R�
sK��B��mQ��D��kC�af<�wq���`�r��|N�	8��� _W
�2Z���C�������%z�
���Z(������t�!�-o��$z�
,�F��vXX��OX�Y�|��Iw���d-�f��H:O�	v�E�������>�;m@|��
Jb7+�;������;NeQ��]�&��!6�xNS���OE/��,����<<��ck��"���a�I�6�f�����iz���YW��6c_�p��m��M_}��q�*7(v|����7���" �\y��2
�ix��\ee�b�7�p�v����o���Z8���s��k���/$�K4n�,�n��|�>��b����k�t��c�7Ut�E'�R�a�)l*]�����fv���_�� ���$�	�s���7�x���n��H�nz��1�O`a��g{�l������W�k
��GJ8���7W��.�mf���U��g����j]+����0��rfH��e`�N������okbo&���1���a�I�!G{h���q�T�aF.�^8���&��qk��$*��)T����K.L��	�;���/�	��P� �n�*�5�m�9��o]B��������T&v�{�����S���dI�W�Y��'�q����&����A�,�T�)\;\�U�Y��m8�^�m�Kt����I[bs���"$����N�m�q�������U,%�b���y�6Pib+�c�^o� ��OB�DeaC��X�=4<�X,�u����w�������ESf�3m�}`|�*�~[l{��U�ia��a�A���i\�H��jN��h�HZ���F?I��T8������~���u�����n"�x������C]9�����w��$.���*T�0�v�U�X�Eh�o�/����=�s,,e����`��'�pas�2���=+mKV��L�+z�$�XX��t�0��3�������:X�Y��g�2z�<|�|y��^�����>0��y� ��m�aMu�fNe���K69~�����9zb�a�L�)��-�Vv-���!�
�4������Z|��L�P(o�r��`���0�6r�T1��7h���w��n��
[.e���w���3oES�]��w��bj����2���[NfZ����[�w��Iqa�AlJ}����Tz���xa�l��nN��(�B�M[����6��q8���7�.������0{�W����/M��a��ED[�h���f)ncR\����4�������,h6�2.:����}���#z������}�E��YlK��������,���$45��.���������w��U���U�=Y��jm,�"z��P�;>�K��T���u>j���5�A�,k�;H�����*��3{n{8���i��.�b_u��5X�,�L�����-���|g����J�U��E���\:���D���X�~�F���#���%��47�e�K=�3�"9��^(�n���#�,�%v����-�7�e�	�����{2�Y/�XBC4�{;S+��RO������0�������U'o�����p�����fUk��%m<|5���m �mp�l���z���E/�-'v!�*��7KbS��n��Al��Y�D��o�V�G�%�0mg�uz�e��B'+�������0�':W������N��]-b+�i����J�D����l���.��u�m��g�j�����W������.��Vh��6V'���� ����� #��j������|v,����f��D�A����o�,��)����YbZ�D[(nn�6�k:/|
,�B�c��&��a"v���iz�YgB\��������d��m�gA4�~��"1X�� �o�R�������4��`�~P��>EjE��x9��4���DI4l����Kl^�n�Q�TUN�Am�AX<K,,��5W�b��06�+����?�~����^���kyp�QQ��9��f��~�F����
��_xr���4Gba���U����WA7���m����pw�^�o�����t�t�f�l���X����~gg���f�lcjY��"�#�q�u�����"\Y}N^h6�6fx=�G$�|���R���/|��XZ3l�5r�n���:���	r�]G �?���>B��z�z������TE|��u��~��/�t�im0���)��
�"*�UR+V�6X�4��m�s%v���~Da�N�+�p.���tv�B�:��������4�c`8tcm�b�a(�*��|��&�l������,�l�!�n�������.c1|f1�l�o�����6���O�N������\)F�v��%�h��(��'?�^4�P	7G+�l6%7fJ�a��P�5{�e,.���l,nL�&�&=r���l;�<|.b\���&����k%7����\�b;S�����`w���������e�n�H�Z�O��8��FD�������5��`�hV%7�J6M�@�%e_�`[���x�������VZXZ����P4���e*K������4C��s4�[���Tb��RiAsc�f�#U���s(�^2��n6�%�������+;�6�,�����
?������������>l�V?}g�9��y�
�f{�L��W��ngH��bi���-8����
n��`�J���=�Y��`I"^X�$0,����'X��)�{�]�@��,��3��}/|��<E�������`�)t���`'�>M��;��fA�|���K��_�6�1s�ha.��"��af:�
w��Vc�,��D��ap�t�gac����#���n�0�h����J����)	����9]u����b(��}��#������q�"��;/���nv7��
��
�J�Ku�������b+&�f0-s]��������o������������F4nj9M�C���+q���
&�^�x;����Zw~��x����^���!x���4���4:[������'L��aAl����d����*�^0�qaD,��I]�r�.��WQ��A����0��q+��'�ht��f[r�;R���8����"s7��V��6-����������|�j�>E�BJ���?E��������2L,�Ex\&~��A��O��;M�����4+���R}u����Wtg9$�����V�+�^j�s#�e���e����?�e�]�K}=��4����GZtg��b'�{[�-�$�bDCk�Y��,�fm;bw�a��hz���y�,�G��_�^@��6C�f�b+gt+�;}x�#�=?����la!z�#��gX-:���p���X�.��t��s$�q�H�A��f�6�K�G5�-t u[�;K���}���d�{
w��V��U����E��V=
��
�%��
�#A��c����TG�0�%v���Xx�����������+����eDO�����v�i�k.�#�K��B4������,d6�U�P�"�fI8���V,����[��)rD�vEO�<&n���]��0A�&�.����bY#�����Nw� ���M��9�.I�������b�� ��vaw�
.�*vWb6��;Z�f��B;�j3K�e:����
[�EO��1��K�^�R���(>�l�=M�CEV�":��|g��:���&�X���3C���az����.jS�N��&�%J�+^�����4�����D��Ju�	F�2;�
W,�p�X�����������������EC��X�K���v�
�O�sZ��p��+�������^�#�����I��������O�����%�w3��G.]�C6��\��C��;Qa�7�����%��7%�fU��pTv���!���`��(�gHm��
��^��l��'+�����V��B���j?w��/���A�q����!��*��� ����M���}�S�pZ;���u�!@�.��,�i8G@L�$�T�evg"l��:����,��h������-M7
��w��d�g%�t�����+��h�9���X���G�|We�e�vg*c�L�����Ol>��t�b��[��������������+�F�ow� :w���W����f.����T����5�
w m'�����05/�>xO�-g+tgVh��c�;KKO��0g�4gW%�l5t���0ml%�k)tg�
��,Z�}��t����M<���/��ON6k����<�QOU��b;s���,������]dI��q��|N��PZAOX�<���S$�2�m��T�Z����Y�b����G�&D�-�_�
����aH��=A
���8��b {�s3���lG�+�v3��t������\���s���H��wC%���,��;Lk=��u�:�`���b�I�7��������R��=M�S1�h�)�
g7���/N���	��EK�^g�Z�j�O�9��As��1���p�G�m� �f��g�;�#����6a�N�8�������A��4�����-8E��)��a�]�tA��^ZK,y/��J����RD���!������yg�,����y�s���{W�-6��5P��tw��DRW��]�����>D���5x���%+��Y2�����Mi���:�K����\:�i���^�����~;�4��`�J����p�`��
������Ku�����{
�O�9��o�5����h���K$6���]�U�k:l��-Ao�$L.��vk����e��v���L�ECMV��&�;{����x�����g�s��!L
K���g�������2B��������/�����m/�.��&�t�3�����,��6�9���p�Z�;�?w��T	���D������~��0
v����R0�\�����)�A�B.B�M����4��EX�*Vi�s\��������V=�awQ�|+d;��C X�t������D���l���']��B��c��������|�a�]�+�����+6KNSt{���_4�(��i��t���
g�E��"�}d	=���	���4E�S�������_X�*zj��w�������Q��c��r?�sk�w������Ql����hy��_$������CN�|�����Kx��V�B�����8bgA��X�+0�
w���~g��	��v�@�t�FX�,�f���b��3��:H���V0
C�`Y�I�_D����4C�X��h�6��lm*f
��o�d��&��Z����^����Z�|h���T�[��f~X�h��	�{j����a=g�s��i8"�Sy��l�w�U�
���H�]8L��[��o��Y����e������i�3<�ItT}g�uC,,E{;��B
�c!�	��T�4��	V�(�r��c����h���i8��W5hh�[��},�����{p1�c/F+���O3�/33�n0Ol>��t��6�-G�Y������+���n�1\p���������3�~N��;\��K<���u0��kN��)���a}��7�N���`/���5[	
��}X%�c;,{K������!��i�x
_sz)���A�k��Y_,
14.�~z\�R��B����������bs���6l��f�
���JE������w\�"���):'�O�9b�y���3;p���U8M�����o��X���I��
T����l��w�a�a�.�/��y+\3��E[|�w���������+�+;�����p���.|���W�&�%-�,^-~�T4&a��Xh���_�������i����pQ
�z9�6�k�K����V���;�d}�[����<�a��a�XZS,<�WliW��c�}�#XX.���Q�}X%�������a~g�
����0�6rN����9E�)�}��"��5]I?�<L��n�zD������O�9�`&D�����a���'��<��������O��|G]iey�~`�hX�'n��[\���{�av�pSB��_��yV����@�J�iz�����e���5j��<��6���
74���%X����p�qSv�4���2��h�%��F�`����U��*rP������+P�n��pQ"mq!Ka��#��a��X�(t���n&L��u���u����n�*$������cl��@����d���fT�-Z~`�\�
fT���K�q��&�J��M�|�=�~��/M��+u������J���������`oX7^j������e�4��,��e�c��|[��n�L�����������*A,x�����a�b',����v�p�-?L�,:+�O�9�`�.�t�m����C��g!���W�4E��`��y�F.��-Z��f����Y�o��;\J�����,3G��|��w�U��V4?��t>�0�	W����@7\p?�J?p�l*��Q�00����O;�s+�":����u�R�R���1��������S�V�e���,����.����R�b����]�����~`���0�������X����8\��T�M-;~�n�h�fv�,N����K����X��0?����m�M���l��������ig�Y�&�U��n��|�
���Z:���$�^E�c_�����i�,�pS4�^���e�a�e��G8�,>����v]2��[��[��������3v�1���Vy,�}`�-	oE
e�.���
�s���pa	���0���J����u������4��X9t���VZ��Zah��9]�?��;)������}����?��9t���B���������^��a�H#�6j��6�O���$�D��hq��X��v�,�V�S�M��ff�����(��ID����ekg��
��{��FL��IK���������E�?�i��������28
�<�C�x��dRG��R�/#�;SE���Z�L5���||��$z�)��Y��,{��,�!6o���wxz����?e����,�,�������4����h��~O<����
mI����6:D�&��lc���e��f��a��-l^tgmXb����Y���U��m���a]r>���p�������}?�l�!v2����e��<X��h��.6�f�.�A�h�lLlOw�Ku��|�ga7jX ��E_,ki�eK����t��`0r)(�SY$f��JM#l�E4����w���52iC��-l�[�\0�.��@�/mP4:����5������E7��YY�5-:O�P��,D�*�v�9$v�
T�[�b��\R��[��4�C��
��@aBX��K�����*�O��(���M��x�������5WRi�_�u��m��f{bb'����f5�b���]�rvi��q��>��2���E_�1nJ�����&���\1q��\���N���R�����6[�[�
��XE��]P:
��|v���?����y����������0��RaIfi��J��`�f�����.����i�%X(��=[���Y���W����s�I��^3?+�sm�����
�|�j8EO1Ib����F����3�����p9�B�n#�������������Q�]���Uz���h��
�>J���h�f�>���XG��U���\�����b��^D�4��q��J��(���E�#��^�g-Es%�iE��+)�Y�����_bY���l�;��# ��'���l9��f��)�2,�v������5��0��0$	v2���;UE�����|M�	�,�<w���F��?u�qv���1L�S9�izz����'�E�	&5.k���
�V�����h<��)�q�T�|�<�[eoM�i!w�T�@�f-z0��X��6�^���S������:��?��{��rX�=`��%���,]jh\X��f-����CyX>`ZF�n�����y���6'|$�[�i���j�����;����T����J����K���F�qX��E_�nf�q*����*��~X��
� ���U�&�u���t���4
 7��e���b��
O�=�_�;�=,�=�������T���=`�v�^YH?��
���KU�vR�����i8�"L#*��H��?]�cX�4��t��������+�avR�0=��8XZz��.�2������Ba��L^W
�H���
3�p��}�������H%$��z0���.�d������{g+�`Vj�
n��u/�K����h
��e��&�C���z�YG{�^�"��V4�m�e��P��,
N��o�ivz�����p�+m��.�a���
�B4rZ��.�a���K.��]��"�F�����
��|��iz���X��6u�)��D�Y�����L�N��T�S�J{��Y���Z�h��^�$k��8����|���@#��)����n
�B�[��av��P�4m%	v�M9�a�N��f�oO�iz�����/������fN��l�<��R��\4��v�@>�
�K���7�LC}�5V��Ut�RG���,:�7~g7���U�����s;���K���{��R��z��,\s�����.Te��[S'+�'[O�Y��;�,8Y�w���y)���aW���KQ*|f���@������8�~9��;�+�[V�81A�l���'�����t�!#}E�d#�`v�a3<�����[8�p�?`�&.���`�C��\2�T[�����/����a��UxA����p������>;�V\G�SC_��#F4�[
3~�i�x�!1�E4\�����b�V�[8�gX�?�SV	���u�]!)m��������6�`��b�����B�dZ(��>
'z���XX,6���n��m��h�$��{������0me��6��l�*6�?���y��_D4|�Z�8�i��d?g��^��Vp�z���i��d���^���6�OV�-z�HD����N�:}�(}1a���v��������}2[���������wZ��D_�'����z�	��Ao��[�T������h7}�����xDt+�>L��a�[4<�H,<�Blc�@fY6�o��G��qX�/�.��:m���z�|{�Z
�G�q����:�D/��+�)"�����R �	������u�}��<�����������}���b�eY��b*vl����I�;I$9{G�6�Of:7�r7bos������
vE�?��z���J�0���*<��DA�7�D2�Z�5���u��:VD/��)����6�Cq��	�]���W�����Vl/��Lk�'+��f@b�Fl������3���L�-�*�hMk��i����Y�,��=c��Vh&�VpOVI/���#��Q�����J�������E/f��w �j�dUc�;h��f�b�|Y���5,���`��6��4:��Y>�!�|L+:����@]���Xb�3Lk������+�;���n�AJ���-,��������!�
��b�.��	�`g*$:���TfY7�
�VD����j�D���w������qB�i���������|��#(}�c�0m�f�!.L��m*�W�T����Vt����|��N�+��O3��6|�M�|p�Ho�7���>�iw���p7>�I,T�����~�c�����!\�u�O�����|_�/�G���ae��]�M�"0��_��;
�x����0���s��M���������;�]�"pu"73"����]�U��N'|%�l�������a������u:��;TA�	
�~�b��P�?�
����S!�i8�0���4{l����F���n)�t��e��6]�CMk�'�J��I�`������$T&��'�V���|����Gg���NE���,���A44V��7�Y�L�,:����������8��S�����"c�_���ey��w���������RmY�LZ$:�����g���k�����J�EO��2tb��+j<.��h��tx�^���L������p�t�	`k��)_���
���C�7��j������m����4E�6��'�
RC���o`����^��)rL3���_�4�?�0������_h�����������j�iG�d�f�t70Xx�����6����������ba�o�������r�"P�
�,���n<ne_���	�����
�f�^�T�J�
o�r���8\DA0�)n\�aG�X��� \�vC�c
D�����n�0���-=�qa*Wfh�+(����<aw���?��*��',;��mA����|=�4� f]�b��w��U����J��x��tM���u3�6�Nf�
+��>��w!)-�������B[x�����`}�����;{�������h�6J��e�Fa.��W��w����m����+�Xb���l��v���5x1�,������j�|XN���p��0q+.���������%��V�*����G'lp0�$�n%��I7���m8�e� �����fm���p4h��h�1�.��%G�]�tMNZ�r��[��t����4�R������p�wLl�i��Hd&�gow���;M� �^����`�����+���K�[I_[�;��W��IK�\����;��Q^Z����m3�t�'`�z���"R���fq���t�c`�u�����j�|n���D/�{�:����_V�.� z���Zg�p�Ylc�4����dY��������k�
����4Kp��b��l�g�n��6��R����ba�Ulg�)��t��)z<E(�=X��������U���*.=n!_6�.f��������md60�
���]X�#�b�b'.kt+��`/V/��&��mZ��������fYG�XX=-���Zv�������
�k�/�

�b�
.����wJ����!K�����`���5���Qh�Z����>�����r�Ku�\��s	�i8���������L�U��~-��^n�P!o�4����ii�}��5����bsR�;K���ff�b�{�4����3��~��Pw��+^l'StgUnb���bY]��\�������u��,��YQ����_���� �1������Z��X��h����������Gl>@�4E��Yta~��C�KtO�9z�q����������B8k��b����(��X���v2���9V�9��a�^,�];`���o���qu����W�AoV=)����`��i�	�����E�J��d��Hh�U��^��T
�[��`G�������EE,]���7d5n� �eI2�
��X����A���bx��h��aA�`
{\��i�b�eY���Hi��4��6��+�����|�n�Zv�m��9����opq�^+�N����������z��~nY��X�h��67��.�A�m|����{w�T+xk�ZV�bJ���
8�{�����j/O��@�3�Y�X�K Ow�X��_W�����^�"C�J�Jw��XE7�K���;3�;UE�f���9H�,qb�/E�K����B�r���]�]UYG"�@4���:i�f�0H�5&��L�w�{,����S]];h�'�1,�V�����ba�Kh���^ZE4<M�#���y����^�KFl�4�e��b]�a�_���l��5��@(���<M�c6w
=�b����Rw�<}�02
�����vI�����:^����U���L���#5!���&�:]�?�0���E_Y:�N�|{��&��l��Z�O�9��Kv�a4�������
Ky�����8K4�
��!�PCW��lK2<1Stc�!�4���.<�6,C��S�ba��.�u�l:^p�7�M����9O���+3����`�LL�M�q�?��H;���u8�����}
� $��[���	����4k-I2\>I

���v��)tA7�,v^0�t>�;K+a�-��-�^p�.�����YnD��H�^pNc�p���^����0��U�.X�+�3|#��+�vV3/X�(E2�����>�]�\`�e���!������w���k5W�:D����
4��j��D��V��mu��|NA*g�����fI�9�;<���>fJD�/�)l|��������E�;O�9h�i���	Mb}�&o��
4��H��W���"}I;���N;��Ku�I?��0���M�F�A���O�9����K���vM{�=27�}�M�a�+�
�C�������^g�?t��s��pD��#�&DW\3���|�7,��#�����3�4���3�������"���k��o���T(���y���:��5�������e+f2V�t?"X���k.��lI��_A�p�p���,mI.��I^L�l���n���?�
���9����dy1���d�in��
���]4/�N:�v������wy���N9�a%���!��o�iv|1?����4r�:9]�7f��a�>X���UW�QFT��9^���AO���&���|g{��<��CM��
59;�$����{��WO3�h�����[�7��������m���C~Ntc�����������R�����:M���E���J���eD�3U���SF������Zh������w&�<.������u�����;�-��u��_��J��v�E����;UE�.�g=�=,�7KD��	���q7�����'�u����E����]X�n��Y@�+��O��}���M]�e��z33�h�)3���V��>j>n>�4��'�SZt���s<�Z������sL�r�����w�b��b���V�I�7����Ba�K�f��b�Ts�!���D% ��y39�h����+����>�`H��p�@���h�O#t��E�c��{�x��b�6=�7=�\�{�T��7��6
��[[J�7������7E��n�Y)��}��`��[�u�6�n��o����m��0R����V��f{���n��u��}%��i8#�{N�^�>	*;<.+�;�Q������Eg��i8����iV�m�>	�"��,t�{���:M�c�aa�u��'�p),�m�~KO�Vz$��<�L�4��6����J���5o��~����^����������G���f���R���H�6��:�J�.�Q�+������0��4����M�P�k����`�9X(e�R��BS��9x3;�hX�'�������v�M}��+�&��������m:�dm��Y���|���J�1	�h��!v��*�W��{[:��tXt��`[�w��
'�Mj�w�/8]�����v.���:��g��?�U�o��e����^`�
B��
�w�����Y����rO�����a�P�M�`�Xbx���+��a��)'��`j����i3����n�VI��X\���LW4�BB�z��OUvJL�Wt�oyTH���4U���4��0-I�&������Sw�����#a��`�Z��5�uZ]"L�H4��,vR���������L�W4,Y;�� ��B����f:��;��K��4��t��.������9����'�J/�mM��4mE_�)��oO�R���:6��������x��t���U���R��:���.�n0xv�!�d�����Y�~���*�����~`�@����������c~+�����$`�j���@��05���v�����Lm�[�D|�76XZu,M\{��_Y"�0�t)��*��Q��\9q�F�4
s0I��O$��UR�{%G�iymP�*N���)_���a�0ew��������E�#�4�m ��7[���V��Y�A�������	��������6-,x]i��j�=�EgC��B�|�f����_�wvTR���a6V�SxK+S4������jv�.�0h&�.o�p\�^������12�>��/��B:X��$�[��Z$v3�#���'�U���5�����D6F`�X��Rid�W�� ���i[�j/��`����Tm�0�����^�}Y5u3a��rZZ5uC�`]\c�W��4����^Xqu�wUZ��lCz�0O$���qiNg���8-�
�}��O��(�^��/�������^7����M"�4�+X���]l���+�5nio�+G�~`��R-|&;a���J4���z��1�����ei���C=q����>��u�K)pyq�g���l��H�r�$��mN��6�V����e���fEOXO%�VX������BR��v�W��Y[av3�Y�Oz��p6c`m�i�U�v�<l4=-�M/�5K�Z	����J����S)���lVg�8��V���}��)XZ����.U�%����mE7W�ZxoK�n��N���<-��B����h�X�=�44�%1K�������
��]s�l	��� ��f���Z.m[����w7��O��g:��������T/O���iVibv�R��Y������Il/�(:j4]�O��(��{��F�@�:��2������9m��%��D�%�z^��a6�q:M��T�!b�%O�i������U�2���a�g��O	���J�N�mGNW�����I�j�;r���(2hv"���=������[���x�'��2=�������)f���s.����W�c:��|g'4	%��m���e?��$�a�Bq�_6��NS����SM����{���'�`����Va��-�'.(���D5�f�����k�l�^G���@�����3�R��jk��Lw��0����^H;�lC����F����$3�}������������l�>S�������BZ��/��e�	���n_
���M��������-��{��6dP���7i����1�?<o��j��P�������
���yvzL�^�0�4�~��"a�_����[}�w���s��^�v[��]�e���2��90���1�F3F�oBx��a��9O8�l��p�i��aj~W~x�u���}��6��������i�RkQz���������[����G`����2�,�W��?=�M>�oa�A�fG:zOS���
�M�n�
U��e�3f���i�l���T�t�IS���e�������o��������h�#�����F����&��i�l-�a�����~/���m(��4��7�j��������{��`�:����@�����������LC�Y�H�.T�f��Q��/e��D�����1{��O��#j�VLq���5���b�~�WDB�l��?-�-T/z!����a�<�e�����%�eC��&�P��w%�TpO��t��[���V�f��"�����W�Ck��N����j��V�iBA3�9�4�F��(�����a�[1��
\��D4�O���o�zK8=��T�\o��^b���mi���iQ,��1�Z���� �m{ID����w���e���s�^i��^�.��������f����d�����G������^�r��6��4�J�m�(���.������$�Z���`giel}AW�4���|��7_��)m@!9�_���e���Jr�mC^U�����=i#��$M���ZH67�;,�c
F���r�(��~�`���qzLA��"��H�^s��])�zl��>h&����=!��d�c��Y����6��!t��^��z|l� 
p��������MP�c�c�-	[#�=�Y��;������F����S����+�����6w?-��>����8�H��p�w�IKtzL[}0G7h&Qiv�����
������G���w#������n���)MA?0�7�����$����0�8�,RrZ^��0-@R�H��,S�6Kw=q��8-��T�An�i����{�����i&�h����������"}����/|�;�kl����Kp�<U�����d�~��y����'_�
&�i�H��l�\��M/(�t.�>
g��]�XO["�:nn���wd���SC4g���z*�@�6�#4���$�Zzb+�:��4���7��eF���/���=�pK�����;,5}fKv���h_��-�@�4�(6��~g74�$J��'�`�	4=���d>U�j�	����u���`atLS�%NK�f�t���S}�2�N���A��`��z�gO���������M�o�����6E`�f��
��p��{�����%�������0���[�w��m1K5����^l)�y�"��z�0i�R�pu;��k��eq� �S
�����}��}@M���DL	��FN4.t9������T���A�#3P*�*���)��t�u��,�1I��j(=1]��%k���6��G7hx�
��i���|�f�)����]R�)���O�����4&Ew����	b�r�w67Q<-��%B����4��.����ty��_	����pYf��Kf*��6f��e9!b3�����8-o������	>f��l?��%%y�,GCl�?�������jCv��� �/�5���3�eb�)5����Ww�'fsi���7J��n0�s�z������@E7�#.���5�0*����h5]�tp�,E�P��,}L�&Alg��bg�>-���������e9BB/�����������L�YLO,L���D=1�xc�B���9���p�d�^@5����K�r�����������|����}B��b/7�����G!0w���:�����l�w�K���,�
M��,V��}��,�C�Vd�z?n�|�r+���q�W���p��X;	��Nu�F�fYSv��y���.����P��NUA�m=f]\ncqA\4�������>�����VkE!zB��)�_��Mh6u�f�l�jz���I\,�T4,��B������j�,'S(�+5,�������{:\,Bt.`���6�fs}a��(:-�M/�B4=���,����oT�be�l?A_[���N�r{���W�y4�[\���V�O��:��I�%��2=�N�9
�R��g����E_����=.�3@��D�l�����#����P�|�gl�#��uAB�Q���ra������N1���
.&Y&:;�N��te����WJA���wY���v�����*9�?��_��+� �0=&�
fu;�Nx�[Q����A�7���ba6�f](U�����E?������w����/V�.z3�E�������S��,d7X������aH#���P���������h���p��/$X&I#t�H.+�_0����4�MY�5r��Hl�N�is������;
�c^
�^0�Q����67>(��/����iy}����yk��vh�����c�X����L�C�K�-�����������b���U��
��_0bu�
X��Ht�����T����^DS��F�����
��E�J��u�/�>}K�~]�M��4U�p���Y��fi}g�2g��v��K�H�n8�`�,������tY�;gx.lx)	�Z��5�f��9���?-�m �X���L7Zl�XzZ��8�iym{1�����p�����T-X�{�N�������|���%�<�?�����i�l��wU�����l�c��	x������7,���7�F�0�'�'�N�k�
:���������D�:E�N�i����W�����(gI�Z'Z���g��,��q���(�k���/�� �ox�;�0.��J���6�MK4�2���t�'&xd��������*�sAw��l������XI�C�B���Z����&�������4�)���.���~��������:e�+��������Y1�~��:�w�`Kw?+_�h6�,�w����
��k~Y����R������`l:h�(#5kX��I�t�`s��i�l0�S�;���l0m��
�����f;*[���s�����R�����`'Lzf��+�O��cV{���������q��Z���g3}Z����r�������%I]���,+}�bUICC��z
����s:,���.�&
}��M&�,z���%EF�U��09BO\q�[V�
��S�O��&����&_��6����j{�	����k�\�)�o���X��7[;�(�6����K���`a
c�3��i�lO�
���-��,�M�$J
#���D��j��z�
O�`s�;{WT��J}�M�P.^l�b�fjs�����m0�rK������������AO(��N^��Tm��M}bas��0Q��{*"�|���`�bK�
~*�t�����8���z�}`�W��A�(5��������;��B�0��PU�,J
�)D7&Z+&��-��6�C7&-���, d��`�nV$#vD�������TO�
_����S,Tp�r��6v��K�Z2L��YB�����f���.��������!�,�)t������3U
��Q%NO��R�yz���������#����\�|z����S�������]pE�C��G�l�2�Y"�1�X������t�����.���n��mp'z��[�s�M���S�������/Q�n��o�.��d6�N�k���m��U����d��������VK[
g�>L�P�`��b+MV���+�
�������Tm{1�[���d�Y����5�,�I�.�@7�����Yr����bY}�X�Y��L���Z��1=:�������b7��$��9?��c�~pc�8���f
`X #�C�Y��P������*h�I]�H�B�����[TfU6<�6�&c��&�,�E�T�s�K>��z�KM��v�|&����Q�fa���	��m��fj}�-l��Qy��7��
�x]�����+�;���i�F,� J���h��b)}Y��(v$�iq}B��<�}u�MP~n�m,�Z�b�bs��i�>]�"%:����^	<.�sv����S��O#��Y���������"C���D�w�>�p�LV��b,��i�	���o+��g��n�g�~��l!-�YP�1A]���=
g�	�����@��.K�;*Y��6�
o	�����TmQ0E]���fi��4A/������%�������%�!��xEO��	�"m�,����>��	k������Uj`� F4��������Tj)����t5K����O�����NOi;���&�Pu�����!*%^�B�N�����}�R�e�-b;+%�Y!��Q��������8����N����&L���W�ocJ��4�;���[-������]``�.J���]��T�qzL�?0w&�
m�`;4��L7����}Z"�?LXt+��7+�6h�
���o3�t+��M��'�~]J`���|�)�@�����pa�F��T&K�f���hA�L�`i4X��^����`���G%�a9\Z�!I[�2��K����*���T�n�Y�A�Bs�fY��
ES��X��.q�$�yzL�"�����=j
_Z%����)f�X��1AR�4�����5,�����1K�B�E����3���6}i7����.S�Dl�c�
��/m��\��?m�ye;��MA�����b������;���f
����a��6�
/��^0l�eub�%��D���p=��p�42�Hc\�+v���Mv�iym�1=]�L�G��Y��n�Q�]��X����nE�C+l�v���>)9��D6r�G�9��;;���X�4`n��s� ���d�Ew���q]��[/����eO�������K�$��6�����
��R-�YzVKf������Ws�8,[�`�w�
&AJ>��4�|p�r�a�W���ln����^��,LE��1�45,�I�V2P����5Ej�0�{)l_"I�T^"�O0<t��?
gS�,��U}x��RJ3�V�/�a+	VZ�{edM��$F�$}[����Q����I�mk�z�6k47�S�d��� \uPc��^{��r��l)-�w6�lz�fjSz����w���&���������iZi6��@��T��m\,�N�-4}hxn���^��{��L�u�gij�W���������*�w���mU�a��7��B�����h�0.���Zf1���
���&*,�L��>����tK����v�<}�U��;{�z�=��'��Y���D�oa�`���J�F��:�4kp7��-���o	
�q+���u�;���+�O�]}#�s#��p��!�@4���.!��/�*����w�l�
7K����b��ah�i�%�;�^
E�.��&����J�����
�m]44��2�����Ub���S��ug�F�0��#�����N1�#��NK4�Dp��v���n�~*6��;=��c�o���F�
�;W9������Z!�L�C�J����Z
�*
K6��f�����������
�V����6�]ba[��B�bW2tO�k�����y5�-
�}��d�V��1�j�M�=rA�[E��2�P�H,�(������&��=Y*������^��j���Y����b'�X���������V���������wv�%��|{�)q�������D��c�qY�����e��8����v����[V;"6w)>��U�;��=��U,�F�8/���[��i�l�������+��eGf��lE0�[���'�PQ,L��$���1ml�K��Np�J���<��oS-�G�U�����	������u�5�U`�Vv�L�]4+i����a�xzJ�|,/\�d*Vb�e���h�y+�k{Z4Ag��w6p[H�����,�.z�A�E�#(o�P����n�}X
-f]�]�/,]����
:�`5�r����$vB#X�� �����l���7�YH������u!���������j(D�i=
g�������]�0#	����R������8
g[:M��p;�L:�A��
��t��-V��)��A�B�F��{��
+�����=aUx>l�nA���E/h
����b�Y(�%v�3���6'X���\�Z`��1�+�����>�/�z��U>���hX$)v��e�0��cq����1�Hf���X1��J]g��~��}��ar�o����t�FX�k
�ium�A�����&���i�����B�=l}*��6I��Ih��J��3�s��c!����E�,������`�2��88,���a�n%|�&�j���W,���@;U�������nc���ar�N���Lmz�����S��ca�����&�7�`��,6�������=`hR#�2*�P�s�x�4������)5�������`�,����a��������,������oU;��	�5.��*���nV�aQ�h�%�Q��M/����!����4i�Ql�?�~�)[�����M:<�,��L�l	6����Vt>�`�N�t%z\�Q��P�Vr����C�����V��f[��
�9��UN��m��:t]J�t��M��;Q���5��4��^���&�%�YL�|����8[�qs�����M��`tD�-t��nt����x������rP���7]������t�m�U�:g��������
���^�������GBg=D?��Rx�so�D1g�lnL|Z^������5�wF~4ix
��+�`79��D/�Ukd�r����Zb+m��+t�"T��J�f�7C���&���h�7yKR�V�����[���B��E~����:k7 �b��b7,�
v�	v�*�t���_u8��&.5dW�����h���F����ba;n�95���n���+4�����p�5�U�.�++R�5����d/�9C����a�;��,>M��,m�ZK7�������c���	�A�K�:,T}�t�a�M�Tj"��(�3�m�-:-�-��A4��	��r��)��������6	0�1�������?H��M��ium�A��h8�p�Am�`s;��S��b�D/(�l�Jba�J�(*q27��E����cFG��7��������(���:;T,Zwv��#�U�$�����h��-6'��j;�'�m\T�+����u����
����
��RsOOi+�Ml)�����y����-��a��������`wJ�?=��	�������x	���y�|������;����������:,�?���hX������,��<�B&�p����RD/�Ze��2[M�����j^!����	�YX�-v4��=n�B|�M��"�a[�GfWN��.�b+M��$@�O4l ���O�,�s����bW����p����8z��y�x��	�p���������������>������z�n$bY�Q(���%b+����3�B�d6���
�4����UU#y�m��+��Mx���Al��uX]�v��9������$�,,��NS�JF�i�l������}�.��=XF�X(?*�*H�7�u����!�Gf�P���>����f0 "��7�`������K�d������PDt���p�������O��q�������/xM��,v(�Z�
�
�m�h�{��/�#�����
�E�B��a��`����Z�~"����=v�%�=��0E���b7<���M=k�������&�
��b����~�?k�m��������^r�^�CF�mL�[,�I����F�=������u������D��Ve�I�N���}��By�p��}�M�x�cy��/7�(��[�On�@��M�����EP����e)
b/��G�,���O����R�K��B*���?T�
3��R3L���d�a�7g)����p���_�K
�"��8���������:�,���mW�%����Tb���7�%*V�|:3Q�K�;Y��g�J������*��Og�:@��Q�`s��w���	�"���A�%�������Ck���L^Ul�X��^���;��������s����T��:��J��L~G.L�3Lz@�l��>f�0�$�J��aA{(�)�zp������a��\y�l��"�pu����)���
��F��b���AC�>�Lz	��%Ri@�qd��O��)V�"L�_4����[�$"��aKa��p�������"Gw�0�
zY�B���%J}����!�	���������GA���`W��k5��~�����6������-�?�;NR�0����l����4-neq�3Wr�p�-)I�����4���������2�hx&�������+i~V���\E?0�/����E0������E�
�@/�����1&5W��|+V��(��*F+.O��&�(:W���%��A_�jJj���v��Z,|���_I��
.��8\{k6p�V��J�z�,����^���V��}�����Z�����[����D
�)Ps��-h��IZ�,����cc�i�����c������%������:�@�"J���
Q`�gM��)O����%`u����e�$�0r|VY��������
��]�q�����4�u�%:���>
��Lf��X�+�qx���0=x*�Vy�mL����K����L�[4-�
�l��*c�z�^���������d��Y1��K�_���)`_����D��j�����4�-m���y�Z��V��p��T��R�i�>q��7hz�
�(J����>���zU�����K����[�9�>������
�"�����>��T���k���,���<4]��e��	��P�)�
��M��i�>�����}<
���)-�����u������3�AV�%���.�`�|����>=��	&�(�&-]~w�x	zVd,<�}9��}���I����N�,vU^7K:\��0�,������wzL�����M�`aW(�&cK7<�4W<��KL/Y���L=��`La�����&)|Z^#��t���RsMB�0T/�-����L��<4���;�|i _@��k��eO�k�
OAoX`��a�b�������@�0�&uh��_}O�Y��l����{[��f� �,�$�*n+K�,B'v���P�43o���������m^]8\h��|�+�7��vOm@��r�������O����}����*�xL�s^l+���-[|�j3��)#4��:�tz�pa������;���g�f����+������eU��-��V��o����*z��{�\�����{��h��-v1KO,������xZ![1��]��oK�������w��������gO����Y��Bc�s�9���D6'X��h�^y[��4��b��0���U�P����Y��i�*��o���S�;�0_�����6��WZ�Cw�����M��,@l�5�m���3��	.�i$���}N�i�����^t7	������(��5j([y�l-2C�� �|[-��{��L�X]��\�}zJ[m�F
mb	�����y!�f����d�2�'����\����gR�y+�9���[4L���b'}�c�_�E�o���]G#Cw�g
��&�tZ"[���:�S������L��G����q�A��b���7��4�����,t-���:��*����J�DOx���J����-�d�c+��Uq[���&�����!�,Xl.D9<�u�o��Hg���2��P���Vb��h��5��b$��lk��h��E����`/V�x[�{�myg��!zA{Q,��;��N����~Z"�����_N����gB���,=���R<ni������E�T�u��+{0�T��>�=�X�_�UP����|3}g����,|gW���m]��e���t��d���nkR�R�-���h�
'��c����g����[�%�!�T�E�+U�@+���5����8\�10�*�E_�������Z�a�����~��~/�����
���4%��Bk���7}��V�|���II� �v[��\Ql�6�f
�@���(u��N�k��	K��+4y�=��~��c���&������t'X5�����7�0�)��aY���9��KdA���Z���%^5$J]��Y��y������x�;�l��S��bz��w%�����7�o
�N��\����74,��T�`����z|�z�����}1���gom�&�H���h������t���`'����`b���*@��J����o:��q\	-�m��+�-��Y��~[���WdlZ
�Vx�����������5����}A���������/�h��*ei��'5l&�"��g�����z��H����Y�=��NS��3{����H#�v[m��~�[K��,TW����l�F}Z"[^�Hx��Q8p��M������)�
���}J�;���������*���N�?���-k��D6���#��r�4�m�c)z�T�G���
w5,b���'�Y�[���I ��IO�>0Sp��Y�vx�	vZ����� �ix����dRbm����"�S�p��NU#�%j<8�^���-Z~3�r�Y��B�X,�?�mU����4�:�
`�m�r���+��`�}
R���i�M����*,�	z���#=e1�md��B[%H`}w(�*������[�w���
����h~�s���`[A���<U������+���$��S�+�C0K~/�I
�.Q�9�_��������{���f
}Cb+�G��g�����[��i8�10�Z��0�!Mzx��&=����Z�V�����M?��<�FB��
�	nb��A��p/V"NV����B�P[U,l$��
0\��3��#�n�6)�~�uGd�O������J��;�P8)h|�Fd��,��7=��Kg�a8K���c�\��P���{Ur�����ex�n�`;�2	6K����
�b�j����j�P���&�������$�d�T�0�/�Z����Le�D����v7kWp�m\�ha��0+��pC])���������k�X���_�N�k�	f��aL����jPp�Z���'�z�TN�����]�g���ly���!<+�?<�(�>V��SQt�z�����������l�8��h��Y=�B��ce�n�8\��We�����D�8�����j5�^��'��������N�wN�0��g�j}<�Bb�c%���EOv&�e7�,��QY���-H{=����c%���<���h��u��!������8sZ����/����cF���1����~��E������;������93���+����F+:�5���b�'��;`�O!I�q�(.:�@>
gk����{�����'�0t'v3�,��Ps�X�?k�|.�X����l{����7"�_a��%��
�C��R����V����W
����f�������h`��0�|���d���F*��
��V�;�?�� !�B��c!������p�>�%[��}*Me��%���A�+����l��@,��59��5����O�k��>f����:���]�f�Xiv���
����~��m���y�6?
���%��f��B�S��NO���n���
�4�+�v z�[i�,��(}������Y��a����
I���]�|�;���%���T�EC���
��W�@G2@��3�g����(Hw�%�e��b��ab�q�������`;������V�#�,�3F���;�9�
U����acB����d9���o����R�N�	��#C7tWG���V|]�w��tc��b��wvA�H�'�?oN�<-�-\�TzA�C����wv���Y���,trZ^[�,�Nt������TDw�!/��y,C�b�C�8��[I�������&�X������O\��[����x��0��|r*��j3��E��u�
v�KV��������8��?L^4l]$����������5}�����I��%��}*�rK�?L�_���4����O�J��\���V�3[�LRSt�u���Tvq���T������p��`R�d�����\��ZV�&��*dS�4<�9
�P�XU����[B�cJ�o�H�l
#������
�J����p��-/���`x3X����B�)�J��c	��7pi��=&�6�|�L�A�%�
C�A�jJw��0���D�0Zh���e�stD�+J����pme������6���}�;e���&+T=�a��G��]o5��������f&�l���"X�������F���<0�2h�K.v�tJuH�v���}��r%5�M�����^��&���Tm����G=������m����m,�e���6w)x�`Qy�6��p6a��Q��B�����a=`�O��03�,�xzLNt�o������4S[!Lt�4��V����JL����g��7��/����h�������s��o�M���J;z�uE���,��=�f]LIIl�HnX����0�a�
)�g����������A�`W%��R�9)��p���
MOS�9A�s���/.h�����J����hm=ajY���=�;b�������������;a���
D_�0
`2���a"p�t������T�iym1A��
���8Ke���o	�}_\+�?�������C��/t�},�@�����
�C�����{I�WV�f]�V�^�
���E_���H��i�6�`�Zj�0�^#���`����+��NKd�
&gI�^K��X�(1[�hm�11y�Y �;�)��������4h�<�:L%O�h�!L��?0�M4��������d����f�
e	�&�K�>�����$�E?LYY���)�{X?(	��Qb	�^������n��+��">=�m/��4��J�R���u��s�����j%���i��/�������3�����/�h���-���w%�fz�W�	m�`s �;;�O�p���\I6����$COw�����U>R��8��`��\���tMO������R�����t�]"E��4��9�<k���S^�i�./�bL3����, ��V$*�-x0�E�'�=X\�l*�8M�{������i�Si����<���
��.|m,@%v����������"Fb'��4K�L���q�.vZ������-"{nz8����c��b����<�����h�!*���hZH~2�����.���Y3���|K9,�e�'P�n�VlT���&������2�D��:��BTba��M���%�
�B����c;
g;����f���:���u����E�@���Ohs��gEW����'��
��2������������|Z}�{����$����9M�&S�=Yr���Lm��5���j.�j.�br�b74���t�O&�.�1�3��)j�e�b���;[(���d�L�]4L�2��@���/�UH�����>��iW7Ff:bYu���n����=�AC-K�P�QlN�9=��.�g�=t�K�*��[��
:y������w.��N.x��z>5�B��i�~��S4�zd&<,vB�O�X����^�����e�	���$LcV}'6��NOi��)A��Q��p6o���h��n��{�5<Vb\�U����������'���=�{LV"!�`��#H,�^�7A:NKd���R�/�0O+�O:�Y��l���@4KK����O���c���V����������dN��O������fz�baJ�X�����r����;a���i8��Y!�Up��X���������O��O�,
z
l�E��H����{���@�����$go�''v�w6��b��%����>>~h5��vx}g���a�Pl�R2l�0Y2�0�Z,�J���-l�F��+���>��^�����B%
��`
Y���^�$us���o�"��������Rxey�b7��x\x��X���2�����z���a�F���U�b/�	6� ��fL��2:�jd&�#6D4���s���<,�M��`+m����'Q�a��e����c��������{��8\���h�m}�k���c�^��hAoU6���SJ��1m�A3���z8-�N�^0�B�0kK��"S�f|I���4-�>�4Mq��^����'��
�����/��3!�
�U���� ��O&#zAcH���U�E�����Cn�;T,���#u��9�i���uib�
��E~G+�e�044�F2����Tmh��Q�9x�F�Ay^E�
l��N9��
z���`K������
:O��xb��',G�]��R9�_�]��4��>��.�����m=.�X���iu�	����T�i8["L"]tm����R���b�l�u�'4'�����R-�w ����5�'t{K��{AR�������,8>a~�Tv�s�h�����<���G_�I�i��	�<��Y�Y�|����O&8.�J�52NS����������\,��6~UC���j��?M��3Tb��x+�������a
�t��/�D]���7����U�{X��:P�*���l��G��{�.�9-]hxxK�]�����#7h�U,~��7/=qE#�"��MC�����bs&�Z�NU��l
v��c�����Lo�I���m���[t�]N�iFh������N3�	u�H
s���
^���lE�	�PA��(U��T;M��tP}A��`��Y�X��=����a��H=���4{�*
����
$�s�!���64��nP�)�����HZ�tqc�*��`O�� �m�B�_��!=g�f�����\�P���	�WbOS��7��4,�
��'�xKe<-�M>�O!�n���s������wpy���pV
���AW�f,�=����
�����F�5����O�U�'��z���`������[�{�Xh��;��N�(��5�,��l���m�bs]�i�v��^tc��bw�>qY{�=R�f���\'���J�~b������e�nX��,���PX�^L�R�����6�&�ezM���ip���u���3Al%�cY{����� |����X1�����b[�R}Y�z1�D�0�R,t
/i�r�)�h8�Uh��lx��R����2��/�U�������N���`9v�YtS���sba�V����e-��$�D�~��|����h�0P�b�c����3a"�Y�����aX��/
SMl�[,KZ0[p�-+�	��y�v�{��k1�vM4+
5�"�b;�eb���b��������b7i����b+�e�����E�Oe�����j�
Z�R+g�@��	�r����7�X���m�rXE+���e�s�
���5���B64Y��h�V��8t�i�t���Mv�i�li2w����w��~�b����-�,Kp/�>'�J��p6��D����B�$��o{\����\p-�
��EgW�i8�1�xQ���f�W��hY�y�Bd�O�$�V�b����'��K��y7?<����/6](�XVZ����+�F���GS�-�����Hb�������%�1���D?�:�e���<��G�>��b�������f���REV +�;���e��E?�Y��^^L<Etg�[ba:��'�YN���
�d��2�f����2��V��X�x1�b�����Y����0vzH��4@4�1���l���&b���?l8�M��z�Y8]�OW���E�������T}2C��4m�),�B4j�re9����D��+7Y��1$_�
ID���6b�CR��ty����l��tI�2c&�,�uZ]�NL�R�.h4.��.o�.L�	����@H��{Z�B����/�3
;z�m���,������
�P�Z����B��e���A��4�
 -v�����YxzJ�f~i�)��������i��Y�������[���vG��/
���f�Xx7�jh��B��e��E��TW��v�/��a�P^,5N�?��KcP�s�������a+��,��p6��5.�mp�\)���-��nEI���|*|#��]��
zT�k�.���f�d��)��$���J"�ei,�IV*
,����:����O�k�	f��$w�i8���t���Z��	��~��&f�r��j���e1�E��+�m�`'���@cA�
��aI�X��I�H���c���5�K���WK�0n
-���V��a1����Dj���]+�^^�v*����OS��E���.�5%����>��4%7S8@-�����������Tm��m$�]1d,���g5�E�m��-�g�������Fp�7����F��4n�����F��3$��;F��%�������������J����N�+�q�������
5M�����]����������:-�
7����2�V��/`x����\x�������
�������Lm��2��.�����r��l���D�E��b���
��J��/u�,�h^�r~)S~/�iJ������;�/j��
O@M�`O[b���
��~Y��E�M�?%Y�������&V/�~�W�y��<M�V��
M!i,�KK,�V���-%�\|�����!��J0�Wp~A�.Ybsf�i�6	`R������ta�_�;�����1+����x����i�>���t�j�����7~	���\���,x�`"{��sh���[YpxxD �R*�^��*���`s���T}���Y�
�XZ�����B/L����fY�uAo�^���J��	2����m�T��.��x�Gfyb{!�s[iu3�U�����k.�*$n�n&x*��k��xb;��D��5Z7�h��Jy���,���l�s;-��%Bv���&��X�f��Kv;�D�i��S�?D�O�OD���[/�:��v.���XX�o����Z���o�}gY���M��SZ�t3�S����^�������bw�/�����J�h��Ji��~�%G�����e�m������������R��&b�B�u[���
����j�Y�'.�3i�[H�����L�V4��{1'�������Xa��	/8R�e�G��$�����X@P4�	m,��,�V�����i�lh�P����{�����E�����(��p��������
{l+�����
�fS���?�J�fe��
Z�q�K�LCt+�Hm+�n�	����/��kU���x�CI���u4�0lRK�n&y*z0���%:�����V74@$=�r�<24�<.|i������K�U��'}��.��*����i���(�Vh����$^YMl�����
�����N/��|�*-+�0��`b/�6E�����������h��+F7��������^�����&DWiK�n��+z0�S��P�����a����,����d�5|s��������`7�u���1���:��W���XW�!�Dr?�7p�)�����&<��:,r���%������
.o����v*��"o
&Zt�����y������%�����Ew�
�I��i���#R��
�x�����Ew��{��e�P2�w���bq�q�6\�4�����=����BNl!�x[�z�,���tv�{��F�0��s�c��.hOn�a��a�qa!����a�,yX�H�i8�L�Z����`�R�XV�,4w,8��m>��b��b'��l����������.5�8�����i�����6��t@N���9my����rm�e.��<���o�zSN>-�m>z�l���4tl�
�"�<o�
�_�-|]�x�p���\�}���}�!�Y��}��d�����ur��4\%qi���[K�[P����L�Z4}�&�����Q�h�����4�i�c������	A��H�>����1m>1Y�
^S�����05�X",=5z�����zD3���f;�c���65�A�G8�{y�������y������6�aCc�V���A
�V��po�S�&[�����2���f��
B	�R��Ii�������0���:[����`;]�^4-�
�*��W�`���e;��8�m�%��s��
7<)bW�LV��0l4������!o�iC�i�9����6�`lL��0I_#C�l�)m=�Z�g���g��Cob�d��iI�����9-j�������z�6tzJ[������?�R��I���}�MW�����9���H�l���$ouzJ[OL
[�.1m�ao��-�*
h������fr��+
�������*�7 �C��`��;[Q��V���N"���J3��#�.�zs��f���	��:�b'��
s��E�[P��VK�.��G�`���E���<�$yM���d���>�a�K4|���*����j�����M`���t�DO�}[���4���K��)����N���������>��|��M7}������*���m���)-��K��b����D6F`b����{'�)�-.v��G�z+!>��
(XO�6�f�k��rk<o���_;n}go��	���
����������l��D��a�9��"�4U�L[Z��1;�>+��+��b���9S���v�����"�	�jO�����������w���B��7�������aq���a82��y���B������������N�Y#����I���������t����������Tm<�T�00,�������~�W���C��iV�o�I����\��Or��������\������m����4/NA�����{8����M�
,���7.�~����`x��p��i�i���������fs���TO�a���K��fY�����Ic� ��L//.����`y8�I.��������0�;[h��l�n�����]�i��l� k�4��e���z�=����7��s�,J6����������
����}����~���Ah���;�Pm�YVh6��OKd;�MAO����R��l�������t�MO�����R{�c�[t�����[y�l��O���fs��i���P����{2�`�	�a�������1�$���T+�O
��V��]!���k��P������;K�`�w5Y^����4�M��P�zr�"��O���`���9-��6�Ynz ����48Vi6�L�����5��_�em���&��������M��fz�?�-/�Gb�B�h�,��I�����B/�/��o�����n��6=oe�����Y��v4^ARfsu��1m-"�r����,��2�-��c��B8�L&�ln�q������n����i@��x�lV9-�m>��A��_`�e�fgJ"?-��6hH:������`�04.<���U��������i�	�u\0����c[n�������&$[��p�v��H���F9|�,L���n���66QB���2������Tm�A�EW��E��I�m��|zL[nH;�4k(�;2L��j�?�����5�����n�e��f�[�#�%�TN�,���e�����V.\��Y�.�I��4S��[	z�#W���r�,�7[(m�llB�z(�[��t+M=4���e�G���������M��	���4S�OH9�4*�1������ua�z���A��j�����A�.5I��h<oiG��G�����2�t7������?�->��/,�b9��� ������������L��-f;t������J��m�
^p�fj:f��J��k���WU*���z+����6��+I���L�_=f�Y�'b��	z��S:-�-M���KC��-/\������l-"��_��n���7A�V��&<Pn������POS���*$M3�a�:=4k�&<����]���H�/�7�dy�����z-x3�E�"(������|*�����i�7�,�*6;�'As������ay�|0���5��.&�uX-,�"kvT���mM��k:wI��^��rRO�i;�[D�z�Y�4U�|H��4�z����-�[|H������3hb�Y�������B�i�w�,��
�I��N�{����&�7�����lxA�Dt��l<�WuQ��
I�����v�r�GZd�c�z�����z����:��K�=%�h�|B
��'�Z2K��Mg��)m��m]������w��l���.hz�[
�O["0���u|�Y�7�`�J���-Sn�������aAWG����>�<�i�n"����Y1J�mh6���O��t�
�YX�,�k�J�����A/(,M
6g���&����'�;R�r�I^���h����s���p���5�Z���^�����*Z.���7�{��������2�e#�+�n�{��$�~b�
���T�5m<���������^�{m���0�i����6�?����SMW��)J����"e���=0F����'$���Q�m�R��;��/�5
����/^�I��f����
5��N����|����;�
6�CNS���$�i����E,k���V�w��+��
�C�����,�Jk��t���"�.g����]B�����0�%�,�vZ"[10	;�]1��M�� �p�c�=�{���V�l
�<�z����JDy�������cn���7�������S,
�����\VJ�lK�J�%��D������k#�Y��N7��L�g�>�W�)=
��t���X����\T`Y	������y+������/q��������x��T}���Yf�]�\�l!�pY6�bz��;���e�p�0�)6����hy���,����MS�����&�?���_$��X!���2��>���e���������)����4�YE���������v�#{1���e�\b�6���5Vg���I���P�m�=��)��}��lK~����H���T�Y���]�dpY�6��|^BsV�w�f9dbs���
�H�&����T��e���r�ZbvU2���bx�����l��Br�eY�������Q��YV�X(�%����s��iymY3ee�^$��R��|��P9wY���Vc�L�G�����,�O�����*��7�Y�sT2�I���D6��&|x~��o�f
]�����e1-{�������L?M��"���X����D!�����eM��)����U(����c�����(Yx��m�[.��1m������d�Ba�e}v��+z2�.��CI���OvY��u6��K���,b��rxLk�gu�o�Is�)�l8TG���d�n�����/K_�.�4�N��@s���S����Y�YC_����c�����@7�K4���>�al���pq��T��}0�W�����tOS����yE����e���8���tb/h�[����]NK�S�U���[V,+����
�U^���!�=A_,7P,l���q[���������>{�m0#h�'��r{���o1C��7*lx�k�p��)lE������Ce4[O�k���`K�kY_L�Gt�S�eAj��
%���������/�$l�f�������%	CC����Y��g
���>��/6ytO�k��������������
��D5-�
�kE�6�b{���$����D�F���,�|� �o�wQ6��D��$�E���[=9�t_X$�s.�k�,
}�\O�0���F��-H�^�h��-���7bc�mo��T���L���0<�~��S���N�N�����`�8#Z�Rh��1�Xu�EOX qO��F�bJ�bz���K���Q�4o	�q� �xY���Q����,��c
��Y�����B��Jt�0�B7���Bz��2����L�7�N�`7���P2�t�7�������A/�
v�#)�
��5nz%NKd�

��AJ�0�#���o~D�
ma.�;_��omR���dA�������iBi��_���}g'���*6���/x�=`e���Tm�2y ��������;yN�iC�I������@��^�`7��W1����SvMO�(3��(���[M���� u{�6�h��J�e
?�`s���
����hh���f�6��,���������R�0����[�������i�G�Fq�B�&�5?4.����	����K���%:��%
����+%V���m{*]��&t��.c6���������p��s/�Y�(���^���p6���w�/F�d�fjY��#���v���l0�f�Y��;�`����Sz��1}63mh�
�[�j��u�/��'z@��6�i�>��y�x{U��"B�;g������~3AO3�y���w�Vz��	��0���7���D>#a�A�f,zct����S���ZZ��Fz�:��<pG�J�Q����:4x$J
���������������=����q)-�YC��s.D���}�R��� K��b���9��5����9-��'x6�%O���a��x���7gt6i\x
vW2�,�}1�o��~,�����Ks��Y���HH;�m�������)fPZH�bB���J���/�Gt����aU�V�v���T��]h�xY��F���
]i��BG�f5��*hE��z���b�������^?oA��YI���f�E��Yba~�X� ��-d?5�C���6x�l�e[��^(�jV,�����T�f1�����<g�7�����O�;���1����=k���qe�2���"���@�P����J���}p6��9�������J���e�����N%v2�
��9><g�k��qN����p��5;�[t���T��J��Ea�0���|R~bV:�9���%�sc��Y6bs�����L�Nl����;L���Vt���������i�4�M3�B���|	v&�������?]��_hDv���|[�y5K�7&�#�a^-�^a����!Yy�5�:�����Y�����`���.8o����M$��L�v�$�0z��0�w�
���7&�.��r<W^w�,sGt����v�	�;k�D1n�#k�t�L\4�b;YA��Q�Ni�Yo,�C�Sp�7K���u���m�q��0��f����N��~�+���g����er�������7�7�"|\X��;gv&4�1K���
�#A?,���Y���A���L�����`�~X�����P��,����^b��NlJ#����������f��F��<��.���Qbi�Kl���EAj&����w�ayNbW%*h-��TA�D�)&s���6��,�~f��g��5H����Z��1	~���u�&�?
���mLPH��Y��gin^���xZ^����R4��v���Y��7������W��i1����D���e��$JoT�N�U��=���������������M_;	���+ra�^l������Eg��wv��+������*�i8�"�����u�9��4U����q��^0�}�L�X�|4W��V�&�iR~gx��-��4��7�R�K��h�5`���V�q��q�A`e����%D�����(���Fh�*�9'��pOI��Y��������Yx�9���l��dQ��D�E�:%��#�(}c���"�����
�g�
��>0_F�����
�bU��S����)X(�c��Zf-|(�'|�������l7����{�Ot�I���.x���?k�V�����fL�S���l�E�otK��rj�����-(�4�+h�*Jm�SF�SA>�Y��1� �_���s[���E�l�&8M�������%��C���-����o��z1�����u>��g�5�_��������7����d�UbY%��U��X�*��.���D�����T�����$w3�,����_d���8-�-x
O5�"���YC����}������>�[:�wv�z�G��*�M��A�\�g�n�fa����0�:y����4,$_I�Xz�/O���L�G��E�W��)-x��&|m�{����=�@R����`�;���J%A�%�A���*���������Hh���c��7&L(z�HX�4!�p��9�X|�Or����F}B&�`�Z���Z�������
��q0M����|�������N�Y:���l�+NKd��	����i��������&�RI�V�N	5����|����e�S����Q���EscmV���l���&�����4�mM�&ux�
���2�5�xzL���4l�.�fUKS7���#�N�������H��C��`74O4.��J��5n���������^�>	��\�����M�������e%4�B������=�T#�
��wr��(��-���ra�j�N�������i8�t�NKdV���O��bd�����XP�������u��$�����3����+67�~!��������n*����W��.�bi6��$3��D���!���������`bl�;9`O��z�]�����h%��v	�9)��>6��`G�,�	vA�-X��\l�vA�;Y�����#r���w�f�z�so��-���Q���/@8����"�u����8��D3�����'��q'�1�����7�Y����������,F�'.�2�n�Y���E��.N��0���&y�����
:s��f;����������Ld�s.��u7�rb�s��w�Z��{C��brd4�;���-�kf53��^���������a� ���.������+��wk��EBg%y�+m��[t�q}���Y��D��AB
�������t�X$�b�8b�7�%���nY���p����_��'�:j��[�MZ����.6����j��@�^�Ll����2�Fd!��-��Y��4f'<=��
A����<-��L��$�e<
}
Q�n��bq�WJ�8
g������%��e2������V>/[@,�M4�
;�;;���Xz��T�����c���'S��j��d������.g9��tA���Xz�	v����c��aY>�t��f9�+AOV�b:���h���W�Z�D�n�}�
H����b{J�;M��������l0M%�Pk]�f:ba����TgNKdC�x����$���i^���'q����aaU�����e��B�k��wfc�

����I���������d��������������������w����u�;��](��X�,�@�����n���"z�?<�N{�iym����PwF����`'�'�>|#�q�N���Y��p��m�����[��X��e��`�FN���Tmz���hhH����$jzL�OL_�H��i8�",�[4�K�N}��x��6���jUV��L#	&��e�yb'���-������t.;
gFQ�����>�?,��*�0��C�O�Y����
�&S�}1Y�&e;X���,����aE��a�oT�B7��Bg�nI���4�$��>���=<��������;P$!JX���;��
�>�G��!	�B������	��*��&C�4U�1��#f*���0U��wx�^� 7�G?�@s	�w��2�[����Nj�La�wd����`7�f�}��������
�i���qa�&�3��OKd������0@2�00�C�������^���2��~���G��0#�}h-H~�Po�-��������-��lz����"E�2���W�����$S��w�����e��D�E�����;?M�f������!|�+��,{uX!��w���x?�8K���gF�{|,����O���[�Xh��M������o)AC��� ��-��a�T�����4U�0w����x?��[������DwX�ln�|���	���}���������&5*&D?j&
w�Y����|�N��a��WA'�[��C��t����y�@���� }g���a7y�P�\��4�������m,�{�����TGC�i�0�N=*7������/����[�:�v�_E��a!^�����<����|���Ao�z���x��M X�;��H,�;�]Ss��CZD�3}�44%}x=���w��g�
�4�vraR�YT��B���c*m��+����j��)]���B�6�y�7��w�:��Z�y�k9�S����`����7��c��c2��w%l9�|	�8����VlI<���4�$�s������<;��<gf��O����~b���S5]kp����=��D����z�vu.�0
n���}gW%(jI���IEg��wv��4�6����/xL�
Oe���t��oRp��+����t�����4��/(�)���a�{������Icq�s���^�;�Rz�^��a�@��M�������6�`��~�<
g#Z��a��Xx����q+�9VJ�ZD�G�$����4U�n
�V_J��~#a�e�����,����z���`s����]�Z,�/�T����0^4M�
vU�K,x��r`�F���]����=.�dh�����:�%zl�a������/v/�-�~
K�v��wI��l+���i�d$&H�g��4�`���aHS,4�=kV�-vJ����^��a�g��Z4$���<� m��@�_����=2����|K����=������p��[��p���wg��b��[�3,�#;��c�;C�bY����]�&[����b�J��V���j�������?���9�Nv��b���]���j�=�E?,
D�d�0�tu;�
�A�5�>=�T�`,�XC����<�t�����"4����Mb���X~�l!�wX�;�����9y�NS������Yb��
����l���XR��E���YN����D������Do����LT��X�z��#�0�!v��V�[�~��,J(zB�/��D����c�^d��/�B"��oS���
�a��bs�iym/�(��+i�������DOx;�[4�s'���{|iX|�t�� 
px�������������F;
g;���z���F�L�~�6��������ve�t�{U<I���H4=3������~�b�@�����L��4|�$�]����b����yd���k��^�����0e@4��;��'6�����+	
�����)��J������a1���8�x�0����
��~R��b�P�J�U��0�4��z��fF���;k���p�^t���d���������_����$��,��\�yZ!�l��S�T�4����6S��)w���w����`'��>���aI�,�q����`+5c��`5����;��u����Y�g�sN��iym��}G4}�����,l�q+��
 �&�������`�w��}��l+��Ki��0�f���R�x�>��\��t��>(Ix�Lc�L��`+I[�L:\�f�f�����v��S�j���~Kw8g9��V��pRg�����taM-�=X���?.�W���a��hV�7�h�>e��|*y����e�d��b�
%=k�
�y����%����DC}�������9���ha:�l�����<k���9��������};����ve��	���E��8��������VO&6��|gw��������{�|gi���y����C��s:=�k�Z��q�G����vz[�ag5�����.���l����u�Q_�I����5�_�~��U#W�#����yA���i8�^��_���4����f���pZ"0�.��~#�(aVa��]O+d{z���]h9�g=�a)=kXy��a$�
c}�>)�rZ"�"0�)n�B'�t�+�������h�i
v�,iaC3Q���a-��0��ih��^�i�NOi3z��~`�T����MJ�;���OKd��C�����������4����6��*��ol���g������7���?�;`}��Z��s�Zd!�����9��l@��Q3��C���P_Ut>9
gc�I<����bsg��T-�<`xY4������O%��r���%����N��tfr��a�]l���Z��WK��-yu�#�j1tn�����8�;���L��q%k���4H�R�i_�����R���zm�yzLVP�"�����������������`'
�����p_���$0[>x@U�����aoX�'F �]�~�����[�r�7����Mf��)m��<��<N$�������<�Q��'�;J,���;,�L�cD��=�4�����6X]l���H�`"�����U�
�rp�������&�i��2<W�

K�4.������[1���kmh��Q4��$+]�{3,�<�{?h��]��Y�u���������E���7���l�pO�iK�IR���NIC.����o���R���<��Eov?=Vb����L��5/zWECM;���>�.v������r�P��4S���1��:<Ut���X��X��;��Q,�n��k���o��}1e
��e��eg�X� !v�o+���4�����b������O	?�����E�t���FFl��<-����.lb�]��!67�;=��c�c,��������C���7=��E�b'K�{��nKp�LZJ��B#bWA���|�
O�h��G(�����V��Y.��~���VabWzgO�i��9DO���
�����7����������E��.������U�xb2������t�q������M�?�6�v��l�--���5�6�R4[hy[	�fEa�a�d��m��\iuzL^��@�N>��pV��^�o��f�X���-���=j!�y[6��
 ���o�0
�K��N��H$�]�x�-)�%1>4s��m���r�0IK�-�`�N�w�/�B�VJ�����r�7}g�b�'b/x���u��g9j��"���]�dP�;�Dry�a�����6������*%�6�o!vBC�)���3U8���FKI�-^��+|
%+�.x[
�)T��V����>h�cJlA7��6��(:�p��,���[I�V��c�X���\Y��-/�fm���B�����7�T
+W��BW�����&
�A�g����q[���	S����*a�;�t85������FY���\�zZ!�LUZ4.���b#ih�����%'���6"�%�ox	j���zbLI
vW�I,�
�JE_�J����\}zJ�O�o4���e��\0���f����J=���I���D�4|�-H(��VL�
:wS>
g�F�f]��z[�����`bX������r��4�M�����F�!�{1i�4!(�|�=-�->�::����NO�� �>�Y���D6�`V��L�Lln�y���'��#���d�ZV��W�[��	6���jS�I���S
��Uk�s[X��&�t���:�F�WH�)�pZ!���L3|��?��%;wV�S:���'v���-����V:��g����V����y�����*�E�W���\���pzL�O0�4�o	��������0�g���K��~�a{AS��L��s�d�Z[:_->.$x�jd��?|+��+�|6��1�@L�Tl..+�K�Oy�*Kd��m%KMy��c�7��������-�=����6A��s��O3�����E��>
g�
:�%i]P�{,K��|��KY���~`UD�P`����0��qaxA�V�,����i����i8�1�(�JN��p>���k��fc�;����\e�|���
�C�~�te��S�0������424�����aS��i�|XA^�
�hd&�$v'����>$�C6��������X��t���c�c��0�
��[��4UV��Z���z������a�s0�9�QZT��0�&�mrI���U0�k�b~�%�&,�V�H>�;jQ?�H��>&-V%xm�b�W��J�C����a�[�����Xr�T�8\�_u�&;aTo)�����-�0qh���_�P�B�N�����)-�CWlQ+-�]��p��/8}-����-	-d-?PM`
�[��a:���a�}�W%��"���������������R��V�r��z�/B$��wq����
p�T����Ni�����HO��&�y�B�PxV4��ln	�nh>I����X�����\�.X-��M�\����6*�j�V���b_���RK�W�w���������[�&e��f�o�rV�s20�*M\x��{�����[������
�r5kL�t)9-��	x�	�n�aN$�i�>��'?h*5��?exr`d������`�|�Y��2���P:3,<��Dwv;;�(����R�*{����^���2H�B�[�-y�NK��D�
��b']��V�����i�n/�j�O��8���L�����j1�V���\�,tPV�)f�a���D�f���O\X���������*�p�����
��)��,/v1kH�`��P,4�<��D�f�b'���]�7}xL��/)���N.��Lm��O$���!�mLMl����|0M=��\lc�gbs�������p=�����U���aa��.�B�t���qzL�1��m.����j;�����,�#6o#����`9������|�3�Y���z���?gd����+}����Q�W�l!�wX�5��?4���e�bs���c����a�0�)v��U�>+���*��w6��2�����v��Z�]o���T}T1�T�K�{3����w����i�|D2�U��1�j:n����@g!�|X6�z���Ll�#��|�-��N�i�����������9l���z�\<-����+6�hcM@��x����`����+$�U���������J�L�H���#p��
 &�$:w�=
gK�)���tU;V���rzL[1�7�o��R��rE�fW��1m�4t�7K����p��-��*zB�z�p<w��F���Z_��^<D$�
��>k������&Z����`���f���6'�6�F��;B0�A�������ZwA�H��K��X���CCX�[1f��:��tn���)�4U[@0\!���wy��W��a������<�@:���	�F�������f�I�����,�O,5I��f����`X4u0�T�
Z���b'��To��<*w0�����h*\���������O>�X����J�;[�n�f��YA7V�e�/�B����_u�90�k�W�SD�J�;��l��\P�0%�io��w��^z�������d������Qf���-���J��B���J�����t����"�YV]e���-v|Z]��0��H��YE�R�1�,�zzL��0��Q{#�K��y+���v��l�
����`b'�a���i+9����A�B�a�W�.t�y�Rz���`'51��g�0n�p���TbEC����h\x�x���w��.�����EC��wm������L�S�
w�����~��l��O�k;:"����}�^0&�S}4gx����8�U���
�R�i����Ug�;�`^�
F����y+$,<�n��N�]��������f%
U�a�fr����F�[Y\[�����1#��n��S	�8���%�uL��X��K0�@4=M������U�\%]�d[z��:h%�[<�T�vzL[��(��s�nm�e�
����h�5\���*YX�x�z_���S
�"�LK�`;�@�
:�����IZKZW~M�O�
���&�Y�|����i�l�A��a����Vzyl������0��������o	��%���E��pb'��O):�-J��g���~b���AE,�=�KG2�I
�4�M��4t�J���4,�,5�)%�]	X�z@����a_���4.;<�J2�0����������st�4�����n�������R���������i40A_t�<
g�fHY���a0�L���K�:]�NKd��N5fhJZ��--���aL�-�N�k��IK��$lb&���uX�z0Ak�f�hdx��W~K�R�-����e1�+ka�����)[���]���}���]?-��	�EK������e�������:�:��:��l��o��u>�Vr0��=��i���g���������9���p!��M�R�����5�8����`Z�{0�o���������L���Y��M6
$��0�Ks.T�N��g���DC1&�����]��=-P���Z�E(Xv��X�����;����^^^���������W'Bo���,����[Y���	���-����
*����e���L��,}�b��X1����D�K��E���Yf��m��;���CE7��)6wI��BE/���	R+�����oe����K��b!B;���%�����|����`���.8�/&>e����e�t��y��Vr����'�
����q��rK�b��W�����&Kk}�����W`M��u�����]���*�,�*���_�L_�;Tg8���NKd[�����R�i8�m,�@�.D9���'�R�� }g��s�����0n�~:-��'x+j������bs{��c��a^p�,SF��Bb�J��#a����2�P�I4�]J�bo������u��2��?��1-����`'��������B�+��u�'�����<X��Fl�_9=��'���ggC��%�]�3��j�Sg��\*�q�''�~''���]T��Y2��@����>"d	�(�����q6���aO\�.\���/��'�AW�5k�E�����}���j8���pV��-d�O��O���$H�Y�������Ht��`��	��A7�[$��������s�_T�
�������r����]�&���/�X�k`�"����wJ�x\�@�qP�L����~�.u`��w��t��	}�]��MS��d���a�T��2N�k[%����`h$X�8-�C�H�V�]��t������`i\/��P�1��a�
W����
�fe��c�^��P}c
 ��f�?�t�����B;�����.���@���"y�NOis����n0��nX}O,���(<-��T:�����;K�6�S[4��f}������'tnKx4.�L��OKd��������zg�8f�4�.�F��`+;�
z��*:�lN�������{��t?���A��I�7WN��t�R���U]����b�����p���dRfb�4�����b��iym��F��E������'��{�a����������y�\�1�pXaE����GMP;��P�����.����+�UnA��Aw�\�V^;[O��~��l"6'`�Am

���L�-@4�\�i~Tw<���.+_aqm;����<>�n����&k��K�o+��Bg�����U����A,�YS��J���L�f@t�K����/���9s�I����������;�V���U-
�0n������Lg	�.HnM��O&�o"�v�z
������<��JQ��
��R�B�4��[��#���u������u<�VDQ���s�����7���,�*�8�G�4������\'h��Xl��e���V�^��W���)e�q�����V��0&tN=
gk^����I�N1��T}�3U�P?Zl�iR���6��.B�s%�����hAS��$����q��S���m~Z"�1��)�p$X9��4]��[�~2�Q����R��'���~)����`�����������M*mi���>-~?�~4L�f�Js����Q��i��=lc':��g���a�V���[��Oa/Q���?M�&S_}C��d��
#Xx�_�S��\e���v��as�7��5�T�tzL[O0�=��2�;����%����[v?ku|.Ry�E*t -%�9���������u�\9��?���h�G^\,�N����c�(�P�a�7	��l��NS��k)o/n�"�h���4\E_P�S,}y67�4.S��]���k�����i�"�*%���Y8��Cv�,=�h?�������X�M���������[4�t-:=��'h�J<^������R[f���T��p7��Jg�Z���������u��{�n��=\&Bs��������6��Do�/���n�*���'�h(�����Yx_�*�	���Z����$�:��-�h�_!���l�o���bV����H�,YE�f�o?p��V��
��F4��@bsr�����,\vZ��%��H29
w{8t����BT�M�����V�3S�[h��,���D>���E�[y��.��0���]���4���//:pE�B��e��TE_�Ssy8�#.�������X��W,��
���U�a �PYl��<L���0�N�b�.�7+a5�.ab����)����6��l�h(� ��%
�W�FO�i��e����_�0+�������i�l{Ak8h��/���-$�/��/&F/JA�e��F����A*�
���W���Eva01,B$�$,���:S���+�wd�m����;xY~�|M�xc��.Q��������l=y(�#�J��p�W_���]��/��Cf�P�#3�%�7�&4n��T�bk���kd���*G�5��
O;����N���ClNV8��
|������+����f�,4.�JI����1�
�D�[�d����4U�"��X9��1�����B�xY$}AK4���EuY4|�����^,2-6����NKdS^����en��xY	�2�Mx{��5���-�,�Y/&�$��!,����e5�E������{��7fwI9���uh�t�M�h�*>��g$+�J�B����0nK��i�|4���:��G
C,�&A�9+��D>��cF�m!�rY�*���	b��"���Jf�;bs��a�,^��l�av�[8��9��u%�a��J7�0Q��@�8�r.��,�$����*�����K�}CG�F��6�0&6�m�V���A"u�����[Mh`���������C�b�
=XUI�/�����8��m�''�����D���}����C`�Y��kl������D
��J����Jq8��O�������5b���]L�Al�v?,�xa	��i���k�wv��%���8����e��

����7�Q#5�J4Zj4��O�k�JJ���E�����v�>2�9d�I^��]��\�+^L�Xt����-E�0l�
��L�b2��a�^����a��E����z�V��XL�FA_��Kw��(>=�M �X,�����|b+�6�/����B�f��;���i��_��7�7��:������t���X�����ia������S
����K���E�S}C?����}�b+���~1
S��]�[��m�l�aa�a(�(:�O����Aw�
6KH��jK������%�`����1�1��������n���	S��*~0Z���,L�h,7����Y���;A��T���	d����AW��������h��j�R��P�4�M�VJ]�����{�$�S�`���-tFZV�]�o4�c��h���:}i���������]%e���9��q������X�v:9/��.�;t����=���T9K�XKS�%h�� 
_!�w��+��LZ&���<��,��bt������������0@l)���4d'��B��e
�}\����F���_�_*<�M �O+�TXb)�/�����
[�v����o�,�^�B�P,t�k��NpZ^�1L�W4����`�J���t4���/QxE��%^&�(vC�B�U	�X�w��=<*i�:
gs�r%�[��_V��������s��e9��
��p����M�@�����c���>��<��=G��J��%^�o$�
�{�x��<�	`}j��.r�g$�-=`��~M��n��D�p�3IO����+���)����o���=7�v(6��:M��$�Z}4���V7+-
���2CGhN�9=e�S�}n[�� f���4��SE��i���e�����bKa��W���^^��F���`�������a�$���un[v3�-�}������-�������Z�f��i��SE��h�h~[����e������^P���i�t�Y0������=n!)a[v������[V�-}+��	��o2�������P+��f�j���!�����T��
�-�����T���#s����-��Y����);6%�Z��l�����>�i8�k���f5��TmP�;M����������?�9��0��M|Z^At��w��+�y�������f���;���9�b����p��PK�Y;-�� ��
S��nV�!�)W-T?o��R�u^�SF�k�FS�FlF�
4����,�+��x��M�j�%��+��e	�b�iT
�7}���i�l|��h������`s���1m�A/��m�/F�l��=.6�m�s�������2�boVk�Y��W��L>d[��pW�,���i���_
7����:�ft;o"�����d9��s��p������r��������<XV&4���V�v�0����(�f������S�OS�
�2�D�BN��(���yW�;E�T����q�E11��[{�l���P�-���`'K��e���x7K�
[u�e	�bss��c�\g�2�Y���������f���+�����P�W�oP�BP���l�D���%�D�_�;;�-��K�,��mk�n��-z���m`���6X�=
v�����Z~xCC&�B�m
��4�EgWi��>���O%��P���^�D_�t�,�����D����/���f��m{��t�
'����b/�{WB��>�,]Tt��R��O�6E�h���iT���oU�W�6�3
�pi3Y���Jy�����7�u�2����?��M���1K�[���V>�L�S4,����L��g��m��V����uL��NV� vDk��i($�|o��r�d�Y�x���W6�������3�0�V�[�����f��Y���J���bA_0V�(����etzL[���x1]"u��/|��$�[X!�0�U4���a�i�Y���64�%�Q�-����t��
>����f�������AOXl�r[�x���������.����Z��f����P����[�x��p�17;���
=����7�G=`ZX�^45k��1��k�����7��=*�����^�����E��v�u�q�9a���6��z)��p����&Z*
�x�����:�/M��C:|����b[�x�\��L\�1�E��>��)m�@�e�7��?��V�[a���b|���z�����,�\d����h��	�����]�J�n�A��
�Wj�����8����)��^L1�s��'�VzO�k;�	��-D�����o�hZ�E���J����7��%��k�~K����Bg�m��M���_%
�RE�����#�l�V��"��]zgm���/��.�����Tm{���o� ��N����]�{����7,Z��2TH��8��Z7yC���*;u��=	:g�����N���o��e��s������>f�0FlO'�i�>��Ft^����u�o��
o2�>���`aSL��`��t����]*A_�|��r�������&���������
�,���qvL�9-�m����:�EaO���`;�����o���74���������N��Z�����V��mMc�Awx����
�5���7�M���V*��Mo�����[���w���T]*��>5�2�|��TX�,������u�7�*�zGl�b����;4d��4D�b�a\ZI'������)}�9�+�,�bo�v
������������c5�
3��~� ����R��?`8����w���y�dk���	d��2�](��lC��_6ej����������2\�p���2��7����(�i����������^\�@7
I����|���R�?���$��i�e7{!�A�����E���d9-����OEj�p7	�r{�eI��O��!�[���N//nR����,�_��-?&�"��!�v���v&=��:��������N5\Hp�������R��DU���2���"�	D/R�l>�:B��kn�����`o��f�#��j�p�iym.���	�M�"goTf�#�l�!�r��cf��/�M����[�+��E�"<T"�,86{�������P���DAy���������O�b�fS���6��h�,��6��9��[[��p6'��4�9653��A�������5�{�B�D�Lh�wdT�����d3�������������M_���~1�� 6�0%LM_��5�����+diZ����(=l�5;R*��1m�@��z-����~H�����`CDM�e���a\T�d�5b7��R�����W
���5}�;�s�NOi����%p��l�T �LA���2i����9�m��u[1(����.����@r7��SF:�Hf��]	�u�"�*tGQ�����.	�����Q��j���9?��Yj��\���������'�l� 9�_���f��TmN��^�'�Y� �w�d����:4�$�
]����K��������`��w���@��o�]�����0@ �o��c�����`�,�;Uz��m� =l��-ln(��-�������$��4P�Hc�����S��S�h������������?�
(���Ao�F��`Y_��q����SRX]��p�M_���.M�v*I4�:)�m�B������y+�:-��E��,5|��E	�f����?��ExQ�6Fa��J��g��3n	F�
=\A3�#��|l������S
�i8�!���f%.f'*�7���$X&��;���zZ^@0]<�������@z����4rR�;M�'3�����/�����d�����[�pS]����`i=���p����8�|@M��i�>����/�v%���T}��o�Y��4�OW�r��0t�{Ac'�^����{���:RK6����p>����i&k6�7<M�'$�����i'�`��Jg��u��Jv������sy�i8������hC���l�Rc�D���C�x���f����1}�B�h��%L�;fGe����i�|�#�a��W�:+5n�b0l �a�:y��#mC��[���OOKd+�*�2G1�4u���nI6�i�T
����B��f����?�m'h���S=X�s�l��	������ox�������	�LAo�9(f���K�K-N~�m��^��0?%�zq�P0@O\���m>���/�ijd�=/�`�������;N�������q������M!�;������S��i�lkB�6���5r����j{J��`��F��KI%C��`tai���a[��ak��I�fkN����;���&�4�?���0s$�U	�.���\�gaG-���lkB'������+D��mM$*mz@M�`ox���I�`{���^��,tCXE���.�|H�����fi\�Uk��}�f}������R�
>f�m�~$�^�9Y6������+��e�)C�n0yV����)e��ErzL�@H��t��j���VR���(Z���y�-�NS�-���:v���TmP �d��Gg����mP@� �s#����Tm@G�h�����e�E��m��A_�V���~"����L�[�6
`4Vj���K*�0G���[�(�Mn��	��O���4.�����i��Fe��D������(���~���!�-_<T[_��v�q��fM��4�M���Y��	��F�����5ka��i��1����1����^<����;;Y���~� �t?&�6ECS,k���2Cl/�W�U���_4k�m�YCB]��6�6�����}��p���i���U�b}y�����lVz>-����
~�j���������#3)�_���a)�f���������>e8�
�����PTS�f�;��{���,��X����`�R�X����*R�E��hE�%��]��,h�X��h:.�fm�F��o��KY^��
�����;�?�,�e^E�0��l��i�l�(��V�Bl���z���	�;f�6��5X�s:5O�k�M�]���������f)�b/x�i�_O���S�3E�O�k;^��\�6+-7��,��m�<���G�%��m�j��6�?�o���T2�`�)��2nno�U|z�Jn,W���H��U��������J9�V�D+K7�0
���~+2��n&�$�%��D6�X^��z�����fe����Dg���p6E�9{)���b�������f4+<7�D+z�[�%Gg��R����E���[4+T{3�A�=�{xLK���o��.|������'�-{A'P�9|zL�m�����'�Y�|�l���1m>Ag�����H���Tm�@�=������0�����kYZ:��8�"4����tm}�����@���S�����fi�w���(;-��	x)	��^��p{^��)��1m�U�o���Y||�'�7�L���aq�+
S�E7�+�����5����
xAwVJ+vT.������]8�R���t�RW\���x��:�O���`'�2���m���UK���^�wA
�Y��1�A��BB�.�]k�JnL*Yt�+,\�?�lb�����ij��3n�����#��]�DZ�U�����=���*��6�C7
z

�%�i�%��T���W������4�����H
�0��$�Y����'�	�o�M��0.�qMr�U���=a�@��4���
z�J�����Q="����Ya��pO�ai��3����L�fv���R������J5S7&.-o���#���_f���bK��M ����v����)�P��kf��k\�����YK�1-m���^,l;�Y�
we����sZ������Y+��.�Po��n0id\5=�f9��_A�����n��Vt.���.hY�2�w5�T��d��N�k;�#��&O���a�!��/��y�B��fM�o����w6�\���t��K�W�%��	�C���������cZ��1�g�4o1�\�\`�(��1}H23�f)�-�;�jn�s3���Yxm���{�e���z1��tYO�;���{"%�����Lp��r��n�d(�%�z��z����ZN
���*�\�K�]�E����1,���J�V�m�Kn0d6��N5��7�Pnm������Y��Aq��;L����3[h4�,�LG$�\�_Z�J��N.��h6a�)_�����4U�0��:�N����bA_��TZ���Qk�6���V���?H�&
���x����1_�WE��T}4C�'��+M\X���b��|Z"���
�Cd�SZ�{�Z���"��V��q��n�J8�Z��������_8����`�:�����[pX���$q�p�ems����T����-?:�����6���\	5X��A'A�A�cAJ����J7K�L�-]8U��H�V�c�n��4���a����6d���������{B�l@�6���Z�JY�5�s����"�A��k�z�p�"�ShK�,��`&q��_Xx�
6�m��4�t��jeym��oT����F<
��~�,W������{��A���4\�p����d}gW!�pY�7_�>���;��+�b�N����bG�L���{y��)z���K4��F�����/�$)z3���*���>�*\�'\���W����Nz���x�
=�.+�^���4]�v��L�g
7 ������z���]����U4������_,�9=�i���4�%���a�V����J4�P	�M}O3���
�E_,P�`e�b����NKd��EmD/V�#�*��e�����O>K��7���p���������~b)h�a\ClgJm��4a�4���a W�(�Q.�_,��t�E�e9������,�_�op����($N^��Q��r��PXo��i�6(������Tbox�6���i��EEE������=�;;Y�����{vY{�������Gc/�_�d�N��i8��p�	�^��X��-�/���������������K�tm�@��dN���:�"$k����V
zY~e1n:�NKdSiA�|"6owz��������-|1�`���(	`������-d�^��y:�Y����X$]��'�%����M���r9����AW�
+�^���v;z\V�'�.=)���aV�h����}�XV�!�*4��,|1�`�����x�4U��L<X��RP<2�g%<��`'�M$Z\hrrY��b���'�D�j���Z���V��B���"�������Z��|/�����|�Y������2���p���+>{�4_�8MO%]q6��N�i�
��^��A,,���V���a���|1�e��U�����tLk������jR.+<_���|���U�Y��.�C���S��~�m/B����!������.�%_0=,��R�4��'��M�b�R���$�e�d\���(����D,4o�^�yG%����<���1�`�nX0�p��`���ES�B��������UM����4�`������W�:��MM�G:���*�N�i��	5���p���R��
�����[���,z|�d��+���/�Y�K�U
�}y$\\8F,\L����Y�����������~�G!)����
��oSL�o�FL���
����� S��-������DOx���S���t=t��}6�X������e���l%Ni����C������l���X�&Gk)=.�5�����q��-_��R��Q�`7������*mqZ"[n��t������]��[1��I�UiN���E�A�>Ib��+�jC�	���a�-Wfj{�	&���g
\I����@�^�������B����������M��Nx�M	)�� �R���/
z��R�m�)��������J����a�=��2�;�a���3������Jn������K�!X�����$�]�2�45����@e1��(��?���a��e9���6&�-z�� �i������/�bC��9��;�a�r�75��c�\�K��*A)+=_0�4��'��;��]I���sS������~gox����^��Y��b����D���Z����Nx�
�Wn�V��`%�&�J����������������jd�c�\,l��`~�h�L��I�b�/1�J������\�a��p6���H�`w%hc�VpZ@�`Z�����Wu�����$��b5Y�����R��g�������x�,�}��������a�W�C���M���<f�}�����j��5����Vz�����f���>^�T�+���|VA'�V]<\�Hq���-�\�`+�kb�6h��3$�s���]�Y��S/#�������i2�������E��?�:I�:p4.t����{D����kbC]k�4h#������4��=�9�r%�kn���q�n�������v�Sw&N-z�6����ba�������D�K��/����bYa��Y����������k���"�b;�P������B"v�7�/~��p��C����|Nba����_������s��i�����.�1����"�fN�n}��.a���^,<��vzM\�-6K\��wyy�7	��v����9�E�L|�\�wkDwf?��B�baA�;�x���9M	=�O���Eh
�{Xx&h���`ij�X��BXba�X1sL�Vz�wKbC����9�NS�
Dw�����4�mV~-z����p�EXr��\H���m2NS�=ozmb�[�9o�4U��L�Y4�W!6w�=M��:S�0]����L���]t.�*���v��g��Z�b2L�=X��X��S,5����+�9W�w+D�n����.����f���U���h(�#���N�7K��Y���M�����A���ES3-Xz~Z�.oA7�E�;�'�\�B��4S�OL�Q�,�tk5S�D�^�52�Db\�����[���J;�P�Cl��OS�����ku�wv�X�����`GAO�[��3U(�����v���Y����!�%��������<5�ix�3��_��~5��.\v�l�Y��iVV!�N���|b��k�B)H�,vge��}�z���bg���B^�%1��A��a�|�=-�m>&m-z���F������|+LgQ�������;�YQ�g
}��3�2;+�Z+[wV`#z�z�Y��4U��LvP���f������}�u�<-��c����4�X�y�(�?��x�*1.+[w���:u���[���"w�����\������0�P%F�������9�<��m/Vj#��c��m��ny�����A���$���r��
�l�!��7�K�)��Jz��;��KQFG4r�uE�:u��p�����5��4k�&L�6�y���v���%:U�5m1q�&$��E���B��U��(��p�Y�3�U���i8�@�L�������o��u�I{A7�����H����wA�[��S:h�\	�0���!����P��-�������C�`��h��D3N�i�	�^A�� \)_�xg��[A"�[O���-�i���`LWh�����+f����"���V�����A�0� �������tg�I�i
�P����oe����E���i8�7�Q��p>���$�c2/�baiW����e���A�?�-m�������������MC%����4�C����}K�6���)��|�����[����L��+N��|erB�'�^�����$6�q��{@x�����z�������`�r�Q�P��G�w�WR�-������YG����L[t��8�fS����4)5����e{��JQ�U�;�1
?�`We��Rsn��q����[�����C�C���JG������a�n�
��%?��R�d����A�t'P�:��T�^�Dl�@3V��t�Z/q��L}���Y�C����D��2�1�)X�=����p1;f52,h\�)d�P�f�j���whyM�42�SIl�.Q���Rc���g�e�V#�exvAgg��_���3�V��8-��6��#:���1{U\��j�0K.hL�Ub;Vy�L�Yt6���z��l�o�)�!�.��e<�J�nu�3"�.
S����������c���W������	3��j
S#�z+m=-�mM�*�V�;�E����7%�������a]�����u�;��{L���!�����H����rc*�j�������=2�����n=m��R4����@	�_MF�i�l�@����t1?
g���Z��a�e�7���li�-oA��b'��j��KDw&-z�,�-�C�Da�T�j�L^Z�]��[�Y��h����w�4����O���]b�Y�ewL��	8��
y����o�9�n,�����.�9�B�q?n
k�V�{u�
���q�]B��{�|���^ ��D���,�Zl���m������p����.I��V�my�|�|.hv����;b�B���4������)v�����a7W�9����r��ui�t�m�|�"������g��M��������*�;��;�X��.�I<����mA��yVD7v�;��.�9�����%���"��e��{o�<���z��R���[��,}3M4�+����l��#!hXL��Y����,T�5[pv����Y���������|��g�-�}3�:����,���2��1lA�����M�[8MN�B����b���uZ^[�,Rt�x��f9`=����;(���U���6k�q��\�m�<M�f��
E��6��H��bWX��fB��Z����oV�-�1�]�=���l����/^���/�����e�a~�B8���5������bo��	���>q�!h%��)q���i8[��4��H��@�}b�Db�q���������W��U��0�5��%!��z�4��u���o�����)�i�>����b��b�����>.�0��������`z��<4���d���az��aW_����kRb�%�o���0<f���D
�R��B�@����ium�0�e�����2�Gu�n��<�a6�$����XV�-������b������n0t�_���eu�f�l��O�k��������-��}%�[��Yi9�N�
�f�Bf�U�oh���M~�4�M�d�~.R�s��^�[�`���X��h�G$�*4O��x��}.�y������B�pu�����S��ium�AH4�H-�!�p"X,
����h���o&j)z���������k==��hNXx���b�-|����W��`5���.�F���Kk���	���p��4"�0�#�;]N+dKzG��b����G�Z��������-ydV�$vW|��;��A+`h�������%�9�K��-/�}U����z��4�mx�>�������*_��	�
Yyc8[)��-|CW^������fQ���Jf�i�l�����7sKM�`�����t:��%�o�"��u1�����TmO@�0�8CM��0.<������*H���x���C�0���K��i�6c���h��v��]��L��c���W���>
g{�O��J|f��_*�L�C,l�s��R�����
��$
�6�x��Z���z�i���`s���l���!q���Z��=-�m>����O������j���3
���h@U�A,�|���~���1�m�(_s�S�dXX�f�}�� ��s�h}C�H�9��4��'�e&z�W,�c��4<=�B	�`�L�iym�����.��O1����ROm��
�����eR�f����/#+�p����
�'�����"�p��5�v������r�
�+��X��hOS���������l��
>����z�Th)�������,����w����u�I�q�H����`ijW���s`m�����@�������N.��c���7����l����jC:����WV�F�Z��8�[.=���.�ir��-���}�S���x���V��3t�

�@s4�4S��L�YtN>���zUi>=�M��,z���q3h�W���1�����o�=
Uo+�L�X�� �����VK��GM���/��I@�Z^e����R-�����t�����m��/h6��Kr�%9O�is���7x�*9��K���r��>������[��b#z�B��2�7�^���'����_�E�L����4��(4�w���c���9]D/&+'FO�4�
�O�*�=�B�����x��%��.W5te��O�HS)�>�~�uM4l����=Q8��&W|��phg���$6k��:<Ut��^,]H��"b}BK�>��W4�9���|�ba�$����X8��~Ni��LpVl�*O����po�)�b'+�����k��k�����NS=
�C�=��e���JY�cY�nwA��k���.VM%�"`�X����E�l�e�BG��%� D/���e�K,������l�<-�-/h����B/��&���-��j���
����,�-v�_&�8��c�`X�.6@�X�W�U(c~,�xM��K�>��[4�q#v3�P�,�Fl6�Kd��� ���"bsO���,=X�H�%�����D/h��-d<�~����c/�?�e|&�)z�tE�,�$v���?p+�p�\�����oD�5���B\}l������C�G�
��(��5���Qm|����D��+f�%�Z8�T,��
��xi�B4t�]����)���o
`��W�d��9E�OS�Q���E7�����'�,h�?L|Xtg����i�6(X����<�4�v�
��;��|Y���eI�~b����+7E�?��zAwC���y�����$uE�B��p�
� 1������i��ZpfY��XhK�6M��B>��W,���zu���<Vk}�����Z������ap0�����������z�����g���i�>_adY4�8��Fa�9����>���F��l�J��0n�)'��B>��\�����\�Ul.�8=��ux�Xe�Yh��%�����xK8���&P#�N���Cz��- ��!�Xx)�y�C����������L�`��Z&V���]��vx�6�,NOi�������bG��o��f�>�Sr�|\�k-���X%�i����X&K"h�k�v�`��iqm�1�X��A�U��Y`��}���>L`Vt6IO��T�.?	����`�k���"��]h�Xo�az���J"��K���'���p>�������<2L|������WU���G�f�������N��Pf�X��a���s��p>o`�D�0�=n\��I��l��D$N+�c�,���������&"�-�?�=}�c��mf�0�5��7���)m|6E�	*�Qx{�f*S\����[s���|�)���&�L5M�����v����{�i�l�1�V���cm����AO��I�4%���j��)���B�b<'��K�d���D+���~*	�}�S�1���NOi�z6�n�@�Hi�������R���@h?M�g����c�y���)�	����Y|Z^�^���L�"��l����

��[��m0UM��f�;���z�9Q0	����?����p��t0v�d�`��VZA>�=}���hzo��0�)�U��iX�1�q+j&VL}`1g�������U���X/��w��XGa��R����b��k�`�c�Y��4U�]��'^3��0�/�+�	�����K���9d��uK��z���`���S��>���<#9�n��]��,�����EZ�r&�Uy������bGA+�������7}�;�?��W
v�^�
�&.���P�
^��,���������;�����	zV.5Vx����;T��J+t7h\x�[��[v�M�x�w�}�yO�i+���^��D�NE����S���}/����;K�A5�J��P�^t.?
g����.���Z}�"��$�
���B�����`���aWW���,���%�4;
����`�	���1��n�
������,Z�b��������4,K3EC1��I������aQ���q����^�M�qY���M��i�/|�#�����V!����Ze/^"�&��:��hc�M��/��`��Cw�h���F�I���p��6��f��iy��>f��Xu���j�<.+�<���Sb{y�c�����,<���o{�i8}L�E4lKc���>,���>���G���4,��/7�C�U���,�ZlE�yX��k}�>�Y(���L�V4�1��������� �4�Og����gb/xlI%�|Vk���L�y�����2Rkeq!�������\����`�G��$/�f�o���&b�
��B^��Zk��}��x������.�]k��ni���"'���P��E�fE��l��N�k;����;`���x����������X�X(vn��s�������7+����1n�nY[(�l��-����x�������9np�LXtE�cX�w0�a=]�0����;��q��D�����?��-\VP-�����)�0�����/����h�R�����frf���tt"�a46��'���v$m���|���.wF;���BsF,�2�V^@[m���
���(,�BJ��0�� V��M�s����q�w���,=o�B�G�����A�z���������c��ROm�Y���D�����;���R��U�l=���_�PT��L�`i>����7zX"�4h$}3�)��e�y\�'/v�T���Zd���7�0��)Fu����y�8��a�]3�����=As.�^����D��
oTb�����e��_!u�����b��+R��B��	-�����	���A�@l��c���
yDw�I*��
�v�����Hw��6�M��0U��;������aG����4,<<����^H�0"�,4qV��v�tm����CpG*�����S:�j�����o���$@��d9M��
�
z\�5q������3��r������&�`���]���BCW��!$��5<�X0�,<���Q� �&Db
4�I���fS�q/V:��k��o<����s�4.|#�LmIl�9���s|�E|J5A`����1JS#�k�����|��\)<��sH����V��
�zr��9����5w��-/�f�Uh�7,���e���/$�ta)����"��J�r�za��0C���(����@O�T�NKd+��))T{��?�/��a@����C�py�y+����L*,����,l@&f��q+WK-x����fO9���-�g����)l��`yh��)�^�%�+�5��4�e�,Y�2�
[���}���;�bX���~b�L�{����\�`r��K�'��Vy�s[��p>���#	`�nx[������;�����V�+
k�-&=]h��-������4lb*��W�`,�o%]���:E���`;L��/���ne�|�Ak=hZ�lE������q����b�>����`/X�*���Y�w�{����������i��J��e���}�;�F��0b+����#`�	#!`x�_p�h����1'W�	��Z.��<���%����HW(�V+�.�
����)7���l���=q%��"�����1�`|�=���`!`�k��#+le�6�`x'��������V��
�\��f��9�iI&���q�&{,zBc\��P^N���{�e���+��.�bC���!	ax�����[n���t���'A�)��4��	h��`�j�Ta�7���c�����=��"4���i����O�aU���[�4����Q�](V���LX�d�pbof���p���_��D�K�6:��������4��SE'����S9
g]&m�K�U�"gaDP�f�#�y�N�;���d
3����5��T�im[�T
�P�VJ�ubs������Yz���.�j��������.I���Y'���MA)��Ic���@��B�����dYg�ox:{�s3X(Si6�NKd�c��p�9W�4U[2,K4�u���{8��?��S���V��|'K+=��Yv
���-��OO���[���v���|c%��p��2��rX[�xBc8h(@&���Z�V�j�|�4Y�@\�M��Ha�w=1����d�M�<O�(!:������m.��-��3������m��
����f�+(:��������'tC�.��-�<��������0K��i�63Y����F���pn��q�H�)$��_1]&�;-�[��m�����$n��g}Y�X��Yx5	������~�j�R\N�kk:��M���`a[8��~h��9��
x
�bIYbs��a����L�V4�E��`�g
��.�F[A8Z�w�H�h�VI�U��X�6�3
}#��ViZO6S�+�N��l���f�?%�������d��;����W~	������P�4�l;����B�����def�w:
N��lf����I�������^U��������0�!�Q����q�T_uX"��N��*z�O$X�W���L�7�b{%�����`g���Y���|��B�q��.o+n�V���������m��)����}gg���1�jED_��l�?M���\�{�����T�D�/c�x������W�"�����(�n����x�������M,�.�`,)���yZ^�O��B4�L#���]0v��7�`+R������(�f�Fa~��x��������������H�PAlVp9-����tK���p�b`�6hX�(�3�I���������U1g,><��+h�V��Y��z�]�!��-��O�-O��~���<o����R"���'�{K����*�N�i���4��:�h0z����r���d"��������%����N�i��h%\/*[���`W�,������P�����2�>]���h2O�-�uEg���p�E��4l�$^q���lO�i�lN��^�7+�6��r��|��{�m!|g�����T}43E]�tw�R�/���K/�M��+:k:����]*R��V�P� ��rU�G3����s�����������uX"��N��>��������a�`W�p�2�f�}�_3����;{C�`����a�YZ!0Ut�Y�bI,�s-�"�:-�u�Ewx�zH$�s�4g������XX�w2-_�4e_:�LpD������?n)a�����j��*�zKO��$�.�^6����\5`���,�]L3C�|p���;����h�����������M���V4U���'�M����&��x��K�X��i�b�hD4l2(���f
/���|HM9U��V������x,,?���H�G��jX"��i	�	�K��q�@i|1��,��'��9�����w���������$$)�B;/XE��P�A2������J~e���K�*�F����O+d�
����0=G#'��0Uk�N�v7[�Xx2`��>e���`;����VB�U��[�x��o�hc;�X�tl�0��f������7?)�7�����j�
�"A���EW�e�'t9H�����H$��Z����D��`��$�a.���V��m/�r:�n���-m��+���|i���x�/���b���B?�eA]�J4�����w��m�e!���|E�j��ln`y�j�T��D��0�F���X=�B�vY�w1_����bG�e��P�Al�'vZ�����jm�U��,IF,LP;S�������~,>bK��tK�'�S�t�]VK^L�Mt������k��;b�E%��BW�e����9D7�&*�dx�B�����b)���#��S��a�i^�#z�O#3���2[�`���lr����1�-��YpS,L��ab74S,h]��-�KG>w��%���.��������,J�X�iL]IfY��������YV�^�|Nt����� bae�����fw�iy}�`n^���W|�D���rzJ��L�t����������'b��nxR`�����1
;��-�P�E�+�����q��X��H���V<�,���L��
o��:��k/V�(�z(�B��f}�q/���E(O�ks^AW�����tQM���^,)M�f��b{�`Y\z�k`��������Yx)��+o��&�m�<����b�z����%����`��9i8��&����,�E���o�VZ�,��/h�=��H���l%tYt|1�q�t7Yo����3�D�v��f��5��Yp�Z6|�(��H_l��/�w�cPR�,K�.T%-������A�`�������a|Z"�����j;W���9�X�������B�k�9v���iMbK.|k�/hGYc�xwMgtYc}�#�����*�+�mJ���V�[is������e��Uzimz�E�����]��Cl��������kA�i8[ALYB4,����UT�Xh_L`Y���4�)�������5�4F�����N:���MyC���!]{�U�[�����((l��+_L�\t�����B���X��^��Z&}������bsz�i�>����ix��%^Y��|6��j�e�}g��ib0-��G������ium0}v���&��W���*��	����f�����A7��r8L:
�.T`.+�/hh=*�h��8��G3 =��2��8M��:��=�O��.F�D�,����>g3�����%1l��(6wL8-�mXL 1l�
)Ako��6L����5+�r��7l>)��w��E��5}{#��G!��u`���$%D�����l�@WJ��Z�4���H�`�Z�z�<��s��i8�0�4�
���\,X
������<-�-
:��*�/�.X��U)_�t8��

v�����UylA_u��	��,�y���&� ���Z����Y��0�+�i�Y<Fx=:#+o��H�(F�h�FK���������:�
{���w����R���D���D�a�J#W����u�����Dv�����L��r2�-!��DzOS���M�f�xfa�]���Z*~�Z���is��%
�������������D�8�hZe aix�v������-J�`�`�&{��z�Y���
��z3����7�����e.Z��"���iRJ��7
6Q{��G���[�Y������
������
�&6�M>����c���o��Z7����8�j�����sG�����vE8�j�9���p������0C3���zzL�^L�[�
��uc�C��`9=�m/x������V�����`Y���ooT�W���^���������F^4g�F�b���0�)nx������b��gE��z���/����	�4i����o���Y�{A��� �Y(�!
��9=�
(x�����~�`:M��t�}�����K��07�����[pXL{A��?�i�����b�* ���8�
���������9n_p�n|�[��w�p����.��7�=	�j����X��Xi�*�#���H���"���J��l?A���o�����OS���Y��!�����U��X�u���Y3��/��H�fE �a���8��fg����w�v[�^�M��Wl�u~g;{{�����l%sf[�~��Z�����p���oS4����^/bK�������O��{1'��JI����f�o��+��J"�����A��l��h[�}3�w��c�Y��!��(��1�.�R��T��������=���0������.//��-���k��f�Bb;==�]���n�.<�T���p2��X��#6������U���(^l+�o��}��?��n�;��j����`�h�y�l��Dm,��\���|��8��m,Y[l�<-�-M�;.�f.j���&�����4Y��A��p��H��i�������E7�.��F<ix�R���Y������^���f���|��es�-T�n+�S_����c���(T������B�Nt���M(��;o��	f+����7|�w��"1����i���Y�R��[I���,��f�`�aba�s�W2�O�i�	Z��Y����*[��,z$v$��i�lz�0�i��z�o�up���<���l��"�i��/"�,��f�^�s�����v�
s��&o�i�6����p�PlO;�i�6�X��iL	���mG���7V}��_�W�Q��*6���T4N��a����F]&�B�8OOiS��EC��4�Y���c�b�UC����m]��t�EC�4��"�mY���&D�cV��,I,4�4,+�{'Y������O��L�N��j���a��;��ZN�k�������)�yb�h������I�o+��"_��
��Yh-���������[[��,��{A�V��ad��
�Vg/m��g�g
�z)���m��ox���N��L����lAd�65Y���J�������74�$[�
����-I��'���7<�����p�����W>_L�J�M?/��U�W2t��X�S����C����	�0n*�:-�
�}�G��b��
]�A���`���g]q?Z��'��B��m�p�9}�D�`s��T}8��[��>.�qx�
��"����m��
s@��'�w���h���[1d���a*c�7,@�n9����W�5�7�?����x6
���on�a�����c��`u��LxdP��O����5����pm/����;;�������l�e:-�
�k�!#:�\iq����7�K����Y��MlK%7�����3D���F�EP~hn�V:Dl��o�V6d}�/k�o&*�n����`i�r�PJ�H�iymA����aB����l��
K)�n����?x����������t+��SBaw��t{��������7}LU��_&r���-�Q�Q�-��W5FXd��a��X��F�&s��imm-�b	�p����������86���k�
#���b���ao@�0;LZ����h XG3}��@8
gs��������@i0�3.� V����"Y����������a��|����l%������A.P���*S��E�o
�
����5�7�n����sC#C��D�a�����lk�	���
N��������d�*A,i��W���I�����x�h����Y�A7x�����k��
��A�����r�NS��4�E_0:���$�O;��W�f��o�Wn���N�B���d�/O��`��F�n�%!#�BY��W ko(8!�o�B�M����h��'���*u2�+�B��oh���0���|��`y[c}��[��|
v�m�0Uk�g��pAw�]K�]4.��bo�m�t��:G�����?�?4��L��������41���
.k�����o����a���o�������*�9N���"��Pzw?o�N���������i8[#��!�Aw�8�a�u��~#���4K�������&:g�����m���������*7����c���u����(�l6�z<M�y��x5}���<9"M��y��{H���*Nta�������BR[�,r���_�;.���������W~T��V����#���������#��+�6��[�tqEU3f1�`{����4��H����6�H��4�1{������b���AZ���
�F�q�diM�(�l���2%]�9xZ!�r(]�4���H����D~�,��������=K��Q�"���z���K��1G�g8r����{=����A��m�N��xE�o�w,�0[��|2C�5h��o���6���y��|�#��_��2��_����\�fs+�����@�a�9�x��<���
o��^�f�%[����i�`se0�F�V�U���-����
�F*80���.e4>.���-���6��Y4��5���kQ���O?��'$�j�����H��,���>1�k[���l�!qX�-�DO��h�/^����u-�Fv�����[a���`c��Pm���h�z���Pb�/�*H�B���.<��.�o��>�z7���P��ih��;��bH�����&��5
#2�6�AK�6�B����R94�R����~@(M�tC��f������mhK���d�������[�s�������L3�g�i9��^�@��������HG�@���V��(��l%�q�@���S��i4�0b���`����},CO�48Q����=U�����A��<v��L��O���]����
?*��~f�|@��g�n��k���T}B�w5$��1�Q���>]��#!M���"���|�"������t2
3e]H��wX��F,	������A��'{3;`�H�
�@��
z������v*�1}U�����*5�5O���@z��������;K_����c#)��G�}/�7>	�������y��c�FW��/�i8�?H3���y���k��I������o2}�0�FNv�i�6��	�H�� Q/I��H��.��������	?X���
oB�*��i=o%���B�J�i|7�&�i������-o`Ag���p�E�d������E����Qq���0�2����w����`��Yl%�l�p��4��2��w��|����d0+��	�$%M��X�Q���o~���������E���`g
�����i;���a�Yx;� e��>$a�|���=�[9�w�u+3��w+���v�������wvB3-��0zbX�l�^9�����f�7�z;a
�������l{U���
(�:�%}g'<�����a�J����G�F�����m�)1����
vT
0�
Fx�o����V�Me�p�������LE�����������}w�!��\!��r�Xj:�}ga�Q���
v��=���r��<����;�a�*�	/.�b�2����c����5]��)��@�G��d������}gS>��)��H�t�gY���&�?��j��Mg���T����`���i�l#MY�4.�]0��Y�}����Ut�[�U
��������I�`aHNs��:i�V��V5�sI�����it��lZ���7"tu��u�l����������f���Tm���3�Q�n�^��w��C%z��S�6�YIK�t��
�>����o�#��[�k^6a-P�	=��m��[��h�N���e���j�
&����|I�������8���3-$��>�����E�j|��������8l�^0�7h�(&EYx	6+
~g{%��m>A���l���G�o�],���c�p���"���l���U��;�i8��0h.�?�Zx�~_��V1_��uNz�@�X��	��E[������tw
���6�r���d�YC�1����
E�^i�<M�y��}j��5t����������C��h����bQN��%R��R��i�n/�_E��?
�x8�t��u�<nA��YE7��8\�L+Il+���x;yDwf�{d��"�.$4+��#@�*
7��6�d�������lF�����	��fI�B�"�p}nV�m,�`�yR������p��Yn�1�^��q���YI��%�� ��#���a��i0�|Mb;K�47�`���J��r���8��	��]�c���R��^��pZ"[^t�� �:��-T�4�:g=���E����y���hm����==����`xY�1���vj=i�&,,�&�J)��%����O�aj��V��iV�n,�^�d)hb�����-���y}����t��c�
���TtcZ�b�����*��V��V�n,|.������I�,8)�J��i�l|���D��
���B`����/������t�:M��<�.U� �E�}Wl�)mA�;�Q�-n�:�z���!s)D?��>�
O��1���V�v}����@��������	�i�:X����s���sS����9�`�9�",SWt��?
�c�A_L�H,����)j�S��a��E���ES��Ff:�bi� �]h������cF@*�z���5���E/�WF@��~�-���&���
h�v�����,�5"6�NOKd��������Jn�h�4+�{�:D�Y�����J�
Q�s��;K]�zr4.t]K� ��,����h��������q1�rN�k�+m��S�\ ����p}��|<-��E&�-zB�+�lF��j�^4����r�V������6��b�0�.T_4�h7�`i�Un�����^���lA�Y��(���:����2����j4Q0��,�`�$�;y��Yi����:o��������;�$���1mM0�g���H��`>[�1uh���j���6�q�8��S��0�0�F������]��WK-7V�/��)���E8
w�`;SE[	$XX�A/����L#�����:tc���}e����^�N�i�7���l� qZ^�L�Zt�������TmO�_DI��
������������!�B�����Y����U��&��z�fu����LC��h<�f������������Y(�kV�n�-!Ujn6o�����`�S������m�CvL������^0�
���v�v'���������9t�s�4���iZf�:���b�a�7P5���J�P
[����$�D��[Pi��n0�ml��(F�M�;[id�,�
���)G��������c�
�e��x������h�(��v�4Z7���[�i8�^�lZ4���Hs:�OS�����E��<faH ���@f��=s�.�C4�7x���H���=,��U�k�n��=�+�w��lN�(R��
M�����zS�9=��	&�$�"��ZS�,n�Y�A�x�V�{��Zs.��6��BEo�Y��;�
���l/��o��mLLG4l� �V����2��]��&m9�s>$m[���<m��z���{�XXz(�Y���'����	wZ^�@�:X����l)�`}�r�1K���{���h=0��h��fyZ�4[����`�f����K�]���ma�����a/VR�,���M�t���.n�?D��_M��Y�1]\����>mc���iy���vv��vX�+�T��X*��6K�6h�]���,~������f+��I&�*z��.XZl��)������D>��g�4�����g��
����C������J87*�f�\m0Y�]��;{���O��p����D����*����^�\�>��U��]����f���c��@�dG�Xfh	]�����Ys��p=���T{��9��~`U;�qZ������;��n����H;�,�Y]�v���<���{��[�7��Y�J�f� ��%}g�B��mE��yaL�(���W~����
(�T��~nz8�H�~�3.%������ ����i����|w�����0H(�3y@�)�������wm��,ZlO�ua\V\.���o���-��0KS1���bY��Q����U�U�a�E��U��mL�Kl�~�#I����-SL��%Y,��X,�7.;�-��L���DgG�i8�,�(�3�+�����/`��_��&��yD,.�Y��h�P'���|����qM�����1���\��lh�dz�Z3R�e�E�P�E,L����9n+��JJtc� bo� j���nVm,����z�rDo��j�T��
7��%B����{��ha�$�n����Q�k���'��t�����Tt��	}^�BYp�� bv[�������1���������-��D6'��w+%������jE���4��	���[�<�/���na\����fis�h����bs_���pO�0�_��pX^��F#�a��������������L����7+�
O�@a���
[.d��L����h����aT%X�tm�3*�y���*�|�?
g����np�m���(�����
�J�^r�K�q���e\Z���ij_W7�B~�m��^����3�x�l�6�[����l,�KQ��/,�[){���|��D�;I�����
�A��,���0�Ez��4��������paMTF�A���^�`sO��l/�����:tW����`��7Q��C���1��;���]0C'�	��9��NKd��)��.}\>[��t�~�`'}������\fR����3�jJOS����xMC��+�	��j�?�H��A����0T�4

�`���-���<����hz%��������GiO��z�7��M/��F���]p���V�V)
��=22;
��nKK��Y�K�$�Z����R�����s�%��1�����������������D��,e&�*z�PbWl�"t��
(��4������g
oE�sA�����M�H�)�<6d���h��{�[��a������h�w�SnO3�I��Do�%�,.���+l�����|�1�`�4�<2\�9���;-�a�7h(~&�A��Y����4�*���o��,*��F�[W�C�I��0����=-�
xR��'�P���������r��b���s���p6&�K��0�f������h�n�Vi������LW���,�a
�hXv;%��^Zi%�z��,������@���
�4�{�~����
x��m/xH&�;�1����Yy��IS)���lQ0����I��0G.�	U����x�J<�����=z��(���:�w&V�;��6�
*�VLk%�0�2�,�Z`�G�r��S�"�f���a�Pl��m�d(�%��M�Z��5��$�#��s���2�7��D��T��#H�� 0v[���A�����wv�%��Gw�!�l%�j���I%�^��������hhw������(,���+��
E��tn{���x�Q�����e�>�X������oY���<�m��:���Yx��=����i�l<1�a���]t��W��E�
;�0sc������0.��{Sg=-��'x"li�T��oQ�aH;X�\Pl��:=��	�������%�L�����x�I�;�RN�k�	F�
��~"��41�X���@N�k
�v�b���l@1l����i���Oe�5?+L9I��V��"��|�K�����T�E����7���o��)9�B��fIiX9/6���f]����q�( N���p��C�����b�ai6�?O�����&=X"���������a��s.���������M���G����XR��B�Z�Rrc�r��������������O�N�0yC�f6�XV�)��N�,����i�w�f�|g�V��1��!��*��V���%��
uqla��oc�C�������Pf�WW�N��i�l��[��%���|���������tE��E`)����E���4�Of&�#z3����BIb��U>���%bY�������E�������k�Id�?������6-��"zZ�7K�6��eE��^�%-K��0
�qh���YZ�EE�B�Y�1��n���O��%|�-�q5�Bm~�W��Yj��n�,v${��i�M������4SL �t��r��jcb��a>�Yx?v�����Od��O�����a��X�������F���'pZ^���(�Bg���f���lE��YLJ;���jQl��~��<<�Ema�~��-�5���������������b1�g��8
gCzsE�K�T^�U,��Z�%�����E/�������iY����8-��>����-��jdx��-<|=g�����`]�\��q��7b)�b/�x-�1���~������FM��Y���|�9��4��/x��U*�j�m��/��������BQ����k}��e��a�4��hC��x�,l�`�K����b��lE��YQ��8��m�W�_�-�4�m �l��un'���4K��������W��X��|+a�������l�a��t�{s��oc��?n�����R�Uc�0�J��:�
fU��-N����H�0y���_�`�G;���9g��iym�A7GWwH����������7�zC_��_-��Y����{�����Z�6{�?w����f��}����i��A,t5����J��u�
�L
\�/h��m����������/][&|&v0-�9\yZ"��P4Mv�&nbOS�!�4uD�\�G�����3N��imm��ZP����.4�iV�m0�HJ�0r��W�`�@���a;-�
�
:{�N����9@��{>^������wvT�VnL{Xtg�Sb7L���1����������+�ZK�6��
��-He5��6�������Y�+>d�wv�I����V��z�r�`;���0�j����v�f%�����l��Wgc��\�d�$n���i��%��4��mcRU�;�+52LK���:�	�����ocR��R����7nx�Y�c,X����-h�4����3����k�-�!X>8G�>i50�pv����<.|���SX]�|0�=U����0w �R��e���:Z�-�O�L�\r�)m��u�P\l��?M���
{����-�q�����
�����(*6�ln��'z���y���]���0�Yf��baR}��e�����p��p�y]A���`'�"���~l��sZ"�m0�5h�y	;����=/7;
�����,rzC�+�&����&�-d��u�awo����G.�7k&7��N�i8�OLX4uk�?�K���k���n�*V���`a����*�^)i��B6�`�o�4K4�Yy�-�{F����<����@f���t"+&7X#�/����6'���,��\I��l=1�d��d����")&C?��+79�7��?��lO0`�&�{����Dl��a�����ES9�`',���0����+�l��(����X�9�Ylo�7���
(����-w[��b�����+b�����6�������~M���WV��
��_4��%=.�z���[�
����0(+z��
���z�����=�hE�'�wAc�[!�����+�b.b����n����E/V^(Vo������:�E�;���?��;�����w�Nw��M/�E��3�m�
p���T�p���;�z�[���*~���rZ"K��h��+9gm����DC9��e!�fA��(��D6���b.����ni��2:Dwh\�[/���Hf��1m1mj��P���M��#P4]�89�O3�=���Dox	�$6\�`�+�������MjU��*/�U��c�B����K9W����2���9+��]�S�OKd����Dtl�%�;}u����C+h�v�aw&�-�{��qg%��6)iC�7�U�xY������21���7m����-�b���j�L>@��J�[X [?���(�~�^���X|���/�5�s����)�~eau����a�U4�:��'����o��N����O�$e�Y���6%��~�\#�������y������G�iV�&v�3����3Kg[Z^���}��pM����l���B����,K�{��B�#I����"��M7\�w�����aE��\�q���E=�	t���]h����5�EW��5�;t���w�`74	��L��F��������^��z?
�3�U���G,�j��U�nqg�V��r�n�e�T'zA������ ������>p�4��;�����:=�+�z��'X��M�cP�R�U�6<4wx_��]�g�1�.��L����Z�Q���iqm�0��+;`�$X�u�'��b�[I��4T�������L�4U�m�ZDt��)���Y���Q<GS`�������I�*4��Kr�w
������B64a����g#�,�`+��w�%��u��r�hl���*�wkYwx6=�7F:�����z������ih���Jx^����9����6�Y�������BC���(��wr��V�.Z}�Z �z.��+@������wg����~�X�v�@����`�����6Sa&��,j��G�]���[p�3��n�pj�>����X�U/��#v
�U�;������8w����������DV+�]�
'�o&@!6w���^)���6��oH����C�P���`�'��i�l.���P��4�����Y���`���"�����i�N��lc���;[q>X�
�����Xp<��|n�5���b��L:g+E��0:��i�4���x�R�^�p��s.=L����-8�+����!�|��oJ�R�Xygb��7|���!�@�G�Q�0�JO�ny���y���|g�rM%/�_��Kc��i��3�%��b�GQ,�6��h�X��C����a�N���
v�����8�����-��u����R*��l��J��e�;<�E��d��1ln��F*2LU�UNO|Lo�4tB�
��Tm,���4��M,��O�mpyW��a�Vy�es��~B�d�a���-�%��H��(Y������K$�t�������?�����H��^9,U��O9h�����baxU���s�R�PPt>O�����YC��R�������������^4,�U�HF���;,�	��Go�4�#F�D%
���w���xGB�7�@k\xqK����:����

�5y��X��*�����q�K���z�����K�:��;,��E�B��	��0oF��Pr,X���9W
��V����i�&��_r��&���7��
��}FOi�
F}�T7f)����Xx�	�$l�������e�8yf�7e��l��<���6�
:�I���n`b7�i����E�;����@�#I���3�J�>9jN�k�
:�����F������:�A��D�+u�f�t��o�����Z1k�������{���?��F4��|,D���9����\�EXO�{yy�� �f�{b�
@(�K������b�A��LQ�,�������b�9o��p#Mu������O�_����W�^�X��a�)������}���as��i��WY^�s��p��!KD�]hz�X��aN��5��������O�����u��g��E�fY��XE�
Zr���xH��y��N��H�I���}�k�?,Et��Ffad�9�����'�oE4sX��I�PR�������XZ4���]�_!&���9�������b>��%:
g��y���W�����������L������s������T�[0+,T��D�~�b����*���'�1J���\���bG���������7����Y��?�`a����<�cI�^$	�������Tm��/�,�w�6��
S����4�K�{��>g�u��aR��l6��j��%K�^,��#�-H���l[�������'�Jec�A�*$Do�B67��������k��a�=�'��{��D�P�Sl��~Z"[P�a ���=g��]AoV+!6��8M�';4B$�
_<���T��};�%�s.X#�������p�F�]��L�U,�f��)��:��(���w>f����?J�����WS���LmP@�_�x�<��qa,�;-�
Vb*v�{�-!��#iJ���^6d���h��A,�4�qY��E��i�K�}��a��b'��X���T}X^����Q�^n42<���f��1m�1}���O�J���Tmu�2�0��M�n�&�+����������U�����������T�y��
7�������w���cm��i����ni�u�]K8������x��l�~g[�NS��
lD����h6F`��t����!������LlN4?����Y.z� �Cy
�����X���=�[x�;����\o�U�Yz�
�*��{����u�7������>������\%�
�)�W7,��0
R�Y.�;=9��?����B6&`����ja��V�.��E��(��D�E�0�����]��:��Mu��VOS����-Dg��p�Z�;�����0!\,4��X�Sl�;-�-����	�.x}6�{AQ��/��<���`~����2p�����`�C����%��[����+����m��9=����]	�YX6�Mw����Q!��fq��na�a*��m�4�K������!��)m;1�^�tk��R�Qd��i���P=2�.���!�w�}/2cJ{��=�#������yka?�.
��S"9l{��u���*��T�4g��x:M��tMHi��N�]�`�J�V��V�~`"i�W�%b���2��uX�N��\2�q��hE���J�/~A/-�������4?0�8hX�#��ayA7�������B6�`��|k�{�&�H�9��O��$����a�y��Y�w�7'�wvZs>i���-���X�������f��I,�b�����Tm����%_;��m�>�\L���0�a���N�k���?D�$��>��Tm>����W������)�CA��0�l�|zL�0<,F?��a��%
;���S)<�x��e%��KM.��Y
�Y<�a���L��:�5.�w��I���D6��,J���d��V��.���K]Ag	�O k��DlA_��z����E���5��O�f�7����
�b���S�:�����[��.|Jyr
��x&�)����X����O�@��>L�U4;���������AS\�t�;�;��l�����)��o����wv�8�q?/����`qZ���Glg5,����'�l%0�-;X����nb3����a���bEC�(��m�b+n�a�X�yE�ba!��tM<n��5,L;X�St�Y4,.;����\rznx8dL��XL�#��92e��ae���D��0m���q�5��Q�n���T]�,�����U��]^^8��vzUX�V��uxs��������Y�v0;oX[�m��n�g{�l.���NbX�6��?f<���%�|��-
���6��{�^�b���>LL�F���xfSi�i�6'X��h������S,,����������zb����a����KDO0�����a�&�bW��X����������r��9V�2w�7�*����jED��
�x�6���=0�Q�h+(V
��V�!z'��i8@��Jt�z�������������Cba���B����4ne���`2��a��X�;�<�����,��U�?���&;
g��%F����-��Z��L�Rl/D�ex<Pn�8qV�������-����x����p��}��4�i8#t���[���,�`������/Mn�?��"��2���R�P�_t�}��N��
�A�;X��F��8�-����Q��l���`K[�%|��=�S�#�O��L�Wt+T��xAm*�.����I�����
�e�
���]���=�h;�)4Sz��+�b��G}�=���	��7�*X���"+�b�?.�~k@pxL���;W�^�����X��R�U����j
z�`qW�e��0�$��G�.����6�j��G*!]��/����C�bK���'V�':�4N��br����OJ����aa�[���Ph�6e�����h��T�2<��;���l�Xx���Y��X��-��!c�^(2!�%��4��.zb.,&&�1.�������O���W��j��D�[��Yox�Hu����]he:,U<`����a\J����e��zT�6��w�������r��vx�{�[�w6������s��nL�A����������f��H����tX�7�q>. h���d%��z��\�7��C*>D�
�*���EYU������0�J#C7W����a�b(1d^e��]s�n�w�Br���R���)�
k����,tzJ��
z��p��<k�w�?��H�� a7,L}y�e��b/�D
��������D�a`�%�:���d�w��d�[�x�]3����Bj��N|���5
���5����M�R�{uU0�������O�+0���>9I�h�$�J��������,����-��;A���.b�����p�	�S)�i�6d��=U�T�?Y
7�,>������`i,H,4�����Z"�0\+=[��,M�����\h�;����D�>��Y���/,2��E��-	%�V�v���[g/��$��X4��K]�s���|g�}|*�
1g���B��^���RAw�E�L6W�~g7����������S����}�:�~�[����<��]tA�{X���^��^�`s��;[�~X�x0�c�~�K�<��������
�n��YW�&,9<����B��]�)Y����$9\��,<���/Y
��l���sM�i8������"�2�Ex�;J����/��r�E��n�f�q�H���k��+~g7��Z��nk���0�m�����5[��Of���]h�<��K���^P#XX1/]x5��-��K�����;�Y�{�\���X��GkA�uXBw�_������te:M��2t�MoYb�k�,|�F���-C�ASO���a�d+�Q�a�8<`��{aU����� �	S����^J����E����0�^,�7�J���q���i��aJ��J���|o�;�8\���_�lAnhZ�w��
�yUO�5��H�ta":��e���e�Et'��D���4����9!�3�����&������L�PB,l�%�������P�6-�Dg
��p��!sB4L�=z�5i'���^hP7�Ie��a�;#��&����R�q���&�d_�7)�������~�B��n��~���eN�)�|zL�"�)n�~,
K����M�b�@����i����q�H���Uz�m�^����S��B���)�.h�h�)q������W�*�����{�u�'�
]�������M��L�N���S��V'�Z��r�X��k����������9�,;YHtN=>
g����D�w�;�M������q2������Z��{+u���h�:u�����2�����-�[�����,�U�*��Lk�N�$z�.M��N�w*�� "���o�|�B��i�����DC���i����bK+dK�����,���YW����I���X����	�x��������I���,Nlv�|g<Z5Rby����a�B���diX��D��k��<������[��2����p<kV��{b�[i�9-�;���|q<
g#����{����ut'+�}��!tt��&tu�x�
�j����%�[h�;-h;Y���]��R�_b�+�b�Z�AS�L�pq�K�����;Y��hX� 6G����	���}����@���������#��V6h����8��I����I#�4U1�
��2�=2��v�v8����%�!c�A��Y�����P�?-;�p�u�+oNS���T+Ew���A;���4��c�����O�(����iq�	c�Aoz��:�1k��,6w�>-����"W6��
�2E�0��V�,�:�)"�T�����*��R��eZ'�iM����+��4���wH.���ea���D���p�`���R�$���u}g�t�==�M��</��i4��0s����b;���/�=����kZ���
����_J�0��6K���F�x=�f����������8�](�V��LIwZI.QO��j�����k6�n�R��d;Y�v��}�[3g;�����������D��`�9h����D�4�4��Z�m'�cM�+�h�4�.�fe5��Kdc&^���ba��-\��h�^MWn�V����RP��u�`������
]�C~��1d)]��'�k$��t;=.4��k��i�l/�]ZN/x~FW#����C:7py���x�-�KM�!{>����%e	�	�S��	�Z����s�7�����/m�9w�����T];�i"�XP���,�p����qv@��B��i�d�#%v�ap��n������J��h��oU6��F6-Y<�N+�_���w�	h���S�
<N+dC�FE��������I��	���a��X��rNV~M}LN4u4K����r��KzD��]o������_��0l���uG�����9����'����v%��zz�)�zL�0/-�|���^G���'t�/���V��p���q��9=�
7:\�M�#b
�Q����XB
���>��R�m��	#�Aw(�l+h3O�%Ox�����Bc���KJ���X+<OX�tVx?
g+����r��K���1�[���c��)bA7�<��2��[��0��<�t�|������A���`�O(M�v�]}_o������
)-���-3���������P����KI<�4Wk<�_���S��j��C����A_�����n�����`�BG�iY�	3�$M3 ���4L�	6_�NKdZAw�D�u�%
I��l�<-��6&i-��"���N���Tmx����/��v�mc�n��;��-��,�R/��}%;�4�����'^���L
�����,�i�n/.L/�y	����4������4;5����W-�.$3-kZ/����m"b+�{� ���e!�y�����b���N�q��6����:=��c�7!H��������v~���M��=���+:=��c�E
��q�^,oA�`���V:���>/�yE�9h���W�\�/����0Xtc�/�P�[,�04.���j�"��/������f��%?���YY��^��)������9K7/	x�@��\��]�^��*/�L��m`	��|k�a�m�K��Y�X�7�9��k�^L�4<�.����&_!4�,���W?��,�'�.tT[�_,�M��7�`�����lN`9-�m/&w.:�7��P
����Zl���D�b��0{Xl�v��
:\D+�}\#3���-���Y_L�W�`�
b;+���)�nr������`d:��s*�w6��:M��}��WW��l	������%{�-�|Y�h_p����4�I�l����:�ik8-�m>O
-�@w�8�fj�
�3�wg��b9	k��BYf�;�/���&�
k+�f�����z�e1��q�����`���'�:�P�4��{C���=�6i�'��i�l���.���524���h�-��/��l�[�i8�lL~Y������0n�Qk}����LC�4X��S,l!��}�h��yi�C�����&=z�{#v1��W�G������eO� ��a���J{54S.�5-����v�G���>@=�2���y79�O�i�������#b������kM�a�,��{HNb�������:�g?e��N�IW,~�����${���K���'Vma�s�]�D�/��`��$���N�OA�B�����b*���"��
��jE�U�L��bE�b;�����wv�T����>���@��0��V����n�����?�hx�
�R������h��#v���u������#�{bY-���d���<�%2
?����%��j�+�Pw��*����4���,�I=k>n��a%�S>�����{\����<�[ ^V��.��a�����fY�~���d�at)�	�5k��S��mi�P�u����_0>-]y!�6|����D��<�%b����B�Mz��&wX"��S�������G�;�(��[�_p_:�������~D�0Mt���}��O)p���!�W���}=�
C��5���:|�M�!�jpES�Z�&�;"�*����>�`��,�U��[~1ed��52�I��)u����|Z"[#L�P�]��]VK_0v1$�	_��6���a�|�a
�P�a�}m�������-������%>�o���D��,�P����%����.eJYy<�i��%�^Z��W��V�q����5��R��[�{1	@�TC �Q�����b\��i)� p�����!9%g����nZj��h�PV�^0t���Y��\V�^L��teW���������o�}��������'-��e�����l�h�X z���h�I�^�O����`�����r"X�z���7���p>��x�hh+��&��b+���������f�����il�8�-K��]$�=F�fe��Tm�@�j�9��4��u&�,��,��*)5������i�wIKC��R�
>���sZ"�"�y,ii8S	���\#,�Q��,K���tg:�b/�YK���V���.5L��J�a/�f�����)�Y�<C�B����6�]P�]�^�2@t%u�j�9���pQ�c%b�>��]i�U�i�Q�*K��[=������w���(�%X�9g~n�
�=��IOS�5���b���l����oF�������"�zb>j�����f���7K���2[�O�<ybs��iy///z�Dg9��p���O6�m��$�P��-��Y�����O�u��e�p��%��>�*��M���B�e5b{r��Vhx���:&�e�s����?��gM/|����I�f9nb;3������m������w���������"4���	�J�����w�0laG�l�f���ox�]<.$6������9]����E���jX"��m���*~DCUf�����b�MS���O�,F�d��b/Vid��5x���Al+���L������?�- �Y0Itn�{���=
>�m1�
�	�2G�����bs���c��`������qX��fk�[(0����LOW��?f�7sX�����fG�i�lP0� ��%���������7�42[H����^v�����[���Tm@�D>���Q�-�=��x7����Y�2��Y�����`E���{���`�
ED
��=���`��/�j�EUN��z���a��mU���k������*�;;�������$��*h@oK�n����8��X��is��o�5�sb��X��X
���
�OKd�������|�X(*.n</�P�-���V��0 ��x>���Q�n��&vT|�V��L�Wt��4���������B��l�Bj�pe��c���&����mmZ��K��
42}�V���R������ay��22����;��(n����(��/���9�������a-V�����������	,<>����H�.T*lK�nx��F&��S��I*���;m�� �d���^�8�'4���8������v�0%$�����������cE]�s�}��_J���`����M)���������1�+Y�H�[��$Ag���������<n�c���QA�P,�u)
�9W�=o�K����'L��P3|y�[���)m�2�g����124�����q�<�f��o�(��,�%'D�����#���`/hi�q?-�->&/-�A�F#���zS�)���?-��>&/�-�\pY���lK&�/�R��e�aA�h�~0[��,!LK���������^i9=������pi8���z���F���D�0HlN1:��
��"�bV7.���0\s.�@6F�����)�����q������Z�m���U���1j�bZ�t����O%����������m��
sL���w�`s[x����|��"f�]�����6	`	���Q����L����������x�==�
����5$�^0�l�_,��K��`��EO��I��YZ�,�D
���`�b�iymM�m�^��m0�z�7m��cZz�fH�f�����%�ir}�P��,�:Yz�m�S)W����l
�`������ �%��#A�=KoX�'�b(�,
c{C?�������/8,�Lk����`�I��B�`;�B���?kK��E����
?fX�7�0���CS�M��V��B�����r��I��NX�HE�����m[iK��j��#5.|����M�r�:���WzIiC�8����5(�Z��)�poX��n�,���6t*ZK��kZK;�A~N�Q�;����%�,�2�E����k[9<��|���IXX�l.W;=�-k�0]0�-���|�yS����J��e�7��%�
����IP�4U�O0�-hZ�l�5K�W�)my������D#�o���J�,��aw�eiaQ���=H��z�d�`����
�;��]��Y{39l��� ��MD,<�-��^xIxW�u,���^t%��j�&��ShO��x��
���cU�
m��a]���pdYX��#�?���m0 .Ak(t'Ak�"��X���E�����#�-_�09GsNiS�%�9*��`/x���N�i{VT=����dp
,=�$��5�3���?�5�#��h���Xb��P��������
����o�G���=8��dK��������zN�����Gl����m`'9�lVi<-Q���������I���\�E����Y�4���w���"�l?�'�f����c?&|i�Kb�i��������(���>Kq�<U�;�7K�4��p���� �
?�!��������l��;���D;�����[1�.��������l���?���,�-��H���f����� �?����E%?�{��l�����%���|H7����s�D��"��{�v<��e���,��OX"���Q����D�����H<��j}V�
�V�����������\���hkYM�����J���<�?��5�)b�-(�FJ
��\)�����I4������.�����g��l@�$R>R��i8#���������K��s��w����\QvzL#���34������n���t��9�F�������Y9+2D��
�%��&�����\��
h��&BB?v���i�6
Hz����r������r���?�X��{�l�@sB4��K�n@��������"v���l��4�44��"<�[zL�1���G_��!m��a�l���rHl��X������*��6@
����s�"X���7��T���H��?z�O���6�CRD�MJ����`�5�t�V�3����9M��&}g�5?��&@����x{�Q��W
��V��-Q�������G���M����������{u�ar����a+��?�s�?��6������%?��(�-T�o��/Rv���!y�n9�-��^��;�����H������V5)����~e��������0��]�	�����?^���
}������1mC�K��"���/���|�,^Z!��������p�6Q���n������"�����/��D�Gwx�	�&UL?�\����Q>IhNKK�>������8�K���#��?�f�;���Yu�{����b��MMx7�6�S��~3��0�����zCU�l
���v���8|�ZE�!�@�<	������`�;��)���'x]x� �0�M���������A���K	��
���1���}�NS��������" ���e�����j==������~��������H��}mz��W�w���������)m���j��6'`�������I���y��^����)BD�4jE�odxHK��s�~6c`��h�cvX��c;t����{
�1�>#���c���;�G.�����0*;���m�6��p�����0����&iw
������\%uN����7�4U�N�I&��T<~n��������%l��M��(��V�{W>�i�	�fK6�(N����%���`;=�m6hx}���hc*?M��,�
�T���kY4�?�2��y�?��� �f]��
���?H�M}n\����I��jhU�_$XXmj����e;z8�F�z?�}�
�F�e�a1���	o�oxl��
��tl��o��Q�-��*�t�I�RG�l�r~�J���t��Kl�X��F�������3.o�o�� *c?�W��F�S.�g��>��^�}��-�q���V�\�`�F��s������q�d`����1��kx��
���=-�����;5��M7�p����g&�=?k�`{�(K�����J
Uf���S���M�H���$�m�a���z�-S��[�7w�:-��"���{���V64��$h]�&l�@0������6�-n����a�`g%�m�A'��+��|��J[y��c��`hz��n�@��W4Ti
6�g;�����\�VV����KI��

��V�w��'�����(`����6����`g%�������]����	kf�X7���:��,W��������Bp�s^�wv2�������6��.v�.��_�V^tN(;
w{8��������8��,���]�����,=������z��������^,�X���M���n�/<=�����{��J,��EMI�M����fg�iu�W�+`�E�����s�����+0K���SJ�fe��-/�V$,�(lM���]^���~J���t|~#�S�i�-'��Gm�~����1�^,�E�d�b74,)_��,)A�)�|�����D��{����/+���?z�H#�(X�5k\x�k�B��eEy(o,�fA��Z�I3���\�s]���T#�	g:��������wv�=��B���c������|��`W����xb,�� �tYN�b���7���
�R���8�-��/+�_�V�2��/�V�����r�K��0����R������a.��^�,ZM�b�\��	���UiN�i����Dw��+�a�|b��lN�(<o�NN�k���@��t�b�����1m=��=�����v����Li��������^�<�	����J���/��_,�Ct)�`�}��$:/|gs�����l��cZj�f�\��z����qY>���"�����o����>�`WA������d�Eo�'&h��_��������n���I�����!�}����K���)m.2�_��
�F|s;���0n+-��E�*!!��qk5y��B4�� �Jz����x�G�T�aWj�,]���F/��_,I�f�hb�{'-��c���/����b�[���7.$���pX^�_,�Z�fZ�b��\��u�����P��),��;Y���B��eY��_�Xge-b����a��������n��IG��0�)X�'�~���ic9-��E:�b���v�b7+�����l�noM��6A7�=�������R����g%�ga���D����p����)�Px�r���&]������9�iymm2ax�����D��%��J�����L��>;�4�)�O�0���;'��7����*���a����n���0����E/�"��{iUm|�8i��w����4UA�<N��[�Y�v�{=�_�5n2hN�k:>��/�J����x�X�����<-�m/��$}�7dIzX/�����<l>+j�xd����Up,[�����L �y��P�YZ�l��!��NM��_�64���A_��M���c������/l�s<M�vS������l�Xx���MSB��f5���/X�7d>�o������4p9�[��i�l�1�5�4'|���
v���`g*:-��6��t�q�v��J	��42L���,���k���i7Cj����o����;}����������6����j�
�6
;���+�����E3iC��pL,4��,_X[O�%����pJ���~b�2n�6�����W���������z���A�&��Y��-��U"�VZ\\���`e���+�3�����>���u�0�=�P�q����������G|.J`��T�a�0X��Y,�Y�z�X��F_��L��NX/+f������,S
zU�8��[����`��F�0�t������x����ECso)?�}��B�8?pa�t��:��2 %�����������z��Tm<��T�����R�b�hNE:��m'Xw#f���U��f���c�f������+baE�:�}�������xI[N5���A���9WD1�����~���z����I����r����=�9���iYb��b�{\�q�2����4k(|�THZ0���6-}��F��	[rbl/
��|,n�p1�g����`F��m���'��f+�kc�����[����-�CkH����e��!l�?<oI8�}.��/�~+a0�%:M�#��WA�w����*}�(�^�����K����U�j�|�-�^�����\��5G�_��i�\�V�:]np�W����$��
l������-�3�~��:���&V��e�1bw!)��x����E�G��m�b�n�'f�<�9������N5|�ty#���Iz���o��5������F7+��n��������t_9�P�
�mLbs����
�{���t+� �u[���{tI�������t&�s�1�^��B��m������s������O�����
b;V���F %���i!��	��������w��M �K=�~'��~��Bz���)7���_32��,�d1��9�V������N,����+������E�3���q��lK��i�l1w����_9��OS����Do�+-6���O�i;����
��>,sF��
��D�oK����[(�4�M/��)z��+��*�0Uk����(�{���"=����*�=���4�
?���:n^�'�P}[�
�����n+��,�\�N�i8�6,�+z���X��&���y[(�����w��i8,m�4��*�[��L�[tg�V����I���9o��B>l�5K4t�{W�1k������w�{�mn��J4��6�
��j\�[���-��K>�+��
�����o&�*����/Q\|Y%���/B�)����>�Y!��B_��������,�p��+��n,��#:�����a�N��0Z,����F��oV6!�AgR��n!�����1}23�[�Y��;��'T���D����7�
��<rr?��j�z,$��rJ��M$XX��9C_��M�����5�������Gfzb�J����I]!��h>��\������qa���/l� ^��VlI+����C�.���<k�D���{[�6
�	<r:NS�9��]
V�c/OR;.���V,�����3\x,�{� �h8�`'�2-�`����U�5-�{3�P��Pu[�7�`~��]#��F�bK�`����r�h����[��������G���P5�4�a6NS�A�4|ok��U}p���^��ux�4Xnk��0�t��}��`g���N.�l�������db�b���immA�4�C��N��`1}�������������X�L�B,���`1=UTA_����{X]%��x��zB����������Uc�VZL�h�����J��E�o&�,z�{��a���������J�YG��pa-�"G����-��[�j-Gn+%CU���'�1�oo��[)4��o+%��Z&�dxn��M���*IO\	o[��������
j��Ji��t���d���e���B�f��i�2o�B�$���o��}*��V��������Q��=���O���W��`�X��f:��'��Y�����>��BKYC�v��]L)��}�M$h�C &h���Z-)�C��k�S��w���}zL��0#5�|�=
g���B�n��9
g��D��o�x��q����9,�C�r�O|��DR�����`�l����u�o�!J��"�Kc��:.�w�
������z	���-<�OWx������Pj������\�?�`�
�K�lW6g�����:�%X�bR��zb��ln�sZ"�0p�^c���f�K��R�e����x����T�����3���jU����U�E��w�����Dr-vu%E�>�������o�L�X���,:_����vzL�|��	�
,�6�KM�`s�a�,X|���D�+�������	��<r���.��)z��[��C���L�Vt�$��Y�;��q���!��pE������IA�J��mo�7J���]�n��,�k�Bk�����M�h�'�W����a�}%^R���M�u�0[4�
���a���~b%���[r$�7�fE���D��a��.��f��j9
w{8t����<b[r;���<U������fO�D-n�|��>����k�m��#�a6���5�����c>~L��A��C�,�Rhn�pz�����%��>U����y�EO�6Kw/���`�1��,�Uew��%g���0�J�K��+,��*
���Pp�4sK���|j�<mL�Ctn?����Z[�|7K�6�"�P<�,�����5�IT(���e�/?0}��[��iumM���6�`��&������
Z��J���Lm@3+h�;S��i��&��#���j�����+#���X�/6JWw����C���~�
H���4����������D-mL�Tt�b�����y�,)6��g���*����6���������02�q���-$�5���^���'��$�mb�s�&�Y�
�����,XX��Y����F������oc�-����\<���-�h7��6����h�W���o�����9�1���4N�n����4��������f-0���X�����<r �_De���0be����rbDC4�0>p�r�@ai����q[������U�27����t�k�r0�M#����N(��5��C�z���]qyZ��AW�O��0��f��k�f�Q��W���?�f��
�"�S
�I�����bs7��c�Tg9<�s��w��e�|Ba(����B��1�����#6kx��j[�� ����;��S�`q�P�p���e����L��a���BN��L��{z��s�q�P�!��}2C"����e�	Bi�5�,^uZ!�t�	U�p0��
����6��-X���m,�Z��Yn�BU%�;W��+
[�����X���:���U�<��v{���J���u�k]�y�:['���l�U���YC�����0j����pc5�/�Y�)l"�+n0���=�����,g��Bg�V+�����	D_��=��:�V�4�YA�X��Ko��'c	z��G���������^hy���`��h�>on��Lm�AGN�<y�QS:k�gnL�Y4,w�+5��(�yJ��M ��4�`{1�!�F����,7K�6h{
u�%|�f9�U�^x=1<�5naqm��=+h����@��
@?/����E������44~4|��������+uNV+nL�X��n����T��M���������N_"I��w+�6��+����`7}B5����)`�����hc������}Rp�4Um�m!5\�A%6��l���*������I.����~���E�j������������-(���Y�AgC�4��'��t���T�M>n������
��[�����<.4�%����Z�t���������n_�B�����V�k[PL�Wt������S���l%�n��D|E���T7����H=�������K)����*aw������j>���
_�U����Z��E_��.�M��J��R<�E{RZ.|+V<n����g��C�t���HP`d�^O$<��`'��������6�`�3h(�%����������������+?�- ��f1��=K����,=��[o�������T�a6��J<���
V�Z�Nu��
��vx��N��D����<������^0u<����j���T���@4������N�iS:��:�Y�{-v�����V,n0�"�f��j�����
��A��K,�`�*�/�xVJn0Ij�p�������@YnLdY4��J��a��[*�i�l����;��v:,5K;7(���w�2��xE����$���,Ii�M�'�"�v�2��;��K�~�������P�i�l������w�4��	��4���a�J��E6��;��nm�����;�:fYJ�Y��{r0�����`�]�2��XX��q�Q�qZ�vwg�T����[�3[X��|����e�r��`�tkhC9@��H�;����bZ��p��V��L�[�L��i����>;��KWUR>ng1d�Y��������7���Y
�g��*��B�n�����EC������e���pu�[!�iu�W>e8�X�Ql�����QG�����f�ay-��Yb�h��^j��N�`w�}��&.��
@�����6��f�L�B4���}
�-�����A?LAA�*�"t��w&�#z�v��w&�(�����<;M��}g����Ud����i�6dX~�hX
����4U��(z�d�;�|g�v�w�*Kt��w��M��n��6V�{A;Q2���B�^O����f5��T}�3Gd�j8{eo�rE�fYbK���;K��b�BW���[�;��~."����6�n��rwbW�;��-�t�;�J�{>��j+��h���n%���D�\�n5k��
����x��>-��'x�z�k�X&�S���1my�mD������r����6�����[U������;�X�%�Y
�I��������>��6+L����K~��E��l��x�hz~Y���x��e�w��k�~wg��/��4��
v��|���	}?���`��;M�&+�=Y��X�������
����<-�M>&u.�7�}X-�Xw��Y����0�[a������yb���q�������:��i����������k�1m���������s�g���cZ��3}v��I�G��I����J��������e���0�����_����YqeZ�C�{�0E[l�nP��i|�]�<�n��&A_���.�&6S����,{��&�g�^p����@�K��T-��wk�w���/�
otb���%*��
�N�k[�����0A-��,L(��az�d�Kg��T�f�ejr6�q��jS�A����b����Uh��n�3eA�����d�X��39����2�%�9���������������=�k��;{��:�O%&g=z�@\t�<
g�������k���l�X���^�D�d�`�2��7���,��M4^�s lA��[��C�}�p������z+����3R�
������i��~*6��������p���Gx��
�
)�th�H����b��c� �s�7�]��:��5�h�cU��F����UE9��������P��E^���j#������v���{�����[����w�9��;{���`7�7Jd�}�^���w�4� 6������5ZA����BG�n��N���@�a8�w�:;����;ae�T8��	��71����������u�J�0�4�i#����4 ��)w����a,!�R��5�;����1��J\�z�Z�A_0$)�rh�[0��t����]���V
��?.�Q��^�-��V��VN=�R��3�u��N������*k��:��Vy���p�T�����X��b���Xy��r��>�`h#�W����0,l�D�,u�ad�OJ�8
g�	��MM�`�uQ����;������N��������EgA��,�{.��*/��6x:X'~��(�a�q�����%���4l���Z��'Ag���l����t�oz4�%�����E_��
+�wx��uHb�E-���"���i-����E�
�(���*���V����
�
=H[���������U�;L`��7���2}Z�WE�����}Ck8X�I�J�)<��(A�_�V��lM�������]�f�����D`j�V�.;���0�%���xzL�0��eNpv��`����&���N�������tYI�����c�������-�����I?.�z��8-��'x�
:_
,=�7/��D;t�K*=���{yK�?L��G��E����b����~�w
��������H���"�����V��9<l!���R�C_�p�1�X�����*�������i�����q���B%�c�o��?x������5?=��c���4s!����b�d��s�1��(z�������,��O������C��]^^��G���������7�_Ec�)F	��P���c��0A���f�)��U�]$���:�����2D�6>V��Z43�p#z������q�P*������x@����N��D����<ev��bU�_���i��{3G����C���4��c��0��N�i�����f�+bg����j+��v����b7�~�*'k�?��&:�������0%l�0�Bl��?M��+�
��]����b��9�qg������S�M��V��?�3�Q������7�])?z���M���]hm�Xj��f��P�@,����x�%�U�\���X��-#7�@[�O�X��a���a������.d�>��~�1r�������o)�:6����\�wA����UJ�,Q]lc�fb�$0|zL�O0�4L���
��	��`������/�����:��T��u���tZ�@G{��%���J�����s�h����z���,��|�V^X]��Lp\�d:"ba�K��6��9�r�P����O]iw���l�)�T���Zl���G�|+�(��������
b�6���t�S�"�i"�X��~,�P�+���q;�s��8�rE`���8���X�X���Y����c�2f���a� X(��X���n+z�^��,�$��pQ&����p�Q���h(�"v��c�
^����|�9>~Z^����tv������d+E���'Q��r��r7�"���s]���l��i��h����_�pB�Ml�����f�1���}giR�Y��.\'d���l�6P���b7�l%�]�������iDW�Zkh?�>�t%�m-��������w�����^�`���3�N�k&�Msw%��7<k�J��7gg���c�p��(�g�?fa��l�
�����/T�?����w�G�����Y��p�6U�B~��M����.4?z�I
��M�p����w�z�L���$
�N��L}6C_^�0��
/AC5Y��r�TV��t6
��
��U��*m�,[�B�*��������?
�}��~4fo���e���>o`���l��B3t�ZU��������s4�;;*	�Vh~�,�i��,u�{^�]0-9���yZ^��L1Pt+��<V�~�:��]���Xe
���9���|ZA�!��L���C;M�'L
��KC��^������0�[E�w6�����3:3%�/���M��Jl��B�4)/h��V��Us�,�@sS���+y������J�����[B�0�Xs�pXW�a���i�l�06���\b��������(��D�E?0MS,��I/Y.�����Z���/�����+}g��m������������	=��aZV�������zlVh���;-�-k��)��\H�^ ���3��*�XF���Ao�e	�
��]&���E��E�h]�����U���4��"vCi������]�=���K�:����U��)mXC���C
�Y�G�?�������D6�a�I�4�N,}�����.�*���SOF�9�z���,����s��lz�(�
�m���{l6�O�i�wc9c�
�lKF��e���h��0H�
-�`/hH��a���-��y���_S��
v����u���wUL=�w?0�\t�b���AZ�^QM�JS!*�;W�k���0�����_�a����q��Ygbofa�-X���������OY�+����������$�z�j�T��/:w�:
�=��Ew�C{�_$f���wzy
��a����T~���xX�w0_�0eYlc�����N?$|�����8
���W'���o�7g���\������)�.�A��t�H���3fN�aI��WK��/�R���X^v�K�h(�%v&��i�>���L�,����i�;�^p�	6n������`!2��8�����F�hv�{�=���>�F�p��wjX&V��Y F��J�<k��%6�w����`���U��DO�[*]��;�����rZ"��,+F4L����|[��B���.�Y%
��m����r�0�/��zdh�-8o��|�k�.(K�&m+z�\]�p'������7i���)��'}�4h���I�bq���19,�;���*�/���5h��!���m���E�[h��D���_Db���R,4������*�%=��p6EX�Jt����2����������?����"���O����W!�3���c����&.�0��������}�9���u|a!��
C4���h��tK3��,���:M�f+Q��� a^�G-�0�k;X1��]��[�5k�N	���;���A�a�U��*K��M�Pg��ag"��\?��� �aS���'���y���,���jV�-zC3@���E��S���)}N�Z����,�@����������A����T=�0k\��X��G+��}���`w%�����������o�5������R�Ys.��V�LF4K��,�Ql�8?=�
��*8WH%�������>}b�H�7���-E6D�����	#�����-�@��@b���0U+T�P)&�����u%z`e�_���z�w��25�YI��@��`n��<���#����l����Wm
���b��o���^�L���w��	o~ �yz����b��i���0L��C���^�U+��rq5�9'������!���"3J���7a�I|g�Y��[X]�|LTt��=
g��0�����m������d��I��.]N�z:������Ea�������n0�,<�B[Q����`��&{*��������^�JL,��[�2Vy�����X���e[f�+��NKd�	�^��]{V���N��F6����+tI����(U[x�	v�mL~:����)�����3�pa����`/h�H&.�-�gw����OG�h��,�;�.��a��D|�n�x���
\��z~Z^��L$Ft���p���m����A�seJ��p|Zw8����
�������/���UI��������J�wr�\��Yf���Hf��%��T�,��=��������Nm�,����?~ga�<���~�q+�U�i�1��G�]�bO�;�"ugv�2�8�S�N�i���,���Qx��;adN2���e��F�[��w�S[������i�l�����E����]���4�I#���,�D�-�K�'�����D|�5e�\,<��'X���7K���m`M�]������T��])���-��
M�@ao=��VA,���
o�,�
�`*�������z��
 �
��-$�G��������+e:���A���=$-[�]}2�������������b�0�B��au��T��pA_��(X�mA�
}#�v���qS(����a����-�������-�u���rA/x"��B����U�t��t�������#���4�{w,���aQ���(�����O�iumA���a�a��O�������}C�Xx�
�q��K+X&V
L5Xt��^�7L����;���LC])��X1-�	:�s������'��
�=��55�=.Kv��)�����O�w!�kZ�x2]]�������ev��l�|g��l��83L�
���]�4��
��E�'K�}��(Ff1n����b��iU��29D�,I�b�_��E��N����*�5�'��}�H���r���<=��c���	T�n�V��,!z�4?�+A{��������m/|L5��/�2��c�7Y��cZ{���h6� a
�X��Glg�r�U��zZ�*����tOkoO��-z��	�� �2��=YMtg�,���e��P�f,v�@�iqm����i������j��	��f~l�����<���z�B��i�r��}���G��{�qB�D"��	!����o��I?�0�XV�X�k�H9`���&�"������K����3X�:GlA�}Z�|2/��N_���|��5���u��)b�B
���xn%�q��z��������Tm��3��_�����%�L���)W�#O�C��i�o8U����H��<��6�]j�o�����W�qZ�|2�r��	�y���:M��<	�����#�%��V��l�@?Y��k�>��V5���~*�S�p>����	����V���\�������i����IE�&�����;�����x�Y�<Z}2�<�
�=�}��q��{zLn,oX��t��v7o����l��������u��_���+��%��������iymm��(�\������`il�J�|���sZ^[�L�^t�~�`��'�6�����?l�o���>=
��/�bb�����i���_�i8����t!�nZ�� ���%�����<W|���qW%��r��������Fl)�����$A�R��,���"��96wZ"[|��&�~xf�8�n��l�����B��t��	]uR�g5b'��i����_
�����N��h�h�Bc��.�$��������`+%J��&� ��6VE(6;�N�i�.����,��k��wzL�^�7�������B���v& 
Uq�[
�7!��0�Zli�l|��Q��i+�]0S$�F�heH�06+1V�V������ ?5��`2�G�7��S���4��

��[
PK���(Ff�f���G��&�A���'�~hX�MA�����?�=z1y����w�l�`���w���V��V������>}w"��~��V�������L^��L�0
6�D�������E����lnp���hXJ|~"
V���4|,��\����Qck���MlA�wZ���oh5uBd��D�19`*�f\)�>KM�ba8*XZ"
|xK
v�����'4����(BM��������;%���E�,i�C{+��]�z���W���j�S0@��>�����T�9�����`�b�i�l�M]�<�1%�	����.�VW���?mv�nhU;a�r���D�V�J��������@��7�%�'��M�������������OK��H]��/%�^��Z"�VoN��`�&���V������������D���`s=�w�\���d���iiP����n��1my��K���K��t�9M�VL��g�Um��LaK�O&/j:G���mA,��b�)uX"K�Ox9	�:e���K������Aw�R/�sX��Y�7!�U1���>��t���4@�]l����j�{�X���V����>a�c����=�V>�5!�^	G[q|�t���X�/+�����c�&���kr��X��O^�l�����hZ`*qv�J^� ��g���W4�"���T������+duv��,.����),T�%�NKd*�H%=����lN�4����d�w��CY�`s��wv������x�!%����Z,4����&��
��m���~]�-�������44�$9��qsQ�w6�	���V<N��0�}�f}gi]�$��3{��TY'}�rji���N��[=u*��M>hz�+)�O(5,�t�|�����T�E�����Y����qY�<����2'�)u��v����A�S�TYh_���VB�:�i��3EG������a�.���r�,v����h�5�,k���D����bs��iu�.��l��}XhJ�bg���\X�%^"8����*���rP���
5��e����8����b�������N�����Y8��#���eqw��H���B�+g�U)��0����d
��b���4U�mL9\4��y�?�{�w����b[!���N���3?�Xr���*^l�o����"<�D��e�s����YH7^�J�Y��XVM����b�i�.�&Y�h����/hR_�[��wv������HM/��Y�/BD:��{zL�^���j2xc
�����|++��>��z��������b;�5#Y>E�N�i����E7��������P,_t���������;����p����%y���O�`�Y*}1�t�P�Wln�z���'h��V������X��$4���V���;
%A�>��ln����J��M/&�.�%y�B�fY�|��I�p�jr\8�-v�X9���"bba6���m��Ew���c�b/��b����C���iym��De���Z�ey����;�t�J �z����,���i����~g;��{���iymg���I��{����xN;�8\��l�^,���t��(����T�MC�]��)S�4U^,�Ft��=
g#�;A?0R�����#��a���x���u��fY��]h>�,h�X���(5|�WM�uYzA�O�����*���a�JJ�5�SZ�����?��%�zV�S����'v���-����V:���A�Q�����o���.��/KR/��$5�����.1j�R�oXW��
/���������3|�C�����l���4t�x�8\�&����$s��
��,z�t��p>��|��R2F���G�|����C2����$S'�$�a�m�������d��l�B���b���. �b��������M���Y%y�������e����[]����2G7��x�pu�b���a�V����Y��~�3Q��-�L
�����BK�e��
��sK��p���t�W<
g{��A7h�hd���0{�s.�L�+^��Kt�W5��3%�d��v���@0�:���a��������q%�����-t�^�I^�8N�(�.�$/x��^� /���H .P��V2�,��`1����������d���$�a
�d��"��&R���\Y][L�A���\��L�`}y�[��i�l1�#����4U[OL�Y�b:�z�������#~�Ja�U�a�Y��j�d��tpIQ��$���N�R+JsN���hc���=��%"��[wYz1+�0f�3=����`�p������������	�kiJC�F������0�M,�eO5H-�-����_4���m�g
�tC�
�����
��	k~g� �YXwlA�hY���}A�G�Va{C����+�&���fc�Y��;���"��t�����a�����s�����yqK�V��1�������w���d���2�r4_���
��1.��{\x���M��A���Eo��#�q�J�R9gw*u?,���i�0hz�]�pk�e���c�(g*��7��jdN�a��(�5��k��pa�B�f��.��G����x��������-��J��E�T�	z����X���1mi������w6c���u�^��OKd+���S���0�b���;t`K���&G��1m�1uu�
���0�L���Rf�/Q�m���V�t�M�]������b 9O��i8[1L�\t����B��e���D�E_�l7�28M�����G%�o	��P��r��y�����T��!���j��C�o��{���M�5��C��N$�^�XX�v�=��R�ba�*�4�-��r
�T��e���p�\��,7;���a�I��L<M�t�Kn~��B�&
�	���&����Yn���������m���|��tee��Cg��,G��������,�-:��|ga=����>���[��m+���6��q�wJ9x\��I���-]SO�{{u�oy���,D 6�����c�U�b\�0��gv���T�)"�3���#ay�����R,��k��m?&|W�fN��k[�{3�n�L�L�fW[���b1���Z�����Y���|7������������=�����X{{3
	�P��#������uzL[@��)���X�>'�*��lhCuh���Q=2�;��zL�"��_tgnv�����6=�%
���f�n9������i�<���'Vz.z�+��p�F�0�&�.�wm�gg����EH�~����$�avM�u[�;}���=��B���^��r��El�����E357���[v[�{3]W�����B�g[�;7�8\��H�����P�-�
#���h��p�	v�M�%�7�d}�\�
��0��i+���r�Nd��
��R��6[S�av�K�<g�.�������d)�������������ob/V�$��/�����_�9-�m6�}���X�I�;k��+��?n*^=����7�w=+���7t�u�.E,�>{���6�y)��r����v�H��6u�
M�@����Y���hK���X��g
�5�s�NKd������Uw����~l����^)������`V����m�r��L��6I��U��e�~b:�b�c6��M>�
#x�v��,��vT��l�����&�j=�I��+>nE:m[~3Ax������0#@j�p�4n!�{[j����bK���7�
5��S������`i�T���yO�k[�A�4�`s3��l.~?=�-Uh]Ic�$������{������@�frZ �m0�4,�;
j1�Z�H�){�4�M �e�k.|��|b3b'�������O�����b���m��t��q��6x�}��?��u�7�t��=�j��Ux\&�#���Xz��l�4kK,����k��;;a2�t�Sz�iym,2�#����~��k���*gD_0+[#C#A,4���}����
qZ^|L>T������C�zb&%�R����`������w���i��5a����D��y�#>M��&�������
��/�����M�[�]�B�e��b�J��{@]$���(r�a�f
Do��x��i���j#�~�����B7�����c��W��/��>��o�n��zbh��=&����EA�oS-�{Y��P����������W��J��{l�3@t��`��>�W�%R��B��{l:\#�c��H����j8�nH�%����7��<�6�������4l�+vWR�,����B������W,���V !�J����7����{��5baxZc��"���~�7L{�������&�������np�=�y�"=��i\(� U�B�mY��i}n��X�������)mA:����4��	xOz��$F���`g�m�����a��aq�9&q��M�=.�qr���S�����9���+6�%�7�a��6�i�7�ri���9=�-xT���
Z1K>��KC b+�(�����4�� v&W�i�6E`n��V���Y&�-6��NKds��>�������
�&?�*�6��N.��CA�LL�d9�Q��!?K�<e�,�04��K�m�dV�UQZ�D��&I�C.���5}%���������q�G�&��4<�/���|��q�>����Z�0�����`����l�4n%'����[i�p�a�B�=	�Wd	-,OC���I�����N���q����V����p���|����
3�����_�NS�������o����pm��6
W�S�i�P�B����u+�o��
�f������5�-��O�V�n���(�����[��C���*���:\��Be�`i<D,\����l ^��(�h��%�w`��dv!�4����?��"��i&*gv�D��Y����c6?&�E�pBNP�9_g��L�Y~�;�������'�"|{8��u�e���nsf��_?������4��6�����59��2q��q���~����"����Aumt�T����]����/.�T�F���,
H����~����?�����;��	G����V�,/��9�]������D.�_]��v��J����~�\�.����d:�gg�
���u�<F�[��g��.�j7
��e��M������"
���-W���"q?�-/�m�t��O��A9B����YjNH���k ��D�'��}����#������&������f�C������t�3v~�(f�A?�D�Q��l!Y���|.�k�����#����jn����i�|���|�����+���Kfg�:M�'3��7=����>]�\���]�����r\L���fsF�i�>��c��N�f��G,��M�i�|D�������N�fs$�;;�ywZ"��t���GF��f;��6�����w������I�����j�(�������jx��m� �<��F�M����;�e��~���mN���7��k���0�(ew���[0I�- �
�
���������,tk��j?�
>$e�KWv�n��~�7?L$����`�{���8���6�`�)hx��������]���j�iz(��r����_�������c�	��]~��b���a{	���H]�l�����-�t�M���~� ��o#)�
��B�_��x�{-�`�iw�fEZf��1\~���4|��DMf8�R(�4U[0 �o��F�L&���1��^���A�?��^�J��v��J����]���E��p=%��i8�@��
��L�������/����%��=�R��|_�����v%�p������FY�f�}V������	��M���0�H���A�����|"�M ���"5|�b`86����f�pIT��fa��Tm� =������p�"��]���-���M3���F����.p�m$Hm:W
}gs��w��*R��.$�V���
�4�L_������v����1���M��)�"4�^6���
�%zl{�.�wC�Vl%�����t@L/xS
v"��7R���s�*yl��*;)p��N����&"a��.�nx�y�
��c����09#�+�����r�N��/:�`+�=�-7����5�jX_����
�H,[I�~l0�D��)���l�A�y�9��4�
$fm:��|g[����1����c����~�#��]����1����7������e����rZ"Ap����D���R(4m���9��5��O�x���f���[6��E�t3������j[�h��+�������`UC����i�>�atH����	��G�����!;mP�{�T���>�'���"�3a�~�6����i&�c�Z��� ?=�
(h�=a��F�z��@J���u�l?��+��b�,�"01]����e{V�K
i���|���=��s�h����*���{���u�[��JO��\�������4��f����
?K���V��+��a
�������uzL��0�����X�[�O�������,��0$4��
��M�n&���wX���^J������NN��S�
�W���e�*�����+���T�n[1��}�7Y�K3����5�����	=�A��G�\��n[@0�[Z��u����MO���*������!���~�i�l�A�D�Y\�;���}�����+��N�0Z�l��\��sw��,�a
v��#��9������FLR��0L����h�`��r�$�,��������Klc�@f��"t$�im/�-�)EO��'V�����)v��i����t,EOV !�b��bG!�Yd�b������e�����fU��,|�C�DB�W���oy{q�p7�[0^�������l���n;���3;
	r��l/�g+�����g���>�-p�a��2d���,��aY��b���+���
���Pg>s������[�b�~�w:O���c9��'+��qb{!�wYV�b���+���a�4��B&�e��OA��F#�D^������%���W��B�b�.�T
>l�5�V�g+�C�.�/k�^��KtgnQ��K�/�w������i��0��YNS�	�r"E/�k�e.u�Yv�;;��q/�5i/h�=�I�pJ�z3��,6-�U�w���o��p=/�1�����pY�~/u�H��%�����l���u�_�7�T����"v�-�X����$�D���%�>������-����vZ^����
�b��bG�@��j��E@M����%��],�T,4"���,8�������V�x/��
��������Y�������D7V
,fi��d:�N�cS��3ri���#�M��VT��&YX����=�����3�E�����k�i���Xv�h�Y�����\^p����(�%����Ehwid�
v3IL�����j�M���4�mhv[�a��,��Tm��7L,��F��Z�������B��e
��q����4�I���f�cb+���A?��7�j�5
����e/&,+&��M7��T}�A��a+.	��f��������I��j�CkA�L~Kl�����������
��zA+eH�
n�[��[y4�f�������}�b%[f+a'��^,oR��!�`�B5�e���U���G�,O���Z��>�VLN+�^0�tg���eK�c*�������lKkuZ^���z��2��`'���
v�9�$����a�����;��Z���5;��v����V�����_��p���[���Y���-�J�4�D�

��i�i����F+����Io�����>�@+��/��BeL����_EKXe���[���S�-��\�����h�U�X��XX�$v@o��\�Y:
���Q,��z��F�9�X�r��i���iC����`g�5�e������p����p{B���c��Vu=�"��N"�Tp��^��4����V1�!L(��`)����*�_�*B������Zc��=�T�������b+���X��&�h�-^,�	,��?k���iZ�5O~.�J���N���ihW��!��������w���+�2�;�0�l)�cqW��7_E�
,�	���L���a8��n�����G?����7P#Cz�V����;�����&]�H[�|+6a����<O�[�l��/`���%���`;�K��{6.��J���jmQ��A��+w��^0"&:��O����G_�W%���<
����"eXX�"e������S���Qp�FL�^�����`[�����������vbGEC����K�z,���k��R���V�!�w
[����r�xO:��/s�9�k�]j�k����n�&v�q�
��R�`�V��At��wie/Q�^�<|�VP���z1�V�� �}Y���?H���A,�UIgb+UZ�����,>
g��`���[�4��G{������D,}���\1��ZJ|��A�`a'W�7t�6OKd��@�_-�M���Lm>�E��GAy�Y��1)N�n�8ec�h��P�bQ{���!:d�����,l����4Ke6������;{.������3����X	&�����L��
/�R"��.n��z!������bs�����^]���,�4����Q�����{6����O�������b+
�����9�~����f�����q�U�85K���#�a|D��l'��U����5��6&Ec.Q��fo=-�x.mpo��6�����Y�����6�X��h�XK?4����x���e�Rkc���s��i8�1��:��g��7b��%p�^,",�^�4k���+��5b4��f�J�,p�9���TmY���B�Y������2T�L�{���V3+z�7\@��f���DEM�#A��
/�e^a�7���������t�]��fy���eE���=
g{����	�b{�a`��r�DCUY�����)�����eO�/
������PX&�����)G5��6�����
�#���9��;K=e���[�����4�DWrl��Ks@��p��W�rYjG������HS,�Gy�G�UD�o]8M�!
����^��|���|�^,�
wu���].���oQM(R/z��Q��U.9�?���j\�&XF����h�l"��=.��K��[�
��|�X"�h�)���Z|���h�=����\��;�i��P6�����j�h���_���V<na�lx��d�0�Y,�@��:�5*��fM`�Y"6R2����Y"�1L��*���~�SuxL��6&� :��������Dg��;�aR��
���q��O�k#5`?'�N5X�&2p������xEg��4��'&�k^����^��mLNW����`��JG�f���^��QB\�����;�R��i�l������Q��V,j��6�����iZ���7����f���R�E�t�`a��e���e�s��o��j}�v�[�/`+g���s9���.�2S����[����_��NKd+��A�~%�>����rzL[1��/�`�"t�t���;���$��)c���v)%���`�v{��M6��p0|���|i���0**��$�vZ][��f4�4&�f�K��o���qKF�E�SKM�$�L���uJ9=�mE&�,�V���i����X��m�F*��Mo�b���6j�mL���&�~X]kY7x�� 5[�G����������&�P\�,�
�Q���X����BV���a�DsE�+V�����1�2���G;�C\b�R�"����q�P@�+�n�m������w�������6����hS�7��c�J���i���v��U�����~�N�4�������aP��02�q��e
k�5���h��
�g���g���w��H��1m3�r�:(�9������J^���i
�T��K���:e6�7X�t.1���D��l����6*
M�9�D���J���A����������<K���8-�-\��H4:0��M�����E��!�wv�����B�h�&H�'�������X��,t���-�J�u��4�hj_��=��F�=a�i�t������Y���[J��	��])��0U�o7��-J��]���Y3�>����Y3�1�p�t��?��`o��-�u�a��0In����W%I���
�Z}3M]���T�4��9����uo�<
��=Jf����^�arZ!�m0�0h�i��|�H�,�cjV�o�@O4�7H�z�������u�b��f{�v
��J7R����l��W���������z��]�_��8�s\�k�|��G�N��i8�^����1{D��e�i0hj�[���$<����
P�
%�E`���@��VR-'�U>7�R���y���nx��S.�i�l����%����&}�C{3�NOiCFB$�O��0F��-���C�����H���+x[���A+����e�|���4�$��%y�����+y��o0�k�����[��3{V�d��������W-6�:
���iy///��M���Xh��e��n�e<�����lA��[x?�J~�GZ$|i{D�9���~z���D����rn�vv+���n|(b��B+�K(�O����@��vQ�[�B����L�^��rA<r�G��}gX�7��0������Q�-��Y
�i�����+������_D��k���	��A+v����a�n�����bK�;��������8\{+>
gS�9,EgM��p6	����B��n-����q�w7K?I��6U�����3�'%(�r�vh�j��f��������p������N�9�?��k��`���;+0-�.h^r�V���^�I�r,���?oA��[>������v�&+`7
��v�ytOS���JE���-6�5���c�9�M3�Xx 
���V,��w�R=�n'��=�B�\��|�~���3S#3��n9�����������~�@��t��
�gEa������g�
�O�iC�)����!���GM*��j�Y���NM[1L�^�,�t��w�c/z�{T�7'����K=��,+�z���Xhxk�
�����	��������,�[���IW���E �;
%��\��[��Ck-����4����!z1EB����L��S�N�~��=���<���^zul�$�LX��?���?=�
 9��9&�����
��h�-�|�B�01W�5�%Z�5��`*�|w;-�-V�*z�����;�E�Il�i��7�`a�"���d��0LR4�X��G�V� �wx�}�LY����nav�#�����H���m���
'����=xp���+�;��6��H[^L���bSV��1m��}6�:��2�
�����P�v&�&�~��/Sx�����]�V�`��;
�B�
���S4��r��-���2
,L���V�����8�P��#st��`
]s�G��{g���]�}��N$E�B�ny�c�H�?����g�>�|��xZ!|0p�'`���]���WM����=f
��������W��y�'����Z,7��DS��r���\8!=�U(}�V�06t��������R*���~+�9,�%���������I$�m���8\�`G�Rn��,j�q��M��;;�z�0lV�?-��E�x�����-��4U�^��.���`]x�u�����_�Q�gj�i�<=�
 x�
:�����}����9;aZ����x�Q��Tt�7�!/m�2{���p;I���[����J��nQ�o3���C
����
���a�n����X(�!6'�����t�Nu��y�}����x�]LT�]q8X:�v~NC��D�����(��Z�u�������,���]�
v���i�lxA/�$�a\T�������/�2%!���}Z][|L�Z4��;`����<�`%y��V���J
z�����&U�5Th	�0��	xZ\�L|[4��o����&/p�o�T���5�����Ku4kx���8�E��+>��w��3�{�1�����TE��w��Z�F��UeUv��k\��*E�JD������*��_�W�#Hi^#����=�����g*���%,�-c����;��
=��������������;�)�n0-*�IWH��W
����j��zA_��$~w�9*�ox�YJ����zm�9W�B�Q���H:��,M��S�`�s���B�2��~a(V��rzA�
�F-���lrt�V����]*��y�q�-�K�B�C����V��,����lAu�@=bG�1�\K���1mt�L��-�15re��o�AgA��,��H���-o���k[����� �u*�����0�0hz����TV������v�F��{�����!�s�5������<�7{��nf�e�����}Z����v�P��#�
C��QaXr;��}.L��y��ouXq{�����<
7<:�i��Gp��2��K$���F��j�`����>
�x8���b�������}�����	��W���p����f�l=�w2}OS��*:�M3G�X(x 67k;<��������l�Vd����a�����w��[�9,��Eo���
N�a1����ECqL�#�NS�	���MWF�a�t�E�^^�]d�NV/6W���,4[L�%z�����h���
��3}L�7�O3d#���lA�X�z0
j�W!+`X�9k�~.D������5�X[)��t��tE7x�kj����`ak��%b��
��%�K��\�Bs7��Fi��f��@6��m4t��]pk��6|�Z����^�`�[�kn�xR��
[��bMb�����q����D����h���8;],�3:����@��A4�`h=.�1\!�P�7,0>X�������f��wv11���qX�|��L�V���?��
l�����q+o�-r&N.����~����,�]lc	2b��}xX^��&e*����=��^,
_,�m��l�iym�3�)����%&�>�`mA���aZ�h��I,w�/����Y��E��W����2�_��@���#�����f��w�.���tQo~����`���i��|�����l~NS��
8��n%)�C�������O���V�����2�ES�K�p�n�(�
����;�����D�,K�x�
���B�����������*�����?���m?���|�%]_"��V^^����5������j����f�Ba�����`gJ�9���'���=JC���Ya��A7�wu4�����/�����%��}�A�t�@s��i�6b���E�0'R�i�6	X����ixj������-�B#�a�="T�a���������1}0���V=:g�s���[�U���
}�T��N�Y;���6��Gt%�
�f=a@���m���w��k�C:�%��\n���{�F�Dq�����D>�a�;�])o����~���p�����>,1>XM��I_�H-+t,��L�[4{H	nc��6�X����*h�K��p'�o��[ylI����lq�[�
U~g']��GO����
�1$�|N�|C	�
���`��#]��J��%���?o
vO��`
��a�Z�9��4U��0#+��i�4�OeX�)�NU�%pU���"��{VT�UV��������V��������+K#ba���P;4��;�J�f����{�9 ����1���)������w���Z�Y���6'����~,��`F����w��R[pUZ�{0�n�P��,���f6���w�`s������98����,t�������+��)o����5�-UZ�L�V,�QcT���drIfK���chY����M��;��u�U����=�/z�4a�u�c�WSc<�	��S~6��F�8NK�� M%�>k_��If?[J������H���'X���1�u�%r�V��5�j���%�0��[i$2,}=�u�:�	���R�Nn��
�:���7����
W7��0����#�b������Da�B�Z���:�pv�Y��p6�4#�	}
���bWR==��Eh�[��a�a�������l��r���6�Z�v�Cm)�+���]���"Q2�I������`~f�������?�����}���~m����)��S���rZ^[@� �"4<��D
������Q���7m����z��o{���go����R��c��a���o�����
)o�_5��Rt���6��O���[����7-�z�Ab�pK�"�:��?���4�g����O�
v�]S������kWMM����-'�j�P�pK���n}[X�f��h��%�b���5������+v'����^^^����J�5���M�P���f��_��{���e�s���u��.�*��E�oV7#���W��X���e������%��Dp�0�A&��cB/����>�l!�����dWD7��!����t�~h[Z�9�rZ�������^����u���>l (:}}g;�Dc����9�o���,�D���0<2�U�n����r������
m��We�s���5
��TC��d��Bk��������oV�!v��
���Mn��}3��X��{$�n7(��Ktg�;b�dk��j�
��A_�V/�1%�9I���6���!����������)�f� �a���/��a��=�i�l�&�7q��wV�nnp3s�PPIl�(���}I��P��t!���`��rE��{��c�X���9�7A]
�G���o&�/��G����cF�s�������b9j�7��wlg���=
*o�
(VU(�7��q4���e��n4pCT���������I������%��o��U\�;;�n��|��bAY�����=rnk��,��)r��F�a��W�GPm��m�}���Yp#Z����4;���)Bbz��e�o���T9<�42�����N�ik�e���d��)�i�>�����w,�����������w���V��� ��f8���)���#�]=Y)�Y�8�t7��j\������a����y�4��V�-�R�{[C�:�E3y�P��w�e
bW%�f����Awx
J������o��a�)P_��������'���3l���X�:����&`�u�o��-z���`+-nop�L+D4����w}��M,��������
�����i8�"0t4������qS,���6
`
�x�v��;�
�7S�M��[��e:��q%����YU��pAo&�!���m`7t��y+�k�A/��	6��<M�v �a�K,���V�Y���j����������hV�-t�+��4��S�|��W������0��0�-9-��6�)"z2y-�}��}s�&��i�l�����-hdx�KP��uN+d;�ko%��3��`�v�
�����%��
-���@���X�������s[����A���w���Rwg�|��m!{�
=�Y��Ul�-d�QE�����?b���W\����a���lCv�%z����N&G`�py���
�]�����p��_���M?1�U{�Hw�a�����w6j�n��gA����d�`O[��f���;,���?�����e{$�$
��;��T��W^n"��4l�.����r��j�~(�!z���`/��
��Q����z�J������4M�[9��Cg�hh$JA^p��p���0AP�[{�����]���� u�d�ZB�f��G�����7���6�j0������#W|��UZ][10@���1#U�&!P��[�������|������y����7�g��������TmzA���/X�#��Bw��R�7�.�������"�;�^� iY����<��8��T�E/x[���`i�j��>��^zwm�1ew�&$-�=���,/�J���uZ"[^07hZ^,��+v&���c�j�����~g���+I�X�RA7�����1��S������I��r���7�
5[���6{V��8\��k�	4~g�L^��NKdc�H&�/.�)v�;Y�������
���F��^��oR���E
����������MC7��CQ�����%X��N����X�jm����b�����|n��EC���
$/�i��4ah>�N5��0T�q��O�U�m�
���_���sv�+��\I/������E���<�S���o��1�g�����Ss�8^���������
�h����,��J,���7���==:����I�/�{��e�Y��������^����Xh�J=��7o�)v�������U��w&z��,�4�]�������;
��������Z��U�������E���=;�D���ba�6��zzL�{,�[�fJUbW���X��I�.H�>�f���{h�Z��[�)W���GD��h��ElK;��.OnTq0��=���*�U6ko�|T�0,/����N�(�)������+�bYWb�[������0qZ"�,D4�������J9�������g:�����c�s�>����U��R.6�Y���A_��fn�����\������(vz:<VG��<�,����:�5��"�5*W.4���V��N�e
&����IG]#����)P~���'�p.:�`�Yi��_d�W� 8
g[�������UCz\��#v�+�i�l�0����v�Z�v?�	���iX�a�����*�Bz�c%�^���:�f1����K��{%}g;<��V�8��-����y�bk��:�?m���K��J�q!����+���	�~����x	zA�>XhEH��Pb�X;;�J~N
D�k,�g��S����>�����	/��P��X�����t��[���f�1����������6E�������b�&���������t�.q�=����~���:-��'��(zC�Vz�)#�4U�@L0\t��gs*�i��c`pU��0�,��#��O�vV)��-�Q{�6��\
����z�����K�
�~�n�i���	�%����<EW�H�g?�~:w�9
gC�������-�=U�n�l��)&yZ"#,O4�,=r���AC���1CAz����?X|v;���2p}���v���6'�Yt�k��^)��4U�te�k_��%����47�`���&�[��~l\X v���~���<h������Bia��k��U�������vD/��{U2����0�"���E�iH8�Ig��z9�-h}?V�~��:��&l�����
s@o�`��E6����hV�cZ^��b���~��+�s�-�]p�X���w~��[9
g;�i;�0X,=���_����E�H�c�d��#��{t1�;�|�,W�;VY�z�S9�i8�L�X��<���|6�Ry�9�;��NS��
�Aw�y����������pZ��'�`�t�
^��������>$����	�\���P����v�;�iu}�C|���;a��Q?��Ak���)����	��|�3�?��H>���Q|�X���h�_�H��i�>���%�����kI�t��������v&R�9W�6��K��ACol�����"���N�-�So
)NS�A������]�=�B��*��t�R���������������I�������3���{��o���,�)+��B6D`������n��l�MqzL@���r��r��R��W�`sc��Tm�@���pc7�� �X������ea^�R_#��;��M,�h5�t8���6,�	66{�7��2z`���B8��R_��ta:z�Wi�6�`���_!N�������E����a��jk&�W��4��fh�Y��������r6�v�
X������6	`�*��)���/bW���Z�,
z�KX�4h�S�D�BA�����Vs1���B�
�Zk���IO�i�^��ZY�_S:��1[Q{�B�Y���p��TV�F��n����x;NS�Q�D���?��.(�&�R���o�EO�k+��Z! �������0��!���aG%���L�
S�����i�6��]3�I�������=~��[��X���;�~K����M�yB�h4Q��RT�����Y���[G�����WG�Hyu����C[�hX�a�U���
�l����6��@ba{,����l
���hx���&:'�gK���Y���-����=��ZZt��}<:�E�t�r?}7���K'/�f��XX�l�%G��,;SlVC8-�����<, &� �n@��;����B�+_�����Z�t��f���E�<W|\�m�A��)�iu�����w�m����dA��M"�$F�W���h��O����PNlv����&�c���D�����a:`����,MX,s��9�f��i����ZE�.pb7]]�U^"�m�	�� �B���9s�J�6�����TbEO�D�tV��O,�dZ%�	�}b��f���R���
Y�v��.����b7�]{%���6��L�h(�(v��_�o�zbhQ��������
��s���p��X����b�baGy��P2-�;�0p#g�\�L�����e���t
{��u�m,��s.d�L�g����)����>�bg�����0l`/��M.3>�(�-L�O&>l�i\�],jm��<������&��^L�Ol/TOg�����������U������Xf��m ��$5�N��(6��9-�m �x�A��Y�&(g����i��	��R[f�WbKy�*�����D���?�d����@�M��?�X��I�����S��^J��[�E�'�/H��,.�K?��S}�i�l�A�+���gozvT�G�i�t�]XDl%:o��	�'I��6��b�k��wv�a����N3�I��\9p�yL�A_��H��A�`�M������Dl�a+�%_���,�
��`o�@���������/XMC:��-�S�D,�<��V��P^��!���M�����*(lNkK��`�s���l���K�W"���������0�e�>!Vx=��\0}Z]�|�A3��X���a+�i�aO&�-zJC�e�a���c�����P���Go��b�XZz���heJ�=
g�:���5�i}����i�H�8�m������n�AC�y�7��K&<[p�Y����������
��`��m�gjp=`D,X���4+��{9�V�F��n�@)�A�2X�AG�}��KL���6a��f9k��E������2��Mk�����d�a��d�+� KaO�$t�ef������[���1m��U����wv���`�0�������-9>a�^���r���hIr�Q�a�L�W%*e��I_�P�(4������
�.�t�������k���p�`���,��o�C���������2
e���\D�����<��9�Ao�e$v�����ak�0�z�'e!Y����	y�������(�J��iyh��n���[�b��D��\��D>q`NV�P�Gl��d]�	p�-
���&|���==�OI�>t�����)	CHA7����7E�OS�	]�A���`i8Fb������)j��T-�<���h��(,'�Jw��CZ���4]�^-�<�����Z8�,�<�#K4��vW;��Nx���/��,\0�-<a�U�
F����`�WuzJ�0�'��������n������yZ����-y���J�Vr�-�<a�t���;
�cf�=`����
?��ckz�>-��fx���1[	XZ�x��|KI�=���aP,<����1yZ"��dp+�������������5���6�4�������9�x�~m�uZ^�@p_z�#7X��

�`K�k-O("t��+Y/y2�b�
#��1�`7]�����i�l��e���P��j5����qZ|x�>����"���~���xa��X�����}����D���T7����v�\^��&�z�B��e)_��+z1�w!=uYF�M�^��ux�j�T�Q f��,�]lnpR�����x�2���/K��oSR����p�R��	����y���g�-��|g���;��7���P���!#�;K��od�^����Z��-D��([,����%v$=��
m����!���b+iW�Z�'=^x]�+Px���sZD�L��,�h�,g�l!�jY�6$\������RbG�J���}C�[b��6�����%m���eQ]�� Z�������uzH�"��"z1����|�b/x�]<�$6�������M_��D��Rlv6���V4����Ob:A�����E����;�f�������Yx�����S���
���o+��B\`��-X�cJ�6���V�&���.
gS��_���]�:�0�Z4�>�� �:)|��f4���M��.�����v+�}&,K�.&�*��K]��LM�����4SES�D�,�@(���������immJ���/
w���}�;������d����?HW"��K�]����������p0X\v1qY�7�e%L���.6kFg+��ui���#���l;��<��>,lb(����,���V�(��.Vc$�:��-[		Xku�_3�j
�7�b������/��V�}���6�~!z�rC���Ea��*��t���c���a&�P&A�.�.��.�#��D10������J~}gG�)c����C
�
���ab��7���8{���t������N�����a���-��< v��7��l%|2l���F�"��
U����j�8��"��(L h�K�gCn:��=��N�k�
�N$�<J��l���P\���O[��(�m��~��y��a���.�Wh`�j��b����^,9]l��|��&���c�Z�N��ad3�^HN_j]L��4�����_���/%�VI��N+��}���i8[OL�U41H�����t�� �,����i�c����`i���\�[X�v1
 ��9�w��doY v����f�����g�Jh$�*��l	��X��h��k~+n*v�
���ea�o���J��lb�U������������<g����^��Y$v1�X�Y��0��Z�B�f
�bsW��Tm����7u���_���R,�jh�*�k�
���.��������h�
&������Y��O�fc����ZE���>
g;��j�iz[�m��)k�.�k�M�v��>�~�qJ������������R��f
���T+���x��U����m�>F�5X����������Y���D���i2A/&p �u[I�����h��i����R7�����*~�/�n��%�������xn��!tZ]�|��B4|w{D���'�|��\�$2Y,yA}��;�8N���/B�@�1�\{Z"��L�Yt�`����s���w��l�g��4>F�w���5T��(5�h�*P���6��^���v��p65a:\���'����s��8����&�J��n'���lI�����(hz���!�`',���W�p���6�}����T�V�E�u
{���K!V��{4���S\M
y�0MC���s��{Z"��0�+h�4G,���x���~���q3:������z��6�w�A��f
��*����k�/X���c�Q(��a��,B���O�k#�GJb��$������
������:�!H��s����~k5yxJ��S���iR#W�-���L�����;���|g;���+I�g_0�]2���l������1#���]����)b���xSP=�����n�?�)�]O�`��O���P�[�_�J����^����l���X�������*��-��kw�.��a_"������k�0�l%�|[o|�l����wv�H,l�!Z�^���xZ�����K�{'���T��
�SsV��������I�93/��Bk�mY����as���U���r�)����H�f��4��S���%��^,�C�M?�k�����mEx��O4|������B%��z����mEw� z���X��N,Tp��Eo��o&�&F����
��[�J�m��t�EOf����a-��?b�Lv��&���Z;��<�7s���6�d�Y>���t#�T����7�\�>����Yk��p�e��b;S��\��2�B�X�=��Mc��,z��6�w��^�f�c���M������n��p������M�=rAep[���$��������;�v���o+���&�I��������G��P����������;$�P���+`��|�������o�jO�>��0����,�{��A�&q�����E���GfAG�
�>Z�^d�[�f���G3��c�4U�@,rl�@�n&%�A3A,K��=��;+l��zZ�ow8����N�Z�T���������Z�%������aXO,w�[�����K�
[x��Y���1�w��
�l�W\�8`Ql�P�Il��f�0��N�$����T��p�+)�^n�����h�� ���=��_��������M>x�
�:Y�&��4U�^�*E4���=.����7��D6��=���b<2�D{������;���N�#�f���,���+Wz�V�����
��g�w��j����������>���O����D�8`b0ba;{�9X~zL�",M^4�����w�Lh�����o�����L{Ht��������m�~�BZt�9=
��$G��g/���7���������+?��u�����������l	�
-B��d�_!z��Y�����Y{�v�5�'�\�,cO��AC�[�7Sv���$��JF�5�i@J:��H��'��*)��v�g3^�gO�k+��4����#��0�0�=�\~|X"k�o�	�������l+����A�9[�saum�1�
��Mv���,�������K$�#�^����v����L8���a��gh�\h�R��iqmfBo��OL�
�jR������	��$���jpP���Y@V�8\���k��1:���p���8v�����D4�5�7��]���������o���p�����-�{h�{%a��T}����Q�����c6�q9=�Ou� !z�[�F�GXC�D�aN�����%��th���+�}�4	���'X����D����arU���%�Yba��y�������1�r��A7X�lNm��v�i><
��J�������K�w%����4�,����4��	XY#��?�P���.�NoK��^W�a�`�������'�h�H�>���a2�a�G���
d	��aiMw(m-�K���K�x��7���&�l���:����Kb�L-Ql.�;-�m �Jk��R/��a$C��'�5��^�q��f�[�����m���=��k�
�����)m��*�d�t��|������Q���M��!����a��UhX�m9���2'��6:���<�H�|��*��W���|L5b��R�$>�	35n��i%���q������l,����iZ�,��z�:ea�

�%����}
v�n���HB�����u��������KF��i���D��o&#/�VHF�R�eM�
o)���|s<|g����tg���x ,���U!auz2,�{(Qv�_�������6Qa�K�4.l��Id���-PXx��*�����n��{��;
g+&g��)���,$���{U
�-�K�>IOB��o�� :��������t������������U�V���Dnd����e��^	�C3J�UQ+���f*�����i8[^Pg3�Y��l����zv��6��o��=>��I�;���L3�
�V����0;�.b��K����>d�������o���J\�e���?�|�f/t�0{�4�������w�e����[�0���1]��n�G��U����Eq|���i�/��M��.�r2;����M��M/�F���=��X�x�!�/�k9�i���A���4|�M�������A>1�7J�e�3�,+�5[0�.["��l����od������&
�������6	��?�v=�,���R��&R6��O�,�4���o�[���
��A�0����w��3��.���~O9�l���������E��6�Y/?�^�.U�WV����6�Q��YT<d�������� 'Pe�����M����,4��&�;f;�8��c�_�����YY���d?�o�	:�D�����w��-G~[O������Yj	����c�jC]��N5,/hG[>��K]������Z�V[P��(���A��C���3���w-����FM��`oh�7����t�y+VT��H�����6���Q���]���l�64Q��i����@��f	a?�->hz���<���Y�~h�fJ�����v�|(��tO7��p������,��m�3��^(����R���\���J71�R��4��	T�m����FA�Q]�A��F��Z��A����Jh����ohTi�]����i�>��T�����2U]�
�]�����}H"�c�,��l��gYoh��!>���t�q�!qA����?��������=-�vT��K�tY�+]�OS���r�>4���OS����M�$�u�;t�9
��';���=����m��-
w�Et�>������=�bC����;��6E`:�d���G#��5^Qa��B
�`	���`2�Xo���Tm��@T�^F�~+�:L��I���=���5�~����4K[7��v��������lNN����>���i&�h�~�����==�M��f�)6��+����:�@��bN��;�����pF��'�}���O����n��HY���t;Y��q�aC�1}:��-G|L�3������n����r��(`�4�^��>�
�D�����?���n�A����p>��W������P��f��Frnf[������	���=��l����t����|���#���������G�f�]��a�tKMg�4�
h�>�Ls�U,�_�P�[j�Ag�#}�7���_����L0jtt��vx6;���������tt8���%R#a�9O���� }����?�OgxlI>ed����`k/�v��d�U�6Xh����`����?�
���VnE�i-�F���a�T�&�4������6F`�b�#��&�I1�J�#S�MP���o�Y� 6��P�AM�mH�����t�0B"����6����i��xJ���Z��l��(��G[��72{4n���lz!�T�0�(�4�+�nJ05���V�VZ��=���Y�:v����J����}�K���7'�i�6�`e�dO��&&s������ec��Ko���s���e[�����f���w���5{A�r����^�3al�����G���M��i8^�7�E_sm��	g�NX�5����|���6�`��h�{;`im����
S����,O�kC������4we;��F����Z�YZ�"Z3�sa��6�`���Z�{���)����h)B�m�A��d^+E����*����$M$�Z�����`��V{F��<\ka��";x��_�kO����zB2��/x��Z��PD*��G{���������%	��������^�����o����V_�������x/I1����2������[�2���{��Zt�=���?����}g'���-�_������$��=|�z��~����k{��|����b�0�Y�q%������Dho
o�bo�
��Y�������D���"A��;�������������	�*����F?�0�
��u|a�\4�X�e��X�� �%-��^V���$z���Gf,��*v2Y��9�]K_L�Xt����2����<=�->��\JXg_Y��P�xY{�5�4�z[��p#�V:��Al���VK��G4s��]��Kl/��\�Z��OI�b��f�M�,GYf��\�wZ][�L�Y�d��������d���s9�wv�T����x������R��Yt�s{��"s��������PXP4"�������#Z����{!i����7I�
�/K�^��RtcWb��z��X&�+��{c�w!�zYb
A�����p>5������6=2�H;���q��qn'����$�7]����0�g
�%	��^x�tL�Vt��`o��K������D�.��^��FtgQJ��3��*��
V�`�����[���������%�>���A�],�	7z��V"������?�}�iJ����9����PA@4�t;��%u/�;��>K������zL�mL��4
�Y�X����nl%������2E���wv�K�i��������2���l?��'��m��.tr����EgG�w�����2���0�i�l��S��?52=|c��]��F��I�� ���S�P|Yn����P+��C����6
?�`�Ur��� ���
��v��(6�O����]��;��m0���W�`S2[�����L����2���J���	z�!F�{�����`W%g�2����q���/���Y���}��Nxq��lc6��6���I��TL�K3e1���~yY�J������G���`k;��6V�-�����Tb'�)�-4j���}��!������*S��}�A�<�[���c��a9�Q�yY�;�[�8�$"*��
F[��u���e]��	�np���0y)��6������z���kG��,���il�&�-����r�)���������4����b��[��-=~1�������@�4UPL>\4�;
�&���/�p
�����N���V�`�3�\�������8������
�|b���,�y^;���j3�����0�lgzbg��O�i���g��Bvb�Jv���ij�3�ZIg[�i�e��F@��0�l��9M�����)��r��f�����|p�I��R�lu��w�����3g��Y���w�����4�
�[{6w:IV�Rugix��[t�E��]�B=UR��-��-
��i?w����g�X�[��4�ScEC'�����"����-o��D6�����K����Ab+�h����W�P
N,5�����8=�-/��]����;�@k�$��|�w�|"�b`0AZ��� �vh�{�|��n�F+�����`��T9F��6�M_� �� ��JQ+�_�B=7����<T�
�����	��K��r����W���"�f�T�����������\�ZW�������n0>l�������`o��l��9��
M&�)���6�v��SS����J�E�i�sI�.�"��p�#|w����rZ"��~+�t�<�f��o�n�	��a�^R�0@*��$g_0��f�:������W�#��oKW�;���i�T�+�.V��������&X�ui��N~zJ^�
Ci�.�
���#I�Wj�,
�����5��],M��^���������v�um��f����`����vBY�T�o��F����,+
z�^,t����$YX>w��8�������	}giN��������H������/��U=H�������� �F�g_+a�%�^('i�<o��%�1�B8������rOKty��')z�s�,���m,�Mln����5��m^^t��FG���mEba���e�7~���E��{���8\~�w�[��jV�o,�+z2�O�.4iVx����aHVl�;Go�J{c�����b�)��4k�7��n��$�Y+�1�t������Y��U��5+�7v�
�>��� �����8ywKd�����D�B+�f�p�0]�7K�����S�<8����q���fV�/�f�>�-�`]�^i�����D�ff�	l	��S�$�w�K�Op�bdh�IN�%���i�=-��	v�n���SU!�i�7���c��`�(���X,L��
j��2�Y���pa�0�d��1OS�A������/[8�-��XN����&WFW!j����� h(�/��f����Y�R�J����~��a��S�X:S�{�_U&_�&�H{�P�P�N�d�i�U�����%��F32k���L��Tm{�"��Q�;���o��1m?A��=�����������G�p�
��r���a!"����Y�yI�	n�������v�����bje�����K
?�`������+�
�b��+�5����.�f6k�7�,zAWo����m��Bv�%�)]Aw������v��MV-z��i8�L�[t��\W�1�6xK����/�������6'��4�F��N�����`�E�;[1�,�s>�6qs�7}��X�)E������a��h�����/B�,�Y�Lw���|�S
�	�dK�D�[PWo�oLw\4��K=f��aLa��
;-�
7x�
;��e��Ba/T?0Li��fy���AoVQ+���Q���*E�J�y�L�gC���d�,�N�������N���fQ��3�9�g����5�h
�=2�Y�c����i�lC�4����"8�%<��Vl��?-�m\z3�#�w���Y�<�.�6����sx���z��N���&EZ^��0Cl��`���fy����/h6��C!��/�������B
w�vxc�������U���;{:��*H�����Y�XA���S����PqH�]�n�,��n���w�';���a`�V�e�}�����,���{(V�&vC�G�V~L�0*.��i��%�F6��d���p�T��h���i�R���Cb�I��4U����]�4�X�Ms�B_�X��>���i�|���5h��+5mL��b���=J�a{V����
�4.<M�1����
ZMA_�����P8�����	$-m���</�
�t���w��B�L�K,4K���3|!b�$2{Z][O�<Y��vz���.}x=����d�����.�4�-�E
�����V�E�tKI ��fe��TmM@o~����V��jV�nL!Z����)��^����
�
�Aw���0�#�Q����L��2�i�|�25�$�J�����i�|����4_x�[�t�Bt��~I5���F�gB�������6���x�R��~+Q�
--���B�[�a��S����TmO�m]��i�=
g��2[���=��[��KA�9x��:4�������|�2�Y�4�,�-�^����,�����W(������4m"X�h��V�.��0d)����B3�fa\����'���|���|zL�0c5�f4-�|\z�^���lVk;,��,�
:�wO��\�n��74���n�@K���������g+?��	(
4lS�,��pNT���mL��4�-�9����<�`L���'��|\�a�����i��1,�t��|^��l	��$�E_tyey��|j;�
/&,z�KC������0�U#zAk6�;iu��j�	�
�Z��g��|��.����
��m"b�B�z��/�=*����Q��:k�#�7A
��~g�`w��BeI�,EM(�m
������g�|���^[t��fv�����;;N��2�bG!5�[��3a8��� ���<��z�����N_��+���(<m�9�q]h��s����������N��"���{c�~/V!C�[/�\E��b��*��	�L;�kU�xv+-wvG�{�|g�_�[��[�w-���o������x��Q�v�;w:�
�V���;+�7�I(
�Q�'l�Q;��-j���}
���B�J��U�������	zZ^�L��4������NS���T�E3��P���f�S���*6���V��1����p�i8��p��3�Ae�g���tzJl�,�����2b�U�r����V=�����1�L�@��`�u�{f�)�wX^Khw�DA��$����Wt�������vkww�;#z�\:��"(��Bi`��v���������d�������{��%p��P@P���6�R�*���f��T~E��Y[��m�$z	w�����I������MD_,9�#��$�,�Z(L��/������T����+���E��mwa��L&�,K�����/��+��MMx+�f��bt�K�����0���F����E]qs�I�;����j�
�"A�,7���]�[4�3-<��-��O��i�x�ty#����-8�����B�n���4�E��M�!*��"I,uh�B=e�Fz�&�����r�au����^���-���H�0N4l
�-�^���7�� }n�i�}ga��X��f����x��Pkw��v��H~ga���\H����m�>'.o�^�
^���d�.����Z��3I��*�����R��$��A�9W.;�H��1/~�6�E*�����yA��[�J(���b/x����y,}�dk����1L0��"����,�����[���rT�9M�;�;K|gw%<l�����N����-�b����^��~��&�-'v�?�J3�S�b
b+r��Z��)�������P���&���c��d���'}�[/��l��:�U�Y�h��W�:���<X���B��nm�S������0�C��wu�[�N,���������f���,�d������D��`� h(w��b����lc�������������iV4.���4.�%�{H���&t����XM>������+#{Cb+d��w&'/�^����)n��(A�����������`��-A��=�R�����W�M�}���}�IMA���w���u�PwTl.����������^L�T��T�0]�io~��
�b���a���)��*<�M ��3��G��p��s64���$�`KI&V����D������;��,�_��Z�w��whX}��N,�-6'DU���w��u�;���*�E��wX&�T�P�E�a�i�7,��fM��b�=�,�;�����4��.v��U����'.t'�����AO��.��v�P��1m����v�����U�Zu��}9j��`K	Xn����v0����!l>O��w���DSF;�42���"Pl+��u�����hZ=+��E��B�I��=�J9��#t�g,j!������h���1_[I����&�Rk���G����j��P��q[�w��s=�i8��0 ���V����!�?}����Z�����i�i�4/$�/�j�jNKd���=a}��%�w6g���vS�
�TB���\�!myA���a[C�KL���q�3�*�[It�)�d���fr�(����f�
+h����fW�7z��q4��NOi��������wX@�������](:�>��C��{Yl�)my�@w�%?��P�����L�B��&]����E���j%��-��}!�5L�����]��$QI�u7Z54�$zd>.�#��L"[��D���Ao�R3x h���� :����9A{�y��������RY�iym<�� ����W�f	��L&����q�=��o�������m7r��O������J��p����_��G���\���/�i�^,z,�<��T�0��[����1�/:K�}g���i��S���?�	�w�oB��<Xbw���b1X��i�[&6+����x������B��|��G�
���m(�P���BY�E(lY��e��~�B���.������N�����O�+���_���;��1�\vo
���2���ET���4~��a��C���8�b���l�1��,�A�O0uf`7"O����-����p���GX�PRV�,��n�0��R�Wv��e����e���{n	KrE_��&��0
���&�0�^a�z��%��],��Y��obM�9���6�X�X�`�:bax��NKtzL�^�8�o���pnV����
4�?��^NS�=����a��X�KlKA��c���FA���b��Z���>=���B����B�z�������ss�]�O����w�I�����JE7*�"�B�[l��O+d����DS{�x�d����3�������(d�K��Fq�'��J��>�2�����WmU��������/V��-�E�*�<M4���szJ�L�^t����������������}�
A����5�*O�/Ao��
�/�^�4�au����~iv�a�E��,�S����J����e	���f�e9Hb�]�aY����-lEz�"�4����/!)�M��x�tH�V��:v�	$��rS��Y�X�8��[h[2,e?X9��M_��4Y��X��Hl�Z��}n3�m4��Cw��0�w�m�����Mm�q�a��ZJ���<��-*_YU�������`aWv���>������<�9C�O���B��V]t�t��V���I�j����>�{V������OD�+�x�*}gaSE����xXc}@����av�����2�f:I�F�$���P=k�[�����z���6\�m�a�q�zi�r�Z�{@C@4={�Bmt[��1��=��#n�q&6������P89���'���������j[�� Q�Sc��
����S�M������i�����i���'��D���o����[����6�,yl���5n%k�����E��������/������(O���Trr�>X=����pb��$���#��K,�<�v�O������y�A���G�;�H����lXE;wn�8�i���x�9RtzL2tQ��m���Ej�\����=����J���2���=���i�R�7&7���e��bs��iqm1n�4�C���G]���)C�#�����x�7��t�>�-��0Uk��rz��(�:���GI��(�i�l��D�����UP���0�G���v<�:������H;���Y^�N�������������N+��%�c��O]b�0^l)�a�����}i�(��?k����j�qxw���1�]��o����g�mx������Q����3t��V��ltG�+������ar��r��0�#�RVhIi�������L}��u_��1�M���^����u�,�������K�F
{f��\�-�����T��?b�t������]�S���5�����Ih��n�0w�iwz>A/�H�s7T;#��_�����[�yzw�i'���N���9;��=q,&H��/��5b���>}�*tc����d{�6{10H*����j���$�E_�*k7�u,�RBc����E�c���ap*��8�=�wH�u,:�:X��{w���	�n�M��`��l_2��l�O�M�wf����m���~M����b�_�
������K���]�-\��,��5)�
|3��Bd���xR�~�o�vo���c���+���+�]����W���������
�b/����\��W������J��]�f�S�z������������u������J�(\L�����~����������*���%�������$��^h�����L�Wt^xv�����;�I
�d�Pkg�^�]�c�)�"u��v�1�|B��K���G��+�;Y������e�E���v���1�2������{m��p�
v.+���,c-����Y�;���XX��;[�E���9�vh�	��b�NKw���N+���E�JG��c�a���._�v�m��kgY]�7+8��f������'�l�k���} ��Q���?��#���N�f�p����u���7����,�;Y���wbW�ncq�8+WU?��4��A��(p)�����p1��/��[Q ��h�l~]p1[�9�V�LuX4�u�2�\��]i��vpY��hx{��Q���V��|�������V�p��r0}yw/�e�F�����v,v������oi�D�����S'�n�����O�����������	����������5�������hDwV�!v��p�y{�<���;�=�����f�7�j���^=oA��[�8�x�E���	�2��]Vm������;�3����Y��j��{��wSd���,�0b+�0l��=�]/��J)�E�����P������lZ(T�w�W�s6����]�mLdY�M3�t0��|�9�������W��R�hXt+��g�`�������Me���+1����Z)R�[��
����
�[*5�jUR�[+���3sV�eC
����U[���"H�� eF��w���.�
G�^��f{��K���b���L���S���_��a�$X��:Xc�Xx3���T��u���)������
�~�	^�l��5��hV��1u����H�X(:*v<����x�hx���,����'����o���[���2��g����������w2������h.,sV�����7������,��uKC�r����SY,��%7�E^f���_d�.[��:\�KZ98����_��;s�_���h�������,
$Kt����pg-}�W��n��DBE�t����6CA���l�Y��C_E��0��SP���������B�p�r�z��48�����?fTlT�",,��D�E�,�
��.J������a�Pl�-��k�������>GgF�����;�vC�	��,gUy��P�Y���#ew��Y���W���S�D�U��B�e8�!\
��^����.�05t�L��
h�e���c�3���>H�����>��1T�X8$YP���M	j2!�_�-��B�-���VN���0�4�5�O���]�z
�q��R�h����KEC1$[�.^��x�SsS����}�����b*|���R����������9�"L�Tt�,�����_j��l���M��'�����
������.,H�1����Vi��h���������,�JZ����@C���G�<,�>�����R�m���$^E�4P�Y�7T{��%��)�M��i�`+E��Z���
���������U���^����v&+:����dR�bi���e��uK�ve
�|R��hio��3e��������A����l�5TSM��}W�v���l���}�s}��t�V�N���p%X*�`/m��	b���-�zbx�Z���k�����u���,�5Av+�l�w��4\�%\8�Z��3�_���ZJHU���L���^:�IAo7T�10�t��}��J��Z��%Xh"^)+���.]f%�S�\{10���~��ta�T,,	_w	�&��<N/]/T�����do�uO�h���%��{�^�����Jt�E��U�����.��}���-��U��_U,tMm� ��Z��e�r�Vob�-|b��Q~�B�k�����D���X�v;�k�{������l��F���^���P���.�P*��YD�vY���U��x-��=�7���+���Y����fEzbs�|7�����'| v��e{2�
���B�k����qh.��s���P2��
/���@a-��� ��Z��e���a�����6m�UB�m���k���M����j�Zc���j��S�6���_�����KG��X>L,��]l��=�=/�-��-���$��J��k�aXe%�z\b+g!�C%&�p��J[�n��&��L�E)6�'��o���G�D^D_����Y������B�P6S����,R��ei���9��a����0�}���n��0E[���cg�[$:��0�,���U����	������e�y��s��XY�������3[�����}�D����biY�P#�*�r���}�;3��k������.&8g���ykf���oV�%zR�����o��e��m_��Y�������]����O���������y94���X������]3�����-�m_�c	*|�}Z!qae��"Rx���,.�|��(DO���:,k������b0�W�����^0e����_g�sv�����y���/�$#��Z�*�}>&+V���?f������&L�
�����M�O*��=��E�,�Z����iV�������Va�I
����
�.�]��y�x�����\$;��T��v�`ak�XZ�#��J����a%y��,T��u�,}���%���}�<��\��3g7���n����:L�5\,k�LaI�
���
U��Ss�����a&\b����
�.��}�b!������VaLc��������/sXA�[��N��)v�sc�Y����S�fz�K���d�Y3���R��n�����"M[��
eu�b�/$�����r�/<������s��n�,��6�P�f�^��$�K?����"�A�@��+�/��/��_hX.�]v�X���	��*����}Y��Z�{�wC���D���*�/��=��6&�+
�����3_AP�����cA���s6wX�����V�%�_X�"������d�E�k�v���:��[J��y�'Li��d�,������bW�����/-�
�X�����^i���u!��%���/,�z���,W
,���2)0��r��������N���96��'67]���r���+{�:���W_����.�U��T�fv-��2�d�3�w����3p��((����+e��v~�K(�ex(
vA7v�u�,x��V�j�)��N�����9/P�]���T�X���A����:�/�.}'��g�`i`�Yx7Ev�`�O��p�������u*_�>-����\)��<�3J���Y�������1��1��_����B�9�zf,�	s�bSj�a��t������5&S��=J����|����D��|�k]�z1�����`�U��zs�=	A_�
&��
neXx��hx/��w9g+ww����w��������B	��j��ae������%i�,�$iaR8��If���,g�_��^Z��B7�7LWI���w�[s��+���9)�3V�eKB���u?1|����i_�yIV�X�����L�k��� 7���+[Z	�N0m�_>f������eb���E���.i��C��aa���8�y7E�c�8��Q$��*�0����`������,,G��Vb,-K�
k}�c�����]����:,�cM�����es�'0��b�E�b�������`U(�';|�m�
�a����7�+�[�gV-�w�����k���)�{�0+��2�.�Y�~7��g��N������Y��gX�t�����t���H����P�SH~��f���\�,�*6��X�W�pc
��a��A����#b���pm�����ZVs����ug�.k03�6��9�"L�T4���BMBY��P�������d���N3��A,�J[��,L�J��b1b���n�v��������;s�bXk�h��D~�P-1�w:���hX|'����:9"���3A���9@����FW!;��:�1h��o���h�<��Ra��i����@&&(�����Q(F�w���
?�`;+6?3
����+=f�fm�b�1;����2���b�������cE_����t�r�����{I����XI�Xz�����u�>l���"�.��D.
���&�}
F�O5�|z��V�����;fxl���X�T�����������=V'��2a��2��	6���H�K��a!���N�W���
�~��R�og��2�+0�
�w��/��� �>,�9����|����w9��9,�	���~�s6���{L�UL�S4T�e&58��Y��W1�N��#|�f�G
�R�,L��*�{(@_w�>�Lk��	��_f��*_�*\�1,:�O4����C��+	���;$�iI5���x�dP�a|:����~Y�c>����U����9`#����p��l�T�K�!LQC�S�e�d�`����=p�,���Y��|t���=:T�s��J���lY2t��b�����M�bsLk���%X��hxb�tg��nXs���hx��`,z�]��#��$Y-�	��
/���B����`�R���%�H�y���J��p�����~w����[�q��9���h����m��?�-pp��HD�a8=�n���`=Z���>��5����8��;�����g��|��XZL���r�n��y1�O�OA�cX3'��E���v0����!����L��7������\��P��0�G��t".�5�p�]!�a���|���M����t�-U�����1��0�O����*(�V��.x(	z�U�c�Y�Or�w�i_��z��QYY���Ko���/����}���Qp�+4��[n���	��a]��t]M���bL�������5�Q��Eb��}�b��u���0��[���+|I��1�.�f���o�����UR��%
��`s��n�v�`
U��eY����a���������b��eC��M��	?f�����:�������'��&
N�W��{!$T��9z��Gl�
�&$��0�Mw�?$�d��]�JjnP;4�"��D����[�t0�S�P�\,t�-��0��
���*yK�c
������;g<�;�� �����]\+%�
�d����{��B��c���)����|)���I�d�����9����)�����/��<�s�U����;`��i�F����Q���/<��ne%��
�~A�������(����X�7_�thN���}�\%l���9#�-}g�����h��JW��%�r�f]�����2A7�X����N�����BV�J������*����BZ�����{at��-<��E��+� ���q����9Z���X���b��U&�J�[�1aX�xPs�K$rg�>�)=��q��U��Z��i
�?���ZiK=�l3Yr����~�mw�k�����w��-5�[�x�I
:I������
,K	C����v����no��92'>�YVp�Q�P�����]�"����M�b{�����,�,J*�e�i�b�����Vd����i�c�Yj�V���������])J����)��u���;Go���]�|�v��Q�LI���v�.|�;nq%n�� ����b���R��n+.c>��B����dr��S��e�R{�����1����)��N�LQ����G�t
�bvL�%<���U$��yrZy��������w�2��^�7t��bw����?�u�����6KX��.��
��6����x]B��"���1�Fl�NQ����L�dqP��{�U�'�5[-t1�DM�GA7��\��:/�"�9-�=���Yf�C�-�M�g���Cs��P�Y���]��@l��b�O�|�M�}>�3�SFvg�>�}�X���S��%�s���\�����]�(���'�j�����w^��W�	�=��	:�����)���T���h-lxX�,�(��@d�}�V�4Op����(=�~�h��%�����d���o��*�I���P����h�0�%�d���.���.+��S?�����:���+������h�&��.#��M��	�����m�����)��\P1-�<�R�d5Of+{�%�'�s�a2L,��I���Xz�(C���]����<h����b8V��J������:�����r�*���h���L+n_��JV�����w����i��T�ESZJ����i��#d7C�'����i�������h���/i�s6�����P������Z�{B�E�L@W,k��V�f/���S�n���e=h�z.�j�E�]x��Jh����u��]x���s��>1�p���8��(�O�p�{�D/���e���
7<��
�OKxO�I��p���wn�84�k#2�'������8-�=�H���(��J�����a�v�a��X�qM|���7�x7A�����h���eX�>/!9g{e��:>����t��v+xOx�
�W��V����*5�I�.�,���h=a�5h(+���k���������dB���j�e�y�T�BV����X���`����=&�)��m�R�bI�	�"�s[?g&F*6-����7A_�h��G [.��,i=�����]hz�6#����%�A����>'��H����X��u�^�&*XZ9�*FP�e�=��,���L������w�igv��`%D��j� �r�4���?���a<�U�Q���?w��&�Yx	���������mnAOX���4������c���'�e#�/����o�;�S`}7T������
��p&��U��U�F���4t.e83�d2b����C.�
�*M3�A�:�`;���?�{���n��=1Ui�4H>N�l�eA�	�A/��	��WJ��Z��O�>�i���DC�o[��J�h�<G�J����'��
�G�����qK��0$'��mq�Y��-���*u�}!�bU�	����ec;s�����hZ&��By��Z�y��?���R�������W�PQl�3�M�]'�):�������
�.t�����u���l��mZ�y��L��K;��-U[[�^H/:_�x�B�w����b���{h.X�J�3�]
�H98yw;s�%a�Txa��|��,G�{L����&��������YJw��ca]d�T-(X�b,-!��o�J�i^zj�/|��E��W!�E$����Xvx�st����2\�����Xvx�N��l�V�;�[�V�K�<a�O�P�"������o9�k<�,��Y<&(�aZ��p��f���-�,���K��V�L�Ot�VeK���'��C76��R�g
��*sh.zv`9x�����P�Aa��[�.�e
���aD�ne�W�^�e)����E�[X��<����,��X��h(2+�*�z,k���'DC��emY�5��9���m�W�2�eE[X9*z����v�;���lx����e�M���XXB(�)����.�o@94����X(�Q�8��;uO�������������P�����eGM�O!�����YD�B�dY�������eyY�#
�[��������*����~��/6+"���u����
67�����O����sv�R0��z��-���E/���������{J�^�hI�Jk�nz�/����|u�9{��3Xx�������|��5Y��ixr�t	�"UCW��&�]�~X�����
�>��G-���X�^t������;�TFs�k��8��]���4K�������b���s!�9��rx��n�emY�
ePY����{�9k�.�O�f�4�t��
�n��wR����\E�O�s�Rs�,j�X}�h��;
�*���44�+K�U)�-,��`b�V�2|���fYL���v'Xn�4�;��9���v�i7������[~��E{��>��eI��4�D��+l���[w19\�0B+9�J�r�y'84w��2��Pa�,i�������~�r�(fY[���D�S����f&�)���H�:�����v+H���������gI�68C/���+^�%mks}�$����u�t�o���m���'NA���'�Q�����9;`�A�����p��.-������2\��i����lkQ��hQ��$&~i8�k<���3�
��Vaz�|���������Yn7�-���N��}��w���#���M	-�&����Me���a�N���G��.��H:�r.�t���J�����t/7g�g-��1����cd	�Yd&���X'��VP�Z�;^0m,�bx�n���`��@�,���T���1;�0��H����%|��
;���2�sVs������S�_�s���x�����U������tk�n�1�/����������Gg5p'�R2��>���,m7E��`C4�L�&K�6���{�,��X���,��3g��,��`�B�#����jW��;�+�(�Z��Vl}�ms~5X�����{J�1�G"h������s�z3��/�vw����{�}�2����Cs�fX,<fj��j�Ba7A�`��E�e'J^po
����`��2����e���A�J�r����npi��q�R�e���41D�B�`��a�-���J����]<��^�;�5�b'tC�m�T���Qez���m6�B����rN�Z[_�WX�U/zC��R��E��Br&�S[��{Y�x��_���i|^	��=�MI������Y�E%���i����XD���,CgV���z;��I��";10�t��
CJ7�#������"%=I�(/XUh���*qdKCIV��p}�������oX�,m����=gi
S�O��w�k�*����X�x1�c��M*��<��aHv�z���Ziy1I)���Qj��w�����/���T�Fa�����7�J^0.�bxJ���l����	�,���`;��/B�=�] 6�
����i�
��b+�/�,�{FDw�m��Tp+,�Lw����"�\�"XN�J��E�,������r��@��%=���g�	�[����,=XK;�w�i�
�]���BT��Z���5��E�?�{#���\���0k;/{
:�����M��4�1�`����Rav��A�mI��������e�T�.4���0t%�ca��t�~`$�������Q9)%Cq�`;L�.�����k��w����<�/�/e�@gQvwJ-�Y/�
cA���
����>C^��UQj�����P�[Q�����{D��;���2�s��?iw�`��@i8���1:�����S�����<~���"�p{���2}��,kw��{���<~L��������4������l6�����=T������,rI�2UX���!�x=C���'_�H������T��f��s�IA���O/�5#�D�%��?`������O��A�A��fJ������2A��1�`���S����������pf��7!�������D�4��1{�Ov��'�n����������C����,�Z�,�35�Q8�����?�oO������{~{���iz���
�y����n%a��^*�6=�������
��"}�_�Fk�<���������������1wC���YM�r~��}����E1 ��3}����Zs3��= ����>*�Q&9`v����v���Z{�������J�w:�����X1��DFQQ��?P������y.���A56���]f��+~��>�Y�����R	��v%���iV��k���NI��c�
A����Q$Yc�N�D������~ixP��1������7'��`�V��������5���s�I'��}��Cw�P>���{?Hw�4��0�a�],*�4����{N�l�4�����/��{���pg��U?���cr�-�w�GE��C�c�	���~P�������B��\	���F�!�����>������T(j���w�O�#vSd�������?�=/����7�Z��^�]/��2:�����/����K����������#�R(GE�fg%4��z�����6�k�S9�n����i����e�fT�h��5�1��1R�N���9;0�����E�Obw�i�FX���9A,L�I����eb+�c>WR����H�����������}��a���`��:�[i��s��] �P�z�6x=�X��H`�0Av�` 1�u���5�������&�G�����v�o%Ot�\����v�l0i�]�.��.$�m��aZ�_CwOv�l��k7Ev��p�/
C��>�A�p6yi�i��M�]E��������c��iP�B�`���������KeW������!�H��5�W%��L������P?e�vC��OA35�i��e�v������N!�����.A���t�������2��)�������9{��j�I����;s��a���[-��,������+�}�7g��	����`��A��zg����}��Q�4k��s��)���j�Y�`g�;�|6=���S	R���W<q��C�T�Mw����4|g��l���gW���>����5<���H��j��c��e}R��$L�}$Em�]l`f�ez��f�%��"�YR��7�vE��t�|U��:�03MG����
c���~�@g�Gw�Aj��L(������qq���D�����7 )B#���1�P�n��=����U��fG<=`U�,��27��+�������I0���(��4������������7<gj�0�a
k����c�fz��.��k��2\	�N�?���5�1m�2������|�9K?M�.|�2�����iW�QH��}\�^0�.��J�������Lx���W���*�X:�
������CW���$�n�_5�V�������t6��O�[9<N�����u���6��4�y�wg~���j�	���>���iY���8�	�3��]d�h�T_,;1�rG���
�J�l��.3,��6�e�	�]�P��7�8W���LE����N?��	�E#Mgx��U�.��:�:�Y����?g����1�V�`��`���K�U�3�3����<�����-o�0�4U�\_���4�,�����@���x
|w�N�va�F�����3tY �b����ev�XrH�du���e]f� �f�qbg��wC�=T�E�,�'6W�Xvh[i����|���		:8��:�����/Ve+:��z��������bW!�pY��bx��%	�vV5 �p����1�J��"� �D/�	�R�c7C�3G�Q,�#v���L���[����[6�.rQ�5�2�����b(b��w���rQ�����&�%��N���L��k�����X�L��)��hi�2�;��K���~"����R������-��\v-v�N[��}U�
�E�VZv�k�����f���Z�^���YK,T���Vf�>�a=�H{�m������[D�����bgJL���<kH�����������D�h���/���H��1j�������0���YE�%��&,,VW�����&bo�~�
�\���/�]}�.d���w���������� �{Y_��.f��I��m��(�p/[�y�����r��G��ou�F9n%��K����6b���:�.�t|��1��8�������F���Im���b	"��r*��2T+
��V�N+������V+f?f�������S}�f��j�e��F����VZ�/�
_��Ht%�`����=��|I��y{�/yT���![���Y�'=Z	��3L�P�@l)�m
��~T/n��XA������������������]1f�Uc�n0"�`�
E�u*G�=�=	����.<;��l+\IqY����������foF���g����g��L@����.���Oi���vM�>��������4;�.\4�e1}�`K�5/��zBV��l�l��
���w/Vc)z2��O�����n�;4��?��]��Y��:`�DC.����{���4paO��>w�-��,�{��E�����k�n��c��UlA����o�:4Wu�,�{AO]4<�KB�[e�XbG���&�>�a�^0�*]��Q����J���{/�|(�J~���}'�~
���
}R��n�v`����.fi�R�
�*���������
c8��-������:�b����V�`���+��~��lgj�b�F��1����8���xg�{:tC�����m�i�������s/�:_��3���3A�P���w9��+��l�V�������=�����,,b
^.&���.+�^��#�9gGr^vC�	C��w�/mX�e�kq_	��7Pwa�4������l�l/��3�����N�;;,��V|�.�����0�����^{0���zX�������k����,�^N���Al&�����7��:>�:g��nA�����������'�`�I�eB�b'�Y�UUZ��������;G_X.�;��S���?H��0	&�c������`��[y����&����bWi���c�A7X�m�c�.���:r%�ju�f4���D7^�t	��F_����s!�`9���A��0�5����3���`�@�[�6��t����\��J������K��K�p����a���S�3C�V��;�� ���������;W�����'���R��n��<�\���a����>��!�Y�_�����Y�����W�o`�m�{t��Y����t�-�3|Mx�
��sj��M��T�>N����CF;;,�
�B���V+B_��YtE$����z��.�s6����Y�h��v��"�h**,�`�vSD~��v�`JF4t��D
�`KO���Y�3s�����d�+�eVW��T�R�����E�N�����'���/
z�:
��Lu��b��iwd���.9m��J�faL3��N��)��C�A���@i*'Xz�]��|e���h�h���[<<��}f���/�,��Rj�Ry�`�o�1WZ��}1�o�F��m�1�3��`�[l�nv�g��j�4�"��4��Kd?]�������s��|~[h�f��hxl�e����p|�������.�b*v���X����v3t{���yU���7�����'��b��*p~[�*V��'[.
�y�h}�X��,}����.E�Kcf7E�S��(���Z��SU�n����|!�!����7k]}'�ign�\B�����.V9-v0��v����o���AU����naQl�e����*|^�G�Y������V�4�-S��d����{��|���9�b'��$�^�5����\5�����-`���W���-��\h8���}�s�h������"m	l��#������E��B�D�w�������NECQ��f��]�Pn��P�(��}[���S!3���=�s���-�?�V�7f��`W��
�>����g�`����#��j���%�o&q.:k�����bb<�it/���fY���YY�-q~Ss��dEIba��X�g
C�6[	�X���;}��P/>��3lEf-�����F��6���J��f��s��6e�=�u���.�s�����T���=M��%�?�����e42��5��.�m���P�P�6F�0%'����Wd�I�WZLv����Uva%M�7t���7��m����7��>�>6�s4k���o:4���n&t�%$�*olfs��)L�{L����\4�3�]��e�o&Co��%a�xba��yp���\��^{^�����>|�Fj��$���0�����n���@t������[�� Fa?��Q�h��n��t�E?��,l�`�E��������9�~�s6����j���nLZ�,�����������g�*�%�������S���<���+P�W����v>l2�`lD������f�������HD��Rl��Hz���`���5����d��,
�k���o��_SYN��W��n����dN��oF-�?�p�`�Kc�Gz�-���/��%�Q�2���m�o_p�h`�&���E�b�!P���nK��0�4�;���J��W
��t=����m�~J�>{g��6v�z'�k�R�k����|h�������������{���s���9�7��i��
���L_t��`x��R��S���o������o���R��?MT\��n���02�� ��E�h��)����u�����Y���xof���g�t����>T_]��YB����AO����>����+������<A�+T�BY$���mL���U��|S��D���}���l�F�r���?7-��&��~Z�:����wf?�_�1k����9�$��5E������������st��])���
;G����m~\�K;�0d����k���������N�9;
O����a�]����Z���G 	���`/vT�Xk��p	��]�q@lA&����
�RX�����C����l�������R�,l|Vv�a��h��k���d���~�������������E��h�y���[Z��N��'hx1�������`/�I�R�nz�O0�$�4AbN����z[���EC�6�NQ��>j���c����	[��e�����}���b�H���r�����J$���7w���WI4&h��ur�>�d�b���[�]{OLCW���P�4�":����|�H���R
������)Ev+��V+�ad-�%^��/�/�[������
���W��,��^�.Qxx\��J����o&�.�C	/	�W2�g�����]]ba|&���{���8����E�
�@8CK�h�
6_��!;��&K��0@,lU����=��T�D��� �^������j���Co+���kz@7�{v�(��������E������9Iv+%��X�����_5����n���mc:��'�)-5v���-���:�a�����)0����l�����4�EO����S��V�~�9N%��jX�+���`���6�5��?��G��p�},����Vte^nC���\h�3����EC-G��}T����:y�fi���6O.|���|���(���)w?&�U�GU^�����.Vu����b;��Wu�-��>V�~�X�hX)v�c�G��H��[�vS4=E�1��Sb/���K���R7�u��
�.m�%��.����I]v3EV�~XXX�*4�>V�~�z�h�U-<V��;�hVG-����Y�{���U��y]��
;�����/�W���hba>Bl�c����L��]4����U�]�����4�E��B�0�%��\�XXPm���c
��ih�.(?��~�6{��i�06&�JE����'�JREg���9�B?,�.����X�V
�������R�����\�Qs��6��o�P��X��g�����X���k���*t�=����V��xOVw~���*#v���0�d��F�������=�}V�-:�����Z+vC����	E�����d��������1�h�V>/�1Lu�tA%��V����E�Z9���@�K������lf�R�����1t���>i��M�\��y,��;k��+�����x��r���2�7��[v��������@�P��TreV���<h��<�jV��L�����Y~X[�h�����h���=��'��`����Xx�au����`g�kN0�D����vC�7����n�D|�I/X�-��B��c�`� �1�!�+�6k8�2y��R�b���A7��e�K��3\���\�_����#�;.,'�.,Q�b�bi�,�	��[�,w��������9��7:W���
n���9�������,AOV�*v���l��=�} �yE0��\)��������i�&u�&Df���]��z7E��X�����s��}`$���A�@k�[��X���Q�������K���@��5��^�������Cs����]	n6Q���0C��X+��R���S,�
W~<V~`��hA�b1�)�ne���/�������*l"V�}�t��8gG%,f������)���7f&�+z0�4��n��_W�iu�L�E��*���1�j*�iQ��d�U���x��R��yk����;<�KA��J�����l=
7y=�}`�H4���)l��bK��]&i*:��V`a��������L����C
��w��9=`�M�=�`vC�G�����,<���Q�+�1��>��f��]�"�J/��w�<V�}��3n,�`�L�NlV[�=���+:7���y��5$C{������e��ba���eS�}
��Aw�h
�c�[!wO�m
.�Cw���8�&`���bs��n��?�v��2I��?{,g��NDI��>Y�.���S��1�/�:��G*z�����+�������!����?7���0�"��
���Q�[ra��������7V���w�k��<w}��%��?��{+���)��BZ��������>K�������]��&����eO*NM��R;��)�,8������0�1?��;s�&`5�$<aI�P5�v+)K����E��b�
����;�6�i����X��`��,�\����VZ�p�����bU���|����?�?G��b��k���'`�I4������Ki>��:_�q�B�@���.��Kh�p>p�[rc
1C+i>��Ej��zdg��+,���`�,�Od�k#�N���K��	&�)z�P��0�O�+�E�_AS����d8E�"sY.l��R�Y����hx������l�m��ll�
}bu����������-��6�6��"V��m)`�����Y
g���Y�|�lM;�y|7E�S�}V?��u���Hx#,T%��+6dv���1�2��"~��*�� ���
=(�7����aQD��:=�P��v	������.�J��8�G���s�����^���e�H���f+~��8s@����&�����Tb��J�d�hc����|I�
�2��/�{J�1��}��
�YxO���.�0Id���E�j)l<}�BL���j�m���_��;svcX}��������`a����e��8����;sv	X�Ft���fM�����;�,�������L�u<a��hz��%�����oA��D1Ew�������8Y(Z�b�>���|��8���'H�5�{��lVl���gc5G�����P�,�	�\i���/I��P�P����<Y������6V�!J]z�iM�M�(�-^*-v��{7T;2���h�s�#�Aw�L�Z�.+�Kc9�^�{��G�����(T)��4Ky�f�3s�?|��-�p��B�V����Jl��q7���X=�h��'�V"����,
o`
u=������jg���A
|��<a�X��O������)��{L;#L��YS�"_l ^W"67�W���H���e�+��+���@]���M�����z�0��,��7��B�6�WA��Y���od�*���<�z��(�^�`K���1S�}�O�)������
���Wt�����^�n���YQ�ia��e�b;+
��JV���
4]_���%as�vX#%�����<���i��$',}k�b���m9���<M����@+A2Kr6%
+�����'9O����>mSyMav���P`��uW���4�Y�K7���x��^;n�1#��pb�j��3��a���hj�1a)���(�|��9��[���Yp�1�U��5;����J������*e�V�Y��j�������o���f��#A���z��Oi�'�Boz��ing?�&-t�A��%������c���2���+A�����OL��`D������K��R/<g+uo�j������'Xnu��K��r��Fl�����"�V�����pa���&�Y��X_�1}Y��APl)im����'�V^�S��E����������)���Wma����D���Y)��8m�����s��;a%I��|7E���2��@8E�����B�p-j�w3����v�k7�������N���5�n*�����9bo�>[�dZ�77�ZSxn,��,���0��
;��������M�����J���� ��,>�?�Cs�wq;
/���Y�������1���[�U��������O�)�|��0#lEt�Y�9�5h.�����,���P^�mE�>��i7E��`�z��`g�><�J1vU;��>Z�E����i���6������v~+.7&�$�9�0�"���Nv��l���M�(�l#����sFj_�l��H���
��,m������V�,��n0g#��Ft��N����K����g��_���	L��2gf�������iXY*���ZR��x,�i�����,1�`�@4|e�3�O�������&���
5�����5����
:����B������YUi5�h`��pH�����F4�b
F�%/
+SR�u�!�4U�_8�X��j���3y6M�fR��R�����6Kq7&��,�
7m%I�����IN��d�
�j-�_�Z3�j�p���w�i��v�#�������6kb7��Z��v>�Z7(��]9�[$�1�h�������D�,N����to�4���p{��u������K`�����&�b�3�f��[�������E�bo(
bQl���n���3]k���\����ee7U���u�iw&+#F���Bku�&vgyf��-	��yX�[_�3U,�xVo��-�"���M��6�����^)g�j�P�')�a�zf�{�j�P�I%8�R��W���p���p^��������b/v;�O��u>��C�M�����=J�Y7�Y�4�Q�*����Q������NO/|�����-�b�B&�[��3-n�+�k=jvB����Y?�����zC�����j���.$a/���Y>�,�g���=b�N��^;�L\4�E�}�����V�p	
z��X��w�v&�%v1��-��v���NJ������3$����R��xg��t1��d����`�UF��������c���W,�p�a����]���d������c�$�YX��kV71{|���9GSVk3P��{�D�]��p'�V:|ae���X+=W���%b���N��!����L�[X�-����'�q���k�0R;lL�X�M�������3<U;��|7�v�X�@�b�:b/����axRl!eq����EOx������+�E�;�K%���T��[�wC����AC�O�}�C���{|vSdw�Ik�^0�{�:y��6p�ej��[���[�3Y��P�-o����`�fY��X���l�B�n]x(h��������]�����
�������pq-��������1�kB�/hx;�XX�&�3��4���,c�5�"4T2K��u���1�0��A��Pu�-H����h�)���;����p��~����o&'�a�q�[�E�[��C������>��"�X	eZD��H]�W���"�����\�4�l��=g/����?t�d7�����j48�����=�nz�v�l�������/����	�.m�0d���`�v��'\�f�~�0j�{��
_����-������h�N:Eb�[�2��Wj	��Mm�������<�Z�&�Q�����;L�4��/�������5z���`�
��,k����/�h������J��
�������h���f�����#u��o7T{O0�4���*0c����a�$�V�M��'&�..������@���0�h�B�Z��D��bb+�.���;?Eg��s�������z`��.��~�����/�}c�8�n%k
��a$[v�N��\��^{�tm�C�O����'��uz�2������u�L���b3�r���>3'����-)�5��EW%,_	��$eK1%e_IoZR����+�+���2�q�&_q������'I���ly�] I����`aC������Z�Bd���A��#�rA��[b�3
9��g0���gg�:%u��ba�>X�c��}G�R��)r��=(�T)�����.�(�
�O���x��w��2}�#���Vv�L�]4��V�g��T�����4b+�������i��;��2.�oD�cr�u7�v�����3�E_9-XO>��E��-%�����`���nEh��&�� �/�I��P��A�vH������|�a�������/|z�dX�0�%ev��5����U����g����U���D��K�����+�9w�k�
�!�~����?�O��n-������.{���J���S�y�eHAC)z[��\I��OEf+�e�;��[��P����'�F2e�d�r���=���t�����SQ+� ��6��P�1Mx�����9{@L��4�
�{���X��3qv�P�O����&u��%��*��E��M��H��E����Vy%�j��Bi�s�����������%U��`Sg�n��\a^G4[���~���u��;��8���W��_���6X�����a�I(����.\��-�n,�am�$�����G�`���e'��������u�s��YH^c*z@VB�0� 1x������7j��t�w&$/�J�.�R
�*+�w����:���WW����:l
o�ev5[����*;��[�b]G���B�u����[8������h���L�y��<^���#����[���>��Y,���l�@�Mo�����a\���]h�����)��4+F{������������Z6?f�J��:"V��y��Y��J1��
����W��9�A5+|����M���7>��,�:$v�^���_��G�;Y�������>��cZ�>_9}f�[E��-�=^��L�^4}�$O������=�>��=X�K,l�����|��y+g2����@/�.#_����JJ4�������`q3���h7C������Y�y-�������HI�I����e�6�eeDb��1��]{OLC�4k��J��r��c��C��%�)���_+��[�D/x*�f% b/�@�1C��R�z�M�����Eg��s�NM���}br���'q�t��
�.��=a�A,�u���[y�j^K�����:�i����M/����������P�e%~bi<2����ki�|������������^b+���V����;[��������a�������� ��.���J�b��������E�;T6�,5�����O���aK�hXF"^�&�VW��V�~�~��j�l����������-C��� rh�t"���
��������\��2��4>k�����`z��:C�y�0!&��������k�
��R��[��`�h{�_�����&��?��i��M���c��b:�����Xx���7���T�S��X���.�������6����M�_D��0�l�y�`��n����b��a?�-��Xx
lW����&��P��7�`o��;YC�������N.��
����a�����`��b��H���c��{�ZV�����a��X���z��^�x~7EvTa��I�>��k|���Zb{%Ia!�,svh���h�L�Ll��m��G�W���/������*��F��d�2���*��5�*�/S����_���p�z�������/�e}��d�a8A�.�"v���tKb;sv�`&�s��������7�E�� �Z"=���S��-9P��������5�vC�S�:�DO���O�`7To�L�[t�Stg��$����Wxg���� ����0�%�U����P��4�"E7
�.�`�py{?�\���4Tot0�4��	v��_����ay�����E�_��]����K'��Y��j�svd�_Kh�LB[t�����.vC�&	O����L��9XM4��H��5���`
�$�K���f&)-���r�L`Y��)
�^p���4��
���$)
Ox���d������i�+X�yI��}�w��fj����_����3}����kahZ
����a�7X���y����(�!qg���.4�^0`-y;*}D��~�r���n�Y����d]X��eB��/���r�g���5��`$D������}:\�����Fz�L}�]AB���ylp�\���E�_&�(������'�0�=���b��Nm5��

�~)Y�7?�=�-�T�Z�:�:���e
���w�{t�4�����`;y�5�wSd�	��~�w�3gw��M��\��pV������J��Z�/��}W���G�e���F�}[�����4�����m=j���?�_�������h7�v��S��
6�,f����R���R���@��k�����X	��5�A�L�X���,�N�_*6'�����w�kgJ�X
�b��T
z�� �^	�[
��/O�N@�[�+N���_(�t�Nw��^�]:EQ}Z���.��t�M�o$�6`�@z��D�{L;2L�Z4��e��,Al�!��T�Ui��0�KvUrb����N��^����U9�ZK��^I��k�����`4�jl����n����~�Y�ig��9��
+5�wUl�����,��2��	J�l%�X�P�d���\�\nX�y��m��2�w!d0��<�2�h(w+���l�N�a�dX@*-����e����������u����;
}M����9���Z��Y$P�E�Y��:�b�����`�5��5b;\�����9{���n���������	4,@<� ���ShA��n	�^n����+z�2��T���W&��K��Jg}��}����M?��[(���L�@�J���9��,�#�%���9�sL}@t��w��g��h��l��$��g.��dDl����,l*�X��Xx��X�,[�4�L[T���!����jq��:�Db��^�z���E��2�bW�R�a����}�x����f�,
�^����/��\��boV[;� +������k��/���������'`%T�s�ug�>�����~�*
��d]Mb�y}7E�cXVEtE�mX�u@7�QU��`g�����
�e&D?����������J�����S��3���	��2���z;�:�PnXtg��b��`a�0��J��F��q��;<J=�,�vW�PdXhj���0��O�5]�����g��	Z�v��8�0`�����z�������Y��gl%Re�����Dg��9�@�	zz��9�S*�T��[9u��|��8D(�|o�[�XZ8V	��2
��>y��}B,�{{�c�nz��A�"�C�?���$������4����[�K�hj�{�-)�v���a��|'��9	�b�������6X(6O���H���J�,��
�Nl�`DZ���~#����.�MK(6�E����	]p���)����6�����'��"��L�Utc
b�}kfaHTB��l>l���n9,�
z�m}�$��P�\lO	��Y�v��j���lv�D���/���N���1��B���_���._�����t��M��M���J���Vl!�dQ�OW�M1��9{P��4����u9�>`aG��\��V�p��*b*X��6A���`�B��������>���;s��a~���k��(���+�%����)� ���HA�������i��F�������";�]z��)
���}*n���}��P�7��d��$XCx0
a�9�u��T���}��(
T��!��})F���\h%�}WV��0hA���xcg���<����/��F/���<,"L�6A�t�����7���s��=oAhpX�x�3�M���`[�v�a���MCZJ���-���	��)v�6��P�0i\�7�i�Vf�;�4��?��S���T�{J���,��l>ga��5j+Oi�6��t)Xhv����
%K0:a�s�_
���'��qE?��oH�~]�����c���s�J��W�h��Q8)��"V�L-V4]���
�������czk�I�y}UL��0^(������n��0�V�W�a���n<m�O�4Sa����c���f�����<a�.,6	6g���
��^��k���"�s�IU����a���'<
��AvC�S�8����)i��
^�4%�_"I��^��Ph&�R5�_�Un��\�T=A!�c�Tx���|�9�%x
v��,�0��+����3+��0��0�c���Ck��3A��x*��&�[g������:��]r���6�=�L�X�L��.�<
�z	�[���&��S���w��?����~L����A����9�10�4�!����<��R��
��z��ga�X�)�W��[�>����;|82i��os�����E���������&��b;��-D��5['�����sJ����/����i��������.����2v�+EHv��<����B[��f�d�c�Z��
��O�N�}���*�9g������~����.�D�'(�N��NV�&�aVb�]�bk!�/p�M��!�@tK���9+�Nv}��O���M���&(��UR�M���P�0y	����^)���7vL]��}Zyu�$�����>L�H�dr~�B��f��^��W9
O�>��i��	=��w��}
�@L��N�=M#��,;,vA/-����<[���i�Z����~���7X�5G�t�,gUY����FlE�nZ�vB�Y"�0` �Z8����c�aB��a��XXn�%A��B�������t�P�P�d�+��[��Rv����h���%Q^�R+�&�Bi9��6������2i���5y'��
����R�v+q@��N�����XPG,lq��A�M��ExL
Lu���Vle���F��������A�P�@l�G+�V�VwZ�x�j7��I��e	m������Y6y�BD���s���Q�R�������'�zH�����X_,�iMl�
��m�r7�vq�\����:��+��&OU
�>���f!�m��	W��s����>��<�,�����'8���B0��aI,�����V����g��BW:�����=(&�+�.��7-�K���U+�N��+z��k�4�'i]����)���
�D��=^/6��w��]���N��=�y��Nh��������_vy{��N���\[�o]l�0�-��B��5['��}3'�<���V�s��>����`Z��t��wf��*:+���yw�\A�65[��&���ns�pZK�F��%
�1����7��Iv�a
6��%��wu��I_d���������`���������QNK�r������4K�r$
�1�f��[����!��<�~`(�����_i	�	��A7��{����D�����n�������$0
]�`��	������Jk*����J�
�k�]����k�5[Pm��]��a�VTH;��	��d��N�0�t��>g������b���1������:P��zdoQ���"��O�N��)����A��C�2�4�We3�h�dRr�o���h+�
���Zx�I�n7E��X�h��*
�.,9��,��K�����H-M��h�z;�;a]��[�����B�����	7��-�ZXw�x�n����^���V���>�}i'V��O�������fE_t	Z_wB��9�{��t���-l��LWt��J�#����j�zA���s�n��`��P��0C��`�J�lQ�"/�	�����/�K4�^^,�'�����D�8|��I-h�M�O��!n��v�UHFnf�[��������s.fg���	:�t�����CU9�=W��m��O8c|iP��O:|���N����K/��'�#,��L�+�7C�������'\$��^�.����ST��0p 1�?�-M,<�Bt��V���N�T6'�^���|���n�.�����(h*�cI^�&D(=��{3��^�U���h Y]x���w)���}��A/�����{��m'��
�Q�����^��=��f�j�J��Uk�N�y�X�[�
�4jx�&o�����}4A7x
�H-,�Z�����S��Z�F�E��2�F��������e��	K�^��@b�����B=]����;��5�7����n'��[j��l���u�������E=b������}i���x�n'L����f�0[xF�1LW�
+���[P�^V��7r����eU��6xh�����+����z{�h[�
���Dm�o��\TO<�e���$[E��sv�*0�9AV`�')���y7����*�;ba��vYLC�`�\bW��gYV^t&���C�hx��Yb0��_���������2���,\�BN�U��T��\~L8��`���JnY7�����$��>�`���X(-67l����k}�"�yM�
���%}�o�R�0R�1p#� /;>������j�����W����%�kU���C[���
���z�@{YU7#��B&�m�2�B�b�>�{H�,pl�e,��U]����'4��;{I�����az�������]�hI��I���?HTq�}o��w��BO������dq��.�,�,�.����Ba�����������%u��Mw�`�6o����b�x��]��e5qb��E��������$����:��2����c������M�����J���J�b�*��������`;[j�����%f����,��
�e��B&�c�r����bm�YA�PX./v�"i��&���f�����3s�����LSNl��p��v�XS�����;sv���%�U���
�����	���{�����4&'��l�,���/Y0�I �L!��8��1����Z���e���A_0|,�0��|^�{L�O��B4�<�]{�#X�����=N����m��""��X;�����3y���[��{��$��6Ks����+!���lU�^L{Xt�
��m�3\l��1�|A_/������#m��3�l�*�e���AwV�,���SK���ht���H��f&��~���|]4��}Mx��`r
*����c��sh���!��k��E���
�X��FH���;sv�`9W���tg�N��T�������gL��$�������v��7��M���[��0|����J;=p���e%�]��,#�j����M�W:����nAX�-^L�Xt.w�����t|E�6@�O���/T`�R����wHx�����{�>�zZf���7L�B�]�0�/���`g��#<gLo���������A��iq�Z�l����
3d��~g�$��,�K�7$j�Ww*���"����b��b����Z��)>����'����+�u�����S�#��Ji��U}g�<U��+d���#��k�{L{L%Lt�*�e�����D��J�&���*���.���Na��9o���U������SL�n��bx�J���V�����]7�,>��16�J���C�����Q����h���e
��4@E�[���O���s6���&�;3L���s�VDI@�NQ<1�`[�&|Y|��(���[��<i��P�*���s�w%zg���Awx���(�Xb������n���z���U���}|��,�Z�^*����4�[/u�(U�#��w����62,��1Tj����t*����uZi9B���r�������D���vJ���x[05�B���� �*JFy��;��ke���*-j]zi������=p;s�c`��P]\��W5jx��J�B�)���E��D-�	�b��p]�����������N�i����O��";#0#qY}�j7�SwC��(����n��?A?&����1gM���=3tI����6�=�1<X��,}�J����SJ/��e��7Yku��n��K�+���>k��.�MOP��K�y�-
'"����5^������v�Z�:�AW��-y�`B���0�(v�[*u1�U�,�
�9����s4�v3����J'�2���B`��f}
�������?��iV�lv�_��\*�Lw�2;J�z{�d1������R���P�'i�5��ew����������=������,#�G:���u���y�tVC��.��|��A�"�}s������x1�4r�����`x�pf���;�v�g1{�<�������)�C
�.#�G;�y���1}#��l����e�/�}�Cy��eG�\������_F2���������Gc�AO/���9����*$6��53�|S�n�v��i�4kO�e��I?����g���eZ(f������D��e�������}�����A]��o��2�2�f'�%�>1J���=����z�2������ ������R�����-���'T�i:��{����P��*�t>A��'x����e���}��c�{B9%���X�,q���M��'��=P_�Y�d�e��O|�K��iC�C�ox���/��5�?��l�}E�Af������aU���|�#�8vSd?i��P�/���~��;}����|�
N�e
�f�se����4=�$����5�s1��~&��2�D�~-����$Dn;�Hx�4k�2��1Y�F�`��$�l���L�cWI��0�,[���E�����	�j����c�
���0�����T����������������}�d����Zs�'y�������s�|����t-i_���f�^RJ6�.�2{�#�������^���Py��	+�~�)��Z�i8R|9��Y����/o������v�7�M��p�����E<gQ���+���f�>*��$v\�4�lpk����v��=!	<��[��
+��mpI�p���`��$R�E�ofo��D����>1<��=�����]���+����*55M�&�	� 5g���$*���6$vl�I�Z>�k��>�Y}y&���"��z���Z��������.���f��e��f]�G-�����pd�^T��*�?�H]pI�= �ti�IQ��9{@0��������;��H�5[�=?��;@0a#�c��r���F��/�eWE�����v����i���a��g�W����j�3=�~�U?��[�-�� Ii�L��,u��&���c�w���QW��n_����D���N��1#]^�L�J����`o�M�F���f�~�g6=����b��k/VH�j�c+�����+�6_]���Q�Vev����b�\������P�=�v�W�L�!X�[��+�WK��R	���^t�
.���R�W���������%Zl������j�����N4j���k�f�-xO��'�Y��z�4,?v��k����k_V������,�?�|#��5�s���>*l+y���v������;�ux�L�{��5��)�a)���{���	
�����d�Lw��R9G���/C_�f
����W����o��I��K���&���5�����SBv��d�i�x�3�>��������MS��`����Z6����a�
�]g�6\���su���v����i��I���R����= �Yg������j�v��k�ppNhE~g���%]A/���+��i/n"Ag��s���]j����7[�%�
#����:gy��x%�i��H���W�`�"�����+�R2d�y���S���E���T���= ����/Q�5���u��^����5{�_p���Z6SE@���.��6�a�h��j��[�[N�"�I�)���*����<����`/� /���}�=����/�oXf,��\�Wz`���c`�Gz�0�,
5,�.�1_��NcN�V����4�M?�T,�nd��<���+�'�~�����s��*�k6�O������M3�k��R����@�/�0��U9�-�1��8�������P������wU��1gu���g�TN�w ��+��B)����J���E7�2E{�Nv�3�~U�=�����<����%�W`��^��c�~L�"��z��6��}X��vY���U�Y�,&��D�������ea��9D�)���6��WO����ks�]UC|W�Z�$�����xOX�lA���x��B����3�l�ZR�/O�TX�T,��V�
�vY1�b�����|}����HQ��czgg����]l�����P��,��1�v���������(��l/U.��_���3�;��N���`��->�,���^{�U����m9���jo����^,_,6���l��u/]����b�R���U�/�.�.$�.k�_LxY4�?�XV�l����^�6�T��v:�5F�Iq3CV������*��_�������2�bsA�nz�|����.�R
ge�b���1�����q���E�
g�h~��2�e��.'�YFKl�-�
����j������vV"�����y��nv�{1�
�+R7C���+����T�vSd��%�E�i��l+�k�.~`�����1����r~����0��X��t>��4�c/:�D��w�G�b5z�;\c4)
�����V�3m����6V(�����Oh�9�-��]�h_�=Ot�L	Z_���NN�la����3P�����hX8%��](0�����kt����o��r�M�1Lh-z�K���B��e��c���_����;���b�O����Y����
�	f����3K��3�#�?��yo.�/fx��zO�9$`�,�P
,�����e����j�b��8I��{7��������O�P�{Y-M�����
<
�`d��T��_��I��Cp9;���Jz8�a���g��;
�x��D�
�`�mh��j�������M���<��$��������C���|��i8��p�4�KR�rf���m����X�N����fMsp��J�;����TtxB_0):�{����n���7.{�����;:����"���3lc��b�
�t��N�hXJl�s�����S����g����
����cZp$�p2t��s(�:D�K�X�&�0����lV	t����:r�u�S�>���K��<]�C'&�1
����J�eY��ZAo����Y���V��I��+�G^��!:�v���|H���dfB�����\�Z7�'�G�X���D7�%'v��|����Z.���K��mUt���P�&��s����������\����8��>�",&	JU�>0;l.9=!�^t��*t_�_��Y�C����)��#�#������x?1���^��]��^L�k�>���q��8�@�|��S��/��;J����	Zle���\��m8I�a ,�����<����������06
���t7����a5�c��0��
W����'�~`6P�a��y��Z<|��X�=E��s{Im��o�|k�?]���k����w\��76�{����` ������z-l����k��~�u�B!��<����L��g�HV����_w\r�����E�;���U?g[���iY��|�����i8�?�p�H��^��x^�ek����C�����.TW
���W��?05�(_�g������a<��# �=-{0��{�������>��#/he�y~���e�'���t��<�t�+�8���E�J������MK8����f��/f=a��(�Sxl�`�,�/����Ks���$������x��y�������}����m�y��[����:�U������{�����g�P��V2�����qY�{��i�
6L�|�����'`���i��9��9yS^���c�)	}z�c�
#�YI��|��w���K#��e��+�y6_�V2hZ���+�.G@p�?h��K��]3�7����,O.v�Vk�9�8����D�������,a����eKj������m~����sN�u���a��X(��
��f�ncQ���db6�4[|�<&v�'������9���B���B�feqc�b��`.�lm,��?i�"^HW5��a�/z���,�~�����l��NO��B1�h�	{~����V�����u��~g���G_�M�4���7Tl��3��������
~���,�&�����:n�@Jt�w~g7������V,\��i��~�F�������}������}����f���4��.��
���v�}����������i��O7�'V)vd�����
E�?��+�5[��7��s���@b�8�q��6�*Su��9~��I�@����	�������v�*�o�
�i�Y�[�Y[��D�B��Yu�X���3��u�V=���k.$��-����E��|�����-l�5�,��������z�o+��pE������`�b���t�&�eV4���`�3X��Z�Hl�{;=]�0�o����|#�Gt�T���]U0xn*?*�=v7���d�ba;��Q�o6���������9�9]��	�����O�`��"�)���tV�!:G����	J�V��qS����0����b;���U�?����O�F��7�zeXF/z�E�U�t>h���c��%$��+�`�����:����A/����
.�4.�5.���
go4k��j��ux���{}go����������p�i�EW���I����&#tA^�lWn0�����P��>�}
�\7[�������\���Bs_5\�i�J>�15���(:���	V��fM�b'�Hv�y��9�����'f�
��bge��6ix$�i����6��ay��Bpj�uc��?�}@��F�0�?���*V�Z��`��xj��f�5l�]��[	��_����������	`��sP�q8��~�ba�������&5Ul��C'��
g�@a�I��p�r����Fo�.�42\�eb�J�fu>��p��������[Ng�#l�u��fm��6��$�����yJ`��f���>��%�E�
VeI&�t�b/X��q�oe�}N��!\eZb��|2��J�0���A� E�����l��6�����Z#�nz�~��]pKL������~���G�k8��-|�l���m��L��l���.��F�H`
w%��1B����9�u�+�J���>�h���J���,��i����=�%��#1
����YC�q��V������������1������J�#���hm|l��� �cXB/�s��Ngx&�h�<����)��,������J���������tR�#]�����R��Z��7}��:�)N��`��nE?�� �
���np���������b)t���k��
����}�
�A���vX�*�����:��q8Bs��}���JU�BaJ�3�����
���^L(��2+����,�pa���C�d
O�M��O��0��� �n�Q7���o��p�B7�=4-l
���g��G��T�[��l�np�E&���;
��
�F
����oVJC�����j��&���
9��,�������?1;�i�X!+4J��'{��B�����p�'`��h�@���#�N�����E��I�P;"�5\a<?t���&���ixA�v�GG��_��!�4���]Y����`�-5,����>�R���
���E
K��VJ�����/|.z���Dl�+�����8���
�9�����(|��fnp�#�2�YV��4V����`s�w��D�����G��F��a$��&ba>Xr���rfZV������\g��b�����'�h�B�^��n9sg�,�/��X��X������k��8��Bw��
����n���d�[��t���n���$�oB{����*�v�;�EOV�f6e�N�:|��ki�mb�-�u����W4\Xt+�9���J��g�,��3���qe�X����(��[X�v���sVt�4����T��=*�4w�=X%���2?]��������0�e�~�-,fO5X�).vV��;�����������	�����}�0l
o�x�W���qE�BO�7��..��r�nm0<{Wt������X�(���WZ���	q����C��"xff�`�+}�O�y�d�^���\���eE������N��33���fE�b\�]:i��O2�����E�#	�Ffo���L�v���:�W���n�/�h��[�������R4]X���bY����-��,���G���H�?�b��������-�0����6q��/Q�m���m����D�s�����,��)sK�9][�;������\���Vw����FJ���s��w��QPlg;`b��
�P&��;��(g�y���wC�����.�e
6�(vz����KS�H�i8�^�/\4�)K��QlINP�-w�.���XZ�DCO���I[�o�;��@����Bg�������r���N��=%v�i,���T���������6�n�oa4�"�TtE;�����"h��`�~"�)4&u�t;+�
H��p�t����S^L�04���@�_��JU����I~����>���}8�`_�F��>�(vWRzVw����J�t;����pM,]�
E|�B�u��	n����0�l�Z�n�������b/��U���`;��
��eg/�p
@?���->�K����������J�~`Vn��+x���)I=����]�n��6K�P��qY�(E3'�w��l�2A�h��� ���Y=i�+�hK�����p�����(�*:��lK�����.���F;��K�(�3Q���
w����k����&�Br�b���MWR�4w��];�&�A"�N���]:�e�e��r�;����m�g�l���L�~Mc���e�\�6����krz��O�Z4]:L.���L!$v�R��#�U��0\vg�������p�Q�����e��=�k���R
��R���V�	C���;�����N�9z������4��	fY
����,h�Oh�d7��ex�hx���V��7��}��~���xz�Y����}`�����l�[������]��7����N�8]������]��,L��
W~�o���QwX�$5l&��f:��{���W�<�;����F����:�a��y�4���MS�ba�����<����\s��R���g�>p�Q7L]�m���t��8)h���`�,����~�x����#h�u�}��BW
;,v�'��^p�E�d�k��J ���h�d�n�s�[/�a�����S$�3��=��'t����:X���J�a�vJ��s
�>���5��i�E�[1�~��I�����ye����O���&�>����`;�8v��{�M����4���Gv+��+�2i���2hX;S��t����K�p�~&�6��+�P��;�c	��OH�
K�����~giY^��Osz���a�����B��5��N'����4��E���/�>���!_�'���)�E��^�������z������Vg"g�M��h�t���D�����`���j�v3��^����������p��w�M_���:��/^���M��f��w�O��J���s�n5q��o���������a��kN����u�-��5x[�
�xuf/����N�g1�n�}g{��k,�����Kles�������w���v�w�=!�;�_vW�pK�i)B��������\��''������%���������t�pWn��NJ&������E����|X8������q����}��E��[�z�4��.u�R��#n%J�<.[W����H�6
����!�Rv���i2��6��f)��6�o���!������Eo��Z	�+?����?��+��.�'fbw!?7,el==,e��@���i,��r���t��	�gU�q[9�~�R+�D_���aK�`�����W���6�B���]�$�VL�.z��Pl!�;�)�V4�4	���x�R����Wt>��;��2�Y��;K���:�Djo~ET7^�RO������D6���X��o��G��q�S+��	�0�J}��qJl�Y9=]G"L�.z�������E����fG��RN��,�,}'�(�f������#rW�A�#����~bO�y�����V�+:k��0F��������'�K�ae��Q�LK�33����b��)�����^�y�{:
�0�I�E�B����{0��h��*�}9���)�+o���������G|g�!�0.��;�.��9a�q�04��[�����m:�aJ�\iJ3�:��^)mp�MG"��Ts!�a���-|�m7p��d��L�k\��%3z�!1�7��?����5��i�E��t�h&��n0M*G9���DD?�Q\���S����n�Ff}Cb�"5Xx���P?�d�M?$r���7���p����������E[I9����?u�=h<i �5����1k
�Db���p�-X�+��U���=��q����m�
���V������~*������W�����m/�t���X��
����������t�����Pt+�D2�
L�3���OFA�k�Z����{�	H�n	kd�?�2 ��v������=`'�#�v���g�tu��>��m�N��;����m������Y��
��0��E���`��������[�tkI�p��6s^�^)�?="2��-���5wm��g�n���D��,�����Ll�9N�#dO;w�Ku�����.�gm�0�:u�J!8��,��i��`z%�O%;jM����T�p�[��[�<�K����N���z�b�e��}o������� ���J�
M���X����"�	E�}�:���w�$���H�s/=3\�KW���J������v.},=��r��,v�f���z�d�d��p���ux0���,�.����W�~��VbsK�i�h�8v��i	�+�{6�}
�������C�J���rzBc�dY��E��N8{��������g:��
�����g�~gS���0X�3g��7�~��#�Q�t@E!���x�6���T�kM��|���K���n?�P"J0=.�h>o����u��`���;����N���R�a��`�a����;���"c1��U0�����z�Ln���<�s����W����h[�5�h;��J��k�G���$���4�xT�Z�lZ��T4E��oG$���X��]�G��Bc���Q���pa������t<����K��a�]����X:l^��q+�M�eS��^�6�\a�6��e���-<����t�m^��;���_�V����Wv����}!�v���E�d�o���	�	*�E���d��&;Z��J%�{+eg�����D�������o��@��uJr�V�[����������vUb�hlf��������P'XG[X�YG;`A���^j�0Il�$�n�*s���Y�lavx�tx�[Q�
N��[���: �-1���������H�+u��>��N�8��3rfY(-��;����M��M@�+��v�>�� ���N�p(:�K��Y����K���Z����i]�S�I���N�6
O���&FYH*v�,��<���]~��6#��J
���Z���r��S���OJ�����/5:�9�
���"��Vm�a���Ig���%��/�E�������b�R�,k��Og>="�O,�*z������iy/����
����`�lSJ,�)��g�|ggA3;-
�(}N���'I V��qYvX,���m����I�,���1g�h��
eb��ab{�u9=!G^�W�4���9f�EbY����%e�V�r�5��q^����G��X���|(��9���{��P�7�*�0���I���q�������n�\Il�j`Z<�2X��?���}���)�5�_���W�A+���&�V�#����8�[���9�0��g@����u����d�G���5��w��w�&��k���6�1��i�u
�N
4�K�&��
��i�2M��f�F����������k�����Xf�����vD���:j�F���i��d:i�.�<2�MI�J�i)��{�Bc4� v�R�|0q.~�W�D��+�������
S�����\wL��'J���������R�0�����;
����oQ�R8p~��;�ttc]<b�Qb����8<a�#�0�]�3��Y-��_Z��+o�'Xz�����
���`;�}~�$�����u�fh�6����J�y�T�|[4}��6�8�Sf�t��(|�a�cnS���'6��O��hfu���yd��)��=nAc4���pv�4_��;Y����w�^���@$���
lW]�F-��014M���@w��}��;aq��0~
��at�pYlOY��#rW�A����B��Xx���pdJ�$�m;�a|.h�;�:v�ME��5����)�q����v��+����liqk���������u���A����O����IiECu����xN���~2�����p��a$8�c���Ed��}	�5���m������*�u�e���f�\�+�!���d-���"�p}�fkf�,�����������kG�c�����?���Gle/����4���K,Ma���O,}�W�|�i-4��~��{��S;�n0��K�4.}D���;��:=]���s�-����Xz$�5�~�d]��l�����6jx�������6�����l��L��o��C4�E�� ��s�t�3a�u��������.�A�
������?�f�L(-z������6��I�W�t�v+]��QO�����=.���K]��nO��Y��*�)[�'l�\����,���}`�f��"�����hAj�Zh*`�I9��p��a�c��G��$`���E4-�a�B�l���������H��TF�����_���!�-�?����Pjc�H�����&��a�Rk�0�6�p�!����@'l�z}��r�?�1l�	��������T��M1�H7hn	��(ba��o��Ih�4~gE�A.j�"�~���l�=��y�ESL�v'�-���gO���a�v�t7V�l��o'	.��=�={��Sgg�pJ�m��4[��O���7T4� �n~g�{�����E�S�
)Q�w��
���~�K<<"��'�?��,�<��Z�o�64N���1���6�/L+�XO��	�J)��p�������`;�A��
K�,��<"G|��'5�
k����n�	�$AwX\�u8�Z�]iL�:+n?����;�O��8&$Y��������IFNiX3�U4^x���`sV���bk�'��3�=_v��|�NR��pw�=����4����f[��0��m6�&�a��,(�������7���v?]N���f���(9]�31t4���}f��v��-T�`�1�\����R���~���ba����+u�����5f*�{TWU�/��R�4'����4��p�c�:�����{3I����`s���R=E�D�iV�"v6�n�po&�=�iQl���e5�bs���y�b�����ha�~��{�-���;�Y��������J�j.��f�I��\�m���L��a�O,<����r��%��
�_��u���Y�P,}���UX�X�{�O������o�m)��*�E��
�������39��]8#������hS�+�T�l�V�b�@b�
��|�|�Rt��	�%��n���m,.D�V���#�a��bY�Ohc;�f_@K�o�,$�����=]�#M�1,���l4)�]e���9h����/�A*� D�+��
u�����R�q��3Y������m��jM��c��4�;�c^�O%]i'm^�}N��]���b�����f����fK:����>��5)��pq�����B[X�-�nu;��������e�7+�]��[I{�]2�0m,<�����\	]l��a�1h�W	6k����v���0Q�QIAZ�E��7L��
����`x���S��n���R����,4���Pu[V|3����Z�N�9a
g��{�`�1�=*,���u���Bx��V�x�T"�<H4LJ�[�j������
�&��	��$�E��4N��K����]
[`a�(�]P�����0�tK����<C�8@6��������$��g������b?�-U����'9&�����F�lc�
%����bG�'b�����E�����������8��m�b/X�l�!O���U����w���S�z�>�vOO�S3����W�v�f�G7���kb���.��+�C��mN����`sv����Ik���t�0W���`L�{�>���V�l���w�Q�iT&�'�W��3�O��1���^��m��|���J?X((7�����������-A/��a��d�0[�[5,�-L���LH+f��v�s��P�eb��n8=!���D?�� ���b��0;vW�������=h:�����X*{3��h��-�JR���:�dvW��C)��q�vdweM�b;������d�m���UVt�sYea��������c9="�^��2�
wL��5\R����`�q���J��5�7L&���N4*lbX�K?_A?9�m�,t����zd�.f^;*u���Lt&����f��KA��7\�����:=^GP���c�oo��|D1.\!���Vu�G�����D�3u���%�||��6�1��hxf����mO�����Aw��E�/-�O�����wD?�Y�`���L��+9�o��4���]���:'��w�;su��oeX�
2���axX���6�O�9~�3���I�r��\1}U��mK�a�u�����RaZ-hh��`�����g_j}}.�@a�����]U�i�6=G������G,�>�V;`�I�TXe��U��0���Y�����W��t&��D8'�Gr���uL��������U�v}��a��y�9=]�1�7��48'��������JW���;��3�����`��@��U������l��+I^+��E�7L��=Y��z��\��J������|k���"�0�.�*\{��;��(��X�
�	��]XI^�|�q��k���YUxUH�X{�R���|�����.�q���^�&���5�u�U��Ie?�\=�
��t�p�������g��n����n�.��]V��b~���4��^"���%v�-X��.f���s�V[x��iZ��.b�>�t���	/5�B�b����C4��;���W���8�V�����a���o���|cY��XW��lL���������~M�7%���.?^x���I ��"�E�*~�n�S�X�7.|{#�)��-��s����t"%|�T�
�4�M�w�Mk��'D�t�i8���!�jC������E�l��R�c�o��8\�D���5�.��D���R�[S��R=�����\��,�M?��n��������������/���������D��,�t-h�5"�o�vV�!6�]�G�Y ���"�
kbY��Xx*����Y�l���o��j�o��Fe�a��=����j�+/��p1l^H�n���u��h=
���U���c]����'�q��k��F������oS��BN��Xh�
Os�-)��^��Y��&V��"�6jV����E�<�����q�X����1���z���������]�_l>��t���,%�l#_���T��n�F����D�*��p(XE��Q^j�+����R�O����y"���q�K�q�6�|����"��_�`s�[����`;+�5��lN���\�\0�,�|i�'�n��8
�`���2������$�����B���Uw1���J���ev1����
��A���)�;k���zX,&a�Y:����l��]p��Jo�i8GLt#z��k������:���0tF#�M��W�I��qEo�U#6^x�TO���C4l=�
+}���A�V����.��M��r��o������-��.;���
>��9��#{
����&	���,8��-��������4������f���`�,-.��p�����������]���	k)d=���`G����chM��N����6��e\�R���7��}�������.�-sX�L2�^�|U,\2���Y�*�c�<C��iXEl����06	6u;����E�b`�4�����d�fM]b�xMlE��l���m��������L��7�@�}�[�p�����z����B.��>��-�^��W�ly^�l)��&���ne�>\i��Ax���-y{Uo������f��6���
+u��_,�j	6���n�qS��~���V<Q(��w������l�1�*�E�����S�o�����VT��O��p����;�o�X�,�]���~=A�;{��f�r`�����C[87q� LWR2�X�6����1��:������`V�~E��t��q�Gz���W�����4,�7�i{�*�`���q��lr[:	���Qh/+��_wk|�����m���5xu]�
n�������������[N�9���aY����6�
,��c�b"�Rd`3����������`�t�IjxzD&�4��p_Z[�t���R+k���i��,�6�T������-(��M�V*��[I����`�4~�Ms��R=���5hX�(����"�`�q���]8bYZ�`�:hxB��]i��xx��G����M�Y�D��wmg14����X�W�-^L,z��3����"�9*?LOp\N[�hl�4������;}���B�`i'���Roio>���pA���s4+E$��/^����_��������rz���`^-��$������ �����Ge~���f'����V�<,�]�v"�\������-�YM���i���:$`nY�Vk��	}�������jA�$��R����
,��
���j�l>Z��p:'���v�`'�6#C�4:L���},�}�LWt~O�]=U���Vlg;b�~��6�o��Ha����+#�)d��ea��i��ei1�Km�e�x���q�c/������6�Gf"1���b+<<v�>���4}"�������)���?>����L_�?����E_��j��k�����)^Eg��a8�V���M0�U�[N�l�#���t��!Yk��\�u�S$s�>v��'{��bG,���l���\�P<��>��Ctc2���,����lC���!���k��7fN�y�e������od�E�+3�@��������N���p��a`���D��<�����Y8V��}���9�}X������Z��\p^>��cVE����R ���v,
�Q}d7c_������]3��B��c�+�D�f�lb�_&X����V���+;�X��X�o�4��t��A?�M!6k�p&v����9hc�q��iQfazL6\�F��@2��x,�}X��h��b���x�����C4<�J,l;{�(�t��4�XI4+V:Y���P���,�0�����������:Z�yYiS��4�c/�G:������9��aGe_�R��IiE_l�S,����%�X���1�
�+:?hZ���S,�}�'Ktg�"b[�4�Xh�0����^j�0O���8b;L������8�uY����b��T������szD�����7u�i8�1��N��_���*tU>�B!��
����i��I��y��� v��]s�����Ks9C�|��e�l��5��DE���b�N��l������Xd�t��h'X��hhQ�Sb�t�'`.O4��GH@�*���l�6�^�t����pn����7N�a��b��+�-�>V�B����f������0���7����m���_��4�>V�>L�k���{���Ri^a�M�
���jmu�086;?N��1k�=`�C^�JDk7-l�}� (�S����6��/O����z,k��M����;� 
[8���3����A_��P�U�p$�}�L�$v�����%z�����/�(��#�OO�1����UA��+�%�.��}�6���m������&���b��Fl��
��#��\��?v�>��1h���oo��g����=��������������4��'��
s��n�M,��E�U�2��6v��p�%���8]��6�C�����l�����������N0��h�7/��9�j���kQsa��������q8u+a��������J��q[%|���:�	N�����Kb�B.�Q�����[�
'��&������:�)q��^Xy.6R�����a]o����uA�/m��GeHp��;�o~�����x�1	��[�$�����v����I[=��8=^���>,:W�~g��b{����aZ�����?��(����\�0s�������~;��t���b#hZm��M�k�mNT���� ��x��CH�
'�<�?p���i�`����� �?��8hhL������iS��D�����[�n�^i�zzD��6��blx������j�26�!���/�
t��!r&3��Xh�;+���-S)Q��>?�#�`g������D>
%v�|,M~�����o���i��U�
8�h��x�a�DV��ESaS��Mv����z���FfI�
n����~����\bl���L,�����^p��������u��|[�/��kd�������I���f$�j�����wY,<�Gl.�=="G|�R#��?����_�����s������?��d�NJ�Ku�7���wo�`��~��+�^�pl)�����W����,U��������w���fD�%��V'�y=��[�:gn����v���!��D�_�P�l*�8}����==���}~D_�A,\����o��7�a���=�K�����t�����?��7O�*�b���M��V��|p��R�/����T�o��7�
�N��i���P@ z�l���-��6�U_o-��G����@4|@�	�j���
-�����VZo�0�S��a8+�7+�
m�bgMl��7�\
�)b'k��,�O�[9j���u�k�REl�q���U�[q��	9`���.C�����B���e���0u�9��OE	�"��~�T�0��L4�H����[��l���t��b��;�����:����<.f��l���V���.&]��Lk���D��t�D^�>���y�A������p�lA	��g��P��,-vT�w��7�����.�����,(�r����9*6�-�lm��7����O�9���6x�%
7�MU��k�0�l:����������������v+����vX{�0n�	��zv���:n�/�'�����2��,6[�
la�y[��Y��Vh���poV�-�I���T_3���RPrx@6xof�
��0_w��Y]��^	,l�0��/|���|���R�G�
nK�X���Ku�J�EC��XV�'�� \�2U�o����m��.z1��X�T�9�H��a"<����j��f�o�p���.6�e+�������'V/�*����`7��5�?L|�����~���
SI�y;X�t����?h�y�p���v��m�9��s\t>)�;�*[����hm(a>���C�(��{�T�d��V�ma���^���.N����'6�XNO��|����-�0��f
�UX��G���<!?���]��h?�[�MG^L��-g1I�����6|3�����|�1�M0
s
�f�w6��N��xn�J���0b�.��J����d*$`�y��P�����������b����]�<�G{3����:<O�y�c.l���H��S��JZ�����gi8O�p�t�)5�0�$7������l%Aj��fo�
&��]L##v�jx]3��Lab�7������7P��7p�-�N��@��2i��W���=��I$����l���^�w�T�d��f�h�\���h8ZX^��X����/h���������T�1�i�8���f�7]��N��i8}�U!��j;.���HY��;2>7�7ZnX�y��l�wvN����\^�������0�����f�t��-8��7����[t���=��P��~,uhF��;���d[v�az?hx���UI������@�g�r ���~|�m�oB������xm�0�9����9<��|.b�J,b������i=b���S��z��2h�o++5�O�UWz�l��{�2<��=�
Wak��i}�p;^�[Y��J��.����ct�����������N��J]�M#�_fi8;a9������qa�p���tz��F�oS}a�=o�@f�t���m��7\n�= ���M��v�Sl>t�������?���:l��-�5,^z.|�Y�-�	>:���M�J�6$J�
�H���I�`alh�oD� +Q�-��)�D���M�|����N��`��6i�/�L���+�6�g>
E�po�+	��=.�L���-�(�=���I������/��
+��c\&
��g���@X�"�x��8He�q����8N�./e���tCO����%}�}�g�w��0���N���]�V��������M���{��c���LAC����x�T�?�N'h�1m�ba��P��F��[��z��e��`��T����� ���?="G]��,hXS�U�]XU��
%��i����)��lO���6��L����cF#?�t�02��$�i��c'��
�����v.��J�0���^�~�����G���L�����<�l����Q#��B��?�����y�C3�~/|���7_)����'*����;�;B��?I�����������?�����4;G�,*�4�C�v�R�����������4�f�.T�c��>�����]�+
�{��X�;��I��p������f ��NTLd��o���<��G/5v������v"��4�P���~����]��P��4s^�������I�8�A�v����YVFiv����{��?��Z`������s��D=�'��5��A���gv�M�@���tG�q�U�}`�y����@�aMO�����i��h�w�(��%b���lf?="GP0�����eG���Pq�����������G���
�#z�~,���B��#r��� ����lC|g�/�������{6{���!����u�m(��w��O}s�'�����;������YZ�8�p��vM���*�5�P����|�<	���d��������@�?���|�1��IY�*?O�9nC���;��H���fYO���=="�m��t�l�����c;����a��|��w��2�8�/O��u�5�.�;��i��+�ynFBl���b����s$L�I�
�2���GK��'���\��rL�J��=W�z>�p�$�4j1;����	wO��9�[�<��K�O7B�T	}z�	�p��|W`���T�lB����8"@���LqH�
��ba��;Fu����Ri�^p�'�6G�J����\�,��~����y������w��o8���A�y+�;;����]c��aJy�����$�NA��6�
�
�H>!�����$�p"4[x@���x�~��}~a�G,�WF���0����G�f��s�
w��?���I���-��cE�}�xO#?=���
��LOX�,-V���-����~�%_��`S���R�o����mF��e���������t����#
6O(�Ku�Z�h�kv��?�x�W��w67����'����9�`\�i\��V���A���,�0������b'}!�7� ����c9
�HV�M��~�������i���4�
��f��Da���`�d�aZ������2t��
�J]�t0�L��'H��?����t���Ln=���F�+E�]��e�}?�����%��]������_X���(=�iN��1���]�~��[��������`�8��������4��	d���a�/�5,B��%��p�6Q������`�,�����8BvE�0�(4M'�+u<;��f�K�l��UW���qL7�J
���N�'�����>������������`��
v��_��M�[�O�� ����A,�
��;�xr�b��/������xbG&m���|gX��~h_:�����C���c`���|�6�|���R�?��r
S�rL�e���
JBk>,�E\����P��L3e��EoSe�����P.�Ef���:'��p����`W��O����a���;�aK������l�2������u4����'����Yv���Tf�J��q�����I/�3,~��.��8x��{D�}��G��/�}gmh����/�j\��:��+i���`]�k:�;�����5���������t�0�f>_�
���<��������:Xa`�0|�7=s���T�mn��jz�=�`�����7�����a���~O����`���)���m�E!��[Gk�q�Q\�\)�����/h��/�t��f;����5�jq������:��R��.�������}�vO���
�����N�����WT�R�Z�`�.���2�:F�����8����C9
1�v�
����~�w�:o4.�U�Wz��cT�=�u�.���v#������������*����4���������S��T-�����e����BY�e����q�������'��n��%�k>=��'���P���Y��������������l�Y�58�k[���������G��@�����'t���W��E�P;/�6/��/f����3�X��X8����Ab�����>~��R�������rb���o8mU�����?��f}>g�����D�e�P��2�V�bg��==!G|L� ��?��,���f�d����r��X�
ovF�����b���Ku����[��m,?m��]3g��������e�D�%N��n�������q8%���0���������s������i�E���6�e/6��N��x�X/I�8�R�b�����������`K��'��=���0������3����9,�q�9|�_fy����G�k�v��(z�M�1l�Q4��w�|��h��
���.�������YV����d?�����Zt��{����t��b��Zt�?��������<<n� =="G1��}�o��m?DO7����# ��(�.k�b��b{e���o�dz�r��������m:|bo�LG".�sR��
����pX+���
��V���}���El�#p��~�!�tZ�%�5b�m�������[io�lv�X������6��>�d�
_�W����k�J(e�����:Fe����Tl>��;{j/��/�� ~]�t�E���B��e+��d�����\��F-��G����^����Jy�|
�4���kR�bm�fa���pV�e�������`�N���lgN�;�����y��z�_���e����x�*R�������I��U�����w6����~4n%<���J����E�Z�I��`"!����s�E_988
Kt�0�l>�����.7��XC(�����F��0�?=\G�L� z�?�"�����G�a�L��.#x�	M�pJ�����'��t��v��2�~Q������^4M�`VH�������S����/X8���aa�.��Kz�dOk�d��A�����*�|���6��D��}6|����d��}	��F���u�Go3v�a��(9{�(����JK����C�
��pN�9������9
�x�Z�+���_L�.zTj��I��kF�3�SG��?��g"�]3���5���g����t*�:
��.���.�;�w_0��U��^�`'L����7��/f;
�@;3���[x�~�c�P�-�����x3|g������,I��F����	 XN>�sSl��8= O�p>z�f�`�w(�n�J�^i$����q��p�#�{�M���t������#��X��I>�]������[U�������@c\��o|T��V�����~2�o��wv���=����}�����i�@��	v�/��.�B@��oidXh��(��|���������uP
+�EW6����`��h(���2�,�]p3�la�iu>������e�������UA+�lpqt�u�����O�}�� w~���p�AO�2Y���;K����
����1����K{������fL><"p����i3�(D��_�]+�	�{b�#����2��������}g/�����c�/��/�h4m�
v�JcY���(�Z���(��t��z����(XZ�&�R�h��s�8���E��p*�e�����a���a@,��}
G\>*�gtT��������_�C>�4�"[Nm��`/P���~8)�W
��f���������.�s,c?�x��TO��>'��8���^�@7Lgk�Jd_��OA���P�X��N����,]�������VZH�_��������1���,�8
��	6�����X"�	7A���?����oH�?�'���z���#�=�s�+�����	:hZ�l����v��w6��
l%�l�}���8\T���C��c��M����E?�b�f�<T��f/��m����<+�%���	5?!��=X��XxZ����=�f�m�����%v�.�%�Y�Bl/��7��ajDtg�5����f+;<�t�@�Y�3�4|yt ������
�����)�����R����t��/A���������2Ko?"P����UU�}X����y��N��^�6\��eT�N�a%c����,uo�OX�f	�0?��.d=���9��8\��������Ku����'�yd��;�E�c�`w��9=^GPL�.:�O�9b~t�y+�;���B��*6M+����	EC%���rHbs;��6z��f��}]x�X,,4�+����g�����4�b���!D�J�g�:���=bs
�;�

�^�@����Y����E4,����t�a`2&h�����p������bGA�,������o�e|g��_�����F�<�*xhX�X�X(C�a^G�����#r���KE��o�l�q7n��fU������Y��q8�b��|�l�X,4]�]�\�����*�%�i8|t�����O�o�Y���8��|g;�������d�{�#~.h��,v\��v�S2���IA,���M���]:�c���;\�kdV�+v��E�u	>�5+�k��Y:�3��]�O������6|��`���5G����)o0��k���$��lj�:��0G�p�����4^X��M�d]'����������6���M�`w���.����
��b;�������-��YE4fxd�'�=&Lu�p/7�'��O�����:l>��v4[���?l���:8
���Y
�h�T;�}�0)�����m^���X�)�E��%67��.��L���=
���iDL�.�F��W�p�>xM���U����#�G���)�E�]��K�`����8�������%��DBl�tu6��/l�`�F �������np��:�=U)�a���-�9���
��O�g������J{�T#L�,:o�g�{���Y��D��9��)#�pc=���Y)�_����H����u�7���t�d��M4���W������tg������Y:m�*�v����*�)��x���E/�����UA�m��?�IS��m���o�
���O��O!����1+�hx��Xx��XZm'�������Y�s=`
2Xxf����w+~��Ho0�"���;���r����\��T���
�%�`r6XZ��qa�;�^P
5��i����0���0��qa�5��Z�O��\������������f��[XFk��ljV�7����'���@6+����t�p
,<R�.����n���wzN�����E?�6>�Y8��h�`����-�Y:�T�.�����n�;�T�qj�f+u���8\T�T���i��N���o�zm�:���	8����O��o�t���arC~�����S-��e��Yxh��l�(����U�
n�I����Y.�WC��J��U��6���=����R��'�,9]�'X��4�
�p�&�y���C��[�	lZ��?A����$�,��Ol����'��/�t+���.�}���qzD��`�����
�9�e8�+Uv7X�kpe8���+z�y=X:Yj\X��(��n�'`z=���<g�n�?��a�]�l�
6�����!�,���{%P����o]3L6;
G35�|�*��o51�z��f����:ov�JP]5l1	�U�>�*'�|l���g)$�,�m��4]�Kk%����N��d���:�r����Fwm%�m�p�!�8\����]�
��DC��\�p�v�v����S���|��l���"�n�����u�|;�
�ib�?���4��/f���b��;
��n0�����e�����������9��D����t�K�}��~_�vk�;�F���E�Y�q���K����N����?]��K���������v�����b��v�%9�������f���~�z��f%nb��n	0�a����������{������3���lw?
�P��eL�
�,�.4G"��t4�;9q�o9X��Z8��[��EC]�G.Dw6�v���+�N�ybf�.�����p�\Y�Q�b�|��e��E��������L�p��E��������V���K��'9VT&z� +��;\�e�~�%M��T��v������9���sN��3���~X�G,Tq{\V'v�P�[Y�Y1�����)�b7	������Wx�a�9�}���}����m:�����A�;��2O��X��OE_�S,��y��Hp�M�@p��
!�m��w�3���&��J���,����.:
�H�u��������O��(�YHM�DZ���K�I���l���]����.m{��V6��M�n�ig�O�8�?��h�v��Xy��^oo?��s@�`�������]��p�M�&��S�m�������7��w�zi�r��	��.JXo���
�������9="�0/4<�Jl�B8]��	�
��;��*�N'�H���=2���m��5~�����p�^Y���U���pj�Y~	��G;��r���
�������8�t�;��������	�(:����p�,����n�h6�}.�T�r������	��,+p:��G�Y�szB�c��K�x���`5�b�9=��^�X�0�����I�Z�t�O;�����Ryc�h�YUY9a����"�]����������\�SI���_�������H%����3����"x��3L����>V�6o�}gi1���o�;�����������
�m�%���Me���8��4����s��Z`�^������>P,t-����KH;��
�M��MXo�Y����B���Y8C��`�����Z�m����/X!�'��
�{;R���	9�a"Q�p��V�E��e)g�~.*(*��\�#}�����5�m�3�x|.�6��I,<������X��.��
qH�u���2����,<�H�b��b�J��M��d�L�����Q�4t�<�:ZBN�C���m����������3!�h���uM�W*�9������o~g��7�����q�)�yx�v�v�M�,�2)���=��c6�DzT��-��!2hx��X(47��u��s������H@
�����^nf�?	������5h�
���h�734nbO��Q*��$k�����;����%a}���P��v����&��F�K��q���2�i;,������&��6�vX(�meW���3�2���T��Jq�m��h{�p"���pzm���35�h��;�F�����
��n�l>E��p�7!�r`����#�^;.���������[� ��
���,�*�8K�ZI�[���6U4,�
gi��2����J�5����������7X���;�lb+?o�10e!��o3�5�xi�~���=�7=��R>��:�^��Kq������#���X����+�#����QW�����J���~��Z��T,A��!8��C �Dj[�^��[V\�
[�-�����4]�!�����;�T��-z��j`�`�	v���`���E��
�6tm�g�G,,[����m:(�5�['��66�
�������z��<���M�
Y���{�n���&Eo����=�0,v���#����p��^D���+��������D��
=2��ON0��o�G������)r���5>�}
���b�����7�����A�������M?"������w�:a������O�'��^,��{Z���a	�`����g3�1,�i����^lO�l
�N�����o�L��E/?+L3��bgAY9�L� :D����}�������/��c�%���y�M����uIr����NV*/v%{��602u����	�1c
$����w\����2���)so��S�=n�ibX�7E�`3Xx���eX�<��6h����p�67��n��&\TI�Z�����|���6��>�	d�VZ��U��HU���^���a�OJ��n�AF�^LJ���(r�������5�Bg�P�(v���4W�����-��=z�\]�������2�aI4<S�L��p�c������{������94,>�g�~��&����o\��������1��MS���xB��?�	(=��2�����Ao��(���+��4e��tC����*v�:L��C(v'���9b�7�9������a��`~i��mW�e��B�U�;�[GOO����t� �m�	V0k�u�7F+������^z����*D,M���/�\IDZ�=�[44��A�t����a%��{4fg%��N{��j��m�4��6��������:6EW���y0�������<�J�4}A5��?�N��Oh��������+���fA��������R=W�i5�
�/�<�?H�������� ��F*��
�v;
_[����`yL�V)[{g=U�`Y�b��f,a4�|�K��L�!fr����aq�`���LH\��V�z;�k�5
7��K��f���6M�}����������������J�Eo���:������cO��@�i�E/�=m�p����y0M��|��w�{���"�|���9��euA�sX��60��u��-h��������0B����hy����M�	�5�����Xlj�;="�?L%��pQc�_r�
����.�p��!�F�E�7��n����f>�
��5,�&��������&�����8l�pB�Uq�;�}
�Y�������C����`�8�W
��f����[A/X/f#5|�?$��mpKF�Vp[�,6�_����B���:z�;@A�(:P:��
]���
�����G��\�~�TG"0h
:wl��sD��~
��ak�������?D���5��Vuk���m�<<`���`���$�nAh�J����\G�q���)�!���&�d�[���:��S*
����AO��������z�
.�d.�4����#-�N��f ��c%�M���p��aq�����p�_a�F4�	��?�&a������S8�xX�;��*�5�^���p����>����+�E���'������b/��&������jEC��lg:]��1
:w���s W��
T���-������>I��67�}g�y�����R
���:�����+��F�@�aw�`�-������jXT�U�XL�&,�eS��O�a9�1�������O�V��a�������a?,�������:=��m:�b�Y��|����u���M��0hj�	�*��$���0
t�m��V2G��q���+���{����a�JO+�$���(�S���H�����O��0�0���d������(���== 1pwO�a�6����q�>n���<k�i}���)9
������[���M4n�H���me���`/�nv��,]s!o0m�,u)�a/�Gf���|�A����X����%�D������V"�i{�dL���-v�"���m���Oc������Y������t�J�gV4���]��Jlc���q+���#��M��O���/�&�������?�����3�N!�/�N?�(\��-����N	��p����2"�g0�j�����]ZK��Q�Fz���Y_y�Tp���~�52km���j��R���k�Tn����l�~���V�YG�,+�)4AL^�[�t��O�yz���m��o����u����Y����D<5��h�'w{}�����u2K�iV>$v�^l�N�6�N����>p�~=�C���Rb+'�M�e'3D�~���[�]�����6��V���J�-$��=��'�n���T�)�)���}������gb��`4���+�`�/��V�~�	�AoV�)��|�l]�d��Jr�>\xl���2.������hH����4��&j�R��4�����|f�52����)�>��gg&==��,|w6��3_hZGuNkZ�R���z��:LU��E��l�_��,��f�S	�U~*��N�@�|����j���\G���)-��S�r����f�w��}���)Qk����c/��6�V�Bn��dv��l���w4+e����Uh>L��py������&>��o�^���
w2q����i�Vd��1Q�t�E�}��K���c�[,�/�O��U�}�.�N�9�fU���V�������������]=b7�����{,|�C'a�_V%��I��5b�vu�����e�^=���z�	.AwV���g����.\�n0J��0#�`;����o���::�������p�pa�vH4/�5SW�p����y�6a�4�,�cj��O��"�;
���55��S�N�d��p-2���n7�*���
�K�R�����R,<I��-L�KO�<��&����~*�c�����g�G��7=+/����}�F����Rj�����t��s�����	�DW����	k��0���������M7���������5�4/3o�X�g��l�W	��r�S�SnD�p�V>�E�\4�q=8�
.�t�0+(�s�z��fh}�v4&-O&Z������	k/on�~�2-�]�[�T~ �4����w���i���{�2��c��`���������[.�����=������d�x������3�}���;�23%���|�'�8��E�<�l��W��������	i�^�59��~�"[�V�m���-'6��}gs���6P�U{�
�-������#�m��Gd+��� [��[l�
7RKW�������6������/��:���t�����'�*6�g{�B�Jk��"-5|�bK	ne{���$/�V�	��K9 x��w^��
9K�J����V�&5��v�
v��cbk?3�����o0�$������`��,���vE���M�o��2[y����H���`/�H�k�{����T:=^G�tJ�\�$wZ�.�n(�}�
���w�Q�X!1h}������M�	��M+�.���5W:E��L9n�2Y>��)mx*c;
��	�������p'`�`�OE>`������;�?�B���yA�X[�OK�'\$HJ�&��p��a"I3�x$�.]��98W=��!����j���i��i5�X��	���k�O�S$,|
��NE��aV.��9��g9�Z	����`���t��!��Pjh��m54���UWB3��i���X�p����c|g{eC�F�����iU�l������C��p2�	A~g��?1�V�5���0���;������J�	7D��t�3��6�+ ��Y��#�O���Sa�~�4�,<��u��a��~�W�����F�(z�,�XX�'�bA�����O���#Bo�hX���Yq�Y��Q���m����������z\V�*�b]bs����v?^x��S�
��&����}�dh�����vp���E4�W��sN�z�R��+BMH��N��q���;f���Q8��7�f�p�Y�����h��m}����	�j$�����Z~�,/-�jn��o��o����_&B\���Y�����tx���lGTt�k~g�Yba��-�����0�	
u��d���m��-M���C	�m�;{�%wg�P���Ih^�|g{����bx�G�a�l.:=]�C\&���������\�S������U����(��(�f�t�,�/47����as��v��mv�E��Z������b��_l��l��Y���V��������~.��S@y��
�����&�gW���?�p=��(�7L�������.������,Y/z��j��8���ikD�"0��]W,l����[�U������l�Z�*�%������V�~g���,\t���'���^�
��{I8��������-�t#"������|���7�����lIl/�Un��s%�����I��Zl{�T�10�4t��]p*
��4���
�����:���K����c&
[���������tw��G�����7KD�^�����2��X(����*<^�1Li-�����Cs&}t�0��%U,<[G@p�%����=2�+4.�8���N+�"UY��}���0��j ��
v�eC=z�p���m�����;�Axd� 6i�eE�b+=��4���b��v��_]s%������'AC����Op�T����B4�*{�L���`��-����:�w�{�J"�iX�{���	9:���x�����Xt�����V����������<g;�c&���{{���u<�A�~:��5���@K�0G����F~�1Q�T�����A��_���#�Zg�M��i0.�6LG��]����}����iY���N_5|���c����1S�����F��e�A����h�vA�������-!��B�m�
+���
�b�=�UWj����������&�
���jXQ�kNI��#r,w����6��~,uL��)3	'��������u ��O�arg�[���pZ�2���J��m��
���$M�JU��K��������1:���u����
���9��8\�����`;Lg�jd+D2���]����(`a������A\
;��>pIl���`�g=�Q�1;~������?2(�/���6�[G��y XV��[c�w�����XN7��n���^?<^Em�������[�T<1���Rm���7l�yxg��y����n.I�
���N�����3C���d�8�f�p�pm(H��G�G�+�D�V��L9~[9�����/�p%��������6��W�j\O�9�cj$�)ou����G�8�L���)������]I���}��e��&a{��+S4�D��1{���1d��M/5�0�"�4�S�����#��s�[��&�hX�m6��F����hX��Y�}�=T�����F����0Z���M�^����
�
�_�`�����/�\Xq��}3�h�`�7�_4.L}�2��f���:j�u�A_�C�n����Z��������MO����vz�mO:�������c9�����Q{�\�e�7\k��xN�9l��h������n�9-mM'�����oX���a�cp������[v~�T������q�-���f��V�`!��u��E2���<�{T�i��t��_�u\�E/5v��w PZ��aaw�o���;���A����v�)�5�v~�.C��aE}��gTlJ�n�!�:z@�L�v�KY'�`����J���:�������6�������-���W�,�^�� �MbFE��.��\����|>
�<�&D�0Kha#i����Xtv&���\T����X�2��j��{����QHI,�����p*m�^ ��h^�
B4�`���Bw!#�,,^L�l���b'SV���r�eU�bB^�[����,g�q����t��7���B�es�b�`��������h��v�N����m�����e��b�:��^u��+��=X����rvb����C�����;A�B�����MD��JuYi���?��
�4"���]4��5,+�{�����zjf�����u������+s��������z"}�,G�k.�1=5�KU���%�LZ��.�@
��;�v����`W���l,�y�����^�a.��t�~X�Y,��[��J�l�Bl�o<=\G1��,zU��v�E�C����{��+��9���e}�b�^��/�gfV�k����^�}�e��bS��U�;���=���z��\~zD���_$�����YF������p�v�.�i(����,���������,{
�����.���D���>\]5|B�V�,�{����)�p�3L�
����p�t��]Y����t9b���,�:0[yw��m��U��mp
������m:a������4�c	f�
���0U�N��m:�9{�R�,{������6�M��5~�,Ye/����[ye�I�k����lf��*��&v���lV���#��f�8\{|g/���R�pa�>���2���u��t��a`v;��z���� �[�?,kRk
����"�����0d���hX6�.:���f���R�0_��\����p��q�� S��-q�3�����.�J��}1i�X�>KUCG:�Oft������%u�o����i��)k]5\��e����UH���O��8\���6Il%�i��b�B��"�#�7����}gG���Z��S��-�n���L���m:Zd�V���p���W:��h��-\�# X����
��d�-�ta�z|G��!����+����'22O����3o�~.b��{U���w.��&zN_�w.8������<W��)�|J�	#�`a���	��?��*�+$:[���P	&v��]s���4��N���;���N���^�4��|�-�~x����}`���h�r�	�rT4\��VZpS.�?���9,b������Ap$3�AWx���>����Pk)6�Xn���|�������,�\p�J4�`Y:��=�%���H��"��#r��4��l~���b+_f�,��}�R�`isi�=}�N��(~"��0X[������D?�#�V%����Y��`9�R�������;J��u��s{���]p�Cte�ow�b� �
f~52�������%����� B�tkgi{�[�I�e$���.���|�Z)����pQ�
������R������	�;;S%��RM0����}���(�	�[�q����(���I����G�*��"�_����TL�W��	n)K�	��$���*I4a9��My��#r����Y�u��B�h�%<sLt��W�w�����H;�$�U�N�����O��2�~���V}UDG�f� �H�ni��z�R����� ��J	��;�O��f*�=����{���,�Y�k�E�;���`��
��\
���;���Gs��a�`/���_{xO�i�&��`'s�b`��j����e�:��?a%�DCY�`/x�6wb��>��a���X�&���V)���w��������$�IW/��0�+���7(I������/=}p��N)%��D�l�>��-+.s=Y<P�f	"���X�
��F���-�J���P����J���e���r;�7�+���OC�|'S�3��o�#�9��:=T���7���l+���
�����7N���x�p��2�B����fND4�p��Xx����zYJ��n,W"v��a���\��V���H��p����br�,k����e)���EW��]��\��R��qIZ�eNf���j��U��.�L,�a.�^
���V
���4;���X��	�,�"�%�;��?g)���4E��o�V�\��\,��K�Y]oj��YVW t���4Kw����s���W�~3tc��bs3�w��^��,��0�U���C�,2.����*��%<<H�Fd����,��X�h��n����Z��ii��L:@�f�P�,*�JQ���b:��a\\,+�5?��:��4C���R���J��nxj�"n+�F���{b	�����= ��$z�sT��UM�mt'RCe���$KE���uG�cF~���M^�;]�p"�S�h�8�)��D����bwr�N�k����f�lFY�������V.VZ�J]L�U4��C�`i��p���H���H�������^���;\4��h�.�z�G�}�����dZ�������!�����������goxH��J�����N���|���J����i��n0pj]Y�_D�����	�[(�]����n�;k�KOe5L���zlr��k����E��N���A�K���������p	
vB\��5
3GII� ���]/�K+:W����}b���+�fwnxA�B����bmI�'�,�9
�l�t�Ms�o��iv�N�P�$O�;��i���1����R�K
�@i�Z�i�Ni�.���k��:������e����RE/���J��7�"���������kR��n���T����NSd�����?��W�Gm�2�������`]V�P�L��9�`��}zL{?p����R�OS�/|���&�����X�9�{2g������Jbse�i�v�`L6h<�Hk%�c���J��������4T�"��6�-d����{��_��a\x�X�E��a
���baZ4�,v�^�O��M�W�go��[8�Y�w1�T��&�e-�,J��\D�+�y}��p+5=��]�kGz��[���	�������9�\S�,��X���n��[pd7U������D��w�V�n���/�g��Y(I��0������YP�^��]LZV4-�����u��:%�i�� ��,i�(E��K�#������4��)�+=���-�^�@[��i)�W�G�`�
v��%�V�I�V���O�k�
���nt�d���DC���M)����]������{U����`�]4��~TD��\��I�&��M��iv��O%�T��t��et7�������Vj9�Y��f��	�B�^� �������W���E���������ZiC����[va�F:����r���/�c���@fa�EJ����1W:����`�����_#��9Y�t_j�,������t�h�3Xj��|+�4�v�U)+�R��	��K�S������^��JI�5|��4�<�����KW/|o/�R&`XO$!^'Y�����X�w�c��ta�@��8Lf��L�`+� ^0�4T�{���0Tg=�o�D'q��9o�LxX��:V�O�+�Im��%X;8�
4���d+�_�"H��
b����k/�f1|zQ�r���%Y����}�W�Tr�9�T�bR��������bae�0�%u���g�����.8$,^P�c+�	����kJ���5�J����8����fgp+/����k����1#s[zb���-�R����������l[��LOC�<T�m�f�����g�2�OlgU�bs\�4�����'�0�+������/�,�!�"I�-*�YX�4���m��mQ��d�DO���-�okJo�B�0�VlV8
��P���oa��,,:�",BG��{[���E�B;����f!��e��K�NC�*4�,�ne�,�(�)\�-e
UD�k�N��N���.��n�{{�,g'��d�i����Rr��bY�I,��AlJ��f��:����:�m�o���h��v[��:M��	��-:�[���'`�6��}����iw���}b�N�i��`���
�O���
����7�c
o��X$O�w�����f!d��<��v�	�fNb�_�������f�a���l7�O�����@���G���m�EH��z.�3������3���eM�W�"�1�y��*�����[	Z�����*bg*:
�N��#7'sv
��[�����,�}%I�*I�%�+�����*z���,C�@v�P�X��o���m��R��7��2K��5K��}J��(V
&:W�giX_Z�i;<�����7s��fE�b'��]&�!���A�����������|�i��5�$�hX�#����G
�q�hW�E�Yo��]��s[�z3Ij�9������@i��J�'��������u�P�Bl�
�\������~��".�Q�?�.0��Ev5a����p�������5�?
�6�n���]V��'Nk�i���1Qj�0Z����>R�;C!$�� �c��[xH{@� /z@��q��e�(S_1[��������qAj�9�u��'?�P���G�asH	N�jT��,��Wl*V9��}'X�4�2��0�������6���n�Vi�o�������Vv!{?�-��v%�j!����h.4$S��d��S���/s������4g�v�+
O��[hX������.h�.K���R�.(�o+C�n���"0��Bok*��(w��*KCo�� z��Y�;���'��L���04=���7��|�4�f���w�5�4�f���;��v�%H��U^��0F.mh��,v���_���	��J��e�S�tk���tV#�S����/B�@��g�e�iv0�Q�$��Y�L#Dt����yc����+eN�,��+A��%��������bge����fj������V������(&�-���T�iX�l��O���������]Y'k�[�q+�3b+#���D�P�%�7lg������x7S������9o5��!�u���k��l����������hZ�*�p���p�dtaC���m��L�M��U���r�������	��������p�|g��|��i���aZ�W��p���6��?b������6�"���)��r��)�GS"�h�m>�Ro������7�;;+�uei��h��"MZ�����k�	�?]��[vCa��z��w���u�p�^�t��xq�]{�04�:��)����-���o�"���e��6��;*���n&++:�g}�{\�
����*}n�����2h*~�Tq�w�]���}`�#�V	ZZ��#zBmY.(nK�nXs��b�'sv���<���..����Q��>oE��)��k����w���5m���&K����Gs�`���~k<���J���{s������"h���%"W� X5�
H�n'���1����;k���|4�{���l�;}�T�IvaA���m������/hx��Xz�
6����~x���mP�$�-�W\�6�n��K��*R[�up��o���c�o�]|AOX*�t��k��oKo&,��)�`��i���i��R	2��=��TH:�c�*bI��02���w]�(F�����?���`�4�����~��py��\D���T�fs�=����`��j��C%�����a's���+jz�`��|��w6�x����}���)���[��;��`���<��c�~L���^)|y2����M��i������1�qQ��,��-$�_�M��(y�~�����n�2
��B�w�f��8=�w:��o�i#��(ji�p����SL?)Fq2�]�_��H?��B=�f��K��-�����ir��RR�}��2�2��gh�k���������@iq�,��k�����o&�J��i����A��2��l�^����A�-�(�ft|�������������]��nnH�����yB2���
�f��Df*�3\2�[��av�}Ex��i���e3lCa@����1W��fn�AwT���������o��^�9U�����1J���/z��#uR��r�i��4��]���P��j���4�@3;�lG�I�jF�}��5?��N��0���@B���}zJ�{�(&�_�E�
�~�>��N�����D����M7�3�~�����G���n�;��E��f�������w�1p[��Z��t�_�.J���.�����%�+�U�2�=T�n��k���9��Bo�+�_s��*���b���b�ADfs����v'�����������o���)�N�h�hv��i������Y����2RV2���������O�������>���f�]�t'�]��rx[G:i�Y�������^H���,F���H{"��������`��m�������}�/B���Z�~��`���wA��P��@���x��.�zK��*����Qu���'$�k�A2�ft�5j��IL����`��>f���`�>H9�lO���1����m�9�2gJ���G;���v���b+��v���4�#�?���5�mH<�4j��5�$������S�B�J�g%:���Xn���L�/�9��~��c�����T�8[�������j_&w��_�w���KJ�tzg1}?���
O*�t)�0,J�7/���������2=�ko��	`]z�L�l����>�~i��FP�[I�L�@���t�r��?���M��C$������o{���{
�����ZgrzL�pG�����;�]����^�����[l��K����`�c0���O�k�	)-�f���}�9*��.�`�V�=�����
�m�~_�l�}����/�0�&�t�K2�?��'��:}�'kv�`�@��n'�+PH�TR����:K��=�b�@��{t�r��i
�U���b�?��'�2	V���`����`���i��y��2h�u��5����Rd�������-�V�����{1H`���8�N��X�4�Z|^��NC�#���M3�b�����l���#���3���@���K���	�Z4�B""KU�����Yv+���V�-;1����T�,;1��u��#��2,�������+�eOi-�f2��,��Kl�-|2��NN3dO	���`#�����Ml��N�iWJ��d��'vC_�����J��iz�>���t�a�5�W\�0�o}hn�U�\������^����3����19=��E��D

.'����[�K�������$�OEK�k@w�����%���w��vqas�d�as��t`9
��"R06=a��,W��}M�T��2Gs_�i�v���`����c^���������[gw�2"4����������R<���`i=�U�+�i��+�f����p�s��.����'�=+�7�^<�Jy�J������:P�d�o��ir�<A����9�d��T�	�W���X��C��&���]0!�cX^����=pY��b5��k;Y���VHn^�;f����$v��%���Q#�{}���h�^�y��,�l�7[��^������4����G��bfY����V^��.6�O�7���
#����0fee���/��3](�,H}1Aj������;XF���6gg��|<����.4V>.6����<Th.r�,�j��$D�E��(�bY���e���u��fGk�9�����/@�/��+LMo����~�����z��{�hN���;��x���d����/
���OC����D�����/�w_L>B�J���}�&%��;bYI�f?q!NY�V���,b*��>�k� "{Y�b-V�+�6��a)��
�`����7��erB{���f�.K��.4w]�w�MV�Y�(���2�d�����5��*��73�$���1[�8����\��5�t��'���%?q�(���2l����w2�}n�����,<�J�:����#�"jVJ��R���&�d�;3+�����\�z��v0=��{>*,���<����
=Pi�wg�R��e�/V~#�D���������e���U���0"~]�VvY�_LSt%�b���D��Y��m�vY�X�(�J����`��+��5�/�9,�:J]��u`bIg?1�=�nZN�k�f��0��b�3b[ew��qn�h�yS���fa��P��@V����S��X������^����y���i�6��*����%������D���^C�+���j�bS�U������>����t��aOC��#��B���MGb{%/3������yI�a�<X��/����{�^{n0�t���S��4T{}����
�jX���d����U������������5;P�5��"��
F��B�Bc�z)4WRXVJ��)��:�c��#?qiI������O9�Y�����(���|���/��'���w�rz6�S������/���[C����/*�N��L����������������h������T�a�'��p	�eEjZ�?uAj��X�G�I(���-L��LX!'%�Jh�j�}q���	�}X��Y��i����j����1�d�~,'z�P�-W^�?L�Yt���^p��oe.������z�{+Z������ea��i���>L��r|��3��=`�r��4����n�2�J�O�k��o%�*?��;/z��UB������Czkf��lqv��n����������`��<!�r�e��&���������Xc��,��/�z(����`{�Db}��;�4�/�3��&	�.i;�|�F
[�-�\�"�"�t���IY����v�3u����F�+�K_L�X�b��b����9z1��9Sx�]�10�n�m}���[��.'�{%R����Z��/`����d���w��)<��^��P������s{���
x*��0�=�mf��;��O�i��������$�����c�������4��{~2��.��w�2�1��S�����VNP�;�i���"?;s�m��>/kg5�������w6{x�����������5��-��4���+'��},�|��i��P��G���(�*Tk��'��[Q�|���J#�;��{�4��&����,\�c-�{����^����hF]2�g�]���1�;�,;L�����$�vx�\�!���1��{�)���R���Fe�
b��A�Y��;���O�k�:�Aw��Fs%�l�f����F�nba����a�Dl%�i�gzz�R+�C��Ivay���ZY�0�v��jm������8F��j�lE����TRh+o����7�^����k9G����u�C������.D��
}A�o+��y�����c���a5X��a�������XM4,$����X���Y���[���Y�1mh����h���F�<R� �f*��)I�e�����Z?o���Yh�����\�����kD�E�anT�`.�-�t�����bKy���q����^��� >f\(K��������r�fu��DC>����fe��G�f�f�y�K��>�6=����!�@?��L� s��,�X�W4��M�C�^f&v���j�:t��.�o`t���Y&-,�m�p�s�*ucu�����1%-�j�������N.S�1���@;6�a�!�Q��,���;{5�$&v2M�W���YJ���������9;����fu	bK��e���5r��/��������Bm��^���1j�|!�a�x�������
��A���Y��;X����{�"���jZ��R2b����Z����
�t�+�hcq���f�q��'Vh����e]1~��XV�Nzc�\���!v�c�w����,v���)�l+��4�7�F7���%���A�E�Y��['s�����i�4����2�����+n���]��:F���`�b9M�]p*�W���+��:�m��3[�
���{GS�2��^�|���'0g���.�|���������y+�����EN��p��d�
�������E�}���F�
r�Oc��������1@�XX�(�h�e
)f�!����i9���gi�'���������ycf�R�'�No�����*�����]�����������_����D�`��	�6b1Y)�j�
�i����v�m;`9�	=a=oj�?L�e�+�=�v&�p�	��l+�o�y
��v^���|T��n
x���54�!�`�PR�0�1���hop���>*<q
oM;`�4�i?=��c��	^8c� 7��t��C4��pa�a��[�����0o^<'��T�t��6V�,:����}*! ��C
[�f�������v�`���7��rAJ�YDj'���u�]�N�f!�C���E�S����rc�R�.4�7�w�[$E��,���T�Y��X�/%4���f��<�=*�\V�n��@��0*,%l��N��p�Y/�4Ev'�0���O���CD4L�O{T�Uo�t�z�T����8�nN)��+�X?��3���$�F]�(�����h(�#vD�-h%6�a7x����3�V"��d��5Y�P����2�^�!��$����7������u�a#��?������nFk���~����f}��l��?=��'B��[��wv�)�����c���Y����R�4��b��bX�l�<M��Ex�:�dO����^��74�e8���V��Y��QsQ����v��w���z��<���EX=4���VK���.�7Xh+���2p�-
�35
��R"����"�������,��Y���?=�}>&�.��!�`����;���v����iX�!�pey��y��e�0�!�t�xU���S�i��y�dbV���f�����~K/~gg%�`��,w�����+������N�i�	�Hc����rXb��	���D����O���
�
�A���N�����!h*F#�)
y�wf�3,IH�-��7���*Xba�$�aU�d��47��n	����}�T
S�k�V�wWr�V�nP�kI'�P����GIpW�9��0���E*��[+�2P��B��yg�5
A��a�lz������0?��a�R����x�u�����>��{�~���`����vWR�;M��X�'���������sO�����!k,��$X*,�L	��c�����h�S��2Tzv�6��c���uAS��jY�kN��&�f(��_S;����������Rw�5�[��Y�n���4t�yA�t-z��)�>�����j2NSd�V<��v��w�6�YGn�a�p\��v��j�0�����R=�`'�=
v������n�����E�������H,T��sez/O/�XL�~�fs���1�*�@�l�,db��@d�7�=L4T��e���:i��;�M3g^,��IlrONO9����o]K���&��z{��\�G��`YB,�r7Z��[��DCX����;;�b�����m�G�F�ny��JYE?��[��3�c������({uKw��,~��.TQtKw���X7���B�b7+���,��B4���K�f�k����@����U�#��J�rI��Wvbe�W!��-����h�c�X�E,+��R��*����^,E$6_�y�wW�dED����BYd����[h&�����C��l9��j9\x��hX3 ����F��Fb������N�*���H��R�bS����v�X�Z�f�b��f��
��� ����/�P$�����k�K���F�ke�7 )��xZS9�1C��~�a�P�����Y��:kM�wV"�����H�%�D��Y��X��-��^��S�yb�/����d��}��/���u��Y��;���;�����;�2��*��j$�����c��q�,�����=��%z�,I�)5j�eF+���*��= �i
�G�����"}a���4
t��(yW�7g{���ny�7>����	�%�\���[�����!bs��4T�10�tgmb���b��v��r���7x���"�B�[�Xr���9�	�����@-�d��
�)�R�-����o��j���7�b{�������1�?�r.�P�G�(tJv�C�8��,U�b�b7L��3NSd��	����`'LH�n�\��S=`,1���b+�B�wx`��tb���Nj�q�n��������'s������?��@�i��c��,��5��a%�l��#ACAy��(��/�~S�8����;SK
]�@�C�k��n��D�`��gZ��3}g�f�����#<j[�%Z���S���}���P�M�O	K�Q���@��%�r���n}�]��zA����XE:�)l&�J�L+�t���[���H�h��DY
5H+�pA`��q��}4���i%W�J�,�����0|yt�3|����`�Oz�"gQ�o�n��
���;}U��V��!���t?Q���*&j+zUJ�,.��
E��n�F���:�����i�������Z�q"XxW����:=�7:�����\�n��[����@#�����-�M����2��,���]��F��4�v(`<V4}��t�~,k������Ix�2�m;�������SdI�]�G.�1%M����QCN���b���aM��
{y�j�^���	�w+�������^}g��(��5^�f�pN�o�!��/X�f���0�(\��-L#8A7��'���P����=\MXO,s�4f��,�%�v~���;���t0,�
�`%6_�|zL��0\���-8E�,�_J����h��#+W(�+�
��L:X��/�.?/�<�a�o�$����^��[�����,�p�";|��'h�v�7�`���S��i���A�R4,t�H3�[�N,��_�Mvk�a`�G���j���V*n-��a02�bb��q��	�;�?4�Ke����T2��P���J��:��P���=$RJ�D���r-V�0�+�`(o�v�������������en�n�4��+���;S��j��9
���Wk�.�Y��)��<�p�
�;�.���J�L��4����2�nv����7�V)Q�Fs��ki%�mL�a
������b��������\���0�c���K[��Q�N��)���]��r���=�g���{��mv��%���J�0�h�c8�����J.���-w���kC������`ed�'+_3�V>��p����`K�hx����������������dv2�m���v[��uXw09\���_f��l�up�e�����;=��k�>%v�2�Cb����JY���oN�~4w��������^���?M��)�����n����-����.	����7x�eG*�e�pb[�0N��=�p�R"�{0qX�x0�b����t5va��bXq�hX�!*����<Zl�ToX(y�2�����rj�9
��+�
���N��{��j�e�Z�Y��4�v�X�S4%
�e�bgA�nX�y0�f��#	�)���,�yI��j�~�3�y�Wv�)��&��k%�
��a�d��.�]����P��>��^o}3����D�E��|���[l���@���x�����<��/�,��!
6����^���������a�����C�!�_�^�aV,���9�u'���+-Y<�d�h�S�����Q	Yv8�h41��M8��n=AS�E�p�i��*<��u��=aF��"��T��L�U���,��o%Y��Q����L�W4�-�e�%�X��\�r�"�,/(:��'s��Yy��:v��eobs��wv��f+-�������E��M�n��Fd�p���x��'�>p'�Xx������O�i������P�cFgU�����.k�����G�`Ys��|��w�N9�����c*��'�-��?�m�kc�%�]��f� b��G,���m��4E���V�ix�
vz��u��J�h��#�F4�T^qzL�^�
V��j��.�(vB�_l��j�c\	�b"ob�u@bi�XcN?�i����60�i�>�����YDoxR�ex��"V1�;2D/X�6������m��{�l�IoX�x0a���a����jEC�}��+	4+Ag
��R��R��N�z�-l�t8=�} ��K����W��.�����n����\D�����] X@-�aX�l��OC�+����r�.�y��c�lzeO3dO���0�j�`��h��~�a��������0^�9h��a���SNG�X��U)��T2l&�?���~�;�{�O�i�:�����T"
�`�B�}����Kd�	�f�.H��;��1���,6�g+W
+4xX
{N��S6�.X�,ug����+R'�"uA�tX�z�^]�4Nl���4T�10�4<�K	n����>���;��`���w���N5�I��������hx���6[�]������!-�MC�a����d�OC��Eg�y��(���*X(�(�p������f��`F^,�^��Pu��������+_D���%��j�"���c��D������EIAo��!b��kwC��_�mg��������B�1��������Gs��M�7XX�S	�ZE^L'z���`+7c�Y���������wv�8h�,�[�����`*��WA�lXXz����+�q<��H�z�B�B�.-<���C�E��A�g
����x�";A��6h�,v�C���f�f�R�������Tv|2g�f3��#tb�f������[����7X��4����2,��Wg�4�v����F*�2p�[�A��U#Eg5��9o�P�"�UP��KLhR4�Y
2��'�P0@,��"������zgg��'}bg���`t`�Vz��-=���hx?�Xx����2l�P�mMk��M��`vVJ
�K=���t��S^��A����n���������`���U��h�������NSd��IZ������4}�p�`�������Lg!bIkx#�h8�*5,$�������%�����w������r����`w
+����1,�v���6����7x�}���{���O\Yp���.&)Z���^�v����1���ODy4�"D>���a���a7���M�pOV�$z�x�X(�.
���1���i�ox�h�j�/���^)F|z���D�hX'6��g�Jd2��O�=A��� ���n:��A�1���|p9M����� <\�����5CN�9��p��8�#��+�bU����)�=E�1���pg��p8����v�es�]]�6_h�5Wl���6-�=Y��h�L
E��V�f������E7�Pc�%��>�%:=�= �4
5��f1��,k���i���Kd�n@�t�c6,G�k�{kZ�����z�'sv'���hV�a�p{��[���)�M���/]����E�~i���o�|g�R�S.�4Ev&��/
_��=�,�%�'<\��K's�X�h(~"���w"�������d-��aI��B3��6��H��l���,�'�%[l8y���z�bMD�Y������F�]�%D�������-�W�VjZ{��%�Y�d�[$�}UU�RCEN�0�<-h
����R�0f���-H#N�aO�'
u]����s��W��7���5,��a�We��,�����?�7<�KZ���~�����_q����d���s,�;�
��r�PjWt��yZz�Z�i�����2���4�����2�����l+��LK<O@
s*�if�
ba���b�����m�;K���R��4T{2��z�����w����k�OSdo�I"N�-�)Zo��w�.	����'�	b2;����ER����0f�oh�a�im�	�I[�U!�-H�L�CO�H�f�����Rl�{���dV
l�C�������a_��.E�D����4����I���>������E/�m���Dr�l����Pr����i9�	��AC)$�PtWl�Ge����O��H�z
�a"BV��L
[4^��� ��������S���������4�N��������4f�ih����%�'���ay�d�a�G���D��0J-�)Bp�^�O��-:�`O��������g�'��/��}*b�W~�]{���:�f�������A?���d�V�����4i�"�i����iE�:��W�����.l����t��'��9�w�u9=�]/&�-�A�K,&��X����(A�+��0)�AW���M7�@a�@,���[��a���
/&6
Kn��

n�>���'�
��6��
�UVY�pO�U*z�T�T����*��������N��1���[4l���JA�������r���wf��Mc"�Z��>��[�n� �u]�[�~�>4u^���(�u����!k�[��Z z�8��;��v�]�r
�4X �h�����I\4��C
�k�{�n�H{�E�',���2<�������G�U�M��P�X����G-R�1#�����c���m5A�J����'l	�VZH��r���2��3���_D�[a/�`��[�#����	���
+J��*��<������+$��Y�4T;_�93���J[�x��=hZ)l���i����i8��&9�\<a����v9�w6����]��H�6�,]w
S.l�
^~#v�J���zwf2����
's���+��JD���:�A��|`51���b��l�4C��a-k�6K�:K���.��4[����������|���^������V��-�=a�k�t�%�
��5��w`a�	KM�B�0I,����H�]o�����E3"#'����Z���}���z��j�	�RL�1a)5��F
�Q�.��,�<����^��gZ2y�f I�O��~l��&s�+�
��zN[r*7�:��������>�=
�J���c��y����%VJ�N���Rld�a(I.�W�=-�;���hZ�-A�J��y'�f�����2�V�������y[bv��f%�b�{�N�mq�����~
���Efo�H��/�X��+6�����1�b%�bE�bS]���TA�J/�iv�g�����.4��|gW�����ze��h�Y%�rO�m���	�����'s�������b7s��v��*[��-�v�^�.�J�E�KJO�����'KXf���V�_.)=<��b�~�i�N�K�+v+�iw�����"��\V�S�l�-�z��"��E���<b;������r�7�{5
��`YP�f��"��3�o�ir�14��S9��+��gD��!�B�+����>mn�h���v�j9{����������iv��1a\�Y��d�N�A��_����XX�b��J�����N8m�����>�o���A}�OrgNC����7�p{�"n��p�j�&
��Uuo��K~���f9
��+�����*���Bg}���A�K���zK�[q'������&	�5���T[#�]�&����R���4W�F���)��0"E^V��Q���ya�UtV=��N�
C�AVX"6����)�R�(��n{��s�� �|[��f�c��;'�0(&���[,��l���� ��|L�t�m1_��F~:�b�+!����)A�{,N����}�P�J,l
{����
���|oV�':w�����`�~�;k@�e>NC�C�
UE�[�n�<�]������cx[�1��}��Uf�O��5\B;���]������PzN4�6�0w�f��bK!kK��L�Wt�{Q����v����
�^�M������ru���S5�e�f+�C�N����g�:�bS����v����h�
t�
+	����(^�p[T�����c*?�}/!������}/�2+*���=gbgj���'��`QD��m�tn���0��K��6���.d���W����z�K������ba��������Mu�4���������R�-ty��]�r��G\����P�0�'�V&f!�)�p�
}����pb�bd.^�>���1W���<%��� {A���N,
��5��n�v��_�+U�������OI�W~;1��Gj��� ��0�m����L�0�����t���
|��-���V{�7����-��7�����-��1���>S�
���`����DO�i���ECo6Xx���{�L�l������:U�V����,�A��-���|o��+z��i���6�d���>����cm��G����0^io��_o�,�������l�o��hAox
�pi#���yE_����K!ihy[x�h�3���]�0vxJ+�f5�o����L����a�U�4{U����
��E8��} �:
�����2�
���
V���9M�= &#���m0?,Y�5��<*Yn+�B5^����B7ZJ��k;n+���x%��$}��J�uo�}���u��<��C�������F�m_��5�ok��D:���@+��L�W��Z�vx��R�>������k��������`�^vaJ#�]����
k��7ziW�O��??�����
>�#:3���^r���z�7����g�`�U7b������)��HL��j.���[�����O8ba0{�T��o��i���AV4�4_�k��v���l���"-f����|�Xfe=���5��}`w�p#
/������z0��Q�Ui��0����������xs�����]�`��}7|���R����o�3M�n���A�Mu �����{��.X���0�a�r�,�d�
����}��E��q!li��������}gi�i��vElZ�NSdGj[MR�]0;���X*���n5���E�~�1CQ������W��w�aH���&���|g+7�<�v~��_4�=�>�/�*�O<�v~X����`�ci���i�f���?�W
�����)�o�c?���������-�b+�y����W,�r~�9w,�������.���!�����=�"��>�+��y8,j-����X�8��4�++5�Jk��vd����U(b^�c�������p[fuCb��cz�dU1�7;E����
6�5�B�������E?����Y���
W�`W�k~�u��.M�,�$�bU�b;��X\�";2���4����X,�h���*��:�����&��O��@���c�a8���z�]�����p���h.���l~,q�}i%��=�Xg�iDO��e���:
��u-��b�e���6�X�������5�����u�&�':2��90��m��������qS���l.�:
�^b��(���"�����biY�,���ZT���G�����$�KR?�;��[5�dY����V��~��o���B��cY��1AW�qkC?LZ4=c�Rh�4T�,�,z1��
��e��B��p]�c5���R������|������n���C����7�DkD��~g���%�E�����:���B��c�d��w%i�c[�wf�� ��e�*�����������Nz��z�d%��t	���^���\xJ��LHU4�
�%4W6���XH��t���R��H-:�0�F�
�.,X\��W��e�U~�e�xBl�A7X�S9x[���3%�,�?�����&,���+�F��>��z����D��$,��0	^��ubIB�P��c.�Y>�
~���|V4h�0�;��\�R�\��tD���|2gOF^�*1��,Si�����t��1W�Y�?L�X4���[E�a��
~`(D���%��~Tva=W��]�4�v��7+�`X] �p�
��G�`<��y^����������������`+����i�P�Y��d�~`�������'�V��~L������PB��{�(�G
��h.��=V~`�2hz�	����w�������F+/�]>&�,�a�{bi������c��|��Gs���r���/��o�.�!�^�E��0�`���G���x�4R�p�
z�oY�����;3~M	�������&;=�=�M=��=�V� �M�9��:oU��7!�A`�N����V�sez�������~b}���3�0�J��5x��~4�0,������vbW�����fX.��>��������]�����S�A��]�W�:��
�P�@�_��=��m0�!�0�(��JU������iyC�� �����-[�%�[�[�����i�`g%Ihm��i���������E�-��He�s���
�S�=ax"X(�)6����m�$-��jme�Vg
s��-(*=��iE��B������m��n�����//���
>�^�E������a�sl�
�u�&���<�,����N��p���+��H�� %�X�6�Iz����V��-���������;�8K�F�V��O0��a��-
���bM�m�m����aIa���!�]����0�K��n���
F"��)=���)�)��F�����������m��5��{�n��,�������timW���M�.���q�u�����K�������%Wc��	��%�����)���`Wj�>M�F����z"�`����BJ��\l�i��w�.�b�,��B�����&�*z��������jmG�������!���mS�����~�������\����4T;}�m.�FY��~�R9�6X��WM��
�S����0���n�q�`��0��r1��H4�3K���M�r�� ��z+�M�t��������
��e�����L��G,tg����1&hx��@>���s��E��N]�S�4���3���
����b����p���`�b�~��mb��g�~��d�vT,5�&����f�3b��v��rbA�9{�����H,�'��
�kR�����9���PO��0�g��.�e����E7Vpl�,.h�-�e���������,t�Q�����8M���]��pY@��D/����2�����yD��V�0�$����,>���E:>��0�i����+�f]�f�W].��.&�+�)V�����Zw1E\��yYV�]��H��?�X�{4I��T��K�D�$��# �&� �PJ�����A����z��B��Z��W���Wl+hY-��.F	
 ��QJ���z�9eOSdG�I����[�b9>�����aa���0�a�x%
���y�,�.6�	OSd�����t�]L��vY�����ROSd���%��l"�exX��2�Y��W��*PN�kO����NPl�����.R,<��q��t�]+</��
�F����q�k&-���c�9/~��c�G��N��j2�g���L�,�uRDO�*!�rq����b�����rb��������~<Qu	
b�&y�
c�;�WA�pYz1}��f��9�LD��q��&��P�����������m��Zj�@���!C,l����
v+�'K</����l���\r���h��Jz�����g������a0x(�Tyu���I��k�7�1��o�%/|�.��p���1�&���LVK������Z's��a@m�!H���a��.!���}�"{��?t�/�^�<�_���'*Q;��'���V<^0Q��$0����h.�/O]q�v���!_IW�4�vD`��l5
�e5����D�����wu��%�'6+�}go��`�0���-L��	Xn*�_xD��������+?q%f�_�;,�d�a"I�����\hR[�,��f�+
��"��������T�	�5���f4��b����w��M�G�������V^��Gt���N&`$vU�V�9e)�hA�~��-NA��c���EuAo�)H��;j�LM,T��3������ �%�����+��%���Gs�����=���V�@�4g������*�J�,[U\EOX�l�.8
��]���� ��,�K�4D��2�	8�n��?H�Oi!8��}���WqIye�.�Q�P8�Y��3,^�#���1)���`[���e��S;�a��H��p�*}�V-����}��Xr�4��'�����
����SZ�a��X&�*�����x�����n����3T$���F
���ur�9��]>�J��R|mQ��D�EO�����R	Z�W",����/h��l^�NC��J���&@{2g��iC��L#I,��=�s�7<��lE*�������9{^��1��by2g��D$��U����1��i
vT� ,x����h�����������]�5K����j��k����2��6m����G��A�B��[4���o������C��y�=���;-��H���,t�v0,�������TiW*���`�V�u������6���_Dl%n=\Z!mY�
���Y�`s��i��P�����J[��a�bJVtn}���TI�PRlOA���zc�[��a�,|������������[��p<�m]]UYg����,��������u&+�V�HZ�5��X��N��ddJ�F[�Q�=�,�(J�o��r�,�,6�a�f��!WD4T����`������)j�"�y�����\�9�����Ul���m���$SM�`����Y�Y@�������f��N��^���N�~b�2[�s[�5����\�XD~[����?*4��i�~gV�%6_O��m�M��*d�e^7�y�Y���+�s���=T�kJ3��;�bs�����[�C
z����������6���m�^��ba���NCbY�A(�Q,T	;
�8���P�X4���Y��f.ba}���nay��������^��/��#H�b��%�E_�C�����4����E���J	��t7��E�����4R{@t'��=�$���Ji[�V���.�D|�.�`���f�
����E_�(��+>���7KI���b���C�b�����'��v��9�1,�*��S�?G���bw!��-����8hq6_,���������CvbX�i�T%^�&v����1�����t�D+�B]�]��
��]8Ea��Y�6����������
7�':E�=��}��{�^{^�*K4T�e&i������w���	��i7+[1���b�'�SP���v����h�
�m�P��-���$��Y������2��]��[wCM4+��e��J���]����'����em7�
�G�f���P��@__����^l�i�`�Y���v(�h�h��d��	���B�<�tU�5k�n��+���l�P��lA@|[�w�l�����Ki��vx���4��?a	�
�1A�������NA�������'s����������������f's�`Y����
�O���2�W��������o��n&+:��������������+<���nD�WABg[%v3�X�
�,d��[�������f9	�z���e}�
7����B?���zb���W9���z��~G�������^`���bY�Eq7�O���7��9�� $�-���9���CU�.���6���L�u7�5
���~��C�F,��;*a*��f����n�h-��G�?��n�c�b�P�St��J���_"�pe��T�~�m��|�Gs�������LWt�HdM�
s���l���.�H���b/����h��-x��������/9]��'��,\y�,2_���"��3�� )^����K?M�=MX��E���4��)����5��m�����hN�d�
��[����.ko�,���0�p��������y\q�y�aC�t��Y'���)c��M_�(K�O�`�%�������z;|���o�5����kb�,���q<f�>�T�E�7,R��0�J�����n���a���\).�`��C
g�g{n4�=��U!�	��.�uK�^�
�pq!�h��
��$������>��N�����F���=Pj����"�i�t��p!�d���E������`��J����4Ev�`��4�a�B�IE�4R�|��|�np��Vn���������R���'��W��"�
�7[��v[Ax���p��JR�����a���st�;;���Yxpv����+��V[��@�E/�MV{�e���
��S�{�@��I�P3|�H�V��,�L+%�CfL���j�g��+�0Z*�������Z��M�p��/3�����t�^;^P�*hZ�,�o@��Y��/��v�;M��E���W��-j��(�hX ,�4�V�,��G���u�^0	�H����� 6�������wl�@e��t�Eg��d��,z����J�iXK������!��GE��z��\A���r�����.Hm~���cZ��;���H��������z�W�=���Jg5�1k�^��4U��J
���z��n�V������O���3�������?������tC��������o)��L#���������,���eS�iv�g�v��Ayf�
�G��+�}O4<Ap����}27m����Y/���{��z{����������9�QEy0*=3��~�?�{��X�!�=J���Vp6�d�s�1��i����{�v�Y��|�|�]vD�V�i��5��������L����9;H\��@��f
0�����xWG�)������{$R�5�R��d�{$����-k's��P���'��O���!�X����_����?�7�E��(Kq�]Hi���_U�ws�]�����b�	��.
*������y�C}q�s�����*�;�Po���{f��6�T^M����=A�������<��|��iz��"U[�����lG�:fY��l������N�%(�����m�#�?�]x��F,�E�E}��l�j�����iV����:��Q�a����iC�W�/��e$)h��@��^�wv��^;�H�����������iM_�,$�W�h����kt�yK����iMH��l�NC��W/I��%!���`s���)�.B���������I��J�?��6x,
������b)�q��7�����l3=�w�v�����C}�/�;�;O�i�		u������a�`K��n'�V��0�"`���w����]
�C4�n2��,�YTyl�)}*v�P��i��g����F�Z=��K�S4�>��ta�v�Pc�/
W�`Y��Y��i���������Yg��e�Ig���M�4A��`T&�|K�w�V��.�;
6�H������	:_����)
u��6$�g���"�p+���'zzL{mpY���^Y��$����3��k�^��J{O�z�4��,��������z�"�B@z��!��Zs07���Zp�����|�x�g)-s4GYOOiw�������>)��7v�
zBw=�|q�i��`�z��`�.�6�E��f/���M����S���M3�Z�L��lA.��S�Z�M_H����d���x���.'aV)�	�<��uO	������/��U�o�t���Z	��M[p%n�0�t�x��r�
���[����~`r�<�I���H���5���{�u�];����I�~���:A�����l�����(�.|�(�����w]����0�a��V)O�-��/DW���	X�4�������
c��#��M�eg��3�ThLg]��9;0�qo*Uh�!��Y������	����~�o�=��BB*�H���n�0��/B���f���e��Z��'����D|��������@*��Wey��rm�����`s��4T��H+�4���
O4V�S�Z|�"{�D)�T}�f���?R��?�Co�5���������)������R�/B�:�-^�&�����N�F"�S,b���|���1�������4;`��RP���b�J��t�/;AH�t�i����j��a���a+Q�e������j�����E�A�$O������;np	
z����VS��4T;n0���Sb�D+��,����M)y� �D��Q,]
������c�]�A���~�Ju�����GM/���a���V���=(��]sfV��,��-zZ8Sm;_�pq+;T����_:GZO��9��#hZZ)���t���h����C��GM�ym9l%�~#3���[z�� �U���`�l�������!��!h�Tn���'X8A�M��`��Uo;m0�U�_�j�������.-�������_��m|?�}	$�j��+/��^�,:g���,*t����)/?%��E_�J�d��|:]����a��8�'.dh.k�B��_�P�U�(|��S/:��^
fv�����wY��]�m���
��.^�`�J��i�nO|��������u����Y�����GJ.k�^�c��L���5�Et�*�3\��e�I��,/v�l�Y������������~X!�-�}%�Q���,L{1aZ��mC�(t�^��<����}�b����i/6Mw�`�t�i��cXZ�4;���R��;�X�\�dx�M/�iz�?�v<��P~Y�������%������`-��;�F$\������Y*��]]XS,���R��i��P0%
�����m��/	`V!,v����J����gC���p���I�����\8�Z�^y ���
}
���U�/�Z,zB�+XvC���Y�������}

.�U�/�
�lV<�vs���1��1�`��Plc�I��DlE���j�E���o=������E7�(�S�]�c�5�/�����B7]��0��
��Wh$�,�{��.z���v8
�~�(��J�i���N�2<s�������
��*�o����_V��R����e
b��|0���-H\����8��3�,m,��+n�����-\�qY<�b���'Se��#��T�vzJ�m����=a���/�WH�I��0�)��J����
�:���T�i����T�������0T��]�1���f����vYN��3#iZ�v���-R�����<���������j n�������[�b���iFu��?����S"���9M�} ��	��!i�'��P�O���P�m}��"�e���c�h�eN�k?:A7�6`��
���;j�\��=��/&8)v�U3X�0,6�����#WA7B��O�Y��-v�#�i��/��t��Ky��$<�����	�`C�6T>L{���]t�s�`���,�
:�eN����2�y�e'��������+����/d��MH�;��1���]�~�����EG�R�����i;=���������<���`GAz��h��cAC1[.D��;��0?Z��
DO�����������y��Q��;]^��%(��z��uA��\J���[�������c��(����x+�$k�^L#R����`i�_,��e�bw%V`=�����nL����1U��V�f��^L�W����4�K��wuX~K���QZ��n���5�J�����_���i:
��:�M����:>�����yc5z�9�}�^�1������1��������/�5���H}�._�;���w���xY0��C�`M�,��f	&V�_�b��,:��|g'L������V��gf�c��*:�7~gaF���/$������
7�/X����x�����T�TX�,���
>��o
����s�����
���EK��s����d��a�4EvSa���t�X��S�1<A�M����=�e$A?0� ��]aM��iZ_��f���aV=�]����K}�/\ML����@�������+X�#l�5��W��SZ�b����������R_<�^�P���kGD�y/_0b&�p��e�c��tN�|g7����S���b��f�"�c����|�
v��o��S�������.��%��a�C�������K���hQjx������9�@0�t�t�����q�4_��;�3\��������e��*��V-�`W��[����B��,=H��+�N�k���4���}����.�U�,���I]��X���5����)����X�*�r#�eM��iR_����@�����`�Y{z>M�=>�H-V�m��_����|��T�z�!;|��+qh���!n��?�|�X�;�T��,h}��$���z�R����g�5�����a�m�i�h�"��Z�� _�@�����D�����)j��n�-L�b�hb������N���:�f��4������7;��eRb���.;���5�Y(����u������m��f�����E�Y����~E�byc���K���5�N\4#6�X}g;s�~�����,��t�hx\5������)���c��>X!]l+�����������J��2\	t-|�t�Ie���"8��/5��1���X�����0E�����;�q�e��I�����S�99������$�E����9;2Lv\��j_���wv���P�����������\E�&�#EOC��T!D�k[l�����1
��[�*���_<���w��a�Z,<�]j*(�O�I�mT�����=L�-���5�������qm�)��w���l����������b��I��%�^��iJ�y�t�v��Tv�f�����D?,{#�>�]��L��x�VYo,�.��S������*\���v����p�Y�a�a�9����������*�
�J�x���d�\��r�Q����Y���t�i�����:I9[9-X'����y���;�aDZ"�t}�FR�f������[du���v���A��^Nj����}��G���,u���4���+�e��$=a�>XX�%6_�~zL;@�\F���"Ks�!2[�!�N0U$�q��g����
���h�0�v��N���\Y��9=e
���f%��,��Zl~�NSd
�6����FlA;�Y"�1a5�O�F�f�rz���m�Q�,�������4Cv%��q�f�2{a�VHo��VtgR����2��\��S��aB��B�l�ex���8{�4��q�f��,v
_k,6�TNC�����K'k��aBHt�5�Y��r���i�`�$�}��szLo�0�4���anz�����p)Z��u���h.*y`Hc(U�Y�:}4'��,�4�M������,�L�fE��l���`��������Z�����WD���!`����\�X(A(������_�+�=`]�4��Wm���Nd��|Q�Gs\���`�������V�-K~�[�DC��f�p����7�^H.����g�^����b�LO%��������g%0o�s(`F��*�#�����EO�d������2g��?��=EX�=��PY�����i�3�.�6X�A/O���1�]������L�
�d;�:+���v�`�*�
�����ba��^��q�`	E�4�,��+>������q��`\�efK��^��Y[���M��e�por��zc���<�T2��)o�YZ�tV�?<���`GziOSd����`e��������"�n�{,��0������b�P0G��[��h�nL�St�
>��3�H�QC�Rj�����6����R<��{g?TM����p��p7���C�-�,}�^�O��G�L�J���b��yzL�@�y����Mx��}g��BI��K[�E��
5��6f[�U�`x�1S���*�p��$v� z�0�-���6jof���iN���A�	���}���`i�3�]��mVoLm\����R���`���.H�7����'��>e��`�X�;�(��J�����m��i�2X(S-�39?�V�j���sk�7X	��7�����FM���������1\������T�p�\x([rR�S��V/���,��`�z���baq�Rq�
�9Nc>M��T
��rR+C���$�E�����a~+�v�;oLV*�8��=\e:t�,B��k���^��7���9t�%q[���!OX,���� Y������h���v��7�
���N
���N*��R/��7��r��_�l��x
���nL��A0\,�GP,�$���Jg��������������B��	���`�*X*s�%WPy����E���"XZB%��L�^�	�#��S���u���������������h��Pd�-�Y�Z4;��0���Y�Tl���n�����E?,�%f�l��m�cF��g��L��5�]D_l�[8�vK�wV'*[�}Xs��B��[��3�s��m��Nl{2��:����H���n�px�=
I�n���*E?��)���Qj��u�;K��(�uk`��]����.L���;��=�	S�7-���V�C��G�5���s}�GsQ5��	�	)`�X��\�r�!o�L��t!C��b���[���:pG���c�}w�Xw:��v>���J�7U����o�r���J��v�zEb���X@�3����F(�����.�������n�:��;�>������,$^���5�Sd-j�����l�N�n9�?��Y?��~�M���uOJ�,p-v�:�V���}����	?Q�-De���; ��pE6w���j��:����Y�����FyzL�1��A��������P�����<��K��KD�BQh�Zq���zsx�������H<uK���D�� ������b�B��[&�3
V����d�;�:
o1����G��
���H���Y[a��wG
�,3,v����;��
�F�.V{(�bJ=b�mR��]��V;�0,�J�}��4X(�c���`u�B�����y��Y[�;n���Y�W�vK%�_3T$���j'��,�����*z�K��?f����������b������������c8���}s�w��"hx���SR�>�>O���p�)�����E�+�N���$�P��������R�.�2�a���C��W����--����bY���J�a��5�Xz�����;��6M��H����P�P0�g�P�,,��)������v�"{0�4�K���@J����;k������w:��j����?EO�
vU
���a����aE�X��;��%�0�l�r8M�=�-:�d����hJ ����Bt��f/���[�0�#�c�m-���_>�����I�d�;;��:�Xx���
��Nx0[)��zq��)�@���\NC�W�4A��K�+��7v�>#z���,���Tz�wQ2RYE�|�a����Sb�d�N,f�u}��e9��NC����Dg���9otpO�"o�u�[U�� z�S�=��t����)�V|m��v��(z�5�d�,}���[�O���0Q6����V`�jlV����n���F��mEw��(�0,vWZJ,��a
[�p�6����@d��-uB���:�R�my��F%o[�RX���b���s��)��C���&��uY����Y4<Q��h��+��D2,PK�J�07"�Yd�0n�h������0 *�W��I��RVg����bEo&^!v���j��p�����V����k�G}i�V���;A�~�0 l��czbX��H~�iz�xAHB������b���T��l�� �����X��V�H�.��	��*�OOi��I�&u��WV����Q,�'�O�k�lAC�a�,����I'��c��j��O��n�0��yb���C��dbsk'V�H�
����,�����N&,������^`n���
=1���N�k/:�K
Gk�2����k�����W�-}���Uy���������T���T~�]'X��/^�l�n:
��t�*��!��Ug����OE����3\��]<o%ib��3A�{�O����8L��n�kN]�����e-����������2f�.'�r)R`
QZz��b�Y�� ����w��ne���Nw���m������������K��A��WO��oz�s�@�4E���z��;�%7NCm*zyD�$���^b��<R��i���-��;��]�1OC*47p��X�Y>�,h��}J������=rv�)�UdQ.�e�a�Vn�.}e�g���Y���������bK���?��v�e��Ex����|h9M���S�#8�b��-.��vw���.�KP4��H����[���LF4��������[dzU�We���-��L��K��e��ay��z4�3���2����X+�Xx��+�O�ko��<�f����������+N3d����������F��\h���,�!�az3bw��wXKw0�N�3�'svE�qJ����p-\��Q�ZO���]�����5|�1��������~s������;��;X���������X���y;����4�|���������.+E4
Oob�?,u����)���r0���E�����eI@��z>��P�6,;L�A&"��m��]l���a���$�M����Q�$�,�Z��Y���dq��6�	���Wt&ZW����$J*������^0,w+�L��P��a���2����6[I�Y�x��[�4��������q�v+�u��v)����a�-|_�,��E��!�`�/���Rdbs��4E�(�7�����B���:#���S��D�����7v�����b��3�
��V����g���v�������5|t~���
������+}����3�txEo���2���em+b,�
��]����y7I����%|!EF���d=bK�=K�
]���K�$�[Y����� FYm���#�l�sgy%:�c�b7��{;��B;�t�������/�.A�>�l�7��f��bQj\��b1��[��o;�����u�L���\��['�z�E�;g{��E!]��3��;Z?�������	�2��6���fy�n��Y`b�������g�Xdj��p�,�%kX�5����Qd������iV(&6+���jC^������3L����-
v@?��+�������'U��Lm�2Qh�P�ClV�;gg���1m,�W�������	��>�`�T�����'��[������p��&t������XVR)t���`+�Bg���������"7+Q��C���U�Su�O��p>���t�_���A?��U�}�^�O���
��AV�-����B=P��^���|VV�������B������S�`���A�>��l����a�����:�,���M�}k-�����}���n8�sL�U4L+u�����e�b��(�YI���uc����E3�u��t�a�Ol�n�:�
�1�����N/�n��	���U�,������<t�d{U����>0�S��[s��[�ny}��]+h(I��+���un0<'ye�\0T�]YU�0�*�b���_��9���
�gCi����6<��^t;<r*^1����0j���Z�POHt.�9g��1j]g���4t��Ku7S��2���2<���iU����G����<g��=�3��+��,�Zi�fU�k��n��&6�E����b��i0Q��09/�+����F]�F����V���3��]y�7�v,�CcHJ�0�d���c�n�9JAS�|q_�_�������kx������2�������J��)%�����j�
�O���U
;�`qY(�1�d���>5w3�}jAX��o��g���`���$�gm�]�A7x[9�������pe%����u��lEn�Y��1ug��F����ln��{J[10�7�	�2KM��il�J�x��MU�����D?k���),��
v$��1m�0n���i��/O�c`�s�3���������i�G��}��B_�~�Qjtn<w+C�����-�[U}�b;�3�Bm�+��w�{yy�{ z��Z,�3�v���;g���M�[�����p��f���`bG�%z������	��'��ug�i�3�
v�u�N�-p���%�����J,����&���;S }�:s�OA��[h�3COt�I`�hq<n��_��a�Kt![�[��3'������B�r�o�g�tx��:�o��e��bs��n�>4�O4T�[������L��4�3�<.��4Mni����z��%L��=���t���i;����1{��M�XVs�.T�u�v&�k�P��-��� �h�`0�n�baZ��M����h�;A�g�b�_jz�w��(�q;K�0
�t)�&��n��'X���I��!�B�
uW�����':��,��;X���UP����,V'���}Xu��Y(M���,�X4&��Rrb�
Zl���-��H�����z�,�-:o�l/w�v�L
:���,����������DbE�Od�V}b��Y��a�nm���iE��g��~�����0�\�]�t������
��baxE��pk��{����eZ���dk��n����x�'X��hj�hd���Ea�T�Y��Bq����x�^=K���4�B�@�6mgzl�4����a�p�<���
�%������'���P��>Gb��q�D��`lF��
�	�1
�`a���)w��R����\dU�R�`5#�2��������*X���o!e�[N��dK�W%+�r�f�fo�q�c���~�A�${��2�E����J���D�G���x���i���w�D�&����	�R���qb�J(�Z���A_������z6��
����PM������b����{LU��O��R=���8;��
���x�k��th����S����;���0D+iKhvJRf`te�!���,�z��>f;X����
5�NV�&����[���$�B[�n)O���(�%v�qv�h�-�	����2Q5��P�����a��D5�'_:�����Xc��D[-
�`�^����TV0��
;������X�B�C�����M������i�K4�z���.��7mc�%����ZEg��s6�F������p�44I����F��g��e;�����
�����F�PMB,��3[I���j����q/G�9���}*���v&�*:k���	��eD�.f�/f�%h\&} 6�J�-�m �5&�TVhoVk�;��\1l{AGE���
�������(��U��c]���A���@tK�����J���t;�,J�-Dg����"��,�Ta��FRM��ogB�oP��n�������|H
�<���`�R,��Hz�/��}AK(���{���;`�@�O���-��Ex����������a�`K�0V��0�bp)��q�+\��R&`E���v8���b�][��-����6�{b+�L>��Tm���Dm������}�/,|[��X�C/�,v���tU#m�`;,v���1m�x�h��J~��TmP@�T^��?���x��Y
}*���i;Sj}��^���w6������l�evKd;��N�1�1���2-&�Ja�5m;��
���^���v���!���9�����M3���Eg����n�u�NQb;L���s�����q8����u���fjK�	������l@��hxv�$�_`�H��P�i�t����,����
�.i�B�I,�#������3DC��`x���W�`�Y-�����-���W^�9{�*������B%���a�D�����a,7��i.e�s6��wKd�ze$L���=ar@��F�u�R,.�_kC!3�K����}��+�"P�Z��e�d���5��~S�,b�]������-���E&��`�KR���"v0����2z-<��/�,�h�Ye����!�����qS h�����"�T�������~�@�#�#_�H�B��|���G�������f1l�*�����f��4�E����B��k���]�E?t�	��rY*��=�	$�d�)��<�s��k������f��P>*l|'v��_�����j�/��1
��0`�f�(T������hh�U#���"6W���O���-����}����l����I(�Ns�-�
'�����E���/oK7��\��
��b9��'���\�4mt�O3�8Yf�G�K4juE����5H*�LD�b�pb�?�[�	{-�
%�E_���E�_�'6�;���Y.��EvKd[�U��9��l$��j���}��r�f+^ZY��),J���j��q�K��)_�`�L[�J)E�,�1�~,�N����b!5��~,r�q+��d�^w�,wO4��3��>��t+��<3��`x�AFP��h��������|#�(�Q2S����R�/+
s��>�:����Hb����k�m�*�4��{��^KY��p�5�r����b���Yv�j�
y���_��-�b�6b<�4.]�'J���+�%w�0�.�nV6a��az��w�������D�L�����U���_h�?J/+XM��~a��������)������ua�B�b�%�Q�.H�l�3t<������j�w���d����s���[d�:���0����-��^p+�������iFP�7]^%>�7�)����64��"����>�j7�� vT��fkF^�~`� ��r	���K?��4���U��y~�RkQ�U�E}-��B#�F���������V����kC�ig����Xy��Y����	x�-�^������E7����08��[p�X��e��s����$�o������\���Zv��ZX�������4+"��h����5�g�I=��e�z>lh�������r�RC#�cs�s��f/}Le�v/������E��N5,M�:��?��y��s���4}<��4���]X�I3b���4���������������u�(aZ	j�l5.�
�����n�l���r5)�'����������4��N/,T��M
>����fkR z��+������b/��j���I����S|��0$,,;��CM���[^��0{9h,t��Z�*��;�0oG]
*g�;
���{p�W�P�Pl�	�=��E���g�����l�f�X����-x��W!7+9.|��t1�7xaV��Ty���t�=a��W�v���VD�J�`GA�����A��b�<�j��o������i���^����Vv��>�aqd��Mhdx�U�u,���D7h�;�}7#e�����wKdsF����B+6PxV�y������^�x����k���e��K���TvKdKMAO��1� f�F��S���Vm�	�AO�7=�,�����:b�
�%b�9,�L���j��[]��L0�4��{�CT����K�d�B6QYw��r'�E�y5���}W���iUoV�]^�u)�����
A_�j7�ME�M4��&����������o���;ra���X��0�%���;2�8����*��6�`�0�E���F��y��;��lWC����]^X[��m��UCx���{�/�Z��6fk�ud��`�Xx�����W���=^�?4�%�R���"�=
v��7
}+I��#�B��zAT���A+Q�fU�t�&j�����P�rO�f:�N^��p6b`h1��"T��
/i�EAeWu��&MM3�%�z�Nx�^�	�V���u�*ik�~8�����h��E�h��d��A��N��%�j4Wj������X����'����oe~�����+LN�hA�zX�~���h��R,���
�4�J������� �z�����'fag������`;�h���X0_l��=���D����y��d��;�=e�S"�B4����[������cv?&�4�|b6�Y��KO����~L���a�b�a�a���X�V\�LE��^]�c�*�����!��{\f��i�a���Y��7~��V�bK
��]�����e�Q�a���r�E�(�n8�m,�M�*�k�V�"�)������a]x(%'z�
@#������?.�;)�p7��u&�'�7��Kl����l�O��E����������51�Y�4�L�[t��w��1'�H;��t�D>4������9gsf�f�VpUo��a����e��Tl�{Lt,�#z����,�}�f%�s�)�.��h/}��
��BEl%�uX�|���h&�!v��5�
�a�q�l ����X�D��n�`g��=�:��E_)����S��R�v�y����3��5����e��~�'����gMw��s�[����`���o��
�p6������Di��$F���Ruf�5�t�=Y��Gf��d�a\)���X�q+�
��gi���"��Y��&mX�}@������4X�m|T#^8-�>�L�h��R,���B��P8,u>��$������n���l��U&�e�N�u��������l��Sl��fX�ve����|J���K1�Bi��`9�@]�#X�{��E��vJ�Z@����<���<�E�:7�Wr����c�������5X��l� ,�=��t��H����9;Y	�X��i����!��YE/xEh0b�Bf�4%�=�������N�-��l��$
)RCX���T�aM�]�AwV8!����o���I�wJF���m'V�'z�|>�Y����Tm��U����&.'����a6�X����g�����E_���a���3�f��b�kt��
��5�+����l��dX�8#��=ap�c�#L��	��X#Cc=�	�)�L9�lA�X�x0�c�PSPl���zE���v���]	�X;�}���l�J�,DN��;`�+�/�b�8X��(%�`�Z���}H���P�^y������I��R��������Wu��;{U�S��M VU'�����Xm�g
w"����[(���L�Et.L)�0�Q��6����g�;��E���b�YKx�g��O���E����Jv�
�S5ix��Mf�n�l-B�8������duY�x@����7>y��M�UP��Jt����S__�n��a2E�9B|��P��d>e(z��R��Y����^%��.���,����t�_1��������A7��*mhL.x�{�]e�@6p���i����,�b4�?�Z*��6��z�J2�0���.�a����%�Z�����Td�������������Y�8�Y<�f��V�kdX
l����w<��=hZ�:�_�q��\P�-L�X���#�>��*�c�t�f����V<0m�*���LxX����0��
��6��L%>���PP%h����ae���4XZ���-���
`�T��pI,�����\��m�!SX\�1�(��1�
J�Z��"$����[z��������k���JaSm9*��E���FF�m)B���m>�

�`/���jq�n����nH)�`J�wbwS�
������K
�0�4X�U�9W���<<���hZ**:�4k��[2��yL���a�5Xz����-s/��\�X�y�8r���h��jy����.��X:k�L���	#(�w�iC�MA_0
3X��v��jyh��.��xX�y0�f��?��q%�k�c��Nt��y�<���I��,��+�jk-(��Tw��Mk-�"���L4��E�aW^���b�wM�d�'�P>�l!80�y<��i����9�[�f�g��`Z@x2T�C����0-<Y�D4��e����0����������~@��*����s6���\:��>��>�;�u'�	D�b�PZC��*K�:�N��:��������b/�'�!SxL�Nf�������|'�
E�����"�0uCt/$QO+�N��+:8�����N���E�b�������dz�s���>�s6K@���s��f	�b����M����)�j��<P�b�b��Tm������jx7�/�g��+��p�����/^��@�R#�H�n��(Xb���~�y�,��9��L�<C}'�|�����s����[�������6�hzc6����j���jd���.��Tv
;?��S��:����s����!�sv�f�������p
������Tm�A�D����"��9�ECu�����f�6�E�l�u��@4��������u���xM-�<��������l?�`���7o���q�Z�
'���vh|K�~_�>��i�����p8E���^��2���^���}�nym����)�������.��Lk����'�1��@[���=��u&],��^9� ��~X�����e��Fb��Fs�\J�z<��@4&il2�^���+a%kOVO!�����.\
,�<���h(�'vA'���
����9��l��a����M��<��r>����]L �O\	�Yly&�p���^��:Ff�f�%ozA�*f��$M�`{���-��'V�#�	�G�|�6�X��i��Ed��g��Y���B���rn	v8��%��>����+�r�=�L�X���J�W^Y�1t[�_��s�:�OkO��
-K�W�j��	���'�"�?,1�Y�8D�����a'M��bNX2/��*��Y#3�4�[9+-z<��4����/3X�1���qW%�h��I�P�.��N+&O���/a�sV���_��H�W�������'���`�bW�x2�T	$X����AC{��E�6����|�6�Xm���A�4���ME�^e�l��:�Sl3�u�aN�L6R,,�*!m�<��1��l�[�X������-p����U\z��hv����Ktm|�9W����������QX���A��Z�=��E�b���nc_��
�����T�`��ily�	�����:'ii���E��+
�[ ��0sM��L�lJ��M�&*��D�k�T�a�c�7}$�X�2mgR�D���1�W��9����S�V�	���n0
%O�6�%,t�I�:m�����d���s��s��ii\�� -l��q+��V����t���|%;gi���-�"��L��D�`�+�+wS��
#�A��������
�����[���>����h�rv�����'���s%!��&�
��v���}AC�D��]Y:kr7���n0"P�%�����b�ZhS�#�3�?dn�?�S�`������EC����{����#,�<������#b�{�{L��>h&^eZJ���kb;]���� -��[������>��{W$,w<�"G����*S�r����\��-YL�C��%k��|��4������������R�,��rpaQ��;��n)�Ux���;*��R��n8���]�Yf�N�yk�M����
����!��T}h0iY�&�-i��_�����������.U�J1��a'��]R��_d��.�S`��C7)�������,��\�=��z��>��N��+x����fK��mx�X7��a�J�Bg|��j��)������/��i���b��y\X[�Q.�/��������gwSu�EV�(jk���
����Yz��-�E�e��~�B3�e����{D/�ak�^L�����A=�*u���� t����}Z�Ph���\V�������,8�nx8�t;��BmA���m��X���Q�]Vg^LkMtg��e�e>.�*���,��+���3��Y�C�]��YVg^p�x������x��z�eU��T�E������c^_���,���;���sY�:'�V*\�H�f_�F��i<.���-��/�v�X������6*K�=X��GfqB�9p��6���Ro��p��X8�4��Y�w��Ya5���fE_�c�����!�l���l�fM�vY�
����ba+z����u"+s.��V��	��[��c����Y���/�Xh#J����[�y�+X�w2&v��x�^
�
C�����
7��tUv��s��D7V�/����],"�9^�G^L�t�3����b�������������
s���T����M�`��_��ke=kxy���"�F�U+E_9^L�X�=y�V�	.�
/V�*zm���`sO��S�|�;r���
t@�[��)����:�5�
���Z������BG��|V��v�,�Eh^�s��/]8,S��gH��L*F,�����R�0;�5���n����-��bt@��3����57�(�)tqZ�8^LBt��:g����x4I
�AY1�,��^��!��/K:�K+/�G!�JW��p6��F2�0�eie��?
[0���L=SA��5�,�s.(��f��i#��`Xl�],�=b:(����>f���b��'n��U���w,]e���Y�lYG^��4=%�s0��~�]$e.X3e^L�Y���n�6�gm�`{A�gYj����h�H��W�6�$�_�u�����]D���^��eU6�2�T��-����7�V�&[��^L�GtEj}Y�z��WW}7g�y��;Is�A�`����-��E�}-�)������[����CD����<F��
�eN'��1mA�4h8����r7Q[LXY�}���B�e�c>���E���D��,}���7=0t[[]["�h
z�*�`�e"-ZOR�.��^V�^��U��J�ACo��.��STl�D6����UP�X�V^LZYt����&�5��>���5I
� ���dX�x���D�A��I%\�5[08+f�qs@�3�^����f�V�Ih*��-��6X�4-�	6X��j�
��j�����_vOi�z���[hG�,��E��[TXC(tyJ{:$5�G������Z�w��<�l��.��J�����~n��<.���|�X��(
�������3n�j���+~<��.�k)�\�l�/��%�����-��.�B/�^x���0�,U���)�|�D����tn/y����9K���-��Y��^����
��l=Ae����%6�'�-7u�8o�������l����G%4n����c}5�:g_��[^�W^����1[���	���������!���l�����Y��}T��}Oi�h+/�TlK���t����p����0U��0�j�0Wo�m��`a:Q��������wA�41�Q��K�>��7"��m���zt$�L�u����~����V��]�+��������
g+��:�����+h�k�0%Ls�[����4�'����o�m�HT\PJ]V�^0�7���
����usW����P��bG[y{1�m�P��,<p��E��V���t�=���X��(�qX�$����i���5�S���0�H,����K���'�kJ�r���A��VW�<�R���4Zz��M,IV~D�OL[��5����;������h;�N�?�X�C	����6{���Yd{��D�.�.9qi�Q���H0�������S��F��;����l7��S%�����2������y���j_������#��i�\b�F���e����fil?������%/�nx8�Y)VyW��U��>������h�gWf1��g��s6���,kCd�:O���.�(%�4��E�>���;j�]�|��[���We7�W8��Q�����V����2���f�G����������g-<���6d������k�F�'�������f��0����,J�o\�����?�M��gz�b��y��`�	��L��&�����jM���v@c�K:��K?�����~����Z_���df
|������d�S��n8�?��� RtF�}�l�J���f��0��<�^��b?�m'��lz��������mh�HZ�i���/ud����)�-n[HY�4��1{��@�����;��|^���A�������<���%����+��AUn�YX�l�#�M��:4	E�����OW���*3{��A��L}0���P4�Q����w�V��u�Vb����T�9��������,Ag��?�:+nw�f9���A�A��l�9���9{������&���i���M?�n�>�Q����<�����fL�2G�Y�7U��(��4+Z5M%M�����Cz����O�G������y����l��#:���`ki���Wu

����l���1gsK�����A���Q�e��f
�Y�-��6c��+��\/��I���MC�������c��A7�Ul��|�#�`��\�����DA��f��G3R�5}���_)n���@��0�L��H����+y��i��_���WL���f��z���������8�7���z��>#�}t��>m��fi��p>m�w���SUT�����A	��Y?��G�n�>nPE��n����v=O��|��
����31��}��k�>^aP"h������,e4�
E��v?��u��,�SzH����l/\#�8�i��f�fso��T}�#�S���b��7�	���}�{��	������`$#a��
�m����%wik��4�zn4.L��0!Il%���rCz��i�XX���Y��M�n�l1"%-�
�jHS����������`�J��0��U["�k~f1����&��
#��v������w�J^�kK��}A�Q#C{!Tt+��
Fx���l��9l��Y����h���P	[!i��#P�[���5ahp���z}uI8g_h��=���lk��+i��8K�9b7U�|H�����-ba���p+Q�a�	3���\��3���[xH[OH7�����`�;@��}+�����4e���E-
�������JI���#���EbH�,���G���)mv�Z�1�T����E����f[%��b����O4�Qj�w�E{Q����s����fy�mTX�7��i�
&����'�9��c>���b��0�I9���M�����?lN�8gi������6R�=��;���M�f&t�]�9����^Ai��{F�w�4mzA��T)/;�%f�����=1L���V����6X(������H�����s���M�|��?$�o�J���/K=�s�����az���'}��CB�t�����f��m>�8l:���l�vm�^D����0�����Y�A(&KUV��"�&K3f���o��������v����X�'~�p���j��2������S]\�0iC*��d;�	��b�5^�*�p�Y����9�+9v��&�nI�����������_K�s���"}U#>�|���l;A7�hX�g�c�U��O���j�.�
��U�d�@bW�V~Y��bb����f�6��wa��h�?��d���J��e���e@�nLyJ���3�����{1�_����mI�c7�����	����}XxKlgW0�,���[�d��|1�`��%��}
�
���/�F'�a�o���b�,� vj!/k$_�L]��SUY�i&�j�-\�/�:C9o�!��:�P�T4���������X=%_�5�aU4�we�B��D	���n��[���,u|�@��������Y���C$�\�I�w|1�c�PW,�{1_��������-�M>hH��>����m��;|Ak����QE'���A�������m��p6c�4�A"o
��/�kUl�",5Bt��g	�nA?�����<-o�v��v_8V,��>/k�f��p�9���Vl��w�i����D_���#3?�Xz)�����lA���h1,��������
����� �vY��b�����*�]T)���W�_-]������s6w�>g���{L��,��4tY�����������4M����4u3U_�*�t���e����Rf�d����-(^������#K>���������5�/�,���U��,����.��VS��,�E"EO���4���@��^���T�^����t%�����j�DS�YlA������B����#%$x��P���K_����u}�@��/��[�,���DO&�%��oB��8T�H����-���/k���3�M��K�1]��s5��p7vt[�	,�{1�����m��u/��+zz_V��X�����e��b�\��V���,�{�ri�
^F��R�bo���/�g�p�����>����/����d���\Y�l+��^V�X����D�vx�[	�Z}�b��su�9�����E�5��\��X��b�����X�:�����;����E�����[�`Q��������{LPLCAt����F���@�X�������������eA��@i���������bJ��O�����	�bY���^qY�����.]9�m{�m]>�����l�o�e��~"�?��#CoW�z������RGS)pa��N�E5�E��/�	���x�\�����DO�~�n���pG���b����i����
g+�~U�9����!P�����n�S�������=5X�����u�/q
�.4���|1
`�0�SB�0��������- ���.h]��]�DwX`�
$% ��B����=�A����p>��(�������(�
{����]	c[�����CI��#���o��,m����y����!��bEC�O�������p��]h�wY9�b����v7�7~��/�+�$"���=���pS�7�����!��S�������x�n8�7�H%����{p��d$\B=�P0W�J������a��a������������,U�v�u�r���������$�����7���&�#�����A�ab��5a�TC����N���d���n�6	`���"�����P���/(�4�v�����d�[,�Ji,	�/Xj5�-tu���Hk�������|��������O
���>06o��c%��]�����+�|�^�\ru^#�
���s��9(�%�-7v�`��n��F��OR�t<�F��K���F
�&]�������g���l��;�Z_g����
��TE��
�m%���t�'4�}X���f�W��|ibG���-�u��.z��X�tyU��v?1;��<��Uo��e��9��MZlg�tfS��n���2�Dw�DQ����b����m�I(Vl��'b�G��|���mb[A�������&E���:�r~O��21:Xb�'��q�|�B�+_w�O,��*v�����i��-p�H1�J�=�6�Y�n�^���b�7�����l?1��y�;g�.��l&���"=n!������&M�;��� As[��fR���[	���A���hj�HB>e��
.��
�7K-
s��N��#v�"o+(B�h(	"����a���{������.Vtn��g3�$Q8,��x3�F��M{���n�>�Y)����=g�8�n��	X�T�bU�b;K���i'�=��fV F>�>�4��W�Z�A�w'��FU�=�A<gG��m��n������ok/�,�E4�;A��wHj��m�v�kC�IM��0����v+���K�R�0�Ft��
g��i>�n���b��b;Kz�[a��O�un��:�7tm�jW�.xv�$_���[��l	����c�V�B'<V��9��l>	w+d[�)z���8��i�t��=�mE��)��R8�O%"j5�|A��`��ey�����&��=��"��1�[�wl�@8�^(��-�y�hk�0�Rl�'P,���qM�n+k�r��-�K�(�	h�Z��`�XY3���
'�JJvAG�=���1o��)zUv+\��a�)^�YX#�����f���
�>��s�)z��"bt{3�L���+�z��6E`���kx���)B&���'Y#W�Vt�
e��Nx�����_�����y?AS�$�UPV�-z�t�����9;`�P����La�Z�Y3n��6�`�5� �g!�,�x6\��|�>��(��;k�,fv8Z���&=O�J��h��h-��i���M����rb�i����q+�k��t8�6���`�i��~���@oh
O�@iP��L���]������AS���K������w�i�
��
�.�v�P�qa�@���k�V��64�$~
2��H����8yny�_q���R�fG�9{�4�N�*N������s�Y����������=���`��[ECn�P\C,�������4�w�k������z����8n��:_��
�"���V�i���a�����b���.c=0����\�,O{3yZ�tC��l�6�����1�K�����b�b�|��1m��VI������q�����&����v�k��u�0��#�qi��X���9"m�����_����!(Ks��V�,)��V�+$���Vd�����~��)	a��,���5�v+d#���a��F���FRl7/�Rj.\,�|3u#�^$�������ww�B6��;,h��&joz�tWy��������mI��DA/x�J����}`��X�5[0�,�M/�AC�H�4�B��7{�����7�'	:������C�K�
V������x_
/��J��r�7LzBwX���������`G����+�N��H��W�!�5�O���o�S��5A���Y]+�g�����*���@�@�']���"�
�_�H�Q���a���ox���i-|��������?�B��z�7�����U��B5n�?i-�\�8��?�[8�-����x�
�1.L���+)��-H��+h��
~����l�{��\�*m��KJ�9���}�WJ��}
�ok����C�N��;���1��.����������D�E��X�������1mv1���Rq���L�%-��F��7k`n����btF��o�4p
zMnTp�����`��7��4��-��
h�6�Z�.h-K+���0�+������a
M?5H�U���b�s��5.�e��Z)=v_�����0��T��,��r��`i�b}����	z�EWh|�7V��|�6�a�6�����1t`,5�����p�W�q?X%/z1�n������������Yp-=n�0=k��/�X(�*6����b���Et��q[��)���A.�����`B����^b���-H�<n�{D�.t�y�/��O���|;����: ���2�e��XX='v����'����wzy�{�;��-f���������7����oba���Yh����b=����r���pA'���p>#Y������eb�����rvK�s�)���X�V��.'����:~Y���7����Z�$��]
��@4�����}��C�dy���[Y^�@L�D4�f������zban���������
K��^,3Glg�����m
r�����f5�b�>���y��(��7�57���S?=��[+���p���3i�P3L�U����-�m���
���p����n����
�DCY=��k�X��P+��S�� ��
����Y�b��3�V�Vl{�0������6���
�f����~��Z��%��}KwS�]HACS/P��/6�����"R�����:�����m$gS��3�����qz� ��������/����j��Tmz�8�h���7��������:N�_��*?g+a�C��#��Q��
�I��4,�V�"wW���Dx��A�$��f��s6���-��6��#��B�A�(���O[��y�;�����_�rm��	�n���X�hfzn9�Y�a������i����E�n?��Z��8��$xf��M��4�R��[I<�Vkj�����)����
��3p8�]��j6�U�=�����M�+�
��<2��{A�0�QIr_���e���-�.Q�%����N�%���d�Ew��V3	xf5��Hh��X��A�����
�W(�5����J��m(�
�>��I�g7U[L&F4��	�a��b��[2���a*�'��6[8��J�����=���Oy���~+n�Qp����YE��,��+]a+o�M>�R;�
v�%�M�&��/���D�����	A����Y��sz5)��R�������*���i�-�����LC$�|q�L�B��s�
�~Q�UYO���XO>g�wa�9��zU�S(Q{�(O�����/Qx�h�{U,k�?L�^4���zb'<���8�U���u8\8c��h�8�"���E�~�?03SB����_�m�/(��w�w�r1��^h������T�������5�3I�^&^��L��?L Xt���`G��7S�R�Y��z'�sX�!� 4�Xn�a�N���;�����:�!����cN����E��l�����+�WHe��{U����0�f�&ZKe�4����*]X]L�Y�,�?;~`�b�^
����<g�B���B�,r�&.����	���o��$�\)��P�]o�a]�����Xz8D�:��V��VJ�>���$w�`|������1m����Tk�������������8gi�T�t����3@%�\Iy�X���f����B�n�g���sQ��h���52]�(����s�s�-�� x��_��h�y��f��[P{������9x5��,�>g�WI���&�����F�C��0�`�U#��&���xv�i�

�g��00 6��n���9`r6�%�9�V�5,[����C������>�Vqc[z��K�ZzK�W��f_z�JN��0�����i�
6�*��j3^1��6��\
�0�]��O�=�PwKd3��I"6yv��&`r����B#��=�L}��;�#�.x�q4W����XPQY�Z�Q*�S��i{��4��6�t��-���K'{3C�O����]^"8�0&
vO��kc����.+���*���u���X�nu�.��D��q��y8�p
o^bo�w(6���lcw�f=���i�ncz��/�L"�B��Z��i�����fY�V,�m�'.X��������������2�vS��*�,# ���b��n��S�/���Jb���������|���[����f��kZM7gZ^���YV��-���U|��p�0d
��&`�
�oxX��-,T�{U�f��6��%��6P��W6�3�@l!;�Y��1!^���m�,L�F�s��s���-�07��6d]i���j�X�����h7�O*h���I�
VL)6W_m�J�0r �ZZ�?n��-W�b�i
{���\���j���C���L�L���T}:C�^�����������u�����
����0����bo��*�R'�, ��5=hX�-v@cY���N������D7����9���Q���������� �?G��T���m,�F�d�kba�V��)�^X��6V$z��}7��tV�o�-L��	�y�B��f����N�|e��Y
��V�LX���C4���,�Cl�d���+FhV-l�V�l��mmJ8��U]���[���!B_����9�u��.���A��[�u-9�����n�{L��L�Rt�����N��U�nV��j�����X��A�����P�]�](�m�l��4L�
���!li�l>^Y2��/���;�YO�H���#�J��iS��u.b�e[i���/�����V	JX��m]i2��|Hd�^0l���M��
��XN�X�u�b�*~�B9W��ac�:��&���s��eB�1�f���R/��F�����@w��s����pK�I&�"v�!���v��bc@�']��4��j�^�����76Xh�DY��������lX"LO���������l�Mxy�M�Y_����f�n�l�A#A���J�#�_����������nqm���l�����v&=M�WG�sv���`a�T�B/���gZw��}��C��X��Jx4]w�i;-<����`+��`�|���V��6�z��b��+����.����[ ����}���
�[
[��m�,m�z-�Q��F<���jic���+�{�o���W���i3�i@�n0���_��������
C��v[)��jcR��/����������'�Q���A��+W1K�6&y�� [*���W�
��[������Z������E�J+,�v�����l�����b���ie�z���ml������4-S
��Z���ql���-��/�h+z@o�X��1x�?�4^s�8=���C���q	�\�qm��3���!����!����a�Vo=���������6&�+z@�E��4����U�U���,h��%w,�%W���4�B��fa���0I8X�v�se������L4�\K�)4n�H�(-5�%K��j����G�h�zd=�7���
g��%v@{F�V�\��m��/}�"��6�@��[I���o�J<���:g}y��X�������~�ix�
6�,wS��/�A��g7�m/�� �WX�=��p��:l�q����.����n�������,�����ElA�YW6����E����[��&�-%z�S�^pQo���,4-�W,�N�I�`�b��M���O,<[)K��nc:��{i8�����,LZv4����{\x��,w�ks��-��o�����]0A���&V�r�[78+��'(U�q�������=�-/x���/�1U8��\A���b��%��/R���^/x]�t��-���������
Wl�1�������Z4�g��m���}+�����,�%:�_��/���],�lA��[�*����8�V���H���n�����D/�5��Vt��u�;�
�������bs���c�~L��I���6�������xb�b��xGn���,�J����N//�F"�HO��;<�]�xc�z/��-z�_3F.��t�w8��nJ�c	���<�t����fS�=S��n8�@L7X�`w?�,�%�n���tuc�*����;+�
S��>�� �Oz��R����'�
�����S�7�eb\���/U����ncY������u�f���{L�m,!\4����I/m�BC��sg3���I,���L�����Xt��<g��H����hv+d����E�d�n��ugye�o���������B@��tgq1����2q��BE�K����[y�C�`����Nx����������L�����6�XI������&�?=+����;K���n�Fx�.D��e���4,����;���\FL,�a�V��,��z����a(_�d�ba�P���W�^���n���ECEI��6��Tm�@k�Y�����n�>������2!���M�4�$�`VZ}�3����52��[QA�V�����aI��	/�O���O�vM���g����[���	����;2}�K��Y�����6^h~��6�Y2�i&S$���\��vB_k���n�����E�0P����&�Z��%�I3���,�MMj`,�3,,`�r��Vz�t��CX������P�E4�Q�����=LMk�B��%���BZ��)���.�L����h65��4�P{3E���=.���Z�������E�4�_�V�����L��[w�m�bSN�n�64��%h�oo� �dg����D�/
46�W�/�c
���a85��b���@g������[������O�Y{w�X�'�^�������!�_sf/��\hs�����2y���V�&*v�;�{\n�m�aBG�}y��?M�{�������-
:L�Q��U,��sGw�i���������������b�8��NI�?9-vS��;:w{C�����l���r��
J����WA��[<���_��	�x�����Yx'�b�,����^��Z����F��Y�[��,����3�	_"���y�|�����E��W�V�17����K��%�����.E��C�}�PY^lE��[?��}�:�`a�S�4��s��	6��&��\���,f"�\�Cl���=�m/JzB��F��T����D��~��r��_��9�����.����{��ha>Ad����D�`�����������s�^e�����a�Z��*~��.�l�B,�m
���h�7�
�E�8(����5��� �~h��O�H���S}

���t�.@����`���IDv��6�$�i���vp����8����(A�J&���aq���z>�'��������b��N7���hkdh�i\�K��[�[TT����/�a��5��aa���K'��T��&Q2B���![�{F���X�}��f����?�E�L��������'&�/:'�X��
�J���c��U����"��C�����-�q�V����pAW$��b[I�^pw[qCZN�39y��.����RMKv�]0������a��g9�N3"P�&�	}:�vx���aD_s.t�����SU�g=�&n�i�"oj�~�7kj{I����g�~*���v��"�\��,����oayI���d)c�b+%�����E����mb��/����k����R��r�������4�2�YI��~�IH�����d��c�����c��?����������:E��9��v���H��d�������%�)xxM��g-�����4$*}u�ED
�D������_&�.�f���+�B-p�����^
��b�/���f�T�����O�iG�)��[����*�+�2��'�v@�s{��P������DS9������zC?p��w+d=V�/���N�y�+�?��N{����Z|�eG�����N�Y�����_l���-������F�7��-������f/SK=��i��	��l��O	��(+�[��b���$��B��u���EoD�<��jp�>,�O���b�B��u���XZ������d��S����hx���,W[�`�b���*,�
z�[�8oK��w�K���
)��6]~v�k��i8��X��G���`s��������nu}`�7��������u�uk��id��"���B0��P{��-u���|��~�����4��-^x�UK�md���/QdV�j��(��2�G�gD��@�������g�[^_�];h%�P�R�q}������_@�1�LD(,�s�������_���v3	8��p(���n&;���h9��������D��+��vS���b��s���e9`B�X��)m�����6u��
g�5�M_%��~q"��J���>0�/z����E���%�t`L��`�-]4vS����:�����U1@�\��\�+I��3n�@���
�
} ^7Wx������7���I��ty5n�svw��uW�X������0.���#D�����z��������S��R9E?0�A�
X��X��U,|"�Y������0�?�4���0"&�<�����6c�8��Zzj�P:pm�@��������jM}��"�b�S.����Z�.J�;@�x�0��,[�@G:xwOi�����n��_�E�s���B�<r���l�0�~����:�/�?����v�� �a��$"�v��"�����J��J�/z=`��T��
3�	���d�_+����zBD�����'3��z�[�t�+nk��J���"lP���.��]�l���G_��L}R����;L4��.�`S�3��q�B�����/Le���X�P�YCk2�V�N|���8��E�I���k�tX�%����pvS�93���=`w��h��]7_����!F��T/,�Ofx���d������������2��,��[i��Zrv�=��nV((6�+l���4#X�0�O#W�,�w����4�������wa�����D��jdxy�>��L��1����&���AC�z��~g1�b�=�M�.���L_���D���3�EC��UiUa����@�h�%+vU�y�8��;�T��F0�^�s����D���[~�����F��I�����gCdb�@V����R��~�`������l��k��������&��
�.h�k��4:�^y���{c�n'C�Ql���sn)��["��0�E���s=�<�7d�+�e���4l� 6w<g�t���6�a��������8X>c�0��T�^���r���������SU��"�bi��D�S��nym�(c�5��5%t^1�,t�2�s������h8�v,��S�X�Nl����+�Z���[^���*a�SW�.Xs�e������9��#|��C�'.t�{�u��F���Tt�Y���]�3Y����OS�|�������S�~`�d�7}��5�F���v�9%����&�������c1��J�v��R!eYx4z���p�l	6���AR�6_��^,-r��_���j���9
�|���,R���;���lE�^6��^h��Z���JZ���1��xH��>_K����t�����/Su�Tn��Ha���q[���^)m{�����+;��Xx�6!����_��_U����d]����p�(��
��>0)^�� ���auV�Y�~�����H��_G�n8�?� �&|2�w����I:A7�mv���|�`�������E�hZ:�����YW�"06����=��6;�yL������	���;g�sW�]�f�f�no�7��B�*�0B%�*���C���\v���[���	����������������],�"�b�)��	�m����8�`��Yf7\�p�����x�Z�����h�`����}Zl�;�R���t��*D�����uz8\�m,�wdx��/���1mx1������b�{R���-������.��[l+�n�~�y4
��`'<��}��B�`q*�-mD������D7�{*�	)
]���)�]+�h]����9����R��.�Z�q��a���I��L�9{3u4���f��sv���nym��o�}����9	���D#�W�A�-��jxk:Y5��l�����o���������h�s?��
�R�pu�We�n�lf�SL�py���u7U[|�]'9jhM_�k���n��cZS6"
c�9c����b���[��f����(E�>�f5����0��4�
�h����)�D����n�|�3Mi���|7��H&�,����_����^�����*Z�L�Z�d!r������*b��Y��������f��P%|�0dX�Q,�%�.�h���Z��p6(�N�h<{�h���4����J2����z���S�I�l7���=)�z9��]	X�{0n��K�9;+�=+agA�����
v7���:��`�Xh�e���S�|�D�d�ZJ��8����%H+^eu�eg��^���"��7��p�����,o�w�|�+��%��="��m����������l���Zgy0����\�U����<`�Q��A��@;t�{���g�@��6��=7�6�iR-`{�����F�9�����lV^�M��S=Y:����1[�����`:��a/9��h��u��t8�
��T��������u�vz8��"�m���	���E����6�dy�7"����r�;����E�����l=����k�"��J��6I��c
��x/�u��s�*T�
�axX�+[�������i�
��fI=�~��n���$w�Y(�"�������&��E��J��b�4a_��0KC��}�aYjz�������|f@��O�6�E�M��
S��~������-V�i���E�s
U����v����Xx���+�zKa�
�����`[y�l�:K����&�6
���M3��U������M3�I]HC�6�����o������}���J�e<x�][
�[,y@{'�;�kv��X�eAOX��*D7���w�����������������wa�9�|T��]�
.�XV��b�
o���
���k���a5\��O44��qU�0�x|��w���I���e�^�:u��$\�������\�4��-l�)z�L��p>��^��M�`+Bl���V�Hz�������DE��0��v����*,
W6�
�f�����Sb_�x����x��Tm*g����VV����5]��Z�:���f����([����:`��V9:`~V�t���9;����]���:k���:�`���SkdhQJF)����
6]�v�k�^�����I�����k������*�UK��"��������9y�R,}���KKd��n�Kf���.���v7�iU�U��?|(-%�����0�S5��d�S�*�f�JE�X�jE�x�W��x���g)����c����zAO�YK��2����I�A7x9Y�U���V8��*;����a�fn7U�|0Wo)�N��LH�c�_)����S�~*��_}VX�4=,����RM����+SV������S���0�%�����\�{����g���D�S��L+����pQ���h��H�P��5Zp�M��N��*z����VP��V,���Stg~v�,}[�dz�bW�H�VY�L}H��$'��l�5[��9���W��0u7��p�=�s���N������ny8�����b���O���5��c���c�OX�'�t2[s2=L����#�j0�7���j
�%�E�*&E?�C�
������d-��j���z�?������&`�4�P�G��r?=k�{y���e�H�+o�
�|���
Q�J��-\l�]��$��f�$1YlH��
�����6����y��������gw�xd�`%��fB��Yk�9��9�"�h����fAEdZM�4�e$��"�}��U�*x���?'+�
��=2��-8��eG'�]�b-:YQ��'�`���>�~�s.(eO���d�i�Q��
gU���m��A�n�l)�����<��a�\��{L[lL��4����i��M�V����n�S
�U�0�����O�zX��
H����a������X( 6��o�"��� �����#4D�<��#h��yT�Tx�-�9�eF"���{�z��yX�s2�N�^H42�D���9�Y�����I���������O�`�nh�,:.X�B104_�-��N��NV�d���8������L���I��/D7�1����KJ��,�Ul�dhZ�t�x�h�w|&O5�I_��1mA'��U+Qi��N�MiR�,tY�
]	�V'����-������Z)��7uX��y�B��Dm�@3�)���S
���;'K����d�c�
F���%��:��=h_��v�k�eJ�.��M��N�7*:_���,_~�f��c��`U�o��(�I/�n�>��� ����V�Z�8�i�T�S0��
c7�i�O��F��VR��&aW����g��	�6AOx���wA�"i�9
y�@�&�s<h��+����E�=,�I4nJa���M &�*:�G�
g3����OM��N&U)z�zJ�PEV�oO]��7�%R'+>}AOw�wAfpZ"v
K5��fb;}��W�������V�"0W�,F��i�������+�q>�%R�Ft�Ep��J���F'�=K�~]�.&i6yv�i������qD
\��Z�v�=
j�������������Ty��F��ie�l�W5�H`��+���Y7�����o�A?���~�
����Y�#W�U	~Z�u���c.���)�����}aIT���V�a��/o8r`%V���;�F��M��������DC�;�+�/o�j��t?n��{�����A����������s��h��	����j�m��(��H��R�a�^�l@t���XX��
o,b+�s�
gU����p���$��8��v�bW�����9�s�K�s7��\h�]����L�Wt�/O}����{'���xf�=Pd@��N���?�����r�f�9�z��������F�|a�S�P����V������`�X�77�?n�<��D��e����l������U4tc����tp���t�������v����[�0�Ql%���P�U4MX�������7�����
��`L����M��j�O��4-��0�L,<�g�����0U���/����o����j�PA�p�T�7�F?��vOi#�.j0�*X*��q+���x'�
����C*R�M.��c����A�~���l@3M��L�T�MW5�� ��EoE�	kA���<]�R��gB�7�{�jUG��;���p[Y����$V��b[�������'�H#���T�*�V����p��>.l ��E���%x�G��y�n�l��TH���+���;e��	m~�0b,
���F�����,���V����3��n0�P#��5���G�?��Hsr
g}�F�~+6�Z����S�wVtgV��B���F������p-ZV<�
�:����k�1�s{�s6A{���������������b/v&���(bs3���^"t��^�(��iywS�*\��Y��X��J�(=��c��g�f:ba���XV�^,�^t+tM\�K��#�a��Xf����0�$6���6��2
_�`�4���Ois�%����S���9�jKEW���K�
~���e������a�w�9�f7U�,�/:w}>gW!��,��X�L���]<2�@���U�!������e�����ED���tSH
��=rb7S��.�
���V����i��z8\�_Y�������^�=�qU�����������Y�Vr-K�.��)�E@�^,��,�q[�[V�],�L4,���,#U,s�
��.b{�S���M �l+�C;V#�K�������w�����b1�PzO,0
���q����V��"=yw�i�B�aY@x�Msb)q��)�����+�h�B��[6h��Y,����]�;�5��<�����h�����c�<fE9f��<�JS�e�d�q":g������D�E�,Hl��}��,�+��x�-z�Xe�hX���Z�����b�~��*�������eZ���D�Y��@��j��:�s��X�VL^,�Kt����\9���m �7$�m���MZ�W��j��
��;��{�^��'�u��=6
��`���Xv�yW���L^��4��H1�A�0,w������W2IG�������6{�����z�B��j�3�
����bYf�Y����7�`sC����FeuO�o��o����q���������A�
�� �}��n��6p��V�����eE�o
A�0v@��/SJ�����J�FF���d��^0IG��C)X����Z0����N��_�-~qm���qY=�tvz��YK���)�R�o��\���j���^���i�������.�Z:L���-k�/V�-��K~�Y�z7U[��bY��]V������s���y�����
����,T`��w�ic��^Jw����%�����Im��E�e���K_t������b���/V�)��f[������a���J"�%�s��p��KB�?X(��q���x�;����Y^k�/��(���0�L��0��q+�Tk���l�SD1�v1��eiy�dtOV�n8[O��3h�Kl���M��3
�,K_��Z�v#
���������m,���qS�u��6c`�A2����J)����_lE�uY~A?�$�a�Q�0"���K/Vaumj������m���p�����\��[�}AO�U����^��oX������X����|����������a�t���g��^��X-�fzXy�}���J��Tmz1�i�Y�����|R-/�-+�/��

�`X�!����%
�'��/�(��v�X���A���`s�nqm-����j�t�B�W��hP�e>�])�����2,���-��~7U[mL�wY���9�F��6�P��|4K�/��:U����`�]Lr���V,���VJS,��`]g�w�h������I�k.��J�������p��#�Q@�3h7S"���
)a����`�{���%`(C����T���i���4bE��Fb�JD�
fvKs�r���8uLe>��Q
��
���b����n�|�C�~�����}+Af��P��S�	�^���V��,)(���o���P�����KB5,_L�\t��Z�|A9��#(��n4nJ��=��	X��(4[�^00$Qj������YW>
�*_b�P�A��0�.^���

����q[�Y��|�C_c�TUI��pQGM|{Y�:o���E�t�idx�[�vXYzA����y�v��Kw�8��&��=���?K�C)��Y'R���F�\�*�5M�l�����3[hg��^!���f��GF~Q����Q!��\P�[������t�
�<|��U���{8r&�nIb7����M`���Ux(�>��������e��e��fs��n����"� |�Y�,G���y���w�����@6����L7{���>�PD�4SN6�q��Y��,��4{����>��E
���Q���wZ=qe��|�"Al��������t��G�7���>�e`v�]��q���E���~���o?�-
$�mz %I��H�l��v�A^c��������>(��<���l� O��N���d���,�������t�g������F����=�^Z)�C��V�+[^��r���P�����s���f��z�`
��L7��6�z����O���F�6�P������
g#E!M�b���+��E��A�I����,�1��U"9�s���.�F�������e�?�
(�km���k��|���_zv���c�?��/T��K�LK�7=?�v������c+���>�3`:��=gY�V��������`D�r����s�������
�MO��
6+u��j�	��~��j7���tA��������\���U?��'$�m�A%NfY���~�1����DeMC�@J�� ��7�qK[�n�ly!%n�,{�,�N�U�}��z~[m0���_<��U�4����I����������AC��#]F�f��s�\���mv��t����b�k6P��i�i�e�I���U���P>�i��{`��Xy������v}�<w�ks/���2������nC�z�z���-��1������r��f&�E6�
	��N�fs�������q+�m�yK_���IV�n8�H��t�7�
g�fI��	�R�FEfs���c�Bu�a�G����,��K\��"���D���!X�Z�w\�D��m�9���.��&t�v5I���x-��6��&�gxj��[m�6��)"�d������m���Q����r�u�@0�%h��
� ����n�.�B�����YCo��|^���A�(�40�����j����a�a��c�*��,�������n�����p��lyAE�3}!��l��c=��%��`��f
�,$�|��f�{m�������[�3�tvS�-��A�fOfK�����E_����2����q�s����<�$z}kb��,�����m��
 $�b��_�X�����{J�0���Ue{�*��A]�o������K��*=1,����e�"0y������~����~��������	MC�W����'$>l�	���Y��4���+;SJ�fu�
/JR,�������=\fW;a�P��Q�93h��6��[N4L4
z+$�L��3i�B6�`����=lA���D��c`2��:b�N4l�C:h��Zq�
�OH=�t�	��3�����b�D����q+I���,����m��e��YI
6��-5�	C��>���X�f(g�bW�jCz�����Y����pm#�G���I�����k�n�#�V����a�`s��num���z�xue���is&��� ���L�B�N�t��jRpJO��H�4U*�6\���:����@GE\m������'L�[�f�6oa���v.�������������_s��|V�RV2���B
��g��c��$D�����1���I����#�v��2��:h<�=�>G�~7L�p�	7�^���!������1r�H�AC�����4Xj3�Ug��C��+.V�e�����M�*���7�9�D���`�g���D�z���CZ���m�R+��:z�;A��gd�p8;���p��?��R�I��������$��T"1��	���f���N��z��wvd���q�
�6�@�������d
7�U4;`�N�����.�����������6��P3�m^�l?�-���[l��s��M�b[b{�X�]�q\�`3����&b�D1m�6��{�8��f��)7����E���+�q3�������hv�����������>#�O��w��m�1����-�������x�/
�D��,�����-�0}����o������u����'���J����VF%v��R�/�x����D������'����Mx�A�M*�,�4�*9����ryD��V�'��o	]pr��5���	�aY�h:[Xk���L����������)���~ED3;������$�<�,�O��,+�
��f����u������C�������4f	~aIL�F��fl��"�����p>�B�`y>_uB�Y,�/p��a����0�5���p5,<�B,��3~���,�	\���;M���M�
�x�9mE/�g�������������p���4�]��Hl�@�b9{�����p��a��b����m:�a������jI|�0�\�����,�/�kYuv/F7}���n�v��E����F�bS_ �"�	/:�[�^��P��b��Cl��,��a����:���)D���������Dqa�]���|�����y���:bzu����o�9��O�o����sH7/�~2�)���h��_q�t�QW����X7^�:���
�iNUp�*_�t3\l&An��0�8\L��G�uV�.6���
x�;��Y,�.0��y��m8O��I�4�`�����r�va��@�p�(<\\l������.��	y�dm&�Ym�P��!���.���wl�.�S�+/����P��.�d����`�FI����q�:Y��.��Mte
�b}D����<k���
:���U�0��i�����,������bv����Lq��M$�7���	�0�����6�#���o���!b�A���L�m5ta=������n��	���k.��oW���I�D��	�&�����XD���X��,]�����`3����}D��?"�6��l�"����`n�b�t�9���L�o1t��
�p ���lEO�m	?]��0m����$�>���Ku���,����}�$�b(�Y�o��e�>jE.�j�ta���UydXqlO8K����5��0+'�5,B�,�����'Xr:e�as���p������8�����+mo�j���t�l:	�a�1_r���b�u��W�t�?�?��v��!��M����.��-����|=<�;{V�}gS�\vCC��{��0�/.���*��������p���{�rp��G�����������>��������������M{n�
�OI�'�xZ������H��	�`�&y��*�v����t\��;��N�K��x����8����]��*���6�rx>�H������]�5I4�<�)v�lB�p����0���\�M��>p0��8���:^���#?"F�����:~���Gq�������6��}����c:~b��
F��2]�P�� oxf������:���}����E/�,)�u���r��I��p��4���y$��R����;L{I�3�KzD�&�5���\�E�~��6:Rk���3{�MO0�����.�����P��;�?Q^�}d{�������x+i�]�# Xv��%���m��>3Y�a,�b,��L|�D`6�Gs�����FR�L�����c��{H42L������MU}Z�]�� �vF�b�����q8^�%?4LWh�L��r��u��;+1u���bQ3<OV4�Aid>,��IKt�=�a����M��#����>4�q�������n��SK�n`�����L��z������K���7��s��������m����:29����fZ���.����f�xw���j�se�������g��;;����m�&������Dl���Z�\Y�,�<S�6\�p��#z�t���2fS/@�m��"���`mOb3��W[��[P��Z���j�+q�Q�������s���p�������O$�V"�%J�������Ew�������jypei�P<,��!��������Z��Mj\�����yu��#$�= G,K.������x�`����6M��.hX7.v�M0��&�����^=�3s����D?	__�w�.D��W�"����D�=���<���*��#����Vq+�X���u\;|D2�pf��^<��/Bt�3�zi��]��	V1f�I
��Z�,�.6�K����|�h���������������.��s��-��)*L��/��h���<��+�*0���~,|u"#�
��v�joe�^�g��m8�L,*��b�.I"�f�-<�RtO�Q��������ib�O�wv�uw��pv�+��^m���k�9=1�[K[Y	��J�:��=!��6�V2
M�bY+�Px��������VV0(���`�6s�q�H! �ITW�t+���`�&����;���O���|��<��x���u\�"���eS�5�<�����������Yx:��:�����2���s>���#Yp�T�O�X4�0
���]�`����qe��bx�����T�a#���
��.���p����M��X-Y>1�6\�F�u�Ku��A?��D��s�t����,�X��nv%�#��8\��/�pc��Do�c�����;�����@�)KM�o`���Ih��hnFH���ux���OH�sh�n���"��^�C�O��E�}�`�$��&bT�����>'#����B�z.�
wC�|{�nO�a5}����`>����GM�	r�B�2�����{���7�t����M��J��h�����O�k��e��]�jY���0���]�Lt�,��>��B���Lr��p��
7m�W,<���T��"XU~�z?[�0D���g���9��vp���i�M�p���U��w�a3����V�XS�X�J6c��v�W��
���g7�S�*?����t������1Qb���ljrp���������h�`��xk����R1��..9qjF�nz<EwX�&6��1�2c��K��k��{��t{B��jAtb�����D��,��x�D�f�v���)�Ob4��0���>>�N���P�	]a#���0{)�3�k
�;���a{���}�V�M�q�7D>D>�<���t(Cuy�aV��\z�0,M�M�i��M;�$d�gk�e8{�+�:����`a>�Q�[b��Z�
S�R3�R�`i�D�#����� ���'�C�T�E�g:����p.�N�b�[�b����������5���	:���b�m��/�9��/�������g�3��fV6vQW����Z���NJ
T=��+�������l�f���2�
�a��a�e5|��[�wvf� l��p�,5�M�A�70�.��}������]a��,�����j����`���Gu�����T����O�
�p�bR`����0����R�'���V`�m����Z�m?�v��`�����QDm���1�����{V/���E��t���l�Z�t���(e_��������kL�o,��p�]/������C6D����w��4.T����I�X�}ZP>�4�����$��(���g�7u
H�
�����T�.��������g6�v�������z;�+�c���!+��gV�B��������&����2U��vW����[��m8�!p��$�k�+�X���E�=�~�]��f�L����K��VV���t������<�����X/'4��
v��(j��x6���Q�~��5K�S4���_�E-��o��d����
��C��U���D'�������W���f5��a��hXK!�(�0�������#�~Dp�p8�,���A�Y	�X�E�HD�z���Y����>�Z�f�2<DC3�Y�
.6��m�+C�����gbk�U��Vv��
�="O�,�&�I,��M����D?��A�����k
sBb��;��f��S:q{D�����ix�:��������b���&R}�^������c"n�y^g�6�����<737�h������i��BZy�~g7k�4�8'���|�?����,	�&d7���?ACQ��}|+o��������9+�aM�bW�-�Y�{�E����p�����4���z(����P���<��w'�1l�O�fe�b�7k������b�#�`�A�b;����;Rx�b�F(����3����f)4<K����Z����U�M����u�������>���Ku�v)D��H�����&��&N�kJ78\�&wb2�����q��~��aXl���f;s���h�i�4S~g�����
���GVhV;���fg6��D��9zb���V�"v$�n6,7fXM��10���m������0�^�"�Ku,B�$��j6��V���f�p�YqY�a6V��7�\�����D7V���a!k0\������L����)2��H�af�;�VR������OtOH�{$�o�y^����w�!��gK�Eg0v�6X�tKti6�Rk(=�d,<��W���-m�XR4��K=��K4�����Md�,<m��R4�KxJ'��jX�$Yj�&�Y�z�2?�u�\���2��0TaG����x
�T�������P����.V�k6qJ�g�1#���z��v=lZ=��?W�AWbL��M�1��6�@$:S���m0�M_����y�02��_��G|{����d$}(�TK����~`���'�K��Km��\4M���&�_@YZ3�o���c����y���OBl���.X�������`�L��5��iZE�b�`�$��R�K��&�0U&����=;�n�� V���+e�V�*G��������1Ut��U�nX�0%�`��`��b�����
~��^�#%�'��c�k�AP��I],�h�=��o���.P���'Xx|��L=����Ft���,\=��>�znN�M���,M����p��6�O�/�����#r4B�s��K��������v�������1��hxt��>^�pQ%K,3��iel����
v�������r�TG_pe���`������)C�o�
���.�Tj���F����R[S�_$"�L����P,�[-���T]5����O��9�b�U��D"6�Qeijc�T��B�"�3�b3n�V��D�^�O��C�QfOK���jX��Y%zyDv�6�.4<\H,���4�,�F��K-��.�;S�li�1�t�0&��4��b(t������x����
z�.����4S�m}i�%!A/�w9��s���������e��J� mLq(z�
�`7l��
�u�0�yv���:��9������,����T�������`��4�P #u*���U'lmv�6�A��aId���Y3X���I�<"[L������J,������%{j&�j{j�����
�T������Y��`���w��0:	������U.�D��Y�rM������p�fX�����=^����t���`i����Q`�������c�#��d���N�6�$��)�N��������b�����u��Y���[��0�-�l�fg>���a�����r�7A
�[���Y��)����X�������]�nqg�:���������Tlgo�����o����Ep�Zz��sK��������M���H�{"�[��Y���sO�6\�p�u������%��B
M���=���uEV���Y]�X���q��Ml�d�n�4Tv�NT:vk�;�Dw=���(��dq�����-?"8\D^��n;ugvj��jQlO��w��rQtgk?�������D�%�z�m��loDt�/���hE��%���M�ma�����?\�y���:a���Y�(3���|�M��-���]����M,+���,��,�"z��:,c/z���Y�l���i'V]�iw�P�Yb���3'�h��(��}`�,�6\�j�D-o�����l�5a��vbw�T�fyd����n%6�eH���u����f���9�[���R�j��}f���c���!f}������gD�q�����c��������D�v�?�37��S+����qb�	}�71��[��D��C����;��1n&�}V�����F������-���/�������B,�+����]��%n����s��8�����T���B����	�o����)��#������n�
���#���|*�}����C���N���V�+���d�t-�kf��bKf��f���E/f#�1uw��;���!���lo/m��o`\3Lj�L�(*�6������E�������0���������cK��t���!hx~���N���R��m:�����1	�|5a����w����Y�}-v����~�b;�����~"��7)�L�w�`�[���`��l].��t�e��n{j�������Eg�Al��pr�������LY"�]���jw�����3����M��a����9��}��3��t�X����,��O��9a��>tv���p�Q���y+���$����+o�����	L��;���$�b�g]y�t�{J<"��;����0�+���M��v������E�> ��rv���6������������R,��}Xw��e]:b3�'�G��F�H�3��B����cr{D���"1��Pt���:�����V+�������������'W��q�5���t�4�����
�HFAW�����1�
?aB�����q�N�Sms����	eV���3��hZ�6u�{�f�g?�-���U��u����vk��Y���\w�����Ow��bv��i��yBS��_i��������oO��3������n�v�]_]3���8�[���E/�k�ff:_u�,���K��������.���V��a����0�/y?|�q�0]������EX�*�?���K��n�d�p�v{�i=F��-P:#��a:����(6S�m�g���D�}�*0�S�w�MG�0Q+u?�XK���n����z����
�n������t�Y��G�/���>!����8\��������k��6CB�t������I��}�A�~���.�f&}��(�|��[����:<�UlAW�?����1b���1�l��-�iX�1L�i�c�r�M���������h>^�n��x8������4�����|4C�]�ASoL�~���4�����jzZ����Itv����3�;Ks�K�S��I��P���T����$2�>��a��h�>p
\����v�����t�?k�l������x�g�1K���E��[��&�r>��J�b ��FW���B��m:�� :!��42�L
v��Nu�/��9�9����N9��mG�R��a;�9���>p�b�..��!��uR��	�A�Vy?g���b3gfv��p��q8s�������:�i��S"��;T���`������n�.����34v�w���Of������r���L��|J����_����`���w�����-q�r�>��Y�0�����fl�����&��V�w�	#=,��W�{����������so�6\�p��D�)ZleOU�b$���O�yb���V?^x�A�b����v�������9Zle�7���y��!��{�f+���(��[+�<C�v���	��q��&D�v��K��T|��}�b5�&���jD��T�`A��e)S�5��6��s�D�({v=�.u�R��Y�����c�q�Tk����~X^nXe������#�d�3���:~bz��U��=O"���>'�c��Q�������c~��6P����v����}_��_�`�&��le>|b|�-�T��c/
��b���]��'
�?��(���_D�Nf�"����_4LD���^��D����vp�^pMe����.�w��kN�X���T4+t5K������<����k~�����W��������+u�PA��=u�������h��c��ah+�B�:l���G4����O,�{�R�n�q���>���p�E�bSzw&t-%bL�K��������>����}��7���5_5��K���*aE�;�j]�VV�'vd����8�
+9�Bo���:���D����|�^i��i7��c�w�Tl;T4��_�V��F3�p��]�j�a�8<tXte��b�j;�U��6�$�7k����EO0��h��
v�e�4�LX%��pM�&7�
o��f&����wv����n�1�-��%�M}���|�`��Z,�H��C��|�4����'��	:�/5l�0���U�X��c6���>��v����uzJ�{g{8<D���
�xf���h�=W��KuL�T�����:�;����v��'`�S�&���
�6�<
�.��l^X[>`��utF'k~;}����U2��J��%z�x@�fZK�O�t��rx��hZ(k���/D$���Y�i�=\G@�.0�B����*������>
�2�9{��@4-`�g=��<lKL�%�����6X�%K;�����G���-��f�
��42��L�$�&�l�vx�o]����;�]�\��$����Y�I��X���N�OA78yK3�C=�|��[��2�#��8���V�����j��&��iO5�Z�V4�5/.
��R������'���~�"��=e�����~n*|N4�5Oy��K$�;�5u��O3��K$[l�����JBvx������[�y�wvf�<����7uh^"��Y��.ze�����,@�I���|��{*���xkB�]�'gf��2d�xC5�h�{�����G��n��:3�����b\
k��J�&��L���w42F����N����~y��x8\��F[���
�f2j�Kf�
s0Ba��S��w��)��f��������
�	f����,�s.�������b�7��P�[������v�~�����B���6�������u���.���o���,5s�.��Ox��f����H�nDh���s���/u���g�v~���o�������_<2����@�2]�VS��z���R�{���L]���.m�y��F�{��Z���m:`���R&'DV�������/�f"i������a�f����j��c��8�gX�<`ru
��v��d�{����t���.�^,��
�f\)V5�A���BxsK=�N}��#p{D��p��Z���N+�����8������N���ky��3����9��~���aX�{*�q���a���"�8\��+��?�����w����L�X.�L0�t��+��U�}�V������p(��X�����}�_$���[�@�x�ieZ�mz�'����'bu��R���T���Yn�����WA������NFA��;����v��c`Y���m�i�d�N�����l��w�^<���4{U���<��~]B�oO��	�?��1�-��0����`Y[��V"�3-M�=���&��I�"��b�;[��W��1��v��#~D��u�lC������6��n�X�������?/m�at���Y��6��>�y���,����i�3|D������Z~B�c�,0�y��1�/�A6���mtZ��f��ba��k>���x�����T�b�d����U'v��tz�>������:\d��a��Y�^5��Rb�\��	9���Y�����6�#>�P#j;��o�9z��e���L,[O��z`|b��[c�z�����h6Q*<m.��k�!J���i��)�>���
���	uE�LR�b��\�w�dv�N;Yg�hx��Y��U��������i��d�F���?L7���R��-�6����w2��Q�D��-�����[e�����7+������u�IX�"65���;Y��hx"����x�R��(6����y^g����QSlj�g�������1���sP�w��w��#~g+\����:�V��p��;������V���/����6�scE/��������|��Q�~{D����4����\�b��o���>G�p{���>h(�{v��.���N����g��q����b\�[X1��M����L4ls���M�A���o_���:~bmC�3E��ah
b��/f�K�R�(N[��9N?����k
�t����������E/��	�V
h��#�v����Xt�x�i��dg�+$K�b��;$`�c�PS*���U��|]�����JN��'k�3
��`;����J,�mj������6�����o���O�!ky
;������.�=B��i����	��}x��[�z��~5u�$|D��7��t��OE��=X�E��N�;���Cx�?H��3CU*���V���3��a����0�.�0�zK��������g����"s����J��"��	�`�6O��
�gZ�>O��8\�G���o�����PTR��X���Y��t,�T�-�����-��9jca�g6�;�>�i�0������,L��gM��'s�����0��m�v%[N,�,.�v\���Q�.��n��2A����	�E?	���@x#�����s0�\��[�*�B�	���|W�����-p������8bZ <�@�4�2����c
v�M���{r���NQ�S��.�{�E���8���EW�H��c,j��v*��|�P�\��Q���[9���}x������zZ@��a-��$"�����H�!7S�n�����A7�I����G��s_�O�?����d�����q9�kk���CA���l?V}�KuD�<��L�����c�&t,���f�o�',����y�
V�>#�f�����G�#���|�W�]�#
X�%�pB�7m�Q��������v�(�L��d���?�`��N�C7�����;��e��X�w�ag6�r�x��2�
;��f�s���0l
���>��A,�vz�1nO�ati�`��X�a��q3=�O�Z�W��]�B�����������u��L�[��h��pc���4�R�
��a��������/+�'}w�=��(X�
U����I�0y�2�0[:�<��t�����W����dZ�-a2|��Z�t�	Q�����4]�B>�?[�Wb���	��A?���'����4�<al�{Rli����2�&�	K��N�����f��	����u�9&h��� �{v����_n�>�"�^�~�f����X/�����������=���,�Kx������*���qY9��s��=���o3:h{]�5���G�fb��[����6�o�#����Z�j��#N��9�+�o�X��M8���.}��6�)&v$�
|l�������{l�|����'Q���n����+��Y��l"�l�|�l�Y�y�_~f����8��R��j��{v���g+Vc.z1�����q+��������y=K2%�h(�[���u�z�n�/Y��I��W�a��g��;�|��.V,�4����}�{��������l�Hlgm'b7��t�l���8���������b++�������O����.������^E����
���D��c���"�W	���u�v��X����Zp�vl�e(b�=��?V�>L��X�
���V��7q��ca+��}�����Sl������E�!b�D]�c����K�7+c1��$<v�>��*:�7t����]b����l�/O}05��M��=��B���^�������,Om }`�AQ���e�e}�b{�����a%�����m0���>�P@������h/A?L!�&
�HVEd�h��
������iV��k&�;;X3���3>G0
����
������.�����9E�?����X���^R�&����[_5|�Q�v�{�'d���\��a��s�&�.��\<=`)B�g�����^�+KDa��c�(GYe����M4#>���T�(��c�~V��
����uU���R�����J�0������������@�(��="G!t���J��	RD��*����a*N��S�����Uc�'d��u�\�kI?���r�r��ZBM����v��0���Zx�����zFg����A!b|�}���	v��K�)3�7��?hxH����XI�Z%����l����j����D��c�����8�x�����'�|gwf���H��-�$Sy,z|`Bt���dB�������a1�������|��9n_�����N�'>�6>p	vFzd��*��]��&k]�_�,���-p�\�����������o���p	`�:�
kC�=;���
V�Jl��q�����ud��V9���c��4��Z����������[�A�-�%��},��}=���8��Ec�l���D��c���|��yv����v�����|=c�;[`�O�����c�n���&}�b+S�c���2S��h�G<}�RGOLj)�&$t����H��D���XPl�4�r�so��p��`��Y�`K���XL��u���������,X�|���N��9��A�%����4���&�
c�`_u+-��M3k�&GKg�`i!��7��:�st�V����U�6��:4y���,��b#����_o����_+K�$�����_����wS���w_�JM����>p��M?����~���6��j��="�0���KF�;
����0fA+��d��-h}`�!���W�-�������d�<���p��L��,,�y���"Hv
�w%�2O��1L�/� �"h����D'���x9�������42\`�����9�r�
;t�����.��>�&�6���gEW����f��&��6g���h�Ql��%YV��H��x���lh}��Ut�X*lJ�?/�N�4&�)T�`c��9=����U��e5S
g���|�����D�������
��}:�Y��g_u���FF��������

;<2F7}#t�N�	9�b]�.m�-�G����`3�jv�>�;h��
vei{��

F3>�1��kF�[um�6u����`���7ZtgQ�GNLE�����C����#�����?x������+{i��D�������>������)n��D����w���������b3��eq��O5&vVh!��/��S:q����D���`���`�L���5�B��7���,h����n,p[�#z�bU�J��,���
��{��o��}��/��7���	��8A���!���*GE��e��%���x}YH}>���|0�����\�Y/f�6���c��]�(����aE����9�`6��[�f��b3��e�2L��L��M�v����R_���
�Y���E/���Y���e59bk��}�8�����6���W�6:�)?������Do���d{�Gn����Y�E������:�z��K�=!O��G�y��w����XV�����K�h���������:�ei�b�����/�
�`��{E�cG�6��VZ'z��5�����d6i\�D��4[�/��	�������,��1+,��O����"�J������|��^��?�O5�.����M<"���$����`G��r�u���X4��3c.���!�\e�f>2�4�o�F���/����S+�0��Y�x[N�����_k:XX�X_���x��s}�pU�q3GPp���o�nH�7n5.��6�������|��q��3��,/f�\v%'���J^�]�������F���?XX�(�d�E�.��=���2�.��@�p���
E�eX�l�,�-Z>>��]w)�WZ������;��s_��C�#�7����_t�	Y��l��K%[��7�\`�q�}P�y���9�c�g������-�����4-�N�������H-Z�I�L������p��`-E���Bl��C�������C��D���_�?$���`����B����Xk}�9}m(�c/Q����{\� ���������e���5�A���evdm����e7{�#�q���o~������@�ymM':��]����~5�����D��mLX�a�����:���(��ah�)J��8�k����4tg��ex"n��V������{�nB�g�m8�1��-z���<�p��w�����g(������'I����a���:S�n��b"o�;�X���[4�K��C�,�����iB&��3r�T��LN-z�|���0:����Pw#K��j�e9�y>����NS��j�qs�������a!����%�x"q��az�+�sA2�hk��A�k��-�6X�;�"�e�����sc5�Y�;[2�?VL/��t�
��6X�,��=��n��,_z
U��T�Z��`@)-6��zt�g��e�����q��V�l��\�vXm�(bS��9q���R�f����;�b3�L�����jkx������v�KmM�@%UO��L��N��V=/�\���(]�
�Pn�M�k������	6!k[�&����+��2q�-�����M�����)<���Z`oz�5q��������?�Y�����'Zw��/[��*��l�M-���&��OE�m8���4�|�J�;a,,�-%
LD�/���@$JB���-��l������L��F���Aw���u��	!�'��g�Iz[�`��h���H�~Kb�L��e�
}D�.	��M2`�?2�xD�/��������/	1,
��q����u���Ao������&XB���K�nM���J��L�����o��p
�$������p.v'*_�./�\�������b�������8��u�2���`����.��[�]���m���cpf8G2�~#��L��l9>��Ku4;k������_�Y��}����w�m��L� �aA�����������n{�a�A4lo�Y"�W�Z=.�(���o���7��h������V�����/�Vo��$�0U����!�/�n�����p������wF3��	y[Q���V�y��m�����_tITto+[7�sE�e��v��K�:|�����bd��m�M�������'E�����b�3%n��Y��������G��v��q�dKta���(�<P�v���XS���lkbaD,�^��l�Tl�����j`���Al��`���_s��5?	����w�PK4Kn�pi�q��v�d��������>Gj�v��X���3�����8����HU*�~["w�m���]^O
��6����B�Y.O�"�
�����7��B���+�n��"����L�8b���:�c{��O%�w��{\8o�����y��q�-���6��R#�F�'R��6�
�����w��^����z@�X�hh2��b���a�$����n�����hxz�~w�.�as��.���#gV�voV�����Y����Z���'�|g��<�<^��7��>�����I&�6�P{*�o���|��l��-��q|{����;���Bt���m�f�"�Y���
��&g��c/�G��N���f%�����v���XE�h(�p{\���7�����m���)��:;��/Q���/�� ��5db��Fle��bG�]e��|�8>u9�������h>��;P~[_O�M��R�VK�>���Qz{Dd�6Y4,�{�z�Ku@K�/�W�*p���N����f/M�����m0��Mg��etb+��5'��M���\4+���0��a1���9�Ew����fh\��!�u�����m��f�a�0��`��bS�Z�o&�}:}o�9��������&����n��1�%�Y���E�?�T�������&���e�.�xa���N4l;q7k
�����pD`�=h�"	�l�����S~g��O�|����'X� �n�~�z�
���-�V�k\<{+v{Dc��J0�l���m���H���?�B�����
o;u7��"�7�42,��07����%���:�U
A��?rGl�x7�y}I���pl�:����L�a��2�N�(����e��f��,�L>,�|�o�9|��E2MD��o8
�:������:�a&^���Ks�f����
��2�f��%�W������S���"2�K?2�$��m��3y,����FAWXo4U�����o�x7���X������>�����p��`9�����<�v<���z��i^��m8OV���
f�����3q�5��4H�v#K{Bu������
�.���V���9d���aa�}�����f�U-���_!z�_�Z��!!��<��L���Y��4|@�����3��������V��3��j�3�^?��h�f�
��2�&������������A��
�-�-�{,<��lB�m�=
>��W
/�������|���6�M���H1�/��_Vt�}����$
��ub�1�����6�EZ��n����~�m%.<�Mt��j������q��Kgm�E1�����o�GO�m8^���y�s�n)��f�N�����YN��A&������X��ey��Bf�����
��$��d��]�b0km�i����SJ\XV.7H��YZ��at*�lf��z�
6A���V��#�EW�a����|���wf����R-��������4����J]a��V�H��s<����a�����%Zo���Y���������:|��A��t�h����J�{���_����?�t���p?��z%X���w���C�&xi4���72�}��I�f�?�u�����"�E�'?�{�v��
~�?��������]j����\F��H�����<�`����m�?"��oZ��� �?x�cQ�?��1�L?^���o�R��_�H"������?���0���R���.|��[��wv�"��K��y_�a�c�g���� �l�h�x�����;K�F�]1)G���E8�"���Vc?�������O�v����G7�������Ku�D��?�|�B�!���-�]�����-�#�q�M�1��%_2���<�����R���~?��pC|�?z�2�,�b��(����Ax�����������M�8��q�L�����v�g�7������c �h���,4�P���������6�gv"�����C+�����E����P�eb��K��N�����B������x{�c`&G����8���d�o���p'��G�w��I���.R@�������V0���	bG���tq����}���Z�>P��c}��N��!���n0�f>�`3�����8�����`�c���h��]Qso�N��pc`,"�.L�4�_�H24����G��_��h������<���p��sIE�����GW���7���R��K����m8�����<? �*i���d�c?������FJ�;`W��"�;a����?�������Q���m���
�3;�k�����^	���%�R��������bwPsiA#�����)��:�����&�d?�������v{@��3�3����i�`�����������u������~,:���U)��m:�#
�4��H>gOi|?�^��E�1�������t��jRi�cG���;�%��h��������q��|�����K}`7�?�~�t|�"��l�t���j�G7�`	�g����T�+:S�1������&%�Op	���XZ�$��GI;
P04:�����^<20���G�'�5�}2��t ���;�/���qv�������p�TC5��6lk���O���������SC5.�k��+�=�c�}�GW�{�ln��x�8�?oS�*e���C�GOX�-�/�%��p6t f��9�����Xt��?nl{��n����}
�@�0^�E�a�L��t�'��S��]#�V����}����sD��4@��Ft�?�<��;K�)��La�t��D��7���$6���?5���=s������D�������|6\����G�"�����t��.�=���NOp�[������x�����\P�]���s��_r��qB��?���$����qD@t�?��d[>�nW�����4����9�sD`D(G4���`���?���L>�q4]
���}�\�J�!�x��]�gsd	�]�GW"��7rf]�x^�O&�u�Y{$L����u����Ka�������Y`�k>�	���8n���L�����������;������X��`:x����52������������#t{�����G�L+�r�F��?����zM�|g+�	�i��#r�'�����o�9r��rK�6_���~5.l����j��YJ��>��/����8��KF)�a29�k7���)�`L�-E�����>X=.A5����f�����0��Y��M�	X�_��x�Qn�g:�v������G��Kvjl�I�n�^0W/��x��3u$�!�{�`��.oZ���:|������v(�Q�M��N�bK������;��V(4��o�����Y��p��O��;�W�b3a�v�-�[���>E��avy��r�Ks�������;��0.����}����.z�RS�G���&n�FD�W&c��#��.0)�����X�W�9p�Q����T�������U�B/��.[lKX{�M��@��p�����p����V�y�wv�	���K�	Ok�L��j�5�S,�.�!HtM������D�D�n�l��d`�l�!"���Q���v)�-�K
��f�1��@�L�4��yD����#H�L(��M��������fY��X&&����SlMT�������
Wt@�
������������>������_^��2��c��)o�F���C ���Eb�)w�XV�$�,��="�@pN�v�������f��&����n��1�T]��������m:�d���3���F������S3o�9^d�h���F,TX���e_3�f�5'�y����m���,�i����6�i v�b?��j��x��
`���b����%��iOta��b;��[���w�Z]��#��=^��0���L����U��w�����j��=^���K�L��;����>��
�@�m������#��eU�`"�e�x��
�52�@]5���k���^�?\��5�����:�������/�}�*A)��=o���R{�tG��N}�-���]��b�x�qL�P+v��~�-a
-��V�"z�y��h��,+�Z��fLg��t��(6��'�W�����^�F���p�����n��8N	A��i��JoW��U]���pS���V]5kEKsH7�Z,��tW���������`�uh������mq�K"p'�i��%�|��P\uB%PlJ/��.zs�m8t���aA��m��v�Mk����R(��H�l|gk��n�xa�+�7�>�����g��Llg%<��{f������V5,}w���*�f�;G��J4�&��/P�n*��&%r�N������� 8�I|������6��������(���.�]�4=�J}���D�.���/�Ku@�_E�z�`�[���U��O_�������@'������l��6�����(�%Zlc.��3�k>*�o�����&�+6i��D�	&����]��	�M&6���\Q�n��WOO+1�Z�]��G4���E;TZg]�N�x-����-D�Ku8�ZAw���~�uh�d�D6��:���XY 6�K�����n�����`�R���u��������Y��KB���T.�	�$$�>r��t��]S��$���JX%>%��,����}�����{����A�L&�6��l��+�>�V:a�-VC�4n����;��m�L$��t8�{{��G�3/v�G$6�����0{���8��X�\�~�%���[��a.�q�j��X�0�����Su"�OA,�	��/��2lZX����*��Nf)�U��0��zDF�^S����
�`�R��l��9z4E�n��}�.����
l���2�`[���"��l����
�8n}����O�J�Ge���RK�Ll>��6q���ay���<���<E��C�a"g1��D�C����`x���	�+��dO����.=S1��h��
t���J=��)<�	{M�2����7��`�o��eKS�eK������v����Rd�C��n���`I��m�-L�%��U�o���K�������y����7S�m��yP���|(���,���:&�����&���G^�v��'`�l�t����������v����[�w�4,��7�6.�&�M�4
�G��]�f��.9c������z�p:	vf����-L�+��	^��?�{V��n���7�F�r�7����`{�9�a_���f�t�����P�0�$�/G���r4���H�ia�xK��ON�_,���B�ia�7��L����*�K�%���l�-0�����
K����s��uY|�^U�xO����Dw6}���nH,��	�U����joe��iV�*v%�b���Z�D�R��p���W���>|g;+��U'����V�d^i$��J�l�����g�0s���������xGt��S���,�)��t���h'���B����ap�:���E'+���VV!$z1%���^b��B,����&���j�����]��O��<��v��"��U�y��w�<i�;;X��S@~{D�����h�Q�����P���Z�ZY.Fte	�j]*���d�_�:������Gc���}g���D%1Z-[Y�������#�����tD�Om�"��Yx��X�l{*�o��q���;�T~^��D�a�Z�2��ha��J��,�������	Yi[��Vte9'�����Ku�����7\/�(��6�VfZ
3
�v��;�f���$r,���jU�H(A����������^;���Yh��_��'�U)z~��pc�{R�����P�):s�@����2.��^��Q�;���w�Y
�x
�����ab��m�\����'�<��;;�~������=}��G���uA����[��;�$�����)�D�"�3���Lf��S��`.G�T6'x�D�f]j�K)Oa,*�*���Xy�������I$*�K�p�dB�#��w0��D�>����lL=%A�{^Z7��n+��3�Y�O��*����C�������f��p]�T���{��
�N
��.��v����M��	���M%�`uI������1�="@0�t�i�a�r��vf�n�L�=~�j���>�8\��	f�d"�j�Z�<��^t�;���&�����FP�m`�z��>���m�����JlE��X������mz^����g����<v��gm�w��F�������Al���Z\z���q������L������C]J�'�9����vJ�w�$%�,�����t�J5
$�n��&6�-TmZ���X4�8�XC���_�d��/}u�g��%�x;��;���F,<+W��i�1�*�o��A,�����,]��Ea4��'2'�hx,��
��/��6���!����7��w��0��a��75E8.������	n+;`_��y� 3�2�p+S��`\�N���E
�����
s�S:�����������%�L>��_Zkt�%�S�#&V�V�N*z������l��0�G!��9"��A7�v�=J�3��&L2���
�n����,
��M ���m8�lL�+�~,�&|t����,�a���C�#/�[v�
	�3�����u��oE��YZR,�0����KOI�[Sv�U��F
�v����D���2���T�����T��p��4f������_���B�o&�m��y���Z�@���l�p�PW�P�W[�+�F:#)����Mg~��'��4h��*�p�d�j�p��A����p�'`�J���H�����'�����.r�V�z�_�3���+�����g�9'j��������P�,<��,��g�/�$W�Qt������`
�N`?�`[�]U�X�0������:>��S_:|��KL(�Wk�a}�vq�7��r0�,v�L���,���nw�7'���:~���A/z�������L�����W�`p�p�����f@l��R
��3���� ���6"�<���t-��K���7$K��j�\���!����[�]aYQ�~�������"����:�
s�����`���mG���6��������������1r&����!�	�3��N��V���LG-��������+��m)��g���)v���t�(I�a�k�;q�V����4��;�6�� (
�(~�bdX��q��faqc���)��e9z��/A�u���>W��3b��7b'���m,%�qK�fSrcz:���R�J��lY>w\>�p	�X��'�+�E-�)�_�v������f�rc;��G��fWrc�d�g��m������&��qD���b f��v��"v��I�Ld���8~�Y������Mx��Ua�/����r��J7N=�;���g����U����P�b�h���i�����G�y��A���'�%����Yn�EA���ss�7�9������8��Q(��y�
�����v�EwVV,v%�X����Y���0A�]�Y����u_���������z�N�h7�������R�v��}T��;�#�����|g���@���AT#��U[��XBV��QS��z\����i,�L#c��������p�E`�^u�8���\%b��1o�iV�-�����N�<�5'��v7VU(z��+���Dr�����2���'��!z��]�4n�T��n����
�����e$r�>��7�6���EOx�=9��Y�N�3��8�zKp��s�
�EV���g�����������M�d������7.g�E���&�}�r�A��MS�9���]
K0�n��$�r���fQ2���f��F�0,�Us)����U�In��E4<f@,l�{��o��fe���}��"G���[Z���Ew��ver��,�4i�4���~_��$���I/�&:�����I�D�����E���w(���v����x��n�$Bjh6{z`6'�Vbw���f�u�+��a�6X��)3o6R7�
�j2g�Q�0�l���CM��=3�6RC����
��/��R@���>x�O����v��`0���^�t�Z6�Ld�ucVa�%q�^��������&1��u&�M�`���W��=l�nLW�lwf���_���
��f�C��D�=^O�0C&#5��
�}���`���n�������h�`�4����{�������%����z����:���A����v��veK�����Xc���Nx�T�@���� X�;��}��qx�G��V�}�-��}`Rg�7���6z1A�hXr(��m�/QTp/��	9Z��w�}��S��=]��f�pc]U��6����L[�i�Y&_��,��5�T���jX��a%&����0"�;�$.�	�`��=m;����I�E�8�|���/o$�2O���&���
�g�4k�A���
N�A�(l��|����q�i���w���h�3S���5n&=k�s��[��aq��`��%{�MO�V(�6K�&q����1���/9���5'z��N���[n�p�e}�Z���jK��vr�n��s��4��ij\���'9��H��x=��C���"��b|��@baAu��ja����:��m�r�5�3���-�V�����
���sC��p���^�K��z��0X
��x2�
K��=���G�������x��-����;�4rB%��-n�[,���>��a�I���z��z����{�-�9��zy�M����t�!�	?b��{�TOVp4~i%�c�H�n%��[��V�����6*
	{no�.�;���FI�g�&_��8��p��ac�Z��](\�{�|�KO�L�+z�~����m��������'d)n�[A����N(r���x���I����)�-�'$���_��]�`�a5b>�f�.-�	��B�v8�lE@��tbd�M,I,�=��GF�������:����f����s:}c���1�Y������~x%K���-���N\s&mg/m�e��5����ae.����|�.��\���C,,^�K�p(�������,�-��l�����|����n!ngB\����;�����b��n��)�8Z�G��H&]>��O���D)W�����f���T�e��C�nng
u���Ele%�f��{�������7}�w�5������6�o�E&n/[�����,��������e����p�.5�T�5"�<X�v���	_Z�	��+�d�m,>+�>Q��-�DEle)����[:�Y���
����bO���6-���	?A�,�t��q�ko���~
����K��Y���M�t�����?�K����TGP�oC4��
O�[2kN��;\�����5;��w7�L�d�fY����;���_������[I�N�������������G�4�����3��������������4|6�������v��z>D���g�v���`T��?�X��~n�0���tr{��`-������y$jb\����&���VYw��6�J�������`5Lb��i�="���qMt��%���5���������9�e&k��~�����v��Y��h���#�A �=�9�_�����8���q{���:�d;��+����:�z����������xiu�)Ga���=����kvge�����cg�v�Y�����b'S�������J�yt��a	��3���-pk���a3�![�;�L��B�|����p��F��B��o\~����n��Y��q�H+�� F���q3h���6Y�Y��X���H��v��;3K��%Tb3�yt��;�)��;0�N��&vj��t���.����b�����uW��_�M�l?5�}���s�K��LgoBW�.����<v��p�k{d��;`�],\�um����/
=�fayQ����v����t���"���>�����DI��J�DX���dg-��y��i���f*s�
X��hx������=���4+�k>&���u4�|���,����k�G����l��-���$��o��e�HZ+����y�E����p�c�������5*>5�7n�.N����3gw��;S%�hx�:

>Tmd���'<�;����J:�u���Ku(B�L�Eb�n�2T/�>V����t��	?�
	�S�iV�;���&�{�vf�B)�E&��B���L�V���|.���6��HX�5��z���*��ZC}�I����e��9$X6w��vj��.=3��h���!���?$	���y��LU�%������0�k�1FW&gI2<�R4���0�,<;Ol9j�n��1��It���8���A/8a�skn�*NL�VC�����I��~������������	���	�c�p�����������k]�/��p���]n����ItE��Te��yb����y��Cx���A83>j�f�F�l�(�l;,�{0�����I��7� v�z���G�=O�="���+z���p�5`�-h:�;�S��e��{����$�����K�����g�6�g+�d�n�#��m�5��������..��^�`�d���z�������K#�������������g����B���pb���������a�N]�{���.��Be���"��L��
��t�"��`���-�v��(`
d��X���sDc����a�##���3�i���X���{lr�n�QL*�I{�jn�9*���L�n�o3������������f�����fb5b�l���[�
��+V�fvl��%�A�v9��H�Yh{�~m��9Xxl��L=�e����y�=?�oN��a�R���t����.X��k�TjZI{�y�q8��.��z�����9E�T��DBw�X�a�`>Z��}&��$�����KVa-�i�7�>C"ac�Ge���L���T��E��m����w@�b�j�,�zV>��r�.�[��x3����P"���x���u���.����a��`���%7���u������bu0w���v���,�[[XM���Q�p{����	�.@g���X!��M�]����m���0f�%�������&���5��-�DOV�)���D��,>��������<�hXb,����]��Vu)f���'�+��K�f)k��y=�UTo�����k�`��Olb:�����^pJ(��|���fFG_3�z������u��6�E�����F��5�0nf�a����!���U����8�vX{�6?t�8�a?�`~V�Pe,v��7�%a(���)��Jl�,�+��E���C>V�>,;e�`[f�kc��~��}%���v��X��hx����J����>��v��9�b���X�����b�iJO�OV�&�ff+<}�\!)6q����s�8hx(�G�������S�:l0�R��C�2�U��m��L�%�,��]��f�L�$���������^��[l�,�a�#<V���`��k����n7a��ZB�����+��~l�yRgbJ���C�`��bO��w6Q�0����������s@�Z�D��d�����!�
��`�|2��\�hz�*��_�`����6M�):Jl3{��<fy]a����vf�wv��n����f�|K-�/}64��s���LNIj	"�}���������O�1��}lL�Fs��N�w�C�F]��a�M��H$1�Z-9`*L4�1G~�X��.�!i�.��!�k�������L�������.G��m8O�L�(z��g�d|�+SpfM��k������cq��v��w��D����e�DX���	����w�;�����Lm����9-Mg6�,���^4���mp�I�&�R��)d�c�<6$�oB�qfyj�%��Be�s20_)1�Qr��S:�>���
���u��>�/��s��`a�a��=���������
�4��mp�/�e�}xXj	���'��`i���+�lb-e�`�I���Rq�GL���	�_u�G�y{��d�p\&v�B]���KP�u,hZ���dd,�<�(�8�����@�.���y������cfa��f��fR36jX�#�&,���>�_��RI(��U��%F*OX&�'�b\�}"�H��U�X5�����������wv�O�lp�����1���j��S�=t�/��Sj3����M
%f3��������E03Ov�&BZ{O������`\^��32L0!�<��6���
���1�P��U�>~"��tPc�����#��T+���d6�E�"v���w��wvf"h�Z������������������ar6�s�z�T�V��yI���x��L��U��B3�T��x0z�~�K���TR�UXv$�+,�
���p���k�="�p]�f�,�g��wv�~*]s������MAO��+C,�,�-0�k�;w6�&��l�0]��k�`O��w��"]3L�{
*o��AL��jg��J�+u�����S�'����tL�y��=���y��6?�����	~�"1���v��={,�������k�����A7���B����u�%��I|E���P��y$����-�7|Y�;��W����������i�$XXHo�.�b�A�g�i���w��)��I���e��=�tY��t8�@�a l�i�w��=U�G�8.������`���������f���	���w��|s�m����E�VI���vZ�r���o��b��D��w2/�h��(6s|��ev��L�dMba�.��@��/��u?"x���#�iZ,t����z�i�.��
;��v�S��7�v����"
��x�o�=���e������
�g�A�MtM�q'+_}�1����]��$������)D�#��
�Y�U�>*o�y�d��++-{�p�TO�l�T4<�Ble�b7��6����5�#��u��1�,��c�f��e�ubgB�0mm���Ym�P�.��a�����<�����-���!�w�����bO����:�a�V�����]06v9��m:a%��Y��XX��cw���-D�D*eZ�:YBV4���z�mN�;��O��m8GO�Y�����`Sz�D�������.���J�`=�?=g���u�*)���M��N���*?����R�~:�H�4�C{���K��6�E����l�k�`3��i��������!�
�p�j��q����#��
�3u���S3+
����v���`��.������AE���)����:nL���-Qb4�{��TtK=����i�N���a�Z���{��D'���u��e��6�Qa���-��m:��h�a"���A����7n�	9���;L1���N�7-|�p�Ttf��T:Y]��6�cV,!��nV�%��u{������]�p�t?B��p����j�g��m8O�Gy���*6���lXv��p����gi�E����qYk��V&F��t2����	����U����3������E�J��LP����p�(*����Z�
f��iK[i}Q�5�Y�����L��^��D�cw�d�T����Y�:����r�6�NfN�Y]�Y8����,^�����n���X��������JkHa��T��5��YA/�"����|���T������u��7L����F���E��k>y�G�0�����6�P������`iA�t����������p��+��M\� ��7��+��4^����y\�����s{��X/��s@���w�&n��",�������/13X;�rC4��&V�����Vj[Ok�L-���A7�����+@]r�Ol�;��(��L�b3v�i���U_��f2���Bg�i8#��Ba�|�t{2�S]~{����������%b'�Z�A���Y������b���08O[b','F�S�|�����	4��aG,�[����;{���-��h7-<�Dt�aE�b�4�%�6���b�i3��$A����w���U��A3���5�6�&�b'l��!����������s{D�`�X���O���j��g��pQ?���]��Ku���+�G
?��[^'������`{���i��d�W������8i��z��>�s�9{��~g[���i�+<a�����h\��|��������#��t+b�����>��o���nO�.����
_��?R���H������O���^|gW&kd?,����/�R@|�;?����0]rbV�v��T��#�
� �{
��O��LXi��i�8�����
�(��ka3�X��,|��X���5�lv�L�%S?f��������%b;������f��,K���1h8z.nW��"l���Y�����_�XU�M�4�w={�?�bU��]��#��]��L��
�J��zi�8�w����[�5�Vi������;�\+��|;��v��D`Ui�#��t$�����b+��/m\u���i[*<�GtI��<6�>��X�Yw}�x8����Zh��l�ck)�!
Mub��o��|��3.��_le��b7�����')�,�=���/5����6��p����).���	��������=��~l-}X�Ytg-���$�B)�X�R�]s�������@�f+E��4Nhaq���h�x,i}�K�p}�X��
+���q������^�~{.Wj%�'z�L�!���.�!�F�E�b3��>V�>�R#��JB�&�'���Y�fE�b��Vlg��f�p����c�����:�����-b1����vD���'>V?,e.��6���L����v�����W�b%�b+�kW�E�����1�D�N��v��MT��A���y�
P����{�?��g��h���N=�=^�m��N��Y��M��,�}��G4�1z��nW���tE/�����$��(�x,���y����m8�p�)�nf�g��v�t��h-��cV�f��s}�T>
��|sU}g��S�)-K�{t��'IV�"���AJ[8���	���[U�s����m�>m�
�I�)mE�M&�����R�����V����J[�T	z��u������,M���3Q�5�Ppb���e�UB+�����~������E/���3Do��@�c���+��k�K�&�vVZ��M��=?�6��65��6��t��u��8�v�����I4����p',����c����	���
�����n�����:�#x�K�^0��fv�
F�M!|y�r4SbQ2�U�����T7���qg����_�)�a�d�LPh6���e�a�!�t��_��n���	���,�z�^�N0���^�`}�[����:��S`���O�=�:���Kv��D�tx��'v���-|Yh��N��� �(��j�	zw�w7�`iJ�f��9C9��r����/��v���,l��Yo������	�^�^�7������5�a��_KC��lz�n�����"�=��������E/��%�^�Y�Y���E
��g
�t]�������j���
��`w
�{��7Plj�l0�8�#���'�Zz��!��q�Y
�e����z�����[v�	}��R�/�����s��U{y�L�Cl�~���N�9LA�?�5S�`1�=&r9\�e����;�^�Nx������@��%�J����~a��$��5;��J�=.L�wB���,���p9\��'Do_D�L ���3�E���o��0�B�d���rX\KZ��Nt�w�`���<g&0#�%z�����?�d�����*\"5Oa�����Kx'�e��~��h�p%��[�7����a�M�^?���L�������p[��������Eb���q��wK��D�S���h�V
��@m�+d��K���5����
+64k�O
6����4�E��,�,��K��H���mOKd���!����l�B��h��R��?�J����~����	��W�"[�`K&h9�����p7[��S���J�{c���nc��']����o`��$w��bm�%���1��%c�V�I������?-�m>:e?�_3���$hK��Lz\4l<-�������o�g{�q�k�s��,fH���r��[j�i�l�1���r�����������&��}U�����'��.�V[�<��8
���X�Z>����AC��)1Q[0F4���
��������
vmW��������){>f�����V��=qb�lK@�p�����Vb}��W:�i�l�0h�t��`�2�O�`�V�tZ"�00���G�T�S/��	x����k�-�4U"��L����/�q�{�������F�	���XTk����#
p�-��at)����~��>%5VI�JX@�!
����
����yzJ��L�[4�7/��?b3�����e6�	]"��LJ�3����(������p.z��8,N
vA}M(�}2����_�������l������V{�Z��~^7����l�����%�����\�|�S]_���?�i���|��'���}X-����>��>Y��h��#�ng�i��SE�i����	��i����D��-�$Dt�U�'���.��/����PN���1�����N5N��=rZx|�X�h��@la�Db����|��pQ_����=Muz�p�]F�(���0����'S��0kIla&�g����TKdo��!z��K#����������(��>-�
5LEOfY�-[��i��EXi�����b'��4nB�wZO{�X���I�i8�"�!/z��R����i������3���r����fu1B����L}�3��i���0���D���D4L=��L�����m�c������(�����T�4=�����pCk��n|jG���,k=��&:�;�����:X4���m��f4����aj�����=K�M�5���q�N�iO��'�F���s��j[^K���W�Y��b��-��pZ>|O�.h�Y%��`��LtZ�����,��#g\G��LN[�-ZI��aGB�~Z��Z�AC�]�}�{��j;�n���b'�&�������(�����K�n��|�G3Sa=Y����d��R3,t��.f_F��%��eYbbgfG��2T���%(���`aOs�9��=-=a �=������1=.}�/}���\g2f�V*&�B8���Q<��[d{�A/���;rf�6
� �hj�I_�>�X���S%�\9-�<������V�M�,/I4��nJT�����C�Fk���5�aV����n~Y���g\`��K/�u�6��b��
=��}�L��j���>}���G#�f��d�U�'S.]a�4�]��4U�",Xt��K�_s�J&��������>f��@�R��0"��U
.���?-�M &+��D�>���������Q�`�0�=��0U�C��L�vW�g�i>=��'x��
0�I��&�M�O��?5�jZR�nA/x&<�q�eY�	Y�iE�I��K%a�Yw����
�bkj��	�����)s�e%xfYq��������i��������Uq'��m'�y&�:�Cs-���q4���[��iymP�$�gq_^��3�����T��#��D���=vD�����lP0}Z�4�BZ�p���0&�J��Mk���r������iY��Yv����=��m/�c������	�Z&������bYE��3\��_e6 �mL%V��A��p�X�<l�x��0;����F7\�m�y<CBe��)=�i��	���n0@0���bc�.j���-}�?�����
�`�LP���f�I�������a����U���u������P;U�^np����K�^�$���t�>�B�4-��_O�k��I���Fm�{��i�6�����~+)�B�I��'���oi�]��t��[��-A���{��n��������Vw-�����T�N����6��Va8*�s���,�`�$���"�/@�b��. zFK^��;2�����Y���T�������gY����r���[����;����,�;a���ia��dq����=1���y7��N&�+����$u3/��'�N+�� �f|�V���GR\�7����v��� ��*z@#h�J�E��:��T�������i�6d��zJ������<M��'=��f~� �j��	c��k�/�$W�?n��";�5������F�zMkU�����R���
z�j�������-�Z��i���9����J�,����w�`�VPvZ^[0�.�gS�;
���UM���`���V0�0�t�
���)�

zA��`{��H������c�d�jJKE4�m���b+������lQ@�H�Pn�#�^�5��^���%�|��bK�
�bGB�jY�u1o�hX�*v�bv�{��=�$
	�UfS�5��4b�I�a�:���vz��)qZ���E;�4f�7�	s����;��]f���u�NS}<U�iF��o���\l������.+�.�G��B^�-�6�b���[�����2E�]9O�-�%��]=��-�0U��-H���{=
�c�)6����DW���,�&��I?bkB=fY�u��'��=�i8�r��#�U~	���,l�%�\{���e��E�HMa2���Wh�]���i8U����#�O$R(�SM,��	�����m��hX�c�9�<��+�c����n��N���bS��	��c:q�Xq6Z]R�� ��������Ef�EDj�[(��D>��Z�hM;X�����q;�����:O�k#�eM�f�B<n5,\�����`���\��]�%t��	����������<���|��p������m���lJ�L(�����u����sO�i[�U���M����F|��
��$f.����b��fzxL�.&�*�{��z�5�e�
Od�����`;<�%��8B����F��D�������h�Z"��r-�{,��M4Y��]��X��2��e<bG���.�bY��x���,\�HM�-k�.V��K��wH�cd�UX-��h^�Z�u��j}���aEx3Ow��&.M[x��Id}-k��mD)������%�����l�#H"��g���7"�}��2Kx[6���6E`$�*������Tm��Z���(��j�D�����I�����.y}���������6E��)�F�(��`��f������-�9a�[��^��.0�,4������qw�&l��B�y���t�}�R�g�����x�Ds�e��=��Bc�O,�%v��~��-���D���R:����?k�����U��[F�a�����i�
t��P��]L���������bE��an�S�z���js�FI�Z3�v�g������lI��^���_�<�]L�GlgZb�=h�����L�z�����sO�����[����U/�Y�D'�e
^��
yb���#>*yN�-���q4�[)���|q��dtE��2�P�W����`�Z����f6�ksY5x�����-(z�f�<I	w;�N����UA'�-+�.���f
,,�����ir
��������c2����T�l�K�+tA�dB�VK����[�~I������)m�Sn��{��:�$<�4(�R;��N�Y-�?��T�#K�Z��L��%O�<���T
o�Mn��+����V�����������������+�`d7����-�x��J��A�������/��{,���6�'���5@�~
�f2���`B��52,.��h����������*%�g��J?t�><��4����D��H���4.�_&�
�����8�Z������?����g���.�1�x
���	��J�F�D'x,�i�s=hZ�l�>�)�	�c*e~*=��c	�]��r�H�`�{��pi�`k�u����b�I�T��dR��<�`K��D?tij��&S���C�5!����J�Y����x���*b;L�����A���0�����m���B
�����
�F���
�����YC�:��J����N�ksZ�A��'���E�m�b��6S�]��|I2.Q��TK�����UiLm�:,�j�m��%X���9g
��,�����]�u��6mlB�)����`��{��#U�gS��V�����i1O�OFf�*�������m��D��e%�E�97LR���n7��C���G��m����4��HF:w��^����OR��g�"S�wd��-��~~���$����z�g�����V�P��������nt������Z����l��t����F;��|�����J6�����z?����� ���v7<�CL3
[�Lq�,�`EN7�{�����^\8\���K����u�����	����s��:��%Z^"b;���&�����+�B���K#��/�R�6T/iv��\�l���_�6��w�����b����;2f�}��`s���f��f�e�}P.���w�i�l� �^��42]���a�^Q�Rb�.�~�������f�}��`�		�~P	��oePu/��s��D6�P,�4�0(��;,�C��Q��}������C����?�M'���z�f������fypf��7�z��-H����M�{���n�F��f��R�`��~�N�o���P��
/ob�����tzL[1����)���.~����5�"�fY��w\TIj������J��6��%������}Y�`#�� o���c��Mx������{�F��9���M�yid����J�������_���� �3���E�?��	�]���?�-x�
���l��\��}q�����7��;����V�����\,��4��7�f%������s����R
�[Q:�Yz}�J2��1��������7M��b��������D���|�6��3���'x������{(��x�������4b�J�1:����}~��m!ye�,��l�k�,�;�}b����������;+m��f`?��6����3�Nh�Y��"�{��0OKd��&A#������0$�g�pO+d�
)���H��wd��hv�O�i��B�G'�nF���5k��
/r�v��`��'�������P��i���w���>M��JK�����Y���,=���yN+d�����s���@���.0/K#���`�����0�0�~_�����l�<��m�B�l*U������L�
�5���5]�H��$}OKd���$X7i	%����f^xPH��t�V�F��O>6�P����\f	��o}�����6(����5�i�(��c�3���',�mIJ��Z�n��������~>l�'���}U,�k�V��wxI�����
`�(��`�4�Og�8��`K���"�fR��OXh��7x�gt���Q��jH�%����KNx�OX��k�"!#�&�k��}zL���.3�W/��p>��t�6O��
H�0b�X��r����5=�A�p{����%���L�*�`��i\X�#F�����k+�.������2��_6�#���~����4f�x+�g��1����`����>
gK�xAO��l�����(�����v��(���;,<?�����k#�dI�^k��1��w|�O��������z_^-�.�t�V���3�����	��Y�R��G�����\��fi#)Z�f2�����:Lu���^���b�{6����(���Rx���Rxf��������$�L���4�������:���L���%B��
�D6y`�l�L
6�CO@H�����A������UzzL[1�4kAnv��>M�L07
?�x���)���/b���j_���9k�����(5��Mz~y�NS�%��E�;�T�F�-���h�>�
 � d�e���;�������^�_�Z`��BZ��LhvfJ���'X�*�b(��*wb��w?i%�7��l?!�`���K�8�c�l�@e�c�B����������	�,�w�`T9��1<����v��_�`��B%Y��l/�@�R,�l/��oQx����.����������N=3R�����
_��S%-�|�k�!��I�e�]!v�bK?1�g������3H���X<x���b]9���������l~L��E@������W�0iV�be@bG"��Xy�0cX4K������>s���MwZ��_���X�VlF<�X,�0��h�!p�e�,g4�!^,x�w��N����|��^��?�K��������E��A�:q�����X���5�����.S�JsaYs���l��}*��+��=�����O�k{�NU	H�-*�b��}��V����L�k*R��yv~Y�Bo��b%�$�R�J-���5[�Ul�������sNxi��S�6���b�v���zL�La�4���eN�#���eNP���l,2��i�E)�$:�K-�x)�����-�{��K��S(��.�4�*WJ]�XY�3�^�!5rbI-��+r^�V��\�W��{vW��gY����M�KK�1��P�h�K��fr7�����H�����-,�Q,���;g��*vG;-�
/�M)&:{dV>���q+}�c�������	��f�C�+Q�Y��]X6��g;�N��hc�U��jR�T���FKU����Q�5*��/d~��9-�
/�%���
S��ua���'�SK������2Iig����.�(D4}�}����]�ba��%�����vJ:<����7�f%:��_�i]��t��X���
e���F������'����#=2q�4��!�'t%kd�4lc�bo�o�����a����f�����
tD/h�hd��i�+�xL�<�e�w�
�l�
/P���K��L��v�����`U/�wc�4����H����R3�	4.L����l&Z�mP������e|G�j.0GK4|��Qez�>t#�\��>-��'Vv'�n50��`<�+W����������%���F�5,<��}`V������h]�����D��z�KZ+����cj���52����������	]+�abY�{��a���.L[������+���b�]�%���
%����O����`'3��������rg�3u���j#d�V�.0����QV�.��Xt�`�X�zw�]����8����I]�m*�];����M�����������������J��-�]����0l�wa��������b���,j��-�|w��������=���H��DnIp���r�	���{W���
nq'����g��_�����a���3M�������7��k�������`����iym1��^�w�	���V^`RN���t��}��A�?H���*{�
�x�}2�kV:/�O�����h�\�^`��P7�5���G���X6����r��������*�J���[2I�V���'/��������N�j8S�������ix�������w�G^��2��A��6m�,���Ld�2��ie�����g��a2���T����7�� zOV�gi�d���_�������HxU`h@#'������#��G_�n��
���u9�����g=����������zE��2)orw������1�p�*)Cc$���=;`8!���c��x���Aw�k����jX�}�]��5�����X���R��[���6M1��W�v��da�Ja3�H��e$6P�v�1���l��w�	y�b1�]|�r���]~�R{�T�LO��#�����]�'XXzd�������B�.0�(n�K���ai1�S�����TO�	6s���6��Y�9���|�2Mj���'��
z�Nh5[�����&�>��B'v$hd�����NOiS���j�
��'���4��z�M$-��I����J���d�

��`�z��c��>��Z�e{�����D����4��Z��5���je���W�+Q^��\����|ibg�J�Z�~V�3I��j�������MfY~���e2����NK��D�1E��������v����|]��;�["��Z��27����5b�V�����*���
���%ot�fzEV+�VVF%?f���{���Hb�w6�&�@��0!S�`�7bY���]�����
���B�d�X(�.v=���a�~0L;����%��D/h[Y�@,���m,��q9u�B���8E���X����b�9��I�%��w��~��1;���;��O�Z�wW��.B%�y�G�d>d���4����J����"������Y��0��}��&Z�V�Wx�	zW :
g[������Y�tQ�L�=0���q2;�������n���F	��j���RMDV')�&�X������E��
����<n�)m/2
a�{N�=�K���j�����.N�}�������������������
�����Y�n�
Iqv/l8-�m>���n��N���j���t+
{1�������d��b;�8������9-�->��
z��F]a3���Eh�K�~)�+��4S[^�7\����}�U�h�i��{�%�+�s�@WB�����I�&a�X��+���f����`	�
CTA�2��1k�X`t/�g3�V��+S��a�L,�����x$
A���+K�=Y��X�sP,T���O:-�mT���P�����,?Y4�*40K1;9�����3$��(P��i��o��0��l�0��j�dx��1]�b7���1����w�I.n�fMI�y;�N�iC�������b5<b[B��Z��B�N���l�NHI<��ZS�d�t"�*$1�VV*'6q�Fse����N+v�A�����^��\�'���<fab�_X��b���i`���$��u����+L��p1������{vA�S�&�M(�U&����E�z+����.�M&v��9-��Ez�GQ<�;�
��zJ'������3�?J�c�)�gxM	��a�����f*<�z��<�H�g�QX��;��ul�g��T�de>bw���Tm�2u��Pz]��#�f���!K�KWx_	�O���������lOH�T+bW�=_���p6�/Q��0>��>��re�����h�X��]�&�h���,=X�m�{�A�Ol&�l��d�E7��
v/�;M�v*��
���]�E�>|c�	��j����N���>y�"���Z���V�NL��L'	�&�����+��%��,	SC� ��U��1m���;hj����`G����se���5��b��Pr?���:���b���+4�L
����-a|u��gS�J�Z�;��p�_M�f�w�����p>���,�������~��u�75�_�`'����an���xU�-]�K%�_�`D2�Y�agT0�-]���ih��Rl&����t[z������NS�i�Roa��p�'��*�za�m`w���c�&���A�����|H2�f�0�U,��K��Ko���d�����s��se"��i�X�
v����8Ssl�g���4|i�}2Iey�0�k~���l��k��
������b�d�����)�W���
<��<X�NOl�N��c�tf���#fJ�)q�Y�
���3Xm���g������ �����|���V�`�/�Y���o�����g���{v��;-�-
�����{�R��9�RVN�iKV�L�(�(9H�.��ZlF~�
��������d�`i��e�X�m���������[E,,��"���$�Z{���-r���p���Q�oelLJWl*Hl��
����
��v_�����%�+4���Y�R����63aF�f�@	V�0'G��t
6!r^�^� ��������]R�J���X[~���������aC���L��0�S�k��n�JZ���6o����	o�fj_����IW���,C�Y�}�ba�K�P\lF��Y�}�
.�+_���p����Y�H:4��7��-.����G�?��^�L���E��&�_�e�����O��p����Y4-;��l"��,Y�D�������xc�5�a,����6kx7V�d�N�g���
7�x��I�P~Y,�VyXfF�p�b%-�7��m>e��f�iR>��&��v����"`�o��r �3/�����=����Y�|��/G#�n��D/�f�pX?+z/�8
gK��\Dwh4�'���Y���G�(5�#��I����Y�����
[���p��j�Z�����3�>Ld�Y�:�a��bJ���0�7�K�u�K�,������G�=�X����|�~b�+����v��
�Q�.�*#z�=g��+vf.��
o���n8���M��
o,^�.0}�f��
�O4�w�U���>=��'��-�?i�����%���,�Ll&�Y
�1qD���YV_#�:�&��V���DC5l�O"q�Y�v�
�B���2,��"�
������������<�V^��Y-����Y�����
{U����`'�U�?�U�sN,��T�.zw����?�X��$6!��,W�X5�i��\94p��)���V*��I��x42�
[�M=�=rpZ"[�p��
w����vcJ���h��la�
7,�
���fT�
z�4.�'Yu<�D��wcYp�K&�����	��A�@w�{�i^�ya��������v�ZE�\��fy�F����<��9��E�a	�h�d�,<=���|��Z�}���
F����[�6V-�q��?�NKds~�RY��I��%�T�<=��ED�
g������b������}t���f{�%������W�dy�!��Y�y���
B�~g��v��
;��}�M��~w~���I��wcZ	�'�R���=L��
n�A���Ff�Qb�1��G��L��J����h�r
v@�X�B����I��|wc���t
��5���`���8-�
 V�+�f
%����S3N,���l�L4�j����ED��a�P���f5pb;= �\��f��o�A�H�d�*3����UG������(]��uaS����0�&
�L��:�
��������4�A�`��PZ{���"�f-�]��r���i{dh������.�t9\�j�d�`�(�X�#r���>����P�_��d�Z������?�g����mb���v��@D���<_�:��� �M(�5�o7�,��Ln�����^��K��qp��Ou�A#Z�Bau(K�w���>[�ium�����'L9����n���bx���W���#���b�nZ�4
b;��/�����1m�@�T"�0)��l:M���=�����}�����6a�8F�{�{�dn���������y���Xo��v��zAf��{E��!m������&FS��n0�4�z
v?3]���x2��M	x�V8|��W/��T��M�K���$�D��f�nZ}$�mX�<��j�i�>��E]��0}~�+�F�]�� �p�U�&��4k�7�.�l	8��|����T�;f����Zz���5;n���&LC���%�5��'��Fy����(�i��*	7����x����;�z;0�-��!�p���9g���3N���M�`a�����
F��U*�����u��-���#=���i�r��V����%U���a�o�i���vv����=���<���f�Q���K�����K�9oW�������7����Z����ciB��K,�E$�w�H���%�	��Agzr4k37X\t��.N��h�Y�A�!�{�����"���v������+��
����O�[_���-����ba����s�F��������'z�����]u�+��G�`�b�4�{zu=gf�{���n9����E����L�O��n�^�"��7����N��G�f@���������f6q\w�g����p�y
�L5[�?f��A^?%����h��!H�dv��'a�v+`w�
/�bK� �[���C�*����q�����	�-��V5��9HOS�I��z�4g|y
�;��Yy��M�t�3�����5�	,�$�����;K������ B��sg�&�w��i8��,�)z�
V���\Ule%�w;�OK������A!�o���T}:3�<��y���]�OS���B��3Y���'�{��i8�,���A�W�`��bakR�Oa�o�Vr�_�!�,Kl����PSK��,���>�Y��h����kF����eg��
������?�R>�� ��D�_��1��m �dV�.�aa�:H�����Y�����,�E,�%2�(��V+�������`�����
�
:��Md�w,wz��_�3���h����{��k�������lQ�2����-��o�/��p�
����&�^�mi������	m���W8��E��x�	I�n^�E�t�ko��mg���a{%��PH,�#v�6/[^LB�dUb}��`�[�������r�����g�c�����U���C�)�5����`���3�b���Rwe��:X$����%�|X!��vx���,{J	��c6X�-���MOKd#����f��b�_wug[W/_
����N�k�jAWV )v0���D��1m15I�pw���nO^��-����T��pa<�M3�c ���9z�VV�(v/	=���=�!hz���=�}J���6O�f�6f�[�i�6��5>����4�
/z�#p���n�_>���>�>���n���D����	|\h�J��%6/w&�a� %V�4Q���K������SR��U������������r8�89�g�%X�>�+9��D64a�=��������a,���������YI���7��B(X�=��f�AV��t���U0�!�8�S���'��f:a>Y��3UZ�P�P,T	k�=.t�_�O�k��~#���JQ�.��lF��[�j���G�GN��V��t������`3���J�~#AC�2��x�.hQh���zZ"[����$_[���:	�BO,t�HJw�r:=�-
�1j���}���Pfq�G�	�F�����M�{J��Wx=o&�bE\��J��#q����X��L�r�����Y����!�|��{�wK�&�>k�vX_%qZ��v�J�W�Ol�����W+���/T������%+m���}t��$�`a�p�+!Y���[m�^'�Eq����p�,�w���=b���xzL2��@��p#z-�������be����aJY�,J�~0�w�	�Xj��.0�<�
�`idAlB
�[~�C7�;?���QZ��~���������w��gt	�;Z�YZ�9g�:,{����i���nK&'l!K&w��$���W���17��n��i�l.2�f�0&�Daif.�VL���4-�	��K)��}3V�U�;��O�
�_�	���jS��R=�~e������j��)&�.��
v��X)&CK^lf��/A?�rQ��lF	�n.��p�c��,E��w8gY����.����i8���������������`3�t��v&N)zw?
�sz%mo���5m���y�|T��1����N����GF�
�	�*��uN�E�#2�E�[�C �
s���5��N`6!��-��a��zqa��<x�>�{�I��>����h���OdKv;M��:�6
����K���-�I�����X��a��C[�0�JTS<V~���hX�%��,4�������� �O�;�X�wO��.b;�#�b���qz���������f)6��yK?�(tJ$$?V����)*���hbV/v��hx��T����|�{w��c�~L8��C	bY�V�^�uz����GB�D0����X�$�lBg���2l��X,Nu}���b*	bS���n9$���84�0 z�����j�����M�5��~XPH4�$�*�J?LWZ�J��{���0�f��I
�}�Y�.E}�nu ���H���3����h	y���<8�V�~I9=�
 ���������ai��l�����������44s>���3�������3
|KC?,���v6��6���nD�x�B��Y�:"v�&vZ^�L�Ita�D��V?{W��;���tY�VV�'v�XI��&{�I��{�e�������(`��������},��093�{��p>�Y�����������T}8�}.*�XU�L�=V������$�x{���v��U�ufymP�������D��c�c��U��\G����.:2���Y��k���
4�P�X?�z����|��0}"�E���D��c��:
�n����b���'fi�b�F����1��D'd�?��)�aV:h6����|0��]7?�=���K���������M��R<N�f>V-~�?>�����D)�c�����������������1#z���gS�~�>����n�1���q�`���a9Y�5�a����Y�N��^�sB����bX.�������|�C�G������>�5��9Q��X%6�=6	��p>�`�C�PI�#C�q�ZJ���{������	�����bw�{�Xx�,_V�������'�#%h��.������D��%f�7h�����1�`f���M�O�
�cm�]��r��%�x����OQ�{v�7A���>�q�	����N�kc��������3���i��=�'%��j���,�`3����>0�����}���O���<���X����E���`�X>/��;��:��z�cI�3�Xi�XXg)v?�,&g&�mA](:-z�
aEr/�Ib���^_�)��=�����}�c=37H������[�����>	����!:�N�f�0{�4�L��x�����)"��$	���:�=V|��#ISN(b>�~��$�]��4��'�����=K������t���;��p�iym�A'v��8
�]:2��Z~`�K�t�#��
�o�g����f��,��0}@���Bagn���Tm�1�b��X��y�5L���q&b	��	��p���y��ut@�H�f�L�?L�X4lg��B�.����O+d��������"S;]�8��w�`��������������E�L��E��4���������;�]�tF+%?�p$�����L�w|y�N�is��RN��������X6t�g���xY>.��i6!��X��a����R@�������2S�U�6i�L&�%������;`LL���������I(l�aa�e�{�i�lu������0a�T��Tm���s�}+>
g������.X��-~�
P�/��J<-��&7,��k��GN3����EC_�G�W7a�}��K�MeCZ���SL��$�A�9~�!+�"j�W5��`La&�?�f�Z>K��-�����X���H��~*A�L����}���~�������sf�V+�����3$�����3�����	A��ux���J�VH�:S]cYg��A���q�&���C���a$��h�����B>���h��D-;[�������>6C`.~�zr�m0�I����sX!y0G�h�;E��hy�j�T�= f,��a)v�1��5���v������� ���Gl�������aqe<�:���,��������L���������f�����5����w�LVeX��"�#D����G���
<-����S��D4{X�x��hx�+����S�/O���ZX�I,T�[������Z4[��WV�,{��f;���$���`�F�0o_lciUbK"�?��;�������b++��Wa$X��������Vs��q�{x�4U[#������:
g��I��.,mClg^G�����&�����[��l����?��E��&$1����+�X��Y��-6�'"R�����E�?���r������%���P�+����w��{���I����m/�i�lA��B��%"{d��/v1���]���D���4L��x��?�#Qf0������@+���^�f�*����%ECj��S�4U[},�$z%�Kk;x�:lQ���a�b�[�/��{�%D�u�t�I�8Q�5�ue�D/�ph�p-���X�g;+����O���������4��������S�E�;������['6T��O��|e�4�����	
���4��+���DW�1?�� �.�9�g��$&�)*���n������6�S]Y����}�v+�D��!O��\gU�W��b���RVEO���C��g���%u�V�G3��
����->x���f���P�Y���E4��Z���.�`3�0�
�x�n0�0��
M��s�{����+
�F�Vd�;.�ihI��Ou&�,��p���`a�����1�,4����_#�:#���G�3�r8��)�~��K�4U["L�X��UF����A����ni����"`�e�+�[`6���zL[0D&:ni��%��>L����x���5�N������z���Y�0�/}iCV�/SN,���/4�H��#9���%pzH"���4P�l���|�D�����^p9��;
��a����������L#u"��t�������2�,�~4.�x��+d�����hAw�26�����l���`wg�iym������p�j��N�Q��q%��
��5��O����>d�b��E��W��l��k3f\M���]�^����`atg|&��V�v"<T$���$Sf�/�|�T���<;-�-T��J
��h�����3���L�8&��DW�a��cfAo��/L0vw����"�:���C,�v0�"��Dk�a�`W���#+�;,�K������X����fc�P�3x��.-�
ze����LwXC�m9�MyX�v@oW����U���LmN0�a-[8�8��)�tq��$GYw�L��'<^����Y�7�w���%Sbi��/QAW���W��=�2�x��R��3;���nw�����;\�����������w��h}��Y��*}:��Y�x0�b�t��1��K/�RH�����3_������f�ybawT�s�f���|Z"����!hzE��1F,���1���q3�PI�E�<;���/�H	��2��+��H��L>���4��^0�$��Lv�����M=��6�'�q�Q.y�-�Z"[���2U���~����4]k��N8N��<�5'/r��24���S}N�iK�����R���k�$X�t����������`Z��a6���^�v��a&��Z]�^����1;p�[�4S�10,��'c�[�x@i��Xb#�d�������~�������,��:3�d50]�phf�e,
=`zF�f���}�������w���pa��2-�B�7��%>�24��W������b:��'�4J���[���1mu�W6�0�l�Y�K5�6�k9���Q�����e_KJ��})����#3;X�.8y�B7�����Z��e�<��"���D�be0b��k;-Q�����~��x�G��b������b��&v%$^�Q��j"�������b��)'\��U�a�,��;��`������)�L������b�3=.�l2�%��Vwzu�cFd��Q<l���hy��)�p�s��]�=����k�n�BO4lB-v��z��mE&�%��k�����z�p'���@w����T�_���
�����-����6��u^ta�vb'S5��>E������EC&�ms,��j{���E���GNHS�YMt�;�������/J���^b�haq-�t{�94m<�� j	X�P�CO@	{�q;S����N"���_z$���	��e�^bu�M�lz�2���/���~�h�K�j�����Xi�CM�m���-~xzLm,���Nx�x�N8��n�>��Yn���H�y������.��*3�u������
��`;���2�������_&�"���sO�bt�n+�	��Z�/<���[��4��fV�%v:�I|���BCK��,�m������bk�%�k��=-�r��,�{���
�{���c���~��x�����-V=.<j5�V.qZ^[�c	�	�����q[��e�h�a7t�-5U[��W����<2*�Ok����
��*�	]�M5�]����_�"�Aw���~�����&����m`��.�^BH�u�_xq�C�JS�8\����rxL+��LTK4�|3���<�U�tM�x-���� ���o�6�^�����%n}�v�M�X.�X��C,uw���lI������-���\�����/�xM_��M���Q�f�����}i���������Tm1mt���]��%eb�6������+�5�_��nf�[`�������e0�q���iym��t��a�+Q*�Z����u���)vKX8M��K�=�|K�tb9
U����o���_��H�,��>�q��!���|�}�2�{�iidV�,v%��^k��03����-0�YZ���Si�o������D�E�PO�����I���4��6�]�<t�[K�w��;�T^���kX�{��{�f���D����#�������/�u��g%6�)�Z"��y�Y�Y��&�sh�
��%.��H�S����
5��oBx�`bs�5����:��'*:�e�B+��j��qb]�����3�_��{v�0<=�m��#�r�J)y��l����9OO�k��J��6i��m��Ft5.�����o�&4��~���X�WNl�����b��h������~��Nd��)���7�������5���{'����n�����f0H�>S�m-����r������O\�	��M$�s;��wN����ck��nF�iym�2
|�
�^��g�+�~g�C��B�R������`����������D�pa�Y��vX����������U��T�j���[��F�$(��`'����9�l���L_�L������+A���k�������l�u��v�����3S�I��4��j*���T����_Xk4lia&������������u��3Xx_�^9}���R<NKd;��"	�[�l��Yw��]L
3/�M �
6��`b�XX�>UX����m���CcS�FaF�fa�lN��_�(/������a
��3%�V����38�O��{��A�]���_�����U;�����j��C�q��B���Z4�=���`+���������mr�P��9y�
��j�z��>�`�.��l�6��c�8��I���6X�/��DO���/�3Y2R�3����H���������L��������|����i�6�`U�R����[cz����_��/�=[2�2���Ld]t&�7-v>YX@4�^-,UB��h�4����$^��6��X&����&~b�Y��R4N�[��hg=�/�4\�p��4�������tO���z�����n�d	p����,K���<�v���hx����~�p��s�4!�������D��`���r8�p�R�K�i��s�1�T����,��:��]*�&m���a�hX\&v2�T�^/�`�5���e^����n	A�.v�S3<.�=��;����"��f�^B���i�6�X�����n�f�sO��O�W&
��eup��b1�b��Z������p�"U�y��&�Y�2���\af�_2��Dmd�%8  ���O8�X����O�f6=[�,U]te������
+�Y$���'L��S;(h�M������>����!md��$�,�O�dy�b;�b�][���DVI�LXI�dEBba����1��u>Y��hX-&���,�D
t�2�v��N�k#�I����Z�4���m�`��\��,<LK=��<�������{6#U:-)?���d�b�����
M��(z$�E���'4�D�U
s��e�m{zL�mLR^�b:�f%�����LP���'�K���2���W+s��nc�o�*�����gk�����d��������%��m�N�i���A?��Slg�S���O!�V���_E/~���.WlM�M+�O�S(��|���i�>�Y�����,����O��OV� ^m40L�Ag���3����asH��B�����0���h��S�:��E4��7F�gK���%���E�\V�P!Y,u�Z�>�aZ�~2}�����}� ?���4&�.���%�
3��.�9����;r�E���U\4%��|s��I�'��f�����E?��
���� ��)mw�
(h��l��p���yzL�l�H�4�,t�at�\:�����U�L�O���[%�����9"���Qd���1���yN����@86`����Y�Xz�v$T/�E�'�p���w�@+�=J�bo��MD?,C?a<*���`]�p��9��H�>��=
IKf�id��i��(>=��'���;�+����^h����'�`�1����O�i��^aO�$�`���{�@�^����i1�	�9���-h`����]�"���rZ^�m0]+�
oc�x������Gj[����\5�a�S��+��hN2-��Eg������U��6�4���%#j*L����p|��N�i�B���ye|�3uu�-szX�|2�s�}��9
��
:d����?S�����4��|�>p���h��"�n&� ��}.��I��������C�����gi.����T
���'����9��������x&�k��	W5hZC)(�*���`�Z�����W(���|��6���^e��_D�����A���E���F�+�xu���h�6-�
�hE��ub}�W���c���	dA�L���'���6����a���M��e�wS����)py�d��U�'�kx�
_����r���mO�ic��w�~2G���'L���v�}�6��H�:��$5M�
���\��0����3���	K�k��=
U��>[���)}H2eh���{����
�$wL�I&]X�xB;��.�����|y�V��f�����iJ�^�59��n<��Ul�k^����Ti�ty#�������Y�wo�q7������9����`��+�����"��H�~��j��-���]P�Bs�x�-<a2�h��"`x�X������6��f����,����.Q���fz�����C��/`��`���xzJ�|��(������j����h��,�.
�nI�����G_����I��B���yC�%S��L��'��	�������=[����s��,�/����D�e�e���.���e�ax���s#O�5���K���cL�b����[}Y�x1o��L*����������{x8������n�[b��5�0~�E��.���I���b��n�lM�X,��U
/>S'2��i��ux��\~L��DZ���M8��Eqa��������_�m��M-�gv��$�i��iS�=Xj�G�'�Xv���#.��.��+��*����z��`?=��v��0g�X��'����:
�=�(�,���qR,(�}���Lc�eI^��
5c�v����\��c��b	���(��]|�4U�OL@4�-���������]Y���]��0U�.�L������!�T�D��Hb���b�U�m�g7��������Y��3�t��.V/�m[�iym��#�����l?��2hz��A��f
(L���a^�����gYP\h&~�,���[���	-K�.��'z���ImQ�	��eR��R��d�L/�&v�������%��|����EW�!oR�J��,���[��,�����K,<�4�D�e)Q���z��w�@������i�|���|���~�G$���f��BK]��������B>^Y��hx���e�g�F&���������D���0v�q���%L}wT*���SM(,��.��&�B;[z�0d�iEZ<nbu-a���'�=f{�V�!]a�����|@���I�C�����C��$-Qx��(����%^���4]X�Yh#��������%��c���m*
S������C�BuY��q�Z�t1a>��-�XX��,b���X�t��vpc(�C��B��F��Z�}���49B�����
���k{C�3F�M>������4[Y�g��������s7\��6�=;�A#�T�#h��,��M��^]LxU��u�����JE?��vd\�]0{C4�	v/�<M�v�kJ4��lQ��D=E?���#Cg����{���;��&<�.�?&aN]�0gBBpY\s���k�K�E.���~�/�g�����	��eaNX�#z�H��Zx�Vh�h�0�Bb�[����6�`$,�A���1y\�����!��L����{����D���%�
�E��v�m{gO3�S"$�
o4��0���%�9��e��]j�r8_`3�|]�*-�WL�j����������B/��k+Z:
g�	��C}a�� ��B%�es���f����>�`���D�v�;=��'_��+�4Z*�D�-��g�����&��
;-��\�������h��Yu��D�545n�Sj��sA��2H��Kl�6���$l��p�Y�6������wI�.QMV�[w�<��S�]�������y3�@����D��pah&.)��]L�V4�����B3Jz���z��	��^LiN�."}��->X�4M�	v$�u,��.	zd������
�J������zE���l}���iE��L���k�L��eqw���������Tv���	s���������%c�������K���A�3���%�����������\��-�������8S�j-�����p�9K����0Jl�T�YC�����K���H�4�`���a�Z�f���Va�
�]���-�L���{a��pA����V������y��D�����/m��I����u��
7�cF&v�8�����.�Y���0���q��� ���@-�E�2��m@1�Y��~���%F��;7�V��.����j3
��`������ub�c
��-Eh�2q�F�c{�OKd�ZMAX&��Y�C3��>e�'i��F3����+�l��������f�t��cV?&9^M��gv����<Ur4�Fi�I����A���)�pq2�w6�60YQ��l���/�%L#��Q���l��4OO9���Q�/���������*�"��~����f������������x����g�Qa���n6�i��W6��e�`f)Y�_����MOd���H����qzL^�f�t�gC)4��w��Qov/9-��6;3�n�F���=��~�{(��t���6�P�tA�?�,*^4��Y�l>!�_�M
�iv"���^p$�8���6�W�2g��l���l��T)��$FFq��^a�����M��*��~�E�?f����`�		���;o������B��������B����}���	��M7�v@�V������f�HI����e�Y�����EQ�������7�����Y�%:���n���
��C�%���=���~g
/�:���	���D5�t���6�������h�������+|�>��*��?��e�2��
�fM�Yx�
v��:=��'��iz/�=�l���N�-�E6�"(��t�ge��.�$���D,Y�U�f�3fw���T}�#Q9�����r�4U�H���.�w��� ���==�9�����vI<
�S��A3]���:Q���������7c�4�H��t��������I�R�~Yx[�l�����$@	9�+�Y�U��eM���!l��j6E`��)Gn��WWW9D�8X������,��7�o�������M��]�m��T�3�<�f1���	l�|�{���1m��#�0�D��p����M<�m x���������J��g�A��f��1m�@S�3s��>���y&��
6�>�P�����Hx|���$b�Vh����e�{p�>o`\.���g������e5	������0�0��I{|���?���lAB^f�{��1}������6����z	vn���c�|��G�3p��L��OS��wA?��"U[x���a�������\�(�M/�R���x�}�.X��9�7��l���
)���E�0���_�NOi	��n��l��u���"%�+���M���>{���a�	��`����D�����i���N	��1��8���6$�kz/]>
g�
�����N��~B����{Z"�L����Qq���[��ium�Ac8����4�-/$�d��H�P"�������1m!aZ��n;/-��e��~[1�������p6'`JJ��^���{}4#���'��J�`+L0��]^��.���m��#���9�>]�f.�b��+����������>
������)}mM����4|��q�0�������?��	��uu4[���~�"��T��0'��w�p ���.���=?��X�CW(�8�f����rL"��-(6c������7�L
����`�:���]_U��70�o�B��g�]��E$�kzB�O,{]������txM�m�;
g��>�D���?�I���|�,��^�`Y�3��r�i�	����8�����ta���x�� 6��������p����S�7��+}���?�m>�kFbM�L�/����bY���Az��3q�is�)D�}v}���j��H>�4�7��2�]s���>��\��=�K
l�,�W7;a���ef���M��P���T�����}z�E��	l�q�����`^O%iC�b�O��,�{���������oAWh�I��m+�����6b�K/����>[,�4U@�����Q�>�d�B��LSr�%r��$Ig�e��~#��i`
�'�b�����p�S���m�tpaEu�'���}5�����/�.tU�W���T����W��E�����OS��*2cDf��T����B6
�0'��M���>=��S�s]���&���,�����}�gW"I�X�0`�����e&�'M�h��e^���/��������-S�e�����/.LX����fY����n�b+���	�y����l�N��,}�#g�3�������K��%�X�����h����������t�b%^X�'zn��i8�O��O4�e�J�	��J���S��~����Cl�6���t�&zN������	m>���~�:Q�Y,�[X�ZteY9bw��i�6��?F�dA�_6��������g8���1#��s$�'Q�R�M[�D��L7�b�X����^z�'���.,X��7K�4U��,
P4�y�?���`w7�=K_�8�2k�����������b�����D?�T,��;3�&��&@*�arHb������R��)�P��1Z��!������G$���",������p�Y���
�+�s�z��EU�5S�c���^<�z�4O��c�	��p��*t�������K�]��'�Wh�;�E�>�Z�����U�k��W��t;�_� �Y��h��
�&Su������	�Aw���lf��b����
�b�WxF������}Z"[@L~P���PO��a�A�+.�aXY�����qY��g������P�C4Th��l�4,�e�"������+�2�eU�B[�aX�Bl�&b��]b��'eZ��\Yg����/6�\;7K�4UO����|����1�����3<#4�LJ�%q�5�?,�gK�{v%���x<�$��r�e�n��`�m���`q�I��*���M���������A?�p[AoY�m�}���"�~J;&
��.<�?�+cN[�v�

�@+dI��Dba��7�Zg�0��{��i8[m�6����4-Z��}^�p�`�FA�]0���i57���X��#�r8.�S,����k5=n�������E/���������/����{�F=��y����&�����t�4�i��B�����z9������4��H7~"����L�o���Z<�0��b_���Y�Y	�Z�~����b���+��% e�j��������l��P?���o������Yw��H�P�5g'���Y��FO�\[<v�M�����{��upot�=!�U,�\�	(�c��b�=���X,�0�d���D/��!v7���
�"�y�����"���j�E��j������m��
4	K���XX��,��h��W1~��b!m�s,�����	���A2���3)x'$��U��U����lj�����T�{�%�^+ZX�-ei�?�J�*�R��%ei����[�XXql���t���C3YE���F��������4|��������?M���Zk���$6���~b2��a�H�^v�m[��1m�@�����
��`g���L3����2�-���2�i�>�a����"g����Lm@��������p>����L����@�Z-�%��`����"q�x�J�8c�Y�j2��N�`9�R�����M�z��~���;3��-.L�Xt�j@�6������;���7��2�Vi.�;1%X��F�L����4�7�_�`a��q��i=�Vk3�N�k#�	K�~��-�g�J�9aTZ���
�x+���X����I%gJ�-�\�<���3I��.0>#n;���'���%���)���i�Z�}K(=
g�J��7�gx�_<#'���t��L����	�����,�_hV.Y���9�cV!����Z<'�a^C����b��������7�j����������p�If�e����%s���P5�4�����/�2���}uO+��Bp�(�J�b�r�������bf���
$�3}"�&!�S��\YI��N?�����
�evz�e�R�[V����W��Q���Nf�������J�:F�W�S-\�x���Bb'��y��V$�%j
��a8Z����F���Tm�0`�����e�vB�,��S��3
��v+:
g3�%b���.��#!�������?o�����i�->tzL�@LqB���@�Bmn���(vm�%����-"�a��o�~�az1�K�����V�v4hE��B���Q�,�i�����������-ECY4����I'"��
�P�NtKV+4�"Xw�M�
�;c4l��v��'��3��k�( �G��%���{���*�������a�>�J����^L�J�f�fj��V��b'�dK�H����Z�o��<����n��l9���L�W��&y���&+&��o9X���YC�A�����2�hX�&f��������%A����d���
��u�7��~^M�>�@�Pa���%��3���b��)w�~���b�ibg"��Z������H���;M�&��=`������<>_a���#Rb4�L%Y44��2vb��k�Lt�����MG3;�����L'�j���t�Lg.X����tj[�U=L�b�z(�n���J�dK�q��U��X!��p#0
W�|������g��,S,���6���c�df��w	�{v��g����S�Pg���k���/�S����[�)'z����!G7��������>M�'t��$:}W����P�����*QjW��Z�����5��=M�'�iI����z�LX�W��Wy�2X�E����"�?��eV+�Y]Y����A$�
^�m�gmQ����}��-�{��{v������21n"��Z��2-�{?�{�AG�#���U�������*��2���L�TK�B�C�������$e��n��0�?�]u���6��G"h��\,u�>2�����b-��-#���64��K���F�z�������b�
��������f}��i+�������qpY��������*���������M?W�V��9�7��9���n�9iR�����m�����YR���3�xw������|�{v�X��YI���	)[E�fJ	����+�y��5�l��m�=N9Z8����"�����"L���lfel?�+�h��<���7���aTsNt����p'�R*�G�@�Dl&��
�:B_e��
^,���e/Q�,�|%���BZ����:�Z��B��_��5���Z������Y�������~���L��������1��V��!�C�Ol������A��q���"1�D��j-[<��Uu�vQHT:�%=4�5�s��o�i+���0l���0l�7��;<F$*�����+f���h������������
�h��E�3��y����Z�&{�%t+��
���.hy[t�Up+t%�f[�X������	�h4�D�j�_�&D�6�
42����KU��]0H�q���u������
^F,�cx;	���K�0+V
���/k$W��4-���rj����PE?�T�<�G�����8��w*s���Ao)o����,9����
'�`��KM��/�u��o����i�|�P�A��=p�,���������>	i�j��
������6��i�6�`~F�&}�O������L~�$W�S^0��*�������Za������e/�e�C�?l�&ZW+;�F�W&����{c���&�tZ&~������DB5����{�<3�����]\$X�����S��/o��sc7*��e��?�B7k,��,s��y�F�����K�f����34�BC�@���x���s�j�T��&&3��#�&�8�������6/�����N�#�#F�\���>^\������`����T��
���.�Z�XX_�.}sz���	W5|^��ivK�8Muz�p���j��<�vm�'���hy��)f�wo6��Y�y�
':��hVg��x���#e�D�V��rc���<	�&�}���K�=Yr�X(�!v�4|zL�L&Y4'a�G����&B�������L3��L�V��rc���|j������1��5nB-�Y$�1_��E�#oZ$���$��
��h.�_�$V��ClVn,p"z�������3v�U�|���s��We��qx��_}�N+d�U��f*B3:�2���$�~�
����u��
 xk��@�Gf��b����������d*ECm�f����i3��U9�p����i�6c�mh�b������	��*#'���tpc~�'+k��	��f�����p�u��c}$�fj_���
/�����f��>M5�����.&�'j����������R�E�,�O�W��p�W�0L,\�F�Qx����\f���3���b������K?-������>��e��i:Q9�,9��^���^�#Q�����n��Bw�z��\z����g:�R�d��m9X��r���L2L��#$���}�N&��,���.Afym��������`�<i�������C:{����b���+����^�>�Wk���������+���{��i�6d�?�+�>��+�[�qsl�3!��,H
U�E�tG�P+�wX�}�/a�e�_�n�I��J����]�=s_��7
��aT��Y��&4��.N7��E����12��I5<s��j8�&zn��i8�10� y�+8
m�G�>l�vW*8���':\�"�&��Y��X(,%�U�z��=���'7�f8K���-�x�]�{���t����'�q��-6!c�,7�`<��d~����<M�f]����]��B�Y�+cX��������]����7�`��1��V��������hz�L�Mh�6e�m��H��	K9Q5���
��D?0Aw�O�vw���7�9����`4<�����������`G���fx����S���n�Q+
��V`�F_��D��Da9��K�&�i���X��ucjf�4��g���t
F��g������X}�h���l�MbA���E/�)#AjL����2{��'h�MS&�������tz���%���
F�����b'��"�k�%��}��%��6�4�|�v�B�`2h\��I�;����w�1���j���`ae�9���Y�6�=�0�#���AD���sX�����t`HB��4.�F��T�[�{��N>>��M��4S[��a4<V4pb�6��'z33O�����S���}�]���	{���
����4�?����U2F35���nL�[��R�wn!��cZgv
��v5��[&}�L	���i�%���SNv^j\�2���;Y��A��)>f��H�\xcjd����B1�D�n|����3�����v(�5����ba�`�	���P0W4l�%v�K��'�w��x�y,���`�U���9,f��G���qK?�/+���K��]N����nav��L&|���mb\xu��8�B?���V��1�'�e��,O��<�����-���\b0�/���vY������
�?�_�;K~,�U���M��BH���'����������ze�����=
kl�f�`�A$��t���K���pC�7]4}t�6�,�rY�]y8�Y��|A{�5���N���K��"�p�8h�el�����~�&D���,i����u����~��u��w�":g�au�b�:�e�N;Z�{v�m���#�����p��C��h�U
[���"���S��"jn7��X�^,<0E�(l-5�����Y�f�uc����Th7\�p�9�_]�����C��+v���.�?�����!�!
�N�v�8�S�n��g�;T*�Y���UJ��5��i�E�C��.V��qY|���>_�4����
{���/P�|���.�@Vn7���r;up��sL����Y��QV�-6��
���;�[(�o6}7f��
��4��a��~5/����|rn�#���F������"����8���j�lSH�?���.������
� M��S�p�������6�t�h�_y�09�dw���X��h����7[�hZ����g�I_��FbaI���<O������������`�7����
+N�V��iV_7V�$z1I�XX�*v�� �	3z����@�7�1Y����e��~|�p5l+����n��_4�u�U	�Ku����EC����u7���lV�����
�o�f���R��W�0�l�]����O�X��h��$��������Yn�7��j�#��m�==E��t�	�N@c� ��x���c`�pY����`�k�W��B�J������`;�K��p�����\I�[���o�}m�����ib\��(6oR�����!�^p-,}5|�������b����"�`��a�#U|�n��"+�}�`$�Xq��|��9{�_������.�q�^��X�(�M5�L%������)��z|�Y���r�1��hV�/�n���a
C�}��n�����u`�z�D��<r���.��uco ����O#����T����-�Av�9hc��n��{v������Ew:�Q8N���fu�KP��j.D�m�`������{�����O��d���`a�I(���c���
f���1b���������4�h�,��7,|��QG��Al�����o��S4-��L�&�b�F�Y���"O0���-��@��-��m:���A_p�=��2��Ku�����w�$��<�%�4z]8Z������]4L�uu����<m�+���6���:j����[���X��i��+�����=���^l�`�^��{�~�������H���y}�3���}o�Z8���^��CBt�����G����4���@VJM������4AY����4\DI�#a���C�{q;��f�<���������!��u���_��:}x7����KB�����\���+�	��]p�|��9�k�|Kl�o��9�#�`����}
N�fs}cNQ��jT�z�m�>%|e����K��^�lLb!z���#p��L��O���,�lE���Z_s�v�������o%{Uv��ro�\9��?���m�����IG|��.��M����.PxF����Y����(����h:����l��7�D
������=vw��`�
K)��u�.�\��RT�g'�N�;�q+yV��iZ7�||�9;`�BWM�C/n�C��'o�:�H�k[_I%�����i�Vjj����2M��*{6�7��"#;�����~@y��t�5����GZ@���6hZ�"&X�����yH�n���bI�aBg�T���:��UAA��`���D��$�E�t/1z���j�F_�_s4T�RZ����~sZH����X���6U�����~ml�.���v�^tV#�����1��B���n��4�XF(���N+���e#�J��fr-)o�s`��t���i����o��aJ&XZ������(o�Q4���T�6��D���s�n5,geGo���v�������Ff�J���
:pE����9�fa�=�.�V��e����<6z7��'����	�N������:z������n���Y�w8\|`�:F#�PD����[���|[����b��v�bca��P��-���'�6�m��,��4�-���S�u7��g>D�a�Q���%�*�w�e�0�+�f��s��'&z\��4Pa��-W�L8%���S��R�/�E:��>��n�{gRH�w�����Y��h(��V�s�rVF�����s�c�{=v��]�v~B:P��v���p��i�����w����!��|�[���A�l���d����#W�Y���$���J�b��Y�W��T��"�"�M��/�`a���:�f�n�1��e���`�]��	���U���"�"�Ct�m?g;�[��'��t��K�d�M�N��;*K)+�;��������8�!�����A��5
����
!�����V�Lp'6�}��w���[��Y?��Y8����Y���~q��c�<.��������W�A����E�y�x�Vt�����<'�i2/X�w�p"�Mw7��:S7��
R�����O3�~6
�ba��.
����>:�o�`�N���mh�� ���SAV�*v�jo_5������%�u������"/�:�NV�!�f.,���6SdUyv�
4�k���bu+��\��a�������n���'���l�����Ku��v�E���M�bb|���Y���PU������n�v�9w���D���v������X�=�p�W�
;7�V0��F�����Yw��
D�`�de�bG�b�M��/�T
OcK�c�^0{��+�d�F*2E�i�m3��������)	b/�����VCg��h�W�t�.V�%����X��
vV�Y��;�"U��������]��6�|&���w��57���O�	I�y7X������03(�������8F:k���F���u�Z������n���<.
d�pI�
mMv��-��w��;S�����n8�Y{�h���~H�4n�;�Os3C�4wf�}������fa�-K3�g
v:��
������.����z�Ku<A�"�r���+�`g%�d�3-&��0��L�,v�=��M:���O�w%�����T8���A���v7�Xf�E3��Y)��)�3��h�9�����8c��2>9��H;���,�g(n���i�q�W�x�E�wJ8m.��d�������Y�E���:
���������(o7E�,�~h�Xx\��A�4q��\.���M��fK�O��
���>xA�
�`��}�\������)rW�A���3X�����>������[<w���	�M�������������M�^L�,z�~h���q�6�6���"}��/�R;�������tw���;aa���.�4nrrl����["�-���`�q��R�i]rnz=.h��;��L,<Q��	���^�E��~�p���`�,�����umS3�^��W�^G��=4��������r���IC���)������ej�m������<wX`#���hd��S4�J�wS���I��h8E���S��p� ��iT7U�0/2E�����.���U�V+�.��}��y�D���F���:~b�7��o��}a]����
�����5���nz?�P��b��
������3���I���R(n�
�J��-���:~�i{�0��L��R��M���2���"�'��n��������`i�D�3-�v���9�E����1@
Ot1������t<=2�a�d�����Z_���*h����;��&����4b+u+V.w��'m2�~�U��Ku,������l)�"QITqKY��asi��,L��������\�n0-�1|;+I.k�;,	z��N
e�_��������<�8����s/�9�?�������6���C�U�Ph(����=k~��� "0�-e2�t)��_����n��������;���6EW������:E�-0���b�W��������"�����Q,�0�r]��||��7"z�\����y<.{��]���a�]<X�hX? v��c������M
���d��������Z�pc],��������������(�B�kX�@?��%��U��v*�|,�u���Z��-O�R�t����O�K��&�EC��X��'4Ws����
���2bo��0�Z��.�&����C���-��-����b/��-������/L�cE��6
�Z9�Y��XD���V:�)r���D�`&�|���Rw��I�?lS�#s����Ym'z�
�a;t!t�z�JD��S.�����������t�,�~����9x�Q���7l���Kt��>gi ,+u�i?l��J-z�����S�/�h��A�`�YX�'�4���6%Iv��p��gE��)�f��
�E���p7�?��oJ0=�M^�_�A��������������j8D�"2�7��E�b��b7E(�p�at�|������K���!�@p�4\W�h]�S:����v0x�Q�
��f���6-x����'Lp<:q�}��]�w����S���s6['w���f���f�s��f��u�0�k.�����k�
l��sX
��}��H��u���f(d�l���nz.���a�5���u^��Rz�-����()5k57�t�pI�]8vX�M�+$�n�4������E��Y����b������-X^����>;QFW�f?k;�a����8��1S����9n������R��9���F�������)z�
`����/��(9gMb�B/�h�Y����r��1������C�K0n6�w��������������uw���`bF43���o/9�*��C ��]*�������3a|gM���0-���lk��
�rD/��W)�wc�hVM'����F-X3�e��`���.��!��B4]t2$���1�
���~�VN��YX�c�4�T���-�H�m���b��aS,���
�oZ�<��!��L�K�O���twN�Nv-wva��N��R3b�5�Uz��\������Y,����
�x���;	��E5SH�-�[�=`�&���Z+=�[��ErC��X�	�=�hz��-�&&d���C�p�,T
��`JNl���a���+��'��[�TG1��(�V"�y0�
b�a��`m�O�M�`�I�EOX)%1tJ�.���S���V;�\T��T10�1���<"8Cq���@N�Jf�N�9��mFSHnY�5���B�mM�����a�,��mp�Bl%v��x�������*�ir�����6X�l>Huw�����ey���a/�����jT��-H]ue�����]����`��W]���w��$�par���
�����B.���	���:���j���H$����VZO����%���g��_U��OQ�D��fU�fr-:Lt,�T�ie��S������C�a��/�q������������:����p��1AC��XN����_���������w���{a�O��c(<�]�]����7�����	pvc�����2�svV���A���T��Yj�����mio7���~�T�-|w��\��8t�UtA���ZB�
�J���O��b��y�
��J����Ti�+�[V
�J����������e���E{)�*|��8Lq,*n���J�T�(�5�^��b����y�EwXPe�Y��+�cE��
��,6:�.�A}f#����K��|��zXMw ����Vl*[�]��&f]9�pXsL[��
L�G{m��rc��U%�8,�'vw��o��E/�["�-=,�F��Y\a��/�ZT��%�h��)t�t���L��v$|���g7��'�e���:b��k�U��X,<pHl^����yz�O4}
6�����U��.�~�V��cG������@>��H �jb��������b�,y$�9u�������D/���u�,}�I
��+N�������\_���p��,�,�} �{���X_r%���7�.���c[Pk����l�g��p��R�tw��`�� h��
Ub�a(��t ����W�������zL������b����h�0�Y?��t7��i���:�`	Y�������U��������������
�mp��u�[yG���E�g����R5���}w��F��u�~yd�-h�^�s_V]��b�~#2�����L�w��7��/K���/g��6\�6V�`�2C��3k��.5r������e;2�a����UZ{\��������~���e�_�������&�k���A�����l�M����,��m�����K?
ju�S4kG�����HVt����>�eu��'�id�X{�Dw��7���/|S��Lw�9��r�[�,,���^�
���������m��7�l�������jA�Zt��[ �1����p<�k����/VG#�,�>L�*6wr�����(���9��(�������f������x�����-�T����L�+z�z���G��������V���Vq7��F�A/x�2���u���-����?�����p�`�Q�7\b�%��fe�bW���M�XJ��p����`+U`���L&+��|U�pg�I���TW�r������:|b[��T5��W�>��������!�<�������eM������� �����f������:����;�V�����Q,MhK�^�������Mp_f�=��#�'!�� #}��}�W4����dh-�}a-V���Hl��]u%s`����K������/�`���M�c/��d�-����`�%�.}�������~������wEg��9�_}�3���?�oe����5G��u���
��}��
|��u�ia�nA�Ko������N]5�Y	�F������:Pe:�����_���s���q�.�6QC���Ec��8��zmu~��C4|f50Lkk����2��w}M�9���,������ck�u����������T����G4�h0��	|h|&����Kv����=
+����j+�%�u�J"��>�m�'"����'��r9�+����/,�:�!��\[����>ixH��[D�������	�[{�8������v})~��E�c��dBG�w%b�[_�_�m��G����.��+Ej�Q�P�t����X���EwXJ�"�^��!�u�x��d��O�����p������|7��
��l�.��l��{���E
|vT�gh����-=w�E`�-5����sK{����/�����:�iH���A��
���f����s7E�`����tz���s��Q�3%��z2��Xx,�Xx����A�M� X� �5��
����`�b\���������

�b�������.{{�_�����O��0�'�w�M���>z���\�2Hb��!���m�n��!����G��c ^{�_X38��d���|XX'2�
�d��nv�������9bag�P�G
�����z��O%h����3���t�d�u���]��J�hw~���:���_	�v�$���oTlj��M�CM�Ct�K{���{��>.]0/��
?��Mr�Z���^�l+�m�+nP��_�u�
W�b��V�o�klv����q��D���3&������6,�����A�e���#�r���g���~9g���,�����vS�����U7��N����9gWJ��f�aL�-���b���H��z�Um�������]�h�Sz1q��|�Q�M���]�!x��3��fY����b/&����W����H���'A;���Qj��oZ?�^�`)���X?g[j>��f�m�����:��K+�lE'��������2�����Y3f�,���ez�M����X��l|br���+0�M���"��
��U������6�o��"A�V�b;+��?H��By�����:m�������f�>�,(z������vS���]������gAs0m��0������s6��.��}��l���Z,�
[���V�O��}�/�����'J�n��"Nta4�OL�)�a�)b������>)s��"�O������Ft��q���o�7��=�#�jA���ZP���,�k�<�}X��XX,v���*+����u�����}X�����w�9���ie���+�
�y�N�Y�q+	$���nY�`u[f���cR�0�0{zZ�
�U��k�3��e�Ku���$��l���s�f�)b�B�����
G�0��S��L{�'��������u�-/:�����g�	�D�s����/�W�����-��-���LP���,�������ib�����S��nz�0}����������:���vk���%�B���E�F(��Z����Z�P$6}�w3�h�y�DV��72|��}������E������I���T�0�yd���e�;g}����E��'����[��Z29;��-��`&���O���aj-�V(5������p��qz�NX����s6��������2���	s��6��hMi�����L����r���3bo��.��:`��p��)	e4�;	�(Ff]����N��Px]7���.�|��n8G}��������4��Ku���r��/K����/�Yp��3JS����EF1Go���c�������r����j��������~V�y�w�����4�%\��c
*��r�������AC��X�5�
��O0���g�:����-��Q��
���`oX&l)���9.h���W�P����������P�����OeA���������Kj�+��
��u����O�g�.��ufa]���;���h���W����+=���b�����.>�OX�t�q���'����xG�q�� 6���n��f�D7��\�h�hX�������G�m�~��R#�����?�����w��8�k���;g\�J����m:a�h�Oi8"��,h�f4�RvW�8�F�N��JM�����:<m+���!:o���sk�d������:|y����I�-������L������E���q��M�^���^����:����i ���\���D����!LV>-����A�[Yx[8>����������4����G�j�-Y9����Vb4{�s���pAs�p\��n<���p/��{?��w���~�D�M�`,}�W��m����Vm���{�f��t��q�=K�'l��4�*%
�l�Z�MKZ$��;��v:EQ�w��g}�n�<�gV�n���<�#7&�����C'�A"�6�����NK����R n������GZ���s�?CS����w����>1[��wK�'t}��])��j���U}z�>���R:��S2����aQ�Ku�c	�a�����&=3���3��,<��l* ����X�(K2�2�2:J��,�����9a^K���	����v��h�_������q7�c`�b�
�9�B��z�6�	���[�R�
������/�V�;v,O���{��I�l���L;`L�K��l����5����I�p<���zZ:��}��_�}�Gy
,�X�2�e��b5���^���M��:�`��"h�9=����������N{��Tl>�ew��o�En|L��l,�]��K�����1�>FY #zB�f��nv�g>��+���{8��t\����K�T�����]���Cb���b��H�[y^O/����b�Y�U��}
��E��0����\��,;m�X�p��X�S,��{��4��2�r�����6���
4<r�,�>�������c/�<�X}���PF����/�K;�[���� ���.�|&��p��p�.��������������5��^_��Ftc��bs��R�1���l9ga������b���hY��os|Uv����_��[8h������_����s��:�E��qP�f���D�w��:����:g�p%�L7�|6��_��~Y��XU��c�`�q�b/���;����-|�^�,�E!�r�0&[8�|�;�X]���"�e
���G�tY��G.��.kx���Y�^��:�}��NJl%Of�b�������e��BK?���+:/f�����B������M�CV�(��B_��M� ��t��l����Bj�^Xr"���e�e��U	,��E9��Ypba���&�4nRZ���1���kV,�q
?/[��C�u��52}"�aUwbo_�-|�-^�lE��) i�a�l�
YY�Xe��������*��/K,�_Zi�]6Co�h�J(����sv1����V���7�����0|
�rj���x1�����TY�.���������}��}`^E����n�{1����NQ���+A���JSC<|$b�����^�m�IP����e�kIxe��9n���A7���k����]:|���0&	vTWv�.���T�v{t�9�D�
�X�h��a^$XZi�q�c�2�E?����s���e�O%�f��������b/��,��W��f�,�]0,�lg
�b�B{��
w���������6�_��mz7�?���I�
�����V���sj)�b�c���R��idY,��X�4��6\Y`K�)�a�EB[hkd����6h����������k���2�v���9���w��0F�A�>+�\X{������# XTtn_=g�,��������9��hA��4[��W�X��h��(� {���+�]���]Z����W4<��#����i��M�^�}'���o��_ �p�>������:b*]���/�������t+�np)$o��������W*sgg���e��b
_�����H�K�w
'��,��5��^+|��^izw����i���yd��2�^	��pe#�pef�����A��i�a@�a�d���$�������%v���o���������eB��t��-���p��`v�����)�TXci��I��KMnVC�h�-�
���8��?����F�,�w��/KeTX ln
����6��.����U6t��:�W}Y��]_����x��K$�|�n8�m0|�Jm�7��J_�u�����]���#=��a�!����V��,^����]��������Bx�7��P�4u�u����8�q��_����:���A��C��H���:�����;��h���:�a`�P�)�J���:(``���5������R�6�z�v���q�#�L�M��2����Tt���'6y�v��8�>7��Z76���a�]�
���~�T��|�
�@/�~���������nv>����i}����|�&���R�jAtN���J0l�����Aw��Z_=��h~����,)�k����k7,��_/���?���o�j�����-��Usr���]\~%-��n���D����Fi~�}=��s�?��m������|f;J����v����$����?g���,s��e?������>�^��>_;��l;�1�4_*�}}�
,����
�?��c��"��vZ�j��`���Q����tf����������t��lw��@ef��v7EN�����R�lJM�.u�R�p�����p�U�w���,���]5��2���fK����Q���f9�����+P&\JM�7��=���l"/����fY��Yv*������s{�?�A.j65��p2����+u��ru�/��l���CsX���D��~��C\��5�|e#��Tu�qE�?�a*��6���lj,�]�C>d�6�����|��9s6Z�p|u��f��"�j7�_�/�W1�j��>���q+��\$�6����
�&�L�K]_�8�K�,�,����E�i���g�Fo���7��,��|�0�u�3���q��1���u����oX8A7u�����\����i������f�]��.�Ui�����g���h�������9fC��������i���dv�F��k>7��g�L�-����j/���{��=?���`���������E�i�p����/:X������z����i�aF�^�(8�
U?���{���H
i���d)�+���Q��7��C����g���"s�YV�n��K������_���D�fs!��R|�md9��'H�q�i�|�3���1��"_�����	����d76�+?g�f��RP ���e�D��M�~F�������F�r3��~�&�C6����f�n�� �����2m�(��+�����;�,�6��c��s�?�Q������v��P�^?���us��W�����X��k����u^6�p���Lg��n8GPp�3h��1;�����p����lKe)��u���X�l�������M��72J�)�}�`��$\�*x��Hf�N�o�J�Es�W��W�m�#d4�N�0K��q���������'�{8p�5A��tv�9������������>�/��!����Y�u:E��I���9(@�v����s6+�v�����M�J����RE�dp�
�n��i�@Ge�g��pL4�d�/������m:&�����W����WXm xem��}��C�LjH�
+5nZ�mns�C����<
������E��SW^��I�>Tn��U��2������9m����IdE6��#��L�"��_��^�B��;l��X4�aG&o��_&�J����`���p��!����.u7��t��m:��}��lw���$L}�
��p��V0%���!����0/�q�/2�'�:�f�gX�b/��R����3����^~����9�����T���:W���a���D�<s���������I^�2]4rt��`���J���g6=�������J�s6o
�������f�n���M��9=��C �tv#��LU��]z'8��	*)��n�F�I5��/�F�o���u������6}��,6W:hB�C����t�?AO��2����s�F��?6m!�������M
��`|���}~��?�q�q����f��,��z���&��3s��E�T�n8�]�1G�� ���� ��
�yrZ�	�������}�?6��
���:�|w��~�"~N����+�eG���PM����2�@t��*l�,G0p}�������}�e'��*�_�!L&���b�x{��^*���05�k.L��=RH�
W4�^p�*�'H��w7EaI6l�cl�?Q��'�g�/�r����'�����
�#EX!��������:l9V�mX�p�g'���_����t��#b
����p�;��fG&���]5���_���9F����2 ��J��r�Jc�Hw�F�`�Ygf48K���:`�O�eu��������3�f�������/�E�7���
<.+{�R��U��z1��D���F(l�����
�[&�fA����l�9��K����^�v���N��m�&��D�w����_��/�������c-z��r�\���,������/��9��^��Bk>��|:e/;�ay���l�������X2���&��[`�n��%6d��TO,="��f�m��l������D_l�HlgY���<X� ��|p-�����W���bSNqw����"W��R�b�����TG@��'�2�Mir��a|��MG^L�l.�%if9L�����6�
�fS���R��� �*M#�m�������-�$��6
�})�+�������'�����<?���~�ouxW�s �J�E7����Y����>L�#�p0c��o��l_;�l^����\����, �a����$<���`[�]���8�����_1��J�0���YItZ�{1�����m�]0"��m��q����m�_��Wd�X�������-�_v�m����s7����}��������X��h�����In�����B��e�/��]p`^V�����h����e�Y������tD�j�E�FM�WAvY�{�]�����c�d��e���BN�*1yY�{����[AsY,{�r�4���2�:����%�g6��,I���XO�h�2����?���1�r@��A?0�/.k�����Ul�~3R�VV������
w9b�Y��,/�����m�=��w��V���u*�N��+�G��9��{�Y�{��W_��c��V������
���$����U����*�{����_�u��t����/�l�9|��d����H���\��e��������F�m������rfa�=���y���C�/x���p��c��O���@�]�c���	����������}�`}���\P^��^L�+z29�X�����ywm��^0��M/U�J�)������|���������^��g�s?����l�s�7��E��E�����}�#�/yTR�V$�s:�����������:��y����X�l�]<R33���9E��)�����
��/��9�P0X���C��T���]|�mQ4��[*�������hf�[YhX
}b�;��
����:bb��/X1����&f�O�����p������:��Iy�a��X&�[{9��i�����`���8��#J�_��U���]��rd��������xE
�?
��.�`��]����"G|L�&:�p7�Y~�EQ����owvn8;.��`��X��;aS�������;k���B ���:�$R�3��/��x�B�he�E��O�+
_/���W�i�m�+m�.����KDMg��f�,���yA/���s�U��K���$�	k42�d
�������iA��b9��/&f���n��]��/��+�b�+_��#:�w�N���9�`bA�c�������6_�;&���(����2�����sj���b=X��*�l6����_W�����)	
���UW�{K�i�{����uX��R�y�u�A?�����]��m�,+���p�D��H���7XxL��e��@sX��]Gt89_�]��s��Y�����.���d����\:�������>0��qas�K�e;3m�
��dv�-b+1�=��T������}�{E��	��g�\v,�s�Dg��9����<���]��/&JMs���I���z�r�������M�v��u�:l���r�FE4�"�`G�]�.�1.%��ag����p����x8\l����Q{���'��M���9�����a���b�w�.o��o&W��5��.����Y.v�����?�e[�f��nzoO/
�D�D�mI�,��	����m��M�4��
���e�7[����\�e��������n�����U��g�v�u�;.�!��$�,Q'�n"���r��|��E����u��|�������b�.��N���0]�o�0��s��D
{L�=���z6���������K*��}���T�YO�h��(v�������b����\w��^�l�/z��p7�C���Y�����������R\��"�0�Z��v���i�qw�����1�p�#�?�Nw���`���P�8|��k�P0)��T�S	��h��D���J�}�"J��R��U��Y�{����u��x�~���9N��������f�b�Nj�����
�Y���Z��V�'�bZ��+�Y+���P�z��{�z����E�7+�
��6���N�A��tH��[gQV�#a��~q�G.���v��n��FJ�`�iba��/��mx��p�����0�
?<�����8A1,�����7�k������a7�?�L.!�pN�m�.�[��Q�T�����M�7��M~��p���.o+xo�����������C4n��������7
��[�:!�����.�0���
�>�mPl.w<g�B��mo0��a19*�n��of+
���vV�jF����+��"�N��l�����tZ���z\V�&v��x3�V,�3����b�R`_��J�L�.I�����]�x������n��Z�5^�*%h�j�c��KW]���m����W4-m��.�4n�������|���p���xw���`����N���j����r{�~�%+�I+	��+ZI+~���m��
�kM�|%H��(�-��n�o�%�r��52�n�2��r��![�of(M��B��mKr�A��8o�i��G����f�b�p3�j_v�����LWv������������$���J���W���okta��hx:�X��h6�J�n�!��
�F�b��E����g�%��������NX0$�.|��L`�-�:o+x��=�Wz�o��������\��I[x�X
{�����D�-U�X
{35���&�W��}aNL,�a��6��v������D��A�pz��y<�pa�Z��x���:��yea�b��S�����fNZ��h��m0�0t����g��5�S�v���
fe��:�p�%X�����w�����������ba���m�_s������"x���&�n��R�i3�M�7�=�����p�����h���*z*\��'X�t^����H�vWZ�tO�����ef�+����nZo��t�1K��� �fK��Ole�V��={8��+�w|�H�Yx����#�����5R���J�l+����7����"�svU:����a1U��n3����'t��:U���#����v��,l5�:n^��U���Ta�p2v�#����d"hx,�XZ<lEGu�J{�(IVZ������`s�9�+������J+��.d��i�`��C��h<����h�
=$��k�9��P��/��<�n�P��T���]�7s��~��H>[���K���c*I}m��p��71%����j:��w����fz-��a!�R��4��Zv���	���!~
��H�lx����M��/-���6�&��o%������IA���n8�^pMt���Ra���fS�:�*�/�^PgS�����B����j�fm��R���G�#���|���-<�=>������"(�U��V���f���p:
��O*S�����=���hx���|��9��c�.���a��c���T��Yq�����<��Xx
W	��i�bY���|���.�%���fa�S����|l<}���4��;Y���^8�����a��hx��Gf��X��Xw��B����M3������NVG�k���Q�7=��>�G4+d�VD��M�#|��d7��p���p�������T�V��V�bMIb�C,�Mk�Tx��!GN�XV�`)O���z���Rqp�y������,�-�r��c�+<�E4K��������SQ��|���f�����~m52\��`�q����f�Q&��^�Re7��.�_"���������4C6i2����@�~X�[�d
�fY���|��n�����������tx����c���t�����Y�K���OBH�
�k�l����hA�Nb�L���.��=��>���4\�I�_	���7��6-�`������R��m"����-t0>6�>�&U4�W{����B��c������Y&b����c[�������q��.�F�X��_F���Z,�#�[���]:�I�{������m4�{a��h����#8C��vzl�}XC�h��!6;���J��c{�7	�������q1�*�(���,��)v��q�P6#��PM�\�����a�
��9Flc��ba��J�����I�Ew��1.+����W�O�f��`��+��'�#K�(b�����|�R��b����Ew��#�T�b���$��Y����r3��&��	r��ZLcr�>�Pa�4�+��	W��d�U�S���]��l>���-���Xh�����sv�w�#�Lw��0�d��_�`a�Sve����pQlE��4G��j�tz���s��z�D7�%!�2�
O��a~�Oe�j���z�Ew��
��<��6:1s��Y8W��^9�!��^�EtJ|�)����f��9�����|������s����	"��Up�+�6~�*�=g�I7c�`�M(<-���0nV^�f��\����M������,��<L#�.n�t+��H1�F����c��XD�)�
���du��eW�������)j_���9���Z���f�:H����dT��Jr�k����W�������:~b}��',��?TL�����I]J���
�|@��p[A�����UAE�XE������b3�U��G�N������P����p�Q�V6n��~�?[4�p��.����f=������Li��^�����s`���5,]�;�gE��t��)r���A�J��]�\
�'M/5�@�%=�����E��fg5
���N��6�U~���fF��7���bi��������$���~����]�s4����������j������i�d��%"�_2�B��]������u����#��nDmL�&���X,�~`��Ui|"|�1���3%�{����{�������MC��sz�p��*�.���/���A�p&;JD�@0��af�%��H\��"������������� ]l���h^��`/�F�W�?l���C�
vT�`��U�=�`�����mF����p����bYx��9-��`�#�xe^����UA_p�lns8g�7�������7��
�e]��W*��
���h�	6M��R�Q�[�s|I'��n�����d��~2�����x�����54AO������F�
�\����S	x����Y]ra�,�~��Zt�c�
��+���'�U��M)�g��>��7������E�
�`'��Y7O�H�M�������^�@P2t�!����O����_�]���*�����R
�9�����i��G����������9x���A�M��pD`�g�P����K��gr�)I��"O��<�Io��6���
�`WELf��������9:`^E�������{����(���5�9�r�Nf�+o=[���������D��v~7�����#�B{dV�%��	e����I�M��������S�
�<zU��=�b���OW-�,[9������=���'|�����|V��h���+����S����<�h��-��o���a9�fW8|b����������)[oSG���uT`���������(u7�����p��q��,z�,��|r�9��F��6>1a�hx���Q�!k6���)��6���Ol�]�n�A�9�������]f��LE�kf�U�E���U9x�B��Y��X:Z�d��b�Sfa�y��>���G��^G_LT.�i���|��q��i�����+A���P����>Oa7��3������s�qs��X7VU#�Nj���dw��	���t�oh'tc{����5r�e�.��f���v���+����sv�Zd��L���:a)s���Jl��M;7���x�D,�D
�N�����*��z�M��'�W2<�.��W�[
:o����'�m���/��p�D�WdT����^��I�K�"�+�(��P���1�h�W'6�fV�eO�����f�u�k�����s��&K��~�fuc:j��T�e?]4���-�����
�
e�fOb�cpw��D��Y4��Js�2,�L��.��:��FJ���bb��N�(�F4+�S���;���
�����G[4pV�:��g>�86��m����`��fSrn�?M�dx�:���Z����Eb��.�N�-L�����M������������tif�i�w�#2�����ixE�tQ��F��p�)�E���_QI�[��X��	�R���^����q�M�M�?���W���;"����L�I�rD�l�(l�k����]:�`�,����i6�6��)/}t>GZ��//��8�w7�k�0<!I4�I��d�YEx����(�Y8��Y:�C=��6�bG(6�����p8�������,nL,����`s���R�1��i�I�[��6�|WJ�[p
7�t����]��I��>x=�2n���,�m�aH��]�W�p�������uo�o��=-���������,���e�9gg���f�pc���������6�jcq�5cAO�2����H����`X�lK%���u��?��Y��.��tI���F�"wn�?'i_��i+uw�����t��f�/4��f!���}�V�ik���(��+{�������1Y9��.�!�
GJ�p<w��*EO��w��,fm�m�h+/6�M��T�p�Z���"��p�V����i�L�7��h��c���Js[����A�Va(,�<�������n��;}b���(\�����*�JS��_*�w
������]��rpGG�Sf/;�*6X�U���B����F�2����K#�pgw��0����;\p{����M��6�a���>Qx��W*�,K(d�������
_wm���R��"6�6�z�<�X��[P=7�e��
�b[0|6�e\�I�Z8l�Y���~p����_Z�}����M���!��D�*1��W
w���j�'��\L�20J�Xd�e�L�T0#��un+m�U�A/��7������m.
�d���f�7��pz��O��J�T^c����%��d�����d|���IH�
��	A_�L#W|A��6����������[��c�����VM�FU��_�=��yZE�����38��t��6����i_����k������`��h�����kt@���a5y���Z:���������z^a�T�)$�]�?��rF�R��[<�X�0�u�}��}�E���p�R�(�D������D�#o=r�U��<�MZ��������{ �b�G�����nv�.��'��9{�/���'���X����P��}��v�Y;X�]�*�H�]��e)D���sv�7Q�l���]�?��R3��pv�k�)#��=2�F*�~�e�
�� ���N�.�uEJ��j�v���7�y��[y�Y����%���k_5�����r3E��v��
w��^,Y!v����+��W��!�3;h����t���_Ew�;X���e�
b��lA�������?�������uR����u���W�+F�l4,�HX�[X�Xh�WMy�a��pw�YK�����!����k�K�aV���y�B�\�W� �J+6����TGml�F4�������B�l����O����mw����b��ow���Wt~���s�z]E��������,
.�a��bs��nz�-|���s��P��uliimo����o���D�>����������:��;`�F,\s{W��6����
���=1��h���F��}�`s�n���
��e������:b�a���5#���-�)m���DX���`Y@d/(������{E�BuT�D���l��@T�]������NDO��g.F�mH�]�tKt;+����l���;go���k.�}�m����k�������P=h�j�J����iEw�M!�a��b/��h��G�&���W8��rz��
��zT������:�arZ��}H�
�&�N��qa�Zl���nm0�y��l��s�vnf05[�{���3�������]��>��l��8��YnQ`D����^jD_�!�)�6��%X�v|�t8�,�ijX�*��
K*��;����:;�p�GW�{��a�^
��u�9A�����@�����|����ng�!fA3g��S�
Xb��n14�&����rmpzu~f�]��	�E��	�A����Ed;�;c]�l�?�
��e�-��Y�E��������(��v[�;k�
�';��aw��`}W���E|���R��
���AO��	v0H���fA������E����B�h�T��������S0�t�;�h�y>��p8XZ� �r
vS�X&f��
#�%�X���;�������1,�:}57�Y���Vg�I?	�V$;��P��O�e�4�7t�{�xd>,L\[
��I�
I���Vg�0�ncq�u�1���S����}*���,wX�;q�b~�K�&��	�~�U�^�^L�,z��V#���C��E���`a�vz����2u���d7�a<��:,����O�O�?gs�nzh�6���	?9%=v���
���`a�P�Y!�a�6��n0-,-�	vV:4����74����){]t��`�wgf��g4XZ�-u7,6���=eO���:���b���U�+����7P�\P�v��;,P
��*n�aX�%��,�-X�	���B�#�L������$��%�����^���7�YY���N�A��5[8�������;k��n�9�����um�aM�a�.�f�,+�py<�i���`w���3������=�=����+6'Y��Uz��������>g_�:
�rxi���J�����,M����O�������E/��6�.���|����`��ff��:�\��"2��'hx��X���������m��������wX�$�;\*��(��v��c���
G,\TI�N?�?tp��+qV�wX*�;��������Kk�+s��;TSMkY��:�,<qU,<����>���:B�Y���1]b/�U	6W��n��*�]9��[�O�A/�����,<4�,��'Y'w��`f��^��K#�����1����Tf�}��GY�S%��R/����i��X�����ppc���+�����b�.�~�"W��k�r�����[����v0��o����6���t:��p���,�?Nt�~���<�C��H��E���2D?l�!6��w���R�g]4�Z��i�rw�����U�/�?.v�=��P�;�hL�.�f�k��6_�,�I+���O�`)p����#	������E�=n�K^�-�^�5��
�,��NndT
��a��`yo�o���|���K����������(*�r������,�h�.��k\��e������M�Cf���s;gG�M�]�C��)�b�g�7�m�r�mc
����FS�_;���
+�.z�q�qA`9���I����$�& �x�^�2�l�$�a�y^t�~�4���`z\�e��f�����Ag{��6�Oeg��`������9����Rm-L?&~�--go]4��7[���
�=2�9;a(X����-���9qp8\�����a��`}Z�a4.�iE�������A��w����^�w����9�cYg��mM��
�2����
�L3I�X��%��%��x������uX�!���}�L�,�	����)r�����*���)�^�5,����!���A����s��>����^Y��>�/]t�3�
�p��2D��s���$��?H��S����#X�Z�/>O$$Ye�����*q����`R4t��o36�J�c�m2]�|�<p�����b��k�����+��d-��`We�����7D_�F��J�N+��b�Cw3�6�f
�������n����q��+��]G"pq*.N�����,�b%/t����]�p�h�/X�Gs��;�L�i���rX>X���	3j��Ub��/���U�������1Y�a������Y8�mX��}���
lU�	�^0�(�
��� Xt���\8��T�^�H*��>x��J��y���6���s�
��b�ns����}��Vl>�e3�6qC��hx���,������n����|���!G,�r�dH��W�A�0/'�7{��G���0� iy��rX<��L���`��R�U��
����Qt���J=�
��hE��P��*-�s;�f�`���YZ>`��k>�w	���1n��aY��	��,�
����}�uN�V��
����X>`��h���'�Ml���m�Z>`Yb��Fd<g�@'\���a6=���4c��`����b'�6��Z���f�6	4���]G�Lq ����Pk���U�<��-I7�hL�.�J/v����}w�5a��l�0�1j������m����L���qLM������L����{|03��]
y(��*~�����=n���
6M�3�k����^)���M����en>�y�T-b/��)���W1ig����������p�`m���5��||��)h��5� ���K���M7��F��V�Ty��}�G
�9
?'���uw7�Xf�^��
�D{���������g8��lv���J=�]���^��K}���
�����-���4��p`��<[��S55gWZ�n.�2������e��_A������O�k��q�M�c���P~���]���7���0#)�x�q��wV���\i{�|0���4ubs;�9���w�?�oav���X���
�7�{�#�}*u�����F�����"�`��A��t�	]�.D^q�3���?�!�,�^�/���
���`�,�f���H>�W��U��j��9����^R�`����o�n������A��n��-|����������]l�_�>���?�������e>����N��[H�X�
�����4��`'X�l
4��w3������o���K����:��
��9K�{����n��������5��U��J��o�k��S��k�Jm7M���{v�9��Ag�O��;Sq�|��-��_K�_&��XI�X��{N�{-�'P�f�eF���/��K������!����L{������a,��Y���r��Bn��+�e�=�[S{dx����f�m��t�/���%N�]�������|�9{����/�FD�W��+q�����]���4���}����%���YB��\��{mKY�U���Z���](<H���
:��m��r������z��ICl/H�^��azW�b�O�����eYl��|��p���XKt6`����gw��EX�K4�����0.K���������(�I�����_��R,��P5��Suw����^������aw�d�&�h(������F�U8��y�e�`���i#�R8K��y������l�E�JQ��R�uf�����%��_X�z]0f�6b���m.���.��^k��Yj��5\m)�,�q����^yt�}�i��'\����3������J�y'�u���o$�V
{��_�?�0swOl7{�M�L�]���[���������~C�`��[y�l�~������/|�<�m����;�_�����A����{��n�]�4�)6+ ����_lN��n��i�����g%�N����t��,F�Oc�/{\V''vV�|��_�)���~���Xk��B��k7~����o��p��q�nBle�m���A7�HxT}
g(����MGO�.��|im�~���}jvv���������"��6���~<�:����o$�J
���]0�
6�`���;�M����-:��n8��r������������_�����p8e�� �k�Kn���S�a7E�6�
���j;a��W]�w���.�~��Bl>g���;rD���6���a�fE4F;\�5u\r?65���D7��$6�Vw��P���Eg��9[9������%��a&W�c�\�~�RGe������q��?�lN!���uX�-�K�Z{������pU�u\<���b&E��z+��X���vi�7��42��@��9��� G��(N�c������*����5x�a�G��p��k�0l���f��pc��&�	�D��aAB�w��������� ��b'����=x����f�p��k�0���V���C�`�y
�k.�t��!��/�h�����*b�k�iR?��^i�|)���T�O0����>�Q�R�o����/����v7�?�p�&�>�&C}��}�RWtK��n8��bVt�����h}��2f�C�x��������Z_���6^o���0�
�������v�y�%�����3G�2>��)����4n������)D7��,<yV,��z�r�`g�4���?�L&(z�
0�g�k��K���53�l��K����W"�x_��
�E�����QNo������9�����	�b��%B/��k��g����2�W
��)���.�������@U���uH�+-��L�+�4�6��Z �>,�f�kl�p�!��*�DCQ�XX(.�/,[�
�x{-�}��Wt����s����i��F�7�w���V�O�^�')����l��=���:^��c��^�`���i���/�{O�O�52�";X�n
-�-�}�6����C
��h�V�65=��D���W�/X9tN����.�i�A��s��9[��`Rl�$��r�6��S��n8GtR��.�$�����6X�!9me�jK,<�^���E�Za�d;-{�N[��[���>^Y��yKF��m:��)��o������sn��N[��8x�/��W�K�����t&J�
��`��E���y�p���w9��Ul>�cw���`�~-�wo�n\5�aF�*���Mkm'�������^v�D������C�����Kx����M��)B��,��
�x8xw>I�,����Be��#6�By��)��<������^���_v�}0�����v�
���NQ�PO{m'�V��U���u9x�B�������.|�����m��n�5���/���B��#v��i�����`S���6-k�L�j���b[����:a���T��B{�����	����������w��V������z(����4E�Ku�:QE�b�sv�z���:�`�v��U�����bG!�>���=\�o&��]>�#5�n�1��w�v�9(`{���q�b+��{�l�k�������+�K[C�����S�����~Y�,	��TE�� 6���B7����)�B-��e�R�q�d'���hV�/�)�5-��0`������:wuw��(���^Ief�7O����;�>�hV
c�c�ml�^l��|Zl;��#6X�X������*�0�����w�1l'@4�>������:�`�����Olc=b��1Z�f�	��?\C/J���0*�5�i�O�Ln������C^\���_����m���u�7�m�����v����������>O�5�Pw\��N�t'�e*�/�}u��-����n^<���H���
u��o��r*�$G�0G�*x�M���F^|����%f�.��� �V��c�����Llg5����v����E����*��T���p���<;6O����4�����M���35��E����le��0=����`��
�J����t@A�h�E�����Y|���������]����iu1��`�b�1��p���]7��������^����b;�������B!��ky��k����|x2!��kM�^�6O��*�v���`an/P��+�)�	9-=���U4����6�K�\Y.Z�<�"��D��352��]�],��[��OK�'�<��	�`3���_m	�+��5OX�%a2$L��`�&b�T��� ���Z��Z=���@���c����dD?0D�/��6���
W\��O�'�\
:�E��s��,��������4�,�l�����1*3K���E�r��=�tpwUV��,q�J=a�Wf���
�`f����i��d�c�7�7������9�
�N��'|V��[���K=g'�o��9]�n�<������	��M��4�����tt�m�~,�
�����9�	��[���z��t{8����s��J'�����_�����=��K
k���-�b���b[���ji:�+�{hd�6��v��������^������I�WEH|��4���p
F�TE7`/5��~(��|�X:�O1�n������sv������ ��	b1��� K����Xo8���wB/�[L=a�1�;w%�������M:|�5A_0C"=t%�c�3]���K0w�����I��?���u���2K�V�W��W���2�.Y_���l��o��6��l���y�bi3K���E�V*Ql���/"�5l�[8#fZ-=a5l��S������D�pFzh�m��W#�9;���-�VZC�������!�����Zz2��h����������<=e7C����t�g����5�
��C�����������sw��Ye��+�?�3��
����`�W:�������v��`I��N%�N�{��t0K��u�^���y}� ��|^�n��=n�����&"���?���TK��1a��5�yd�+��&j��W���p���Z:���D�^�����s8����8�A~b�0���9� zB�I�
����5_��#iw�c� Z4}f�<����=C�'}f��3����=��5�-����K�����bw��o�EL�MC����>cBGA��,�^�%b����}X����jP��$��^�]X�i�}?���.�V��^b�C�Sw�
�=�#���|u�,j^,':�����p�o�~Y~v�M������b��X��hX6"v���XX��q��8
z
���09;�����.�g%�)���e����Ew�Y'67��.�I�<4�ZC�.�\7[��]�/fL����������x��������o����b�3$�����-�g�K�l�������6�if�I��l�]����u����'�����=O1-k�\�
��9�n.����������<�!.�e-.�U���p�j�`�X��W
?&�g�P���������������)��t$��/�%i�����"}��KT����Z��svT�'��[^t��`s]��R1;��N_#1rAe�l-��_��� �^��_��5���%��u�bi�@W
���f~�9~���C/f�Ms��B[��N���g��e�l�^��L4<�O,l�������� ���Feif��Ge&|T��z��<C��������Oy�Al�0�e9��Ol���e����Kl����u��"���P<�|Y��`�>h��~�.�������K�{��l���n����y���7S�fV/�f��b{A���Y����o������o�(��Y^0�
�P���P�S8�pY��U�g��������U�~�V����t9�.|<���D8g��L�,�V��Y�J/���n� v|@�9�a61����,�7nnZz�[I
��E�"�s�N{i�Ku��t���E��:)��No�������f�����f�b���bs�va���I�>k�HMK-e�fE�b�lEl��M��E�����b��@,����
q����e	�bn�0Al�b=g��h�����������8|1=��3����Z��xuw��a.��jh�p 73{��a1��������7�����pi���sw��Y���&{5r%i�5M�Hg]p�-��,�
�1$�.H��
���E�$����`����,X�4/X��y�D{�}W��nu�������:bSK�nv��b_��1�I_x:��4/�upo!6��h����z�B���2�wif�ag�f���%��I�E���qYx��a�l���~�7i}w���:lT*^��O3�������Ox|m���7��5W*�Y^0�4<cG,����������`�J�nh�7=~`s���R0��hZ5%�3�|4.\a)
?��K�������u�s���^j��|aN�����|o�����A���4#tK�n8�!0����������9I+yd
�;����
oV���g��l],~]ER���
G-����Rtg&:�����"��q����cy�h��<�}7�C	����S��^���/+��6m�]��+zU��6�.(��W����.X!t>-�������,�l�������,/,������;���>���-��ybE_0����v���o�����������G��J���
&~���`�~�������������a��g��u:3Q7W	��0n/�EO�����J��e��K,� ���d���CW
_b�gL��6Nw��8v��v�9����A?���#����R@�t�9���v���K�~��=�l-+��x��3qwS�;���V��<��X$XxH�'��T����y����p
��9�0���r�e��bJ[�
�����F-�t�)A���Js�]�� �����J����`��>I�O��g���
|~F�?�������\w�����]��K%q��|�j�=7�_*y��(a`�#����N��6�L�:���6O.���Q����>�f�T�����$�J�*L0�Q�����I/���"�_^�s�Pf�x}��/�B���|D�9�P�YF���������t����?�I�����w�����K>���av��7�%����f�.|�X�4;u���(��5����9��O���x��Lgo^]5�1�������;H������n�y
�?�.Z'�fH�����b����k���^��(cb�>?���Xu%�f�jf*�4��w��Q���%���7�*��?J}`����m���i�����=�6���0�u�L��A�e���P����V���n2�q���1����VT�I�"�h�5,�}P���d����#��	�FZ����l�7�p$�	��������.�_udn4=�/$��Pq��=	�Q�����M��$�6�Ofah�����>Db+���	���0-x���B4{;��/����g(b��~���l��������4}�
�`���l??����	y��hT�l6����q��6��&l���]��'�Z�i����4�u��R��n�y��[��id���sn;�8���f�a(,k37�4�f�����������`;2P�e�lf����l%�{��j�	���v��e���f�����>��O��$�?N�K�(f�i�r�#����#�\�$W� �����o�����<�#�9�I�"���C��~�7���w�0^�������Z���:r�����������[��6���]2��aYx�[���(x�N4�}��V�a�u�RW��R��`�eb����wdXz���-���~�����nCv�������B�$���&������(��bc��:����o��,d�!��A�"^�"�����?���Z�o}�YZ�$�e�������'`�e�`nc�����1�������DN���i���AO������)����m������@��)�r���|g�J����wpE�O�X�4<%��?�7�`���=�k�o�k���L�x�P:v�����x��I�
��9���z���j���W]l%
4-����iZ�,�d�cbQ�i��.SU���a��,��S�����aR����hCF�K��e�V�`�_����-D�IX4�-v%s����:6����P���w����p���<��WU�`����l�[^o��e�t�{�R5Oe�����?�f���C��N��){��W����f�4z�)���+���+z[!�	x^_��n�y���A�J����v�MO\r�2�,��{*�o�0����vJf�`�MW���C��+u��X�tKf?��,F`&<�������^�<���`7b�-���&�������,F�o$�E��Nd�fv�w��,d�_$
ua��g�j�`g�Yn�i1u����c~��r��jU���M��O����B���p�X� �e�TD�W����Y%=n* ����p������9;`��VGX��-�`�Y���*X��������l�Lj[?A��a�Q���a�7�y{J�6��m�UbH��
~f���m����-�x{H�'�#���./��]D��i!���O�%��B���}eu�&|�{�*|[���]�
.Q�6(���!0���r���7lM��
z���`�3�m�|�P$7ld�l6���l�/X��lv��,�����Vr���'f�6!6�Dn�i��`����@��	�xAe�]�a��0�-�k/������`7L�;���(�o`�V�
��D����=�Y�>p�d�z�������R����<��*��c��H�.l�|-���W4&+E9�2��`�K�y��
���2�%�|B����"G��p�d���)[p?L����)���'�>���V� ��F��p�����Z��M���L�g
G���)Q�S�b���~���D��\������^,���d�o����<6�����a%�Gf	��F��
���ElE�?6�~�c��C?��[��6���
���I�l����*�@�+�����s���B���|���=��������eym-�0ki�����,�e����i����5��D�e��]\,+-Z��>��~X��������b�����z�����6���Vtg�C��U���.Z����V��`[�n��w.�,=�w~���i���ew��]����V"�*�4�y��w���|9��G+
����Vo ^a#6_)��-�g[C?t�	kh/��}�Y�&h����v�<����D�V�+v����)-�X"Atg�[����~g���p��c/l�B}��-����],��9|��h?0<4,S{`��o����������9�/[�xY>��"EB����-<�E���o���g7+�;���=�i�@����J���Ad�*� K?�XZt�"�
g�:�Do>j������2=0k��*a{R?p������g'<��P��MV�B��c�~e���{>��~X����d����)��L���X������Y��XX$v�����Y��W�`��������������b�C3�Bkdx��#5k1��������}����
g���E��m��aN,
�[����%��z�L��K�9~���������ZEc�r��cS�/��0J��q������1�����4�[��8�K�
sf����L3�`�����}�e���l�6����m��O�,4>v��������������&k�����g�1�!�cl�!�M��������/C��00�����]04+m(*��V��T�X���Q��~l)���H������b�� ;j>�^Iq�R��bd�� �Nx|[x�l)��"4����m�ao���z�����`�O��e�f7'?��~���hz�v����'�s����K����^�M4i�4�m��^�r2�M�R�	�D!�
�����XA2ezY���~`�!��H�TXj���v����g
�J���N������5�h�mV+=�����c����W�)s��J��z����E�S;AC�6���tK�����V^�!z���p�����c���Q�6�,'z�(\�� �=��2nE8��������P��n�b��>�h~��T>�0R���G��0��D���oS}9�����E����7g��
���Z�w~����|p�
�M���+��������w�`�}y��z�b�S��#�oJ�=����U2<�;+�M�Y�?���E�`4r�z���s���l�������rf�b'�~T>
�@���[v,�:�� �NXy���� A�v�0�c�0�&�ch�q+'g;?0D-�_����j?k;?0�.�_�'��
��>�dV��;��aD���IlN_������>�����	����g�����-k���l���A������5E���l�ae�X��o��lV	�����?�?H�=y-����=�u3-�=�o�Y�p�L|a���ta��.�������)����
��|^�4�q����p{���|x�[�|�a�_��i{�R��7�������c�{dV�����UX^�E����[P�=KC��5�K���=+{%�l�����Ol�E����,M4��E�5]����}["kMX:$��J���49����`�9�{vV�1������i;_���`&=���-��"< �������n��K�����]|i���
g���������E���/����,�!v�L��}��kvn�<n�����NV�-��\�����l�;nl��Y�J�f�~���T�J&0�%�^"��G��m�ba���?�����B�Isc�r�+q�f���j�Dd���,|"���Fbs��mu�W>�z0�Y�[,�KQ,�nR�L���~��������EP�I"�9{t{����S���Jlc��bg�L�=��c�U�D'3[�}��f�&�m������y7{��	~����g�,�,�T4�
�K����Z���e����j����&�
�%�����l�e������HX��� ���Q,*�m����D���C�����4SK/f&j�@;��-������uc��r��`�����EV�c�A6vJ��r�� ���V@��Atg�V�T`���~��b,�hn��Z�.��6�7x
z���Ffm�b�z�-���[2��M�����g���)��r�-�bn��'Tk�B�\�0��9j�����%K/�<�.�6��%�fy}����U<�������-��5[<7������,l2�7���,���l��=��M7�WR��������m��S���i�h�])�v��E��o��lcU_bO�3���x,z<��
��}X����E�N���-��6�<7f�l�
�s5*k�[��lvy��/������YV%tT��6[���7�t](�6\�0��I���Y>�DH���_������MO{[ �6�N'���������QM]�%l�����E�C�{����m��0�YA44������2U{-C�P����v��=������a��U�(��|��4s�~�� �s���ETrUH.
�	�Y-�Q���SB�L��1-'`![��u����2���o�iI�K������?�Y��.�6��;�\y���f���E���<��S����3�1KM�4vl�0d�d��
ES�C>����`+*�>�������2�}��=6���@O�J�f�bZ%3|���	����O�h���/����j�J��������f�e��J������hhk��a	���9�7
7�-7�h*:;��g{����j�����8!z������U���r��s��l��`�M��Al:����
�d.
+|�l3����f1��!���
����%�ba�O���C,��h��P���k�4M���1+hT�a7���F��e��B'3���i��n0Q$oX(,��4k��[���v����"
\���"<o]*+��7�O�cA�Y�kjV�{��Y������<���.�"�o�����(~dhQy{�a�'�F��f=ne�Z��d�P�Q��xc����{���g
�S����DVO�f�R^#Ca�q��Z�~�vh����p]*�6A������Z?��D�����{�*��	���ram-���:���-x�7;������u|��G�%!�����>|�{��������a9[��p�A��}��4,���&g������[^�B����
jS����y�F<<n�sb��cr���N�������p���'���iA�i���f��L�Ew��G�<� j������v�oP���	�
g�+%�d_	u��A�������<<�k�0��9Wt����v���X�����O[���XDw��F��"}l��`Z6��`+kw���{%�`{�-���0���],����-�<���6
ba�j�������a�Uz�'�o%�*���v��-��n�2*Gy�#.�W*��sN���^���%���z��|9����`J�;;wT��]�sI���6X����em�u��gl���}*��6:o0*r�������af��iCF�0<!�sx�����f���?d8^����p<�i�r�8��m�|��fo�0>%��dtN#
1��
9��.oKd9AM��<�/��T���;������b+���n��uc�f9��Y����������j^!�%�bM��p��Il/\n��8��D�0�^�uw�"�m��>�fY!��^P�������^�W=���ba����v��a��
�;KC����������f6fYm���`���8�Y�I4l�;��F0��w����lzo���������D�@�o���z���I�Kzg)B����,�F;X���'m�%�;{g���a!�Xb
������s[!kf(/^f/6����Z��
��aF�S(�6:���Z��O�������c�
��g�b�U�b�������-.t����,D�}�>PY?
�U�"�T������,�X��4}i�1�~�����������
�m�f�#��S��\Q^vg�P`>_�~���t�o7\S-{g5r����%=�[�r�����X�k�X���BUj�Izg-��73o;X��Xx��|J�-������Fa�-X��%������]��z�!����Xx��Y(���W%�f�h�F��9o���#u{�w�i_[����-�6U+>f�#z���X{�9�s��i��:�D���m�;�L�T�v�4�%n	�*Oel��Z=��i��nbY���|��{6m���zbN���
�b+��v{��f��������f
7Z�W�6�����u����7C�/�����-J������#+l�
6��]�3\\�a#�wwx��{7k!o$
���}��������N�V������f��>�]0��)�*t��g��n��k�
����;�����v���`���W���f0bg:���{3�S}��5��"���z��?��Y���w O�������am`����}�;s����[���@b��U^��EX_,�n��m&jE\����;k��Y���S:�?r�����]�;}�C��h���U����.�i�����D�~��l�/��a�)[>�|��my��`�u*(R8$�C;������
�C��4.�=��]�.�����(h��vl&v�����:�o+d��|�Eg�����_�9x�^l��h���i�f
�����l%h#���E?���
�;3��+5�6w�7��>0n���V���x�M���
Y�P�����5�p��o���;�v6
��bSa�m�VP�d����;a���p��Qr���/���,��hx=�Gf�b<�;���-���
��L����A3�����O���������u)Ao���2����a��<���Hl������]�2m�L����m���D���;����;�u�d~�7�6P�Q���fV��)�~[^/�P��.�L���g�[R��
��u[;�v�������m�Vm��Y�P$�'�.Q������+y";4w��,�?�����'�r[�3t�
}rJ��=,��Q�i(�]�;�3j�����n'A����n�e����B��l�|�%�|�S]�����9Jr���s;�@���9{����aK�[��vJ��{/���c�m��-9^w�C��d����s��i�e:Z���ba�K,�`��6��YzAA4�R���K���~����w����v�K�zf��{*�~RwfH-z��_����l*����14�n�q(6��o�i���d
�����V2��g��XF����^l�b��������XX�+c���P��f����
f������,���*�p;Rw��T*m��a���~��L��F5[Cwf
�m
�V������f��}D����=�c�����1�
`�:��mN�'7�n(���-oKd5�aAO^;���X���Za��b8������uv}9\������}��`�#��)�~��>s�0�����|�����������e�������x�������o�jnh#����|���p�V��E��<����nS}<U�z�����#��T ������5/zWE����Up�6���T��7"v��e�+b7��{
���N��U����b�����NO�6C����Gf�[��I[����M����.//�jE7��Ro{e3�x������b��6K���:l�o�=Y@Y��� �V���Y4�oI�dr�P���R�-�a�4�]#�
$����4��7�?<�I�����^d�!�,@#�1�0�9s{JK>2=���Q�����z0��9���9����+��>�<���4kyrb�8����X�0�d�������x���I��r6����g�e��]��vZ�e�������)hx�������Y)��'�&.Kd�e�
-`�f���T��3�e��p���m�`�t����6��H��)nA<�w�b7��Ll�|���-9\d;
�<�>������212K��=�+_�=bKY����b7O5Y���U�R����y��>0�$���U3�}��YS.}��73���O�2�=q�+�/8�
���e�EC�����lmY�YG6���V�[3<�t�(�WWp�=:X�e�� <��;XU�h�t���-q�-(���hd���1�k��{v*f��+g���;�
V0)�I	��cZ������s��5�=�k�V�����.T1xd��.)���Vl�����V�� Y4+)J�|}����_�x~��;�o�k��*Y����;��.�G�!�b�s,(N�4���D7(9���v@,=�%`��?�����P������m����f�2bG��|�H{�="h�(��
~]�*�y���w����oS�:f\���K�_����� +H����]1l�=�6Jf����s���f���r��B>����=�~�-�.T�CI4��QE��D�R�8�������a�pZ4-�����B�p(O����f����A�E����>��Ms�kS�{�S���Q���*�)\:9���{�_�K�
�=��U������������^l:�����yx����6����A�{Y�f���,�H��������sr�9%�0
�w���m��YO�hx��YM��7k�6������my��pz����x!�h��+�DW����W���|����V�5l�=`p%h�"&�4,l�������5����m ����[lA��9<�s���8I�
&(�V�lYN�d�^�JDl��u�{�R���z�v<U���j��K
���,�/�hhz"v1���J�����a����!jcj���!�!�g(�dj]i��A�������ba�G��|<l��E�����9��.�H��6y.��6L�1���i�b����&����������gs��{�67h�x�O���V�����P�}`�{�v�j�����D��aCh�4>,={i���Ks��k��M[D����x�
v���`����|��{������ZA�sb��`�7l�L}A�wv�t}��.M&5��U�]�l���4�q���(f
��?��^@�Zfk-:�J����c��{jc�
g��<�E?0l/�B3��<`.�4�#�p�h/\�<l�<�e�l��/�6������1<K{d����E���m��'`�k+e"�h���*��������/
�mI��j9������Yx����l�����0���%_��+0���6�<�&!�V��n��lR�n8�<CAl�o�Q����\z����|�\�dj���A��
Yy���h��l��Zy��m�F������.h!{KS��i���4�}���M�������K�i�S rL���`<��R���1����)�p��s��&g
d�><`lKt!�:�><Y!���0��YVH#�Y%	����l�\h��x2�d��>m>-�E��*�������d�7�a1����M�2��z�i���JOECKq�y��T����W�Yx�g��b�
����K��W_������x�EX�%r�9�yEx�����i���	�������zX4~�6�c��*��m�'��/�.A������}��Z$��|��Nv*�N�6��V����E?,�(����/�2��w	y'Ut[^K>V� ����Y��(^7 6eBo+d�I_��H��k���P�fI?q�����Z�eD/��"a�0'��H["k\�-:W�g7����o�i��zD�8��N�&�7=n�%g� :[�.z��Z��&�is���n��j(EVz �])��K�����������
9ZyJ�RC'K�,�$6�����`a)��B�����d��s�{�j��}�'<�=a�.��J��>����������'K4��66��O���i���F{9�L�0Z��Xy���O�i�v|��t���n<r�ks�:�v�K���dLA5��;7��.$���0�l�o>�]I���{2n��y��}`!�S�����������9�����w8
�Mc+2�f�sbV�7�`.6����z�.��u�E��ba�Al��`�<<�A�.bH���w����z��6C�8���aN�s{��.��Y���D���7����i�	�q]8�ow��fjAr�.\�>�.��;_i���k�~��~obcg�WbL��������)_}Y"�-CX�
�"�������h�������I���Z��B��0����a���t�Y���R�4�7�R2��d��	�H���F��)��/��\8b�Bx2a��1��	_Y��U~!��Y��h����@X�)�9m!<�z�o�L�
�m���^��,:Y����1�V�6��>\4����q�qj���F���1���d�[�[�6����t���=����0��)3�����0-�^�g�Q[��f��w2_��<Y��`��5n���i��	�W���i�	S����D��0g/�Tzt{L+ �K��-��dlK�@�����`�6m�oC]��h�w���T�5����a&abs��{v�/��]�8�<���h��V >�2R�m0���-8�L;O�Y�pw�G�=P�v��E�%�^�u��.|�l<��h����QF��[�9��q+�$�O�?,���%�����wq��{9\$�`����������t�����6�3/6]�k6����pA�����}���i�bxC�hh���a=Xx��l�w["���<�}M#W�j��	���f.bs	�m���ay�����/��5kX����W�����W��Sm�k���������~F��+W����m���aDN�0����������Q�Pg�3y�}��|Fs��{��{*���=��Y��D��)�^5�����@st���V|�i-�fQ>��*�6&O������1��w��c2l������Ms�-�%��}F��P��\�z��x����[x�=�a/X�9[p{LKM(����2�>�����'����rbo�Yz�����Ha����R$hx/�Y�?�CM�'���xL��g��	��d�k�e�-l����0�l��3l=�_s�l���']�0���`(��M�������=hXS&�dX�IC��`O������~��F��\�a��q�<��p���K�E��L�%{G�,��f��~���D���6/�7&�^)�v�b~�E���X�	v�(f��`���i�d������t�H{U�:��~���v��3�k��g�U����[��oY4���oI��T��`}i����������Z�@��Vq���e�0S�	K9�
�4����`�����/B<o����]�������
3/�p����b>��7��}X{�XXG+v��������b��b�Y�[M��m��W�4Rp�&6������������@�a��X����Y�V�������������T�a6�Z���8��0�}�Z�_����}po�}<�m�fT(���c������3��h{���/�"}�7��E,���O�*	�>�H����b�$��Q����b+�1���b�B����b���t��e3n�9�+�M�S/����4+����n3��b���+�K_7�[�p\�[�)u���]������[Y"�'V)���V�9j���kW
���:bGe����:F���l����DgO��l�9�����U���(�ee b+
��)ItY"�����������7A�����qY�Rl�������Ft���=����I���p��-\]���o������[3|�pf�'d�[(�Zvk^02����`7+�Yv�f��`i+����.���C4Lq��9'�,�$6g�oKd�_m~�z����cN����&�sL����f��l1�s/����V,��B�S�)�s["FV�f:�w��l������_�`KQs[=/��/:[�������6MW
6�]04��;���M�kr
����	�pu#)U��Xv^�[�S�{�aN��������������������N�eb��T�:��wex*-o�0���
��t��M�]��<���e�d��;�����i�b.)�LJ�49������~��n9*�:v ^P��?�}����6Uo���)h����G��s�#����-��8����Y�
~�=��e��O����]3<��r�����0t8��U����y�:O����e����7D��QnE�3����{*eov�^0;�����l��j��y1s9�4�>$c�G3X�b#6�I�%����/��?Pe8k x���1<��-t�-�/X�4����j6��Z`+Q8'���L�a�Y�ah��4l����D�^P>�������_���D�V���e~��;��<�\<���U`�r��j�7y1�d����6�5�M��y��|��{�v�[9���x�B��s��=;v=��A���7Kt��n�YM�x��|�r���T�&��ix86en3��N&�$��:X����V�)��/;�.����w�g�����=`CJ�f����g��	#zz�JU�
���^_]$��Y�D�Z��1nKd%���D7�;�|T�����`�e��s�~�e�����E���zw���e��|���������x�V��C��9;Q�M^��g���i3�����#X������������\i���2
R|�Z[)U������A�P�����m���DV|0l4����2�|[��.|fm��`N����]����������np�yq��f�E8�o/��M��u�	x���G�~�6����.<����v�4�&`x(��&��
X��7q�m�s�}C�}
��.[�.��t�e.��4�l�a4��[���;����y����kb�y�-�,/�/f{,��7!���i\x�6Wz����N5�l���������'-�m�,����h�b%�fx���+E��=�{�V�5|TI
�	!�`I���q=o���e��5��������KT����-������<����{Z+MU��,��x��oy��<�a�r���d��>5Xx���Mku[^�M(i��^�����]����KK5�������b>��G���e��?tG���/���*/�,��q��h����|X8[R���g��6'��E<�W��������*}��I��I���V��00w�������a0'�
���|�k��S��C����L�c�X�;;Ye��\��������jD��Y���?���?�.����N�1����C?��[C?���0�#����
���u�����)��Z��c.?&��E��5�
��p���wz��N�fSw��1����;�
,}���;�������������u���#�*f?v>��X������W�~h�mI�����:��=��F,sR��=�[�B�r��rR��p�����2A���Xx��Y���1�aI��_�=�
���^?Pi?*���,����������=I���"�E�M'W��pA�D\�f-bgE��d�����5{b��b���Z�co��(��*K��"��1�a�j�O�������J�D���jRx������6���i��cQx���?���H{r~X/��l�����.���1�W��pq����`a����yq{Lot���4+Z6e�X��Z��h�-�7gx�n_/a�
�
�U����[���[1cM���F,�[J,tq��YQ��|��,��Da'�����b���`@O\0�����ONA�t,�
gU��)E�ng��V���O�����:.��`8Xx��/�>	���my-F���4F�Y�{������=Z�Tl���(�����f���,t@4?��[c�mu��X���A���l��������J��~�����p�o��g���bi6KOO:��-�8����(~9\�[2�*R�����0����
����{U*�������������o|7\���I,<`�S(�������V4�Q	
hT�;�V���-��m����Y�(8�}�9�����������x���P�[(��������EO��}p*�M��U���hb�(b��u|�@�-�5*3��>e�\(���=�5��tY���R��x?���7�U��V>[�D[w�bd�4����i�m�����<������mP�/�-�Es-=`�@��)����O�T����0��~����bF���������w�zg����2���Xl�)�s��}����~`�_#����j�>����������j�=��Un�i%���n��Wl�/|�����n(�V����ij^���rh�=��)>6�@�&,]#��|�!e��t�m�,d`u`���=��oS��a�����
6�Ew��E�'
����L��AS�����i���r,��\����W����2����Y�>�����xEW�%?6��0�"������d�����x�����V��a�V�
Vzj\��P�3��B�.���Q���}����`[%�l7�\Y�V���i������*)�������`�{f�e��@w�5���^"��W�=�`.�S)V��,�cF9,&���&Hlv��=��ufNk��`w:q��jI�2�-}�-	`���y���ma����P$��x��)>������l���m���q�����.Kdo����n��'��[����U~����=u?�SW�����C{{�n$`o���Y����o�k��<uE?��@,,���%j����D���.hx9��O�ba<F>��nM��~�A5���
��D��Z�A���"n�-��.����a�}q����������I������!}`���J��V�����������-fiNr������
b{�lE�n��"��'k[X�+�X�;+�m[�~`���
���V�����U����
~���>�b{��M�B���~*������/�CP�����M���>em�z��v
[���'Xhw���my-F�V{��-n�Y��r����}�������-�|s��-��<
_�
�S��~`eK��`�mm���
���VC(v��?qjy�-��%B/��l;�����T���~��V*��������lK]k��^!���[��m�����.z��	9�l9�V�#���������[S�{��%��7t{���D�@tg��bY����azK�L����.�[�R���?���.=�;X����=���bG!��� �Y�P�.X�m�o��Q�������M�#����aN�����Q�X���G�E�z�3m|�)��o�o�c:o�����f
w�`a�Dl/x�n�o��}���X��:X��_re�,�XU�h:����'NY��Z\��m�o�� z��k��Y���)�p{L+/�
�s;X����
����!oKd��l�E/�����D��Zy���hhU'vz���7s����K��b��������G�`g�hx�z��hV�*v��FS�6SE�f��Y.�F��u��eY\����mi�5�"�A4�*�����Vb;����R�a�8��O�,K����YS|�����f�s����������~����~"`F����t[��qs��������T�f�c��v�6UK>V�":���gR
����6,�)/������l�
�EC�r���������M�7�#v^�-�J��`�%������731
�R��6}�nOi�3�2�f(f+�S[pof�-z�U��"�m?����E����,�"K?�7�nKd����w���l���Z�hW�3E�n�y_��]���<z�a�F��0E�����X����Q��6L�S=����j������m8kV,����\���!���;�S�����$�K�:c�6�������~��P ?^��(���1k���V��>�����0�,r�MF�����>r��oB�a&"X�}i�0�l)Yc�|=���"P��
����a,/�	K�4n�ic�z3�b��B��p��X�����Jw����hh�&������S��V6}�n�k��L�E��N���!�S��6 ����p���#��x��t���_�m��M_�5P��V���O���7,%�pEY��7���n��D���0��~<T����`w%7h�
�:S�&py?����Yxk����u�?���k�<&��x7Lx
-R�B�n����>��}���]��>���D�<f�4��tAk��i/���|E�����������(�5n%�g�aZ�4��D3Z%�k��
3n2�e>��m;��z�nOi�+R�>0B��
�b���=�����������4����1��Y-�����C9�KvoS��bv��<���.X��L��Yy1�-��������mt���|����7�1�0��P�:a�L���ARl���m�L�H���
�nS�aV��s��{�S��������'�={`f@�B	$�gx�6�o�k	�zD��n������G��iH/��o��N/��1�E�� �m1����M�J��?���������!Ul�����9��r8��T~�VPg�����p/	�@(�5j%e�fxG��~~�]��1��?�0��U�[y��yC�':E�n�Y��X���a08�JY���7�K
�n�U�m`�Q����h�9����t��q���������Y�k�=��}�z�N�c�Is%	b�d������������i����c����jE�s�F�/���E��h�n�m��
�o2K���`���z����q��m<oF��2[jdG�����&�&���
��;��P���n?�n���w���Rt��i��
�&��+�]p6����j���

kC�

��=��]O\y��`���l+��te��O��N��������Aw�kV>��`���|b��i6J#Cq��;��+�5�=�*=�sK������w�c?������v"F�f3����x��x��F+<k��;��+v"{���9p[a�?�Y�R�����ai	�����=L����f�����0�)�����i!��������	���6U,��H�,8�{p��gDv;Y�MlcI�c���}�D�w3v��<kv����=��k���a�v����G.��{p��-:_t�����E�[9o�Y��T��V�S�\;6��A'����=/��V����a1.���c���J#D�k���%
�B�P���Al����:_�r8�
����U/>�}�?���b��C�.x��4f�,�I��6�7:(�ey�6��p��X�����}����Y��C�ZXs��7:xb��.KI�=P��-��l�{����)�����O�����,i�D���}l����	��	�f�0P �pC��'�a������eU�Ba{�����^������
���Vt�{3����lm���SK�;��r�����N5CP4k�t�Vm��( ;�BW��?S,l�/t~����{�)��u�<|X��������O�0��e��bg�������&:����Vh\;��vx����Xx/�����?Fx��%�y[^�j�
�p;��g1�h����m8k6���d����`������{��.;��"�s�a�*����m8k6f�)��]�NS�,�5��{�'�
g!��h:����0sl��r���:�������j����{V��n\�=)��T�58\�Vj���'�l���Y���Qh��9xy�T{��rv���f
ul��RSl�������M:hh�(�����$�X���'u�e����j��+K�`�X��(���x�B����S�>��L��s�c{��e��!�w����baH[l�x����0wg��'�@G�^�=�%.���*%�6�>�Q�4s���\��;4
�F��zh;C��}��}���t�my-��H���}`�L,	�s�����6���mVbal9����������P;���YZ�]�s�=+�=�Qg��������`Wj
�M�*���4��5�%�aB,���X�����N����N_�����U�m���`�n*W	�z��
'�Jz�N��&<����=;ac�%�E�p�����a����������4")Win[
��O����K;R�#%[i	
���C��:�,�m�w��n�kc:�Y7���{��J<�V��^kM����nl�����D}�4�4,]_{�nS��c^=�7��)5�����p������/@�/��'��Ox�)�s{J(X,j�%7#����S����c���}`Z>�+�c/����E��d������
 ��
Ux�=������A���_�=;���0[�'��`w�y���Z���6k�-�j~��}`En��d^����D�.�:��>0�����}��M|���"�g+,{���DC/�&���D3mXN��l:���>�o��SZ,�#�������9V�r�?�����]���V)��s��=Br�_�02���SxxX��;�(�U�H���)-���Y4���s���&(�V�Hmu~�oZV���#C1�S������;W��K���0]�������@{��u.�v(6������m���	��o�Ub�v��o3�=���m]�V1�?0pt�Ik��W�/6��n�/�;�*����p�����&���p������`+���bN����.�:6�>0�rd� h�;_M)������B�"��[t�<����O���1e�;]b���`LN�U�1��H���R����WfjE��n��N���������#������a����mn��.��l�+����@�AC���8{p�2���`�
b�l�����>��z��vt���\�7��=^"��L3_��"m�=�5o�����Kk�U�����r�j�T��#�|-����_������<���������G#z��F�g��s�6����_�R,��	���v`�E��_4��o��������hv�T����W�.�A&���)��BGM��
�����F����w�����{���A������c�<�M�n��}S�`%�Z�MOs2�n&3�����s������{��}#�`CW��������,��2����%����^��w���B��~}��,�P�4�^��ZH>���Y��Y�����^��pA(g�KC!������c�/���2����B�����4��W��2���4�?�m�c�2�f!��-�<����~Y�h�����}_r�X|��#��������w����~� ��n:�����{�{�SQ���y��^�c�?��2;7=Q��/�N���Z� �q����;�
'Z��$��o������g���b4XV��;�����;J	��oyt���J���e����&v�
/�������
�[O������f���zgF

��u�G�=�������wo������J�6����/Q���#c�_��Svo�0�4�J]mJ�s���\�Mo���4'��2�[
��n�
bL/�	a��
d����w����?����3p��zo}�X���^�*����4?�eT��k��{6{\�:,�6����������anO~�)�t��w�T�r85�����at<���q+�3����6�~��}o�����`ZX���9�,��4l2wF�f�z��0�<p�����'�����AM[4�� r$����x0����,��DL�;S���DV"�)��B}�fi8?�l�{L����]�����J6=��Kv��s���������[��"V��N��a�l�9�D����	Ur�E�UfG�y��R���%���n��N(5n��>�E���i(c��h~������J�,W*3�%��
�D�m�D2�J/��������E�A�>Y��T���Z?��rY6
�e�0�����zB�B�t�4wY=�����������i�s�zy�.�zX>�S9..�6X�e�b������J^yY�!�c��EidxL�O2T�������|��4������e�D^�r��
��M�?��MAw�v��N�9�,'P��/
S�K�����J�����_�^x~zB#�b����CJ�����B�1Pq�T
�>�1P�����6e����1-�`��=x�c>���nS�A��a(9PZ2l)������v���	I�
�e���,���o�j�������������
>��ZX��L_�q���Zy!�`��h���_���/,l=[�T[,"��#���pm������M���2K�����,�`����W�~i�����$�>VO��#h�����m���m��d��"�T��������������y�fW��m��r����r�������/����f����,��u&��
��LF�&{�W�l�m�hSsNy���Zh�T�V��������]Agw����R��-c�/$j��9n/�!�Yc��z�V��*���
��fx�##W����M��fP�0�,QrX�[vL����`��5A���P�3`WC�0_�u�Eaq��-l8P��nxH���,�����#k�����x�_�X�"a�����S	}>(���������p,���9hv���������6��%'��7���p+��3\�I��0�`�T\�8��0%Gi:U���K�2/������.|�Ra5e�j!�Q��E9]��pl�viS���B��o���g?0��q����X��ri�`�;Y?��C4�&�����Yv{���6%�����.�;����aC�S( ~�d�0.��$�cl�&�Zq�c��}�D��#v3y"vN*�]��4�Y���,�������?��c���R�Y�$�Y�Ol����D�K�T���
��>�w��?y\�_�������//��z2������6�����6�x
}�������<~J���`��{`���)G,3�Y���|�eu����p����R�����c��J�G)a��*d���$�c�mx��h�[?�;��.���~�]2EO�};
A����s'=Y)��B%�c���UC�.4�?v�~X\�bEbg���������Y��Pf�Q��.�
�cA?���,��;�0.��b�l�����=��F
������]��-����U�����U�hx�i�~>���j��l������0����xd�������}�o|�.]�,��/�\z��u_�>�`�#c2_�x{H���'�R����^�$�6�%����������~����L4E&0��e����V��(�m�,	�o��&g�����Tm�
��E�����"��z[g�����cl����czk������<X��6<B�����=}�o�������0�l/�O>��~X��if� �*�k�?�����]���*��WU�����u���m��
?�.8y�~*z�N�L�t%�����}*���������Q?��[�����J��N��Lt�?�`'�����<eV�)v�)�V��:Lt��AJ���,���R���
��A���z�d��}��s{;?�Q�b�Qb���#�����E��>�
�s����>��m8oV��X�b��bw�~�����
���U��:�$���9�>t�%����s%����p�$a%���a\z��i���A3+���}
�Z�d����8z�dJ�Tj���!�=;X���Y	L�U:{��.R��8��+�<;C?�K+wg(���,?��q����Y�6U���=��<��{�_�m�V����$�������p���.l/M�-����Tm�K���?��*v��x�3���tR�-�U�k�M�R`l7������}Ob��m��q�#���<�B��c�ba�I�������c�A����UN�k�q���A���*\6��/����%;�F����k1,`���;N�?0�">e��@f�t��
��sA��,��9��i��RA%��~�U�7m��%���q���F����S��m�����X4���Sf�2U;?����f/�\��o3Xh����l�b�N�TEAox��Ks!�j��|Q����7��l��_�.�5���y�|t������m��5�c,�d�L��QLe�{8[��.2�\&����Z����}�{^>�G���w3X�d!�u�]�v$�%CX���m��l�E/���I���~�����Yz1�c�W�������6���m|i�/��������T-'��"h�������"�l���:��l��nD����Y���)��y�W�����]�ZU[�>��W���O������^����ZX�VR6~�K���e>3d>�������VZ�m!�����ZX.��Yc�@a�o��p��c��Z������wN���b�o��Y�A� �W��!o.'|7�Lua���'Fl�9��br!�Q�m���C��8����d��{1f�����'z[]+k�Vz��-����M������?�ng�.h��9���`[���-��5�%��1�L�(,����:��xy[[�y��t������M}������Q�W�Bm�����w�����B�������\v[!kE�4
WW&.���5�i������]�+�fG�l�j8��`���k�Xa��������qa��]����O^k!VF�M���T��
��@;F��9�_�������X��i��g������������Tg����_��(�iVa#v��H��|s��kcuZ�YY�X�l'v���cn?&���G,}"��#b'��z\��b���mu�W�T4ga������.�i����2ze�l�0(fb����F�9-��4����
E��|���1-���D����#�5���,)S�b;��=��fc[x;��B�y�7mc1��uU�m��g����^�b�W��ncq9���A��b��P	���������"$���������&�=���y�~����-��6[�6��eQ�D��5 �����E�����$�ys�
�������T���X��hz�v����e�!b[�I����1�����#���6Uk/v��-}L��q�����������lg��bO2D�=��}����P���o��k_Y�i*g������nc�2�Kd��K��^�X1;_��uY,�d;�Kl���-�5�\M�'���A�/{��O��w�f���Dw�D����`'�{�y��D�/�%L�7�)k����������y����#�zS������1�c����>.4�4	�-7��rG�(��{X�����w��qcew�7+w����a�~�J��M�+��+���x��5�
{��B�I��(�����B��P�M�����������a�A���:�S7��(z��$��nMl��g��}["kM��$�u��h![j7����E b+�����
�D�bW�E����e/��2n���!	��U����=n�"�
+>���.�86;[7�0��v�GN�v�n��A���[f��������z�����$�K���5���q[]+�6���f�4]�Y�7��/�����a���G�Y:�������S=�2!���a�s�����^p�h�<o��{��v��m8�X��(\����XCY���������5�"b��6�
�����-�F���1�C��nj���t��wc6����?����w��J9q��G ����{:�
�iZ���[,��[)���8�=@���.�nX�l�>�=�C��r���:��I����`�,�S��n�hop�[_k�o�Y0	����{���M�j��V�~�b�B�g����>q�d����Kt���y�����*�3v�5|�{Vl ���2�d�MWo�Y������x�����M���L
��N�	�|����'Z���;�����U�r��tA�:"��	I�i���X>���I�'
��4�p7f�-z����x�J�!vc������c2����`i����m�M��2�����>��l�����A�T<�#V2�y�`a�/�����
��
M�<2lq�ux����
�������J�F�����w���;CL�Rgg?�CkAg������C�5�$����YQ���n0�!nX�l���6�
����K�����s�<���.��L�N�~�q+��o�f���l��T�@�o��-hZ%���c��7x��
Y;A'��;}��M��T-c`0&hxh� �M
���V1��D.��%U#N�6�n��A��p�
v@�fo�BjC����o�k���[! ��z��}����{`kj�%	n������IN�0�f��Q�\���w����O�.�fn�]
K`��3���gr�N��pV10�t��S('�M3ur
;4��\4�ly�`F:�Y�����^��Z:��K���� ?���2�vn�_(����rY�1�X��5��O�����"�#��S�3��p�I��;}���X��z��I��~Y��t�����0�����
���b��=k'7[h6�vj�W����n���
:M3�#*-���E������c�-o����F���I��������*E�{h�N���Ka��5��h��X���������������q[�������K���7�0.3=K?E�V��mj�YJJtgj�l�0���z1���5b�e�f�O���j�nKt�D�1.~�Y�W�a����nc��JhE�Fo����� ���1��e��>���n���w2[f�?����6L�tez���^#�N_��(�)����B�mPz=���+��d���4�)8>t�4w������v����+���m���Xi�ifl �*�������5�p�`��5��}�o�G�k����It�Rwx`�A4k��.��v[��1-�X��hh[)���=�C[lvD�,���;��X
���J2���E=1�����7������0Z4��	��Y,������n+���DO�������a$6��J�
w���%]��wfz�?L9[w�V�������Q�`���m��������j����+P�7SUf�O�%.�Qr�a�`w�1������H��1��-L����a�w6�"a�Y�O������#�h
��10��N1�l3��A/
�6�����Vr6��)����U������;+�}�w@~��Sy���������lJ����&�V��������M��������p�7t����s���R]�qK?M�	�u���������j5�d2�.��u�%w�� �b��y}���^�����V�~[^KT��~�n�dx���L�B{����,�h�
��������P,LQ�$����1��'hZ��������v�@04t�4�	�.f� �pcj�+u�E:c������Z��(��1��`0�R����
Y�C��N
e��	�b�����[J4-#��5]��(S,���m������������A�yUk��7�&LZ��/����cf��'��n0��d���+GZw��5�������������V����w������(�f;��l�Y��7�C9-����m�M��S94�~* {pC������������ �<���-��"��
#;�6X6����Rl���{���������{�*/�5*�4E�#��Zq��.�l
a{�C�p��.n�=�U���Oe���V��mu�aQG��SR,=����p=H��y�1������C7Uh����Y���)�@Yo��	8K�i���m�;^�����B��f�AbW%�ec����EoX��*��t��w����{����$�3�t���t�!��&�k��������z����CrU,�2�O���%��c�����X^���OlA����3�)�V5;a�^�����VO0_)[��N���������X#�X�m�V"�8�����*����KboKd-�p�����z�F�������s�Yx���I������D�"��)hx���S�I�]9�DtJ��F�$�m�r
��`gv��y�|�^�G����T�^�x���;]�H������[t�^���v�G���:{W��
e�|�+��>���h��vi?��h�+�^'m��
�x*�6,��-�q["o�P���@y��5�=;+�p���h�����`i��K(g����-�E�w	z����\�{`TW,���}�o�kDw�MU��*�O��g�`lw�
7}�?_�H����,��J+U� 2��Z�kr�0��/�[)h�w��9i�L�Q~��i��D_�'y�����
��*��k�nS�pc���si�m8� ��
EP�
&5n:���"�����KB&�����K����n^)dxl����y9\
�
�����������
Y��|���a`?�R=�-�;LKM{��@��������|��MY�������A/�v�m���W�`x���>�1l�>�c�>�c)v��g�QX~$6�Wu[���W(2K�X$��	=l�!���7kp���nS��*|u"��~�B�����d-�a��+�v�Vwxu��=��"�iT�+u���m��W�DO����n��Muy�����9���Q5����f��h�#}0�%�1���
��T��
[_+�o����^����Pl��)$����*�D
���
]�=2�k�w<�B�q�$=_(�r��?�wln��M���E�DO�����������B�����`���a�Sl%�:l�>�3�K��=�U���~�������`�
�Ge�W��{�����+XX��qY�Z�J9��Y�"h�0�*�r#��s�`.��O��h���_�n��E�`�Rf�nr�u\�����yw�~��R���3�f�D�~�5n!�9��=�w�h�!vC��q��FO���w������eADOx���7+O�:���1[0,v
��F����#CU�����|���m�aC�hX�%��"6�
������D�&�o�%�g�=�{�r����Y��f�b���[��q�4|�`�h�q�B~b�J��V���E����M����bss�m����O�hX��e��f�������Xba]���]E���f����=�=;�~}���s�}`�3�V��v;��4�$K��_Z��6�}��'�o�kE#��cU)�d���aa:��9{[]7�.��{��o�)^�!z���a��r�%���a.���/D��|�\D~{J�	��P���h�:0;t����S��6Uo�P���H?��s&���W�a�q�t*~�K��9�g����BAk��GK �W���&�k4.}%:�:�+�M;�f&z1��
��o`�J�@���i��w�)Av��5s�6�:}�VjXl�NsM2�gM�����B9pqC��e�t����U�OA?�=Vlc�hbs�����m�0�JU���l�����
'������64a�`��,��A�6Uk x(	J�a�a������
Y�@A;%c*���u��-:S�F�	����C\�f�����z��l4���p[^���D+�����-���[:�Y������=���"A�������j��:;��-���>p��+l�
�czd�F�qai�������5����>PpkdXl�����q��9iw[^K �.-����__�?���&�Kf/-�q������L\p�v��~$����m8+/x�2���,��C���,�k��+��vy�|#�l�z�2�=����Sp=�=P/i����;���8ba[��\���oy�B��lK]���B
.&$��_�a{ixm��
SS��qoS��E*A��*����]���|����1��������]��B��?"h*�����`�E+bsX��D�1�jSt��������ZA�-s��!���t���p;H� 
.M�pI����`&���T?�.Iy������,S�V���g��������]�f+��Y=AG��7,���H���i�.h�[(3m����7z��� ���=��&h�
�)��
[x����zU���l�=�q&�w�`s��=��n�i9cM�����R������v��x����?�����s:G����YK�������E��*�����*�AJ���������
]��R�-��NmKOT>#�0`����y���.S���`����=����9�dR�
�y�U=_o�z�Re��-,��s�
���>0~�a����o�m�,c���hz���5g+�
�a�	Sj���B_E�R��,�p�#6���K����*���%�l4l*s�-���b��0���t��x��o7��V�Z���Fp��0�l�/`��j=�wS�t���E�
����!E=o��|��|��U��
���h���Z����kf�����a{���~�b��Fl��l�6<���.�q���
�<z�D�����by?��f?qa��6���+^�����&�L���'S��;3t�
���V���S�.t�N�aO��#�������6����l�q[������o{�{6S��P|�-\�7��=Ys���REb7��}X��O\(��v����4����2?/S�7�EW�*xNL�ZOf�(�a�H����,�l>O��c�M{�/�\�Y�_���.�SOV0%��m,�.�a��b9Y��w�M{��;���]F��p�����f�6��������]��MqOf[*�Uu����fj�3A������>tq�����:�
������D������"��$��-����pb�h��j�������v���1�>�1S����T4��zb�)^O�������n�k�	�M"�}L����9�B���1��B����W����b[�,e��l�Eof""^M+v�T����M��[��Xf�Su�}iCf���m���a/��,'��K�����W9]���`�0��=�����L�<2���+�d��k��{2CY��2��pV��~[4,<���L��Ph6�t�/E"������:E���}�����P���.l>a�M4����~,�2�w�B��f��U���n���@����>�b5�%�F������6�u&sq��"�H�-�'8m>Y�����t���XV�)��z3m�=����|I�m8�.f�-��M��oy�Y�7�qS���D�O��P4�[���	��U�y��9������K4���W�������Tl��i�]}2S	�T�����<������;,�
/�[�q��u�7�N��h�"�i���D�P>���Pz<�5�`	��8]�Oe�����E/�yhO��N�<�5���X���'�{3�uA��;�"I����=F�eM���;Ql.�}��#��-��O[YO��������g�M���$�l�
���*�����0�cm���/qx�XK,��[J3�2�c$��50|g���6Zv��Dc��������d1�7<�/�K����Ib����D�R�`,Mv���f�0k��B��^�&���w[��������g����������)!��P����[n��?<o�8�-��"PPQ6����w�����L��GR�����\0�������P4-e6;4��j1�|{���I[ROyz��X�0��I��I��JF�[	7��{�rD��d
^Il��=�7v��-�C����������j;�s�<���aC�h���=0V�S	���|�sI�O:d������������������J�������"2��-�'� ����m�'��
��r��5U�T��z~_�>p�4l'��(�����Y���O�����,
�W��3��f���T���wU�����Gl����f/��w���p����^��N�`sA�my���B���~w��:,(
�a����)�rn�5�f���aI�G������'l|
#��k5�{�����1-'��nUd^KO}	:����	�ZA��5�
M*��b�R�@�V�p
��)u�n��p�Fdh]9���z��L�Cs4w��g�.l���V���(
#�{q��IWvl�=�������\����//�	[aO�����n���qa�!�l9q["k�����u���O6�>��U����E�wOh�4=���=����y��+�T;�OX9$�������yA/�0Q{���aot��p���7m���Zn/�	[oD�v�`���m�VO0gtv��
g)]dy�4���	��Q�����fb
��ao7�	[$���1���q�X��0y�9��f,���KgD3���/������:�.;�.v�����(g�����Rl����n������M���;y�6Vd+�r����0<���L��=��I,�	��,p%v�#�
�+����tnz8��LB�Yu��A����F��2��]^]���H;�yd>�bq+�����B���}>X��Yf���3���Ea�.�-�����]]C�1w-E�l��/�|9�:��[#���L�6��%OE��1��p���E�b�����2+������t��p�����b)x���,6����j��������3b�
�6=pi�,�X�S4�����j�YX�/v�X6��&�/��mjp�ri�����7�=;
����������Y��pP��P4�%Q,~��w\��B��G-����,�?C�n%?1�l���U�U��Z���z?��sL�
�e����M�3n{jNr�V���q��Sm�%�l
/��Z�u���`W�]�(�+�K��T���>�P1�l����i�eE�b35��������EofV#6���T-'�I:���2�-40/�.f���~�,LI��l	������B���k�Ay7Z��p���s�b
"�iN��|��`8�l~�����iwe���
M�nf-*��A����Vp	��=0U�Nek�����OT"�vN�"��pq\���>���bO�lh��:��.T�-��B'&���:�P�t�,*���f�v!:_]����8A,�hh��L�l����&`��7����o�[�7�`J|AC#9��K��
Ls���"��R%��Z��	���}��P����LE�]$P��*vT6Z��.�G.��
i�?�[�d�t5���M����6�����U��U,|�u�M��a!�Aw(D�P�j�G�e��l�r8���WV����zOg�F�����KD<k>n��\)4�[+M�]��_vk]0a��S��<+������k��/���+���(
�����p���#��������5���ebwD/�j.X�4t*�*��9,D��?����/O���v.�[v]��X��'B�jBy�b}8b7��s�cl�	tA�t�j)�Q�+�E�E�n��eG�O/AC;W��ch>����{$�I������y�~�)8-/���;Ew���(����B���I���]D�0�`�]�FE�����~�,������`����#J���X�]D�������y�[DC�Q��Qi��a�.��E����9s�\v���yD�+
Pv�\���4��ba�#�_Z�y`��HM����kCa\��
��������.�U�����/�����?x��Z��a��a
�X���^�D��1��3��4� ���J��(m���'��K��tP��������p�7��o������Y�kz_�mOAO�<l�'�`��~���s.-�u}i#{%W�
��h��*[����w�}`��GfK�����,WS���D�@�����
����v���H;���Y�N�3�����r[���vZ�d/0��G���\��=<�Y��\+���K�_$��<:�^	�Z6������F����lI��r�PJ�B$�
k���
+��
�7��J��^�fF���Z�gh�P�Rl��r-;�P�h�[�/nbaj�/4z=��)�������iM�B�%�U�!h���TbE��S��&��0U+��@����|Z�r��/��]������m�:]��f�i�lz��N�P�C������$�Z9�-�:ad3h�eJ-�����Tb�-�q��wZ]���"�,�q�F�3��e�J�����1�N )����RYT�!P$�����$��,���9�O���6E`��^Xj�#���4U�"0�(����mt����T�o!��X��a�=��E��Xh���5CfY�X�U�,��0)_��l�4\�p���s�R+<r���z{�h�
E���Bv�c�V��ZtV���f
��T��
��}�_k�>��,z� ��,�|��������M�<2�p��Aa����XH�a5���N�b�d�9��;{$��>,�Q4��,�E�]�6=?�e��z���X��'6��'���D>�Y�Nt���X��6L3��X�G/���������iym�� �hv����W��v��S���S�<_v����)��2�X��a��a����kba���B��c��\��q��;L�L�Q,="��S�����D����2��T�p�Xq����AM�7����/B�[�Kl�1�T�Pc�l���c���)���,�(v���i�6��> �U��Vq���o��^�kj���*���.o�LoBln�xZ^mL%���,�6��}:�n��
���Z�VvZ^[�,m�44��,>��j���yzL[��<��,�j����������]�7X�����j�X��U�����c������G��������Dg�4�-�H&�b��b+%/�j&P+����O"]\�������(�c9�����2>���=Z>��o����B�y��l������O��A�����d�����-��?V�}`�Zt�����5���D��bu�'3S�
������%	��[�|������+!M��6�]�R��z,��0_�����X��a�g�a�����T-M��4��K?��eh)�;��������;e����OCsf�`b[!���>�a�?h��*�1�Oz�����2�O��S�%EC��4qa��u|+;��	hw���K#WR�,�s�E���b�d������)%m4�������+��vx76���c.��(���KZ�������'�������1���0]\�02$����Bu�c=^X�,z�T�`/�-�
#Rzb��j����\���A�� ���N�����MW�=?LV����`7���d�l�� ��X��a�?��+��4�,z�@7n������4.L;U��b�[6��V��Y���<��S�=�=ni�/�A��'b���X���a�4�(XO
�+�������a����EI�8r��j��y��v�d���;�SyL�0�B���K!��B������M��_:�~G7, ��jI����D:��[���}A�^*�����>�Y$f�I��*�:7T>f[057h(�`6�Y���T����;L^��R
v*����[l���c�b(�c���,�D������g���������5����+nR+?LNtO!��p�'���h�,�`{��9=�m�Z,��%Z\���Xx�a"i�a`�^J$x\�\�j�t����$�ah�y���)l�	uZ^P�����VK.8p�x��U]�'������j#�W��\i���@�'h(:$��{����i\��j:�=V�9�A����c�V�}A�����������1R�El��2����-�F�BI��J��!�kEIa\�rl)��
�L���.|g����V>k20c�v����`���%A�?�����:��K�fejd>,U+���/g)E����'�~k(��m���q�]s��t�4��.M�
m�`o�llII�*�TNeK���E[-+S�	MI�B��n�1�������5����
EN�k��I��No�i8�O�Et�gGi+�)�tmEO���9��������c�[M0J���z�`�H�����������[��K$��4�K;����-El������d|E�����xx
��SU����kY��7������&v��ei��BQ�o�[�{o���<U8\�M�Y:�;��#���R�<�B��oV��8�M����$ ��tz����3
���X���_`Yl�sN�{Z���E�hv�z3����t4L?%.,/�c#v���4��S����&F��]��e���4�E��������]�O����p#P+���`�_��,z���XX]'��Y��]p�&.��h�-��Br��y���������2��'�
�E��x0�Y�vY9�`	[�wA{��/]xN��PgJ��s��i8���0:�������<.�EI�6y�NK�S���D�M$|"�X��]���is���������NfI�����9E�k�%�|��S��[�]���0-�y���Kl/h�/��f���p��������2_�X���9����ts3���EJ'Y��Yx��V���,�e�Do�z�|�b;��{��K���j���[���&�����I�����"{YIw��$���K���t�eE[��&����=������6�:���k���y}gw�����"���v�F}Uy6�Xh�i�������4�8����VW���.��,�������i��j��Q�����]�T,���D��������������b���'��[I�D7�p��MrZ"�O,�Dt��wY�w1^�
�Vo��W�jK�-����FU\O��],^4
����m����h���,��VM�cYKw�lR��n������������������/������'�?��\	�Yw�L��Y����*R�6VJ&v@���\�~ZgyA�TZ����e��7���z�Y��j���k��	
�����+�-k�V��a%�X(!�-�ebWz�O�k��~+�MI�4��6��-z��|W&P�ui�����Eg
���f�ab��D��W�`s������d:���g�4��>�M�}��%�����,������Z��������������R��^��p��at��9���<�d�n�)�sZ\[|L�L�]�X<^0���g�XV�$v�����4ED���X���34����Z��i79-��'&�,z@C#��=��?=��6&.ef�I
q����`wA�yY�y1�c�^��0�j��y���:�����K��Vi����K��4/&'zBs���p~Y�xAO�h��8�����T}�3�c��7,�b���q��A���9�Y�IYky��]�9�r�S�������5k�m�#�����oYk9��8\��s�R�VjJj��u�\2-�
�O��;V~s0�'��t�;�*Q[KS�!h(~o�Kz��������&��,������z-�0
?X�v���=�Q1^���7$��;
�^(������^tU#[�n��f��iqm@g�4�����_��}�B��h����0L���vh�0��)�����������7��Iv���BJ�37�k����L�x$����o&&]xF[]t��	�{9&�k��/X������SY��v{���~ K��9��
,,�\om�Nd;��M?�`;�b\���v[�:��F]�h���5�V���P�a��?�F��P��<Y�zA=��s��;���T��)HAF4��)�zZ^��P�,�A��p;�J�~W6z����-h��Pl�?�������Ag���,�[��P�c)�U��Z}{A���:|g����(��Z	HX����Ag���,U�6����"��
����.,M������q�I�v/���6������X�{��#ioW����
�{��e����:	�5|i�M�������"W�A[<�������Sk~/��
�lm�
�q��RQ�`�����6a��h��kx�m��a���`���&v��-�~/�b
U�����"tW$/-������Z��^��
�:��������B����7����X���
w[�;��|.B��di�b��AlE�f[.|3�����bG����z{���}�A���5��U�O�
�������7l�Bs�f�;^�Ba��5����O#)"�5�e$�Y���D���"��k�����+�Z0�k.��'�b*��vZ��%B������-e��	"�N�������f1�PK,lS)��x��e�YR���;�;��=kL��8-�m�E
���2�����$������nsZ]�@,�Bt/t!����,u_t����9����ea���qS"�iym1a�]������
d?'�x�]�M����,d+
���Y�Ulc�7b������N�k#�9�EwV����o��zk����tg��6�H����l�og?���.�������B��hD�Zo���.)Y����a_���s������HQ��p��#_t��hI,�cV�����9����7����]p�Y�9�|.Nu�������Lm@��hx����h�3�p�%�7�^����<2��L���B�����#��t44�D
/���7��3
o����y�����Y����j����M5��aO+dS�UM��h�t�fj��H$u�����4�i�6'����]9��u�����L�������a<P�V��X��)�H��i8�,�E�����l�o$R�cCs.�zo4ox6�������z��s~����� ��-��et�����t��r���~b���������������*b��������Yb�G���9{��
�����-���
�,��-f���IY������E���U�a?V�p���r�N�`��G}�0)O,uYu5�`�t����J�iym�����t�{��f�(4����&��]I$��:������~�_�z3mOS�
���Do&I'�A��X�gv�O���;,�u�7��
{)��h�� I;���`w���V��N�+����������se+��2TZ=��8���t��`���M�ium��@�����aQi�����PE�-*
��Do&>a:���K�iS��"aj�`A�7<���y��2��
Y�����&<����2����a!F�x��X��H���zL��0ltc�Bb/�;���w�����V<�����	�	��M�u��Z�z�����aNu����M���c������i��J�:���
]W���^�`��)%kx����+�U�7����m��Vb�V��LA[t����>p���0$�ISf[�����f��',���6����f��1m?���i����
�����������Y�^�q�a(&X��(H�K��4���W���2�>�Wi��Tm���	�b�����yn��m�G]{{�e�7�9=+w>�~�2q�p�����i�6'�d�h��(M������JE�u�a�R�w% j�����M��j��\���%XWl�;>-��	��-v��`�X��>k��t���������6l+:��}gi�o�7]�p>Ag���o�:���������2�@s7��SZ�{3ID���&�o�6����V��+�O����)��^b+r������C����b��i��'`�z�&�p����_b�4Ib)���
��Z�o��5��Vi�L�Y4�w,���B1iC� ���:���i.w���=�MWHYS�7�qa!���+�T�Co��$�g8�0�`p;X�8�l��ga�M��0��]L#��`�:L���$�]��������d-����%��y��IX�z�"�	}�����`iVG���9y[H{�� ���y���"ZiA�
���)K�~.���7h�!kJ��?,�L�P$����W�`�R�3}i��O�����8�E[��/B������o�b����
������&L�����!�\�!�-JM-��+mW�E�7,���d��O���gz�bA�h#0�=>�����|T���i�?@�p��0����Y������5��D�l�DN�{{y�m]�Q�Q����$�e�;?�����M�����fgzwOO9����S���+�0=1L��[�L��l�����\�5//�4CC]0~Y�'6��Q��\~L�G/jy���9kv�8��1�Nu�%|gs��
�H��
�/;�au/m��cz"��/7�K�����^�����&��7}������Q�`s���n�ej��1��p��V^0�/�|�1������p>gsr��1m��h�i�X�lN�)����~����l�!eQ��w��F]�k�On���c
�\�f��f;r�����e���J�(����F�����(�>���;kT�mh��w���"R7����,S�5��0��pC9�4��0�T���(��;n�OKd�
9�M_���S��4Un�v�]q�6A����D�[f�Tv��
$�b���w��W���Q���F9-�
��Hw<�	��l����t��� �^n�*�*��� �ab��$<��E����n�Y/2��}�E3��f�����X��7Hx�>��Uzf��i-��j}� ��n[2H;�4ke6'"��T�^��������0��1;A������;�Y_-����B
���9$�w��`�����>x5�W��-7�g�%��]�:M��_��.+���B���+����M��������Y�����qY���q�mkE���l�%��n��l�����>vzJ�^0t,���t�_�-��$Z�a-���q�5�'���n����%���MS�I#W^�n������(X�>�ln�����}���6&��<h�d��-�^�5.*�0{Wb����K��{��`���n0�"�	#>�u%�����7������}*q�n�	�.��)$�V��
T`z~���l�@_�%e��o�"�7}�ps���I���.l3��R�2
C��(��l�c=|V!�������4l[��ar������A���MO���84G�����>�\����`;����t�[;=��GT,i����?���2%��9�l
�[	�
����&ai��)1���{���5�+�n�Y������wa�f�Y��`t�j�����������we����7��7��lAj�Ln�wd��Ij������&4S�0/"B������`�QrZ]�@0do�f�����5g/��l���`��7x�Q���i�6��E+�bx��S���f�[0m�t�����`ox-
��
�pqe�\���kH-fgN�HVN^�m0�e���|gs��T�@�v�4{�����G�l��be�����l��\A_��v��`�����6�$���*=�&_��4��E�]c�/�l?����s���p�'������G��R�@i2�����
�l��J,�4�(�#R���=�$�M��mfoh??m�;.}����`�I
��.#����	�L�i�L'�f���<t2,��lO@����a���{����:���������k��>������N��{[�Y����>��Oe��6���f*?��u����'��H�Y�p�]�'`6]��8�>4�[J�����	���i�<#��I���/�1p�����e;zp�z���<�X��6tH�����l�\��s���l6
S�>��{n]\��H��@�^����0KMl�J�������KO����n5���������D6�`^D���	�"��m��$��;f+�_�����wv���i�l?A;&��g�6h{i\��E�L{�dr���m��Dm���:��OIW��m�
�������T�t��� x
�0F����.g��~��N{�	}go������`W�����6�}C��`sj`����~���[���,��T�7�u��A��T/O�x�/�����{�Y���w��������D3_��,|U�Y�fYl��q+�{{u�To,�)���	����,39�L������Ev�;Y���^�\��������B���������-��n�s 6�����c�Q��1�H�����I
r�{��`yu��4p��>[��V��T�uZ��%BV��E���j.��u�/v����������e���^�4��:���=��,4��:Db�URl%����3�o��[l/�@\����MN4�
�YJ�X�g�1�����O�^������Y��&���'��������+b�i�[*��1mlB�$�^��kMO���F��,�d6y�O�k#�U��n��+v���yS�+�K�z��f�RH�4��>�|n�e+���	L�U/L_��t���`74���.�D_,�R��P���Obo&W�q����/Vf&//O�7����N�����M�`k:C�p?	�I���F��	MM����PeqA�W�@��7�e
O�&�~f��rO����VsYy<k�}��S\V�lci�b��^����d�r��K�I�Zz�^f���RO��i8��L=\�H������}�����\�`�g��"��1m�1U�_�����E�"�-��\��X*���P�~Y\��q��'�C{3����4gh>i��v�e1��������p6c�
��B�,t��j���PuY���/����%nV��q��y�0��S���~�}�FE���)��v	���1�/�i�_dai��U�����T����(��C���,�������k]�.K��0�D���{3��r7�������EwVn �)����2~>4|i��0mH��0�C,4$�^�9��T�����6�Y�����>+��1������oo��szL[�����/�,d���7=���Re���i*s�8_l�V��Bq�e�u�)Rt����G����R��i8[AL2]�sR��a`)�WnVj���4�c��f����:=�����K�S��#��$L�u���o[Z]�^��
�T����b}����?o���:�t{��/#�w�4U[O0�}���f������b���/k�_L����}e8[1L�^4��-t��������N�@i~�E��0�����>��Z���c}x�I�7��wZ�����T�����PQB���<�m��5�n��;%[Rxg-K��g�7�	�����4U�0���^�$K����g
�~��KkC�/�����/&�':�4��B�2���)����x����a�3�0�E��LMAl�1�ee���������3��d���+��.K�_0t7��*�b�Tf�w�q�[������������`��VI��.=uxM�z�v��#=|x[���\�{���O�G�FoX�lOQ��S���������������R���9�����R����	SQ��K����s*�>-��ThP��;�X�P��?L�6������5����MD�����Tm��;�:��Z��N��"�b[A�r��f�>
���(5��j5��\��G]`B�S55�9�b�D��<
g�
�q��z�f+�x��_0u�4�	�k[����Elv�����CM��mp�����
�q�������	
U�qKY�;�5x�������cF���)�����O�k
j�M�;�6����ad�le�l������1,����S���;*��n+qA�M4�C��,L_�zY�M���/�K} �cF)Da�6�`�{����w0�s����d����9IjHoT�n(�+����W-	�"n�A�_jfC��.�����
7������P7��`�"h�Z�>��
���j�-e��V��5�p��~���-�(��4n�����V9��
��S;X���
��S�8�7I���(������he/�i�?���b����p=�]�N��X������U�-���Q����o��'�C*9�n�A�����"Q|����J���`����7t~����`�<z�M>��^��V���}�%��LWJl����c"�M4Kh������������
�]0�����$�m!K]����i�����tA���_Ac
���-�]��<Muz��-��8�vK���O��>=���D��i&�#����"z���D��h��-��(�;���l!��_Ac���S��9��v�BD5C�>���$@���^��7��MO>G3��$�_76��7v���p��|�2i.������:M�g3�[]�	��*�{|-�y�gU�]h������4L��XHI,l��'�X/VwoLYTtV\<
���e���������v�5������g$�
�;1~g�����-sxL��7�$*K�����d�b�k�hAb�YT����h�7Z9����X^��\\��,�-v&���1mN��q��e���\�,X��c���6��%vN�j5�_u�b���`G�]M�@{cb�0�T��F����D(����e����J��m V�)�35�pK��8��*���S!
��m��z�Y��;[��,��O�WAt�Yd��*���O,lb v���~[8-�M ��(
�����NS�
De4���VW��c��]�Ao�E#f�y�p��Y���
�N�k��SE�\�����ikb7}���3������%4�/
�7��0�\	�XT�1Qy�Z	h�/���n/��7�.�,��#�����-��X����tm�����(�$H��0���w��{.0�8��Ry����WU*5gs>�a����X6�h����+�������$X�[�Elk�sL���D�n{�A/�� vB�$�����>���-�V5k���j���xJ�a��5�V���Y4M 	v�E����:�����-�`�9��e>h��!�����r5K�7&D"z���`�p�X��-v��aW[�}�M.��C��F�$�X��T����b{!��Yd�� h[��Y�����%�O���`��a�u�4N��a�`a#'��#tZ^LM4u�;%`���PCB4}g50\��i������������aj��7SJ)�������������4lR$������{��g
��P���������^�wYi=w��8\���������r�8;*�����?w���5K��7��������$=���������(?w��N�xyc�_�e�<jE�#~����i�6F�~���nl��|:�d�9yDi*����m<g�[	�[��1!o���������M�Pa�����n�]#��i�n�<b�4g��
�����`�U���4��a�JN�5�i�����EB��Cy7��
����d�v���qa�;��8-��M��Ms?��X������Q��V4h�E��b�tf=0TK]����K��
����%�f��t�Ewx�id���*��n��������i��uc�G�s���p6�����7��w�j8d�]l>���OA��Y���^t��������+�p�S�&i�7,�
���d�5���(v�H:-�m&N-zT*V,��H��M�z�!�>�`+�����4
�[�Hm�LnP�A�����xq��8M��������^9��!L����0iQ���zK�7h>J�zR�������c�3��N�����EC�E"�pu�p[0"��kg�
'`��/|w�����c�Z�
z�~����Tg���a�@�V�i\��*pg��V��H��n����+i�������A��Kj@��mp�	���i�B�;�	�c4.L������	D�;�	�Y�o���N��s����*�o�����E�N���l�#o�8
�{����7�O�����L��fY��%[�k.6�^8-����S��:SB���Z�i�L�h���3F.d���l��V%��S��
���Y!�������9��E���������vL�|!������`��jn�Be�P�K�f���� �q[��f���o���+LNS]�*�	xQ���t��VRok���#�q��6M����{�Y�^tg�	bY���e�D������4�-o{����2��l�C?M�f+5��$B;�5����b��i�l=�m6hj���gu�����ZNKd�����)dz��}:)��O3��B9�m)`(�)��'�������L"H�Uuo[
�I�n��H"n��Q��XU�fU���d�X���2��m%`����ca'��oN��6�h�>%�b5�����M����)BGSN�}�����Uo������&~g����mY������S�i8���
4\S����m>�Y��h�;Y��������>�Y9���=
�c�%����l%Lq[���<��B�X��P:u[:�f�U��1�Y:�f���4����������`�.�;����$����a���p$aZ���-a��|���`;�����E�����:-��H&a*:��N����N���`�0����c��c���a9�X(�(�W�1���Y����R4�Vh,����J��%��/�A�}/�Y^��+]'Ni����������Ry��d���k��&a~��7s�ErvC�I��{�����m���k�����1���K��`v�1LYS4Lg�zNS�I�4�s��suq�){����E�&t�
)\�kn�T�6��s�i8��LiRt������2�Ew�{�7]��,
w���V"��|�a��s}���[,�'��f��%���
��E��{�P'E����jVbWAU��<�
)%q����>�|��	�e���r��aA��)'��p�
v@���-T�������j�����q�I'����4
����&���>=�m/�����jIN��~�/������/��[muLX�/���`7���'��3�al����6�
M��i�����`��������
vVR���yCK$��5�,���Z������7�kj�JB��<aci������qf�e5sF�������>���9��
�~G���_H/zJ��yC�9�
n��*�hV������n+T����'4�����.&�����s[e��S
o+/K��R��8���x���i�})����l,���{�������:
���I6�����0��kK2��",��a�D���`���8���w5Xz�� �V��a�s�#�_���Em�:�b�b"Tb�D�������7L�	�z������7��;;��VR����6��
�'
30��)��P�m�S	�D:O��b*����^`���5�$�hZ�'z�����,�[��B%����O��|������bw���J�7�_=a2V����;5���=!������6��\��-+�HV����
X-��9J�I��ub+qW�j�p�
v�������mA�&�.I^��K�\�Y��l�05O���[1��y��������VZ�1LS4l-v�����$�X��a6�L(Ll��}��mCz��r��;����p�6w9-�m x?5
���}:��L1��c���%Ao��pO:��N��
�|�~������`����	�n<1�����2�7�����:*�i+r�0�hUM�#D�9xO��0�,��V
��"JOz)��d�`ag&�4aN,LW�\�������OEC�W�P�r�)�����&��6n�,��S4k����=&�M�����
���(z��G���3���;=���D[�iV�-�bu��
�|��6pZ���O���;��n�>M����.�),������n�Y��'�s�B=A�,��,�l�Vwxu��.����[a���x��
�Xx�����|�����b��4��q�������	w���be�b;�c{���[�f5�f��X������f�&ebs�������,-D4��%�NS����,aGlg����v��W�L�[�3]\���a��v&2+���t�I�4S�@,�EtE��[�5�~?�����(`z���o�p�$�n�����E��4��#v�=2|H�^���\�,n�5r>����N��`gB'�'K��U��n�U�O/�"k-=.���
H�UW;+=���x�P�������U�n���DfE_�%�J�U[���lg���Y(Dhc���4�![�Y������"�bas<�#���qY�@l%��[���/��3�wv���x���i���
��b��l��8���EVg!z@�"�������=B�f
����X����a�������[��3�9��	���(�����0g�Un�-����j�0�t������N�����[F�R����������q=2����cvzL[���n}�nV�+67�9=��T�]��`��5�5e��>�c�r,l������t���`�OAr�iyO�ic����n,WQ��n�`a�P?1z�/������t�E�B��n=�N'�avpv�Zwx���4�ie�U�[n��:���:55��������5{�?Z��)��ujw&�-zCo����^h+�w�ZCeZ�����	b�.��!=�����b�+�wA/�[���s����5�������(��-�o�����-�$�^t��&p�����4�.Z�?Y����"��;���;}QC���j�-L��'��!�0�E�;y=`����3x+�����-��w�%w��]I)��1�����|R��}�}�n��9R��~�`W��d%��c`�%���*���;���|9-�O*����`�����L�):���;L�m��p>_����AWu�:�vKwV�&:�?��pgU�������V5l%�
��S7PvI}n"b���i��7�������S����V��0�/��9�oJ�qSU�iym�0��n���K������ =`��B�n��N���g7!�������ZO���;=���EW(&���NOik�L$\�F�B-����`�Q�`WA �[i��k�|:g�������vC;/Xj�K�<���i}�N���0(l�}?M��S�}��	�C��l/&��)mz� ���a������r�T�x��b�Z�ba�5�V*i�LHl�}Z^�|�G"��/+�g���3;���u�<w��D�.�[�l�1�e���!�������v,6	J��]��,�M�Z��PL����,u��r��5P�����������a�,-���=����O���������U����_��s��w��YK�������d�E�
v���C��\��,
e�E�$��p�D`y�\K�����+h$=,B���ium���Nm����D,L����#IZ����6�����]);�<tg���a��R�/�>��
���T�&�\Dx��:���N����}b/O�
z�$-]�������p�����>+Ek����4�B��n]�H�x�Cw�A�J3���4}g�7Y����DROKdn��K�g��'.��L�w�U���x�t�S!|����>t�[�����E���i8���>hZ��E�w�8
+�5������;SK
�o�"K,���^���q���ium���k��bg�_:�x<X-�h����a��\N�q8��'��k=�BU��l�`6�i�9�
u����������?��>f��.����,<o�~q�K�]�E���X�{3?��-m}�K��\��PR,�L,������s�*>-���"{Q�fv��YHT�i�z��s"�wvF�r�v����V�L�Xt%X�y��%����xdz6D�
f������Yi9Wf}.hh���1��Tm�1�e�����^��v��t����a�djb��2�	��	5
<N"<&,����F���@'�3s3�-�O�kK�EE��2���*������EO�.!��1�I�Z�Z�{0�`��C��S��u��j�Y���p�bO,������vK��X��X(�&FW��CE]�
g���a#4���)*��������+��sj��~���6�����X�'v����]"|l�m��w�fyba���U1��8�{������>&��d���+dC�������v�4����?P��!6gm�V��-@�i���l���:�7}��e�b+B�������8\4]IV�i8��0T%-�B7�a=�c���A�`K����������]�����E)��,5��qO+d������tu#��UK�����c�by%�om�[M�tXz��	��1��
}��e������2GY�������]L�D�,t�Vwt�R�(�@V;,;�4���^���v��j�<n����>��S��!+8K=��5=�Iz{OKd��R����[�h�OR�p�qY�����������A����pV�L)D4�E�*���|����J����I
���B�N?1|i���j�am��K����u_p�
v�[�9����L�i��F.��kC�
-:[��Y��MlK�,����:�l&6���jk�f������]OS�U@��8�a�(X�56+�V��=�R��Ii�NKt���&���WE#��G�����5�a���,�{�'��=X�����4���pS2�9����>�a(5�
����3b+�������q��5�����w�������7[�|@'Y�����9F�Z���h��m�����E��!l�J�����������V�U`Sj��1m?1�U��p�fj��S�b����J���dJ:�tr���
��v:5
�V�*zA�t^�"L���}�2�`a�Z��I���RI��&L���:����D��-HY�x�I(�b�X(��+X�����f���c����,��,:>��>��p>����i�/��;��F�$�$��f���������s��}b��J����lN?,�%�a�9�q�6L�z���������5n����t8����7,,�V+X:�`z[;|@	����a�����{�w�*���n��.}��Z�hO��d���A_ps�z6����As���V+�	���%e6�����
o�s
����y�2�O�k��.Q��������atB'P��R/l����0z,t:h�B��a
�S���p��)'�������}Z"����*�
��r��f��_f����;�.5n�Q>=��6��*�^����^�����~_���l#6��q"�R�d����p�j]�7�j=��������l�-=�"�����2��N������YI�������']�Tj.�������Y��n�A��1"ij�[�q�
I����[�z@�#h*�,��o	�3}��0�iy}�CI2)q�%�c���������:n�i����p��nR���n����`os����Pl��oI���|.����������b��wm�n��[!�wv�7?�1�g�9W,)kq�}
��������h�D���s�5N�kCz�%�
o��?��y���4�@s��^�i���^�0*&��mlZ��b��;��������At����~8��
���.�������%��D������=|�^U`
,�"����
��{��������_���(�n�Da�3-��q9�=c�5�s����dl~�O�x�8���7����"���uz����SU�~�a|����� a2����>�Le8�b���We����d������U�x7-0
�P��p;�B�bs���1}��
6����#�����"��� d;��<Y������e���Y��,��Y5��������d
������r���uV&�$�z���|���&�������D�6Sb;��]t��9�0O�DOV�nZ��k.��5�'�w��%������.�e�'��KF� �>-#LOuI���Y2���iQ����pA�B��p>^Y�iV�,v�V�GK&������*�W:!OO�c��@EC���I��2�8�;]�OK����������|��3R����R�S��nm�	/iM~x���-��;���������0Z+��(��R9�^���iq��*�D�I��4�X��*���f����t�YXH#67�8=�g&�&���N�t���,��^K�s�V��0�s�Z7�i��	=
R|���_�?<X�p�s�;��p��H�����
Y������TmP0�X��)����4��k����l�D�V�6�O]�6Y+v��-�y:
�s�i�����N��������tY�]�Yw�LlSt�;s���[����e�����>AO�
6w����L����'����|��&����^(J�Vl�
���o���Y�R$��oB�	R��i�l��4����4��u�(��iW>g�s0��bFbagI����Rk=�J��B�91��hA/�Cl������dy�����P,{���`4+D�V���^��Z��7��:�6��N5�VR�;.FiZY�u�i��	���M���p>���P��t�a�_DU4p�J�k�0Ok��RG�7������B/z4��WWB,���D�����&i�p�������CXb���i'=�^�O�����AC����[qQ�eEMb/��>^���kY���bM3U��I���`�E�V��0�-��$�4��6h�X�NU#c4]�Ni[F?��)j{�x�,�:���h�1*v�:��i]��\(������>l*U��1rr���j���Ao��L��q�K4�n��9WJ�����E/����>�zJ�fN�TN�O0,4�["�i8�OLw�A�l�[ay�	}��?��uZ���K�d��($MK�NXdt+�L�����F�.��O��N&+��(��=k&%6�7��������.�`;t\��y��TX��m��t�/`���>������g�Us���������I��&��i��E`�:h(F)6oc���&`3�;4����-b']"��V��vL�}��Q8�,�
{p�.5-~Js��0{y�B��`/�}{�@l���?>-�:�`�����g��	�����6�������R�q+Um��0T���F��L�0	)��r�X(��-�_��l�U<k`2�9_�;[ip<-���D/�,v���`{�������W~,l�'���o��m�	�~K���T���/�z�M����O��*?�3�0X:CS�l������:
g{�i�������`[��O�i�}'��4��.����	H��B��i][��Q�
M��C�^�J������4�+/��x�
��tV��BiK���f�9�OKd�(H�:r��%���Mu����	�$qE��`���js�f�N���|8CE=i�~?�K�>L�T4�x������HlvR�-$�>�.}�t�i�@�>f�9����O��h����v�5�M�������pU����b7���U~����c���]����
3���z����Xj��ECmF�L����)v�>���S��0��u�UO���1�+����������B�����b+��������#\���Z�?�w��Do&Z&���X���^�?z�I��}O40�e���I��X4Cln�|Z][����$��������v���jK��^��a��Y����oA����C��;�hf��ebb+b'��p����p���w��>�lNt���`s���Z�����
�K���4�=F�XH�aU
�o��<8��,4J4�B��c��e�����b�����j�	��R�elb����,@txL��>,V4 �*EK�>��M3��:{��-��=V��b�GS1;�
��2

���Q}Aw�F.�+?L�T�`�b���wl��>/�%�1M������b������u2
�)CW���Y��SU,~�X�@����fi{���4�_d�d+?�4t�
��n��Pr!>�X���7w��*}�8g;�4��e�b���iym>1�R�9��4������q)�LsTl�r}g��{�
�����
�A�L��=��R���1m{AO`�7��;��L���Y�[g��*������L4��,v��F�/*~���b�9���p�M��;�a�[���P��v���cE��i5�n'�U���Gv�d��z9D��k�)'}g����]Hd{,
�0ih�����
�k�����`zX�����XW:��|.,��g��R�Eo<�I:���T��t�D�LCK�N���Tm�Z2������I������!=n*@8��� xJ����+�	~������i��.X���~��g����b[��;���F���f��t��L}�h?�S!%�������YI�6;`d�{Q0��^��5
�����;��l���cEj�OE�
��-��[�V{�������b���Y���ZKRC�Y���,l���g[A����6l�$�r�����$�D/���R`�d�D��*QESQ�
^���o|���~Z"��h��4��p6	���_J8���/+�ch�J���Z+9��
'��B���G��)����6E������V��+�P�����)�f+�j{�)��R��i8��0��U��X�a��a�H��r�
��`w2}NK����������ZZ���r�-.���~�|���BI�a��{*��`X=��ds��b>
g��)S�^L��,��4k�"�7����}JK?��-�`�����gb��q9���xZ^2�������	f��9y�;��UK<?L�Yt��`�I{��
(X�$�z���I<�6+<?�*e���Qb���i	�����v�E���a�����B6���4��������l��&��J��U��"+:��<
g�	%A_0�LJ���^o�U�qaTQ�$�4?��.��Nu�U��j�g��J4�R	������
��[��*��/�4CSO#��B��h���g�9'��iym{����N����ka?���F�Oy�1V0��+�0]i��6"���,I]�HY�a���,�Zj
[�@lz1�e�7}�'WSX�
�N�i��,��t�BiF^4k�r,M���V�6�i�-zD����0��N�fS���B���g4�j��)�q9���!�Jj���Xt��U�����������I����YH�^��4[yL[m0����������:"����:���6]S�������4���M�\dq��}g���iym0��Z���e���/�(�Y����[�]�T�P�wz���=���lE�����S�0>�����}�`����{%�j!�����9g���wv�K�����,����kYy|��	�,� ��3P�bA9�,:+4ku�����MD4�����9M�y�pQU?�}Y�^L�Htc_�YV-%v2+���{��`J��hNU����j�)���@��5"��e��ju���z���~L�����t�9�
���l��������#J��U�S�^V�����o��{�0c�@�w����
}{����>�~�=<���sl��p�B��=�������b�0�G!;hY#z�
/��������w67�:=��'&I$�,�m���*��6����h�9kd4{�s���6d�6�h������.kS/��f�PN��/�XlJ�`��bk��-
�����Cl�����,a�����D�
��^tN�?g�gX,!�.�Xa���1O����E�D���ba��������i�lQ�_$,
�������5\2*�1y��.�}Z^[2��d�`t��H�7�������7�V����^��e]k�7 ����i8L��4�({����5��Pv�,�X�����������zdU1���e���|��t��/
AOi��]F�:���_Z�l��%���e;�F-���x�rd�{A�hY�x1�g�����3t ���_�Bg\�� 7�,����������n�m"6I����':K
;�������l��AX}���7��D�����J}�K��B��e��EW��Q�w�����Tm�0�c�+���i/��&������p��m��A,���kC�:�Y���p��K����h�9�yzL[1�Rv���Q�q;���az���`s�wv�MZ,t_K���;���'���3� ��,��Xb��N?�^�L�`W��h��q�JfE'�������Mh���6�`�%������!��AW��/�/��
z2	b�0�)�d\�2�
+d[�>�~�x����w��0��_������.��[Z^0ADB�LDl�����*��c����O��P������Z��
S�����T}6C_S�P�w��T}F���T!@(|����4����p�.��"���b���JzM�SG���S~x��P��`~X����a~���a�}�W�{��T2�h
o�Ba`nH!���M~�;�*~C�,�������':����bw%��2���������H�����v"��8fy�����	8O	�R�)�&Yz��T�gw��lY����p��	C��5<z���%���m����X(�/v@�8�^I���bR���J�w����d���zL��0=A���o��,�
S[�+
����zz}g�U{�����6���#�x��UI������1�,��|�����[
����4������0��\o-�O�i+���T���b'�!|��}�;�*�+�J/x�M������@���:=��6�(Yi���t�K*��zbx6<j8Z8,��`@*hz|>�v�i����;�l�|g����\�*XWz�����J��u�a���/�w��l �YC?�5�����Vh~��+�������4�Y������'��`�X����4���g]Il���b������4��'(�4-�Yj�Q��m��M�;�5�Dw�"���d�����~	�As-�	�q$]�K[Vi�������/r�F,���1�+�[�w�Rck��3����-�4�M�a�����B ���x�Vz����w��2�-H�.�R��~�d;
�c:dE����t���i�>#�	��U�[�;�����Y��pqVA�l�4Q6�Y�5����W-	�B������g�M��42�x�zH�o3�e�3�s�l#>��0�ih-��O��W�����A�R�`<j%.[qX\6gJn���.��.&.+�����V7��
/�bo�������'�njm+�n��h�>e���-���g[lu��hf:X�����7�ey�b�t�:�����_J����{8t���A�e��/�����[�)\�Ss�eF�DA�~[3u���m�S�Wh�51<=�������
��eO7Y���rQAt[A4��>'����m%OXV/z�D���ba������D>��74�P����-���X������d[�t31#��D����9(�o����4�w:+O��Xg���y�*�0�F4l&���f�^@$X�R;
MK��G74_��jqbsI�i�>�Y����bs�m����7D>
]��Sa����m����I���(���������f�s�l;,�S7c=*��%@7[=Y�����eN8������z[�t������bo���Y�T�Y���D6F�pwd��%����'��7��B���������N�U��h��b��m��
�����y����'n ��m�P[�-����J4}i������b�����l+�nVF#zB���e+&��>x�oj;Wu���S�D���-O�F42������nV_"�����F��']��Y��/���`����]P4�V���_����1��K=Qbz�����I���X����R������m7
��@�&���t������
�����[�3�����w�Y��&��%Z':�X�YX������W
�L�E,�a��l���03C�����m��|�}N�+���L&�!z��,�����dPo��nV�.zBWKW�5�����
���x7S/=a�)�1���gg����m!��,����o��z���8�g]q�w�l���w�`��{��?��&�Va+�mEhxI�&]X@��;�>vzL|����:���O�`��OlAkn[@
�����;y����+�i�^u���/�W�8��1���[�����q�B����0���c��
��]q]����!Y��aT�o�CQl���,����6����j��
�3C=�T/���YCCJB���5��u���D(M���,���B����0$�Q��Vi�U6���;�07�$�&w�i�l��r�<�
�4�- �X4T�_��z�-�`g
Y���������|W��l>1y/��DX<�"����S���^H�->K&ox�	z�L�)����P
�-���d�h��G���&xh\����ayZ^�"p���q������'����w�@/��-4�T`tZ][1L��t�����f���7ji��L������
��rF�WH!4>�k�Z.���<�A��6��
&�{�����)g����`
�'����b+��%o��&Oba����+����7t�Xi���[��H1�$��V:Bm�oxDKVY���+��V<����=7K���0�<���0�7h�c/�`V��)�������4��w��A���L��QS���-����l|��R�y[yx�����m+o�<,��-�T�Z9�����D���b
�
�E�����`;g	vB�~�����D�&`�Y�T�%X�@�w�G�;H���9-���@�
v��l�o��t�95��B&�.l^��LO4�m�+ZD����VzBG�����K�.4�����Pt)�������U#A���Q�@;�����%����e;��oK�M$\��,'s��i�l;1��m�e�C��#�UyL�,o�X ��
]c���}����+�R���M�D_�K	���S��
P���A�U����
[��n0�#����
8���m�m��]4l�'�-��6�7*�
�J~�Q���vO���������V�O�D��L��"��
���O9���V��PJRJ�01Y#�Rw�����%��U�F��v��}n�����V�y�n���G����5W��]G��1�V����Y�h�2��{�N��U�\~JrB�n��3;S��i��S%_���*K�2����=�����d�1���lCZ����c�p�&~���?�A%'��~����.m?��c����[Ad}&�O�l���$%�������Iv�%Z^"��A�sdU�/W!���q�����T/�p����|@�#IE����yL�/0���kv�����DVNKd�yaL��i8���,�B^o�����"���Ff[
��V�F*
6��`�e��L8����n�V~��������/M_��fg�F��1m���,k6�T<M�6J&4}��E�
F'��e��tZ!�@��[o���,S4�:3�����`��TL7h%KWh��B��4�����_��O������
>$��KWF����zM��R�v����Q!���N�4U"(���w�������d?M�~Z;�;�����Q������a�����?��t$cmz@��d�Q���)����{����:����_e����"��5�?�fh*I�����U����>����iV�f�#U�_6y�O����NU�+�F�e-z�2�5��{��`��IE#U
�x�����M���%����Lg��w��A�`414g$ j��\�n�^(Y�4S�4M^�o�o��"�4G1D|�~�!���hd����;���[Xa���z~������s��y���{��]�2E
�zg�]H��w�RL���6����/MO�(`C=f�����\�'B�4
��+�H���d�M3�������������u�|0b4�2�eaN�%�Oi�
�l�f
��6�
v�;}�����`�^5���n���C�4U�@�
 �����`���Qa�/K?�I����K���+��m hzK`�~�Q��r�OS����MOT��;2�	"?�,��fI���6t&������%L�BW������q�pZ�^(����7�`s��i���P��i��e��_S�� ��\�����������{���+;����>�,�����O�~k\Y�3|����������]#�/�b������`'�*YS���������/��,+��e�K�w����1t�X��a����o
�
�VBl�F.�2
`���w�f�;�k������Ew������h���q��Z�~����.G�~����?����t��SN�����t�)�S�u!�g�<F���������y�����&.�97=`B�X�y���l�A����1tb��GF�/���7X���;neumC7~���>m.��J���J��������>m��8N��YK���6��bJ0�`#N[@��7�KA��h����Km�6b�e!h�Kl�i)�m+����D��5PxWt~��l��$�	��)ur��2���j�
{�c���������4�@�S(���b�6�6�`�"�s$���u���D������wx�RD�4U�]�"!�+]�O���A���Y�r���Z��l�����[��<
g�:������~��P��w��n��<��)�r�i�����4��o�w,<��)Q�|��5��Vt�h���ltA����+��e#��%5��`/��,k/n�U4{�-	$��K��q���)ut�j���/s�~P�0.[0��t��HRe�)�z���+�����E�f��fYOG����$3h�Z���eK�N5���oe���=��lz�s%<e�]2��S�'�/~X���<-��[�G4�G����,\�0cLB���qZ"��z4>�����l�|��#uu��530�u7N�i{fXlI��_S��lK��������
����0F�H+t���E��&���M�����B"��a��t���U�
�����`W�N�k�
�A���m+V����f4��.a��l�����Rd�mz��+�M��0c`�z�|~,�}
vUj�M/��J��'6c`1�$�����SU�O�����2]L����/v��UjN�5��u�,;�3k],�0�m�c�������;3��.�Tm�������D�K�v���G�e��B;�{���$���������Ki��Ot�\��S�����g6_�IN3}<S�>�%�Y�H$6�]���*������e]vX9 /��eB'�����������g������YV�'4�SV�"��E���.��aO,�p����}��N��P�pY8�b�������I�N���c��e���[A>���=�=��)O���b���G�������.{�U�O�k����D�����l=1Yv��~�*����2�.K�_��H4����F�CY,=M�W[Y[�]�V#��6�E�d��'�_�K/�u��e��&s��er�b���ay��~1���U�5Z���&A��yg����o�,�&����/(��������f�w}zL�@�� :�PN��b%+��BR�e!��������i8�LR�t��ne������{rS!Xa�>���tv������*�E��/���]��[8W-r~1�s���$����<kx�����a:�hh����lg���u��c�U7���n���*�e����������lG�C��$��Q�e�/&S.�n���t����c���Eg�i8����4��E+�����o1�����y�p��[��w��rR���pZ!�@L�\�f�`bG�:M��K3��
,����G-����%�`���!D/x��2���B���b�+��� 6��a�WB����^Nd���M$h��Sl��{�0UM�]�6�6��'M4�3�����C�;�+�U��_����m��>���S)
':��W�����1�Bm�e]���W����>q�DO::%�^q�Y�b���;=9��}s��YvzL�{L�TtO�i8�l�t���yd�u	-<���/�x
��'u�
~"C��]�2�<�$�
��`��,�Y��[)�b���s��;�Ye��Y�1�R��.Ig���7}b����us�%����/&.*Mz��U����	Ux�dD$~�1�d������.�!\V��`�I��Y�w�@V������V�"�1���,V.)vCcX2�0��q���4@O�k�
�z��e��Wg>hGm��*�p3���KF��M��0:�Y�]ElA�������$�
�lb�u�if�u�70kP_0�b=g�^0�v*�X�C,}AG��PxzY:�~nP����F�����$��b�����L�P,M&
��|b%�@=�1�Q?M�F�F=����J��Y�����&����V�/��t��J��G=a��*���
���K�������/��<2��4r%jf����q4��N(��/B��B[��:�t�����r���j���f���]�]�,�!j�e������"�^�.S�qK��-h��fj<b���a���%�/����w�����H
�_�m/���i�4�a��F�������$���*h�_�H�`�G�0l���
�4S1L^Yt�M��nXQ�H�,�|�=k�<�G,��dU�;[10�)�
����4U[1�$���;
g��3��+����`00��ID:����U�>�|����6t�-5��?��M����-x���{1\��1���(�X���AO�v�Hl���e�\��q��a��Gf�J�;�{zL0�'1[	vW�,����0]B�����1�*.g��^�.���-�4�MxM�q�V>e���_��<�Hr�t	��y���l/���+��������c��-}�6�`��^oe)���mb��@,������������7&�A����t����h��m,c�4��;
��f���|
�+m�e�`����������������]���f-����q��'c����Ub�m �� ���f����Y������<n!��������hxL�]�r���'f�)�P��,��=��wK�[8i��p�Q z�3a�F�bK3;��f-��d)D��/�J��fM����p�he��Gf9Cb����QZ"�1�l^�JA��p�cX^��,Dy�v�w=
����a�i�0a���������$6�E�V���w5
��K�|���5������V^^�@L�V4�'=�f1	�4�-db4k�6��+����YV��0��-Xo�����E����,\�"-��N��������t*y?��3�U���~k���������wb�H��aa1��ln���
�R�D/&j�����
����w���0�N4���+'�i�5]��7�6�i����
����B�j�n��y����B�b+=@�Et�
���.�)b��}����"�Y�k
n�Vz3�<��Zk*�)�"���n��+���w�}:�4���J�������`u��b��)W�����
sFEw�����V��=�p�Z����^���pw��
�7.v���up��5M��`��*�),��P��}�F�-�@��#��`U���FM5
[��mV�m�\6K��R����[��p��T�B{�
n����w�LN�����R�eI\bs���Tm��]]���vjQZ�%�r�E��e�b�4j4������NS)0
�L�����R�eBl2OKd��>X�N�����;�`(���dO��|����qD���Yo���F_���n����dD7��D6e�S�j�R�-G4M�
F�G���Y�4��.JL+y:m0��f>�#�O3�Qh��,��x�������~���Mk�C�A�{{��H�����Z��
�a���a1���p��|�P:I�.��7���#a�~+��>�4U�1L�T4Tu03#%���a%����I�������+�J�6����&���J��p1��i��"�@S�`Z,����dH[����A���p��-�Mj��I��S�v������urr��ft��a�E�9�4U�^p+�tzY>�A�`��)��c���f���8���r�
��A�^#bLM��x�B��fOZ� 9MC�
Y�q�����}�1/�;-��}1h���P��}�V���mL{T�������7X�
6{�OKdC�i��p[�������ZG�f���d6D_�#lv�g{A��Y���O4,�1	�48�HX�;������+-$z
�[eR�5LB
����$��6�
t�>S��������J�
��ACy,�0?�Q�fx�<�l�2���{��3�>��k\�����@��Y�![��Q�&7��~������V2g-��:ES���i+wW���6"�����f���7��ZP�o�jm0�S���V^#��?�6������pZ\[�0am��gWK����nu�����enV���n9���?�����'A\���Z���t������a�7���_����Z��Gm�	�}C_�R��41n%�hM�k���	i�B�=��H�����m����pO*�0�2�
��-�`�X���B���j��=�����-�����S(?�^����4�H��06j��B����tKz���}�:M5������S��i8O�Mo	�������j���m�CW��"����+�����m���{�ST��2-u�U���Pk�	VAOzV*����M@���y��V���O��@���g����<2�^�2�Il��)<o���-jM���&v�����.f���9d*n��B'�����4��������PlJ�=��{�p�����u�-����Y���D�K3�`�1#���bG����
YCtn�����v�qY��J�m-�������+,�G����~�n��~�iy��N5��X�[�*�1���YpA����~���B��m����ECEV�n�R����<��
�nc�~��-�4��x$=�o�6��u6�4)��Rn�����m���]�~i�y���{G�k����G��N;�
����+Oi�
��k��;[i�y[�7�V>7k"��qo�v.z��o���]h������\:�oh�HM�UY��,KPl����F����A��J�7S�M��`{��m����������`;�f����c����[�J9b;��h\�i������[�h��Z���V����ih���m��/`$�W��V����i�%��������`w
�����G�f2zba��Xz�i��m��k�.���{�9�+���b���1�,,d)l�:�Yy��GO4�3{�Bks����U�/UTe-r0���Ego�wv1��]����1�h���^�'*��l�2m���[9���6��.�U������T`q�IGmL�,z�D�i8G@p�Ot�P�f]rc-s�G���Y[�k?M]��Ql���`gJ5�n��:�FG=k�S�B�~T�}y����%��Db��t�^�Y�hx��G��m�.^�E_	�*M7�L��?g�oc"_��z��W��/l��������r�����R�ko�k3k�=�6�F���[���[�`&����+���`tn7V9/�b����$=.�6��ks
�bi�P�59f��8�#|�ta8/��G4-�v���^l�i�n�4^�5�-t�6���lz��p���A,���5�����2�F�4�i��?�A�f�V%6�������
z��X�����r:��VbhvK7��6
�B���[#X�o�k��'f������h�#����s��E����M���+u��\�4��I����k�3=��r�L���/S-�pvz4����x�!���9���RN�9Xd>�~��^%Z��V���i��J���]���-�4��h�v�����"����n���1����C�Pl���n����`l��[��������r�������-�5L�j\XQ$n�[�]X����ge���^,N��f�w���7�:�e6���DD��`'�����E5K����a�?XZs�,X��u�
~'
e�fa��t�0cln<8M�c\z�2!�)����7��c��2
7
��.�S����5Ri��`��+�Ku������s����^0��kNA�i���|�s��a��=�`|���[;Nw��.mz[�M�V�z����^Pp��:��X"��tK���`3��p�],,����&�/DPvx7���H	��Q=^)t���*����/��*oZG#��������w�|�0'�;�D�`����G��1=��
���V��k�C7��M[������`�cw�M�"0{��O����]�������0CE����
�4�#�	:��������x�)�����G��L����Q�Wa����1��h��"6��6k���+m��f���Z���N�
�1�*�vK7��Z�8�0u��N����t,�5E��y�LCK-�*��i�t�Y
i����Gf��U���5������4����]ji:����\��'��`s�����N��(�6M��������Z���� �������_3F�r��{�4��;�6�l���Q�\8����`X�M������x���,�0]���������^�^���`fWn����af7���?���6�%�~�{�7�U����Ev�b�#�QK7y�&�p�ybk�X��;X���D��Y��Z�/EO��]Ef��DDCk�Y��y��bG�K�����f��I�(Ff�KW�������

���,�e�� L�%ZpE�&t���u��Y�U�����Og�x�p�����]��cV|�-��:�xg����b���`bYQ�/����vw���W������Y��3l���X�;���4E�5Y����*�O�9�b�>�W����s����LWw����=�@l�Y,����X
�w\y�-
>}����'���z�n/5.���mF�`��n�u��z�L�&:�<,kY�����U�!�viwV�%�b��b�Sb{�\������H��*P��=���f[b�)7�V�4������m��?����{9g�;J�']2�`���_�����������~X}1��Gf�xb7���+�OS��������s�'�w;���Y�&��N��0��Z����������w�������l�
v����]:Z��]�p�b���*��G62f?�W�$�[:�a�,�B�W�7��w{�������������@�+{6v�C�
'����e�B7�8
6�2O3� �U>���{�������Q���>���4����_3" L��v?]�c'��������9]���MsA��J_5��D�_!0�b�����sl��,[1�x[K��7��[�#u��;k���R-+<]���������V�����t�8>
����eI/4�u��;3��f=(b�����'���]���b���]���k��W�R���T�h��*;[���tw��q?��|���R1���|�wv��+�l�=���'����~+-�b������4E��`-�������;+N
wE��_��+A���ys��p���'b;��	v��I�\�����3���|��i8�"L�,V�zW�q�u���.z�D^w�OH4����9&`��aL��`o�����-���f�jZ���i�����q�*Z��+����w��(vX{���X��'v��T9�B�n�zgvY����};����+�3�^Lb"��V��2�n5;
,������e��t����o�Q(�:]"���2�[���������&^��B�X�c�q��t�!��0s5T���UY�-v�I	�a��X�F;�Ks�����n�{>>��p�B��O����^����6��
���)v��
�lt�)sq�M�mL��m+/$;l
���t�L�n�vg
���f*
���Kp����+�V�hO�����E�0�v������S�TK�
� ����,~��

~9�vSW�iv>�����W�\o��w�������9~bR���%t�O�`/��
��f����GW�Ax�gl3�5jB�W�����H/���	��m�q?7o(�"� ��V�w�*�����G.\��6�"�9|w=�����S��c�5�l�iz��������(J��g��]��/����OB�?�{���`kO�#M�x|��n�;a��H�_,o��ivi2��h�9��N�Pd�
G�v����U���������J�u�0��+�mf�=HAO�}'�;���+�t��_�4E�`4U���k4neS�jv�At��s���f/|+���am�����M����E��Y���H����zY�}}��g�����K����+;�;S����99�a�%�zeU����  �;�o�Y��a/���p�Y�n(�v�:j���_���#h���0�M$*�;Kba�x�%��%��>E�	�8��PL�qS���6K�-�	#u�0�,�?����=�[���B=Y�b�n�����i���7�EB��0Y%�ye[����[R��};����f��F,,�5W�H�H����Zw��~xY�4��������^��S�u�F�[�@�/�W�4��H4�{�d���_dX8>X������p��,���HN�<���	�EC��Y��O�{�o8�������f����� f�U�"��>DoV^c�%,��\���� ���v0l�������O��i�����R_*Z�Do��({b�Y���\�M��DJ��VVC�g%V��=Z�Z����6\�7����RM3{�����~%'�Jj�&�������)�EC����d�Ku4�t������Yx���%
|�0���)y�^G#L�m��/y�����U��n���K�n���Wv�����`b����v��.�#��*������eIECW�X��+��=��mG�f�Kf�o����!;G���U,k7
��b��a�f=X;����J��0]5�z�e�gfS�w�^�O��X:�BM���z���g��n�
=X+��]��
���Y=Y���
c�[�|V{���J4���eE'B+r�a�r���8����A����<$��?���9���m���:a�e��.U�R�&,i�;t��`�m��$��"�0��`E�v#����]�����>53d'54
����}�Y(�{�o��9a��������?���R�����b���t�XS�����+B�;�w}��'��5s�T�?��,�.TJ��� ����Y��(�O�q�������SDOV2)���p{j�ak1��h�-�<
�E�uP������������p����D�3����Y�y�<��WW�:�*?��*�0���*�V���
w���,����x������z��_A�#�<��>�X_�H�$�)���
Eov7�Y��%W�"�EX��i�e&����p_0�A@�^�]�.y��&�
n�idV()��!fm^>M�c X�$]2L�{��^���i\����	oX=XK���>�����m4)�a]M�&c<.{G���a��`a�Ymr���5Mk,������Q����x����o���h0
�a�W~�5��X4��;���X�|{�:���?��-f�R�����,<M�l���a���i��MN,�q�����aa�7�7����&}'D��v�O�9nc:���b���H��n;�}K��YpGJ�d���U���`�'�P
R����y�W�d��-)K�LcK>��3C���k|�p�(�R�����\��sj�;;����R�1_���;u��K��b��pF�6V4l�{������l��=M��X
�.H*����iS� �I>��z��DK���P�M����f�����0�
�_�-�
l�L�!z���&�����mzagZ\���	�����X�b��I�������C��p�;K�����R��uL���7��mI,w�T��Jf[��l�#giIa���������pz�=�`�d�t��c`�d�(�����|�K�Op�NrZ����l��N;��Vt�5sb�Jf��Kq�NK����0�
��x���E��Y�?1.g+_4�������M�Bs��-H_���V�1?���a@+���:a�Q�Y�~����������=u5�.�k3����z��jt����}��I��f���^��S"������1�����`�Y�b���t��'��)��~��:��[Z���@MC����\6>�Ll��e����ACU�G.��:l�0] �.�9	vW��l��M��~������w�-��JAo������KuH��^��!�|��KuH�����?��KL���Bw\�c:���0�bajK�V����['s��7�7%N��P��n�"�0���0o,�8�����bAm���8\l*UBoj����Hr[��oe���6������DO���,?�q��n��m�8Ft��tZn;����V(���N&�������vf���(vZ��E�*<��bn�P��kfe�b�Tx����E�����E�b��~fY����;azz��FT(m��N��
�bS���J���4�[S�w��b�O3�h
���
QD_l�L,�43��7��rv�Vb�k�o��6�hV� �p���w2��]P$Mkq'�`�����W��{Q(<
�o����6^�����,|�@����i����I������_5�GL�|+�jG^,�$:������t��bXy��^����N�b;-��?/u�����02-�����*vO�ia���;�I���u����l�b+�@���VW�����lgM[b�k�5$���Wxv�h��	�����$�/��i��4L�ma�]t��~g{a�eZ�;�_D��)�����������:&`2�}���)Sz�T��[4�+�V�i!���v������p�����M��m:�`j�i�-�����W
?K����OS�Fx��������+�bZMD����p����Ut��?
�x�OD�-A�Y����ej��|��i����t�lOZ,\E���b�V�i����y��������������~���Wl���p����A������iz��
�6�6u����L�m��N4��[8�rZP;Y!���}g������
�L�7���u(���EC��^	,m�����gog/x�����N������0����k�|��^og�)r���]����,4���2W��9
����nv�|��8h��K��q��l���j������ ��T�'����=�@������s���],��G,<bB��*�}��n�i���Uh]�'��G1L+��Y����J8M��T&�X��Xx�����k�g�z�
	;�'���^��)��������Q�x���x��z\�.�i��K�P�2{�-t�Ly����i������i/����O3�0������SC2_���U����X$�o���.�	�Y��G��Q�����\._`�~J�i0~���`+��i����A�C�6aC]rAI6����aR��-1���M�v� O0�%�./��`������_�)&�������
�y|��.~f;+��]��O�n0����+u���D�DG��t�;{�x$�Y�O������pQ�����������7|�H��4.|U�-��OX4u�|�L��,<AZ�
��Y
�lK���A���m-�����)��o�8� ���.��������=8W�}N4�s	���=����m:����6ok|'����`��s�*���1[q�L�x'����������7��;+k�����
�>bS�}�T�I\4,�z���<]�v��kq�h>��t�^#a)�#�]��5���UU�����fN��0���3w��(���	[i��j�TE,i���`�����)vW�I{x'�k��V�`i�T�;�n��,�z����ar~�`����E�Tu4-�v�1X�q/y0\Vt��1�4�b�xX��?���S%-��������`��M��'�)���=��-�#�����?��)\8
���y�E7����1Pb�[��Y<a�����RW�8�i��d�c����4]��f��,�d�l-�i�]<�i�<<��U��P��'�1��{W�,<�����E�V��c���:|��~������5#|b//_2����z���:z���o���p'`o_��BcW���sy����9�x.B�I��t��u�[�8\���Mi���Vo��-t�M�0p�-�V���tx������*Xx���]8��tV�����f_���Y��q����]i�t��/��Don�-�*�XX\����P���5*Z���+}��<��#��{�1�������C���N���Cb��<.K���5���}<����`��Gf�b��b�f�����c]����E��r����W���ns�6��FH��!bs���R��}X�������2��Q���K)�l
~XbB4<�l��N�� ��E/�q+�."Z#��l���~�u�}f�[]�i8�@,E)�fy�?��g�x�������eU�b�7�PX~*6�N3������`,��������,0�U�]"j�����i���?��%���u�F/u��T����	��`�u���U�����^�Q����c\����
�)��a�4��9�U�JLBLk���4�����K~f��Z��<V;��@�l�Y��������������m��Q����bo���i�,+!������6����E�gw��l�.��&k�}�7����,}�6}|��0����>u
�_F�����y�w*�)�9M�Mfo��>�4�/��
�Q>�%����P�����
}#������"kw��ik�����a7����bb�T�z�M���E����r����<P�p�K�l�Y�?>�B+g7�=Vh.����/w�"����
�#�����b�r���/y����SO����$���7�;m*�n��&]����G������
����aF3�08��>E��j�[z�:�cvt��uk�e5�b�c�l�����s��}�4]��.h?�u��������I�-eAO�9^��h�� 6�8W`��T)�p��4���$@b�/�Ke8g-7bW������&L�
��@[������2������������Pf%���)�.���U���`��
6�O���
�A7X{��+����	9E�0/,<N,���l9M�c/X� �7�����-R���k,���Ro����"�g?0�2T��"�?��#������F���(��N_�Ag��i8�@0~:��~���.���2�c�
�ct�06�n���]���Z6D7X�,5S���)�}�M��Xf�B������v(l��aee�9E|�]�1�y�T����j�"06j)�/M�F>S��~X��i�x�z���e	vn��8\����,���f�������v(���Q�\�RG1��/�&�����x*��~*r��\���� ���f.%���x����t^�
����*)l��&�=���F�A�X�z��u,���%z,`����5+�xj.8]��E�\"�7�\���p��c��������
���]�9�t����B��%�O}3�t�����p�\m�:(���4����Z'V7������~��f/�G�����������c��nX8����Yp�0��i���`�u��<o�m�r�[����f�����������)0$���6C�U��Y��5�A�N1�\��?V�?���"{����^t���3)�:Le?:����+��sH�����z���������&p��.����NWY���\f������KE��c��a	����R�@��y���#�T;��	������`�����������d���+�e�N�����V��q#.���6��Y���t�D��s��w��,v�&�`K
0��?�r.&�]�C��&H7
kV��'q���{��)r�5���++�C ��zT����
w���"��?�.�=mA����- Oy�h���qx����r�L�(��
6�������]
��U�������!�dL��hO�����cF�S���H�9�E��29
�U���M�-�`o������
5Z�?�Hs��������;K�$�6�F��M��iz���~���F�|��"��^����Ag���nYs+�E7�|;���X�s�;NED�)�<E�%"�o&��	��W_��O4z�/���o����P�qX���^x�/��Q���$�{r��Jx�62�
b�������[�f#�iz��>�QrN�W���#�e~�r�8�|;X�;�6�|�����\�&_��/&�=��Z��K������|���)����e�;LW���u�����Pt�%���6�������^�C�
��`���5���l��;M��6��
��A��l,�":�aX�KW�������$Y��/��':�Sg���u�"�|���x}��\���VE����\����V���U(�\����>��t�/3d��wM���0$z�4��|���RK�)���;aP!�9]�W1���|�V0��+�,�_��Y)�W���*IK�����j��������e�����l����1�n��C,�e��0�	��M�z(��a>Q#�=N���`���p��F�4���X��i�|�Y9��������0C4a�+��J���Q;��;{���i����[[����}�W��O��.��������`'V/�}wE������`o�}.�pP��~�>Z����������[�,|��Z����~1����j����K��~�?H�)����B��j�E7�����A����$��	r�3PM�2x����qsE��6�1�h|�����`���]����>� 	�a�8�U�wX��/V$��_��+{�T@0�
C���� mY����?��L�"��7e$������X�l���e����p���R�WR�V�/�_�j~�id����$sf���S�)����,�1���,>,��~�e��b}��a2�����N���{^�U��-[�W�y�8�:�_&F��[<.,��|�v����.z��Y�m��q�T�mL#:�w���w����~1��\�p�Q������B��~n��G6�B����}�U,B/�K���O������3��a������l
�N3���k�������,������D�cB,,H�&�4.���_)^��}1)��	�w�p�}����Jd|>��p�O	�5r��iY$X3
�"���l�L�G��u��-v[��X���h>����W�|~�����:���(���T����C!���������|;"�t����[t�_
�^0��,�������|�������!�=Xk�qa�$�JM��������Jcd��.�U*���_L^/z�o�`'3'���[���r��9��u2���t��yP���o{=�������V���0��qa����J�N���~p�a=J���q��e]������9n���A��W��^��1������f'�w��5�f��qj�����m�o�� ���N�.�k����a2j��"��\oa\X�c��{4_����=�"Ll���e���WA���/��|��!�=L?������#I�+;U�/&���+�9���A�-z��
�����=��c &��ak�P�+v����~ =2�f�!�rz�M]����Q��"���?)~n��?goX�,��<US��	X��P���Q����7��pf��x�3+��-�_�!��o��|g'�����p�>(�����+}���g����~h!
v��}����

3�0&9D���`���i�����K#�to�yW�J��/f�}U|l��/��7����V�x��~A����
��b�S�3�+L����i�I��#cv]5�����R`{}>��p:��0����t�k���p�N:C:s���[��0���/&��a���yElz5n�&������q�b+�-������`������,���\���������}���0���
���-�1�|O�U2���O�p�����0������F��TDy�T�"0�Mg5�y
k�%��B4-���2<n��q(k5�
�������z�u�0��u���t��6v����b'����+����mm>\iE���XV;"t�>��]��Km��1�_���z��
��n��+��v���5�Z������8\�����F�� ����������1�]�|U��!��B;��
f�Dz�>QH��
e}��M�"�����p���h[�^x�s�,�&����i8/���&���-��l��M4�g������{������.h��u��u���Y��Gf�?b;��;���4E^$Y���	����N��S�|�M/��S.���t��o:3����;�U������`���
?�$9��#�w����m�y�)���R��G��l�7<�E4�x`��+6�;.9�f��j���
�]y��	�������������nfXg(�������f[��g����_��SZ`Y1����u�!�0���j��2n�:�n���B����p�'XV]�`e�f����������Ib+���r��v�E��\�e�qYA��T��$��<��c��h�U���
[���6Co&�=`d�
��ba$->�M�;���&��JOE�R���A&l�Ml�����A\@��f��b���
#8��z�<n%�dw�-}�����R�Ip���pDoV*v�v>�0�
�N���)r��J�D�jB�������kM�L���9�e�o�]��H�����'Z��8�4E���nB4��j:>��N��]:@f�9��6�nmh\��(Ig\�����:@����I}g'��K:^I�X����z�tq�+�5�f���^
��Wr��o�-������<.L9w���'Bm���;�7��I��Z.�e�?�����*�M����1n��ph��8|�(A4����BY����I,,/�~��f�����w���`�G��7]�u��ud
������ofR}1�������8����OS�na��qax���B�v���F�M�^�P�q��
6��Sd���Y��a_�Y�����p����\t�8�m�xn��8Z1��,��9B	�������J��=����q��`B���8]��6��E�"E^������_������G�qpz������
���A�����/�J�e��f�^�/��R1_!$��{�8op��Yz���<��m:����0�S�����p�qo&�}��I����d����e���4����4��X�b�4�U��^,\$�N�/�)r,�g��'���s<f�'����aC��a���i��0/�h�;/2�U���vZo�7�(�_��� m��^�>�&c��7s-����b���\o�������k���@����x�����D���/O���� ���n~=i\�&Tr���������l	��te��7�;;8�'y��n!�d�4-����`�s��&Iw\I�,���N�W1��S�v�TG1�;��!���dx��h�>�����\�[x�ag@��."��Q>��(����?���.�w���B�"����'�M����:����AC����=}�T��7�}��^������XZ7���f=�iv��j	���h�|�ZH
O�}���F�w(L����_���-���a��|�pOj)�+|������M�7�����������+#��w�L�J,
�O��eY�Ku����`��X�_
����Xz����m���C���:��E��R�=�`s]��Rmx���,�"0�v-o����?����]5l���l
�����Y4������i�+���7,�
�k�{���K�`+q���fv�����`i������)�YY6���0K���KhQ����
�zl���7_��bv��z����`���-���~5����i������{��<���d/����v�`sO�i���|�^�B������
�92=�sw��p��a�U������lZ5Owy�.�Bkz$�4\�p$�1]8���=�A����������q��ns�6��j�f��6L�����o�2f�2�x<�;� ��a���!������|��RWI����,�o���c��������yy�B[�����Y���t�{�5������W��oz�����>
�X�z���6������f��2�*��P�����O��H��M�=k��o���o��{��GO�s�tC��,���c��p��l.��!�(k84{!���B�&�q�$5}����E=�V��]:������h��,�C��q+L�{h���E�{J�p���e����p�J�?���of����?���C�&�
�S��^���:�C�V�L�f�Uo�]5jW3;S%�i���]����6��6���t��`�3:�6�8;`�,|��K��in�����SS`QU���v���#oOS�x�DwM6�p���9Mw���72��������t��j�M��`����+��O���	��M3m�YV�o6�������4E��G����P���E����yQL7TFh��'a�1����}�YK|�^��W4{����9f�����=��N�}���d���	�9�t�
F{%�����oS��Sm�i8����$�������D�^�a^?�N����u������f�����D,LS�V����mzuE������d��dv����.��W�z1�:�MY��K��R�������������M��}��7��7�UU�E���6��eF7�����
O+O��9�����f��w6�aOw��������V8�������
x�~/w�8"��i�����m������u�<��7r���@���t�)[���0$��������UPS�{�#��oz��Cyaa�x���Os8�@���o��W��3�r+���������h1���t�[��-}���R�� �����M�8�k�Ps��AO�4��V����F����C ���0~��I�1;�����<��b`4����/�pw,������WW��,�),S����R�$R0���(L�t4����d����h��d�t4sS�S��4��u�ij�N�l�����$A�y��4��W	��,4;*������������]S��2�M3!�YX�$4�v���Kl�
����y{��n�K$�z	:7�Xx��2�Z�)OX��nzYGn'���9���l5n���
g5���`/�>ja��������4����7�w6�KO��e�RM�/�����4����>�F��a�L�*=xc�v�����pE`��h���(��Q�������9�+���������:�A�R�F��������zq�yO�4E��`kb���I��q<RN�K�^�s�8B�P���f6Wy.���	��K�z]������(�\�Y`����������v�p�2�k�4n����^�����p��k'��2
�� 5��7>a�l)��������s��wv�D����C�B���Rwi���B|i���`a������jU��+3�j������w�V����:��s�����xD�O�`+y���&�^=��:������L	����p�^_a�L��W���
?x�f'(��R��R�F���=�Y�fiCy�7\_5.,D��V�(��fd�4}�pY�F�-,��[���'����]���^`a�U0�\V&^��E4;��,{�xX�G�w��_��-����q8}�~�E^�-^l�K�LQ�i�����X�`�Zb+�[�N��}�p��V���e]�7�"��l�Kl�~R�?`xzQ@!:�a����HG�`�*�f���S����������N�,=!�}�)��$��E��U�ydV�d�����Ys���Sr�����S$���M������q���?�.�4/VH-��x"��J�}�,�'����&�{LzY���S���y�wi��B�
bgA�qY�y1�hX���Y��Z��i-E���O�9��A�h�DM$K�m�:^,��5Z�/\6S�]�����}��,;���e��ba����P�t�k	s��YQ(����!q���_�J����:�c>M��B�E_�b����e�E�":�
>E12���Tk�=�{������8���^b/�����N����[3hvr������C>V�.z���`s��w6�/�n�q�i���[�9�����>�����w�ivj��������j2���Q�R�l���%R�`5�b'L���a.S���?�iz{�����{x��C�&D��@BM����r��c�S4+=���]�<����1k|�V���O�b��s��;{�����������-��.�</x�A�J��fKxt����:
���)EO���V�@�I%��Qp�\6j^0j�Q�9�$N�������a{�X�.v��U�4�����`7�*��O��~����Mm�����]:����73i�]��u�T�1��_�(�.�</f����6������%���%3d���EV���a"��2�V6�l�`�<h���/z���������P��v�N���	����a�^�V��l�a��8�!OS������np� ��;����~��6
52�x�B��eE��E7���������x�%��^)Qr�^�m�M+z��{���>^��r�R�f��������"�c�e�i�5�8�z��=����)E_��M,����a[�� ��ly����4�E
�Nm�Ku���@DCA���*O��0V+X�Z����Mt�����>�A���ZG�X�F���]�s�������H�.�
N]�^��K���G�t�#��`'�9?���H���
7�,M-�����p��p����%�^�=������A���l>n�t�^���Ct���Lo�����k�4E^aa�A��M��
iG[S/X�t�c}��z�2�
?y��aOW
?Bdz��%lk��fY��}��P���zeg

��y_�6���/X�E�����]�����J������S��aW��BJ�������J����:\�����(�	#J;H9���19W�C��-8
.{S/�M��f�,,:�{����|�]�s���$��>�`�n��R�c��E�������]$��9u4;���*��l/�=M��]�Y	z�+3,q�������g�ys��n��:�>z13����|
���{vt���4��D�vHt��Z@z���R���w���]W������������^
�����l�w����^:���e`��l~�'w�V���/�`A[��\�4��W���y�%+	F�-�5�|�����e~��W���R���R�!��H�W>�m>������;�*)?[Di ������	�&d��L�u�������hA�pU���5�~g��k�m���������+%\���}��B���/����\��Df/&���O�9�a�Y��Rga�+�	���?�����4.�`v�R���:��E{T�s3A�./	f�o�t�c��Utn������������`w�d����V���;J,�x���l�1|�W�f"[Kq/�W4�����Fg�~_�n�xs��i8�P�(��(v��X�!%�.�9x��{��1��}\���ubo���q�B���7}��k��D/�Q%��f��R�k�4kW5[�?�m�����4|��:�NW:}�h
{�����Ilg=B������V����\e����V��}��v���"�e���B��m��]lc�s������\=��4I����,Q!�&���<�m�����������oJfo���g��e��bg-���{rz���7k��Y
�la���P�EO���-��O��2��������X�����+v����	��BHb)�����;�E����Ku����EO���������0�K?^�T&z�(�R9�'�������7}�]H*����0� �+�^�`�v�X���k����E��7,4�e�_F���4�#E,�00��W|��;���O�[MN�7�n�i����U�|�v��f#���5��������N��j�BA�m�
�A�B��m7���DEv?n;b��������0M,^����.����v��C?Y ��*v�#n�^o��$��o�`w�8\���7����0�,�*t�?\���y����@t>����k�-�d�n�a�����bGe���W����������f�V��5�����j��.�1��m�l����n���4������
Cl��/�"��\5�����������D�P?X�y�7.|K+�����7o�moV[(�N���p�c��=���WI��!�|�/�\�T��af�R���DC��X���K��~���7+i4
?O:� :X{���D�f�q[���8\�j` %KIl�R���t�wq��i�`G�p<]��EXx"I,+��c���7��
#�@iY�<�?\0|��Z��m�����������}e=�����t���?�N��B�[z�:��������`k{��_���q�"��p�X~��>g������s�v�-�0����3]�NM�������{
�y]��*Ao��(Y(���u�0�
vT>l����Etn{��������@��Rxk!�
��1��b\����x��=M�#�����J����;��b+6�����^J�Ks�����[���K�`���,����x8�X}N"#�>�
�R\�0���E�0$6UT.��a���<����q{��c�n;�i�������{�ws���R���:���A�_���$Xh�
W>�,,�hAO��h�P�iq�
?�E�|S���5��-5l*8����+=+=�v����K4�bv����1�+.�v�9�W���EY1����������w�������h�Ul�O����)xE�p!v��it��;����X['&�d��
������m:�`�-��= 6oK�f���{O��v�O��H���E/��HE�����m:��{�A7��a1�
��O`�+����^d�9;�������5s�mA3��n���c
W�(&����G#3'��^���������9�';;p�F,�Q��W�b�B*�r����eh����5!��`7|I�����k�����5,��p�����L7j�n0�,��K{Je���������U�fVi������F�`�pI,G+����h��
Q�J����7���K}���*�F�KGmf��a�����-��X�}�$�Rug�6�V���.Q����4������4��;`�Vm�9l�'c7����V�jdX�l���Va�n���E�����p��`����
W�`������}����p�K^��mH�n�*�5���`�k�4������<�0��������R�!���a{D���H#Y�]5n�W?��F�g	�Ut)�w�]��+
Z�;gq���td�#���q@���!�����A,
:�"��p�j�,��4�iV 6�5N�z�R�Q�d�
���Dlg���c�[;
%�������s��4\�p(���F���b��,t�{���=Ehq
W-��a_5����l���T��f����8��u� D)euN�:}�pR'�r;�~�X(��bs�p��������N��#v�!���ay���!�A6K���td�����Y�]ymO/�cF��6J�����D��n�� :���-2w���|����g4���&j?������{�
����t�l7�l�Iu����Dsr���������E!Qz���s�:xD����$��,�v��,
-v�!�Vi��%Z<<r��>]�:��u�,-+��MlE3�
[R�X���I��IK�^�Sz�����+�0q-6��{�TG0��U���(&Xx��BA�W�1����r�b��"�3|������9b�.�'��YM�Y��UO�)r��t���9�lAm�������E�UW4���rr+~�@��0n5���>Xx��U�kva7��
�b��b�_�JA��6�������-\�+����=����1�����F�t����� X���+Am����Ei�ucUh��!S��Qx����gZ6����P�,��6��AmV�"�g�w��	r����Do�g!�~����Ul������!L�HWNoS,[V�g������9�d�q��-6���bW���YuE��s�y�!�6�����O���:l��m����B�J����]��5��p�6O?��
�l�M�������/���`Wes�.l���~\w���^#�^�-8������m��o�~)K����P���/��z���X�5�*x3��
n9w���sd
�;%^O��@������!�\�U;�/�������mC��i5���qw�Z�1�O���"���`a�Iw\�6�Z�nI=`�l��+���)(�V���&m�h0]�u���`rw\o].��	 ��/9�eN3���D�.6���6o��t����.�l�np1���NN�yue}v�+�q4k������I��+�i�{��4���`�1c�������%�]���f�����J�o�r��8\������f8����B��)r8���GA���inL�,�%$���R)�a./�Q�T�����t�� 1Xx��Y��3u�+FS�irO0a��&cd������~��1#��R������EO:3\i�1-�����n�.������zD��.��=�0�K�Q�):>~����iv�����\|����:[p65�����]�����&������vt�iz�������v�pM#!	���%X�K�4neG�������'�����U�t�c��z��9����A���Sy��R����r�#=��+u���q�+G�4���A���{�4����)A4��x�A�����v�M��~=#�;�`�$!v*W:��
�A#�5l���v4�����������+l��b�����>	��c=]5�������Ms�ri����	6wW�n�a��_*����C�Et������1���uU���e?t�{fA��%7��4}sK+����X��d:M�#�x
��[��7���_��C�O�yQ�%��W^^��=Xt��do��d[��R52���+e.�R-���9AW�l�m��(f�50,�~cz�����L���Cl�p�re�/|�o��� �WVt�s��������;����X������l������M_�K���������9�*���5$�wu��qlO	��9����jj8��>���D;��(���A����LEk�1�hz�����`'�j�������v������p��)�����!����l��<M���Eq�hx��X�c��~_Y����u;��r��6���4��Mm��j�!8\��X�Q,�m����n_�������~�w���ls_b��t���������/���l�G�(-���	_&*|���#=
���R��+J����[H
_'��� �x}��M_��]�^x���K�������"��64� !��e�ob}�-����������@�`�f��e�����������eS�d��b/V�"6}�f�.��.5��RG<|x�7��;R�n7�r
�f<r������Y��hx,��|h��R|�"�,�&tTVM��a�����v�Vl
�"�c��o�Z�a��qK+���I$z2��������Q;�G���{�\Gm0�G~�����[�j�vgm����7����������;`�LnV�%�.ldw{�;��^)u����J�n�4�k�����,��
U���B
v�����H���&p4���D��3Ul�y�.���6�WF��p����._�Yv&�����@t�_���0�(���u����E��VRsv�j#�+}����qs�.�?vk�;|���DZi�
"���l���o���[���
[���G�V)���&�-*�mw�����������-�7�I�{�>�;p0���
-�>C��j�n�v!j����r�W�s�[��a�!�](���,w�+n����-��X�E��@�[8��[����G��;
�E�I�E�Ju����&/:�����*�_�7��$�-�-���.����(�n�W��b��?��R2d�mg"(��U����!�-�$��&����vfU=S[�i8����V�b5�bsQ�wW$v��G���,[x;Q���mF�L��^�n�og�_������S8�������W�����V��V���Do��������o�{��9&���q�s�VbA�p;,z��\���a�����������O{l9�M�`+���vX�#:�������������b�Ku4�:�+��������bu�!�pG�����e���J,�|��_d��+��Ba����kd�5�����E�V�HJ[�vKi����/�sv�=}�eS���6�������7��X[x�[���V��B�"�.���VDc�jY�&
���;a����2E^�a=u�~r�3��K��N<i��m���IuP����'���������e��F���	V����-��BK4�c�-L�����#�Qia���q
=_f��l>�t�^����������3
�'������-=���	��
�6�[�1�{����������Cg��O�q��k�������a����I��G�'���d���4�D`M�L����v����H����$�wv�)z���O��H�>xQ����n���-��1g[jgJ%���:P��H`WxyY[J��E�������;��0���OS��
�$Kg����"���jNot+����M�B����N����(|�Z����Ut�f�
~���a�C�&�4n%o`--��
�����G��-���<=M��E�M��MA��U��D�����9�c*]��D����U��(�NU���z1���7��������@���8���6��"�>���-{��S�����xN�W�1���.|A�5�`t���Tx����:t.����6l]ue	���VV���5{|�{]l�����>M�����f����?Ml��'����bn�oV�~n������2z�T#��+�v!�K�O��`��=+E�v�v(��?��l��S�#:*�
+�aUf�����/u��
�E7��;�H{O����r����v����RM�i�����-���^��j����B���,G8Mo���)��5@�]l^�fu�b5G�6�l��8��E1b+��a/f.5�8����������.��6����q��~B�R���J��N��'��m��Zl��;���m�d��X��GfYN���I���K3���a!��KB�
����V[l���n�1+�
�u���	O������f/ �)�jb��Mt����n��>�E�63������,T,�������iz����Rcm���><�c`Yd��5~��X�B�A_������S�4
9r��Yj�,���X�����8M�c/:\�T�&�#���pQ���8h��W���h�WAA4���5v�+�c?L�8��
��;Y�X(_EB�0��������������5��'������V
k��
�,"��l_��N�V�����pJ[���
"h\�k,������y����1p�v��M�2]�'+m��f�a&�ZH�
_���+��;O�c���������	���;�D�)r��L3��J*����J����������X�\
������>
SA2��]�`+v�a�`�Q�.���f���:�b��t!����o"z�����0�*�&��v�,�i��0�����Rvj:��m��;�4E���#z�K��L�)z�gV-Rpv'����^)��P�>�������g(��
��9Ow��~��Y�������:��Q�h�n���������)�DV��?�����`oVF(�pH��!v�F%�?���h��~gWeC�^����l��6��	��;v�ON�O�_X��z�.���5W�
-�L�#�.�6,���"z���2����w�M^��L4\3%���k	v
������^���e��v�
nFm�bL�h\��v+�L�N�N�oz��P�D'�Fwi��`5���1K���M�����5�����7-
��u��o�����pc`E��k�V���DC����?�pB�\�q����&v�����i��V
9,��,gfI�]0z
j�������[��R#��1�LKe��Ud����E�>	�����]��W!dY����c�}.��s�KV��G}���P����7�6��'���/�������T���D��Sn�t�d`���y�1��j�~`g���aY���*A��k���:���gW��9V��a��X���*��}�n}��]A[�����V����� �y�EgA�i80
���������.�;,k���)��.Z�3���t@A/U;C����vi\�1��;�>E�4fi
�E���<�����h�1��`����~A�����X�/U�@���~���+��<������P��;
�Xn�I�s�������������[�<�p����=X��57�u��v[���a�3<�]t�����6��K��KgK���^-���S�f�S����4�\w�^G�p�G4|��[���J:�u>��`:(�+,$���K��U��,�pe�������`,�N���m:��=��C��HRj��K�2K��(���n�I

��iqF�W���>��|���I=b�����J#����[d����&��������^��Ku�
�;�C�xf������:���K���D�PE+���bY!{��*_:��q�p�����b+�<��zU*�,ZL�,���
X�<������Q�R
6w}gW��aG3�����h�=V�6�A�KNy��9"��i�����t�" �AL��WV��J����t
�e���)y@�g�T�!�pB��)���5����D����/�	�}�����)�vmh��A3c��U�R��t�d�4��O���$���wQ�8-�����/�s":h��R��q�?��2�Io���m���*��D����B+_|��mX�>����b�bY����%�<W���m|�u^�E���%8�B���6;MQ����b���bY+�Px���e
f_����I�z�m�f���6�o��'��������S���6�&\x#����O�-����b_�bslr���K��mle����������+���0�1��f�K�h�}~`s��i�-2��hh�{��&X��.6��NS����W�f]b�^��B�|Z>Y}�iVn.�s�px���{2a�i��+���[Y���#P�o�0�2b/����?��2L}0��u�?�.5�a����IOm�6*��B����}2/�h��lE�;�G���Y�f�i�W���iU�diI���Q9���[���$|!"��������q8�."��'�^�SS#�-k�W�coZ�=��[4lL���+�O��(~�Yf�V ����o��N�2E����[������������w��6�>����L�-����`[�Hc����c�8\��R2�4���������z����������q�]2������|Z�Mo.�W�� ���Y�=aFE:k���7r�i��d����J+�u������]IL��'LM�r��C^|�pk@��S��������	�1MAF+�;�'��.1���B;���v����M,�������4m���%Wt���q�\�3e�NS� n*
�]��B���j�D_���m�>.v���Y������b��d�M��g�(����/�S���w7��J�����NQ��./xv���V$+�'��	:[[O�9fc�'��J�5����p���x�t�C`�ZW:�-%��#�<.\�%���C])��;�qL��5��1vmeU~]����[�
���w�����m:v��#6p�K�~��zu�w[��{X���d\bas�������{2������|C\W�����s�����d��=a�����}���-��*���9>�s\4-�	����JR����/�7��+���8�+��F&hx�����f�?4n�9p���D���
�iIuN��������M������7}���sOW��~�M�����g��d�o����W�Wu��
�M�p���5<��|.�R�����D4���E�n��^)_��;W<~��BZ��5I���s��S:�4EE`����p	
6h��� b�l��X9>a���oV���
Sf����{�M2�$C4,���^}
��[4�kN,![9�uZ9>aT f����L��������J��-�&f��0��M��jeg8���`�]�:�M���YU>�$]4-�{���\�c>X�"V?�'�~g��x.|�����S�a}��~���@��'����WK���-����>��Vt�M+R�W�+�+�M��w���`��kZ�^X��
������i7���`�'�xe�y�+U.��&p(��H�p�����Zw\� 1��m���M��Y�/>�\y��f=��Zt�$��O�p���Vz�B����4��f��4,�e��l�.���h��A/�*���a���Cp�:�;������3�������*z<2��b��i�����K�;p�" ��'��:����p>��{2���RFm�d"l���n�[��RM��������"�	_�A���`W�:;]��	������`L���]�T�	{��!i�+u��JO��t>��4��u�}�&��z��j������9�z|N�;��7l?[���6�VN����N�	�[}��IP���������+l��M����V��+�PVaO��E�/�*v���`�n�t�
��zc��XZ?&��k��D�-h�{���
�S���Q����6D�,#C��N���m��M����K�}�ic�t�����/�����dX�"�n�n��'��|���c�1�_�^l�^,4Y�e�b���~��]�+R�Y������z�K~�.���}�-l�>v-?�)K4lh��N��}�(*�YG,�M2K��f9L�=����?�-���T|v�TG#��)�.t!?v?lcB_�wa���?���E
��=2�����Dl>+�4E�FX�����c�/���*�=0�	���R�B�xsW���&�p���~g/�$��[yd��&7��U�c�����Dw�K��������O�x���+������|�x�3�YX��qY"Flew���7�$~��Q�4��g}��%��`��9b��Yk������
?�4n��?M�C/��� ���O�`{���m:|b�5�;.�%�k��7�N�9a
��Y���V�38$`���+�;�V��~���Y���u:M��f-��OO�9��iKq���%0u,���M��)���a[_��Gq���=�b��6�c
�-����+�N�9$`�i�/��+�q<n�R����F/A��H���u�l�����V6���}��Wtg]�b[eo�.�����Bg�
���jW+��C �u���������Z��'!�6�~2[��,~`�%�/�4r�J1�����z��#��	��M�"�����y�p�pO�x���W�Y��X�N!��/\�?�omz�1��]�����������]��B:�;���	ACU��3�������NI��9nc��h��l�yw��a��{1��4�n�J"?�m����b��M%�/ZU�T� ��X4���)p�R�^��J`�����8N�����~��������2�K�����QA/�f�o�i-.<�Y�
�!��eu�b�����t,����a�If[>h������0'�h�?
�1"���7� ,���j��K�EWj�[}���h��!~��T�[��0��T}q�kk<]�%<v�>0�4��I"��^8@��3��#����ba����S$f�����4�^[a�P���,G,\���m���V�6?��>�/+��_�r��Z�)�=���Rb������?���9I�q�����N�6�m�ZaB?���S�;�������[�����4���5�=��
��[�1k�
��f�������Mw�A�*�_��������?����`.N���y�SN��`Vb�w[N�9�������S�p��>p�.h����e��6&������Ucw�^�p}0�?�����tG\b[��+e���>�uH4���]�V,|����#q�UP����*������#U�>���J����YO�q���+Hm]��W���O���
V�����3�A#b���v���iE���`����j�D6���%W��-�}������WNB��8=]�c/��44���0'�l�yt�y��b�/]E��p�f���
,��_�S3��
��}��2Y�aL�q+��
�3�n��Q#W:$l~�vV�,$�B��[)��}�����P#���`G
<V�>�V)�
e��K��!���"��P\s����a�3�b�>��A��b8C�����ON+��>o}~�Y�SZj���<�+)�-�X���h1�F����b�	T�k���84+�VO���~�-Uk�!v�iL���w�����0CS��o�M{���������T,�<�5��e�����%���r�R��tb^�:=
��>��a��H�:�����m:��y��s��OSEf�(�.����EC���\.���o��m:Z�
��R�_����]?���;�o)1z�b\_4�����6u�!Gm�R�����e�RiN~���;FA�0��J�Yn9
������S�����h�������K�|�p8ms��]l��~go�[�7.���P0�����|���{�����6_*��DV%�%���0���	�� ����S��4��p��%��L]vCCA����9
�x8�f�fV"���0��w^��@4,��--���Rt����DK��\����'��ey���?����(v�WY�;��^tc�3b�����_�����\�Y�^F�,�$�f�(b[���e6���
e��Z������W�,���-�Q-�����N�e94�/}��^�Xk�X�M�k.Ts,���C��{B,+c[9�`Y,���]�A+n��^��B����y���Vkza4/�,!��W�w�.�es�b�b���;��p%����c�0�����T�b�S!��k.t6/;�a����j��.f���Gp���4E^���t/�w�,Z^L�,���)�b���W_��S�4��	X!�
�7v;`Z�f�_�-|c�����>���k����`���t��cX���������V����;�Y���-������������p���+�������<]��/������l�F�.�+ =��2Xxx����4bw����������p�5�bYQ�Q�L;R8~�]�^�R���I��{���������	��<f�7��1'(����Hl��f�Q���e�_F������k
�*ou[���W��&/t0������<.|�Z�\x�XZL�	��;0����f���W������:x�,��+���)�?]��'�J]9�n�;��]J��v��f��`��t����egq>���p#�@�w�#�6�����B}���
b�B�����~�w�$.v�������-�
�������������^�%/fK�������0����`���u�xL�?���1J� -�*�`���������
��Ks�b���Z�.�����e���1�D�0}l�N����i�EW�
]�4/�	t��9
�h�JA�B���.y�b1����C��`�����6����F�7���]�SP���C�|��[��iz0'����d�-�����Z,�l���4y�W�EzY�`Y�hXg0h�������YG��Y)��Zz���4���O��,C�f��9
x�T/�p�!�	�$52�����P�eM3�8�n0/�L9���:��i`+��Kk��m��V��Jy���P�)�R�l0-V��\�F�-4�"��x�F������:�ar����0������r�,lUK����[<�`?�s��&������-	q����*y�T�����!A��J�;s�5W�3-�]��-�	#�`�n�t��'`"-�^)��Lw�t��E>�m��t�^`a��h��,��x\�1z���#�
��V4-�[�cz��-���L�����t��|g�MY,����?��J�����],Y�8��h���v,�d�����V����]0�t/�o���.����|\�Y�v�T/�p[e�dx�oy��(<����iMV%a`�������sx�#��NXj$�p�����V'Y�
�������`{�Ip��
����Ba�|���^�)�4C��mFb�������
�;K�����iz/2���I������.������=�
������IP�2�O�~f���A������S�3B��J����E<���0a�W	No�g�E"�Q���a?D������NW�(nI�a�&��p���$v�lr�y+�4��'�z�����]v���D���t�1_���^�t�WW]	�]L#*��"��h���n�<7�X���S,�H�U�.�E���@M3��X(�w������y�j����/����(�!�]��NL�G�����UVX����c��iy=���m����B�o��	�����@�	��HT��J����t���Y����w���Nw�|�(�}�@����%	�n���4�oKS7�������mu�f�S�Y;�������:���K�,�?�m���<E���RMxP�������!���s��%���X���u���8EO��]:����O2;��WuV�j��:f���m��Q}�l�R�dy(��(����i��23�������m��lQt�)�����R����Z��`^�P�$�-��R��yueJ��������w�fk������4+W7�������.���6�lKBl~vN����m��k�f�ib�����r�����J#sY@*�m�%��z���`s-��R�F�Q�w%jKd>��p���_�~i���>��Q�|��V�;["�B�m�������e�h���Ri9%,�1�
��Bk�Y�Bh�������L�4����p�:�����9{��#����lA��������9y<Y������O����y<E��>�m��fbK���6�p������9b���~�m'��hj�����V����SZ�t���Stg��ba�/�f���m����Wt�Y�`/���������m8�8a^]2N�����KN���9h��AWWF��A.*����9���6��������w���� �t�_��N:E�y�O`3La��{4��>Vp�%�'�Z�����t�F� ������N�,���]3FK/O7���?t����Nl�)\sA�m<��!�,��=om���F4b9Zh�����8�L&�W
),K�t���#��I�t�T�V���a�[�g,Z��X4�m���4��`�MP��$���p���>8��C/�n�@��f�@L�%���r�� ���n�J�_���K�^i�>��c/��}���`g�����\D�q���gV������qE�w���jYx�hx�YXif����;[����6���q4Y_��:Z�
�m�a��}������n��!�+�\�j���U,�o���������z�.Xf�U�P-����vN���5{�>��y�b�"��.���
��^M��D��6��1|[�����8���M�o0c*��V"z���Y-�aJ���Xx��YXp,}G����jY��t�ba�"�	+���)����z�*]Z-�-����e�-��y�����������
���������m��A���_K�����&�t�����Dt��s������+�q���&�
B�<���F������`�k��-��l������u�_��F�b��/��l�=�0��5�.��-�^���1#��^��?�|9@�4?����X4<�GlO�h�KuC��;L#�@K7���	�E�&��l��`S��p�oX����RS�~�.5�^>�
o�5_��|g/� ��������`WjN;M�CE�F\���i8�]���};����_`r����m:�����U�s���?��Z����y����+�c����=������m��?��6��$Y��a��}���s��\�������5���bD��a�\��@�$+m��#7�2�Ds��������Mj��b����@��P�J�����q+���nn~d�/��B%\���L#�=!�'�X��V4���.n4V�����_����P0_l��0�������L�Vt���-'P�hMZZK4�;�KH�>��R��a�RR�)]�4S#0&����N���-����R�i��
SrDCU������+���2(�c*V9�m�]$<20D(��������)!����9������"����S�E5}����v/�
��f-t���%"�����}P����M�������w��A��A1�	���r�����{�^"bX�f�vf�U�h���hhz��L����&��<|��~_���~��XL�����ej�f����b���}��p���IW��p����Ota������������f����&���
��A���>�����j�MO�cFI<��0;���lV�9-�M�'d>d������!�	w�`��?���S3=��k�>����4��5��j�L��3n*>:-��	_6�_�C�L��
I������>��y&�+�����ol�56��MD��(K�,�50;�����-��J'�����.��q���1�M:\�|���h'w�����-�^�����B�������`#��LOx�
��m���������=-�m$�mzA1X&�e�����r6�O��T9|��:��Tm��x�i&�mv�_d}S�:=�m T�k�2���@�����lyA�D���v��|!������,���5v����4=��(��&P���/�wN.��T}6C3"�/%w�6�f���^"��5���M�
�����:��Fy�f�)�Cm�A�Wf��>����i�I��m�k���Z�Q��~��!��00�.�,������}\���R>6M
�`���l7RQ3K��z��9h�i�������Q+�n���8�E���d��V����&����T��Vv�a)�������
�$�`�H�,��,���W�$��1�O�����4�-M���.�`�=���X�6��N�k��xC�1����0@,+�0{A�d������������6�	���o�������#V�����0$�Y�=pQ������Q����c������LY�l��<=�
U$�iz��O��35���|������2�M�^8�Y&Rn����`��
$��ic:O��7�����{��;Q��w��sZ]����z��X�l��k�lT���B�f��eW��ch%���M	����`s*B��Z<��}��c$tnz��U�����?��&+7�P��Y����?4��4�q��i;)u�f":�R0m������m!�_H'�C�B��{��?�F,��R��;m��OD-��{�����o�������}������D���6F`�M�LS��C��*Z�F�Q6=���Y�{#�sh�,�%N�e�	��$W}����u��m$Wn�u�5;�!}��mh���s]r�HC�l�����>�����!��
A�mh7K�^��*����
	��o���ln�uZ^�@����	b�q����(��O�7,��	���j�������[�
������D�Xv�����-��p��m@A�����v�J�������A���@;����������y�����Ft�0O�����-	���o[���M�V]�L����b�I�����������:�, �&;���6��{�b��)o���{��?�F�$��5�����C�����
�����������!�Y�&�m'�}TYX�����%-
/�������YCKXR�?�y%������O+)3��&�t�1�aW
�["P�#�
3��V2�[1P�$������������E�����c;�IDC;&��
h���zzL2PK-h&�n�A�s��z���wZ"A0���z%Fs2�i�6F��!����=;~`�{�����1�=�J]8-���t�2(
9G��3���E�l��:M�;,~
z�}�����}�C�N��p��	iC�oF��$@����^$
���I
Em4g�
��0�m�w6�m��)��,�]0	�MX�4��`���4�
�Ur��-X�#]i(��������fi��V2u���6c��[:�p�T�Q6���tY��b���s���p��C�����g���`b7S7�;��g�[������O��9��4.+a�t���u�
�����%bO�9��p8uf��J��*�Y����VH<��g}�p�����O��OS]�*�D�7����b�7���~��K_��=`j*b;��z�t����n�g��F��������G��w��Y.�g���x�U/��w{y��(�*3.��_�~��?N���b���;3����f���pzLALt\t/�_����/���y����������s?��t�����b�Y�q��Q��O�k+��B^������d�U4s�L�����l}�e����,]Vg��M��P�������������f�=�����}�@l!��������������Xjr{�r��Y)���)�r�0eC�6&��'.��]VJ����W�y9
g��E`D7h�;Y2��J^�e��z��Y�H�6�q�Y�^�m�p��8�����fElE]��v��4�E?)Hu���A4M����/O�����7i���
b�G�;}����
��FJ4L�;���
������LY�x_�������fs��h5c`
vW�fk�C+��b�Zw��7��/��b��zL��,�D�������\����s;��l�9����!�P��s~����M��?D���b%3�
z�R7����f����n����j�S��K��������I���Y���Q����}��2��cHQ�D�4�r/T�\�������52GG�s�eU��ib�����p���+E4t;��q�Y�u���|9����%
�+���j�	:��n0�l)�i}��"�l �R�$�Y�Y��cI����z��^�����I,<�LMWWul�������D��$���!j����<����p6D��4x;6�0s)��l��c�����a���,�g�P\!E�
+d���	&���E��24���c�����`�g�t���fK�������
�x�	�SP���4E�����
s��m?��.��^.����5�&����)�
�E�+P�-X�������)��r}�~�^����x��|1�����i8�L?�4�aN���_3Xh��$7�i�l�@�w��)G\�-�����?<������h(�)6+!���=1�O��������
hE_00 ��&��`���/�_�pa�u��zV=.��V.�~
+����7|�z�&�5����?552��I/�I�i���Xk�����K��V����|��Y�
����K���������J����/h��`���Yk��������N�<s�%_L%N����`����������4_0xvW3u�[L�����"�b�H,�����������E�l�`7��K��B�����yYk�k��0�.X��l+�E��`���:"F���p���'xo����C���[-�
V���/�q�b����<go�c�:�]0 �)�S��B�b�m(�0���1�b�������~pA���~0��!�C+KZ���,{����>-�Ou��v��p>��7,�;=�a���#�PYTr��(�	�L��$��T}�A'������o9�q���@X����H�.L�{a���_H�[����-��n��������A7h�>_c��Z^�^w%/�0��0�7���b1y�,����d���hX��u���>!a�X��r/^�4k���)����:�fM����y��:�^V��z��I_I���}p����NKdk��,�����{�<`�0
/�Uz�l�0^�O��fQ[��+�Xy��m�u�e����HnF��$:�[����Y��1�W�O�nVy�:�/���'zu���S{�i�L��!�������b+z�r������������,G����B�+�R��puU�
?������	���,zyZ��������2b���Y���]���.��r�����>,�
���:�Y���D��NU~
���<�ue+z��������f������pa1'����B�u���b��e�����l��j���SY����E��6v����3��yb���D^E/�������e�pa�.C�"���m��f�����M�.�5��6V�d�P��,���h��J�3������FR��R��{�J=�v��2k��<a��M�k����o����I�]�4��S��
����~�`KL���"��t��f���������tU��������`s7����a�:���	����vS��p[	tBg�:�����G�tZ��+}XxZ��Yr�������6��wO:����:�9���p���_����I��'�;����D6qYe���J}�n&g"�a�Cb;K<�������gY�aL���e���M�4mE�B�i�.m���N�������������{X"k�6x��@��tY���-�iV��re��Bzn��m6�^4�C�-�}V�mL�V�b"Lf�W'���^���qZ"[#,�E��!&����+�{��>/P0,*�W��
�M��b���&W�������Ny$��lM�����}X�����pzL[",U�C��`���Yj?��as�����5�������l��{xL��R�k�����jS���`��3����������pE�b�������Tmx
8\���EU�;��-Xl���=��,<l�=,NOi�����f�&f�94T���`�4����ium����ue����+�����	�	��H^,��%����p�G�?�wA��YG�����lh�B{�:�p7Q>���7�~o�5~9\8�`8N����	S1���"�4�Pb�L�V�bjrbsO��c���S�j�����
��Sr$��v��g�zi���[�Ux����	O�`��N9��/���&r���������v�4�� x���w��f�c�5��f�����j���R�4s;h���V������(\]-Vaqm?A�p�x���fjS������(������Q��\P�l������aT|}��z���
�$\��{�������0L,��,6;�NKd�
ZR
�.�����i�6�`����_�p>A�M���f������RZ���6_qOS�D������i��s~I�`VZG��#:��j�=r������e���
/O���`�����&�_q��F6�Lfj����AS���C�v�y�z�.����+�%ii}q�L���1%�>�`�t_��\���F�������O��������J�~���
Q�����ee��zA����?F't��a9�-����bfQ����HF:���d)�����p�[_��p�b`^��JM�ue��M+���iba����F+:��B�
&
�%�������?<�|�Mo�����i���`�k�Y����_D�P�@���u��6��
��R{A��`'<���{v�|��������A_0}����n9�3Wv[mt�0���6�����f�e�hO4,��<3<����8MJCh�*SKJ7hG?�����~��.����d
[����+��l,2Yh�=|��l=�M=h�v���$�a��X�i��7
�RKY7&em����f/m��r�������4Lr��4L;����r���Uc����u���=��U#W43�G�`.�4��m*-k�
v��V��P�b1��s�+!CC�~��~�aA+1��_qzL�"��+ih�}
v�Mz��b�w}Z"2�jt�;h��5
m�T��	1G�2����vKa7�Y*)lh|;`�i��|�p��q�Va�������!����p��C;�������,�.�a6����O���u�;�$����GfI��t�sN��i���}^��Of�����7�q�Y�@,l<"v�&u+pwv�������i6�����\~L�����,/��O+v��ZEl|���5�������3�������n��T�?4FgR;8�t{�p���
�Z���;������P���4=n!{�[��3��n1k�.��'��?�r�9����#(z��Y�cb��%��
�[�������B�b;</E���w��9-��6vi4M�w`g���"ba������[���D��\�,}S,L�1�|bsM�iym���;���Czd�U&6�<=��E��%z���X�� v2�5��n�k�����DPL��Tr	��lZ��������uB�������-�Q�����tO4�_;+�Sk�w&�!�E�v��m����^,�����G��}g�g�����/�z��L^t�s]�@:~M�
M>���;S�
�����fa�As.tj��G���,��B�f�^xg���aSI��Ux�B
p��xgE��g�h������]D��R�nwgeZ�sL�4��9�E
/@n�]�
{���`T4�������9�raE��W�Y��4U�s,<-��.y`xh�_��S�xe����m5��6OS��
o�AoV8���x��,�R�s�H��vg��;��Ki�V��V��9��9����	x}
���|�����������������V�����g+��m'��G��b;Y-����v��`aY�Y8��+Kd{Z��f�b�+;$����[F���F�2��U�&�8/|���tZ=�������h���b+���J�ZB��������l!��[��C���!�6����4U�{t���0�L����l��Yk��N_������ba��P����e�����t�+�P[�-�
U=Dg-��p����w�4ee~�|���	t���.�3����kD�^2f�/"���X�*��1�`�M3����N��f��UG��?;
]����;+�
5��N�F,�������;<���d{��_�=������O��d�Z��3������:��=��5���aNS�����E7����4L�� ���G�anS����.4�4�M���)m�0Mi�������>�~`b���a�����qzbX��J����;��@����I�q��]�z?t�Q�'/�S'4���/}G��Y����6�`Z�i��a��/t������|���U�[?�����w�m9
g;�&��

�`�=�=K}�~��o��~�OM�[�����zv�2��|�N0��'��(i��\t��w�F,�Z�����-������]X��,�^�z:�V����oE_�NXl��OS����'4���(
v�`wT�5�
��^��,�^��v%�Z��	���L�Ql.?M�S����g/��
v������k�iymAAK&h|���iXn���9�-W�U{�z��N5��)��A���9�m,*�*y��07"h�5�ZJ��;<M���Q����}��.XX\�a+e�9��F�d�zb�J�����G��p�Gn���lX�Ql�:������`"�T��/A,���=�%�;��`
��)�����7����R��)�m(�������V2����v�����PU��W�v&�B�	7���*V�e�;t�J����B�X����Yn�3�K���0�ow������V&�
�R��D���^H����"�����;�*��u�5]����8��G
-K�[QU�5=������y*���fx+	�����f���T}���i;���4�O:�$��e`��������4MkJw�.4�X�x��	�V�����0�4��-v�,�Q"��������r@�����U��>,G=X5��\#|�y8�2������d �0�xXR��>;,��{X��cP�0^�S��2����_7�%���>��&���$,
+%
s���?��-����K���EXF�hX� v�\F��^�9����������r{8�t_�_���}�}
]��5�a���������-sv2���Ju��h�`q�i�a�����*�l���2�RF
���
v����a���Jl�2����e6���@����`*��Y�@l��W`��a5��"��El6G���n����FX��h�W��?_,lH���@�E������kg[�����.��,��#v�t0�;y�Kd}�����<k����6m�'�����$�
��&
������e�?o��}X�
���)a�4��6��%�I�	]p�6w�8=��'���)���W�[	���u�����:����=$A�F�b'K���'F�a-^��F4]�I�:=O���pn��r�p������	b�9��&�pM�z�`����*Hy��'���`���Y*�P,���u�Ea^�B����r�y7\�
^���Z�a�f�Z.�a�qfY������X�`b��x���0oP�?�`W��d�����DC5U�P��,�g���Z�H?�iym<A3Z��0�$������)\�,���%_���pu�7=��Tm1	+����X|���\,���C?�H���IC?�d��-��$�\	�X�8��n���JT�	a�AsQO�l��Yly�������W�����s����� ���t\H�~��V���<-z��\�-'��i�6���'�X;a0%X��
�����-,��T�G�}���l��K��<meH����}��
�����&��F�Y���YC�8��'��D�����'�@������*E�BW�a�����E�BR��0���=�+��i�u��i�{J���7LK����Yz��(�#cb�s��D���.5�"=aJ�,I++K��
�Y}����eu��d�E��,\��m�0�H����#�wN����������L{��rA>}X�8�_�H;1�D
��9�szL��P(~!�?���`�����6L;	�S��A��T��%�D�B�a���*�D��N�0iw}M:=��Vh~W<>
��i��^� �~0t�{Ag����j����Ky1�cvU�|�L@X4�BI@�.��cct1M[���<�&��	�1��K�� �0>*��:b�EP�Xx�R��i.�F��gK]%+��uhh�`�u�PSP�3o����K����k��]0������U�g����� ��A(���JOi;�wA�p�-��
��5gxK��)���<0{,hZ@�����r������'e����6������%��E����*
h�p�4le{������i�9y�={��@	-�6k%gm����{���`�J��5����h�0���o���1m-2�`�P|_,�K7�0��[8����%�,��0�Y��0S������4�G�����o��B63���������],�(J�8]�NKdS:�E�!����n��I����)������j�
��=�T
��Y�wV�L�W����F�$�[�w05L���y����9	�a,"�,P���-��^�[�q�����[�a��w������y��	��S���i����sFz�0�qUOz��BC�a���ACkV�7X���WB�VY�j;AS��`����<����Qb�ln�{zL[@���L��?h�`hK,�U�B]y�l��a~��|�.h,j\�����aX����U����dX<�|��V�R��=`�x�����,��(�+-�=����zM���������vm�&��-(�N�Q��W�����^�)#��{F�.�}O�`O&Xa��c6��'���sZS:�~^��z��UH����������)\U�[��K
�|�����5����N�-��u�Y.�4����^Q�Bg�i���,�3���}b7K��,%6��O������5�|�������M��T����e��B7�����i�r��ED7��+v��YlAcZ�z29j����<r�M5-e=��E4�j�L�<Gbwe�5�� 6�*��F��3<?%�]�qm��T�9z������������/���C�b�Q��7��;�

��s!7-)=��|�r9
g3������������g�7;"�����ynLd����'��%u����2Y���m������ia����E�D������A9S�Z��U����_�*�JO�I���]��,�R,,e������D6b��������l�0�e�,�"�������@	�����������Eo�D(a�0��s.�OK;C�Q��l���t��-/�Ma�������&�2K0�E��ki���8E����q�f���
Z�4����He�r�+��u�i�#���`O��b����f)]��o]����D_��w��K�7
�7}b
s��i���e�%�
���k�E��d�A<=�M�����P���K,��-T_O�3O�!z��<�@�����34��Z�n������/�dxvC�_��/�Z���;������3M�I�`��lN��v�[�{�0�#������*�������a��X�x[�LEl����]�AOV�"�Rf]�6m�����������G�W��;=�MM��ZcNu~k�}��M>x/z��L�O��#�bx���������q~���$�nL�F,�9���a��+�X������6�/���K������ha�	�(h����Y�����c<���oQ�	#����s�����4�oZ��%����E�|��,�
��-'��������h��a)l�D=�*`���D���4M��7��{"{�g���'����
&�O5b�;n�0r)������	x���@��4jW�vX8<��/�#� ��^����1���W�)~�6Sa�M���id��0�7���cZ6v��+�3�
�L�C4�N��V�f��	6l[����0�.�i���������K��M��_3LVd�9�b���+/��	�%nx�+�����hb+=��u�'�
M���6X��Y�9C�X���bZ�<�'��������m0�-�E���s�9-��'7�N:�j�L�^�]�lV�?-��6��}u�������U��C��X��;a2��n��v�T'Y���
���}��V<f�g�LL4-J	���[�|2�3��*��8��Ks:J4.��-���u>�F4�[����`7�b��Sl�����������1#��W�������U�["�X
9�
�L������
��B!�wW����=a����a�z��k�i�>���2��6����]I$�v�$z9\QZzZZz����;]�^������0������i
X�i
�@b+�D�a�C5��[��e:b�%��\-*�Q�A�����[�Pi*X�9(vU��,>a��sk�~�L����,��	�����^9�l���G&|��M�0U�pO�Q��vEd���4� h*H�/���q�Q,�&l�
��E�a{�9W�=�`r����[Nb�����a����_#WLL+bO(�cUk�k��UhR6-/=an�$��h���'�H��8���%��gu�:OLkg����)k��12�p
�n���z����s��-��P�-�U�5[V[^��)��XVLF��g�<���/��Bu�����h��!-�%��B�b7s!���{��m^]�B
7n������Pf��ceY
j��m�<2}��E{�P��<X��^\�@�f����J!���b��0�%6w�:M�9��fz��$��X�El�r����v���@:
�x8�t��8�{�1�O���@����q��������E�=wM^fYv|��'�U�I\��^,� z��I���)<k�e��V�������Z,KZ(�Z�^L�[4���,����<�B����7�N.:E_O��`�i�,�%v��1��	{�B��e�n�$S4lS/6������e	����.�v�C���h��%�������_�^�]U������=����9��#��*~X^x/�q-�H��Oh�'�g/��(vW�+_��"���P<
g��AE�>z���B��p�[�{��g�P�B�b����x�B����7N����l�D��ezd�C��5�T�|b!F�=�e���O��p��hnYI{�,'�����;'��b{����6�	\$`698NS����E�������x�m*/�����w���KJ���l�K/�]Y��^t�����	������R��%-��O�p�����`����2��Ql+�,x/�1
��BS�2i3���h�{Z\[m��o�p��12�Ir:0��VB}Z"[^��$�	��L�Ml/�n_,�5�����Y�r��)_Lt\t���^�1���'.T�-���
�P/N�C�(C{����^�+8���}��h]�.�����%�+B�}A��lv��/hXj'V
���������$�M������-
�����b��}uZ\����2���lg�.b7<�5n��NKd������9
�����V5d�r4
{Z\����P4��a1zW2x�����-�r��vCh��c��|2���V&�����[�|1�r��I���?����	#:�5n��e����S�I�1�mp�6GtO�i{DA�(b���4g��w%�b�����E?���^837�z#@K�������p��=3����=�.�����	g��]������
�U9K�b�����.���&�`}�hx��2���C�S
��%�1�nSU~�U
wtY��%�'���St|Z?��EO)'���^L�Z4=f��]x�,����iI5����K`/��'	�J��e����1�>�W��OS�Y��%��W��@��l�������>��K$h���*(���03}����{v@/�wI��c��`"��7�"K���!']:Dl0ye��|��K����J��?��s�iym0if����X�:W����ts������e)�\f�n8�0�le��������a�K���[rNX�y��:hZFt��n,�-�[���r�*{�`�p���(�,��`y�d�K��m (N ����������-��YX^t�Z��G��[m@*�i��_��{T,��v�\��3�<U����������~gzTEC�����Y������e�����x�_�p�
�����8��v%�����$h��mY?�m���-�����F�i�l�AA�����{��n��P} ����a���DSES9,I���-��g����}kN����bsu��)mhB����av��5��4U[|�6�6������@����)m�1�m�9r���B7	
vid��z�u�Hsf&X�9������`�v�����D�`�t�><�e�a#<���[�����`�������9��Y�v�#!���wOKdF�EC\���g/��-:W'�g�Q,��{UT^�����:�K�52����u$R�����i����A�\��,�O/��b�z��h�
&�M��pq��������;d��i��n�<�)T	6Z5�2�OKd3^SE���������{X�[i���#O��A����=�m-xh���mba�0���f�[`�������,����e�53����y�Y8�����3�X����]=n���mM�����p=���~+v0���Bd��::~��Y'���uN�9��pUC��#��B���:�����G�����=�!"fH_���_Dew�=���o��`����mt+xj���e�ov)2]�\����������=��S��4���O��G�7y�P���N9|���Xy���dy���D�Veba�Z�f7*�0���������a�0�9H���ib���m�`�:�E�o:����;;n���L�]t��Bz�x}9��f����-�TpEC}j�LW����-��n����$U�fU�b��{��mh6���
���:���'�[��a��r��.�
�m/��Ti<.��������o&U.6
��N��%�IKz�
�Wo+�g-���5,�v[���:�4.}��6<-�m/�,�1�9�����g1����-	3�����Y�9������X�Ht+��-���ECm+��u�i����U>�z;42K��������aKe�����;g�L)6��;-��E�I��gs���T-�~3yu��a����"���{�B��n��pa{��������2@�NV�#�t����
���;���ee"f�v�'��{���x�iym|AGo�O!���(�
-w��C���Z����7�w�
�?�zV� [2�� �_����bV�q�Y/��'������D�f}bi�����~��^���-�~�{X�������/��Y2il}A�����u3�Q��Z(=7�y7\�z�������9�6����VJ������6��_����N]�R;�S�Z����>M����*�/�F+�}1:���Cl>O�i�:���R
�i8P00?&K�<m������9:c}s#���A��oE?�}SJ|����R���`{�Fn���x����|�h>�D;�O�r�J�T���Z~3�r��������V"�����`*��ff[�T,��>4�4�m=��J�7�;���O��&`j��ij�Xh{K��J���{����m-���r�pA�g�P�JlV`<=�m VC'z��@-_����
zW����9k��n���L8A��Iib��^�hntZ!��L�]4T���)rx���6�k>|Qc`���\:��
�"�q[���?���K��<��cN4�����A�������A7����a�������������>hy��LtJ��~HI�C�4�V���<�
=V�+aK���S4L�X����i��b�\��+������N_�8�����o|��f�����4�E���p>^�V�*0_�la�>�`}�e��G�F����<!L,��v�
6�U�o&V ?�N�J�IW2��~����K�V��:�/���
�i�a�b�_�����D�/$�^�$�]��,�}�����,�t�Z�����S �4�uX%w�b�;a@)�`aj���7~[�������@�G[�)S��t{���5y�	J���5-B)S3��_��M������a��$�+��xe*��7���syX���*iKW
�}�������S<������_���
���`au�d����aK��:Ui-���k��i���2��t�gs��0.}���)x-}�b����l��jb+��C�������*���w[��c��a���5��T�(��aw�`E��$T��/�u�oXm4����W�`s ���V���h�V�7����?�u�S���
���a�f��D%K
�%�
Om��r��
����K1��*N/<��Ex!
�A�p�4�VJ����W|�V������
/)[�$>n�?kx�*��V����D?�����4�M����{�����������Jf�I����g�����D
%����/-���-�Z���q��84�6���Y��`���������4�
����~��pheD/V2�X���b/f���J��%j^"��ntycdl3%���G�W�1�X��a�	�;;�N�T
7����=[)>z�.���B�'y�N�M_�Pjf�M�\p�?Vy��d�����/�a�:��e���� ?V�~X����r��2;U�,t:x,j�{���[_��h��!�I4,%5���b}��~*D*�aCMF���5x�BZ�c]jXi":�(�g<5��{��e�����ium��b@�Sg����Y��3���%���
�EC��I�7f���c�b�8�a��cq���fq���A��qb�a}���'�2+���)����a����
v�������������"z�j�K?��%����X��-f��,�q9����a��h��
k��6�[�?���������B�j�+G������r�h��&��������bsk��lVS8-���*z��f%��l�v��\��l�@�n���~,��0�d�Y�4�m��)�����L��(?�!���VKb�v�|k�zZ"�L|X4�-�����a-�h(u$v�0?0X�/� Nli���"m�s���p>`���b#b<[��|,����l�,<,v�OR���������"�����$<���0���r5OS�	��|EoVN,�J���T}:3Q\�Y��=[YS��,eVt��f�pW�|�d���z
����X����9	&�^����Z����hj4kdx�J�����.
]���l�1c��D6w�>-�
 :U��`��
A2�L�Q,�4X:�`^�{L�W�������:M�6��a������c���Ag9��p�a���h���������O\:Ol;A�=���|�6��*R���g��J\���0��4}��l����������H��n
����G���@�L�Oz��T����@�hV�$v� ��a�M��?���FO�k�1����������S�{Z�g����d�Y��o��k��ium�A7����>�����<����c�b��C4��K��x��*���66�M%�+%������EO�0�?��h�J<8�
����&����T�1�0�`�Y=��A������xi4+h�j*��2�X�7�#��"��N����ya�0�P������3,��[����[��n�����p�4�J������~�V���}`�|�Y��=�`��X�������|[6$`A���ja���#X����}
��u�x�J��.�ry�K�S���c����x9\0p?��S��_l���`sD��B�}�-�V)��>�S+���K��=�P�S��@�?����g�Jj�/��|��-��0/L��������
��������Y�������-�����2aNa�4�*�J'�����(j���ip�nxC���O������~`�w�-mE��l�1=j��Wo�`�Z����{���?�u��y�3����z�o�e.6kF������`���y<n���Z�������p��~��&Mi����e�����XX;l������,������R�o�����+U����G8�`J���	t&����b`�>��h)a��`/��vB��[��Z����d��uo��U��k��
���~=�P�'X�=}�T����f����-�`=C�WyL���4�An��I�*�{A����+p������=�4��=��-z�b�`7�B8zg�t���.������(�����6l�l
����~)aC�S��c�s�]a��8�^�F/m����`_�XF����+�+R?0�J����vU2@�M���
O�`{E%����-����J��P�����q�Y�G3�VY(7��G]y�m0�f�nTaM@�M�l���/%,��'����f��i��$6�=��^�*2&���1�Y���fw�+9N+��B�u
% <rAu}[a�Y��
�K����%}h����e�4����C]4���2�4�������f^���L��o��e1�e5��re����p�	�D!kr[n�ir�O+���Yp���L�KG+���A����������m�����M�=������i��X�Ltgn&��9�6�*��q�m����3E�0[��
��}����>�bQ��)�`�Xn��l�
��]#��/�����R�fJ����m��

+�E�
>,��b���[��l+$o��Y~���Ul�,~/v����VBrZ^�m��~p�Z�Kzs�������^�M�P��lcU����E�7���u.�VH�]EC)z��r�mue�� :�O�����iv�[��"=�
_�U��R��JC�m���tFL3]���0�-7�Y���f�e�j�������^�+��ZM���=�������-������������Gl�}N�����D��K$oh�u� (��9�LSt�WlA�n[�8�X_b1�&+:��L�����&���mU�
��A�f?�N���o�M.�����`j������i�>M���	�Y��G��W��&����H������a��h�* J�yX��F��m�6�x���D��nD��e\��q������SH?��42��z��b��z��]����c����i�6%�ga�i�WR�<-��T���.�����p��63���`�:X��&t��a[��E/���c]��r�DWT����7�D��]�O��"`Eq�G�r���	��L��J.�Y��N���7��I��I�����H��G���[i���6��E�L�����b��b�S_������Z!��4
��]����7<���N��F��1c�����R��Y`R�^��l����n���$�M$���{�`��>%�[		ZBw3��P	L��Y`�u����to�x9\H��
6��"�����n#�1Q��Y�7__�"��3�b��{Ox���T]K�$��g���f�f���S	�a8�R:hY��f��Fw$����<2����_��M���
�&�i�A���`;�kKq:��V���V��Z��}���e�a��LO
vWn_V���t\��;�6h�h\�)��1�W�R+�n����Xj#P���	&�!��Da�k�R�)��"��9���6D�������pE_��w����)������mu�
�J����bt�H�5%~��&�H����M��i�>��J�h����O7SS=a��Ff��b���X��\lR>-��	�%���?����I�b+)�V����/�[�DM,���b4wQ=�����.���1%h����rZ"�t;�������4U�"�)��e7�R/U��S��N�����������=?�/K������YMR�����.�.L��.�r�UO�kc�=�[��[1���K���,c�V��|�6��2�|$�����DE��`� 1�B��Z7��J��S$�Z��[luCA#���}]������!��n��>��W#�4�`i����6:~��������qW����]}(�����w8<��V�dL�F���:<Vj��N-�S�s����l��<����`W%��B���%��N��p�(�`�h�7������E<������������m_["�p�4.������	Z]v���Vd��,<i>�;�mN+d����!�-�`�Y�a�/#%��h{����6_��V��pgS�rQ����'`H��X�D|a��f
�e����i�l.2`���lV�~�6�7�9�0��������������H����_7���p��������$(�a�k��|#z���{�"���v^���pU{<&�j��S��*��?��t������&N��KN3]�)n}��}�f��i�.�%w�4��>lN)��n�as����Hf�iy//0F����@l�4�����*�p����]*�e�����aQm��9W~��;q|~�\j��]������\^>����C7�~�������I(��N������O6(H����w��p6
�0��F�U�z]��
�n�����4������7������|����2����4����s�����c�t&��zV����3������k>`I�Cgg�i8VpW�>��M}�`IV��}����IG:9���9
�=�I����_�h�9
�����?��7?�E�J������io8-��u��������|6���}�_D�p�}]�o��8&?��^��X'�xz���JI���+f�[�-mL��4\�����7)��Y���B��y4Q����w�i��D�2?t�N�`<����IxC���0x�I�����A�k��lv�-$����}+�z���Q�M'"���/2��z`���O�iZy��%���U.���I���(������@�{bx�	���������A������F,���J>� ���������S��"v��4Um�}�d�������Nh��!�G$g�������V���i�yY_�p��EH�?^�m0~ �u�\�c�HB����f�W�zK%Kr�������D�'.|��b����L>���Z�l#����������f]���|�F�C/x8HA�_5.I���4t;f��6��!h$��asQ�i���`n�t��9��Z}>�O0C���L��0L�	������`�_R����m����!����0m/��c��0$ \����E���/�iH�I/�ax��b���A�������b���3XJ����^�	��&3���/�?�\��a>lN�{��rt�mM�����5��W7L\���o�DN��V��i��4��0�=�F��>l�D��4�4�^	�O[�t'ZP���&o�i�6p���d�����f�}�r6��8�?��
Fd��}�To�^����(�=���S��D�C��O*��~�Y��4l�=X���D��e��RW���7��{����lT���RS�>0Nf��"��%�z$�i8{����8�����.*��odXi��?	��.�6a`�����S���Q6a`��E��S��
~�J��s�6��������M�����fp�����?<��&��������vx���?��<��m��`S�(�����V}����*��E��?�HA�������f8�`����aTD:��D��vt���N�������
��(����D���L0������������-��(L}�C�����`s+����n���[J��J�54���)1h��9���%��������U�7��i4�"��
��i��f��=�5���������~���#�J�u=��B���'����tid(� ��������N��gJ�?
g{��E'[�4��	�iH����z|6CWZ����Y��C�3#�f�>?�s�s%!����'��S~���=�\��@I��*6���&��`�r���\���^)%�\�(�>5��-�b��K����*���S���F����~�n�p���W�y�O:X4������#�dx��F��&��p��J��������*��)�6
���?:�$Zu���O��������6��t���I�=�~NS�1�LA���`7,��Z2�p�~�UZ�J����E�������_��'"Z��s�{v�k�������/��#z17����b�s��Ul���xY,�bb����Zlns�j�T��(z�MSl^��T����J���xa�jp/���7�0��#3�A���9Or�b��E��KV��"�bQ��U����<-������K�{��v�9��������ps��h}��^t��<���K31��L�����gc�l��������{���]�[�S]V����/:d��1�]��==�-(�p3�R��.x�J
;%<���+��
=C.�4ga���u,�j� c{Y���f���T�aQw�,[Sh��?��� h���CO�������KP,s��L,Ql�m9��m�g-�.�
]���X����lg�b+E1���/0�r�>,���)<�u�Q+����!�����T}4�T�
���B������D7�!����w�����:1���bsd�4U�,�A�f�;b[��8���4�Q��#�b`����*�TylN���i�O.6��>M��:A���`S,��0���=�%k<W�����"Dt�/k-_LkY4��[��X��b���K����g��OWxU�~0�6��[���)M�=�Y��\9��L�v���,�ch�h\�e�+W k-_�At����m,o��fujb�Y�94.�C_�_���(�i8��X�n1+6{����������>V�*h|_���34��6�V�q���:�^L��O���/�6����i�?,���aZ��^(E�,�|�Dd���S,���E�qYy�����-�|A#Hb����P3{i�� >s.l����������Z%������������p�o�~�a�@���-���z|1�F��.W(�R�z��:M�r;�l��r�E�X����'~)Q�TX mL,Yt6����J�0nA����2ly}Y,���P(vA��eJ�bs����64�H�������Sx�����^�
'�b�`pi*��H
����U���#�c��I����l�Bl�J�SZ��T��`��BI�e���)��Lh�,����������ij)^8���X����%�=�?Ru�(�v�=|AcQZ��1�7���Ho��1m.B��t|�c.,.6KT��F��#v���D�`7�8H�8���%���*� kr������u�/��>U�W5r|aiD�������wm���2=�#���l?Y�.r�P&zYD���1��B'��!-9X��{U�V�����Y(-���K�V��mpez��3����A�py�x�~����M��0n%?����Al�c��7�7k�,���R&�5�/��,fpKn:��������/�����_T����IW�v�{�Y��tC!��������`F@�z�42��j�J����L']�G�,]L�,%�<���lL@�Y��L^�l%{�r����[O�����l�)����6b`E�ua}�-a �y=�z�JY�E�a�+�
��bap!�	n�������E�/�P-`�E�8��%�WwUW�F�+��&�'�@w���������J����/��c-^���or���Z���)��]�nxC���f���.
�_��4<L,E����'	'�V�vT�z'��4�m'x�]��������E/xU�j1�����m��sa�l�@oc�7�����!y�N�P�Vln�~Z^�0LZt�_9
g{��,��0<�
����_$r��f��T�xZ^"�*H���,���$5�e"e��|��$5�{�WH�<�����
���JE�U�ac&��������
vB)G���B6�`�@�7��W��e�n�xO4�+�Z��)������`��D�+����d��Q�^XU��7�-�A�y�����4U�"�Zz���V���Jl���*��2��{��`i-R���O�D��7��a�F�T�C��������/X�tNg���5�,7v���.o����b�� �������[4,Pn�Y��(7�,C���e���5�2������17�0�.�R�,��,M�
�lA	�Y��1�L�H~��p�����\��,�Tl��?=�������O��A�%|���f���4�f	��J�D�����%<k������a�k���f�~^R�e��b7K2[iV��2��7z���U��oc
��;<���-R�i��BBp��pc%	�452�@����D=-�m�i*��p�Y98��.���w�3re��EX�S�`��bs��i��'Xz��N3r6����N6��1m�����<c��l�0�_��E�<2�=6����=��������pA���i8���Z��/&a3l�,2l�o�V��+nL�@�.T�4�����a�P���c��d:��
|Z"��L�Xtc�M��EaCV�,��;qS�u��`�e�T)z2�
���aJp�K4�	q�g�Z�iym<��t�����Y'����7��Y�T,�x��2OKd�	Z�X��`sae�e	�b;��[����)�X�M4�{�+�Y�����n,)A4L�K}�uA"�Y	��Aw���Y}��t9:=�m>V?*��!R>`�O��h�X�[[��p;��vc��"��#,�[�S������Y�9X���S�2�4�������{��N��B��`��+�W7�6h��}�������TL��+�6L6�������R�D7�	%�������+��M/&��,f
S,�i�7��=�~`+>>�o�����n0"��"�~C�����a���8D����,����i�>=�������a�k*����J+��������A�0�,�
m�:m�������A���`��o������`oh-J����u�I:��/^h�0�6����8���
�f��T�Dw�XlV|��V/f������	�4�wsv��jk�g�n���f5�cR�������lY��oS)�lU������5�)��>?n�H��u�����t��tc���t���xt�
����Erb'Sx��A��0"2�_�p��24�E�����
=�R����Y��5M�� lx���t�fe��%��|�lx�	��#� ��,���eX��0|,�d&�'����_�"�
������T���H������YE��U*mVhn��Rr%�l��sL�
�1�a"I��i��������nqg�AtV��^07�B;�fah���Y�~]a����E���z���R�;��M���)m�@kb��x�P(���|\6b��+h�;����X���6�`|Ht�����D�������0OU���l8c
B����
�e����,�0��� ��"6�%�����UH
��������+������
������0����~���B�;���`i����+�����a�;��(���������<9p�aUJu���7���E�A�������!o��V�����YnL�N4l���+A�%7�	:�b?
g#���*����4��7)<���5��8�h<cv�}],�=2�
��47��,����i��7R���)���z��2:N�k��I<���i��a�
�Gz	|�O���������^��,XX2h���g����o~����Zd��"�����OS������r,>KK�����-�|D�
]����������a7��F���5rr�gaK�[�d��u�quiK�+���ahLr��d�R���50���T#M���B�K7�
�~h����Yw�.tDkV�nL]ZtNL<
g�
�[>3�k��0�^,4�L��%�N�k�
~�[~>��p/
6�K����|�K����[�����{�C���5������`��V��E"c��y��s>=��M:���
>�xS���s��i8[A0���Z��fej*��]0~���;��DW��[�����hX!/��{\�5��l�%j^"��
k'��)�z�j�T�I'z���4��ph�
��b'K�[B�Vy��G4��!6�OS]�*��M��X(/n6-��1o?&��T�Sy����a��XX�*�����7��h{��T��KM���������g���9,���s����$�����T�-���O^�`�Q�0'Llg^r��@�l�p�4u��r���#�{67�)���>=���}A�@,S���SA��1m�m�R�~�����,�w*H<-�-(�k��k
��G�K4��d�g+�+qC�j���@,��{b��*�9��r�����[L�31m���Z���wki�m����E�R�[���&k�9��V�%��Z�j�����8�4+�;u����=n��c��vgJI�+���������;<�E��!�P�_l�$������[q�Y�j��xe-
�aL����U���N9�9m��%�=@��KB���D<��	h;�)����Y���Y�B��ny�N��H�`��ba��g�r�?O��7�����P��t���:tg���a#��D�5�;�)�q�r�e��cW2�)��4��'&�&z�t5�����W����(�g�Zs`4k���F<����������*������7��@7�%��FK�3����M)�����d�E�^H��qo�����&�.6����}��i���y������>�[w�`�U3�
��Q�[��K����R��f��{vWrG�����}k�����'����������r�h&Y!���S
��@=o����qg������P�J�I�To��QC��������Dw���<t��Lsg2��;���h�����3}{�L-��65aP�:����5�iJE���,��FO����%�h���#��?�\@?I��R�
;�%�;�x
�k����A���������� �f�{Ik~+����[��nZAW�w�4w�j���X��g��;��Nd�	f�H-����>��VZ�0�1�3y����`7t%;a��������6�`@TJ��� &���
�`G��g��3l�$�P���
c��+��V��a��=�w�w�Js�j��� �F���L���t���;�nKi�NU*����*�:c��
�b7tj\fX���@6��!��AM�%�;�4��,�~��1�J[�n�����wA{�[���<��/�\*$����v����t }Cg���5a���K:9�%�5A������4��	XW#�7;���I+���t�C��*/GS
�����e~���x�B#�ox���$uK-wX�r��'�	�V��,����t��I}�&��q�I{zL�"LI��E��I��4U�L�X�����L~L4�{���~9M��3L[���}���������c��e�l��&��JY��ghj�J��lV>�`�t|+�+�����i�W%�.<j�����qZ!tLN�4]K�HI��wVs��u�sey}8�[A���@��LhV,umK��z��z��>�n��1�������(���h��j�	���������B�c�m�Q�D���'�����`sm�i�l?�p���cQ\��)�������O9��V������(��W���1
5�f'�a����P�)���H��w����-�a��$b��������������ia� ��!�i8�L���==
�c�I����b�u?�s�u�V���M�{r��dO���i�>�a�N�
����a�<��.o�O��?o�ud����y�����{W|����L^�4�ble�btA��~jm>�q;S���u���
_)��_5X�5D�K!avX��D���i���!�4[T�7�I������l~L����Ai�����N�D�&��D�K�v����i�����J����fb+f��f>D��p�VLX�N�B��n�.�fv��m�u�Y'���1?&��]�������nO�����O����I��]�+��nq�7s����b1y�(������,�`����[?
�������
��Y�[,;
5{���y9���b��x��!by��
�E��X�,OUhc��pmg��<����
+�1�1�w�;>��
�EC?�X�@�3k�6z�����N�k^���H�
+�Vd*���{��vb�g[e��/��]��K�&a���~Ff�]���M�(��k�B7����i|�aY�h�5kd�n$6�p��&<��n��Il�/u�����%z�O$X�&�o%���|�>-��	�5����=2�����1����E���-����p>�������F,,{�P�5O����U��z:X��_����=�+B�����R����������NH���y��J��)���}��V��q�
�����Nw��h�'`,F��,�*v�#A*�pC�)C��b�6+��+��0����:M��S�5����B�e_���X��E�H�rX�6���N���%R�����.Vv[^0�ti4@�%��7Q����:�2���Ji�B��f
�`��J��Z��Y�ih�<�B%�a����n����p��P���K=��v\�.�����-tVLL1uX1������IxrX��X����X�k�SSL�(����my�B������{D�*�L���>*:���gs��4U�LXL����!{�����6�/"6����
D���%���f�b���;<�UO����M����b�����4���b+�k+��	"�f����NS�
�e�UO���fU_b�����nrZ"�@p���o����f�Sz�
=��L����b��9��=���O�k;�����1��n��\5��a���������b�k\�����b������7���o��R�Bac�9fxZ �m�$��B7�a����A7��*|e���%��x��7�������K�+8Ue���6X�Q�'.\S,L����	�
j���p������J��em��J���[j����Agy��p���-�&�,���K&_�*�:��n�����{�h����wzL�^0�(�
=K�xX�����=O+d�	^5��e
����u�Op�������`X�v0iZ����f���4m��liZ����9����2�
��em����q�
������3��������v�5e?��(F���`'�|������D������e�����������	6�����n����ie��j2�D�2T��X8�F�Nv[�.o)���xE���i8#�h�������s�6����RN�ium����[��
����ag<��S�i8���)I\hj=jX�|Y�6;�^vX����#Z���������i���J���eL{����a��ZEC�]���A��?�BR����4=�����jx�������L�#C��G����a�V<��
���+������a�i�|�B�V��^2���4�TxxL��U��+�6%0[�Q7,;`�b�P�O����b�m�l����,-����b��ph�������	���5o��lP� ru+��z0�\B��3%�Wx(K�4g�]��p�^jq���iE�����������{v����D����1h���P�a�Fi^{�Y���������,��}`�Q�74��Vr��k;`EO�P5X��)�����@��^�iqZ��U���cb'K��__lc�I�������,*n�9f���-�MK�N&�k������3�,�+y�,	@�,�9�������6@��ed���f�i���T���;$EF�>�A$�.�O�%�g�mZ�x2SHtg����<u���e\`}�������.�h��i������S������1��D��������F7K�#bt2����'����m�O��b�U��{'�f��Cq��7[�y2��hX�-�����}����]�t�iY��
EE�����1��cR�.�7O�RO&K-z�7�	/c�6���[���D6�������P��L��Tm|1�h�
���4�V���MN�����ar�h�3g�n&��9C��\H�������\���BDv��,��;Y2��\H�������M4�P[h�=-�=��4}����v�����c�>fy��o��6	G�%��������B2�/�I���*wZ�{��	���>
g���i���iM�	���a��X(�'��V�4�a���o��iym{1=m��~#�[�p��a�����D6�X��iV�&�-�]���������b���;=P�o���YXl#v�^���'K�7
#km�E�0[R,�'[i�0��>��^z���]�rr��-���ENKk��%K�1
�\��,x>��0h���X*�g
o)b9��N�kC���YgyJb7�B�
"���t�
�C��X&��Y���k��i�l�3�v�������dz&�k��
>��ln��VBV���Ft�����
�DA��y��	f5"���z��Z^q Z|�W��:�h�4S��p��7�r�]?����b"��/�5��0�+/���X��PQ=�i=��"��.Q�����XX_$��\qZ�{B�n|m���}X�����1�������:4	�N����S��$������T}��|���j���'L`��5����`�;�F�����=Ym�h���32Fw�����d2��s��i8[�x	��&���atF,�pK����mZ��M�+��Ou�#e�<�����m�T����[�VZ�{B�%��W�"J��N��c�Xgz��{������}�Atk�e�a������>��@�h���Oj~
��������.�7O�<����/���3Fa�@C�z������A��i��vV�.��� �4-�<�`���3�jD+8�}�������E��X����dRv�s[�������
�����fu�	7���v�IY:����jc�)<����`�U(
y�Y��BO�ia�	��A��������;=��6��c�f�D�����Tm����i�e�1���]
��4��:pM+<����;,�v���U�'�	������v�T������'��:7�;
g[���� 5����4U�1��p�����"������Ri�x)��<��������c�VJr�����dJ��I���Z�Jsn��r��^��Z���x�*�����ie���vD3u ��e�q����V�ViUeum{��hh@���o�0U�ROzT/���K
�`4�5��~�E�sv���.��e�D��+��l6[�������w��$�]h+4��=a5�h�d�(#�`�Z�{2�o������bo�	�T"`��	������b��{���a��	�}A��b���'��{Q�g;����[��lz��^	x����p��`�+��p�cV�gmy���G�Bp��:��k`��	�~���p�D�4��K�h��M�^0#�j��u�'S
M������`7<���*!r+�Oh=������O�.�2�V:�0ftn�z��]����B�`sb�{���x��Mb��	tR+�|��)��*�N����hc:��apa�������~2�7��
�������*�cFe9�Oi\h����_�U�
����w�������h���0�W�f��Yd[I�X���^wa�/������?��z�b�����W,��4�*:�n���[��iy���^�a��Y����M$��4,�w�o��p�e��b�����.kp/�� :g��ga�
��<���\~L�}I��xa���"���������}��Y�
_L7\�M����3K����2�OK�x��w�u �V�`����	o�y?#�%��R����P��,X��Rtc!�P��,����
+�"������
M���]����l��p���tc�\�44nA	tY�{�ly�9L~�����f>���Y��)�*j�u��(X�Nu��2����0�����v�J�r�6�^,�[,�~1[P�]�^�G,:�8���A��E_�k*���%f
/7����P$\��_W�)��n���f�Vb���ium��}/�,g^`�G�Y�����V�6��
���V��V�^,WtcEBb�o�=����Y��Zq����bu����kdhgJp���m�����4#��I$^0������_��p%�Y�@��'���P|G�E_�0�Xe��M�j�����mA<~Y�
�^��e	��$��%����q�l����Z���=`��}T�*X����np'v��l���v��*�`�O2�0���d]*W��.��������28�����a!��������q������1m���kBiz����?��%Kv�W�S:�<��'vK����cY;[����I��Xz"��+� �JO&*-z��r��P� �����s��=���$X�S$�W
��0j4,5��.d�,�=�,��|������'�����K���'����N��5�\�d��G%���Nl����9s�!��064,F{�����Q�W���i5����E����,\]%�]h]�V��L��4k����NC�����Eg���9o��n[t����Vr�V�����K���*�����+���`�x��S�4��������*�FY�y�
��;�x�]�s���D����iQ�	S�A��{�PWX��E���0
���d_-���!/�}�&{����F
��s��~ZF{2n��l���dA�i1�X�N-���[��!^mo��8Y�*S�n0�#��7-�=a�`�W:������|�00�]�wvx�R��[���OR�.xV����A�N��9����Yt!�`��	]m�%�-9��r���z�`���S5����x���qA�zZ?x2�?�)�i
�,l��\�������&����V��
��tXwB73�
K����'��K��x3�
v���4���RC���d���'t�%�����7���cz���������e��F]	�Zw�t�h��HN&�W��KB*���1W�[-<aDi).]�;-�K+pW�V����0�#_X��'.-_v'`���ta�"��xd��4��x�"�@�������l���`��r���+�����v������������g�$8M��E�Yt�+|��`�X����+����o�w��<���d���i��,�sJ�9�xzL�|p{.|E��J��um���um���@o-�,{w2g7��=����[*_��	x���k��r��$�Jg5����,=b[I�[!v�%c�*aY�)�`�K�������0���a�M�Tm@,,N~T�_xJ��0[ ��J9��Z'�	����m��.�J�����&I!�I������[������C��l9	�J9H�:�[������]�A_��i��|�Ks�K������3�������i�������c�F
�3���c���3�v%?
�d&$]
�����NSd�����pz�>����mf��v�{�.	/k���J����X�k��Y��X����-�x��KkW�����fs���-g�������n��B�`��Y���h�.+j�x����0���\5����6����e%O��(�.D��5k�
!�^,\,6�`�����c.��,+j.VT(zD��)�{����|k�|���Y��\,(.^K&6������)����}�����H��3sI��23�	�VpI���[$r1�H��Xl���=�"�f���)`�?�+����,aKR����(�D/jB�6��.�ee���%!�P��,���"�hX�-�b����L�bL��S��8a�����.�����Z���xrI^���a��Y����+~��)�@��cl�k��B��L$�3����
��`7��WX�l&���z���%	��*6�\���]k_�k\��4
v��ZE��� bK��yS��iz�=1�G���](��^���A����&S�������.{��.�RP�/D8m)�|�^{O����?��0�������F�d������������n�|�l*[>
������'kv	����F������z[���h�U�?�����]dwX���\z����)
�PW�,���
��b7������xsf�<�Y���,��7:��� +�K�������cz�cz>�7�H�����d���B�����P�UL��aj(��������V{�}��M���	��x�#��Oz� �1��"���:��=����O���0�G��J��
u������'���q���9C���D����{P9�����B����bxin�{�6V
l�[���bu����{W"x{��F��`�K�NQ���S�[�q1�F�z�]}n��fw���&u�B�����zb���]Z�q�VB�������}�	�-��^�&X�����K$E�3X�
�1�=���z�Jy�%"LF�S�b2N�v}%�nA�~Y�r��L���]l�0?
��"��
����S���G��+��&ox�^�����&��1{{�����
o/�NC��+����.Jb������c�ic*n��j�X��h
��B���0��zQ�n��3uk+�]OVev�,����wa����b���we%�z������i�Px����*S��?���v�������m���������H!�c���"R<M~���7:�1,��C��G���Q�b��V~���J���:{��.�
c0bK�%@���7ts��z�bK�%@�3J:KGn�D��gN��}������A�����&�vH8Aq��}>u!b�����S����{�:\f�b�U�z��\L�S4�K�����wx��~�,
���$�	M�����6Xl(�t>M��.&���}b�+D��	��5j�x�+E)�\0���n��YL^�%���Ib��9�o��p�zti��gP�>'���;
���f5�����]EA���X(�����Y,u1YO��>Ib�0`-�V:E$)l�i�w3�4M��%�Q���Y�uA3hx!��\p�(X�.�SX�����������@���<�MO���������2=1,^��V�7����aSz�p���pz��
�`�v��>��P+�o��*TQ	jL�.\���/��.X�!��%�J�|��H7���Vy��~Aoxt�e��Ea��.���WTT,/�����([=������;�|qW��l���]���$ne��sVy-������m���a���
E��&��)��{�������m���k�|�2g��@��2fov�����Z&�*�bk���U����0�n:���y���%����Rr�4��#E>�����b���Px�X(���-�[?V�}�l�hx��X�
!������ce��)�����X(�,^D-�*����B�
����XL��m��G�f�ds��{,����!�p,)�f�
b+��Y�Bl�WO���!ul�o���g]����D55V��K��������$KS�-��>V~��Ut��x��M8�\�zL��,�&z�$�Xx���^�|���0�d��"o�7��]:�
��������/�r�7��7��@b�������E����9;�,� �������-���X��a�����f�	���r���z��d�c�bXVb� I�X��a�,�g�&����kn��Uz�r���#x�Z��(�T�Y���������;���2�-4�>VK�����,��T���@�)�r�"�O��'��Bz�������E�T�y2�}�Ut����4�Y��\�����
�)�/�lAV �3���&%�|)_Y�^�@�?D�
���B]��.���TY��������cf2������OwfU�[;m�)�.��=�-~��m|��Y�
���X8�?�w���k���������R�<j
��������U�1��X���'��[��������v�Xi��������i�v�`�%���[7xb47]��������+��`��p��c��f"���wKl��8
���x=+a@K-?04M�;`�F�����W<n�9��}��,z���X��J3�N"��}4���Z��a����}[b���V������]��*��P_�c.4s>V�~`�h�,m������9��b��v{^0�4�����_���z���)i���4T�O�=<��(\��X�:���4�C�S���s�~�
 U^<�^L�U�,��?��~`C��tq~��Wbs?\��gM����X�1���������FE����u��dQ�F��X+��^I�X^��X���"CW�wh�V����c���
r����{.&C�q���0�X���y)S��6X(' ���AZ]�:�A_�M�
�L3J1��
���w5���$�<?�}
����`o����S�s��NSd����Q�
����R�cm�����7���v�c}�1�/M����R�
����\�0E�[�7�3'�hx����e�z�w
�N�������6ea�HC.H8=��~`p*#�vi��
R,��[�x,���y�W�k�����S����5�����PgC4��-�0��������U8C�[�c�����
)qW��-k�@�wj����2C����4��aI�z ����O����Z.���)Ml��;`�[c��������#�
K��n1g��t�9
�����:���	�4��1������"������h�I/��S$-$��b���l�	+�I�i��c��Vr��C,�z\���+�z�8�+z����6�.UW�O;P05t��g��B�Y��#�����*L��EX��,��=���
A��w,�M��G�[���*e��~�d���a�����x�X��o����~S�6
{��l]�OX���i��i����5��j�&���z�'s��a�?�&���0.��+:+Ls��Rwmu�|5�Ks��C�%�;;�]��5��J����td�����W������������4E�
`]4,�~t�za��*�AA�TT��(X���1�},��2�cQ����bH�}6�_|�(T��K��IJ��0�,]55�$>M��/&l-z�f��9;P��I�p���~b��Q5��D�E��z�o���g;�l�n%ziq���$N
O�NX3�U�b�������<Av
�`m�J�x?��|�<��a��&���t��Q[����5��i
:�����m%nX�":�s2w�Z�E�|�{�Md�l[�h��������'��r��a[O��*��
���ns��"G�N���^�-��Y�M�U�@�E�7M}���X�t�t��X~J��n,��-@g(�,���E�a��h��!�a���"b;s�����iv�g�������}[���%��V	�,#v�
(�YPn���e#�G����/���/�}�����|U��1�5��*h��)6�S�gaFBl>X������5���b���b�����,�v�"�1,:!:�^��P�J�J9��c�}bEv��X�����f�bw�T�-3o��gq-8�k'O�i�����S�d��Sq}���Yx���/�����������b�b��/���-��(�5��P1g�i������r,��fz�:����C�r�����U����c��E����~i.6v��-�J�Bm��P���������Uhq���,�-�bU}�
�.VG�1��M��ir�N���zM��������^,.����4�v��$1_��o>�a��������_>��O�A�R���z���={AS�[������t��[Tw�M:����'s�c`�D���D���X��:`K���-�z������Wa�g;+f67M��U�R�f�n~9��,d�������N��i�������j
����p��U]Y��z���-W~gQ�L��H���T�7}��L���������{�[��f*��Z�����~���_��CN��iv�,�P��|+���|7Y�����y�����V
���.�����y
v��<�
i���s�9�]yv�=��+�"���N�Y���J(����E�p�����u^������F�:Y��b��[Z�u��s�
�xm��MY�u3�W���_��U����b-)b+
G����U��^%s�Y��#�T���r�
�m��<�/�u,(v����V��������r������
��;�NC��O8R���C���
���\���bH��2��\���hX,!Pl	���h�����B�����yG�����U:3,>�Y��h�t.������+���Hx�^���>�>	��4��:�Y[M�j[1uC�7�w�`���XZ�����"����YA/�-�_z��W)��lc�[��-/�a�6����#�����qc���aym�0�>���[�-k�~M�}�k�i����Z�v3Y[�W�V���4V4�0K��/���So��n�?��@���`��bo��#��)�J�2�������	KW-bt�����R���/�/Z���������S�3��	���*V������y�
.|��20��/o��]y���PB4M���?��q��{�0�J�x}��,!�F�4�t�8=��64z���`��V�q7S�}��[�
���$I�Zv�wr�"���y>��a�L��,�����Sd-�
��E��+Px9����%��[�HYzx�X�7���l1���_8=�}>&[,���Y��c��������0|k��P�CO�����<M��\�������=�5[�����Q�N�d���6��@bGEl����1<Um�%oX�#�a�w)�c���2}i��0�i��k�P����a�=�/%<
�>�,"�c�BQh��-Ch��f�b��S$Z���Q�#��[X,xL%@����=�X2Lp�n���b�S�����l�n�D���,�o[����[,y��d��K��`sy��1�����������SQ�i�v�`.&�e���V�����F/�f��+ �f�^�����o���`K��Z�P-Cb�����7t�^���Z2�kK��������5�7��z�?�\��Y�9�=yO's�����tCE7������>��4?&ySM�r�n�#����wf/��0�����?$�������1{���lC������o^�����BT�e�F>��y1�'~�6�LO\�D��Nz�����^�X~L�kFg�'�X�����h�0�x<C��*����Q.�c��2����_��lO/�6=�}X�Wo�0j)|��}>�Oo����Yd1�0���Z:?c~����j��v��,��e������A����[��W���L���3�Y��a6W}���g	�vnhqH������nQ��=�N��3�2fQ��3��Ml�}z�6}����ri���Q��i�yk�i���BA���}M�`�������a}��9���1����(�`����� C~����E������k�>vSs��1��T�c��f�6�.5;S����vQF�tG9h�)\|X��J�����iv�-���M_%��o"n�M������C�x��J�{v��D����~zL{����4����D��[9}6�m���4+K1�Q
��7�`�/c~����{�0�����#
	4��]�G�
~Jd����&*
���p@��HW����3�Q[����^�f���_����g�?�n�m0�~���2<��`s?��1�����L��l{/u��	������&fi�n���������?�N}�H��/�����NT�L��lC=f)��?����A_0@'���P���G��+e�OC����8M����o����u�=��Q���E����t�Lw�4��#s�2p�� }��)�v
`z4h����\�7v��mzT���3����Pu�[
��������Z�L_)�w2�
��������
�l��o�{�����;�e{���F
�)������NG_����.,���lV>=�wX�6���3Xv;�Yv��Y&�a����xgGz��,�K?�H��8��1�wgx
��"���R�Ef�����r�v(�QV����rHr���Rc=����R�7j�1���l�����j7�K�N����2����#3����B���k;2H����*C�;asG����lU"��NI0�*E&���	z��8���*A3qe��}��$|���>���$E����������yzJ��Hn�C�0�X���aK����G�S�����9��H��������#����?��	��U#�d�{$,Z
���6�yL]���PT����}���*EE��<?X'���{��%�k�/���O����-���6.ot�zS:��x&�f��N4[��n+�Vk�s"�k�:�{�-��-���\�W3�����4T��Hu�����-��0�4���a��`���~����R�������a�$�EW�pF��*�^8�/�1��%�Y��Y�	`������d�>}U%�g����%�p�"���M�4���`5@�����������c_��f*�f�
�f�v��7���E��G�������a$��P��0R�|��<=��	������;��ACW4�����H�5C�NR���>�C���s[�0�+U�J���m������0����Z�L��c������z�p��+~H��rz�=��0)��S���(����S�������I��y_�X�C�Xl��l����.R����-}��l5�6�m�	���n�e/|���m|���n%������+h�W$I^X8fI��S����gR����o;|���j��(���C������\`+N���
k���~a+Y�m���A/��;`hw�h���)��v�`�?hvm������0`�uoD!���������,$��Kf�/l�fN�kO�hx\�j�J�6���[M�;�=��5�/��*�b�bb;��[������h�=XI����Cb�%�f;���y[�e����~iN�;�3�YTJ,l=���d�PYzY;7�44��#/����?�{��Q������V����E_����>f������o����S
�u�/�!��?LC�Z���/v$��4�C��Z!�u��,�!6���g;���fi��mO|���J���9K_�7�"�b/vh;����uT��'� =Sn�d����M�I����G](��,O���/����2bgr,OC���$�D/V�(v��P������?om	�C��#�b7�c�m��;=�=
��Hc��.���6��vf����`�4�v���NP�eN����:J��H��Y�P�`�{�P/�vSS�iz��2e�9��m��Dl/��]��XM�h��H���.�L�X�Tl/t^������J3�e��\j��\���.��^��z����^�Y�u�M����mc:��a����2c�u�N��
�D�+����)��������������,���]<o_�'v'�����b�G�=����:D�[;�B�^�4T�]h{�,�z��h��"���.�^L(Vt���g������?�JA���,��O����d@�O{����^Sw���} :��t2g��xA�����H�01�� �yY7�������c� �t���=��^0�l��`g��������7Dg7�d���\=X���3|�MMy��cZ7�b���o&�b����������L���,A5
3�z��y}@���$���������.xK�{3�����)�]a�,1{��a�9�����p��X
��}��F��gmg����0��H��i�vd`a��x��K��g�[a
n�%uia��m+	>K��;9^����Yd�����K���
���c`T5Xx��������0�V������D?��Yx6�8�f��L	=`G��LDK,��{��m��d�Uq/���l�`�����_�'6���Il����f
����_���P,�E�V�X�|������=�*�PW��U)��_d~���0f�;�������~�,]����]����X���]p�"��0m&�b�EGY�b�����PE���$�%��=����,\�d��3e�Nd�	F���+��O�9
�&>d���0�#�?n�����<Q=`�W��0%!�)�rzL�"��'�dX�!�l�����lJ��f���E��(J\`�������6��f�e�p
�ey���C��wI^���,�vD��8��t��\�i�vD������p0g��&��2R�����/�Q'z�]IW*V-y|A�Gt���HX�4�?�R7�i����)"�	��\I�Z?8_"���D
��!
��i�:����J��o&k*�6���I�`�u[�`����+�����hN]�F�=���������Ji�e|/�pJN�i����@��{���t�S^��G�N/��1��A�X4�w���Hbi���0Z��z�[���7��g�����p�e���~����f��U�����q��i.*'`����^b~��V��-����oX#��|<
��S���v2g_�K�[��z����K���yW���z%�^����b����wH��2��[�j�`o�$�aV�p�}=oa�z0��������m� +_�7M��C��3�V�t�,|1	`����0
�H���J��bay����k���t������{����x�aAl���j�]����q��w�.<�HM�p��e=\*���}X���__`+z-���``m��,�(
!�Y:���r������7����b;K%���fu���iM�n��Z�e
5���M����9O����4ZF��,�(6��O�������P���p;m��*l87�}f�c�����M��MO�F����x��Rg���G����������\����+X�',���f+��xr�{��c�X(X.v2��2��U�5��b6��,�����e��mcE|�a>�c�0R;@�p":{���Q�j��m��W�b����]���:Q�6-TM1
_����e�-5��f�>��n� /vAG�v3��[��k��mLW�b16��>v1���'�P+�������|-�{v�_5��J���L��}C�-��2cbY��P&�����4�v3��Z4�}�e)5���0��a+�k������}�s��mpW�B�b�/K=?���T��ncqS���J��jw�6Voa���h��m��E���ba��,<�6��ll�&���w���S��i�f������\���`;<%�.|���@�{�)�6k�������� @���`��}��y��S�i�v��AC4�(����X<=��'�m�V�{�S�(o���7a���Y,���F�V��5|+���p����	VE$z���XV�(�����-}����e�������!+?��f�z��Gl���Y�����0�lEU�Y�7����\TR��i���
/�E%5<�_+����N��BGbsa�iz���2"�0bzs������,��x�h�
v�� o��l4�44c��.(�c����,Z��h�hz>�����O?1�4�B��z������/,��]
�R��,;������
<��a�TvY��|��i��|��D�YB�d����2]�w������))&U*�w�fq�'��K�8{��:X���n:I����kk�B�����mzi.������p��
�����`�q���V�,���W5���5R*�������"�������z���i�7t���7���f���=aN2�&����{���iZ;�1��f��"b-�Ko��[��t+K�B�a��N�<��d�������&
#6W'���:�������l�>
�.���a��x�p�G]9X��1I[���,=&{�(�J��2�������'Sn�ig���f1�F�I����?Bv�07��6�}]����--��,|wd����}Y��-z����}L���)`���7t(��m�f���:�^p��D,<�Ni����7��4�:P�KO��o�0>�]��=[�k�����KsQ�[��x)��dx����ti�f�E
>f����`����J���ip5�
K�����O���>FO>�����4���`�=�
�p����4T�OL�X4mt	v�m��[�������%����T����VM<����m7�����P��1�g�T�b�bn���.����a���n�:M��TX�,�������S��0�J��|h��a��h��G���w���v���zxM�X�=���
,}�b���f����A�J������7\����c����X����:hX(-��Y8��nb�J��~k�7�9.:yN������$�a�/X�h�>��c�k�uz��h�{^!#6�]cN/�i��-�M�4��������+l����Y�����`�x@���}�Aw��`��v�����X�wE����TI4,�ti�,<Z{���4E���BB��ng�4x+��J���
&��[�.��[���Y�^��~�����*X(�l��������������w�����}E���`'}���|�7z��_�#}��:_6�����q���.���:x�K�+������S���������Y=��~K������j��S��i��{1�p���K�%Z�����c�q�/�S�D���#�����s^Y3��bG����zy�h�
���������Y�)���z[��f�%�
��j�b�Nz����>/��%�m9e:OC�*|y�D��"m���b��l�\t[+feEC/��Y�J�`��f�>f���}[g��D�ri����r�7�~
��ba�D�*mn��Lx\4�v��ZZbg��-<~3����wb%�b�m(b]5������Z;�f���+����sx������P/�tm���0o���,	,:�N���0-n���~[��fz"�/�#F"��/��k}�F��43�#������.m����^==�7X��Hp�����������P�D��*p���_���V�`�N���-�|����'<��l2��
_�@��M��|?Y�.��h�*n������,�~2�=��N���"V��b�B��m��uI�����\Ux��u���0�F:���S#��)����h8�Q�������T�E�Tdw2�]�)�^�v_�
c/m��
n+�L�Q�di�W�N��p>`�4���ba�S,��3��K`a����A�`�4��������oV�!���n�yI���Et[E6N��?�9�z��u�@l������
����^�P�V5[���@�]|�:I�yU?����H�p��X|�'n
��]��^I�Y�^�.z"�4z�~�A�]�YC�4C�bX}�h�k'���i��pi�m�dx���#R.�!�������a���|C'F��l������v}�m���)��T��V���U��`�-�����N�i'��������	����k�N�i��5���p�G%>\zJ{@L|��0j����[Y	�y��j���]�����8�V��B�h�
��|T,�?H�J�������h���D���(U��=�a)A���V"kL���37���bW���j.ZAC]V[����U�/�������Px�Ynwd#o���f+hx�������e�B�7s�]{^��j�bJ��t���a���B�"�7]L������P�M�����n���QC�]va����+�EDC�u�t�����R�~b�}��<M�]>&j��9Kk���~��^�Z��9\����`{���P-.}�^���E�2��\��V�SCl���i�M����~��*��
"F��o&�-�b=�fa�g���;X&e�r��w��xi.\\����7�54�B��m��	���7���_��	�^tIR�Ua?�f�
�����fS��4T��0%���J�k�nBi��nk����*�����@��A��P3J�)�)��	������T >,�����4E�Sa�\4�lT9����"�������7lI]���<�g+������������"���3tzL��p�]
�Y�])mu�}/�:������I�������X��t�<�$��K,�1J����`�����E�sC�Ks�8��sXf�d���b+Z����o�i�����OR���������l������=*q�����x���`�����w�����Y��{d�oKD��D�P���9[�����|C����/��	��i�`+�����o���4,H�F4����a>X�>#�p	�m]��i��.5�Z������7}����[���>=�� ��(��$
'w==�K��)1h���l�v	�R��n��]h[�E��0�Z�9����)�]�d�C�K��!*�<�0����co�,�h���W���&S���|����e��ape_\�B���0������]�/B+�X!��G}AM�p9���d+5���Z1�7���ba���z�����i����aq��>f��`����+q�"��t���B,��J��~�1��0��o��45��J������N�*��Y���2}�f_��K���N��
������K������V�����;K�����1���2
�9�����X]�45��FB�=Lb;���,�,6��f���"_�4�����2���uHl��<MQ�!_S4<����#b;p��~`W�!�[�������#�XV�&�p]q�7�6X4�"�7���H�G
��Y�^�L��i���
7^U{�D�Nnw����Y�k����L�[t����J��o����ys�az-���sr��:������j��i���������%�������Jm��j��L�I4����l/��6Z��j�0�vpY.�4Ga#��^Y���N�����*��e<E��!�[4��N�BU<�i�?��>�i$:o�'s��X���Fw�(m����Nq�����F4��WL��H�w1!��0[,�=Zl+�M���;\!-���4�������U�-kN����-�V����+���Tt���[rV����s���hi����5�;�I8���NV�#���������`�h�D�7�k�������le���L���A?�c�0T��LP�(h�t��w����+�N8�����X6Ale���:��*zb�{�`{���E����|����`Y��!A�����f�$|a=��{�H���J���V�]!
gYwXe*�����9�?L2Qt�_W�V�V`�FtzL�?0y4�B�}�`�;�����P�W�N���+@N��
0U�W����y�	�[	�w�Fn]rZ��-t�/}|in�u)�0�-���XO�Xy�C
z�vh���l����n=���k�Jzg���WZ�N���w��K��r�|���x_gJ��,p�enw�6���a�������p��]8C�[7�i����6|���n��N������3]ZD����0�t������7RI/�OvK�w&�)zBg$�,��
���/K��)�X�Zlntz�Vz�����8�h�	����w��S�'���`7��;�q(�|u�i��� `�p�T\� X����c�����n}��9�����"�0�.�L
M���wX5���!����ZU��K��z�J�:���M������\�vzJ�N�����`��,�Z
6����.��
/�K�2.���n�����6N������lO�a�V�Lm\������`�����<=��.:�o�G�R�d��=��i��������VP��V��L�S4�W6K��gi�3��v�)���5$G�tmF�l����4~��;S�=a�Ula7��vg�[�s��{v�����>hw&�'z�[	Y����r4K��f���
�a�.�2\���U����������ng� ���F
����J���Y�;k}�3'�n�I��k�[aNOign����l)�o�m*����9�xL��'�R@k���w�0&��e��Kt��JF�2�z^KN��`��$V��,	��P#��r?'sv����hs
��H�$�a(S2��t���;&��v���n������a�#X�[��:c=p�B�f���q/�"p�X�Zl%na��\����h����y��&4.:����;��5�������P�������t�"�1�k
����%`���7�fz��G��0�������J,�M�������9o����\]<�S����WX�t���k!c%����E/Xk"%js|�3O��z�t�9L���s
��9)B�� ��;��H�Y�V�Z������U�X����h�66�M�Q��z��a��j��*��Vf�0f�d��t^=/�dX�&���r�+wX�t�~�Y�X��O�i�F���E���'�9����$�_x���+�$+�Lx�T'�R��r�TFK4��������
&� ��8�X��������l�
�E���fOCm*zWEOv<[����,1"z�������2,G;X�~� k�l+0[����,�.����R��T
��&@ z2�R�(�|�� 
%��^,�(�r�V�LV���'s���+:���gK���":s��P�`U�wr(O����0�h��(�"�8,:�p�hV`6�k��F������^��E��_H������m����y5i.���}�t(��y�p;	V��m�~�4��E�g=�)2���'`����T�p2�}����q_��0r��f�YE������t��z_g��P&J���bGA�bX�s0O������(h/
�x���D���Xxs�������:UOSd��I������L���FXr�����Z*l=
w��&�*�b�Sbo�s��'�`s�4E��a�-�$�
_������S�'`���sw�{���|��%~�/xNv�����2
�:�b+�>��&�(���������-z�C��\l��f<q��gX2u�RF�p��)K�������~s�aX4� #:S�go�]��-^���*,'�j��C����7LE���ek��e�/��\�v�]����E��Oy%��oz-��pK��$�`������b��#f��vo����/�EN��)��.�VB�n�������1{�ZC���V�Fj���r����a=]x��h���eJ�����vSY���R��um��}��W��l%���a��e��}��U���c][��H�i��>���+���M+�4T�"0@��q���
,Ml��OSd_�GI�Vc{����P���;�����,�F;X���V[��L�W�
�N��"Yfa�Ucf��bs��4�vd���	cf�6���Q&�5�t��������X<�_�I
v+�O�-�c�?<���!����.����/�����c��'�{��#��3��p���
��)��������WX8�?D�d����p1-�
z���`K������B���^�`�.�����-j�
k�o#z�wv|��x������O�"����v������6��C�c�.��Z�"R�o��%�U�R�y<����k��n�����]}�p
��M�������E��,��O5��C��b[�$=L��,R
�bI:��O#�_��AS�f�{5������-�/}������=X}.�c�
I��e~�b�5�e�ViL�Y��+���a	{��xzJ{�0��`��b;�Nk��$,� �
"��x�"�YI�Yjy��N������%�����, �n1��{�s�X�^)�.m,���^�i�����c*�����H3��L�3��W|�Fj��i�n0�,-������^����h�FKj�V�-5�X�x@����wz2g����ke�
ncKW���.��c���Ra���3��\�t�cq2g_��E�-A����5��'������`?�X��D�E��O3d�����nf�_ux@�SMC.��3,[e\E�0�/�~f�����`w�dc���E���4�+n�5��-}W���[<`��h�{I����[��O0�a��Q(����,�I��d2,�<���FP�>p#
��U�*]0�ip;	z6������^�����%
�$d&p~����f�4C�D`����[r������=X��j�*���0^%����Y�y@���s��d��:\�%y��`{j�9
�.t}��:1's��aq�h�e	�U2%�<0�t���d��<�����U����t���0��������z��b��_Q$��&K/�$��|�9{v�^;0<t���`��K�h���������3���x�k�Z�*��7vX�+�%�r��=�iy���L3���ibs������������>M�����c6?&ZEDO�_�����-x��N�RO&d,����	�"������j���a���j���	���f�)�J��u��������%V���~L8�p�R�����9�t�["�=�:�&���S>~JhN������,��������-����"�I�fMzb����-����MK�;kq�Xfo�����1n:���Y�aO,,�{������D�Tj���V �7;�������z0����������E_)C}2g����D�������C��c`��|��Ks���8�Xz����*o[h
�+�,�(��=aa�
������9ld��g*�s�l�Q3���r��l��9M�]/
#�b�m���Z`}��#�,�0-���M��(���m�p6�&�d���Y [���rl�|��B2uZ���A_,�3�'_�V���w'h��[���v���t���D�d�����{�%��
E��P�Utg��b/.
��������v��ir�x���h�z"6�"����g���S}��
��V��P��0�^�tM
�h��a��P:-�>�`���J���o%X
vW��W�0���1���)�t��F7}:���������l�4>
���
k�l����.��0#��f�����gcJ��o&�b���b�d
d�/V+vj����i�����������'�--^�����A�	Z��l���'
e��nX� �0=l��[=����E�']DvM:~Z�|��D�����U�X���-\>6-�>a�Xta{��8,
w�@���P��{m�p�����`�;���n��	#c]��5P�|�)��N��gA���T�6����
��OX�$�m���o'����x�V�������=K�&��7����D`}^�4(��_{�0�l�!^��:��U���Ks��(����`7��H�� �0��=a����+S��p=�����R�R�����.�ULwOx����P�~��(Xx}�X�j������5��0�(l�o{�Jl=1�J�<�������d��u|���F��(�J!�)��	c��� ���:
��&��:y''k��`�����������-�?���q�"��0�<T�����*�N3d�
���'��zj�������R��L,N���QW����
wSw��~~�0�=�*�]�������g����{�Fl���[B{B�=����L^J��I�
:m���`ZB{��h��D�W�[���d�E�9Xo����~)w�r�������[��c�eX#/����vv�"��t�z+�{,�������73�f��&����t2g�
F#���0�E���]��I�p�����d���o�e�����me����E�k.�v��3[+=���cU��T�E_�4,-��i��p;�����iz����M���Ul�9�����E��f�����P�O�����X��mAb�?K���"��@HQ��$�
��4j:��Y�l*�:��]�m�
6,k����8
�nS�]��mZ�y2�:�t+�*4LP>������N��\�.����'�����)�il�x�����`{���J�J�
/R�e�i
�'j)YnH���L�Zt��^��-(�^9�Y�zB
�t���R��4T�@0?�H��9��`�M��r����d��i�����A����u�sQ�Ks����=K�b�C�'����c�b�KP�)XZ&�MU�E��!�oO�� �m6���`�����������J�Xx��Y��oV;
��O��;zL��-�
NQD��ZT�Y��4E�azS��L����4�`
�N�i�v�`[��}���	�	�bf�lI?���l��t���v�`��^_�+��zm2K_��m/:��=/(y������JL����u�����
{������rc�x��Po��S�=���Y�U��2�f]E�����E���-��<
�y���
�m����=bb7���utN�{{z�����1�0@c���9=��Qc�?�����2�F,T���jBG*:>�����s|K���M��O7q8H,��l7m,��\~L�]�fE�B�q�`��8������F�irO.\f%5���4���X?�+�����=�p���� ����D!������B�b�����i�-H�,k�gi���B.
~+�W����bg�emv��K_��z����X����%�����b/R��Y����7�f�N*�W7��4b���b�B���;l������N��5�'���>�)��������<P�������B�e�7�-��,+�/��}�*�e{����Q(�Z��_��B4TH��vN#���T�E�>�
��R��g�`���i��i2U�WA {YL~����B�xY]V,+�W������h�
m����V:���i|8���@���1������:����j�ug[t��<�����4���i+�����HL��mY~��t�7����^��XVW������e�!,\�l���x����U�]����Y���L�G��-l���YL~1}�P��lj?�����f��fS�4T;@L]]�?�`���YZ�U�V�!�l��M��_����e"zT�[f_LU4o�����[���Wa���ic�/�7����!����&g�4Cv����Y)��C��vx��G���ez��'�,��a��^��S��d-�����bssm�.|�i�)|y�^;���y����X������q����9�`G������_��`��0���+n�Y��4E�RaaH�
f��0<(������ .+������cOS��������4\�W��i��D�E�����[b��C��0a��*��.K�/&�/:K(���}b�n����������	�=K�2P��r~��+]��}w���kH���zS=1k;��+���s������1V�_L�Rt�&�ee����Eo�i��;���l�����bj��i�[�0�^�@{%NkA�	f��P�� /!z8Cw���eM��4�E����K��/K������H���i���������H����������z�,�{���V�J��C��/��`._��t���c�����v�^{@�v%��Dj��ESJ���Q���Y�~����a��*&�,&�`9�W*�9��������F�/��OC�=R���"�������5]�f�n��/,6V�^�dh�m8�������;3�%:����7�����L��
��,�o/&�-������^L~[t�,���^p��)j�08��y�6�`�)�4E���t��
O�b+����^�#��6,	��$�Mg7�0����Y2|A'2���m0�'6	���:����Kl��m�nzj
���p%]a���<��2~b{Z�NC�O�$�E��&�)���h���G%�t��e�'�R��IY���b;��.,�������b���S��d�.�	������.\��,G��4�Y�eX�������@���������^��z�8�C��fa�����yw������=?�ZKK���]��\��^P�)�VIK��`G������~���#�������������x����~t=1��|����iz���n��i�_��p��q��w=pASvY�{�2miwn*\�^��U�������0A���`�V�i�v��N�
��`i������E�z��{g�	
�af&X�WlY��~�������;H��nc��.f�Ym�4���`0'�]��mY�z��=������<�Q�6���h�����-������
�,�nf]���z��7]D6����1�����	a�K�E�B��cQ�������:b{a�{,*�0Qi���D���6��v�-4�=�~X����m'�p�n,�!6��-Mo���%H4��6&�b�	����4E�S��������p��P���g������i��CE>���{-��T,�\y^������a�_����?,����_��-�}���)�[`T����|��a��h�A���?��,�$6�F����hEI���������=�b�B��c�f�W\
K����5*�.}���� L�X��a���;;u�������j{���-�����}����e��}m�~��b�����NB�0�"v��������.��}�+]pm����|�c}g��F3�������c��e���oV ����.���(K}��)���B���E�b7]��o7|��+K�eS��p�� W�tV��"��'\6��jLlVx���Z������X�6���h��U����W���o���Y���5�X�SF}���]�})6����212������FOC��
�AC�B[���`a��WkI��P�iz��2�#�''sv�XK������B���^��
�l�P��Xw��gHixTl�p?��4l�5[�y,���<Y��.x�[/�a��~������*m�����m3��;��] ��������`+I���^�-�5,�
�U�D��6Vf�Q�r~,���_$h�����-0�S{��t�<M�}/�f$zw�E����mt��'f��f��e��K��������^B�9/xzJ�|�}�"v��} ��M�*I�B����L����8�����������E�����`'�Kw�-x���������@���Xx���2!?n� ���+
��}�vx��"6�z��E�s����7�����Y�(���[O\�z�]M�0
zT"��~X����?<Y�KA���y����@[�'�� ����E���7C�]��c�{�	�Z�� ��0�%��Zt�i?0.�|m����c��U��1����&�s�^;|L�L4jXf�nbo�hJ���8���MG�=�`�n��n�Y!�4E������K�V.�z,���e�P;U��U��N��{��z�o%��������E��:���0����#qy�*o��EX�=��
����z�;�
�E�s���9���E��~��E����X��Y����0��GlVG==�7X/MlX�l��W�l|�nyz�NSd��e��I��n��T�m5n�-����N�9!v�(������?��,V{��-����7�S"SW,\x��?�}vJ����Y�J�����T��-}��]�0f��vW�M��CE��>f�I�<�j�Ft.�{�f}��P�1�w�Y$�d�N�K�e9�������>�t��G!��<l����[	c[����(SuWpq����o��?�41���o�t�9��[��{v��E�����_����|���RA��	>=��u�	�f��b�Y;a���J#�%�XXt���d��+,����GK�{���
j
��i�*U��j�����H2��-�F<���m�g��-�?�������$���:�0�t��v+a=��?�Sl�E
�:
@2x�����C�T����P�M�@�=h�k/v���`�u%�������\�I�Fj��I���-t����.Y^�F�$/����9�10Dj�������H��8}���/�x�R��`w�z8M��&�.�U�^,����#����}����e�?D��W�y����,x�:��.��W�'
���5�i�������6x��]�[��d:m�
��H�$��CF����*�N�m�	����\�6�cl�9�`�e�p��c����%�������y�h�Ya�4E��`k��a�Z��0k+�Ig���������|�^P�M���l��������d�E�B��`;Lg�.,�6+�����&]6������v�OQ X���$��j�����A�Z�a�t����&����������wM]��(
�����2��"�fi\�,(4����^)4
t�xW,�[	,�#v*��5�7�B��7����b�B�c[
3q"�7[�B]8�eQ7�����Y���Z��XD�,&';�,*%���
�-���-?u27m~\��U���������N+����Do�3#�{b�e}��{����7s�Eg��=�+4���?�������f���a�����5�D�����x.���������b�B����fQF��Pk�-��Y�@4�JV������j��S������k�n-�,3+6�eG@���n�?Z�,�!:����0tk�W/�mLI_�d%�b{Z�NC��G?������%�O8E!�Z�Wh[�~3Uz�
�^b�����������XlO��{v����1����j��.4���BhgPbW��aa�
�T���tS�F/��IW��x$�����{b��s�����'V-*�b5�bw���m�����E��P��h��R:�H�Y������p�Jd.?M���u.z�~���F4���V��
�-4bok�o�P&:k����34����+/x����D����f+��5�7\R�o�V��O[��B���n�f9x��%���+���7�2�C�)��c�A�����f%�������wH�
�Z�+�?ha�����y�d�<����O�{$+.=��E�a�.XX�.�F������m1�|��Ks���m�Eb��*��YN�kg��(�n���ad�V�[�gt[�{�e3
����-�X�XV����7�J|���PRh[8�-�\P��V��p=	z�Y��u���5��B���<��z'�����5i�&�~��1
s���"�b�T��1�/2�f�7�=��P���-!h�}�-�
3J���Fc�	�`K����7<�J���\�7�>�4������pS���fM6��R������Vr����tK��b� &v���t�a�G��!���~v-��C���=`J)��U����V�M��e���[X����a	�U�Q}�o]7U�Z���Y�0�(�e)
6_���]LpWl�����^�h}�
a�oe	��������Hl�Jgm����@����NC���E��f��[��
A�'������D���K��{4W��g,���,��V��L	[��ut�A�g�z���^l������
)pTo���7���)C������O3{��M���1�wA�"hx�����i�v�`�}��5�'�&6U.�����.4<���zO�����E������F��.-�v����Y�'g[Sz�X��ap���-t��f��,:g���zM5,��_KeSdM�
�M�K���)��T�~zL��0s4����tv���Y[{3y)����a]�F]i��v��i.r;�Tb���gA���)D�������^}��P@7m)*�Y��Z�c�G��A�J���7�g=
"��z�����������N,��-Z�x�tE�����������G!����0�����p�{4����}��oX�+��>�\��?H�o�{�C�������`K[�W����i;w�P�Q,�:K�=	X�+Ih��>+�����������A�T�~2gw�
������l�r�j�TB4��W��~��S��aR{�;l�|����j�$&
�i����VZ�z�����S2����-1~b�����������A��K[d�R�l)�
;��n�b��d�{���t�E7�	6'�
v��^[%�c]�
w��\5�Jj�[�-���'.okBo�	-&��5�����_���R���Zz35i����,\p'Z��m}6�I�;�D7x���3�U�I����*h�"��.�h-D��Kyi.Jj`�~���|k1�
KE������:�Qcv���5M�����IM:�s��{��?��9�$�n��#������x�'����O�4+��XFg
�,M�a�_B�tO��L_�U���as�k2�ZP�v���]�{�cEN��1O�;=�d�4�Ncf;j_����
��������BsA#��,J�-$6���OI\�L�lG!���2�?`�1�j����2{y[G$����_��Q|��|_�x[G"��o��c����]�T�lA���+���?���m�o�(���Q��lAC��K�l�9�fj83[�d��7#EZ�L��l��=���5��$QJ�4���,�1�ew��(����>��xwF*��ge���K��+�lQ���_vj��z�M�����(�h���M��
�����F's�������J!�2J���?��$����i�8��F�j)?t:�XL����|��i~�C"�U��,�fw�=[[9�C��<v��f�#1�������;�O���H)����?�x���;��7W$,k�]O�a�����deM��w���ZQa�������k�fr�fQ��Q3
O[����U��'��S��>6�%�OC�7�TeM������z�3�X�'k��^�l���4Ev�6 uW�Q���Y*����Ze�
�b+���t��A�0�l���x_�����0��7=�����a�%��
W�^)r�wu��������`'<k�0�l{�f�������T�cF1ejV?
�>R��0+�����St�6����^�
�n�e����4T{@0��,3�`7���>C~/W��B�������xr��]��Q��N�����>cN��i��=��c�9�~2g7�|h�i���m�&�T$dd�J�����^08*�Q�d����6��J�����C
���w���E���^���g����L�{����]��������?�`��S��q+=����?�^j@0=S���=/��
:�J����AZ����v�������E��{��?��,�*_�(�b�lCb-faPPh�po�i�Q�����iCb�������{:�:�!�P��+�d��5=aM���5�������V������u��f��}�xJ��RU���4f��i6W�����:t�g��i�g/��h��8��?�dHL���?,O��
Oi���:
7��.�B�f�%��Nt\�H�,��=�1�=�!��4C��a$/�S���]�����F�RZ����`A�����[vD`jq��v��{VJ3.v}��`�	���^0����k+�r�T������K)���/P:C���C�c��"�����DaMgM��9�]��J4�o7�a�Xv��������]�U+0;�W����k|������"����h���4Q
C��k�����iz��������f;�/����z���\��D�te��h��.�;,��0�+��K=*y�����~AC�Fj�0Qd�l�d��@�`�%�]T~�,��3�o:M�]\����1g��.�����-�����-�a�c
{e�-}*��a�Fb�P6!�37�2�������������1��4���y�>0Al�U�={��><�JK�c�	;��M�Ba;��2���-�x~�����Q�8�,�mi4;����ck|D��g�48 V2X?�����Fz��'<�K���t���gW��K�|�n&t�$�s�[��Bb����i�-}�'sv���tV�<��{���tf:�4�,m��J��#s���4�mo�p�
zT���[$�L���EC���H���V�-�8Rm�5�?~��)��ba�%X�Wi�
A����K��f��Xx��s���(��G{��I�,�(4w/X�x%������ �vY~7K��4�&A���A�PXKk6u��f��!/Ft/'^V��]D/��7QPc���{��������m��J���
��HFj�/k�������V�g�������}/��^�G�U�����5v����n�� +v}.��^,:j�������`AZX!*z������X���Y&S�]���,���<}i.�yX���>W��syzL����Vtg�S��
�2�����B'k�1w
��p[}7w��4� �0.��������`�J��}�NQ������aeG��1A�����jy���]�e%Kb��$�e���)����[f=�Q�1��Gj��)��iK:��b��Z<E�P�Q��z��(�^b��q|����^���,r|1�c�0���i�v�X.�C���'�S�"��l�N
v�(�2�j����&��0R{O��5���
��'B��	Yf-ab{�}��B���E��Q�J�}e�T����>�tY1�b����l�/�+����@�;�~n-r��}g-h�<�r
�Z$_��z��/$_L Y4,\�X2R�(��^�*�>�Ksw�q��A
�h���uzLo�LY�t��c�c��
�fA��lg
8b'� 6��Z�?����X���
�{�r{��p�ey�|K�Ks�����]�_���W�����W�w�y����c��a��l����r����9i$�RA����4T;L�@tO�������g�4�l{d���
�uW�S��������7g��+z����\��ZB8;X�����m���3II�Z0/����\W�����&�_x���\
�`\!���_`+�C��^L��4k��X�����w������2-1�����])	txL��^L#V4�$����5:������|�������h��o�]x��Bo�e���)���i�@�A���/��Q���,�d
�Lk�|6k�^�nG���)��I}�D�.K��\EOX���Y�`��^�f,|A�+�E�:x�"++����e�+k��E�8j�,@v��*R��,�{����sY����{�6�;s��C��8���/�<���l�a�iHp4��
�fN�D����J��E�/��M�HHA7Z,t���4��vk�:�kD�B��e�c���Y#��Y�1�T���@Dw�In�p��e���
D��P���
��_H�10�,�o���HM�d��2�y�7b�������{i�K��-4�_V����y��,WK�_�V@���_T��0� �d�Y�-��pY���="�
�����1��,���eZ����^�GI���^����6������U6�])%�����{E��Djq96�]������������� &�+zW2���`#J��R�i����,Ul�"��a*��R�k����W=��l��X���&�
�Sh=`���������`��i�����Yr�p���jAU��T���RE�J:���|W���I�v;`�Ic��,Z��N^��<�l^
��
�%�Z�Xx����g�I�B]W��R�gP��t����+���n��l���=���O�k/������9�t�=((�
����Q����T�D��P�%�MW�H+Q�$.��Iq�����
(U8z�������kaQZ,P�R$�r����%0���9�=�TRxzL{_L�T��9p���OD�����\�����j�d~iN��l���Jg�EO���G�����7���S��*��j��^LlUt��X���G�Ru�i���0�W��>ds~��o�;=����z���tZS���Yl�1_TtO���������^)�{2�l}T������mm��+��fY��d1E�y���Py����f9N�������r�l��lL�R4�)[��n��l�I}������
l�����3���fi��2M�Y5����u����X��-\��,������T2�V2��B��	y����#6K��goVHe��������, 
������tN�hc�y���l��gcR��a����jQ�v�6����p�o��������l�Y��O�i?�E#L����Q�P�Y���F/�%�f���Z�L�E�d����6��/U��`����%&�=$�����6��*v3�?1K��-\S��O�X���O��O�BWXh��iI���]D��pc��ec���o�U���l��M�t���nJ��f�<�7�"����l�-��B�B����m:Mm|+�����S��gcZ����|��J�g�g�����U��oV�lL��CW���N������Ew���
��cZ�^�"�������P����#���?����1����E���y�������������"�� /���^��r=�0Q)�Uq�[������k�2X����o�������-��E��������D��=�����z>�K��������z�����7+'�Y��G���6V\a����f���D&E���@,,�6#�ba�Il���Y���e���f]��?��Z����Z�KW����v�h�F
K%d�P������)=hxc�Y�X��]���+��A��������+A���w�"�OL�S4k�:�M�A�wB{������<<�
�g��t	�Q����RDa��Z9D7V>g�t�����_d}��S��e��]��������Y��g$
���.��Q�����1�z1�H�w���YU�1��t���&�E����4f�����F����'x
�f��b7����%��������D�t�"T���Yh����B�b;���5����Y����H;��so���^4����T�|�7X��(�h�-4�4M�h���f�F�$M��{L����z�b�J��.���7
Xxt���=;`�:�������f�����IVl:�����
�[��053����x��`���a)�$a�SR��r��]��,E���������+OC�&	k�E���V�u�7I�j��KAd-`B)���x1���k)Bxm�������>�$���r���[t��7vl�6<�K�s���G�n���\�������]�"�m��d5jx�JC�y���B�
�����M����h�0=�Hr�)�����'S'�
W&4(6X���/��	�cF���/�HQ8�Y����:$�9�%�����n�t�:�
������Z�������`w��}�������Zk������u�#=*�H�^�-:ACU/��R}a�F�1*����X�Uo���GZ��C�b*�9���+<I��5��s��S"
���`�S��h�X�AO ��V�h.�.99M���|Dwu�ex�	v��k1lL�P��^��~���fSs:���B��	������0��Q�eLc�g�`�]����+��MC	�-��6f���d�D�PSf�o���P��0D���2�XI�0��O�i���+^��<�
�q3c���z~����*B�}���������2�f���s��T��`��������s���(V)+��faY����K�o��$J��PD#b���n�\�ou���fTU���+���'����S>�O����~#�a�����b;�m���j���������}��������:]��K�O&vi~`k���5{*�]Y5{*�T����XV_-4m��nr�&��P�J�_H����bs���6�o�=&�������F�,��5�5k����j�X.�Dg��w���H�,�+���V�b�BO�. {d�m,�+�))6�wx�Vz6����xI���@�i��t�������faL"
i�w�n�����hZ�������E���i8�1���Y�	���E���%��f�ecE����?��|F�wv�b�q�����	���������*�M�e��B�~��1g���4�b��=�Yx�����������St6��Yz�M��S���@l����-lO7.|���d?M�1�����w��M�f?f����+?�1�c���r��^�����M+��#r(����s��i8��V_4]P�Y����^�j�1���|�w���������4+.�y]07k*��������"ur%gi��;.X����y���p������Z��X��hh>-bW%��J}EC���S)�jV*+����X�������/m�0�(�)��K��������&wz���`�>h:9��fY����N<="�^pi#wje������z��S��
�W6o��n��\
5��8J?|����]:~��E�^��M��_��/�)�[��i��6�0]8��Y��Xe�h�`"v'�������_������'+�[i�i���.[�t)l2j���a��	z�m����R`�$��:]Hrt�"�X(:�{��:k�}1}�X�n-�P���?m�*v.���9La�)��9��f}���:���tW�la��L��|��(;�4�"!(��u�p��r���C�e���$�c`B0�Y��9��<�����0���
�c�N�(��
c�`K����6X
8�Zwn��1�hx�����<.\���Y��\�|z��b��T�,���]��I,�Q��A���:j�����0
v0��V!����Y�������o`T�`|(s���Rd�l�E��SP|��y�bE�m���^EOX�6~��\�'�r�{�e���[��)
�.���F�������n���8�
�)S<��(Ku�[}��z��-Y,�=%���l��(�,����"q�������%���q��
B�f!o�9���nj�P� ��"�m��2���
|x���G���dm�p��NA�B��,T���5(��tC��C=t���A�J��M��)YDOX�4����}.����q����j���JW������������}��2K�!�`����jwO�9(�
'6����F�[SK�btV6o-��i�4�l���R�k�����'��/B�S9�T�[����:b>^��^jl����6
�7Z�����G���y�E��|�|�����kV�BE�
� :D�p����Ot�]8
�������p-��	wt�����������,z1���R��U���|���^�������J�C`�p�u~.h�+�0|���(��}��*��p-$��Dq�iJ8���'X�%�0�+��N'O���cx���k=��O;+wv&7&
��a��}��������*���1Ws{~�_�p�������tK$\fbV��)���?J|7�+_x�h\HY|��p�Wj�,n��F4�{���V���7�=O��Q|�����@;}B��J�;:+q���
�/n�f�P��\�O����J���
�[f �>��N�Nlk657X4�u|s!Aocr����'l�\%v�*w��9������:b�d�4c!f,��������L�������D%j�sv�M�0Z�f�e�q+�h;�\s=�������!���"�����K-�������������>}���}z��/zD����_�bb{������Nk���Pl�p:]j�����hx��G���4���*��*�DC?����-b;�Z{\V6a�pln�����q�9���,- �b	X_3K��K_�������BI,<�l�	����_�[�;�od��FX?���)?�-�P�����ID���P�+v��X�k!� ����g����xx,��
�N:�����YY�at|I����VZg�D}���u����^�L�#��A�#�^�n��1+�X���e��`;�_��
G�w+�;3P��������J���wV�(:[���,�(�&y�B_K���V,��O)A;F7�4,��[)>�v�wVP#��#v��X��E���b���������p�p)�
���_�HX��|$�����B�A���3���Uh��V������"]�}�+S��������	���+�
w�����X8;
ER��~X�'z��$��y��BK��Qp�w��;�6
'@�27��*��u�6�����e�`b��{�B�'tVM!z�u��k9��
t����,�
y\�61[xBa:It�8�n�?<f[�
#�`/��,�t��3d�*������J(|<�����`��v$����:�c�5�a����R��K�	����>���"�
�A��a?��	~z��X��hV�.������!��r����)4�a����:�����m:dc���)�`W�y�.�a����jJ
�-�>h���I���"��{b.���:��1
�D������:���EAC���\�R`����WQ�y��~ga��Y�J���J��'t�,������u��
D��P��w�p��D/X���?��O�{�K�'+t�~7]��8�����3��X�0'v����6���p���M,<>�,,�����1���a60h�"v�����t����`��Atf@=��{���qEZ�OG������}\@��*5n�H����:$��R���j�p�>,�3_�i8�K�_x�m����/�f6�]�C5tt#GS����<���D�7V
� v���>!����szD`jU�~�$�ap�������w�]�����3��������T/u�T����'h�H	�9����WT��p�����t������t��a���}��.z�]|�X����e�Boy���������at'�Rc}�{I����X��.�}�.N�i]Rw��=�o-�,��L/z��)X��t������������u4�����^�����o������{zD��`���J|g}�k��a��F���X��q�J����N��6��+QO�9a�q�\��:�K���t�7�6
���b����|gGeub�}�������U�����7���_	�����IO4|����{�R�O������>�(H�K�`���;lf��n}���W�����lN���/z������������������6�B�������.K�n���Or{�mL�[������E7�*����1����?��C6�W��@��������������6��_0�w�;��E�o�#�g/��qai��_1Kf�>�������Y�`l�s�f�o��w��Mg�`/��,���0�l�hA|�@���K���g�����N?��p��`M���0?���}�TGP����o%���Q��A�y���n�Ka�6N���V�}���`G�h�|g*y�W���J����s��4�gIl��3]�TP��AH�7�>��E�rz��$aK�����L���&��V/x��u��y�E�&�`�s���i���Y�o%bAz���A��wK7����e�U���E��4b',W��{ub+�f��s��q8M��]��T�M����E��sG�s�}��9�1�K�������:a�s�t�,X�3�}!���A�.�.��������gbov�bs���6/�&��S��\�x�����~����~���{���h��\h����K�N��p�������:
7=|�&v��e����"?������,z����B�fX�<X��4[���Y��l�8���m��b�b��f	��'�e����`o��|.�	X��,���e��`o8���|���L�%N<����,��.|+-��^Q��Ug����G�f�MfY�����?=^�lKPtc��b�9n��,N?���V*��=��,�):P��w'�"|���vzB���FWtnv?
�(�>�k���6��s��H'�U�"���wXh�Y<Wo��{��w��{��&��L����(����M=���P�������}�
�a+^�a%�`�U�7��{���B[�>)�}zD���pQ��f��p�b���|�,4���!��6��G�
&���,�/�b�M_3k������x����m��o�c �*z����p��X_�hx��Xxd��M/��6���m�~C���N=.k�;�vYx�������n�-%N��n���l+�H�}�����pQ�&>������eLl�_Z�[�v{^���.���]���DCU�X��"���QSu�&�7����:
�����1����J��� �����A_����`�i�bo�Q.��,���U���0�[��ou0��h���|��$u+�E�L0��*{���I�`'|��V��V�8�
��bo�Id��p:�����t{���!����"���7v
����	���^�R�#��{���Y,MI�*s�i�9U������e��&z��mb+]�j�����'�B6�0�.��&���*�����n��������c�=ne��:](��X���J�u���N���)�
�B��hQ
`��������A_�R��uC���Vl���a��`�����4re���.q���m���M}C'a�7!��������1���	.�.��
�,v�<������)}E��+�	�u���4��k�]���y<�A4,�.����������>����l���-�g%��UC�b!j����T��K-�4,�DUa��5���m)L=����&���f�h��7������W�[i���M	�a5��I��?���'WO+-�N���"�|������b�`a���Vj�9=^��0�4,�
���������j��a15-��?l(K.
�7����S���W��N��Q*���J��pSa��T�c!�e���������T��k��V�j-���!h������hK(�7,�4��MaX�$6�
�K� :�i|.��d��]�t�������fOu��-��v0���
�>]s���ziZ�$W3���m���n^G�^m��G����E�����Lun�Ku$�����������f������0[��Qi���x����)T��%[������n=X�d�)������/6
WPb+������0\�������]z^��r�p��E������a����pr��E�Zd�-�82l���;l�����>���I��	�����h=��B�GrDx�*Y�?P]����m�f�&���	E���R��+^5M����j�[�,���6	������5$��j<�B�i-u�?���rVKXtA�9l��,-z�y:�
S�b��t���`F_Vj�r�Y�m�M���m:r����C�S����],���z�����k6��5�7�iN����Z���
)
k��Z4��
��$X�ClE#k����Ao��'�5���*)YK���e����w�&���������uI,��]I�Z
=�Zt>��;�
��i��d�f��m(zd���<s����S�N����E����B��bu���+�W�`�i�4l��X�������B�Y��K�=�i��Ht������&���H��x��)h��=Y-���R����������o�Y��]l4�6����'�����)�/�����������Xl��kZX�?"������>������_u��eZ:��
p��C]�.��������(*.����s�.�A ���?-;��}N5��m�6,����j.�[y��`�(�9��[QL[�'+�2
�O�Y~N�,�3����Y�Eo��EQr*!8]�c>�,7
��`W
mO�������V��E�R��4�
�i]���K=at&/5�A�]�n�i��������Rc���;���'IV,��dn�����<O�~}1+�G.\���� :�6��}��=��I]3L��:����K=Y���<�~goV�&��W"���v�vK���D��w��@�^j�}e� g��RC{�h��+jD�^�ZD�
�k�a�,�}�PZ)��*�VKO��0
3�����j��
����U�bW��uZJ=Y=���L��>l+Tl�<��C �lf:����s��1�/������O�f>*�y;���@1������n����Y�]yi������TP�[��!�����w%�o�d�	��B)��I����h������_s�"���Yz��(�&�d��3�~;U�r��������2�����<�3��iXcl���.��sg��L��{�&
_se��(`��h��)��;1-�0�@��.�E��N�������A��P����bS9��6=K�Jt��/�p�
����n�
��f�;=]��,e&�N%\�Ku@��AO&"�b��Yl�Qp�����u�:�E��
����B�����,���t�i��.&h�%�j������m������u�I/5��a�l���rK���.�p�u%�����������i�ua�k=4~��f��a�>X�������i�����A�c���V��^�Nk�'�5	j2�.��Tgg{�$N���5��:�
>��];b+�w��'�y��^itv�F�V�K�s��)L>=^G�t�jF�i�����x=�0��P>#�����7T��%�������te5=�wGz�J^��dh{}�hM,��M�If>k�'������Zb��7a�������	�b�X��*��+�����'Xv'N_����t�c�{X4\�LuX�_��`�K�|��=���	)�Y����%�VO��4�7��T,����~��a��6-�s�DwfW4K_@]u�%����,�F|��D����'��r����d���)I3�hj\�$�bn"�w�<�i9��y���v6ikd�
v�&8]3\�H�]Y�Y,=��o������h����+uIZO8���k�`S��t�R��Z��L��YSkJ�\����Ku����a�t-,�K���42Z�=a\t���RpW�������"hx^���!�F�	?s���e����7��w�W�I,�����h���{l��d�J��>���a[j����|�[�[i��G{2-�������J]5�"zA�T�-���zB�P���@��v�t�'`I�hz?��������A��}�G���+�o��Ku�A�����=|�W�b�|M;�'���6.��j�K?@1.��~�k�L
���wV�+�E�o[��K�{��~�����*<UK�'�Z����S�R�`/$��T=[�=a�)���������$��+[����'������J==^�@Lj-�������-�.-���+2h��v����
��#=O����X��p�# v���T��65��'������������uB��J��5��:�.�Z�MK7E��4��	Q�w�$��VV��qx^�i�T�
=g�2����8\D_)�?
w{8��1�����B1��$z1I������b+g=-���J���$b�VBl��<���m� �4�r��-0b��������#�~D��*������-���|�^�)w����w}��@���~+U��Y�xX��
���y+W8=�����'����0����Y��p�N(+��vD�����V�MI�\��]V5�*���j������t��D��~5|���E��������B���y1W��Q8\z����h�X�%�*�
/;�S�����#��g��`<nziO��S3��`qig������C�O����K�^���#�.�kA��,a �P����^��X4����H�w��oV'���
������WtcJ7�P�)��|����d��g~go���g��n�A���i����&��-6����J������|��f����e��b"o��5o3��J{1���|��w��bF��C��Z��=�����f;b;}gu�+�iFI4\9[(:X��/��g�)��^���t����{�y�H�pV���.�w-���D4<lA,�3E�kY6�/���Z���E�:�O��H���D�:4����Ku�	�0�l�piY�M���^L�'vd��2��m�B�L�$�����2�e#�������v���Q�Yi�u����������	�E�Z��,,�{�p�7k}�+�.�/��,�9�7�c�p��?�v�*�@Gm���4�ml��+����/�I��e���,X���������^��/�]�c:j���.E{!����$4M�;X���
�Z����N���4{�N�9j��Z�p����7�t����)]4�K�m��M,<5�o��_�!�M��e�v�+v����.���@��r�6�/��Ms��������Z�
��}11�Xh���������#��
�|rK��`H���^C���E&�}�]����tN�Z��#�Yp���,����[�)�?="�@�)������oB�^��9{�a��hN^pM<����V��-�^�J%��OH���P4����kQ%����C��Qk������;�t�����N�����;{������;f-�bw����o(�
S���	��[}G��6�~z���ab%����W�0nV`n��u�;)z���`w�}�.��1����
b��,���0+<�n�O�~;(�;�]�/�I_0"���~��uoo'�n�a&S���0�v��J�9)p�MG�0%�8�����4�������!?�JY��to�7��wv�������|�������TX=ajI�vN�����U�>�s����9K�q�hF�;��N���&_Y6�/O��_��[�Y�`i
D�v�����~1��hx�������^��6��#�������:����r���w���M��j��Q��0EX�+=a2"X�\������3�����+,�,�_L>%��af�:]_�`�m��Tt�p&v%)��9�g�D����4��[f=~`+�#�/���t�!����#�����`����9�cfw��~����E�fwh�}��^�����������p���
,h��,��	����`G�u�,v_�e�rv6hd������e��2�N��s3l�
�fBo��3����&=G�q8+/�c1�Y�([���}���,U�5�=��-V�t�R����`�"�)�"��/��p��YXol^��n��S����h+�\W}��H$r`��(�S�M��8���c��`�)XZl��eK��_��3f�l��@+�� �9M�,���<��g�����%����a�����/���q��	�����>")>��ZZ�B�gG���-M'�"h��5����zD���V���/��F�\Wr��G�&�$��+2���~�Vi!�`���;��W�am_�s.z���`i�q���!P*�"�P��Xs��n?
'�����tk��9
������Ro_*
�L�=T��M�bad�qY�����J�X��0���|�w�����e1���}����t��	���M��V$6�*��W�����'���P��dK���������}f��^���tx��h��'v�b��-���Z{��`��z|DwV+6�'��m���c9����D7������M�����k�so���������7����-
��%��K�q��j��)v�T���/����#~�6�?0��.�>���t������;����KuP�<�������R�2'�X�N[X�YD��Ft����u�� 
������Zw�'�Q/�����9�}�0���2�9�`m��a+���S�7���.�H�^�hX�+v�����Fl����v����DV�d�u�-�D�X������E����1a���b���M"��
-��?6��c�EC�����,��,���k�
��@�,m<���:��A������u��v	Ms���)L�=��R$v��I��`(�.�?=^Gk0?t�)�[^P��"�c~6_3��	6�{vz�����^�Mg�];���E�D��t�����Nw��F���~��|��sg�`�)1��AB��b���i�EC[��Y�d���w�q��*�o���������b;L5�Y9����Eo�����(�i�MW^�10�/�8	�p�%N@R��ME)����Zu�����Uy��k���%oV�����NO�Q� =��&�Y��|�UX�����v���uFY���\yz�����'�������?���W��l�`���B��x�k����,���
�*?V����E_�k[�
K#����������zx,�h8y:��z���l��G\}.d����*`=]��E���j^������2��%���5�U�1G�0/�uOe8�O�c�}�;^��S_�^�����D)b���}x���?���}�x52��J���o
��r��Z�M�U���0�4t
O�om�����/�����`G�6������D���G.\�C/�n=��,<��W
C�!%)��K~_Y�Y~�0���J����}�
~���M���2�8���.��EWlOUS�KuK����6�F������i6�gV�V�wGmputK�>��,8��Y�
������.���:=�K+9:�{UJz,V�.�T��Re(�r�)�����Tg'�IJS����m:����r��[�8[5�����a�\,��[*&���V-����w��3�'�����i)tn7�8��)y�s���e��G��K��+,B���*��v3?0Q)73\�����[_�H�%*G��>!9}8�`�����}]o�#��C���db,�w6?0�t�s���6���������b7�YGYq�|���&��n��5^��OW��n]I8�j�������?�#f:M�������n�
r$Wvy�9~��Xt�?�(�-���9~��S���n�
�E�.���|���Yi>���������`��V,{���_�`+K=vX�S�D�.��@����L���A/X�������!����w�qO�����Bt�Z�]u�-�n��4�����**>��p��mM��W�a�B|��*�t����mX�
�
�����)��MGp?M����;g�04X�����D�D�0���L���M�M�t�l5,���X�����'M�nL���cE��)��|�_kN��i�i�MC�J���p[7���;L��j!�u��<p�W*�=
���
O��������C��J���� -��4@�t�����`K����>p�C�������iE�0�&��[�����n���v����X��
%�bo�a���`�	-z��$��j�me�f�`�i1t�y4���"���m�(�Y=�hh��1�^?�Y_yzB�O��Y�.v���B������2��+���o9.��x�-�����P�-z0���?�D��S�t��o�]�MR�m�LD��e���|��w�{�p[��V��
?����&��g���s��9�`{2�a_���;]�C	&�=���,�<n�Ki���h��l�d�l�0�m��f�3�E��s�����;}h�J��6�E_��J�M����������NfI�:��U��n��p�CB�f5bo��(�����v���
.��e�Ibo���Yb�l��n���������qS���T/�na�c[����%����b��4s��K�RYp+�k�h7�������� �t�(���4���e
�bs��t�d���i�LbF%�x�:���1\=%��r�����[A*�-K�;����q[�a����n�G�m����G�xt����g�4���^�����
s.��'���c�G6�	�\(��6��V������ �|��wv��d�������������YKE/&"{�Y+�Q8Tc[���.�4��;K� ��L=*��Du���^p-�^�,N��3;\�����<�3����*��R
����{X��&�R����)���ibb;����j�/��Y9��,�V�����
'�(��:��]]Iw�=
�N��*���>��m������=="����������p���5�k����m�fP����4�C�i�b��b;���
/�oD��������"��l��+]�2�
c��5�fY��YV��;.�����.6E��K�0���,(�>�^l+=^�OL *�1��X��������-����n��) ����m����u�`����`\�I
n��g��5���X�������,_���S�� ���n��3
K|���r�]?���$����NO�Q*k"�`T�T�KyZ8�h[[���T��Uo�O�������~S����::�UoA7�s��BaA�n�U5��v����P�7�j
v�e��R��"��i��<��S�����������\���5�������aS�����_,����lV�-�r�8\��*;�v���ZE����,�v���.<|05�[=�w�������m�-��i�~z���`H"�M�kT��,��>���E����JA������p�����`����V�.\��:����;Kw�]��y�MG105U�
^�������:���	:������`��B����&����l����+����X�g���UH�J��n~����U��v���53����~,����	�����4�c��
��	��,���b��4n�K�_��4�J��E���N<.�������b���}=K
���}�i3�d�������t���`[���
n�}�}�`}����N��
fh��H&����Zw�����Gd0�7�����}�28�p����=���km7��(�O�i���������b����L�X�d*	p�_8=^G_0�t��K��Sl�E���|M�m��p�����4��=r�����~�^��O�����������,,{t���b�Zt�{o��~{��@���.��d�&�S�*���7��~8�P��s4K���pGA�a�4��}ru���]�VZ����?,:������=�������3�	wA4n�����
{�D���i8G#��8���E�����x��F������a�:����t����<t>��;;`�5�<��9�BN���+,.�4�w�v�On��g���#�x�._*y2�;2��-H���/������4\�p��a�����:�������64�v�E}�(� ��s'���>c���.�A�u5;�������p���	_�Yj)�,Gff��~�b���<���R����tQ|G���K���l�#�[M����p�'HT��G��&�W�E���4��2��7���B��D�wL��q�����ieJL?y���������*��cQ���UO��<���S�W����~���x�BU��'�5��8]��8d�5��zO�y�B���O����y�(ej��S���i�������_��m�����\��4��0KV�KQ��+m��C�r
�~��e�F�������p��1���4+�3[���8$@%��J���Q��������i'��t��;�y��;�`�,�B0[8}���	��L�������D����������/:c�����Z������|��7t�5�
�d6���.�a*L��6:���I�b~�e�8^�U[��Fs������;���OH:e����v�3,�\6�55������~��?����6]�z�8~B[�4�c6��c�F��f���fG�{�?�pS���b+���m����F
`�i\T7a6gLN��1R���[���	P���Jq�F��^�v��lR|V�������,�����Ku@A��H@�7!v�����?����lb���AwA�Qu��W��6T�d.J-D��A�f�^��l�y�����%���}?����
iL����;�A_�7\���R
�����o�T }zB�`#�0��5rJ��.���}!��Yv����������#r����4LS{Wv�����OL3;��|���R��9��@��t���zz8��?�!K��`j�0�=���t��\�����l�+NW�P��������
���Tc��tD���;��{��\	b�+�"��>]��J��p���o�����c6�v�MG1Hk:�!��s$��D�/�
��J��k8"�_��&A��f����a��
75eL����8�A�T��������d=-�j��#�^�E�����M_��mNG@p�M�R��0��O�p�;����?]re�f:��_������=!O��	�g��P����w��OH�jz�i,�6�I��Z�����2��@p;��S���`�,S��]3L\��+������M��`o�<
�������.V���$��cM�S(G,}�"�w������v�D��7�������HudVa4����KjZX�`)n��s�7
��O����,���a���p��!�v�^~g�e������t���`�"�?�v�.��f]u��=8���H�k������$fi+��p������<x��������K�Ekm;p��������@+�������Y��}0��F4Q�`,GHk��S��y\�N��8�����tJP�~g����Nw����i����.�[!�,|wc���i�J�����eM��GO�����Z����8���Gm���v��9�������0S�
#��-�U	�G��T4L*K�
W�����z���C,��`�?�����2�����L]l��q���AoX>)�-�d��[c���O�m��k��n��8���v�9S�w�i����NIO��8��(���>�`��{txya��!��if�������`��t����,w��h�����[����:Z���A�&�`',0�:R��9T`+m��Q*L���vn�_I9\����R��0hZi,���E�%"��H�-=`�~-v���������[����Qa8�'w
�����:V�i��;�{Db
NN��8�M�:Y���7�p�F��]�����]��
�lkIh����|�����*Jlg�_u���t|������xd�t�s���fY���� ��,v�X�Ktg1�Y��;
������wqY���I���z�R��33�xE?&��'c��o�����,k �U���YwzD��E�����la-����7.����*��/��/&���x���g��?��6�~gs����n?\8�b6�%�o��~g;�9���-�o
����,��6��J�ig8;��t
�N�9�c���j����k�q��b����*c�����XB�4+\{����N#��]����D36���M����e��g�K5��R'==�,�c�t���;���P���q��*�e�]0�l�S�������Vb%���p������
����t���`���s���t@�
�E7&g;�������`�BU�ec����E����?�������7����b��m������m,o�k�S�L���.��am��<�wv������X�
�qS'���:��9��2��2�b�p���(��{��/��s����������������X�n��"}U��V��l/TQ^Vw��)?��L����|Jb��[JvY7~1���QS�{D�N�[�j�lH�X��eS9|B�;���/V�%^����R�V���q
���D$Qy%�ba��������;`,����<="G"p��
�
��6����t�
�D��#�U��]5�����=�k1��/���G����)�'*O|#b���������p_>�������;����G�`�H�^����G�`�L�Pnm���?|Z���r�'���)�E�������XZ�J|i����p��Q����*eWg��bsF����1%����;
��
~x����/O$r`�MWM���kb/[���������3R`�K$1��\�Y���b�(�Y���qT���bwe��R����p�;�VYZ�~1��h(+KS������6>����a�N�#����Rwx���n�hd>l^%����L�M+_�t/��-u�`=Q�����������|��d��M�b6y�� F��W�`�a(���w���m�`�g�0n%�e5��|?t�p8g��i��P8�f�`��)y�������g������:&����l�
���]4��	6�xzB'`
QtZ�������vi�a&G�������nj���:�4��f�����)��/D���l���\J^y�����}�a�J�0t�9+�V8
��A;��N4Fo���b��E�����p*h��������B�c������7�2��6��\|�Bl�A�5��/�/�EPo��������KG����t���Y�E�\���dl���:VVhfQ;R���RN����@��J,�K2[yyN���'L�{���a�S��p<�e���/��U!�	��4.}{��(�@�`���h��b�6�i\���P�i�6vw�slDX%����r���29�+I}{�/�&D�
L@���m�j
��.�����3��	��;��of,��7?��R���9��+I��
I��XZSm�ya����~r���Y��px���
���R?����t��T��
���M�����Dw7�t����2��Ht�l$:���`�1J,�y��V�g���u�����la`�9-�	��e��+�V�s��
�`{�t�������n0m'K:��E9Pa�m��7)E��w���(�-�r���G����T�u�_����NCY�+�+�/���bv�K�^�U[�~AW�����p)�\�p�M���Rc�f�42q���`{������G=�JY,���+�-�[�5w�I��I�`��4�����rj���c�l��������,��?[O�px�e�y>
��p���"�\�o�8��������[��w�p"�e�x6\MGr�����h������M����u�w�MWb�O��$��B��=�m�yv�N4K�'����Y�����b�f�z�aK�X��$v�/���v�4(���7�`=Y|����Z�b���[����n��jwx��m�:��-��W
_��V!ynx8�7T+Z��0=�+E���,�-��E��m�9<�n,)v8����Z,���-�����L~!z���?�U���p4�m���r���>���%+��I,��Y����7�.	�
k�o��(�3=�X��b�P�x[W~3��?@����C,<�Ylg�3bg�|��~�����}[�~��"�P;��
���7�ED��j�����F_��M1���4���:jc�Z���X,]���G@�6��lMtg{�b� D,<����:������m3|6G�����Y������&��t�������h�` j���VG�����m����6�|4�����kO��Y����
8���T&�}�<�F���/o�����r��E�7N1.��If_�V�
�$���\,�ml/El^����c����
=
��bAW:�n;�o��=�D/���c���o��T�rzB�a`t����Y�w�TG^l�Yt�Gr��~�}x������7���O��nV��������?�n����uH#`9����]|s������2�]�7s���K\�����q���m�4C4���a���7�n����������c�
:g���f}�l.���v[R����C &�Mw����+s��'�P�ZX�Z:~�\b��~h����wtT��l����)��L	c��D�X. 6�j�j��
)����U�����pQ
�����~y�FM��J2�����"$�1�,�|����;e�OO��'�^p�����j��m:"��~���!��Hg
���2��uI���A�
Fj������;$v%yc�5<lL���<��>Q��mI��o�s���Ra�O���8���5�Ve1c�
�AoXx"�>�������Q5U��
����hX,e�7���� Nw�P�������@i
R���
VJ;S��tf���7,���V�K9^�;�V���OT4��
��,��d��erT��6PN��1*�Z�b&�Gk���>��Wz�J������E��I���7�u�?\r���V��c���|��}~�T��08	:+I��0'�����W%��Pz�E�j���+laYf+<�z�������%��'X�,�W�������9+S��at"�>���:��0�Z�3��h��3�`;�m�`/��V%���9Y4�R	4+�����l���Z��
D7� 0�!���<��#\�Q4M6�S>�t��4�nw�-}MN�9l����MY���N��i��J~����=a��4�0� �R�l��<��K{�oX�4<��,��������=%�f����:�`�~����>6��p/W��/v�������������J��-�7�r�Q��#c6�H��;%�N���+��X��G,��
�_qvV��#��=+
����M����`i��R�_!���:�E�5�������Z��,�?=[�0L�.����.��5����`���������b�q���\"�MG?p[4hZ���;�7�n���G��`��X�?�������y,�V�v��pW*�V���v������z4��o��^���fI�])����YA/����p������a[(�Q8�������A���A�m����>L�-6��~z��c�p���~8���]Z6N_�0�2���u�M�"��r�\6�e?�}aO�T�lV	�0��Q~Cu�\���];�o�Y�����S��
�t�C`�%�����(��Yr�C���Y�]���.�n@�3_��:U^"G{p�
z�	,�V�Q�+���&A��2��%j�p�����r�G'�����p�g���]:��{���y(�x`���:����m6�����.�c�U����EoV�"�s�66��������Go������+\l�������k!WD��0�qS"�t���	�"�)v���U����[de��YQ��.�h�!�����-������E��g!��,o�[�p������E#v���m������jC��8���=�l�����"�CQ�\(Vj�v7��)�8!6K�O����'������|Ml�X�f�wc�����fvcKa�kPO�;�-��nX�+�b�b�
Ml�������ZL4,���U��LT��R����l~�6V��0��l�U�b��I�yzD��Xa����<�v�� v�UQ��p_�����(hx��B*l�7������������.�����a_�X�I#6��X���B�y��v����r�=;�Y�}�M^��Ht��~g}�����C
�xDC���~f�Ku��|��\,��:��{�M�����+��P����������7�i8��L�c/�z+O������vJ�Q&!��GPbO�����\L�]�p�l�oi�u�9���\��Ngx����v�<��`��b{J����W����&,�P�,v�=��mz~e>h��>�;�
*��bh����S�[��T=G����j�)o�����j;��BV� �U*&��p�E���=���������i���X�����S�s���i���E��#�r�y�\z6D��
6��.�;�N����c=2�I������*�D��G��������X��v����x�PK4k�;`0l.8��
�f�a��(�v0[��� uk6;7�2�a�!������Ku@swAw��&� $v����8M��G����Z�nE���1���6�O�9���Aw�1��+�a��h7;aj<Xh0���2��SO���:b�a������ZG]��
F�����8��c��1/���2�����l�9�����N^�.�vr�>�6���������$b�l�+��;�;
'�4kek������k������*�O����8=^�p�KN��
[�j�����7s*���#"[a����~^�oY��l��-�w�hM���#r8�z�E7�0~g�y��9�>=!G@L�#z�m�`w%�j�i>u��p�gw"�,�/Q��U>�S��lv�6�(���.�U)6��O��8�5�����B��X��a�h�����+�`�W��iY��}u�VD��>��|��+'`6;is��p!$)�������3�I��1��
�`.��1��fx�p~����.���u������Y���a�o�0'XJK���;\�[ho3�������#r�w�����s0����b��Elc�5����:����
`���0�����dl��T�����E=]��	X��TC
+��0�;;�Kw�$��d;,�mL���ta8�O�NE^Z8E
)����~�����,�
�Wj��xm�3(h���\�|C,,�
67�����������������������g���fO+������*�Gm���t,C���=������*��9aS��'�D8
�������r��0���p���A^����$����R�VJ��mLIk~0��Iz��R	���
�������>�\l>Z�;�`�e�3�0N��!,_�X^it����X�������F�<�|."'X����g����M���S�.n=r!��1���C6�p��VW]I�YKK�'ii�\-��E��#�������+?k|L�+�r�{���1����9����Y��
�����;�S�ba1�E���MuzD�`�L�#}���p�r���X�o�]+�%,v:������.V����&�X�� 67����m��v�&�X���Y�qY��-���2��
=E�c���$�gp����rq������,	�q!f�����7�l"��bW,�k�
��n#.l��K����E�X�;�3�j�*_�������?��������.���j��n{pg;F�Y�W�d������[��<Xt����>lP�E���e)b{�0�n�qg5,��Q#�e������%w:\���ig���u����[(��4�m����x_E�]Hbt��^���j������E�.l�u�;S�����em){{�T���2���l�k���9I�e8mk�B�i�����k�#-%O�9\d	_��R��[XAZ<�+�>y��y����������Yl/�����0�4�BJ��:���0l�-�������Gl0{��f{���Q���	�;/z�������Y{��U����L,��	C
��4<,�H��[�Dl��,z�b$�fye-�U������h@��e��7!*����~�O�#�������4��	��%�.I42�	v��}�w��:="G@�5Z4���^�a\�8����s���u����6g�P������^]t,|g��n��q�\�~+6K��=��p'��� +5�`�`l����h���8\�i���+�t��>k�6M��52����
��`SvzB5aInz�:n��}w��rm����#v�
�n�weNr�K-��]lg�fb��S,�����2�vw�D���������1�7��0�������O��6\�7Lv�k�����]:�c�D�0��u�)|�1.L�Ju���P��x���4�,���>0q�q+[w����=`J�+z���=�n�t���n�����T�x�M�@��M�d.���;�����pKO�p�e�r�����X�+v�.����Mk*;?�],��:?�Ml����t���\4�M����;��-��t��z�D��	A����,��i���zQ����0\�%����mI�9���]o���Y�� ~4u���F��;�����Yu����
n�i`�y�a����up�����s��ba[�a���
��`s�y�TG1�hA������}�bj�� 6��wG����tH����\�;����R=�����o��DLPyy�+�0a���Wi�a�[�Y�v�M��0��\�)�������]0���M=,���Y�����������������*	Z[�;�����e�S���w�J��F�����'�����g%�5W�f��;�x�:��0��	������<����|^�2��<1��\T��������w�
�qk���P4l?�CF�R��� �]�^t�������QVh�3����+LKG
��`7�Z?T��e��WA)�����A����ow��te�&�C��Lg-Ul��H�[�M���U
:q���I?�m5�����Zh6�.\9!	v�s������G����Fz���� �[���A;k�?�:[x���������^�����ny�����]X���a?��p���A����j�����O���Ng�b����V8��c��
��������}�6�������E��;���n��G#'
��R���,9��uP,-6��������y�E�V�`+-�o�c�Eg��wv���BT>n�)������x,�w6�Eh
�*<��E�.�{�>'a�����<�R��������S�?���-��-����6h��gi8��H�]�4���3}�h��������0�*v�;����x/2m�h���r�W4.l����vd������u��_���mJxPy0�O��`t���`���~��'�X&=�n�D,l���M	���Y_�+��6�wfX}��l���}g��6���f����_.hx���Z3t�p��q+�A��iB ����v����n�-��������f�
E�Jy����Bl=������������zX�>��D�d/���>�������l��>=����b\�73�e��ba���Z�|���zz����6�g�>��d�\�����MFqzD�m2�����bYF�]�����p�T4�)�],�.�f	�[���������E��"8���W�d_s*!;=���~5U�+���=�<�g�7�q����9g]9l�X��G�����|�=���|�\�����f�w��p���p���|�.?��@[����l+�bQ4l����e�����6>�I���]��q��B����W��C���S�q�)$v�b�?�{�lXW>X�i�21[Y.Xu>X�W�b�ba������9�Ip�4�������M'�qS}zB���)3V�!v����Rmvl+F4�z
���pP����]�f�w��5��~Q������D�DR�0�#�;���
��b��J�OO�1+
w�=rJ=�.�q3��l��#���T\���w��h���=\�:����^(L���y��0�Yy���v�i8���y��_�PYo���f=="�0>��Fn��B����I>rV�B�a�<~Wc���~��0�
���������lA�B���~�PS�F��?�+u����E7�i�������:-O�9�`�H�G%ed���in���,<�L,M�h\8y�6^��
��D4�����>����J�Eg��i8�Up�����z0��i�{W~�VY��=+
vJVMh����c��?l8y*���
�s����@[�p�a���eIA�����������L����]obi�V�[�m�q��-���K�pg$�l~����r����sX�<�$Y��U��$��T��fz\X��UV\�4xffF�.��:f�Vb�����tH�(�N���(V�0����C�����I�LL4��b�wM�)�q������q4� ����+����%$9�� X�4]��i�9[I��V�2�{U6��mc��rR,\q[�������<�~]��K��P�
��}�b�	xb'������������3�M0|��G���e�b�j���x�'=`qZ�tl����p����6���p���]5\?��
c��T�zz���#�Y�mp�l���a5[���|�E����������t���`#A���)��RQ���j
��������K����9�9������C
����N��A*�
}���Z�W�8��S�������~���+������=��p���J�Lv�7n�9j��T|D�X���������BbSpz�MG@L�-:�|��\�-uK�g��^���V�,�����.�5,�pM4<�\l�(:]��uX���
�j������Y�=�Fa�7,�[c���M���-�����,�f����zX�Wvz��`�r���&���A��mX�[���|{@�R>��\��6l��Olav�������f�i80),�5{���D�n�)�(�Sx@`�_��>�`a���0�-U��C6�z���������J��
�~����0�;}N���
��=j�?���`�Ble�g��`m���N,�$��
w��m��6�����~K�
�m�vXx�;�ARw����u�C���a���[YA��j��#��K
1�=��	AO�	�VJ{�rZ�k�t������4e���l�0;t�O5F�}��o���`w
�N���h�

S,��S
kD%�����Q��Hkl���\����`��d=,�t���`��p>�:��F��1Y�y�{{0�����,�0���k{��*^�4�I�]Y�ZF��?�W�����t����f��Rb�u>���p���%��RC��aiP�0e�a���?�i��dU{���/���-T�Ok�������)��N�����T�E}���XXpc��C6����#2�u����
��*���.y�X�6QO���Ya��U���6BO�����G���X��Xh����N��'SQ�nl�#����|Xa\6}��)Sxz���~�F�Rk��R_*|2Q���b��Mh�V��>��Sl/8z��0Z�����������V��z�#�����d���G)v!��/��0N
6/��������=�qY�dE�b����Ku�	�^A����s����o8��
��v�^�%�H������
�b�/P,,X3[	����l�M��j��F�_����/����{�
e�����B������q�*
�i��`sv�
��;.<!�^L�i���2���,�(�r����z�x"hX�'�be)ba���mty�B����(/�~E42S[�����}�~���0����z���evG�������n��h�8��'�[��9�&�����)����N�yZ�9	������:������z�E���N�y�d���7�W7�
��T�r�M�'3��Y���\�{�T���GP�
A�.�>#��p�.���*���'L�4~����u
��'\�n��:�;��W��I�Mx���j�Z��ZD��2X���U���mzb�{CA��a��z��Z_D7����?��p$��z�}���vL������?M��PX�f
�����}�������o[%��F�y�&-����*�pv��{������c����A��q�� ��%��9=������zVD/�
�n�;a�����8>az�k����c��d�q�0X���y��[y��V���
S�v�G4����-xvO��}�\�����*�������:="�"��-:{�O�9a���ib�x"�����(��vp�������I�@�S�����_���im�d�����Kl���2�BHk���%Ur��
�I_������M_��,G��GE��(&���k�
�����u��5�����?|��[0��e��Bw��iZ�����S�.|�'=�Hhe�s�70���gr����z�:)�����5�n�]9�|Z�=aB�P$���Sq��.���L� :{�������I�9�,���.X�8u\(���oi��
�3����z�YtO���l�
��OB�6���M_p�MG��1���-imxVa.�V�d@l�a�
n��3
?_��<���:a����0��B�Ku<�|��+�yr���h���W���ybgnh��@f��{��^i����oN�y���AKc~��;����w���p�x�:�������&�8��'
�U:�EN������i�x
�����G�q+?bO80�[�s`��`7s;��[�Vl���P�C��f�C���OS]�����W��Eg,L��
0������fS���t�da�
&_��a�#)5}w_OH��>��H��'�R|t�{�b����J�B��Vj(NM�5r%��iy����+q�U��M'�
�/�i�(����eK��
t2-W��mZ���<mZ����*1�%OX-/�q�N��s$�����g.Bhx�d
Q��2�M���u7���?����V]5g����9��O��q��
s���>�`��i�6U�+�#+�'�L��(X�{��GS���LK���.U)�^������������6KO�w,�����y���L�)Qr���Hy
�Bs��V�h��5zD���Q
���k�/
��9���&��C,���
��$�]8�lZL����+>
��`��`�t-l���PJ��P�,���u�Rg�0����=��v�i�U����-t�/��S�l/�J���R/_*�]��"Fl�l�e�/,���������L�%6G�������^L;l�{~mY��X�����<r��_*�F����Y���/%��-��&����D�=���/D�-�T��{��Y6�.��Uu���:b�K���<����u�nr�&��*������|�l�Q,,>�ug��k�b2\��YRlc{�b��SgY����Ftg�Qb�/�����)iEoV&v���X�B�a�x�	��t:���hX� v���
��5��^�Y,~�����E_@��CE���x������Ku�'����~�1���nlM,T>���"1n�+�����E�n3_���L���t�E�!:�
���;%��i�b"\�y5u�q���$b,�]����j��^�uBl����B���Tv�d�hXu/��*)�7\�I��6�N����9�?�"w�%vb����6�M�=%GN�y^�+��W��e%�bJZ�7�E��e���c���Mk���uL���D���N�yv��-)iaB-XX��N.���
w�y$������^��V~��������EeK������'��py,��������e/��B�6����8Z�^c��(�Y�s�M0Nz�M>�pa6.X�A�q���[h�^��.�d�E��
����"6�s�M�@0�t���������:m��n���E�n0�.�.}i����jo�J?�0�t��$h�B�g���u���?H�m��fn������6\������,,��v�
�`���aYu��+k�qa4|�� h��p��=n|��/n������>&:�X���^��/�kx3M��AC_��UEb+%v$/X�tn�)��K�W
����[=��'O��s3�����L%���(@�:�[��-���O��0���5��J��~��Z�E�cX�n���U�W-{��Ib�hd����]��j6<<"{�\�
1�b�����&.$Xf	�k#Kg��5n��{Y������f/��J�����5�����`+g�,�k_���N�9�bV�/�D�7��ET9^�MGA�
D�_�w8�+�]Z;�`�>����]h�^��.��#�/�z{�<�����u�v8�:}N{�5��w���h����������Ju����-����S�.��W�t�I�aX�(wpeW����}r��"��.��*:�O�yn���A���N�yn����a��T�p52����6@��]L�k�������,��N��/�p�Y��a�N4�y`���0�l���S;����eZ{��DZbS&{��>=��c :�����{p��w��P��K!	��r,��6C����iE���X�m��bZi������`3d��$���i
����R?=v�?��=/�G,��M��� ��O��|Xvw��L��$Xx���^�_�3|���|%��a��t�|#c����4���q���J���p����t�|ic/��B>9��K���!������x��fF�pw>�V��XF�����v���5������������T�l�Ulc�9�#����t����4�>?>Fl�q�#Y&�r���/|�`&��n42�������OT����� }1A����}o���N�-��	�����q8y���Fi\��{��R<�J-�����5O1�aL.�<���[$vzD�oaL6y��F�����g�}�?�&�'��`�{�~��/|&�������uXM/5\��<��h��[��O�{zD�a����0(K����&��ae��F4��`g���e��b~l��)g�pV��\}��>�YI-Z���\]tD��s�����\����j}�T�"0��]�'��|���t��I1XZ��q��j�U�*_�j&h�*i8�Rv��W��p[WO��ad]���)AZnm���|����47��U8�f���`����0��U��QW��V�
z�X�@�o&���
�����E��Yt(��v��m"���z���6���p�Kt+���X��0M����g������v_*�F�.Xu{����g��p���	^4�J�f���R�/}�EC����*�����������*:'bN�m��W�9�y�J����6����3�4�'
��z��L���M���sK�f�b�9�fY�.�T������7+=[�M���*����~Kj�e�R[��y�i�5R����i8OU�=AtK���p�nX�N�`����~�<~X����J��n��{�����+��x���3����L`��/��7�����],<�M,��zQ�%��i��(�����|����3�����V�":���w�#;]��	fO}�5�i8�p	��z����J-�cQ3�

S�b\�{�������r����K��+�Y�!<�4?�^V����`'k��U/~,�~X���V�X=D?L-���t$��jX��m��Rk������d1�#���'�;K��VN�},�~�SC�������,���+�}��*�y-}�TG�=o?$����-���UtE��X{��zS��T,<�X,<X�f�bK����.���+�'���F���o�w6o
��#�*:�S}ga��c�s���Hnu6����H�s������w�fZ�--o������S�b!P���a%4�Y1��Y�<�&?L�,:��f�U��;��c��-,P,��^�������la��;~b�e�
���-�EZ��0��h8Y������:��[����)��mo����t������a�?X������G�0���
#1�e��~
z�LE�����B����!����vM=O�p���>0At>��4��u&�
�:b��b/�*	v����<7��A�L�;`A�X�jse���X�r[���l�����bwJ��n��+
e�b�{�x�t��d�DXt�k���#
��ba�h� ��*_Z�4�xd��7t�7����������c z����
���0���t,Fs[�w6�������4~�GO
��AV,���-���\��l>t%um�����\IO�d�"QlR�W�B��/@l��b�����
�rb+�D��>Q|"����.>���urz@�`�P�d��
�.��~U���}{��
k���@��S���'�x6�M��S�
�^0�9������N�����zV��<~��Xt.�:g���A�j��}��9h�w�������0G���s�����N�V��<13��-mvp6�o�n��+��=�0�v�R�+V��n���S�����`��Ml����VqzD���p@4�.����wh�#���E��J��V[�
��b�T|�T���M+�*X�X����.��|g{�K9]��)������5�����N��
��#o]�k��9*�Oa��4��x����R���M�k}`~5�wR�m�?!�|�^��+m�V��J_�^�V�#UY�R,������2�N����c0
���l%^�r���|r����`;Ly���|�t���`����s#�B�^������U������,Q�W����L\t��������:�
����a���`�����������a�6\�7,�����)��N����+qzD��[d�+F�$t�p�,<T��DE��>ptZ��Fs�
gO�i��E`������m:�����;�e�Qve;+s���4w��i[8����7�R�q4e������vN"_���~��R�l�/<�Z����j��������N�ia��V�V�X:���GAS�`�t'v�����4(�P7�E���nf7+��
��������E�KU�9z���)������~��/V�����G,����3��bv3������V�,���U���M��Y�p}��Yl��|g�=��J������%z�e�Xx^���%���B�����b�E#bsk�w�5���3U�M���|�M���O�aU��/��*����;/}��p��\8�e�\��O3���u���r��/%�N����o���zh[�������K���BlV��n���]
����j_4��7�������,B�8��������[,�
z����	9\d���:�Pj$:�|�,.����Zo�;S�"��H|��>\��J�`��fq�%���=��D�;;����<�{�������J�i�8�M��z��u������m�x���8���R�[���&��6-���m7{�52�M��������NO�=�a��],�"n�4��"��pRY��R��2�
�A�i����#�����p�u�}G��\�aY�X�g����vio���`�An�]���m�f���v���7R-��g������pUt?�F!��������e��~6�������m
�f�%�W�g:
���u���X}���v.Y��:�R����'�R{�m��eE��S��IBbo��%����.�-����p�k��j���c�j��3�X}���h���J���v�^�@0
)�7S��i�@��s��Q��J�S�:j��pI�Yq���m����~�U�����;�*z�"�������W~���X}����;��F�$�U#�+\N��+��W.����b�!I������Y�iG��u����b7�"v��Z{�7����c�l+�b��I�0��%E�,��[,������K [�^��pL�	0�D�b;��$h/{��a9;F-��k�`�kFH���^��1�����5#E��:��O,��-U%XIo�=+�{��7K�h��p�������K:^�SQ����7bov�U��?3���r�H���"��J��}��o���������C7[I��d���_����`	��Y������JF�~[����o�8&_����0������������~�%Q�&���i=u������p�4|M�?lt:QxKG0�,�o��Ss�`��M��`���������s[o��v�XyzMp�N4�����`���gC���^/�����izj�A%+|�z�m�{>���9)�9����`s���-N��c�.�2G*�m)�fRx����|���;{U*�,���pJ��az#��={�R�
K��
����~�w��=�b{�
�m-<-h����Hu��5��=���t�[p��]p�%��9�������G���M��ox�J^�J,d����W�w�
�m���Y���n��J����P�o�u�l�4�~"r�$��N�����/�<]?\�v�Gl����4�����\k=��/�w(�������=u��>X����t�V�.m�q��Q����S�:`�B�[�!��,F
�N�GO�9b}���������GuD,����,'J�$�O_������4�V���Y~�#aACo������J���J��� Y�a�M��R{d�=��I���������g������FI�yl��6X^��#���p����|3���U)��|�)@�pxQ�s�<����;����.���e�
�vq�Z1���������E	�������J���7�������GZ,����:W����R��;L=>rg�!w�������}*{���o����^�73�����7,k�W������������`GA��-���;~l������s$�2������p��*]�������}����W,�Z�
�w���N]���:e��o2y���]�_�������C���e�'u��A��c�0�(�we�r$�,��'��m���_�.���?��������*�2#�Y�	��n�N]t���k�"���p�9�vQ��*���?@���Q��D%Rf��������5�<`�B�������~R2��F[�F':�g�/K���>j�A[�f�����|�h;u�r��5����Y:#(��H}�W��{��C���,����a�15�������Yl�{��4|K\[c�]Te6W�z�r����M���o��y�r�Rx_���P��/�V�fY~��v���D��f���������tGE�fQ��F���}W�����6���

��24�������%'?�MTe��^A�8�C�FLO�wg��=/?���Z��nH=��2�fuy/�yE������F"r<��fYY����V���?���z��RK��(�j�FU+f�e1��\�oG^�4��c+�����F�f��R����0��'[G|H��K���l��,�o�����.r��|��o��E�WE���lF�7{�����u�����4���\+����*70�Q�o�p�W����4�����������Vg.��������v��
�L_����s���o�5;J��'����!ba�Kn$12�J��~�w��{������p�(�y��N�6�O���
�3���O�9n�?Aw8�{���YZ������mHf����p�Q���Q�Y�v�"_����
�f�dhy8�Y�#��K��{�]��H<n��~����
n���O:�jLn�Y��l_7�|�����������03���n*���J�:��1�9�^p�*�^�����`#�������	����2����?��"�14�
��^����������w��aR'�g\���U�V6��#>��F��6��Lxw����M/T@���Q���s��-u���>�s��'2��mpG����~�mps,���CN�9B�7M/$�5�n�1{�����[)���`>�K�����������t�s�A�=�K_S���v���C
���`'hv��l������Y�c�F/����l
�Oo������Y�`������]t��l�F����:�j���<��*���tA�8��YO��#�p4�l�f���������Z��[S����x�
}g;������O��Hg%�8;��:������t$Ow�nS6{��T���"��V)Y��b��oJ��4��+����^������f^o�wv�����Ua<��`�t��&�e�������`�����~����	Vl���XX�&�w������M��t�ny�^��c>8���M?�A�f�o4��0p�#W�
�c\x�C4�{������=���c:�-z��o���"%F/X
l�T>L��pU����`:LE�r���2��!3���A��<�����o9H��_�7�w�]p_,M�����
�[9���r��a1������Q��}��/��	����%�o����z�r�n9H��2������iP9�+�� ���,��*���M��Z�-|��2[�o���1��g��S�:����K�_�9�����z
���C ��Z*O���������,V����eB��u��4�������T,�x�����o���A<4��mpt��{�o��S9p���r���
�M�Tf�8��R��GI��P�l���`�I|�[��}Hpiz��A]P���!������g?��/:�D��\<:�Y-���J�W�#��s$��I
O�����:=�� X�a�;���X�����n��E��J����W{A/�o�*f���0 �z��=9����-r��j{�����z����'
X|����Z��Db�D�v9;S-��{=���Aw�-
�t�����$e����$�p����7\��M�I�����/�����l��[��H�;�R�r(���v��H���&��~�Q�^Y?mG@p+"�N?wm�����B`�1gs&�������"��ay��n�`�C,
���z��w�e���[���������C�`����2�b��,�*6��N�{�{�� ��~���|����
�;�p-v�����|��{�����Y��������~(
�\�N�g���b����E�]G U]q��|����XU����bs��w��C�f���gN�S�>�^8E���m���%?t)��~K�����f�e'�c�pF��������Y
���>���:��s������-�/���f��a[�_��s��B4����?��	f��Y!�Xvw���������^�f��biP��|��
%�����z�l����;�*M#lGB�nj������GW��u�h�r~��%��n�/v�90��
)��Z�F�R����<�K���?����*�/LJV�������n0����U�����*��T�f��{l��X��F�Ss�_�������6�\�Yf�ig���f�d�/lN\��_0���N����N���
�����1�Ou�-�d����':.k��w7_� >=�#/������������%=�����i�>=�C:fmz��Y�/{�*y�q%����b�v�0���&w%�g�������P}Y�~��%��c��M�J�0�S�0�-�:;Pd��8�uS��/�w��JgQ��)����:>�� v�I����`�u�f�&����_�/����b����vx�B����+VH�va,$�;;�#6����!se�����j�������N��P�~	N�=Db+��*��V.������
�tJ2���>GO����x�-�Y�����w��p�������V�Y�,~a�l3��?�5�IaK��8����	��V����R��Jt�������g[i4q�
�Yi�S���#>���������6Xz��;��6�/	�N9��k:zb�.���wQL�k���\�������~)��<��I^y�+t��_�`���8ba!K��^'�cp�[������F���e����E�c�b�U#b���wv�r�`{��;u�(��MsXba������w��IN�����=<�[���:�Dw�w,�<\jKk��������]7�]���&�UJ�-��`� �gk��|eL|�],<3���$�����P�Y)���0y/�?���&!8��\��t�S��=5����@����X��{E�������T�|�W-��Ep��%��Y�`+E:v��+�D�JM�]�\��a����o��cs��|�la���?j�1lJP�)l?=��	X�(��bF���r�vz�2�`i��|�0��,��.�iU���pgJ-Dc�����v>o��������$G;��c�=*���}�={�Y���
}��g>��c8�
"B+3�u��i��W���u�K�����,�
������j7��N��i���/�����@0Z[JObQ������L
���S��v��q�0����T���}�\^��6�_�2�8�`n"��k��J��U��^[�"
v�T�4�t���
����S�:�a*n�w������#�+���<C���Kk��f?5�L�m�9���\������n����	��
s~�B���U	'�Z��kY��W��$"�	�b��C��L������w0��bKJ![���_�im{�t��,��H��
�g�!�?����}�E.�k�
)v�/f�Mn�ND,����a���\�;�Q��?����w��$,,�`���������lH�(���l�����v�/�����C����2=u%�o�zN�|l.����`'��
�F�g��m�����V��Y�E����H&���FOo���	�����z�F����.rl����7���x;�~zT����.z���Ss��I��iJ,<�!�:<��v+�J��/X*g9��R��������������n���F]�1L*l�a�m�v��O�*�X�v��l�'�f[qb����w�X����m����sDO���YB�O]�����DD�,:�Y�X�d�b����V~g����4Lz�}���?)�e�7I�����P,"z����;���m�2�,�&��D:Vj�����*�������������6	7V�(v��oK�o:h�����9K�oV�+���2;�+�N�b������z[<�����������p�[��;���V4��A,�>	����NV���*��������D����)0��s�f�>���y�0�R
	vo��!����Qn�p����f'�E��-��m<=�CM����G)3vNUl�]�^��&;�+�U+z�f���5��=�7�����Gu��<�������6V
��k�`���C��v�2����bo���Y=��� l�m,�����]oW�goj;�z����A*\4��6�Y8��vV���J�S�:Jeg'D�sfF�_&R|����\:�!�0�����B��n�y��n%�c���v�E��nf��.�_���+1��7+�1
sLbY��Y:F�ce%iy��}ln����B���h�^��5�]?��	��������h��X����������?������7?�w���z����&���E��t�#�$O����%A/��7���]Va.�i�g����=�7s���Sj����/VZ"���4D��������s���L�'��w�0/n�5�\+��/v
��F��~r�V�6��0��U��>���N����y?n���w���1���o��in������w�������������_���
	]w�6����P�K�Zh��S
	>�v��;�
�a=uA
vw�1p�0�	<���`a���w���)�r�^�m0
�O��S����[:��\A����^yh�
o�{�:�K�"�-5x�"�1������,����P{�+�c �{(�=G�\��F�j����/$J������t��{#l+�����*o&������J�g�=<1+�'�n`��F�`K����7L��aI������Xx[����nJ��z��&,1J��
�`T�����-5<;�o��WG��t��Ao��l/xn+����cs�s���U����P4!���
���69�a�n(�?��vp�����A��W�a"R^�J��^�<}}l.��������b�p`�r���u�,�����l%=4����
���<=����:W��������������.z���-���o����N����<���xAxP6X��KO)[����X��a����P���� Awx�Y-WfK������tN����!��c����A���~Y�%l^�,����"�{�ZI}��z�;�%�xzcXgl��9u�c��������a`���b�����_�>�������-[bg%��������k�X��K�|0�le$r�
AC=�X����*l��-��GDm����������e����"�sX����fq'�������X,���N���0�k�$�/�o��o&��R���9������_����"|x��h����>};�'��+����~��6X�-�pk�m��
kr��`�Wjm��q�L��-#���v	��5=��eE��;b7b����pO�^�?�pY+�{%����f�w�p-9<����`����b<�����A��3���~��'��&����X�~�?��<���,Z�a������B��<�����oxv(�������9X���*Ra���Mg�N���	���Y�Q��Qs�
�N����Me��������0�YxN������flH��#	�����3�������.[E���	�1z��|���.����]�9����MkbalKi��k:��sn$7�j3����������=k�?6��JUha���w�Xm�����m,�e�b';��v��f�{cS�hh��R�������L��XV= �0�4k��gy ��;X=����Y���_�V���f�zcE��gi�n�B"*46����[j���rs�wU5����,@lm||��h�=�_�y�F?=����9]tc�b����=ti�7VF(�����6��
{���2�y-~�]��P4�I��a���S�-J����'�.J\��#v�}p���-������6��w���>X��������J��r!��,������m��]0tV�,i��.G��f�w.b��\�,g ����m��k:hc�P�!Z���4������7��eEkbY��(S$�]i���4Y��h����!��������V�7���>�XV�a�/���q^�U�\��p�q�0=g�$����fK���[�
�[b��
7��G���������9��fOl��+9�a:[lAc��opF������\�.�]���`��n��w�����{�����p�hx��������B��k:�e�)�i�l?Mlcgj�n����x�^��l�O�EG����e����i��[�O]����Ao�������@�d���_��{�:�C���D�2�Ss����[�f�'�\���r�����pb�t}zT_0��F�ba�7�]P%6k��iO�+b�bwG5��3��w����]������`Y�T�`g��\�F��UmUh�!�Y�^p�R�L|"�;��]8��l�n�\4<u�_�����N�.��7����	:�
O�yZ�Y��3��Q�-$b��E��C���2%X��`}G�#1��s8����n�=5�i�;u��V�ix~����/f�s�0��L���5=���[g�1�#���z~�i����M��>]J�Y�D
g��m!���"a�
4Ms������K���{j�S\EJ�[��B��JI��Mm����T����t,����R��Y'�
�����c|�&��w!���|g�J��
���<��F�0������$��
����mb��g��C��.��\��;������k: �%-A�r�`���`���5U��6�=z�!K]vU,��	�
�S9��o�S��pZ���T�W�`�����E���E�����]���~f��4����A\�H��T1�������u�~e�4��=f�Gu��FdIf&����jIn�$��1��|�L,;/v�F>���P���p�Zx=(�W��+�;�B7&�6]��5����D�Gg��vi�w�J��5�In���>���R�W��n�jU�a8[ZY����O4W�����Y�Y���}��x8���3]A�����C���a<�������:$�s�hL�����Q����������;��������:p�[�F��������Qp���Ox�3�A��E�Bg%���8g?6)/8�E����`@,���i�J���
Vk
������N���[Z����I���4��p�e��9�m>6�05�\�s�"kvB7X����N�8 ;��ti�+�+���=�*���C6�����r��~exm��
w	��09l/8������E�����6Q��Q���D>��yb;�,Sx���f���g
W}4{��S	z���Ss�	�#Y���c�Hn�+hZ������S����������4��`~<,W���y��0=��{�n�y�v�!O�L�*zAa�Z�����n�U+v�;����G���N���$��YE�lhv�})��zM�����p�l/^!����bauM��N�S9&�#A��5�;�1O��x�������B������u�,"�0�t�w;���2���]��t���;�����u�;3:tK��L��^xU��|�������D :�O�
7�~����@�M��m-�������B"������W�`�7b���Y4!6�$��h������� f	���\x{���]_���au�;����g������wf���$Ba�/v*����P.%�Ua	,���x���;u��	��-z�uKt;���YN�-��I^�a�g�L���vf�?��,����F��+!;�;;M%z�7��P��-��L�+�mu]L&��1��+��2��7���z����Aa�Q*[��;
�-tkp;���eg����,��-*�����j����bw���n�k�1lN,��%�m`�����]�y��*��K���{�t���9����w����V�v&H
ox���^0�v����������~	2��aSO��C���.��+��WVtZ$�Zs���aa�-Xx�L��#��z��*����n�m���t��/U�L 6W�~g��*b������5��V4o|��������7�����1L-��)"����;���x����.��\����n��6�Y����R������E����<,1m�e��Z-\!�m��L~*������:=��.;����8���eEo��,�9FQqaj�P�fsD��X���������J���=�%���D��%8��B�V~��_�A���[l�X~g�
��t 7����s�Z�������5��z�C������F}g��|����~����P�,��S����f����9�������j����8��_��T�vj������X����]q6�*��
=O��h������
�n�p�qH�V+H4L{5�.v�LlgG�[�g��i�A������8��HNo��FO]nr��K���g�L���S�:��!�l�����F�����0f�{���>��&���D�Qd��i����P��@�����E`��6�BkE`A��o{���&
����ph�����aeE�������%������g{zT��L�,:[q�������pzMO�pz��_�����fS.����"��#�qa������#y�+'w,��1�Z��(����v�9M���������y�y�\x������cV�wSTwj��+�
�

��
+����.�&��������V���?�����i�@�3�]�`ge������S���"����:	t��D��K��bf8��������C�h����q�����lg��<�����`�4h���k������.<D/������\���p�^*la����Z��j=s������	"E�������*i�a2f�,�}�zj8���O��.��u�
�Aox�{5l�{��m�K?����O�Q9�>h����%K�;���������,6�����1*SX���<�tf�]?����;��K��crX�#
5��"��/����A�d�Y�3+��LxHve��Dte��!����Gg������
�`�L��{������4�n�����/�����s�����U����E/x�"�;���GuHk���{h�^0���'��n������S3�np�Pjf���&�X��g�������]���7����2A��X�R�I�y��;[��]��9=:���8UQ����ajOf���m;�;���N���<�2/�hx#�|���I=5��s�
}�������b����h���&��V���F���������iL�p]l���)>���w���l����0���T�F���o�
/Y���V��+���.��Nu���<9����'L���K�`q�^�Vt������y0������\�~z����~����I�b?M���&��-j�[�5��y�C��'[���X����~�boV�/6o�����{Q$�i"�m�e�n�,���*�����cs_�"v�T��|8��n��mX�=��[��r������?M�{&�)��A*��m�Q�v+������"ZduZb�P�����AtYge��n� 76�������+���iu.���\�|�`���P�7i����z��&�f���4~ga6GlNx}g[@�}�'q�^G�,�,�U�	��J����XZO��K�`��w�)��gv^_�`%b�B:y�`
�9�^)?5�(�t]y7��0 ���pY��Z��#��x;Xx��O]�RkX���A����;�r�G�y0���
������
W@z������9��~l���[S$�m���H�y��E�^��R4,;[9�9�8�w�|l.2p����m0a�Gf��V�"������o:)��Q�%)�*�����L�cs�m�����W�p)�`{b��soXM�B�2�������=N�pe}a��`>g�,ztW�v#��tc�!����tX4<X��hX�"����fE�bG�p�4<X���]P������RK���2�6�#��aa��E��7>=k�P"1�8�4��l�����mb�������9i�
��%�n Hr��Ub�
�f��b+�c���O|k��
��2$�Mu=se����*�D�:x�������)<s�z6,It>��`���b�U�~��=�����J�E�d����;{����[Zt��$��\�����9�@p��U	�F�`\��]8��8\� GO���r����vO������Q�w��9�*pg/������I�-YRN���	�?]��.�I�28�a��DO����~x�)8��������F�f<2�W2�b�`����a���!�i8�>��P���}j��3�����
l��h8�����)
K1����pd���|}��^7��N��H��D���:5���yD���Ss���hv"�,;,%�1��X(�[���\�n����'u�������9�����;L����vZ�<���Pq/�U%�
9R����V�L����������T���"uu%o��v:Ci�������9�Eg1��9Os�\��s(�B)�Xx��X��*�-���1�����Z	�-f0+nL]���w������d�g���3�B���S���g�I��e8���`gA�?lG���,�0�v�S_s������A�|����f�e����U��V<�A4�G��P�!���wm0w�t�$�"�w�q�`�
����
�.���e���������2��
�Y��%�qe���x�{�y������xz1k�[NE#�Gu�D!����N�]��z�s�����qO�9��9��w���������tx]o�������`/f�3[���Ov0���|�����	x&h�^V�)�rxTKai��Z���]������?��e�t����A+�f�������6���\�)|>5�If�������ap���}�h<�4�_��������v���n�l�-��Yl�m��\����Y�����!����J�,�obt��YZ#"!l:�|�]G����M������&8��B#	p+��,��Wx��������e�w�1K4L9{C����V���-H�������T���I�����M��S9xb�`�tOH,�Sv�J��Mp�3�}�J"v{[�X8j�]����8u�#M8m�����/L;aF�c[�o�����M��`��{����"*�����_�����9����tX3����,B\�[��J�:��5<��E�2�tins�����E��.)��?&��p�kZ	=��Dt^�~g'������`�EEb�]������hH
��bSv��X�_,4G�-x��5������M[�'�:��N�0�{���z�I������Xx��U(+�V$�b�y:57������z�
����v~���pP��{~Z8<���py"�r}ZV�61�Ih!�	���%h��=�C�Z�����5g�0g7�k��~f8�]
�
����9�EO�%��i��d{c�w�g0_�h�	��B}�'���%v��<�2y�����iy�d�&��U��-������/D�_���-lpN+�����W��eZ�;�#��rh����w���5\�&��R����-��x��J	���n���`�-.;A.v����������N�7(�b�1��N{��w��-T�L�p�~`Z,��\�$-���B�;��N�y��Y�V�����;K�`�.����&�B�e��d{����L[Z'���R���9���L�����b;�����z��Txdb�����f�+L�^��e���&�>�di������"������
&�i[�d6��������)�`�_�U.O���NvBt������b���f�b8�������NWJg�m��n���B��h�6w��	�~�	#�����R'��}�4|��_���z�y�?u�C �����,-�7G���%��"���n��
�l����	wF��cs�PE+�.X{�M�?�����i�~�ND���iZE/�����+�
�(�:�S�O�0s+m)�OK��b�e���l���\h:����V�B���E���UxXQt���`+Ep�������o�U������P9<-�GR>6'��_� ��s-b����.�@��E��a�i�����P���5c��dG�D/Xzl��F�[��jZ�I7���`�L2����\J��9a��x�`���T�pzTL�)z������X�I�����x��|q��Q=;��d�����I��p['Xx������o�����dJ��vQD2p��3��������aZ���y�i��{��El/e�l�],�Dl�����Q�L������S3����D8u�#7x�a��v�������p��3�j���I,�m�;{�]�`ib/�^8>���0���K1�^�!�r���Y�)��Q�iaM��jX�7����By{qs��cs��r����n^�CC���Z.�J��]����L�	���c\x~&�
w}��d�;��$�������9���c�_4}�@�&X�Aq������w2������;zj�u��u�}�&�����a�n��]�f�w�Wf3�|��������w6?�w�b��vOXJt���`����������,n�w�3���fF�m0���hG,���#W�?���y*z��`�.�w6��N����&*w��m��$��������S94����K��,y�L�,�W��[�<��Yt�n��������]�V�>-��p������bsvzTGm��$z�(X���aY���A��J]�����r�t`6��}zT�^0-4Te�m�{�������E�H�f�z�-���tDA�UE��-���K�B�Ge�p<����]i{�'S)��i������
� :�;5��`��}V�2���y�]�Cp�zx�6�s����N]��
>���M�~f�'��z�tP��*f�{C�������KO8i��;����ly�%8�-W�"m=��'4��\s1��C�����x�z<afCta��x2	�hj��v����`aVX����e��A�����=��p�cs���At�FKET��N�B
z�1�y������"_�n���=��y|E�m�`�����`�vT�^ca�]v/������\�����5E��wv�������.�>]x���|������`����������OC�b�Y���_b��[��Pw���i�
���Q��uY����):����\�XX�n6����h��`s�y�l����IQ�$����X�>�S3����`S[�/��=X��,�{��t��D�������poI4
��z?����n���)�����W�]8#����
����#�AN��������U���z�U����������eo1�UE�yex����D/v�-�i[�������4����G��'���M
b���]0\�*��}�Y�����oai`��>/�+�c�CY����4��Pl~gWA��,�^p�)�������bG���^��3����1
�x�V�D�~������6�O����ywL�SObov�S����bam��9������}��*lf/��\�����`i$+?4�������.rE���`T"�4;�f�����^���X��X�����z�v��v���b����s�������>DCO��
�O��$�������;���w�0��:��E��w4����&;!z�\���p��vN0�fu����21��������~�Gu�	��R�fOK�\�I�
C>	�+Y]����n���e��bRk�7�}o>73%qWv�-�^0�	����Y�>p~o��*=��	������k�"���O
#>y��
Rl����_�n�����
�����2�o�����r���]��bS�������]o�[q�lHv3���7�(n�M�i�a.SO
����J9z������,�X�S�7�<���!�:>V(6�<=�C>���OE�v H,;���l3�����]�b�6�^���f}�������@��8�VyKG|���`��������I,�����
��{���0M�7���n8Z�/���"��,]�[���G��dO�����%5�?��6��}���`�n�wv��D���Uk��=3�/X>�[e�w��'�V;��2����`�f��*���O�x�y�D/"�e8��S���t�����0;�����v��w6�|�"���%^�,6K��V���"�R��U���y���D����e��x�h�����
���$�/x/����	�E�r��l6������=a�������}���
7���[��/8E��DV�/v�V����T����9�`�t�t���s8x�����nY������!�������T���z�����gWXB$�6&������|;��?6S:�q��L"�val��-������5�?��{���`s��5��
�%)"���2\Kc�`���Ea`Uk�
�X��f�$�3��B#��<w���AH��`�(XX���'��e�]��������9��i�O�x���X�J^).��{���v�m0��v�M ���?u�CTj�Y��X��`�*�A�����l�W��G�~!����J�7��k�X����[VN�H�����;#9K����������/�,Y���(������V�����C����#���v�
�����$�J�����}��]�Q��z��0(}����dV��^pt������-`���K���5�b�Jf�bh�Gk�BW�p��T�>�k5�w6N��	���t���\�]��S�z�J��M��$]9)j%����[��2K/�	�����������,=s��2�C-���&��9��0�t��Ss���YZt�[t�������+6�3"2Z\��j������[�[8�D�
,d��F 2p�OZj��F��6F,i�
��t-�w��^���[t�G���S�vZ/(:��f���]$�4�}�.\������aBY����fY��X��z�y�u��a��O�w�H�����6U�����gY9����s����_]�Q���R���5fS5�����E��/v�O,<!(��`
��f�������dE������p#_���`�����c���v�DWRH�e�+F=Y�'���Xh]���_N����e������b�\���9���1 �9�Zh��������v�|����bk���e��/�<i������.��,<��v�H$6%N]��~������Z�=u��<�2}����S���W�%��+XxtH�.���Va ��1p��@�SW���� �������j^��y{*�=�K5��w|g�B�����1 �F>���;��qy��f��[�@�n��;��'g���X�
<��;r�vvf���M�wN��������Q��F���_D�T�L�!�"�����
�2k�YSl�����

j�7�O�t���)���^���iN��	��T�h�#b��b+'l��V�*����XvZ�.�
k��TQ4���`�n�u����
�mo����*����-�~����N��|A��a���a����l�2�����e��)p����W�zC���=����R[��	~��Yx��i�z��s;����p��:��;R1������\��x�SX��v�H�Y���v+���E����&����)�YV�fY���J���P#z�G]o�3X82�(T��h�����[�U����^A�)���
�3a��)�Ss�X	�hx����f���9������.�6��JI
��J���S9��E#Aw8v;�I0��T���P�.z��A�tk��K��n8��������Y��0js���!s�g��+���1�^p�����n���J����Ig
�����
�k��29�a�D�LR��o����}zM�@L�-:_�������j������S�����'8m���E�n���$eMY���f���Aw8m{��y��"6�O]�����D7X/���H+�3;bj6�YO]���IKDgi�w��;��^�2VJk�[��<vZ?��h�V���s��@�/X8!�3�m���>Do��En�$�������|�;�NO����VE��z��
�Y���|,�~�d$K����3��G���-�rW�c������QlA��X�u���d������=��\D�Z����/�;��gv�k"�2�ez�TE�YYpzKO���,zT���L�M�-W���p�2Y����:8�Y�T=Y�C�AX����L�O�c]3�y�M���j��o$�Ls`6M��.�r��;
R.W�"V��U�w}��9Otp��7����<���������4Wav�>p:�����P���#�[� Osp�Z�X�������7����|�����aVJ~Z��v��N��n/�4����0���	K��-(&{q�]9joM,�����O�Y�yxTkb��
���I�i�������V4�v�a!���U���m2=*EI6�>0�~TQ��K�uO���w+f��f��-<�g9X4�h��B����3�DJ�����r���iEW�<����7�u�y��ne+������n��<�����a�\�V�����0�Z��0���\�zj��+����p'�	+%�������p��c5����i�;]�bi"l��V�!�BG44�j[)�����Q]�&��N�������}-�x�]z�<s�T�#/V����V���&��	�v��c�����������tr���(�3W����������bs���Q����~�l-�p{����h�����+�������L�+��0l�e7����{��Yh9����Y�	g[l���V��N�e��b7�����bn�l��P@tgA��`��6�nV�)z�(���ye����S�������@g�"��,S)�b���n��}�3�b��El����.o��������YBP�d	z�7[\�-Dk�^[�L=X
���N�
���'	o7�)z�^u7���X���|@�������_������.v�F�]�	����K/E7v�N�#��~���;+���B�:�b����4G\��Y���ql��,z�	��7N��a�#�U:�mi�p�^��p9&s1K��]t���N���k:�f�D�)�~j�!.����K��h����������s��y%
|�h�,+h��f���u�3���d��]��n��7���{�d��/y��k�
�!�2K����=v��d����?���*����l�
v�X��E����4�c6|���J!���x�����#�o9���:a;���@����f���5�0�����`+w n�|7�"
s�ba�[`� ��`���o���z��P(��XY��-}D�'`r��'8X�N������VC��h��'}0������\��b[[���A�
�j���[��m+��Utgq���B�h���c�h������[8��-�� �[AJ�-���FU4�*b[�[��"���R����	��=��wj�s3;#':���YX"(��aS���>���nf���������Bt����a^��^�tzM�t0L���_���}g��,n��-L[v�n���(�^������[Tv����hE��c�Y�V{��h�J�����^�
���L@��q���0�c��:�a�/������X[�'>$���OM�%d�����i[2%���&F��W%N�(���#P�m0�)O,,�6��-�������1��0*������h����`�TLw�^+u7��
���bY
��0
ud~�t�����a����0Y���� ���;�`h����4��(��E���D�VfK#M�[�2��w����7;6#��{�C���?k�]�-��wt�������C�bK���n�I�[-���w�y��;K�
����.:lF�i�����R�q8�xz���Gu��������nq�h���}��E�x���n�}g��;��Sz�J����
�����C�7�������ma�f�d��L_,��L]�P�m��F4\�I�������\��.L�����?�{�����|����"�D�_��f���^�T�E����E�� �pql>)vzM20�"a2sV�M5��'u���-��'��+������������n��f�H�]8�;R����'`�����`�%�SW���-�a��T�
�"���E������)��2�S�:a&B�� ��9���,�n������
=s���JlZ�t��;��'�Gu��F�/���o��b^�mI4����M�b[�����
�
AC���Ri�
���)��l�����U�������JN����$D�@�gL�$X8���u&k�G��l��i��	���'���������C�G��������t��t+������?u��uf���V�Z��E�T�4z	6[+N�����1��s�'�n��:�g����C�������C�r :�S����H�����;�~l.t��{����V�l���U�ls��
oV
�b,�6��N��P�
���p�[9�c=��AAwX]�L����:��@}���`[���mM��QD�7,{�C�]�W�`]�����`����4�K�(�:&D�������cs�Wo�����Q|��K��X&`Mt�/��n�}��?i����i��1�\7f�w��p�5�7cz���o�h�����N�;�e�K����_3h�����d�h~T2����J��\ws���D����_W����,a?u�p����|M]V
�0������_��ukW������n�S1�b`�7g���/)����M7��n6�UO�����4Z��e��l����6\]t9�A�c����~?��8A�/�W��85��%UM7��4���f:!����6���h���	d6��@��QM�Y��2�6���:Zg��Q����pIuM��~[��� U����Wfs|���k��k:AR]�m�]�xb��~���x�O���2����\\��9�,��,�������nG��k:�9��]�K�~G�`��F��f�V����y��i����������Df�Rs'��J�y$��.dF5{�bW�hK�hV��z��JX�f�?f�v��Q���h��o3[���c��#����	:���+�e�/c6[�N��hm?��H�`6�,,*N�}c�
=oe\��u����/���C������������>��I�+���s#.Yfa&/���g��G�����8���*s�
���f����!�iv(�,;q�������E`j5���`'�3���e�8�A�;�,%�E� �L���n%�>�����|�����`�����K_�c>t8�4������
mQQ��;�'�.r��j�MwTmi6k�O����&}��~�n7���pA_a�1��\�����4Z���,�&���Q�\��B���D��A_Z�}l��������_fw���������-�o��[��S��JK����~�|pSS
a����E����;�����S9\D�Lw�NQ��t�����p��r��Y��d��q|F��vd�3[�������n������������4��{�_��Kw�������pPM#
�k�g�J��cX�tG��^��Y�Vv��C\���G��,SR�������T�hd0���������`������H4Y�,O�7N$��=$���.�p@��-�
�`/�Y���f'L�-
b������k������VNLG�Hj��t���w������dA�z�����?�\O��g��&�:=��E:V�r8���u��i�AZ�|����R��E��.�t��|:jC�e�l	���Mj~���J5�t��\��4����1�������`2*hvO�-��=X�C7���.r��A}��`�i�@�U����g�fW��ww�AvJ�_Sl!�;;�����h�������������L��8[����Y�����`���;�.�4�����A����k>�pu*���>t�~��(N���
��E�(A��0z�QP��QA4�~�����M�J@����+�\7j��������O�pv�U�X����=Z��u���E4�2��Y�)�}���`9���^�7�������K���W�����.r����hW2,�����N��Ss��������r(�m����:,+Y�$�D"���Z�&�����c�������Y�w��i:t���~E�?>}=�����]�C6������>�q�K���[elZ��������������l>�qzM�@0��V��eXi�U�N=�c� -�D"����ef������R*��������J��~��2�,-p6W����!�"�o���h����f�8���#��\���J<��*<�$[	���?����������a�*h�/�m�z���Q�r�}����Z��E���`+Y����-��a�F-�(.�+��N����]A7�.������Wx8^��tN��E����b=�U��^Ol6�N����6�����Y�
t�~���9��ii�Z��v�&#v/�?�86F�~�3��>5�XN|Ag���9GO���B8�N 7�i(
��[G ���pSi�=z��u8k���������U�5�9��9�Ps+*#����w�}D~���u�����������"�`g����}z����B�)�~j��54�����Ss����<���~�������[
��X���F��������Vm�.��"��R*�f���e=�~i���\�n�(�e�<���t�����bV��h��t����t*�����_l{�4�������,t������e�K9��>����*��x����������k*"`?R�����&����EoV�/6�����,,v���M��f!�;�e�Y���F�(��/��/���n4%�n7��O�����E�z�Ss��X*Wt��,bc�~	q�0e�O]�
.�D��
��
���:�b�E����XX�&v�{�%�Y ����o����Yl����?���I���j�9��^�X�����fv�����6���� �>�o9*�����}���E���U��u�e�+��.k5;����fe�b��z��)O��P���.��z��4�V������b�0������P����XX�+�`^�/��I��������j����Xm��s���B��������
���OlgZB�����+1�����u�����v���|[@��csRTFh��/V!�����z��������JT�n��;1��lh��^��q;-��vO]���M� vym��C2��}w�l	v�T���_�z��9u�#�(m�e�����8-������d�g��bsUp�e��b�JM�5�Lq�Ya��k�"��o�W�]�����L���I�����*e���y�@�]0�
v�dW��[�.�/vtC�'��;���%)<���<u�c/����",�|��wv��T=3���[�:-k�i�)�;;�(�����ZY'1���<�}goX8��#�������J�:^d:y��yW����\�0��}c�Vt�}��d\�fG��B���S�z��������@���^�pj���pH�����������b����D�sVB;�9%vO���-��m\���e[9��At�e�2���E�FC���m\��/X��b��f��Q|��Cw��������]�(���%�����2��a�_��J�iM:=
$M:L�K9���_���j��s�4,�(y��^���������|����Xg��V
�|{���>�`K�����kM+Y���{?u�H�^����p�����O��
&z�N��5�O���U��\6�_��*�� 8�����V����3��n0\.h��B������,������3�#�Y�����r[u~��=/�����S�����`�_n�_>���n���"���r���u��K������z���I���.��Ivf1ZJ��������\��#B��k����a����?�����
k���W�����S9���(����&��L��+���L�
:��O�9������C�p�&�?W��}}+�/f�+'��X�Wc���H����("��F=��# xd����;�+m��tsI���I�����b����`�����c��@�
����~��Gu<�x����vX>����k:�`�p��^��l����z^�iC9����`;<�����I���`FW4�c���������/����L^�����B�c��S*�
��H��@{���08x�>�W��{��QD�������:���A�o6��!l���������^0	6������[1F�����������F���_�PX�"�4��v�r�S�:j���R�_w�pGCBk���o�������XnO]:�a)u����\�A�;����w�t��������k�I2tj�A��$���.�?L5[�X��:����������]��[����u����<�4�S��J����l!R������+�ok�o��=�q?�7���]V�%��k�����jJ�`�XXPo����V\n�=�7��DTDn��o�3����w�������f
n��~vW�Y0+�fGl��B���7������$v�bb����1���Z�����{H�V�#�j���������]bs�����6���_�vs���q��Xh���V,,���B�}�0�
/0[Q!����z���y�����]�E]5���v���7����Xy)xb�{��pW�m������W�zy[��+�?6a����Xe�XX� ��������o�{}�!�'8�*Q���t�)�w�1"�������bG����~�f���fClc[RbS0�eeh~�B���2����j��d�����j��
sA/�i�
�M�vw�� Tt������q��F�rY�tJ������N�����U�`�0Xv��]8�t[�}��S��e��2�����9�������'�-���h�0}sO|�MlOv���:(�I1���
HBj����v���������d`,z���B�g!�M�Q��������b���LU���:�V����������
B�
�f�0���#P�P�.vWr�vR��;�Y����==�C���ap,<{-
����0Kl%�i���#�'su��f�.����)� Q�m
��5\4��Zlg%�n	2�W��m
�7������h�[���dW�P%yW-��-�����
�lm��bWis��j�ECG���j�p���������;�#��5����C���B�a��
S2����.�d�K����'�=$+�	P���o4�	3Cb�sv����Z��zp%���u�yf��u��=������4��*�����n����E���,�p,�7A��,%mg���t�e��4m���&���.~	b��+Xv�S����V�����&\\=���$���@���.������^�s�+l�������������������%]4-��%�p�����������l������5�os(�dO����8~�33�� ��g�n[�oX���{1b�20��N3��p���F�S�:p�UWA�������7�PJ�q��z~j������3���b�SsF`E�i���^�BU��Q8�v�V~�L�h��
6k����<�wvU�!m+��_$h�%D�f���Y�`G�x�m]9
F���4�
�!m�;U��^�As���Y�Ssd�w.}7��m�-o�RU���q�'>;��W����z�o&��`�q���T���E���
Z��zu(�=a��Z���`+��C'&W
�ab����p�?��
iN]�p��lE�����e����)��$d���i���_�tx�9��k��^�����'�������LT.:gU����Nl�b�����d����?���7�t�2�Y���ih�,�YxE���dd�*�Y���Rl��X��1[I�XU~�=��aio��m�����3'��|��w��ab�&���u���K���0����E7(mY����,L�����\��$����Ebv��.�~������.r��Wl9�_`���=?��ceu�z�V!�`���L��s���9�^�$i��eu�n���_�s�~>u��Ef�M���f?�w���X�y-v�"�|p�1�c�^���v��:�|(��E��`�A�y}tj��L=�W�Yz�Il����:y�7�N�:B-<��/:X.|O�XX
������u���C����Z4\�;`��v�i�`��3���<u��6h|��(�5m��a�Bz���s�m�����-Eha�oWy���csJ?q����������7<X��5$���=4��KOI[:7oU�
�D�����Z��w��Q$X�������,X�����,�}G�=<�,�MH(���O���
���k���9�^p��J"����D�h�������y��n���07,�Ol���;�T�<����FLt�O�s�^x��.6;���U�/��s�,k*v��H�b��,��~�F5F6�����x��n��s}g��-n��g���}��Vy��
OY�������+g��h��v���
��J�w�|l.h���6��	�Bek�g����+�WN�=n�$uG_�g���Gz�pIU�;�1w����[����GBl8�^^��eo������Y��������a����?M���[�<����j�"�_����`Y:�4K�4���/�-���_��1��I����$i���{��:���z�c�N����f7�J]t�G����f��^)�i�;<���
6'55�Q;X�Y��^y���|��i7&s=`�z�Z�B�m�6�g�����S>������q������]�U�s�XQ4��]p��vo��5����f�6������G,������/���`+%������������2�yB�4|v�M�S�:b�c���t-���P����X���l����C@n�m��-E	�v�h�d���uM����:�LT�MU.�Gu��1Y����_�}w�.V%,v���z�P��l<o�x.���f�t��i����S�oS�s�����)Av�g������B���7vBJ44V���f���P^.nv"Z���;��n��-��+6�n�����9��h<u��/����r��n�Gu�\����B�f���^po ����U��$�hx��[f�ba�����Y�
o=��]�Is�f��w��V������4�pM-��Y��0v����X���l.����-6mN���mN�&�a��J�+No��
�
-�b';&6�d��W�>u�cM���:)?����<=��6vH�]�.�#��PO�h:��q'���S�"��k:~���A��W���t7���.����jn����3��n�G�4XZ�����t#'�|��w�a �f�����O�h8X���I���A,�?�V*Vbg���nl3[�������wW�Ni�Ssd��Pt���P��
}z����fSs���K�Un���Che%e�t�i��8�@������%�Ni�#WX��
�a����~	���z[l�J9���H�a	�P�U�j���1�����sh��hx�����M��a,z�]"�SG�B�����<u�c�)%�t������d����[��r8����\��g�S��CP��al6U�SxRO�p,
z��>)�S��������W�����-�f���z�����(����� �;{W�����s��04�o4v�ID�PFf��lN4�����p9k����W2�T�wj�S$<��������t�/�����Pl������_a����jkj�?���39_a�Nz\x�Ole-`�,�P�U���5��kV�����V�O�p�T4����%yE!��������Q�`i���������
��=9;��S�������6�6�������Q���e|�?�`7\��4[gm�m��[�X�c�U9�ikk�3����&�*_�������������G[pL�9����N(2�VF��8H�T��+i+��������>����i�Q~v�*�X���zUt���b�9L��+��-�r�!�O��Y�&��2��<����[Z������.L@��6Xg��X����+�_����',|���]xHI/\*��m0�������J����`��$���$�� l��6X%&�'������$����2��/�����^��N{fE��EFe#���]�Cr����^����D`D (�]��bx�� co�����{���s�>��\A�7+v;X:Fl����!���G�f�b/�J�S�vYj��[�v���B���FM�l'Rh�����o	�w��pz���[�+�V�f}���:�uE,<��f	p����v+[�������I�f��YVP!6�M�^s�5a�N��������UG�}��n�kg���7����u�b;p�������!�n�lg[��/��G
��:����HlZ�z�b��	���h�J��f���[�����4������]N�9��ow�T�����>�K���Pa������%�b�#f{J�~����D��b7K ��Y����D�n�pE�S��YbX,�������k:zb�D�����t(�|�U�%u{�;\8}�>Rf0&	��-��w����S�:j�a������>�[���������l�I,4(���gD�l����rJ����j�E_���n�q��y�4�#i2�����A��v�����o=Y���|���Q���Y��2��l>zzTn��W4���^�-/��m*�m�.v�X��~"��tD�������i)�����o��f���]3�R�N{&��X-����[(~���C
[�<�
�g�,3<�������J�����v��=��$���`����+��=��W�d���0�,�g[�o���us���.��B��,d.\S�m�pD&_�� \Ia����44��e�G�v����1b���9u�#>�s�A�Pl�m�pGT�����	��$�-�����H4��`+a�����#�4�&�������}�W+��pv�e��5=��G������<G�������p�IdrzTOVpa���`L����y��p���<I��N�TvB,MTJ�
��h�b��n[+<�%�f���-�.�Za�e�+�<���Ss����U4�������dG�~��VV����F�aI���S�m��<�����l����aZT��Jf��|����dc=�U�	l��0����������4,4v�r�pO%�+����Q�����f��\o�����$���f�����`�����]p�t+H�M?��E����c��9�����5��R�������Q<�������)��e�~j��?X��t���f?�����U������*C����IAEo����n��X�t�3���n� ��������
U�V�d������������C��z�����r���N?��a��$�pw0X���^����;�����i���2XxO�����O����`s����M������h7�\��O*Q>u�Ckx6K
�J���x��%�\�{t�%��)�M���<�t��P�8������C8�:}ln�]4��]�K��}��+
�9bi}L�7�$��1X��$�
����y'����'Xj�*\>�m�p���T)b;<@l�)B?3��h��?�\/�}�,��9��������.���#�A��z��o6K��k�]%xzM�p�
����85���z3*�^����^pU,w1��vW��=��V����B�bX[,�����
\;�;���?w�m��/A�fX&�r�"����r�:�GW��/P,�Y�LN��S9
����[��Ss���V�h���C���0�l����E�d���G������+F��
�[Z��YZ$��M?�S�:��F�G{��aFP�d��v������������V��BLb�pg�e��N|>��>v+1Y�A�l����t���p}P��������g�����Z�]��X�L}A�p�,��P��#������������`B�Z����#v<w��	z��"X�z6w��5u�|����5{�D������EW��Z��a�1hxk��&:���u����7DW���K�(��pql^O��In=��h>x���t��<X��tR�����D�
L�0A v���~���;u��.B��h��E:�Gm~T4T���������t#z3�����@��6���X]�X���Lb�i#����S�N�.�!����W��	�i�
}�W������=Y�E��?M��TF����DI�
��=������;�ba�,�������|���V'�����5���m��6}gspp�^�,o������L�f��f�I��E�c�P�4[�egy��l�!v����<���q��������b���b[��qX�;��W�`IG�,� 6�6����sh�
����Y�������i�<\��i�T�hX�.v��:��k:�e*^��I�����;;fa�������~�?����v���w���h�
v�W`8'�R���E���k^X�!Ng��<��-�2�h��&�v�������"�q!�ag��a|��L���cEf��a�(��;�UOo���U[��.�����O���ba|�g.�4�]��^.z��7��&f��;�rL�.r��N������H7��`';>�v�2�Zih �� ���1������m�5���jb����}�9��gx�Dt�N�9j��[���vC���p��lo�,�<
6������"3-���A,���9���������a[��S�/��.DV-�Z��F�Z���������x��R�cV�+����_��d�r.���\d�`L�(x��=��'�^�W������F`D+Ms�����y0y�hv�J�d�����?��
�4���������
���g�~��*B��e�Yv���<'�^��2�������{W R�)��	��4��
�b�S��i��WI
+����P�+�������`�v�I���p	���z�@��b�������i�D6&���Gu0A?�&��F�`�����`+.�a7�`nh�7������L�-�N�����57>s��a���eg�~����H��m:-�N�9|�Ai��~f�0*	6�wtzMA�����<|b�T,�i�=��(v�z����J=�����EO8VJ�
���*U���4�U�V�6|�Di�
���a�>X<h��]%sim�`�p����#����X�M��DW�1Vp:�[C������
.r���LE��`��
zo	�
��kZ�
U�����-�~�c��(��j,N]���O&���-�t�T��O�7��&���{��:���G��d���@tJ�����^)"oK�X��Vuj/0i��'Dc������`/h/J���e��pQ�|7���K������Ba�C���l����(��.�9�����
d}����w���`w���6���o�+�3�;�&+/�� �=��<`������,���Y��^��5��h�x����kZ�x�r���6,4J���^�(�E��@
}�����i�>!aR�9�4�OH�w,�b������+������
�t�����
�-���`�X�y�%�,C�5�M���p��X�Ql����2�`�����s�L�Bs�^i���E�<�G������� p���H8nw.x�-:<`��D���l�����������/����������lO{�i�>^aZ��vL��,�;��F�7��.4����x
�A����'3��	���0tn���b
^���.t��0�t������C�M������L�����/�q+�W+���Y����Z��jD=a�B���V��0Yl�*��"�}�vZ^[L�V��W�-���k�0T��#(8m,���_wW��%��iE���@ �~��a�R���t���h���e=��hs��=pW@[8-<��P�����/lQ$���;a��V7J>.��zz
KX)����QP,V,�&e+��R�7�M�����V;�,Y^4�O$�h{�LT�sN��%j^"d+�������<� E�L2A,�+��Lp�O\�j�VY��T
E�N�%��Kt�.Gbw�8-o�����xZy�����H�q
I!�R��y�D3'���U9���DOG��m�EZ��3��D��N��a'�*`v{��bYJh�?8������}c5V����*f���:R���tZC{2
m����iM��2�Do��������c�zb_�a�����I,l��9��8�w!�6�=��t���XV�/�������D������R���|�-��Vh�,�U4L[���VJ�)u/�����k�4U�|��_4�{�,7���Z=�B���������eL��f����M��(���r����E�J����=[�A,�;���hZ:�����d{zJ�1�]�
}z���{���;�s/��L��Nx�{J4�5|���B��5?0;����
NkOh[���wc6�z�����������5���l������	��s�t���`���a�������^�|jy]�b�����tm
,�lZ���1�.S6�}�BQ&�=%�NxO���
���h�;����-����qzL�|�O�����ns�5�9�-����c)A���0cF��\q-�;��4�$���*�";-�;�&4
�X�~hr]�������/��r�E���7z�B�Z���:�j�7�Cu&�74So5�����=���,�K�.��NK%g7������0�-Mxa��1� ���S��1L�������������~zL�^0�tg��bsM�i�����I��������JVH�
��^D�����l��w5�J����.�V���o&� �����x'��t%!��j~�'���Rx���>�aN�������)����VR���5)���W��U�{�����J�����a����K���t��J�PSP4���])e�4U��0�Dj�)%�4�Ogh�=a�N������o%~oE�	�0���N�]��R����n=oA�dZ�w2��9����g/���|0�@��-���D6��`����`���a��d|���xs����E��;kC����3��N>zC���t�/�Um'�tY]����h�������\\4��3[(���Z�y*/��J'������4U�L��C�U��*��wf��BO��-tc��i��b���`s`�4U�0�4��U�����bW��������)�\�`�IlE�pZ!v2�X���l�^�`i����^���=�$�D/X���+��m��<X!Rl.�?M�����F8
S5������|�;��q'tO�+I���L��44<2�5W����D��
����R���Z��V����Ng�i�6	�y'aZ��'u�8M��:S���W�����_��p>���m-���,<��$\���x6���BxZ^�0]G�0X,5�4n�?��4-�c,�q6W�������Tt�����]�=��:a�T�<j���i��	�����i880�?���>�1�����/�������	.��0�LO\z�}H�W5�s0U9XZz%��nl��	���:��}.X��?�'����H����juZ(�':��giXW����u��E�>���P7�4��6n�*���f�.$B���k5^�K4l�$�fk�a|�
����
�hR��'�F.�g��L�Wt)�da�	���7,�	���Xw2S�j�IO�`�u%mq�	�A�nt�:�a6����i��b�Yb�r
;h��m�����=yU�V��������WA�P�M#W�7�O;a�]"��^UlE���T�RB�0�!z�5�t���\V�],D"���������~bVX�9_���0$(�b�T���b;���B��eE��4�D���P�8d��!�m�� �b���G��~Y�6g;�N��Y$6w�;Mux��U�!s|�t���}�=�B��� �b�|�����{�D
���b����T�-�/V�"�
����>�).R>���,�������1�~^���e��],�,��^V����w�������|�ei\��(��?f+����mad[t>h,&�0%n���?kU�)-n���4��!vxcrb���0n!J�,�K���YP�f�`�|�b�������������7�[����s��
>�}3g���E5<.|w'���M���������aWT��#~��
>�E"��h+$�/�/hx5%!��N����X$F����^L�Ft��dI����|8���"|�$o��W�c������sc���]XjMlO���Tm�1!`������e��7�({CSO��3���K��bE^��+��e4����Z*���(��ZV�]LoD��;�7������m������&m�������~��;���o�}����aR�j�p�12�[(=[V�]0�'U�������F���>�[rt�#���0�U����`;��%�[(�Z��],It���F����D�u��m����~fw$�����N����K�PIU��
|<.����Z����]���I"����0��_:��V�F�^���3��aA�uYS6�]������7����&��j�=e������|�������
�
=�����]0�I4<�$��w���Dl��-����4\�����^�?l����0�lM�:��-�\�hH�� ���
M��24�'#�0.��k�BO�e�c(�-z?,!���$iX1yAwdW���e��}~�}�>0l�c�YGiS���[���������
���������D�����L��@4]�w%{�2��c��cb��������j������pL��PC����2������O�kc��F����4�M/��,���]��)�~��M �5K0����k���9�r8Iq���k���$.M���!���I���qY@x��	����4
� �J�?#X�/V�iVK+��:q�9��������>��b��]��_�.^��4���M��i�>�X�h�T��a�L���/���Uh���TE_�fe�dgG�t�a�Q�����79�O�k��i&�������S%�\5szL[#LoY4�KS������e�����M3�[�Y$�4U[#L3Yt�����+��-��%fGLy
�A�B����a\!�\QrZ^[_��KZ_�^�g0�����V��S
�bY�xA���W���������;���&�������`K�&/��	��Kt}i���i9=���+4�H��a�T��^���i�l������#�6�YJafJ,�`���z,lM���"Kp���	3��d�XP{1�g�L}LhE��R�4K!�
/p�B�b���k}��<-��'x�������n�I���PdA#�$�`}��7��Y��&.��y���|���
�=���`��l��Z=|�����l�����bs�da��X<-��6�������4cJ�&C��B6�`���y��X�'yd���:��������5�c�f���)�S;����X:|ec��%l���t�Eg!��p�b`��t����|��v���x�
z��n���`�����+�������@�B�}�����b��;�hzK�2�*�������V5�@��l���gs�������yG}|���K�h��8��-t�^�-_�q ����XH�<GO�i;f�])�����Hxc��C�`{%��B���o�@�+�xZ�f
=z{}k,����NtZ^�^L<�t��g�\�r8v�MD�H�/6��j��^�c����j8����e�0����=lA����w��.L/V�*v�b�����������|��pn����M���7��^��������M�2�Mlc��b��l��c�sX�.�e	m���?�����Fl/t�x��3�Dg)��p���_d�P�X(%(��`6��O+��Bp8+����FK6Kj�Xi���>^]�e>X�V�f��ba�����������?LCUti7��znp�n8��3�N��y��^�8i�L�7!����|�
�cT/��6<���c��z��������E7�P'��:��n�RYTWl!=���<��
��U���n����J*�����Y/�@?�YXY�����3P(b'�f���U�+/�Mc��,��z�B��c�u���R��i8m�Q,�f�b+�a���a�@��S�8YGl+$�?�;��$�����[��=;���.��VJ���������b9,�
K@��(+�?LG��b9G�1�f�
���i�l�0�u�7+=���gq��S�������gJ��na�Tb�+���w�Z>
������b�b/&�h�t�$`�4������+�Y��?L�C�(dW<����a1��J�
�x?��^t�_�g3}���Q��M���Bq�c�����"+	��b5�:To��sv��QT�v����*m">�Y��ih��X��z'����%�Ms,i]�&+ �Ym��N��(��� ��*;��	�q�
w�z�*����'KE����������k��ay���@��T�a�>�
o%�2qN���E�XH�������6n��
�W.	V������x���P��sy��`T0�n|��������V�9��>V���Z_��>���e�z\���o��i�l�A������l���fj�	�)�J
3�42|��a�&������A��E|[����c���_8c��Q��t���|���ln{Z^[���V�N%����h�����-0���`��d��-�dJ/f���%�&�!����'��J����i:�h���7��;�Cz\��7Kx?0-�
�!���.Z���~`Dj��c�����di�6X��HUm�����*�MW�hS���uh�U�x��*5�f|��]Y��cl���C��-|UV�~Xi����`o�
vVl�p?��5]�X��a����d�i88L�Ytn����aXQ�&����>p���hZ�U�[��aj��h�X�i6���������OI��� .����b�5+R?��Y4- ��3tO��zO�i��2=�Ep��:�d=�����@�?��1n��KdU�:A��,��|0��S������
:���i�[���Y28{��V�KT:�{Z^1�����lKI#���a
��a�H������	�x\�2t�H�B����o&2'��9R�n�������z��h���`[���c}���;���dZ*��N��o���)B���5,�XJ[�s.e�Z�9k��.�L�eQ:�t��_r����B�������`������V�~���6�y����#Ej���YW��V�~`T�Q�1������nx4[�����W�������0w|���������������T�1Ga�����`!X��I���C���n�q��[��|,H�0Aj�����Vq����T�M�P���/����
ew�!lEr��5�f�]t7���B���"�����6\����$Px���v������4�E�J��Z�t���,O��v�7�}}��)�0:��${zL[@�fyf8��[���,U9
vBS��6KJ?p�
:��X�/8����n[�dG���X��T!Z����:q'G��9�{��#����0�E�N�k���h��tR�).��m/(����v[�M�c1���Y�N���n[z�jG�y�}��B���B3<�D�����v�Y<J4|g�������U���J4�#��.����������?�m������3��^�"-6�0��~J���&�$���qx���T�k7qa�Gf��boV�/v���� ����f��/f���{{T��<����R�������!���m^X��-���pk`�z�m��B����MI��2�,����Xv[n���Z@w3�4���Z���H��0���<��k��f����4���]�d7T��l���H��^�m��
�,�/��n�L�(c����m���aH���Y�������o�2�.�J�fub[��j-���pEC����Jt��M�7����p�E�X�����p�V���*"��B�d[����eY��}T����a7����&W�iu}6�;t���AlE�d[
����,QW,�s�Y����A<m�������k�
���m%����et7+M��k`%T��R��]L�[83-�����R|>fH��)��e;�����FY3�r�������S��J�q���#������(�J�f��Y=��U�+no��Dg;�>�X�SN��n(���v��j�y�)��to����2�wB;-�
z:\��k�g7K���a��Vec��l�
�!A�Ll���Y�z��+�NO��Le���l��JP�����=�n��E�7��=
M7�U�s?���-\g ��'���}����7��I��N5F�&��M/��1mO�+n���F�f��FR�]�6fe���Za�3}�����b������&`i��;�������������PlA�m[���.��X��Gf��b4���d��nC^���0.��de���B�mmg(g(�F�������|zJ_L�Y4=;S��i�6������JK��^9�~+���/BL9)�V�v*�D�N�S]�t��wr{��v*�����O��^�~ �$|��I��>E��ZZ6��l�\���f����$u�2��4����7�H��p	���f���ox0��������>����iVs+����
�(�
��da�����@,4���=����7�}�4�`��c\�5���.5���)��Rf.���Vf�y ���[����z��3��}A�X&�#��[�Xh�j�
j��j�4�j���	n��.|+9h��8�_K������q+q`���/��I��$�%k�4Um���;_�����]0�Us�\�,��a4�Y�q�xvn,�r8uz��:�&��J��%�7��M�"��z4.�-h�B��m�Mw���@���+1tYo�z��}��_�UIV�����*���0Y*���4.=6wI�v[z{��%����z1l�vg����E
�|�Nx_v�8lk~C�A���vk`o�#�X��l��h
��4�M��V��p'0���K�NKd;^�$
M�h�;�R�+vi���*�l�`C�S��EPX>e$��D�%1!>�\�{Z]�^���R��O\�to�.���9-��E&T.*�H�f����S��0R����Y�|���7��
v���f
��KY��;���iA������f�?���O���6.��<��q����`<������>���G=q�A*�RfO���1m�������psg�g�������f�����>��u��mkXF'�o���b����s������hVb��r���JN��
��d���G�8
g�z�-���	���]��4�(��Ja��������"�����6���*E�h����X�k�n��
�N1��p>���f�p�XE�1���-n���`.��\8�,�
���6����A�gL�x��N;�iqmL����G%��2�^���V�Q`+o�f�
e:���N��D���i!�
�Y��t"���tQ������j��Y�	>�z�=0�I@;���Lw���e�h��U��1����iT-`�!��,S�1{���������WN5*���e�	����/������{�N)��4\�p��SY�����f��A�����	�0'PX���W����
WF�0r�(��l���2a
��}������1#��>�x<�$�������fY��g��%:����V	��c����Y&|�y����_���M/T��f��A��q�^���n�:n����o�U�1�.H��}���m�����=[���6����i�H�a�wv��>�}�d9�?�3)��\�=��_��V6��H��4~�"]�~*1k�2;�'f�6q�\��o�M�1��'m`��>��Or�l��� ��.��~�
\?�I���,G���J���N���(����c�`{\��D��}$n��l��R��~^����YW�V����A?4��%H��`����D�BN��TTM����,�4;���q+o��c�7=�IJ�l�
��]'�e��~faY��Z#��H�FX�Vp��cx�	����'N�~�����E�����Y�S[��(i��x?���y�l��r��Y����Y�����9���D6qQZ�i�&<���g����6�Q�����0�mS�0D�L�L�3n�����&Rh7����������=IS��
o[���]I��my!�u����i8�1���CC���K?��	h����Td��_s�zh�Z�K:��1��
M�`Y��:����
[�t�6d�j�������M�@HQ�l��u�����[j�(z���
,�VKWW	����DR���H������$�[N���m���MWE{��,>������)wZ ���� �~�{�
>���-���G����^w�OE
�����.|�0�%�b�v���K	�$�L���p��*�-������05Y4�����l/=���;#�}5�`������������!5z�[�}��S��^��D�3��J
��.�e��0�V��T6�������g�ty%�����������6�Y�Nh�#�n�P0��->h��f�I��������\EnQp�[�0�5�I_�`+~�a��W0=+W�a[��������l�L����p'TJ�,���}��-Y�
�@�v2��>ed�l��l<>��
�NKd�
�A������	e���/�����M��mp
[I���`��P�m�������
�����R�g?��J�����Aw��fv�����u�<=��	�]f����X�c�U��iS�I�n|nW��\PX����)q���6���tVh:
g�:���0SM�����c��?�	����.����iS�o=`.�F��`�����6����'����EJ���R}����&w�iymA���������l��M$�����p�E�x����������	x��?�����	6+�����Y�_��p>_af��<UaI���:;�X���|_�'`�N��H����tb�w}zL�"PVeq{B"����=�����$K}����D�������t��w�����f[�\�N�?hF=����<�"�^w�{l����i�M
���YWr>#0��H\�p�xlP@u.���k��u�K"�oX,�H������7������M7�9.��~X��t���lEK��CWH)f�s1NS�)B��0<N���U~��m���9<���
K�[Q�{lO �u�����`������O�Y��0��s�����[��>_�r���e���� f;�
�Jhn�m>�m{f�n�F�=���g%��}��sn��\�������C�:��������AW~u�rlK'~������kH�]��%��J���Q]�[��=x����������B>]�h�^	3,x����,���Z4�V��6f+����LT�t/���z�9���p�g����4��WV$���i7�f�\2�r���mV,k{av0C�O���%�^"t���a��,<.���-t�����#n1���m�4�&W��1���;p�Nv���>�[?5��������U��2��S�+���?����b���<q���^"8��l�����"%b;K�������BQz��yc�
�;�l���D�.�|4��7h��������/�C�(�~�����~Z^��Lv\t�6F���q/��9'�����e^V���;
g���E�L�D,��7�|�����M���,�.����U_�����Y�)�����w�6K�7�eJ��1r����wc5��7+��Y�3ne7�����D���,9���,��c��dY���U9�����e�~b�5[(en�o�Pt���f����?M��*��+�k�>e�|,�!n
;��n�W��S��x�O~M�EvB'e��{4gVF$6+���.,�����Y��]9$,;��������}X�YK��~h���s�I��������e��8|����e��\�V;�[�����X^���=�P?��X������ ?�����������}O�u�!m�j"�P�M,�|�Y'�����oLs\4������R���U���xZ[[�L�L4�^�-�jnVo0"4�{�(�X��#�P��,���Q��F��Iln�pzL[{�{q�ag4����0Ml��$|��e��rs�Z�g��:��}�����Y������-�%�
����+7
}�RW�����Im�i8$�n�^-��T�d��k��FO0)`�&_{j&������������v���e�����O����)AOV�-�*$�n3��u����^0�!X(Hm��s�z�Y��1Aj�^���0�i�6D`H,h&#�������B�L�v�N�.��Xx�v�s�h�<��m����v�d�v��
����A-����[W��������N�ar��-\�-��`#���R`J����
.���S��i8�"��
�`��5��9=��x=X�����`<4n��NKdS����&�{�������=��i���&�H���12�IIC�VY��Rh(���Q��W�
e� 5��$���`W2�NS�!����Y
�������_���|bE���A�`D���-�V	�Z������G2�N��a����"�0Q�10=9�/%S	����5�]��d4�Veym>A�c��9/igx��v%����t��r��}`*��A��t��S���p>�a~S��IY��`�G��qtzL[0�9������.��v���5�i������,L�v��[0T2��M�Y8;���X��$v�h�ay-H��T����`7<��Bgr�WA��YD����RGX8�����7�wZp�O��-��u^��G�Y�1�m�7���f������^�����*���6����k�%UN_��6��9�9�d�Z2����$�+ ��n��_��������S���M5���N����_\�S,
�h�������	���"%f��>�v��c�����AS;u}��<L���
6��b����.��[���w�����������l)�:�
F|��*/�
(&t.��e����VFb{2NKd+V�Z4.�����v��B��7�V�n�r��.�x�-����`�Q������)u�4U[PPdK���m�T@yx�Z�z(<�tt
�VnVIoP�0hZ��T-��7��.�z����~����`�Z����J�^����������
��Fi�w�I�6{�~��KB��f�=HD��[��o��\����E��7��&<��{�`w��3#6�������6��)�~,J%����G9-�M (�t�I�R��HsX�>;_�L�v�bWJB9=��X=��
7>����@���sX��p��!����Z,<W<.�����z��"���Y������zY@������fK/�����Y4�I�������S�
%��vi{������&��^�E|Ya��������~�b�f����'��Dp��MX�=;S&G��o�4���wz%N��xy�EF4+�;X���B\���{V�{9\xT
)S���sq�����}
?��/�ogn������7���S������Yiw3_�Yh�z��������
��b�d��e�vbwy=-����'z����p�'����m��s$������%�
D���e��b[����Vbar����U<�B������
�a,�fE �5���)+��D�EX����`b'+o�@��D��Y��b���������k!��v��k�b����D(L�;q��"��)���g������>#ah����k�����,H��g�.h��/6a��j��OW�`��R�I��`~�X��j3��E�+�X2;
�].K%��9�x+�I��svT�kZ�������v���S�}�c=�\�|��vV-"��V2�/�_��.)^x�;��#�`x-�/�\r������$�Dw��b�Ez�&k���>�����],_V���}"��t��Vu�u�!g�ZgR�M5��|�3Y\����=��d�.K�^�?��Q�`'�{��n?qa�|�C���m���V�����8R��
I��XX�*v�h�i�l��8�hx_��/����B[�����AR���S�!A��g������r�����4�OW�Kcf�t������4��0��������U�X���w��au��
mW���u)���/l�����I��hn�����9=��t��]�[Z$�b���i�M�9��=�@V�V����`��h�Q[��,l{1a[��#�i8������.��|��Dc�P=@l�y9M�3���i
5����j-EO�"(R�{H��<�B���������:���7%��p>���tge2b�_�=%��B���r��f��$:E��R�
�J�.xY��w&��^��Ltn���pvA��4b��;�^�X~Y_6kp�N��������p�4����p6o����-B�7:4��;���}g�V(�$��B�kl�6�:��9�x�7�9� ����������/�8?h������e/��F,��kdh���f�xVK����qY��r��TU�����������^�&y�5qiQ�T�B��[�B��/{����Gi8�10�KZ�0����Q86��J��U����)�WIDzc%^
U�����HE���p�
�V4�I	�R�i%���M\V-���y���&�{k�g���a��R��`�Z����'��')EN��Pu)�r���'��B>fQ��87��y����a����+V�Z���#A��%���k���������&�c%�s��h1�:W%��$�<r�o�eQ���j��s��g���?>�_�������(`��a�k���"��Fkq���[������5��O��}_��Q�6m�01O�����J������Ts�x�{���e~��������-��������9afu��vJ�Uq�X���������om�nA��w,��(v29G��
��b�Z��EA�U��nxp[���~�u��#
��sg���DH�������j����b��Z�4�]����MS4r��g]��J��0�m�o)�*����l���49j��u5o�
����;
�<:�EO����,�K�f�lf^����0C_tt=
w{8t�����G�`� ����r[�����Y�����B;��"�7�}�c�4��p�����N�4 v�a?p��X^ �w,�*���F�,��3g�f����>^]�qEFcydvF��?�{n���-s����"������]��Z�fA:��l�=;�7*ENh�h�%��j�7�E���{R�C�������D�����gV��\*b�v�i�lz�#������q�.���6%k�V�V���f��B���Xj��?o9T
�k;��`D/��EO�B)�m�����������8�����Xh������>����i�U��X(\��?z3�Q�0/6K��go�2)v�S��D�Yv�i�&[���z3P��?/v����y/��eo��K+�=�������*�n+���K���tM��������ID'�4�mE�X(��^^,=O4K�
��@���f�fS��immwA��5pa��;�EOo���^����0�(���J�m��^��y
C/���v6���"�V(��=���/�������D�������|X"���L�@��W�[�jl�4.��,�W�]�������F^�F8���_��6E���%Wyum�@����p�.,�r�<m�O��[���p�mU�bA���=
gk�iD�{��eEV��e�������
_��at�����Ld�4�o��LR����`�n��	�c�si���G��Y��m^��(�\0l��{��������7���W�0�uio��{Q���>l.{9����;����;%j����D�����v�
vW����:t<M%��
a�6V&v�BX�V�l����_E�^sb���a�3Xj�y+C��LwX��t�4�+X�9a���z[�����T������q��=�M�/�����t�D���bsq�i�6�`�������N��&�wzLn,]]�dB�bi.X����`���({[���wG	5��h��+(������u�4������d�o.���J���c�@f����q=�{��I[���u���P�H���Tm0��_��:����7� �������G�e��
E��J��%�s�����p�2��	E	�8O�
���������ium�P�$����{>�(h��������hX(��a�����+|��H�����e�iN�d�+�s�i�iV/���!'+7M<�0D����T�;��V|x�q�����eU��Z����p�`8s�/
���������m)���B6`!�$�a����g�%�a@���E��0"5���Wb��_��-�`����axIl�
���7�MO����3�z��
Eg��i8��0>h�-����x�����m6�:���C�^p��0Y%�h�����7�0�T2��hd�M�p�Ma���b2j��Ov�x*��,
}CK4���my���;�������Y��U9l�@\�0{q�<�b�$arzJ"0�4MtZ���{�R�a����;��RG��3�>�
=SA7�v�������,�!��+v���o&-:K�g<�$H
M�`�_��D������������i�6c`!k�
��������s.I�X����Ao�'�r@
��j3&�>r�`4�~�fj�~�)�.��l���!iJW2^��L��I��8�3��Y���-�>[��VnHc��<��N�����=�
�����o&�|[�����6s�<s��`�e��M4�C����	��;X��l�����%����h�/���*\1,�|3yf�-��O��\�N�-�6�&�)b+�����[,��\T`��V���Y&�����7t�/_[m4����o�t����l�YJ�n��k��'�����~x�t�t7�$�B���r�9���p��P�[���DL����i�����&�3�,����-�����i�E���-6���\8��e�;����1*�@b�
������[����v�.�xDg���l��;Mux��	���X��X�}�i(|yU�����V��;�z|q�",����Y��������-��s��ewy��J�vgnv�P�A����7�����O	G����tXf����Z������[~�c��.�]V��]u_�^���cE���M�}@���)c����[�3�`�Z�g�o���m,�e��O��(�Y����[IJ�s�4U[^��>3���V�p�����}�~��@�
��`�3^�a�:sg�
���x��s�����nyf��Q���gSt+,wV<c�bZ%�a�f{���x��ytkw�%�b�W��#h%��[3��D�t�9+����ukw��=�e�R<��bY�Lle��rgQi��UD����(����"��%��n��v��qgJ��GA�[6�3�`�iaN��D��r��EW���w���V��]�n��u������n��7�������w��fx��$-��[������L�H�J!��p>���Y��0-�`+k��
z��������"�����U����J��0L4�����]��[l%�j�TX�*z�X�F���`G�{�4���l:fO��S�)���������������c�"`i{����B���;�\�B��n5[��Y���^,D�V�����"-��3[�g�$m�[A��^������a���K�?l���1��]E���p6F����
�&�cU��2�
���vV��(�
��K4��	;=�-�%z�1vK�vh�v���y��%�gO	�S�2*��
��
:{���Y��0U�B4��C�����`g2����]#�w6��v�'�����3�z�OS�Q�0��
���	������rzL����� X�Y,T;�*�uG;4�����"X��f)�Y�����.����b����I+���{�z�����^������	���Q�!�>f�SY�]��<-���~9~xH���%ZJAu������
���Ci"�\!��0�-���\�j)-	����)m������d���R;�K=+~����/hjc��{w�C�s%��R�A�Z��6�`r�tK��7������AN�ic&~N#��lO0��n�R��H�� ��IF�����}DC�6��������tuc�J��j��|I�Fx42�E��j����j�1��{����	�5,�R��i�l�0yX��.Q��������=�]��%��D^E/�]!^�4k�u���0�%��+8E3�"�PG,����{G
��4++��^h/�S�)��"���<k&�$�3AT��d����Sa�h��".L	Y�&��������hhQ�a
��x��*�Y	�X��wEi�nE�N?��T��Z+v��v�]��.��������������oi�BKJ���	=o��N�k��=ab��eaj���#��h��wm][��@4X>�/',k���*yYX�,�uK��ba��TzZ^�m��C�����fS�}A���k��{�:[���-�;)��V�������w�9C��\hm�-�a=q�W
 ����}��4X�N#v��fq���Ez25,��������~S~=,�5�;��J�;*U�����p����_$Xx�
-EV���G�S��-�j���06�����6�NX��H���������/h��-4&������	:GQ��OE6�:������0�)���s��Ou&�+:�:
�S�;��{yD
a��g�����i�lM����w2���p����y'D�Bx��������,+v���fQ���5�g~X��ba���B���zp��~9��Mm�4�����n�E����X(��q��Xl6�N������9]��{�1�������p�%^"�]�X"����o��YPb/���9W�������������E��������`�7������������b[��:,<X�h�Nlc�9����~OV�JK/G��;Ve(�9t��.������`"��7|
4r:�OS����E���b���]��6G�OKdk�(��,�"���kXzx�OD�,�^�.�3��&�)��e+�
����6��������pX�w��'����8�'��ts����B�����2/�P%[H:�L�W����b�&4I���+��[*����3�a��������D���b�D�Yx�H�8�_�%��|��+R�����T��i*f+�5���e):�������r/�q9��4b�����>�Y��h��Fl+�<
+��"z�H�Gf�b��__L����`���YK���H�P����a-|����0���;��Pb�_b+�[�b������P�;,Z<�%*�ax���+D�,Z<�W4}��&A�2�	�Jb�1&��B���������i�$��������a*�������|Rif��b�B������������g�����D�q��-�
��`o�o��ue����*	MC�4��i!M�J�������Y���\�y��-��z
>���=�7���,,�;�~��,�tX"&�IJ��<���G�7�t��n�V�,�����e#bg����3�{M�]�U����aR��P�3,�<�
���>e/u(Vx�ZQ�JW��p>���J��0K��o�i�Y��A��ib+?�-����6���>��Z_����v��}U����<X���
�P�B?������%�����`J���;�:�l��g����+1kR�����Ev
Ll
����+=���h�N'v�_$����PfKe�l�D�����f�J�P$Z,�;+w"�hV&��3�����a)����DC��U��n2�����)���@�Qa��P{1����()I��j��'�	.j�
�����^�W�����4S[mL�N��jP���xt����s������m�O����7!	���XxI��3�h\�
�q+_��L�	zTr�,�<`&g����^)z��Of�z��I��#L	�T�G3�������0��g�J��p��b��������M�`�i8�LZ4��"G>�\1���Bh�
�L�6�4=U�7���7�����_��I*�gW�j`}f��$�cB���z9��p�=K]�V�-�<�Z����(i���`����
�Y�aUhZe4ls)��p]�Z�g�o��D6��n4ln'vA���+N~�3:\���R:���Rv��oK�>�7��&��}���`��l�!9=�
>�m �e��	�A����2��reqm��������\���o>��,=���]��lX3i9�4o<�+I�������ojqF�������{6�q�%��`:��7�5��`����[���1m���+hv�<
7���p���u���un��r��w�a�[l��9=��L�q��5L3��`4�5.,e���}vZ^��t�A�Z�X��()�J��%�������["9���n���fS��4U�0�.&`{�����a��.o<oeo����n�M�
�������b�\��PCl��03��":������}��9�.�`oX��Y�KB��PX�������	``<����:,�<�H�hZ��,M��+,\zC'E����XZ=�'.��g������?�����{O.#Q�tO8-��h��+9R�W��S�����9���p����k�j�`��i]��2�D���4\�p�

���6��6���i�d>�]��4����E�>{��n�X�� ��f�d)#�Y:���}�ba����0g�4���//��D�z��p���vZ��������
���ry��+vl;Y�������/����{��M��=u��-!����NK��D����D,e;�Ul�T�����"M
v8X6�-�f]L�O&,:���&s��
��)zC#�#6i��B�%��/A�
���nA��?��B��i���%E/������Y\)�������pq_geQf����;�����f�����Q�����]�i��*7D�*K��&��B��*-E\V!v�M�����/�|)�13����0G������dB��7�	{d���qYA�����V����'+�����,�MOV� :�J����r.D/x�v������_4���R�bs��1m�����-����Ri���~��S�Aw�`=���x'Kd�������u���1�"Eo����N\��Z�wB/r���	
�{����eQ�/kS�M��>$
`hQH��k�-�hAzZx�R����F
���'������f��V
�p�������B6������Ka4[1��Ft�X����
�/��H	�D��0.
gJ��%�x��_����b�p�D*��-��.|�yW�P�W,=�-m6�����` �_���*�~N��N��%z��Yl��wZ�7+��N���X�D��+�	����~/���������f�u1�
# ���)�m���
���0��,wz�M�O�:+��������E�0�&�^�\��;��GTT���������J��
vBOy��l~���|����������b7t|���[(N��<�b#�a���� =<-=<�h����e��d
�� J��r����N�!]�#J����7��p��p%8m�	��:���������b;�/��ad`H��p�&�����:���,
v��I=0Sl��#���������p6�`\9�����������1}�3�<���>�C�/��c�qoV�)6������4K�z(���/M���x^V�Y��4U2p����Yv��d*3fa��z^�~����z��U���	s����a����B��i
�	�M��������*X�[]l��9-���,f!
�1R�e���)���iqm���@Q��oi+���f+Ogk�I���*b{%vaA]��`��[r�YPw��'�����9���h����{6f��?v}���������hf
��a	�Db��*���+�S�8%�����\���"����:����PG@t�[�i��KE7��D�D�<�����	�������aB���S���>Z�J��J���8'�cK��pJ��#���rsIIyVn����L�S�Cb�G�Y���������-��P��t�����)r���u[���P�h�2aEN��4�����l�9����6`��y�z�4k>������a�����D�:a-B�:
�"J��p0@��3x�[�wASkZ�4'��.h������X5u�������������o������
���I�KC�.9���cVM�L5U4���a�O�������US'SM
k��$I��l��NOi�
����V�G�����d����c���	s���0���+�#�Nh?K�V�-��Y����������K�;�T^s[�F�
W��UGx"D�F%Lb���tOE��b[��������]
C�b�g�������\M�m�M3�:��b!�*f/��.�\$6�{3��]�.���>h�/f��mL���f��b������e��\8�r�;��h������By��6�b����p�:V;S�=n����hx��&-���X��.j�����&�bQm���)�S{'�����	w�h�������w:�OO��)�I���������ey����D7�������.���%bsX��pA7�����l�������P]��L�X�������2�P�o"6��>���T��#:W��g4p%���2���"���Z`A/x"��f�,L�[Z]��L�X�*8����}�2�e�a�B=����#����E����#��
���z��Z�`\-^LE��rn>#W�jC�QL��|pCm���m6�N+d#:��B�����,v���X���l*�>,�u��
[Z���#'��i��4YG4��Hx���<e��b������J���%����ei�bs��c�\��E|� 7�'�Z��v��'vW6kKC/�W"
����x?,\"��9Wzk/�Y/����4�0�So
lAtY�z1I��O���<k��[��^��^L�BtvP������RL'+�4�m>h�]��^V�^L�O4��M�7���b���Z���������(�*���M������lM@����� �\xs���fh���A���{+Q����@����+�T���g���4S����B4ll">��V��(�Y0!,��?�SBG�7��W7R�
9������7��K��������)AWUe���U|���tX�bjVbs����Zz1ah�#�iO��b	����R#�\L�0�����v"iJ'��ium<����pj3��C�v.��F�v
53��(H�.o���e���T9EC����HO�P��,�X��i���U(3��LxG�]��X��[�;�wEN�YS�O����gd�^�dU�3�����z�i8�O�mt��^��
����a�/��P����`�Y���9*]h�gi�����,4��(��X�d���%Yh����6N/�B/��4
nkdxj�

��r��8��j�Q��j{���p�b���qi;��,k;��T�R8�`a���?�Ek�-�.kY����In�-]��GM���G
-�`�
y������������-MS~���,��HR�ZR�NKuZ]�m��
���Q��F���af��Mn����^��RAhQ����Vj�o�v+�
5�<2t{��I}zL�mp��j�
�����{^v�)vxZ!������������l���9�]#X(!&�:��������4��	�k�$Q�cK��0��!�q�axZ^[^������U�O���z.��/&V.����5	���-�g
�w�-����v�{���%���'�p�X�}�(���c*���][%}1�t��.,U�7!�>��^?8�V\R�g_�����j�^&%����+)���_�J4,��.�f-k��J��7�6�9	��%�D�T�`s;�����e"��7�Zw������5�W�����iym!C������
��i\�������`=�z�5�>
gk&"H�[;<����sxL��/�{
]�&;*���	��>��C�A�T��i���4~:h�J
����S*h�x..l��yzJ����bb�fa>U���F���|?,6T��%�o%��YZ:$��$
{Z^��`�>4����������[�:'����1�rNS�M��i*������o���oW�s:N�k���Er|`��_t�\0Pl��9L�:�������)��h�VT�K����_I���b��ia�D�a�L�B���������n�Gn��R�o����E��FP����?����0����������������[P�u�{Q��a�J%�o�(�m��-��AA�`a�o����a����;%,������v@?����}����bG%����n{ ���4kX�l��;-�
U(*�N5�<�U����*����qS����.t�x��!��|9Z�O,A�,�?x������p�wv@��-|[�;,�2B����}���a��h�2��tw:x&}�����a^��1�j)�6�{(�v��B	��N��<�8��^,�P�����	�>��sD�k���S:M��T�$���i�L3��
Gl�f=-���os�����g���S2����������[��JDO�1U�=k��h�b`����2DD�$�p���=���%�xn=�	�5���I�,��|�i�0M{�Y�=�%"OS����1�ox�;���g���3��4����(`�Z���1�"0f��iW��j��+������!�Na4��gaP^�]��m��L��Bzdh�7�1�������]�M�J��A��|��2�9z�r8e!�B,+L�K�N�i���M�]]�t���E�{���?,9Z4�86�NbY�O�U�
~�yN-��a'[�,0 �C����bw�Q�c����:�f�F���X��ZlOo�i�l��8�i&^#�����Tm?�l���"���U�9C����r���b���7������Z�����4���U��z�j�@+8hX=(�*��>V��-,��b�����L�X]��	�6&�-v��+�Y���D6��"��|��g'K����<>l�N�k�����J���a����U���w*��z�s��kM����r�J�T����m����u�:\����������~��s�w�Q��z�SP
����47�.�i]���y7\�4:��oo��\B������TrZ^�|��/Q|8�hF�J.�R�Z�`k�?0�)-~V�)vD'�nS�	�����v���i�6���_4����u,�}����[�sXO*��57bi �+I���&��r�E���b��c��j�&�=X�XX
�J��?�X^4��2K��l��J���v�/M7��%��)-�s�Ex����^0�P�
����<��4���e�tbo&mb������@�C{9�4�0�J9�6&*6��;-��6xK	z��H��a"��R��43$�P�������0� �j}����P��a�?�i���}/�V�aK�?0:t����2=Mz�4
�G���ar\�ox+��5n���c)����������w���S'��Z��|43�w���C,��%�������Xe����`;�I#�������X��hz;��0cKl
���4
���0�Hh��v��� ��X���eAg��i8[0[
��K!�����c�������	�J���5��AC������TcD>�B���Z����.� z�=N��E� �X��
6G�N�i#:��=K.o�h�wK�S�����a�r�4WA��{t��Vs����[5�D�������|�-�n�h��(	�4�i�6	�� Il���8�������)m�0�J��Z��^5����n�%K�0��	Xq���X������;�������MH���6	�E$�����-	7X��}�����N�/�.��\�5}��R�P�J��\������8�CO����W���f��$>�UX]��L�Y4��zO��G��+��	&.-���?�N��UA}���05��}dOT>k�����~�`o��(U�"����i�l�����.������;<����f)��I]������uba"N��.r�u���
z�O������l��)[���� �i�-
s��-���K�@��h�
l.�{�Ra;��k����8�6�T�_���K���%iKC�����<��'�q-F2����/3����Rf�Qoa�J�H�@;�M,������C?0eD�0���l���9�^8�q�k��A�J��?��Hs���Ntg9k9�NSm�*��DCAs�����,�v[�������������`���Y���+���B���r���X���������]�7�V��LI�t�|c[����n���m������g�M�-��Eo�o �b�r����EC5O���Y$��%�7s���}�������qU����G��~������f.l���}Y>J�����i�E��Bi�w����q�N{9��%t������6S����g;���]�� v3���\�5�V����(z1���
w�`;��)��D6d����A
[��o~x�X���^jl�po�C2
-�`;+�������r�����p�`�~,��=a�2�m����dz��tY����`e��jaj4������_��^��2��X�]�H9M�%���/��,�Y\���-lqo�"�.������P'����E�7�6
_��[����d�Ab��zZ!�����v��l��lg��f���fi����*�E��k���H�-=��E:��-��={C;�,|��19�c���6R�O�Rf\�h�Vq�Y�{��p�����
Z��,:���������:�����N�K�����~V���Y������h�����C]zb��"���a[c������p�d��qA�M'�i�l�3mw�t�W�����;M��X��lxS���z�|���FN�k��>fVBcL#C7�t������l��.Hdm���&�������������c���M2X��'4w�/���mM��4�EO��[H�������;K�����[��{6+����6.�5��D���:��Kd���`[t&���:wz��mp	��[�[p�[���-����lcj�b'tC������nc�;�a�S��.l+4��Y�A��yj��a�QWcB��j���	]�A��Ak�����MC�����w���	����8����W���c��M�������e�0�.Z�;�'}����f������.�����Z��^A�+�P<������\�W`E��B��W��f*id��1,|!"e2��Nd�
��ZB�}o��a�|�`�f���7�$�Ud������-X�a������a�(�^����I��|A7�V0�������Oi�^������4�m'e���SOj��=�q����d|OKd��)���-����xj���%��-*hj�Kb������6[��������hX[n6m|�����:AOxM%��^��0�����b+;���7��}��q��s�������	��D6���8pd�����@���B������(��*5����$A����,M�O�`������,��a�g���o� �_3X�c�o^��S��b���tC���p>����[A�v[~C�	��D&�)�0U+�g����L�h��U4b+_��i����s����x&��ba��R���WQx�������n����`s���c��������:X����T���2��F����C�4�mN����������?�������MC�,�#.��d	O���������b[%����	��0!U,@���m��W�����8������e�	��o&/v��`�~����`79bN�����J�6��X���~��NKd��~�q:��Wb���Uj
�rY#�%�E�?���F�Xxu�������7��}�$�`������O������x��gO���s��i8�m0q-h��$=�[�����lc�������"��/a��L�T�U	�[	�R���'����|��W��41ZJ��~��r�����Y�y���h�B��%�qM�����{�J{�i�64�1/9{X�lby���|�w�<O+d;�)�����A�^�wA`~[EC�g�t�>dX��n9�*�4�m+�Y&��0B�q��$�N��>*��MEx�	��������g=�By���f�
���b3�6z")��������_��Zow���p���~_���I?���Lwd��e
��c_�B@�c���������3n*>?=���$/��F�f����p{�p���P��gd��}�}�����m�"~XdG���yb��
�m�����3l>���	C�����o����;��)�L//|�/��efY��,��2;��h��]����W�jd���,+�7�>D�������a�!���N�2��t��*��������^^8��
�l���Lw>7�E���,�����s����H��?���}k*����7��qVQ�����L���$�����C�,�74�����lk���
�6�+@.q��_�6J�6���>#�7!JQ��B~�`�
E�L/�e�F��f�,k�Y��5��
7�7}�7���Va\��Po��Gj�U����m�>	|T>�z�����/�j�]��*�����c^6�!4K 3���q���fox���}��pZ^��(l���T/I�M>x^WI����	L��sft*w 5X@zRf�`�iumi��:���p)����<n��l�B�W�Y��4�->��Dx�u�������%���D���?���$��/����N(�lz���%g[��l��<m���,K(����l��}�������o���]!�	o�V�g?���K������l0��O;X�����^�����l�a+����V���+/�ME��o�ACH�����3.�����������]DuQ2�gdh��j�7��J������
������}Xm�AQ���\�xzJ��H�����I���NITv������?�v5����O���Db>�'4������-Mj������my���t��oh���`g��m!�}����V�;w�"��"]x$e�������GWq2�4��K4��@��4�eZxf'�\
�����B6��B����%�`�Z A��%n����h������}F�������[�����qad>������vZ^��M��~�~�Y���*����E���K��	�}��j_���������L���t�v��7=�gl���`��������;��N����2}/����l�a�f��f�������1m� �4���z�����Pae��6c`����� ix���=��[@HU�CC��T���<�E_rE���Z����a)���Q���S���1�
��V�Cl�d���5�H��^�GN�1������h����a)�������1c�H@�lV�?-�M X u��Y9m��)��wUJ�0{)����6	��7��_��C�7�����1o�A/�:u5i��Z����~B��a~�P"�����~��)o\�E�<��`6�]���m �2b�����vL�4h�9W��6t����`g��S]�c�4��t�+Q�e���p�^*c���<��4���)�[@�LFZ�t����(�*5��^���db,|�-IyL�H%�lG�ifY����V���f&��W�B*���5�5���,�eZ��aYP��g�B�-X�`h�lo���	wAg�i8�����C�F��k}+�}�N��l{�����J7�Hu�^�`R����;H�63Qk��1�{6��{�.��#�R����E��&��`���A�9g-��l�$l��������LN�l��������*�3;XAV/���*i��McX�����s�/{Dea]�#y�N+d��v����j#�.-�����^�U�)����J��c���!AW��
>�.���32���a>��l:�#H���k���5V�����"�)�|�.:=�
>�iy~�+��|7�nQg8����4�3�m,�}��d�m�	����+���X��:�&�������M�<�7�U�o=�[��a"��"��m�A������N����Pnq_��Mh�4U[@P�-�����?�v�3�RD��D6�����|�������{4��gG%��m�@/m���[z��w���?j$�%K���6����y���K���\����E�D�o��������������0�)�%O�i�����Utn^�����NS��*:�D�FRfs�Va\��3'��M����//�<D�~Y������V	 ����b����L�{���.���������9'+������������"u����"H�f�|���y=.�=��Vs�����L �P`Vl�eS��<�R������K�=����s�g��-�	5K�C5	��9L�����l��*s���t��E�ai���g�4�mM&b/:g�XV� v�������B�s�x~c���I���oQ��O�f	����e1*��W+���Xp��,�_�������>f�������:$��|vb��pZ!����_X�H�`������]Ho��o�f^�����T�*�Z�n[>��Z�f	|���/����Zf��n��*
H�e�Ebg:�NKd;�mA�c�j��h� ����X�[��g���Fk�|j���mW��p��dkbt�s��B6YZ�i�W������lV�o����C`eI�b7]�`{e���/����D}�^,MH��2�N�i���K4K���~���gh���S������=*^Tk��f�/�Ss��c-��rD��������fszL�"�$N4�H���b'_���kY���[I�P�P,�i����fi����E��f�4�ln�wzJ�"L@��6����p��y���{�L�w��f�s������D�`i6����vX��1�r�4c52\��X��
[:Ll�;�����>`���4��Wp
��`{�mi��t����N)YwLVb�fo,��4��[�Aif�����.�*��:�wI��������0�$��DZ�Py���hv���,T��%���Q��;{�k�4���]�W����t�iAoj	�F���i�f5��B��	���A�@iR�t�w���R����vb:����e>������t�u�������Y��1Qw��<�RC��O��1m{�������$D�
�����D���)����Y��}�30�N���5�NzL�L�X��o���C;M�#L�e���J�����6])�l��o��
���4�_�f���c��y]c})�~�������xQ�Sy�|8Cc4�A��M(�0U��7�i)�j��Aba\��K#gS-�W)��7&�.z�x������}�� ���b�Y��l��/������N�����y��e/A/�/v�T�`i�e�wr���&}��]���TF;=-�w�^�^�x~��A��*����&�C5[�-�O�E��P�G���!P)��t�9-��L�����k����`�K�qZ��
��e���/j*H��6�N�i��p�Z�S%��d��j���d�E��L��C�2���{��;�m,��~������
�$AwX9e�~f�{�$&��%�z~�yOA�"�����X�<r52\�0�����6����h�_[�U�R�8{�B�a�rI�p���{�^��UN��L�\4���O��eU

,s��w^��%�B��#��B����J�����Z"�1�q�7S�;�@��&�H�����HX$�V(?�J2�����/����GB��O��1mN�1H�)^���~M�"t�r UV�6�Cz��!v���`7��5�B��f��Fw<5�������-F]��=��q��7��1
��:4��|@���1m��Dui�C��z���M�������|�:-�-F���3$�E�0Uk�7������\5k�7X1�UN�~�`/��(���C:-�
((h�U��?��%�rU��]:�k�����s���������e�����V2��aG�������M}����H�X:��tL�=3{YE��i
R�~�%����m:�������]p_)X���;���`����u�IA�c�����ed;��c ���9����G�t��'`�J����5��Y�4KZ�mlm#�Mb��"9=����$EWPxd�����'6�	*��V)(:cj*���%�'J6����yZE��[��/����g�w���������x�t):��R���7�/G���4d7lDl��b
w��n�m��������T�����#v���lbk�X�]�V���Uq����0��hX'��YPl�"��mzrf�����x��r��-�q�MO�t��.a-G��-�����b�tam��Y������g'k����D�nAtam��{f}`�r�����Y)�GfD���z�u���*E���$�VN�T�,e(z?<�4��u�y`�eF����zn��Y������,�*v����}yxxD�:-z�/���IZ�[�EH�b]*bwg�=�?��m:&`�>����6V,��f��b�eN���k���$�0G�	^bG��b�paa���(�	��mis�M�1L ,����a�^t�Yb�`�~���pQ1�0��x����'�xd����A"/��m���c ��$�'�(�2��Z�EW�Q�G'�|�<��-~�{�=;3��E���W��?/��QM�`*���(t%�`���g��
������L�����H�xw���p��S�7���m*�,LST��x��&����[�Y������Y�K=L���g��8w=��>q���Lom��w��_')|������|yX��/��9�8z�{�U���?�����{
��6m..p��}�5�xd869z�W��x�3k�4���)��Y�Y|��1��)J��!�p�IO�"\�EX4]a�`YT��^��arzDF�n}��_�����6��dE��w��~���)�3�b�|����p��T�{��'�Z����@V����q��=)p����U��	9��w�&;%�e��bg�c�X�[�h��+ay�N�;`$-�0��������%��|��5�]pCW���|�q���y��!\��GtM}V��-�G4�����hr�O�����!\`e�����*_��
��<2��D��}�Nw��
�U]�~�XXums1�����V�b�pa�a�5Smo�pa�O��y��v$;���~e�N��������pV�.����,�p;����6N��y|���{�`����`�K����Y[!\�BX4\Xe���D�o	�^�x9Z
P��l�.�����H,���]0� �of�i�.l�]�o����6��n�Q�B��E>���\�?����j�1��-����{�TO�(}(}��H��J�3��e?m�q�h�a�K�`a�]��Mc�Gd/.������u���;1.�M�5'�@{����.��L9�W)S����&�Ev���a/.|D�r
��g����-��7hZ�,����ax�q������2��h���*������7�����a����2�����m0�vo��g3&�b�q�K���M	���;`V;��������K��oe�������������,�r8�	?�?�j��*�b1�`z��bi���vdz��.0#�K���[��Y�����I�<nf�������M��iR�?k�M��5������1���r[�~�i8n��,z�J�`����:��9!������=`��a*B�����q����w|��v��J���vK�	z�E��@���h�V����np�1X(A��o���S��[�Y,�����p
�B�Z]�.�@�~H#�2�-�|��\�oS��M��jX2�q3k�|����pY.`��`�Mu��#L;��^?��Z����e���xzD�d`ib�����ZF�/.P 1�d;3�v�K����5>�����6��������Zv�X��4��wU�����KP��y�Fn����R�����VV$(�m���ZA\�2Ht��U���L�+:q�p����B��e��.VO-��5��9���6�ZX�{��4\�p�������q���:Q�\��,�=�bOlc�Db7]��.��^������7���pny8���/��=M��-�������k��!\�CX4�����M=���W�A�2��h�{`��$����/�-*�������P��Aw�}6c�=\�/:���,%"�e&��Bl�{���p���]Z �mx;�W
?�7���6-W�C�*�BA�����b3'�V��wo��p:	~�"��_�
qv/U>="{��P4�6������m:��������[��<��jix�����=�Y����Y�\h��������
���M3��X����0��a3Kx��+�C��G�xdL��	r�I�lp��+�����	�I�g���. 8���_m�$�R�,C���A��bX���z���p?��tMb��Xx���L�Q��2w���D�{���A��@���:G�f�S�JW�Az?z�4�c��-*
����������D��J�
��J'�E������*[����9Q4]�Y��}%F�BYg���07V��+b��d�lh����a�Gf�,bW�L���{����������EOVQ'v��$��f��6=����i-��&���z�b�b��������b3�3���
��A��]�>F��	b��`���`�[#��J�b�Cl���j�oe�����S�Yx��Xx��������Ml)���/+�i8O�p�4M��� ��]W�m�Z;�����g=��%kh�I�����n���+u�lN�����cx�7�����Y�I�L�,����Y#�X�d����2+�+S,���MM�Vqv��[�]0B�������M�o�K�p�?�}�rx��3����"��u����E���`����w���/;�+\�����YXqh�2��t�Ks���}���0k����em�n|�N�.`���qeT[�+�PMW����u�U���[��9���VA?p�
v���.��3�^�u����&�.��n��k��6���9��tb�p�K
K����X����`i����W�������A������~O�L�g41���[a�i�{o�=���p�],L6;G�W{�������B��e
a����%�6���Y��\a< �.�>��BlB�_����R��G������{+��j�_��KCt�>��(v���`�����u�sxC}I��/���R�����`~nD��s�Sv1��������S'��K��4���L�k�Ie�'_5�i�M����.���e�j�waX����g��"==!�@�;+Fz���*�`}y����gl�����_g����&?�O7��
���������.������ZUx�:q��#j�4��c[a�|��L��R�Q\5��	vl���9�b�]�p�6����*_����[s}�&��k�oe�_�.9����Y��|?�8�G�����'f/�F����y�����}[�[��W4�[�����|zBp��M���������8��m:Je~Q�0�y><]l���6
W��u��R�L��0�
zy��{��=�2$)N�W-�;�ACy�G��(S���`;,�
vf*�-V�O5���J$���*_���I�����a7����:���VA��4�4z�!6��[���������e��55��of!i5�fI���K�P���U��6������9�����'4?��,����3�+������j�w�:�
��AC#��+�t�[a��6�1U��g�`ikr�#q@D��y�*�n��n�{��R���'�6X���i�`-�M5�ZA]a�t���Z#]a�#'3�E���/�Bw�E��~�j�H7�Sl?�������nS��6�&

DCM���P�6�����z�?�~bo�H7�Z3�J��v�I/��*vm��#j~D(�gq5{�a?����b+�����m�&������b��o\����,�fk�P7�&z��A�����q�o3�g���lB2�,�n���,7,�i����Y�Jt[4���N�h�[�X�XX"v������U�
�%A���������D	M�,v$�~X��Y4~��k6o�S�D�t��W��&����n(G
O]Kg�`��Z�o�3�+�_7[��M�����p���H�6��+��C�n�������w�H�5�����fy�f��}!A�������Z�N��qYo����H=���N���&�����T�
�fD�[���6-��=�]xv��������mv�2~'����F�~`-�m������zf$��d}z��Xo�hxF�G�k�`gb'�Y�M�^A�_f�-^�����Gt���,�np� ��4��	���Yy���=�Y�
��
��b�V�{�T�"t8o�avo�8]��uO
ef�n�����:�-���Wla\��U�����:�yc��m��
zw���#�J�,���J�.��E��9]�c&��i�i�`��\D��
v�Ux�F�6w�2n��:��_������
~x�.p�Z#�?��:6�����P�o�l��2���A���5��!�m����e�L�mo0�tc���$P���e���N���\�����F�;�����.y��O�����~'�����i�E�C��f*������%�6��{=.��[&�������6����`'�j�w����,��>"��������~�n������f�w���h����R�.�A����pi�)K��va�G^���I��p�t���a�":1���
n'M_���W-�=�9Z��+�X�h�$�sf�������a�����{��a�=�rzD��Y����t-b���b���M<!��Lh-z��0��q�T��0�����^��cnI���������n�}C�kg����?]�K~�3�Ip,B��I�����l&������,����	XM����7�)3��m':S7f�7m3����P�g;�]��D���|�Pj^jl������pDw��F�$�fcy�mKA�c����N�
�
N�A���������Tt��m�j��<+������`S
6b7X�4������h��Q�j�=p ��*93G��n|��z��+�w�nL�,v��]uf��ri�
��������a��	v���1���K�~�u����4�~��3�9=]��0�8u�:ga�,��J�������t��3����
�����Ku ������{vOR�.�����
/�/r|���.��:LN�T�{>��}fa�,4���k,O��a����3�25�>3�������3:="�^�P���:��������_���*�WR���!RDg�Q�-7���~81'�>�J���R���.�A��~��f/m]�j)���\��u�5z� ?
��F����3�:t�Y��Q��v#'nV����]�������+�
�_�����T[����������MZ���6U4<�O,�������\mP�!f��J"��#qt�6�����Y��xK��*�Ow���Z-?�+�Q[�(��5�����#��O$���A\4���%��H]��28=]L�*z��$�L9�}���VESD���j������*wN����k�absq?���0�6�Zi����f��������_6�[q��_��&��nWkg�,��G��e���v���||�p�D���SV!-�aU0bWbW�[�Y�X4�w���|�Mlt�e;�1�feB���c�?�������x�-��Sl��uN��}���u�E�	���v|����: �&�K����Un�~X�f�����	[y���3�i�I��K���>|�o�S�1�&�����U����rO,l��U����&���=��yZEC��X�zT�������^�����|��	~��'W�����l�M4��(���`3��n;,<G�`����<�q����6��V
��@�4��'�d�x_�9!l�����D���� �l'K����tS;��de�jb�}�{�x��b�%���mL�����w,�\<�mG�b�e����!k���T�|��Y���M�w�e�����
o5��������	%N������,�����SG^��X��9E�Z3K\�Z;�����ha�pf�_��.>1�����V����^�na�}MU�0����^>{q���������b��c;="�@L�*vrzdaj\�dv�����N��!+
�����|���8��c��Q�}_���e[�b���(c�6�vVd���f�	6���`��\�����G��t�B���}�M\3+���\������������lgm�ba���8��[M����t��[��W#^��ex����t������{�������L\�^�w�TO���\��A�XV�*�"��p�v�Zwi��pA'*Y����iOE����[{�������(�Z���������#�_�Z;\�f]ba���Dho���l�4LT�J<�2���]7�]���v�i
38����p]��LX����A�p/+X�S,�,����p��Sw�}���1�_�W������>����E�;�p�u������3O����hJ�d~���`UMSZ>��$�a�I���u���������4���g�x�VX�lI4?w�;����.��BT�2��Q�p�n�����u�J�RJ���5V���w�4n���V�a�(���"8�c�_�{qC�eV���J9����n]����."/�x�����}`�\�K$�XNdi�:�0��r�8q�����;���#��6�5�0�k��O���&�
z�(5�J_��+�m�`{�P�n�q�S�������X������p�v,w��t�M����&�{�;�$�0���a�L����}�NcA�J?��a�7X��kNL��$�
Cy�Y;�XN��-���I����G�X�f���AW�<��0o,~����F;jc6N���-�Q'��8u��(k��gA4��j�h�=W�������%-����xy;�F�s�6�1J���s���:��AT���$�L�{ea��t2Si" �j����)��,�7��@L,��Z2u���w��9���0K�q��$�9r�����=�� a�����l����T�|#�v3���i{\��Ls���r�T����+����t���v���hK���������������M�mp�'��'�����=Z�a���G��;��D����W�$,|�"�M���mG���&hZ�2?; ����p�6�wX��J:�~^�����
��+�}���N�9�!��pz���Q��[2��6�C������*���}���.2|����	�}	�/q��.�R�W'���]�4���w"s��D`��U��QH_�	'�w+�;S���7)��Ii0�d2y{n�#c����3���k����`i%��~���G��k�~`�M�|�&,$[��s�[]��k�g��OF@f�~��A����4�c'��)	=��;�����:�aj�n�={c�]��~��g���4��^_yz���u_4�.Z*L�V�wX��tV�9w�,Nc�V��4��&8j����-��j��k�������L������[�/�{yA�z����g�|)����/���C]:�~�
���}�0�#6q����*�EW��;Q��y��D/�5*v7�%�-�}����D�M����e%�B'�z��Y�!v�69=���o3�/�%
��&�����<����Wb��Va�����?��r����#��t0���#���'!���"3��"�#�
K���&>�N,l���2Ow��.�k�%1�������VV!���$�'��{�b����[t|x��#�	���|ffC����������sX�
�+K&��A�������6z�z���x����t�����H���<
�X���E����sX�?����Fx��-�{�TO���1��[�H�r>���#�4�?�-�R^,l��5��a�����xQ��$�H|=�W��.��"O�0~������n1��	yr��=��%�N���p�]pESt�O�kb���k��it(�<k���0	���[���R�
���A?�A��>��Ku���'\�Kgq�����.�[q��6�E��/��nN��>��{u���c������H����������t~���n���9��+����2�^�N":S'3,�������u����	�E?�
�a!��	����0���fY��X�)��[O�6
�2���(P8�J%���[?`8hxJ�G�����k�pzB&`,=����k����+Yb��9�,��a�P,�f���!O��8����e�b���������t4�{�����g��J�.�?���f�MsA���3.f+4lf3��x�M'��?f���Q����]p^��-��Mv����J���Dw��	��P��sQ����x�k����M��
z�(!X�h��x�KG�0�4����J0��8�d����:!E��nvX�?`�S
|��Wg��4_1�[���d�,�L�/z��s�7����3w�(���E�#r�v���l3��6m����tbj�M�.��~'�
��\�����~O�y�b�-�Gf�����lP��Vw����:�������k�(�n�S�����]�����M�[���ox9\�
�O2�-�=]�?���/����Y'N��JX�4lx�Xg�XX��a��|��.k�h	���L���Z�����8S�g��!`�
�sf�WS�mX=��Z?=!�L�-vk��}�b's(�e@]r������,I�8��
K��m�����YL��I4��L��L�������U�7���&q_ufUjw�`�n����r}�������h�-���~Xd2�����8't��=`m�i8'����TG��c)��8��,<(�w�)��Wz�]��i���3/�%��H��������
nk�����q���
9
�\�g���L,���B���"�k�����0u�h���f�=�0�4u6XY�&/]���	���;x0e����B<2\�Y#=����[x���s9\h����Y������rS���G�����,y0Y��
��%�\�d���y�L}�=��Xm��
�4� ���}#l&�������;��)��E�~L^U���L���W����������M�z��9��NF��3m��J��A��2
��
@�����E�Q�	^jhc�~����A<�q����3u�00�g�/��_����'q"���x/�N��'!������H:�8�}X;<`�R�a��:a�P�+Snm�1����M��V��[������g����;��[��������y��h��s���Le�-�n���LQ��vu��	����#r����X%34�
��S����=]7x�l�|��Ku��'dhN�V3lY�3�L�[��4�cf�)���NV#+zo�8
�x84����:;
W<�qD����p���O����bw��=�gN��|�h�
�����t���l����i��d���Y��Y��l%����M4k��,M-�a��b���9���m����V���(F����E���>n��:Y�"����:�i��d~)��dB�L�=�
�P��G��F����qY�l"L�6������t�"{i�}X����:��������t���if|�����?_O���b3��iS+��]YJ�#3��XXj�k����G�(F2AO����f���u7��3�����YmE���{���r��6����g���}�7!�E���m�z�R_�.\4,�;�����3}�HDtc
�f	�i!��Sn�!C���i�,�C
�c��������&���������k��Yh����N�����ZE?���u���VE�u��q_� +:��O��t��:aH��i�g;\�e������h�r�����y���r��C��1r�G�`�y^E�	�{n����H�1�|��Z��#(V=-��P:�g��;]�� �)���{Q�Fb��v��
MD����NW���mE�_��pF���*(`��`�/%�,��Y����&~"�B���7l����fajFw��q�V�N�R��o}���� �t��5�t�������-N�L4%��F5�Sr���.�5���yD���z^�k����R���uzRg���kk�f.���	7�N�K�0m�0z�������#)33����'�`��7U2O��
�������O��I~9�^0sl��`'\G��+NH'�5Mk2�&�~��	#B�0z���+��9m/�L�$���<�0�/�50�����'���^A��n�0�l���y�Oa���z�B[������K�|zD��X������<��!:\���.��}�f3�����$p�����[,��;3��NX�'z����s�A�-)v�!�(�����p����L4����exff=��M��p���� h�a��.���z�b�V�0����u��n�O���iI���:���O��|�#_�������.}��X+����^]��)X�L�[�|�,>�L|*�)���[��X��@:a�tg�dbK�������X6O�������vzD	��5t^�}EL�'�r4��t �����3zY�/%���f�:�3�X�o��B<%`[@i�X�.���'����RL�G���4k���|������w���o]5��kw��EMA?pw.�{�N�c?�`3�v+S'�����S#�m�`XdlM��6mM�0�4�1�p�v%�q���	���~��3��L���}zB�Q�.h�{���u������cEy^���OszB�������p�V'l}�gTV�N�qtc�'��iy\�Y��!y�&L����=�}9������.<+D�����Lg�sD����xU�����3X�a�~��O�����
��_�M��E�����G�����N����\�r���W�%�v����)�G�N�@'�J����42���a6�U2g'�M�K'S���B�0�����p����S%a�U�n���[�K�����t�����X�U�f[�j!��|��m:���l���G,�#b�.5�k��������pA�G��s��s��y�O����]:��?��|w�-�t$�
sw�����\�0t���6`��/~����J����8=^G�L�*�d>�M��Dtb���t�\���52\�����8�m�*W'�QX��h�:�����]:zb�W��C#g�Sv�NX��{����������/[�EC��������o7�����c.�a}�b+���M�5�o���k�[Y^Plc!�Y����HO������"�`�������9�E��{����k0�l����D_;�_��%��~Y��z��db�}-��9����e��BaSle5b7����YM��Y|)���������e
.�kBx��w���B������mP��%�_{���Ktc� ������6%���E?�6���(��Y��#r��V6�W������c�-��Vf���0�Yx���'q��kg���
EV���&��v�SD?,�*��b\��5g~,���Q�D�����c:q��k-��d��K�����[l�����i%�5_K|_��Y�@,��7
_���~������W��I6��R��fn_s�������A�3.��#����X��b3F�����T���b�-Q���X�7S_!P�^������!���9 8EK���EgH�o����lSS�����L|�1.��u��s�_��Y�YY�X(7�����s�|����#>V�/������/�3�L��pK#h�h4�_|-+~��t�H��p��kE	��K,]����N���� �~X�X�@���a��*��eX�,�����e���e!�����l����glg�5�������1��h�$��OQ�K1������D����p���3���L���M4���
�2�/@�������%��Q{}q���'�X��W-]%HLI$�nn���i��7m�.�7��3�?M2S����WXlM��^���m��r������yv��`A���`aW���zz�VXXl�����������0k���I4����!e����w����vylJ~a�=hx��X��)���=��gvV�,z$
�_��_&
�]b��9]�gvX.�C�j��d������?'�g�����~:oN7�J��>��.gq�	9&����a��b��bK�~����Y�E/���[U��R=���3�L="������������DC_��
���j�"���~:������;�p�4���{}mw����2[`�A��um�����ie�!6R��`���{��������w�t�X����`A��!��/q�i8G"p	$A���q��:���YZY�
 �.�%���i4|������=���d
���/\����~��
�����=�n����z��qC[��5�����9�Y���Lf����4����Z� z����(x8\���/����u[-����I��&�z���/���������������/3������mUl���`W��������A�3�<2��1�U�/L`H��X��<I���)������
;S��Ft�b��p�p`�BQ�cl����Q(B���X���W%�ib��}�i��P���D�ny@��1������gD��n��'X9D�.Il�����-Mrz���a'E�Z2�=Mde�.}a�c������<Y�x�-3-��[�I���b?�Dhd��m�f����~��^p���X��;*���Jxl��B/5Ff��?6GXQ��:��i�E��6).�����g���=Bc��'��n��A�]d�%�{�<l"�:��#� ������<���}E�Q�����4<�D,<��,}%b����-�{z�(�*Rt�������s~9�����Z���Y�D�G�t�(LLm����%��F�����)�EQ�K����J�����"EW���p�&I%��h\>�H4i/�-��]�f���^^��n.{59[���^���nE�'���+�|���[�BUl�*g�3	��;����s��fy'�k{��G�����F	�]�'�-X����������p,�1�D�0������_@���L�r���X����7b["���\��!z�����H�,�&[u�f��bV�!��M	�	���s�����H��pVM.��]XE����w�.��5�E��V����������E��V�s��+��X�XXD��� ��t����\mh�Di��.r�x�Q� g'��k�����C���8;�gD�J�����Y��&���u4F�v��������))	6�s���\��Ltg���������A1���d���x^�T[��e-'<�U4}gW��������&��U���&EO�Fb����H,��Ml�/�&ak�hfx
{������"6�{���t���p�.S�M@�,��G��$��� 8hcvL���f��b;� �X�D�v������d������g���a��Z�fb�1�-�~X_�Gf}�b�sZO����).E������Jl�)����i���u��z1D?0"�~�y�����*�'d��b�>��iK���j�����F���Gsz����mF���|,�@��,�sR����U��E(_����@�iHE���{��	���N��(�r���`�����L�Oa����?��u`��:EV�#v?����e`bw#��9������P�>����ZG���.�"D��������bY�
�;
3���n�+�[�����E� :@01���`�D�m��8
�(��E��\����:j�t�9�`'���]��#��p������yM���w���������4��fV\-���>���e���k���bf�� e��bk�
YA��N4\�M��l/��A��@��_��=n�pBT�,M]0�z��=
���ElK�����&�������@����=�����e����.z��f�o`����u�4���0�l�IOib�V~W�}�	9���AC��G�A�XX�"=m��e��b�M�
��
���^���K��.��kMD$��B�i�`�R�	����]���'��
�����K�p�HW���-�^�����	v�����f1�
��+����a4KbiI�t�$XZ+6Sqn9��U�C���/�n6�M���`�x���ON�9��Y��+����~DF�%S�f�H��J��,�]��&h��,m�����1\�k�mS��x=1��h�?T����9���/�����������)��I-�"Q��}%.N�<��`��������	��{�N���������!�D�T���W|Aw�k�J>�a`i�_l���gx�h�~�
��'��SG�p�����=K��fR�RC��iX#9t�_�r�Ej@0)�sf]c�����T�`��8�������-��O��:����+0������:�����3��VR/�6��~9��A8�����Z����3a��0�������m�p�6a�����l�f���/�=;3[6p/�"#�6�)����}`������OO���3��Kw��"0;��o�C��p�v��O�������o���z��w	�i80p#\�o8?���K\�c��_���������D�~�W�I|\�"��������8]4,�:���0��<������	�`�3��]�s�M[���@����A���
��h6Klb7����:��������i8G!�	0��qkZ��� ����f�����y�Eg����^��"����Y�M;����(lF�a�3U}�3�>��L�K���v���^���'1s��3�����{<����(�a�~����/�R�74�P2��D��q�O��T�&���f��?���k��t���I��?�vjg��A���L7��q�f��4[Qw���`��#~D��G#q���4���h�.��l��(��w�h�2��-v���\��{W��4�G2�P���v�2�����D�������E��,�B4������� {�{y���-��w&�2���������ET�`��/3�8�C
���od�T-�1;����9\��C��}]�?�a*�4]�����P��i�3;�����@�l�"'��	��N����V�@�.-�{��=����?����kcO��A\l�|n�?�A�.0
�6���\_I��]O�����~��i8O�p�?xbQ}���X��8��,����V������H8��I�O�H�j��o��<E��CNXT6`v���.�S$\�=`����t������iT�a����.&��eR�?6�[�������K������!a8tG��L�lv�R�{�����j�2�P��YV����ja�l�l��pO�����]����xnF5���!�:��E�k���-�x�:��������
�?fz���g���{�����p2�5oy���u���M��[�Q����)���t�E�x�m@��V$����FAAwz�:U����];
��w�=�T� ����u����1�,;���E����������jz��A�h���`�-p;����Y�>m���4�kn�����p�����h�w���mk�t��	��t���N�y�D=��ipl���M'&���s$���?!����4�<����h��~m"���G�qp	,���z�s�k�V���+nuh��^~�\��;��<X��5;PS��3��h����<�!����S�'9�d"N/5&H��,_���]zn�����p�;Xf�7�l��|/M�xR�?��e��gKf��; �/�W
�=�?"j��O7��`l�b���u��D#!���%�N�� �%M?0%��W*���0�
�����{m�?��,0z��9�J?EQP	�(i���p�����;�jF���i���R����
����A4�T�4��;�KD���kl�����E�#4;'�,S�]5��:�:�������!���{��t��q��\�����p�H�A��n�&�����lEf��k�?B���M�`x��r{�Ku����
���/�p�L6LX�;����t����4?�F4C"*>.;E�o�L�n8p�%��iHC���;Rm�,�t�S�Rx��O#��m�����6@!�������C��4�`���9�e���K�	0��5��t��4������e'\�-pN�_{������RL��F�tD�����I�`i����p���S�x��������
�
�
������a����p�*XHk\��
veZ���Ez�xJ�^�o�7��z���0��{��l����1�c^�17�����4b7���9~B�.��F��f���:�����+�+kd����4K�}�N���9�����	��`��M8��#�4s
�e�T�
*�^E_�[O+��y�!����$��}a�B��T4n�S��v���W���`����%#�w�^z���p[l��u���^I\�O%F�?����F����o��rZ�t9������gA�rW�A�[�����N����O�H�i�6��y\����2���`[�djy�C.P��������|�D��;�I�~�u�P.l���<I"��
C�`\����?���*�M5]R�9�70����~���Q�R��n�co��^U�l�N�`_ ���n8����D����6��FF����(�~,{}�JK��7p�N�*E�~����0O�h�!7
�m�3��#���X���rB�>������s����8NO����� ��cu����wg���Y���>�{������$��5>�������~B�'���@�������EH�,�#vn������x�#R�v�l�M}X
���cp�.�����&6���1i�����v�</v2����2����a�W��+{�v85�eYY��{El��kI,,�=X������|,�}�`V�n;�g��El����zEg:@�i�=��:��v�<.�����f���mV8k��G��	��c�����G�=w,�m�aR&������L?e�	D�o)���Zl��K���4���:����>�>p
�������,>U����y<n�9���4#z��b���J��H�1�u�������W�7'���~x�.�������J\�C &.�X���	���j���kf��bw����:�co��"H,����p���(F|,yf�	���	�Y([�U�Ug��W��b"e��3��<'��,j~`�^�e��*���������gy�mytx��<���������������Z~`P\?O�ga���.�t������
���i��!���5��@��J��t,���h�g,�,�e��B;\H�a%�46i?0�T�7�DQ�
S���������f���a�L����>J4
�*����������N��.�#���y`X%R'.��'bT;��Z���T��
�&�W���6��
��5Ql�k|����r�����z7\�m+,8
�H����B��^��6�<�5'"M���m��0�5m��oB��
Gl���9\��
A�d@�s{B�+u��W%,��mS |B
[��~�o�k����vy��`\���?����=�"�����Z�L'�$z�Y�",�]u�`Y���F�����%'Z(k����>�[,L�7���6n.���������&V�h����������������f�M?�b��Qfx�(�:.�*�/���*�f[a�k�#��}l���Yt�U���p�m0z��N�2�'�������%�i�^0���fJ]�[A��	9��=U��;���0ZF��.�.����Kd��v��]4�)�rM���M�r�X��0����t�b�������*|gUz�X����0���8�������C�#x����I�N���	~ �������|W���7l���Ku4��V�a��p������:,���>����H��8������H��������'�v��,���zz����',;	*�����p�&�_����u��>�w��f��Dk��G��z�-����������u��c9������xm��9�	���`fC�oXW&w����N
�h���F�w�0&��{?��r����yk�Lg�����3��1���:��-���
�v�]�5�i8�1Lg-���J���c�U����`��9����n���4�O[�=;`"WW
k�t���"�����e�����]Z��^�W��E�����m�st��L�N�*����	c�cw��v9�aWZ��k����V���	���~��[4-����Ml������vn��
��o���{���6=��S44�}�f��-�8=!Gm��-j����^�T�#�w�2���neJ�
kG,���h�cq��������2y����j�
��Gf�m�8"�	K�;�+u{Z%����F���Z�
O���/r��%X�M��AO�����@w3��.����w?�=kx�0Q�t�-|��ae
�9`�}�v[a�B�=q��cE�����]��K�3���~�������E<5�^�����
���6��U#�`;,�	��u��9q�T�#v���j+���/�q�9��s����{�=[�^�L�=�����~��{h�32�=���!�n��p���8F�~�=�9��X�
�/
����id����B-��M�#g�;�W
��qNW�j�X�
��E�v�l�'4��U,���n��hHle[�b�����&���X,<�P,<+��&J��M���J�&l�a�	��*����bkb�����'.��
�cf>��DkS�������y?�2G��M��e�P�"������,��}[�;��[�l�2�B���{rY��Z����(VJ����������a9�o����C'�^��$BkB;U,�.��Z�b�b�.�Uo���6m�.�R��p�le�:7���F]��Z�de#���?��[�b�taFi����h&�d9sa;��Y������Q��8�����5�4�:�-�BCc��s72,��V��O�kN�����evf�VfY���:QnVlg�5��WB�Zl+.0�M?�����"bL�����7�����0��h(�[��b����
Wy����@���:a}%t��x^�+�����=K�+���a���4����;=^#0�
��X_�_���+��f4r����D����i8G#��_4��
��V��-fgk���X�[`��3��6����n�I�K�2q�[����:|b'����a -�/��E�)q|V���0���J�^��������<3#������-qm��
_D/���~��lK�9���I�+�&�����M3V�����mk=���6���;�N�#l��W,���WS�-��H��Y���g��������^�L�)�{+v���gw/���:`dJK��$&���<n�������3g������/W�i80
 �,�63�h�+������
4�i;��BWAO�ge�maR[���e_K�t��b�na2]�%Sak1-<�\����g�kF0����n�Q����bY/�Y�������x�
�?A�����<K������|a�\��n2�����+�1����N�yzeT�'�bd>*�E
v�>?= �HW�TfZ�����p�v�8�M������m���p<;^����,u
v?��t������4��
e	2O�\��}�3�!��.�3�E����@P4L��eII^�$2tfN"�`Ala�X�����S��y|�HO�����eECI���7����0�hx��E� �fn�;\Z��xy,y-��*z���)�g�����?�LI����Z���(�������
f����� �PG)6�����M�a�f�X��*�o�F,?�������$e����F�������g{BV,�-LJ+������p��K��m%vz�a������o��U�2�n���r�I?�����`'��q�~9gL-�<����)mD���0/���;���S&�g*,���m��][�,�E.��3����D�r����W�n���1�}+x��
�ba�S���X�[�FW��Ugb�����:�c*\���h��;�`V4\!K+��`�-Xl��\���}����	F�A��;��Z,<8A�^�vzB�`�,hZ=����W
�Z��k����l������*���	v���t[�
����q�0�,i�V$qx��&
�`L,�N�)�fM��2��6�	$v�N������E�l�*�}��?�#q�e�`�~��NeXl:.��:hj��r>�H,�U�����l�\�b�1-������:����"j6��w�����#\��j�{���XH�`���0<�����,X�C���t�8|�Q�M�|�0�w-���#\f�=3B�B�v�a>������WZ-g�L�,���e}����������]��B�d�?b���O�Z|��c',��
���Ng���2g�h����.�Y�i�5g�P��?����b+�Q7,B��X'�P��K������O�:|���5>�-���~�"��������mtz������:>l�5�Z�
�%
��N�[YVQ�b��bG���Z3�
��b������G��}�jE�^.q7���/�u��lF4�	
+#��YW�q�(�W�����L:��V�u�)<Q�Um��p�t�>���v����}�x�1��>���q��_W8�
���X��e��b���;="�0z���m��>F�	�M��N���+M�&*��
��Y��[C���R�����bKr��YrU��?����xz��	�=[4<+]�`&?�\��eub["�\m���N��	�`W�h�j6<���f3|��J<.�4.���Zl��]��[t�^�Z�]��T
l�# v�������������������Z���w��$�t���`N%h���qGU�+}������������,���������6�{��p�oW��*���Y���>^����Z�]��[4��T�K)�&��R9���E�P�#jG�v������t3U~�'T?�6�G��jcwe59����a�oS��f�c��Wz��"H���a;�sKw6=nfVq��</�a�5��t�Y����7!I���W�7
CE��k���IVt&Mksvei������[��P����*�E�\��s��HDC��X�L���"��*�f���+���tSBW���8�H������2%������t�����a��X��l��e>�JlK�BW��w%��p��5�4������N?|j��\�'uX%t�D�j5<@A4l�������zRg�����l���l���S=nB_^m������4V��B2n� Vw�����/���
?�A�s��.��!Y7�����O��Q�50
_�(�����vX8����-6��������K��X0^�rV�oL��P��>�����.9qDX����PW�|D�WtO�3��T[��As�,uv���`�|�����G�`�	�E��[}��"���O��g��I,<!J,���ae>��oa�#��y�!��tr�3��a	<<�E4���p=/�|���j	|�����Y2O�A���	��S�!�E��
uFb�hX���p��Uw�G��
f�rO�U���$!���od�.XAl�TD� _�Lx���}~��L�|>���0{���l�4���9W8���{b��nAC�����p��W��&�`3'VK���3��/2���!b����f�����3��T��+,�
�=bk����g~���WX�:u�j")f�ve�m���~
���.��;��j7�zj�v�}U�_���`3B�j�u�OF��eJ������n��+�����-��_�9Z7�����2�h�.l��%�j�u����g��\-��LD-���$��	C��3��e��M�f�_����+B�����i8O�pqt�%Q�M�N���k���W�����`��f��a�/��F��M�|�]���XBh���W���J�]O9��]�d�������_|��XZ� �U�j�����Y�c��������r�������`wS��R�-��|����3�Ki��f�m�P�)ze�����pA!u/����\W��l�:��i=���A�n2�F�M��fJ�l����2�fL-��V��4�A
����B�����r�Y+��[/>��#������$����YaEg�'�j��"��o��>o�lY��b/�{����lae�bw	��6�o^j�}�^�����t�����H��-$�V&�$�����=�p�*�
���)��)��>����N�==�����X7���0n�9e�Y�
���?~��G�L����A�S�E�~B�.�/�Pf����`��m�����E7�� VR�,��;N���]��ID�����,.mL{!�I�������KE�T��s0��E/�"v��;]��&������v�P4�q��f�hc�Q���U�l;Ohg�/�c�����	���Y{�X�On�X���g�����f�
�p=2S0��?�;��{zDd`��^sq�B���5n�<��.��]��.������� ����4[m\�=�Y�{�����F�?}A����������S/�/+���7qa������<2�&���������y!D�L��	c
]uB�����0N
�E�MT4�e�����3����N��`������p��y���:p�9��3-�����D���v����J�D��H�_�h���	�8h��Z<l�{!�c��
v�n�
��),D/�������f�kc��f�j"�1��>a���'�}`��~n���#3�����#�i��Y|�`�;�?#���e����������>_���y�ISEC���n���/�++"�5g���BUB�������o�t��J����X}��5J��8L�Y_
����,]u��YG7���%�<���~g����
F����D�T�p�,,���0�q�_4�baW�i�K���*��'P��M�`S;��6�\'�����:�p*����t����f-n��_���}��pSa4������tj7�i�B��TO�9��qE����#�)���U�Y���|9���3�����4,?
t�FI�}�Nw����2"�!����O29���&�M�������Y�XK�h8���Ns�f�4n���,{m0x�A�*��$w�MmL�*������B����Q���]5|gcjN����Mm0�������Gh���lba�l�0x�It������L��k;�$�)\��$
����9��-�
��
7�������;� ��<��Ua������:a&Q��~�6,�}�z��m���2v�F��e��7�'�&�I�1%��T��M�
�wA���{��Y�������RZ�0*���p���A���L)*��q�`��p��m�F�46U�gic�T����W0�.��\����"Q
�D��{2�r�O��x����T�����b��{���6@1?��I_��&���&������D��
J��Q��K�(���e��k"6q�[�(��rd	[a�z��C�>�1Z��<��M�b�������\�=��f�&M��Td�3��k���c�0�vf�����|�����g!/|����������6����}�j-�����v�6�����12��]�N&v�2p]s�`�f�p��~S"�D^����V����IaZ���@:���Jf[-��� AS�B���4.��
�O����C:���p:	�����x�Y���6�'�v�������u�����M�0��Lnp�H4\��C�Ku����j�������>�������0
k�_t
�	���/|�i�������E/�b*Ys&e�r�����+���R�O�>9�'Z^��*S������)���6�e���k��%rx�.7XToir"�4��eI�=�e��x7�]���L�4�'X��
zdv�mn�w��,u��W�>����+�}��t��4`"x�g�o�%�eN��I���Ewh��VIA�Y9YA�`�y����x���L��
����r���f�����T�v��;���F*F�b3����w�������b~Lh
������4kJ����N��J�������ex����v?=2�u5�&j�3Q)��Z�3������p������^����M�����=,z�\�Xx0���r��c6�y�D��-.�l�N4T���,9e�m��M4@wK�;K����_(�Y.Vlf���-�L[l�UM�e�!�e�2������G�������}��r��=2{������|Zl�JFNO�A��=�"C��2Sb�����wGm��P�^er����q��n�tg]���m�nK�u��5���������u����s��]l�V�n�K�����6Kw�C$��2�.����iD�l�O+������0�tl�#�uR�%qZO�Y�3���B�"��H�w�;3<��[.�0�M�P�"z��W�u��?]��>��]X���DUh�>���=�0�to�>]���=2�-��	D���(
�>��D"b�@?�DB�yz�EV8-���-[���6��i�P�e6���6�v���"�������C�,<�C,���2�6<w���C���g�=�&��Zf��bGfO�����LDw�*v��E��d��	����?=^2L&'���8���>_��m:b�e���#�+z[���6A1����[����Y�Ku��^j���U�N���g�'l"<����p��s����J����l"
��a3?-O0	S�����g~�T"0E4�o����@�V�y�K�0pWI�b�S'�o���R���pC����>
�9��pEw����.g��������h���]
���u����,�4�����X~	D�Eq�x�
��*�`iFOl������8.�S��������.f4n&�:����p�l�{�-y|g��x�j_%��"�o���:�K��i������6��*������G�8����c��5��/��.���'_s�
�gyi�����i]�����Ku���hx��&����d��������g v�n�1�Z]7_�i8p
�f�l-��������E0Z��?������
f-6��4f��D�b�i+�p�C��<��yXte��n�0|'�
�	�
�<]�O0���~vk�;������{���q�Y[�;����`�q�b���t�'�&�h�avO��.������'��5!��6wfM��e-��q7!��v�v8{��u���r�`aBx�������	���^���y�2X������I��L��_x��h�U#Wr���nyp��\C��3��a$i1���Pk+�q�|��b�f'�0L�mf��jd�2+M��;l�
�aZ�������ni��5�.�����d�)�qf�h�q�eA��%��a����9��Y��\�[xL��d�!�To��J��y�h����+�	���A��L����V��wk��/}������>[�{z��R��X���z��`3I~K�;�=LuWq��ja��3] �����i�,,	���������:=!�4�x��<b�`�_'��O�����N/u�T����5�
�n�=��Ql��v�{E��6g�5y�����<�t����Xt� �n�o���A/XE��tR�Y,������y�u�h���4��s��8;="GO�������I�
����+�R��p��J��y��E���4\.��s���p���
��)s���8�N_/�]�]�n��w���pA�J���mF��^���It��r��;����\����`i_�R��_��<=]�^�#v�c*���'=n�<�V����*��oe�#��>�l��"l|�.B'i�l
�AI�+S�luw�o�Dl�����`\�H7�������[U�a1n�������i)=���~?]sf%iE:-[)��
H����fN�V�w�f=�[$��8�U�Q3�)��w��%�<df�9��
p�Ub2�3�Z��-u�|���A�������9���1Et���a��`�y����Y��*�}���o�����R~��M�`��b+l�$�u�^��6�E�D�m��>X�$�=r��7�g��.���Y���],
g<*�xI�u����f�
O��$��?��e�������E�o��B����7��~��P$�ae�L�����_b���(;���D��������
�#c��'$=������U����E��G�{(t�TG^��-�&��v��i���j���[������Ds��c}?��r�(��hf�8�+��k�-u.�o��l�Vl&o5l+�G�`rb[����`a��L�x��+����K�dd���2�1���n���x����Q����8�a�YY�X�C�g]�i�:�G��a{��w���t��cX}�hx����8vc��>�A��S�����Ut� ���('�`�}���u��,���bK��x�F���j|eKY�39l���=R-2p1\��m�H�o��d;�`�}�����p�`Y���	c����<.$��w�O��A�
VN�1l:�
x����<��>�5\���%��<I��V�.)��9
Y��_��{���y�U��~�nK���K,<I���)Al&���+��u�4�f����]zZ�y�*����/�=�W��n�����j�ao�`2
�z��:�,H�M_��e�M=T��p���o�>�����O���[
+�w���pA?��Wl�ae��:�n/��9��5*A��T�-�6��|��Y�q�I�6N	��ct�����[s���:z�;�A�L�����5�hMM����:"��]��	~�zr�l��`�o�-��d�`�9�tO�q_�X�h�Le���Pv(.���O����	����~:�pvo.M�w���[����Z�=`-�.+42����n�a������|����m>�.��.2"���4�gW�/t���m����m�`G�R=��":9��
�w^#,<>M���?="O�L�-&
��<��'���a��=`�~�Pg&vmb���: `���M�#g����^���|�s�qa��n��
��>h�P
���}��e�nuI��������`3��a��^Bw9\�?���e��:L��McfY�a~S#���X��[��-��sz���PL4~�cf
5.�������L�����I�t/:���bg�#��nx(����I����M�^0���CF ~��"�l�B������<Qs�)��{��t$c~`�%E������)M`�i5���J0�_s�3�oe�3�
[��Z����p�f��COX�o3F���`��}�q��� ��M����u���6��G�V��Tev���S'��q��w��������������E]as�D���Q^h�a4'�h�LG�����PD7�����&����D�dv�c�@���}�@�n����S��h��a�XZIlf�j��������UBs���fK%��$|_�����c=��*%4L�I�
S�X����8����G%���3�}��T�]L'-zn���pa�������>���U�8H�&N�VQ:��x���X�a'4|i����K���j�.������TRoS�<���Y��>�������J��;��;S�h��^v7�����^Nh8	�c���6FY
=��c�����8�9h��a�m���9�h��L�x���u�P�-��P�)v�q3=��T���~�& �]p�l�v�N�������"�V�9$�/�pu���":��{�/���Q&Yjy��1�R0�,����Ag�=��������,��`B�P��qY#6q6���pN�h��Q���d�.V8m��(�f"�i��d�h(z'\�L`�Kf)/?������������
���r�M�BW����pVta��bI�i��d�c���`~�����m���Y�������t��ba���~���	��K��T�i�Q��/i6�)	��v��lA6�V�_TMk�'���r�#�x(��`	f����U��mQ��Usb�#�����,�c���(�Zp<��Q4�b�`��Uh��u�P�)v���L�,z�������({s-���i��d�����;Y����Z�|�p�l��O���<��

��`BV3��oS������	C��+�2��S���HU�^*�1� ��[~��x��SD��Y�Pl����Ku@��A��p���UtM�ZL[�aU�h����l�P���|�K����*��-�UU���n�|xDIC���D���y2���
��������jZ���/��~����<*�����U���c �(�2i�����
z�v���
���8�{���9(�����TbiZ<X�L�����9�cq �v�E7���L9'�f��-pOQ��D����{�pH�o��+�jf�}�9[��*w�6�c�Us�6:�63�;�������=�+\��]s�M����5��r��X���Ic�3[��O���j��hM��9-d�0�%1:�p�����j���������p�XQ���0�O;�'�-��������en�a�5��4�{6�v�)|��C���`F��O<�V�zzDc���4s���0�,\7��uX��	9z��LY3��}2/��'3X3�T
�p����w'X��a�����YN+�'k
]Nba.�)aM��3��6�����r����/X�����{��rX�G�~+�fF��=N��3`����������!��OR,-��D~�����L�K.<�)���8��&7��-2�h|�J\�/�����[�O���",di3w&���v��n0]!}=\���a�m�k��u��r�'�v���J�nuk�-�v�T�^L�.���
�Y������iZ����1Ol�9�^�	�w�UA���'�w�����O����f�uv$N����C��B��6+�����J&=�LQ�O���%z�N�9���=4�yW�_�����f���O��
���k���%��)�`wY��9l�?k�@���!���9���?T{������mZ�?�{>��gC���o����������Y�i���jb3�����/��M
���������
8��J]��(��������u9����<������5����N��Ao���p�%��]t�y���ba��k�?���SLO�0��rai�>�b�t���abV"yf�[��i�����?zT���a�"�I�{�v[N�y�����2��I��~�r��0�������q9\�
;��]r��`b*+���t�E�AWz�12���2��t@}:A�6��b0��;��}�+��>L����+uC��zb��eK�
�m0��5g����OX�&�:����J�O��8Vf������R�p��Cq��
�K�M�v7-)�LRn�}Amp'�}�Ib�b��r�UQA���i8�!0u"�_�q#Dy�3�Fv�O������>a�Z���6s����v��UL�0Rz%�d�H]���n��:�������>[Q��J=E������1X��E���p>�.�9=^O��b'h([�����Z�=a��R�,�����S�p8}��3�x�vO�+
D�i����=���N��\=I�
7.5r��>����0�&E�v�_3���@�%���c ���=��l|�w��s���:H���n���r��%�����p�����Au�u����|0�=c;�|{��%h�
��)$�����xk������0vM��oc4�Y�Z�
gf��������+���Z���p���,+�;Xy��]�{zD���E�W��i�������`��U����N��}������<b��3b��Yb}i�im����?^��T]_��������y��V����N�8_�`�X���'6c�ym�~�����Tvb���{��A����������k������}�{0^[�1�mK���/�B�.�"�����\�r�h>fK/��������Rlb�����u�����[����N�YX��q�&��#r��\��;�G��ebY	�o�~����e�c��5��eP_4|�-���ZX�y�\$����D�p��Y�[��� J�d�=jyND�,���T�����,��{O4�����bI,�e��!�R�NO���$Jf&D���L,���5��}?�������_�FB���^�k�����.6���P�/��=[��t����Z!��$��;�1hx��X�z��������V��Z��4����a������{v?����z1��h(�}�����_��U�����	�m��-�v��9�������;
��N�A��r�W�eeeB��*:=!�O��a�o����b� �5��X������kK��x�.�?	6,����0_+;s&��%�ev%��l�M�/3�^0��`����FuzD��Bt���6�C�@��~X����B��iE?0slMt���Q��D'������P(������0�.6�����2�hx.�������p�q����by��_�~O��sK�n������)�E�-j:
��n��`�]����c����p�+/{�����z�d��f������^�pa;�h�1�����Ug^OV�h+�dV�����J"���������u�M�V0��&N��$��_�a_876�Ge������w��=�X���D��k������G��%���J�Ke����n)s������Z;�0��GJtN�,����J���c����������
IvS���@EW:��VK���E/x���)�r�+!Z���0;\��0�ot��3�'?qR��-��W��3�N�N�]����n�WR��-�m������-����c4��wKk;�U~���x)�� �w%��J�/���.���VJ��������
w��a�/T,���[k~������fK/m����j>K��x�
�f���/b+�+��LVt���`����+]pv�iC���
����l�`s�de��#mE��l_��%�����7�/�S�����x_��+:����j��/�i�H��\1��8���Z�>���X��,|���b/������eR����Iw���Tf��}��#t%J���O�(l���}a�F�0��.E���x����mMh�f_�P���`�P�F�(��MM&��Z�.���~�R���b	����\���_X�t�F=g�Ea��[dS��3�n0�O����t�[�s����v~�����
��4MS4������-mgh�<H����9���f,��D3�ZITf�j�)h�{L��0�(�f�
vB�Xj������������p��V����uY
�L1Ll��M�6��M�,x���f]���Z�����Wu]�1�pc�]��K�����`w�k�*
����
��I������Y	��6m/?1�s����/��
��������h��1m��p����K\,tH�*E+$%X����zipC��`oX��Hs�=�m/������X�����$Z�����W6����<ba��+�P��/i���Z7�������0X�+)�q�XjC�~�`gE#���/�!}'7�n8��0�e�(�T�/�	��`;�M[i��Zr<_��k�JK��p6�����I?������ayj��i����r�Y#�p���SJ�	~���+b��N������Pr6h��h��	�RE�����
�������J������p��g����/���&�g��;�"�
S����pq5g��-��{y��K�}��Slc�A����������a�[����6>��w�����b���s���~>���'�,�M0[�-k��v��/f���$Pl�-�,���gQ4������(v��e��r���5������47<e�
5[p.��/�&z��
�+��{����
�e�~��"z��L�����9UJlau_�.�M�2f���3��E�'����;]��vym�`���}X@���j<�B;�e���j�����hb���S%{%�N78X�!��x`v���s����j���GAh�\<���.�p�2��^4��/w
���6�Y�S4}c�c����Lm�]��EM���-�/&�/�C{X��.v2o��B�����&�t�Y�X�v��Z�-����	��#�X�e�sw���_���]�Ls������e�����B��e������g��ba�g��b�<����[^1�f��>|"���e�z�w���m��w�xb�u����������p��H�\G��w��S����Ip������l=AG�=q�6��b=[�v����&���D���aH���,�AW�3Ik���+�}�G-��Sg�����;t�?���2�S�
z'����9��V���B�a���w�u*��=�OX���b�f�$5������0;Lt/df/K�/&�.:'}����o���M������JE���F�NG��U���h�����1���E��[��P�������������N&�Y��c��\�����g����M��(��?�;�s.4�X�_0�y
�X�-+�����������	��b+WL�����
���,�1t���	�myA;:�\���4�����`GA!sY�
r��.K��n	��_0B4�"�ATpOX������1l�a�`G����?��#���:g/��
�����sp{�����zCb������{����,*��|���P�������^8�0
���)2x�����a������`����qv��*�i��=�Mh���@%�����=����J����P�GW6���.:�������gu�b[�����tE���x��������i��|�8n}Y����EO=ZA����
�C�i��~*��5�LU�7����9��$��5��x��8+�{W�v�7N���S|���1�L�����I/�A��/�n��]Im�v7l� zB6XX�n���iS1��wm�dD��y>X���,t�]_L��4����`�d�_���c�d����i������%���f����������
]�RI��I�:~����J���h(y/��,�GY�pyc\���c����y�_p8���Z��L+���\Y=q���-��M���j8�L�U,T����`+A:k�/��.�J���l�����61pQ%b�N|���WL\��/&�.�Rl��E��H�����������J�����X^����A�F�lns���'�������,�5��I��R�b����u8\Z`��{}��vS�9���2�w��hfb��s��n8VL�Z�
?�`��H:f����,!�B��eE�#�R��n]��7
<��.�R�������Gc������m�Y/�It-��]��!A����V�.�V��m3���P���j���xa����T�a +�	��R�.\1-H�`��hx�����-t�\�^��04,�^�����c��9�A�1 ugx����1���\��%���R����b}t�5������9��=#M���n�
$D�76�I��.��t���Kd9���l�]=,�1v���D�a��R
g�������{Y��/o7�- &;,������o���n�Sev�tG��y�����$���e���������f����^"r��n�1;��C���
W�������6�n6f{�k���{��Aa�9������`��������7.�M���nq���Q�t�R��O��"�'�Ap��Y���(a6g��V������F[�
b��(
�lC�����ny���&*�(����P������
��Em�A������Y��3�������x�p�`�_6p�e���R��v�����f��s���.�H����f/�a�����_��5��5=�>���������l�e>g�yJ����rhj\

��T���Tm���y�t��/d6'�����5JK4=�;�5���e���q�7:KZ��
@�3������Qy���v�plv$r������
z{.,Thv@�X�Wi�-�Mz6]P\��6r��4��4���li.�����A"l��3c7�
7���o*�j���-#��/��q�%��G�o�y����� TOb:����b�6��54~>)��L��?��B6��:���Pc7�
x��.�n��r4����(������c��D�>?��A\���X�"l��9�@���5����*�y�=�M���p>`�b���*����O��y'��(�����@����`7U��]�T��,��2���VO��w�D>�Q
�ix���0���=�6��������"�zF���3���G��}*w�fc������9����6�}G|������������nMS�d�����bZ����f���������;�,�s��\����fy��M��w���%
6���M�F�O���y"�re�6��(��o:g;�������
F�����`'*�0[���66�p��F��fG�6wS�����M��r������`�v}(��4u<jdT�f�I���c�������cI���:�rJ�����'��l�p���D�z��R������A���f4|��+�)WV���5�@������vS�A���L7hM�����e�a�qS��n�lL��G��0�,��f���H������Ar��a����a�e��;��y!����X�!�i�;v���f]�
@�*)h�lm6k~���!}������=�`������4Go�������6���4��K�������ce�l���������
>��b�W^�i�	��H��52��x��0my���yu�?gin���a=I��g�j����=3��3�}�;5��z������E3�:�<.|�W����|����;�jL�A��(XhX��4�+sn��6��w=�
V���v�x�?t�SC����"�� �D��y�T����C.����O(�������v�D�a�D,��0�+���v��?��d�9��)S�w������/��&e�J���M���j��`so��Tm����aVX���T�>���J��=_����������������������x�����s��PB4������`'�c��z��r�~lP }i��l��4��KS���`�G��nC��}m�@/�hh���8��^0�&�;�y�D6��t�a�`o�~,}{5.�U����num{!o��7��N_^�r��G�lvKd�������Wn vlk���e��6�|���a8Uj�pq���`��4a��<m�Un�>q6/Q��|)6�a�g��1,&��`����+�=��ch�H�^ ��^�������U�7�5���9;���{L[�P�/�U9M,���J
�K���V�y��[m��
��u}(�������)m=!��
7�����Tm�@9��xH�M%�����5ZAOx��w%q����PK�7G�����MS��X�H����l�M���,}��R����|���.�`{��t�`�vD���/��T���m��;t]-5��[�!���
'�e	������M�v�]����8������ToO����tQ�
�<�=D/����G�U�P�,M}�0�i����~Y����O�v�P�]��B�b��!�{���D�h���,tn�ea4���|{Y�b����{w}����dY�b{����$����E?��{�����W!�}Y��b���sB�9�w��T-�|1�O��b�X���EC�������TmN0�����B�2G��-�`+�����5q8Z���Oln�{������a+�������hxT����Y_�����n�l���t�t����0,}��W�n�l�1�hx��0�������mL��l����br�Ov8\Xm,u�,�qH��������6��/�f��b'K�?��s!���r��R�L���>�Z�`4�enV�b�N��,7G,�Q,��������a
��O�`Y����,��q*���s!��pRb�I�� .~Y��bA4��V�d�l��(����+�������}�05Yv���%��e�O����6l�!v�oIR������^V��X�h���7�y������}��t�M��"S�}�"u������kp�2$��n��:���h%�e	n�^����J����hz�;
���U�a���	�:��E~f+N�h_L�P�U����
����6l�z���
w;+a6W+aC,���n8�����H�Z��|�A����Y��o���S�%i_�;�������n0��Tw���)� _����F�+9��ex������I�.V� ���S9�Z���)I��8�������j��b�w�Ux/��+�f�*^;��^�5I����m�l���{Lt����W���`a��X����D���o�x8�g��s6���M��:SG�]��,��[Qu�,���02�F���Z����Mm�`i��Xx��5|���/��u��S�x�XL����z���X4K���w�H!Je��%�����R�n8�O��U�
#��(����B��\��Y<��$	�/F��-c|iE�-tw�,<�"��_��l~vS��s����V�|����j�����vQh�rY��D���P!0w��>�O%Ta-��i���(�]��������O�j������Rg?gs p�D�(�m�}_f����?���Qg�D�(`�=h(,J�m�Ck_[_�M^��������t|a	��d���jK^�E*�/�����tsH����L6Tl�HYO��vZ�Fx�����v��V�C��	FA� X�7�h���0��1m}���'����0�������p��[�_0/X4�6���������[���a�_����@,��~�`[�����
Fh�<r�T�������~�`�{��>��-%�Z�����i�K�`q���#�eF�Seal>�XX��.��aDU�Bg�e��0��[�Z�� 
�����~�������1lA��������E����
g�	��$Z=W����c������HTX���/�q����4���"B�q��a��p���:�����+wEk�^L�P����F��`�%��+S�^P$�U[m�����f�����z��J��s���pa�@_�FN�V��
��$<\�����s����d?����i5���������������V����/l&o�����A�H��[�/lx��U���Bx�L��`����L�:g��o�Y^�_�#��^��^�����PF\t��Ki��
\����qE��z��;�*nk����G������E����>+��J��u�i�:hh�����Y��J`�01l��b������J,�fE��Tm1�c�0�������Tm��L���
� ��vS�I-���M�q��*b>g��G+��{yo+g���p��9;���q��m�d��WtgQI��B}bo�|��S:�n�n/�E�f�7��M�}���,s���i���6//|���uo+CC?�h��cmC�PBV�,������0��F��s�bc������L�@(+��.�E�o��#��
���A��B��rJ8�����S�L=:gW�)�mufXa%z�T|��%)�e�hBV� 6kqnV���7s��.8<oJ���h��3�-
}31��7���I/v��T�+e����VK]�V�-�#���"��T����v
��b��(s�x��H�b�%ok�L���n0��&�����=l���Zq���&y�������KKO��&_v[$��j�7i�
�������C��Ux���;���
�R�n��L�Xt����F�
S�����}a;��ez�
��U�o�g}Z��V��Y�hxEtAGU�7�g5n�J��xo��:.�0���m%\�QEt��}�+�pDCI2�}���o����Ft6���������f&�(�f��bs+��T}�3aY��{+�M���O��������|\���aY������[]�L�N45,�}��*��N�`s��n�l��"�S�����{3%]�p��������9��5A�������'�pj4
��"���Q��i�_(+&�^��j�B;<����n��t��V�f�����
�Kg����B.Ld1AO�9
z��6���&�E����-$��g���h�>����g
_wI;��!"Y��b�����a�+�'}+��l>�;XW^0�����I�
^��j����������R!Q����X�h:S^�7������������DmJ�c�����63t������8�%�=�4�ECu�%�E]��X�6hMCn�{������v��M3i42��I��|��s_�E]P���'}�B��3R*��	����
tA����
�����GI3�a��Z�{L�=����� `�����(������kte_W��P�[_�f�H�'S��`��fM�(��(�m}����9�W�1��MvS��t�E/������`a��XX�'�������|��A��rC#��U-��=_~�������
]���N��n��c��t��W���u�ox���
���	]`��'.TK�����hxav��T#��KkUg��E4�0��gZ�9���>�Y�>Y�v|M]�����f���XZ/�����E}����^;gi6b���U�P�m��S����J����U2m,�}3�$�
�������
7�/9����mI�,�v8\2te�e�b���������-�
7j�����f8K3��<g����,
�;a
c�PKl*z����6`��2t
���wS���"��`��Y�y�M���1m�\ �:���:�MZ�B(XX��aK��M &'mfRJ���P�:�b{z�vKd;�I`���^�����s�h����>���?
W���(�}[��'Q�M�>M�m��4�����P��'���n�X�09�QaV���5��(z@��F��{�4�"��)�z���o�0��~������Y�o���V���F�k_
�w��X��J���"7�'i�T8�{H�0;]b�0o���L}@����)s�>t��q�0�J���o��<<YA:�����u�o���X	�l���m��&����J���1[������������O*��x/��;������%���{g���� &a_H�Y�r7S�������?������a�d�3Q�{�U|3�Q�P�_��Gt�0�^(}w����num�@'����
QB�0mN��y��L��k�nqmw�B�5����	�n4.��UVy�lx����T�������K�Vr��&}�!<"t#����>�EM��_4�J���o�&-��H������SmV�������t7����o(v����~���D}v+t{��V)z����B��f}������#'v7����Q]��������P������B���p����d��qV;.���)"�"f����,6�;�V�������a�Z����z�����vK�z��I z0�Z��]R<�B�e�:sc����dV�fa�}���yL�$7�I�$v7��Q��{�#��%�|W/5M`��X��&�1B���l!Y�Y���
/�������wS�
�&E/�7�e5'b���X��������Y�:'*�W�/���9���pz��t�D��X��h��":��2�����`�YT�A�V*��|�f���2�D�~5b/V_*�V��Y���B]k��tc��a:������6��q�O#���mkY���?D7x3���Pp�$uc�����&6�/��j��i���R%��;R�N�K����w�����n8_��	�����84f�u��%����Y��<
[�4�Y�%5]�f)����E?��fM�X?.hxu6���M������@���B�b�}�4�Mh�H���E���f��t�yU��-�
����%]b'������=�m�g-:�	��lO����Y(mi��n�i)�e��I��C�(`�V�'�_����V� ���j���������YHLm<nLGAt�����3<}As�=_�TwS���T�E/�	���V���f��z8�278;�c�����zp.j:-hx�*{f_�&]��-Z�k�����Ky8YK���|�����5��_�-�:��1[Y]�LXUt�1�`Y���:p���0�l�	c}g�OCt�q���A�*Eg���p6�%-h&�%4f
���`+mc���+����6C�����n4[Le�t%�`��&}6\�4>���R��,�Xy���;g��4�TB�{L��0I(�S�����$��X��*�~�4����P����4���b'�HG�*"+�[��hV<�U��K�G�K_���,C��t��L�v���`+�m'x����*AK�fU��=��R,�V$v@�d�yT��,Y�X��hj�Eg�c���p<t;���L�z��C����aa�A�%������l��'�K��T�c+4C}�������f�����b�v���M��"����p
����������)b��>?#J���	�
^E7�X��X�f^X�):+��[I�
o�W\��2�����mLS��T�X9���\�����
/}�.[��lO0_�x�n�,��^��l��Yu��R���Y��1%1���;`�=�	�R�3<6�Oi������G_���;+e����;^��W���T������D��N���S�#�m"O��@WA��Y������Jb�mS�M����&,���W��p�H=J/�MX���inba���.�p������t�k��w��������`�/�p#��pg�������dx�����X�%|a�X���1�Y�v�����~�?g_(1��_=@wKd�	����_�^)Ya7U�OL��44�_�r
����SqMu"��9R�N��u��V" VKnL4R4�\���O�@0l���-��/z(��3����
��f������+��M&�,z$�x7��/�z2�d���	�fcZ���������1��Vi�S
wL%+�r�
Z�����b�?��"ia�e��
C`K�H!������]"�P`I;�Y�Z��!�Z.�Y�-n��s
^���+;��	XU)E]��3���&W�&DJ��R�h�#A���s���(��;�SYn��1���-W���������~u9�-�m �~$���Q�x�\�0�?��.��W�[����D�d��n�c����W9?1�����t���#_4�5���r��`�k�sN��-�w�{{y�V$���X���}�Rv������/�������Y(�&�*D����;�Q
�7��������W����_3���Vwxu�;�ly�%�����,���92����;������#3k�����5�;��
�S������=�>L�Bl/("w�iw��&��;�0.���
?Q�>UVwyu�g��L#v����T���������)cb��W,5l����n�pq�upw���d�;�+i����9������0�[F�DC����

�`s/��
��nI�m �K��9�T�<l!��[�:gy'��"��
w��.(�������D�&Sb�;���b&�#�J�����~�6P�^����i�����s/���!ej��"�fE5bt��06�kE�/�A��*�����TmA�T���c�yY��B�O��6T^=��$��w�.��u-����E��=���C3f]���-���q"�b�[���n��m�n8�@�y�����[�=q�"�8��)��������.����Xn��'
�%���l��f)�b����Y������[![^L.D�C?o���c���D����w���U�����a8-�oT�f�]G�5�;�������KQ��O�S�g�-;���D4���.)��S��;�m�V��{8�`$NJ�,u�,�3[h���X��L��n�0���Wy��1m-��T��T{7��'��.:����P���2��U�;tv5�'v��~���	�W\u�D����=�� �-���T�h��"�4S�10� �:r�}XA��Y9�,��aP!�Uh���m�#��y�B����l��+�["���2(�c��,W�,�h���b��wm���^�������6�[H��VZ�Li]�
H���?M:�2���C�����+��n	�I��n<nAr�[�=}���_�:��lO@���'�5�iZu�^���
�u�;t�Ik��Y�vV%6�TvOi{^-%�S]�l���w�`s�����)�A�Ta��C�������j����������E�bs�s�m$��9�ZO�����bZ��<6��jGb+��������h�4���L���Y
��.�v���x���D"v+d;��MW���������)m>��K�p����4����`/��*�U
$-z������S�'���FK�'$�^���-��a�����3��$'�.��j�B��n���Cu8��E��X�$qyh8{A�Q�[)��0}��lAOxS
������L������s�?��;S�g7U[m�&�><�y��<\��UbX`M"���;=�����`h�;������\hM{���4�����
��q��,��'v��@���n���h��FkI��$�E��tsK�w�y�oN5��kZ��`�YZvU
C^q4,�.J
����w�k+�������+V��w&�(:��v����[�3pgo���nm��#��O�n8�0m$h(~.���r�+�Ou�
�&�K��[�[-�C=�g���`o��^:\���������Y^k�w��nn��4c4{��'|��%�rACmf��f��W����4C��C����	���L	��0c�}�����t/
sN�������hA�J�e�;��=��.YzX�v��~?��wKd��7���_���f7U�^t��X�WlN�=g+�N���t���Hd��������tQ��U��{FmP|"�fRKf�~B�I��R���U���6|g���a�����1���;�f����j���Ag=�s��$�X��C+F���	K�P�0*�K����2��4E6>+�w�4��f������(����a�+�q+_�m:�l	���
�<I���5��S��n�l�R��/�!ix����i�q�G~�B��n9{��J4�LK���Vt,I��a�J~����c���/�ek��&�G��f�T���[��h,\���b����M��T�6"z
����{�D/��zd�8;�����i���������k�������9���u[��s�v�MWU�5pU��/QP,"*���>��=��[t.�
�z8x�?������B�`�aI���Uz��
�a�����E�5�a������/v�S��B�ESf�5O9}����M���E��y���bQ�-�Z��X��E�������2,�����>������<2�E"��2���^Z�,�L�d_��F�l���25�Q���A��J[�fI��c�a��'�����b+���������G���r|�
�/G�f�,�<������f���Tm?1m �7s7��,<�q�0gV�$���4,.
3�L39P��������y�b�ml��6��0��^������~QBs��n�l��|X��I��m��%�>���u����tN$;ga%�X��4���V�F*t�=�;XX
+�����c�He���ss�sv�}�����p��D�=xe�Vv/[�te�G��9
�B�p����4��=�,����z�B�
��}*������L���b����=.p�3���[0�,�{��q�����M�<p��L
Bl�����M/��e���F�bGAU}X{0-8������Dm�0Ik��6�h�4�'v+d:g���>)�f7U10����s���j���^9��=��D4���-l��oy��Kq��m��_����`�d�����iM���6��$��?����$��������Z';���SZ�n��b���i�������`�T��["[O0��U���H���+�0��
�`W�����V<�.��S�I��)�l7�
��*����W��Tm�@/`q���E���K���m0��9���nym@����\����������u�P!]������w\��N��r�05^tce�bs��h���ME�[��,�>���+�����C������2�F�$w��`��>����y��v���:�A"���$	�C����aN��`GY(�F���q�`'}����{��6��+�s����:4���Xu�X�������yL���=���0|�7����`
����(�����v�i3F+%Y�h��!b�2l�l�R�`r^�/X-&�r�8(�tx�����Y�m����alL�����<�����}�Gl���-��cx��R:����f]h�;�v>�/4����k��lXO�,��*t3�h�?f�7�`��v��I����-��
+�C�u�7}��W���)<�{L��LRS4Mi��<�����p��"=n�KJw��L���K�%V;�y;4����������Q�>�5Xz{���q<g���num�A�L�wE �"���y�~��j��,���l���"�^0�lE�uX�������S
�FI��`J�����
��Q<J�/���fn>�G
����bs��1}�2uw�4C:���r7U�0�+�V�t��zn.z8�D�>'�t�����cZ�|��N4�x��R�`7U���Yt��f�����
OiZ'�n�>�������`+q�a��@���!��*+� ��.l�������
�vU���L�Z�
����;p��q+I����f4��zd�y�I�S.6��w����)x�^t�")�����X��3	b�,�`iI���Ks����J>7�k9l(+zA9
	bW*,�=��w�v"�%Z����YL{������7l��Z��
�H���^Zv��v� '{�:qZ	:�w�
g�)6�~`P�4�LB����{L[O��?�U��7,�<`<�3Y%
�?��G�t$+��m���Uq�Z�v�M{��%O�{��B���6�vH�����='�����C4L�����m�~���5�,
�hD��Tba-��9g�������m^^��5��'�p��b����~Ld������q�����O��~L�m*!��e[x��^�B�YI�p��5p�|�������i��%������*\�P�f��0�'��N\���U�@OaU�h=Y6���e���=R�Yv���I@d�B6�X�������pZz��&�p�	6�gvS����E�B����d�/�;SrKB�>������d.U�7�\������\�ba���BxZ�z��+��-�k�Z�=���~�iEk(�':+���������!{)k�`�Y
���E�E�7��������{L#,� ��z>��C�9;Y���J���vnv6��V\{��m��B���o�r8E2=kx�������s����"�~�����s�I��1m��k�h��"��#���'��}�Di��	G�]L�Sl�Nm}h��Mtc��b't"�<��r��@�d���Y��X�>Gl�[�����s���}�=kh�H[���<�-=Y��i�IKU���U'v�i�����[�B�y�L��4�����{��)Wz�I�a�D6���4T��������Y�HTp�Y�y2�g��Y�n8A�U4�����wS�=3Vj����,-���|�Z����^����4��M�*�MkDOh�I���D���d���s.�9�Z1L.�2e��%���2|t��9Wjb���aG+�7�|�������/>�B��i�hz���2���%7�`;Kp��v�k#�	.���lg%vf�0n���["A��8���9[hK5��'�-�����>����p��dF�����������a_I����.���^�B91��~]j�_�X�B^��D4�3=a�1����y\x�=�[�����������E�?���pu���jLw�i������$�]��[ ::��&�e��
�^�r�i���*�D�0�z\_�,����5]�&��nym=AgG�7l��=�^0��<a��[����Q��'�L��L�/m�����,�?<n60v�kk�g��t��p���]H��`s��Tm>��o�P�#C�B,}i�l���!����6���*������L��,�2_,0)�U�w[����B�YzX+Q.o��WU/���`�f�[&�e&�b2�����,���4����aS�
���i0Vy������F�m�����Oj�0Uq�|�0q+E�Vj��M��-�R �����"�����Tm/��6���!��^q�i
��4�E���`s���Tm�2����k>�������9K��}*'�C�����12J3���r���+��<�������~ha�A�T;����"���D�^���d�����t�{Q�n���W*�,=�D���42�tH":������d��5���J��%����p2���#����MBw�i��
;G����bs�Qa������f�K#���k
S�E����bA�uZ�z��]��P�C,&a`���|�b�f�]�OYL{BSMt�E���5�� �:��m0j������>%'�iO&�-:�����9E�D���{����S�i��6'��/�����������	��m&��a6T��B,�o��K�k3�AW�W�xO����*�x�(�D��3�����p7��He���`s��s���tZ;���YK��*��Y�z��\���������u�s(�p8�I
��`�9aAX�'yh��%�g(�,��J����ki����Ewx����X�DJ����a�����7�fhf���w��d�QO��{��i)�������db����R��S��=��v�-�q���[^�L\Zt���c������m�28���C,:�D�t��-�����]EG�h�����4Y�]H�z,.�0qi�� ��Xl�a�N�/���]�}��`2��h�E8�����c���9OE3�P(.n��hb��Xl���^\�1�������D���@b����\h^�X�a���i�3�5�����?k:�=
�%�.�X��X(�'���w�����l6�,�^h�hnfj]i�[[�b��b�����{L^L����5�1���V<.|���S��n�ly1g��k�
g����E/�?/���������X�����rV��������SA�n8�"�-�b~c�7�<��=m����I�f�C�{=VZ���D�9%&��[ra��������lf"���%���`q�EO}z���lqh(�#�b�j�0wY,,k�oc�%�-�[e�����sA����sn�r8\���VZ~���i���KOj7S��,�������\�q���Ih���<�wR	�A
2�0.��[��Xh�aB��o�#�a�(����������E?�yp����ZHLx,��M���D��=�"�-����
c�f����,��<�E�&�,���B�8�c�:�<��^E����tk�b9�bs�s�����V��X�9��:.hx��sa���`HQt:Lv�������/��jj�Y��-�
����F�O���J�{JL�@t��;�n��S��HwKd�^I%�\��,v�@S��Gw�`�����:6�i��\"q6���$�X}����T��["���e���K����>�(�-<V,���s"%q���I������n��Z��[P���i�X:6}�dU��F����l�Bmx���H�X���w%w�O�2�@��0r�C_W�wi����j�K3�"��r��t�C�S�|e�h�2U�@0��M����E����!�L�5)�B��Gf������`a�7����k��� p8����������=�o,�����X��&�I�:V��C>Pz�
���V�����t�}:�?��}����w�.�]���D��B-T�Y�|�����U��0�kH�����aE4�iXR����6�B~�����y���w�]t�4[zT��0�)�c�y��ty�M'�����4�M�~���a]&K�>�F$]���)�;z,��0]�R;`�X2���=��6���g��p
^�%i��t�U�cY�������g,�
]p	�R�e1[Z�)QYVO,��yy7�R���	?���c�R�A�P}AlV��-��6h�O������MJ4�)V�]��3���EUJp;	oYA�����-.����X�wA�����	�+Wo���}����or�?_)+�����g�h�K����.�{L�^��4��
6[��������A�>XZJ,�:�'�ye��T��[^��0�Q4t�K�5�������`k��������Ev|>�����qx6{�%+�>��*�^X����������1mk2�^�0��MO�0���d��6����:>g_hQK�&��4�V�V�V*��<��}�]��l���s�@l��2��IM3����D�l��$
]����������G��#���DXx��jU��������n��
��iu���#�{L��0=[4��{d>.l��q����aS�m���Zz��)���o�����@A����5l�!��[`�P<��A_��[@�a�����E3����5���a6��nfp�b\z��2�7n�&��%�x
�/����]t��q��&��`���jq�q��%���A9g�|�f��s��E���9K�5.,��'g�D6��?,h�2��g���X�t�����9��$�`+
L��?p�
:���F���?���_*�R��U���%���m�� �������H?�nym.B�?�F���{���Kzbh����Y�����z�#X�V��������Y�
V�jdx	����i���@]e��/�ASA�`a�9������/��L3�
������tc�=���D����=x�E�3����?3���mO�����tu?;��V�yu�(�*$@���Y�i&�'�����	��'�n���:A��]�1���pL����%B������VD&_���������kYw��4]��=1o����f�������.//�*��'�b)vbK���2"�[�K�Z�ew���8g��Q������Xt.��
g��Y��Y��P�$�I�_����m)�C(�Q�A{�D��(�h��,+���Y�����^���,�U4�m��!����/\=�7�B����`�Y����Zy�^O�k��������`�0S�L`Gtn�v�Nh�]�l�����?�e�_��/�b�vb��f�����e�_h���B+g�E���=�\�z���H����`;�+��e���t�o[�E�b����e�p6��v�kk���Q��y�&O/MP�;���q+wa��g�������������=w�ik�q��D|�n�Q�o�TG*Kd3���ACK_r�L�@�H���cZ��er[�����e�f�	���,dg��kZ�e���P�X��\�]hH�Zz�s����baJ��n�j@_���R��nym�������Y��la��n��$�L�^��}?g;����
K��&�u����A�I(����v�R#E�U���Y�e�o���Z��f/K"=`P3X�#YlgUf��\�{z��e�b���7��`'��m
�����-��P��V~�Z*y�^,�L,�q��r��1m.2�B���Tw*
v�_w)x����~�`��3[(}����c�Um1��
�������$��� �n�6E�G�:������n4���o�7t���4}z�f����K�8�S9�n8��,KW���^�xx-��������G\_��
O�
����a=��^-$��##�p;�n����{[��)�x�0x,���e���5��H��n8���_����b�O��*�h���y� �?�$C����W����]�
�[^[@0���w���������

�b7xYu��;Y���l�4q)�C��X���g�b�nT���*�]wxa����S��n8[m�
�L��l�7!<9)�s�����e1g���6����N���s.�i����E�/hY{�=A����e��e�_�����)�Z�V�,��W�`��\��V/4-�����l��_$,��5l���8��)�7����)
�B��z�P/Gt�yb��������6����k9���
�<r���9�R��;`�]���5��J�kEy(�.�����R�KJ�0�BsN�U�%�)���E�A_��0�#������O��2�{L��L�^4l
.vA��p�
6�+�\�������E���9{U��-
�2Qx����n8�"��]9,-W�B���`�i��}{�B��l6������[^�"�S4l�!�f���������V�U��[(��9��+B.a��������<�����g���i����`�,�n��F`�E�0�EJ�p������[���e.AWz;��h�}��S��{�/-�s��3X���*FSY^�0�4��,���oXYJ��n��{������c�0��	�k�6���Y��Uc�?����v�k;*)}�=:���c�Qx���!kC�LZ��GQD����Z$�+�u�B��~aDr�/3{u52�A��\qY�e���[%����/L���3L(��}�7Pl��oyg���4���0�����G
��wE��j�/4�^�);��^�(Ac%l��"u�%�ke��R�f����a4,Xx�:*Z��v~���hz16_�0P��Q�V��2%ah�����f+o�M6X��>�	��p�B�����p�a�F��]~�Vr`���s���f��Je���2<ED�"�������������l���V�yu��%�����"���������*6Wr���%����R�%��������X�����4��Y(�[w^�%���Xh^,�/�*��,+4/�e�����	��U0����s�p8�B� R�Y�o��Y���B��N�b:���{p�����KbB�H�.K,/x�_*����� ��<3L�MO����u���m��,�b�E�<m���\sf�5�s>OC[���*�����U�Yay1�5�,!Z�.���a��7�&�5��d
�!�],�`�Uk�����Z���8���~�P�T,LP�
I�:���X��W�`�
���2.7��#%��V�*+=�-W���M,�����T,�
3�D��s�1����`�M���e����w���\(T:������-�
C�bs��n�6oY9�����bo$[�?Y�_�dJ4��i`��+6����}�4�ESo�=pz���
�<.�`�����8_,�W4lq����2��.j����X�O��.X3V)_t��*bt�����}Q�R:��:g-~/V *z�g��@�I���1m��Ky��R�Y��h\��6gt���V4g�b
3XV:%:x$�](�_����S9{:v-�g/�Y/��L��PK�L���c�brh�'���0� kV+��.�6�dv�k^��0�A�0��q�0g���J%��������D��S�S�
������N�sv@�/���<gKT������}��n"A	���=X��X�{1���6>�v$i����F�|6���e���Y���Zx!����+Y����������.|��6��M��`<4.�th��1f����A�n��/��B���C�b+&����8t9�
a]K�/�t2���F9�C�+��8��AWn~�:f���4^DW���e��aK��\����-�`"�hx���7�E��04:�+�������{�q��,��B���n7T�=`,c(C�aN@/@��j�e�q����W��I�}����wKdK�
DC���4	vS���#���$��b�]s�{[����7u*K�z��V���_0[+�����
3���]��l�0�n�PcJ,�X��;��/�
��yd�	��B�!Y��5���Y��l����9�}�,���������ce��gAMpY�{�T+I~�\����=n%�a�m����h7����D�E���q�9-q��6d`F��0\�j�����}��k*��OA��c��%Awx���M�Le
z���n8�0�}.,D#�
H��;���sY�{A$hz=��6��;�."�n��/�%��@=`JY�����Ld
z��fI~�r�`+�������p6�#���&��
��)`�L�Ol��l�[	�[y����@S�Q?W�����S�Lg���[%To�(���/d7��exxt��_���]�L�b�A
{���
����S�+��������JB�
��~�A��`Sw���v��C���u�qI$'���T}���;h�������9x��;>
�v+���ID�����v(.�Y�R�IW�s+B/�-z�|�`oh�R��<�X���23�G��1|J9���wu�R�)W�Q,���4��	�>b�����l���,������D���h7�m��4t���g��+���}{�l�6�b�����e��bG�$��&l�ybefZR4�J�H������^�q+�)k3/��.mf��*�>e�������5��y�p�[z�KC�4����G#��`���S
�*H�r}�(��W@	,��`���H^��c�����R�u�k�{He�����EOx�	v��L�L����� )�Sl��O�:�O}�=�����I����=�k����������C�q�D�g
�����s�I�I��6O����NM�����4�(���O8<Q����F2,J��o��~����O	�~�Y�o����>�J�������>�����}�/�a���G���I���q�-�^�..�'����+}���:E�d�hd��7�q����e[�d	�������>�IA��~��|�y�~�����c���]�$/�?�p<_��D�4�&���.P��>e�:���C|F?�"��{��@���R�c���������muA��_��s6_�vS��D�L?���h���3k�����a�����D�_~�yk�lI@���t����0_~����K�V4f��CO����/��V����I8���dI��+�wS��m�[�y�����C��~t�/9g���,����A��l.�-��6hV=HH�?�������V�Ft�2�*������`�?���7,�j�o\����*�&�
/�����w)��?�$F�c_���c���[[�]�D:718g���M������GtP~�E��p:A�Z��0�o���b�����h���Y��9Ki���l��H���U���lw��
-Dk$c�A�=��3k�@�I��~Iz�����@IE��uM���[H�7����=���F����D�������"���:�c�5���I����9z.'��5h�6y�������9}�z`R����V�1�k$��Gz���F�����<neym(�}(E��)/���B�K��ty��[�nymd�(\�����#.v�>��Z_jk���O��������l�M��-���������<g��~��B�����Ws�s^;�0P�)'��n�l��J����F�90q�v]#�].��h�n|t���:������D��?�J�nymX���/�����e��a�P�������I�i�MDZ���TiACWT���nymk�@�T���#��q������~\���E5�~5&�c���a�
FS�^
m!)P�wH����`l������0�*�4�M>x_�~5\�0��2��}��9n���9�C��"]��������'�e����_"/�q��Y���r�	D_�0��+��3����]�N[@���Gb��Pc���`K�?�n�c6�
�7��^�����`+o�mhnM_?�E��Q�Z���������'Rx��g%�s�� ?����T/���<m�1���r����qG%�z�"����	G�����n�-X�%�\������rJ[�`N["D��G�F�����Q'
��������`�Z4��NUR�%�_���������l���D��#��[;l�����~���Kk#��u�h����Q�p��r�@�m �{
��B����'"|�����9�:S�7.���:S��+ek���&����6\���`���-<��=��},C��.�I+.i�������X�v���num�����s�9�3�vS���t���_D�V�M�z�5g�l����.�k����IQ��1k�&	�I��%��-��oX�'w��H*���+��\��<�2a�����m3�k�
� ����W���N,t(J.��K,��Qn63atRr��B[#'�v7U�l��?�OO�)����-/�

��Dz^[^D��G���?��~�`�����8�����E_����,}��l+}^���t������VL���=;�mtQ�/�La\�}�9��
 �D���n8[0{;�Z����ba�����,��}#K�_�`�\���Rbg��E��W-�x��h=
v�z
���������R��eIR�/|��VL�	����q���<f����n8[0p��&�Ci�y�W� X6��+h�f�HN�h����[!�0D�G_��Y�w�qa�NB���q�{�`#�-���+'�����09��� :4I���2� �sY=��G��~�Y!�nm�E��z��p��V�n������S�y��B�J��6�������eE����E?����":�y6�2��+?�e�����b��~�[����/���b�	/t�c���.k�_�6Ktc��7����,A�O\� ���~1w��.���p���D��B���-\S/�_L��4���}�������������S����{� ;MB��L4�b
b�B��e����DO�[D���� h��e�<b���0��,0�[^�mL�^�`�
b������,��l�&���}�?.BYp��t=�r0�����S�����D������7M�����w7U���6�<�g4245/ek�-L�3�-��E��=8]Ol������}E��+���6�e������O)y>�����B�Fz����/�uI��b�Z�>7^9.bh,�]�d5:�}Y��W��Yp���l��Ed��6b�B�������h�$(�����/�U��-|1�{�/���O�s�C[HO|M�,?�$b�,)Q�Cw1�%Oi��%���X�:�^���y���)}>�*�0ZI��,AA�\��g��/��/4��,#�t2����r�9%�l��_x�k�|5)?g;S����l�iv�k�
�A��^#�x�M�<����L������Y����
n)���x
���X���n}z��1�-��'�I+^��C�2�w3���DM��q��q�X��c�r�Z���{����+)f�c�&�K!�~!�QW(�~%����K�=�l���f�N��c�b"��_��*�f�;a
L��kY��b56�o���p����]�����������;`�f���O���4�g��n�l���$���f�E7V���/s�D6�XV���l.��M���oJ��]Gv�j\V^$��[�����A��95�������f���+w���b�A�x=�e2:fa��Xhj�MQ������/O�@_v��������9�H_9���:����a��7p�B�P���V�@K�_�A4���,s��1��}��P�B��F.T�]�W��AA_L�U�S����`6���8B-�N��AX,"�������8��%���$�E�`����4;M�&-�f�:����1�Z7�w'���1�'N��n�l/Bg�d��'��QT�5m{A��h��;|���b���:uXH$�|���5n�x�<�E�s.��pSG�D�^��3��9�vg��7��v�k�	�v���`o��$6��+����y���5�s/�������R�����	k�	F���J��b��*C��e�b��������T��{���+�NK�_L^t�����aZ���|p��C��441�?,���>g����eI��;����b�h�0e,�	/7�����	]Wsa�7������t�yJk�CC�����W�G%	{�B�Yy�p������D��'*Z|���e������e���
�[��,��_L�^��Yba>L��Rto����e�8O��D^���`�X��F%=zhRk�|���I�m��	��_t�
){������T��9����V�[�_[��%�R��9��?�[��-d���N���eew��*���E�u��Ui�1�(1Ey��,��.����`[��������_x���Nk@��w?�L��r�b�J&�5�/hX
�~�}J/�M h��O�SU��m_o��E��gZ�fS�`��6�����^E	�3Qq�[�N-H1Az�t?	#�.Q��*y���/������6�9�a����SE�n�l������VL7}y?C��1c�0��s�[�h/���/�� �*.��
/�U�/�� I��k���c!AS��`�����V I�B����x��@p��W&A��a�`s
�n�l|1-|����9���s���X���� ��W�L�"��:�	���BW�%�����>g{2�v�kh��+�t�R�pi�����������[G���$�t7��'x���T��r��=��z�79��
���.��7������n����L�q����7+����D�������O��&=���+�Q��*6[M��~Jtz�f�
�03���<:�<.�!����nu�W�"�o�"6'���x�pU�\(������������}��p����6 ��BG�x�-��S��Sh>e8E�&�|w>�^�V���P�`�����q�i��7k)�'��nym�1-����B���7|v�i���`EVX&�a��b����|?�-��Tha\�� 
���*,�eZ3
����oV�)z�,r�,(�I3��tu{M����=L��Y^����d���[��m3}���@��c��1�2��D����n�65Y2���J��B�Z��+�)'C~�B6S���&��V�����
V�v�B'��'�����T4L�;X�I,�F1�G������mnh�=�L�Y���m�i���7j*~_�
��YDgo�n8��p?	:�I�
g����E�����'��2����7}�.A[z�l1I���,�[#v?���D��M��nym�A�$�I��'�{\��H��2��g/�����(��	�9�>,�Sl_���"t�
u��v����^Q,���si���Wp�BN�
��4rr���j�n��&P�/������y�-��'�s@4L�3�<.K�3[
��s 7�>�}��=G�5e7S[��jB4,J�+v���o�Y���+���	�����TtK���p6����`}]�/�ti�#�*�7<�����&o[a�6E��p�����Y��o}�Q/������y3?��ZC�L5
v���1m���t�a�Uz�0$�qSLn��6E`���8{��M&�n��`�F�F�52<M�������9��AC�`�0?2�JF�5�o��C7Y�J����7��7
_�����Y��p�H�*T���h��wBR�t�x�����YPx�-�~�����
���0)�K�	�w���%�T����E����>�Y��c��"�}*quK�����p�:��&��J"���$	+����x�SvS�}�A�^�b;�[�+-�~��]���8yd*�U���3�$�#D�6��d���6�w]2���N������p6d`�H�/��idh�;��hHt�`�[,�����,8gg�sl�s�Q^��.	�����T}�C�������4�$�r�9Kx�[Q���;N+_��=�#��:�n	�J���`s�x��6d�b��R����oh�O� ���BS����7���l��'�s�)9��Ei�f�{7U�0YD4t�M�#�������������
SgE�����-�;�]����p������n�V������pKg�O%����7t�?�E��lO����(�u�A���[	�-/}��GtA������d�E���a���ohG>������y���q��"�r_�T3~����
���i��t�Jc����d���+�.�k+,Fi-j�z�������	�94��v[n��+=����4^�B��7L����$��5!�V���d#�����[#�O�U�{��B�S��q�[^^L�Vt������d�p��-\��3g����1m��Z�WQ�q����5�o�*���g�Z�7L��^r�����4�E���}�����ki-��U��"3f���Q����3Zlr���j3�i-��
����?�*����[�8+�
��>Q��3�>X��P�g�-6�Q�`��3f_��Xr��h���JA��i��|D2�`�����*��T}D2`�pQ��d�n�>]�z�����]����o��������h�Z��f���a1w�P�G(�
�k0[�[���
�����*`xP��0Z��zz��7��~���oL�,Tg47���?��, 6g����c�OD��/b'�=������l~L������oB����h�hj�Yn,�g��H����b(y��t�f����MEw�G����o��������[����[����?g/���\���J��-��%B��h����m�q��f���r�D��Pf�~�NUu��\~L�]�����=2������%v�M4�4���g�]��F��B5���`dy��V�&�
�m�Tl.��-��Mx��M�s6�D���^��d���,���������
���.T�6k��nr��)@u�ba�����b�R�nym?���h�
.�e��ba���J��f��F��`�X����f������j�/*��l�@�@4g������<�ua2�z�,��~M���%
����Y�AO�um1�+v��e�*R��l�jky�,�{8\�;?�:-~~��y��
����nwf��lN<�=�M D��|f�
^�� ��6���/��s��w�`��w�isZMA��K��^����!��G
-��Y�oizmL��4tw����4]��RH�g���6mzm�4W4���L��Vl5K�6�a)��7���!XzI�2l����-��'&�,������}Xf����vKd���>�����,��}�W�2��um�Q�U�w���bu��Ya������~b���a+��C���m V;$'�Ra"�bG�umm��R'E7:U��Y�t6wJ�-��6�vg��yX$�.j��0�}��B��	���u?fa����&����Y�Ebi�#������n�>��J����`/�"'��g�����["�0����4w��`�+q%�t��.
���`g��'4�����,�
{z�~��9�V�a�Ll��s���/����#�4��q6W�,1���l�L,��"��N����f�����
��\`,����`|���Y��h/�h4K�R�T�o�qj�|)�Z$_
Ct���v����z��l�D>_�?����M��-_��?����eD�M�3I�B�a������U>g�0�J��pu���PX���
�����f�>0�"���Mh�S��St.9;g+AZ�6X�!�"b��nJ��p�[46�j>��y�z�7��6��&��B�"gcr������=�>����+�Z��}��>0|�q�7�y���\���,A�`�+h�MH,L��),����}�b��W�cE�1m&��29$��L�6h��Y���+�������VE_t{�����=��N���9����eW�R#!�"���q� �Y��/}����Y^��6X�t���
g�
�=�����L���~�
���L��c������	�V���l������;��o�n�6-l@#����������q��_�������g~u�=�
���{����Y"���AE4D�t��p>`�W�x:�F���G"����OsK�����s�:�
���E�)=�?��c��l�Qe�h�T'y������s6wh�=�g���]G�^0�%6Uz��;�yE�+�X������k���Q/���:��N���S��W-�)�k��6d��<�k���Z��[����y��Y�)h�6k�6X������7A�,��bP�%�����Jw���K���T����5���^k�#L�^kcz��a\q)�����O�-��Z��1�X�P1Z,�D�-��jV{��A�J���^i%e�,��Rl�Nk����L��J�~_a�o�(��,3����h��+����Tl.�=���1:g��W`��Z�/t<.if.����Q��a�)��HC����3XZ�lB�-�
�4��	v�{�tua��L��U����G�u���7�#c�-uK�Bw�h&=��	���0]�4�]��h��lg�(�Y9s7\�p��
=�b;�z����&l�D�K�_��s�E@<i��)'�n��WYm�a_���$��z�[���l0��1,�yV<,&a�.����������j.s���v��BCBtg��Lu(� z�L�U�(�%t��B���������F}3��Gf��,��7g��$B�[^�0,o�	���������a���=��m#W��^����)�s�
���Rk�W(���{s��Zs��hR9��*�S��hjgy�;���<�XX�"�*h�v��v��.z��O���N��T�Eb�p�h���#����J�n���*PE���U,T>������l������J�i;��,�����]��a�nymk2i[�0�,�e
}�r��)m�1�������s��
��c�\��i�P[,l9$v��0�o��[R���B����W���Tm��:�ni[x�(}	~����?f��
�cK�%C�~Yb������4J�LnQh/D8����M|��Q��J0�[8���p
�X����f���9���v�bi���Z
�����x�C�p����A#CG��t�y����y��z�������hx����Lm�1I\�P\R,l�-��/o�*�-��=&�+��]�s�B,<�gv�n�l���B�������j7U�{�u�[	Y���rK�0�R�U�C���)����4rA:�[����ga-f�o�&�&n�!���cj��PW�&ng����B�A�����pqH��F��0�#�n�Nx��c(����-��'�?�r�pv��t��vx	
����D��T}H����o��&9��Q`I��A�[�9K�ba���x�*����[^�a��bb��x;S�]����k��o=�J��n}��D	DOV�#��!�����;c]�o�e��ba�/�0{q(��p	�&n��y8��S1���+�l6���U8x�B��n
�#���-��s^(��'��t��,��S�$`J�����B�������b+*�����	���b{��|B�
7�P�T,l�l���hU[X�c^}�T�S��-MR��`S
v��r7U���:G��Y����&�w��>^�K1�w������	�w��v��+z2��n%�?�[���V��Y���	���V	In���|����
�2������I��>��0��fG��}�����[����FJ@��d���%�
�$�
3C�BCf~����w��H��+��
g���`�i�cz�����7�k��ZAg���p6�������H"F��V�&��M��`h���Qv�i&�
5[�>������K�v��zZ�t��v���F,���O��L��e'��tS�|��6���-Y[x�������zE��%��2
	�V��0)��\���E@��8_+��b�W����M5��Er���Y����nU��'����[����������'v����}1���F(k�E�I��K�Vh�����i,���,�F���2��#�K>�Y�-�E�'�)\��pm^����|�H������x+�m�[i_mWv���0��_~+�A�4���q���'`}u���I���w���,�/1�Vn������g��?_�A�vsLg��v�`��h��*������\55f��=Z�v�o���A�����z�V���m�ExUU�^�p���uM���
������:pR�/���|�W�y���l�@�nz�3�R�4�=��\��P�kRs�/���`�t�9��N@�W���Zr���h��J��2T;�0���S5�6?��wC��H�EQnE�����)��r{���
��U|s��Cs+df9
��?��H����i���i�6����BM'=/<y��s�-��DC�-�0�K�U(3����L�Ptn�s����,b/4�g����B>�hX�.��{?�E_�Pv���=���;��D�����fs��SS��d�n�_��/:�4XA;�Llv�wS4<E�c��nf��tvc����l���W��0<��}���3�����p�VqT�AX�\8����gg��98�j��P3aW������������j+��q���g���cc'i������N���]�e�S����gq����E�vIdz��N��h��"�n�f�Sj�]\��������c���o����^`+���U�;;���Yv�-��],�l���[���D�LElNp�
���N����} �qn��5�[v��\����LSjp�q�n��|�>34T0��������[e����f�������d��w	bo��5��n����D?L�Pl/u�vx�aY�b+�*���9���\���m9'����L�����'�L�Bl������+I��~����b���'�oo�i��M��	{�U��h�a�V�C�o�~��^�l+�~hj�YX�-����4�{���n��E�����r�����q�^����)��0b U[x�v��J�+��"9�r������K�P�Dl��x���M��ta)[��.��V��V���f����U�Z �.�t+�R�D4�u;����;C>����`�����Loq�07A,S������������cYX��,]rW��p�jq�IR�,_V�����}t���;�}�B��0f�Q$��U�{
s���e�����������\h&��� x�&���p��,��"���b���H������\��qv����2�M������)M�o���x�
��7g��]�6������W��oA��[�&6�L�@,��`ZF[_}&wSdW�i4��nL�LC��R�����*�7�kM�c�A/�KW������d�j8�r�"�

��)���=>�+-� ��-����Ck_Dd���2�1����44�5#���A������W�������f6��f��A/��$��[
�hC}a�� [,���A�s�������-�M/S����,|y��b^��0d4���\9��[�w��x�5�
��>�}�`�(���w�|V��,���L�ixM?T��>���"K�w��4l�(���X&�������'�p�$�^	K[a=������Y�i�:�?HD���FlA#�[`=k��S~Z!n�����~Y������[o���	M���'�d�vC�7/�E���X��Fz�X��������z7����}�9{�����+	�V
�m�D�Sy�4�h��j��{L{��'������7�\�z��tc��"{10gY4�h�7/[�Jz
�������(���M�L�[��J�Jzg*���<�-�7!���`������?f�.�$�JzAv�[%�C�����
}vC��<��a	�,��)I�W�p-���}��}c��(�t��@�*,_�����;���~������;SX=`fa�pu�8;���Ev��vc����F���+�sI�-����wn��3�m��A_�D��>��B����i�]���m��wX�4\��
rP�D���n��|&=47�<��.��G]��-���K�7L�6���j��Ih�f�b�e��3��pb�
�f������KZ���og�����4{�m�a7R����U���s������q�>���
�4�S4\��������
��YZA$��Ak3w����!�����)����+�.������+���-
l����T)��~v�{�i8�I�x��]���v�zmA/xt�vi/�a���B���+^Ko�/����@s���=��"�0-J�d��b�u�:��)��]��4��B#������.
�`�r�N��;k���S�bE�b';�e�3�{�l�[�*�0a��F��Y�[nV���x�a����~���P���t���5��]��1����f��5������b�B����4<f���������a������B�jX�y������tX�9g����Z���������c�)`zR���_,��C�ba�J�L�������'�z{���Xxm"vB�����e����7�,l�%�a�rbU������w��O�Yxq"v��k�7}y���<�6,
=�����I�]����.�Y#��.��D�����5u�VYq�|��i��U_�-�b���O�akt�Y�f3T�Y����f5��x��4la,�����eJb[���=�7�L#��Hn9_�n�c�=�(&	$�h�^�+�
��<��j�P��Z�:�.����2o5����a�������0��<`�G
�L�W,u���\z������Y���J���Zr��84�K�������%���zm�)�Z2�z=���XV�"��
<&��:�{�����$�+�UK4V�(���%��,
�0��_�):K���jE������^��ee�b�f�nv����RR�lt�SwC������U�����\��TFV���a�����������G�Gm*��&t&z��a�P�Glc�C~bVn��kZux@o"�\��3g�F���=���.i�rGc����Csq����U�6[�W��L�h��|���=���X!���q�B����\�u%;c��`@;�����e%�B��[��������������GV�(���`'���$-+��
����l5��H����J���������8V;+z�,r�wA�hX*u0�T���Q(,H����`�|�n���1}8����D��^����
����]b��^�.<�;b;��Y���\���c�33�[�B2,�:��E���-
�f��n����j��7�A�~�b/x�
v��e���E`�F��0�&�Q��,���(�[�4��:��1��+�1g����CMW"/V��z|Ht��f�CM+�n��?���PEm��}��)z�pz��O����������8����[I3��`
��;��.�9��-�T�Y�t0�"���v����P�M����'L
����V0�4<��l?�\��4l�(����u�,�"�&&KL&ZKi��z��s���(�z�������z���/\g�����n|��o`���l��D<E?�	7~��R�+�&��TAYt0P�Y*ng�~���y��l�A��
��1?�.�������s��������A�Pi��~.�+�����@a�A�w��� XD;�����$9M���T��~�`��t�.�<�lUr�-:�|��\��3g�f�Mk��R�cF�CJ�=�=
^]ID�'MQz��J,�k���a-NK�'�]J�/m��#�������9�k�!�q�t�<��f*0%?��+{����yw�������.~q,�4��'
���Gs��CsQ��o����D�[��D�P�UG��e��
���6X��*Tpg,�:`�+����i-�uk�(Zt���`��;c�V��Ct��=gK��j0�M��p#�����EO�m��������7����Z�`s�n��=�=3�	�h����7�~����J�����a�[���(��K��������sg�n����'�j�ri��gZ���N����������Y�����"f�����	c�fnb�v�=���9a��hv.t����)a���jE(L�0�|W�*���M+jN�M'�fw�b������0b�AHl��M����3�L��B,<x���~�'fn����O��BOM4���eV�*�aQ��.�����nz��>fx^��'���e})������M��nz_O/|B��:�>w���V'���n��O%�J�����d�@�,�"�0�m�I	v�R�����Bv��P#����C	�����a�K�����DO��l'�e��#6�.��w��hZv2uX��>f��<��V�;-�
�vEg�~g�^*K}����9{m,;Tt/�l������(|��N	��5�oUUY�����6��R*����Ca�y�8g�&9g��,�RVm��-��OK�N�f$����V�8��pd��.�V��h�
}���Va�b�K��X��X�#'���n��dZ�uB�"���u���sb+}a��a'�5�W��9��.��"��a��a�M�=(��}�"����i9�,yh��m���RQ<�B)���oN�<4E�p��K�������=��T��E�
��G�e��}���!��L7X�SP�����������z�r_������CsW�U��,-L�}�j2��>Q���.s����L��.�
���9El�z�M����J������Z��8�'N����aZB�����������a���+C����(M�L�`K�N��
[������,��a�p����d�C�a��
��5jx��1����Yw2=\�0��T<W�6��{�����bsQ�9������<�}��@��'�
r'��	bb��Y��X(r 6�������[x2`���Z,��������/�A/V�*��)����o�9V��"�O�1��{��!���x��1�{��N~"���lj
��Y�!Zl�~�.|NO&\,�����b�J���1Y��i��	��A/x�,l;/�	f-��,�@�
��]b����A'U��L�Rl.��M�M��"�.�f��P�,��V4��vA�/��J�������Y�9�]���K��Z����u��1�-��_Q��9{^0��������>� ��u��.u�J=�*����Zhr��a����X{���0�Iz�t!�8x�1����+�kaO�5]I��6]L��V��6X��f���/kpOV�*6u�
=����aC�i�i5�	���w������9���1Xx��QL�e�'\����b���Q��NkKOx�4MB�g���5(c|�����S�}�T���9�&�]�
�Q�l��M�pO��-��k�!��c1j��8<\���w�ko���+���]�z(K�4�[�@-<�����=�]��VU�c��dz��a�~��l���{J;Pp���YZ�{�ZIiC�D���Z,t�$^�A����r*�����ar�"�`<j��L�=M���4Ky��c�E�']C���hX��;�����Wm7Cv4��Z����Vl%�n��	�@���53�^�p�u����h�3+����:@���	�Z��u,uOa�W����8�>�n�����P�,��{����u�;�I�0Sz�`<��.\���^)����C
���f����'�g7
�����F&��FvG?K�C�i��cYj ��BS�iu����M��K
�����~��������\�^�m�KX����9�U1,]�d�y6b+1+�O�}.���b�iU�Ig���h*��G������9�l��{������9(,��������S��>afc�������F]�G�������w�E�pv��]8C��+�`K����L^�������B�����t^�~���c����|JU�;s���^��,\�3��
���!�+�d �U����`s���yW�w<������y	�V�J��P��,��XxD�`�$b�����*�����?������]�y�������n�nO�2E�ag��9�M�f�b��
�6����E?,V,l�+�3��O�b@��Uy�������Of������&hx��2;>���=�-�������h(�+
����������������e����sh�S�`c�����W��!�|y4j��\*�c�����n7����Q4S��E�"lg��fh����MD��-��x���k����,���=�
�m������)w7Cv�g��jlv��:A�'h�-^0�����������E7vI#����2p�-�d/��/&�.�
�mL!V�`�S3���YL������FS�����H��XT�vY���[hR�,)�X���\j�1gIyx� *R���V� v1�"���/�,)0DCC���fY,�1[iE��
O�
A��(H��Z�~1!	_��,�/TE�f�fY&�X��G<�p+�,	�D���I��O���1����K�t1�_����J�(����/R��!�e��]�{������a�0�LWKln_��=�&VH������Zq��z��T�7<Q�.���t^��Y�<#��m�%����[l���=��	��.����,�,Z���d�e��b����U�S���V���X�^,Rl�i�M�����'�t�D?0�
#CR�gy�bG�_\�j���^{PLQ^4L ������`���������u
�����H��Jr��������s����G��+���\F
:v���2�
�Y�uc�r�f��*��%��R���9��%��l���������)�����f
:2A�R��N��Rg��`GA|gYb�^c
��m��jqY�*���/���-<g{�W���9lZ(:�k����e���Ih.#�;X�/�t�c��.6���M/�D�1���R�(5��+
}��k���.g+�j�Y/xut.O9giR�X�����%B���p7��\���� ;s�\a"����.�F,�g;��czcfj��iV|�P7Il�:g[%�
���EW�f-I���n�X	$���R����������`c�n%�m}g(�/jk����P���?5�63dI�,�}fN��p��*��/�J/�3�
5nh���&�+��
�T�Y�z�;���X�������%i����M����%��nL���X���iZE{A��t����uN\=4A��oh�����'�sv��|�zd�O%�hq����E/x��0t���B���J�����dkC����H���%�0����^��������8���u�&mK/%�\h~�,��`������_��������U���^�OL�Rt�>g_�[�Uw�i�\�7&3�������W�+F��wbY�#���i<X��I�b�>b'�S��c,�=-g
%�E�#���]M���?�+�k�L�]>xt+��Y�w�}�D����R�"M���B��,3�S�-��M�}/(�"�f&�$v�Ol���R�Ys��\����C�d��:bK/x�4-�Y��x���Y{���&I?
%	�5Y�a��Rw���a�}����^��e��=hz��
��`�`��1���Pe��)���G�l!�����6�n�'vI6���6�i=���DW*�,j���%�t��Y�^#��$�9�����0L��D�uBv��������i�����OgAO����/k7T���@��?���)�s�y]02n��B��2�z�2���
?����w��SR�nz�7CQ�W]�7��DvC��<�jMg��m��Tk�V;2'�}�NVI!��p���E�l7��������^_����mspV����Zp�e�e�+:���'suE�����u���J�
�����s�
;X����c��}����B��k9O��D4l)%6�����<ThnaZ���B,��=�B~�k���{h����bs��f�V }�������^�D��,�^l!���i��=�4|��������d��P 6��������
k�l�����(T������9�t�6v�4��O
�����b����X�XXy/�����~�w����}W�F��f���A?,�#6�R��j������B�b�BO�����]U��"U*�������1�?���7K���2��*�7�ia�������;svF����^�}������Y5����b����^Hzz-����j�@9~��_&O#:��������G����bg!��Z�0����r}Vm�,mA��n�����^|Y-���n�k�E��G4T��YT]��>�����^�k�H��'��Q'IM����o����|��h��$�bJ.b���"_��-zB��Q�{�1v�E�L,Rt/���O|�x�i�MHx�������<<`�1'gm7�vcX"��� &�ZL��{t�����������n��=XU�-�r�P\,T�����[d�������9�@L�O��J��6�m�Mn!�cA��	�,OHl���`']��/����	��_&�(V-���7y-�����D�
�dyQbaKW�M�]�)��"^����x����l���*(�k��%��f��b+2z��"_x�
�4�c*o�]/:/�h�wY�����������$����`+O�`P�����"�/��
�* ���8D��^b������i�����w���$��`�)����� ����eA��	z����
�RY�Z�eb���X��	3�Z����_5y����/L:�>f�����%��6�7��0��)
���VN���|a�*�.A��,�����|Y��������_�M���W��[���}1MO�����r�v���N��,���0�4�
�$Q��P����k�}LU���t}����9in7E�����h���,���?�hq�H�`+%V"}��h(O$��?���c�cd*��s�S���Z���u2��
i�����+��=F�:W ��PzW��o��e~�nu-�J������E	4,a����P� �������`�BuR�|�9�l7��5Y%���h������eE�p��-����`6x����DKK����b+��}����\4~��t�XU(���g;
���0�s��kvx�t��XlA����0����jm^�����?��v�*r��(u�V#�M�����g
�D���nbv�n_&p+��D�� )�Z���M�y���+/��E&�(z�oJ�4w�"��	��Y��
+c�</��+���y�(���B��k�Z�/z�(R���)��J"�n_XJ�S��������J��������Ki�J�O,LvzK����%K�������A_��sI��M�������&<�H��b����A�J%���_��"1`(P,]���~D�^L���1|WC���_������mq_�L�X��T$BW����S��-~��=���nw�/5�s6�H���
���nz����+h��-�h��/=�s���Y������M��,:wS8gK��~��NLVZ/�������s3C���Q��a{2�tm���rbaD*���`M����`�.���dV�;�%�{}�����>.��M�"5��(-�v�
�R�j
���HC&�[	�Z~6�
�T]�2 ��g��Csq�cY��X)��)�+X�����z7�v����[u4���B�)�����t��
�^T�	�Cg�����>t�]������_��"�n&��O��]���%Y���4��`�t����l���i���?��K�[��%l?{���e�>/���������|IE���?����1]��~�nsdS7��i����s�FW�fg��M��CP��tC{�91��e�Cf�M������0=��\D��������fJ�5�j
��p�nz���8m��l��q�s��*����4P��V��(o�<Xq�����]*����3gz"�KOg%���%g�,��(��;�t����] �k�d�2��_�mR�/L��'��}�l�wZBvC������\u.	���@�#������MT�b��7J���@�'h�Hg�I!��P����q��s��}��A��:���uI���)o�����4�
�k:Y�g��czO���-9�L	��_&��	�?��o6=PD��M7����@)����%���m�b�,�8�.��K �O���,<:����pv��9o����AU�Oc�����)�Q3���n�������Y��!H��W����������'�������j�
�������Y�Q/*�i��T�������[*+��=v���B��8�:����!��('���_H����}����!�l�&B��l��B�Wf�z ��0�WHw7�v2Q���v�����B�D�o����f�D:f/[��>��Pv���������V^"�?0�/�~���������vK��':��ad&�~�m����Z
���������@3f�sM��������i������bo��k��jI�s��:6[
D7;|H���
o�R��:~G}����k����`F������C�cn��~�m�[�/M_�'�Hl5�J+�2Z����]{�H}�4]��c������/{.i��I��g�T������`;*n��[�Nm�p������7a�Z��3d��G�`�.D3�L��,,�
Y����������N9��7]�����k5t����x���0oTsU���v�Q	�^�����H��w�����%G��/r�eT �k�\;��K���.�����/3��g�����,
;+�>��&�O����9���J��r�����a���&'v\���� �{Hg�t���4r��N�B6������3Mo�mH���EwO���c�{�nz��� X�W�����y�A���s6��:g�T��y�a����0��>��"���_�p�)����olQ���-�	��`L����y�7��j���<�W��9;aL�=$����`�Ji����mA/x�#�?g�}I�f��"�#7�J��|�r��<���%��^p�Vc�s����������0i��_�I�d��v���J����I��`��u�b����";nt�}�����A3�mH��w����i����np�O*�T�;n0M���l���`��<�Ut���0K�����| ;gg%}�a��$A�f����� ��Y�����[�nv�/�M��z��2��l���=��>:�N�����h5��\tM������K��
>f\(W����EX)':�;s�����T��B�v�������<�0�+�}x_.���6���e���+WM���Q]�E��,M\�Qeo���K���������n����v��m�Nu5�)������fXq$����e��V��K\"��T2[)0X�E�Y^4Lg_�a
��pF*�g���x]������H{�n�v(�J0���,W���x_����9�K�wC�#���M/�s;����E���`���vc�Hj�0��U�"�e~�����IZ)�~������YSW�
�N^5�,8YF�L������],{�����[� ��A����;����WYW�������<:����t���=�����WWR�1�neU�3AW��u��3g�)����RV�;e����J�?��Hk���_���^���R�����P�����DC�V���[���,/"E/�;Y"�X��a�wJ��M���E��� �qY��b%��s���\�98�q�ew�b���n��C�o����bs�����\�����}��������Z>w�.�g_LlE�`�������*�^Ew�mk�����:�v�e����a������b/VEf�,c�l�t�����Y�U�������F]H��,S~��9�0&!v���Qs��6�`����`?�~+O�������H��XN�de]��J�w�i����q���h��B���`���Egm��9�"L�P��j��>)���]��7�s�������9�:X"��$�.��_L�\tN�;g;���eBAB���nf��S}�+��9���Stg�����[vC�O��8E��g����Q�d1�FE���h�����d�EO��c.|�>p_��zA���X�E�?�"�.��]��F�]���W�����bAv�7J3�<j���xA����8l�#z�xP�w���n���^E�8�4��R5�i9�=��E&f%z�p���n���l��-���������)�8~1�-���e���@����b�KG��MLj�����������b3�7���c��iu�M��6�e&:K����bY��\���,�O,���0�f�-��_�
�"V��{�q���YP��,�k��E�
�`���I�N0�-����e�ag�z��*�s��`�������D?L�Jl���f�v^�%�a��S/;Y��Y�X����QUq�,u+tEg��sv����P����6h�74^Y%v%_|������l�-����z]r���W����A�7{W����}1�n����������-���:�^��]��E�T%�kAk�%����
��%j�{�t���*�\V��X��hz%l�R������Mn���)�0R{@L�C�
��gM]5F�[BxO�����PiWt��w��������Fsn�9d���������5�t�$,
�`i^c�Y�d7E�������=Zc*��-�X�g}��F�pv���l_}w�i�	���Yx�-���7�������`1�\�h.|��5�N�C��t%#�:�P�Q����`xz��3<�K�v�)�Q-+�S�)�T�3-�|1yg���)+%_L)Y��Dg�4n/��*�Cs���>�`a���u�9�*hVY�����,��3����
k���0wN��p���~����>�[�q�=`��l'���1��$������cT�Bh������	��������K��]x6�)X�����.X��;��y�
��K;����fv�9|1�,��@��p�6k��~�sA���Z�=��o�I�:	�X�,\n�Z�\�g�u���T��F��ee~����i�M��L�)���P���/x/�a�f��l�DC�0�k~6����]T��E^5K`9�h��j7�)�������.X7��!�:T�]�������v��Z�h��4��
W�`��(���ge���	�������d'�$�1g��������L���hvC�;������;s�`a�����G�w���
��3�M_�K�yg�����d������L{YD���������q��k�nX
�S��^L�W4
R���l%�b����=��K���[�A������b�[������/��#�_��(?��&AYp6]��"b���^���HO\�g�|A���'��v��3����U�/:�7�����W���^	%�^�_L�X4-
��kj�p���r���e�ezu4h�52�
/��Ph5�,A��\����.�������|�����Z#�����+J��5�/���*=�L��@�Bv�����9�V���f���D����m��6��<�,SW�,4��-�|�C�d�b���}
����7+Q=����6���&VO�����-�|3qf��

a�P������3?�~�?f\�����oV�&z0oK,x�
���u��H��������\�����SZ�I��h�;K{��P�$�}����bk���)���n�������b��bi��EgE��s8��nJ�,�-��p��']���j���B��.����	V	#z���_�����lnu��";�s:g����)`�%����Yvs"�����lo���0^)�a)
f����o�E#��4��I��}��wI���R�.}h��XYtc��bs��s6/_�l��M�� ��J�����S��^]L��U�bv[�fi5�a�Y�P���f�9b{����r��b���}{����p2��_�`W!k�����.@DCeW������o�e�o�l=
���%�������y�v�o[B��|�Q�'��Y
����k��)�y������������j��E��m�LuYl�$~�NV�,6K�����"<�M�o�����]�j|�����/�~]��7��;�`��+����L����k+� r[E;���U �|��ga���|t�Y����}�k`�w�wV�X���s�����slN:g��(�z�dho�~��i_Z�������.��������o�"H��	��*o7T�m��PJ�pA�K�to���6�A����`Y
�ml���/������k�2�8;S�k7T{OL�S��/���
7M�����������-W.��}�e.�/��t��5�ox���p�T��c��}�=ovE��h��\W�S�����|C'-�	�g)4�
8��~_����n+v4���|��{�
�4u4�l���=��	�����"��M���z2jm6o+C���Cs�7��9����P�Q��ra�J�LoR,�=[���-I}��FIR3�����v��T�l��$5�����(��\�������x7C���`���T�N�9!�n��\�N,�����^����1h�}w��<x�Y��]����"��7��4tn�sh.�'<���+�.,����wSd��v}�^,�X>�wOi�n�A��E�f��)���=XF ���`9��n{�Kx���������b������X��G���Jh���7�w])���35�T�,�|�����?����:�7����w�C�B+?���.)����}�-�C���C���o�vl��&�Hd�{��X�0O<h�M�A�.�t
�I7I�)�.�D�DCE����X(�z[����V*�,
M��$

�%

�v��0�N�����;��Nq*�P�Z����<�Nz�;s�&����x�o(1]���l�5�o.�84W,0Zlnlr��u/�K�����I��LJS4<J��@Hw8%����>}
��T����'���a������/��M5dF0��[9�X��L���s}�d�����i�^0�9�N���]+������%���I��>0$.�a�K;��������^{�>)hZ�)f�
=�o�� j�S��V�������oXa"�c�����B��+�3�g�avJ�^|��>I��w�}��������dW�J�wh7T;OLZt�������_������=���v��=L�<pE�1��!�����Y��RY�^�,W�h��|3-E�Yc�R�7����MR��)����W}&
�VJ���[����r�f.���	v�{���������=�6(F�AW�&,�|����;�&�����m�����Ja��,�wv7T�1������`��B��V�����N����ox!�d�>���,�LfY���w�z@���
��w�a����ad��1Z�A[e��I���s�R�X�.Jv��w`�6�����-�We���Kn��l�O�c9�������X��X�X���������2M�7���
��P��%�%�
e����t����(]!���"���Ewj;X����ueA�~L�����E�,�'$v�|��c?&\C"�E����-v�H��o��n,ag���\�������%w�}XZ��E�Y�=��~�����I*�����[Zr_?&|i�Mei�b/�K��i4+������S���2�i�=��T�a�fa�p���h����?,N'�aU�b�������c�Ieb���k����2-+�
���[y�����&������.9l��6���v����s���\H�c��mL��f�#v}�l���n5�S.�e��]�e���<�B��c)y��%:�T����d������X�9.v�p��1�e��n�0�#�rLv��"6�7d���)���r��,���S$l��v2�P�h���k
v#���2HEOV�.��K�v?�s
�������,�e"By�
���E�&R.�Wv��?��H4����S+�q�v��?pi�1	[���_�l����J�Ve��8���zE?�%��9�K[�=�X��a��s����= �'����������,,N{��\vY���,
��^�1���3�����n�vc�z���p�lj�m(ko�e�������z[�'~	B�%2��X�XCo]va�)�������C?HE��a��H�PF�d9Mbsz�nr��ZUp�����`���$�%��u�a�r�P�R,\�w��O)��%;\���P�5q�E��`�N��Kc^L��|���m����)I���b7T;?����G0|����{��`���n��v���4�+��f��d�?DS�m���B������V��\�N���9����a�Zv�/�5���Z��1C?^,i�0����)��|g��X��cyr�TH��$��KC�J��]'�#�T������H��0as��5��8��{�e>.+I$6��o���D�&0nwT��-l�����G�I�Jxn�~h����<V���yEO��I5f/�M/��1�=1�m��]
����`a�QC�I�-�����������Xz��`'�d�PN�X`�&r���?8m'O���c���a��<��2]�T�3��l�Rv�k�����NQ��k*��W"��6C���r]���� �A���F8�����]���1_�BW,�]x��SP�z,@�0z���][���%�C�6�	Kw�`��	v�{*��?0ea�A�C�?��Q�Wl��r��v����/��u����Xz�����WD�p tc��56�;���PL��Q�N.���nt�����Q���T���$m�C�/:4QM����>C��[��rGZz����q�{D���#�iX<T�Z8���
���`����2X�oM��qwZ�ti�uw��&��=�.�~�?����r��
�~SlM�%��!��*i���-�hx3!�~:�
�@������a�^�'�*��`��F
��S�s������<}hn�����M��%�����Nq��9{�j>��Q��Slo7T{PG`~v<gi���"VZw6x�"�����\-�)\�{L{��U���1�J����h�V�`'tG5���a�~*�4���)\��=
x��UI��=������R�V�*I���e�KU�Mw��z��K�R� �������tP�x�m��N�E���
v���n�����h���0|���*�����#���`�U�X�!5w�L�0|H�5�W��<��������\�����N���(�~,"�3��=�&1�u��/�A�:�0UJl�!����D�T�Ej�0C��s��25w3d����m����S��?��i��������E��D�e���
����X�E���+t�;4�7Vm$~ bs��9;
�|�����rh.�-��,��mL��cNW��)�=E�1���������W%��E���
�R��%N�n%s����3s��������l��������
�f��XXhk�L
Hl^	vS4=E��_�s�1����V���e���
$�������C"wBt������.Va�����Jd���
cD���n��uc�l�Yr��.�v� ���`wVv^+n��x�/��g����f�lXw&��7�W��|����L��`S)�nz�������r���T#���������:94kn�6?��,��nJ�B�	��Va7Evq�Z�h�nV��,E�4����.����sv�����s7�Csq�G���+f�/wg�\\l����]��Lu[�E��p������Xx�t��w\8X����8�l�y��_�Y�7A��a�.���g��W��s���9�����������|��5
y�f�bba{(����=����(���7��4T�!0l%%��JegnYAg5��b�C����]������-2b����VM���)�����+�
U��VB�e�7������v�b����1��1%;��U�:l�z>Uy��Jk�f����DO������G
�(���J��5lxe�,C]��uVB%��[N����z_g����Z����b���H��r�f]��0u��?��zU>/�"���4�������b����!�@L�Yt�4��4\����l� {��	M���u�)H�B?*���&�YN��
W��L�����"���v��/4�=JS���,�T,"{�T�������o�a('��1�e[D�0�$����v��c�n3�R��D�^�w��&}e#�D"�0�)R���Bd'zB��Y��7�`G��v�ig�)Q��L��,+z3[zi�h��MiQC7JZ��%Z��MKQS�6�+��s�u�2�g���0�#�	����
�%�V4�U���^�~�K�-^���zv��S�Y�ng�S�
r���R�.��5�I� ��K�9I�����{J�"p�z����a��T��uo��
�n������>p��Y�l���{L�1��
]�`+�n�
��U�7�c�f^����	}	3��w�@L�Yt������}��0Ia��T��"�+7X��Kcv�t�:'�����#�9���E�#����q��!�	�
>a�����q�`�Z��f���PW����`a�!���;����!{^0�n���
�+�wOi�	f��yVC
d+�� ��+��U�R�-�-Y~�f��&�X�1�QW���m��'\�������C��][���s����U��� ��VK�[Xe-6����^�C,6���F
L�	������Q��1�L0%]�~]��B��f�aZ�ta��lo�aU���p�$a'�����!�f��S�����'�\x�'������
��A��boo
6kN����U%q���������1z�6+
��K=���������>�06����3�p�`Ra�4�3X���2G+�k#7�������[�F��e�$]�>�4��]�;���b���+��UnP.'��A�R��� ���i�Z�����\_w��t��=�/��(c��7Q��
����tc)�����^;|�{_p��^]�sn�snL�Y4��WMf�Y��15g�9+���m���J���V	��%]�7Y��e=�UI���r�I��)�Y�!
�2�j����|
z���`'����T��{L���|�W��9�7��P�@4�+�}*N�7x%�*4�n��Or1��kg�{t����%LW�<�,�l	���[��1�b������"Xz�,=�j���J�63,�2]�@�5�;�k��W;s����Y4L�;�]�Y}���u=��%�a���������5OZgEO�;����{/����y��;�����bah�vS��n���m	�Ymf����_����Y����.=~Y�kJ_���$��-���������f��$�a�Sbs����"��*�?�p�X`Vl���[$���(����f?���;���I���;�M+��1�z1�c�0�'�f�y���=�]/�]�U�1,/[�(}U�'�O !\�{I����X���
L�W!/�[��3AZ�Y?����^bs��9;j����w��}�%���Y.�-�@�����{L��t������}Y�5��83'����j���A?0�l�;�
�<���%��,�]��r5�V�+����Cs�/��u���~$�a�C���@�[���}$�n�R��>H��'�W�+�vV�+��C�DN��������FX
���� �])���wv�P)���e�E5nA��[�6����|yph�9m����f9��mf�"��������ba�<�����������(��l�V��,\���O�����P�P��9��m�3g������:���/�jI7����g���(�g�`���|&2�J��r��������a;�=���/��=>��S���-H�[�Y��mg���:�U�eE�F���f�.S�}��$�t�|��\7�iU��TiE_�E���^A��'w���7��H��	H��I��z_g�����$����1�n����GEwxm����}���_F.P�E�+B���Q�_s���k��}���.�A�v��}�'����D�]�����)~�fixb����;e4����tc�yJgH�����%�jB,�Kl��F[k��W6�	L��y��k!a�[��nA�<h�U�n��(?4w�t`��}�G
w�`�J���V�P���5�6xk+�W��i�)�m7Eva�5���3�2	8�wA��[��t��+�;Y-�����l}��ji��qY.h�t��v�Z�F�O�o7R;OL�J4>z��	������[z����YA��0mDl��m�Lkg2��'L�	�f�]���<��R�\��9���'����W�A��2Gi�%X��dY�N-��������Nx5>�N��zY����L�`;t����l./<o
G���n,��.-�H�^.��u1�{L�mL\V4���B,,=
s�����J��Em���Kt�<y_��w��[P����LL�[L~���qh���
��ze��}g���Aw�EP3�zwC��
o7��������s�1�B��n���A?0WYR���FR��Ek�v����T0Z�v��R%���7��+���b9
�V�,������L�9����0Jl%�f�����f�:b���7�`�YGc�$Y=��;
��LJYN)���}�Y:����S=�-R�sn7��:g�Z�nz�>�~������6����C���x���6�i-���g���]��[�fK��\�X�o�^���L�����d�`+j������.�s���[y���15^�P�_��j�|��rGa	aZ�)	aX`f��B��2��p]i�-�����,s�3g��oq��$���K*�� v�-mKCk��`'���]����|�����z���+��9��vX��
O��\����-�,
���>�F?X[��8x������9]����h
�^��K��vy���B��vxr
�W
�X[iu����a,��C&�,W�~�������b��5u�A��\�C���S�n7To�0�
�
����w|
��l������fx{*}Z���<�<�6�m��E���bgA�fXw��Gt�����m���S(ug��58�Oh�b�H�,;h�n��`X�v��d�����\�9�t�L���_$F
�����m���fXav�\,�0��,���>
No$^�r�+Um��wzz�v'���	�����	�=��C�/%j����Yv����S��iK8�-,�����D�&ba��G����c��`W
����YVm���;��
����^�7�e������i��z���ae[�� z��K����X���v��j���AOx���B)���/T�
��@+���J�n_A�K��9�L�W4t���=
���fE��p�9,NU�ECUl��[������D�Tg�
�e��7��|����$M\&9#���n����/��"z�(�,��(�em�f��+��w*��%z����ia)����w;s�2��h��J�mmT���F�rE_0�&������:�i����=����7��%�x��N�����i���
�6�,�
�~D���bW:����]��R����;s�m�����3e�e$��dG���G��}�r���������p^�X�~l�}�����l�����E�zb���n����Z������0��Q��g�%�a���J)��@�Y�����K=
J���94'�.�{D&;fS�=�����"+�&Xa��P���XXC(vUB�i���u����`�x�4Tr�+�vC�#����%��.[�u0�V������`z������Q�"�,0�tK���7H��5��Y:~����I����zwe���x.h�E�/B��pv%YZy��0aB����/���)6�i�����D�9����@S��Z,
�Vw�����t��/�V�p'��s#�����N�g�T�V�07BJ����1�T���8�CG[�K��}���;���a�Hva,^v>��8K�=Y	�-��Ova��4+Sd?��i��	bYe��	�b���1W�Q;A0L)�Ku���C=�?�Y0~3�����|(�
�b��b|��v
n�eKs���p��.��J���P��4Ln7��*����Z47�=4�[A�pXs������&6���Fj�� H^>��g
GKD�6�����p��BE���#��%��.�^�����Z�R;��/�C�K��u*�x,l��KL�t%m���9p|h."���3�M�A_�p:�p� �D�;+�Uk-��tc�����h7To�L�Pt��,�.�c,�D�V>g��L�P4=�L5��?M�RBOT������=
bH�������\$D�SS��?����da��c�l(vF`g����sv�{W.k-{8�Q_4}�O���]��a���dE7��K/%�X)Z�v��	�����8����3�a�P�A�a��$"XP"�������y��[�.xi"���B�U����6XA�Q���`o��l���M�=xk4��4���������Y#T�����`Ri���XZ'�pM����@�5"a�6��!��(���j�}�DwX���
�*�6�i���4"E/�ub�lz_����,X�l�8n����FE�0�+ML��oa���mq�|�=4I=0�Q��k,��{�tz��[B�b6��Eb����{�`����";�0�t)�����	j���G���������W��o���M��T&*����`;]M�W���1�.���h�;��jn�Q��V��c���[���y��,��P���sJ�4#M,�=�P��37�I�i���zdN4���w����P�Z4t���#�n��G�~�0����Wa���i����HD7�L+v�/D,��2Z��0-�:�j'�a�$�W���P����Y��!����9����af���k<�7��V������"���������$���G'��dl���=X�b����vuV�����LL3u+���_���^q�i�����s�s6�	�l��=�]6��]J�b�H����<jx�.�w3dW����f�GB+�eV'�\
CVb�k,;�������PZ1-�
E�M���j_M��������
�@�����H���-�������6*�� y��l�i=����DS��R}#�i�8���.����)g��_��[�w2�A�]�"���TdZ�w��G�i����d�7��]���] v�/zU�i+�N�{��b%�)3{7T{LZV�dib���9�����b��B�����dj��'	f,�P,�}��X�^�]	~Z9x����Y&��F���b
���o%�U�;#��J4�I{���CWz�S*���	&� �*��Ok%���Cs���/�
�i���C������1g��	���?�F������}�j=a�\����v�E�Q#a��=R`*|#�Y�L�Et��/�4
�O��tz#�t�V6-�<����-���b���qM��x��'�I%Zc��Dn�����1��3��i�a8�H�a5b���?�4�*���u�T4T���3�%�a�k��b@(���m����Ra����WVi�p����Y��)��<�����wgg�Nt���*�b��h^D��a��I��0��a��!u�}�������:�����!6�?��R���`[A�qZ�fY�`�Sk������F�	f�{��f7�v�����>�biJ�F
�ZQpsZ�{2n��L�>���>L7���m�$�l�������`@�)i��z���{Bx^0I��>
��I��������:$A�U/��`�j��)�f��TW�yeR�w�bw��r�om�
#Jj��
��S(O�V����A/x=)��rbZ	{2�1���^����b;������2r
�
�w�F��l�Xz����]a��#5-�i��	�~����,�M/#�~����$5�5�ANQ��`�_����e�']�b�e�'�����.x��h�����2t�,��^�`�J&������h��g�LVlE�pZ�y2yg�7}���9g���ne���EKt�����4lL)��Y5�*���I=���h�<��a)�4�����1��3��tK��E�b����1�P�E+������VI�re���Dw�I�2Y��,���
��*��kI��$�EC�<����%����{A�oZXz�+��iz�L_
���
M���yg����9{�@�d�aX����g���v�B?4�q���a	k�]J"��1�����U�'t��^0�*�o����q�wOX\'�D�������>Lr
��g��jM��������%ec�������(=��e�������!�0��=h�S��	���[�z��u	���/L���6��K�2=����i��6ihC�K���,�V��I�O����d�d���'}���t7T{O�d"�R�`)k(�f��y[�y��]��8Jbf�Jt���-���f�J��R&kufZ��i_RX�85�{�h���+���f�pe��7!Xx����2�����C.��,
=��O4{���^Z���|����-e�Z�z�)
�&m�2������6�����N��
���d�W1iQ����^����}�k�����H����
��G1>���}O����c+�m��l�x>g']X"@X����66�@���U�
��q��6>vSd�^��a�U�+G++hO|�C7Kw�US(������A_0@,��_��%�m��w�}_V�^����� &���
C�{~�\_�O��9�Y�������M���w�{{z��+F�>,]��_��$vS�x��R$������}>.<vO�����W3��w����O��tO����^�n�����m@�Yn�����l�	����Z����������q�lc)5]��7^y�^O�f#�H�����������R���,C,�{�
M��%�\�%���L����Yp��v&�9~Y�N��0�
��"��%O�f)b�7-����e-������t����b�bWA4nY�z���i�"\�e���
7�K��p��%Q�e)�E_u��/B�=��,�t�&����0�Nt���
�*���6&G-�%-m0V,��7�����ec"��;<e��R�����>qa�,���9#���;v��x�Ru�q�e�����E�i����'���D�� �PF�f���{J{"����t�2v����{3�����K������s!�wY�y1��1uUY����O���
���-d^-+;C�X�,�N�(�*]v^�$L����.��]V�b��n�lJ����u��'t^+���!�*���X����#lx�[�YV�^L.@��t��f��P�LPsq�������t��S�l_��^0X$=���hg�]����k���GuIBW��,���e��J���0[�
��`�m��2�"���$tJk�M��	x$��3�+���.�YX�V��rS���d7�������^q
��������q�3��.�A��0��u�n���4W���?���4p��b~�^,�Y�]�|���be��oxq��\�Z7x�$3�z��
������z�$�3"�����J��2AC��%����9,�P�,���b��#Lb��;���=��WVk+�I�
��M���0�||S���e�N?[��XV���W����M���L1B�}�`�[��"�1L�@t�KB�LP
���[�f���Y�fY�����b��I�;"UVY^p�����X�Mg��2q��v��O">e����J��u������r��7	4L?6�8
C.��v���>�z����r�i���]%W�6K,B��+��3�+N��s�+����9��T�`�8�9;�Fl�����dw7�v�`������X�M%igx�	�fu�bG���,��>I�+�L����bb)�i)�s�F���2��
o���ar��&P�;����u�v��4�g�y<��J������.��vO���G���d7�v���.Ii�q(6ENw#��T�E���Tc�
�>L
��A�7'�^��D���3k`/��"���}g�^t��~`q�,��}~�1��n��fA��������T�{�����������J:���5��Vtba3�fx[�����b����D�Xx��r7LJ���r��\q�������;G��4�X���+��	6��V)�[��^���]��E�8�nvU2
�e�����kt����B��
d�������������J&���L)��ur�v��{�BE�Y��G,��4j�k�-���'x��T1��`��v7CKE
��H�nz�{��+�A���~gO_�6[�]���n<���WT��.�dX��^�bi��He��C/�1p�jr
�����LKiS��/x�tV/��������:g�?�m0�7�^�A����;_���E����5��`��7Sd������e�;s�����t�9J�U����J��&y7C����T�~^�g�j7T�"0t��.�Y�[)��D3l�&:����������0b���]�1�v)hXp%�����Fj�	%��+�^��>���}���1g��������i���������"@�^�R��Ty�����'�XYe~��Wg������aG����9��y�,fj�q����/�&�n�NL�S�5o�(�1��=6�vK�xf��[��{���YE?��B,���Q�E�C.�N^����X,:�A;g����Q�x�;�2�R4�U�0	;�����Q��M��1'>��Z�+B�^���v����^�Ey���2�e�;��2��{����%������5�_�&H�>f�m,AH�`uf���_�}���X���v��*9��Sdqh��B�,�_�4��Oj�,�.�*D�_+-�,�#V�ebjB���4�f��&+:}�����c7T�|pY��pr�v��z����w>Y.�}Q#��%�����b���%��)���];@����0K80��s�V�����}YY���������
�0?T4��+n{����gv���bs��������f�t����N�X������JXv�k��������9;X��Y�E���/,����\	K��W��;��!_�R�tI����������/�
}����5(�����1��1aG��6�*��j�F0�?����C��j�m��������o�fy�LW>�|���.�6������r��!W.�,�MC�����`ab�X(�(�*������=.���X0f��]����-���/K���Acg��]�@���]�_�Y\q7To�,][t��v����Jb�l�jU�M�����&���E�0����wV�or06��_��s�J~��4
8[g��}X�������"�L�J4���e�]�.�C{�L�-d����~a�S���G������D�\r�W�����%�Q���
�9;
j����_�z-:�
������D�-���[��i�G� #|L%�eLc�o`$/������A��aZ����Gc-������/���*C���TsE�t����#��G.�������/�w�"�U������j?��HX�rQo�f�%���X����E?0%X&",4��vO�=���z!�/ �"��Zw�e���a��X��Tl+���V~������>����/�
����0�$��Ba�k������H:<��rAk��|����D�z(���]-�+�e�_��H��������Ov���E���]}��)���^;0�W4<����i(�����E���h�iKy���p}��+W�~������cg��S,���k��;�n���o�-����n5������?��J�=gs���)�N0%^�����ZM��6
sWl��OZ����wA���b����^���7���DgY��9���`t�_�v���A�W���{�V+�<�}`����?������z�����Sgcg�[$+�}Dl_k��L�T4���r�vi������_��L�D�
(�=���������HX�ws��2)���������V_��!�o}��K���_|�^�+�R�e�����Z�5Gk����ip���p5l,��,,|�j}aF��V�X,���*���L}�d�k�R8Equ���V�����0�l��*��1Ni����`W�?�k���
���m0	+�|W�{L�|���C�j���_��	\ba:��e�5b_����E;sv�`���V��u����
��j}�cX�4�$XZ�+V��T/��������Fl%���9T}h.h��J_�	���<`�L�����f_��}�7��!�������[Y�,�����i�O������`;Lr[	�XP��K��x��X��#!_��Y�.Ja��W�ZQ��1��ag%�T���I�	K�B�[�����/9�s��9�~`�&�c^��X���U�� [�.+q���~bn�W.,\L�%$\O;ba6s����X��\l�b����8�W�s��T�`;<��M�������d��`��D�����@�
E�~�U��R����<��j6��u��D����l�vS�c7���N��!�-�����~~5�<~L����=J4����xY�M�m�W}�~���6�.|�8�b������~����I���T��37l.���M��2F�t����?��As�K������P �?��[�_E&��]�^8�E��}��h�s���|^����^�F���N���p#9���>�y�����o�bT��M���_v7R��� ����P�
����Ytt�5{�	��KE�j����t�[D�_���_��P�����,�v��G4��N#�f����)��!U�_��](�n6w��=�/��c:��<g�������`���)mg��0�B�Fo��kv���_�;���<�~����K�7�C$�\8���r�Oj�-��A�r��
��\���7WTe���GN��wfT�i��I5�r%�6x��d�~���T��&Pa��e���(?�w���?��	�zo�	`��H��,=�i��I����M��x�^2\�������f��n���aq�����fk��=/�$����������Z��'N���=v���(&��m	&��_����>4|y�}*��c�:'�i���`�sq���"<���7(���z7R{�0�$�h��<_}D�����`Gi����@�]s����c�%e�F������P~�lH���:/����@�;����-t���L�X\��)�}*q����6}�"�������f[%8�����7t&��
kx��.�^�p����`D�iWgo`�����!�>1�������?��;�������o��v���t�s-�����s�����9�������M/��(���'4;PH#���9+��@����{l%������n|�4����OmM�%����Be!��X�9;*t�����M�l;�_��u�@p�z����$����	Tn�I�#=g'</��������#h&����@�X��m�������M�vE�^���	�m�>B��p���w��Y���t�"�M���q�v��l%%���A�=�i��X�6tZrmv��p��c������������b����
4]i���_������QA/�-��W�n�v���IW:3���&\�l�N�y�a�	<�^����eo�F
��g�������~��H����a/)���!�C�zb�@���$���0�N4<[�����m<f���ZK��>.<���c�E���aW�g��9{����xz����w7Ev6�������s�:�Jdh�_D:0�;<�������n�9�k���-g;�H�tA���H�	�b��5�Cybp�����9[���qQ��T �tU����
7kI���j�P�b�A�Bla���4a[���]p�v�wl���A��6M,�/���{��/4��qp���f�7}����svU�
��"<A}�8s�&��-D!!|����A?p���^�
�n<������vc`���$��Q�v�i�5����[q��]/x�U�x9,���k����vSd�	�v0=��7���Y��*���i_�L�����B�����9�Opi}.����������������+��e�\AwxO���)��)��v'���pcg��?b���|����+/���t���U�z.�"pu�V�?gx��	v�i��q^;�R�F
�4���M�] �(�N0*���T�0��p�&�\����D_��g��)���{�������zo������zV4T^�O�� hxU����+}Q���.\����"���]���A������m�aO����`Y3�_�v���|�p�f��"��z���`i�����<�
�F^�3�����5��h�v4a@'����t~�
��"��	��>����^��/M��c������oX�+�Jz�k�	���G���S1���eI���Y��)Elc)|����f-v���v���%�/��/:G!w�n��3yS�x,�.�L_�I��s(:��\C_��9��oV�'��_SyS��S~��jyY��b�q���*6�jwC*��D��M���7��mS��Y���,�~�J�7+�XD�v������/��_��Qtc�M�� �qY8��/���%(,�|��%�]������P�DtV�9g�t���qbs{��\������Q��PsY����f-W��,�WlcY�fY8[lO����sc�*�s���9{_L�\�`Yeb����e���%���Y�A,���b1����>���/��.�����������qY*�b������t�V�"��tkXy�z��M���[�E�UK�,�~A�V��0�,~�����cZg�
��+�.��_L,]4����B��e����	���)�e��5�6{@��D,�
k�E_,�Wl>���j��#�\�-Wu-�����c/5��%�V�RV2��e��X(\7��
����4]�;��J�����t��|U��{)o�9����;3z��il����w�$�2�%���L��W���-}�l\���N����mx|�!����,+H[�s���},�o������.lY��|��
�td�<�!F�g~���>v@t�ax��X�������
�7�&�`g�__�Z/L�.���e��b���������R�b�{aGFM�w(�
����S�Op��<N���s�����>��[k�D`�����b;����������w�w���e�8 _lx/0�
z���ZNXe�M��Y�D����b�x�d����I,LzK�������X����\��p9#�x�r��=1��,hX:+�f�����>�o�F+Q�[,/��A��O�4�lf��;��LC�p������B����6BD�f_W
������m�������;5�.�S�=�vsc�=�8��u�N���pI�_k�������;�$z���zi�w�����T�e�,�/L,/����i��SG���%�<��������w:'X�G���x~���6�=��K��Ch�U���Li�}��vUF"���nf������������A�C�f������`a�hX���9{f����z����mx{�m��x���~������������C/�}���v��U�?�����s"�m��0��	�����p96��Rl�
�b�y���+���<��f���9l�a{�������
�"0c�`'����5�6D��j|����^X�p��l�Tt�8�aEW�O���u�0�V�1��`:���P�l0�����t��t�#��'L�����j���u��K#ve���I�������n��N��39�R3��=X�ja9�������o��w��v�$�,h/0��if��87-��L�mY/p�l�:�k.Uy��w�)��-��Y�EWx
A������������{Fas8�Id��=��������R����Y�
/i�3	��_�^0�!f���������
�cx��"m�9�<�H���l��W���'�K��;�B��{
3l��gR�6xf�M�H�V����Z�����
��	XE�J����������V��28��t�u���V�q8��:�b�5���������sZ��_k�,����<��X^��6�����M�k�X���h���c��-����pm���%`����~���[W�1�x�9�	�����UA0����~F��l�[�M?���|L�����Up-�v�8�n����2% vK�+�Do��5OV��,zf>3�&=���G�cX��������g���rf�������'}�����m�VE������fz�6�����
*}]f����?�K��������f��<�(:�^-[�������3�,��HrV��O�����,������wZ��f�{fn�[=�h:=�Q]�gM�w����Vv@��&j�����Vk��l,#v&���2��d��;],N��u�C4���m��
��%e�B����"�Z�]�D[4���2�u�X<$v����>g�$��s��H}g;+x���
Q����mp�P��t�/w�G;��G)Oj"{<B��2w�?����b��M�Y�|"�+�]����9�L�)��=���v��jswe���n��e��+���%���b��oW��6���������+�`+�0���Y6^���hx����.u��CT��
}bW��X����Z4T���JV��+\��f�~���[��I3��h�6D��X��h�J��H�V+���0��Y��.�������VhW�*^Y V��������|j�o��������R#�?|����Yx��}�����W8�6�p#Vk�+}��Rxyk��3���:#��]~��:�`�CEg�J�6Y��L�,�L�py,���0����n��(�>edc��W�y��w��$����D`8a�4������i�L�{��S��w������J�wW����k�Yz��5��`���&���M�����dubO��m�L��T
�7�IL�6`W����nk6�S�!Xx7����j�XWv
_4��ev����k�=�/�7)/1�9V������j�����&�L[�+��e��?����b\���D�&F��������z��wZ��.�;��c��6����%����i�2���	��j����]�f������c6&G�`���ax!�1�����(������5��0
V��y��nF]>f���:B��A�/���	��U�0���}1�C�X�'v�b�91�O��)3:�<�����r����{��h�e���f���#����.�K���W�������N��.��m�|�G+q(�Z�Nk���\�X�K����WB}����;HS-��U:���o����M���_��,hx���7�$�O���%��N0h(�r��h�������o�+C4�h}���:�P~��l�V������\���3a�D.w��u^��J��U���L!/:�������/e��Y��;��|��!��
N&�6vY��d���?
g�[X\)��"�������T��)�g�P�=u��!r�rAw=���������n��I_��^��c�����N��,��Kl��E�V�����$��,���=��U�������`"]�#�zk�A�����i��� v;���t�	A�+��.��v�\f�p�]����NvhQ=`IS��n����c�$4��W,}�t!����`<u"2�����IH�����t��,������������{��~g3��T+�+�\��,�w�f���1�OS��H����\�J�
Kj��y�`;�X���(��q���������W�uZ=wn�+����cs�i�������)7����~l.�p�/X*^Y�W"��1<�'�t�(g�*��N(�������~����~k�;��U�<�XL+fu�-�k��]���n�
��;2i;�+,��~��6X�$Uxb�)�����/���(���YX�#�8�����HXP^�*!hx���cR���d(��w�����,,��A,}J�:������������;�G]���~��B>a4��}W���������I,��aFW}�3R��|,�o����~�<�o�;E�������'&77
���g>���OD���T�����	�v��+�G���$m/������Ky��1G�tGVt�{�����0,]��2/���p54����YHl�����
O�M-=������������
z�${�tc@.w�c�>�{"�@p�).��������F����]O����T��+��M���.n������o�T�h��J����D�	�A�	������v��2���eS�����Y����n����rsx����d�Y3�X6D4Ta�e5�b������]l�^�f���ln��PxG������fj�
����n,� �����] v�oC�<D���Kr5{��k=�K����u�qW�� 6w���2���b�|��=�6�u��:;�*�e�v�������]��Ur��uL����E8c�`[��]8%�U��mx��hxW�X(��=�]��V�N������7��n��I,KX���+�T�����y~D��V���C �\������	f������bhs��e!I��E7���J������8���F�H�Y�O���2b�,��:�5�mth��T�-��n6����E�o�9Vd{'�&j���;�S�]���t�B�Yb
������[����0���	�`W��l�n����a�Gn���{�o��h�IDO����iF@f3C�������}������k3�q,���gf����M�����b;�p�W�m�<���f�i�5X:B���I�cM���a4)v�4���>��?6�V>(�������t8��EO8y�e�r�����3l��cO�6���[���9\���n�����Bm����[OM0��i��j�R���=�3o�h(�{zn]uH���pE�XV	(���$�����M��l��w��n0X�,���>���f+tcVh�F@M���Z(��+�y������]���uH"$�Q�1c��E����:�
��I�K���?���Rb�b��D,L���a���7�����I�#�����\%|l.h&�1��$�N�F�=�
}��uo�9b���a��+)��5;��i6{����r%����-�[;��vXt��n��w����0.���j��t\���Y��i���y���Y���
���=���q�a���1,}:����B��{�$
bGB�l��5��o3X��������y�m���m��SNl�
��nfN��1��kF�r���6��l��'���f6mm�m0�5^���fj�-�=�[�����C%��%����E���]�$���=�.>6�����Mpt�f��sB|���=�k�^��SW��{�PG'6UVe�y����|������8J���[����E��7�������W4=(�o���f�o�)yxa`!w0�?��!��������3���9��2�9�g�.p2
v������;{V���������t2
��D{J
o���
F2A��WA0��f1	����f�YZ����4}�"s��Nb'�#	�zN����+����7g�rfud�q��Y��2E�������ax-�hx��E��{���9�b�a���[�;��������`�{�o��XK����b37g7��Q��;�Q�0Vt��
X0/�Le���1*tc�������(�	s��J�hA}�������U��~c�5��p_"�wU��0�a�s�)���f����y[�^�j�s��4	�[s��`rd��(��W����-�
"A�f���jVI����6���A��	=)���Q�e8Y��bW���f�p�U��3g��,��V������ ��tH���i�x�2����2���<5��
�a������){����;���db�25�
7�J>�'��u@A'�_'�.O�.�H eO�,7�Y]a�J�f8��5{��.���V:�����D����M]�������#s��N��4�������e
���{�0!���"���:������ ��X��h���Z��#wk��<w���s&�M\��l�np�O�f��^r"ve��lx>����-|��X��vg
Ilin��S����s����p:�o����:�cNj����{���?������Ywv�K�`I=�0�^�_����k�6���b�>��,\��=R����~L���.lV�X>Hl���n6��^4<�#�T����U4e���|��Jwf<
����^����Y5��M5Zf;�b3������f�cs�?�,4��]��P�f!�s�s�=�����y�-��+v�R$�;q�L�����cs��b"	����XxxS,<�b��~]���ox!����^bO��wz����T����p�cs��������9��m���������E��8�m������������2�����]�v�m���d�iV'/����ou��;������=o!�u��&�J��a��J�E���n����zS����K����R��K��S�@��,��C�bY��P��	�\_F�Z�����iHJj&}H�s�Gm6�������{���Km��k7
[��Y2Z�d;�b�,���b��G4��5��������LTtg9h��g�kVz+6��9�	=��+,��,��v��6D��D[�y#��9�?��V4���V?����nywge'��{{^�t���&��Y���ul�]�jvgg�E��@b��-���n�V����6�b����7��wv������e�;Q�m��l�Wt9��[sE`0���`�U_b7;�'������
1��;�X
�x�YM���.���.���G�����	Vm�����p�t#N}�9�6�����u��,���B�[9?}����m:�b�o�����Pb7�����[��6\t������no8T���p��u�=����
��fS�-�P�w�?f��*=�3Q������p�4�Iw�^�Ct��������[����[�`�'��X�{
7���>���9b�n�pWS��TW?��jW����Md9l���'����n������4�X0���Y�h������3��tQ�+�n��|���G��q*�����F��?>KW�baLl�E�~��������A������w�$����A���X�����rvp�f�6O�~4�f����w��P;�w����}��n�9���p�OG$r`�����M,l-
�p�4tH"4���3��h�P��;�<��hwx` �����S��e/�i6�����
���)�6�������m�<��?���f�)#��)���������r�[s���9I��X������b�j��yj���A���Tb�}��-�\;���o�[f�a�3h��aM��������S�q\�0z�4N��7���1����Y�����6�����������=�S���s������\<
oq{��t�f���
�6��$4�
��K7�eF���.�C�
?#��l��#j7��D*KDWX����K�J �.Xw�v��nw�#�#XX����:�������������q��a<,=�,�;�]�Lp���D��o(=� X��Q�3��
��I�D.�=���:l����Ys��9�mp��d@��!{�����0(��	:�_�|���������P!�Q�uk����V���<�j6��
zf�,���[�5K&Z�$	w�w���;�~[�\"X����]���mxn~�e����x�_�6D��`�t�Ul���@<�����u����	6q�S�U�C�����������\6R����[*M��;��W���3�%;�;3C��0��e���H�.�e����d�MF�����)o�����0�.TIH��w��;�[]�&S����=�
��t������1X��J_���L\~����p�-�38�5��&h��g�`'�����g(���:SEb��Yq��9�%K,����0�
:u�n���������-�����W�a�\�����s�����eEC������f�{.v�s�b�B����.���n,1�6���YSlI]�,6�����1�J�C,K?�]���y��_��\��=k#n=��)|gc�����	�����D�����6�����y{������H��������txc�&�{�;�>�h�C$'5|�{~�nC�=D(�]�,�&�@|���X ��������@-�:�a��`��a�rbN��x0g�i�������'6i{�7�������������x��&�g��yX�;Xq���
�[s	�)k�����5���eDo��*:��>�EW^q�$�'������}��,�����/��W���~"�e��e�����T�{��rM_	�$�j���t��E�Y-�h.1�=o��
�c��a��<&�[W=;3�h�N�A���k��J���D=��?x�
]�t2R�����UG#0!WUB�B�`W&c��`u*�aE�X��(�2=��F�'#W2,��	�#�~k�QLs=���"�����+������9G��i����l���+z��������{J�n#���6W�m^f�GK,�x��1yZJn��P��E
��@��y��@��������	�,n����=2F��:�`:]�g��;��<�U���"���D�I����m��^�%�-��*=XY����/6�f�]Y�[���`+z��'a��My^@L�!z�t��LO;�W��%3�j;`f���7b3%1��vNt�9]���	bW�:�a���i��#��rv�������
��	f�]����1�p����Nt9�����Tz}l." �����U��]��e���=��O,~y#����,��7��>���Y�?�Z�Y�;`>�_8��M�Q�k�	?�Ob'P�
���5#�s�Nn�Y�;`	�t���,L��X-��
�8�=����Z<�>X����`7��7|g��`nC�@VG
��K+����(��������
�dv�Ct���am1tq�����M)�a��>'����,*
���W�4�3�����11�p(�KId=���1��+��i�����|,�p���9�����c�tk���!���X��c��z��2}�"���8�z<`���!"�l>
W�]p+N��L�����vw�ti,M�[a�F}����L�+��qo�p���� =qB(6l���2�����Lh��������c�K�&�73��9AL�,z�Qo��[W����i6�J@�v{��n��`�g�aj9�CAs���f�]�&������!\����M�bx�c�$~tB=���3y0���
�Y�&�c9���x���/�f3e(�-&R
w��p�G�c�e�/�m�=�@/�w�[N\�5�p{��a�3k/_������f�l0s)�/��� ��d.N���&}��o�9��'��k�wvV�[W���P2�Lk�����������X�����W���V�-q���{x��0y|�Y�;��W4�G������ol�����["l���{�[)��Z��`x���B��0�0��	��/c5��!X�<`�A����Bq��y7���m.��0�@������=������uo��[W�@�|�0C������UG"��,�B�����LW���H�f��$,��J����jtX\<�R8����@��"A��.����x�[	�wJ���
�l������p++.\����������A)f3~?+fiiJ���LY��z���M�8�R���0����y~������@-g������j^���k�D����sA��}X0K�����g.,,�!g��y�p9��8#>-��L�+�T���+n����X��5�YV%�[�F�*�l�X�F,s�	=_��S6?%��D�K�����v����ML	�r��>���[o�
7�f��#"������/�v�����\���^��kE��9�[W���b�P�"^�n6q���$v�	^te;%bw�&7-k�,�]���i�������u���hx6N�d���c�n��8��.}*�����l������c:a���������,
����9j��z��>6'?ga2U������j�-�m��v2��i�NV;#���-�;Q2m���@������l���L����E�QW4< n@�-�f����
��v�G4+k��XOKq'+��<5n�����8�����V���21��U^�]��i��d
;�P6"�Y�[W��&��;������It���`�=�����eE��������:������XM�V'����0M��G�U��F*�0+aU+|�h�"�����!��
3U��U�	����Z��la���n�0��7Ew�e�Y/�[R����w���pG ��v��������B�!rPC��K��[�bbA����w��$)fa�TF]�F����i�-�����i=��)���u&bs_�-��q�,&�
�#(Vb V����@7�jF�)��GHu]�0�4]�H��p�|a�5��{���A.S��pgS-�M�`i�X��	�i
��?�r�V~���1�4f����0ZL��'
1"E�7Z���`a�4Px�����,��Z�D����[�pC�^����%P,Ty�=�J�r���/S�c���fRC�a*�S��%X�U�-w%���x�D�|
�~��j�0z�-o#����D��8X��U�p��f�����k5n���AWv�K,-Lv�u���P:M����W�O�w�xq�	���1*�E�
��7NX�D��7t���DB��g(�
���M��6&O��4�iYl�L�6O��a0F�������d�4����oZr�G��������%0�{v���I5��AO��'���zn�K+��-f�D�f��O���z8s����	��������BjZ�;����N����Y|E���n��i�>�	6�������������p�p��'�xaBO�c�n��In�M3\�.Xs�v��S�f'Z���1�i�������V\��)�=�#X[(/�+��������1N�����4(M���j��;��W�i7�5������[��wv��X�s��v�����:�a��0o��'��z������`�J��m���	�\����V�t:y��]Y��^u������=x2{�hh��L��4s��-0&Y�%gk��'��>+����D�5,�P�h�gV�V��SK���7!B>8B�e*Vm-������j��/�nB;��L�#����s�+A�*�2�9�b`�����5�XVSM���%u��W�>��f�\%���OXi%�/�qC>��c�`��n�
��6����,]���a��VVb�,L�08
��
���4�cJz���[|�{���H��|�3sd���	���h�A��f�k��*O3�Up������V��2W�%����e_\=1��F����v-O�Z���>����5,hv%,����	{��IE��a5G��P#����&�<��s�
���S���<w/�(C�
�#k&���E��2�i�F�����1}�7V.
5�b;\��r`Z�
]����PxN<�O[���e�l��0���M[�}^m��5��0J�$�4�L����#��'s���z��7�.�L�.<�l���i���A���`;�����I��c:F����9��i�Gn-��#T�u�!<�4�wIl�+�`W�V�������a���#�������,����f����t}��>���g���cZ�~&v>6>���^2|�8�GWN�����a}�_������fj������5�f�b+�����1����M��lckU�p9%v���6/�Y����%v��e������^� �i3�0�-��s��n�4�
`��J�=��c��|� ������e��bA�i����oda��Xx�Ol9�I���^���������g_��-�'*����P�y�����:=��M�����.+���o,;�GM�R��H����?�?n;
�n��`�mU�n{k�A[�>?<��zT�������D���b+���],$�\K�������la,�0����
q{L#�#��*xo�yrf;�����b�0�;�X�Ll�_���!��
����!���
o�r��}��=�����1N���J7�����C:jc'�L��H�+q�u���X1�hXs.:A����c:a��EW��y���Q�h6Q����_�9EO�E������?�U��n�d���_��/����Zf��P�#�d����/�\
J��6V��^��?�����y7�._U����Mb�$�]f�q������
���uY���\+��dfMnu._U�`t\�&�B�2`��;�?�t�F�
����Q`�%����?}�2~r}�o7�%���X�n�k�����r�cs
_P`��4��p�����6D�S�2P�
���#^�u�1;�$�f�d��{�R���J�{��oC����7E�2p�0c'����3{c��/&�]�N�X���{�!�C��`��\~}.T��P"�vg��-��Y$���r��[���8}gV�.���\��|(�M�R�3���
kh��������'��*{����^�x�Xh��=�E���qu��L�/������f�T�%![���g2?6'+g+L����+-�M��f�_@c�aNI�X!�^c��}�`���mpV�C�4��h�~S"6��B�aE_oV�[s3aD4��[���:Rd�����bO�n&�v���V^���Z����*h�e*.s$��j�t�b()�H,����.���e���{Ag��]���'M���d����A/v�Y��������?��!r����r��5Y��/��z�`"XA�Y�
�,<����	&����ek��G����������xz`���4[&��K
<8#:�wX�h`����K�8�����]��e=� ���*��p�.���=���!�����a:��]}��'uf�
-�b����D��*zZ�>���h��+<�!3{���
n���q/���������3�n-f_Lr.��^��o���S���`e�����d���V��#��=�gH� z�	���\��9D�q��{����uD�YA�Q��9��p%t���es����K)t��"91�������]Tb�;
��;���l�[T�`��������S3�]���X����
�l�>o��5�9�Q�R:1%[)�`
T���m%<�;#�4t��3%f�Q/��MwS��<�V��9��{��ji�iW%�a�H�����O��L��-���"���������]x�<X�6�y��H�I�E���vY(M�Y�a�J�;�Z�z�����.��R{�����s\������:�av8������p�,�iF5����
�C/����j�[s��T��s�GZa����<}"��I�Z�L����z������b�Rx�^g�K���^j�LN���+��D��������L���eZ�!�1��Y���v�������|45��eXnl���RCg�f�C/&�6
w�0�,)5����S�-q�����&��vG�w����j7����z� Svhx�JFk��}~8�l��@	3o�#F�SxtL	~O�[1�w���0��0�/���~�J���X�3�E���3�����H{�����#�~_�ok�7�h�>�9o�U7�~[�a(��`az{[I�}f�VRoV�#�$���VCov�M�d��-gFf���1��\���%v�9S�H�����Pja����=�H��{����]]X�����%��7Pg{BD����LI-���3��M�v���8����>���{~��D,_�/>��#{!��7��������Llcg��%���H�m��������7c�w����;K��`����9�d���U��,i,Zs�.}kNP�m+�+�.l�I,�"e�@�����9�f)����o������m7;L��f�[��OK�D���\^�-��
r�0k&v���owG'��Xj����<Kh�p�#!|��q[��^4���e�?B�|��)�����Y�h����}3?��	�b���X ����V��,��YD��cO��Ul0�
z���V|,D����=�'��}����6v�P,�I��?{��g�"�]���4\;J���Bm��7\�]����N]��	�*��X'�-��Y�EW�=��	N�2�'�Al���j�����b���q�����]���J���M�P##���;&48�;'\����>�t�yBl=B�KW-�����+uk����@f��m�#�):�������XOY���*5��jm���L�nV�)�&
��E����M���`O7������g=�����,��6e��]����Ev�Pl��]�n���~��nC�����Ew�bQ�	�����.��>�~g7���.L���������'����������S���sg?'��A�p�[�p�9
�#�����&n��V�o87����9G�p{Jt����}�G>6���w���^�`a�&mw���<��u���:
���=����t�W`�aO����t~�X�������]�7Y�y���U�]��*���2�YV�.�C.��_����"�kM_���`&S��L����4�tc'���D����;���U���u��|���1��m��7�Y�~��2��H�
�����^��c�z^�p	8t�>��k�Sl�+�`;�H��#z^��S4t�
��;����q����qa@�yW��9��LUn�B{nZ������F��9�`iQ�P�0�X8�a�&{�(��
�^��t�����W��skEE���P�X�X����[4����E����v�QN�5!���o����2�������`�
�b[&af�:M����oZ��a�@�&�$:g~�m�:����	o��`�4}l���:���J���:����L����1��	�������� ����A4�q�.<Vl�
���|<1����o�������F�s������EO+$�4�
	��������Q~�)?/�8&P����&�u��on
������;[�7o%���6��+2M3��Xx'������1:�c�A7�/nv��	��
��d������Ok���E����B���A^��C�k���mk�����&����I�z�~�"dK2������^���Z�$����p��]����fE��[��f�
���`�C]S+�M�~���6�
��[25�a���n���(���-���lx�c�������\W#���rSc����5w-��eV��������9��:��S:x�U�[���������`���b��t�	����A��������@��i]9�3����9,e?���:>d4�C��oVl?����:����A�+��9�]�S����#�7�%�n
��`�^��M�9\����.(
�1o��j6���{6� 
��t�B����lv=�i��C6_O���8d�?��'L�2n?_��5�gfMk��y��cs��:���`�4�e�w�`�"hx��Xx���	>=1o�I\l�m��P�!{=}��/4[�6j��R�����E7�E�
����`�*��9j����g���`k�
�������f5 bg�����{X� �&.{l��z����,��T\�'�LW���y���+n�����T�+������$����!���	*\�>�<��?��hV�,t�z �lI�N�(?��?����*D�fNa?�?L(*z$�)��P{"z2��Y�e�Q��1?&�E
����D����;��(���(|z,���=�f�b+K��-l�"v���M�xl�?m������[G([�&"]��Q,����fIL�� G|p&�G�����KN��DI�c<�2�`�Vtl�}�e��)�2_G|,c!��)�����bk��Xb�����~4�2��53��0�����
�C\���K
W�E�r�!�����ob[b���x��k����Yb���X�i�c3?p/��R��q�Z�p��*}�g�J<o��^��W
<��I�L\��X�/$�
���A
�3���=��rh� �fG��68��Y�
�dR��j��D����v�Ep�������U�?������}4o]u�K"A�8b�K�u&wb����U��j�N��{��=�c>��7
c��Z<��?tT����C��s,7�����~&��0���W���y�E�YZ-����:a|��rK���Ktaubs�������G�6D����K4�����%�A���n�`o������E���D���'�h����o�#�O&�<�K���C�&a�����q
n��
�W���6��pZ���(��E��~��n���De	>��>�	�~q�[��;[hx��Y�����!6��j>��8~0���L
�*���`3XV>(��:]?�Q�u!����/ze�vm�������l���R���]�9Q�t����/z��f�����!=�1k�F��&������E��=�r�Y��[��8��u�
��E�cb�TG��),�����R��"��8�I�sfs���V7�`q����;������:�[��g�����,]>����;�@�a���+#+��L�4��=�C����C:�b"D�Bj�������s{L�{p��k��7+���j�=�C6f(0
������m��3�W�XfX�������E����aN(�B?����9�b����������>���C{����o'Mn]u��f����~_��:���(�0��@?qv��@�a}�����K�/]���a�X������m�[+�`e��`O#�������R~�L����VX�7��6b'�4����������\t����UN�������X���������5�Ao���<q-�c[9��G�J�+���E4=�l�9�`'�����
������u�
3=��]�)�g�n������E�����Cd6������6e��t�2<�,=��^/��
�
Xl�t��uD��L6��sx��h�V��
C��	
�3��6������EM<Z�^e���:����X9��,���I�[XN��.�B�>X�Nv��K,�K��y�%�3*�.�Xe-|��_�y�gf�6D6aI�R���mJ��L���c|�7��[�j��+��a���Z�5���vv����	f����Rs"��L
/��B��;
���%w�r���7�	v�S���d��������a*��w��]�MD�V�?����Xu�;?�'�<,�V>`�+��xf�������+W��XA�g������h��?0)�<���������v��������!���4���1��hZ|l����s%�|x�i��'���`���^g*��Z��)�p�Q���E����>	�����L�?�o�����`�����
��'��=��H,<$l��=�}���u���I�8K���V�r�
�s�������
��R���4,������F��&">��)�'��{����R.}��&�>,�������gt�������bR�g�����Q�G�E��|pu���tJ�.��3��~�i�O.��4gz!K���� ���ef��@��Y�4������������cV?&lNW }^�����#)3�N7{o~gQ��h����t��yI�O�@f�X������t�,���U�w6�<�L|y�7��{�L�h�m�|g����Z!W���4���.N�lw�^�_�C�v�Yvq��}���F������FeXf'�F4;Pb����r���#�v���
~�>�Z�5�m���(Ob�����c�����-�8�A��`�;�dUf������GZ�����c ��2�2_��8m��^�O���6�5�Q��,*�6z�����:���:�@jl�����l�~���x����Z�s3��1�������fY���y�N.CT=��xR4�c[Q��,\:����~?��p8��L���&��DJU���������|������i�m0=������������3%�F��-�_ul��F��8t�i������5��	�_��Ka���?����:�A5��+R�e�f�r��c:���{Ub�.SL���*	3}V*\�k�C`�%���q
���2[2+��`�*�N�AK�U��7����h��zN�!D��o�y~D��4\�6���D��(�������^O�hK�4�.�Fw�Y'���::sb��J������$w���XTkd���O<��~?����{N�?��f��E����,�C`"8�v�����dR4��)�?��\����8�k�"�2���A�H
et�0T,�@{������D��?0�!�4��2���v@�.�����`}��%���g�nC����<Q�{����� U�����uG��+p`"E�	�cy���T�����Gm��9��:lz ���r��o]��
���N�2O���=���MP�F"8�	`%K��5�v��'�YG�B���t~�4��	�d�����~�5���)�
�����������N|i�1�hz���:��[�A3�����Y�L��*�F`q�4��S,��P������(���������8���Vvu�	�n]u4��P�i�4�����$��Q���f_�`���p����[l:����`����A������va2��I|_�'vXJ�@g���������Bb�O3������'v�i6M����o~��
�5sNl:��oQ�����o
5�����@�'AW��M�����OLU�&�V���FJ�~�/�����7?X���:3���:����M]qf;���ge��Fa6a�������0�>_��c.�p�P>l���~,��%����/�p����+�%������������5�u
z������a9�E>��
$�N������(�
��fr4�A.�}�J���"���P�WUR"g������������L>{9��a���g-'C��"�'���pr��.�n�ng�8jC2l�t;6�	��.L����]���#>$�6]~`��CoX�#���Q���h��E�M�w��w������.v����_3�
�`'����_X�p�g��;<�#���k�g�\C$uxf[n;��y������o`����C�
.��f^^G�0�!V�J�
�����K{L��0!����Z����T�w��~g�q��j�7��wv#���Y�l�HYn:sHt;N��sl��1L���E�lF��j�E`��
%�{Ab�Y������h��|�{SM�����rp#5���w�:#�y����h8�K�����# �!�<�����8��{��o#�(�z�+�Yz�*�	�<��3��G@���%}����;�����(I�M���Z���g��N���D��J���hs�������`�J��o�����u�#/��xk����c_n<=�l[����HO�����]l�7{n�=f�c��\4������X8���,�(�%B�b��Y���9��b�Uc	�GI��!��0E/�����5��e��&6��=�����K�R��.��m��������N���uDO��&v�5����%����D�������������Vb���t������@t?����Yr������&������C����b�2�|��fg���G)����=��f8����X�;���=�F@��!u��g+�1M���qR�No�M��A��b�E�f����)=��(I�f:Bb�SF�|"�_lZ.�rW��]�������\X-��D�X�\�jYtg��n�BTX��O2�i���n	�s�zf�D7��
�Mw�s�~�Xx�E����������DV�h�9�iV�$���"�����X<\�iNte�|��*^(]��������:aG1D�D�X���������\C,���k�9t�.HXw\��XtI �����M��\�S��n��y�B���U����w<^�����\��+s�����{����.V��v�6{���-���R�����9Ju�������+}e��\��Uz�YvE��p���P=a���So{M�����
��b�DO>�����Ls���e����vhX� z�#�bW�R�b�����\�p��D�bVj!v�����_���6�
��6v4@t�/�����`�rae��Y���?������b�sa���;\b��|�����y.��.��Q,t�����@���yZ�+������v+�w�IX��U�n<}N���<�p'�������RY-]�ZZt*�i�t�U>RK�����0��vW����������Ga�����`�K~h�&����d�e�n��X�~�u�F��������������4�L�*v��b��6�sF�S��.�<#:�����0�����"����W��������+��Z��&)��C}N,hli�����Tb�':PZ��)I��������Y�D��
�C������ow&.-i�}�a����;���yk�a}W#�`G������:a��=S�a7t����7,�S���B�5��-�JC�h;aJ-XN����9�)n��3������*�����|������~`g����s�P�%��i���mp=/�z����#v:`g�;�Y�\�xS�YO����Ky=�E�35�V,�_*YR,'.D-���2��������Q����V�;T8��M)��K9�G�����
�*�*N|�-.�� ��������Xv��,����sp8�JtK%����/`}����w_������p3�$n�-���]I���5��+Lx/|�
��d7��"���5�XVGh�$����T�cs�'D�Y�,���W���((�Q���:Z�aT��cH���|[��2�;��=/n�u���r�)������H)xa�R�p����-l]>�)�r��\AW8k�����z��v��nC��	NA[�H�9�"��+:sR�fXx��h:��
7�m�G�������M4�
�U6��������}U5G�7ar������]���^p�^fX�(��{�����ieE��N���������������-�I+z�CG�����`�aK���Yh[����A%������2��<e)f*���'���(��V4��M����&����c6ls;3��6���k��XR�WX@��������G����-�-0�������������$��_M�V������p�e��������[]��	��9\�[��a���tk���G�m��u�.:���������h���W���2%���(V�V�V��=�����\���T825	|��WO��������7�&�X�6�VVU)�\&~g���uu��hj
�c�e�,b�f�,;2+6S{TmZ���*�&�z�����u�h82Q�������V6��N�;TO+���������f���m��I"�����}z	�w��'����;kI�YX�����4�V����At��-����f]��29������,L;�����.�m���v���lb�Zh[Y"X�`�R����|�c8fY}�������:pc���+�2��hg�]?p���Z�{n�~l.���YB����;[Yz�O�R�b��]�
�cMV!^�!��X��;�,v�"��>'By�++��Y�RlK�T��+�;��	�t�9�u'�&��*�[W02O���
3�2;�#v��������]����T4��5�
���7��D�
�g�����^]�y����Y�����,b�1k�������#JX�����ml���b���v��R�3"0�����Z�	��a���v3iH�i�/�1�~U"����	=K�������V��y�r��>'d��O;���L��[,S��]�������I��-��1#��`�6���'&\��i�$h�{#����k&���
��9|�\�'����
s�A�/P��z�p������&��Z\�as���U�`��������x=ZGr�6��R�>�hV�&v��N���,�h*`��i����c\�����A�=M���:����A�.X�J�W�~=�����H���������u��y�Y87)
���;nNI����hW��t������0
�`L-Ksn�hgv������Gm���X�����`��������n��x�u�F�A��6�Jj�Q�>�D�������&��vW�w6�A_<��-��]���j7���aqm���:d��L��U���]pgM����8N�KG���Y���'&I�a
�ZN���
�.id��A�Z��E2w��,;;,��A����.��z%�
�����{����
W�>�����D�Xxe����:��W�����Lc�%�+��x�cs�2/Up���O�������]��d0.F[b�@�6D�&��Bt����%��G�t>Yo�����,X�B�&����b��)sSf2r����w��e'�6v��O|H0.Cd�8�������X��/aC$�8\j���[dWye�~E/�������s�e�3��D�3��6�W�|�J �!���S&��:���W�Pd!v��Pz�L����gn�cs�����l���e����M��������,P"��������0?'&f�&Vs6�W&�M�;�/��xJ�������>��z�r���6K��==�a��|�?��z ����A���A
����$��nU~����Z�^�d]4\���� b��R�	a~�'�k/�V���~,>o]u��U�>���,|c[�CN|0m+����y�h���A���`�S���=���sxm��
7�����/b��c:R���2���/�,�N����q"�!��X_m-^Om�.�������V�/�at2���#�`�gA�{��u@
�]WCT��+�]I��z��:�H���M���
wVw�7��]Xq�H�B�u�V+o�z�==��Y�v
v��oC���)�E�k����+�����;��#�r�'V�V�W��7
���v��
�
��=���L���}*�������T[�
�gd�O�_m����A��f����j����9���O	��>��E<��:v�I�N0� o��|�t�zj?�N&�\!��v��U�pi���v��mx-�����o�����^'�1����v:������,����9�!P�"}&����������\K:wX���;|����o�W��u$��s�k�Gw�o�����=���9�2����B�t��^�(&�q�nC�P���Z�`�����g�����c����%v7a�C�x2R��=(m6�7�:=�
C,�cT,<�)j&��+���/l.6)��Z��c��Z�U�����+�]�� ^�(���<�nfx���,�aA�[Nt��������Z7��W��,(2��$5_���X�4[�6_�?���B���Ml�6_��"E��{��|���^��m,�v���E���O��������ea�����;���Qy��o��xp�{�*���2������|��D�t�Z��2���H�a�����A,��������=D��u��E7C%Zs������bi^���O#�`���o��������/BD^	sc����k�G�����&li�w4o�n��o{�Y�L�8���9h�?���O3���R�����)N���%t��>b�M�b��X�)�����'v��h�����[���if�z��Dh��C�d�S�>��S����!�\i~l��hqn�9b%i�;���e��"v��V��F�!r���Q���������,M��N�����^����f7b�/,�1v%<7����/qY�c��f�u+B&8����}b���c��p��+�7a�C��u���bE���|C#Xx��,�k�.vJ�����d&��jb��>o��������ob���%��m���DwV<#v�y(���n���nC�����L#�\q~g�
��7"$>���������
�i��F
�4�T�	�A������t�+2�+k����.������'v@4</#����\����o��L4����8$��*��9���#X8�����#v&.�m�7�����a�L�#��S�b���!r����G�R�����B�EGU1|����n71Gw�p[ �����Iv$�����%A���.k,F��fv���o�u�4X���}�u�Q���al�u�"2L��V�7����Q6�#q�E�
^$&^$&6�(�IV���0��*9��f�Y-�?��������-�-d�{c��3qqb������cs�?��j������"�������6	�y7���E�!�����1�����f�7D�������1���'����_�=��u��ig�E����p���K'�0ZR?G0<t!��E����*�s��cs�_�|�D��:��gT���2FJv��r'������
��e7�����!�B������[��`���L�#6q�E������������1?��Os�O�I�
g?u8�i):M�
�fa�����,��eN�,c?�W���n�M�@c3u���F����	6��m	|�Gc�>=4������Y����]4- ����]�LD��`}J��c�6�7&w}��ui�zrz(=hZ~�����ns����<���d�1�x�d��5��5}K�I8�%��k��7X�%�8��$���Z2����$���>�
��`�8fy�g��mt?��|KJ��e��}��f_u���'z�p(]�fV�6�7��E8��T:$����xN.�3��u��:�X�.0	��
M�~`��f�u��h��N��5���p����l��$.��i����)���[%��_�}����������
&|��^�����@nfX|l9���yj��d�.0������.\����3J�!r8GJ�k�%vNh����
fRdg�����,�z�����;u"�[#�-�
f���p�e��K_�M��q��z�6�'`�"�3��<o������p[�,���P���s(+���Y�a���_�����;��u^�3��D
�^�OpG1hX;�4k��B���h>X��	����;;2��VY7xx"hZ�l�����ntdf�h��
��A�eB�����cX�����m��@w�#��O��J�;K�U�3�01����:�ajg�n������B��Wi�aBPlBq��������	Qw�&�3M�hx��[feb7i���d��g���PtgERb��D�`�����I�qg>������%�a�����������k�Y(r5��|�3�=q�Gu�mx���<:0�Y���f��l��P���<T���3w���J]������Q�.���o�e��wyx�c�����F��
��
3Q�ng��Tp��)as���?��E�%������}N����;wV�!��:H�l�#���Y�D�J��e�gF�cs��c��;�e�Cw�6
��`�����V�2����6��J�E����n�s���_ �Q��s�1�jB�f
Z�}��!�cs���M��������?1������Tg���������VV&�v���&2h�
mN[�
�����,�<[��P�����ccv�4p�����`����c:8��9��_D�$8�F�eX�mX|#:q2�[e���Z�b��5Q?������-z�/��06Q�LS'v�%G�5qH������O�����������s��6Dpa�,�LiI�������7At��A�X����S%b3�n�v��S�#Ql����!��	�c����-h�%��aCsg�f�0�P|]�Xx��}fe�bwB���h�5m�;=%����`3e��n��'���LS0��
�h�L� z+����3�v�QDl���������h����w��;s4�.�������{�����0���91����a�+G3P���7,��`�����mpO��\�� ��e���U ��t��A�@�2�V���7r*�H�U����Eg.��vCwVZ&z&����,w�YMk_�b��9$�N�\�Bw�!?3���7��=��fX6u�)���u�00�tg��b;�"^.*��~?o�m�����7���b�Fi��
M�b7����]v�D�Y�u^����-z�yZ&k�iW�3��-���A�:r�����.�	�/wG�1��z���9�M��u���������v`w��f�����,\���py<����[����[�L������/�<Iyk�!�@���"Xx.Vl��N��������h�?~D��i��[U��+�����vwvt\�����DMw\E�Q������2jx%����Z(�a�)�E�s�,��<_��9|"���EVh���!"v��$���:���-I�aR?����h��u��6�6D�	�^�,X�i�����U���J�m����AC_��3����������$h���k91I[�M���Y�Q�x��Jf
�0��pk`��/�mx���$�0���:�&8~�UR�PO-�!���>��)����mt���SF�7����;�p����=�]�0�8�����p~��=����u�	k��*�aW#�D,����[��nW�y{����pml�����p��^��}g�]���sl2���C�����������Q��8It!�|�b.��v������x�7�q������&����TY�a
A�p�#,��,�Ea6��'��0I�O.�V�xFG^�%�y.�>pElF�cSyg�r�4xZ���&�������`��hL��	D��;<!nK6�e�?^�(A�Q?{"�?��&�f����wf}N��<���7h��hj����Z��[t��0	-�k{��p"���:�_]#������1�M��\T�������at/sw������Rx�������9(���tba>m+G��)m��2���9�V�+X��I�o�������w��:�`w���n	6�l@�����{���(����m�N�� h�A,��K���-=�����q�������������[����[t�&�n�vg�m�ne�/��,�3g����:$_8�W���w;�;s~��=�0zV�a"��we>+�;S~��t��.�D�%�"��mx������?����a��`��E�R�+q���z{0����>�b��B,<�`�X����y����$,':��k�1v����6D�C���[�;����zD�������4������|�@���[	�Z!�k�U>�e{�n�NE�@:E��!�	�4;!����T��c�
��!��E��>n��
����u�E=��Zte���=��v{������k�f����(�J&����A�b9�����NhX"'������nX'
����?�w&����,g�Q�z]ml5.�%��N����+�s�aH�>'*y��������R;�b����r���nD7v�G���X�ge.~���
��Ev�P4<:i�{s��ol}&L��g��;O���4Dx)@����g����df���b��m����:�a��Y���9}�]-ou/��:�c�4g'�������mu>���kq��Eb���g�B���v$PoC�8����{�b+��D�L�{�+z"��DXtc�Mb��j�u��;+ ��;a�n�t�1���}��9�[s����y��Nvp���2�����%na�gV�$^r-v�!z�VE�Y��v��:����.�o�Mg��e����D/����b����1}�J*j�R�f���X���E�z��,��:X����	�`��s��u���������`��U�������)�Do�G{�/���
.7�����`�$�.4�;S��X1��=�{[�������$XX�l6��co�`[�+�|m���G4����
s��2s��z�r]���t][��o���n/��
���������f*z}���;�`K�P�'��h6a/��,��Eg����vg��=����cs����rW]�����m��vK�mpx��D���/4�^�!�v��a���1b�4�l��m0��FQ����yX�=��~�4�l�;NR��-�`����C��u�7��O�3�����>��}p���h8��
����>�A��t�������������	o�W2�������
�32t�	g�/�����`����o{7�&W�yi��9�U��m������+���i�E�L��U�P�&zf�m�������u�RR��Md'2�YvZX4
[�]01;^K�/�i'�`N�a74�I�
�����������S�|L�S�7z
��j7��Kv�V4����$��ejK�������ML��J����R�*�a)�`Rj�
~i%��,,x�/��	Y���|�'���f��ZI=`�Qjh&k��bi�V}>��!r�DS�B�"���w���>�Ge�m���t����V.��\����	z��.y���]��o������So�Jx�tI]��E�J'nj�J�����~~����]��;����6�6D����U�J(���&�E���+[c����8A/��Z=����y0I��7�,xN�d-Z�%�A��$j�y<`�t�����mA���KY�+V����i	��p��������j���vXz<��@4�[��/�	�Y[w����7�3�0y�j��w�8�����$��I������cs���b3_s�3&�����d���y�&���L{��:�I_"�Ex�',!S���u4�<��[����ex���Y:�n9�C�����B�D�n��A�9�[s�b�[Z�)S�4g���5�A����NV�-���X�L����&��6��<:��~"���`3G��������,��=��o��AM
|�C���`gFdO��{�A�L�fa���������`��R�������i�E��f�n�?*���)�jy�M���G���)63�:��"I��@H���A����{�N�g;��zT���1���gj�Ss�)L��'�n�!����{�r�bg"����_��o7���kn�����[s�������

�.��%��r�=��c���>Ba�[�d�������b�J�Y,!j�����k�1��C�[c�����A�4Xi������x�m�i��,�1�[���1?&|a���i���8��\y�a�;[S]u,�����1"����,��'�LC��*L���Y����"�["d��w�z\��m�M\�8������������[O����h��$v%>L�e�����)���H�i��h"3�K;�n��u�Dn�y�e�C��XU���D�����v�Q��z��R���}��l�<9��9SY
M,���=ow�=��u����^�;T���b�ST,��`e~e��N�^
O��kw���5w��� v�?fD���[f��b��_nY�iho���u����;\����v�����1=1{��	�
�e�C���:zb~X��v!v�H�Y(v{��
�#/v�@t�QB����i/�d��?�Ev�J�i��d�W����\���t���+|��<�?g�G���1?�j
�����=��4�����9���h�	�%n�v�N�Z}6����1�]�	
^S�v���mx�������V�\	���%?1�r��n��(�I^E7�)��Yn]uW����cbO�����FX��������,�-=�Lzj��7mM���Nv�O4\T�Wi��������o�M����W1�������p:LSa������M[O�RF�R8�X!���I�@��������&F�k��;���Alj��SZ�4�{^l��`y�;����t�Ri�P{*v��y��i�����i�����H���,b���%Q,;�=�&���z��;�����rv��T�&.#����d�����l�o�j|y�t��L�F?�[�4
�J��p�4�~��/�i�+T����`��NX}4^���5����GE�"�`;s��]���gnC���YOE��5s+Cag����9��i������9�Op6�zD������{�;�)v�M�`��&�
����"h�.;a���
�����3��#���6�2�v��m��_�(����O��=&��YK;�z&���{kZ�5�R�i�*�tH=�f�@7L������-<���1���[s����F����5�I�����5�r&@�t��t�p�f�&�~����p��o�����$������;�a9�����^3�U�C�����Yf?�2�	��A���KsVbN�����|�-p��y��w��xR�&����I��;��r���:�	�xA���U��5}gi,�y��m���AWx�'��^������=����%7,q�z4s����Sp���X��o�9a
P��k���t��o�cx�?�7�������gb�cs���dj�������z(��#�;����g6S�fc���E����4�����k��nc){!���o���	��X
'=��Y,�v:a��l�p�B-�	S,�.
���~g3���B/�h*���5��:��Z�]a~C�UfEs�a����[["[e1�����^0Y)�*��3�r��l�VYL�#��@K�	��v�L+z�H����c[����at�?���Y�`���l� �R�	��mm���������v��O�a���d�0�l����8��f;aA�����z�����G���0���Stk��y��W
���O��=1o6q����u����7���k$�	�h=]������+SYbW����\���Y�[#������0�����N�]8��M}^=7����D����D���.�D>5'�E�B[��k����,J�f)Y�%q�����<+���(id�v�l-"�4�����)aO#��R�bwbWxY���
G4����,M ^��,��4-^a����(eX��.�K]�.������=g��lKT�-�V�m���v\�b� �0�$���M��8���[]��U�`u	,�b�����l[Zl�d���u1��i�M,��!�t���>������V����Doa��G:��U�ml�L����5����
��1�,5b�!��=��/����mb��\��l�]�2J4��;�����$@�L�h���{^M��}�z,���gaY�oK=2K8�iO	���"�JTF-�i�[�>64+s[q�������Ttc�bk�:wY0�XI�hh�{^���}�o��~$+��=�9���`n����IiDo��eVj+6sT}��J�_?�Z��"���=����}�����Cmb����1��WTA�E|����;o'�'�S-�Z��.�Z��e�
{���o��|Y�
����)�@��[O�0U��~T}��s0�2A�J�Ks6�.f\
��?\T�f���������<���9I+������O��������wG���v�#�V��.�Z��:s����s����p`T?����b\�5�"��u(W4A�����9O��\��A���;���f�?z^3��9UF��g�������v�|H���{w���K�a�,��t��"b355����T�������Ol"���u1����cb��M��KM����������Xx�T�y��;���0����w���t��El��u�I����;������varO��I�vG�p�?�
��`+\�UNn7�J�N�,+����:�!��"6��YV�.���`�lg������=��cX�$�,,
v��g��H%���5;a.�
 �n�I��E�nBp���]4:�����������	�Qt�Ne~h�i���p���Dt�v����4�i��<#PfXq��.q�	�<K?D��c:�d�dDC�����B����.�U���\"������U;jc��D��;����z�<Xbi���7Si�b`��~�bo�~O$eL�nm^0��qN�	�����<������S���>�E�H���}��t��M<���~���� ������v.����������O�DU�N�,��J'{	�� t)Vf��&.��=X?�-���S�B�XZl�"�����	2��}X�!����y��f&�+z���
��5�Z��0��{�E����XDX-l�_Wb3����h�2�~k-O��"�>H��I��]0�)�d��;���iz�������G�w�g���`������Z���^�[_�������/^$+�S*�fX7!��Z?k<OX�j�g�L�|�]�@-X���q_��'<�
E����,<Nl"^oY�=~}iL�~&
o,��w>^�k��TK%�����"��$���@������4C��`�m�)�+4�
��[�#�V2T�=������g���/�:�vJg�����u�Q�2��vO�f�����!������L�����}����
V�K�v'k�0�d�����!`z��3:_����3����q���j	
��[���P�5�}NB���M���3[��i��	�������_T52�5����nAwCY����+��`3e1����~"���AN�����hx,4�8�Z�v�����=��jjZ�u�����_X�$�v9=�wH&M+��x~�
�x�:�1
���dm1����!`:����ybi-M����jBc���iG����\���d:����H�
�*�-Y�i�e��$�a�][���-��kO�c���Xd���,m�	v$.���Z���DZ�p����Xk�vD�����9;_�P ����Z����rw�OkOXt�b����#]�<^L�X��b\f�YS,��m7��/�-/� �Y�������Z=T���N�<���g%:�:�,\��yX4\��f}��ag�����X�����Pc��q�eYh�e�m:M��As��`Ecb��,k�.��+z���Xx�����V��SW����w[��1�5���!���1�D���.lr]��%�E*�������3t��������P���������d��:;��.,dd�,�,�fZk��[�E��#'s�	�&�i�����"(����=�����'���;��/��g����c�a���aq�Y�iZ3g����~E7Vy%v��2�g;>���S�l����U|<��6Y��9���F4T|�e�������+�K��R�bK�diE\�.c��-��lg�m�PElMD���xS�]�nY�=�b��+�=�9���b���}��}����aqx�O�sY�v�E��$������U�-��.��2�T��.V�,����s�]�}
�$2�����)=�.[�����W��d�nM����I���R���[?� ���K����[~N��E�|����M��/���@>�F4[����i���w���y�cb9�+�y;�r��	iY���%z��|�������b����Ef����TmE7�XF���bY���D�����b���Y���:����~�V&Fc6�����X�������9;P��^���t^a�!�=�|�����)���e�a�4������e3o��/����L���I��A�@w)���adZ��\5����Il��e����ZE����v��-�-�1�H��i�H�"���j���O�H�o-�.�iJ��E![A�"	�&�uk]L�U�~�=���%��D���DG���*l�=�v���{��nJ�������Z�4_'�U8E��l��k"�+g����&�O��z"�Wx
�C�Hva@[l"4`�����M�$�X�o[���T�.�H!vk;M��c��Jb�NQ��K~9���]����O��,���P�����`{��ny�#A�D���L,��H4��������h���&�+
���B�v�
���@O��+q�^;�0�6�lb��+a5���M��:�ajE"���Z,<m��&���{1��5i��`�6X�n&�h��E���=3���`_E�F�%����iY�w�/��\���E��B�(��X,;�Ew�~���r����`���w���9{�������Y����+l�����y^�fL4]3e�k]���u?p��u?p�������#��*]���;�^�~����!],�.K�&���?���Zw�(����p2g���E��,P��+�'g�� �ub�(�����{v��M����Dv3�(k�.����`��T([w���$f��4%�K]��1��n��aI����\8mp��"Mla�]�g���@�a8o�R���e�&2�D��*��.&�+��F�`'����/�!is�}�e
��4�EWp�0��K����w��k'�k/x"�^"I��������|0��q3G2k���Ks����b�|Ur����g������y�����������2�1�a_�jWl��/���:#[�y��%G>�"m�n���4�b��*��-?h��i ���b2���%G��q�-���C�>Cm������>0�#���n*,
ZrS������Z�������&=H]�.��W�a�����uc�a���M���L��N�L�`*5�=�s���]%�2���<�~�s�f�K&/X)	ax�
v��<
�����v~.��a���c	�.����vF�a3��v$����yY~�q-z��������KB��2-�V=^�<t�;����gL�p���?�0Cj�f���O�4��E�������3S����Zl�e����9U��f��^&�uE:���fA{��H��:�9Q6�Z�^l*&��������<T�kF,g�{>��6�V��/,[i������2�b[�S���5��
�#��w���x���C��B���N#�)47ses���_&f!�15@��������~z���	��8�'Z�_+&�L1Y4t���`�Qv�K7�`[���R���-���XX��Q���HTi�V�~Y������{��0�"vO��&����]Y��}����O����~�������g3]����_.������_&.-�nbU's��YNZ4T&2�rtb+����~�����.
oM��5��r\l������/���R�sV�~Y���	�CY�{A�}���������2lOd�^+S�gE�FT[f%�ba�Q����[f���~)�����������R[f��C�9���!�p��&�]|�.�2ui��7],T����vzL;20�b>��%.z��W�%���n���E�di�����h���j�k1�����f�b�����j�����g>����/+�
���6���.K�����RlF_��f��49DW&&���3��PU{����C��Ll���/+*����������h��h.��6��5U��a��������7��x������/�$ugif��O@���+����7"� ������9�����'D�%.�������������4�D?��Tl�e�cS�<=�wX&�(�I('������N|���+]]���`�b[Bt�����*�%�����3��K~�7,��Lf���4�%
`���`DKv�_�����`�J��p�JY��U�~^R����R	���/�<~-[����2��x���:S
��(���,X����3�A������f�g��{�e��b��h�[��iz��0�d�
~�C7s`���-XZ���M$0���.�E�t��w�z�����h���c19��>tG��B�*�{����g�+��L�cva|[��tN%_�`� �a&�����P�W�K�]��`
]d��d��5<<�n�n�ax��������BV�������jRN\`�Z����7�����G�;�M��o��l��~#��M�<���^e�
���C��[��1���w�Q�	����s�X
���z�;L+E���s��o��&cN�Y�]����;�V����ECED[�d�NC��I�;��p���#��C�	)��Z�P�VtK�/�Z+*����=���
u��&�t^����;s�����X��5���Z�SdF���d7��Y������K�'� �;�$��b�/l�������7�����V�`�����{v�Q9���u�:s��kM\x��hxo������KY�o=���f#��}����9���h���_k��H��|2g��O]�?�����`S�m���L�L4s=�@���)����{�+!T�Z����L��n���9�L4U������yo�������{v�i�����Y����a+����E7�v�L��`���^������St����
������=��F�TDE���`Lb���
[
tO]�S'\
b��b4����&�-K��L�Mt�]���IB���J^HF���v����6-����9M��&_j���-�:*X���~	�i����`�dSa�]l������7ri.<
(��-s��3��@���(,A��#��<��#�~������1�Q@�G:�P�J�ah4�F���R��Q�A$�Hx���B!�W���k�����RU�k�������k�*hX7~��b�o����OJ���3=P,����T�P<T�[���,������_�tE"gf��S~��y�d��&��YTQet�^����OI�(e��.��n���~J�q�.�m"?�csd�1=P�l�W����
����[��i��#���J	������0*QE��e��0;����.
W���nw���
�fMt2[P��Yvu��y�����M?���,�I�?��}��#��z���H��n��NQ�qPb�w����n:N�f��fQe���j{���_v�.�f���[5�d>-���!'�fv�b������J^������MO�4E��2����)�>����"�����"�,�]5�d���x����O�k�L�|��e���E�M�v���������0�D��O�m��)�v��g&�W�m��"
_��U���������O�k��D���N6�v�Q��#	��E	���J��N*}��[D%�f�����v����^AT|k��o�����cr��~"��D������{h���k�s�y��������������N����"<��P���e�|���}��`�
_��0����W]���lC�g��@�iz��Qs�W�=Kc<UQ>���M����C%���Iy�w�0��'�oc���!
O�F�2�pz�R��7������S��8����_�k����&R<6�9�6�|tb��	f��k6q��`J�~��?h�����Z5�mH��t�;a4Sva�?�R�}�`����^�%��D��f;*R3[��^�����U�:az��Y����y!x�n�����y��j�������N6������DM�',���v&z����5!�w�^xR,&�W�}��>���&|����+��7<8���`k������A��G�����D
����wZu��&��&�����{|0{tA�BfY�Y�<�;�����Nt�%������������K���!�~���Q�������P�7f$,m��|��7���0�,�{2�*�v&����to��M�t���`'�B1�`%�����wmK�iz�5��s����}�z"��<��K����(�_3
��w����=���	�q����d���C2=�x�Y�S�.�29��T��/���M�e�������������/���A 8C�+LvzJ�^�j�����^�{�c��C��0���T{�&.���!}h�
~^�>p�6����������R�a����c��j$��B+��$<��������vm]�����wAg���n�=a�Jl����w K<�I}�x�������i+y�� ����Jv���!�`����y���������vd`@.��n���ig�R��=�Y��
=�`;,x��1?��} �F �O�>0�,)�{���>���7��[�8;aJ�O�0q��mb��S�+�2�����~�����A?��,�s�w��P����A/�	�C�O��a�`������>l_��7�5���h�L�^��`J&.	��^��]X%3�W��=[�\�iz�{�^
Y��_����	���Y�i���7�b 8�*����	W/���!�;.��������d�M�s"�r�q\�S�l��]va RR�0�-�})���:=�=>��n��b����3��q���6d�2<\�d9��[v��� �tx`
&�e&���#�j2������g�.b�����%��`������d'���	#mA���e��{� �w�FK�$\3��=':����{��T�{�~M��1_�]��,��ldy;f��j�	~�g�ri's�C`�L"���X���#|��	�!G�eWq��!�0,��HJ�vb`�n��h�B��`lM��a�Y��q�_;^t����l�z���>PZ6��{�y�����)�����I}��@u��ai���a���a��T�3������K����E����9�{6#Y��k��n�T0:�;,<w[��b9��MDWE�_�q�6v�����}����~�������
���bg�F�X{�i���Q���������KsrR��[,�?�`Y��w�}=T����I�f�������������/l�.^���OE�A����K9O��xv�c~^6p��t�����Nj�%���Q^�R\b�+.��+�$)2;����+���i�d��9���>�g��z�)���]��K�JW�p�.��j�N�iz\ER	���e�Pn�U.����i��>��9�]��d�.�7�jI�.�� ��L�����>��b���$(~i8�re����J�O����N������M�%e�;���{�+^[�/B��;��Z���G�2KQ��tz�W��=�_�p�^{#,d/�'~L��D"��M>b�/�u��5���N�k?��O���O����T��-a's�	X���h�,,/L�\�`b�������b���NS���U����le�b�z'���`\��yab������:�R;�q@�,��1o��iz����(��h��]�������9�[���Rc��F+w��Evc�P��N3ra�_Ut�(���0��:���Zd�@�KB������2�hz�v@�[���=�������4�v�X��_�`�/4�Uf�";���H4t�}���B�fM����J������o}�"���Itc�{b'�8�]W��Lb��P�M4��l?�i������h(�&�2�3����b���A'����}�C������n��I���:�b�2���Z��0�*�����>r�#U�l8Ts�KU����b���j�0�t�04�@lg�Db+<�h�����)�������������=���+�E_����.��.L�[�^2w��8o�}�0��f�:/�`*hZe*�rX���u~zJ�]�-��]�>5BOC��+
�H������#��EG��W^��Kz����������f
��
G�z�ba��/�T%^sK��*s��c���c�V�q)�U^Xk��	���77C�#��!�eJ���^`*-��!��_�=����X���s����Sl��`���<mQ���b�����e&9%������-H�9��:���tiN��q67T{^�EU��Ei�>t-�Q3e�_���U�bfz�i��u�P/]lK��K���_���a���/��eY��4$��~bY����P�+����c�4Wy;G����[d����6a�%�1��*�`3����V�
�a�W4��]����&��^�x.�p�����i
�����������DgV���Z��r������wf�������X���H���a����s�1��6N����`�����:��wa���+,Y��������q��cz���q���G, ;aE�D�a1�fk�YO���&l�^�m����m�4�%nXk�Qg�,�]`H7h������g{N��
FCD��}��0yb\��0����B����C�A7�|I~����I��oa>M�(����
[��:����h����r�&;�K+�px�
��{�2����-�p��I��E�>P$�F_���������h/�EH�������t�Yr|����\��`IP���}�9 X�����|�vTa��h���Qe/�:/LrN44�`��������83C�����|����i?��w��d39����������kf�Y��(]t�Lf
��G�Y���W6�m�1�[�#�J_d���QAwI6��d�r�����*�g����j��)����m�.��l��=��MH�)���K������S
��$8]�W�����
�������%Htv��v�����8��.0u&��#q�C��w���A��G�-q_F�w��[A�K����X�:��D��]`(;�#l������l
���>,�c�	_�Z�
K�N�V�CWVQ/z����Y�Q���p��2\�)j�"�O�~X�X��c����B��jA��cB�*ue���'���F��:<T���Z����OC}<T83��N�b�4���Z����R49��Z�b����c.?&4y0�5��f�e����4E���wo�
/���++�������)`r�Y�@��a��s���+�Z
����2-������W�-��XYJ��~X���
�)K��
_$��Y��2]
��%Z���D��P��%�V����A��W�������h����!b*�Q�l���Z��=Zz�L
M,D��,�o�[�i��>1m�,�(��,������Z�^A)�."�WE�=�w1��:��%D�}�*�s�����L�Z��?z2g��%]E�����u����a���a�����m-��*�E��JS��teE����F���U���?O��}���E�DF�Vre]��Z����
�"k��r[����)�	�W�,W&v@�%X��G�	|��h���Z����~��X,�6��ad5Xx������k�f(� z��<�����oDO&�)�!��*�b��rM��r�/�����j��I��N��P-Y\�d����{���y�����.F�l�iv����0�-���m�4��1o���)�����+u�Ky��j��.x�*g���T�	gY���D-`��r�Y���9�,�8�h
	��
K����Q��nQ���Zd���a��V����NC����E?���j��
�P]�}�	�� e�+6����`a?���
�mw�i������
���B�
��,T��f
���\a������g�a()^�cV�����'����,���P4����a88�	���������e�����2!�����c���+m���4�	��]9%>�'qMN��te�U��^?���+�������:�l�e�&�%[�����{c�����{7��J,��i�L^@4�Z�e��n�L�r��Y��[�d����� l��%�L��%R6�-��~��S8�O'�4T;2LX4�A"���cb�?p������EC5�0�,��������;M��'�'���	�W��0T+WX(�`�&��'��/b�����E��y'sv(`���~�D��j�4#`I\��
(�k���oC���,��G�.�EL�*�2�H<f$d7��Z���U��w�����u|+���Y����9bZ�2	����	���_b��7x=oB��Z��&����Y�����Jd�,�\a�9hx�p�L3��_�"ve"����A��p�V$���L:���FY��8��c�(&v&.������K|J�NQtW���_M�n&ohI�
�D����2Z��V�I��8��0�,�=b��*	�RW����e*���_b���MO��M�gM�9�Nu[W���Ei4���`]"�S���u;������z�~�����i.��*'�pY��2��j�c�Hw��/�%'~D��]��"C�_��-�{��u�EJL�������zw�����^�`3gSK�V^�fK�,g~}��L�V��-
K}J��Pj��}2�%m+��5���Z���I������H�T��l��	+{��0�h.w���M8uV����"�}�&,}w���X���[��������WZ5����9M�}������`��bi�p�k��>M�}'X4L
H��k�7�`{�t����6����Z��B����`e�P��,����KB��N�koF����w|9		�����s����������[a
B4���e2a��Y��1o%z����	3�����X(��P�p�t�\<%������,|�m;$�os���P�\tBT�Y9&-D7���e�`b3�R���������j[f"�b'�^�3��5��j
�j������1�?�]������{|�����������gWjM*�6��a[��g�HOC}<T83�[�B{b�6�������t=Q��}��Y*�1�]4,;��3������k�>M����_3� ��������K���J�J7�;7�J
��&�9���aL[��v�����vK"��,f����hx����f�4T����,�T��Hd(���+����X��Ty�.V�$vt�n"�,��X%�i������m�w�g�2p��X�;���~���fM�=�si����������f]��bu��{
����hm�w�+�.�IuamF�[��1������',T����Z��L?�`���az-,
o�=����2kb[��Y��������Tm���U��C�oc����{�dEXbK���YG�1�g��pGla��b�k�Yx�6�@�����^-���E|����|A4��0��FbV�"F��&J���1�X�����*�*��*���i������[u�_Q��]xl���{����P����@�k����N��+��N*������2���.���%�0E�+���;s��4��Cba����8��n������ii�C/U���vQ�~���1��2)B�PkV,�],�%Z��8r���YRj����z�fI�s���g����B�4�%�[��i��35�f�u��
|��G�	.Z���8M���Rh��{F�4�L����U����/t2g��	H����O��>����Jb�w*}v��k����f�t�ca�u���?M�P�B��u1]�����������\�@p�
v%��n�������/a�.S/]�;3����$:-������T8�����[4�	��7j��;��n���%`:������:��I������g�	N�k����^������+
�{Z�C�X__U�������
�����~�_.�o�b�z�
&���1���e�&�������Ks��������o�Z�_�Pge"To�q������f�!-��.��'q{\�lx�e����~�4#,[�d��%c|�������rD8[`Mv�v;�5]���4X#�����.�tX�8$������]�4�v�`�J�-���,8�`y���#"�q����H��+����+�>��:/c4���=�B��	���p�
����IoL$]4=`H`���f'g�][Awx����R��g��,����^���q�����]�C+�q�����g�K=�L�e�,u	z�w;��7�$�D�
�@a�h�e���j�~`�]���N$��7���������{<w���� ����V������:.KR7X6&yg�b�a�c~n���K_��U�w�]o��#L4,/���H,V�n�i	z�Z���j�G
���:�=���vc:��w-��9o��z"hx��������5�G����T7>|�&w�<������BM����?���T�+Srf��$E���`a9�
�m�����"���`��=R~gN��pc�^9T�z����u�!�|��\4L��_�x�]>�tI����9�_�S�j-��&m����L�5zu*/��D6,X�`�U����?X���L,���
�r4�Q�>���ewKM������]��5l�L�Z�|�}����������>~8�!f�6��g��J������v����B�TR��GK��]Uw����1��c�I\��v�`����a.�,�[�!P
��j��7�v.z�^L��H*��	�Z��1�r������5���N��>����iW|��������>���������"���3�������v�����	k�b�~i�TAz�[M�i�v	�.�hz:���Lk��ug����j�fn������3B���0�)z�:����h������-.�Ye���N�b�8���%�l�*�[[������y[fE�b;�n�
����v�����O)��������M�Z,�0�a����v�E�N�&�[���f�=Q�-��_�}i.C��l6�Ot�%w&%z����nc������,���J�Hv�%�v������/���Z�,S"z�-�H��P��w�4�������%N���0�e��|����I�HT�uK���h�J��`+S	1�D=n��n��N���k����9���������*bY����8��J���Yte�;b'���%@�����h�E�.�-,;+��X�������v�X����b�b��w�,'~Mk%w��M_���+�}�B����n�ex��hX�!4���
�)M�]���4�v�����#��R�V���K����YL4�<�g�����,t�����������cDw&�$�a�b����
}?=o���[�zG.�����@;<H;!B��,����h��<��E��U���hw+Kw�	����U��O3?n�J��u�:����;<@M���������H������/�Eh��`���`���=�VGw�"Kw���_:�la�b��*������-I���C=\iC'�����;�A�������v�{�_b���{p�\����	Gf��]�T���;�eH��u�����Y��w��
�y�����L=k�h1T�
�E��a�{�2�.�c�_�f�^�1V?��3��2�?1B4]�����=1m3�t��

3���LkC�J��\�����[g�����9����=??���
6���O��I�m��u�r���[����r�0,6�
Xx�������n�[3�&w&,�V I<8�dx�d�����r����
��[�$|Y+�����B���-���U�v���D�c��og��+�;XC���)�0�����!N	���X��J�����%����K����AF�����]9���t�u�%��������_�����z�1�N�4 �e�"������5q\��rg���+���+5~��'�n+�n��N���'��0���?/eY�Kq��3l�b�{�����9�wX'j	��m)��@A/X
+_��&�0�$	�L:����M��$��dFWm�?�H���-=����h��l���OC�3�9A��[3eR��0F�|v���yw����e��/,3~�$�QKw��D��
6��7����v
�p��/\<$X�v�`�u�b3R�����)��.��������;sAW8�)����c��+��.<����?���f�%-��+�_���3SC���y�7:X�'a[xr�*�L��-���D���{�d2���0d#Q\XS,��J,�@l����y��!��G&�bQ\Z1j�Y8�?�$��P�M��v������"oO!�������gK7��hU�W��W�V�n���$fM��XK���� ���<m��_�S���]��$Xn.b�&�x��x;��
�0��'N��A������Lt�J���z��T<��b�"n�	H���9�
#=�.�&��3eLV��P)�
�����k��Evn�������:k}	���r�i���4��}f����%b;L��Jd���`Z��+�I3���f�y�[��=��pz2������M���$o�
����3�z���V's�%a?�DS�b���h*,�gt,���/�iw��"�%a����
5��@�W���w��J��5����]�$@c���[�u1�4���F[����_uX"v�����''s����,��&�C���*v��z�������`>����i�����>�k��N�<A��������>,�5]���uvX0u0�T�PK,��Y��a���R��V{ 6]�o���cN?&�A&�d���I��{9�eZ��=������vYN����\����zz���y��gaB���?�K�&�*����X(-+v%����a�4����U�|�6��i�{zL{1L�DtaG������`u���j����l7����j����l��V���bJ��1Y��l�d:,�
�O��p�E��j���A�-'s�'X{��O@R.e�M������������;Y����*����]��������C��+3,�X���^|����a�T� z��z�{	�i�v'��T���O�*��������~2�����D���mZ��HH��SB�[��k�(��V��|T��Y�`Xa�vQ
�"�b�-qb���{v?�����<�=XY����e���"I�wa�{���1	��I�-�Gz�^�O�����k�.N�����W��~�Y��lM�]��5i�'b\�z�b���P�p����4�KL�hg�_]�'svc`bF4+K����������eaM��L�Mx{��g�a���
]�`��y��n��bX��F��7����Tb�Du�����U�47y�+��s�4T;ALeR4���F�>��^���wS'�E�V$q���b�������J��
���+�/@�s�V=�����^ ���]�OP�~���1���?�����p�v%Z��*i�����j�2�[[`�$X�I)tl��iv��0QM�l����P����`�\�i�����C]!��}��-���`3�P�2��{A?�����.�
f������0�iv�x1�R��3�(�������Y(���M�va�,h����!���~�M�MZ�u�.i��!-��&7�����N������w|�6��K������x��x��*V+���)�[���1�T�Z����Ub[�b�a�S(K"z��l&eh��k`�.aa���K3���G���`f<XZ�<�����)��1�2��/��u.���w�u�Y���,�������va�Ctenb����'S\a��k��B�b|��&�-+���Z*�+��7��P��ST���ef��:,s
OB���Y��p���iB!mX�t��4�Zb��������g6�d�[3��
�g����F���dXy^�e�IX���b�����\�����\K��]�����o���y�.����(��E4
�K����t5�L�����)����a��S�RZMk���*:!�;,�:`"S���)��*L�[w�
��r��tA���U_���TvaLm�/�������F	�fN2x�K�/��?�9�'s�	�d��}_	��,��%��.��Y��m'���Os�s�Z�`�����j�6U�`�q����Z�t����c��Q�z��O�i����3%C�;LfJ���g�
$���k>=���=*����}`<$X�H.��2�P�L�jJ���&b��q��u��
z�
�����'�ugK�	�hE�	<�,��O��|�	��a��]���Z���%XZ
l��h��J�����5O�h#yE�y�����/�V��E�HF@�2���;�0�,E�����.,��<l&yi����W.P��L+��yUN�Q��+�VXp���N3dw�0�n00�����v�����I��V�L�Vt���X�3	��o`�w`���[n3o�]/X���k.'b�c����b�J���Sfz�{�6����>}2g������jY�[Jr���N�n�%���DxEYy������.�]�+$����T��n:'�	*� ��>V�E��X�����X�w���44�V��]baI,l[
��5|�
������=��)}z����oB�Xf����RO#)�4��c;�Y�{����%�����!oO���?��6�tB�u��z�,)���&�c?,�,��
��M���X7x���4��\���Bt5"���u�,e���X��a���3��u���]Xu�-�`���$��f�6�5�V)gz���}��]X���E����?qj���0�a��5P�]��Gl�J��^1���K�������Q��f|���f��;6��'b����2���-,��!o�����Ydj��w���9�O�i
�E�>��>����t���?�5Q��X'�a:����u�+zzL�l��U�#�Sk�E�����B�Ks� �C������<X~���i�
���z��uFx���(6�a�XP�jDW��J�	�y��E,����x~,d
s���<�=�iy�F�05j���U�~8>
�N�D"��s�����j�u����Ob<gHa��^
>���	��������>��:����E/��Ja���f�xK,?0,'�c��Z���.2wzJ�O0p4���9[�y�f��Z�1�iT}�fU�u����Ks�	3��6:��^�S�i�%��3����
b���Vf~�2�hxY�XNv�aJK��]����A?���4����D��c=�z��j���4�<��~��i�@�N�������4T��"��!�4T{0���4�JJ��E���O�if�.���B�{���Q�SM�3�iv�N0}t�&�J�Pl�4tI
��`�]��T,����+�����(l �9�Z���Li+�zB�A�x�F�Y��������Y��-�-3�����c���iE��3{2gG�i
��w�Z�h�$����E�����,��|,��~L���C�������vDX�����U[Bjr�������""p�ZLQb����� �={��D��c�^����-����EZ}�a���a/�XX� �]��3��m6���X��ab��i�J��[��4T��0�%��������:�d�X�aZ�;Lr�?2z`v��o����.��Ptc��b���b+��5r%�.�������(���`<�Kl�n9!��X��V)�`u�t�Y�G�)�����T�Dgn�}�5L#b��X������,'��},��6_��_w�'X&&v_�N�i�v�`�b���	v��*{"0�%�_yy$�?�5t�w%��2�4�4�`[�*�/�~�`'�HZ9SQl�c�&&���|��u����
��%qk������a�}���6���K>��[R�d��<HKkn�S���.����S/�} �?�Ns?�8~��������^U�@�	��~�"L.Xt���)����@��1���M+r�k���	��Lt�2�P�I��D�-�0�`��J5XxK��L��2��m���y��a����C������z��=�s)�`�Z����Sc���4E���a$�����n��2�pI�$���>LWt��_~'����0�����KK������G���9��[3����`�t�z�.��g3�YK����w���������V�����-I�f
#-��@'-h�=������-0>.���f�-pL+�����o������a��D�a�z��	H�8�{�e��W��O����~�?Lf��Tp�����C?�(��a�`�����z���zA+�>��_"?�l����{M�$bp�vV���
c��s�	z���Twap3X��
�%��i�^(�&z�8��������������G/��\!��{���l�uw'��
U/�;��Y��������s';K��S~�����v��8�!���m��A��s'k
�G������|�����Yq��I�����=X5S�^x������"dE?ki��o%�lYH�O�����KGW4����S�`u�s"F7��;���i�g*v���X����Y����x�0����L�Wte��_���v��Y������DLk��
����?�����u�'%�^��Z,K�e��fz����.E�8��{���>�L�y?-�<Y���ISw��"���'t��fq�0�o�	��i��������qY�=J���.�h ���1'���e��[�.��V��fmw����;-O��z�B�Kp�/.���3��,�g+����d�����-������Y�Z�J�NK:���h<T�Ly^��Ec��|Vu����$������,���]�JLz��=���E�d*z/8?��������b++�o2���O3dg�	$��7b�������H��1�-��t��f8�u����j�:	A�V �%!]>��<����>2��"P�S�v�GKy�>M�=M���9���jm�	�8A��V��d#]fV�n�07��������mc�����e��b��j���+A�ffm��'�Vu�U��}��W��=[�w�%j���i9���Dg����'X
�e�=j��)��#��w�������X���]-�4T;P0���d�0�������,�h�FH���X�0}g�M�<�I�����f?b��m`	���k,O�����x���%T���Q�������7��<7��\��V�0��k��~v�@0�4~��o�;������,)
/0
_w�r�"��Jn��/~(Y'D���']o���*����{����Rp��lN#�D����l�����/�f������%��'�����������!��a�����jah�E$����`��w�.,U� u&%aA�}V/��v8TY�v�J������q�^�mL[4\�G���`'kE�o������%�AB��7t�e7�����j��0R�o3f�"4>��������DC/!�#	�f��->a�U"�0.(���n�M����L]���N�pS�XX�f�|�
������N�k�������*��v�`K��c��	�5�V����/���t<f��H%=s��J��A�:f�8�_pi�������n�Qct?��f�^S
=`�r�4)Nn<pByZp|�����tp��=�p���p��^}e#`�hY��b3�+��+�D�4���MVX�t
��(}���s}zJ{|��k�s�iJ�#���}��]��~�C��0U����9��H���]��7�4�E7��H4&��U�~Zo|��_�*�����N����#�d�E7�d8�j�$D?���'(]R��wu&�-�'d����ix�
���_Ou�wW��-zO�������uzLo�0��.�|�����&�tk�C1e�,���z�����Uyr�f$%�UN5��RY	��Z����[!�-pRe:����h?nfv�N���h([ .�K�,�������8Y~��]�0�.s�6x&��)\=��Ew�^�OPqo�}J�3V��
�K���U,\�L���'S��W����}����n��a7��H�ob�������a/E62���'xL�B�V���7r��iU���b%�r��
v�P���/hK��4��N[o�����f*1�V>�9�'���FX�Y������1=�9��<�d���a�C���n�
��s�%�'��j�g;n��=>��k4f��K1*��}�I�����X*e��%����n���'��
����M��j�&3_Up�]{~�����]�59������^�/�-!"9	Y�e����a�,�.to!�g�+fNOY��h��d���abK"�������#J����{��l70XVJ���hXW%�$�4���;H�n��K��K���O9��pR�����v��U��M��,k�/��a~��gG���2-5�c;O�fhz����D���\��`�b]@�����~x�����y���wb;��t� |b�[R�0��
��n_�~��=��F$��D
���by_��e&	����V��K7�E���D
����bI4�{�����R,L�z�	U�e�o��&�2�1����<j��H8��\�������&k4�X�S�b�y���0�M��.��/��1
��`;��[VJ�v���|�"��L)]tF&aY:|�-���RlF|bYv�����Q���e�wb��)Yym[VY������Y�lZ�=�����.�h�[2�K�/o7
����N�I,�p/&th:�_��^L�Z4��������Y����������d�E�u�'s�	X�N����*M!nw�����:<�
��V� �56��^��+����,��(v���/�1]�`��s�^�O�LGt��?���+����3+�} V�b�)W����C�����H�-e���r]��X��	��eM��E����Ln����x ]j�������l����m���f�~<�7U�
�p�
v��==��'�	���T��	,�e��B}6�b�4x.fq��+�0�l��l���[�m0����`���l���1�>A7&�N���>%����|7L9J���&��8�mZ�{����a���L����I2�.��eI��7ve��b�F��S��l�����rb�v'�Y��!��H\��,��X����Jg��D���L��^DWh�����4R�s�i	:q��������dF_��#J�����N3�]�	-���VYf�����1g\3</X[�~����wH&�,z;���y�d�_�\9$��9������h�^�#*?�.t�5Y�&�e�`(�)��X�5��������t�Y��ulY��f3���w	���fkX3�a�.��|*va����
�`��������a���a/��D������i2i���EY�����c�5|��
5M�B5g���R�V�]��-��.&�+z�^b��9�����z��i���u�����������@�R��6�G-����_}c���K���h�,K����������q���5�zbX����r�^�0�^ex��ji�f
��������}�'sv	��4�,�+2�
=f��-�Y�w1
_���	���	�B�y��}�ba�*X(�l6qe����q���[���c+��m����������x���A���m�kL%I�C���S�h��J8��������=:b�[���Z���e�/����0�h��o��(� 6��f1�*Tt���`��/u�!�x���#��SP���������b+���u(:
�tb��+�N���[��
U[���K-�|�[��i��K��i�pw��/��0�a��T�%m�s�>ov<��3�$KG��t��t�;q����r�5x<��7���{w�=����1�����:E���w(��N�5���O/�E$������o�������U��a�&$�prU��F-8�`�Z��0�.�^�tI���J�8�1h���E��\��+���U���y���4E�a��M^����������R��y{��[B�����=�����G��T�[��+k�|H��3��L�et�����f��`�����n	^x��hx
�X�$
�u.��vk;m0��L� v����h��o�_������9}?o���S�Zq6��n����YI��������/[�D�%����.k����UOZfE�e����n����OTl�������b��;[4�nea��v�Nj�'1
&��_l�����1�]�-vo�ga�/�Y3O4�|]ir�NV��Q'�����:���2�{��S�Y�$�o��i����������xd��%����4C�g�{�0Cmcu�bg���Zb�	L�������b��;X[��7��y-���jj�
���B�a��B��D��<3��T4a��,�VI~�W4K�p�v��8=��E&�$�d�-,�/�&�^^�`����M��cr������{�"���X]tceWb�����(�}-t���\���UY��YV�!�
&vR��*N�kO���E�bY?�kI���`o�p�����D��k��=�ugN4����FlM����H�C�)aI#nc�Wfo�Xx�
�o�%�����

DW:������gSu�+�L�2�/k^�� �X�)���yI`'��^KQ�w�_��_*���KW1�|������Z����/<XU~�����d���_&�-z�����&Q|�*��B���������1��=X��XV�$tf��~���E�*
��u]��1���:v���c�{U�a������w��N��,c��=A2��'	VE��K�l����|����E7��Kz�u���������Wb��f��.0!�0f'����k�l��)z���gsC�#C_��;$�����j�/LKQ�����|�gg�u��������.�d�N���X�����By-���t��t�,L��n�XbQ�-�.fM8v~�� ��U���y��1��
�-�]rQ�n��a��}���L��{o����+S����5���Dx-F��ci�{����Jb�2����4A������~-c���o�Yey��OC��
��bY��P�.�e����������6�'s��a�[����Zf3 ������{.�����M��u��?M�=�2�Wn������R��^�X��[��>[��4Ev'`v����kih��������g�mxc��
}�����-�yzL��$��)f����NC�/+?��%�����`�VRvzL�1�.5�����q��P�P�ZK	R���X�"?X��$����W����,�
_�7���ZC���w��;+
m8�vw�����������E�_&�-����D�aI���a=���T����.N�k&���/E�gi��X���WM=��%>M�(x���x�����/tF����O����Z�G���p�'�%��������R�d���]` &�V<�L�Py�v3����7�������@"�b)���
c������H�0m�p	v�*K��<�}�i:s���4�kZ����6�6��e����`G�z��R�T�@4'�3v��H�;�x[B�@���=�y���JC;s������Wr�Me;����t�a1K����wO�d7�eE�Fr��W���
��df��DI���"�/l"���m��v���DX��`��=�ri�|��}�v�����&s���8��Wt������/l	]J�p��ym���J�`�h�R�k�
6�,���(�Vaq�$��z�����	G�J��5*�FW����`�^(��~��y�b�/,���9L�J�V���Z��c�?�����x��E�v�k�����e�O?��]z.Y�����zdf���M�n9��z�Hf�P9X,�oQl�{�43T��SyH���7!��w���Bi���k
�����~^4|�6� �J���Z�}/P�4�ZP����R\���-��������j����`wi���V��l�l�V�a�D�
��`z�� k�C�_7�W~*����-v�����E7A��A���QC����e�_����l�S�m�����_�?����W�wp��<vf�������C?��S�2��&���W��L�\�������x���1�������Z=T���(�j��c�m�$?@�c���
��������=T����/;�g��=d?��P�S`z��d��9������s?��9��O+3�Gd�Yv��e��,�����<��1����DA�_��H�k71?���Y/�h4;Q~���C��@	��\l����?��f/A�U��]p�6{��������i�T�k�0�e���L�i��;�"{�n.��|�Yv���?qb��w�=%�
�`
��-��I����5L?tM�_g�{��������*��~&��6��$X��6;�'v[{OSd�%�L����,���,��1������0���8���z]M��$�(�o��_���KE��{&\Q��!�q�j�5;Q����d~Y��_b:������M��7���<�I��������cP����$�F�xf����S��A�3���1[���i����5������Jl������v�f4���������� d���
����Q���3�x�"�10��]�?�o/���X�=�t��=?���B3�$w�v�U7�2��f�	�niT�`��t���{)��^��6]P���7k�pct�_|���B�~��:�/
��`;\��n���nM�{�v�5Z�o��(�k���p���0I����`K�|(v�`�'�A�������j�	zj����#�w�_DW�$]��}��� �]�����1���l���tG�f�[�NC��#�M�|i�m��f��2r��{�����i���3�x2g�	���nH.��Bf��[��r�`�	����'�2����1��
z/��g��<
�*�6=2Y�n����/S�g+t,���<Q�s_R���A�������c�*��{���^�X�<�}��@�]����)?��X�+�rT�lvo�O��D��wv��M�
��=	�0�'���J;���OR������f����/�LBb�A*���}��`�)��~2�����K����.Y�.����*��<����� �q���V��e�����Z�4EvF����~�������n;Md|�7vX��o�7v$�m�A�Of�������_=���>�'`�l�F����P���3h��QS�/������<3h���x�����DL����x[�EO��~�,,/xt7Y�-�����M?�&&�
�����������4�T����	�f*yf�D��=�x�v���x�����I{i��#���3����Wnzf�!��X�/��-)x07����L�c�8����k�a�/#PW������;3t���Dd�~18��K|71����4Ev	`2G��0�,\�$��I��n���?���dE���`���e ������������06:���ea����Kz�?�Ky����=��0������n��I��Q�/�0�!�����B�?�='��z���Xx�vn1��c�c���AW���k�/,���^,kv�{�0��*���F(���A��Z���<��S
sQA�V'Y��k��kw��i��RW;[q�U�c�o`���J_?��jxzz���4�"�0�~�e������5T/��:[��r�L8���t�-���-
����`W��}������������`'�5
�C���y��iz�[C�DR���&�q$ ����_=1�S�� q�\���!�fj;��������R���sV+��J���_�>��v5a�#�#Zb�6&�o�I��
�������
A��-_�a�,y5;��(��L5�k�V�]`�C����D*�����)�����^��H����i)�g*^����6�	7�`�-�f�<�=[a[��L9�k�U���p�s���P��B�}���O��������a�������;���������������g������A�x��y� a7��,�.�&V��[f�Bb�KfN�Y��h��+���KG����@�d	��%V����U,�$DO�����Fle~��n�j�)��"h.���������Pf�"�����fZ��5����W���c��eU	bYdZ�^�s����E����(�/�H/tY�9kbG���b���J�Ks�M���JHK�_�������{v?&���/�����",],��>I��1���.�W5���.��.L1Ntf��w��l���bu��2��u���p�w�Y�"�~6��t���bug��#zAoR,�A,�"�<+Cg�;o�,�#�a��b���d%b�(����iz��0%l���Y_���P���2t��~h*2��W� �c��8��Y��0!,�,{'���i�}�mx��������b�F�0.#������D�		�b���*%H����U�P}G����M
�4�v���i������g+v�cC����%�]��^�N;����P{�L�\�H���c�������f�bI����X4�b��tz�;��ny��c��������;�����h�+���m���0?�O����Z�|�Y�34|��;�O#����DCMl��%nR����^B��Xq���q��7{�$�
�������I�4Ev������J�69�����������~�C����b����������5��F�Y&0�������
]����	�:��u��=��
���P�_t�;�����9�K��s{� ;mL�\4MT�i�)�+/tGxqW������-��#�0@��Jl�V:/L�\4�W����~�]��y���������\	�3��	��bu��?�Z����N���n�z�����m�����K(.��nti��)�XIAlO\�Z�	_�ke������^�����R��N[�-����ya�r�K�F�b��� A?�.�������w���]�0����{:C�F:l8]3���/�G���S����S��]��T���}`�"�#������4E��aT$�]���%�,k����i��0qv�C�azI���(����<M���w��:}�� ���D�a6�����z	N�kO�IP�N\�[,�^X�����VXy`����'�+�\Z[�t'k�c`H%h��2�k8����F��%iRf��st�.�bUw�~
������j��<*���~��i��D���
�_��L��4>����-�s�^{1�c.��id��� -z&�cv;����^LC=2�J���$"�A�E,��H�&1$
7Mi�o�������/������g�M�� t��[���)�����a�`����o1�_��;tE%d�~�@g�^�b
��:�N(n����D�]��&O�f�$�'d6�����4��������)���j_�i�I��1�����l'���d��&Go:q�O�<{arI�+}e�2,<
�6�;���4E�D���h�$J(����]�{��],��)�����o�W�����M���N������2��=>�����G�&�"k�&|jUJ�p?��;����o�M��(JX���^��a�����=����s@��E�X�W��/B6�g��[q����9�TY���L��R3c
&����]ba��=B���&*�M-"��iL�������iQ��tf����N�c��30z�La�����=��r8<[��$��x�����������X��k�0���$v�^��X�*�o� �q��K(.c�������4��^G"�������w���?b����/=��c�}�^�a����zv��.43C��`�L��F�W�`����1�-��t��fl���X��)"���^Is�/��tz���P�u��F��(m��~7���uc�i����(������U���n�7^�d��
�rE�dw{��U���u:W�D����]]�4���"HteYk�s+�:
����)
{ �VV'*vl�2��l~L�����;��E�+���O����uU�.{s2�������hee�fNa��te�
��V�U�u��;=��cBs�`��v�����>��c�~L8��OTtU+Z��Nw����l@,,���J�b��iz������5����g�.�D���\��'Q9W��]Y������V�aW&�m�/�>��zcg���;���m,�l.}��N8#��,�`�G�6�;Y��Yv�����������������:������)��������p�W95|b�,�c6Q�X-�_M|iN����=��P��A�?h[3����++�3�brbK��.�d7�mZL{�4��l��l�;K�������W��;\��2	�P��v��Cv
x�������UAN���1UO�����D��i��RZ���GW�����>�G���/Q@m���q���l0�,T;����X�XG�0!�]-�]Y���O�����PIqC�:X�
	vl�{�^����tgE�b����=�rzL��0�4���+������vI�j
�
C`�f��b�������Y@��N\�T-�
/p��-�Z����/�
��`�i����������M�iW�i�{�D��m�+�z�V�������rK�$v�a�0,��e�web���K(S�C	~^>���	������
z�OE��%Fj�����K��}Y)n����&
��u�+�P
���6� vf2k���@��f�)Am�%����va.[��-'������7D/�z��ir�=>�kF�,!�P�]>���r�0�2�V��L�Z�`]�bw��4T{"LaZ4�m�7?�4T{"0����b)Lg�;+LWV�-z�C�d��3]��W�=��������	
�ju�
�
A�Nm��_�����t��d�V����C�����5�E��u^���C�S����sD�:�`���=;a4Y��LDNl������C���Ew���7k��*���v�^���a
$����
��`�+OSd/�i����]'kvd`����pb>�{v@_O,�
���Y5�|�Pi��{?sp���q��*q!�-��jv��N�i�F��nLSY,��Xl�e�s�*�j-o�$!z@����UY{��>x��2����4�L��u�+}��c�Z(Tv0;'l�=�6U�\N]�o%�{�F��z�X3� ^��S
��l���NQ�=c�KV������`~)�	}�`�}{r���)�b:�����u�|��F��p�e��b��;���Tx�
�{.�6g�n"j�u�#�@���X���Dh�:�xR����`�z�vxH�F��'z���3������jZ���m,hZH�^�~�=M�wf:Sb�s(!-zOq�����vS�����O���.�)��W��OR-���0��W&�(z�z�`i����{���i����HN��KB����p�*kNl��������0-.�0�1��_))�o����ZS{��3����,�6��e~��>�����%�+<���xO��9�<�hXe��Kr�7v�O-z�{�g+;��X��f~���eO��N�s�RC�=�%�K�XX��'����j�<M�]����y������W&���WC�H�Y���v��mHQ�uHQ�F� �Q	�w�u���)\j��nKjWJ	^�"������Oie�
7��a�Y��V��*��u��V�����j����i����N��z���[�����}Ej��3����E�V��b��l�
�V/H@<�T[�����~p�yH�I-�
�k�����a|6�A?o9��3�%�+=2���P�)��R�NmE��`	����IC����]_;n�nj)���p��������:�k����X\X���/���mb�����L�M����a���]��e5(B3Ei�"���5�>3������L��w��'�f���N��������U�����Xl���P���v��%
u���7�����S�OY7�rv%�9k�-���Ks�~b��p�,[���v�#��/�.���W��=�'����� eQ�3�h������;�W;X��vY�N,�����P�������,`k:�R�Oh75��7Vb*������b�V�kg���t0�.[�����'VQ������`�%b{�0fu���^D�?��%Dl����n����_d����V/qx0��y����"���^��(����f�t���W���P��w�|�=������
��N,��h�h�<�}/��/B�+0y��,���$����k�)@hVYo��j��g���i��D��/������a�A������
�����z7�p7�����CYN�d6�a7x\��5�I;�IZ���6Gl�����P?i�������c�?�E��d>g����_�����f�5k��
�[��1�.�n����g��~�����I���� b<�H�~,sfM��uc���O�2���b*��Z�
�a�.�:B�dE�b�V&szL{20f4��N,�57�`W���Y����v*�a�0'/��L-6q/r��vc�]��=`b�8;�����v6aL%hx��X�`�������H����d�E��$|�?��0��J����`f=�����`g��o�J���������]A3�fR�V�n�N��'�6�,j�`f]4���P�i�v�`.4��`'<k�������&+Q]��=>��	z��g��;2����t]`�P��n,lc���[��4�v��h����|��x�%]����T�gX1#�sNn9����k�[��_l��i��	�L��cN�4K�7�`&z�.Y�O���f��F�������]��,��`���������]x^��<��M�����j/�t5�2h������T�3��U�i4�Wk)�C�M�������
.�RY�	�`g���
��)��0�%uw��Xe~+1����4Ev���9x�]�6K����0���_w�^��p��$=���?,'q�t�R����]���f��fuw�/��{f������E?�����td�_}���`���j��w�j�����������j��8��=�����[�OC���
�����Mb[B��Y����e�{��=�j�v�� Ao������;���-��i����Y�t����{�>��ZyiNY%�B�1���2�}�hO��,K�����6[���&l�]����>�����E��j�
�����]��2�fa�4�]4�0EV�n��J��_Sj�08����h��h�=���.X�dn8������pz�L������L�y0�*��
����6���[�DC�(���
�lo	4sMm��zc�j�iMn��^�-��yzL��pO���6�{��)����N5��MK��������u���1��F-i��:�`���a���L
���t�����sq����Z\�Il�~�f	�=pi.\EX��^{���y������vg.�	���)k����%c�9�XO�����g�4�z��������bi+f���,	d��(b��+~�^{�L_4�����I{v<��@3b����T�g���L,�}��U�4���Rk�}\v�����K>n�M��
#YR��/����{�v���de��oLj[t�%�L���%Or�>t��_M����k
C<A/c*�����k�/h��|\�>���U�\���%��f������5.����~o���`i���&�AoV��Y��wM�{�V!����n�O��������M����v�$�au��H��������hX�����J���N�o]��W|e@��_I��h�;�E4F�O����pa��+/�)e
_��:F�b������eT;��%���y���s��������m^���nT��%_�i����|6=J������������#�n��J�s����y�9�x7�����&�.�F5�7V�a�Y1b�R���C>~H���^,
A���������|���~�����NJ��%-�e9kb�e�q��������.������?���C�d��b����Y�f&�L�U,+3�J�wO����QI%F�r�'M����$�Y�9��%�bGA}�YO��������\�r�.����[�-�
 h
��V� �������p�b���dN��B�f�!�:������-����}7U�1L�^�bbai����p���)�bZ�Y����b�X>%ibt�X�Ql�l�6{�����Y������jc�yeE��H���-�Zzb=1�E�K�]rX&���s����j�Io,7�4�����c��Qp�0�,��XR�h��:�eH���LC�J���M�R[E��������,�6+��\�������9{J;�U��_���/+�c����`���9��"w�k+��Y�Z�����f�,3Gh>�w�k���<D�+�9f=kzD_{�.U��{,'Vt�X��>,a}1UJ���.�x�
�C��B>F��c�3��U���,t+��e
]�xq���!�f�U��fA_�����"\!U�b�*�6�(h,aE�]j3�r+<n���=�McV�#��OE�1|�p#�0\|�$���f���
��
O�@��']���EA��w8\�
Y�[4�&��l�GB`s���
�A���l�u�M�����mE7-�����yBX��}c������c��
�!��R����(j**K���
�#�.�W+X����vKd�
��H��������M�&Pcg�h�����Z������l�D6��A+��[��m��oL�_4z3o)��L=������f��F��p��5����f?����_	�X���M)�C�S��)��U(nV�o0��������vS����E�k�}���0T���}V�o���=�-����,u��_��s���f���u8�w
��a@�<�`K;�����{)��]��xs�}ce���	������H�4
\��������#���f�c����p���m/���W>k�^L�B�b�bi�Y�7����������f��p�KVn7�m/�q�?`�Yh�zZI5�7h>��%���o�L����������]�Wh�oL_t�����M��D�����}�����M��������v�kS�������`��>�B��f��F�a�>�YEb7U�0�Et:�v��h����a�T��e�F&'�q+?�Ouh�Jx�y���f
}���N�`��k����9N�K�o����0
������ZM�:����^�@��/�?
�*���:a��7:��e���o%�h9���������Mia����Sj�n8�0!&�^�g:��g��P�F��r�Ym<��Gk������
�))w��#P������)}���?�o���u4�����]y�|*������8���72�Shy��V�nL}[����i����'�'������S��`��R~/\��K����
�`�j��������R�N�%g;tQh�J�k������f��c�����6�oz�4�`�����"�sQ52t4,�	�7!4�v�["nL~[4l�$6g���j��~�������v���l���[���������V��vnL�Y�
3����t����sv@��W�@�����
Z2��?M�����`/�F�'�%��������c�A��*�JW��n0�Pt�B�"�
�0�:�+RY��Z��A]B�pQ;Ooz%���QIe��q��-/o�!��
��TmO@�5��-�7�:,:�w��&�e0R��^�L?H�]�S���n<g����_�n��\�}4�������bTb�g��2�[lE��[f��W�_����-����)\�`���.����-Dy���;K�1��"�,b+t��^�,4��w���R�`�@b��}7����
(*�Y����S�u���s�1�pwf�|�[���w���$:'���[~�R<�lg��n���S�~J����R��Q���l�3���J�n�g�.�bw��qh��9=g��(6��nym�1w����K�5�O�'�.��e+�kK��D�����`�'��V�O�YwV� z6������Y�Y�`5�[ymj2��i���+9��]����w��j�zwg.,�+��Y���e��b��D�j8�p/^�/��l������������tM,����bs�����g^m�0��t32�Y�����8�%�u�~�a��_S��}q�����f�,��Y^����[^\�D7)���5���~��Z�����q�G��.��%�}P��C�D���94�������E�LG��e���X�Kl!��-���H����W��l�1yv�7�A�p����p�%B��qK�
Fx�+�+����������2���V�v*��}CcH����"-hV' v���-�1��U��Y��3�v����f8�wV.��%�lM��1:a$R[	+[��3A>�0�#��
��B�q�Q����e����[���+�n�����BB�,��#C<���P��w�����D,L]�������G_��EC�$Xz�}�T�E�G���B������jE��Nk�~_a�@SX,LO	�>�`y�~A)�C��X&�+�a�Fb�Bk�n���jDO��R:t�<��e�;�7
?�`����Y���-��h�������b����Y
�q�������R���n��z'��j�&;�_���A�}�������v����
��p�qv���@+�Zk������.�W�u��itg"�b+�����p��i�vS���D�R}�x��xc�fc���j�E��M���f�alA����o��(�$�I�L']t���px��AA_0����^8�qa`"X(���*��,��1?�~�l����J���;�
������wm���
d�����E�0�?��OF��1m�����;�i52��u��2��wX.b�o�&���q��7��?;�����e�������a\�\�j����L�[4�"eP�a����)�N�S��z���'�����+6��i�q����p��C���-H�w��wV�-*?��ZGf+�)��w&w.���I��J��Tm�@�I�����S�p1�dy�;A��N��'�c*���,�[!�"0o.h��$���{��V����["�@0�m�_�0�`�Y,�X��p��9�
=�w%�|-�M��L���9�1-H�wK�w��H����B��%�9���vKd�	f2����K/��uK�wh�
{1��Fb�4�&��tz�V�4��\9����a��3�F�f��da�/��a%J�T	�f"Xbs����Z���A�.Y��lz��I���O����l|�������L����6E`��TB4�E"�V1E��a�w�7�U����b�b'=���v����.}�S�N����?�0&f9|���_/�numz�� ��T��%�;�I.fc;��f��\"�^-��[����
����`i`BS�dIp����
�4ga�����>�{LO0����hI�WD,+�^�<'c
~)�$=��	�vv�h���K~+�^���
/Tz����
��)�����b��-|��WO��
�������6�m�n��EbK��%r��+��4��T��p#������Q����
+���]nb�5�YW����������i���k����L	zA_�F�w#��mc�^0�l����
:��=�S�U���N�TI#��rIr{�Nw/I�q6��X(�,�d�W_����&�I%j�����p�o�g9�+mb��l,���T����}c�I������w�T0X��p�4S���z�Lka|wH�-��%Bg��������Chc�U�����Q� 7H����/�]$�V�6��N���r����#s�J��S6?%|g� `�j��	�z�Cd�SA~���XrV,t
���}J�H���hx��9!��	�,�g�Y@fY4Pl��ps���DO�i/v����M��1�������ba�\�b^���M<��h���s��U;�[a0���\������M��_�����,^-z��Q��h���k�s��&�,�,���.���,�u(v&���6���Bt��0��?���\@b[�E���`yw�h����c������/+�ga���BQ��K��L��alI4~iU�7������9�g�
+��}������d2��>����Jc�a�u���L��7V��k���Y���'YO���?K�c��[i5���MC[=��U��I���1��B��U)e�Ba��2�`���a
�GfAX�����	�0=o�������j��%
_L��g���4�D�B�s����0�Pl��wKd��������9�G���wK���@2,�>�Q����x��HQ���s<ne#�=��]��6��>�_E4��I�������������E?L�\��/�s����3'�%��G3�~���?
'�zd��4���9'�v�D���4��Jv��T�`"��N�9�05o�3�Rv�i���<��HX1���2Q��'��	���/����X��4;��i�����:T�����,s>���+�����5.S0KsH��m�w�k�)c������l��di���]��YCw�4��R���i�cX��h�Q$����4B�9�p���x��6����h�K*�����V>��/h�x�:V{�?q%Vm����E/z*E�Gs���)m���d~e�����/nAg���p6F���]P��0�#hz�[h�4,�m���b�L��	k\�+��D6F���hj�I�z���5��B%�9��[^#Lp\4M8�.��
��x8w��q��,qX�{�+�����4�F?�?d4;Y]��'�"���M���E�����9�B�[s.��9����9�/��-r����`aWp��b�Y�}�:������RV�0���L�/g���1�$>9����BK[���:	K�g����D���������o��,�R�-]k,q>��&�r����fj�	�,
��e*gb�6�W?g�Bo�aYv�N	���6���ad\\��e�;+Yv�g������W�KYY=��9.��������Tm���T)�C�b��1��O���:��c�*��eL�]�`bbo���;���|��?�.�h���p��f��X��|�������RA���^q=k��*��pQ�z���_��C�O#W�,#?`pr*Z�Q(�$674�=�-T&�.z��ZR�������`dZ�}��K������^�.7��*62aa��t����WH�f�I4f��{^����-����_�*�=��S����\_�fw�iS�~#��sm424=.|�C	��g��=��X����"���=A�������l)�W���|�+,��*�����z7U�m�����K5���RCsNF�n�l.��j���z�4Z�}���� 4������6����w����0�%�{(�(���lX�>'�F,���%E��h�VvHH���O����[��1m�15n���p��;�fM����%a_9>mkB����S�_Y_���^��cZ�~�����$��c�Qz�d��V�&S���B�`�/s}u�8g����%���T�E��D*������J��U�a+`���b��#%K����y���PB��n�������:\����=\��X���v�-��E����G%;���?M���N4��:��0f�*
��(!�����J�������j��/������x������KdK����~��?���>�s�^,5@��^<�wAycZ:��Ktg��b�6���neb;��Z���v~�T>.�E�#��F%��@;��i���t�EO�������W�{������t4���p�A����8-�?Y�R4�$�V�A�g
_s���E
���^�K����s� �4�?�r�h��[H$�����HT����p���O���dQ��D�E?��vV�����E3�����z�f��svt��u�a��h�i[�*$_M��O�/:�x��4�4k&�"Jz��=�z��wW�7b�������Y�s.������h��,v�P����}�������'�e7�"�b{AgZz�DS��[����=�s������E�s��p����z}U���j�������2��~������1-��|E��P������������E�pO�����n���X�S4=7���E�����p�S�T��5����Osf�b[J��-�-7�a-���y�R����Ya��������e����$�,{�3�Q,Ur����f�x�M��lz��O4<�%�_9Ll����iAy�e*]>��U\L���3����t-<,Kd{�hZ��A�Y]��O�coz�����9+��N�G��������R$�E��Ut���
>��o:Y3��l�1�n���Yl�,sZB[-hX����]�Y��+�T��["@L_4u]{��N�O&�/��D%��R{vS�-���M�`�D�Y.�����=�
Vc��xa%U��Tm�@���U�����5-'�D?�(�v?g���'.�JO�Ox�z��m���Z��w��:lO��O�l�a����8�1�����/�H�fC:�����V2]�	�s
G�K����K�5�'tOX�N����$��3�r��X����j�@LN^�,t���u���^����&=T�"�	����n$S������zb%���H~�+�������num�������������\��yLw��[��}]z��1��w�i��A�"��p���{��z�>k)�������z����`�@�;��4�Jl�m��	��g��oZ>2�|�0�/�O\��Sw�i[�7����Q������Y���%&{U��,�>����&���N��T}83�D�7��J^���)F�yL��b
���#(X��z����\��Xv��EXw��Xg���;�f[���v�7�1cf����(?�T����S
������<��M��HL�V�Y�Y�/?�n�l�����$_�k�?,�Xv������["�@�FjH�N5"RLnVl/��L�����&�{$����'t!Zd�p��R�����V#�uN��2���,�>�`i����a���������A��Sf�]X�Iln&�["[P�<6��a6�� ��+��V<�L��t�������g�T�/�T(�����=����#o��,M��N	����AAWUE�p����uZO���]�[XO{2=m��q���d���a��P�E�<�9�� �4-k=a��d��`�2�f�
��B��,�X
�Na��
�hf�����%�g>�U���<��{\����A�W��o�.��	bE�	2��ngU�$����BA?PQ%���`/X\�z�@�����~��hI��/]������V�H$J
�Z�KOxC�CV"�0�>X�O*ai��i�����GK���������t����
��]��y<O&�,z��<�C����������>�Z2<��V����<�Z��5�����Js�<.",��RK�R��U���=b�����EW�6,w<����I�V`K
�[�r��q�l<Nr�pyCo�b�[;x��8k�_S�)g��'=C~��^��?����b�P��� {'�e7��S��]��y���,K5��|����nqo/.N�
��\���2bfu���w��xu�T��R��Y��h�,�����
Nv�u�,�+����E!������R�=������Eg/�9�����\�W`����b��p'���Z�O�W/v��W��a[�,^L�X4L���wS}=U���|���|�b��[�4-���Yt���\9X,���E7v]�S�wS���.���9���F�h���9M�b.�/�6��,�����[��2�����[]mL�Et�^��o���M����Ym������.T�F���#
^V��Y��`�9��0ni���|����ee������)\�[!�N���
��B��~��l��j�����W�`YV�J.��S�tb����%	v0��� =1<�4�B��e���2D���e���$I.�D
^��R4��I�� ��,�8D�F�,K	�h�,��.V%���*���El)�`����{E�tW�
g�^nu(�&��K/�A�2�s���
�W0��~��.&]'����g���A[Ps_V���$M��W�x�����l�\���X����Z�w���K^��2��z�b%u�a�t�=�R��N�`+�
�W�%=������l�0���P��K����
E��������n���z/=W�����l�j
�����
�_<24l4.+�e1<nAlY�x1�c�������(�h��\�eye�
}@�������
�����}�,�/�s,�NIe��l>����p�c���Z1fs���1mAK/��U=������?�-!,�
/:���	���&�H��~"�bhb�����qs_���������������FAln�z������z��M��K�`R�0�&'��U�`�Gz�pm-�/��.�4����<7S�v��n��[)����,��$6�Mv+df�w��d_H��rC�d������,����
���^��~�v'����l���Aw
6�W��
�����6���vL��a�#�Q��m�a�m,�&�J��7�m�,g���p��T�W����t�[������j�{���5�,�	z@{T,�U	��_����x�B�em����E�����K4b7S10+B4�I �k�����0>��vKd�	�EWJ�,T���x(W&<1���u�+c����5S�}'��n8��0�:hx0K7�Y�f��^��g���B7�f
]cC�	��(�py�l/��+v��h��MA7�,���M���1-�����h��t@��&
�H�S�f�B>���R4��g�%���.lM.��5|R����VH�����D����bs��n�>�aR��s��g3,Q
����1��9&��S�����[^�"����p�Ng�n�6F`FA�7S;��9�:p�m0�%����[^#Lj�t�O`�����E����p��]0�����`i�7���b��Rs�h�X�v��E�w��*�BK�+��]��g��XB��0{�����[^[#t���lc�f�T�&���%8\h�,8�u�:��j`�#Dl'99wi���$7����p�E���{J2~\���G��0�n�l���%��^0r�d���r~�C���\H������Ew���;2��"�z�%7\q�[2x����.�Xj
I0�E�W��f�,8������\����{Y���x�6���U��	��W�`������~��1J%C��a�@���n�l;�X����vX�'���Vi���`p8Z��V��`yv�0����A��=��Kg�	��D���W;�-�v�Ms���"����fO���|y���L�D��R��~-s�2�c�)�b7�OV��"Jgzd��\}���1Z�Kx-U�2����.Q�#�WV,��;��q���>^^�Da���
��e��������B��%j^"��]���9�%�����1K
������{����/��&p�P<�Z��en�P�Mlgj�tR�\�Y�|-�����YKn7�����$�.�^��B5
�Y�u7�M�e+���B��Y�#%�.�^k����+���l_Vq#��b��}'Pz�h����[ ��:+�J���p>^YJ��FK5%���e���?�|��Et_��@��4�'4�Y��������\	���OW�G+:�s������9���w+d��e���nn�0�^l������'���8=k��S�wKd��e��~XS,�[qu���msE�n�f��p+5�m�bY���-�
�}�����������bs�pa\�4[(~-��\'�t;�����������;R��nqm�:v�P�B�S����*~��(���o7�->��*���k�Z��~�q��4,��J���Z�P�O�
���*f�?fY:��'��n��b�����p���_K��,cV�d5gbss��Tm�0�(��,O�`�W��
$��*���B�����/��-������o`��j��7]�v�k;����
�a$Z��5��?J�����FXe�h����,�D�fjc��;'��}X1���;��Q[����0��#����G�;��w&g/xQ	vj�_+�LEJ4���������66����7Mi������
�yJ��0��L���p���4t
��@�y�����<�Q��p��Q�D#�����qa7T/V%���D��s�4��}J�^�����/��z�r2�P�������c�����+'a7�m6�C��:���X���n�a���=�������dc�r�a`����9{��3||���E�.��8[i��Z�����]�=2L�����"���k����e���Us���b��i�B��k��fu��Al����9�n���E`�y��.��%~���%��/=o%����4_4�H���4�����9WBT�X�%��/�Kw�i�K,��H��cm�f6����X��%Z%�����k]h�!G4�[2K�)��J���}�
������Xz!��D��:��7�J�/SJ6��4_+%go��h*�+�V���D�L��,�*&c��P�����������D�Eg[�����3�\��{L�@0at(	�P�Gl)a���/L6
�>e��/��t���=��J�����Gt�O���k1���=�T���`z4L�B*67��-�- x�]Q-f����Y�]D��Mxk����_&f-���K+��H]���Z��\A?0�!���S~��7b5��I5����[U��7Z�J��
�J�<�`;,p6���`�Jq����/r8\�aCsM#�C!��[�{LA0������V���"5�F���Z�(��$����
�y�5S'��~vKd���J���� =���l��7=a�M���+~+ag[�l��[%���/��}�sd7�OX�����D��EK3���%�U�~�~���T�ar�U�+���&=a���*�b/��/}�J���s����:��#�-�V�~a�5��4�*
�5��U�����}��o)������,:��������L��Ak{Zi�;�{t�h�/�Y�9n�J~�g>���d�P40���-�\x�~��ajh��w�YX��*�����x���XY^���$
6){��%�	���3��h����nymj��f��)nc��m��65�L��Y�>��U�_��u��F�M��?$��
���[06���%6������e��x��/�9K�� ak&w�B�����jM�^�a��'Mkh�kd���*/�8r;�Y��rY�fG���t�6t&������py��u`�F^��<���=U�I��`�s{�x<Ur���������I�4O���yB��=|��� ���ENz�Y�e����	�45�,k�f�>wU���I�s�L7�����YT a6�X�-����Y��x����G���d�,�^4����.��Y��Vr<�����',<%%��nl����<���gv�+�����v?���$e�u�������*@E���&�H)����&@5�����}�0�}I�l� Yk���`7�m��l�A�{����t�������=�j/~i��+o~_�a_����p�D�'��tVU�
g{i��H��������
��D+���,����-��4�'<��B31������p��������B�;RR3;�s�~�1(��4�/�O�7�`Q������~^����3�&��
>����J�vd��QMC�B��o�����99�<��#������L��0�~[�ZMT=145��7mS�����:g�?�K-�[����mSz���(�fv��d�6���BK<�l�����1*27M�����/,���R%�����E�5�;|�`�y�������Gbw���C�e�9����J��,�<5�R����h�`{^��K,�'��*��~������{�#W��5�`�g�^��(w�w���a��6S��Qb�]���w�d-���&.������H~YT"o��`��1mj�2��~��&���0�!�Bg���&="�	#�bS}�n�6�`b���jc����I��p����+��/]��p��P���	_U������zlG�+fG%td��0�t��������`���nH��l��-�������O\�*o��6x?z�w��l� �	��mj6(��4kkv��D�l��M�lp����6�s6�����F�;5=a��#�aa*R����B�E�"�����m �f��Z����LmO �g��>�U(���w���6�4����f���w$X�FlA&��1s���
2���^x7U�Hm��CE�y.��g:�w9	�L#�r�������\��g:�5���%�����d
�Wn��g:6��'�JR?�W��%vWU���19|0#`�����H��H�������^�����0Aj��-���
)��^��*^&��f�Xh�I����>]Q�����52��J����DQ�|����$��������/G�>����q�Jv���TyM���{�����1���v��"��A��+��K?�-$�����������cN[0k���m��6�3iv����c���nA_)k7��	���<�6'��n��?��s��n�M�=�vhN���h�R~���q��4�-�M8�K#mZh4{����u��Ly���T=O�t��TP�,�b�/�1��#m�B�	����s<g�F�9;�lnex��d����vLf�0�i�V	�+/��j�Jn��-�@�zt6��,\��������d����`]^��
6G?w�k����*�S�P	��b��3���,[��'�f�
=_:��8�K�l�"�f��(����^���������["[�PxF:�0�l%P�l��y	�3F���,�����<Z�F���Wk7���;l���a�{m��/��B��t+%��
�.z�����;������o
����L��W�W���_9��q���["��}$I[���>�v���1}�C�W��0�,����,�)���V.`�
(c�*����������1mM�!��k�
g���h���^�z��_����)�U�Dn�cF<��QA\�Pym�B���B��eq���w4�iv�X2�X�[Q
�,�{�r-��=+t���0%����p?����p{u�$�*Ho^V���
���hnv��tE7[�
���Ex/fO�~��y7��p�-�7�!�N�`[�L�,�{��f��U����f�2la�����s��s��{\�f
�T�x/��&z���X�m&�I���cZD�b���v�>pC�b��b��["���&z���r���f�T
�[",^+�b�pbx[�,�{��)�PD��.BbY���YH��7|1�_�����^�'lZ����2��u�/xz��c�u�����A_�`�C,U��.�_�V{I�N5\1�e����
���M"�	��-\��s|�����u��B�?X�.
S\~�pZ��E/��$�b�Y���t������/:���8;���7k=q!���D2L���h���`���&~Y���.�_�0��6��)�.��\����b��
�!��+�n����K6�N?��x����mV�l�`�[��b"��S��n4�0,�UtK>��p6%��"��������J/"�:=���B+�xi����|v�>g���ce��)����8���*{�>��i/�H+��nK���7A �D2aG��l+�/+��v&�'�^{A�'X�,!v$��D�&X��h�q��-;�����6a��"h���{_�H��9�B�|���[\[]�1"��a��a����l��+K�;�wl�^�&�E_�H��^�`g% nMXK��}+\)��S�*�eF�t

l�����5
�Hb���R�
��`����� �{Y@7�`!{{��ps�3��L��lAH���.5Q���}�,����	�����
�B�y$A�0�+���{��B��e����.��0����ieK����A��������.�����bUV��"��4uh��(H�]������V�Dl���A�����[�����{�w���&�n�/.P{1�5������`�#�� �sY��>\�t_�-��_V���N��
7�`aLb�0,��[m��"�a�����@��Ua�J��j��R=Yy�G�)�]��F�������nZ"��Y�s@����2�
�
�+�����u�Cw���k�M�V�%��Eu���"����>����xY"����������Vb�-� �����(��SK3G��_��+��E�saum��;_��)w���b�t�i.�F����N���1m1qC�n"Ru����R�Nq����E�A���s����t�+	��f��6��V)��X���CUs�8�������/&t,zBz�l.Q�K�W"�pyg�����PV4��*6����j3^����;^�"�Y��Y�I�_������o%�u�d�Z�������Vl]��X�p�p�@�G,��;`����`c:U������a������/&E-�fV����f]�bZ�����	�����!��\��cX?;wA8Nv;6��p;	r[��Y��YAO��+-��M�Z�t^KV�K��C1,L�����`�T��[]�^����4=y��_&2��e�yL�I_L�X��)b���2�����CBsN������c���s��sv��?���$Io�f]_�������=��
�.h�K�t��i�b+������hZ�,M�_�W�K��mk��D�Z6V��l�#�=�mk��z��d7��T��t��8gab���{����g��_ZA~������R�W!8f�ol%,����VZ1���e)��,�Sq�~C�����~�`[�wj���q���x����E�D�`�J9�%�a6��X����^zJ��LA[�M���uT������v��h�:;�^���r�T�$�F3���w,�%$�&�j�����/:\��0�Ql�����C�`����MIhC�K��t���-�	�E���-�t�-�
�pE/�'����M��T�6"z����;%���z{������o�Qg=����tf;�X�]��Z���o&�-6R4��Jopct��o�o�L~T�d����0.;����u[3�fi�;3���og%����\g�bs��n��S��N��
�&nKa�,�%
r�}
���r�7�����n8��,��4��.	vsK4g����B*�����p��44K:��M �P�t[�f���s��9�*��U�o�=�e/6�WvS�:)�������K��u�4s��erb����o�w,:j���9���MC#=X�Z%�1uK���V��?�ny}�3�"����YV�`�rH[��f2�p�hq���z0�6I���$f�����4�n�l���i�0X~[>�-}+���9�2�ECo���4#<kxM6���-���w-:G��Y��,6�s��&<O�f�1B�[��}��?�UH����|3�f��LN�`��t����?<���f�����$�E?tu'%{�'nkK���Ytg�`z��i
���L\�7����65���bi;�9"t��fba�����|�����v������f*<>���nb�q���e��65��)mi���4��:��S.������~�h�SI�����c��dR0�u��K�.�l���u���mU��e,��/m��C>g'�{����t���D����M�;�������'�9��V�6�}����)�q7U�O��E4
���g7S���
=�����`���Yi�����E�oV�#���-�_,����
�?���zz�0&l.9g��������j}��W�����r�7L�h���?����������7,��h�m����>���sv����[��'2��T���3����$������m��,�x8\D��}1�R`�z���=.�1��Dlr�mfj����r6Z����^l5,��Y]M�
����i�eW�����������M�2��H~��p>���)����lvS��L���������_��6����������h��%6@����K�[	�[~����0�m���bs��p�0�����������Y2A�
!bY���x�����a���ah'P�u����B[��������|����N�X�1VX!@�������a���m�<.�,u��,��6x
���N�{�����-i�D64a=N������Y������?���p��6�����	c/CE�pq�-�z����ar���	w�H+4��-K
�&����SI	�,�
�A?�^���IK3�0�[����-}C�/�RB�����[z�t[W�g��L��cZ�����p����H�j�ZxJ�^�|
:�w��a"��'�"����X���a��+���diiz]
}�.�
�VoJ��cz�B|���7����	H��f�bg���mIk(*'��	�b9��#���k��V).�65J�,
?�`����e���%��%��/6A/h.;*�/��������X��i��������n������hMk���f���LR��],<n�7�m���D��X��(�0bmtoki��b.=l�X$]j�9�`�j�T)F�VNCki��[44�����$����{J���C4|
�(��`+�Oo�RC�p�0�]���mo_����,�w�-h}�hr�P"O�S��l�������n+K�LPVt�������[�3�������Tm1�f�X�:��	k<�L/�t�k��r�-p8�����~�o���-��V�V��L������I��R:i�g��,z�|�
Z�b���9C�R��������k��p����v�������sa�n8�U0�/�cx�L3|L�%�/d*Q4K-Ceg��������3q|��>���*�����l�6�����f��lAt��Z��2�E�Bi�c�c�zO4�M�m��-�*\��%?,�Ot.��
�x8���te���2��l!��������EVJ(�r�~�x�0�c��U|��0��ify��MM����=��c��<�9��������)���������b;��{>��X���Y�f����2o�������W����b�%�l���ce��E"EO���8��%�x\v������B�K�=�!q]X4��N��1mz1n�����<�����\H},�
5�D�t��������E��G��l?1=Y�=�^��l?�
`������}X6�X�Q#��
<��~��������l@19l��C�d��_�	�{<o�~�����D����,v��<�0�Ol�u�,�U���� ��Tm����i����7d���en}����
��
�Dwh��ej�baB�Yfn�D6dXV�ix���7s�z\��Oh����Uym��|5��C���>���^�%��I������7*���T���~�r�cn��D1+-�@sA����%��2��p�[��
���Y�v��6�YD]t�b~�B�T������R	�Z����t�J��P�s�/D�-�By����fq-��0�^��ev�n��?,b��*D���?��4�x�-4�~,���@G���26R����� �
g�
F��^�������������6x��-4�~,J�@m�F�u"���
�f��������3��v���Z��cEk�;}�<�E��Y���'f1b��k��6��2�������gP�a����{���K�,�������w�'�c������&X�k� q�X�����94��f5hbae����o�D���T�nc�H���y��������v�
IfU;���������t�����&<���R�b� 45�+\,���A��z�M�!����c���/��DV]A���r�CO��n�I|R����u������C��b)��2��V��L����VrK,�N3�������Na\��l��`�s�w�������)��YOQ��c��cR���%(��^�v���L��num,2uw�Y)��B[HlA_�����T�E�J��e�h��[����}:�����j\����Xc�q������>qs"����-��'h?
���|�\��{L�O0+�rxv��f�4]�VJ��x�0�s�0��j��m���=�
?���l���^w��?0e5�&���7��".��'���s���������o���Tm��\��,
�A�+���s%�����XP,la(J`��-�s%�������`xv�U)~4B��l�M���M\Xe4T�{W���x��-!�X��$�K��\v����h�Z(>x��!��]�������_�V�;��k:�Nu�!�+�-9	�W��,�u��u��o��;������1m3�W�ZT��������������}��� �Xj=��:.hxs�\:�15�?������num���6�,>U`�yl�;�:@����?���f*tC��������N�/���NdS�)���L*P,M@6W���f*�
����`'T���d�7!l�?<o�hZY���x��H���YY����c�y���a�,�&.yq�X���4���8)�C�����S!��s���v��g������*�w��N�!l	���N�|�V��L�q�$�
���;���Sw�icf���oB�u>z,z���	�C�[���@o���~#�������e�D��]7����U)��P�S���U	���TX���_r4��><
}U*�����hx�yd��[���"b��9�u���	��@�zh$L��`/x�������nym�{�E��Q��>�`�}L��3���}�V�;`��x4\^���s~+�-�����[��u�t���V�fy���^�UG���J�2U�|��h��H��0S��L��4=XV��:''��K������v�k#��EC5�W���}���-[U����GfW��ax���-�mT��*��x���6"��c1�\ub+����r:��p�W��s�|[��5��h��)fd�e�D�����r��[7���I-���;R��n��S�?�*G�T��.QX��;����E� ���-v���;a4?���0Sb�n��S�'��	Qb�
g7��S�?b8�a�~i#l��6�	k���:�����	��ydv[��4��Z��;����Sf�n�>���.6�{�|}���E��[|k�w�XV�ix��Y�����#�e^E?o�������dE�Y�h7�Ovx���+��
����sU���
v@���gj��yo���Xu�hzA
&����=��V/�fQY�����iAc^]�,��,�B;S�`�������������k����)�MkZ z@Z,K��-�s
�{�
���5�����w�`[�v����4+��7A�S�Ck_N��c�a�X��~,�1oF���6�4�%���������U�����1m}��U�J���Wt����f{��l�.�H5K�7x��yc�e��,��:Y.�+�����)B�2-LE,l� vk�e�a?[�P��,1�+1��B^�2}��8MA���E���E
�b�.ba���eIebs<a���D�E`E|�YG*6<f����^�������-����<��8�X�~n�l��fs��W~&V��uvS��=A��9f��������l/Tj5��7V&z@_N�����h�X��6w��-�
7h�4u�f����m��j�Z�A����l��
6h�R	����ZC��ta����/��l�4��&�n������u�f�v�b'z��T�
�b�k��B����-�&6	����/B���V���D�1L��s.4�hV��Z��;����a�Xj��(��N�����?�Q��B42G��pr�~���t�Y}����O�]��
���,��D7V!-6�W9g���������r�u�L)
���.=,:
����"�������AC�c��Q��fh����-�MT&�nF�%��J��N��[I��?l�)�b:b;�K���	����`���@���a��X�V������^T��>t��^!�t�"{�n�����������7���3�g���4l�%���p��R�e��>[��f��jR�"�
V:H����}c���4|���g����a
J�����[��-��`��D���u7�� X�@|!E�"�
��A���`'}$���xb&�'�.}��(��4�A	���������e���o�M.����7�9^�673��J�X2�f���}�B���7�^<��7�H�:w%\���������=A�z��K�F(��)�y��6c�:h��Z,lf�Y�p����q���[^�1�?�V(���6?��[�5�,��`@B���6$�0Qm0�������+[�
 �/��8gaH�)R�{J[@�� ��B;�f)�MC�i���`;��{�|�J����4�����f+70�i7��H��p6&��-��c���;���f_��i�/�����eban�z���������
{����^���T�`'t�-5c,��,�`��R
[��g�/��.��h�n0���W��9{UJ�-�������1���~���\�����%��?K�=�T������i��V��=E8���W��9{��m��=�["A����>����j:[	�Z�Agg�74��
��R�������`+��o����6�D�K��0�`P+�����x8���O�U� �
���N���v�!:�8�
g�
z=����l����t��^�.�������~n/xC?��vKd;�G}�K����p��>���Z��W"�\Y]���}�>e����,�� �-�Y"���^��p��C{�h��g�]���{�XX�*�)XC�r���)�~�5.v�TQ�7����T��[����v>���y�n����C���w�wg�g�7����������f�W�[��%��t���
7<:PDOfl�e%ba��XX�,6����^^8��L`W���h7����� (�� v���n�ne�
�D� F.$
w��w&{ ����%g�6����b�B�n���$�E���P��#�I<
��bS~�nmm�1�t������*#baI�Xza�jrG��a�h(�'�fbb;�M�������B�������'+�{���0����)��Tr��{g���7�Z
i�8|�����_.�,��1ni����DC���R7vS��/�A�Y���"��5��],p*vt}���;B��9Cb'�i�-mA��
k���t�X������2^��D���&�S��-�����&}gi���_[�(�w��wh?])@��h��d����)�b���Yx�[�5m�0mx�Y/�����vS�!CWf������s���"]����,L,�5c\����num1mx�7=Nd?�����v�i[�A�mc�7b�}
.�B�n!���R�gO)}v�<\�K,��a��u�[G?��wQ�6�t{.��/�F<���<����F_����j,�P��l�!Y���?���bo�><��*��u�
�!���"#����/�4,��7��>A������+��9v�ic�I��f�)B�������%_�.(�w+�wz�l�`�e|7UOLU^�`*>bh�[���uy��M����Z	�3%|�O�
�[�C/����T���>����|��@M�m�}�j��N�����l�T���]a;�4|���A_�?����NK���M��BAA��}��V���2������pf���o����a�������������]4�&I��Lm�,S��3�!���qox����A[_!���������s��s���yX&=d6��6+d��#�Ah�Z��=���+���;Z
ko�N���e?�w+�w�����.��u��B�A�W�S�����i7
-�`/���6_�����wh?=`rY����=s]YW|���mv�k{��\�{n�YE���\W;�?�i�v�k�����Mv�.V�(4��r�j��e�;��}�C8XX�dI{���/�����������;�K����,���U�*}g����w�b����R�d%�/JC����"�z4kX�0�i�-�:$��ny}`����3#X(�/v����;����~��	baH\�}�n9��pO�����@��FX�4EV��������������7���E}t�/�YCgZ�7]����`������Z�
*vnW�a�P^�T����+�_v�ik��
h�a/����B����}j�������	�A���i=y�JU��d-����^0g^�`�c�Kg�q���juW��*�:gi��:;@������3@�E�����!���j��"A���`�C>_5��,|���IU��F&�P�h���i���X�3�Lk��:^wk��
�����_�~�R��)m�����sX������jKf�=a���Jv��3dM����(����~^�&�����3�V���X,LzV#�J���BPE��N��-
�����FQxJ�{���hzGY�f���(���i���������A�gF54���]��Z7u�0H�n
"v�%�YCsX]���$�V8�����p�R�qfU�#������c��W��i�Q���#������E��b��������r����%�wF��%�����d8g�T������wF�U��+0���0��^��3���*���C��p�WG��p6���4��5p��fj*D�Q\�p1�+�w�i3���J(��P��U~��D�_SQ;>��r�t��(N5�ux������Q�u)z�_d��y�G(��k��D"�t�[XI_����w���^N%�+�����T����������f�/"v0)j������z�Q��K�\,�P�H�]����*�ED��;,�3j9��A�b���sA�eX��dZ����������<U����Sm���Y�������{��c�p�7<���a���Y%��b�cNhn��[����OFP���[.L��
W�a
��4�M�"T���Bl��T��h%�?,�?�l�i8U����R�7g[AuqX��A?���J��������v��\g����n�-������������L�Q,L����/n�J��>e�����b���ue��9�T�E���Y(�V:L�\��m�BeZ�P�S�����d������=Y
�/?�����f=���~bUR��3���������]���Bd{X�}0ew�L�Rl�;g�c�����M�V�����R�DCaS��������c��cy��a��X����=�B�iX�~�����%j�e��F��^���	�������fe����X�
�&[�&Yz�;@������*,<.�d)�Z����v�\�%2�W*py?����b����`���s��s6;��j�^ D3Y	���HR��o�T�*;��rVC0�����Zyk�C=W���#�~���a��~��64��/5zf��?,d?�]�����I4�U/�2y�,
N,����Itm��6��p��Xyyl�0Ey���"����������9�D�D_0���Qx������ES�C�����]��^�A����w�kS������v��X�� R������fX,AQl����+��E�����l��i����
��v��D6c�]S���%
4��w���h��TH�h6b���Cx����f�I(;R���wkk�$���(�E;}���ao$�0��/��s�f�Kbs�t�B6�`T���~cw����>��6dc�5}A�AST~+ky\h��bn��+��2�w}uh>g����-4�nn0�����8����K?�e`@�O����x�>�����)]���;V2,����V0��__����L���%������a�_���p��7Ku
��R��{B��f�0M?�l/���f*��J����}����
�Zw
���;��+4���Q�V���N4��V���`��bg��yXu?��?nb�X��^����Ls������iD?�}��������n��
�w�kc�#���xL��^��]��EK��\�����`�l��|I���U��W�["��1���9����9�b��0�:��V�6.��
�D��E��u�Bh���d�E�J����VxK��N5��L�X,�ln�bR[<�a�@o�D�������w]�R�t���q��6�	�t�����TmkB�6���F��s"%�
�y����=��'����f��T�B%?pJ�������jH�>y�w���;�E�����y}E����)����v�k3�w4~9Gi :�	}�z�J
���$��g&8��^��)��zv�� <=��>``��1�X����K�q�wi��	��E�P�������W
�d�����-/��
��4����f[����c��"tMOy�*���6h?]
pY~�������IZ����d��k���8���g���^���*.5c�(l����h�_��l:zw�k�	^��~`�[�0�a9z�5���QeXA�}��?)�W���F?`Pj�;�����X�J[c�l=`2x�����Y�������y�X�f�RU@���I@�����A�`����,�r�R���Y��Y^k�S�H�T�F���j/���T������`�X�}@-�W��y�kZ��,�>�@��	o�Y���`a�i�4��V2��U%�k_f�9K�A4����z�����������d
XS���A�0l�#����t��v��(��_��Ql���,yx�w����2(�7��������	���U!ba�X�H'�b���Vh0-3bE/V�'v2��,s	�}��@�]��N�������<g��i]��t�E�
W���<��6��@���.A�����8{�=�ci?��=&6��s�1�T�-���VI�L0L���nG>��N+�O��h�	|��I
b����=7��U���]4l�+�b��b���O\���v�,.����
��i�u��.������
��B�t�7K��jT��%�s���pU*��6	��D��EO�^,�+v,���'^����b�Bj����d������(������S�|"6F�N0��G��sb[�A���d�Z�t��(^����Nb����b�=�+���a���B���Z�d�7��9a�s����kM�_�`g�BeZ�|2�f��e��I���Tm���_��������w�iS�����Ab�+���js�ip����u�>��w�5D������<��&+���g{�e�������|���m��Y,,�[������o�% v�;f�����64���-����b/�K,6��z_N�YO��.�AG�Xx-~�u���>��+�b���a���`/���v�i#�,�.�,��=��~��H��|�V��J��s��s����G�;�u��X�nym��_S���1b9����E�
�svB����T�6�w
���������h�5-v�;�W!{~ZJ{2����_4�h=��h�$&��}`��yk9��z��i�M�a�kKO�d&����.u�����LG��p��(����f��{�����5C��9�i�����D_�y��a�_r��'k��������@?n�a�m�&v
�c����d�E���svJ=�%�'����c��9�n7U��^
����`-`��&:�t���=�Xj�j\x6����;�=`�4���0�'�iv�i��2���8�����q���1l=����}H��%��]0���*4��� �e���)�����}�}	���FtB��c�����q���1���[E#C?b��
����Z�x��R	�B^#C��O��
�����nymm2c�O�n~Z����t�~�����ZXw���R�����=A��w����
���.��/�x�6.t
�+�,��Nx��k[v���b���i��na������

e��u'�
��x�������dz������a%�n�U"a]hYH����6��
��Ol�U���-��}�oS:k�
�q�����p�����(�[^2�Y��v�X�-����0,E��n�$Lm��������2/V�{�;�f�,%<a�S�.��J&�e��W�p�0�*c�	:��~�@#�#p7U�^���r^q�$�6����5��U�j�����a86��=�����J��0�9XZ�2U���J��R+��{j����
g�	*[H��RUc�Wz��j�	�E[��7��S�X�N����&�?��y����8�������l�&�M��:,�	zU�"���R^�a�`{%_���^���_H�wR����G$L��*������,|�"�������[]��0aE4��K�8��8�X�!(s���� �����>�],�3��+u9��J����{����-MD�H-]U�D�c��&����K[$R[��X��~����H,�[�}��,��Jd�"���4����,��Tm�������cv������a��_a��J��j�����p��l���a�����J��f'L��+�@�*5�V����t�5�R\
<��N�+��B�+�0k���_������$,i
z���`{����T��WS^
��boV��qY������vKty��T�����nW��2\,zg�f���)?%�DCw����[��y�2���E�N	����������~L�E��������/�R��%�f������b+U��2���+���e9��	�2����jWw����p��[7KS�|B�����|���Hx��Xz��X[��jz�U[+�3�(��D��f�b����t{��R���y��6��t��,v���e�R6�V#e6����6����(�B�MJ�����R,�K}���a��X(�,6�������R~iv�]<�B,Tl���vKd������<b]^5�lVi�-�-T�h+�)T%/+�.VU':�N�ln}��L����3I.��������0��M�=2�ph���m���n#���jc���)hcybsc��S�jc����,��+�Y>n��-�-/��a��C�����h�����m6��+�:����#Jl:�v�i����n`�B��eI��*8��J�?g������|a]��,l��&�
/&~�a�����C��`z����,l��qY����e?�-��,��.��+����Uub�*�������x3r8��%Fv��B�����������"�d��fj���t��[���p��~+O�.�Dc���e-]�*:7y8g�T�������+���bY�w�
����a�V�B�X�k��VH\V������t1:X����p��H^s5n��v�kc��5���L���� X��+6�!����&-��\���b��w�&�����f�A�&��_�)v+d����^)=t7����.,��p6�X��i�,���������`s<u������>��l������D���A;i;�j�u��!j����f�h\x�K(����N���h�B;c��ba+��T{�D�a`�I�R�2m���t�S�f8�$�B������,��L}��#�������f�~���;��
�~�������0�j���	��
��J/��(���U��`s���S�����sw�s&���Y�Q�JJ�����}���/Q/�C�*�����2��U|���z�V�~��Wf�����d9Y��F�����T#S�~��R�-T0//&T,��!�`i���.k/hvM�[�p{�N1{�$�k���]�L�#/<��+tq!�R���a��!;*e��V�:��Du?�:G/�#�m6�����,q��I���Jy�%��5])��l��F�$p���r�e�V���6	�|��J!��d���iX�$I�JM�e]�uM}�S�T���:�9���]LVt�K�L�q�w6�\.�["�s�(j������6�����ln�p���{��>�a\:���g$t4MT�$�[�YW|��.�
61����l%�=�mh�����F��ft���>��]0"h�{�=Q#]��]0�T44}��[q�Zw�J)�V�V�]LQV�
7R����Xx��
n�Fi%��TES����/\����>g/�"�q&��{�>���R0f��M���B3�e	��$tE���b�^
YNvk�.�mtn1��',T�Y_���h>���d)������eb�bG��cm�E��Aq�B���]�1�{L�0g=��)�gmW�jY����['5��^��B���)�������q����U���4���?����)��L
R,�����0�l�����Z�A7B��E�s'<n����l�>.r8a�;�^���,(��f�;�����Tm��J��,o��/�b���5A7�(����/��'47����
��t��������}��h����E"����V�}YLU4��j�]��VD�_����_�0!W,���6�#��b��9���U{_&{b�E��M�l��wO���h�}�(�XX�+�3�Bl+���KS���&�k������.�f��}�cS��b�_X�|�93��l��Z^^���/�9�eB���he}^��h$D�{���
��p_��H���^�Z��e�R�a�[�
��f�,�t���-����}Y&�k�����k=�����ve�]��o{3w����`s�nym�0	@�7���,Wlg�'�,[Ql� �-�M ��2��2��B��k5Z��%��"�Z��ebO�/h�;�	t}��;g������&�Z��e�s�P��w��!mUX���8�(6�������Z�f���qp�#]6wS���ve�)f��}�@����d�{.mW�����P�U�Q�����2p����X(�%��o�����["[A,4)���,�zH4k�����kq���ND�B%�ki��AC��fzb�BC����/<����l��l�����I���{�V}+����F�n�l�����	�'��,D������=�����Y^+��L�RtnFs�����Tm1�V��HU���O��l��x}YB��/������,l�(���ZZ6K����E��������������v����C������a_h��;(����*RD�2��k����b{��-�� & )�C��F���tZ�wlz���p��g}����:��[1������%����
�>�uA���P+��+�f�uf�K���� [�b*|�����>�B��k�Vz��N$�L�MlV�=�
VM!����`�B��k�����}o��&W[��|-������Z���F�C�Z�/+��������u��1�%Aw�<+�����-�s�����Q�Z����9A_}��b�/k
���vV��qSps���}��4,����X�B����E]FP�'he��z����
,+�7���B�TB��:�����
z�(w���7��~�Z�-�
7x��>-�i�|���I���)m��
�
���
��?�-�:vKd{�t5���{�j�s�f)��c����f��LN,���0<�k=%_��f?��h���������5�����/�������h����m��9��~���1L�	��I>��6��5L���+�/���d����0�l������_���0V0�@�~Mi�V�B�m��/��I`�����VV^<|LW4���V.G�}Y����]�}�)$Q]x�Co�Yfu����`9@����>���,,��a�����k;z�����v��j��i��-��
%��>����/����k�sv��i
�V��V=���g���"�d	6g����S=��\J��^#���c��V��=`��T���$��t��=��V�/j��`��a��6��r�h��4g�X�����[I��^�s���0�r���h���`����� }�Z������o�,����l���{L�]��_���,��Ly���7�T�wKdk����h�����)�L��Eb[E����/����2�l���,i�[��
���L��[ht�Z�����+���i��$���_���l=����i�9���XvS�	�$�i�����K�����x~�]S4���5���D�0��$@P�`-i
�E�J��5�i,!�:��i
oE����H���Y�(`��������+S�M�Qbar�R<��8w��4��V�~aJ���s6U��%z�b?k�
����nym�@���{z��p�E`��+E���g-�������`��K:���Z����,Xna/���!,L�2aj��	�05<5���x�����<��u�4I���t���`�J���_xK�%5��p�b`D�4�j�6`J��%B�{J[O0^��<N�C�=����'>oY0�IH;���L?(�f� r�\�*YU�]����a��`����������B�2�:R��L>3�7�P5�Jv+�x��{���S#����
����\K�[����S�>�_�����Sv������0}��,�6�	`��
4[�/����(M����������O������9����m�
h�t�,�|u�W��n����}6|@(������K+���l��]���~�
7�`s�V�Et�sF����:Oq�liB�$hV������l���2ht�3��	���vd�B���yg���"�Y����?��'3���l�����q��@��<v��j��f��\!���2�L/��f�B��f��W%'���y
�`�
�d�fr�fh%h�pu��Ki�����?��%�R]��]:�L�;�Rs�W��.e%c�Y �RF��i��K�a��!��������p������1������-"��i����&�L�v���%�G�gv9XD�T������>T����	����$y��o�y������,�U_H��)������:M�#M�����0�#/��:X��-XE�������,)��nT�b��~��v9���+���P;�����~�����������z�YTN���Y,L��h�4MgW7\�y;��y:�tv#���V��6�nc:��}g��V�����.=���0�t��-��{e�?�ALK�'����<��M�tJ,*27�����NMV���f�����^����B��;�BZw�L#u���[6���R��Jp��� 8VD{�\�K'�Y����s�Mmp�tG�'��N�t����j�=M�/$�2�����U��R!���
8��Cu�����p����mr4���t���,]���9�lx�^�m0?7�F�EmBF��C����U�������{����2.������X��c����Od��j������55n�����������������_pgbh��������G��H#����k.t������~�����`?�gY?��R��t ��)�;\�K�:���;N���9A*z�
��H'�]Y�pDA�":!���My��l�9���	�#���;�\}��	�W7}W����f$�3}��\�
�h�����7�w�������E�f�5���O�������pI=U'_���C ��	z��[��>�2F�?rH�vs]�iv=�|�}inz\��Y�\������t�~����r�w�L�������U��b���t�%|g�����%��f
�����p�k>%+��w��q�
?����Rc9n���A�cy�^�	��9���c>��k9;|���]���:^D�b���I�pX��a��(���8����A��ny��/�t���`Q���qtf�+��X����w)�?�!�w	���N-�"��n�Wz�o�"��p�aWI�r������
�_dg��e�8|���A�0�&K:|�n�
��a|��n��$2�����V�0p�)E:L��]p{ X��l����C'�z��)���kv���Od_�"�lH�nz��a��~�}*��U���	�G|0���F#M{�t�p��!��8��&\M��2���`a��-F�C�`���#o�"���{�����6y�"���[���p�.|IK�c�`K���`��l�����Cz��W���lm�H�nzT,<�q�	�Ca���0��U^��L:H�^���F����IO�T����)AV!^�(��E4�I��#,����vT�V,v��`a����0�lO���9�@Rn���idX���;�2�����>M���D��F������Qt��#��7M�������u���+���
:���`)�X�w,L�?����;�*�$�C/��
�������/�����<}��)r���D�w���wT�����8C�J���pj���O���z�������N6z��F��I�����9j���AOX �������O�V���6��4��>��
W���^U����������]�����@�p�)����,,��_��e��� �h6�7f��Y�T�d�J����vV�"�.�����i��I��������Y���.������Vd�����:tD��D���!�{��o�Y��k����7?�8�{���������#�YX�X�����baz_���|��5r���S����%����K�������_���l'�la��Y:��D��+_�a��o��[(�o��7�/�����+��N��X��tE�J���.&�[��7{�a�����a��m�b�	b��L��3����^��_4���X����UpfY�f�{�w�'Vz"�3����~_E���]8�������8����-�l'X,]�w
��?�iz�zp�w!���v�����=o9���d�V�P���Xo0��f42�4h�J���W8A���<�pq$����������E��v��s���,L���^0�4[��Y]	��:oLu.��1��:o���O���wW
�����w�3�A_L�(v��V��m�����Cle�����*AL��V�������^6)\NS��9fE�����7���8��3��K]]u%�����<�h��zd��Iv�G�h>��4���Xs�����V�����`����==K��u�Eo3�W���#��l���������f�|�)>�0�(�<}���=Z��B�h�����f�{e8�0�$?;}t�<?�^O�����D��`��&Q���O�����A/xu���_3
�
����7���a�%�����Yk�X�	?{����gop����X�����t����u����S�k.�A�:��/�Y���YYgXW��q�(��[jR���M�p���5���1;��."����Y���\4]q�e�f����9��nS������r�M�Op�&:��N�9�a�9�{�~�����`�Sb��Q���b�?N�]h7nv�7�H
����T����bQ;�k7
��;��TW�:��n���CfN�����E��aF,4�����
��W��v�7X6,;;�����S:0�W��bW%�`%<�
:����s����s��4�C ��"�<�i��������9��bg%8�Q����a
�l�R�1;��A������t��`�;�
����Wv
�+o��(hz������`i*Ql����H����N��i4�"p�E�r�L-��.�b6	�
f�4n������\�X8^�k�����Q�1:a�!�JS�U�
.��/�`s?��R�����',Tv�a����������i�������d���{��l�`���L���p���t�0�
c�`'��;
;4��sT��0�t�/���U���RSx}����+(�,9
�8�YDE�s���P�'���t����M�
�6�^����V�JuC=�0n�_�9M�c/XX(s8��d;��l�p+^�\��[v�}���`o�����mM��E���Rjg�w��	�����	�����S����`��^��u���A�r�`/����sX���gin����n��q+�K�����g�}g��[,���%����+?4���(�&��pa&�:�6�d�l�����1�@��'O}g'��$Y���`i>����Y����]t��|g��4��L6}�O3���!.,)��,��"8�;��V�5l�����~ta��|�D����`�E�;���J"�Z��7���� �����SA�pCNl*�;]�cT���u�ra4�{��.z���F���b��d?o���)���F��<b�6�W�1���u����7�i��f�W�5:�x��\�����g���k��/��q��>�WqYe�{�:����7����n��������� ��
:��B��koV�7���i8G1�1������*,����*�����w6��N���M��������:~brv�0(}|��o\���qa�h���e}��|N�*l2\��_,�/z�0�,kEi�c���q���6z�a}��XV{#�.�Y
������a���BpY�~1��h�����_d��KO�9}���%����������B��e�������A�Y�
O+J{���i�nO���vga�X�r*�r0�e	���+�'���� �7K�b+?��S����F���e>}{�f{ib���Q�!6�4O3��~q��g�3b[����������s��i8�1l�Yt�����:&����|.�/f�
�+�����1����Y��p�'��Z�(�h.��/�V}������q=n�~����bn��U�yd��#���������6�l09g7<�����0��7,
+���M,�xH�]O^VR�&���]�.���b���Bs�e�u��.h�[Ih��}��1�Pb,FW�h��aaR�Rr��K���m���p,kx�n9]�?�0w��`�F�7�����,{�v���?t}��R��
0<.\f;�V�V�A���1F�w��;g����GDw���o����:`E4���U,����^�M�k�����Y���:�>W�t�������G�^�_0��L���p���:�f�42"��L�(v��o����������E�?M��a�8XX�e6�NNS�p�����O�9�`�S�{�
~g7���������
o~�[�]�0���"���L�]�-�7w�t������tkW4+Kc�`wA�z���E_0{+�3LR���)~�M�^�m2�x��Yr^�1��

�����B,��:�����4���Z4�/dhf-�b���'��v���V����^����Y��X���/��H}�j�0_l���f}�������#��F�B��e����EWZi.{�ag��
�`a�(����XX�[I}��n�7|f��P�iO�t��X���Vy�,J��9X4,E��)>]� �&�-�c��[����4Cb�5�|P�i8��rF�a�����3��"�3+�!�k��m���:"�m��
�%52\;+m�,�0��e�E��c�8�*��O~�q���r�V�MK����J����
�b{Z�������T�`�3t���i�x�,�
:'�
,�r��p�t�){�Hg�����u��?�Al���.�SC��)�����HY�|�/v��2!�s9�C�|���0��~�$x��K,i�`[R�
V���m.��/��c������:
bbi������R�n���h��]^ix�����.����������k�`'� -e�
�\[�i�d��`
��n��`0l�Ed���AWN>�l����Z���=��+�h�;_�U4�I�\���e�����'��
v��{��
=n�������M��4_L�,z�E�L����qS?�p�'a1�cvN��,;�`up�~�oR���nR��-e��I�����FM����:���������f�����KKr��1��:�p/��5
[k%��l�YJK]AO��F��������F^�a�ca�r8���3W
K���8���6���A�X�W���D`�,�,������!��97��������F�n������A�L�q�v�iz=�pb��F�R%��6N��a���\�X;|������
����,M��z�;;��f�7\�k��B}�"�OL�+������_�~>�VZ�x/&�
�K+�%����,���LW4<�E,4�:RF�t��`u�\��R����t��`�c��hv~gKIo�t/�o).\�=�%�S�+X?�q+-�v�^��+��w��(v����X�U�����;|�bOy�SM�i8�@�G4hx>��I�`y�n�/<
E�f['b�ZC(,_;Rr�4C�3���yO�4�����jO	^���*b���0.������f�������Z���Y�;bb���G���G�����(:����#�������{D�,�o`$��v2�[l����R4���V���f��ba9��Uz��]� ������w���K�����6���Xh��jI�_FW���n_qg�]�'Kj�m��Clg{������[������|l�w6w
�.��"�>��T�t[��8R4��[i��6w��*z�Y�
G���(Q�d��d�q�w���E���=�����9
�P�	�E�������bsU��6�2u��������������ey�VN�4wz����g'k��SD{�Ml�Q�`�(b{*�8\�������{�bo�M.6{���8(�����m��e�f�Eb7L���<D����^�[!v�������x�l���nv��{���`weImvg=��a����s����:�BS��VP�0��d.(,m����g-��B��i��]:����K�W����T.m���l���u�p�Io�9�����n�6<lM4]�\���Vu��)�p���])�x�^��a��h��k`��-v�qOw����6E�V�����W
?��;��Bin�����l��u����������t���X
��V(��6�wfb�7���~?������4��Z�m��K4������2���
�G�V:k�
����q�pK�E�F�Dp6�wfJ�a\,�z*`8]��M���\lhd��|W,Xh����S�5��>x�F�I���L�����=DlV��.�������`g�.8]��t��9&}8*`�E���2��u����T�����������k���L����N�����$�N�2�������PaN�{nA4�O�������c������;K#;]5������H�[���K�a�[4�z�\��~��-$�����A�F<��B�m�fSl��F���Lk-�:�N�n��������6Y��a�7�������7P���,|���
�����s/�}����E����>�c_y�a��\�)�<]�
��Ro���b]�bKi5���Q'�+c�������1*}1���~������=�p4|U���N�;]��U�s���\�m�,�][�Mqy�"����4�Q-}�'!��0��o��J�5���'�n"I��v��G�t����}'i�a~zII����d���%���ivK�v���Bz��nT,}���6z�Y���w�e��Eo��J����L�
�Rmi��.���x�p�6������pO:XX�tD���69M��=&8
����)�p�T+�i�+h���-���c���;S�r�
�A�j�[�U��9���q8u���f�YHt�TG^��$�\v����\��������t�����}����E�c����Y���z�����A���`i����zv�M�a���o���p���V,����|��L��zCB��`.����l�p�!hZ��p���@��VG
�����~�Tq��s��:����wv�H;Xxd���I�[]�{�>B������K��)�E�[9/��!��C�4L2�U,����]N���_$���2k�]�Ma�����q�_Xh���~G�4{��`�4�a�,��1���,�em����q�j�B��Ck�.���`[d��(l�a/.�����'�OK}����Y�YXl,��.�N�-��P{ �]K�[i!�������}��/�w6��O���~-�����YK��J}�
��a��pA��0X���d�������2����.-���Z�4�c ��(���mp����W�;.������m��N������C������4l��+�;l{�[Wa�����:
7<����F5�l,�%v��M_s!~6��4
�������D��
��^���a��`U��Y"X(���E�D�YV6f6����=�p��\�e��X���SNS�=E(�=
y�a��`�S��+�����Rx���I����-v�������8u0��i���t�����"4eT�m���A�:��1���bw!�0�>��)����aq�`����Y�b�r@�(s>,lL�*��RN�P�qY*Y�(�4
Kf�9��A�$�)z?]��5I��f����Ux6�����]�5r�T�"LR&v`�],u-���U�a�,l�pG4+�
6oo�bD+W����v�Y$;�������9z����������P�+:\��m���t�E`�(h�8��0;r�����m:ae��[e=k��`Q����(�v;a�l�<r�A:`��
�g�������
[�!1l�U�b��fY�������sG���A�0�Q��������& 
?b��%>e��bscH����l>L�&���P���/�w�5r�@J3k2��q6���HE/�tl���J�a�`R�7�x�5����R�"��D��k����tD�.K;,�0;&!���l��:V�W�D�a�'�dM]��
�`G�@�a(,��X��.4�kA�w6����L�v���������b���?�������c�;D��Q��9�`���b�j\��lN����>w�5��1��)���]��-���qs����?,>L|:,/-2���oD��`��Hli7�������a02�%����$�����P�/zU�����=���i8�Y���	��������]E[D��
��%v�E�X�[H�Y�9�6o�w�����G�uN�'��ln��[��X�
y��|�I�I��=2cp�b�B��t�<�T�|�$��5�agQ����E���J�	7��V�|\��(���~+kwH����P�'��'������m:�`�S���8�
3�n��wOS� ��ZE��<������-�w����"�0���B��h���-y��No���kqsu���"���N��z��/����7�=~.h�oX�6��.���N���9������[��j3����5���L���I�b�Mwn�������[i��V�
�q�b#h��^e��Ku�{��*�����NQ���{��y����&��?�N,�Kz��^{X�Jw��^�slz�j�k>b��pv�^�v����h��
����`Kw�PndM�l�VD@������eQ����m��,Xx�����C�fv�.�[�}���l`���)�q+�m\`�����m���C�z�D�F�����7E��)r��*�7�	��e��pH��Tw����i�B���t���P�e�V��C�����Vr�MK�\.J���G�o_��]:���9�a3XZF,�5nA�<�.��%h�[	�Uv��.0��S���$���<��`�"h����������A����'�t�j���������W�#�������� �p������Ag��wvA�E�t�Kc~�o� �ac����w0���m@�����m�z���i/��������`H�x������R������[9pX]<�$G4\�X!\���������p���x�.i�a�j�/{{h\{����9(��5�pyl+�y�^.yq+�`{q�pFta0�`�'h��a~J,}E�����1m��-�+U��V����E�����B_��-_<na~.�Le��#6��gw��;�f�m���hX�-6�+N�:|�����+"�BK���U�������B>cZ�OE�T�qny8�������6�����F_7.W{3��Xx2����O�v��������;���B�X���%
��e���xM���io�Rm��,X�Y����ob;����l�Dl>��4���XjKtE�2���W��0Q���x��~|�m���?���Dl��h��;Y�������^�/"��]\O#6�JN�� ��D/Vo~����	���}�"n��A��Q�\��}�i�dM��Y:V�Jq��J?15���b/b��bS-�i���3��]hcE��h�n���p���x����0��tg{�0�n�!�����5+/{���e�65��f�Q����9
���m��f}�b[�q;�����k�����O��sZ�;�%K44��e5B�%�n�w%�i��d%��a�\��B���x��Q�0�x��L��{���4E���Xt>h�;{�'�t�c�[D�x�ly\���w�|'�����$vli�b����D_�P��<w��N�"+��	���u.����H�)r�������b7�����mf�x'Lv����s��n�p��.M�#�^}����p�E�TW4<�T����`K~��N���:����	b��7������{�b�K��@��t�:�D7�n���zl��r��U�m8�m�'A#��6�\����������	yE_0��T7�N��h�^�&�$�e�)bk��[��\z?�m��	.��I�`�R������B���J�D�T@p�A��6
'&*�XU�����K�H��7��O�6��ON�9��U
A��_N�9b���7�U�nV�g�!<a� �B���w2���
�`i-F�0�
���V�N��.�w6�N�ez�������W��l���&����.V}o�y��v3��O�-��CM�
K���+�0{��������	��s���`/�����uW������!cmL����d���R�fs��;�����2I���	s�A��G�lJ�.�a�������9X�����Jk�����2m�*B�f��`r%X���}*�h?�/,�\���v�Ak�
O-���8��$�-y=-�������<"X�;�a�Kw\)��x��k�\Kx�K}�p�1�|��w������
��������p����4L�{WJ�����$�\���[/��P�t����W4J�RH���F�	C��[����w�r��oXz����y_�;���;�S���u0����;F�dzJ�P!-v����������U��m���M�@�g�t����$��
��M�|'2��[I'��;a�������Ug���t����������i���_u�_YQ�[�n��v��n��y�~#�_H��V���N��'�p���$v�US��P��,���U��0��x�
���u+�/5��P��qS�u�M]�%V�*<mz��9W4\q�a�/�+�4	v���)�s�^��mF�.}>'�,�J���v�OS�P�+I1[������D���`7L;j\�o�kWZ20?�u��_X��W�/�I-��)r�YA�05/?-��h\�R(/}����N������^(�u����UW�Ev��#�Eo�����U<X:E��?�W���6�	�'Aw:��6���N����I.MW�����u��X	.v���._Z���a	��x[��.�Q�T	z���`����a��'�`x�h�����6e9,_VO@
��*��?����a������,/^�����h��E ��[�<aVG4Lw��������4O������E�?��0�;�R/��6�o�*���X���qY>J,�q����l�^L+%�b_{��m��if��#Dl���l�^,v�5����U�����e��bU��s4unz8�e�X-�G��nb;}��7��iz��'����1��%���;
|.��,;x������[~���)����%e]�b������Y7.�������N{�:�3��m���N{1��iv�B�C$�6�6�(&��&�i�^��P,�_{3���M��)r��</���^�
�6��$���[�/f$�a�&8m����k��:,_L<.z����r��\�,�~�u�)�>M��c��'����pr����;K��V�W�]G����|lGP,<El�����~���E_bw�czYw�ID���f�������f��
������W�09
��	�"A_,��c�7X�d[�|.�����Y����,��m���e�b���i23�Q�b���[���I�{����z���
^��"6�0s�M_a�LFl��,�{WV	6q/��+:gh��7�z\z{�tP�%���{����)V���"~���AI��L������7����j��f���6m_L)i��"�e�,b/��-q�k��6�/f<=��Jl>��t�����V4��;
.�e�����A�CB���A_u�	gY=�`R��p������>���������s��w*�^�������o�A{Y�����
_	�S���i��]:�����i.��ux�2���Y�����������:��%;]'��?���6�7+U�`�5�,>M��Mf�
�^�5�
�N�l��~�e[��Ao������+f�di���`s��iz�����s��
��������E�=4���8�])��|���p�1�d����-�����`�&iy��:
���y&D��L��Ku�D�YJ{����0z��w��+�����:zb���7,�����0��
W�S��_�5�c���'�
��e'���I�������E����R��j�RzZ(6�[��i8G1�c_t�7;��`~*%Z�����_�����%��,<g��`������Axq�����K�Kx���:�0�#I;,$v$y�iz>1����`���`�B�tx�
�*/ G�?.�����o�o�K�g��=
G>-k�|@������\�z�T"�6_��0��&��3��J����lg�8�6��_Su���.�8�
������N��8��=S��4��	�����=
�o3���V[��9}��7XX�a��-���a����W���Zob���]���:)��^x���N y���$�����hk����M�B0b��b�q��~r�sn�y��n����|���gS�sX�(�zA��_�[J�p&�{����:���u{���'�����]:���R���h��Pb�^�q�Z�I��|���{����n���������'m)�f���E�e�T���,'w�%9M�c6�`��"f+��mX_��H�u�������%��):I�������K��r��l� �e1��b��k�~����V�V��J��"����|{{I���`\��H��V�A��/X�"�=o�V.�!*��
��|�XX;��c�c���*|*'�/&����Ul^��.��&�'
����`[�V=���E&��;���tk��bt��C�-]�ivk�<]�����pa��~�����
���:`����a}��Y@������l6-�f�1�����l�5��n���q+�w��l��R�=ER��e���L+�,
��`s���R?���y�>��s<3����
��5�����)�����u�4�.:��O�9�`Jy��p���%�����p
/�:}b\��tB |��Y�^x�V�
����>����l��������<���mw��XQ��Y��u �#��
��a��y�d�����������D��nK��Sd������NS�<E�/"�9�M6���^�T�=��Ol+��n��a�hXkq����bss�w�a��b+�������ECA��Yp�������#:��X��������'!�����mY��d��;[�����q���;{:LoK�o�`c>CQd��Tb+f���u��o�����X����������=�7KE�������t��+�-�fY��J>��r��i��vV���f;�b7l�m�s�o�o&<��TO�9l��A���A�]h��-���N�h�����P�`i�95t�"�^lC�G�K
�w�����f}Z��oGl���p�������)r��x���	��P�N�wJ"����%sD3A�P�'*v�l����Y�
���a%��]yv����]�+T�b���w\(�������[t�1W��*�t�
X�����<
�;L�
����B5�m�u.<�8\t]�P�����l����3sb���d�vS��M}�M
g��M}�T$�~�����5�*��������������������X�wy��;L�-�9��m8��i����q�2����=M��	Mw���p�)�����)r8S)Aw��$j]�$q�����]���`/�e6�~�MG@�p)��H?����<.���;U|����S��0�#A4�u���=o�o��"�s�������	��'}xbd��"v�b��Q���w��"k]�_-�$����m|��|����;5=�w1_�Yp[����N�(�l��6���K�W%(�[�-�}�-�V~[�|��T�p(�sj>]��'��#�fDO0�,�t;+@{�o�Q��{i�m�q��.6YX_�Y�"�9����j����E�7}U��n��JLjQ�
�!$=������q�R"Lz,:��O�9 ��qAo��%���\��U����X4-z�&��6�8�/=M����OR�`���@]5�E��
�)r@3*A�J����n�2H���
��C�8�8D�!29�7��(�F��^;���]����4_��lj����oeCn���>h��t7B���6��Ml�|���!����2��.9���c X[>��
��q��u����6X�.A��R��r��AO{�a��]�c���5W�b�rI��aa�� ��-���:���$'X�x�e���t�K�Y�/��y�����v��#!v���B��e�e����V��i�������U��m3u���8�6�0����V^@��`�2�]zt��U[��+��1����	��
+@�2���R���7s<��)�;
�o3\
E[bg���.��f��1
�����������*�)Z�|����,}����_�y����[���C�
38R5W����JD�! wq%�h�p�N�8�>�������V���]��oX�z��^7X��2[zK;����R��i8Gp}t������H�����UJ�a)�����*3n%�g3��<}�s��0����lV�����3��^0����� ���?��c������Kc�������r}������~���{���N����/�a�e��_w������������b(�^oXW �+,���~���n��WX-4��d{�)c�[i�u�����ZL�6�9��~W����)��Z�~4��H���ml��D�-�RO��C��O������Wnqj>���pA������SE�v����#v�R�^����������#�V'�������%�7��������`7����/�i��q�e����T�|��Q+�����a��U��l�@7�	}���yB��^��n;9��iz��M�u���KE:�����p��������-���2�Ga�u��Y�@4,�;��X,����O�+.�����������O�=��E�l�a8[�"@4�x{���p�T��Y_�hx����K|�T����Ot�|�m�_~�>��������/���w_ra�}[B
�'[;�-���m~��	��b��p��1���W�:V���$�f�m'�fN>��l>��%d����l�.���/D/��%�17�������t��)���5x�f�1�0we�m���<���.���p3��hh
���������s�{���D������
�b���Y����q�h1}�O�������U�b7���mp.�dA�����)�9�`j����qY���]��o57k�������.4l%g�'�z���5XVle�PJ�-��+���-�+[o���l�dga[��B����4�0?�{��&4���y-����7}��Z��)�o��y-@��>�D,T�z\�)���|URv�nx�A��)�/�-�m[O��u�
{�K�E��Jpls)M
������^YbY]�ab2�|�i8�|���I:�
��G0��P)�����%
(+�1[h��Vy����
�L������$�����C4M��8�0���~(�r���u�����^O��w���m��*��[k2�V*[l�����)+�Y�^C�<�O��J��]O��4���"����@t�_W��O�������CE��u�f���R���^����p�"����l��*��8��P�>p�eyh��u�����/��n`�*������g�����j�m����h.e��b*����;?����t�^�N40x��I�Yx���T4�A����������`���4E�`�O�pe2>�B,|dm��[�N��F4�
��pBW
�������n��4<�\lOy���:�b�P��(N��F���{S)+�;o����u�G�(RV�0�J6���|���������>��N/��+�5����=�Y�0z�f�e�����Y�pw\����
�������;N�������2���<6��T�ji)�yI<
��b��/��x�w
��C�����t��`qc��x�M����:���u�Ca�F��'K�'>n����Qx�h�u��A�Ku(�k����U,����������i��^b���N������:�`�R�=53��sH����s��i8���V�O��l�E������n��\�^�N7Lv��OR�T�,L���a�x�W%�k�k>=��p��H���5V����jXZ�)�*LXidX|,�z�5�XX�\���Vv�Zu)Z����	|�z�
�|��2���	��`��Dl������������r~g,a����g|�):M��/Xh|�{����b��;��X��'�#}}�qf���V����=���r�"����~=b�;;a�L�� 	���n�N��r�������]s���Y��6X��T������ �	;�����`i���q���0�t���,��po@4������k��w�ws�
��[���J1w���O���`�e����i��J�-��c�7g��RO��^�*X����(Xxn���p]sEe�1<C�4,���NHo�kTy�8���HA�P�����}x����^�`We���cZet�ebU�f�c�#=���L�r��iy�s5>oX���i�`�mF��aO��(6v��L
����6�����)�r�!GO0�:��N�9�&��a�[�T)������,�w�"�y�ab-�;�?��J�5{��X����~ �K�7��A����Xs���.���%6+HO��|��	}"�5��,�b�f�w@��j��N��&v*�k��/�>��j��U
���H,t�������d�b�D�4����>��;K�{d�������Ul�)Z�"�NX����l���X��,��O�{�@�5����f+}�l��C+�����=o=��Y���	>DQ�\��zl�o���[��w�)�>6�?�u�4{��e��+u��Rp�/V&�����Bv����a�r�-�gO�9�ayc�,�n�e�.V�)�f��������X7��n#��%R�.�j��l��;Nm.�)r���f�X�R{�v�1�}�7��iz��5u�k�cC:E���"?�e�lJl%����0[�h�}~lW���SJv>6�?��u�$��W��������E�+L{�>K���Z�V�*&��vV)"6;'N�����E_��*��d�����K���U�t�����pcXo�c?3{5;��-�������K/��W$X��o6��O�����EC����o�w��������Pm!��/���B��[{��0����)��w���RmJ~X�i����J0�N����"J�J����:�����Yq��	���h�t����+h�&,�&e��q��~|���]�����p�������:�<.}�����^���f�O��8���b�Nn�pQ�K���hZ�K���

��E�����ib�"GW]�?�Y?�g-z������#j����_s��|�0���T�:�c�-�oV�&6������Gl����6����E�c�?������.��wyl�~��D�Y�{�q���Y&k�b ����|�M�OLa� �y��~`�#h�-)v��")�a�T�\)������\��Y��X&6
{��^�S�qSM�iv?��U����;��D���NQ����2]s�����q.z��sm]�u��Ls����z{��0n���>���H��5��f��w�N���m������4U'6����;�MN����D��;y�a�E�����m:l�[�A��_�W�`��f��l�0�.35�#�b�1�
vN|l�~��r3�X��ZYYj���C�w��u�W�A��O],�%��������vix��ix�Q�N�&1lRJ����S�^�'$��oy����B��5�����H ���`���y+�9L�u��t��p�a�z�`;|i\�k\�(�rF�c�6�P��g������������
o����.�����,���Guq��/����\��������k���C����C�E>����b��0�Up>�?�!��i���5X�����>M�CcX��w42L�,71:+�6�?0�+S:������'���G��-T���������i����_)�0�lN����k�l	��:Z�>���F�����e��6����l�y�^�6x=��El����n�>9���S�u�.�/�����S�h��a��w�n�Q�o+�Ww��C�f+��p��uH��+m�V�?L�.z�o���)�o"��l���[*���:����2�WJ�lI`�F�0�&I:\����sp�4s.�be�_�F��v�1z����;��^�����a_�t8�J����y�}g[���f�VA}�����E|����=w�u��Vaz��n��o�K��[s��R���5�a��+����?���|������-�gl:
vNV~��`�a�p#1�|���J��tN�
�������j���������u��,K�N�W}�������
���y�t�t����V���f`9���p�"��qr�W�`�H�#]��K0��Y�83A7s���p�]���~,�)r@5_A_��}��z���]���(���A��y:��5�������Sfw����.\�;`��3xy����z�^�^�OM4�h��a���v���.������>����U|���o�4E���VZ�
�]?���C?��O����C5A��}���`���������`���0�"��v��
6
�?�h����0���6`��hz����
����|��iz����'�'*�FF����(�5���;M��)�OQ���s���2fsXt���������f��������@�t�M>
7=|�#��o��vZ��J����t&Oebn����C�����z���K�Ohlh��������K%g��X���"~W�"w�,Gg������
��kz�����
f~�����?�h{�4R��F;��aQY�Y&�1[�"4�h�`�#����W�V�f�����'�C���i�����,����R��4Ec��?	��n%h���y��Op5�F-�fW��O���	�gL�����2�f/�<	v~?O���F	A_0no����w�������XCA��K��Q��������3��S�[����{9\D��7�����>�7������&���vf'j+1{����5�'P�~���8�DJ�����G�����B��r�H�"=JD�m��6���:pC�������
��f����7)_	|t�V��r�F�[���lC�,f]���^�\�������T�l�����pcP/��
7zt���G�j;����0C�����f[�f[e��;$�3�=����S�����
��������_�>�:1�������aQ�������`)UL�J��; ��L�k�,]���p�8��}���N������od[3�jl~WM<�?"���U=����,;��lG��?6�Z���aL5��^Q���k�"��o��=��!:-�t�
w�7����a�q���B��p���Z��}�4��	��j�/������:�4��	�i_�2W���]��pD����*{,�_fTKo�r��w�.�{��?�\������p�����.qx������f���W��w6�\|�^�a�6�~!-X�?�������#����w�:=7����D��j�����n0�
v���`g��:���+n��a$���W�>�S���K��u�t<c��L�{��f�#���n�1����:��p�	�su�����n�6���q���4E(���4}yE������]:�A�u����7�����@2����`[e7p:��o���'a�|���9�0j��������`�X4}�<o>���.�^�:X�rXc��dd��S���6�������9
��~N������wWz�����6M+���F�fg%��� ��iX����5f7|���S��!�^��:���s7,$��?�U:��Py�L��E������{Ub��pfa$x���i[�o�����u�^���o=N�&��_u81A���,9UF�.�_fX�~�7��i8�a��������_W"��������(�R^���D�����?Tp!�.L�K����f��6���[�A_p�(����~a\��"�J����:���-[X`S��t�����������}�����,F����x�^�a�g�6��2���O�y�>��v4[B���r��0�����.Xwl�C=M�# ��5=�5^^��.G�8����}��y��L/������JH,,Pv�������v�)��wE�a����a�t���$�����������6���V�mm�U���1}�-�$�qa[S�we�u;J��]�
��g��a.0�	�I[��B ��������X��v�R�`o�rd��/���a1���NoD��;���}���!.��:	��lx�����K�4C�Ra�Z�����h��J�������EXxt���=�`:8h����N�@�4��t�md~g/����c���U�����������p{��`��.��h�+�f����}����p�D�P2�|��i8�������p�J3�I�j>���j��BQ�hXD&v�����h����<I�K�1���<�wv����YPi6�pN��/Z�)�9]j�����o�j��Q�4;m� �^,� v��yQr����DoK��ec��e��z��V����vy������\��n��A���lrn{8���Z��:h��6�y�,��>�����E���Mb|��i��-A��G�yiE�J��P.�b{v��B��,�egP�fK.�wj�<]�?�����6�Bk����Db�f�kc�����4����+'�*kE;`���f�g��^�����.�
����>�YV##6�[�)r@���7����0���������������aK�X��%t�"�b�|����?|o\�m�>�Y���=L�����eM�P����N��5�7���
q����56�l�Wl%"�e5�Q|-r"�&/|��X���^{�O3�8����q�7\���Bs
��+r�l��=��,XhY�N�]3d��������*����tz���;���m	��pXR�����^Lr ��bp�}k�$�ZOS�x�2D��>l�6�1'�h��������l�?)��>k��uH�*�D�J*����zPD�ju��������W�Z ���NP����l�Y����`W���Y����(�������C��	N����M�
���^pcK�d��
v�mY���`+��f�3�e���b7S���p��;�Q���`�QV���D�we'�6jx��hh
MK���:����.���G"��$v�o��9'lvB7&[=�!�1���t������y3�|g��r�:���Z��X��hx^��7������9{w��N��P�������#,lt�p�2t�Gav��0*�\3x����R��A��
�W���k��e�l�nL�+z�$�o9���:b��������0������fuwc�n��Iu���D/X%�6�
�^PE5������I���3��2��t����l�F�@������J,<�Il�i�`i!�U���0�1a�hxh���:]����/�x�b�veR�8k*��^"��d�8]�?�L�&:������B,,�4��f�L~��
�J��1���g���E#���X���+H�V
�,�n�6���GI�a����/�w��C/�R�`qwc�n����,,
���~��h�B�r�}�(�����g��0��V@y�*�o�sY����n��n�s��BM[����Y%*��N-*o��zI�������R�����j��f�z��|A��*&h��oO
����rh
�A�TR�=5��.��5\����Uru�3�����)[�31����P#��-������p.�	��`;��-M��j�M?a:_>��������%��$�,�o04
�����QM����3X����V
~l�o�)�lhe����;M����,���5���g�����a6�n��\�|{�*��6�7�b"��Omv�6d��oL�*z��|�p,\����_UGpQ���o���1�no3��1��bUGTLv�7X,�Y����1v�7���e���kG�4��������od�B;������_YR���z���
c�<-4��l,��t�f�}������k\����0A&����)�u�u�	���de/=��B�])�����.��-���(o05/G9\��&�	{05n�^��s��&[x�cg[8-�:>��$X� �y�����Q>�12�	���*����~S��azm�n�i@�n�=���T�,��>�{��[xv-�}��J�i��I��
�`{��?��C'�w4muv��{��t�5���
�O�/����=�Q�T��{��~�i8�"���EV�������`ib�����aS�����O���fMy���G�����<09�qa����$G�Vo�J ��>���JH)��G���e=�������{��5�P� �f�j����=.k��7.����,��G�z5�������
�K��T�M���c._t����f��>�QS��\6�C��hx������f-��-�����a��v�����R���x��'�]�[AlVN�ns�6�w]tg��;�5O���R�p�p0�z-��l�Ll��>L�M�������������m:a�k�ab����}�t�|��t�XF4���e�3F��p�K��J��~�[�;�bi`,���~���4��cX����Vaba����������+���E�,}k��=x��v��b{�X����%EO����O����`�f;�B/V�-v�=Q_r���f�qs����*Lz��u��t��6MD�G6P:���*,��t���?�0���_�S(:����`��l9���\�d�p+�W]�
��*����'�����W,<5Fl6�Mo���:b�r�t���a$-Y9}z����[Y�YV~1Y���a�0~
6����O���p�b�q�Ph�����aJZ�s�H��s��������������0������,�W.;�/�n F��v�����n��'b�����'���S�������W7e�k������������+�W��4�V�Y.{�/�Y
F����+uL7�D�6e��)���--|�X��z��^j�&a^S������<��|N}���)m8\�����`���4E����W����[9~1���,��B������V&��"L
O��=`�Ku�E�:���>q�b���+���\4�����+.NPdSZ�0A6�_��1�m�hO���+u�$��i�`i�V,������!�R��bk�W���m#�������JL�o�X�z��r�`w���q����;L��V�Qx
��|��i�;����a (�?�E3-��Jf������hN�z+:]��.f���?�Y�$��f�t�����=Vf/��$
�H��&C�^�.��$��%��W�S�b�,��X��h��!v�F*�3%lO����5E�����,��
�$��u��CW4l+_@�v��]o?��9�c>y�P(!v�7Q��d����I�+u�����"�����boX.����-��X����M��9	���!"�dp9��C>X�5_b�����6������������L)�Q������h�������4o.G:��D��`�C��/�%���C�pX������o��������g�������d��)�`W�]p��}�����;RnX����N��Mu��i�������G�W
O�{�G��NQ�Jm	�w�����_S�`���~!��P
,z��]n>�C���[)�w�U6���{����g�.���g�������#��n���C���\X�Y��5�����&v�^[���SlO��)r�������b7�W
�	��v�{}�i���WN��A�J��}�3[��-�����s�T�|0H�7^�6
+D���y����n5`47������
�i���U,-�����X9~��z�0�
v�����q���;V�_����s�����X������g^_�gQ���.
�v��^p�w�����u�"�:�T�����r�/�;
�]�_��5��R<
�~�%Y��x���V��$K�t�=�^	J�w���S��4�C �At��VX���U�������~w�M�Lf�{�/�+J�������,:Mt�g�%�U��������0��;�|=�J�`�������px�e8�I;`�����1�f�t���e�����<X,� 	v�)�k���Y=����8\l���Xi�a��,1qYy~����t+�kG�-:[cN�����������)(�5���	����;��rZ��
#�GQA�3mm�E�<�����`�lv�*�q������lz���F��o����������l���[��YG�h��5��kN��|�hVEwf3���Bs��./�%
dL��]([�xTVgl��+�M����vO.zw��g�����H�,��
|��p�u�,���K��`Ehg;������.�+" :C+~]���nY:�x�f�6��mE����������R�7�g��1�����z�o����
�Y�$z�4����9\������y"��I2z�T1��.z�@�u�9	v�������0D�/_���h��>���	fS��6��B�~����Mi�Y�����]�n�xg�}�a��\�}�T��z$�%c�V�*������������J��V���������,��M2��]�����sz�;����+���3�i�{�������6�f�8���;K�!�N�2��<�{�^����f��b|#h\V%�z�]i3�4��a`�+�xA���
�����Jm�6Vf"6/N�����E�����&+��.4������Etn�����w���[>�;����4����[��
���b�cb�IL��t��*�E�g�E�mK����K]]����6�e
���x�4���o���=���bUk�j��,t�����*����x1hx"���U9��G�v��;\��
�������5bw���fM�Mz;��4��6G���J=r��q��>��u��;�����4�������7b��z�B�k������h���<���q������D�6Cw�����pFb�gv����!O,�a��a���0[Xf�������t��+O����}���s��^��P,tB���*S�V���x���f��B��G�+Fi�A�w�w;�����?x����3��n[(Y�P��D��^��t@�&C/���n���nug���}�4r�-�����E��\���������;$�D����p^6jX�9v���n�5]1�F]y�mv�f]���dv�o�`7���5z������������p������`G����(��At%/k;s���7Lv��_�6X�-�ta�:��8��?��C���K;���n���8��������`�1X��tC���?+��>��	�JHb�rg>�
_�wX����<���r��G�Q\�}���J�1�X����Y5n�m��N����b��f�6c�t�#�v�o��S��X�'!���fu��K�Sa�fu�u�K
�pf����j�<���kZ�,�9��//���%Xhb��3N������a���������n/M7m��.����u��':��N�9�a]����1����t�;�e�)r����/�}���5n�>�v�N�OX����
� �-|3�f�b�0�(�3l����6�:���i���T��0�,|���L�2��f��l����S���f5s�m��������N�����B��K�.�2w����g]u�;����������t�C���V)2F��u+
aa�D��c��E����EC���\����X��e�6�H�K�6)
�gba�����-��e���N��6�`�5�n�Q�e��+
��w��t�;�-��K�'�==�nv;l�
��������,S���>�i���)����D!V�.�����ioJ��Z@(���_��
�������=��Wek�����%)�����*�]����s�;;a��,�=o�"��U)l��37��+mJ�����]�
���Q��!J���r7�)r8����y��>
���x]R(���a�����U���~
�Z?t��6Y{�;����K������9�E7��v&�t����Dt��8
�,t�
�D;a��\�`����k��uT�A��:�0�&G1��jX�4i����*8W}}N�*dE�u���K����;���b�*�T
��[���H���0�����������M�f�B���ba9�X(����9�����)���G/�-#6k��tK1�n,M v����e�P���B:���%z��"����'"���iXb����=�s&v�8�%��IlE�B����v��,�|��wvW>t��&�5]8a��:X%�h�����NV[(6UC�f��fV�$:�t�+V�.��ZO���0�g(���wF���ElA�:�u��&�{6a���P9��e������V��������D�<�w����N_s��yXF;��PBY6���r6�e���&�i�M0��hX�k~�/-�w�@�5���J��@����_�4�����Q�]0n+R��\t��5�*��K.����u����������Z�N�/3+:2��!�v�����/��h��,���7�yMSB��������	{�o���L������v���'A�\��o�cE��U<g��m�3G�������]����D�D[�7�jK\�^�`�4E�43����U��`T,�8��	�`sy�iz��2_��c�up�N�U:X������")Mgq��b�aI����7��F����l�����{W�e-g�g��Fe8_4:�^>��|p{���u������Y�:`2D4{��J�������}���k���:����ix�aXe5Tb�KhV�g�6�ivi�?f4:���
��'s��#O����YE���XV%�;���`w�Ip��:X���
@�����
�n��oO�iz�j��+''��t�5%�n0|v3���;u#�n�Q*}�"��{��~s*~g'y\V���-�R����)H�
�l��p�E,,V��p5�,8M��r����Q���#����.��w���\x���
����
[�
�V��+ZO�^)*9
����L�@���,�����iu� ��[4_����:��I��k(;+�����?���b�&���2Y�p]$[*i��e��}���5#uU�g�Gk�`Vq��g�����J��
�A�<!���v������r���.m�0]����f����e?M]3�d-�l?l��)�(\���Ap�+}O��`�9!D�pI��)�`��_���R��T����p�,����o�`/�(6���u�?�R�V���<��\tAG=�-L[*z���i8p�Q
PX���a-���w�;�q���A����;�K��`��+5T�����~�c������B��m�[:���4���?V�������� �p��{/�+�^��t��A����sH���I�b/�;l��7l�(z����d�����c�L�u�s��u$RA_���V1|���7�������d[���9�=O����><������v�����j�@sK�ivx������9
�0�b�z
�����(Z�`fX����v�"�O�����h�!�����Z�KS\����"��?&6gO���	[)��h�`�>hZL+W+���UW6O�y��`W+���E�O�t��E�oU4<J,���U�*+y^�(���{��N�9�;�AO�����Ol��&�[0����?^�I��.�����{X���F��g�y����f�av�[�4t��D��:�oU4�K{dX�%Wk�l`g���Or��h��
�����������V�v���}:_.�-I������o/������r��hM,�����`Qv�����^gW�2��"���d����� ���`�����:D�9���o=M�(XFt���~Y�O!�*�I�
_��!h��.�=��q/�3�Gf�����d�/u���s t��],�G�-t�Nf'��fYv��iv���Wa\����v`����	uM�������i�d�5�7�Z�����.u�R��R�d+F��y�Q���s0�������]�]8C���|��h�R��,|������.����7����[	b��;��m���������G�g7+������7�����>x��l��	���Wy��$y�Z<��N���Za�<wLDw�����;Tlns������i[��o �Y����di���V�S�E��^�9m����Z��t���?D�uM��f��������|mi��������l>�t���X#��I?	1r��sZ�SN�o�~��DAl.���������f]��M��'|��.�=����"zW-K����{�e��6�e"�e�.)��	��cXL!��,v�h"��&>���	�Z}���U��Ub�n�aH,^��O��.�ye�g�|�kd������
�]�:�i��d�g�w����.�������c�%�S��a8��a�����s�9V�lfO������#��z8�D>9�pK[��Sb��[���/b[��;M�?�p�e�1g'�pK��R-�8[�[��Lk���At�z���g�m��%`>�]���|�������5���p]l��N��O3kY}��\�fT�m��L�j���n���fcE��1��>E��Oo��m:b�2����m��������.�����^z�,�%���4��`nS��Rg����6\#L�*6�����q��N��i8����r�^��Q������%��{Yl����q������
�y���pr��Y���uF�����m:������$vU�Ymk�'J����@7�e���B���pu�z^�����,����mZ�J��&���%��v&���X�)rL<�0�l����.����k�����u����}z#����ba���MU��)r���d���P����b�-<[4��0��~�.X}(o���6�	k ��q�T6>���Z7Y�+�j[�'�Ou�S��,7�Ku�����oX�.��;��w��`�nJ����Uba�����0��"r��������%V��`#�z=��;{���9�����8�Q�RyXm;Y�����H1��u����i=�d�������u�O^�
��KC�`7�����V���s�.��"
��R$S����L�h���N�����	r,[�$���\K�#a*���":��C ������R�b+n>P��p�5	Z���?\sNI��F�	����0�Q���V>l���$�t�:X�,t���a���J�a���R����#���\H�3�]p7.���5n%�h�0�$�.���^[�x'��DU,&�R������Z,,g�)������W*>
�����m��mp9n�o���
F�*s�o3F�S���r�f��
vT��v�8��p� 
���4.��i���$|�^��'\���Eba\,�q��g���E�A�D�Ff�@����?�����\<a	���@�tm��?Q��3��u���x�����p����~��}g+g�Nk�'��0���m�����a�N���)����	��[�f���c>��u�&�T�-������8M��n���L�L�,���������-LA�J�����f��`���{�~!��&y��k�iO�����Q#����w�M�a@�
�E��o��Z<�]���k.����(�����B���
�%l[�?���u����wE�g������k�wG"p�$�0,[�}~�u��y��U�rC_Q������M��lO���9z�y���0����`/X�k.���,j^�j�4�*����@�p�7.z$�V�����	�����4����C+z����aXt'}LD�-C���p���{��x�=~g��b;�Q������\(�Y�/��=X��X�b�����SG+S�<E�6C����=�7��2C,���n�����=��Ro��{������Z�Cg�����[��wv�]�~�e?�bU��;}�*���������dX<L������������gX/(:;����}�Tm��'�23���X��,��V������
mD�����c��dt��%����8�;��Ow���	�E�B���1f�D���
�����,���Z�;�R���RP����xo��ph����~$��������I�E_0��t�����`+�q{���
�6,�]��E�Pp���^�--�������9�����>�B��������:`�g��Yo���0�6?��k.��.��a
�KC�`;\�Y�
n����l�����7L��U:�Ku�E_�var�����Y��>0���&;�ir(2����`#��gd�`*���,DlJ��f��-V����V�`��bw�jQ�����\���Zl��i?��AM�����6�%����,+��d�b���:.f0�pC-��j-�����g_�~E4\\�����lV1W����
�� H���T�9��0�k�<D����s��u����Ol>d�0nR�����-�>Mw��zK�}gG*~9��cc���=�����BR��Z�����iz����&X��6[I�Y)��R�teio�<]Z]�t�a}�8&�c�`���;����q{�"�^�q3�����zK�~Gs��ir�1�h��
�'�-�bu��������4l�� /K�a�%���5����"K�c��/�H�������m�S��n����rI��
�,k�;a�������dq?<6St.%����o%[��t�T��o���L�!��%N�t���M��az-�����+Z�e�~.t�8\�j��PG�V����/:�2W�y�����O~������c��}��G^w�������]:�`R@�
�!�ZM�������k`X�"�;��
6�X���W��d[��J�K����������$_�5WVv%��l��
�c���`��F.L��_=�`����%s[�%_�����1� `5�b�S��H?0t�;
������q��l�����E�%�L
��e�����;�����DTi�E��+0�J��5���tV�=
gSfr��/[�����f!��������]�,3�M��4U�����A!�����!�Fwr�V������`'�T��_����U4�!�{V��W�5��>�a�3��������
��X�4�F��p�.�4��y�y�����a���������AA/�9�J��v&.:�����3QE�������qO���NMk��)������^	�Z-�uI-�nZN�L��3�2�vE�
���q�p���'������%�z�t�?,�U���&��4S��0�/ef��,���W6X���S�n�[��[��I����$���>/���LnM����<���(�.�1�])��z������J��
�����<�B�E����������gk�=8A7��������`'�p[��,�l,�M��DW� ,�=���f�J+����������/�A������j���S�����-����Y-|@�.�v3�U���(�~4�B��a�����p�(���!���}����D6�����v6����O|����������D�+��08�f�H<f��pY�{@Y:���6��Q��������Aw�n���V8
��jN�H�I?�iymw�MdaY{�S��z�����0S@��V�����u����
���E�T��h�GC���� H>-a
�?�������X(��'.�n������q��+l��T|��5	Y�����K�^,�V,s8-h�O`CXtg�
�0�,3g=g���������h�e�}gs���T��
�1pM�[��w�����m�SNq���.�.�V��B>B����yy���������A����������,A�lA�vZ9{2���w)t2�_ln�vzJ����B���`'�{�
�i�n��@��r��B�W��xZt{���h�p7�\3b�|��1m���T��Mx��YX�9�9���ykByZ^��L�F��g`���(�e��f�}{I��`�Z�|2����e����:�K�����E�'�����H��'��D
��R��>���i!���QD���Xj�KD�����D���>f���'�j�ty#�9n�����Y�~B�]����m�?M�F.SI��~b)x�&X��Zc���*�k��������`���X��X,L��������'�{�X��X����(���}�M[�iy}���f����=2<����,�����N��iy}��[`������e��Mg�^,=�o\����sb���'��K�����=N��i��SaDH������'�V�Xn����L�m06�9��u�,��4�����N�r#n�s�bf5y�"��i����ni����M�h�
����Yu��l
������}��%�|����;��[O+d��n	a�0�F����q��s��i�l?�Hf���i��	���;/N����9�}TE?��lgInbgA�kZn|��A��T�,��z�p�
�-9�OKd��������i�r��)��;�S��Z�|2�^�����=.]�xb��K^���>-r��.�6+��c{���`�Z�4#�Q`��������iym���]��������8��[��X��&m��x>-V>a6�hhZZ4>����bs����Vp�P�U,���[4�RNKd�UX������z����V�s��a��	�+A?0LlV%��^�b���[�+��ay�t�[p~.h��J:�����b+-����������F����`.N����W���wZ~����a�x�9^��mp������-���dOs����4�B���M�����}Lw��qK��mM����_w��.�V��-�D�nNb��N,tbH�>�	�%���jvE�����Oxu�r���<�PC�X�V�������/���������d��<���}4Rh/ta�VY�0OVR���������ty��++dS�I���l<�h�J'����%�i�X�����B�iy����EX%���w/�fVh��vj���p>�`��hx%v1����(ax���aS�iu}�����������C9�py�e�d~��VikF�E��+�@�}���Pc��f'�X�n
6������<4���w�;������R$nQy��t)E���&�N]����p�
/����(��������`{��n�	�#��fe������'tSJ\����U�n@���O�k�
����!i���oi��P��
����s�����)���-�[�B�����a8��O�`�:��g��O�;
{w��=�OS���D�ES�_�����2$�1� }��8\�|Zx��O�j������	����Y�-'A�_Xx���S��iym�Ze����|MM.���1����^��*U������q,�5c���.%q�.�����I����&�-��b���{zL�1���TR?k%��pc4=�S��N�k!�	Oz	���d������z�����4�Ew���W7�~�H���_����������2�[*���p��O5I���_x�o��0�'hjh���j����rza�N��ium+��
���;������]6Z��(����{��.��?���J���h��h��V���Br��MT}�v?��$����Z1f+���[X^4�a����W���������	����}����x���T��9��B��N�m}��5R��j��V����^Y����{�-����^���
�Ix�����{$�7��pa�13�,S�����'.x��$�v����r���jTE/��bMB/f��e�{b[�>l���bm�7=�d�����+|����*�����Z�����f)b���ee�Bk���
��L��p�ah&#�0U�
X�m&����F��5[��_,�K4l--�z����e���j��z����04|
xKu������
,�o@tg
b��Y�?��A��s.X��s����`�#��.�g��t�]�U�X��h�A!�^�5izB������i��k`�v�\���������b����yzJ�{�v
g��eq���.&�$��=2��T��g���=l���~�b�b���[g
����q����h����~zL�{L�^tcy�b�����������z���X$������|���u����	M��;�C�N3��w�[
'�w8������Cz*����]#��b�Wh�jzO� �,U���R4����jaa\{*����N/�~�>����������H�7to�a\�)�V�N,7���@��,�Xl�������e����A/��(�N����$`���T�z�&�{���=p�����6l!�2xd�5
����7��N�k��E3�U���	�����R��������j�+�h�����^=ex�H����6�X���S@�����l!MtYV��f��A���������w�T���t��p��^[l�1#��t�N��r��Z��/���^�;K
�`+��cF����[}��F����4U[���H4|�"��*^�����������
�-�.��������|Z"[��
���7�7cI��]L	O������R��i�x�U!%\���;�������Q
���V,�q]Vd�Kv&���m�r���VF����/��$�����R�eu�z���L���(z���6�O�o���Q������{s7�+}g����J���4a��X��,�4*���<��+����������'7�_�����)m�21J�^V���������vzL���Z�
k��9R�m�X��f���~�X6[	�[�=7W�8\�Va�C��dXX�Nl�>�.��bE�H��t�,�6��}g;S����H5[�X�~A{:h�TnU������;�z�%]Sh4.����}J�8-�
\:\X�0N�
u�z���U��+��_�f4M���jH�����[�B�n_C����b����nI��4��/*���o�������+��V�_���n��E>,�o��0�(���3>���E��/���Hn�W�wn���I�����h2�F�3	o;c�uy/��r��/x
:_�N���bj��o��WM|eY6�^��\u�1��5<��LQl�!;-�� h���{.�����6���%������y<�l���O���H�-��F.��O�bb��oxn��a\Z��q�O\

����`{?������q�>�PR�o>��DvZ]}����������-��g�t�k\�[7U	���s�lp[�Y44�50��\
(��{�WW8V����M�5r�9M��"�
�A���1�!������p����bAwXe�������bJ��+B`n1�`�����g��a�-
�M��EM����Fdz��`p(�����|b�
DwX`���7�q+���O�`�V����t�����P)t�p>��M�V��(�������B>��z�D�������)8��&�t�a����$<[����
�Y:���b�`a�l���;��M��4����~���5o�A?PE#C_W�Z���$�,C�A���;���HR�0AQ,4�Wd[,C�A����<2�f;*^OK�/(��C�@�s�7!�@LS^�LJ.�%��E�+*�nK�ov�n���U�<�Bs���S^~J8��V�w��p�����N�5��W���
�-���%���y[j��0���4j�Rq�i����Z��:�[p�o�og���9��|�]��-��nk`o�=�`��nqYgu�9���D�K����m!k(S*������>ga��,�|��dY���7S��V�.�<���,��-G�^�K����6{a��0����.A������E�@���Y�f1�X\F��6����aE2�K���;��2�N�i�IY��6�4����k�z���7��=S
�i8�O��"��6����o�U���,�)6���+1n�J� �f���;}"�4mx��Z�y3��\�`�9$�e��-$n�Qo�
��$�}���:��F�F!���e�������}N���a!V�O�{��)
uhE��3b'����b��8�,����.���`+�����eokh��T�v�5�A��`�E��l9M�S�4]�g+��
��=2��{�|H�w7%A��z���A��e�7��vM�l�$�
/$�V����7K��@��G�lcY�b'}%�7�����a'�+�t�2���`����b�B���6��5
����4���>?Ly�d��).�V���`��������(����+�wv�qO�k�
����]��������I�:	���ml��%���������A�
C�m�2g���a����~v�6��}A{B#�����A���:
������fYHB���;���f��
�Xg�=�+�h����)���J�m��
3I���*����i_��B4}J	����%O��Vb#���%DO��
v�0.�?��Y���\�X;8�
}m�
i����m���Oi	���[E�{H���������/,}A���ar@W�����r��t0��l� ��\8����Y��h��+v��l�-EN�i+�M����`iT���XNOi�	^�����w���]���
�R�-o+�n��+�Aw��J��x7��2
o�b�E
���j�F���}c������4�f���a;f������k�s�6\�W��m[�u3�V�L!C�]��X2����%L#3�2�74(�<*�3���&$H�O%�
�/��|�V=�L��t�m[�t3�8�%���PVL��^��p>���xH��2���L���5Ky��*d1Yi�����4UV0r��=bG����%,
[(��%/��#fI�
�s�n0�Mr��P�%5�at/h�n�Snxh���
,}y4k>�S�
X����~��R,���<%|�C�FH�]�N���>�aa�h��
�w������l+(4o�qn���Eba01�I�u�.����7'�9��\L�Snxqz2����+S���V��/�~��3�J�f*����X*��l��)[��s�,��'���q[��M:������(��c�.x�.%E�!XX�^�O�kK�)[���&���<�lI
��s#��p6��w[����&i�Bj�pa����0l2'NOi�F������������Hd|$U������P�&�V�����LLtN�=gq�
�������|�2�G�7���9b��~=�O������azj����4UVL&R4����kI��Z���>)���>`aT%�:��^.��k�����q����v�;L�
zT�enx
&�m���� ��l>#�nK��`$[
pC#)����b�')���3��z��x����C����OI6d�h�0z�����)\�8��Yo�{�����<Sr@�~�E����	����gJ��?c�^��,����������g�^�m���T���v�{�"��5[���L?&��#��m(�����;�,~^�+G
W(b�e��������@�H��Q��lGefz����~�������	�\��'r+�m��w���tU7��~�@)��F�,f�g�����P��M_��~`Y�����x�"�w��?�F�7}������a�H�F��*��
�XD1�����
>Tiz����]J�p3��������H��t�^&����<�����6��%�B�}���4S[1(���Dn0��H�,|s��qyX��f�����4������Y�qY���9�����6��[�-�l���Eqf/���yv�m����^����CPJ���H�;�Z��?[���6&Pb��E���1OS�!��N�sJ�w�F��fYf���K��-$Mi�B�}�
:oy���������'��)"Tyim=!YK���������`�	�1�~+����s����������=�n����L��4f4���Y�$6A(���B~���������(�k�z
6f����~k���e��f��>��_���4KU5�~`��k���?�V�{��?�F�J�f������6�Pq����
�.x��'t�������+yZ^�t���.����
|�+W��wM��
F$Sfz}����`��Q��[	�U����
���@�����������}��m>������{��E[a�6�`�-�?�G~ �{h���j�6��t�9:�f|l�C�i���w�G&|�#vW�R=6c�T�������[����`��uZ"�O0���|*l���	�t���/�x����J^�c�����.��l���?��Jb6}���X�"�����\�]�`s� Y�>�~��?L��������������bOt�H��tN8
�s����ydb����������?���|%
m�`�k��wHj��������g�������/�E��AO"mR����=�A?��=�6�I)ML�Y
���8�W(�������!��z���`i�y�
��t��/�!�v*�6}�%�o
�,����s�z1l����N��h�a`	H�Y��;�:!����`sm�wv���iym��
���|L��<�m'�H4S?1c�7��R�W���\��
>~���Y���8�01j����&�J��F;l<AoJ���h�I��6x���+^�a{^$g�p�@��m)�����dg�V��"�����c������c���Q���������L��.X�!!\��,����a�_�Y4��B6�^����~^o�J6�2�������P�9���+��1m��/l'X�l��]��k��BBi�s��4���
���S}f�c��.�?���O	�%
��x����`^�H�s��o3Ty�Cg��ni;�G���)�;�����0^�9���#���5}�$e��ot����1�m/�l��h�,2�:KIX�/��.L��ty���;���U�$�_x�]���������af����SA�J!�����A/���T��lz�S�4a)�
�K�@���|�[a�(Z6��_����E�e�
����l��h�z�>V����UI�Y6E����=�K
��c�����q��)��B�o�B:��'�����F�t���w���jC���a
w��b�9�~��{���.(� Ugxn������NX&�e���m�Z��a�V�:��]L����������iz����-��EXF����`'�jh�JTc�j�Q�-�|y�[U�i�6���{�&�
&wfk\��b	l���,�MMx]�f�=��>���.���p���������P�zY.�b�6�S��i�����Y4��bv1g�g]��_���X�R�b�2b�����?=f�c�WU�H���p��C6��V�]V���b�'��
����l/����	�S|�%$K���������P�U�`Wj�3�����<U�2�XS�,f}�����G,������$����D��Z���R�XV&#�	Ue>6�3�v��6�e]����}��G
��E��[�_���|�/$hhE��� ��X�RST��������s���q�����^����6�J</o�ium=1I��[ �aAM��u��)m<�B"��� lh�;�����6��o_����4�
 ��'z��\������o���O�^,�!vQ�@�@�k�e�s9���n5��l.�;M����}�#���������9�z��l��pZ^�^,x&�f���}���r�����/6��iym.2qW���YqY
���������i��������i4���[4l����7�~=���P�Ql%������uE/���b�E����^���*���}3�e�^1�}*nv+p_,�MtcE��������^�R��E�^,�Vl/�V\��f}�M�#�;���������!��ED/�m�`+Mv/�J�d���)�N����.K4�v��{x`1�������p���6������%W���f�*@���7�f���V<��^IZ�4�� �+�������A����`��X>-�-h�Z+�x��c����D���%}�Aw��
����`���ZvX!kC_L+W�/�bY.�g
ob�Tl�������������}g�u����5
�H��|bY����$iO�i�����^��5��p@����e�����"���I���l�|g�����h_��
z��G��9�wv�������A-m���'|^����p���/xk�x7�=���������=k]�.��_L�\t���X���\Y����������7p�)�����RY5����>�6	�P}Y�<;�?�5p����y%�h���o���,�p����G���`s��iqmf��_I��7�������%����Y��h�����!&�t�eJ��Y���<1��_L_]t}g'�-��VX�`R�!�^�������Sg����Y�wM~����
�c��~��V�Bd��T��Tm���	�}�������,=v�N��_L^]4l.k��5�@��Sj�����/���:L���0p9�����b��*)�J��r�4������bI��I���-t/��WV�������@s�wvJ�/��_0�E"��.%���F{\x7
v@R�w%�`Q�Z�A�&+e��m�HZj�����P
@�*�v�,��f~.r�`
�Xo����z��B�m��4����&����Q�o������Ls.����ep�
t����
����%�J���B�L�:��ga�_����;K]���g�v()"zB���������(�m��8�_P�a��{l�dtZT��/��2++c+�I��0d$�b�[����;���J����+���/�D`�r8�0dR��4U#��
:����������X�����KR�l���5+�m�y7�r������m��������u�/�3�N:�Q{���4U�"�@_���1���{�?�-y"O+dsZ\K�;����m�4U���
�lK���E��!t;HdVgJ��4�P�]A?t������?uzL�^���^���%�BwG�F��_X\[m��^?
������j����,������E�/����{k����MM���N����%��>����e�t��H$�����`!��}b<0�����ba�W�Yd���6�L���s�6x�J&=������0�G���/�:����f���Tm��L���Wx��!�rxG
��������f��d:���6���WTq�V~1���j��}_E�h�����VI%|6��)�l{����&�m���il��=�����y���+|D�LEClg5�ba����]�~?o������Kt�e
ga�c�Y���D�K������ �q[O�f���3��b�`��B��u/:�E?��</����F��~Jde��bYb'�n�X���<t���o&�/�����6���
a�1���e����]l�}gs��w6�-�Vw{u�
��@a��f���cE?������N�`a����������o��/��
�f���Tm�1�#��eQ��mu�X��k������n��fSba��XX�,��a�]U��.�f�D��*,���4��u�o��'����B-
�O�g�m��,J�q������Y��
:��u�oxK�^)��=ENS��EW5l��{8
gc�����t����O�2A/�yK�M���n���L�T4����F_l������5��D6dX����7�N� 6�:|gxS��~!0[?g�|.<W,�%�a� f1���������pq#Y=��OS�)B_��'
I��%�a^���@�4��ft
[D�e*N�t�}�C�>h��&�����cb��K�� �v[���w���sD(|o-�����V	������E7g�����������D�_�s���0g����v����f��iym�@G��T�y���
��������>�k��
��%�s����$X��	��R�����|3�{��bJ����`h�l��
�^��	�����U���p7���N���o�j+z��=bQ���tb����cL#��hcuY�KT���_8�,��D���J����7�i�+SO��z�b>?���m���qYA��������a���aZ������Tm��]�=�E���5�j	M�,�G
|�{Uo���o:����`�B����7��@��D�+!H~�0�4+�C�
�KF���d���7�nI�Z�Q^I��V8lh+��Qr[����ivC�z�<���f�}�~F��&����4U��L�Wt����-\
-�}��XB��P,�.��	��������h�,E���,L��aM�{kg�����(g	�:�Y��(��J����7+w
O��2���#R����}�KL_����t���K�o+`V�R�7�=*Ak3�L�QtN�:
�Sz��U\IT�V�
m��'�U�������:�7`���X�?��S���1}6�RU�Y��;���
�2�&i�-tC�-t��u���>���M��������iAg
��l�/�������xZ!��L�U4�!;����V�X���9�BnK$�0GL2���r�7M�S�De��'`Hw^�J	�
�����r�����/�_h���*}��o8�r/t�K}^��6\yJ[@0_���l������{��hZ,:_�xOS�E�DExhdX�l�yuzL��P>@eU}6����'�L��@,���q+a`�����&�E��v�*�i:<�Uo��#���A�A���Se������7�?���x���a`~�`O�����T}��lQ��BS[���\8��oqzL��LCWtn������X�F��V���[2����bij��{�w���d
����!h*?l%�������VqXT���d�U�;;�f�p0������;�z��n,Q-��/=1�UwM�����
�	���^.)�B}����Uto>�z������������-��3/>Y���.G���-tf�-�{C�?�b�����f�ED�\�`gEN�2�7t���t���&-t����+�.Q�^T�;����z����6��+�M�����0h��
t�l�`���V)7Wj�V�f���O��=\�(mcw���D(���>L5Sl�J�nc�W��p�i���z>��������5�X������s��������F�X&�"�W��fN+d�
�y);�������q��%�Ji��%�^"����Y�b��'v�9�s�1��K>;����+�!�s�1��3�\�����������b/�I��������~L��G�(K���l��Y��1/�h�9{���g��m.	�V�&�B�
�p]�����������A�\j��\���%4_�N3�I�D��i��R�E���%@�c��ZPOj�mL�t�{���1�d�D721�8ba��X��O�U��k��]V>���6X&Q'��
m�j��i��}.�f�S��
�x�X>ngRcbs��i�l��+�����.o���{�Xh���e���������*��?j��
2��r�0R,�1a+�9��4U[1LxT4T�{��,J�R��������4�"�Y�������t������������������%bY?�9k�g���������5b=�B��J�f�}e�eC���F*�������Z$�Y[�1mY��'�-4���)'���V�m����,���X��},���(k�6��+*(4��rv�3_s�Z�WR�<-��T&� ���<kx��/�Y#���1��6x~�����a��u�:�0�G��`a�n���	�[9�i�l�C.�QqHYP�1A]���jd�j<g]l/�"�6�����%5���?�� ���6����~��Y��i��m0E����+)���G���1�������J�M���%���DqEw��d{i��t�.l ��/��5]^5����S�����`�A��iV��FI�z4gV%f�����`�RtrH�����M
P�u|���]�Q�k�nLX4Lt��X�F�Sh�,=���,�Z@�d�/�p����>sZ"�O0�4���`�U��	 ����J��q�!oIs4k�|gt�ve�WV�F��H�^p5rAQ�Yj�&�t5�,1�Kn0xt��y����i�6	��t��5	�F�3���������)����>
g3G� ����B=k��/T�M�z�\I��ocr��s��i8��L�Wt����>�\��U�[�h�nLXt�u��BA=�����
����4
������q+i(�Ln0Ey�e3{��B�f]q![��1M*�PK����`sc��c���iwC��&��`������t?�9���������MW��5�$�E_�,��%6�z����c�%)���tH�����%W��������l@��y��3bW��s�v1lz)�M4H�6kl����qOu��t�=$�R
�����3U���\�Z`���l�M�K����b�'X��Z��������s��?�<��`L�*�/�{��n01;�H^�Ia��a����hi����E��x�K���`;��������t�<-�-/�/$zU
U-��`��h��"i��x��M/�4L]W�4�N"�w�������npZ?$SK�:�P��j��&=�ea�P��q+�b�N���>������b'�u���	z��R9-�C�s���j]����i��R���7�w��X���nL��Y�`aZ�AG�4�a�����Y�I��DayU����nL%QtO��i8[O0�>h��L�C����c����=�#�^��}��d����}����~X^�p7��-�J-jd����2���`���ium-��a����W���
w��'A�Bk�fIk���5�[�M��Tm�@������8
g�z����;�<��B���.�������T���%i
_���A1�`a�v�]�p7�5�b����S���n#C�RR��f=���
�I�~S�����B���&���|,������^���-���
�u���L;R��������';��.Vgi���b�}2[�K|�i
��E[�Y�X[
����RO�u�l����R-�i��SE6�i�[*v�Wu���bsI�i���>f��um���b�n�w6o���J���������L�D,}�^K������qb������=R��0��84Rx,K���`���;M�6sr���bsQ�i��c�-H�U��<�������\��F.8�+D?��
�b�J��(K���I�K�4�B����!��EC��x	n��s�
��#L'�i8#LM[���H�8�cej	]�B~����B��.�e���}��L���[n��FR�7�Khd��Y��X�yH���p���2��������x�����;�i�>����hf���u��2OO�#��^�v��e�����������B$fKo��9V>���m+�����wzL�,=Vt�����i�>^�.�i��)6����������dV�r���HR��9<rA*��,��dqE/x�[�+�0��D��j�U�X.�����Z���qYb���7�j���R����<r����/�A/xK�b����ZV'!J��-�,���r��%���S��i�>�Y9���������i�>�Y9�
���1
�����0+d�U�-z�#=V/}�����,�\(*{�^�Kb?�f�AJ�&/;�V��c�����^|��M=�;��EDl�������E��Dl���G�z#�"��_e�l�n���C?H]|�>0q���\���ye��O+o�-�������N�G�z����+�}AWs��U�a������iO,�i��
�8(��-h��`�\r�L�N��xT-��0)�� ��X����c�p��V�	��*��Bu���j��x
���V��?�}X��hh#z��E���%]
��7�V���=
�������-!��m��F�������s��4��'�
���?��G����
�=2�%�R��Ym��#�T�����))����`�C�� C^�ui�LPl�
>-�m'hVH0���RF��z��]5��"��]���":�`�����F�$[I2�@���L��1���S���"��
%5�_D����_��*S�|+6�����A�3\�*��R�!Q6�BH��r����J�0L Y���hq���������&�����b����k=\�U.�&�[���X�az��i�k�S�������x2��K����[h��X�����S�������R�������p���d�[�5�g}.�X�1���	��:<y�eA��������c�`�[z����6��@�������K�����$�"U�����bE�J��b�w��E������X�G?��%�N�k��i��^��>g�W� ���?
gs�����|�:,�J~0�*7K�R���a�S��������w��2�!�0��/����?�K}��=�V�[�!��)��4
St���`+�Rk�>0%}q�/�0���b4{�Od[&3/5^��v�%�!��i��.hUJ���VDt���0�U���>d$[�;��&j-UsN[+�>�
�Fp��?��V+�4+�>����w���0���Iz`�Tm���f��fN
;X��0,��%,�����c�a�X�4O"�&$h[��l)B�B�� hK.nD��arzJ���44�50|F9�*i��t�����NS����A�2�[P��H����^<_j�0l�f�����r��������nU�����������1���a��mga���.�Ro��H���Ttv;gs'��lY<=f�c"kB�`��9��;[I>����LVV4K9��m�nEZXM&�9W=pAg�[��3AZ�L�Bhg�/���x�B�m�mg�G����4��p�X�
�n��,��q���<g�R�&)��?D�����[��3�Z��r�N���b���p�YC���/����O�B�������L,K����a��P�,"��];K
���|�G$�F���(���l�b�bS������:}�$\����.b}����n}����Dx�[�Zt��v�>�cP��|�3}V��e���:���Z���"%�W��8
��^�%��D6�f�0n�H�[(���h(&-��:.�7���;�����=��6���N������O��b�������B��F_��$+�4�siy}�3�N�B�~�,��7���*`	��a�N�P��,��,��7n��m�N?��dX]�G��Rc�%�������������[	�3%\����.x|6i�p�z�����^��v�#
:7����B�m�|o���q��kd��X6���6�X��������,�[,t��#����H���I4B+=��E�;t������k"����	����xb��m����.���R��w�H��og�!��m!X�t
tTb&��ts
oLA��[��C��#���1i^�"����Et;��
�M��q�/E_�5��q����:����S
-����� H�U17,I%�ES_H���h�[�� ��a8?�J	~��kg�#��y�[9�wj����|��E<-�&�'z
���a;K�=��G#s����-������J�eVs���p!��^�`�4�Y��Z�f}�W�����qa��+p�W�[�?Z����?������h��\9=��	V�#:�|�����^p�W���vx�
4xd��c������bu2�����������X��Ul�)m�1MZ��n|q������"
��<2��{�O�5ii$1��5cmX�St��h�\8,�J�u�;�qz��rtBL���q�[e��X�7+
4�!��V"?VJ�a�����=gs��wvVB�VJ���ExPZ)��io���X�[��Xe�3q��>�ZW�h�!��	:�}g��:X�D��F���$�N�k�	�����;��.��.}zL[O0�>h
X�C�����VbG�_V����BYt��J����;;R���1m-�k��@�55r%����Q��_f�7,�
6����&�w
z@��]S��i�6����h��1
����`~��aa��l�
����i��fzlbs8�4U�^�|���SiY��3�R�P��#zw��v�v*z�*G+�V<�0e�l��d8r`�W��0�b*y���Y�4����z0m�+Yk���\�9t�a���R
�5K;4�����i8�Lw�t��O�������i}�zxzY�W���
��8���&��8�5-��H�$�]0yW,��\��RX]�075�V�%�-��a��Rb���!	�4k�i�b�e<;���e�>���%l6#z�k�����~���x_��IUY���	b�]%��nu���)�h8�������T}�3�H�p
vV�K�k�04�u��(TZ�\#�sY���c���UzR]���t"����������%�	�����fR����� [d��3:�:������u�1m�L����[�B��+����[�;{�4��=�a�H(-h�������(6�����c��R�`Y�95���p���Y�(��LMD4����nNlc-b���=�P�
��2>�Y!6�=����c>~L�w��K��j��e1]���b9b+��D�[�f2��Y�V����cN?&��|k_���9�b���,K�;�n�R���4F��T,l<,�faw����a�R��&z������
bW�Z=,�
s�D��rbs@�4U�{��,�����L$�@���'���������4�.bb�td��v�$�
��`a������k���!�b�yb�����+|��R������|.hV�l^p�K�=�7��
[T���i8[|�
v�G	�jD�XlS�-�`g�y��NkN8�8\�35-���YC�/��P�8�-���>�F���o����Z[v�25�7Kt�~�>��@l������|���n���8����c���a�tx+���tS�}'_�i8[P��4����'����������u<����<2��#	��4n�<��.u���C�e�jBox��CSl�����`YS�}T���+U���FK�M��J9����<=a�&���|��m ��&���_��ro��x��h�J���t���V�	}*���R�K�f�!b�N������`�`��i8#��t�����+�F+�R�p�w!OxX�t��9����4�Ip	��p�i8VL~T�����KW�o�����62k������A7V� ?�z����3�57��31b�w�J��a�����D�la�>�Y:���V�e���>�����iti<7�
���f�������=6E�{"���,�����������~�����'NS�9����),�+4.��K��J�����a�Z�7K�K������	V��@DO&�b�I��`���YB����z�����
O<2K�;X���Uh0�Y�xD���v����	���O���]SOS�����o�f'�1�@�O��}��3��a�`�}u	������m>=�m x�
z@��T�+����p�z1U�9����.4�
�xU���W����O�
��Id�n0�Mj��2�a9�m���oVw<[LW4�
J��5.�'��$6�^���t@���YP�47
}��>��a(HS�-���S�>w��g�tj�\0G-<��$)_�Da�����7b-�c�A�L�@�
��o:�NOiC��}��G�p��AX,�Q��=� L3��}9b��!��mz���:-��'�yt���kI�wv�<4�o���������wC	��_�v4�E�]s����Y}������B6��
���.��s$�����J7-�;��))_�vd���x�0]�h=,��9>&P��lA�s��#�����������5_UvN3�I�w��=m�&O�i�>����U��V��p5�������a������J�,*;����4�k��,��I�:R�~��~X"������+����:}gt�{���`+=���m4x�N�HJ9�����&�I����^�6��k��2����=���sv�w�)���R�
���$����\b�V��YZ}8�R>�\�(����`���E���M�g	3Cj������U������Y*k����^���A�_5D�`h*��lvZ^��0C4�k��rk8��B��tZ!����w��o��,�L�%h���,�/����`��]��4-+��Zr��"4N��Z0����B�Fj%Y�����C���	,�uJZ}k�J��e�<p7��$�j�B��f��i�lg2Yj�,���44���a��~�#uZ"�0�t�@9
g���C���W������,4��VJ��JM��DC������a{%�����k$��T��SN�aOf����b�u!�b�*?0z��>���i	����������(�d����uydVK�q�%6'���y��p
K���}��B����PK4�h=�e`�*�N�������~L�kM?�^��5-���\>�//�������9/v��q�[��=-�=Y���l����7b;KW�����D�K��S!��<y�x;Q�;�i���vZ����S� \�0Y�_,�z
�h7O�pOVa/:�?
g��9�E/�2��f��PM��V��iO�!����X�kJM���5��=����25���]�����0+[lE�kZ�{� �����8�N����w�d�C�E�'+�0���f�4Q[�L�[t�N���ci��au�<o/��`�P�?-�
k�M�{���	��Xzly�����.U(��=f
��~�>=,�%�'�`��,T�����w��~g7��{��>-�MM��
��6�?�I����^���V���Z�on���/��k<������byF�8\{28
g���E���<���W:�V;/��V���	�8n^�)��)���'�����������Tm0�����$��B��=��7��O�Im�pX�.�3�(��`��������%��	=�A�Nb����-7��%9,���'�X��`�$��R��f���c��c��o��id��5��*�a9UbKA^k�OV* �)(mMk�OV�,���?-w>a�D�u�F��,���k��i�l?1YT��Ll���w�����q}��U��6�H?a�G���O�����+���]>X��%��{���E�'��}����p6c`x�[�N+�O�e���c6����cz$Y�f����5�\�{zL���tVn=
�������)��4��WV� ��d6�\p�Y:|�|4K���*���f)��U�e�b�������9�nL�R,�:`��\���V�0M�ym���}�>;y��X�\��z�����A��MP����7;����'���$�z���Z�A?0~/�q�l������"!�Ic�����`�Z��0�$X($vU".�;�t��a�
b��J:�)�����`�L��K��Y	�6x������]���;��LH4�:�������k�����:f���+�}������p�"��,<���I�f����������f�2E�&(�n��MI��D6����h�c�#Wj�,�>�I��:-�5,�>�7��n ���>��� rZ�}2�q��pYl��k�w�`+�����4w�/�����Tb�Q2���7�Y��y�������Z��B�!�i�?=�m/�<'� �2-�>�t�|g;��#�[Y"[PLf]4��#���f
S�4g�������������h�&D0�������'}�������h�o�r�~`+�������y�;3\�(UL1��T��>�U5����h�fX�: ��+����4=��:	q����)!wU�z-�?��i�k{���y�m,X�N��tZ���}��A��Z���#������WP��5���z	�����N�i
3�f�-�=2,���0ep;M�I���S��4m~*Snb��ML�����m!&,I���l���G%�p�!�����tR�0
>�+�������-A��l5���8�4GGAq���O��lm5p�`p[�\��q�0�(�ZB@g_�W���tK���8����`;����0sh�Q&�Ye�6������M�WA>����ZQ@Oe��6��m,&�Z������-�w��
M��4U���0s(�B�������7Gst�4S�]�Y�V�/,��#$�����������n��p�`���\vAl����~>���l�����[��1m���N4|��B���{�m�Lx�9�M�D�b���0��$��f�����E-�2��s��
��J�ig;�hQ���I��n��]�Vt#�i@��:
gs��}�J�`4c���{��1h��	F������q���XAt�$�[�?�o}n�U6~g���2����������1b[���,h��D��)��4�<.���{��������/���h��!SD4K5�Y�Y�{4Z���*(�/+��9�sU�i���������Mz	��Z����Dw��1�.���NO�����bUtb;3�<����f��wyy�E ��6,K�/&��,�����8��2��Q�B�)'�����Y��������������Ql/D[���a��h�]�#W�K���S�P�I,���7��D;,�����,]���x��1m���FV
4��}X��,���
���������2���JTqY��B���IN�������L'���b���0Z��"�b;��;���~���7^y�l{1�t�7s��e)��q����sX K�/v�U�O��a)r����8E�����&���
����������a�e���f���p�n,��~���0��[�XX��^���E_��Cb����\��X�{���������IJb�A,4�*��������������0.4�����e���j�M�
�.�z	��^�R�e��E�����2Xh�
M���SZ�;����7|4r�TyY�{1�n���
*n��esb+q�e���������(��R
/��.��/V$�������Lmf�c(�%�a��l��*x,9������?���}/X����x�ndY6�����~�&s��K�M�3�N�p��*�,��Xe�h��U,l��q�R�Z���-k�����}4n�$��:^�0�`|]lA~Ya}1��W�U���:��&��Y+�I/��/��/�}�7����]��^����.��_�4�-
��.�)�P,�/��p8L�{�@��F��*(�g9�����Ry�}�@7U��<6w�)������R�EV.��G*��*�'.H�-+xg-���E`��:�����N$������	���b�B��B���b�X7|�O4���������x��t�+Q-��/��(z������^�dIl��>-�m ����!k��a�+	'��^��Kt�{tWc3��G ���6��e�K��2�M ����K��?�t#�o.��
�z���Aw:U��.��^��.Ak���J-��NDw��/�bY�{��@B��El�����v�^�8��_�L�%�p�X�z�Zi��=����u����:�z�����`��i�>"�����R9a������|>�����o�-�����D��+�Od��2e+�p#��K���*����.4�~k�z��exa����!���R��a�Y��;�;&�V������.��H����B�pV�`,��`
U�P4]��xp-����>��z������^D�l�`���i�>��M4n���O�&c���6	��tZ���
M�`�x��Q)�������������E1����Lk�l�}���l�}�8��Z$b��4U�@L�Ut.V=g�����G%�����3A�Tgz��$t`,)h�w&X���aj�R3����V�J%
w-���YY�s1AN�P^Z,4}�Vr������hZv��J���pX�T�RY*h��`%���V!�a%P��Ut�N��C��X�&��l����b2��+^?��.X�t���H�S�V������a��R5��L��rn������t�1R8q�|�`8hzav����Tm?�����r���Wi���NF�k\�M#��`;}��~�eLR>-��.��.x
�*�k.�y.&�)�JW��p6
�R��!#^���1GM$uY��p���k��7���u��M����������)8
g��I����%��[b�wv$���~�m����D_�N#v�<-�y:=�����]o��Y�BQ<@W(X��;
����f��h(y(������\{1�������m�����EOVP&�����TOm^�s����l{3iQ��~���OsZ�����u�D�(+�u����!�Y
.�m��M_��YdS�������g��YH�����,�\�`�$�wA�n[b61��Y��T������+|W���xV20S���f�b������=��-s[�u��*h�1���@a�����{fSx���64Y���	7�K��C�*��U��U��Y�FY,��zX��H������,4%:�������4�D�W��X�f�4�;K;
��m��
���K�W7���f5�B[���x�f�@�a�Gf��b+�����)���
��X��B.����f��?N�z���������� ����
������b�j�Vz��N����5�j�D�����|��������#�%��
�{�2����pJ�-��L�����7&�Q���
�B�Z�OAg|[2���~
I����9��q�(Ub�"����Y�Y/N���t�{���fYm�gM���`vY�t3��0�S�
OLi�B'N��[�i�l�A�u�PY������^�ba�����,�m6P�z)�{�������Z0��������OO��w+�����\�V�v&��,�+v0��4��N[pxX�u���hx&����=.tAI$��2�-g���6�Y��h���#W6���A���B��?h���q��l%Iu[�u��B�O!}w[ou���,/��+6��j��
������e��b����1m.2�W���*�/vi�C.�qjp�������{+|��
/��4����B��jF%��%�#�_D�o����+��������6���hj��~�RM������]yim���9h��O�Uq�YMw�-�Y��;����X��Cl��h[M��nL�D��[��t���iz�� ;,�e|�h�h��J�!{��c����z[�wCcD��������A?0�-y�B��m��
#�����`a�e����-d�W���D����������]�0���p���Z	�^��
�f���&�u�6��=����V�C�BE4�����-��mKC�C�4�Q���l=k�������|��A��7�{b����x�iym/2�b�
&�J�&��W���cZ{x3�a�i+:�f���`v����b�$��\@P`+�k�F��n���%�s!����~�^�`s��0n%�R��I-������]>����6t���C�CR	l������
S���� kRo��&5\"I4����Jx��7�����F�������f��i�6��K��	.��d���j�$�
�L��B��)��{g
�
�-�]8�,J�a��T�{����2b�K4�5��y�9%����t����Y�J����+�;�5��,��+��c��Gs[��f�]i��-���P������I���,�xzLA��(Q��
m�9��J���+���ZQ+x�n}��"��A���E�s����kD����cY��(x�����%�A���V����-���
��Z����U�i���5�K��
���7�o}�h��u~g{�������=�g-�rx����'6YC�%�����i�F���Gi[�|C����
�phZ�|��/��s����
��hf)��]������c����Z�7tH���`����Y������yk�pj��n"�e[�F�P��u�A�0qjm~��@{���i��
�����������g���n��p���_s�>�p�Y��&
��@[����^9
���a�`�N��D����~?YHL�,��4k�D����%��[D���`��6X�+�u�kkO�k�
�oeNa4'��fj�F^$���]����fm��c�~b��a]�F�0G?�	�����������f��'�����/�E�C����<�����!�PK�R?R
 �Atest_data/UT
�h`�h`�h`ux��PK�R?R �AHtest_data/1_10^1_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& ���test_data/1_10^1_rows/1_referenced.sqlUT
�h`�h`�h`ux��PK�R?R1���%6' ��^test_data/1_10^1_rows/2_referencing.sqlUT
�h`�h`�h`ux��PK�R?R9���0O+ ���test_data/1_10^1_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux��PK�R?R����G
% ���test_data/1_10^1_rows/4_many2many.sqlUT
�h`�h`�h`ux��PK�R?R �Aqtest_data/2_10^2_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& ���test_data/2_10^2_rows/1_referenced.sqlUT
�h`�h`�h`ux��PK�R?RT�����' ���/test_data/2_10^2_rows/2_referencing.sqlUT
�h`�h`�h`ux��PK�R?R���X��+ ���4test_data/2_10^2_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux��PK�R?Ro�V�))T% ���9test_data/2_10^2_rows/4_many2many.sqlUT
�h`�h`�h`ux��PK�R?R �A|Btest_data/3_10^3_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& ���Btest_data/3_10^3_rows/1_referenced.sqlUT
�h`�h`�h`ux��PK�R?Ru�Hs&s�' ���Wtest_data/3_10^3_rows/2_referencing.sqlUT
�h`�h`�h`ux��PK�R?RD����&��+ ��j~test_data/3_10^3_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux��PK�R?R�~FmMI�\% ����test_data/3_10^3_rows/4_many2many.sqlUT
�h`�h`�h`ux��PK�R?R �A2�test_data/4_10^4_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& ����test_data/4_10^4_rows/1_referenced.sqlUT
�h`�h`�h`ux��PK�R?R"�e�p�f	' ��Htest_data/4_10^4_rows/2_referencing.sqlUT
�h`�h`�h`ux��PK�R?R�9sr�q�g	+ ��{utest_data/4_10^4_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux��PK�R?R:fi
�7t"% ��z�test_data/4_10^4_rows/4_many2many.sqlUT
�h`�h`�h`ux��PK�R?R �A��test_data/5_10^5_rows/UT
�h`�h`�h`ux��PK�R?R��`V^3�& ��;�test_data/5_10^5_rows/1_referenced.sqlUT
�h`�h`�h`ux��PK�R?R�?]U�z_' ����test_data/5_10^5_rows/2_referencing.sqlUT
�h`�h`�h`ux��PK�R?Rn��R�U_+ ��w1test_data/5_10^5_rows/3_referencing_gin.sqlUT
�h`�h`�h`ux��PK�R?R�Yy����{^% ����#test_data/5_10^5_rows/4_many2many.sqlUT
�h`�h`�h`ux��PKu�N@
#143Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#142)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Tue, Feb 2, 2021, at 13:51, Mark Rofail wrote:

Array-ELEMENT-foreign-key-v17.patch

When working on my pit tool, I found another implicit type casts problem.

First an example to show a desired error message:

CREATE TABLE a (
a_id smallint,
PRIMARY KEY (a_id)
);

CREATE TABLE b (
b_id bigint,
a_ids text[],
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a;

The below error message is good:

ERROR: foreign key constraint "b_a_ids_fkey" cannot be implemented
DETAIL: Key column "a_ids" has element type text which does not have a default btree operator class that's compatible with class "int2_ops".

But if we instead make a_ids a bigint[], we don't get any error:

DROP TABLE b;

CREATE TABLE b (
b_id bigint,
a_ids bigint[],
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a;

No error, even though bigint[] isn't compatible with smallint.

We do get an error when trying to insert into the table:

INSERT INTO a (a_id) VALUES (1);
INSERT INTO b (b_id, a_ids) VALUES (2, ARRAY[1]);

ERROR: operator does not exist: smallint[] pg_catalog.<@ bigint[]
LINE 1: ..."."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (SELECT 1 FROM ONLY "public"."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(pg_catalog.<@) $1::pg_catalog.anyarray FOR KEY SHARE OF x) z)

I wonder if we can come up with some general way to detect these
problems already at constraint creation time,
instead of having to wait for data to get the error,
similar to why compile time error are preferred over run time errors.

/Joel

#144Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#143)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Joel,

No error, even though bigint[] isn't compatible with smallint.

I added a check to compart the element type of the fkoperand and the type
of the pkoperand should be the same
Please try v18 attached below, you should get the following message
```
ERROR: foreign key constraint "fktableviolating_ftest1_fkey" cannot be
implemented
DETAIL: Specified columns have element types smallint and bigint which are
not homogenous.
```

Changelog (FK arrays):
- v18 (compatible with current master 2021-02-54, commit
c34787f910585f82320f78b0afd53a6a170aa229)
* add check for operand compatibility at constraint creation

Changelog (FK arrays Elem addon)
- v4 (compatible with FK arrays v18)
* re-add Composite Type support

I believe we should start merging these two patches as one, due to the Elem
addon's benefits. such as adding Composite Type support.

/Mark

On Thu, Feb 4, 2021 at 9:00 AM Joel Jacobson <joel@compiler.org> wrote:

Show quoted text

On Tue, Feb 2, 2021, at 13:51, Mark Rofail wrote:

Array-ELEMENT-foreign-key-v17.patch

When working on my pit tool, I found another implicit type casts problem.

First an example to show a desired error message:

CREATE TABLE a (
a_id smallint,
PRIMARY KEY (a_id)
);

CREATE TABLE b (
b_id bigint,
a_ids text[],
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a;

The below error message is good:

ERROR: foreign key constraint "b_a_ids_fkey" cannot be implemented
DETAIL: Key column "a_ids" has element type text which does not have a
default btree operator class that's compatible with class "int2_ops".

But if we instead make a_ids a bigint[], we don't get any error:

DROP TABLE b;

CREATE TABLE b (
b_id bigint,
a_ids bigint[],
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a;

No error, even though bigint[] isn't compatible with smallint.

We do get an error when trying to insert into the table:

INSERT INTO a (a_id) VALUES (1);
INSERT INTO b (b_id, a_ids) VALUES (2, ARRAY[1]);

ERROR: operator does not exist: smallint[] pg_catalog.<@ bigint[]
LINE 1: ..."."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might
need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM
pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*)
FROM (SELECT 1 FROM ONLY "public"."a" x WHERE ARRAY
["a_id"]::pg_catalog.anyarray OPERATOR(pg_catalog.<@)
$1::pg_catalog.anyarray FOR KEY SHARE OF x) z)

I wonder if we can come up with some general way to detect these
problems already at constraint creation time,
instead of having to wait for data to get the error,
similar to why compile time error are preferred over run time errors.

/Joel

Attachments:

Array-ELEMENT-foreign-key-v18.patchtext/x-patch; charset=US-ASCII; name=Array-ELEMENT-foreign-key-v18.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea222c0464..2a9ecd40d4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1cb9172a5f..a0c24a8c8e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2053,6 +2053,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..264abacd0c 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * we need to check if both the element fktype and pktype are the same
+			 * type, to allow polymorphic comparison <@ in RI checks
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Specified columns have element types %s and %s which are not homogenous.",
+							format_type_be(fktype),
+							format_type_be(pktypoid[i]))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8931,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +8997,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9010,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9054,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9124,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9210,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9259,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9393,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9429,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9538,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9571,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9615,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9686,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9721,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9801,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9840,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..dc6d06e1f3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ * 
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..aac0b33dd4 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] != FKCONSTR_REF_PLAIN)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..885ed6080b 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,24 +11465,51 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			lefttypeoid;
+	Oid			oproid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_CONTAINED_OP;
+	else
+		oproid = opoid;
+
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	appendStringInfoString(buf, leftop);
-	if (leftoptype != operform->oprleft)
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT) 
+	{
+		/* 
+		 * Cast lefttype to array type since we construct it into an array
+		 * using ARRAY[] below
+		 */ 
+		lefttypeoid = get_array_type(leftoptype);
+		if (!OidIsValid(lefttypeoid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+						errmsg("could not find array type for data type %s",
+							format_type_be(leftoptype))));
+		appendStringInfo(buf, "ARRAY [%s]", leftop);
+	}
+	else
+	{
+		lefttypeoid = leftoptype;
+		appendStringInfoString(buf, leftop);
+	}
+	if (lefttypeoid != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
 	appendStringInfoString(buf, oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..dd83ca6213 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..4620c6ef26
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,609 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Specified columns have element types smallint and integer which are not homogenous.
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Specified columns have element types smallint and integer which are not homogenous.
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+NOTICE:  table "fktableviolating" does not exist, skipping
+DROP TABLE IF EXISTS PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..52b8963ee2
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,466 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEVIOLATING;
+
+DROP TABLE IF EXISTS PKTABLEVIOLATING;
Array-containselem-gin-v4.patchtext/x-patch; charset=US-ASCII; name=Array-containselem-gin-v4.patchDownload
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..9b91582021 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,14 +95,31 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/*
+		* since this function returns a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return it
+		* as is and configure the searchmode
+		*/
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nelems = 1;
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +144,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +211,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +301,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..6099f92544 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,133 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a spefific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+			* Apply the operator to the element pair; treat NULL as false
+			*/
+		locfcinfo->args[0].value = elt1;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	Datum elem = PG_GETARG_DATUM(0);
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/* we don't need to check if the elem is null or if
+	the elem datatype and array datatype match since this
+	is handled within internal calls already (a property
+	of polymorphic functions) */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input. */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 885ed6080b..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11472,12 +11472,11 @@ generate_operator_clause(StringInfo buf,
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
-	Oid			lefttypeoid;
 	Oid			oproid;
 
 	/* Override operator with <<@ in case of FK array */
 	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
-		oproid = OID_ARRAY_CONTAINED_OP;
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
 	else
 		oproid = opoid;
 
@@ -11490,26 +11489,8 @@ generate_operator_clause(StringInfo buf,
 
 	nspname = get_namespace_name(operform->oprnamespace);
 
-	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT) 
-	{
-		/* 
-		 * Cast lefttype to array type since we construct it into an array
-		 * using ARRAY[] below
-		 */ 
-		lefttypeoid = get_array_type(leftoptype);
-		if (!OidIsValid(lefttypeoid))
-			ereport(ERROR,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-						errmsg("could not find array type for data type %s",
-							format_type_be(leftoptype))));
-		appendStringInfo(buf, "ARRAY [%s]", leftop);
-	}
-	else
-	{
-		lefttypeoid = leftoptype;
-		appendStringInfoString(buf, leftop);
-	}
-	if (lefttypeoid != operform->oprleft)
+	appendStringInfoString(buf, leftop);
+	if (leftoptype != operform->oprleft)
 		add_cast_to(buf, operform->oprleft);
 	appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
 	appendStringInfoString(buf, oprname);
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 4e0c9be58c..8bc05707c7 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
index 4620c6ef26..db76bebd58 100644
--- a/src/test/regress/expected/element_fk.out
+++ b/src/test/regress/expected/element_fk.out
@@ -574,7 +574,7 @@ INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
 -- Try UPDATE
 UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
 -- Try using the indexable operator
-SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
    ftest1    | ftest2 
 -------------+--------
  {5}         |      1
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
index 52b8963ee2..da8cd6073a 100644
--- a/src/test/regress/sql/element_fk.sql
+++ b/src/test/regress/sql/element_fk.sql
@@ -443,7 +443,7 @@ INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
 UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
 
 -- Try using the indexable operator
-SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
 
 -- Cleanup
 DROP TABLE FKTABLEFORARRAYGIN;
#145Zhihong Yu
zyu@yugabyte.com
In reply to: Mark Rofail (#144)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi,
For Array-containselem-gin-v4.patch , one small comment:

+ * array_contains_elem : checks an array for a spefific element

typo: specific

Cheers

On Thu, Feb 4, 2021 at 4:03 PM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

Hello Joel,

No error, even though bigint[] isn't compatible with smallint.

I added a check to compart the element type of the fkoperand and the type
of the pkoperand should be the same
Please try v18 attached below, you should get the following message
```
ERROR: foreign key constraint "fktableviolating_ftest1_fkey" cannot be
implemented
DETAIL: Specified columns have element types smallint and bigint which
are not homogenous.
```

Changelog (FK arrays):
- v18 (compatible with current master 2021-02-54, commit
c34787f910585f82320f78b0afd53a6a170aa229)
* add check for operand compatibility at constraint creation

Changelog (FK arrays Elem addon)
- v4 (compatible with FK arrays v18)
* re-add Composite Type support

I believe we should start merging these two patches as one, due to the
Elem addon's benefits. such as adding Composite Type support.

/Mark

On Thu, Feb 4, 2021 at 9:00 AM Joel Jacobson <joel@compiler.org> wrote:

On Tue, Feb 2, 2021, at 13:51, Mark Rofail wrote:

Array-ELEMENT-foreign-key-v17.patch

When working on my pit tool, I found another implicit type casts problem.

First an example to show a desired error message:

CREATE TABLE a (
a_id smallint,
PRIMARY KEY (a_id)
);

CREATE TABLE b (
b_id bigint,
a_ids text[],
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a;

The below error message is good:

ERROR: foreign key constraint "b_a_ids_fkey" cannot be implemented
DETAIL: Key column "a_ids" has element type text which does not have a
default btree operator class that's compatible with class "int2_ops".

But if we instead make a_ids a bigint[], we don't get any error:

DROP TABLE b;

CREATE TABLE b (
b_id bigint,
a_ids bigint[],
PRIMARY KEY (b_id)
);

ALTER TABLE b ADD FOREIGN KEY (EACH ELEMENT OF a_ids) REFERENCES a;

No error, even though bigint[] isn't compatible with smallint.

We do get an error when trying to insert into the table:

INSERT INTO a (a_id) VALUES (1);
INSERT INTO b (b_id, a_ids) VALUES (2, ARRAY[1]);

ERROR: operator does not exist: smallint[] pg_catalog.<@ bigint[]
LINE 1: ..."."a" x WHERE ARRAY ["a_id"]::pg_catalog.anyarray OPERATOR(p...
^
HINT: No operator matches the given name and argument types. You might
need to add explicit type casts.
QUERY: SELECT 1 WHERE (SELECT pg_catalog.count(DISTINCT y) FROM
pg_catalog.unnest($1) y) OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*)
FROM (SELECT 1 FROM ONLY "public"."a" x WHERE ARRAY
["a_id"]::pg_catalog.anyarray OPERATOR(pg_catalog.<@)
$1::pg_catalog.anyarray FOR KEY SHARE OF x) z)

I wonder if we can come up with some general way to detect these
problems already at constraint creation time,
instead of having to wait for data to get the error,
similar to why compile time error are preferred over run time errors.

/Joel

#146Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#144)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 2021-Feb-05, Mark Rofail wrote:

I believe we should start merging these two patches as one, due to the Elem
addon's benefits. such as adding Composite Type support.

I disagree -- I think we should get the second patch in, and consider it
a requisite for the other one. Let's iron it out fully and get it
pushed soon, then we can rebase the array FK patch on top. I think it's
missing docs, though. I wonder if it can usefully get cross-type
operators, i.e., @>>(bigint[],smallint) in some way? Maybe the
"anycompatiblearray" thing can be used for that purpose?

--
�lvaro Herrera 39�49'30"S 73�17'W
"Pido que me den el Nobel por razones humanitarias" (Nicanor Parra)

#147Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#146)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Álvaro,

I disagree -- I think we should get the second patch in, and consider it

a requisite for the other one.

I just want to make sure I got your last message right. We should work on
adding the <<@ and @>> operators and their GIN logic as a separate patch
then submit the FKARRAY as a future patch?
So basically reverse the order of the patches.

/Mark

#148Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#147)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Mark

On 2021-Feb-05, Mark Rofail wrote:

I disagree -- I think we should get the second patch in, and consider it

a requisite for the other one.

I just want to make sure I got your last message right. We should work on
adding the <<@ and @>> operators and their GIN logic as a separate patch
then submit the FKARRAY as a future patch?

Well, *I* think it makes sense to do it that way. I said so three years
ago :-)
/messages/by-id/20180410135917.odjh5coa4cjatz5v@alvherre.pgsql

So basically reverse the order of the patches.

Yeah.

Thanks a lot for your persistence, by the way.

--
�lvaro Herrera 39�49'30"S 73�17'W
"We're here to devour each other alive" (Hobbes)

#149Stephen Frost
sfrost@snowman.net
In reply to: Alvaro Herrera (#148)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Greetings,

* Alvaro Herrera (alvherre@alvh.no-ip.org) wrote:

On 2021-Feb-05, Mark Rofail wrote:

I disagree -- I think we should get the second patch in, and consider it

a requisite for the other one.

I just want to make sure I got your last message right. We should work on
adding the <<@ and @>> operators and their GIN logic as a separate patch
then submit the FKARRAY as a future patch?

Well, *I* think it makes sense to do it that way. I said so three years
ago :-)
/messages/by-id/20180410135917.odjh5coa4cjatz5v@alvherre.pgsql

So basically reverse the order of the patches.

Yeah.

I tend to agree with Alvaro on this, that getting the operators in first
makes more sense.

Thanks a lot for your persistence, by the way.

+100

Hopefully we'll get this in during this cycle and perhaps then you'll
work on something else? :D Great to see a GSoC student continue to work
with the community years after the GSoC they participated in. If you'd
be interested in being a mentor for this upcoming GSoC season, please
let me know!

Thanks!

Stephen

#150Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#148)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Álvaro,

Well, *I* think it makes sense to do it that way. I said so three years

ago :-)
/messages/by-id/20180410135917.odjh5coa4cjatz5v@alvherre.pgsql

So this makes a lot of sense, let's do that.

I wonder if it can usefully get cross-type
operators, i.e., @>>(bigint[],smallint) in some way? Maybe the
"anycompatiblearray" thing can be used for that purpose?

It was easy to get @>> and <<@ accept cross-types thanks to your
suggestion, but I opted to having the operators defined as follows to still
be consistent with the GIN index since the index needs the first operant to
be of type "anyarray"
@>>(anyarray, anycompatiblenonearray) and <<@(anycompatiblenonearray,
anyarray)

Thanks a lot for your persistence, by the way.

Thank you for your words of encouragement, it was one of my deepest
regrests to not seeing this though while in GSoC, hopefiully it gets
commited this time around.

We will focus on getting the operator patch through first. Should I create
a separate commitfest ticket? or the current one suffices?
https://commitfest.postgresql.org/32/2966/

Changelog (operator patch):
- v1 (compatible with current master 2021-02-05,
commit c444472af5c202067a9ecb0ff8df7370fb1ea8f4)
* add tests and documentation to array operators and gin index

/Mark

Attachments:

anyarray_anyelement_operators-v1.patchtext/x-patch; charset=US-ASCII; name=anyarray_anyelement_operators-v1.patchDownload
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index b7150510ab..3d36e88494 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anycompatiblenonarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain specified element ?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anycompatiblenonarray</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..a744609a6b 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anycompatiblenonarray)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anycompatiblenonarray,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..3cfc64cfe1 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ @&gt; &nbsp; &lt;&lt;@ @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..9b91582021 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,14 +95,31 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/*
+		* since this function returns a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return it
+		* as is and configure the searchmode
+		*/
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nelems = 1;
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +144,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +211,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +301,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..51e241153f 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,136 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element adapted from
+ * array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt1;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	Datum elem = PG_GETARG_DATUM(0);
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..a68a84e576 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anycompatiblenonarray', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anycompatiblenonarray)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..a2bfd2a513 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anycompatiblenonarray', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anycompatiblenonarray)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anycompatiblenonarray',
+  oprresult => 'bool', oprcom => '<<@(anycompatiblenonarray,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 4e0c9be58c..40fa53e3a0 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anycompatiblenonarray anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anycompatiblenonarray', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..029cfaccd0 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,50 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 32::smallint ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 32::bigint ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +826,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1033,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1063,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1098,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..50a24c9684 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,14 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32::smallint ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32::bigint ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +337,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
#151Mark Rofail
markm.rofail@gmail.com
In reply to: Stephen Frost (#149)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Stephen,

Thanks a lot for your persistence, by the way.
+100
Hopefully we'll get this in during this cycle and perhaps then you'll work
on something else? :D

Thank you for your kind words! Yes, hopefully, we'll get this in this time
around. I would definitely love to work on something else once this is done.

Great to see a GSoC student continue to work
with the community years after the GSoC they participated in. If you'd
be interested in being a mentor for this upcoming GSoC season, please
let me know!

Hmm, not sure. I don't think I am well acquainted with the codebase to
actually mentor someone. Maybe if I get some experience I would be ready
for GSoC 2022.

Thanks again Stephen and Álvaro

/Mark

#152Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#151)
1 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Greetings,

Changelog (operator patch):

- v1 (compatible with current master 2021-02-05,
commit c444472af5c202067a9ecb0ff8df7370fb1ea8f4)
* add tests and documentation to array operators and gin index

Since we agreed to separate @>> and <<@ operators to prerequisite patch to
the FK Arrays, I have rebased the patch to be applied on
"anyarray_anyelement_operators-vX.patch"

Changelog (FK Arrays)
- v1 (compatible with anyarray_anyelement_operators-v1.patch)
* rebase on anyarray_anyelement_operators-v1.patch
* support coercion
* support vectors instead of arrays

Showcase the Vector usage:
```sql
CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
ftest2 int PRIMARY KEY,
FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
ON DELETE NO ACTION ON UPDATE NO ACTION);
CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);

-- Populate Table
INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
```

/Mark

Show quoted text

Attachments:

fk_arrays_elem_v1.patchtext/x-patch; charset=US-ASCII; name=fk_arrays_elem_v1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea222c0464..2a9ecd40d4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1cb9172a5f..a0c24a8c8e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2053,6 +2053,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..7b0cff9f1b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,82 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+			Oid			candidateopr;
+			List	   	*opname;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			opname = list_make1(makeString("<<@"));
+			candidateopr = compatible_oper_opid(opname, pktype, fktypoid[i], false);
+			if(!OidIsValid(candidateopr))
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8935,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +9001,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9014,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9058,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9128,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9214,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9263,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9397,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9433,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9542,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9575,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9619,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9690,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9725,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9805,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9844,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..6655a617db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..dd83ca6213 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..e7c09d71ac
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,748 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  invalid input syntax for type integer: "A"
+LINE 1: DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+                                                 ^
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  invalid input syntax for type integer: "B"
+LINE 1: UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+                                                           ^
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat similar test using vectors isntead of arrays
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+  ftest1   | ftest2 
+-----------+--------
+ 5         |      1
+ 3 5 2 5   |      3
+ 3 5 4 1 3 |      5
+ 5 1       |      7
+ 3 4 5 3   |     10
+(5 rows)
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type character which does not have a default btree operator class that's compatible with class "int4_ops".
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..f7b18fffb8
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,588 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat similar test using vectors isntead of arrays
+
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+DROP TABLE PKTABLEVIOLATING;
#153Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#152)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 2021-Feb-07, Mark Rofail wrote:

Changelog (operator patch):

- v1 (compatible with current master 2021-02-05,
commit c444472af5c202067a9ecb0ff8df7370fb1ea8f4)
* add tests and documentation to array operators and gin index

Since we agreed to separate @>> and <<@ operators to prerequisite patch to
the FK Arrays, I have rebased the patch to be applied on
"anyarray_anyelement_operators-vX.patch"

Um, where is that other patch?

--
�lvaro Herrera 39�49'30"S 73�17'W

#154Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#150)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

[Found it :-)]

On 2021-Feb-05, Mark Rofail wrote:

We will focus on getting the operator patch through first. Should I create
a separate commitfest ticket? or the current one suffices?
https://commitfest.postgresql.org/32/2966/

I think the current one is fine. In fact I would encourage you to post
both patches together as two attachment in the same email; that way, the
CF bot would pick them up correctly. When you post them in separate
emails, it doesn't know what to do with them. See here:
http://cfbot.cputube.org/mark-rofail.html

--
�lvaro Herrera 39�49'30"S 73�17'W

#155Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#154)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Alvaro,

In fact I would encourage you to post
both patches together as two attachment in the same email;

Just republishing the patches in the same email

Changelog (operator patch):

- v1 (compatible with current master 2021-02-05,
commit c444472af5c202067a9ecb0ff8df7370fb1ea8f4)
* add tests and documentation to array operators and gin index

Array <-> element operators patch

Changelog (FK Arrays)

- v1 (compatible with anyarray_anyelement_operators-v1.patch)
* rebase on anyarray_anyelement_operators-v1.patch
* support coercion
* support vectors instead of arrays

The FK Array patch which is dependent on
anyarray_anyelement_operators-v1.patch

/Mark

Attachments:

fk_arrays_elem_v1.patchtext/x-patch; charset=US-ASCII; name=fk_arrays_elem_v1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea222c0464..2a9ecd40d4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1cb9172a5f..a0c24a8c8e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2053,6 +2053,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..7b0cff9f1b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,82 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+			Oid			candidateopr;
+			List	   	*opname;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			opname = list_make1(makeString("<<@"));
+			candidateopr = compatible_oper_opid(opname, pktype, fktypoid[i], false);
+			if(!OidIsValid(candidateopr))
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8935,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +9001,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9014,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9058,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9128,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9214,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9263,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9397,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9433,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9542,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9575,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9619,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9690,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9725,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9805,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9844,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..6655a617db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..dd83ca6213 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..e7c09d71ac
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,748 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  invalid input syntax for type integer: "A"
+LINE 1: DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+                                                 ^
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  invalid input syntax for type integer: "B"
+LINE 1: UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+                                                           ^
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat similar test using vectors isntead of arrays
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+  ftest1   | ftest2 
+-----------+--------
+ 5         |      1
+ 3 5 2 5   |      3
+ 3 5 4 1 3 |      5
+ 5 1       |      7
+ 3 4 5 3   |     10
+(5 rows)
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type character which does not have a default btree operator class that's compatible with class "int4_ops".
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..f7b18fffb8
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,588 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat similar test using vectors isntead of arrays
+
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+DROP TABLE PKTABLEVIOLATING;
anyarray_anyelement_operators-v1.patchtext/x-patch; charset=US-ASCII; name=anyarray_anyelement_operators-v1.patchDownload
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index b7150510ab..3d36e88494 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anycompatiblenonarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain specified element ?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anycompatiblenonarray</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..a744609a6b 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anycompatiblenonarray)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anycompatiblenonarray,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..3cfc64cfe1 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ @&gt; &nbsp; &lt;&lt;@ @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..9b91582021 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -79,7 +80,7 @@ Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
 	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,14 +95,31 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/*
+		* since this function returns a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return it
+		* as is and configure the searchmode
+		*/
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nelems = 1;
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+	}
+	else
+	{
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +144,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +211,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +301,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..51e241153f 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,136 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element adapted from
+ * array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem,
+				Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arr_type = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it1;
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *)*fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arr_type)
+	{
+		typentry = lookup_type_cache(arr_type,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arr_type))));
+		*fn_extra = (void *)typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator to each pair of array elements.
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it1, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt1;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt1 = array_iter_next(&it1, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+		 * array_eq, should we act like that?
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt1;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	Datum elem = PG_GETARG_DATUM(0);
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..a68a84e576 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anycompatiblenonarray', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anycompatiblenonarray)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..a2bfd2a513 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anycompatiblenonarray', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anycompatiblenonarray)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anycompatiblenonarray',
+  oprresult => 'bool', oprcom => '<<@(anycompatiblenonarray,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 4e0c9be58c..40fa53e3a0 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anycompatiblenonarray anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anycompatiblenonarray', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..029cfaccd0 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,50 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 32::smallint ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 32::bigint ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +826,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1033,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1063,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1098,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..50a24c9684 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,14 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32::smallint ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32::bigint ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +337,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
#156Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#155)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Mon, Feb 8, 2021, at 09:40, Mark Rofail wrote:

Attachments:
fk_arrays_elem_v1.patch
anyarray_anyelement_operators-v1.patch

Nice work!

I have successfully tested both patches against e7f42914854926c2afbb89b9cd0e381fd90766be
by cloning all pg_catalog tables, and adding foreign keys
on all columns, including array columns of course.

Here is what e.g. pg_constraint which has quite a few array oid columns looks like with foreign keys:

joel=# \d catalog_clone.pg_constraint
Table "catalog_clone.pg_constraint"
Column | Type | Collation | Nullable | Default
---------------+------------+-----------+----------+---------
oid | jsonb | | not null |
conname | name | | |
.
.
.
Foreign-key constraints:
"pg_constraint_conexclop_fkey" FOREIGN KEY (EACH ELEMENT OF conexclop) REFERENCES catalog_clone.pg_operator(oid)
"pg_constraint_conffeqop_fkey" FOREIGN KEY (EACH ELEMENT OF conffeqop) REFERENCES catalog_clone.pg_operator(oid)
"pg_constraint_conpfeqop_fkey" FOREIGN KEY (EACH ELEMENT OF conpfeqop) REFERENCES catalog_clone.pg_operator(oid)
"pg_constraint_conppeqop_fkey" FOREIGN KEY (EACH ELEMENT OF conppeqop) REFERENCES catalog_clone.pg_operator(oid)
"pg_constraint_conrelid_conkey_fkey" FOREIGN KEY (conrelid, EACH ELEMENT OF conkey) REFERENCES catalog_clone.pg_attribute(attrelid, attnum)

Here is my test function that adds foreign keys on catalog tables:

https://github.com/truthly/pg-pit/blob/master/FUNCTIONS/test_referential_integrity.sql

If you want to try it yourself, it is run as part of pit's test suite:

$ git clone https://github.com/truthly/pg-pit.git
$ cd pg-pit
$ make
$ make install
$ make installcheck

============== running regression test queries ==============
test referential_integrity ... ok 1925 ms

/Joel

#157Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#155)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Mon, Feb 8, 2021, at 09:40, Mark Rofail wrote:

anyarray_anyelement_operators-v1.patch

Here comes a first review of the anyarray_anyelement_operators-v1.patch.

doc/src/sgml/func.sgml
+ Does the array contain specified element ?

* Maybe remove the extra blank space before question mark?

doc/src/sgml/indices.sgml
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ @&gt; &nbsp; &lt;&lt;@ @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;

* To me it looks like the pattern is to insert &nbsp; between each operator, in which case this should be written:

&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;

I.e., &nbsp; is missing between &lt;@ and @&gt;.

src/backend/access/gin/ginarrayproc.c
        /* Make copy of array input to ensure it doesn't disappear while in use */
-       ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+       ArrayType  *array;

I think the comment above should be changed/moved since the copy has been moved and isn't always performed due to the if. Since array variable is only used in the else block, couldn't both the comment and the declaration of array be moved to the else block as well?

src/backend/utils/adt/arrayfuncs.c
+               /*
+                * We assume that the comparison operator is strict, so a NULL can't
+                * match anything.  XXX this diverges from the "NULL=NULL" behavior of
+                * array_eq, should we act like that?
+                */

The comment above is copy/pasted from array_contain_compare(). It seems unnecessary to have this open question, word-by-word, on two different places. I think a reference from here to the existing similar code would be better. And also to add a comment in array_contain_compare() about the existence of this new code where the same question is discussed.

If this would be new code, then this question should probably be answered before committing, but since this is old code, maybe the behaviour now can't be changed anyway, since the old code in array_contain_compare() has been around since 2006, when it was introduced in commit f5b4d9a9e08199e6bcdb050ef42ea7ec0f7525ca.

/Joel

#158Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#157)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

Here comes a first review of the anyarray_anyelement_operators-v1.patch.

Great, thanks! I’ll start applying your comments today and release a new
patch.

/Mark

#159Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#158)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Thu, Feb 11, 2021, at 16:50, Mark Rofail wrote:

Here comes a first review of the anyarray_anyelement_operators-v1.patch.

Great, thanks! I’ll start applying your comments today and release a new patch.

Here comes some more feedback:

I was surprised to see <<@ and @>> don't complain when trying to compare incompatible types:

regression=# select '1'::text <<@ ARRAY[1::integer,2::integer];
?column?
----------
f
(1 row)

I would expect the same result as if using the <@ and @> operators,
and wrapping the value in an array:

regression=# select ARRAY['1'::text] <@ ARRAY[1::integer,2::integer];
ERROR: operator does not exist: text[] <@ integer[]
LINE 1: select ARRAY['1'::text] <@ ARRAY[1::integer,2::integer];
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

The error above for the existing <@ operator is expected,
and I think the <<@ should give a similar error.

Even worse, when using integer on the left side and text in the array,
the <<@ operator causes a seg fault:

regression=# select 1::integer <<@ ARRAY['1'::text,'2'::text];
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.

2021-02-11 22:18:53.083 CET [91680] LOG: server process (PID 1666) was terminated by signal 11: Segmentation fault: 11
2021-02-11 22:18:53.083 CET [91680] DETAIL: Failed process was running: select 1::integer <<@ ARRAY['1'::text,'2'::text];
2021-02-11 22:18:53.083 CET [91680] LOG: terminating any other active server processes
2021-02-11 22:18:53.084 CET [1735] FATAL: the database system is in recovery mode
2021-02-11 22:18:53.084 CET [91680] LOG: all server processes terminated; reinitializing
2021-02-11 22:18:53.092 CET [1736] LOG: database system was interrupted; last known up at 2021-02-11 22:14:41 CET
2021-02-11 22:18:53.194 CET [1736] LOG: database system was not properly shut down; automatic recovery in progress
2021-02-11 22:18:53.197 CET [1736] LOG: redo starts at 0/2BCA5520
2021-02-11 22:18:53.197 CET [1736] LOG: invalid record length at 0/2BCA5558: wanted 24, got 0
2021-02-11 22:18:53.197 CET [1736] LOG: redo done at 0/2BCA5520 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
2021-02-11 22:18:53.207 CET [91680] LOG: database system is ready to accept connections

Maybe it's the combination of "anyarray" and "anycompatiblenonarray" that is the problem here?

Some more comments on the code:

array_contains_elem(AnyArrayType *array, Datum elem,
+       /*
+        * Apply the comparison operator to each pair of array elements.
+        */
This comment has been copy/pasted from array_contain_compare().
Maybe the wording should clarify there is only one array in this function,
the word "pair" seems to imply working with two arrays.
+       for (i = 0; i < nelems; i++)
+       {
+               Datum elt1;

The name `elt1` originates from the array_contain_compare() function.
But since this function, array_contains_elem(), doesn't have a `elt2`,
it would be better to use `elt` as a name here. The same goes for `it1`.

/Joel

#160Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#159)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

Thanks again for your thorough review!

I was surprised to see <<@ and @>> don't complain when trying to compare

incompatible types:
Maybe it's the combination of "anyarray" and "anycompatiblenonarray" that
is the problem here?

Indeed you are right, to support the correct behaviour we have to use
@>>(anycompatiblearray,
anycompatiblenonarry) and this throws a sanity error in opr_santiy since
the left operand doesn't equal the gin opclass which is anyarray. I am
thinking to solve this we need to add a new opclass under gin "
compatible_array_ops" beside the already existing "array_ops", what do you
think?
@Alvaro your input here would be valuable.

I included the @>>(anycompatiblearray, anycompatiblenonarry) for now as a
fix to the segmentation fault and incompatible data types in v2, the error
messages should be listed correctly as follows:
```sql

select '1'::text <<@ ARRAY[1::integer,2::integer];
ERROR: operator does not exist: text <<@ integer[]
LINE 1: select '1'::text <<@ ARRAY[1::integer,2::integer];
HINT: No operator matches the given name and argument types. You might
need to add explicit type casts.

select 1::integer <<@ ARRAY['1'::text,'2'::text];
ERROR: operator does not exist: integer <<@ text[]
LINE 1: select 1::integer <<@ ARRAY['1'::text,'2'::text];
HINT: No operator matches the given name and argument types. You might
need to add explicit type casts.

```

doc/src/sgml/func.sgml

+ Does the array contain specified element ?
* Maybe remove the extra blank space before question mark?

Addressed in v2.

doc/src/sgml/indices.sgml

-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ @&gt; &nbsp; &lt;&lt;@ @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
* To me it looks like the pattern is to insert &nbsp; between each operator

Addressed in v2.

src/backend/access/gin/ginarrayproc.c
/* Make copy of array input to ensure it doesn't disappear while
in use */
-       ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+       ArrayType  *array;
I think the comment above should be changed/moved

Addressed in v2.

src/backend/utils/adt/arrayfuncs.c
+               /*
+                * We assume that the comparison operator is strict, so a
NULL can't
+                * match anything.  XXX this diverges from the "NULL=NULL"
behavior of
+                * array_eq, should we act like that?
+                */
It seems unnecessary to have this open question.

Addressed in v2.

array_contains_elem(AnyArrayType *array, Datum elem,
+       /*
+        * Apply the comparison operator to each pair of array elements.
+        */
This comment has been copy/pasted from array_contain_compare().
Maybe the wording should clarify there is only one array in this function,
the word "pair" seems to imply working with two arrays.

Addressed in v2.

+ for (i = 0; i < nelems; i++)

+ {
+ Datum elt1;
The name `elt1` originates from the array_contain_compare() function.
But since this function, array_contains_elem(), doesn't have a `elt2`,
it would be better to use `elt` as a name here. The same goes for `it1`.

Addressed in v2.

Changelog:
- anyarray_anyelement_operators-v2.patch (compatible with current master
2021-02-12, commit 993bdb9f935a751935a03c80d30857150ba2b645):
* all issues discussed above

Attachments:

anyarray_anyelement_operators-v2.patchtext/x-patch; charset=US-ASCII; name=anyarray_anyelement_operators-v2.patchDownload
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 1ab31a9056..5fc624e621 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anycompatiblenonarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anycompatiblenonarray</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..a744609a6b 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anycompatiblenonarray)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anycompatiblenonarray,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..1227dd4ba8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,7 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+	ArrayType  *array;
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -94,14 +94,32 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/*
+		* since this function returns a pointer to a
+		* deconstructed array, there is nothing to do if
+		* operand is a single element except to return it
+		* as is and configure the searchmode
+		*/
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nelems = 1;
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +144,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +211,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +301,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..9bd1a7e7cd 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element adapted from
+ * array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays of different element types")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..00e265067f 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anycompatiblearray',
+  amoprighttype => 'anycompatiblenonarray', amopstrategy => '5',
+  amopopr => '@>>(anycompatiblearray,anycompatiblenonarray)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..ac566bb6b0 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anycompatiblenonarray', oprright => 'anycompatiblearray',
+  oprresult => 'bool', oprcom => '@>>(anycompatiblearray,anycompatiblenonarray)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anycompatiblearray', oprright => 'anycompatiblenonarray',
+  oprresult => 'bool', oprcom => '<<@(anycompatiblenonarray,anycompatiblearray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 4e0c9be58c..efce9f8a63 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anycompatiblenonarray anycompatiblearray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anycompatiblearray anycompatiblenonarray', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..029cfaccd0 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,50 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 32::smallint ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 32::bigint ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +826,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1033,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1063,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1098,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..50a24c9684 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,14 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32::smallint ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32::bigint ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +337,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
fk_arrays_elem_v1.patchtext/x-patch; charset=US-ASCII; name=fk_arrays_elem_v1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea222c0464..2a9ecd40d4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1cb9172a5f..a0c24a8c8e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2053,6 +2053,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..7b0cff9f1b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,82 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+			Oid			candidateopr;
+			List	   	*opname;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			opname = list_make1(makeString("<<@"));
+			candidateopr = compatible_oper_opid(opname, pktype, fktypoid[i], false);
+			if(!OidIsValid(candidateopr))
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8935,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +9001,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9014,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9058,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9128,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9214,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9263,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9397,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9433,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9542,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9575,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9619,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9690,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9725,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9805,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9844,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..6655a617db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..dd83ca6213 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..e7c09d71ac
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,748 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  invalid input syntax for type integer: "A"
+LINE 1: DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+                                                 ^
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  invalid input syntax for type integer: "B"
+LINE 1: UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+                                                           ^
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat similar test using vectors isntead of arrays
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+  ftest1   | ftest2 
+-----------+--------
+ 5         |      1
+ 3 5 2 5   |      3
+ 3 5 4 1 3 |      5
+ 5 1       |      7
+ 3 4 5 3   |     10
+(5 rows)
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type character which does not have a default btree operator class that's compatible with class "int4_ops".
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..f7b18fffb8
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,588 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat similar test using vectors isntead of arrays
+
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+DROP TABLE PKTABLEVIOLATING;
#161Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#160)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Fri, Feb 12, 2021, at 20:56, Mark Rofail wrote:

Indeed you are right, to support the correct behaviour we have to use @>>(anycompatiblearray, anycompatiblenonarry) and >this throws a sanity error in opr_santiy since the left operand doesn't equal the gin opclass which is anyarray. I am thinking >to solve this we need to add a new opclass under gin "compatible_array_ops" beside the already existing "array_ops", >what do you think?

I'm afraid I have no idea. I don't really understand how these "anycompatible"-types work, I only knew of "anyarray" and "anyelement" until recently. I will study these in detail to get a better understanding. But perhaps you could just explain a quick question first:

Why couldn't/shouldn't @>> and <<@ be operating on anyarray and anyelement?
This would seem more natural to me since the Array Operators versions of @> and <@ operate on anyarray.

/Joel

#162Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#160)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Mark,

On Fri, Feb 12, 2021, at 20:56, Mark Rofail wrote:
Attachments:
anyarray_anyelement_operators-v2.patch

Some more code review comments:

Comparing the v1 and v2 patch, I noticed this change in array_contains_elem():
+ oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
-+ if (oprresult)
++ if (!locfcinfo->isnull && oprresult)
+ return true;
+ }

Is checking !locfcinfo->isnull due to something new in v2,
or what is just a correction for a problem also in v1?

/Joel

#163Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#160)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi again Mark,

On Fri, Feb 12, 2021, at 20:56, Mark Rofail wrote:

Attachments:
anyarray_anyelement_operators-v2.patch

One regression test fails on my machine:

make installcheck
test opr_sanity ... FAILED 3994 ms
========================
1 of 202 tests failed.
========================

diff -U3 /Users/joel/src/postgresql/src/test/regress/expected/opr_sanity.out /Users/joel/src/postgresql/src/test/regress/results/opr_sanity.out
--- /Users/joel/src/postgresql/src/test/regress/expected/opr_sanity.out 2021-02-13 10:29:50.000000000 +0100
+++ /Users/joel/src/postgresql/src/test/regress/results/opr_sanity.out 2021-02-13 11:09:43.000000000 +0100
@@ -2139,7 +2139,8 @@
                    AND binary_coercible(p2.opcintype, p1.amoplefttype));
  amopfamily | amopstrategy | amopopr
------------+--------------+---------
-(0 rows)
+       2745 |            5 |    6105
+(1 row)

-- Operators that are primary members of opclasses must be immutable (else
-- it suggests that the index ordering isn't fixed). Operators that are

/Joel

#164Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#162)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

+ oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));

-+ if (oprresult)
++ if (!locfcinfo->isnull && oprresult)
+ return true;
+ }

Is checking !locfcinfo->isnull due to something new in v2,
or what is just a correction for a problem also in v1?

The “!locfcinfo->isnull” is to protect against segmentation faults. I found
it was added to the original function which I adapted the “element” version
from.

/Mark

#165Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#163)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

test opr_sanity ... FAILED

AND binary_coercible(p2.opcintype, p1.amoplefttype));
amopfamily | amopstrategy | amopopr
------------+--------------+---------
-(0 rows)
+       2745 |            5 |    6105
+(1 row)

-- Operators that are primary members of opclasses must be immutable (else
-- it suggests that the index ordering isn't fixed). Operators that are

This is due using anycompatiblearray for the left operand in @>>.
To solve this problem we need to use @>>(anyarray,anyelement) or introduce
a new opclass for gin indices.
These are the two approaches that come to mind to solve this. Which one is
the right way or is there another solution I am not aware of?
That’s why I’m asking this on the mailing list, to get the community’s
input.

/Mark

#166Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#160)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Fri, Feb 12, 2021, at 20:56, Mark Rofail wrote:

Attachments:
anyarray_anyelement_operators-v2.patch

I've created a quite sophisticated test in PL/pgSQL,
that takes advantage of all the test data produced
by the official PostgreSQL regression test suite.

It goes through all tables and columns, and extracts values
for all the different types it can find.

It then uses these values to probe for differences between

some_value::some_type = ANY(ARRAY[some_other_value]::some_other_type[])
and
some_value::some_type <<@ ARRAY[some_other_value]::some_other_type[]

psql:type-test.sql:165: NOTICE:
========================
144 of 21632 tests failed.
========================

Out of these 144 differences found, this one was really interesting:

psql:type-test.sql:165: WARNING:
SQL queries produced different results:
SELECT '285970053'::pg_catalog."numeric" = ANY(ARRAY['285970053']::pg_catalog.float4[])
false
SELECT '285970053'::pg_catalog."numeric" <<@ ARRAY['285970053']::pg_catalog.float4[]
true

I don't see why one of them returns false and the other true?

If testing for equality:

SELECT '285970053'::pg_catalog.float4 = '285970053'::numeric;

You get "false".

So it looks like ANY() does the right thing here, and <<@ has a problem.

To run, first run the PostgreSQL regression tests, to produce data in the "regression" database.

Then run:

$ psql -f type-test.sql regression

/Joel

Attachments:

type-test.sqlapplication/octet-stream; name=type-test.sqlDownload
type-test.outapplication/octet-stream; name=type-test.outDownload
#167Joel Jacobson
joel@compiler.org
In reply to: Joel Jacobson (#166)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sat, Feb 13, 2021, at 12:35, Joel Jacobson wrote:

psql:type-test.sql:165: WARNING:
SQL queries produced different results:
SELECT '285970053'::pg_catalog."numeric" = ANY(ARRAY['285970053']::pg_catalog.float4[])
false
SELECT '285970053'::pg_catalog."numeric" <<@ ARRAY['285970053']::pg_catalog.float4[]
true

I think I've figured this one out.

It looks like the ANY() case converts the float4-value to numeric and then compare it with the numeric-value,
while in the <<@ case converts the numeric-value to float4 and then compare it with the float4-value.

Since '285970053'::numeric::float4 = '285970053'::float4 is TRUE,
while '285970053'::float4::numeric = '285970053'::numeric is FALSE,
this gives a different result.

Is it documented somewhere which type is picked as the type for the comparison?

"The common type is selected following the same rules as for UNION and related constructs (see Section 10.5)."
(https://www.postgresql.org/docs/current/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC)

SELECT (SELECT '285970053'::numeric UNION SELECT '285970053'::float4) = '285970053'::float4;
?column?
----------
t
(1 row)

Apparently float4 is selected as the common type according to these rules.

So the <<@ operator seems to be doing the right thing. But in the ANY() case, it seems to convert the float4 element in the float4[] array to numeric, and then compare the numeric values.

I can see how this is normal and expected, but it was a bit surprising to me at first.

/Joel

#168Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#165)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi all,

I've reviewed Mark's anyarray_anyelement_operators-v2.patch
and the only remaining issue I've identified is the opr_sanity problem.

Mark seems to be in need of some input here from more experienced hackers, see below.

Hopefully someone can guide him in the right direction.

/Joel

Show quoted text

On Sat, Feb 13, 2021, at 11:49, Mark Rofail wrote:

Hey Joel,

test opr_sanity ... FAILED

AND binary_coercible(p2.opcintype, p1.amoplefttype));
amopfamily | amopstrategy | amopopr
------------+--------------+---------
-(0 rows)
+       2745 |            5 |    6105
+(1 row)
-- Operators that are primary members of opclasses must be immutable (else
-- it suggests that the index ordering isn't fixed).  Operators that are
This is due using anycompatiblearray for the left operand in @>>. 
To solve this problem we need to use @>>(anyarray,anyelement) or introduce a new opclass for gin indices. 
These are the two approaches that come to mind to solve this. Which one is the right way or is there another solution I am not aware of?
That’s why I’m asking this on the mailing list, to get the community’s input.
#169Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#168)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Dear All,

I know that avoiding trivial coercion problems is convenient but at the end
of the day, it's the DB Architect's job to use the proper tables to be able
to use FK Arrays.
For instance, if we have two tables, TABLE A (atest1 int2) and TABLE B
(btest1 int, btest2 int4[]) and an FK constraint between A(atest1) and
B(btest2), it simply shouldn't work. btest2 should be of type int2[].
Thus, I have reverted back the signature @>>(anyarray,anyelement) and
<<@(anyelement,anyarray). I am open to discuss this if anyone has any
input, would be appreciated.

Please find the "anyarray_anyelement_operators-v3.patch" attached below.

Changelog:
- v3 (compatible with current master 2021-02-15,
commit 0e5290312851557ee24e3d6103baf14d6066695c)
* refactor ginqueryarrayextract in ginarrayproc.c
* revert back the signature @>>(anyarray,anyelement) and
<<@(anyelement,anyarray)

On Mon, Feb 15, 2021 at 5:35 PM Joel Jacobson <joel@compiler.org> wrote:

Show quoted text

Hi all,

I've reviewed Mark's anyarray_anyelement_operators-v2.patch
and the only remaining issue I've identified is the opr_sanity problem.

Mark seems to be in need of some input here from more experienced hackers,
see below.

Hopefully someone can guide him in the right direction.

/Joel

On Sat, Feb 13, 2021, at 11:49, Mark Rofail wrote:

Hey Joel,

test opr_sanity ... FAILED

AND binary_coercible(p2.opcintype, p1.amoplefttype));
amopfamily | amopstrategy | amopopr
------------+--------------+---------
-(0 rows)
+       2745 |            5 |    6105
+(1 row)
-- Operators that are primary members of opclasses must be immutable (else
-- it suggests that the index ordering isn't fixed).  Operators that are
This is due using anycompatiblearray for the left operand in @>>.
To solve this problem we need to use @>>(anyarray,anyelement) or

introduce a new opclass for gin indices.

These are the two approaches that come to mind to solve this. Which one

is the right way or is there another solution I am not aware of?

That’s why I’m asking this on the mailing list, to get the community’s

input.

Attachments:

anyarray_anyelement_operators-v3.patchtext/x-patch; charset=US-ASCII; name=anyarray_anyelement_operators-v3.patchDownload
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 1ab31a9056..5fc624e621 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anycompatiblenonarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anycompatiblenonarray</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..a744609a6b 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anycompatiblenonarray)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anycompatiblenonarray,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..8650c62201 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element adapted from
+ * array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 1487710d59..aa9d9f7291 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
fk_arrays_elem_v1.patchtext/x-patch; charset=US-ASCII; name=fk_arrays_elem_v1.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea222c0464..2a9ecd40d4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1cb9172a5f..a0c24a8c8e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2053,6 +2053,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..7b0cff9f1b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,82 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+			Oid			candidateopr;
+			List	   	*opname;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			opname = list_make1(makeString("<<@"));
+			candidateopr = compatible_oper_opid(opname, pktype, fktypoid[i], false);
+			if(!OidIsValid(candidateopr))
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8935,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +9001,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9014,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9058,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9128,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9214,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9263,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9397,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9433,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9542,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9575,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9619,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9690,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9725,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9805,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9844,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..6655a617db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..dd83ca6213 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..e7c09d71ac
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,748 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  invalid input syntax for type integer: "A"
+LINE 1: DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+                                                 ^
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  invalid input syntax for type integer: "B"
+LINE 1: UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+                                                           ^
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {1}     |      1
+ {2}     |      2
+ {3}     |      3
+ {1,2,3} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({1,2,5}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat similar test using vectors isntead of arrays
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+  ftest1   | ftest2 
+-----------+--------
+ 5         |      1
+ 3 5 2 5   |      3
+ 3 5 4 1 3 |      5
+ 5 1       |      7
+ 3 4 5 3   |     10
+(5 rows)
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+ERROR:  foreign key constraint "fktableforarray_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type integer which does not have a default btree operator class that's compatible with class "float8_ops".
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has element type character which does not have a default btree operator class that's compatible with class "int4_ops".
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE PKTABLEVIOLATING;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..f7b18fffb8
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,588 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT2 keys coerced from INT4
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int4 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using INT4 keys coerced from INT2
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int2 PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test 1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test 2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test 3');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1], 1);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[2], 2);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[3], 3);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,3], 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[4], 5);
+INSERT INTO FKTABLEFORARRAY VALUES (ARRAY[1,2,5], 6);
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat similar test using vectors isntead of arrays
+
+-- Insert test data into PKTABLEFORARRAY
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int2vector,
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+CREATE INDEX ON FKTABLEFORARRAY USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAY VALUES ('5', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 2', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 2 5', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 4', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 5 4 1 3', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('1', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('5 1', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('2 1 2 4 1', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('4 2', 9);
+INSERT INTO FKTABLEFORARRAY VALUES ('3 4 5 3', 10);
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAY WHERE ftest1 @>> 5;
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=6;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using FLOAT8 keys coerced from INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text );
+-- XXX this really ought to work, but currently we must disallow it
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+DROP TABLE FKTABLEVIOLATING;
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+DROP TABLE PKTABLEVIOLATING;
#170Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#169)
3 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Mon, Feb 15, 2021, at 20:34, Mark Rofail wrote:

Dear All,

I know that avoiding trivial coercion problems is convenient but at the end of the day,
it's the DB Architect's job to use the proper tables to be able to use FK Arrays.
For instance, if we have two tables, TABLE A (atest1 int2) and TABLE B (btest1 int, btest2 int4[])
and an FK constraint between A(atest1) and B(btest2), it simply shouldn't work. btest2 should be of type int2[].
Thus, I have reverted back the signature @>>(anyarray,anyelement) and <<@(anyelement,anyarray).
I am open to discuss this if anyone has any input, would be appreciated.

I agree, I think this is a wise decision.
This reduces complexity to the actual need for fk_arrays_elem_v1.patch,
and eliminates an entire class of possible bugs.

Please find the "anyarray_anyelement_operators-v3.patch" attached below.
Changelog:
- v3 (compatible with current master 2021-02-15, commit 0e5290312851557ee24e3d6103baf14d6066695c)
* refactor ginqueryarrayextract in ginarrayproc.c
* revert back the signature @>>(anyarray,anyelement) and <<@(anyelement,anyarray)

Hmm, I think it looks like you forgot to update the documentation?

It still says anycompatiblenonarray:

@ doc/src/sgml/func.sgml
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anycompatiblenonarray</type>
+        <type>anycompatiblenonarray</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
@ src/sgml/gin.sgml
+      <entry><literal>@&gt;&gt; (anyarray,anycompatiblenonarray)</literal></entry>
+      <entry><literal>&lt;&lt;@ (anycompatiblenonarray,anyarray)</literal></entry>

Should it be anyelement in combination with anyarray?

Anyway, I've tested the patch, not only using your tests, but also the attached test.

The test has been auto-generated by type-test.sql (attached) mining values
of different types from the regression database, and then ensuring there
are no non-null differences between these three queries:

SELECT value1::type1 = ANY(ARRAY[value2::type2]);
SELECT value1::type1 <<@ ARRAY[value2::type2];
SELECT ARRAY[value2::type1] @>> value1::type2;

It tests a huge number of different type combinations, and reports any problems.

For the values which types could actually be compared (now only when types are the same),
it outputs the queries and results, from which the attached tests have been created.

No problems were found. Good.

/Joel

Attachments:

type-test.sqlapplication/octet-stream; name=type-test.sqlDownload
anyarray_anyelement_operators.expectedapplication/octet-stream; name=anyarray_anyelement_operators.expectedDownload
anyarray_anyelement_operators.sqlapplication/octet-stream; name=anyarray_anyelement_operators.sqlDownload
#171Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#170)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

Hmm, I think it looks like you forgot to update the documentation? It still

says anycompatiblenonarray.

Yeah. my bad. Fixed and included below in v4.

Anyway, I've tested the patch, not only using your tests, but also the

attached test.
No problems were found. Good.

That's great!

Thank you, Joel, for your thorough review and creative tests!

Changelog:
- anyarray_anyelement_operators-v4 (compatible with current master
2021-02-16, commit f672df5fdd22dac14c98d0a0bf5bbaa6ab17f8a5)
* revert anycompatiblenonarray in docs to anyelement

- fk_arrays_elem_v2:
* remove coercion support in regression tests
* update to be compatible with anyarray_anyelement_operators-v4

/Mark

Attachments:

fk_arrays_elem_v2.patchapplication/x-patch; name=fk_arrays_elem_v2.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index db29905e91..6c81596ed0 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..3f2b69b4f3 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,116 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define a Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    On top of standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type of the corresponding
+    referenced column.
+   
+    However, it is very important to note that, currently, we only support
+    one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..ed5b1b1863 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies a 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the refrencing column using GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1514937748..48c6d3aaa8 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2109,6 +2109,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..e2a8f2791c 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8931,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +8997,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9010,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9054,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9124,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9210,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9259,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9393,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9429,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9538,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9571,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9615,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9686,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9721,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9801,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9840,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 8908847c6c..5ced45a857 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..6655a617db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be oen of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,27 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	Assert(**reftypes != NULL);
+	Assert(**names != NULL);
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..dd83ca6213 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for FArray Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..8be43b37a4
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,617 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..62242f78b7
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,473 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the refrencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid refrencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
anyarray_anyelement_operators-v4.patchapplication/x-patch; name=anyarray_anyelement_operators-v4.patchDownload
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 1ab31a9056..a7cfb16d8b 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..8650c62201 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element adapted from
+ * array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 1487710d59..aa9d9f7291 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
#172Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#171)
Re: GSoC 2017: Foreign Key Arrays

The following review has been posted through the commitfest application:
make installcheck-world: tested, passed
Implements feature: tested, passed
Spec compliant: tested, passed
Documentation: tested, passed

I've tested and reviewed anyarray_anyelement_operators-v4.patch.

The added code is based on array_contain_compare() and the changes are mostly mechanical.

The new status of this patch is: Ready for Committer

#173Joel Jacobson
joel@compiler.org
In reply to: Mark Rofail (#171)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi all,

On Tue, Feb 16, 2021, at 11:07, Mark Rofail wrote:

Changelog:
- anyarray_anyelement_operators-v4 (compatible with current master 2021-02-16, >commit f672df5fdd22dac14c98d0a0bf5bbaa6ab17f8a5)
* revert anycompatiblenonarray in docs to anyelement

Good.

I've marked anyarray_anyelement_operators-v4 "Ready for Committer".

- fk_arrays_elem_v2:
* remove coercion support in regression tests
* update to be compatible with anyarray_anyelement_operators-v4

I will now proceed with the review of fk_arrays_elem_v2 as well.

/Joel

#174Mark Rofail
markm.rofail@gmail.com
In reply to: Joel Jacobson (#173)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Joel,

I will now proceed with the review of fk_arrays_elem_v2 as well.

Great work!!

/Mark

Show quoted text
#175Justin Pryzby
pryzby@telsasoft.com
In reply to: Mark Rofail (#171)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Tue, Feb 16, 2021 at 12:07:10PM +0200, Mark Rofail wrote:
...

There's some errors in the latest patch:

http://cfbot.cputube.org/mark-rofail.html

gram.y:16933:20: error: invalid operands to binary expression ('List' (aka 'struct List') and 'void *')
Assert(**reftypes != NULL);

Did you mean to write this, before the assignment of NIL ?

Assert(reftypes != NULL);
Assert(names != NULL);

Apparently these Asserts were added last month.

The windows build succeeded, but checks failed like:

 SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
    ftest1    | ftest2 
--------------+--------
- {5}         |      1
- {3,5,2,5}   |      3
- {3,5,4,1,3} |      5
- {5,1}       |      7
- {3,4,5,3}   |     10
-(5 rows)
+--------+--------
+(0 rows)

Would you send an updated patch to address these ?

I suggest to generate the patch series with:
git format-patch -v2 origin.. -o patch/foreign-key-arrays/

That generates patches with a prefix like 0001, indicating which one goes
"first" (and therefore doesn't depend on the others).

--
Justin

#176Mark Rofail
markm.rofail@gmail.com
In reply to: Justin Pryzby (#175)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Justin,

Thank you for your review!

gram.y:16933:20: error: invalid operands to binary expression ('List' (aka

'struct List') and 'void *')
Assert(**reftypes != NULL);

Did you mean to write this, before the assignment of NIL ?

Fixed in v5 below.

The windows build succeeded, but checks failed like:

SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
ftest1    | ftest2
--------------+--------
- {5}         |      1
- {3,5,2,5}   |      3
- {3,5,4,1,3} |      5
- {5,1}       |      7
- {3,4,5,3}   |     10
-(5 rows)
+--------+--------
+(0 rows)

can't seem to reproduce it. Will try to debug them with the next CI check.

I suggest to generate the patch series with:

git format-patch -v2 origin.. -o patch/foreign-key-arrays/

I like this format, thanks for the suggestion!

Changelog:
- v5 (compatible with current master 2021-2-23,
commit 8deb6b38dc4c7a7fd4719ee45e4b00d62b27dffe)
* correct all reported spelling mistakes
* correct bug in "gram.y"

/Mark

Attachments:

v5-0002-fk-arrays-elems.patchtext/x-patch; charset=US-ASCII; name=v5-0002-fk-arrays-elems.patchDownload
From 9d67c02bb0101dc06be5b957b4a80f2ab4a98019 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Tue, 23 Feb 2021 23:51:24 +0200
Subject: [PATCH v5 2/2] fk arrays elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 ++++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 617 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 473 +++++++++++++++++
 26 files changed, 1832 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index db29905e91..6c81596ed0 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..fc47ac94de 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 3b2b227683..a7476f655f 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4ef61b5efd..c315142733 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2110,6 +2110,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index b2457a6924..654f3ae3a4 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8931,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +8997,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9010,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9054,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9124,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9210,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9259,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9393,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9429,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9538,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9571,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9615,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9686,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9721,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9801,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9840,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 8908847c6c..5ced45a857 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..78b63298db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 75266caeb4..7d752c1f53 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..c28e415992
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,617 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    | ftest2 
+-------------+--------
+ {5}         |      1
+ {3,5,2,5}   |      3
+ {3,5,4,1,3} |      5
+ {5,1}       |      7
+ {3,4,5,3}   |     10
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..d3ee836068
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,473 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Try using the indexable operator
+SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

v5-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v5-0001-anyarray_anyelement_operators.patchDownload
From 1db3c89e9c4a723794d3e9e86a4c9692b4598f6b Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Tue, 23 Feb 2021 23:00:06 +0200
Subject: [PATCH v5 1/2] elem operator

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  43 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 11 files changed, 333 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index d8224272a5..9117279690 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..f8cbf64c9e 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 16044125ba..2b95faaea9 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
-- 
2.27.0

#177Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#176)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello All,

This is just a rebase patch since the patch is no longer applicable to the
current master.

I am still figuring out the discrepancy in the windows regression tests,
building postgres on windows is an absolute nightmare.

Since the first part of the patch "anyarray_anyelement_operators" was
approved by the reviewer, I suggest that a committer takes a look at it,
till I figure out the problem in the second part's regression tests.

Changelog:
- v6 (compatible with current master 2020-3-3,
commit 3769e11a31831fc2f3bd4c4a24b4f45c352fb8fb)
* rebase to current master

/Mark

Attachments:

v6-0002-fk-arrays-elems.patchtext/x-patch; charset=US-ASCII; name=v6-0002-fk-arrays-elems.patchDownload
From b85ce7d3292d49a93aaf0521b53d50f4b9fdb94b Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Wed, 3 Mar 2021 23:27:21 +0200
Subject: [PATCH v6 2/2] fk arrays elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++--
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 606 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 470 ++++++++++++++++++
 26 files changed, 1818 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b1de6d0674..e8be7a0229 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..fc47ac94de 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 3b2b227683..a7476f655f 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4ef61b5efd..c315142733 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2110,6 +2110,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 559fa1d2e5..075f9fe9ca 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8485,6 +8485,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8492,9 +8493,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8583,6 +8586,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8594,6 +8598,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8707,6 +8759,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8806,6 +8930,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8865,6 +8996,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8877,6 +9009,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8920,7 +9053,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8990,6 +9123,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9075,7 +9209,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9124,7 +9258,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9258,6 +9392,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9293,6 +9428,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9401,6 +9537,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9433,8 +9570,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9477,6 +9614,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9547,6 +9685,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9581,7 +9720,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9660,6 +9800,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9698,6 +9839,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4e4e05844c..90c7495354 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index aaba1ec2c4..eccb487058 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3032,6 +3032,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8fc432bfe1..b3750256ad 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3641,6 +3641,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 652be0b96d..1264da7f6f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15332,6 +15375,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15868,6 +15912,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16887,6 +16932,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 75266caeb4..7d752c1f53 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 879288c139..400312bf46 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11402,16 +11476,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d110d953bd
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,606 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index c77b0d7342..0977d902c8 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 0264a97324..8899c2e614 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..c5ff78b764
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,470 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

v6-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v6-0001-anyarray_anyelement_operators.patchDownload
From 66210f1cbe5bc877886c302c9e1d67e0d39aff24 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Wed, 3 Mar 2021 23:14:14 +0200
Subject: [PATCH v6 1/2] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  43 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 11 files changed, 333 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index bf99f82149..0a9b0d3ca9 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17539,6 +17539,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..f8cbf64c9e 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 3d3974f467..94c560fb5d 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
-- 
2.27.0

#178Justin Pryzby
pryzby@telsasoft.com
In reply to: Mark Rofail (#177)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Wed, Mar 03, 2021 at 11:31:49PM +0200, Mark Rofail wrote:

This is just a rebase patch since the patch is no longer applicable to the
current master.

It doesn't just rebase: it also removes the test which was failing on windows
CI:

--- Try using the indexable operator
-SELECT * FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;

Changelog:
- v6 (compatible with current master 2020-3-3,
commit 3769e11a31831fc2f3bd4c4a24b4f45c352fb8fb)
* rebase to current master

I think the SELECT, when it works, is actually doing a seq scan and not using
the index. On my PC, the index scan is used until an autovacuum/analyze run,
after which it uses seqscan. I'm not sure how the other CIs all managed to run
autovacuum between creating a table and running a query on it, though.

I guess you should first run the query with "explain (costs off)" to show what
plan it's using, and add things like "SET enable_seqscan=off" as needed to
guarantee that everyone will use the same plan, regardless of minor cost
differences and vacuum timing.

--
Justin

#179Mark Rofail
markm.rofail@gmail.com
In reply to: Justin Pryzby (#178)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Justin,

It doesn't just rebase: it also removes the test which was failing on

windows
CI:

My apologies, I didn’t include it in the changelog since this is not a code
change, just wanted to see if any other test would fail on the windows CI

I think the SELECT, when it works, is actually doing a seq scan and not

using
the index. On my PC, the index scan is used until an autovacuum/analyze
run,
after which it uses seqscan. I'm not sure how the other CIs all managed
to run
autovacuum between creating a table and running a query on it, though.

This is genius! That explains it. I have been racking my brain for two
weeks now and you figured it out.

I guess you should first run the query with "explain (costs off)" to show

what
plan it's using, and add things like "SET enable_seqscan=off" as needed to
guarantee that everyone will use the same plan, regardless of minor cost
differences and vacuum timing.

I think that will solve the test discrepancy.

Honestly Justin, hats off!

/Mark

Show quoted text
#180Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#179)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Dear All,

I have retested the patch on a windows build and it passes the regression
tests thanks to Justin's recommendations. Hopefully, it will pass CI too.

Changelog:
- v7 (compatible with current master 2021-3-12,
commit 02b5940dbea17d07a1dbcba3cbe113cc8b70f228)
* re-add failing regression test with fixes
* rebase patch

/Mark

On Thu, Mar 4, 2021 at 12:22 AM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

Hello Justin,

It doesn't just rebase: it also removes the test which was failing on

windows
CI:

My apologies, I didn’t include it in the changelog since this is not a
code change, just wanted to see if any other test would fail on the windows
CI

I think the SELECT, when it works, is actually doing a seq scan and not

using
the index. On my PC, the index scan is used until an autovacuum/analyze
run,
after which it uses seqscan. I'm not sure how the other CIs all managed
to run
autovacuum between creating a table and running a query on it, though.

This is genius! That explains it. I have been racking my brain for two
weeks now and you figured it out.

I guess you should first run the query with "explain (costs off)" to show

what
plan it's using, and add things like "SET enable_seqscan=off" as needed to
guarantee that everyone will use the same plan, regardless of minor cost
differences and vacuum timing.

I think that will solve the test discrepancy.

Honestly Justin, hats off!

/Mark

Attachments:

v7-0002-fk_arrays_elems.patchtext/x-patch; charset=US-ASCII; name=v7-0002-fk_arrays_elems.patchDownload
From 5c89f5fbe278b7ed5e95cf15d4733529b7e82f54 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Fri, 12 Mar 2021 23:31:41 +0200
Subject: [PATCH v7 2/2] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 627 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 26 files changed, 1844 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b1de6d0674..e8be7a0229 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 422c1180ba..21efe30843 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 71703da85a..c0d3ca2f78 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1032,10 +1032,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1060,6 +1060,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1123,7 +1135,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1133,6 +1146,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1144,6 +1158,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1159,6 +1174,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2306,6 +2388,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4ef61b5efd..c315142733 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2110,6 +2110,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 559fa1d2e5..075f9fe9ca 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8485,6 +8485,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8492,9 +8493,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8583,6 +8586,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8594,6 +8598,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8707,6 +8759,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8806,6 +8930,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8865,6 +8996,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8877,6 +9009,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8920,7 +9053,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8990,6 +9123,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9075,7 +9209,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9124,7 +9258,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9258,6 +9392,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9293,6 +9428,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9401,6 +9537,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9433,8 +9570,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9477,6 +9614,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9547,6 +9685,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9581,7 +9720,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9660,6 +9800,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9698,6 +9839,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4e4e05844c..90c7495354 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index da91cbd2b1..05875012f2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3033,6 +3033,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 6493a03ff8..82e95c1a87 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3643,6 +3643,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 652be0b96d..1264da7f6f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15332,6 +15375,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15868,6 +15912,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16887,6 +16932,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index d56f81c79f..c31138bbb5 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -799,6 +799,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 09a2ad2881..e7d6cd744f 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,9 +111,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -187,7 +189,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -346,6 +349,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -359,6 +363,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -368,6 +380,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -376,18 +395,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -506,7 +551,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -696,7 +742,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -802,7 +849,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -921,7 +969,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1101,7 +1150,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1374,6 +1424,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1391,13 +1449,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1408,15 +1488,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1432,10 +1520,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1651,7 +1744,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1836,11 +1930,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2094,7 +2189,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 879288c139..400312bf46 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11402,16 +11476,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..4dc4a01233
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,627 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SET enable_seqscan=off; -- to ensure GIN index is used
+EXPLAIN (COSTS OFF) SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+                        QUERY PLAN                        
+----------------------------------------------------------
+ Bitmap Heap Scan on fktableforarraygin
+   Recheck Cond: (ftest1 @>> 5)
+   ->  Bitmap Index Scan on fktableforarraygin_ftest1_idx
+         Index Cond: (ftest1 @>> 5)
+(4 rows)
+
+SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    
+-------------
+ {5}
+ {3,5,2,5}
+ {3,5,4,1,3}
+ {5,1}
+ {3,4,5,3}
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e280198b17..ec01fffc97 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 6a57e889a1..35c7eaff5a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..17f378cb95
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SET enable_seqscan=off; -- to ensure GIN index is used
+EXPLAIN (COSTS OFF) SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

v7-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v7-0001-anyarray_anyelement_operators.patchDownload
From 1cf1ddc08b36729252e1780645771a234a56ea30 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Fri, 12 Mar 2021 23:23:10 +0200
Subject: [PATCH v7 1/2] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  43 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 11 files changed, 333 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 9492a3c6b9..04216e96a3 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17539,6 +17539,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 17a16b4c5c..518d3aaaf9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 61361a6bc9..ba9d89eca3 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8200,6 +8200,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 3e3a1beaab..03ce07e219 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 912233ef96..944fa3afdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
-- 
2.27.0

#181Justin Pryzby
pryzby@telsasoft.com
In reply to: Mark Rofail (#180)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Fri, Mar 12, 2021 at 11:32:27PM +0200, Mark Rofail wrote:

I have retested the patch on a windows build and it passes the regression
tests thanks to Justin's recommendations. Hopefully, it will pass CI too.

Changelog:
- v7 (compatible with current master 2021-3-12,
commit 02b5940dbea17d07a1dbcba3cbe113cc8b70f228)
* re-add failing regression test with fixes
* rebase patch

This still fails for CI (windows) and me (linux):

 SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
-   ftest1    
--------------
- {5}
- {3,5,2,5}
- {3,5,4,1,3}
- {5,1}
- {3,4,5,3}
-(5 rows)
+ ftest1 
+--------
+(0 rows)

You added enable_seqscan=off, and EXPLAIN to show that it uses an bitmap index
scan, but do you know why it failed ?

I guess the failure is in the first patch, but isn't caught by test cases until
the 2nd patch.

--
Justin

#182Mark Rofail
markm.rofail@gmail.com
In reply to: Justin Pryzby (#181)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Justin,

This still fails for CI (windows) and me (linux)

Can you provide more information about your Linux platform? So I may test
the errors for myself?

I guess the failure is in the first patch, but isn't caught by test cases
until
the 2nd patch

This actually uncovered that I didn't add tests for the new operators in
`gin.sql`, I have done so now, hopefully, that will help us uncover the
problem. Can you post the regression results for the v8 patch attached
below?

but do you know why it failed ?

No, unfortunately, it works well on my end and all CIs except windows. I
need to get my hands on an erroneous platform.

Changelog:
- v8 (compatible with current master 2021-03-13,
commit 9e294d0f34d6e3e4fecf6f190b48862988934cde)
* add gin tests to element operator patch

/Mark

Attachments:

v8-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v8-0001-anyarray_anyelement_operators.patchDownload
From 8e8d5d4ac032e8eee3e450d0abd66cd74d51bcd0 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 13 Mar 2021 12:01:21 +0200
Subject: [PATCH v8 1/2] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  43 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/gin.out        |  34 ++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 src/test/regress/sql/gin.sql             |   8 ++
 13 files changed, 375 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 9492a3c6b9..04216e96a3 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17539,6 +17539,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 17a16b4c5c..518d3aaaf9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 93393fcfd4..8d82e64f86 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8200,6 +8200,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 3e3a1beaab..03ce07e219 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 6402e89c7f..698d322e14 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -53,6 +53,40 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
      3
 (1 row)
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 1)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 999)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+     3
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     0
+(1 row)
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 explain (costs off)
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 912233ef96..944fa3afdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql
index 5194afcc1f..c9b40903c6 100644
--- a/src/test/regress/sql/gin.sql
+++ b/src/test/regress/sql/gin.sql
@@ -41,6 +41,14 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
 
 select count(*) from gin_test_tbl where i @> array[1, 999];
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+
+select count(*) from gin_test_tbl where i @>> 1;
+select count(*) from gin_test_tbl where i @>> 999;
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 
-- 
2.27.0

v8-0002-fk_arrays_elems.patchtext/x-patch; charset=US-ASCII; name=v8-0002-fk_arrays_elems.patchDownload
From c2eb309e5874146bbf48f157c4b0887d0f7ba7e5 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 13 Mar 2021 12:01:38 +0200
Subject: [PATCH v8 2/2] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 627 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 26 files changed, 1844 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b1de6d0674..e8be7a0229 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 422c1180ba..21efe30843 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 71703da85a..c0d3ca2f78 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1032,10 +1032,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1060,6 +1060,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1123,7 +1135,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1133,6 +1146,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1144,6 +1158,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1159,6 +1174,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2306,6 +2388,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4ef61b5efd..c315142733 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2110,6 +2110,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 559fa1d2e5..075f9fe9ca 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8485,6 +8485,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8492,9 +8493,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8583,6 +8586,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8594,6 +8598,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8707,6 +8759,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8806,6 +8930,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8865,6 +8996,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8877,6 +9009,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8920,7 +9053,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8990,6 +9123,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9075,7 +9209,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9124,7 +9258,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9258,6 +9392,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9293,6 +9428,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9401,6 +9537,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9433,8 +9570,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9477,6 +9614,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9547,6 +9685,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9581,7 +9720,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9660,6 +9800,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9698,6 +9839,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4e4e05844c..90c7495354 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index da91cbd2b1..05875012f2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3033,6 +3033,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 6493a03ff8..82e95c1a87 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3643,6 +3643,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 652be0b96d..1264da7f6f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15332,6 +15375,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15868,6 +15912,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16887,6 +16932,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index d56f81c79f..c31138bbb5 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -799,6 +799,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 09a2ad2881..e7d6cd744f 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,9 +111,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -187,7 +189,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -346,6 +349,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -359,6 +363,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -368,6 +380,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -376,18 +395,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -506,7 +551,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -696,7 +742,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -802,7 +849,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -921,7 +969,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1101,7 +1150,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1374,6 +1424,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1391,13 +1449,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1408,15 +1488,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1432,10 +1520,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1651,7 +1744,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1836,11 +1930,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2094,7 +2189,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 879288c139..400312bf46 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11402,16 +11476,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..4dc4a01233
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,627 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SET enable_seqscan=off; -- to ensure GIN index is used
+EXPLAIN (COSTS OFF) SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+                        QUERY PLAN                        
+----------------------------------------------------------
+ Bitmap Heap Scan on fktableforarraygin
+   Recheck Cond: (ftest1 @>> 5)
+   ->  Bitmap Index Scan on fktableforarraygin_ftest1_idx
+         Index Cond: (ftest1 @>> 5)
+(4 rows)
+
+SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    
+-------------
+ {5}
+ {3,5,2,5}
+ {3,5,4,1,3}
+ {5,1}
+ {3,4,5,3}
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e280198b17..ec01fffc97 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 6a57e889a1..35c7eaff5a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..17f378cb95
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SET enable_seqscan=off; -- to ensure GIN index is used
+EXPLAIN (COSTS OFF) SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

#183Mark Rofail
markm.rofail@gmail.com
In reply to: Mark Rofail (#182)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

This still fails for CI (windows) and me (linux)

Can you provide more information about your Linux platform? So I may test
the errors for myself?

Seems the new tests fails every CI. That’s good honestly, that we found
this problem.

The `arrays` regression test extensively test the new operators. So I think
the problem will be in when the operators are combined with the GIN index.

The problem is that the tests don’t fail on my linux build. Any idea how to
replicate the failed tests so I can debug?

/Mark

#184Justin Pryzby
pryzby@telsasoft.com
In reply to: Mark Rofail (#182)
3 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Sat, Mar 13, 2021 at 12:08:26PM +0200, Mark Rofail wrote:

I guess the failure is in the first patch, but isn't caught by test cases
until the 2nd patch

This actually uncovered that I didn't add tests for the new operators in
`gin.sql`, I have done so now, hopefully, that will help us uncover the
problem. Can you post the regression results for the v8 patch attached
below?

+++ b/src/test/regress/expected/gin.out
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+     3
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     0
+(1 row)

I think the expected results are actually wrong, with the linux CI failing but
actually returning the right results.

I have a fix which passes (modified) tests, although I doubt it's complete.

I think this patch will need additional review - more than I can give.

--
Justin

Attachments:

0001-anyarray_anyelement_operators.patchtext/x-diff; charset=us-asciiDownload
From a555aa2cf5efbd225a0e5000a6243ea010ad6bcd Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 13 Mar 2021 12:01:21 +0200
Subject: [PATCH 1/3] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  43 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/gin.out        |  34 ++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 src/test/regress/sql/gin.sql             |   8 ++
 13 files changed, 375 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index b7150510ab..9a3f79e3b7 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17525,6 +17525,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..b10bd04ec8 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,33 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = &PG_GETARG_DATUM(0);
+		nulls = &PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +137,14 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			/*
+			 * only items that match the queried element
+			 * are considered candidate
+			 */
+
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -185,6 +204,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* we will need recheck */
 			*recheck = true;
@@ -274,6 +294,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
 		case GinContainedStrategy:
 			/* can't do anything else useful here */
 			res = GIN_MAYBE;
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index f7012cc5d9..f8cbf64c9e 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 0d4eac8f96..7ef071135c 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 4e0c9be58c..8bc05707c7 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8180,6 +8180,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 8bc7721e7d..95c9ae5443 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 6402e89c7f..698d322e14 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -53,6 +53,40 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
      3
 (1 row)
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 1)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 999)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+     3
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     0
+(1 row)
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 explain (costs off)
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index c40619a8d5..b5eec945f7 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql
index 5194afcc1f..c9b40903c6 100644
--- a/src/test/regress/sql/gin.sql
+++ b/src/test/regress/sql/gin.sql
@@ -41,6 +41,14 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
 
 select count(*) from gin_test_tbl where i @> array[1, 999];
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+
+select count(*) from gin_test_tbl where i @>> 1;
+select count(*) from gin_test_tbl where i @>> 999;
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 
-- 
2.17.0

0002-fix.patchtext/x-diff; charset=us-asciiDownload
From a5c60daff01ee965a00ca23b766f6494e0313e2e Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 13 Mar 2021 15:51:29 -0600
Subject: [PATCH 2/3] fix

---
 src/backend/access/gin/ginarrayproc.c | 3 ++-
 src/test/regress/expected/gin.out     | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index b10bd04ec8..983cc42a86 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -93,7 +93,8 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	if (strategy == GinContainsElemStrategy)
 	{
 		/* single element is passed, set elems to its pointer */
-		elems = &PG_GETARG_DATUM(0);
+		elems = palloc(sizeof(*elems));
+		*elems = PG_GETARG_DATUM(0);
 		nulls = &PG_ARGISNULL(0);
 		nelems = 1;
 	}
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 698d322e14..7fc7436646 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -78,13 +78,13 @@ select count(*) from gin_test_tbl where i @>> 999;
 select count(*) from gin_test_tbl where i @>> 1;
  count 
 -------
-     3
+  2997
 (1 row)
 
 select count(*) from gin_test_tbl where i @>> 999;
  count 
 -------
-     0
+     3
 (1 row)
 
 -- Very weak test for gin_fuzzy_search_limit
-- 
2.17.0

0003-fk_arrays_elems.patchtext/x-diff; charset=us-asciiDownload
From aa6849636f48677679acbb3b389d453c0440a46d Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 13 Mar 2021 12:01:38 +0200
Subject: [PATCH 3/3] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 627 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 26 files changed, 1844 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ea222c0464..2a9ecd40d4 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 1e9a4625cc..fc47ac94de 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 569f4c9da7..1654c9a95e 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1031,10 +1031,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1059,6 +1059,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1122,7 +1134,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1132,6 +1145,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1143,6 +1157,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1158,6 +1173,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2305,6 +2387,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1cb9172a5f..a0c24a8c8e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2053,6 +2053,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..e2a8f2791c 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8486,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8493,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8584,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8595,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8708,6 +8760,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8807,6 +8931,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8866,6 +8997,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8878,6 +9010,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8921,7 +9054,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8991,6 +9124,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9076,7 +9210,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9125,7 +9259,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9259,6 +9393,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9294,6 +9429,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9402,6 +9538,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9434,8 +9571,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9478,6 +9615,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9548,6 +9686,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9582,7 +9721,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9661,6 +9801,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9699,6 +9840,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2d687f6dfb..4c6d3b63bf 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -809,6 +809,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 65bbc18ecb..0d5bf91439 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3011,6 +3011,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f5dcedf6e8..0c582bb3f7 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3630,6 +3630,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index dd72a9fc3c..78b63298db 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15321,6 +15364,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15857,6 +15901,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16876,6 +16921,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b31f3afa03..ccef8c8e0b 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -789,6 +789,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6e3a41062f..9e19df8403 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -108,9 +108,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -184,7 +186,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -342,6 +345,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -355,6 +359,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -364,6 +376,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -372,18 +391,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -502,7 +547,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -692,7 +738,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -798,7 +845,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -917,7 +965,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1097,7 +1146,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1370,6 +1420,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1387,13 +1445,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1404,15 +1484,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1428,10 +1516,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1647,7 +1740,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1832,11 +1926,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2066,7 +2161,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 4a9244f4f6..f6a2a0c402 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11391,16 +11465,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..4dc4a01233
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,627 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SET enable_seqscan=off; -- to ensure GIN index is used
+EXPLAIN (COSTS OFF) SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+                        QUERY PLAN                        
+----------------------------------------------------------
+ Bitmap Heap Scan on fktableforarraygin
+   Recheck Cond: (ftest1 @>> 5)
+   ->  Bitmap Index Scan on fktableforarraygin_ftest1_idx
+         Index Cond: (ftest1 @>> 5)
+(4 rows)
+
+SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+   ftest1    
+-------------
+ {5}
+ {3,5,2,5}
+ {3,5,4,1,3}
+ {5,1}
+ {3,4,5,3}
+(5 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 12bb67e491..62443a5ede 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 59b416fd80..603cc92a51 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -139,6 +139,7 @@ test: tsrf
 test: tid
 test: tidscan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..17f378cb95
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SET enable_seqscan=off; -- to ensure GIN index is used
+EXPLAIN (COSTS OFF) SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+SELECT ftest1 FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.17.0

#185Mark Rofail
markm.rofail@gmail.com
In reply to: Justin Pryzby (#184)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Justin,

I think the expected results are actually wrong, with the linux CI failing

but
actually returning the right results.

Yes, this was an oversight on my part. Fixed gin regression test expected
output.

I have a fix which passes (modified) tests, although I doubt it's

complete. I think this patch will need additional review - more than I can
give.

Actually, your fix led me in the right way, the issue was how windows
handle pointers.

This time around I have copied CFbot's CI config and cloned it to my repo
and started testing instead of spamming the mailing list with trial and
error patches. v9 now passes all tests on my CI, I guess we'll wait and see
what CFbot has to say.

Changelog:
- v9 (compatible with current master 2021-03-15,
commit eeb60e45d82d5840b713a8741ae552238d57e8b9)
* refractor "ginarrayproc.c" (fix pointer logic and refactor
ginconsistency + gintriconsistency)
* clean elementfk regression test
* fix gin regression test expected

/Mark

Attachments:

v9-0002-fk_arrays_elems.patchtext/x-patch; charset=US-ASCII; name=v9-0002-fk_arrays_elems.patchDownload
From b5ab390c85fb246ebbf9f94054937fbba8ef5512 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 15 Mar 2021 17:10:29 +0200
Subject: [PATCH v9 2/2] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 625 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 26 files changed, 1842 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b1de6d0674..e8be7a0229 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 422c1180ba..21efe30843 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 71703da85a..c0d3ca2f78 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1032,10 +1032,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1060,6 +1060,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1123,7 +1135,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1133,6 +1146,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1144,6 +1158,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1159,6 +1174,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2306,6 +2388,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4ef61b5efd..c315142733 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2110,6 +2110,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index c5c25ce11d..856b2b6775 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 559fa1d2e5..075f9fe9ca 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -447,12 +447,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8485,6 +8485,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8492,9 +8493,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8583,6 +8586,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8594,6 +8598,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8707,6 +8759,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8806,6 +8930,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8865,6 +8996,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8877,6 +9009,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8920,7 +9053,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8990,6 +9123,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9075,7 +9209,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9124,7 +9258,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9258,6 +9392,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9293,6 +9428,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9401,6 +9537,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9433,8 +9570,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9477,6 +9614,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9547,6 +9685,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9581,7 +9720,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9660,6 +9800,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9698,6 +9839,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4e4e05844c..90c7495354 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index da91cbd2b1..05875012f2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3033,6 +3033,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 6493a03ff8..82e95c1a87 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3643,6 +3643,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 652be0b96d..1264da7f6f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15332,6 +15375,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15868,6 +15912,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16887,6 +16932,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index d56f81c79f..c31138bbb5 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -799,6 +799,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 09a2ad2881..e7d6cd744f 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,9 +111,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -187,7 +189,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -346,6 +349,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -359,6 +363,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -368,6 +380,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -376,18 +395,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -506,7 +551,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -696,7 +742,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -802,7 +849,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -921,7 +969,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1101,7 +1150,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1374,6 +1424,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1391,13 +1449,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1408,15 +1488,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1432,10 +1520,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1651,7 +1744,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1836,11 +1930,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2094,7 +2189,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 879288c139..400312bf46 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11402,16 +11476,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d83040dbc3
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,625 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+ count 
+-------
+    10
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+ count 
+-------
+     5
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+ count 
+-------
+     5
+(1 row)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e280198b17..ec01fffc97 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 6a57e889a1..35c7eaff5a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..2b3ec36113
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

v9-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v9-0001-anyarray_anyelement_operators.patchDownload
From fc43fd3c6661e9a9043e8223859e064c840e9a46 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 15 Mar 2021 17:10:16 +0200
Subject: [PATCH v9 1/2] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  64 +++++++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/gin.out        |  34 ++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 src/test/regress/sql/gin.sql             |   8 ++
 13 files changed, 396 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 9492a3c6b9..04216e96a3 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17539,6 +17539,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..ca6a972ee3 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,37 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = palloc(sizeof(*elems));
+		*elems = PG_GETARG_DATUM(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nulls = palloc(sizeof(*nulls));
+		*nulls = PG_ARGISNULL(0);
 
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
+
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +141,9 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+				*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -210,6 +228,18 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
+			/* result is not lossy */
+			*recheck = false;
+
+			res = false;
+			for (i = 0; i < nkeys; i++) {
+				if(!nullFlags[i] && check[i]) {
+					res = true;
+					break;
+				}
+			}
+			break;
 		default:
 			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
 				 strategy);
@@ -295,6 +325,18 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
+			res = GIN_FALSE;
+			for (i = 0; i < nkeys; i++) {
+				if(!nullFlags[i] && check[i] == GIN_TRUE) {
+					res = GIN_TRUE;
+					break;
+				}
+				else if (check[i] == GIN_MAYBE) {
+					res = GIN_MAYBE;
+				}
+			}
+			break;
 		default:
 			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
 				 strategy);
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 17a16b4c5c..518d3aaaf9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 93393fcfd4..8d82e64f86 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8200,6 +8200,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 3e3a1beaab..03ce07e219 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 6402e89c7f..7fc7436646 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -53,6 +53,40 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
      3
 (1 row)
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 1)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 999)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+  2997
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     3
+(1 row)
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 explain (costs off)
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 912233ef96..944fa3afdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql
index 5194afcc1f..c9b40903c6 100644
--- a/src/test/regress/sql/gin.sql
+++ b/src/test/regress/sql/gin.sql
@@ -41,6 +41,14 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
 
 select count(*) from gin_test_tbl where i @> array[1, 999];
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+
+select count(*) from gin_test_tbl where i @>> 1;
+select count(*) from gin_test_tbl where i @>> 999;
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 
-- 
2.27.0

#186Andreas Karlsson
andreas@proxel.se
In reply to: Mark Rofail (#185)
2 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 3/15/21 4:29 PM, Mark Rofail wrote:

Actually, your fix led me in the right way, the issue was how windows
handle pointers.

Hi,

I have started working on a partially new strategy for the second patch.
The ideas are:

1. I have removed the dependency on count(DISTINCT ...) by using an
anti-join instead (this was implemented by Joel Jacobson with cleanup
and finishing touches by me). The code is much clearer now IMHO.

2. That instead of selecting operators at execution time we save which
operators to use in pg_constraint. This is heavily a work in progress in
my attached patches. I am not 100% convinced this is the right way to go
but I plan to work some on this this weekend to see how ti will work out.

Another thing I will look into is you gin patch. While you fixed it for
simple scalar types which fit into the Datum type I wonder if we do not
also need to copy types which are too large to fit into a Datum but I
have not investigated yet which memory context the datum passed to
ginqueryarrayextract() is allocated in.

Andreas

Attachments:

v10-0002-fk_arrays_elems.patchtext/x-patch; charset=UTF-8; name=v10-0002-fk_arrays_elems.patchDownload
From 5033bdd763ec92e33dab3f769c0ae5309b63df78 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 15 Mar 2021 17:10:29 +0200
Subject: [PATCH v10 2/2] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 105 ++++
 doc/src/sgml/ref/create_table.sgml       | 113 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/tablecmds.c         | 126 ++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 194 +++++--
 src/backend/utils/adt/ruleutils.c        |  88 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/test/regress/expected/element_fk.out | 625 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 24 files changed, 1808 insertions(+), 77 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b1de6d0674..e8be7a0229 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2646,6 +2646,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2701,6 +2711,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 422c1180ba..19ddcf1c52 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,111 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text
+);
+
+CREATE TABLE racing (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day date,
+    final_positions integer[],
+    FOREIGN KEY <emphasis>(EACH ELEMENT OF final_positions) REFERENCES drivers</emphasis>
+);
+</programlisting>
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
+
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+);
+
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 71703da85a..ac18c53578 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1032,10 +1032,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1060,6 +1060,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1123,7 +1135,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1133,6 +1146,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1144,6 +1158,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1159,6 +1174,89 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+<programlisting>
+CREATE TABLE pktableforarray (
+    ptest1 int2 PRIMARY KEY,
+    ptest2 text
+);
+
+CREATE TABLE fktableforarray (
+    ftest1 int4[],
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES pktableforarray,
+    ftest2 int
+);
+</programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+<programlisting>
+CREATE TABLE pktableforarray (
+    ptest1 int4 PRIMARY KEY,
+    ptest2 text
+);
+
+CREATE TABLE fktableforarray (
+    ftest1 int2[],
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES pktableforarray,
+    ftest2 int
+);        
+</programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2306,6 +2404,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9abc4a1f55..a9e2ab33b0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2463,6 +2463,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4ef61b5efd..c315142733 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2110,6 +2110,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 559fa1d2e5..91764a6a43 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -39,6 +39,7 @@
 #include "catalog/pg_inherits.h"
 #include "catalog/pg_namespace.h"
 #include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
 #include "catalog/pg_tablespace.h"
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_type.h"
@@ -447,12 +448,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8485,6 +8486,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8492,9 +8494,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_each_element;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8583,6 +8587,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8594,6 +8599,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_each_element = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_each_element)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_each_element = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_each_element)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8707,6 +8760,37 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8739,6 +8823,10 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			ffeqop = InvalidOid;
 		}
 
+		// XXX: Fix logic for selecting operators
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			ffeqop = ARRAY_EQ_OP;
+
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 		{
 			/*
@@ -8806,6 +8894,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8865,6 +8960,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8877,6 +8973,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -8920,7 +9017,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -8990,6 +9087,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9075,7 +9173,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9124,7 +9222,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9258,6 +9356,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9293,6 +9392,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9401,6 +9501,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9433,8 +9534,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9477,6 +9578,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9547,6 +9649,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9581,7 +9684,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9660,6 +9764,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9698,6 +9803,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4e4e05844c..90c7495354 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index da91cbd2b1..05875012f2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3033,6 +3033,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index c2d73626fc..67e001d822 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2642,6 +2642,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 6493a03ff8..82e95c1a87 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3643,6 +3643,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 652be0b96d..1264da7f6f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -134,6 +134,19 @@ typedef struct SelectLimit
 	LimitOption limitOption;
 } SelectLimit;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -191,6 +204,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -241,6 +255,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -375,6 +390,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -412,7 +428,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -642,7 +658,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3621,8 +3637,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3824,14 +3842,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3865,6 +3884,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15332,6 +15375,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15868,6 +15912,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16887,6 +16932,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index d56f81c79f..c31138bbb5 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -799,6 +799,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 09a2ad2881..5c61a07866 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -114,6 +114,7 @@ typedef struct RI_ConstraintInfo
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -352,42 +353,102 @@ RI_FKey_check(TriggerData *trigdata)
 		const char *querysep;
 		Oid			queryoids[RI_MAX_NUMKEYS];
 		const char *pk_only;
+		int			each_elem;
 
-		/* ----------
-		 * The query string built is
-		 *	SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
-		 *		   FOR KEY SHARE OF x
-		 * The type id's for the $ parameters are those of the
-		 * corresponding FK attributes.
-		 * ----------
-		 */
-		initStringInfo(&querybuf);
-		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
-		quoteRelationName(pkrelname, pk_rel);
-		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
-						 pk_only, pkrelname);
-		querysep = "WHERE";
-		for (int i = 0; i < riinfo->nkeys; i++)
+		for (each_elem = 0; each_elem < riinfo->nkeys; each_elem++)
+			if (riinfo->fk_reftypes[each_elem] == FKCONSTR_REF_EACH_ELEMENT)
+				break;
+
+		if (each_elem < riinfo->nkeys)
 		{
-			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
-			Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+			/*
+			 * The query string built is:
+			 *
+			 * SELECT 1 WHERE NOT EXISTS
+			 * (
+			 *   SELECT 1 FROM pg_catalog.unnest($1)
+			 *   WHERE unnest IS NOT NULL AND NOT EXISTS
+			 *   (
+			 *     SELECT 1 FROM [ONLY] pktable x WHERE pkatt1 = [$2 | unnest] [AND ...]
+			 *     FOR KEY SHARE OF x
+			 *   )
+			 * )
+			 *
+			 * The type ids for the $ parameters are those of the
+			 * corresponding FK attributes.
+			 */
+			initStringInfo(&querybuf);
+			pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+				"" : "ONLY ";
+			quoteRelationName(pkrelname, pk_rel);
+			appendStringInfo(&querybuf, "SELECT 1 WHERE NOT EXISTS ("
+							 "SELECT 1 FROM pg_catalog.unnest($%d) WHERE unnest IS NOT NULL"
+							 " AND NOT EXISTS (SELECT 1 FROM %s%s x",
+							 each_elem + 1, pk_only, pkrelname);
+			querysep = "WHERE";
+			for (int i = 0; i < riinfo->nkeys; i++)
+			{
+				Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+				Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+				quoteOneName(attname,
+							 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+				if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+					sprintf(paramname, "unnest");
+				else
+					sprintf(paramname, "$%d", i + 1);
+				ri_GenerateQual(&querybuf, querysep,
+					attname, pk_type,
+					riinfo->pf_eq_oprs[i],
+					paramname, fk_type);
+				querysep = "AND";
+				queryoids[i] = fk_type;
+			}
+			appendStringInfoString(&querybuf, " FOR KEY SHARE OF x))");
 
-			quoteOneName(attname,
-						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-			sprintf(paramname, "$%d", i + 1);
-			ri_GenerateQual(&querybuf, querysep,
-							attname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
-			querysep = "AND";
-			queryoids[i] = fk_type;
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
 		}
-		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
+		else
+		{
+			/*
+			 * The query string built is:
+			 *
+			 *	SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
+			 *		   FOR KEY SHARE OF x
+			 *
+			 * The type ids for the $ parameters are those of the
+			 * corresponding FK attributes.
+			 */
+			initStringInfo(&querybuf);
+			pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+				"" : "ONLY ";
+			quoteRelationName(pkrelname, pk_rel);
+			appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
+							 pk_only, pkrelname);
+			querysep = "WHERE";
+			for (int i = 0; i < riinfo->nkeys; i++)
+			{
+				Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+				Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+				quoteOneName(attname,
+							 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+				sprintf(paramname, "$%d", i + 1);
+				ri_GenerateQual(&querybuf, querysep,
+								attname, pk_type,
+								riinfo->pf_eq_oprs[i],
+								paramname, fk_type);
+				querysep = "AND";
+				queryoids[i] = fk_type;
+			}
+			appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
 	}
 
 	/*
@@ -695,7 +756,7 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
 							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
@@ -801,7 +862,7 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
 							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
@@ -920,7 +981,7 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			sprintf(paramname, "$%d", j + 1);
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
 							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
@@ -1100,7 +1161,7 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
 							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
@@ -1313,6 +1374,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	char		workmembuf[32];
 	int			spi_result;
 	SPIPlanPtr	qplan;
+	int 		each_elem;
 
 	riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false);
 
@@ -1374,6 +1436,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1391,13 +1461,30 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
+
 	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
 		"" : "ONLY ";
 	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
 		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	for (each_elem = 0; each_elem < riinfo->nkeys; each_elem++)
+		if (riinfo->fk_reftypes[each_elem] == FKCONSTR_REF_EACH_ELEMENT)
+			break;
+
+	if (each_elem < riinfo->nkeys)
+	{
+		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[each_elem]));
+		appendStringInfo(&querybuf, " FROM %s%s fk"
+						 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s)"
+						 " LEFT OUTER JOIN %s%s pk ON",
+						 fk_only, fkrelname, fkattname, pk_only, pkrelname);
+	}
+	else
+	{
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1408,15 +1495,22 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "unnest";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1432,10 +1526,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sunnest IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1650,7 +1749,7 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
-						riinfo->pf_eq_oprs[i],
+						riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
 						fkattname, fk_type);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
@@ -2094,7 +2193,8 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 879288c139..534920cd1b 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7ef510cd01..b43ca0e927 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4469,7 +4469,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 236832a2ca..8fd49aacd4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2189,6 +2189,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2229,6 +2233,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 28083aaac9..58b937ddfa 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -142,6 +142,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d83040dbc3
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,625 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+ count 
+-------
+    10
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+ count 
+-------
+     5
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+ count 
+-------
+     5
+(1 row)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e280198b17..ec01fffc97 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 6a57e889a1..35c7eaff5a 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..2b3ec36113
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.30.1

v10-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=UTF-8; name=v10-0001-anyarray_anyelement_operators.patchDownload
From 3365009d7d5ca9db5cc82e1e6cc721703f23fc09 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 15 Mar 2021 17:10:16 +0200
Subject: [PATCH v10 1/2] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  40 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/gin.out        |  34 ++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 src/test/regress/sql/gin.sql             |   8 ++
 13 files changed, 372 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 9492a3c6b9..04216e96a3 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17539,6 +17539,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..eb7d13dbba 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,35 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = palloc(sizeof(*elems));
+		*elems = PG_GETARG_DATUM(0);
+		nulls = palloc(sizeof(*nulls));
+		*nulls = PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +139,9 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -172,6 +188,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 			}
 			break;
 		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 			/* result is not lossy */
 			*recheck = false;
 			/* must have all elements in check[] true, and no nulls */
@@ -259,6 +276,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 			}
 			break;
 		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 17a16b4c5c..518d3aaaf9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 93393fcfd4..8d82e64f86 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8200,6 +8200,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 3e3a1beaab..03ce07e219 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 6402e89c7f..7fc7436646 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -53,6 +53,40 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
      3
 (1 row)
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 1)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 999)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+  2997
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     3
+(1 row)
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 explain (costs off)
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 912233ef96..944fa3afdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql
index 5194afcc1f..c9b40903c6 100644
--- a/src/test/regress/sql/gin.sql
+++ b/src/test/regress/sql/gin.sql
@@ -41,6 +41,14 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
 
 select count(*) from gin_test_tbl where i @> array[1, 999];
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+
+select count(*) from gin_test_tbl where i @>> 1;
+select count(*) from gin_test_tbl where i @>> 999;
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 
-- 
2.30.1

#187Mark Rofail
markm.rofail@gmail.com
In reply to: Andreas Karlsson (#186)
4 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Andreas and Joel!

Thank you so much for your hard work!

1. I have removed the dependency on count(DISTINCT ...) by using an

anti-join instead. The code is much clearer now IMHO.

It is much cleaner! I

2. That instead of selecting operators at execution time we save which

operators to use in pg_constraint.

This is a clever approach. If you have any updates on this please let me
know.

I am still reviewing your changes. I have split your changes from my work
to be able to isolate the changes and review them carefully. And to help
others review the changes.

Changelist:
- v11 (compatible with current master 2021, 03, 20,
commit e835e89a0fd267871e7fbddc39ad00ee3d0cb55c)
* rebase
* split andreas and joel's work

On Tue, Mar 16, 2021 at 1:27 AM Andreas Karlsson <andreas@proxel.se> wrote:

Show quoted text

On 3/15/21 4:29 PM, Mark Rofail wrote:

Actually, your fix led me in the right way, the issue was how windows
handle pointers.

Hi,

I have started working on a partially new strategy for the second patch.
The ideas are:

1. I have removed the dependency on count(DISTINCT ...) by using an
anti-join instead (this was implemented by Joel Jacobson with cleanup
and finishing touches by me). The code is much clearer now IMHO.

2. That instead of selecting operators at execution time we save which
operators to use in pg_constraint. This is heavily a work in progress in
my attached patches. I am not 100% convinced this is the right way to go
but I plan to work some on this this weekend to see how ti will work out.

Another thing I will look into is you gin patch. While you fixed it for
simple scalar types which fit into the Datum type I wonder if we do not
also need to copy types which are too large to fit into a Datum but I
have not investigated yet which memory context the datum passed to
ginqueryarrayextract() is allocated in.

Andreas

Attachments:

v11-0003-anyarray_anyelement_operators_edits.patchtext/x-patch; charset=US-ASCII; name=v11-0003-anyarray_anyelement_operators_edits.patchDownload
From 548157e177c4d8d5fda9881849bfacea6f83b81a Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 20 Mar 2021 20:29:24 +0200
Subject: [PATCH v11 3/4] anyarray_anyelement_operators_edits

---
 src/backend/access/gin/ginarrayproc.c | 30 +++------------------------
 1 file changed, 3 insertions(+), 27 deletions(-)

diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index ca6a972ee3..eb7d13dbba 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -95,10 +95,8 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 		/* single element is passed, set elems to its pointer */
 		elems = palloc(sizeof(*elems));
 		*elems = PG_GETARG_DATUM(0);
-
 		nulls = palloc(sizeof(*nulls));
 		*nulls = PG_ARGISNULL(0);
-
 		nelems = 1;
 	}
 	else
@@ -142,7 +140,7 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
 		case GinContainsElemStrategy:
-				*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
 			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
@@ -190,6 +188,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 			}
 			break;
 		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 			/* result is not lossy */
 			*recheck = false;
 			/* must have all elements in check[] true, and no nulls */
@@ -228,18 +227,6 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsElemStrategy:
-			/* result is not lossy */
-			*recheck = false;
-
-			res = false;
-			for (i = 0; i < nkeys; i++) {
-				if(!nullFlags[i] && check[i]) {
-					res = true;
-					break;
-				}
-			}
-			break;
 		default:
 			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
 				 strategy);
@@ -289,6 +276,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 			}
 			break;
 		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
@@ -325,18 +313,6 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
-		case GinContainsElemStrategy:
-			res = GIN_FALSE;
-			for (i = 0; i < nkeys; i++) {
-				if(!nullFlags[i] && check[i] == GIN_TRUE) {
-					res = GIN_TRUE;
-					break;
-				}
-				else if (check[i] == GIN_MAYBE) {
-					res = GIN_MAYBE;
-				}
-			}
-			break;
 		default:
 			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
 				 strategy);
-- 
2.27.0

v11-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v11-0001-anyarray_anyelement_operators.patchDownload
From f375453bb964a4ad90c69a05e83b6512e34c27ff Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 20 Mar 2021 20:16:53 +0200
Subject: [PATCH v11 1/4] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  64 +++++++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/gin.out        |  34 ++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 src/test/regress/sql/gin.sql             |   8 ++
 13 files changed, 396 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 68fe6a95b4..0a3479bae9 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17539,6 +17539,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..ca6a972ee3 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,37 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = palloc(sizeof(*elems));
+		*elems = PG_GETARG_DATUM(0);
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		nulls = palloc(sizeof(*nulls));
+		*nulls = PG_ARGISNULL(0);
 
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
+
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
+
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +141,9 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+				*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -210,6 +228,18 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
+			/* result is not lossy */
+			*recheck = false;
+
+			res = false;
+			for (i = 0; i < nkeys; i++) {
+				if(!nullFlags[i] && check[i]) {
+					res = true;
+					break;
+				}
+			}
+			break;
 		default:
 			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
 				 strategy);
@@ -295,6 +325,18 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 				}
 			}
 			break;
+		case GinContainsElemStrategy:
+			res = GIN_FALSE;
+			for (i = 0; i < nkeys; i++) {
+				if(!nullFlags[i] && check[i] == GIN_TRUE) {
+					res = GIN_TRUE;
+					break;
+				}
+				else if (check[i] == GIN_MAYBE) {
+					res = GIN_MAYBE;
+				}
+			}
+			break;
 		default:
 			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
 				 strategy);
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 17a16b4c5c..518d3aaaf9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 0f7ff63669..8a14fc7140 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index e259531f60..5be6674541 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8204,6 +8204,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 3e3a1beaab..03ce07e219 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 6402e89c7f..7fc7436646 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -53,6 +53,40 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
      3
 (1 row)
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 1)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 999)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+  2997
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     3
+(1 row)
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 explain (costs off)
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 254ca06d3d..5de5ab6d13 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2100,7 +2102,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(123 rows)
+(124 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 912233ef96..944fa3afdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql
index 5194afcc1f..c9b40903c6 100644
--- a/src/test/regress/sql/gin.sql
+++ b/src/test/regress/sql/gin.sql
@@ -41,6 +41,14 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
 
 select count(*) from gin_test_tbl where i @> array[1, 999];
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+
+select count(*) from gin_test_tbl where i @>> 1;
+select count(*) from gin_test_tbl where i @>> 999;
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 
-- 
2.27.0

v11-0002-fk_arrays_elems.patchtext/x-patch; charset=US-ASCII; name=v11-0002-fk_arrays_elems.patchDownload
From f58d5342b1463fa24e483abb23ff86d87da125c4 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 20 Mar 2021 20:17:39 +0200
Subject: [PATCH v11 2/4] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 625 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 26 files changed, 1842 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 68d1960698..9aad29139f 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2658,6 +2658,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2713,6 +2723,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index f073fbafd3..365e31c258 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index c6c248f1e9..319a419f78 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1063,10 +1063,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1091,6 +1091,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1154,7 +1166,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1164,6 +1177,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1175,6 +1189,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1190,6 +1205,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2364,6 +2446,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index d0ec44bb40..1dce20814a 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2467,6 +2467,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 397d70d226..00411fb025 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2111,6 +2111,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index 172ec6e982..648649ef44 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 9b2800bf5e..ed65a43145 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -448,12 +448,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8581,6 +8581,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8588,9 +8589,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8679,6 +8682,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8690,6 +8694,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8803,6 +8855,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8902,6 +9026,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -8961,6 +9092,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -8973,6 +9105,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -9016,7 +9149,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -9086,6 +9219,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9171,7 +9305,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9220,7 +9354,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9354,6 +9488,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9389,6 +9524,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9497,6 +9633,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9529,8 +9666,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9573,6 +9710,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9643,6 +9781,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9677,7 +9816,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9756,6 +9896,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9794,6 +9935,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4e4e05844c..90c7495354 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 2c20541e92..8e358dcca2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3034,6 +3034,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 3e980c457c..eb8941d4ec 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2645,6 +2645,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 305311d4a7..305446373c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3646,6 +3646,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index bc43641ffe..647ecb40d9 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -141,6 +141,19 @@ typedef struct GroupClause
 	List   *list;
 } GroupClause;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -198,6 +211,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -248,6 +262,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -384,6 +399,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -421,7 +437,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -654,7 +670,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3651,8 +3667,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3855,14 +3873,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3896,6 +3915,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15379,6 +15422,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15916,6 +15960,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16935,6 +16980,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index aa6c19adad..a768df64ca 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -800,6 +800,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 09a2ad2881..e7d6cd744f 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,9 +111,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -187,7 +189,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -346,6 +349,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -359,6 +363,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -368,6 +380,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -376,18 +395,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -506,7 +551,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -696,7 +742,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -802,7 +849,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -921,7 +969,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1101,7 +1150,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1374,6 +1424,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1391,13 +1449,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1408,15 +1488,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1432,10 +1520,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1651,7 +1744,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1836,11 +1930,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2094,7 +2189,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index f0de2a25c9..5300ce2276 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2006,7 +2009,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2014,13 +2018,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2028,13 +2040,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2363,6 +2377,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11404,16 +11478,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 20be094f46..bd91451621 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4472,7 +4472,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 68425eb2c0..49619f061f 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2202,6 +2202,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2242,6 +2246,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index ca1f950cbe..237c63c481 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -143,6 +143,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d83040dbc3
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,625 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+ count 
+-------
+    10
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+ count 
+-------
+     5
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+ count 
+-------
+     5
+(1 row)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 70c38309d7..d5d0b9a6ac 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index d81d04136c..9ed50ec10f 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -140,6 +140,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..2b3ec36113
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

v11-0004-fk_arrays_elems_edits.patchtext/x-patch; charset=US-ASCII; name=v11-0004-fk_arrays_elems_edits.patchDownload
From 60e27a669969b9fd7d5d8bccb83350492f92c224 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Sat, 20 Mar 2021 20:32:29 +0200
Subject: [PATCH v11 4/4] fk_arrays_elems_edits

---
 doc/src/sgml/ddl.sgml               |  82 +++++-----
 doc/src/sgml/ref/create_table.sgml  |  32 +++-
 src/backend/commands/matview.c      |   3 +-
 src/backend/commands/tablecmds.c    |  56 ++-----
 src/backend/utils/adt/ri_triggers.c | 246 +++++++++++++---------------
 src/backend/utils/adt/ruleutils.c   |  14 +-
 src/include/utils/builtins.h        |   3 +-
 7 files changed, 194 insertions(+), 242 deletions(-)

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 365e31c258..1f23e59904 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1111,23 +1111,21 @@ CREATE TABLE order_items (
     <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
     with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
     described in the following example:
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text
+);
 
-    <programlisting>
-     CREATE TABLE drivers (
-         driver_id integer PRIMARY KEY,
-         first_name text,
-         last_name text
-     );
-
-     CREATE TABLE racing (
-         race_id integer PRIMARY KEY,
-         title text,
-         race_day date,
-         final_positions integer[],
-         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
-     );
-    </programlisting>
-
+CREATE TABLE racing (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day date,
+    final_positions integer[],
+    FOREIGN KEY <emphasis>(EACH ELEMENT OF final_positions) REFERENCES drivers</emphasis>
+);
+</programlisting>
     The above example uses an array (<literal>final_positions</literal>) to
     store the results of a race: for each of its elements a referential
     integrity check is enforced on the <literal>drivers</literal> table. Note
@@ -1143,35 +1141,33 @@ CREATE TABLE order_items (
     Even though the most common use case for Array Element Foreign Keys constraint is on
     a single column key, you can define an Array Element Foreign Keys constraint on a
     group of columns.
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
 
-    <programlisting>
-     CREATE TABLE available_moves (
-         kind text,
-         move text,
-         description text,
-         PRIMARY KEY (kind, move)
-     );
-
-     CREATE TABLE paths (
-         description text,
-         kind text,
-         moves text[],
-         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
-     );
-
-     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
-     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
-     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
-     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
-     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
-     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
-     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
-     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
-
-     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
-     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
-    </programlisting>
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+);
 
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
     In addition to standard foreign key requirements, array
     <literal>ELEMENT</literal> foreign key constraints require that the
     referencing column is an array of a compatible type to the corresponding
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 319a419f78..80b0421a78 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1256,16 +1256,32 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       considerably enhances the performance. Also concerning coercion while using the 
       GIN index:
         
-      <programlisting>
-       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
-       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
-      </programlisting>
+<programlisting>
+CREATE TABLE pktableforarray (
+    ptest1 int2 PRIMARY KEY,
+    ptest2 text
+);
+
+CREATE TABLE fktableforarray (
+    ftest1 int4[],
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES pktableforarray,
+    ftest2 int
+);
+</programlisting>
       This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
 
-      <programlisting>
-       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
-       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
-      </programlisting>
+<programlisting>
+CREATE TABLE pktableforarray (
+    ptest1 int4 PRIMARY KEY,
+    ptest2 text
+);
+
+CREATE TABLE fktableforarray (
+    ftest1 int2[],
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES pktableforarray,
+    ftest2 int
+);        
+</programlisting>
        however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
        purpose of the index.
      </para>
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index 648649ef44..172ec6e982 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,8 +764,7 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype,
-										 FKCONSTR_REF_PLAIN);
+										 rightop, attrtype);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index ed65a43145..1798e0b8c9 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -40,6 +40,7 @@
 #include "catalog/pg_inherits.h"
 #include "catalog/pg_namespace.h"
 #include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
 #include "catalog/pg_tablespace.h"
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_type.h"
@@ -8593,7 +8594,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	int			numfks,
 				numpks;
 	Oid			indexOid;
-	bool		has_array;
+	bool		has_each_element;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8699,7 +8700,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 * format to pass to CreateConstraintEntry.
 	 */
 	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
-	has_array = false;
+	has_each_element = false;
 	i = 0;
 	foreach(lc, fkconstraint->fk_reftypes)
 	{
@@ -8712,12 +8713,12 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 				break;
 			case FKCONSTR_REF_EACH_ELEMENT:
 				/* At most one FK column can be an array reference */
-				if (has_array)
+				if (has_each_element)
 					ereport(ERROR,
 							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
 							 errmsg("foreign keys support only one array column")));
 
-				has_array = true;
+				has_each_element = true;
 				break;
 			default:
 				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
@@ -8731,7 +8732,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
 	* RESTRICT
 	*/
-	if (has_array)
+	if (has_each_element)
 	{
 		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
 			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
@@ -8861,8 +8862,6 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 		 */
 		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
 		{
-			Oid			elemopclass;
-
 			/* We check if the array element type exists and is of valid Oid */
 			fktype = get_base_element_type(fktype);
 			if (!OidIsValid(fktype))
@@ -8886,45 +8885,6 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 					errdetail("Unssupported relation between %s and %s.",
 							format_type_be(fktypoid[i]),
 							format_type_be(pktype))));
-
-			/*
-			 * For the moment, we must also insist that the array's element
-			 * type have a default btree opclass that is in the index's
-			 * opfamily.  This is necessary because ri_triggers.c relies on
-			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
-			 * on the array type, and we need those operations to have the
-			 * same notion of equality that we're using otherwise.
-			 *
-			 * XXX this restriction is pretty annoying, considering the effort
-			 * that's been put into the rest of the RI mechanisms to make them
-			 * work with nondefault equality operators.  In particular, it
-			 * means that the cast-to-PK-datatype code path isn't useful for
-			 * array-to-scalar references.
-			 */
-			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
-			if (!OidIsValid(elemopclass) ||
-				get_opclass_family(elemopclass) != opfamily)
-			{
-				/* Get the index opclass's name for the error message. */
-				char	   *opcname;
-
-				cla_ht = SearchSysCache1(CLAOID,
-										 ObjectIdGetDatum(opclasses[i]));
-				if (!HeapTupleIsValid(cla_ht))
-					elog(ERROR, "cache lookup failed for opclass %u",
-						 opclasses[i]);
-				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
-				opcname = pstrdup(NameStr(cla_tup->opcname));
-				ReleaseSysCache(cla_ht);
-				ereport(ERROR,
-						(errcode(ERRCODE_DATATYPE_MISMATCH),
-						 errmsg("foreign key constraint \"%s\" cannot be implemented",
-								fkconstraint->conname),
-						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
-								   strVal(list_nth(fkconstraint->fk_attrs, i)),
-								   format_type_be(fktype),
-								   opcname)));
-			}
 		}
 
 		/*
@@ -8959,6 +8919,10 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			ffeqop = InvalidOid;
 		}
 
+		// XXX: Fix logic for selecting operators
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			ffeqop = ARRAY_EQ_OP;
+
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 		{
 			/*
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index e7d6cd744f..5c61a07866 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,7 +111,6 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
-	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
@@ -189,8 +188,7 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype,
-							char fkreftype);
+							const char *rightop, Oid rightoptype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -349,89 +347,107 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
-		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
 		const char *querysep;
 		Oid			queryoids[RI_MAX_NUMKEYS];
 		const char *pk_only;
+		int			each_elem;
 
-		/* ----------
-		 * The query string built is
-		 *	SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
-		 *		   FOR KEY SHARE OF x
-		 * The type id's for the $ parameters are those of the
-		 * corresponding FK attributes.
-		 *
-		 * In case of an array ELEMENT foreign key, the previous query is used
-		 * to count the number of matching rows and see if every combination
-		 * is actually referenced.
-		 * The wrapping query is
-		 *	SELECT 1 WHERE
-		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
-		 *	  = (SELECT count(*) FROM (<QUERY>) z)
-		 * ----------
-		 */
-		initStringInfo(&querybuf);
-		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
-		quoteRelationName(pkrelname, pk_rel);
-		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
-						 pk_only, pkrelname);
-		querysep = "WHERE";
+		for (each_elem = 0; each_elem < riinfo->nkeys; each_elem++)
+			if (riinfo->fk_reftypes[each_elem] == FKCONSTR_REF_EACH_ELEMENT)
+				break;
 
-		if (riinfo->has_array)
+		if (each_elem < riinfo->nkeys)
 		{
-			initStringInfo(&countbuf);
-			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
-		}
-
-		for (int i = 0; i < riinfo->nkeys; i++)
-		{
-			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
-			Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
-
-			quoteOneName(attname,
-						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-			sprintf(paramname, "$%d", i + 1);
-
 			/*
-			 * In case of an array ELEMENT foreign key, we check that each
-			 * distinct non-null value in the array is present in the PK
-			 * table.
+			 * The query string built is:
+			 *
+			 * SELECT 1 WHERE NOT EXISTS
+			 * (
+			 *   SELECT 1 FROM pg_catalog.unnest($1)
+			 *   WHERE unnest IS NOT NULL AND NOT EXISTS
+			 *   (
+			 *     SELECT 1 FROM [ONLY] pktable x WHERE pkatt1 = [$2 | unnest] [AND ...]
+			 *     FOR KEY SHARE OF x
+			 *   )
+			 * )
+			 *
+			 * The type ids for the $ parameters are those of the
+			 * corresponding FK attributes.
 			 */
-			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-				appendStringInfo(&countbuf,
-								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
-								 paramname);
-
-			ri_GenerateQual(&querybuf, querysep,
-							attname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							paramname, fk_type,
-							riinfo->fk_reftypes[i]);
-			querysep = "AND";
-			queryoids[i] = fk_type;
-		}
-		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
-
-		if (riinfo->has_array)
-		{
-			appendStringInfo(&countbuf,
-							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
-							 querybuf.data);
+			initStringInfo(&querybuf);
+			pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+				"" : "ONLY ";
+			quoteRelationName(pkrelname, pk_rel);
+			appendStringInfo(&querybuf, "SELECT 1 WHERE NOT EXISTS ("
+							 "SELECT 1 FROM pg_catalog.unnest($%d) WHERE unnest IS NOT NULL"
+							 " AND NOT EXISTS (SELECT 1 FROM %s%s x",
+							 each_elem + 1, pk_only, pkrelname);
+			querysep = "WHERE";
+			for (int i = 0; i < riinfo->nkeys; i++)
+			{
+				Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+				Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+				quoteOneName(attname,
+							 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+				if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+					sprintf(paramname, "unnest");
+				else
+					sprintf(paramname, "$%d", i + 1);
+				ri_GenerateQual(&querybuf, querysep,
+					attname, pk_type,
+					riinfo->pf_eq_oprs[i],
+					paramname, fk_type);
+				querysep = "AND";
+				queryoids[i] = fk_type;
+			}
+			appendStringInfoString(&querybuf, " FOR KEY SHARE OF x))");
 
-			/* Prepare and save the plan for Array Element Foreign Keys */
-			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
 								 &qkey, fk_rel, pk_rel);
 		}
 		else
 		{
+			/*
+			 * The query string built is:
+			 *
+			 *	SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
+			 *		   FOR KEY SHARE OF x
+			 *
+			 * The type ids for the $ parameters are those of the
+			 * corresponding FK attributes.
+			 */
+			initStringInfo(&querybuf);
+			pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+				"" : "ONLY ";
+			quoteRelationName(pkrelname, pk_rel);
+			appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
+							 pk_only, pkrelname);
+			querysep = "WHERE";
+			for (int i = 0; i < riinfo->nkeys; i++)
+			{
+				Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+				Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+				quoteOneName(attname,
+							 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+				sprintf(paramname, "$%d", i + 1);
+				ri_GenerateQual(&querybuf, querysep,
+								attname, pk_type,
+								riinfo->pf_eq_oprs[i],
+								paramname, fk_type);
+				querysep = "AND";
+				queryoids[i] = fk_type;
+			}
+			appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
+
 			/* Prepare and save the plan */
 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-								&qkey, fk_rel, pk_rel);
-
+								 &qkey, fk_rel, pk_rel);
 		}
 	}
 
@@ -551,8 +567,7 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type,
-							FKCONSTR_REF_PLAIN);
+							paramname, pk_type);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -741,9 +756,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -848,9 +862,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -968,9 +981,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			sprintf(paramname, "$%d", j + 1);
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1149,9 +1161,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1363,6 +1374,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	char		workmembuf[32];
 	int			spi_result;
 	SPIPlanPtr	qplan;
+	int 		each_elem;
 
 	riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false);
 
@@ -1450,30 +1462,25 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
 
-	if (riinfo->has_array)
-	{
-		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
-		for (int i = 0; i < riinfo->nkeys; i++)
-		{
-			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
-				continue;
+	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+		"" : "ONLY ";
+	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+		"" : "ONLY ";
 
-			quoteOneName(fkattname,
-						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-			appendStringInfo(&querybuf,
-							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
-							 fkattname);
-		}
-		appendStringInfo(&querybuf,
-						 " LEFT OUTER JOIN ONLY %s pk ON",
-						 pkrelname);
+	for (each_elem = 0; each_elem < riinfo->nkeys; each_elem++)
+		if (riinfo->fk_reftypes[each_elem] == FKCONSTR_REF_EACH_ELEMENT)
+			break;
+
+	if (each_elem < riinfo->nkeys)
+	{
+		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[each_elem]));
+		appendStringInfo(&querybuf, " FROM %s%s fk"
+						 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s)"
+						 " LEFT OUTER JOIN %s%s pk ON",
+						 fk_only, fkrelname, fkattname, pk_only, pkrelname);
 	}
 	else
 	{
-		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
-		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
 		appendStringInfo(&querybuf,
 						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
 						fk_only, fkrelname, pk_only, pkrelname);
@@ -1493,7 +1500,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-			tmp = "a.e";
+			tmp = "unnest";
 		else
 		{
 			quoteOneName(fkattname + 3,
@@ -1503,8 +1510,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						tmp, fk_type,
-						FKCONSTR_REF_PLAIN);
+						tmp, fk_type);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1521,7 +1527,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
 		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+			appendStringInfo(&querybuf, "%sunnest IS NOT NULL", sep);
 		else
 		{
 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
@@ -1743,9 +1749,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
-						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type,
-						riinfo->fk_reftypes[i]);
+						riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+						fkattname, fk_type);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1930,12 +1935,11 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype,
-				char fkreftype)
+				const char *rightop, Oid rightoptype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype, fkreftype);
+							 rightop, rightoptype);
 }
 
 /*
@@ -2192,24 +2196,6 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->ff_eq_oprs,
 							   riinfo->fk_reftypes);
 
-	/*
-	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
-	 * flag indicating whether there's an array foreign key, and we want to
-	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
-	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
-	 * in this module.  (If we did, substituting the array comparator at the
-	 * call point in ri_KeysEqual might be more appropriate.)
-	 */
-	riinfo->has_array = false;
-	for (int i = 0; i < riinfo->nkeys; i++)
-	{
-		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-		{
-			riinfo->has_array = true;
-			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
-		}
-	}
-
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 5300ce2276..85775d5435 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11478,24 +11478,16 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype,
-						 char fkreftype)
+						 const char *rightop, Oid rightoptype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
-	Oid			oproid;
 
-	/* Override operator with <<@ in case of FK array */
-	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
-		oproid = OID_ARRAY_ELEMCONTAINED_OP;
-	else
-		oproid = opoid;
-
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", oproid);
+		elog(ERROR, "cache lookup failed for operator %u", opoid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 36d36d57b7..27d2f2ffb3 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,8 +68,7 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype,
-									 char fkreftype);
+									 const char *rightop, Oid rightoptype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
-- 
2.27.0

#188Zhihong Yu
zyu@yugabyte.com
In reply to: Mark Rofail (#187)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi,
In v11-0004-fk_arrays_elems_edits.patch :

+ riinfo->fk_reftypes[i] ==
FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP :
riinfo->pf_eq_oprs[i], // XXX

Is XXX placeholder for some comment you will fill in later ?

Cheers

On Sat, Mar 20, 2021 at 11:42 AM Mark Rofail <markm.rofail@gmail.com> wrote:

Show quoted text

Hey Andreas and Joel!

Thank you so much for your hard work!

1. I have removed the dependency on count(DISTINCT ...) by using an

anti-join instead. The code is much clearer now IMHO.

It is much cleaner! I

2. That instead of selecting operators at execution time we save which

operators to use in pg_constraint.

This is a clever approach. If you have any updates on this please let me
know.

I am still reviewing your changes. I have split your changes from my work
to be able to isolate the changes and review them carefully. And to help
others review the changes.

Changelist:
- v11 (compatible with current master 2021, 03, 20,
commit e835e89a0fd267871e7fbddc39ad00ee3d0cb55c)
* rebase
* split andreas and joel's work

On Tue, Mar 16, 2021 at 1:27 AM Andreas Karlsson <andreas@proxel.se>
wrote:

On 3/15/21 4:29 PM, Mark Rofail wrote:

Actually, your fix led me in the right way, the issue was how windows
handle pointers.

Hi,

I have started working on a partially new strategy for the second patch.
The ideas are:

1. I have removed the dependency on count(DISTINCT ...) by using an
anti-join instead (this was implemented by Joel Jacobson with cleanup
and finishing touches by me). The code is much clearer now IMHO.

2. That instead of selecting operators at execution time we save which
operators to use in pg_constraint. This is heavily a work in progress in
my attached patches. I am not 100% convinced this is the right way to go
but I plan to work some on this this weekend to see how ti will work out.

Another thing I will look into is you gin patch. While you fixed it for
simple scalar types which fit into the Datum type I wonder if we do not
also need to copy types which are too large to fit into a Datum but I
have not investigated yet which memory context the datum passed to
ginqueryarrayextract() is allocated in.

Andreas

#189Mark Rofail
markm.rofail@gmail.com
In reply to: Zhihong Yu (#188)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Zhihing,
I think @Andreas ment to mark it as a todo to cleanup later.

On Sun, 21 Mar 2021 at 4:49 AM Zhihong Yu <zyu@yugabyte.com> wrote:

Show quoted text

Hi,
In v11-0004-fk_arrays_elems_edits.patch :

+ riinfo->fk_reftypes[i] ==
FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP :
riinfo->pf_eq_oprs[i], // XXX

Is XXX placeholder for some comment you will fill in later ?

Cheers

On Sat, Mar 20, 2021 at 11:42 AM Mark Rofail <markm.rofail@gmail.com>
wrote:

Hey Andreas and Joel!

Thank you so much for your hard work!

1. I have removed the dependency on count(DISTINCT ...) by using an

anti-join instead. The code is much clearer now IMHO.

It is much cleaner! I

2. That instead of selecting operators at execution time we save which

operators to use in pg_constraint.

This is a clever approach. If you have any updates on this please let me
know.

I am still reviewing your changes. I have split your changes from my work
to be able to isolate the changes and review them carefully. And to help
others review the changes.

Changelist:
- v11 (compatible with current master 2021, 03, 20,
commit e835e89a0fd267871e7fbddc39ad00ee3d0cb55c)
* rebase
* split andreas and joel's work

On Tue, Mar 16, 2021 at 1:27 AM Andreas Karlsson <andreas@proxel.se>
wrote:

On 3/15/21 4:29 PM, Mark Rofail wrote:

Actually, your fix led me in the right way, the issue was how windows
handle pointers.

Hi,

I have started working on a partially new strategy for the second patch.
The ideas are:

1. I have removed the dependency on count(DISTINCT ...) by using an
anti-join instead (this was implemented by Joel Jacobson with cleanup
and finishing touches by me). The code is much clearer now IMHO.

2. That instead of selecting operators at execution time we save which
operators to use in pg_constraint. This is heavily a work in progress in
my attached patches. I am not 100% convinced this is the right way to go
but I plan to work some on this this weekend to see how ti will work out.

Another thing I will look into is you gin patch. While you fixed it for
simple scalar types which fit into the Datum type I wonder if we do not
also need to copy types which are too large to fit into a Datum but I
have not investigated yet which memory context the datum passed to
ginqueryarrayextract() is allocated in.

Andreas

#190Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#189)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Looking at 0001+0003, I see it claims GIN support for <<@ and @>>, but
actually only the former is implemented fully; the latter is missing a
strategy number in ginarrayproc.c and pg_amop.dat, and also
src/test/regress/sql/gin.sql does not test it. I suspect
ginqueryarrayextract needs to be told about this too.

--
�lvaro Herrera 39�49'30"S 73�17'W
"This is what I like so much about PostgreSQL. Most of the surprises
are of the "oh wow! That's cool" Not the "oh shit!" kind. :)"
Scott Marlowe, http://archives.postgresql.org/pgsql-admin/2008-10/msg00152.php

#191Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#190)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hello Alvaro,

Looking at 0001+0003, I see it claims GIN support for <<@ and @>>, but

actually only the former is implemented fully; the latter is missing a
strategy number in ginarrayproc.c and pg_amop.dat, and also
src/test/regress/sql/gin.sql does not test it. I suspect
ginqueryarrayextract needs to be told about this too.

GIN/array_ops requires the left operand to be an array, so only @>> can be
used in GIN. However, <<@ is defined as @>> commutative counterpart, so
when for example “5 <<@ index” it will be translated to “index @>> index”
thus indirectly using the GIN index.

We can definitely add tests to “ src/test/regress/sql/gin.sql” to test
this. Do you agree?

Also what do you mean by “ ginqueryarrayextract needs to be told about this
too”?

Best Regards,
Mark Rofail

#192Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Mark Rofail (#191)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 2021-Mar-27, Mark Rofail wrote:

Hello Alvaro,

Looking at 0001+0003, I see it claims GIN support for <<@ and @>>, but

actually only the former is implemented fully; the latter is missing a
strategy number in ginarrayproc.c and pg_amop.dat, and also
src/test/regress/sql/gin.sql does not test it. I suspect
ginqueryarrayextract needs to be told about this too.

GIN/array_ops requires the left operand to be an array, so only @>> can be
used in GIN.

However, <<@ is defined as @>> commutative counterpart, so
when for example “5 <<@ index” it will be translated to “index @>> index”
thus indirectly using the GIN index.

Ah, that makes sense.

Looking at the docs again, I don't see anything that's wrong. I was
confused about the lack of a new strategy number, but that's explained
by what you say above.

We can definitely add tests to “ src/test/regress/sql/gin.sql” to test
this. Do you agree?

Yes, we should do that.

Also what do you mean by “ ginqueryarrayextract needs to be told about this
too”?

Well, if it's true that it's translated to the commutator, then I don't
think any other code changes are needed.

--
Álvaro Herrera 39°49'30"S 73°17'W
"En las profundidades de nuestro inconsciente hay una obsesiva necesidad
de un universo lógico y coherente. Pero el universo real se halla siempre
un paso más allá de la lógica" (Irulan)

#193Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#192)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Alvaro,

Well, if it's true that it's translated to the commutator, then I don't

think any other code changes are needed.

Great, I will get a patch ready tomorrow. Hopefully we’ll wrap up the GIN
part of the patch soon.

/Mark

#194Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#192)
3 attachment(s)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hey Alvaro

Yes, we should do that.

I have attached v12 with more tests in “ src/test/regress/sql/gin.sql”

Changelog:
- v12 (compatible with current master 2021/03/29, commit
6d7a6feac48b1970c4cd127ee65d4c487acbb5e9)
* add more tests to “ src/test/regress/sql/gin.sql”
* merge Andreas' edits to the GIN patch

Also, @Andreas Karlsson <andreas@proxel.se>, waiting for your edits to
"pg_constraint"

/Mark

Attachments:

v12-0003-fk_arrays_elems_edits.patchtext/x-patch; charset=US-ASCII; name=v12-0003-fk_arrays_elems_edits.patchDownload
From 1905c9774fb6a848bdd3a3a5a858b55cb7731cd8 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 29 Mar 2021 21:57:19 +0200
Subject: [PATCH v12 3/3] fk_arrays_elems_edits

---
 doc/src/sgml/ddl.sgml               |  82 +++++-----
 doc/src/sgml/ref/create_table.sgml  |  32 +++-
 src/backend/commands/matview.c      |   3 +-
 src/backend/commands/tablecmds.c    |  56 ++-----
 src/backend/utils/adt/ri_triggers.c | 246 +++++++++++++---------------
 src/backend/utils/adt/ruleutils.c   |  14 +-
 src/include/utils/builtins.h        |   3 +-
 7 files changed, 194 insertions(+), 242 deletions(-)

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 365e31c258..1f23e59904 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1111,23 +1111,21 @@ CREATE TABLE order_items (
     <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
     with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
     described in the following example:
+<programlisting>
+CREATE TABLE drivers (
+    driver_id integer PRIMARY KEY,
+    first_name text,
+    last_name text
+);
 
-    <programlisting>
-     CREATE TABLE drivers (
-         driver_id integer PRIMARY KEY,
-         first_name text,
-         last_name text
-     );
-
-     CREATE TABLE racing (
-         race_id integer PRIMARY KEY,
-         title text,
-         race_day date,
-         final_positions integer[],
-         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
-     );
-    </programlisting>
-
+CREATE TABLE racing (
+    race_id integer PRIMARY KEY,
+    title text,
+    race_day date,
+    final_positions integer[],
+    FOREIGN KEY <emphasis>(EACH ELEMENT OF final_positions) REFERENCES drivers</emphasis>
+);
+</programlisting>
     The above example uses an array (<literal>final_positions</literal>) to
     store the results of a race: for each of its elements a referential
     integrity check is enforced on the <literal>drivers</literal> table. Note
@@ -1143,35 +1141,33 @@ CREATE TABLE order_items (
     Even though the most common use case for Array Element Foreign Keys constraint is on
     a single column key, you can define an Array Element Foreign Keys constraint on a
     group of columns.
+<programlisting>
+CREATE TABLE available_moves (
+    kind text,
+    move text,
+    description text,
+    PRIMARY KEY (kind, move)
+);
 
-    <programlisting>
-     CREATE TABLE available_moves (
-         kind text,
-         move text,
-         description text,
-         PRIMARY KEY (kind, move)
-     );
-
-     CREATE TABLE paths (
-         description text,
-         kind text,
-         moves text[],
-         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
-     );
-
-     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
-     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
-     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
-     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
-     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
-     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
-     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
-     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
-
-     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
-     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
-    </programlisting>
+CREATE TABLE paths (
+    description text,
+    kind text,
+    moves text[],
+    <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+);
 
+INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+</programlisting>
     In addition to standard foreign key requirements, array
     <literal>ELEMENT</literal> foreign key constraints require that the
     referencing column is an array of a compatible type to the corresponding
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 8123eec1a6..778ad8198c 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1256,16 +1256,32 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       considerably enhances the performance. Also concerning coercion while using the 
       GIN index:
         
-      <programlisting>
-       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
-       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
-      </programlisting>
+<programlisting>
+CREATE TABLE pktableforarray (
+    ptest1 int2 PRIMARY KEY,
+    ptest2 text
+);
+
+CREATE TABLE fktableforarray (
+    ftest1 int4[],
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES pktableforarray,
+    ftest2 int
+);
+</programlisting>
       This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
 
-      <programlisting>
-       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
-       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
-      </programlisting>
+<programlisting>
+CREATE TABLE pktableforarray (
+    ptest1 int4 PRIMARY KEY,
+    ptest2 text
+);
+
+CREATE TABLE fktableforarray (
+    ftest1 int2[],
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES pktableforarray,
+    ftest2 int
+);        
+</programlisting>
        however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
        purpose of the index.
      </para>
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index 648649ef44..172ec6e982 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,8 +764,7 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype,
-										 FKCONSTR_REF_PLAIN);
+										 rightop, attrtype);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index e983f95bda..6326a4825a 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -40,6 +40,7 @@
 #include "catalog/pg_inherits.h"
 #include "catalog/pg_namespace.h"
 #include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
 #include "catalog/pg_tablespace.h"
 #include "catalog/pg_statistic_ext.h"
 #include "catalog/pg_trigger.h"
@@ -8685,7 +8686,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	int			numfks,
 				numpks;
 	Oid			indexOid;
-	bool		has_array;
+	bool		has_each_element;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8791,7 +8792,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 * format to pass to CreateConstraintEntry.
 	 */
 	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
-	has_array = false;
+	has_each_element = false;
 	i = 0;
 	foreach(lc, fkconstraint->fk_reftypes)
 	{
@@ -8804,12 +8805,12 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 				break;
 			case FKCONSTR_REF_EACH_ELEMENT:
 				/* At most one FK column can be an array reference */
-				if (has_array)
+				if (has_each_element)
 					ereport(ERROR,
 							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
 							 errmsg("foreign keys support only one array column")));
 
-				has_array = true;
+				has_each_element = true;
 				break;
 			default:
 				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
@@ -8823,7 +8824,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
 	* RESTRICT
 	*/
-	if (has_array)
+	if (has_each_element)
 	{
 		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
 			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
@@ -8953,8 +8954,6 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 		 */
 		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
 		{
-			Oid			elemopclass;
-
 			/* We check if the array element type exists and is of valid Oid */
 			fktype = get_base_element_type(fktype);
 			if (!OidIsValid(fktype))
@@ -8978,45 +8977,6 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 					errdetail("Unssupported relation between %s and %s.",
 							format_type_be(fktypoid[i]),
 							format_type_be(pktype))));
-
-			/*
-			 * For the moment, we must also insist that the array's element
-			 * type have a default btree opclass that is in the index's
-			 * opfamily.  This is necessary because ri_triggers.c relies on
-			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
-			 * on the array type, and we need those operations to have the
-			 * same notion of equality that we're using otherwise.
-			 *
-			 * XXX this restriction is pretty annoying, considering the effort
-			 * that's been put into the rest of the RI mechanisms to make them
-			 * work with nondefault equality operators.  In particular, it
-			 * means that the cast-to-PK-datatype code path isn't useful for
-			 * array-to-scalar references.
-			 */
-			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
-			if (!OidIsValid(elemopclass) ||
-				get_opclass_family(elemopclass) != opfamily)
-			{
-				/* Get the index opclass's name for the error message. */
-				char	   *opcname;
-
-				cla_ht = SearchSysCache1(CLAOID,
-										 ObjectIdGetDatum(opclasses[i]));
-				if (!HeapTupleIsValid(cla_ht))
-					elog(ERROR, "cache lookup failed for opclass %u",
-						 opclasses[i]);
-				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
-				opcname = pstrdup(NameStr(cla_tup->opcname));
-				ReleaseSysCache(cla_ht);
-				ereport(ERROR,
-						(errcode(ERRCODE_DATATYPE_MISMATCH),
-						 errmsg("foreign key constraint \"%s\" cannot be implemented",
-								fkconstraint->conname),
-						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
-								   strVal(list_nth(fkconstraint->fk_attrs, i)),
-								   format_type_be(fktype),
-								   opcname)));
-			}
 		}
 
 		/*
@@ -9051,6 +9011,10 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			ffeqop = InvalidOid;
 		}
 
+		// XXX: Fix logic for selecting operators
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			ffeqop = ARRAY_EQ_OP;
+
 		if (!(OidIsValid(pfeqop) && OidIsValid(ffeqop)))
 		{
 			/*
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 43c3e4bd59..6c7d10dc6e 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,7 +111,6 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
-	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
@@ -189,8 +188,7 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype,
-							char fkreftype);
+							const char *rightop, Oid rightoptype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -349,89 +347,107 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
-		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
 		const char *querysep;
 		Oid			queryoids[RI_MAX_NUMKEYS];
 		const char *pk_only;
+		int			each_elem;
 
-		/* ----------
-		 * The query string built is
-		 *	SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
-		 *		   FOR KEY SHARE OF x
-		 * The type id's for the $ parameters are those of the
-		 * corresponding FK attributes.
-		 *
-		 * In case of an array ELEMENT foreign key, the previous query is used
-		 * to count the number of matching rows and see if every combination
-		 * is actually referenced.
-		 * The wrapping query is
-		 *	SELECT 1 WHERE
-		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
-		 *	  = (SELECT count(*) FROM (<QUERY>) z)
-		 * ----------
-		 */
-		initStringInfo(&querybuf);
-		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
-		quoteRelationName(pkrelname, pk_rel);
-		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
-						 pk_only, pkrelname);
-		querysep = "WHERE";
+		for (each_elem = 0; each_elem < riinfo->nkeys; each_elem++)
+			if (riinfo->fk_reftypes[each_elem] == FKCONSTR_REF_EACH_ELEMENT)
+				break;
 
-		if (riinfo->has_array)
+		if (each_elem < riinfo->nkeys)
 		{
-			initStringInfo(&countbuf);
-			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
-		}
-
-		for (int i = 0; i < riinfo->nkeys; i++)
-		{
-			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
-			Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
-
-			quoteOneName(attname,
-						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-			sprintf(paramname, "$%d", i + 1);
-
 			/*
-			 * In case of an array ELEMENT foreign key, we check that each
-			 * distinct non-null value in the array is present in the PK
-			 * table.
+			 * The query string built is:
+			 *
+			 * SELECT 1 WHERE NOT EXISTS
+			 * (
+			 *   SELECT 1 FROM pg_catalog.unnest($1)
+			 *   WHERE unnest IS NOT NULL AND NOT EXISTS
+			 *   (
+			 *     SELECT 1 FROM [ONLY] pktable x WHERE pkatt1 = [$2 | unnest] [AND ...]
+			 *     FOR KEY SHARE OF x
+			 *   )
+			 * )
+			 *
+			 * The type ids for the $ parameters are those of the
+			 * corresponding FK attributes.
 			 */
-			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-				appendStringInfo(&countbuf,
-								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
-								 paramname);
-
-			ri_GenerateQual(&querybuf, querysep,
-							attname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							paramname, fk_type,
-							riinfo->fk_reftypes[i]);
-			querysep = "AND";
-			queryoids[i] = fk_type;
-		}
-		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
-
-		if (riinfo->has_array)
-		{
-			appendStringInfo(&countbuf,
-							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
-							 querybuf.data);
+			initStringInfo(&querybuf);
+			pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+				"" : "ONLY ";
+			quoteRelationName(pkrelname, pk_rel);
+			appendStringInfo(&querybuf, "SELECT 1 WHERE NOT EXISTS ("
+							 "SELECT 1 FROM pg_catalog.unnest($%d) WHERE unnest IS NOT NULL"
+							 " AND NOT EXISTS (SELECT 1 FROM %s%s x",
+							 each_elem + 1, pk_only, pkrelname);
+			querysep = "WHERE";
+			for (int i = 0; i < riinfo->nkeys; i++)
+			{
+				Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+				Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+				quoteOneName(attname,
+							 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+				if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+					sprintf(paramname, "unnest");
+				else
+					sprintf(paramname, "$%d", i + 1);
+				ri_GenerateQual(&querybuf, querysep,
+					attname, pk_type,
+					riinfo->pf_eq_oprs[i],
+					paramname, fk_type);
+				querysep = "AND";
+				queryoids[i] = fk_type;
+			}
+			appendStringInfoString(&querybuf, " FOR KEY SHARE OF x))");
 
-			/* Prepare and save the plan for Array Element Foreign Keys */
-			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
 								 &qkey, fk_rel, pk_rel);
 		}
 		else
 		{
+			/*
+			 * The query string built is:
+			 *
+			 *	SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
+			 *		   FOR KEY SHARE OF x
+			 *
+			 * The type ids for the $ parameters are those of the
+			 * corresponding FK attributes.
+			 */
+			initStringInfo(&querybuf);
+			pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+				"" : "ONLY ";
+			quoteRelationName(pkrelname, pk_rel);
+			appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
+							 pk_only, pkrelname);
+			querysep = "WHERE";
+			for (int i = 0; i < riinfo->nkeys; i++)
+			{
+				Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+				Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+				quoteOneName(attname,
+							 RIAttName(pk_rel, riinfo->pk_attnums[i]));
+				sprintf(paramname, "$%d", i + 1);
+				ri_GenerateQual(&querybuf, querysep,
+								attname, pk_type,
+								riinfo->pf_eq_oprs[i],
+								paramname, fk_type);
+				querysep = "AND";
+				queryoids[i] = fk_type;
+			}
+			appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
+
 			/* Prepare and save the plan */
 			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-								&qkey, fk_rel, pk_rel);
-
+								 &qkey, fk_rel, pk_rel);
 		}
 	}
 
@@ -555,8 +571,7 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type,
-							FKCONSTR_REF_PLAIN);
+							paramname, pk_type);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -745,9 +760,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -852,9 +866,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -972,9 +985,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			sprintf(paramname, "$%d", j + 1);
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1153,9 +1165,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			sprintf(paramname, "$%d", i + 1);
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
-							riinfo->pf_eq_oprs[i],
-							attname, fk_type,
-							riinfo->fk_reftypes[i]);
+							riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+							attname, fk_type);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1367,6 +1378,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	char		workmembuf[32];
 	int			spi_result;
 	SPIPlanPtr	qplan;
+	int 		each_elem;
 
 	riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false);
 
@@ -1454,30 +1466,25 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
 
-	if (riinfo->has_array)
-	{
-		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
-		for (int i = 0; i < riinfo->nkeys; i++)
-		{
-			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
-				continue;
+	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+		"" : "ONLY ";
+	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+		"" : "ONLY ";
 
-			quoteOneName(fkattname,
-						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
-			appendStringInfo(&querybuf,
-							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
-							 fkattname);
-		}
-		appendStringInfo(&querybuf,
-						 " LEFT OUTER JOIN ONLY %s pk ON",
-						 pkrelname);
+	for (each_elem = 0; each_elem < riinfo->nkeys; each_elem++)
+		if (riinfo->fk_reftypes[each_elem] == FKCONSTR_REF_EACH_ELEMENT)
+			break;
+
+	if (each_elem < riinfo->nkeys)
+	{
+		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[each_elem]));
+		appendStringInfo(&querybuf, " FROM %s%s fk"
+						 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s)"
+						 " LEFT OUTER JOIN %s%s pk ON",
+						 fk_only, fkrelname, fkattname, pk_only, pkrelname);
 	}
 	else
 	{
-		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
-		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-			"" : "ONLY ";
 		appendStringInfo(&querybuf,
 						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
 						fk_only, fkrelname, pk_only, pkrelname);
@@ -1497,7 +1504,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-			tmp = "a.e";
+			tmp = "unnest";
 		else
 		{
 			quoteOneName(fkattname + 3,
@@ -1507,8 +1514,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						tmp, fk_type,
-						FKCONSTR_REF_PLAIN);
+						tmp, fk_type);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1525,7 +1531,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
 		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+			appendStringInfo(&querybuf, "%sunnest IS NOT NULL", sep);
 		else
 		{
 			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
@@ -1747,9 +1753,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
-						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type,
-						riinfo->fk_reftypes[i]);
+						riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT ? OID_ARRAY_ELEMCONTAINED_OP : riinfo->pf_eq_oprs[i], // XXX
+						fkattname, fk_type);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1934,12 +1939,11 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype,
-				char fkreftype)
+				const char *rightop, Oid rightoptype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype, fkreftype);
+							 rightop, rightoptype);
 }
 
 /*
@@ -2196,24 +2200,6 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->ff_eq_oprs,
 							   riinfo->fk_reftypes);
 
-	/*
-	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
-	 * flag indicating whether there's an array foreign key, and we want to
-	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
-	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
-	 * in this module.  (If we did, substituting the array comparator at the
-	 * call point in ri_KeysEqual might be more appropriate.)
-	 */
-	riinfo->has_array = false;
-	for (int i = 0; i < riinfo->nkeys; i++)
-	{
-		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
-		{
-			riinfo->has_array = true;
-			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
-		}
-	}
-
 	ReleaseSysCache(tup);
 
 	/*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 8d06230bfe..19bd07c227 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11647,24 +11647,16 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype,
-						 char fkreftype)
+						 const char *rightop, Oid rightoptype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
-	Oid			oproid;
 
-	/* Override operator with <<@ in case of FK array */
-	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
-		oproid = OID_ARRAY_ELEMCONTAINED_OP;
-	else
-		oproid = opoid;
-
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", oproid);
+		elog(ERROR, "cache lookup failed for operator %u", opoid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 36d36d57b7..27d2f2ffb3 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,8 +68,7 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype,
-									 char fkreftype);
+									 const char *rightop, Oid rightoptype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
-- 
2.27.0

v12-0001-anyarray_anyelement_operators.patchtext/x-patch; charset=US-ASCII; name=v12-0001-anyarray_anyelement_operators.patchDownload
From ec392689f28f3c96aee49be6e68c4bc8dceadd06 Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 29 Mar 2021 20:40:57 +0200
Subject: [PATCH v12 1/3] anyarray_anyelement_operators

---
 doc/src/sgml/func.sgml                   |  28 +++++
 doc/src/sgml/gin.sgml                    |   8 +-
 doc/src/sgml/indices.sgml                |   2 +-
 src/backend/access/gin/ginarrayproc.c    |  40 +++++--
 src/backend/utils/adt/arrayfuncs.c       | 137 +++++++++++++++++++++++
 src/include/catalog/pg_amop.dat          |   3 +
 src/include/catalog/pg_operator.dat      |  14 ++-
 src/include/catalog/pg_proc.dat          |   6 +
 src/test/regress/expected/arrays.out     |  92 +++++++++++++++
 src/test/regress/expected/gin.out        |  68 +++++++++++
 src/test/regress/expected/opr_sanity.out |   6 +-
 src/test/regress/sql/arrays.sql          |  10 ++
 src/test/regress/sql/gin.sql             |  16 +++
 13 files changed, 414 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index fbf6062d0a..bfe71d364f 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -17675,6 +17675,34 @@ SELECT NULLIF(value, '(none)') ...
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyarray</type> <literal>@&gt;&gt;</literal> <type>anyelement</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does the array contain the specified element?
+       </para>
+       <para>
+        <literal>ARRAY[1,4,3] @&gt;&gt; 3</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <type>anyelement</type> <literal>&lt;&lt;@</literal> <type>anyarray</type>
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the specified element contained in the array?
+       </para>
+       <para>
+        <literal>2 &lt;&lt;@ ARRAY[1,7,4,2,6]</literal>
+        <returnvalue>t</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <type>anyarray</type> <literal>&amp;&amp;</literal> <type>anyarray</type>
diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml
index d68d12d515..981513b765 100644
--- a/doc/src/sgml/gin.sgml
+++ b/doc/src/sgml/gin.sgml
@@ -84,7 +84,7 @@
     </thead>
     <tbody>
      <row>
-      <entry morerows="3" valign="middle"><literal>array_ops</literal></entry>
+      <entry morerows="5" valign="middle"><literal>array_ops</literal></entry>
       <entry><literal>&amp;&amp; (anyarray,anyarray)</literal></entry>
      </row>
      <row>
@@ -93,6 +93,12 @@
      <row>
       <entry><literal>&lt;@ (anyarray,anyarray)</literal></entry>
      </row>
+     <row>
+      <entry><literal>@&gt;&gt; (anyarray,anyelement)</literal></entry>
+     </row>
+     <row>
+      <entry><literal>&lt;&lt;@ (anyelement,anyarray)</literal></entry>
+     </row>
      <row>
       <entry><literal>= (anyarray,anyarray)</literal></entry>
      </row>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 623962d1d8..6de6c33c75 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -326,7 +326,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    for arrays, which supports indexed queries using these operators:
 
 <synopsis>
-&lt;@ &nbsp; @&gt; &nbsp; = &nbsp; &amp;&amp;
+&lt;@ &nbsp; @&gt; &nbsp; &lt;&lt;@ &nbsp; @&gt;&gt; &nbsp; = &nbsp; &amp;&amp;
 </synopsis>
 
    (See <xref linkend="functions-array"/> for the meaning of
diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c
index bf73e32932..eb7d13dbba 100644
--- a/src/backend/access/gin/ginarrayproc.c
+++ b/src/backend/access/gin/ginarrayproc.c
@@ -24,6 +24,7 @@
 #define GinContainsStrategy		2
 #define GinContainedStrategy	3
 #define GinEqualStrategy		4
+#define GinContainsElemStrategy	5
 
 
 /*
@@ -78,8 +79,6 @@ ginarrayextract_2args(PG_FUNCTION_ARGS)
 Datum
 ginqueryarrayextract(PG_FUNCTION_ARGS)
 {
-	/* Make copy of array input to ensure it doesn't disappear while in use */
-	ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
 	int32	   *nkeys = (int32 *) PG_GETARG_POINTER(1);
 	StrategyNumber strategy = PG_GETARG_UINT16(2);
 
@@ -87,21 +86,35 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 	bool	  **nullFlags = (bool **) PG_GETARG_POINTER(5);
 	int32	   *searchMode = (int32 *) PG_GETARG_POINTER(6);
-	int16		elmlen;
-	bool		elmbyval;
-	char		elmalign;
 	Datum	   *elems;
 	bool	   *nulls;
 	int			nelems;
 
-	get_typlenbyvalalign(ARR_ELEMTYPE(array),
-						 &elmlen, &elmbyval, &elmalign);
+	if (strategy == GinContainsElemStrategy)
+	{
+		/* single element is passed, set elems to its pointer */
+		elems = palloc(sizeof(*elems));
+		*elems = PG_GETARG_DATUM(0);
+		nulls = palloc(sizeof(*nulls));
+		*nulls = PG_ARGISNULL(0);
+		nelems = 1;
+	}
+	else
+	{
+		/* Make copy of array input to ensure it doesn't disappear while in use */
+		ArrayType  *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
+		int16		elmlen;
+		bool		elmbyval;
+		char		elmalign;
 
-	deconstruct_array(array,
-					  ARR_ELEMTYPE(array),
-					  elmlen, elmbyval, elmalign,
-					  &elems, &nulls, &nelems);
+		get_typlenbyvalalign(ARR_ELEMTYPE(array),
+							 &elmlen, &elmbyval, &elmalign);
 
+		deconstruct_array(array,
+						  ARR_ELEMTYPE(array),
+						  elmlen, elmbyval, elmalign,
+						  &elems, &nulls, &nelems);
+	}
 	*nkeys = nelems;
 	*nullFlags = nulls;
 
@@ -126,6 +139,9 @@ ginqueryarrayextract(PG_FUNCTION_ARGS)
 			else
 				*searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 			break;
+		case GinContainsElemStrategy:
+			*searchMode = GIN_SEARCH_MODE_DEFAULT;
+			break;
 		default:
 			elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
 				 strategy);
@@ -172,6 +188,7 @@ ginarrayconsistent(PG_FUNCTION_ARGS)
 			}
 			break;
 		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 			/* result is not lossy */
 			*recheck = false;
 			/* must have all elements in check[] true, and no nulls */
@@ -259,6 +276,7 @@ ginarraytriconsistent(PG_FUNCTION_ARGS)
 			}
 			break;
 		case GinContainsStrategy:
+		case GinContainsElemStrategy:
 			/* must have all elements in check[] true, and no nulls */
 			res = GIN_TRUE;
 			for (i = 0; i < nkeys; i++)
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 17a16b4c5c..518d3aaaf9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -4328,6 +4328,143 @@ arraycontained(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ * array_contains_elem : checks an array for a specific element
+ * adapted from array_contain_compare() for containment of a single element
+ */
+static bool
+array_contains_elem(AnyArrayType *array, Datum elem, Oid elemtype,
+					Oid collation,	void **fn_extra)
+{
+	LOCAL_FCINFO(locfcinfo, 2);
+	Oid 		arrtype = AARR_ELEMTYPE(array);
+	TypeCacheEntry *typentry;
+	int 		nelems;
+	int			typlen;
+	bool		typbyval;
+	char		typalign;
+	int			i;
+	array_iter 	it;
+
+	if (arrtype != elemtype)
+		ereport(ERROR,
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+				 errmsg("cannot compare arrays elements with element of different type")));
+
+	/*
+	 * We arrange to look up the equality function only once per series of
+	 * calls, assuming the element type doesn't change underneath us.  The
+	 * typcache is used so that we have no memory leakage when being used as
+	 * an index support function.
+	 */
+	typentry = (TypeCacheEntry *) *fn_extra;
+	if (typentry == NULL ||
+		typentry->type_id != arrtype)
+	{
+		typentry = lookup_type_cache(arrtype,
+									 TYPECACHE_EQ_OPR_FINFO);
+		if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_FUNCTION),
+					 errmsg("could not identify an equality operator for type %s",
+							format_type_be(arrtype))));
+		*fn_extra = (void *) typentry;
+	}
+	typlen = typentry->typlen;
+	typbyval = typentry->typbyval;
+	typalign = typentry->typalign;
+
+	/*
+	 * Apply the comparison operator for the passed element against each
+	 * element in the array
+	 */
+	InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+							 collation, NULL, NULL);
+
+	/* Loop over source data */
+	nelems = ArrayGetNItems(AARR_NDIM(array), AARR_DIMS(array));
+	array_iter_setup(&it, array);
+
+	for (i = 0; i < nelems; i++)
+	{
+		Datum elt;
+		bool isnull;
+		bool oprresult;
+
+		/* Get element, checking for NULL */
+		elt = array_iter_next(&it, &isnull, i, typlen, typbyval, typalign);
+
+		/*
+		 * We assume that the comparison operator is strict, so a NULL can't
+		 * match anything. refer to the comment in array_contain_compare()
+		 */
+		if (isnull)
+			continue;
+
+		/*
+		 * Apply the operator to the element pair; treat NULL as false
+		 */
+		locfcinfo->args[0].value = elt;
+		locfcinfo->args[0].isnull = false;
+		locfcinfo->args[1].value = elem;
+		locfcinfo->args[1].isnull = false;
+		locfcinfo->isnull = false;
+		oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+		if (!locfcinfo->isnull && oprresult)
+			return true;
+	}
+
+	return false;
+}
+
+Datum
+arraycontainselem(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+	Datum elem = PG_GETARG_DATUM(1);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 1);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 0);
+
+	PG_RETURN_BOOL(result);
+}
+
+Datum
+arrayelemcontained(PG_FUNCTION_ARGS)
+{
+	AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(1);
+	Datum elem = PG_GETARG_DATUM(0);
+	Oid	elemtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+	Oid collation = PG_GET_COLLATION();
+	bool result;
+
+	/*
+	 * we don't need to check if the elem is null or if the elem datatype and
+	 * array datatype match since this is handled within internal calls already
+	 * (a property of polymorphic functions)
+	 */
+
+	result = array_contains_elem(array, elem, elemtype, collation,
+								 &fcinfo->flinfo->fn_extra);
+
+	/* Avoid leaking memory when handed toasted input */
+	AARR_FREE_IF_COPY(array, 1);
+
+	PG_RETURN_BOOL(result);
+}
+
 /*-----------------------------------------------------------------------------
  * Array iteration functions
  *		These functions are used to iterate efficiently through arrays
diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat
index 8135854163..5bb32ab962 100644
--- a/src/include/catalog/pg_amop.dat
+++ b/src/include/catalog/pg_amop.dat
@@ -1242,6 +1242,9 @@
 { amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
   amoprighttype => 'anyarray', amopstrategy => '4',
   amopopr => '=(anyarray,anyarray)', amopmethod => 'gin' },
+{ amopfamily => 'gin/array_ops', amoplefttype => 'anyarray',
+  amoprighttype => 'anyelement', amopstrategy => '5',
+  amopopr => '@>>(anyarray,anyelement)', amopmethod => 'gin' },
 
 # btree enum_ops
 { amopfamily => 'btree/enum_ops', amoplefttype => 'anyenum',
diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat
index 85395a81ee..c6e809b88d 100644
--- a/src/include/catalog/pg_operator.dat
+++ b/src/include/catalog/pg_operator.dat
@@ -2761,7 +2761,7 @@
   oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
   oprjoin => 'positionjoinsel' },
 
-# overlap/contains/contained for arrays
+# overlap/contains/contained/elemcontained/containselem for arrays
 { oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
   oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
   oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
@@ -2778,6 +2778,18 @@
   oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
   oprcode => 'arraycontained', oprrest => 'arraycontsel',
   oprjoin => 'arraycontjoinsel' },
+{ oid => '6108', oid_symbol => 'OID_ARRAY_ELEMCONTAINED_OP',
+  descr => 'elem is contained by',
+  oprname => '<<@', oprleft => 'anyelement', oprright => 'anyarray',
+  oprresult => 'bool', oprcom => '@>>(anyarray,anyelement)',
+  oprcode => 'arrayelemcontained', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
+{ oid => '6105', oid_symbol => 'OID_ARRAY_CONTAINSELEM_OP',
+  descr => 'contains elem',
+  oprname => '@>>', oprleft => 'anyarray', oprright => 'anyelement',
+  oprresult => 'bool', oprcom => '<<@(anyelement,anyarray)',
+  oprcode => 'arraycontainselem', oprrest => 'arraycontsel',
+  oprjoin => 'arraycontjoinsel' },
 
 # capturing operators to preserve pre-8.3 behavior of text concatenation
 { oid => '2779', descr => 'concatenate',
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index bfb89e0575..8eaefacb8d 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -8229,6 +8229,12 @@
 { oid => '2749',
   proname => 'arraycontained', prorettype => 'bool',
   proargtypes => 'anyarray anyarray', prosrc => 'arraycontained' },
+{ oid => '6109',
+  proname => 'arrayelemcontained', prorettype => 'bool',
+  proargtypes => 'anyelement anyarray', prosrc => 'arrayelemcontained' },
+{ oid => '6107',
+  proname => 'arraycontainselem', prorettype => 'bool',
+  proargtypes => 'anyarray anyelement', prosrc => 'arraycontainselem' },
 
 # BRIN minmax
 { oid => '3383', descr => 'BRIN minmax support',
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 3e3a1beaab..03ce07e219 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -758,6 +758,28 @@ SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
    100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
 (6 rows)
 
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    74 | {32}                            | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+    98 | {38,34,32,89}                   | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
+   100 | {85,32,57,39,49,84,32,3,30}     | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
+(6 rows)
+
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -782,6 +804,32 @@ SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
     89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
 (8 rows)
 
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
+ seqno |                i                |                                                                 t                                                                  
+-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
+     6 | {39,35,5,94,17,92,60,32}        | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
+    12 | {17,99,18,52,91,72,0,43,96,23}  | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
+    15 | {17,14,16,63,67}                | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    19 | {52,82,17,74,23,46,69,51,75}    | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
+    53 | {38,17}                         | {AAAAAAAAAAA21658}
+    65 | {61,5,76,59,17}                 | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
+    77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
+    89 | {40,32,17,6,30,88}              | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
+(8 rows)
+
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
  seqno |                i                |                                                                 t                                                                  
 -------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
@@ -963,6 +1011,16 @@ SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
 -------+---+---
 (0 rows)
 
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
+ seqno | i | t 
+-------+---+---
+(0 rows)
+
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
  seqno | i | t 
 -------+---+---
@@ -983,6 +1041,24 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
     79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
 (4 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
+ seqno |           i           |                                                                     t                                                                      
+-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
+    22 | {11,6,56,62,53,30}    | {AAAAAAAA72908}
+    45 | {99,45}               | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
+    72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
+    79 | {45}                  | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+(4 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
  seqno |           i           |                                                                     t                                                                      
 -------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
@@ -1000,6 +1076,22 @@ SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
     96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
 (3 rows)
 
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
+ seqno |        i         |                                 t                                  
+-------+------------------+--------------------------------------------------------------------
+    15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
+    79 | {45}             | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
+    96 | {23,97,43}       | {AAAAAAAAAA646,A87088}
+(3 rows)
+
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
  seqno |        i         |                                 t                                  
 -------+------------------+--------------------------------------------------------------------
diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out
index 6402e89c7f..21199af42e 100644
--- a/src/test/regress/expected/gin.out
+++ b/src/test/regress/expected/gin.out
@@ -53,6 +53,74 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
      3
 (1 row)
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 1)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (i @>> 999)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where i @>> 1;
+ count 
+-------
+  2997
+(1 row)
+
+select count(*) from gin_test_tbl where i @>> 999;
+ count 
+-------
+     3
+(1 row)
+
+explain (costs off)
+select count(*) from gin_test_tbl where 1 <<@ i;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (1 <<@ i)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 1)
+(5 rows)
+
+explain (costs off)
+select count(*) from gin_test_tbl where 999 <<@ i;
+                  QUERY PLAN                   
+-----------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on gin_test_tbl
+         Recheck Cond: (999 <<@ i)
+         ->  Bitmap Index Scan on gin_test_idx
+               Index Cond: (i @>> 999)
+(5 rows)
+
+select count(*) from gin_test_tbl where 1 <<@ i;
+ count 
+-------
+  2997
+(1 row)
+
+select count(*) from gin_test_tbl where 999 <<@ i;
+ count 
+-------
+     3
+(1 row)
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 explain (costs off)
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index ef4b4444b9..d22a8b5f33 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -1173,6 +1173,7 @@ ORDER BY 1, 2;
  <->  | <->
  <<   | >>
  <<=  | >>=
+ <<@  | @>>
  <=   | >=
  <>   | <>
  <@   | @>
@@ -1188,7 +1189,7 @@ ORDER BY 1, 2;
  ~<=~ | ~>=~
  ~<~  | ~>~
  ~=   | ~=
-(29 rows)
+(30 rows)
 
 -- Likewise for negator pairs.
 SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2
@@ -2029,6 +2030,7 @@ ORDER BY 1, 2, 3;
        2742 |            2 | @@@
        2742 |            3 | <@
        2742 |            4 | =
+       2742 |            5 | @>>
        2742 |            7 | @>
        2742 |            9 | ?
        2742 |           10 | ?|
@@ -2101,7 +2103,7 @@ ORDER BY 1, 2, 3;
        4000 |           28 | ^@
        4000 |           29 | <^
        4000 |           30 | >^
-(124 rows)
+(125 rows)
 
 -- Check that all opclass search operators have selectivity estimators.
 -- This is not absolutely required, but it seems a reasonable thing
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 912233ef96..944fa3afdd 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -319,8 +319,12 @@ SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
 SELECT ARRAY[1.1] || ARRAY[2,3,4];
 
 SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 32 ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 32 <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 17 <<@ i ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> 17 ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
@@ -331,12 +335,18 @@ SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE i @>> NULL  ORDER BY seqno;
+SELECT * FROM array_op_test WHERE NULL <<@ i ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
 
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAA72908' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAA72908' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE t @>> 'AAAAAAAAAA646' ORDER BY seqno;
+SELECT * FROM array_op_test WHERE 'AAAAAAAAAA646' <<@ t ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
 SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql
index 5194afcc1f..6dee7e844c 100644
--- a/src/test/regress/sql/gin.sql
+++ b/src/test/regress/sql/gin.sql
@@ -41,6 +41,22 @@ select count(*) from gin_test_tbl where i @> array[1, 999];
 
 select count(*) from gin_test_tbl where i @> array[1, 999];
 
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 1;
+explain (costs off)
+select count(*) from gin_test_tbl where i @>> 999;
+
+select count(*) from gin_test_tbl where i @>> 1;
+select count(*) from gin_test_tbl where i @>> 999;
+
+explain (costs off)
+select count(*) from gin_test_tbl where 1 <<@ i;
+explain (costs off)
+select count(*) from gin_test_tbl where 999 <<@ i;
+
+select count(*) from gin_test_tbl where 1 <<@ i;
+select count(*) from gin_test_tbl where 999 <<@ i;
+
 -- Very weak test for gin_fuzzy_search_limit
 set gin_fuzzy_search_limit = 1000;
 
-- 
2.27.0

v12-0002-fk_arrays_elems.patchtext/x-patch; charset=US-ASCII; name=v12-0002-fk_arrays_elems.patchDownload
From d9d1ae6ee4ac64051499b6f452af91ab1e91877d Mon Sep 17 00:00:00 2001
From: Mark Rofail <mark.rofail@shahry.app>
Date: Mon, 29 Mar 2021 21:56:06 +0200
Subject: [PATCH v12 2/3] fk_arrays_elems

---
 doc/src/sgml/catalogs.sgml               |  16 +
 doc/src/sgml/ddl.sgml                    | 109 ++++
 doc/src/sgml/ref/create_table.sgml       |  97 +++-
 src/backend/catalog/heap.c               |   1 +
 src/backend/catalog/index.c              |   1 +
 src/backend/catalog/pg_constraint.c      |  36 +-
 src/backend/commands/matview.c           |   3 +-
 src/backend/commands/tablecmds.c         | 162 +++++-
 src/backend/commands/trigger.c           |   1 +
 src/backend/commands/typecmds.c          |   1 +
 src/backend/nodes/copyfuncs.c            |   1 +
 src/backend/nodes/equalfuncs.c           |   1 +
 src/backend/nodes/outfuncs.c             |   1 +
 src/backend/parser/gram.y                |  73 ++-
 src/backend/parser/parse_utilcmd.c       |   2 +
 src/backend/utils/adt/ri_triggers.c      | 170 +++++-
 src/backend/utils/adt/ruleutils.c        | 102 +++-
 src/backend/utils/cache/relcache.c       |   2 +-
 src/include/catalog/pg_constraint.h      |  14 +-
 src/include/nodes/parsenodes.h           |   5 +
 src/include/parser/kwlist.h              |   1 +
 src/include/utils/builtins.h             |   3 +-
 src/test/regress/expected/element_fk.out | 625 +++++++++++++++++++++++
 src/test/regress/parallel_schedule       |   2 +-
 src/test/regress/serial_schedule         |   1 +
 src/test/regress/sql/element_fk.sql      | 475 +++++++++++++++++
 26 files changed, 1842 insertions(+), 63 deletions(-)
 create mode 100644 src/test/regress/expected/element_fk.out
 create mode 100644 src/test/regress/sql/element_fk.sql

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index f103d914a6..2938184e58 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2658,6 +2658,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para></entry>
      </row>
 
+     <row>
+      <entry><structfield>confreftype</structfield></entry>
+      <entry><type>char[]</type></entry>
+      <entry></entry>
+      <entry>If a foreign key, the reference semantics for each column:
+       <literal>p</literal> = plain (simple equality),
+       <literal>e</literal> = each element of referencing array must have a match
+      </entry>
+     </row>
+
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>conpfeqop</structfield> <type>oid[]</type>
@@ -2713,6 +2723,12 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
    </tgroup>
   </table>
 
+  <para>
+    When <structfield>confreftype</structfield> indicates array to scalar
+    foreign key reference semantics, the equality operators listed in
+    <structfield>conpfeqop</structfield> etc are for the array's element type.
+  </para>
+ 
   <para>
    In the case of an exclusion constraint, <structfield>conkey</structfield>
    is only useful for constraint elements that are simple column references.
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index f073fbafd3..365e31c258 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1079,6 +1079,115 @@ CREATE TABLE order_items (
    </para>
   </sect2>
 
+  <sect2 id="ddl-constraints-element-fk">
+   <title>Array Element Foreign Keys</title>
+
+   <indexterm>
+    <primary>Array Element Foreign Keys</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>ELEMENT foreign key</primary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>Array ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>constraint</primary>
+    <secondary>ELEMENT foreign key</secondary>
+   </indexterm>
+
+   <indexterm>
+    <primary>referential integrity</primary>
+   </indexterm>
+
+   <para>
+    Another option you have with foreign keys is to use a referencing column
+    which is an array of elements with the same type (or a compatible one) as
+    the referenced column in the related table. This feature is called
+    <firstterm>Array Element Foreign Keys</firstterm> and is implemented in PostgreSQL
+    with <firstterm>EACH ELEMENT OF foreign key constraints</firstterm>, as
+    described in the following example:
+
+    <programlisting>
+     CREATE TABLE drivers (
+         driver_id integer PRIMARY KEY,
+         first_name text,
+         last_name text
+     );
+
+     CREATE TABLE racing (
+         race_id integer PRIMARY KEY,
+         title text,
+         race_day date,
+         final_positions integer[],
+         FOREIGN KEY <emphasis> (EACH ELEMENT OF final_positions) REFERENCES drivers </emphasis>
+     );
+    </programlisting>
+
+    The above example uses an array (<literal>final_positions</literal>) to
+    store the results of a race: for each of its elements a referential
+    integrity check is enforced on the <literal>drivers</literal> table. Note
+    that <literal>(EACH ELEMENT OF ...) REFERENCES</literal> is an extension of
+    PostgreSQL and it is not included in the SQL standard.
+   </para>
+
+   <para>
+    We currently only support the table constraint form.
+   </para>
+
+   <para>
+    Even though the most common use case for Array Element Foreign Keys constraint is on
+    a single column key, you can define an Array Element Foreign Keys constraint on a
+    group of columns.
+
+    <programlisting>
+     CREATE TABLE available_moves (
+         kind text,
+         move text,
+         description text,
+         PRIMARY KEY (kind, move)
+     );
+
+     CREATE TABLE paths (
+         description text,
+         kind text,
+         moves text[],
+         <emphasis>FOREIGN KEY (kind, EACH ELEMENT OF moves) REFERENCES available_moves (kind, move)</emphasis>
+     );
+
+     INSERT INTO available_moves VALUES ('relative', 'LN', 'look north');
+     INSERT INTO available_moves VALUES ('relative', 'RL', 'rotate left');
+     INSERT INTO available_moves VALUES ('relative', 'RR', 'rotate right');
+     INSERT INTO available_moves VALUES ('relative', 'MF', 'move forward');
+     INSERT INTO available_moves VALUES ('absolute', 'N', 'move north');
+     INSERT INTO available_moves VALUES ('absolute', 'S', 'move south');
+     INSERT INTO available_moves VALUES ('absolute', 'E', 'move east');
+     INSERT INTO available_moves VALUES ('absolute', 'W', 'move west');
+
+     INSERT INTO paths VALUES ('L-shaped path', 'relative', '{LN, RL, MF, RR, MF, MF}');
+     INSERT INTO paths VALUES ('L-shaped path', 'absolute', '{W, N, N}');
+    </programlisting>
+
+    In addition to standard foreign key requirements, array
+    <literal>ELEMENT</literal> foreign key constraints require that the
+    referencing column is an array of a compatible type to the corresponding
+    referenced column.
+   
+    Note that we currently only support one array reference per foreign key.
+   </para>
+
+   <para>
+    For more detailed information on Array Element Foreign Keys options and special
+    cases, please refer to the documentation for 
+    <xref linkend="sql-createtable-foreign-key"/> and
+    <xref linkend="sql-createtable-element-foreign-key-constraints"/>.
+   </para>
+  </sect2>
+
   <sect2 id="ddl-constraints-exclusion">
    <title>Exclusion Constraints</title>
 
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 44e50620fd..8123eec1a6 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1063,10 +1063,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
-   <varlistentry>
+   <varlistentry id="sql-createtable-foreign-key" xreflabel="FOREIGN KEY">
     <term><literal>REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ] [ ON UPDATE <replaceable class="parameter">referential_action</replaceable> ]</literal> (column constraint)</term>
 
-   <term><literal>FOREIGN KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )
+   <term><literal>FOREIGN KEY ( [EACH ELEMENT OF] <replaceable class="parameter">column_name</replaceable> [, ... ] )
     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">referential_action</replaceable> ]
@@ -1091,6 +1091,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       tables and permanent tables.
      </para>
 
+     <para>
+      In case the column name <replaceable class="parameter">column</replaceable> is 
+      prepended with the <literal>EACH ELEMENT OF</literal> keyword and <replaceable 
+      class="parameter">column</replaceable> is an array of elements compatible with 
+      the corresponding <replaceable class="parameter">refcolumn</replaceable> in 
+      <replaceable class="parameter">reftable</replaceable>, an Array Element Foreign Key 
+      constraint is put in place (see <xref 
+      linkend="sql-createtable-element-foreign-key-constraints"/> for more 
+      information). Multi-column keys with more than one <literal>EACH ELEMENT 
+      OF</literal> column are currently not allowed. 
+     </para>
+
      <para>
       A value inserted into the referencing column(s) is matched against the
       values of the referenced table and referenced columns using the
@@ -1154,7 +1166,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
          <para>
           Delete any rows referencing the deleted row, or update the
           values of the referencing column(s) to the new values of the
-          referenced columns, respectively.
+          referenced columns, respectively. 
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1164,6 +1177,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
         <listitem>
          <para>
           Set the referencing column(s) to null.
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1175,6 +1189,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
           Set the referencing column(s) to their default values.
           (There must be a row in the referenced table matching the default
           values, if they are not null, or the operation will fail.)
+          Currently not supported with Array Element Foreign Keys.
          </para>
         </listitem>
        </varlistentry>
@@ -1190,6 +1205,73 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="sql-createtable-element-foreign-key-constraints" xreflabel="Array ELEMENT Foreign Keys">
+    <term><literal>EACH ELEMENT OF <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] [ MATCH <replaceable class="parameter">matchtype</replaceable> ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]</literal> (column constraint)</term>
+
+    <listitem>
+     <para>
+      The <literal>EACH ELEMENT OF REFERENCES</literal> definition specifies an 
+      <quote>Array Element Foreign Key</quote>, a special kind of foreign key constraint 
+      requiring the referencing column to be an array of elements of the same type (or 
+      a compatible one) as the referenced column in the referenced table. The value of 
+      each element of the <replaceable class="parameter">refcolumn</replaceable> array 
+      will be matched against some row of <replaceable 
+      class="parameter">reftable</replaceable>. 
+     </para>
+
+     <para>
+      Array Element Foreign Keys are an extension of PostgreSQL and are not included in the SQL standard.
+     </para>
+
+     <para>
+      Even with Array Element Foreign Keys, modifications in the referenced column can trigger 
+      actions to be performed on the referencing array. Similarly to standard foreign 
+      keys, you can specify these actions using the <literal>ON DELETE</literal> and 
+      <literal>ON UPDATE</literal> clauses. However, only the following actions for 
+      each clause are currently allowed:
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE NO ACTION</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints. This is the default action.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>ON UPDATE/DELETE RESTRICT</literal></term>
+        <listitem>
+         <para>
+          Same as standard foreign key constraints.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+
+     <para>
+      It is advisable to index the referencing column using a GIN index as it 
+      considerably enhances the performance. Also concerning coercion while using the 
+      GIN index:
+        
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int2 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int4[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+      </programlisting>
+      This syntax is fine since it will cast ptest1 to int4 upon RI checks,        
+
+      <programlisting>
+       CREATE TABLE pktableforarray ( ptest1 int4 PRIMARY KEY, ptest2 text );
+       CREATE TABLE fktableforarray ( ftest1 int2[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );        
+      </programlisting>
+       however, this syntax will cast ftest1 to int4 upon RI checks, thus defeating the
+       purpose of the index.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>DEFERRABLE</literal></term>
     <term><literal>NOT DEFERRABLE</literal></term>
@@ -2337,6 +2419,15 @@ CREATE TABLE cities_partdef
    </para>
   </refsect2>
 
+  <refsect2>
+   <title id="sql-createtable-foreign-key-arrays">Array <literal>ELEMENT</literal> Foreign Keys</title>
+
+   <para>
+    Array <literal>ELEMENT</literal> Foreign Keys and the <literal>EACH ELEMENT 
+    OF</literal> clause are a <productname>PostgreSQL</productname> extension. 
+   </para>
+  </refsect2>
+
   <refsect2>
    <title><literal>PARTITION BY</literal> Clause</title>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 9f6303266f..fb878efbba 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2472,6 +2472,7 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index a628b3281c..8cf55df0d0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2121,6 +2121,7 @@ index_constraint_create(Relation heapRelation,
 								   NULL,
 								   NULL,
 								   NULL,
+								   NULL,
 								   0,
 								   ' ',
 								   ' ',
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 0081558c48..be1fc54a35 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -62,6 +62,7 @@ CreateConstraintEntry(const char *constraintName,
 					  Oid indexRelId,
 					  Oid foreignRelId,
 					  const int16 *foreignKey,
+					  const char *foreignRefType,
 					  const Oid *pfEqOp,
 					  const Oid *ppEqOp,
 					  const Oid *ffEqOp,
@@ -84,6 +85,7 @@ CreateConstraintEntry(const char *constraintName,
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
+	ArrayType  *confreftypeArray;
 	ArrayType  *conpfeqopArray;
 	ArrayType  *conppeqopArray;
 	ArrayType  *conffeqopArray;
@@ -123,7 +125,11 @@ CreateConstraintEntry(const char *constraintName,
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = Int16GetDatum(foreignKey[i]);
 		confkeyArray = construct_array(fkdatums, foreignNKeys,
-									   INT2OID, 2, true, TYPALIGN_SHORT);
+									   INT2OID, sizeof(int16), true, TYPALIGN_SHORT);
+		for (i = 0; i < foreignNKeys; i++)
+			fkdatums[i] = CharGetDatum(foreignRefType[i]);
+		confreftypeArray = construct_array(fkdatums, foreignNKeys,
+										   CHAROID, sizeof(char), true, TYPALIGN_CHAR);
 		for (i = 0; i < foreignNKeys; i++)
 			fkdatums[i] = ObjectIdGetDatum(pfEqOp[i]);
 		conpfeqopArray = construct_array(fkdatums, foreignNKeys,
@@ -140,6 +146,7 @@ CreateConstraintEntry(const char *constraintName,
 	else
 	{
 		confkeyArray = NULL;
+		confreftypeArray = NULL;
 		conpfeqopArray = NULL;
 		conppeqopArray = NULL;
 		conffeqopArray = NULL;
@@ -196,6 +203,11 @@ CreateConstraintEntry(const char *constraintName,
 	else
 		nulls[Anum_pg_constraint_confkey - 1] = true;
 
+	if (confreftypeArray)
+		values[Anum_pg_constraint_confreftype - 1] = PointerGetDatum(confreftypeArray);
+	else
+		nulls[Anum_pg_constraint_confreftype - 1] = true;
+
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
@@ -1163,7 +1175,8 @@ get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
 void
 DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 						   AttrNumber *conkey, AttrNumber *confkey,
-						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
+						   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+						   char *fk_reftypes)
 {
 	Oid			constrId;
 	Datum		adatum;
@@ -1208,6 +1221,25 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 	if ((Pointer) arr != DatumGetPointer(adatum))
 		pfree(arr);				/* free de-toasted copy, if any */
 
+	if (fk_reftypes)
+	{
+		adatum = SysCacheGetAttr(CONSTROID, tuple,
+								 Anum_pg_constraint_confreftype, &isNull);
+		if (isNull)
+			elog(ERROR, "null confreftype for constraint %u", constrId);
+		arr = DatumGetArrayTypeP(adatum);	/* ensure not toasted */
+		if (ARR_NDIM(arr) != 1 ||
+			ARR_ELEMTYPE(arr) != CHAROID)
+			elog(ERROR, "confreftype is not a 1-D char array");
+		if (ARR_HASNULL(arr))
+			elog(ERROR, "confreftype contains nulls");
+		if (ARR_DIMS(arr)[0] != numkeys)
+			elog(ERROR, "confreftype length does not equal the number of foreign keys");
+		memcpy(fk_reftypes, ARR_DATA_PTR(arr), numkeys * sizeof(char));
+		if ((Pointer) arr != DatumGetPointer(adatum))
+			pfree(arr);				/* free de-toasted copy, if any */
+	}
+
 	if (pf_eq_oprs)
 	{
 		adatum = SysCacheGetAttr(CONSTROID, tuple,
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index 172ec6e982..648649ef44 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -764,7 +764,8 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
 				generate_operator_clause(&querybuf,
 										 leftop, attrtype,
 										 op,
-										 rightop, attrtype);
+										 rightop, attrtype,
+										 FKCONSTR_REF_PLAIN);
 
 				foundUniqueIndex = true;
 			}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 88a68a4697..e983f95bda 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -463,12 +463,12 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *
 											   LOCKMODE lockmode);
 static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint,
 											Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-											int numfks, int16 *pkattnum, int16 *fkattnum,
+											int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 											Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 											bool old_check_ok);
-static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint,
-									Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr,
-									int numfks, int16 *pkattnum, int16 *fkattnum,
+static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
+									Relation pkrel, Oid indexOid, Oid parentConstr,
+									int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 									Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 									bool old_check_ok, LOCKMODE lockmode);
 static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel,
@@ -8673,6 +8673,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Relation	pkrel;
 	int16		pkattnum[INDEX_MAX_KEYS];
 	int16		fkattnum[INDEX_MAX_KEYS];
+	char		fkreftypes[INDEX_MAX_KEYS];
 	Oid			pktypoid[INDEX_MAX_KEYS];
 	Oid			fktypoid[INDEX_MAX_KEYS];
 	Oid			opclasses[INDEX_MAX_KEYS];
@@ -8680,9 +8681,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	Oid			ppeqoperators[INDEX_MAX_KEYS];
 	Oid			ffeqoperators[INDEX_MAX_KEYS];
 	int			i;
+	ListCell   *lc;
 	int			numfks,
 				numpks;
 	Oid			indexOid;
+	bool		has_array;
 	bool		old_check_ok;
 	ObjectAddress address;
 	ListCell   *old_pfeqop_item = list_head(fkconstraint->old_conpfeqop);
@@ -8771,6 +8774,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 	 */
 	MemSet(pkattnum, 0, sizeof(pkattnum));
 	MemSet(fkattnum, 0, sizeof(fkattnum));
+	MemSet(fkreftypes, 0, sizeof(fkreftypes));
 	MemSet(pktypoid, 0, sizeof(pktypoid));
 	MemSet(fktypoid, 0, sizeof(fktypoid));
 	MemSet(opclasses, 0, sizeof(opclasses));
@@ -8782,6 +8786,54 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 fkconstraint->fk_attrs,
 									 fkattnum, fktypoid);
 
+	/*
+	 * Validate the reference semantics codes, too, and convert list to array
+	 * format to pass to CreateConstraintEntry.
+	 */
+	Assert(list_length(fkconstraint->fk_reftypes) == numfks);
+	has_array = false;
+	i = 0;
+	foreach(lc, fkconstraint->fk_reftypes)
+	{
+		char		reftype = lfirst_int(lc);
+
+		switch (reftype)
+		{
+			case FKCONSTR_REF_PLAIN:
+				/* OK, nothing to do */
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				/* At most one FK column can be an array reference */
+				if (has_array)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+							 errmsg("foreign keys support only one array column")));
+
+				has_array = true;
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d", (int) reftype);
+				break;
+		}
+		fkreftypes[i] = reftype;
+		i++;
+	}
+
+	/*
+	* Array foreign keys support only UPDATE/DELETE NO ACTION, UPDATE/DELETE
+	* RESTRICT
+	*/
+	if (has_array)
+	{
+		if ((fkconstraint->fk_upd_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_upd_action != FKCONSTR_ACTION_RESTRICT) ||
+			(fkconstraint->fk_del_action != FKCONSTR_ACTION_NOACTION &&
+			 fkconstraint->fk_del_action != FKCONSTR_ACTION_RESTRICT))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					 errmsg("Array Element Foreign Keys support only NO ACTION and RESTRICT actions")));
+	}
+
 	/*
 	 * If the attribute list for the referenced table was omitted, lookup the
 	 * definition of the primary key and use it.  Otherwise, validate the
@@ -8895,6 +8947,78 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			elog(ERROR, "only b-tree indexes are supported for foreign keys");
 		eqstrategy = BTEqualStrategyNumber;
 
+		/*
+		 * If this is an array foreign key, we must look up the operators for
+		 * the array element type, not the array type itself.
+		 */
+		if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			Oid			elemopclass;
+
+			/* We check if the array element type exists and is of valid Oid */
+			fktype = get_base_element_type(fktype);
+			if (!OidIsValid(fktype))
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has type %s which is not an array type.",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktypoid[i]))));
+
+			/*
+			 * make sure the <<@ operator can work with the specified operand
+			 * types
+			 */
+			if (fktype != pktype)
+				ereport(ERROR,
+				(errcode(ERRCODE_INVALID_FOREIGN_KEY),
+					errmsg("foreign key constraint \"%s\" cannot be implemented",
+						fkconstraint->conname),
+					errdetail("Unssupported relation between %s and %s.",
+							format_type_be(fktypoid[i]),
+							format_type_be(pktype))));
+
+			/*
+			 * For the moment, we must also insist that the array's element
+			 * type have a default btree opclass that is in the index's
+			 * opfamily.  This is necessary because ri_triggers.c relies on
+			 * COUNT(DISTINCT x) on the element type, as well as on array_eq()
+			 * on the array type, and we need those operations to have the
+			 * same notion of equality that we're using otherwise.
+			 *
+			 * XXX this restriction is pretty annoying, considering the effort
+			 * that's been put into the rest of the RI mechanisms to make them
+			 * work with nondefault equality operators.  In particular, it
+			 * means that the cast-to-PK-datatype code path isn't useful for
+			 * array-to-scalar references.
+			 */
+			elemopclass = GetDefaultOpClass(fktype, BTREE_AM_OID);
+			if (!OidIsValid(elemopclass) ||
+				get_opclass_family(elemopclass) != opfamily)
+			{
+				/* Get the index opclass's name for the error message. */
+				char	   *opcname;
+
+				cla_ht = SearchSysCache1(CLAOID,
+										 ObjectIdGetDatum(opclasses[i]));
+				if (!HeapTupleIsValid(cla_ht))
+					elog(ERROR, "cache lookup failed for opclass %u",
+						 opclasses[i]);
+				cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht);
+				opcname = pstrdup(NameStr(cla_tup->opcname));
+				ReleaseSysCache(cla_ht);
+				ereport(ERROR,
+						(errcode(ERRCODE_DATATYPE_MISMATCH),
+						 errmsg("foreign key constraint \"%s\" cannot be implemented",
+								fkconstraint->conname),
+						 errdetail("Key column \"%s\" has element type %s which does not have a default btree operator class that's compatible with class \"%s\".",
+								   strVal(list_nth(fkconstraint->fk_attrs, i)),
+								   format_type_be(fktype),
+								   opcname)));
+			}
+		}
+
 		/*
 		 * There had better be a primary equality operator for the index.
 		 * We'll use it for PK = PK comparisons.
@@ -8994,6 +9118,13 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 			 * We may assume that pg_constraint.conkey is not changing.
 			 */
 			old_fktype = attr->atttypid;
+			if (fkreftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			{
+				old_fktype = get_base_element_type(old_fktype);
+				/* this shouldn't happen ... */
+				if (!OidIsValid(old_fktype))
+					elog(ERROR, "old foreign key column is not an array");
+			}
 			new_fktype = fktype;
 			old_pathtype = findFkeyCast(pfeqop_right, old_fktype,
 										&old_castfunc);
@@ -9053,6 +9184,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 									 numfks,
 									 pkattnum,
 									 fkattnum,
+									 fkreftypes,
 									 pfeqoperators,
 									 ppeqoperators,
 									 ffeqoperators,
@@ -9065,6 +9197,7 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
 							numfks,
 							pkattnum,
 							fkattnum,
+							fkreftypes,
 							pfeqoperators,
 							ppeqoperators,
 							ffeqoperators,
@@ -9108,7 +9241,7 @@ static ObjectAddress
 addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					   Relation pkrel, Oid indexOid, Oid parentConstr,
 					   int numfks,
-					   int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators,
+					   int16 *pkattnum, int16 *fkattnum, char *fkreftypes, Oid *pfeqoperators,
 					   Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok)
 {
 	ObjectAddress address;
@@ -9178,6 +9311,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9263,7 +9397,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 					 indexOid, RelationGetRelationName(partRel));
 			addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel,
 								   partIndexId, constrOid, numfks,
-								   mapped_pkattnum, fkattnum,
+								   mapped_pkattnum, fkattnum, fkreftypes,
 								   pfeqoperators, ppeqoperators, ffeqoperators,
 								   old_check_ok);
 
@@ -9312,7 +9446,7 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel,
 static void
 addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 						Relation pkrel, Oid indexOid, Oid parentConstr,
-						int numfks, int16 *pkattnum, int16 *fkattnum,
+						int numfks, int16 *pkattnum, int16 *fkattnum, char *fkreftypes,
 						Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators,
 						bool old_check_ok, LOCKMODE lockmode)
 {
@@ -9446,6 +9580,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									  indexOid,
 									  RelationGetRelid(pkrel),
 									  pkattnum,
+									  fkreftypes,
 									  pfeqoperators,
 									  ppeqoperators,
 									  ffeqoperators,
@@ -9481,6 +9616,7 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel,
 									numfks,
 									pkattnum,
 									mapped_fkattnum,
+									fkreftypes,
 									pfeqoperators,
 									ppeqoperators,
 									ffeqoperators,
@@ -9589,6 +9725,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Constraint *fkconstraint;
 
 		tuple = SearchSysCache1(CONSTROID, constrOid);
@@ -9621,8 +9758,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 								   confkey,
 								   conpfeqop,
 								   conppeqop,
-								   conffeqop);
-
+								   conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_confkey[i] = attmap->attnums[confkey[i] - 1];
 
@@ -9665,6 +9802,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel)
 							   numfks,
 							   mapped_confkey,
 							   conkey,
+							   confreftype,
 							   conpfeqop,
 							   conppeqop,
 							   conffeqop,
@@ -9735,6 +9873,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 		AttrNumber	conkey[INDEX_MAX_KEYS];
 		AttrNumber	mapped_conkey[INDEX_MAX_KEYS];
 		AttrNumber	confkey[INDEX_MAX_KEYS];
+		char		confreftype[INDEX_MAX_KEYS];
 		Oid			conpfeqop[INDEX_MAX_KEYS];
 		Oid			conppeqop[INDEX_MAX_KEYS];
 		Oid			conffeqop[INDEX_MAX_KEYS];
@@ -9769,7 +9908,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 									   ShareRowExclusiveLock, NULL);
 
 		DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey,
-								   conpfeqop, conppeqop, conffeqop);
+								   conpfeqop, conppeqop, conffeqop,
+								   confreftype);
 		for (int i = 0; i < numfks; i++)
 			mapped_conkey[i] = attmap->attnums[conkey[i] - 1];
 
@@ -9848,6 +9988,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								  indexOid,
 								  constrForm->confrelid,	/* same foreign rel */
 								  confkey,
+								  confreftype,
 								  conpfeqop,
 								  conppeqop,
 								  conffeqop,
@@ -9886,6 +10027,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
 								numfks,
 								confkey,
 								mapped_conkey,
+								confreftype,
 								conpfeqop,
 								conppeqop,
 								conffeqop,
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 7383d5994e..a63b37e0d8 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -801,6 +801,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
 											  NULL,
 											  NULL,
 											  NULL,
+											  NULL,
 											  0,
 											  ' ',
 											  ' ',
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 76218fb47e..3fd3f0fe57 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -3553,6 +3553,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
 							  NULL,
 							  NULL,
 							  NULL,
+							  NULL,
 							  0,
 							  ' ',
 							  ' ',
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 1d0bb6e2e7..284e2cf373 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3045,6 +3045,7 @@ _copyConstraint(const Constraint *from)
 	COPY_NODE_FIELD(pktable);
 	COPY_NODE_FIELD(fk_attrs);
 	COPY_NODE_FIELD(pk_attrs);
+	COPY_NODE_FIELD(fk_reftypes);
 	COPY_SCALAR_FIELD(fk_matchtype);
 	COPY_SCALAR_FIELD(fk_upd_action);
 	COPY_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index d46909bbc4..393b7f06bc 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2655,6 +2655,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
 	COMPARE_NODE_FIELD(pktable);
 	COMPARE_NODE_FIELD(fk_attrs);
 	COMPARE_NODE_FIELD(pk_attrs);
+	COMPARE_NODE_FIELD(fk_reftypes);
 	COMPARE_SCALAR_FIELD(fk_matchtype);
 	COMPARE_SCALAR_FIELD(fk_upd_action);
 	COMPARE_SCALAR_FIELD(fk_del_action);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 301fa30490..7df2517d78 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3655,6 +3655,7 @@ _outConstraint(StringInfo str, const Constraint *node)
 			WRITE_NODE_FIELD(pktable);
 			WRITE_NODE_FIELD(fk_attrs);
 			WRITE_NODE_FIELD(pk_attrs);
+			WRITE_NODE_FIELD(fk_reftypes);
 			WRITE_CHAR_FIELD(fk_matchtype);
 			WRITE_CHAR_FIELD(fk_upd_action);
 			WRITE_CHAR_FIELD(fk_del_action);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7ff36bc842..f9e171e43e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -141,6 +141,19 @@ typedef struct GroupClause
 	List   *list;
 } GroupClause;
 
+/*
+ * Private struct for the result of foreign_key_column_elem production contains
+ * reftype that denotes type of foreign key; can be one of the following:
+ *
+ * FKCONSTR_REF_PLAIN 			plain foreign keys
+ * FKCONSTR_REF_EACH_ELEMENT	foreign key arrays
+ */
+typedef struct FKColElem
+{
+	Node	   *name;			/* name of the column (a String) */
+	char		reftype;		/* FKCONSTR_REF_xxx code */
+} FKColElem;
+
 /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
 #define CAS_NOT_DEFERRABLE			0x01
 #define CAS_DEFERRABLE				0x02
@@ -198,6 +211,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_
 static void SplitColQualList(List *qualList,
 							 List **constraintList, CollateClause **collClause,
 							 core_yyscan_t yyscanner);
+static void SplitFKColElems(List *fkcolelems, List **names, List **reftypes);
 static void processCASbits(int cas_bits, int location, const char *constrType,
 			   bool *deferrable, bool *initdeferred, bool *not_valid,
 			   bool *no_inherit, core_yyscan_t yyscanner);
@@ -249,6 +263,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
+	struct FKColElem	*fkcolelem;
 	AccessPriv			*accesspriv;
 	struct ImportQual	*importqual;
 	InsertStmt			*istmt;
@@ -385,6 +400,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <accesspriv> privilege
 %type <list>	privileges privilege_list
 %type <privtarget> privilege_target
+%type <fkcolelem> foreign_key_column_elem
 %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes procedure_with_argtypes function_with_argtypes_common
 %type <list>	function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list procedure_with_argtypes_list
 %type <ival>	defacl_privilege_target
@@ -422,7 +438,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				execute_param_clause using_clause returning_clause
 				opt_enum_val_list enum_val_list table_func_column_list
 				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
+				relation_expr_list dostmt_opt_list foreign_key_column_list
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
@@ -656,7 +672,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
 	DOUBLE_P DROP
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+	EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
 	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
 	EXTENSION EXTERNAL EXTRACT
 
@@ -3668,8 +3684,10 @@ ColConstraintElem:
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
 					n->pktable			= $2;
+					/* fk_attrs will be filled in by parse analysis */
 					n->fk_attrs			= NIL;
 					n->pk_attrs			= $3;
+					n->fk_reftypes		= list_make1_int(FKCONSTR_REF_PLAIN);
 					n->fk_matchtype		= $4;
 					n->fk_upd_action	= (char) ($5 >> 8);
 					n->fk_del_action	= (char) ($5 & 0xFF);
@@ -3872,14 +3890,15 @@ ConstraintElem:
 								   NULL, yyscanner);
 					$$ = (Node *)n;
 				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
+			| FOREIGN KEY '(' foreign_key_column_list ')' REFERENCES
+				qualified_name opt_column_list key_match key_actions
+				ConstraintAttributeSpec
 				{
 					Constraint *n = makeNode(Constraint);
 					n->contype = CONSTR_FOREIGN;
 					n->location = @1;
+					SplitFKColElems($4, &n->fk_attrs, &n->fk_reftypes);
 					n->pktable			= $7;
-					n->fk_attrs			= $4;
 					n->pk_attrs			= $8;
 					n->fk_matchtype		= $9;
 					n->fk_upd_action	= (char) ($10 >> 8);
@@ -3913,6 +3932,30 @@ columnElem: ColId
 				}
 		;
 
+foreign_key_column_list:
+			foreign_key_column_elem
+				{ $$ = list_make1($1); }
+			| foreign_key_column_list ',' foreign_key_column_elem
+				{ $$ = lappend($1, $3); }
+		;
+
+foreign_key_column_elem:
+			ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($1);
+					n->reftype = FKCONSTR_REF_PLAIN;
+					$$ = n;
+				}
+			| EACH ELEMENT OF ColId
+				{
+					FKColElem *n = (FKColElem *) palloc(sizeof(FKColElem));
+					n->name = (Node *) makeString($4);
+					n->reftype = FKCONSTR_REF_EACH_ELEMENT;
+					$$ = n;
+				}
+		;
+
 opt_c_include:	INCLUDE '(' columnList ')'			{ $$ = $3; }
 			 |		/* EMPTY */						{ $$ = NIL; }
 		;
@@ -15426,6 +15469,7 @@ unreserved_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ENABLE_P
 			| ENCODING
 			| ENCRYPTED
@@ -15964,6 +16008,7 @@ bare_label_keyword:
 			| DOUBLE_P
 			| DROP
 			| EACH
+			| ELEMENT
 			| ELSE
 			| ENABLE_P
 			| ENCODING
@@ -16984,6 +17029,24 @@ SplitColQualList(List *qualList,
 	*constraintList = qualList;
 }
 
+/* Split a list of FKColElem structs into separate name and reftype lists */
+static void
+SplitFKColElems(List *fkcolelems, List **names, List **reftypes)
+{
+	ListCell   *lc;
+
+	*names = NIL;
+	*reftypes = NIL;
+
+	foreach(lc, fkcolelems)
+	{
+		FKColElem *fkcolelem = (FKColElem *) lfirst(lc);
+
+		*names = lappend(*names, fkcolelem->name);
+		*reftypes = lappend_int(*reftypes, fkcolelem->reftype);
+	}
+}
+
 /*
  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  * in the output command node.  Pass NULL for any flags the particular
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index b968c25dd6..cf04bead90 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -800,6 +800,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
 				 * list of FK constraints to be processed later.
 				 */
 				constraint->fk_attrs = list_make1(makeString(column->colname));
+				/* grammar should have set fk_reftypes */
+				Assert(list_length(constraint->fk_reftypes) == 1);
 				cxt->fkconstraints = lappend(cxt->fkconstraints, constraint);
 				break;
 
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 7c77c338ce..43c3e4bd59 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -111,9 +111,11 @@ typedef struct RI_ConstraintInfo
 	char		confupdtype;	/* foreign key's ON UPDATE action */
 	char		confdeltype;	/* foreign key's ON DELETE action */
 	char		confmatchtype;	/* foreign key's match type */
+	bool		has_array;		/* true if any reftype is EACH_ELEMENT */
 	int			nkeys;			/* number of key columns */
 	int16		pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
 	int16		fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+	char		fk_reftypes[RI_MAX_NUMKEYS];	/* reference semantics */
 	Oid			pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
 	Oid			pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
 	Oid			ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
@@ -187,7 +189,8 @@ static void ri_GenerateQual(StringInfo buf,
 							const char *sep,
 							const char *leftop, Oid leftoptype,
 							Oid opoid,
-							const char *rightop, Oid rightoptype);
+							const char *rightop, Oid rightoptype,
+							char fkreftype);
 static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
 static int	ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
 						 const RI_ConstraintInfo *riinfo, bool rel_is_pk);
@@ -346,6 +349,7 @@ RI_FKey_check(TriggerData *trigdata)
 	if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
 	{
 		StringInfoData querybuf;
+		StringInfoData countbuf;
 		char		pkrelname[MAX_QUOTED_REL_NAME_LEN];
 		char		attname[MAX_QUOTED_NAME_LEN];
 		char		paramname[16];
@@ -359,6 +363,14 @@ RI_FKey_check(TriggerData *trigdata)
 		 *		   FOR KEY SHARE OF x
 		 * The type id's for the $ parameters are those of the
 		 * corresponding FK attributes.
+		 *
+		 * In case of an array ELEMENT foreign key, the previous query is used
+		 * to count the number of matching rows and see if every combination
+		 * is actually referenced.
+		 * The wrapping query is
+		 *	SELECT 1 WHERE
+		 *	  (SELECT count(DISTINCT y) FROM unnest($1) y)
+		 *	  = (SELECT count(*) FROM (<QUERY>) z)
 		 * ----------
 		 */
 		initStringInfo(&querybuf);
@@ -368,6 +380,13 @@ RI_FKey_check(TriggerData *trigdata)
 		appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
 						 pk_only, pkrelname);
 		querysep = "WHERE";
+
+		if (riinfo->has_array)
+		{
+			initStringInfo(&countbuf);
+			appendStringInfo(&countbuf, "SELECT 1 WHERE ");
+		}
+
 		for (int i = 0; i < riinfo->nkeys; i++)
 		{
 			Oid			pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
@@ -376,18 +395,44 @@ RI_FKey_check(TriggerData *trigdata)
 			quoteOneName(attname,
 						 RIAttName(pk_rel, riinfo->pk_attnums[i]));
 			sprintf(paramname, "$%d", i + 1);
+
+			/*
+			 * In case of an array ELEMENT foreign key, we check that each
+			 * distinct non-null value in the array is present in the PK
+			 * table.
+			 */
+			if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+				appendStringInfo(&countbuf,
+								 "(SELECT pg_catalog.count(DISTINCT y) FROM pg_catalog.unnest(%s) y)",
+								 paramname);
+
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							paramname, fk_type);
+							paramname, fk_type,
+							riinfo->fk_reftypes[i]);
 			querysep = "AND";
 			queryoids[i] = fk_type;
 		}
 		appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
 
-		/* Prepare and save the plan */
-		qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
-							 &qkey, fk_rel, pk_rel);
+		if (riinfo->has_array)
+		{
+			appendStringInfo(&countbuf,
+							 " OPERATOR(pg_catalog.=) (SELECT pg_catalog.count(*) FROM (%s) z)",
+							 querybuf.data);
+
+			/* Prepare and save the plan for Array Element Foreign Keys */
+			qplan = ri_PlanCheck(countbuf.data, riinfo->nkeys, queryoids,
+								 &qkey, fk_rel, pk_rel);
+		}
+		else
+		{
+			/* Prepare and save the plan */
+			qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+								&qkey, fk_rel, pk_rel);
+
+		}
 	}
 
 	/*
@@ -510,7 +555,8 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
 			ri_GenerateQual(&querybuf, querysep,
 							attname, pk_type,
 							riinfo->pp_eq_oprs[i],
-							paramname, pk_type);
+							paramname, pk_type,
+							FKCONSTR_REF_PLAIN);
 			querysep = "AND";
 			queryoids[i] = pk_type;
 		}
@@ -700,7 +746,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -806,7 +853,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&querybuf, querysep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = "AND";
@@ -925,7 +973,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1105,7 +1154,8 @@ ri_set(TriggerData *trigdata, bool is_set_null)
 			ri_GenerateQual(&qualbuf, qualsep,
 							paramname, pk_type,
 							riinfo->pf_eq_oprs[i],
-							attname, fk_type);
+							attname, fk_type,
+							riinfo->fk_reftypes[i]);
 			if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
 				ri_GenerateQualCollation(&querybuf, pk_coll);
 			querysep = ",";
@@ -1378,6 +1428,14 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	 * For MATCH FULL:
 	 *	 (fk.keycol1 IS NOT NULL [OR ...])
 	 *
+	 * In case of an array ELEMENT column, relname is replaced with the
+	 * following subquery:
+	 *
+	 *	 SELECT unnest("keycol1") k1, "keycol1" ak1 [, ...]
+	 *	 FROM ONLY "public"."fk"
+	 *
+	 * where all the columns are renamed in order to prevent name collisions.
+	 *
 	 * We attach COLLATE clauses to the operators when comparing columns
 	 * that have different collations.
 	 *----------
@@ -1395,13 +1453,35 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 
 	quoteRelationName(pkrelname, pk_rel);
 	quoteRelationName(fkrelname, fk_rel);
-	fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
-		"" : "ONLY ";
-	appendStringInfo(&querybuf,
-					 " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
-					 fk_only, fkrelname, pk_only, pkrelname);
+
+	if (riinfo->has_array)
+	{
+		appendStringInfo(&querybuf, " FROM ONLY %s fk", fkrelname);
+		for (int i = 0; i < riinfo->nkeys; i++)
+		{
+			if (riinfo->fk_reftypes[i] != FKCONSTR_REF_EACH_ELEMENT)
+				continue;
+
+			quoteOneName(fkattname,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 " CROSS JOIN LATERAL pg_catalog.unnest(fk.%s) a (e)",
+							 fkattname);
+		}
+		appendStringInfo(&querybuf,
+						 " LEFT OUTER JOIN ONLY %s pk ON",
+						 pkrelname);
+	}
+	else
+	{
+		fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+			"" : "ONLY ";
+		appendStringInfo(&querybuf,
+						" FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+						fk_only, fkrelname, pk_only, pkrelname);
+	}
 
 	strcpy(pkattname, "pk.");
 	strcpy(fkattname, "fk.");
@@ -1412,15 +1492,23 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		Oid			fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
 		Oid			pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
 		Oid			fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+		char	   *tmp;
 
 		quoteOneName(pkattname + 3,
 					 RIAttName(pk_rel, riinfo->pk_attnums[i]));
-		quoteOneName(fkattname + 3,
-					 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			tmp = "a.e";
+		else
+		{
+			quoteOneName(fkattname + 3,
+						 RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			tmp = fkattname;
+		}
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						tmp, fk_type,
+						FKCONSTR_REF_PLAIN);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1436,10 +1524,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 	sep = "";
 	for (int i = 0; i < riinfo->nkeys; i++)
 	{
-		quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
-		appendStringInfo(&querybuf,
-						 "%sfk.%s IS NOT NULL",
-						 sep, fkattname);
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+			appendStringInfo(&querybuf, "%sa.e IS NOT NULL", sep);
+		else
+		{
+			quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+			appendStringInfo(&querybuf,
+							 "%sfk.%s IS NOT NULL",
+							 sep, fkattname);
+		}
 		switch (riinfo->confmatchtype)
 		{
 			case FKCONSTR_MATCH_SIMPLE:
@@ -1655,7 +1748,8 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		ri_GenerateQual(&querybuf, sep,
 						pkattname, pk_type,
 						riinfo->pf_eq_oprs[i],
-						fkattname, fk_type);
+						fkattname, fk_type,
+						riinfo->fk_reftypes[i]);
 		if (pk_coll != fk_coll)
 			ri_GenerateQualCollation(&querybuf, pk_coll);
 		sep = "AND";
@@ -1840,11 +1934,12 @@ ri_GenerateQual(StringInfo buf,
 				const char *sep,
 				const char *leftop, Oid leftoptype,
 				Oid opoid,
-				const char *rightop, Oid rightoptype)
+				const char *rightop, Oid rightoptype,
+				char fkreftype)
 {
 	appendStringInfo(buf, " %s ", sep);
 	generate_operator_clause(buf, leftop, leftoptype, opoid,
-							 rightop, rightoptype);
+							 rightop, rightoptype, fkreftype);
 }
 
 /*
@@ -2098,7 +2193,26 @@ ri_LoadConstraintInfo(Oid constraintOid)
 							   riinfo->pk_attnums,
 							   riinfo->pf_eq_oprs,
 							   riinfo->pp_eq_oprs,
-							   riinfo->ff_eq_oprs);
+							   riinfo->ff_eq_oprs,
+							   riinfo->fk_reftypes);
+
+	/*
+	 * Fix up some stuff for Array Element Foreign Keys.  We need a has_array
+	 * flag indicating whether there's an array foreign key, and we want to
+	 * set ff_eq_oprs[i] to array_eq() for array columns, because that's what
+	 * makes sense for ri_KeysEqual, and we have no other use for ff_eq_oprs
+	 * in this module.  (If we did, substituting the array comparator at the
+	 * call point in ri_KeysEqual might be more appropriate.)
+	 */
+	riinfo->has_array = false;
+	for (int i = 0; i < riinfo->nkeys; i++)
+	{
+		if (riinfo->fk_reftypes[i] == FKCONSTR_REF_EACH_ELEMENT)
+		{
+			riinfo->has_array = true;
+			riinfo->ff_eq_oprs[i] = ARRAY_EQ_OP;
+		}
+	}
 
 	ReleaseSysCache(tup);
 
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 3de98d2333..8d06230bfe 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -330,6 +330,9 @@ static char *pg_get_viewdef_worker(Oid viewoid,
 static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
 static int	decompile_column_index_array(Datum column_index_array, Oid relId,
 										 StringInfo buf);
+static void decompile_fk_column_index_array(Datum column_index_array,
+											Datum fk_reftype_array,
+											Oid relId, StringInfo buf);
 static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
 static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
 									const Oid *excludeOps,
@@ -2175,7 +2178,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 	{
 		case CONSTRAINT_FOREIGN:
 			{
-				Datum		val;
+				Datum		colindexes;
+				Datum		reftypes;
 				bool		isnull;
 				const char *string;
 
@@ -2183,13 +2187,21 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 				appendStringInfoString(&buf, "FOREIGN KEY (");
 
 				/* Fetch and build referencing-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_conkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_conkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null conkey for constraint %u",
 						 constraintId);
+				reftypes = SysCacheGetAttr(CONSTROID, tup,
+										   Anum_pg_constraint_confreftype,
+										   &isnull);
+				if (isnull)
+					elog(ERROR, "null confreftype for constraint %u",
+						 constraintId);
 
-				decompile_column_index_array(val, conForm->conrelid, &buf);
+				decompile_fk_column_index_array(colindexes, reftypes,
+												conForm->conrelid, &buf);
 
 				/* add foreign relation name */
 				appendStringInfo(&buf, ") REFERENCES %s(",
@@ -2197,13 +2209,15 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
 														NIL));
 
 				/* Fetch and build referenced-column list */
-				val = SysCacheGetAttr(CONSTROID, tup,
-									  Anum_pg_constraint_confkey, &isnull);
+				colindexes = SysCacheGetAttr(CONSTROID, tup,
+											 Anum_pg_constraint_confkey,
+											 &isnull);
 				if (isnull)
 					elog(ERROR, "null confkey for constraint %u",
 						 constraintId);
 
-				decompile_column_index_array(val, conForm->confrelid, &buf);
+				decompile_column_index_array(colindexes,
+											 conForm->confrelid, &buf);
 
 				appendStringInfoChar(&buf, ')');
 
@@ -2532,6 +2546,66 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
 	return nKeys;
 }
 
+/*
+ * Convert an int16[] Datum and a char[] Datum into a comma-separated list of
+ * column names for the indicated relation, prefixed by appropriate keywords
+ * depending on the foreign key reference semantics indicated by the char[]
+ * entries.  Append the text to buf.
+ */
+static void
+decompile_fk_column_index_array(Datum column_index_array,
+								Datum fk_reftype_array,
+								Oid relId, StringInfo buf)
+{
+	Datum	   *keys;
+	int			nKeys;
+	Datum	   *reftypes;
+	int			nReftypes;
+	int			j;
+
+	/* Extract data from array of int16 */
+	deconstruct_array(DatumGetArrayTypeP(column_index_array),
+					  INT2OID, sizeof(int16), true, 's',
+					  &keys, NULL, &nKeys);
+
+	/* Extract data from array of char */
+	deconstruct_array(DatumGetArrayTypeP(fk_reftype_array),
+					  CHAROID, sizeof(char), true, 'c',
+					  &reftypes, NULL, &nReftypes);
+
+	if (nKeys != nReftypes)
+		elog(ERROR, "wrong confreftype cardinality");
+
+	for (j = 0; j < nKeys; j++)
+	{
+		char	   *colName;
+		const char *prefix;
+
+		colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+		switch (DatumGetChar(reftypes[j]))
+		{
+			case FKCONSTR_REF_PLAIN:
+				prefix = "";
+				break;
+			case FKCONSTR_REF_EACH_ELEMENT:
+				prefix = "EACH ELEMENT OF ";
+				break;
+			default:
+				elog(ERROR, "invalid fk_reftype: %d",
+					 (int) DatumGetChar(reftypes[j]));
+				prefix = NULL;	/* keep compiler quiet */
+				break;
+		}
+
+		if (j == 0)
+			appendStringInfo(buf, "%s%s", prefix,
+							 quote_identifier(colName));
+		else
+			appendStringInfo(buf, ", %s%s", prefix,
+							 quote_identifier(colName));
+	}
+}
 
 /* ----------
  * pg_get_expr			- Decompile an expression tree
@@ -11573,16 +11647,24 @@ void
 generate_operator_clause(StringInfo buf,
 						 const char *leftop, Oid leftoptype,
 						 Oid opoid,
-						 const char *rightop, Oid rightoptype)
+						 const char *rightop, Oid rightoptype,
+						 char fkreftype)
 {
 	HeapTuple	opertup;
 	Form_pg_operator operform;
 	char	   *oprname;
 	char	   *nspname;
+	Oid			oproid;
+
+	/* Override operator with <<@ in case of FK array */
+	if(fkreftype == FKCONSTR_REF_EACH_ELEMENT)
+		oproid = OID_ARRAY_ELEMCONTAINED_OP;
+	else
+		oproid = opoid;
 
-	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+	opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oproid));
 	if (!HeapTupleIsValid(opertup))
-		elog(ERROR, "cache lookup failed for operator %u", opoid);
+		elog(ERROR, "cache lookup failed for operator %u", oproid);
 	operform = (Form_pg_operator) GETSTRUCT(opertup);
 	Assert(operform->oprkind == 'b');
 	oprname = NameStr(operform->oprname);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index ff7395c85b..b26a9bcf29 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4472,7 +4472,7 @@ RelationGetFKeyList(Relation relation)
 								   info->conkey,
 								   info->confkey,
 								   info->conpfeqop,
-								   NULL, NULL);
+								   NULL, NULL, NULL);
 
 		/* Add FK's node to the result list */
 		result = lappend(result, info);
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 63f0f8bf41..901371db71 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -120,9 +120,19 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
 	 */
 	int16		confkey[1];
 
+	/*
+	 * If a foreign key, the reference semantics for each column.
+	 * 'p' to signify plain foreign key
+	 * 'e' to signify each element foreign key array
+	 */
+	char		confreftype[1];
+
 	/*
 	 * If a foreign key, the OIDs of the PK = FK equality operators for each
 	 * column of the constraint
+	 *
+	 * Note: for Array Element Foreign Keys, all these operators are for the
+	 * array's element type.
 	 */
 	Oid			conpfeqop[1] BKI_LOOKUP(pg_operator);
 
@@ -219,6 +229,7 @@ extern Oid	CreateConstraintEntry(const char *constraintName,
 								  Oid indexRelId,
 								  Oid foreignRelId,
 								  const int16 *foreignKey,
+								  const char *foreignRefType,
 								  const Oid *pfEqOp,
 								  const Oid *ppEqOp,
 								  const Oid *ffEqOp,
@@ -259,7 +270,8 @@ extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk,
 										 Oid *constraintOid);
 extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
 									   AttrNumber *conkey, AttrNumber *confkey,
-									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs);
+									   Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs,
+									   char *fk_reftypes);
 
 extern bool check_functional_grouping(Oid relid,
 									  Index varno, Index varlevelsup,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 12e0e026dc..486006c42c 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2205,6 +2205,10 @@ typedef enum ConstrType			/* types of constraints */
 #define FKCONSTR_MATCH_PARTIAL		'p'
 #define FKCONSTR_MATCH_SIMPLE		's'
 
+ /* Foreign key column reference semantics codes */
+#define FKCONSTR_REF_PLAIN			'p'
+#define FKCONSTR_REF_EACH_ELEMENT	'e'
+
 typedef struct Constraint
 {
 	NodeTag		type;
@@ -2245,6 +2249,7 @@ typedef struct Constraint
 	RangeVar   *pktable;		/* Primary key table */
 	List	   *fk_attrs;		/* Attributes of foreign key */
 	List	   *pk_attrs;		/* Corresponding attrs in PK table */
+	List	   *fk_reftypes;	/* Per-column reference semantics (int List) */
 	char		fk_matchtype;	/* FULL, PARTIAL, SIMPLE */
 	char		fk_upd_action;	/* ON UPDATE action */
 	char		fk_del_action;	/* ON DELETE action */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 4bbe53e852..18c77765bc 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -143,6 +143,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL)
+PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL)
 PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL)
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 27d2f2ffb3..36d36d57b7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -68,7 +68,8 @@ extern char *quote_qualified_identifier(const char *qualifier,
 extern void generate_operator_clause(fmStringInfo buf,
 									 const char *leftop, Oid leftoptype,
 									 Oid opoid,
-									 const char *rightop, Oid rightoptype);
+									 const char *rightop, Oid rightoptype,
+									 char fkreftype);
 
 /* varchar.c */
 extern int	bpchartruelen(char *s, int len);
diff --git a/src/test/regress/expected/element_fk.out b/src/test/regress/expected/element_fk.out
new file mode 100644
index 0000000000..d83040dbc3
--- /dev/null
+++ b/src/test/regress/expected/element_fk.out
@@ -0,0 +1,625 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fkarray"
+DETAIL:  Key (ftest1)=({10,1}) is not present in table "pktableforarray".
+DROP TABLE FKTABLEFORARRAY;
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({4,6}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({6,NULL,4,NULL}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+ERROR:  insert or update on table "fktableforarraymdim" violates foreign key constraint "fktableforarraymdim_ftest1_fkey"
+DETAIL:  Key (ftest1)=({{1,2},{6,NULL}}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+ERROR:  null value in column "ftest1" of relation "fktableforarraynotnull" violates not-null constraint
+DETAIL:  Failing row contains (null, 21).
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(1) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {2}      |      4
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+(11 rows)
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+  ftest1  | ftest2 
+----------+--------
+ {1}      |      3
+ {1}      |      5
+ {3}      |      6
+ {1}      |      7
+ {4,5}    |      8
+ {4,4}    |      9
+          |     10
+ {}       |     11
+ {1,NULL} |     12
+ {NULL}   |     13
+ {1}      |      4
+(11 rows)
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE FKTABLEFORARRAY;
+ERROR:  table "fktableforarray" does not exist
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+ERROR:  Array Element Foreign Keys support only NO ACTION and RESTRICT actions
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+NOTICE:  table "fktableforarray" does not exist, skipping
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({D}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey"
+DETAIL:  Key (ftest1)=({A,B,D}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(A) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_ftest1_fkey" on table "fktableforarray"
+DETAIL:  Key (ptest1)=(B) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ ftest1  | ftest2 
+---------+--------
+ {A}     |      1
+ {B}     |      2
+ {C}     |      3
+ {A,B,C} |      4
+(4 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(A, {A,B,C}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fid1_fid2_fkey"
+DETAIL:  Key (fid1, fid2)=(B, {A}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,99)"}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey"
+DETAIL:  Key (invoice_ids)=({"(2011,1)","(2010,1)"}) is not present in table "pktableforarray".
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2010,99)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+ERROR:  update or delete on table "pktableforarray" violates foreign key constraint "fktableforarray_invoice_ids_fkey" on table "fktableforarray"
+DETAIL:  Key (id)=((2011,1)) is still referenced from table "fktableforarray".
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+ id |       invoice_ids       |  ftest2   
+----+-------------------------+-----------
+  1 | {"(2010,99)"}           | Product A
+  2 | {"(2011,1)","(2011,2)"} | Product B
+  3 | {"(2011,2)"}            | Product C
+(3 rows)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({0,1}) is not present in table "pktableforarray".
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+ERROR:  insert or update on table "fktableforarray" violates foreign key constraint "fktableforarray_fids_fkey"
+DETAIL:  Key (fids)=({2,1}) is not present in table "pktableforarray".
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(2, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(20, {0,2,3,4,6}) is not present in table "dim1".
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_x_y_fkey"
+DETAIL:  Key (x, y)=(4, {0,2,4}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+ERROR:  foreign keys support only one array column
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+ERROR:  foreign keys support only one array column
+DROP TABLE F1;
+-- Cleanup
+DROP TABLE DIM1;
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "x2_x1_x2_fkey"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+ERROR:  insert or update on table "x2" violates foreign key constraint "fk_const"
+DETAIL:  Key (x1, x2)=({1,3}, 6) is not present in table "x1".
+DROP TABLE x2;
+DROP TABLE x1;
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{100,100,100},{NULL,NULL,20},{7,8,10}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+ERROR:  insert or update on table "f1" violates foreign key constraint "f1_slots_fkey"
+DETAIL:  Key (slots)=({{NULL,1,NULL},{NULL,NULL,11},{NULL,NULL,6}}) is not present in table "dim1".
+DROP TABLE F1;
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+ count 
+-------
+    10
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+ count 
+-------
+     5
+(1 row)
+
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+ count 
+-------
+     5
+(1 row)
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type integer which is not an array type.
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between character[] and integer.
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Key column "ftest1" has type character which is not an array type.
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between smallint[] and integer.
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between bigint[] and integer.
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+ERROR:  foreign key constraint "fktableviolating_ftest1_fkey" cannot be implemented
+DETAIL:  Unssupported relation between int2vector and integer.
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 312c11a4bd..b8370091af 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -85,7 +85,7 @@ test: brin_bloom brin_multi
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort
+test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort element_fk
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 5a80bfacd8..b1541cbdd2 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -142,6 +142,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: element_fk
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/element_fk.sql b/src/test/regress/sql/element_fk.sql
new file mode 100644
index 0000000000..2b3ec36113
--- /dev/null
+++ b/src/test/regress/sql/element_fk.sql
@@ -0,0 +1,475 @@
+-- EACH-ELEMENT FK CONSTRAINTS
+
+CREATE TABLE PKTABLEFORARRAY ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAY
+INSERT INTO PKTABLEFORARRAY VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAY VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAY VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAY VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAY VALUES (5, 'Test5');
+
+-- Check alter table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 1);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check alter table with failing rows
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], ftest2 int );
+INSERT INTO FKTABLEFORARRAY VALUES ('{10,1}', 2);
+ALTER TABLE FKTABLEFORARRAY ADD CONSTRAINT FKARRAY FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAY;
+
+-- Check create table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYMDIM ( ftest1 int[][], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+CREATE TABLE FKTABLEFORARRAYNOTNULL ( ftest1 int[] NOT NULL, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
+
+-- Insert successful rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{2}', 4);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{3}', 6);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1}', 7);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,5}', 8);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,4}', 9);
+INSERT INTO FKTABLEFORARRAY VALUES (NULL, 10);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}', 11);
+INSERT INTO FKTABLEFORARRAY VALUES ('{1,NULL}', 12);
+INSERT INTO FKTABLEFORARRAY VALUES ('{NULL}', 13);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{1,2},{1,3}}', 14);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{4,5},{NULL,2},{NULL,3}}', 15);
+
+-- Insert failed rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{6}', 16);
+INSERT INTO FKTABLEFORARRAY VALUES ('{4,6}', 17);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL}', 18);
+INSERT INTO FKTABLEFORARRAY VALUES ('{6,NULL,4,NULL}', 19);
+INSERT INTO FKTABLEFORARRAYMDIM VALUES ('{{1,2},{6,NULL}}', 20);
+INSERT INTO FKTABLEFORARRAYNOTNULL VALUES (NULL, 21);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE NO ACTION)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1=1;
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE NO ACTION)
+UPDATE PKTABLEFORARRAY SET ptest1=7 WHERE ptest1=1;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Check UPDATE on FKTABLE
+UPDATE FKTABLEFORARRAY SET ftest1=ARRAY[1] WHERE ftest2=4;
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE FKTABLEFORARRAYNOTNULL;
+DROP TABLE FKTABLEFORARRAYMDIM;
+
+-- Allowed references with actions (NO ACTION, RESTRICT)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+-- Not allowed references (SET NULL, SET DEFAULT, CASCADE)
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE NO ACTION, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE RESTRICT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET DEFAULT, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE SET NULL, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE NO ACTION ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE RESTRICT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET DEFAULT ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON DELETE SET NULL ON UPDATE CASCADE, ftest2 int );
+DROP TABLE IF EXISTS FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE PKTABLEFORARRAY;
+
+-- Check reference on empty table
+CREATE TABLE PKTABLEFORARRAY (ptest1 int PRIMARY KEY);
+CREATE TABLE FKTABLEFORARRAY  (ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY);
+INSERT INTO FKTABLEFORARRAY VALUES ('{}');
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Repeat a similar test using CHAR(1) keys rather than INTEGER
+CREATE TABLE PKTABLEFORARRAY ( ptest1 CHAR(1) PRIMARY KEY, ptest2 text );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('C', 'Test C');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( ftest1 char(1)[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY ON UPDATE RESTRICT ON DELETE RESTRICT, ftest2 int );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A"}', 1);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"B"}', 2);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"C"}', 3);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","C"}', 4);
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('{"D"}', 5);
+INSERT INTO FKTABLEFORARRAY VALUES ('{"A","B","D"}', 6);
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE (must fail due to ON DELETE RESTRICT)
+DELETE FROM PKTABLEFORARRAY WHERE ptest1='A';
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE (must fail due to ON UPDATE RESTRICT)
+UPDATE PKTABLEFORARRAY SET ptest1='D' WHERE ptest1='B';
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Composite primary keys
+CREATE TABLE PKTABLEFORARRAY ( id1 CHAR(1), id2 CHAR(1), ptest2 text, PRIMARY KEY (id1, id2) );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'A', 'Test A');
+INSERT INTO PKTABLEFORARRAY VALUES ('A', 'B', 'Test B');
+INSERT INTO PKTABLEFORARRAY VALUES ('B', 'C', 'Test B');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( fid1 CHAR(1), fid2 CHAR(1)[], ftest2 text, FOREIGN KEY (fid1, EACH ELEMENT OF fid2) REFERENCES PKTABLEFORARRAY);
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B'], '1');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['C'], '2');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY VALUES ('A', ARRAY['A','B', 'C'], '3');
+INSERT INTO FKTABLEFORARRAY VALUES ('B', ARRAY['A'], '4');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- Test Array Element Foreign Keys with composite type
+CREATE TYPE INVOICEID AS (year_part INTEGER, progressive_part INTEGER);
+CREATE TABLE PKTABLEFORARRAY ( id INVOICEID PRIMARY KEY,  ptest2 text);
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2010, 99), 'Last invoice for 2010');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 1), 'First invoice for 2011');
+INSERT INTO PKTABLEFORARRAY VALUES (ROW(2011, 2), 'Second invoice for 2011');
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, invoice_ids INVOICEID[], FOREIGN KEY (EACH ELEMENT OF invoice_ids) REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2010,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2011,2)']::INVOICEID[], 'Product B');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,2)']::INVOICEID[], 'Product C');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,99)']::INVOICEID[], 'Product A');
+INSERT INTO FKTABLEFORARRAY(invoice_ids, ftest2) VALUES (ARRAY['(2011,1)','(2010,1)']::INVOICEID[], 'Product B');
+
+-- Check FKTABLE
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Delete a row from PK TABLE
+DELETE FROM PKTABLEFORARRAY WHERE id=ROW(2010,99);
+
+-- Check FKTABLE for removal of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Update a row from PK TABLE
+UPDATE PKTABLEFORARRAY SET id=ROW(2011,99) WHERE id=ROW(2011,1);
+
+-- Check FKTABLE for update of matched row
+SELECT * FROM FKTABLEFORARRAY;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+DROP TYPE INVOICEID;
+
+-- Check for an array column referencing another array column (NOT ELEMENT FOREIGN KEY)
+-- Create primary table with an array primary key
+CREATE TABLE PKTABLEFORARRAY ( id INT[] PRIMARY KEY,  ptest2 text);
+
+-- Create the referencing table
+CREATE TABLE FKTABLEFORARRAY ( id SERIAL PRIMARY KEY, fids INT[] REFERENCES PKTABLEFORARRAY, ftest2 TEXT );
+
+-- Populate the primary table
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,1}', 'A');
+INSERT INTO PKTABLEFORARRAY VALUES ('{1,2}', 'B');
+
+-- Insert valid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,1}', 'Product A');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{1,2}', 'Product B');
+
+-- Insert invalid rows into FK TABLE
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{0,1}', 'Product C');
+INSERT INTO FKTABLEFORARRAY (fids, ftest2) VALUES ('{2,1}', 'Product D');
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAY;
+DROP TABLE PKTABLEFORARRAY;
+
+-- ---------------------------------------
+-- Multi-column "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL, Y INTEGER NOT NULL, PRIMARY KEY (X, Y));
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT x.t, x.t * y.t
+	FROM (SELECT generate_series(1, 10) AS t) x,
+	(SELECT generate_series(0, 10) AS t) y;
+
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- FAILS (2 is not present)
+INSERT INTO F1 VALUES (4, '{0,NULL,4}'); -- OK
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Try updates
+UPDATE F1 SET y = '{0,2,4,6}' WHERE x = 2; -- OK
+UPDATE F1 SET y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS
+UPDATE F1 SET x = 20, y = '{0,2,3,4,6}' WHERE x = 2; -- FAILS (20 does not exist)
+UPDATE F1 SET y = '{0,4,8}' WHERE x = 4; -- OK
+UPDATE F1 SET y = '{0,5,NULL,10}' WHERE x = 5; -- OK
+DROP TABLE F1;
+
+
+-- Test with FOREIGN KEY after TABLE population
+CREATE TABLE F1 (
+	x INTEGER PRIMARY KEY, y INTEGER[]
+);
+-- Insert facts
+INSERT INTO F1 VALUES (1, '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES (2, '{0,2,4,6}'); -- OK
+INSERT INTO F1 VALUES (3, '{0,3,6,9,0,3,6,9,0,0,0,0,9,9}'); -- OK (multiple occurrences)
+INSERT INTO F1 VALUES (4, '{0,2,4}'); -- OK (2 is not present)
+INSERT INTO F1 VALUES (5, '{0,NULL,5}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+
+-- Test with TABLE declaration of a two-dim ELEMENT foreign key constraint (FAILS)
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[],
+	FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y)
+);
+
+
+-- Test with two-dim ELEMENT foreign key after TABLE population
+CREATE TABLE F1 (
+	x INTEGER[] PRIMARY KEY, y INTEGER[]
+);
+INSERT INTO F1 VALUES ('{1}', '{0,1,2,3,4,5}'); -- OK
+INSERT INTO F1 VALUES ('{1,2}', '{0,2,4,6}'); -- OK
+-- Add foreign key (FAILS)
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF x, EACH ELEMENT OF y) REFERENCES DIM1(x, y);
+DROP TABLE F1;
+
+-- Cleanup
+DROP TABLE DIM1;
+
+
+-- Check for potential name conflicts (with internal integrity checks)
+CREATE TABLE x1(x1 int, x2 int, PRIMARY KEY(x1,x2));
+INSERT INTO x1 VALUES
+       (1,4),
+       (1,5),
+       (2,4),
+       (2,5),
+       (3,6),
+       (3,7)
+;
+CREATE TABLE x2(x1 int[], x2 int, FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6); -- FAILS
+DROP TABLE x2;
+CREATE TABLE x2(x1 int[], x2 int);
+INSERT INTO x2 VALUES ('{1,2}',4);
+INSERT INTO x2 VALUES ('{1,3}',6);
+ALTER TABLE x2 ADD CONSTRAINT fk_const FOREIGN KEY(EACH ELEMENT OF x1, x2) REFERENCES x1;  -- FAILS
+DROP TABLE x2;
+DROP TABLE x1;
+
+
+-- ---------------------------------------
+-- Multi-dimensional "ELEMENT" foreign key tests
+-- ---------------------------------------
+
+-- Create DIM1 table with two-column primary key
+CREATE TABLE DIM1 (X INTEGER NOT NULL PRIMARY KEY,
+	CODE TEXT NOT NULL UNIQUE);
+-- Populate DIM1 table pairs
+INSERT INTO DIM1 SELECT t, 'DIM1-' || lpad(t::TEXT, 2, '0')
+	FROM (SELECT generate_series(1, 10)) x(t);
+
+-- Test with TABLE declaration of an element foreign key constraint (NO ACTION)
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3], FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+UPDATE F1 SET SLOTS = '{{NULL, 1, NULL}, {NULL, NULL, 3}, {7, 8, 10}}' WHERE ID = 1; -- OK
+UPDATE F1 SET SLOTS = '{{100, 100, 100}, {NULL, NULL, 20}, {7, 8, 10}}' WHERE ID = 1; -- FAILS
+DROP TABLE F1;
+
+-- Test with postponed foreign key
+CREATE TABLE F1 (
+	ID SERIAL PRIMARY KEY,
+	SLOTS INTEGER[3][3]
+);
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 3}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'); -- OK
+INSERT INTO F1(SLOTS) VALUES ('{1, 2, 3, 4, 5, 6, 7, 8, 9}'); -- OK
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- FAILS
+DELETE FROM F1 WHERE ID = 2; -- REMOVE ISSUE
+ALTER TABLE F1 ADD FOREIGN KEY (EACH ELEMENT OF SLOTS) REFERENCES DIM1; -- NOW OK
+INSERT INTO F1(SLOTS) VALUES ('{{NULL, 1, NULL}, {NULL, NULL, 11}, {NULL, NULL, 6}}'); -- FAILS
+DROP TABLE F1;
+
+-- Leave tables in the database
+CREATE TABLE PKTABLEFORELEMENTFK ( ptest1 int PRIMARY KEY, ptest2 text );
+CREATE TABLE FKTABLEFORELEMENTFK ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Check ALTER TABLE ALTER TYPE
+ALTER TABLE FKTABLEFORELEMENTFK ALTER FTEST1 TYPE INT[];
+
+-- Check GIN index
+-- Define PKTABLEFORARRAYGIN
+CREATE TABLE PKTABLEFORARRAYGIN ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Insert test data into PKTABLEFORARRAYGIN
+INSERT INTO PKTABLEFORARRAYGIN VALUES (1, 'Test1');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (2, 'Test2');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (3, 'Test3');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (4, 'Test4');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (5, 'Test5');
+INSERT INTO PKTABLEFORARRAYGIN VALUES (6, 'Test6');
+
+-- Define FKTABLEFORARRAYGIN
+CREATE TABLE FKTABLEFORARRAYGIN ( ftest1 int[],
+    ftest2 int PRIMARY KEY,
+    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAYGIN
+    ON DELETE NO ACTION ON UPDATE NO ACTION);
+
+-- -- Create index on FKTABLEFORARRAYGIN
+CREATE INDEX ON FKTABLEFORARRAYGIN USING gin (ftest1 array_ops);
+
+-- Populate Table
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5}', 1);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,2}', 2);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,2,5}', 3);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,4}', 4);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,5,4,1,3}', 5);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{1}', 6);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{5,1}', 7);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{2,1,2,4,1}', 8);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{4,2}', 9);
+INSERT INTO FKTABLEFORARRAYGIN VALUES ('{3,4,5,3}', 10);
+
+-- Try UPDATE
+UPDATE PKTABLEFORARRAYGIN SET ptest1=7 WHERE ptest1=6;
+
+--- Try using the indexable operators
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN;
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @> ARRAY[5];
+SELECT COUNT(*) FROM FKTABLEFORARRAYGIN WHERE ftest1 @>> 5;
+
+-- Cleanup
+DROP TABLE FKTABLEFORARRAYGIN;
+DROP TABLE PKTABLEFORARRAYGIN;
+
+-- ---------------------------------------
+-- Invalid referencing key tests
+-- ---------------------------------------
+CREATE TABLE PKTABLEVIOLATING ( ptest1 int PRIMARY KEY, ptest2 text );
+
+-- Attempt fk constraint between int <-> int
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> char
+CREATE TABLE FKTABLEVIOLATING ( ftest1 char, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> smallint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 smallint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> bigint[]
+CREATE TABLE FKTABLEVIOLATING ( ftest1 bigint[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
+
+-- Attempt fk constraint between int <-> int2vector
+CREATE TABLE FKTABLEVIOLATING ( ftest1 int2vector, FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORELEMENTFK, ftest2 int );
-- 
2.27.0

#195vignesh C
vignesh21@gmail.com
In reply to: Mark Rofail (#194)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On Tue, Mar 30, 2021 at 2:14 AM Mark Rofail <markm.rofail@gmail.com> wrote:

Hey Alvaro

Yes, we should do that.

I have attached v12 with more tests in “ src/test/regress/sql/gin.sql”

Changelog:
- v12 (compatible with current master 2021/03/29, commit 6d7a6feac48b1970c4cd127ee65d4c487acbb5e9)
* add more tests to “ src/test/regress/sql/gin.sql”
* merge Andreas' edits to the GIN patch

Also, @Andreas Karlsson, waiting for your edits to "pg_constraint"

The patch does not apply on Head anymore, could you rebase and post a
patch. I'm changing the status to "Waiting for Author".

Regards,
Vignesh

#196Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: vignesh C (#195)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 2021-Jul-14, vignesh C wrote:

The patch does not apply on Head anymore, could you rebase and post a
patch. I'm changing the status to "Waiting for Author".

BTW I gave a look at this patch in the March commitfest and concluded it
still requires some major surgery that I didn't have time for. I did so
by re-reading early in the thread to understand what the actual
requirements were for this feature to work, and it seemed to me that the
patch started to derail at some point. I suggest that somebody needs to
write up exactly what we need, lest the patches end up implementing
something else.

I don't have time for this patch during the current commitfest, and I'm
not sure that I will during the next one. If somebody else wants to
spend time with it, ... be my guest.

--
Álvaro Herrera Valdivia, Chile — https://www.EnterpriseDB.com/
"Sallah, I said NO camels! That's FIVE camels; can't you count?"
(Indiana Jones)

#197Daniel Gustafsson
daniel@yesql.se
In reply to: Alvaro Herrera (#196)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 14 Jul 2021, at 18:07, Alvaro Herrera <alvherre@alvh.no-ip.org> wrote:

On 2021-Jul-14, vignesh C wrote:

The patch does not apply on Head anymore, could you rebase and post a
patch. I'm changing the status to "Waiting for Author".

BTW I gave a look at this patch in the March commitfest and concluded it
still requires some major surgery that I didn't have time for. I did so
by re-reading early in the thread to understand what the actual
requirements were for this feature to work, and it seemed to me that the
patch started to derail at some point. I suggest that somebody needs to
write up exactly what we need, lest the patches end up implementing
something else.

I don't have time for this patch during the current commitfest, and I'm
not sure that I will during the next one. If somebody else wants to
spend time with it, ... be my guest.

Given the above, and that nothing has happened on this thread since this note,
I think we should mark this Returned with Feedback and await a new submission.
Does that seem reasonable Alvaro?

--
Daniel Gustafsson https://vmware.com/

#198Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Daniel Gustafsson (#197)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 2021-Sep-14, Daniel Gustafsson wrote:

Given the above, and that nothing has happened on this thread since this note,
I think we should mark this Returned with Feedback and await a new submission.
Does that seem reasonable Alvaro?

It seems reasonable to me.

--
Álvaro Herrera Valdivia, Chile — https://www.EnterpriseDB.com/

#199Daniel Gustafsson
daniel@yesql.se
In reply to: Alvaro Herrera (#198)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

On 14 Sep 2021, at 20:54, Alvaro Herrera <alvherre@alvh.no-ip.org> wrote:

On 2021-Sep-14, Daniel Gustafsson wrote:

Given the above, and that nothing has happened on this thread since this note,
I think we should mark this Returned with Feedback and await a new submission.
Does that seem reasonable Alvaro?

It seems reasonable to me.

Thanks, done that way now.

--
Daniel Gustafsson https://vmware.com/

#200Mark Rofail
markm.rofail@gmail.com
In reply to: Alvaro Herrera (#198)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Dear Alvaro,

We just need to rewrite the scope of the patch so I work on the next
generation. I do not know what was "out of scope" in the current version

/Mark

On Tue, 14 Sep 2021, 8:55 pm Alvaro Herrera, <alvherre@alvh.no-ip.org>
wrote:

Show quoted text

On 2021-Sep-14, Daniel Gustafsson wrote:

Given the above, and that nothing has happened on this thread since this

note,

I think we should mark this Returned with Feedback and await a new

submission.

Does that seem reasonable Alvaro?

It seems reasonable to me.

--
Álvaro Herrera Valdivia, Chile —
https://www.EnterpriseDB.com/

#201Stefan Keller
sfkeller@gmail.com
In reply to: Mark Rofail (#200)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Dear all

Just for my understanding - and perhaps as input for the documentation of this:
Are Foreign Key Arrays a means to implement "Generic Foreign Keys" as
in Oracle [1]Steven Feuerstein and Debby Russell (1995): Oracle Extension "PLVfk - Generic Foreign Key Lookups" in: "Advanced Oracle Pl/Sql: Programming With Packages" (Nutshell Handbook), Oreilly, ISBN B00006AVR6. Webaccess: https://flylib.com/books/en/2.408.1.159/1/ and Django [2]Stackoverflow: https://stackoverflow.com/questions/14333460/django-generic-foreign-keys-good-or-bad-considering-the-sql-performance, and of "Polymorphic Associations" as
they call this in Ruby on Rails?

Yours, Stefan

[1]: Steven Feuerstein and Debby Russell (1995): Oracle Extension "PLVfk - Generic Foreign Key Lookups" in: "Advanced Oracle Pl/Sql: Programming With Packages" (Nutshell Handbook), Oreilly, ISBN B00006AVR6. Webaccess: https://flylib.com/books/en/2.408.1.159/1/
"PLVfk - Generic Foreign Key Lookups" in: "Advanced Oracle Pl/Sql:
Programming With Packages" (Nutshell Handbook), Oreilly, ISBN
B00006AVR6. Webaccess: https://flylib.com/books/en/2.408.1.159/1/
[2]: Stackoverflow: https://stackoverflow.com/questions/14333460/django-generic-foreign-keys-good-or-bad-considering-the-sql-performance
https://stackoverflow.com/questions/14333460/django-generic-foreign-keys-good-or-bad-considering-the-sql-performance

Am Di., 14. Sept. 2021 um 21:00 Uhr schrieb Mark Rofail
<markm.rofail@gmail.com>:

Show quoted text

Dear Alvaro,

We just need to rewrite the scope of the patch so I work on the next generation. I do not know what was "out of scope" in the current version

/Mark

On Tue, 14 Sep 2021, 8:55 pm Alvaro Herrera, <alvherre@alvh.no-ip.org> wrote:

On 2021-Sep-14, Daniel Gustafsson wrote:

Given the above, and that nothing has happened on this thread since this note,
I think we should mark this Returned with Feedback and await a new submission.
Does that seem reasonable Alvaro?

It seems reasonable to me.

--
Álvaro Herrera Valdivia, Chile — https://www.EnterpriseDB.com/

#202Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Stefan Keller (#201)
Re: [HACKERS] GSoC 2017: Foreign Key Arrays

Hi Stefan,

On 2021-Oct-03, Stefan Keller wrote:

Just for my understanding - and perhaps as input for the documentation of this:
Are Foreign Key Arrays a means to implement "Generic Foreign Keys" as
in Oracle [1] and Django [2], and of "Polymorphic Associations" as
they call this in Ruby on Rails?

No -- at least as far as I was able to understand the pages you linked to.

It's intended for array elements of one column to reference values in a
scalar column. These are always specific columns, not "generic" or
"polymorphic" (which I understand to mean one of several possible
columns).

Thanks,

--
Álvaro Herrera 39°49'30"S 73°17'W — https://www.EnterpriseDB.com/